optimizer_unit.php 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261
  1. <?php
  2. /**
  3. * Monster view.
  4. *
  5. * Contains the view layout and some code to present the data.
  6. *
  7. * @category View
  8. * @property_read Monster_Page $page The page model.
  9. * @property_read int $UID Player ID.
  10. */
  11. ?>
  12. <!DOCTYPE html>
  13. <html lang='en'>
  14. <head>
  15. <meta content='text/html; charset=utf-8' http-equiv='content-type'/>
  16. <meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1'/>
  17. <title><?=$page->title?></title>
  18. <link rel='shortcut icon' href='<?=$page->favicon?>'/>
  19. <!-- CSS files -->
  20. <link rel='stylesheet' type='text/css' href='<?=URL::CSS?>ui.css'/>
  21. <link rel='stylesheet' type='text/css' href='<?=URL::CSS?>optimizer.css'/>
  22. <!-- Meta tags -->
  23. <link rel='canonical' href='<?=$page->canonical?>'/>
  24. <link rel='author' href='<?=$page->author?>'/>
  25. <link rel='publisher' href='<?=$page->author?>'/>
  26. <meta name='description' content='<?=$page->description?>'/>
  27. <meta property='og:title' content='<?=$page->title?>'/>
  28. <meta property='og:url' content='<?=$page->canonical?>'/>
  29. <meta property='og:description' content='<?=$page->description?>'/>
  30. <meta property='og:image' content='<?=$page->icon?>'/>
  31. <meta property='og:site_name' content='<?=$page->name?>'/>
  32. <meta property='og:type' content='website'/>
  33. <meta property='og:locale' content='en'/>
  34. <meta name='twitter:card' content='summary'/>
  35. <meta name='twitter:title' content='<?=$page->title?>'/>
  36. <meta name='twitter:description' content='<?=$page->description?>'/>
  37. <meta name='twitter:image' content='<?=$page->icon?>'/>
  38. <meta name='twitter:url' content='<?=$page->canonical?>'/>
  39. <meta name='robots' content='index follow'/>
  40. <script>
  41. /**
  42. * Unit current stats.
  43. */
  44. var current_stats = {
  45. "attack": <?=$page->unit->total_attack?>,
  46. "defense": <?=$page->unit->total_defense?>,
  47. "hp": <?=$page->unit->total_hp?>,
  48. "speed": <?=$page->unit->total_speed?>,
  49. "crit_rate": <?=$page->unit->total_crit_rate?>,
  50. "crit_damage": <?=$page->unit->total_crit_damage?>,
  51. "accuracy": <?=$page->unit->total_accuracy?>,
  52. "resistance": <?=$page->unit->total_resistance?>,
  53. "ehp": <?=$page->unit->effective_hp?>,
  54. "dmg": <?=$page->unit->effective_dmg?>
  55. }
  56. <?php
  57. // Get current rune sets
  58. $sets = [];
  59. foreach ($page->unit->rune as $rune){
  60. if (!in_array($rune->type->id, $sets)){
  61. array_push($sets, $rune->type->id);
  62. }
  63. }
  64. for ($i = sizeof($sets); $i < 3; $i ++){
  65. array_push($sets, 0);
  66. }
  67. ?>
  68. var current_sets = [<?=$sets[0]?>, <?=$sets[1]?>, <?=$sets[2]?>];
  69. // Get current main stats in even slots
  70. <?php
  71. $mains = [0, 0, 0];
  72. foreach ($page->unit->rune as $rune){
  73. if ($rune->slot % 2 == 0){
  74. $mains[($rune->slot / 2) - 1] = $rune->main_stat;
  75. }
  76. }
  77. ?>
  78. /**
  79. * Updates the value next to the sliders when they change.
  80. *
  81. * @param stat Name of the stat to set.
  82. * @param value Value of the slider.
  83. */
  84. function updateMinValue(stat, element){
  85. var value = Number(element.value);
  86. var max = Number(element.max);
  87. var min = Number(element.min);
  88. if (value < min){
  89. value = min;
  90. console.log("Correcting for min: " + value + "/" + min);
  91. }
  92. if (value > max){
  93. console.log("Correcting for max: " + value + "/" + max);
  94. value = max;
  95. }
  96. document.getElementById('lbl_min_' + stat).value = value;
  97. document.getElementById('min_' + stat).value = value;
  98. }
  99. /**
  100. * Starts the optimization.
  101. *
  102. * Checks for error in the combination of the parameters, and
  103. * shows an error window if there is an invalid conbination. If
  104. * not, builds the url to calculate the new rune combinations,
  105. * and presents th received response.
  106. *
  107. * @return false on error, true on success.
  108. */
  109. function apply(){
  110. // TODO: Check for valid set combinations
  111. var params = '';
  112. var x;
  113. // Player id - mandatory
  114. params = 'uid=<?=$UID?>';
  115. // Unit id - mandatory
  116. params += '&unit=<?=$page->unit->id?>';
  117. // Rune set 1 - mandatory
  118. params += '&set[]=' + document.getElementById('set_1').options[document.getElementById('set_1').selectedIndex].value;
  119. // Rune set 2 - mandatory
  120. params += '&set[]=' + document.getElementById('set_2').options[document.getElementById('set_2').selectedIndex].value;
  121. // Rune set 3 - optional
  122. x = document.getElementById('set_3').options[document.getElementById('set_3').selectedIndex].value;
  123. if (x != ''){
  124. params += '&set[]=' + x;
  125. }
  126. // Slot 2 - mandatory
  127. params += '&stat[]=' + document.getElementById('slot_2').options[document.getElementById('slot_2').selectedIndex].value;
  128. // Slot 4 - mandatory
  129. params += '&stat[]=' + document.getElementById('slot_4').options[document.getElementById('slot_4').selectedIndex].value;
  130. // Slot 5 - mandatory
  131. params += '&stat[]=' + document.getElementById('slot_6').options[document.getElementById('slot_6').selectedIndex].value;
  132. // Rune source - mandatory
  133. params += '&source=' + document.getElementById('rune_source').options[document.getElementById('rune_source').selectedIndex].value;
  134. // Optimizer tuning - mandatory
  135. params += '&tuning=' + document.getElementById('tuning').options[document.getElementById('tuning').selectedIndex].value;
  136. // Limit combinations - mandatory
  137. params += '&limit=' + document.getElementById('limit').value;
  138. // Min HP - Optional
  139. if (Number(document.getElementById('min_hp').value) > Number(document.getElementById('min_hp').min)){
  140. params += '&min_hp=' + document.getElementById('min_hp').value;
  141. }
  142. // Min ATK - Optional
  143. if (Number(document.getElementById('min_attack').value) > Number(document.getElementById('min_attack').min)){
  144. params += '&min_attack=' + document.getElementById('min_attack').value;
  145. }
  146. // Min DEF - Optional
  147. if (Number(document.getElementById('min_defense').value) > Number(document.getElementById('min_defense').min)){
  148. params += '&min_defense=' + document.getElementById('min_defense').value;
  149. }
  150. // Min SPD - Optional
  151. if (Number(document.getElementById('min_speed').value) > Number(document.getElementById('min_speed').min)){
  152. params += '&min_speed=' + document.getElementById('min_speed').value;
  153. }
  154. // Min CRR - Optional
  155. if (Number(document.getElementById('min_crit_rate').value) > Number(document.getElementById('min_crit_rate').min)){
  156. params += '&min_crit_rate=' + document.getElementById('min_crit_rate').value;
  157. }
  158. // Min CRD - Optional
  159. if (Number(document.getElementById('min_crit_damage').value) > Number(document.getElementById('min_crit_damage').min)){
  160. params += '&min_crit_damage=' + document.getElementById('min_crit_damage').value;
  161. }
  162. // Min ACC - Optional
  163. if (Number(document.getElementById('min_accuracy').value) > Number(document.getElementById('min_accuracy').min)){
  164. params += '&min_accuracy=' + document.getElementById('min_accuracy').value;
  165. }
  166. // Min RES - Optional
  167. if (Number(document.getElementById('min_resistance').value) > Number(document.getElementById('min_resistance').min)){
  168. params += '&min_resistance=' + document.getElementById('min_resistance').value;
  169. }
  170. // Min EHP - Optional
  171. if (Number(document.getElementById('min_ehp').value) > 0){
  172. params += '&min_ehp=' + document.getElementById('min_ehp').value;
  173. }
  174. // Min DMG - Optional
  175. if (Number(document.getElementById('min_dmg').value) > 0){
  176. params += '&min_dmg=' + document.getElementById('min_dmg').value;
  177. }
  178. // Send th request
  179. var xhttp = new XMLHttpRequest();
  180. xhttp.onreadystatechange = function() {
  181. if (this.readyState == 4){
  182. document.getElementById('apply').removeAttribute('disabled');
  183. document.getElementById('wait').style.display = 'none';
  184. console.log("STATUS: " + this.status);
  185. if (this.status == 200) {
  186. showOptimizations(this.response);
  187. }
  188. else if (this.status == 413) { // Payload too large
  189. showMessage('Error', 'Too many combination found. Plesase narow your criteria and retry.');
  190. }
  191. else if (this.status == 500) { // Server error
  192. showMessage('Error', 'Too many rune combination found. Plesase narow your criteria and retry.');
  193. }
  194. }
  195. };
  196. // TODO DEBUG
  197. //params = 'uid=8114048&unit=6441802832&limit=6&set[]=2&set[]=4&set[]=4&stat[]=4&stat[]=4&stat[]=4&source=0&tuning=2&min_defense=800';
  198. // Clear result table, disable button and show spinner
  199. var container = document.getElementById('optimizations');
  200. while (container.firstChild) {
  201. container.removeChild(container.firstChild);
  202. }
  203. document.getElementById('apply').setAttribute('disabled', 'disabled');
  204. document.getElementById('wait').style.display = 'block';
  205. document.getElementById('results').style.display = 'none';
  206. // Make the request
  207. xhttp.open('POST', '/action/optimize/', true);
  208. xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  209. xhttp.send(params);
  210. }
  211. /**
  212. * Parses the received content and creates the HTML with the new
  213. * rune options.
  214. *
  215. * @param content JSON received from server.
  216. */
  217. function showOptimizations(content){
  218. var container = document.getElementById('optimizations');
  219. var data = JSON.parse(content);
  220. if (Number(data.total) == 0){
  221. showMessage('No results', 'No suitable combination found. Plesase relax your criteria and retry.');
  222. return;
  223. }
  224. var option;
  225. var tr;
  226. var td;
  227. var stat_table;
  228. var stat_tr;
  229. var stat_td;
  230. var span;
  231. var text;
  232. for (i = 0; i < data.options.length; i++){
  233. option = data.options[i];
  234. tr = document.createElement('tr');
  235. td = document.createElement('td');
  236. td.setAttribute('class', 'stats');
  237. stat_table = document.createElement('table');
  238. stat_table.setAttribute('class', 'stat_table');
  239. // attack
  240. stat_tr = document.createElement('tr');
  241. stat_td = document.createElement('td');
  242. stat_td.setAttribute('class', 'label');
  243. text = document.createTextNode('ATK');
  244. stat_td.appendChild(text);
  245. stat_tr.appendChild(stat_td);
  246. stat_td = document.createElement('td');
  247. stat_td.setAttribute('class', 'value');
  248. span = document.createElement('span');
  249. span.setAttribute('class', 'stat');
  250. text = document.createTextNode(option.stats.attack + " ");
  251. span.appendChild(text);
  252. stat_td.appendChild(span);
  253. span = document.createElement('span');
  254. if (Number(option.stats.attack) > Number(current_stats["attack"])){
  255. span.setAttribute('class', 'variation increment');
  256. text = document.createTextNode(option.stats.attack - current_stats["attack"]);
  257. }
  258. else if (Number(option.stats.attack) < Number(current_stats["attack"])){
  259. span.setAttribute('class', 'variation decrement');
  260. text = document.createTextNode(current_stats["attack"] - option.stats.attack);
  261. }
  262. else{
  263. span.setAttribute('class', 'variation');
  264. text = document.createTextNode(" ");
  265. }
  266. span.appendChild(text);
  267. stat_td.appendChild(span);
  268. stat_tr.appendChild(stat_td);
  269. stat_table.appendChild(stat_tr);
  270. // defense
  271. stat_tr = document.createElement('tr');
  272. stat_td = document.createElement('td');
  273. stat_td.setAttribute('class', 'label');
  274. text = document.createTextNode('DEF');
  275. stat_td.appendChild(text);
  276. stat_tr.appendChild(stat_td);
  277. stat_td = document.createElement('td');
  278. stat_td.setAttribute('class', 'value');
  279. span = document.createElement('span');
  280. span.setAttribute('class', 'stat');
  281. text = document.createTextNode(option.stats.defense + " ");
  282. span.appendChild(text);
  283. stat_td.appendChild(span);
  284. span = document.createElement('span');
  285. if (Number(option.stats.defense) > Number(current_stats["defense"])){
  286. span.setAttribute('class', 'variation increment');
  287. text = document.createTextNode(option.stats.defense - current_stats["defense"]);
  288. }
  289. else if (Number(option.stats.defense) < Number(current_stats["defense"])){
  290. span.setAttribute('class', 'variation decrement');
  291. text = document.createTextNode(current_stats["defense"] - option.stats.defense);
  292. }
  293. else{
  294. span.setAttribute('class', 'variation');
  295. text = document.createTextNode(" ");
  296. }
  297. span.appendChild(text);
  298. stat_td.appendChild(span);
  299. stat_tr.appendChild(stat_td);
  300. stat_table.appendChild(stat_tr);
  301. // hp
  302. stat_tr = document.createElement('tr');
  303. stat_td = document.createElement('td');
  304. stat_td.setAttribute('class', 'label');
  305. text = document.createTextNode('HP ');
  306. stat_td.appendChild(text);
  307. stat_tr.appendChild(stat_td);
  308. stat_td = document.createElement('td');
  309. stat_td.setAttribute('class', 'value');
  310. span = document.createElement('span');
  311. span.setAttribute('class', 'stat');
  312. text = document.createTextNode(option.stats.hp + " ");
  313. span.appendChild(text);
  314. stat_td.appendChild(span);
  315. span = document.createElement('span');
  316. if (Number(option.stats.hp) > Number(current_stats["hp"])){
  317. span.setAttribute('class', 'variation increment');
  318. text = document.createTextNode(option.stats.hp - current_stats["hp"]);
  319. }
  320. else if (Number(option.stats.hp) < Number(current_stats["hp"])){
  321. span.setAttribute('class', 'variation decrement');
  322. text = document.createTextNode(current_stats["hp"] - option.stats.hp);
  323. }
  324. else{
  325. span.setAttribute('class', 'variation');
  326. text = document.createTextNode(" ");
  327. }
  328. span.appendChild(text);
  329. stat_td.appendChild(span);
  330. stat_tr.appendChild(stat_td);
  331. stat_table.appendChild(stat_tr);
  332. // speed
  333. stat_tr = document.createElement('tr');
  334. stat_td = document.createElement('td');
  335. stat_td.setAttribute('class', 'label');
  336. text = document.createTextNode('SPD');
  337. stat_td.appendChild(text);
  338. stat_tr.appendChild(stat_td);
  339. stat_td = document.createElement('td');
  340. stat_td.setAttribute('class', 'value');
  341. span = document.createElement('span');
  342. span.setAttribute('class', 'stat');
  343. text = document.createTextNode(option.stats.speed + " ");
  344. span.appendChild(text);
  345. stat_td.appendChild(span);
  346. span = document.createElement('span');
  347. if (Number(option.stats.speed) > Number(current_stats["speed"])){
  348. span.setAttribute('class', 'variation increment');
  349. text = document.createTextNode(option.stats.speed - current_stats["speed"]);
  350. }
  351. else if (Number(option.stats.speed) < Number(current_stats["speed"])){
  352. span.setAttribute('class', 'variation decrement');
  353. text = document.createTextNode(current_stats["speed"] - option.stats.speed);
  354. }
  355. else{
  356. span.setAttribute('class', 'variation');
  357. text = document.createTextNode(" ");
  358. }
  359. span.appendChild(text);
  360. stat_td.appendChild(span);
  361. stat_tr.appendChild(stat_td);
  362. stat_table.appendChild(stat_tr);
  363. // crit_rate
  364. stat_tr = document.createElement('tr');
  365. stat_td = document.createElement('td');
  366. stat_td.setAttribute('class', 'label');
  367. text = document.createTextNode('CRR');
  368. stat_td.appendChild(text);
  369. stat_tr.appendChild(stat_td);
  370. stat_td = document.createElement('td');
  371. stat_td.setAttribute('class', 'value');
  372. span = document.createElement('span');
  373. span.setAttribute('class', 'stat');
  374. text = document.createTextNode(option.stats.crit_rate + "%");
  375. span.appendChild(text);
  376. stat_td.appendChild(span);
  377. span = document.createElement('span');
  378. if (Number(option.stats.crit_rate) > Number(current_stats["crit_rate"])){
  379. span.setAttribute('class', 'variation increment');
  380. text = document.createTextNode(option.stats.crit_rate - current_stats["crit_rate"]);
  381. }
  382. else if (Number(option.stats.crit_rate) < Number(current_stats["crit_rate"])){
  383. span.setAttribute('class', 'variation decrement');
  384. text = document.createTextNode(current_stats["crit_rate"] - option.stats.crit_rate);
  385. }
  386. else{
  387. span.setAttribute('class', 'variation');
  388. text = document.createTextNode(" ");
  389. }
  390. span.appendChild(text);
  391. stat_td.appendChild(span);
  392. stat_tr.appendChild(stat_td);
  393. stat_table.appendChild(stat_tr);
  394. // crit_damage
  395. stat_tr = document.createElement('tr');
  396. stat_td = document.createElement('td');
  397. stat_td.setAttribute('class', 'label');
  398. text = document.createTextNode('CRD');
  399. stat_td.appendChild(text);
  400. stat_tr.appendChild(stat_td);
  401. stat_td = document.createElement('td');
  402. stat_td.setAttribute('class', 'value');
  403. span = document.createElement('span');
  404. span.setAttribute('class', 'stat');
  405. text = document.createTextNode(option.stats.crit_damage + "%");
  406. span.appendChild(text);
  407. stat_td.appendChild(span);
  408. span = document.createElement('span');
  409. if (Number(option.stats.crit_damage) > Number(current_stats["crit_damage"])){
  410. span.setAttribute('class', 'variation increment');
  411. text = document.createTextNode(option.stats.crit_damage - current_stats["crit_damage"]);
  412. }
  413. else if (Number(option.stats.crit_damage) < Number(current_stats["crit_damage"])){
  414. span.setAttribute('class', 'variation decrement');
  415. text = document.createTextNode(current_stats["crit_damage"] - option.stats.crit_damage);
  416. }
  417. else{
  418. span.setAttribute('class', 'variation');
  419. text = document.createTextNode(" ");
  420. }
  421. span.appendChild(text);
  422. stat_td.appendChild(span);
  423. stat_tr.appendChild(stat_td);
  424. stat_table.appendChild(stat_tr);
  425. // accuracy
  426. stat_tr = document.createElement('tr');
  427. stat_td = document.createElement('td');
  428. stat_td.setAttribute('class', 'label');
  429. text = document.createTextNode('ACC');
  430. stat_td.appendChild(text);
  431. stat_tr.appendChild(stat_td);
  432. stat_td = document.createElement('td');
  433. stat_td.setAttribute('class', 'value');
  434. span = document.createElement('span');
  435. span.setAttribute('class', 'stat');
  436. text = document.createTextNode(option.stats.accuracy + "%");
  437. span.appendChild(text);
  438. stat_td.appendChild(span);
  439. span = document.createElement('span');
  440. if (Number(option.stats.accuracy) > Number(current_stats["accuracy"])){
  441. span.setAttribute('class', 'variation increment');
  442. text = document.createTextNode(option.stats.accuracy - current_stats["accuracy"]);
  443. }
  444. else if (Number(option.stats.accuracy) < Number(current_stats["accuracy"])){
  445. span.setAttribute('class', 'variation decrement');
  446. text = document.createTextNode(current_stats["accuracy"] - option.stats.accuracy);
  447. }
  448. else{
  449. span.setAttribute('class', 'variation');
  450. text = document.createTextNode(" ");
  451. }
  452. span.appendChild(text);
  453. stat_td.appendChild(span);
  454. stat_tr.appendChild(stat_td);
  455. stat_table.appendChild(stat_tr);
  456. // resistance
  457. stat_tr = document.createElement('tr');
  458. stat_td = document.createElement('td');
  459. stat_td.setAttribute('class', 'label');
  460. text = document.createTextNode('RES');
  461. stat_td.appendChild(text);
  462. stat_tr.appendChild(stat_td);
  463. stat_td = document.createElement('td');
  464. stat_td.setAttribute('class', 'value');
  465. span = document.createElement('span');
  466. span.setAttribute('class', 'stat');
  467. text = document.createTextNode(option.stats.resistance + "%");
  468. span.appendChild(text);
  469. stat_td.appendChild(span);
  470. span = document.createElement('span');
  471. if (Number(option.stats.resistance) > Number(current_stats["resistance"])){
  472. span.setAttribute('class', 'variation increment');
  473. text = document.createTextNode(option.stats.resistance - current_stats["resistance"]);
  474. }
  475. else if (Number(option.stats.resistance) < Number(current_stats["resistance"])){
  476. span.setAttribute('class', 'variation decrement');
  477. text = document.createTextNode(current_stats["resistance"] - option.stats.resistance);
  478. }
  479. else{
  480. span.setAttribute('class', 'variation');
  481. text = document.createTextNode(" ");
  482. }
  483. span.appendChild(text);
  484. stat_td.appendChild(span);
  485. stat_tr.appendChild(stat_td);
  486. stat_table.appendChild(stat_tr);
  487. // ehp
  488. stat_tr = document.createElement('tr');
  489. stat_td = document.createElement('td');
  490. stat_td.setAttribute('class', 'label');
  491. text = document.createTextNode('EHP');
  492. stat_td.appendChild(text);
  493. stat_tr.appendChild(stat_td);
  494. stat_td = document.createElement('td');
  495. stat_td.setAttribute('class', 'value');
  496. span = document.createElement('span');
  497. span.setAttribute('class', 'stat');
  498. text = document.createTextNode(option.stats.ehp + " ");
  499. span.appendChild(text);
  500. stat_td.appendChild(span);
  501. span = document.createElement('span');
  502. if (Number(option.stats.ehp) > Number(current_stats["ehp"])){
  503. span.setAttribute('class', 'variation increment');
  504. text = document.createTextNode(option.stats.ehp - current_stats["ehp"]);
  505. }
  506. else if (Number(option.stats.ehp) < Number(current_stats["ehp"])){
  507. span.setAttribute('class', 'variation decrement');
  508. text = document.createTextNode(current_stats["ehp"] - option.stats.ehp);
  509. }
  510. else{
  511. span.setAttribute('class', 'variation');
  512. text = document.createTextNode(" ");
  513. }
  514. span.appendChild(text);
  515. stat_td.appendChild(span);
  516. stat_tr.appendChild(stat_td);
  517. stat_table.appendChild(stat_tr);
  518. // dmg
  519. stat_tr = document.createElement('tr');
  520. stat_td = document.createElement('td');
  521. stat_td.setAttribute('class', 'label');
  522. text = document.createTextNode('DMG');
  523. stat_td.appendChild(text);
  524. stat_tr.appendChild(stat_td);
  525. stat_td = document.createElement('td');
  526. stat_td.setAttribute('class', 'value');
  527. span = document.createElement('span');
  528. span.setAttribute('class', 'stat');
  529. text = document.createTextNode(option.stats.dmg + " ");
  530. span.appendChild(text);
  531. stat_td.appendChild(span);
  532. span = document.createElement('span');
  533. if (Number(option.stats.dmg) > Number(current_stats["dmg"])){
  534. span.setAttribute('class', 'variation increment');
  535. text = document.createTextNode(option.stats.dmg - current_stats["dmg"]);
  536. }
  537. else if (Number(option.stats.dmg) < Number(current_stats["dmg"])){
  538. span.setAttribute('class', 'variation decrement');
  539. text = document.createTextNode(current_stats["dmg"] - option.stats.dmg);
  540. }
  541. else{
  542. span.setAttribute('class', 'variation');
  543. text = document.createTextNode(" ");
  544. }
  545. span.appendChild(text);
  546. stat_td.appendChild(span);
  547. stat_tr.appendChild(stat_td);
  548. stat_table.appendChild(stat_tr);
  549. // Add to the main table
  550. td.appendChild(stat_table);
  551. tr.appendChild(td);
  552. // Runes td
  553. td = document.createElement('td');
  554. td.setAttribute('class', 'runes');
  555. td.innerHTML += option.runes[6 - 1].html;
  556. td.innerHTML += option.runes[1 - 1].html;
  557. td.innerHTML += option.runes[2 - 1].html;
  558. td.innerHTML += "<br/>";
  559. td.innerHTML += option.runes[5 - 1].html;
  560. td.innerHTML += option.runes[4 - 1].html;
  561. td.innerHTML += option.runes[3 - 1].html;
  562. // Add the table
  563. tr.appendChild(td);
  564. container.appendChild(tr);
  565. // Make the section visible
  566. document.getElementById('results').style.display = 'block';
  567. }
  568. }
  569. /**
  570. * Displays a pop-up message.
  571. *
  572. * @param title Message title.
  573. * @param text Message content.
  574. */
  575. function showMessage(title, text){
  576. document.getElementById('message_title').innerHTML = title;
  577. document.getElementById('message_text').innerHTML = text;
  578. document.getElementById('message_container').style.display = 'block';
  579. }
  580. /**
  581. * Closes the message pop-up.
  582. */
  583. function closeMessage(){
  584. document.getElementById('message_container').style.display = 'none';
  585. }
  586. </script>
  587. </head>
  588. <body>
  589. <?php
  590. include __DIR__ . "/inc/header.php";
  591. ?>
  592. <section id='monster' class='content'>
  593. <h2>
  594. Optimize <?=$page->unit->title?>
  595. </h2>
  596. <article id='profile'>
  597. <div id='monster_info'>
  598. <div class='monster_panel'>
  599. <?=HTML::unit_panel($page->unit)?>
  600. </div>
  601. <?php
  602. if ($page->unit->experience_level != 0){
  603. $exp_pct = ceil($page->unit->exp_gained * 100 / $page->unit->experience_level);
  604. $exp_txt = $page->unit->exp_gained . " / " . $page->unit->experience_level;
  605. }
  606. else{
  607. $exp_pct = 100;
  608. $exp_txt = "MAX";
  609. }
  610. $now = time();
  611. //$datediff = $now - $page->unit->create_time->getTimestamp();
  612. $datediff = $now - strtotime($page->unit->create_time->format('Y-m-d H:i:s'));
  613. $datediff = floor($datediff / (60 * 60 * 24));
  614. ?>
  615. <div id='monster_details'>
  616. <?php
  617. if (sizeof($page->unit->teams) > 0){
  618. ?>
  619. <div id='teams'>
  620. <h4>
  621. Teams:
  622. </h4>
  623. <ul>
  624. <?php
  625. foreach($page->unit->teams as $team){
  626. ?>
  627. <li>
  628. <a target='blank' href='/<?=$UID?>/teams/<?=$team->id?>'>
  629. <?=$team->name?>
  630. </a>
  631. </li>
  632. <?php
  633. }
  634. ?>
  635. </ul>
  636. </div>
  637. <?php
  638. }
  639. ?>
  640. </div>
  641. </div>
  642. <table id='stats'>
  643. <tr>
  644. <th>
  645. Stats
  646. </th>
  647. <th>
  648. Base
  649. </th>
  650. <th>
  651. Runes
  652. </th>
  653. <th>
  654. Artifacts
  655. </th>
  656. <th>
  657. Buildings
  658. </th>
  659. <th>
  660. Total
  661. </th>
  662. </tr>
  663. <tr>
  664. <th>
  665. ATK
  666. </th>
  667. <td class='base'>
  668. <?=$page->unit->attack?>
  669. <span class='percent'>&nbsp;</span>
  670. </td>
  671. <td class='extra'>
  672. +<?=$page->unit->rune_attack?>
  673. <span class='percent'>&nbsp;</span>
  674. </td>
  675. <td class='extra'>
  676. +<?=$page->unit->artifact_attack?>
  677. <span class='percent'>&nbsp;</span>
  678. </td>
  679. <td class='extra'>
  680. +<?=$page->unit->building_attack?>
  681. <span class='percent'>&nbsp;</span>
  682. </td>
  683. <td class='total'>
  684. <?=$page->unit->total_attack?>
  685. <span class='percent'>&nbsp;</span>
  686. </td>
  687. </tr>
  688. <tr>
  689. <th>
  690. DEF
  691. </th>
  692. <td class='base'>
  693. <?=$page->unit->defense?>
  694. <span class='percent'>&nbsp;</span>
  695. </td>
  696. <td class='extra'>
  697. +<?=$page->unit->rune_defense?>
  698. <span class='percent'>&nbsp;</span>
  699. </td>
  700. <td class='extra'>
  701. +<?=$page->unit->artifact_defense?>
  702. <span class='percent'>&nbsp;</span>
  703. </td>
  704. <td class='extra'>
  705. +<?=$page->unit->building_defense?>
  706. <span class='percent'>&nbsp;</span>
  707. </td>
  708. <td class='total'>
  709. <?=$page->unit->total_defense?>
  710. <span class='percent'>&nbsp;</span>
  711. </td>
  712. </tr>
  713. <tr>
  714. <th>
  715. HP
  716. </th>
  717. <td class='base'>
  718. <?=$page->unit->hp?>
  719. <span class='percent'>&nbsp;</span>
  720. </td>
  721. <td class='extra'>
  722. +<?=$page->unit->rune_hp?>
  723. <span class='percent'>&nbsp;</span>
  724. </td>
  725. <td class='extra'>
  726. +<?=$page->unit->artifact_hp?>
  727. <span class='percent'>&nbsp;</span>
  728. </td>
  729. <td class='extra'>
  730. +<?=$page->unit->building_hp?>
  731. <span class='percent'>&nbsp;</span>
  732. </td>
  733. <td class='total'>
  734. <?=$page->unit->total_hp?>
  735. <span class='percent'>&nbsp;</span>
  736. </td>
  737. </tr>
  738. <tr>
  739. <th>
  740. SPD
  741. </th>
  742. <td class='base'>
  743. <?=$page->unit->speed?>
  744. <span class='percent'>&nbsp;</span>
  745. </td>
  746. <td class='extra'>
  747. +<?=$page->unit->rune_speed?>
  748. <span class='percent'>&nbsp;</span>
  749. </td>
  750. <td class='extra'>
  751. +<?=$page->unit->artifact_speed?>
  752. <span class='percent'>&nbsp;</span>
  753. </td>
  754. <td class='extra'>
  755. +<?=$page->unit->building_speed?>
  756. <span class='percent'>&nbsp;</span>
  757. </td>
  758. <td class='total'>
  759. <?=$page->unit->total_speed?>
  760. <span class='percent'>&nbsp;</span>
  761. </td>
  762. </tr>
  763. <tr>
  764. <th>
  765. CRR
  766. </th>
  767. <td class='base'>
  768. <?=$page->unit->crit_rate?>
  769. <span class='percent'>%</span>
  770. </td>
  771. <td class='extra'>
  772. +<?=$page->unit->rune_crit_rate?>
  773. <span class='percent'>%</span>
  774. </td>
  775. <td class='extra'>
  776. +<?=$page->unit->artifact_crit_rate?>
  777. <span class='percent'>%</span>
  778. </td>
  779. <td class='extra'>
  780. +<?=$page->unit->building_crit_rate?>
  781. <span class='percent'>%</span>
  782. </td>
  783. <td class='total'>
  784. <?=$page->unit->total_crit_rate?>
  785. <span class='percent'>%</span>
  786. </td>
  787. </tr>
  788. <tr>
  789. <th>
  790. CRD
  791. </th>
  792. <td class='base'>
  793. <?=$page->unit->crit_damage?>
  794. <span class='percent'>%</span>
  795. </td>
  796. <td class='extra'>
  797. +<?=$page->unit->rune_crit_damage?>
  798. <span class='percent'>%</span>
  799. </td>
  800. <td class='extra'>
  801. +<?=$page->unit->artifact_crit_damage?>
  802. <span class='percent'>%</span>
  803. </td>
  804. <td class='extra'>
  805. +<?=$page->unit->building_crit_damage?>
  806. <span class='percent'>%</span>
  807. </td>
  808. <td class='total'>
  809. <?=$page->unit->total_crit_damage?>
  810. <span class='percent'>%</span>
  811. </td>
  812. </tr>
  813. <tr>
  814. <th>
  815. ACC
  816. </th>
  817. <td class='base'>
  818. <?=$page->unit->accuracy?>
  819. <span class='percent'>%</span>
  820. </td>
  821. <td class='extra'>
  822. +<?=$page->unit->rune_accuracy?>
  823. <span class='percent'>%</span>
  824. </td>
  825. <td class='extra'>
  826. +<?=$page->unit->artifact_accuracy?>
  827. <span class='percent'>%</span>
  828. </td>
  829. <td class='extra'>
  830. +<?=$page->unit->building_accuracy?>
  831. <span class='percent'>%</span>
  832. </td>
  833. <td class='total'>
  834. <?=$page->unit->total_accuracy?>
  835. <span class='percent'>%</span>
  836. </td>
  837. </tr>
  838. <tr>
  839. <th>
  840. RES
  841. </th>
  842. <td class='base'>
  843. <?=$page->unit->resistance?>
  844. <span class='percent'>%</span>
  845. </td>
  846. <td class='extra'>
  847. +<?=$page->unit->rune_resistance?>
  848. <span class='percent'>%</span>
  849. </td>
  850. <td class='extra'>
  851. +<?=$page->unit->artifact_resistance?>
  852. <span class='percent'>%</span>
  853. </td>
  854. <td class='extra'>
  855. +<?=$page->unit->building_resistance?>
  856. <span class='percent'>%</span>
  857. </td>
  858. <td class='total'>
  859. <?=$page->unit->total_resistance?>
  860. <span class='percent'>%</span>
  861. </td>
  862. </tr>
  863. <tr>
  864. <th colspan='5'>
  865. Effective HP
  866. </th>
  867. <td class='total'>
  868. <?=$page->unit->effective_hp?>
  869. <span class='percent'>&nbsp;</span>
  870. </td>
  871. </tr>
  872. <tr>
  873. <th colspan='5'>
  874. Effective DMG
  875. </th>
  876. <td class='total'>
  877. <?=$page->unit->effective_dmg?>
  878. <span class='percent'>&nbsp;</span>
  879. </td>
  880. </tr>
  881. </table>
  882. <div id='artifacts'>
  883. <?=HTML::artifact_table($page->unit->artifact_type)?>
  884. <?=HTML::artifact_table($page->unit->artifact_element)?>
  885. </div>
  886. </article> <!-- #profile -->
  887. <article id='current_runes'>
  888. <?php
  889. $show_list = [6, 1, 2, 5, 4, 3];
  890. //foreach ($page->unit->rune as $rune){
  891. foreach ($show_list as $i){
  892. $rune = $page->unit->rune[$i - 1];
  893. $total_runes ++;
  894. ?>
  895. <?=HTML::rune_table($rune)?>
  896. <?php
  897. if ($i == 2){
  898. ?>
  899. <br/>
  900. <?php
  901. }
  902. }
  903. ?>
  904. </article>
  905. </section> <!-- runes -->
  906. <section id='parameters' class='content'>
  907. <h2>
  908. Optimization parameters
  909. </h2>
  910. <article>
  911. <table>
  912. <tr>
  913. <td class='name'>
  914. Rune sets
  915. </td>
  916. <td class='value'>
  917. <?php
  918. $reflect = new ReflectionClass("RUNE_SET_ID");
  919. ?>
  920. <select id='set_1'>
  921. <?php
  922. foreach($reflect->getConstants() as $name => $id){
  923. $selected = "";
  924. if ($id == $sets[0]){
  925. $selected = "selected='selected'";
  926. }
  927. ?>
  928. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  929. <?php
  930. }
  931. ?>
  932. </select>
  933. <select id='set_2'>
  934. <?php
  935. foreach($reflect->getConstants() as $name => $id){
  936. $selected = "";
  937. if ($id == $sets[1]){
  938. $selected = "selected='selected'";
  939. }
  940. ?>
  941. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  942. <?php
  943. }
  944. ?>
  945. </select>
  946. <select id='set_3'>
  947. <option value='' <?=$selected?>></option>
  948. <?php
  949. foreach($reflect->getConstants() as $name => $id){
  950. $selected = "";
  951. if ($id == $sets[2]){
  952. $selected = "selected='selected'";
  953. }
  954. ?>
  955. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  956. <?php
  957. }
  958. ?>
  959. </select>
  960. </td>
  961. <td class='empty'>
  962. </td>
  963. <td class='name'>
  964. Min HP
  965. </td>
  966. <td class='value'>
  967. <input id='min_hp' type='range' value='<?=$page->unit->total_hp?>' min='<?=$page->unit->hp?>' max='50000' oninput='updateMinValue("hp", this);'>
  968. <input type='number' id='lbl_min_hp' value='<?=$page->unit->total_hp?>' min='<?=$page->unit->hp?>' max='50000' onChange='updateMinValue("hp", this);'></input>
  969. </td>
  970. </tr>
  971. <tr>
  972. <td class='name'>
  973. Even slots
  974. </td>
  975. <td class='value'>
  976. <select id='slot_2'>
  977. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[0] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  978. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[0] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  979. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[0] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  980. <option value='<?=RUNE_STAT_ID::SPD?>' <?=($mains[0] == RUNE_STAT_ID::SPD) ? ("selected='selected'") : ("");?>>SPD</option>
  981. </select>
  982. <select id='slot_4'>
  983. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[1] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  984. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[1] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  985. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[1] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  986. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRR) ? ("selected='selected'") : ("");?>>CRR</option>
  987. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRD) ? ("selected='selected'") : ("");?>>CRD</option>
  988. </select>
  989. <select id='slot_6'>
  990. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[2] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  991. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[2] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  992. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[2] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  993. <option value='<?=RUNE_STAT_ID::ACC?>' <?=($mains[2] == RUNE_STAT_ID::ACC) ? ("selected='selected'") : ("");?>>ACC</option>
  994. <option value='<?=RUNE_STAT_ID::RES?>' <?=($mains[2] == RUNE_STAT_ID::RES) ? ("selected='selected'") : ("");?>>RES</option>
  995. </select>
  996. </td>
  997. <td class='empty'>
  998. </td>
  999. <td class='name'>
  1000. Min ATK
  1001. </td>
  1002. <td class='value'>
  1003. <input id='min_attack' type='range' value='<?=$page->unit->total_attack?>' min='<?=$page->unit->attack?>' max='4000' oninput='updateMinValue("attack", this);'>
  1004. <input type='number' id='lbl_min_attack' value='<?=$page->unit->total_attack?>' min='<?=$page->unit->attack?>' max='4000' onChange='updateMinValue("attack", this);'></input>
  1005. </td>
  1006. </tr>
  1007. <tr>
  1008. <td class='name'>
  1009. Use runes from
  1010. </td>
  1011. <td class='value'>
  1012. <select id='rune_source'>
  1013. <option value='0'>Storage only</option>
  1014. <option value='1'>Units in no teams</option>
  1015. <option value='2'>Units in teams with 0 score</option>
  1016. <option value='3'>Units with lower overall score</option>
  1017. <option value='4'>All runes</option>
  1018. </select>
  1019. </td>
  1020. <td class='empty'>
  1021. </td>
  1022. <td class='name'>
  1023. Min DEF
  1024. </td>
  1025. <td class='value'>
  1026. <input id='min_defense' type='range' value='<?=$page->unit->total_defense?>' min='<?=$page->unit->defense?>' max='4000' oninput='updateMinValue("defense", this);'>
  1027. <input type='number' id='lbl_min_defense' value='<?=$page->unit->total_defense?>' min='<?=$page->unit->defense?>' max='4000' onChange='updateMinValue("defense", this);'></input>
  1028. </td>
  1029. </tr>
  1030. <tr>
  1031. <td class='name'>
  1032. Tune optimizer for
  1033. </td>
  1034. <td class='value'>
  1035. <select id='tuning'>
  1036. <option value='0'>Rune current levels</option>
  1037. <option value='1'>+12</option>
  1038. <option value='2'>2/4/6 +15, 1/3/5 + 12</option>
  1039. <option value='3'>+15</option>
  1040. </select>
  1041. </td>
  1042. <td class='empty'>
  1043. </td>
  1044. <td class='name'>
  1045. Min SPD
  1046. </td>
  1047. <td class='value'>
  1048. <input id='min_speed' type='range' value='<?=$page->unit->total_speed?>' min='<?=$page->unit->speed?>' max='400' oninput='updateMinValue("speed", this);'>
  1049. <input type='number' id='lbl_min_speed' value='<?=$page->unit->total_speed?>' min='<?=$page->unit->speed?>' max='400' onChange='updateMinValue("speed", this);'></input>
  1050. </td>
  1051. </tr>
  1052. <tr>
  1053. <td class='empty'>
  1054. Max. combinations
  1055. </td>
  1056. <td class='empty'>
  1057. <input id='limit' type='number' value='10' max='100' min='1'>
  1058. </td>
  1059. <td class='empty'>
  1060. </td>
  1061. <td class='name'>
  1062. Min CRR
  1063. </td>
  1064. <td class='value'>
  1065. <input id='min_crit_rate' type='range' value='<?=$page->unit->total_crit_rate?>' min='<?=$page->unit->crit_rate?>' max='100' oninput='updateMinValue("crit_rate", this);'>
  1066. <input type='number' id='lbl_min_crit_rate' value='<?=$page->unit->total_crit_rate?>' min='<?=$page->unit->crit_rate?>' max='100' onChange='updateMinValue("crit_rate", this);'></input>%
  1067. </td>
  1068. </tr>
  1069. <tr>
  1070. <td class='empty'>
  1071. </td>
  1072. <td class='empty'>
  1073. </td>
  1074. <td class='empty'>
  1075. </td>
  1076. <td class='name'>
  1077. Min CRD
  1078. </td>
  1079. <td class='value'>
  1080. <input id='min_crit_damage' type='range' value='<?=$page->unit->total_crit_damage?>' min='<?=$page->unit->crit_damage?>' max='400' oninput='updateMinValue("crit_damage", this);'>
  1081. <input type='number' id='lbl_min_crit_damage' value='<?=$page->unit->total_crit_damage?>' min='<?=$page->unit->crit_damage?>' max='400' onChange='updateMinValue("crit_damage", this);'></input>%
  1082. </td>
  1083. </tr>
  1084. <tr>
  1085. <td class='empty'>
  1086. </td>
  1087. <td class='empty'>
  1088. </td>
  1089. <td class='empty'>
  1090. </td>
  1091. <td class='name'>
  1092. Min ACC
  1093. </td>
  1094. <td class='value'>
  1095. <input id='min_accuracy' type='range' value='<?=$page->unit->total_accuracy?>' min='<?=$page->unit->accuracy?>' max='85' oninput='updateMinValue("accuracy", this);'>
  1096. <input type='number' id='lbl_min_accuracy' value='<?=$page->unit->total_accuracy?>' min='<?=$page->unit->accuracy?>' max='85' onChange='updateMinValue("accuracy", this);'></input>%
  1097. </td>
  1098. </tr>
  1099. <tr>
  1100. <td class='empty'>
  1101. </td>
  1102. <td class='empty'>
  1103. </td>
  1104. <td class='empty'>
  1105. </td>
  1106. <td class='name'>
  1107. Min RES
  1108. </td>
  1109. <td class='value'>
  1110. <input id='min_resistance' type='range' value='<?=$page->unit->total_resistance?>' min='<?=$page->unit->resistance?>' max='85' oninput='updateMinValue("resistance", this);'>
  1111. <input type='number' id='lbl_min_resistance' value='<?=$page->unit->total_resistance?>' min='<?=$page->unit->resistance?>' max='85' onChange='updateMinValue("resistance", this);'></input>%
  1112. </td>
  1113. </tr>
  1114. <tr>
  1115. <td class='empty'>
  1116. </td>
  1117. <td class='empty'>
  1118. </td>
  1119. <td class='empty'>
  1120. </td>
  1121. <td class='name'>
  1122. Min EHP
  1123. </td>
  1124. <td class='value'>
  1125. <input id='min_ehp' type='range' value='<?=$page->unit->effective_hp?>' min='0' max='200000' oninput='updateMinValue("ehp", this);'>
  1126. <input type='number' id='lbl_min_ehp' value='<?=$page->unit->effective_hp?>' min='0' max='200000' onChange='updateMinValue("ehp", this);'></input>
  1127. </td>
  1128. </tr>
  1129. <tr>
  1130. <td class='action'>
  1131. <input id='apply' type='button' value='Apply' onClick='apply();'/>
  1132. </td>
  1133. <td class='empty'>
  1134. <img id='wait' src='<?=URL::IMG["ICON"] . "wait.gif";?>'>
  1135. </td>
  1136. <td class='empty'>
  1137. </td>
  1138. <td class='name'>
  1139. Min DMG
  1140. </td>
  1141. <td class='value'>
  1142. <input id='min_dmg' type='range' value='<?=$page->unit->effective_dmg?>' min='0' max='7000' oninput='updateMinValue("dmg", this);'>
  1143. <input type='number' id='lbl_min_dmg' value='<?=$page->unit->effective_dmg?>' min='0' max='7000' onChange='updateMinValue("dmg", this);'></input>
  1144. </td>
  1145. </tr>
  1146. </table>
  1147. </article>
  1148. </section>
  1149. <section id='results' class='content'>
  1150. <h2>
  1151. Optimization results
  1152. </h2>
  1153. <article>
  1154. <table>
  1155. <tbody id='optimizations'>
  1156. </tbody>
  1157. </table>
  1158. </article>
  1159. </section>
  1160. <div id='message_container'>
  1161. <section class='content'>
  1162. <h2 id='message_title'>
  1163. Message
  1164. </h2>
  1165. <article>
  1166. <p id='message_text'>
  1167. Message Text
  1168. </p>
  1169. </article>
  1170. <input type='button' value='OK' id='message_button' onclick='closeMessage();'/>
  1171. </section>
  1172. </div>
  1173. <?php
  1174. include __DIR__ . "/inc/footer.php";
  1175. ?>
  1176. </body>
  1177. </html>