optimizer_unit.php 65 KB

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