optimizer_unit.php 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359
  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 the 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. <aside>
  617. <h2>
  618. Optimize <?=$page->unit->title?>
  619. </h2>
  620. <div id='monster_info'>
  621. <div class='monster_panel'>
  622. <?=HTML::unit_panel($page->unit)?>
  623. </div>
  624. <?php
  625. if ($page->unit->experience_level != 0){
  626. $exp_pct = ceil($page->unit->exp_gained * 100 / $page->unit->experience_level);
  627. $exp_txt = $page->unit->exp_gained . " / " . $page->unit->experience_level;
  628. }
  629. else{
  630. $exp_pct = 100;
  631. $exp_txt = "MAX";
  632. }
  633. $now = time();
  634. //$datediff = $now - $page->unit->create_time->getTimestamp();
  635. $datediff = $now - strtotime($page->unit->create_time->format('Y-m-d H:i:s'));
  636. $datediff = floor($datediff / (60 * 60 * 24));
  637. ?>
  638. <div id='monster_details'>
  639. <?php
  640. if (sizeof($page->unit->teams) > 0){
  641. ?>
  642. <div id='teams'>
  643. <h4>
  644. Teams:
  645. </h4>
  646. <ul>
  647. <?php
  648. foreach($page->unit->teams as $team){
  649. ?>
  650. <li>
  651. <a target='blank' href='/<?=$UID?>/teams/<?=$team->id?>'>
  652. <?=$team->name?>
  653. </a>
  654. </li>
  655. <?php
  656. }
  657. ?>
  658. </ul>
  659. </div>
  660. <?php
  661. }
  662. ?>
  663. </div>
  664. </div>
  665. </aside>
  666. <main>
  667. <section id='monster' class='content'>
  668. <h2>
  669. Optimize <?=$page->unit->title?>
  670. </h2>
  671. <article id='profile'>
  672. <table id='stats'>
  673. <tr>
  674. <th>
  675. Stats
  676. </th>
  677. <th>
  678. Base
  679. </th>
  680. <th>
  681. Runes
  682. </th>
  683. <th>
  684. Artifacts
  685. </th>
  686. <th>
  687. Buildings
  688. </th>
  689. <th>
  690. Total
  691. </th>
  692. </tr>
  693. <tr>
  694. <th>
  695. ATK
  696. </th>
  697. <td class='base'>
  698. <?=$page->unit->attack?>
  699. <span class='percent'>&nbsp;</span>
  700. </td>
  701. <td class='extra'>
  702. +<?=$page->unit->rune_attack?>
  703. <span class='percent'>&nbsp;</span>
  704. </td>
  705. <td class='extra'>
  706. +<?=$page->unit->artifact_attack?>
  707. <span class='percent'>&nbsp;</span>
  708. </td>
  709. <td class='extra'>
  710. +<?=$page->unit->building_attack?>
  711. <span class='percent'>&nbsp;</span>
  712. </td>
  713. <td class='total'>
  714. <?=$page->unit->total_attack?>
  715. <span class='percent'>&nbsp;</span>
  716. </td>
  717. </tr>
  718. <tr>
  719. <th>
  720. DEF
  721. </th>
  722. <td class='base'>
  723. <?=$page->unit->defense?>
  724. <span class='percent'>&nbsp;</span>
  725. </td>
  726. <td class='extra'>
  727. +<?=$page->unit->rune_defense?>
  728. <span class='percent'>&nbsp;</span>
  729. </td>
  730. <td class='extra'>
  731. +<?=$page->unit->artifact_defense?>
  732. <span class='percent'>&nbsp;</span>
  733. </td>
  734. <td class='extra'>
  735. +<?=$page->unit->building_defense?>
  736. <span class='percent'>&nbsp;</span>
  737. </td>
  738. <td class='total'>
  739. <?=$page->unit->total_defense?>
  740. <span class='percent'>&nbsp;</span>
  741. </td>
  742. </tr>
  743. <tr>
  744. <th>
  745. HP
  746. </th>
  747. <td class='base'>
  748. <?=$page->unit->hp?>
  749. <span class='percent'>&nbsp;</span>
  750. </td>
  751. <td class='extra'>
  752. +<?=$page->unit->rune_hp?>
  753. <span class='percent'>&nbsp;</span>
  754. </td>
  755. <td class='extra'>
  756. +<?=$page->unit->artifact_hp?>
  757. <span class='percent'>&nbsp;</span>
  758. </td>
  759. <td class='extra'>
  760. +<?=$page->unit->building_hp?>
  761. <span class='percent'>&nbsp;</span>
  762. </td>
  763. <td class='total'>
  764. <?=$page->unit->total_hp?>
  765. <span class='percent'>&nbsp;</span>
  766. </td>
  767. </tr>
  768. <tr>
  769. <th>
  770. SPD
  771. </th>
  772. <td class='base'>
  773. <?=$page->unit->speed?>
  774. <span class='percent'>&nbsp;</span>
  775. </td>
  776. <td class='extra'>
  777. +<?=$page->unit->rune_speed?>
  778. <span class='percent'>&nbsp;</span>
  779. </td>
  780. <td class='extra'>
  781. +<?=$page->unit->artifact_speed?>
  782. <span class='percent'>&nbsp;</span>
  783. </td>
  784. <td class='extra'>
  785. +<?=$page->unit->building_speed?>
  786. <span class='percent'>&nbsp;</span>
  787. </td>
  788. <td class='total'>
  789. <?=$page->unit->total_speed?>
  790. <span class='percent'>&nbsp;</span>
  791. </td>
  792. </tr>
  793. <tr>
  794. <th>
  795. CRR
  796. </th>
  797. <td class='base'>
  798. <?=$page->unit->crit_rate?>
  799. <span class='percent'>%</span>
  800. </td>
  801. <td class='extra'>
  802. +<?=$page->unit->rune_crit_rate?>
  803. <span class='percent'>%</span>
  804. </td>
  805. <td class='extra'>
  806. +<?=$page->unit->artifact_crit_rate?>
  807. <span class='percent'>%</span>
  808. </td>
  809. <td class='extra'>
  810. +<?=$page->unit->building_crit_rate?>
  811. <span class='percent'>%</span>
  812. </td>
  813. <td class='total'>
  814. <?=$page->unit->total_crit_rate?>
  815. <span class='percent'>%</span>
  816. </td>
  817. </tr>
  818. <tr>
  819. <th>
  820. CRD
  821. </th>
  822. <td class='base'>
  823. <?=$page->unit->crit_damage?>
  824. <span class='percent'>%</span>
  825. </td>
  826. <td class='extra'>
  827. +<?=$page->unit->rune_crit_damage?>
  828. <span class='percent'>%</span>
  829. </td>
  830. <td class='extra'>
  831. +<?=$page->unit->artifact_crit_damage?>
  832. <span class='percent'>%</span>
  833. </td>
  834. <td class='extra'>
  835. +<?=$page->unit->building_crit_damage?>
  836. <span class='percent'>%</span>
  837. </td>
  838. <td class='total'>
  839. <?=$page->unit->total_crit_damage?>
  840. <span class='percent'>%</span>
  841. </td>
  842. </tr>
  843. <tr>
  844. <th>
  845. ACC
  846. </th>
  847. <td class='base'>
  848. <?=$page->unit->accuracy?>
  849. <span class='percent'>%</span>
  850. </td>
  851. <td class='extra'>
  852. +<?=$page->unit->rune_accuracy?>
  853. <span class='percent'>%</span>
  854. </td>
  855. <td class='extra'>
  856. +<?=$page->unit->artifact_accuracy?>
  857. <span class='percent'>%</span>
  858. </td>
  859. <td class='extra'>
  860. +<?=$page->unit->building_accuracy?>
  861. <span class='percent'>%</span>
  862. </td>
  863. <td class='total'>
  864. <?=$page->unit->total_accuracy?>
  865. <span class='percent'>%</span>
  866. </td>
  867. </tr>
  868. <tr>
  869. <th>
  870. RES
  871. </th>
  872. <td class='base'>
  873. <?=$page->unit->resistance?>
  874. <span class='percent'>%</span>
  875. </td>
  876. <td class='extra'>
  877. +<?=$page->unit->rune_resistance?>
  878. <span class='percent'>%</span>
  879. </td>
  880. <td class='extra'>
  881. +<?=$page->unit->artifact_resistance?>
  882. <span class='percent'>%</span>
  883. </td>
  884. <td class='extra'>
  885. +<?=$page->unit->building_resistance?>
  886. <span class='percent'>%</span>
  887. </td>
  888. <td class='total'>
  889. <?=$page->unit->total_resistance?>
  890. <span class='percent'>%</span>
  891. </td>
  892. </tr>
  893. <tr>
  894. <th colspan='5'>
  895. Effective HP
  896. </th>
  897. <td class='total'>
  898. <?=$page->unit->effective_hp?>
  899. <span class='percent'>&nbsp;</span>
  900. </td>
  901. </tr>
  902. <tr>
  903. <th colspan='5'>
  904. Effective DMG
  905. </th>
  906. <td class='total'>
  907. <?=$page->unit->effective_dmg?>
  908. <span class='percent'>&nbsp;</span>
  909. </td>
  910. </tr>
  911. </table>
  912. <div id='artifacts'>
  913. <?=HTML::artifact_table($page->unit->artifact_type)?>
  914. <?=HTML::artifact_table($page->unit->artifact_element)?>
  915. </div>
  916. </article> <!-- #profile -->
  917. <article id='current_runes'>
  918. <?php
  919. $show_list = [6, 1, 2, 5, 4, 3];
  920. //foreach ($page->unit->rune as $rune){
  921. foreach ($show_list as $i){
  922. $rune = $page->unit->rune[$i - 1];
  923. $total_runes ++;
  924. ?>
  925. <?=HTML::rune_table($rune)?>
  926. <?php
  927. if ($i == 2){
  928. ?>
  929. <br/>
  930. <?php
  931. }
  932. }
  933. ?>
  934. </article>
  935. </section> <!-- runes -->
  936. <section id='parameters' class='content'>
  937. <h2>
  938. Optimization parameters
  939. </h2>
  940. <article>
  941. <table id='parameters'>
  942. <tr>
  943. <td class='name'>
  944. Rune sets
  945. </td>
  946. <td class='value'>
  947. <?php
  948. $reflect = new ReflectionClass("RUNE_SET_ID");
  949. ?>
  950. <select id='set_1'>
  951. <?php
  952. foreach($reflect->getConstants() as $name => $id){
  953. $selected = "";
  954. if ($id == $sets[0]){
  955. $selected = "selected='selected'";
  956. }
  957. ?>
  958. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  959. <?php
  960. }
  961. ?>
  962. </select>
  963. <select id='set_2'>
  964. <?php
  965. foreach($reflect->getConstants() as $name => $id){
  966. $selected = "";
  967. if ($id == $sets[1]){
  968. $selected = "selected='selected'";
  969. }
  970. ?>
  971. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  972. <?php
  973. }
  974. ?>
  975. </select>
  976. <select id='set_3'>
  977. <option value='' <?=$selected?>></option>
  978. <?php
  979. foreach($reflect->getConstants() as $name => $id){
  980. $selected = "";
  981. if ($id == $sets[2]){
  982. $selected = "selected='selected'";
  983. }
  984. ?>
  985. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  986. <?php
  987. }
  988. ?>
  989. </select>
  990. </td>
  991. <td class='empty'>
  992. </td>
  993. <td class='name'>
  994. Min HP
  995. </td>
  996. <td class='value'>
  997. <input id='min_hp' type='range' value='<?=$page->unit->total_hp?>' min='<?=$page->unit->hp?>' max='50000' oninput='updateMinValue("hp", this);'>
  998. <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>
  999. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("hp");'>
  1000. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1001. </a>
  1002. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("hp");'>
  1003. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1004. </a>
  1005. </td>
  1006. </tr>
  1007. <tr>
  1008. <td class='name'>
  1009. Even slots
  1010. </td>
  1011. <td class='value'>
  1012. <select id='slot_2'>
  1013. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[0] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1014. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[0] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1015. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[0] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1016. <option value='<?=RUNE_STAT_ID::SPD?>' <?=($mains[0] == RUNE_STAT_ID::SPD) ? ("selected='selected'") : ("");?>>SPD</option>
  1017. </select>
  1018. <select id='slot_4'>
  1019. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[1] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1020. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[1] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1021. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[1] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1022. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRR) ? ("selected='selected'") : ("");?>>CRR</option>
  1023. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRD) ? ("selected='selected'") : ("");?>>CRD</option>
  1024. </select>
  1025. <select id='slot_6'>
  1026. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[2] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1027. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[2] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1028. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[2] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1029. <option value='<?=RUNE_STAT_ID::ACC?>' <?=($mains[2] == RUNE_STAT_ID::ACC) ? ("selected='selected'") : ("");?>>ACC</option>
  1030. <option value='<?=RUNE_STAT_ID::RES?>' <?=($mains[2] == RUNE_STAT_ID::RES) ? ("selected='selected'") : ("");?>>RES</option>
  1031. </select>
  1032. </td>
  1033. <td class='empty'>
  1034. </td>
  1035. <td class='name'>
  1036. Min ATK
  1037. </td>
  1038. <td class='value'>
  1039. <input id='min_attack' type='range' value='<?=$page->unit->total_attack?>' min='<?=$page->unit->attack?>' max='4000' oninput='updateMinValue("attack", this);'>
  1040. <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>
  1041. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("attack");'>
  1042. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1043. </a>
  1044. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("attack");'>
  1045. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1046. </a>
  1047. </td>
  1048. </tr>
  1049. <tr>
  1050. <td class='name'>
  1051. Use runes from
  1052. </td>
  1053. <td class='value'>
  1054. <select id='rune_source'>
  1055. <option value='0'>Storage only</option>
  1056. <option value='1'>Units in no teams</option>
  1057. <option value='2'>Units in teams with 0 score</option>
  1058. <option value='3'>Units with lower overall score</option>
  1059. <option value='4'>All runes</option>
  1060. </select>
  1061. </td>
  1062. <td class='empty'>
  1063. </td>
  1064. <td class='name'>
  1065. Min DEF
  1066. </td>
  1067. <td class='value'>
  1068. <input id='min_defense' type='range' value='<?=$page->unit->total_defense?>' min='<?=$page->unit->defense?>' max='4000' oninput='updateMinValue("defense", this);'>
  1069. <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>
  1070. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("defense");'>
  1071. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1072. </a>
  1073. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("defense");'>
  1074. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1075. </a>
  1076. </td>
  1077. </tr>
  1078. <tr>
  1079. <td class='name'>
  1080. Tune optimizer for
  1081. </td>
  1082. <td class='value'>
  1083. <select id='tuning'>
  1084. <option value='0'>Rune current levels</option>
  1085. <option value='1'>+12</option>
  1086. <option value='2'>2/4/6 +15, 1/3/5 + 12</option>
  1087. <option value='3'>+15</option>
  1088. </select>
  1089. </td>
  1090. <td class='empty'>
  1091. </td>
  1092. <td class='name'>
  1093. Min SPD
  1094. </td>
  1095. <td class='value'>
  1096. <input id='min_speed' type='range' value='<?=$page->unit->total_speed?>' min='<?=$page->unit->speed?>' max='400' oninput='updateMinValue("speed", this);'>
  1097. <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>
  1098. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("speed");'>
  1099. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1100. </a>
  1101. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("speed");'>
  1102. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1103. </a>
  1104. </td>
  1105. </tr>
  1106. <tr>
  1107. <td class='empty'>
  1108. Max. combinations
  1109. </td>
  1110. <td class='empty'>
  1111. <input id='limit' type='number' value='10' max='100' min='1'>
  1112. </td>
  1113. <td class='empty'>
  1114. </td>
  1115. <td class='name'>
  1116. Min CRR
  1117. </td>
  1118. <td class='value'>
  1119. <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);'>
  1120. <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>
  1121. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("crit_rate");'>
  1122. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1123. </a>
  1124. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("crit_rate");'>
  1125. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1126. </a>
  1127. </td>
  1128. </tr>
  1129. <tr>
  1130. <td class='empty'>
  1131. </td>
  1132. <td class='empty'>
  1133. </td>
  1134. <td class='empty'>
  1135. </td>
  1136. <td class='name'>
  1137. Min CRD
  1138. </td>
  1139. <td class='value'>
  1140. <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);'>
  1141. <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>
  1142. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("crit_damage");'>
  1143. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1144. </a>
  1145. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("crit_damage");'>
  1146. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1147. </a>
  1148. </td>
  1149. </tr>
  1150. <tr>
  1151. <td class='empty'>
  1152. </td>
  1153. <td class='empty'>
  1154. </td>
  1155. <td class='empty'>
  1156. </td>
  1157. <td class='name'>
  1158. Min ACC
  1159. </td>
  1160. <td class='value'>
  1161. <input id='min_accuracy' type='range' value='<?=$page->unit->total_accuracy?>' min='<?=$page->unit->accuracy?>' max='85' oninput='updateMinValue("accuracy", this);'>
  1162. <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>
  1163. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("accuracy");'>
  1164. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1165. </a>
  1166. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("accuracy");'>
  1167. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1168. </a>
  1169. </td>
  1170. </tr>
  1171. <tr>
  1172. <td class='empty'>
  1173. </td>
  1174. <td class='empty'>
  1175. </td>
  1176. <td class='empty'>
  1177. </td>
  1178. <td class='name'>
  1179. Min RES
  1180. </td>
  1181. <td class='value'>
  1182. <input id='min_resistance' type='range' value='<?=$page->unit->total_resistance?>' min='<?=$page->unit->resistance?>' max='85' oninput='updateMinValue("resistance", this);'>
  1183. <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>
  1184. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("resistance");'>
  1185. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1186. </a>
  1187. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("resistance");'>
  1188. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1189. </a>
  1190. </td>
  1191. </tr>
  1192. <tr>
  1193. <td class='empty'>
  1194. </td>
  1195. <td class='empty'>
  1196. </td>
  1197. <td class='empty'>
  1198. </td>
  1199. <td class='name'>
  1200. Min EHP
  1201. </td>
  1202. <td class='value'>
  1203. <input id='min_ehp' type='range' value='<?=$page->unit->effective_hp?>' min='0' max='200000' oninput='updateMinValue("ehp", this);'>
  1204. <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>
  1205. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("ehp");'>
  1206. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1207. </a>
  1208. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("ehp");'>
  1209. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1210. </a>
  1211. </td>
  1212. </tr>
  1213. <tr>
  1214. <td class='action'>
  1215. <input id='apply' type='button' value='Apply' onClick='apply();'/>
  1216. </td>
  1217. <td class='empty'>
  1218. <img id='wait' src='<?=URL::IMG["ICON"] . "wait.gif";?>'>
  1219. </td>
  1220. <td class='empty'>
  1221. </td>
  1222. <td class='name'>
  1223. Min DMG
  1224. </td>
  1225. <td class='value'>
  1226. <input id='min_dmg' type='range' value='<?=$page->unit->effective_dmg?>' min='0' max='7000' oninput='updateMinValue("dmg", this);'>
  1227. <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>
  1228. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("dmg");'>
  1229. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1230. </a>
  1231. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("dmg");'>
  1232. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1233. </a>
  1234. </td>
  1235. </tr>
  1236. </table>
  1237. </article>
  1238. </section>
  1239. <section id='results' class='content'>
  1240. <h2>
  1241. Optimization results
  1242. </h2>
  1243. <article>
  1244. <div id='results_info'>
  1245. <span id='num_results'></span> results (<span id='num_skipped'></span> skipped) in <span id='num_seconds'></span> seconds
  1246. </div>
  1247. <table id='table_optimizations'>
  1248. <tbody id='optimizations'>
  1249. </tbody>
  1250. </table>
  1251. </article>
  1252. </section>
  1253. </main>
  1254. <div id='message_container'>
  1255. <section class='content'>
  1256. <h2 id='message_title'>
  1257. Message
  1258. </h2>
  1259. <article>
  1260. <p id='message_text'>
  1261. Message Text
  1262. </p>
  1263. </article>
  1264. <input type='button' value='OK' id='message_button' onclick='closeMessage();'/>
  1265. </section>
  1266. </div>
  1267. <?php
  1268. include __DIR__ . "/inc/footer.php";
  1269. ?>
  1270. </body>
  1271. </html>