optimizer_unit.php 88 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752
  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. var base_stats = {
  57. "attack": <?=$page->unit->attack?>,
  58. "defense": <?=$page->unit->defense?>,
  59. "hp": <?=$page->unit->hp?>,
  60. "speed": <?=$page->unit->speed?>,
  61. "crit_rate": <?=$page->unit->crit_rate?>,
  62. "crit_damage": <?=$page->unit->crit_damage?>,
  63. "accuracy": <?=$page->unit->accuracy?>,
  64. "resistance": <?=$page->unit->resistance?>,
  65. "ehp": <?=$page->unit->effective_hp?>,
  66. "dmg": <?=$page->unit->effective_dmg?>
  67. }
  68. <?php
  69. // Get current rune sets
  70. $sets = [];
  71. foreach ($page->unit->rune as $rune){
  72. if (!in_array($rune->type->id, $sets)){
  73. array_push($sets, $rune->type->id);
  74. }
  75. }
  76. for ($i = sizeof($sets); $i < 3; $i ++){
  77. array_push($sets, 0);
  78. }
  79. ?>
  80. var current_sets = [<?=$sets[0]?>, <?=$sets[1]?>, <?=$sets[2]?>];
  81. // Get current main stats in even slots
  82. <?php
  83. $mains = [0, 0, 0];
  84. foreach ($page->unit->rune as $rune){
  85. if ($rune->slot % 2 == 0){
  86. $mains[($rune->slot / 2) - 1] = $rune->main_stat;
  87. }
  88. }
  89. ?>
  90. /**
  91. * To calculate time.
  92. */
  93. var timestamp = 0;
  94. /**
  95. * Updates the value next to the sliders when they change.
  96. *
  97. * @param stat Name of the stat to set.
  98. * @param value Value of the slider.
  99. */
  100. function updateMinValue(stat, element){
  101. var value = Number(element.value);
  102. var max = Number(element.max);
  103. var min = Number(element.min);
  104. if (value < min){
  105. value = min;
  106. }
  107. if (value > max){
  108. value = max;
  109. }
  110. document.getElementById('lbl_min_' + stat).value = value;
  111. document.getElementById('min_' + stat).value = value;
  112. }
  113. /**
  114. * Resets filter to the unit's current stat status.
  115. *
  116. * @param stat Name of the stat to set.
  117. */
  118. function resetFilter(stat){
  119. document.getElementById('lbl_min_' + stat).value = current_stats[stat];
  120. document.getElementById('min_' + stat).value = current_stats[stat];
  121. }
  122. /**
  123. * Sets a filter to it's lowest possible value.
  124. *
  125. * @param stat Name of the stat to set.
  126. */
  127. function removeFilter(stat){
  128. document.getElementById('lbl_min_' + stat).value = document.getElementById('lbl_min_' + stat).min;
  129. document.getElementById('min_' + stat).value = document.getElementById('min_' + stat).min;
  130. }
  131. /**
  132. * Starts the optimization.
  133. *
  134. * Checks for error in the combination of the parameters, and
  135. * shows an error window if there is an invalid conbination. If
  136. * not, builds the url to fetch all candidate runes.
  137. *
  138. * @return false on error, true on success.
  139. */
  140. function apply(){
  141. var params = '';
  142. var x;
  143. // Player id - mandatory
  144. params = 'uid=<?=$UID?>';
  145. // Unit id - mandatory
  146. params += '&unit=<?=$page->unit->id?>';
  147. // Rune set 1 - mandatory
  148. params += '&set[]=' + document.getElementById('set_1').options[document.getElementById('set_1').selectedIndex].value;
  149. // Rune set 2 - mandatory
  150. params += '&set[]=' + document.getElementById('set_2').options[document.getElementById('set_2').selectedIndex].value;
  151. // Rune set 3 - optional
  152. x = document.getElementById('set_3').options[document.getElementById('set_3').selectedIndex].value;
  153. if (x != ''){
  154. params += '&set[]=' + x;
  155. }
  156. // Slot 2 - mandatory
  157. params += '&stat[]=' + document.getElementById('slot_2').options[document.getElementById('slot_2').selectedIndex].value;
  158. // Slot 4 - mandatory
  159. params += '&stat[]=' + document.getElementById('slot_4').options[document.getElementById('slot_4').selectedIndex].value;
  160. // Slot 5 - mandatory
  161. params += '&stat[]=' + document.getElementById('slot_6').options[document.getElementById('slot_6').selectedIndex].value;
  162. // Rune source - mandatory
  163. params += '&source=' + document.getElementById('rune_source').options[document.getElementById('rune_source').selectedIndex].value;
  164. // Optimizer tuning - mandatory
  165. params += '&tuning=' + document.getElementById('tuning').options[document.getElementById('tuning').selectedIndex].value;
  166. // Limit combinations - mandatory
  167. params += '&limit=' + document.getElementById('limit').value;
  168. // Min HP - Optional
  169. if (Number(document.getElementById('min_hp').value) > Number(document.getElementById('min_hp').min)){
  170. params += '&min_hp=' + document.getElementById('min_hp').value;
  171. }
  172. // Min ATK - Optional
  173. if (Number(document.getElementById('min_attack').value) > Number(document.getElementById('min_attack').min)){
  174. params += '&min_attack=' + document.getElementById('min_attack').value;
  175. }
  176. // Min DEF - Optional
  177. if (Number(document.getElementById('min_defense').value) > Number(document.getElementById('min_defense').min)){
  178. params += '&min_defense=' + document.getElementById('min_defense').value;
  179. }
  180. // Min SPD - Optional
  181. if (Number(document.getElementById('min_speed').value) > Number(document.getElementById('min_speed').min)){
  182. params += '&min_speed=' + document.getElementById('min_speed').value;
  183. }
  184. // Min CRR - Optional
  185. if (Number(document.getElementById('min_crit_rate').value) > Number(document.getElementById('min_crit_rate').min)){
  186. params += '&min_crit_rate=' + document.getElementById('min_crit_rate').value;
  187. }
  188. // Min CRD - Optional
  189. if (Number(document.getElementById('min_crit_damage').value) > Number(document.getElementById('min_crit_damage').min)){
  190. params += '&min_crit_damage=' + document.getElementById('min_crit_damage').value;
  191. }
  192. // Min ACC - Optional
  193. if (Number(document.getElementById('min_accuracy').value) > Number(document.getElementById('min_accuracy').min)){
  194. params += '&min_accuracy=' + document.getElementById('min_accuracy').value;
  195. }
  196. // Min RES - Optional
  197. if (Number(document.getElementById('min_resistance').value) > Number(document.getElementById('min_resistance').min)){
  198. params += '&min_resistance=' + document.getElementById('min_resistance').value;
  199. }
  200. // Min EHP - Optional
  201. if (Number(document.getElementById('min_ehp').value) > 0){
  202. params += '&min_ehp=' + document.getElementById('min_ehp').value;
  203. }
  204. // Min DMG - Optional
  205. if (Number(document.getElementById('min_dmg').value) > 0){
  206. params += '&min_dmg=' + document.getElementById('min_dmg').value;
  207. }
  208. // Send the request
  209. var xhttp = new XMLHttpRequest();
  210. xhttp.onreadystatechange = function() {
  211. if (this.readyState == 4){
  212. document.getElementById('apply').removeAttribute('disabled');
  213. document.getElementById('wait').style.display = 'none';
  214. //console.log(this.response);
  215. if (this.status == 200) {
  216. time = ((+ new Date()) - timestamp) / 1000;
  217. showOptimizations(this.response, time);
  218. }
  219. else if (this.status == 413) { // Payload too large
  220. showMessage('Error', 'Too many combination found. Plesase narow your criteria and retry.');
  221. }
  222. else if (this.status == 500) { // Server error
  223. showMessage('Error', 'Too many rune combination found. Plesase narow your criteria and retry.');
  224. }
  225. }
  226. };
  227. // DEBUG
  228. //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';
  229. // Clear result table, disable button and show spinner
  230. var container = document.getElementById('optimizations');
  231. while (container.firstChild) {
  232. container.removeChild(container.firstChild);
  233. }
  234. document.getElementById('apply').setAttribute('disabled', 'disabled');
  235. document.getElementById('wait').style.display = 'block';
  236. document.getElementById('results').style.display = 'none';
  237. // Start timer
  238. timestamp = + new Date();
  239. // Make the request
  240. xhttp.open('POST', '/action/optimize_get_rune_list/', true);
  241. xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  242. xhttp.send(params);
  243. }
  244. function valid_set(candidates){
  245. // Debug section: Look out for current runes
  246. if (
  247. candidates[0].ID == '18127229790' //&&
  248. //candidates[1].ID == '16037693193' &&
  249. //candidates[2].ID == '18831259497' &&
  250. //candidates[3].ID == '19634059762' &&
  251. //candidates[4].ID == '19057400217' &&
  252. //candidates[5].ID == '20095751566'
  253. ){
  254. console.log("CURRENT SET!!");
  255. }
  256. // Number of applied sets with the current candidates.
  257. var sets = {
  258. 'RUNE_SET_<?=RUNE_SET_ID::ENERGY?>': 0, // ENERGY
  259. 'RUNE_SET_<?=RUNE_SET_ID::GUARD?>': 0, // GUARD
  260. 'RUNE_SET_<?=RUNE_SET_ID::SWIFT?>': 0, // SWIFT
  261. 'RUNE_SET_<?=RUNE_SET_ID::BLADE?>': 0, // BLADE
  262. 'RUNE_SET_<?=RUNE_SET_ID::RAGE?>': 0, // RAGE
  263. 'RUNE_SET_<?=RUNE_SET_ID::FOCUS?>': 0, // FOCUS
  264. 'RUNE_SET_<?=RUNE_SET_ID::ENDURE?>': 0, // ENDURE
  265. 'RUNE_SET_<?=RUNE_SET_ID::FATAL?>': 0, // FATAL
  266. 'RUNE_SET_<?=RUNE_SET_ID::DESPAIR?>': 0, // DESPAIR
  267. 'RUNE_SET_<?=RUNE_SET_ID::VAMPIRE?>': 0, // VAMPIRE
  268. 'RUNE_SET_<?=RUNE_SET_ID::VIOLENT?>': 0, // VIOLENT
  269. 'RUNE_SET_<?=RUNE_SET_ID::NEMESIS?>': 0, // NEMESIS
  270. 'RUNE_SET_<?=RUNE_SET_ID::WILL?>': 0, // WILL
  271. 'RUNE_SET_<?=RUNE_SET_ID::SHIELD?>': 0, // SHIELD
  272. 'RUNE_SET_<?=RUNE_SET_ID::REVENGE?>': 0, // REVENGE
  273. 'RUNE_SET_<?=RUNE_SET_ID::DESTROY?>': 0, // DESTROY
  274. 'RUNE_SET_<?=RUNE_SET_ID::FIGHT?>': 0, // FIGHT
  275. 'RUNE_SET_<?=RUNE_SET_ID::DETERMINATION?>': 0, // DETERMINATION
  276. 'RUNE_SET_<?=RUNE_SET_ID::ENHANCE?>': 0, // ENHANCE
  277. 'RUNE_SET_<?=RUNE_SET_ID::ACCURACY?>': 0, // ACCURACY
  278. 'RUNE_SET_<?=RUNE_SET_ID::TOLERANCE?>': 0 // TOLERANCE
  279. };
  280. for (var i = 0; i <= 5; i ++){
  281. sets['RUNE_SET_' + candidates[i].TYPE] ++;
  282. }
  283. for (var i = 0; i < sets.length; i ++){
  284. switch (i){
  285. case <?=RUNE_SET_ID::ENERGY?>:
  286. case <?=RUNE_SET_ID::GUARD?>:
  287. case <?=RUNE_SET_ID::NEMESIS?>:
  288. case <?=RUNE_SET_ID::BLADE?>:
  289. case <?=RUNE_SET_ID::FOCUS?>:
  290. case <?=RUNE_SET_ID::ENDURE?>:
  291. case <?=RUNE_SET_ID::WILL?>:
  292. case <?=RUNE_SET_ID::SHIELD?>:
  293. case <?=RUNE_SET_ID::REVENGE?>:
  294. case <?=RUNE_SET_ID::DESTROY?>:
  295. case <?=RUNE_SET_ID::FIGHT?>:
  296. case <?=RUNE_SET_ID::DETERMINATION?>:
  297. case <?=RUNE_SET_ID::ENHANCE?>:
  298. case <?=RUNE_SET_ID::ACCURACY?>:
  299. case <?=RUNE_SET_ID::TOLERANCE?>:
  300. if (sets[i] % 2 != 0){
  301. return false;
  302. }
  303. break;
  304. case <?=RUNE_SET_ID::DESPAIR?>:
  305. case <?=RUNE_SET_ID::SWIFT?>:
  306. case <?=RUNE_SET_ID::RAGE?>:
  307. case <?=RUNE_SET_ID::FATAL?>:
  308. case <?=RUNE_SET_ID::VAMPIRE?>:
  309. case <?=RUNE_SET_ID::VIOLENT?>:
  310. if (sets[i] != 4 && sets[i] != 0){
  311. return false;
  312. }
  313. break;
  314. }
  315. }
  316. // Its a valid set, but does it match the requested sets?
  317. var requested_sets = {
  318. 'RUNE_SET_<?=RUNE_SET_ID::ENERGY?>': 0, // ENERGY
  319. 'RUNE_SET_<?=RUNE_SET_ID::GUARD?>': 0, // GUARD
  320. 'RUNE_SET_<?=RUNE_SET_ID::SWIFT?>': 0, // SWIFT
  321. 'RUNE_SET_<?=RUNE_SET_ID::BLADE?>': 0, // BLADE
  322. 'RUNE_SET_<?=RUNE_SET_ID::RAGE?>': 0, // RAGE
  323. 'RUNE_SET_<?=RUNE_SET_ID::FOCUS?>': 0, // FOCUS
  324. 'RUNE_SET_<?=RUNE_SET_ID::ENDURE?>': 0, // ENDURE
  325. 'RUNE_SET_<?=RUNE_SET_ID::FATAL?>': 0, // FATAL
  326. 'RUNE_SET_<?=RUNE_SET_ID::DESPAIR?>': 0, // DESPAIR
  327. 'RUNE_SET_<?=RUNE_SET_ID::VAMPIRE?>': 0, // VAMPIRE
  328. 'RUNE_SET_<?=RUNE_SET_ID::VIOLENT?>': 0, // VIOLENT
  329. 'RUNE_SET_<?=RUNE_SET_ID::NEMESIS?>': 0, // NEMESIS
  330. 'RUNE_SET_<?=RUNE_SET_ID::WILL?>': 0, // WILL
  331. 'RUNE_SET_<?=RUNE_SET_ID::SHIELD?>': 0, // SHIELD
  332. 'RUNE_SET_<?=RUNE_SET_ID::REVENGE?>': 0, // REVENGE
  333. 'RUNE_SET_<?=RUNE_SET_ID::DESTROY?>': 0, // DESTROY
  334. 'RUNE_SET_<?=RUNE_SET_ID::FIGHT?>': 0, // FIGHT
  335. 'RUNE_SET_<?=RUNE_SET_ID::DETERMINATION?>': 0, // DETERMINATION
  336. 'RUNE_SET_<?=RUNE_SET_ID::ENHANCE?>': 0, // ENHANCE
  337. 'RUNE_SET_<?=RUNE_SET_ID::ACCURACY?>': 0, // ACCURACY
  338. 'RUNE_SET_<?=RUNE_SET_ID::TOLERANCE?>': 0 // TOLERANCE
  339. };
  340. var selected_1 = document.getElementById('set_1').options[document.getElementById('set_1').selectedIndex].value;
  341. var selected_2 = document.getElementById('set_2').options[document.getElementById('set_2').selectedIndex].value;
  342. var selected_3 = document.getElementById('set_3').options[document.getElementById('set_3').selectedIndex].value;
  343. var requested_values = [
  344. document.getElementById('set_1').options[document.getElementById('set_1').selectedIndex].value,
  345. document.getElementById('set_2').options[document.getElementById('set_2').selectedIndex].value,
  346. document.getElementById('set_3').options[document.getElementById('set_3').selectedIndex].value
  347. ];
  348. for (var i = 0; i < 3; i ++){
  349. switch (requested_values[i]){
  350. case '<?=RUNE_SET_ID::ENERGY?>':
  351. case '<?=RUNE_SET_ID::GUARD?>':
  352. case '<?=RUNE_SET_ID::NEMESIS?>':
  353. case '<?=RUNE_SET_ID::BLADE?>':
  354. case '<?=RUNE_SET_ID::FOCUS?>':
  355. case '<?=RUNE_SET_ID::ENDURE?>':
  356. case '<?=RUNE_SET_ID::WILL?>':
  357. case '<?=RUNE_SET_ID::SHIELD?>':
  358. case '<?=RUNE_SET_ID::REVENGE?>':
  359. case '<?=RUNE_SET_ID::DESTROY?>':
  360. case '<?=RUNE_SET_ID::FIGHT?>':
  361. case '<?=RUNE_SET_ID::DETERMINATION?>':
  362. case '<?=RUNE_SET_ID::ENHANCE?>':
  363. case '<?=RUNE_SET_ID::ACCURACY?>':
  364. case '<?=RUNE_SET_ID::TOLERANCE?>':
  365. requested_sets['RUNE_SET_' + requested_values[i]] += 2;
  366. break;
  367. case '<?=RUNE_SET_ID::DESPAIR?>':
  368. case '<?=RUNE_SET_ID::SWIFT?>':
  369. case '<?=RUNE_SET_ID::RAGE?>':
  370. case '<?=RUNE_SET_ID::FATAL?>':
  371. case '<?=RUNE_SET_ID::VAMPIRE?>':
  372. case '<?=RUNE_SET_ID::VIOLENT?>':
  373. requested_sets['RUNE_SET_' + i] += 4;
  374. break;
  375. }
  376. }
  377. //console.log("VALID SET!");
  378. if (JSON.stringify(sets) !== JSON.stringify(requested_sets)){
  379. return false;
  380. }
  381. //console.log("VALID REQUESTED SET!");
  382. // Compare with filters
  383. var new_stats = {
  384. "ATK": base_stats["attack"],
  385. "DEF": base_stats["defense"],
  386. "HP": base_stats["hp"],
  387. "SPD": base_stats["speed"],
  388. "CRR": base_stats["crit_rate"],
  389. "CRD": base_stats["crit_damage"],
  390. "ACC": base_stats["accuracy"],
  391. "RES": base_stats["resistance"],
  392. "EHP": 0,
  393. "DMG": 0
  394. }
  395. for (var i = 0; i <= 5; i ++){
  396. new_stats["ATK"] += candidates[i].ATK;
  397. new_stats["DEF"] += candidates[i].DEF;
  398. new_stats["HP"] += candidates[i].HP;
  399. new_stats["SPD"] += candidates[i].SPD;
  400. new_stats["CRR"] += candidates[i].CRR;
  401. new_stats["CRD"] += candidates[i].CRD;
  402. new_stats["ACC"] += candidates[i].ACC;
  403. new_stats["RES"] += candidates[i].RES;
  404. }
  405. new_stats["EHP"] = Math.ceil((((new_stats["DEF"] * 3.5) + 1140) * new_stats["HP"]) / 1000);
  406. new_stats["DMG"] = Math.ceil((new_stats["ATK"] * (100 - new_stats["CRR"]) / 100) + ((new_stats["ATK"] + (new_stats["ATK"] * new_stats["CRD"] / 100)) * new_stats["CRR"] / 100));
  407. //console.log("HP " + new_stats["HP"] + "/" + document.getElementById('min_hp').value);
  408. if (
  409. new_stats["ATK"] >= document.getElementById('min_attack').value &&
  410. new_stats["DEF"] >= document.getElementById('min_defense').value &&
  411. new_stats["HP"] >= document.getElementById('min_hp').value &&
  412. new_stats["SPD"] >= document.getElementById('min_speed').value &&
  413. new_stats["CRR"] >= document.getElementById('min_crit_rate').value &&
  414. new_stats["CRD"] >= document.getElementById('min_crit_damage').value &&
  415. new_stats["ACC"] >= document.getElementById('min_accuracy').value &&
  416. new_stats["RES"] >= document.getElementById('min_resistance').value &&
  417. new_stats["EHP"] >= document.getElementById('min_ehp').value &&
  418. new_stats["DMG"] >= document.getElementById('min_dmg').value
  419. ){
  420. //console.log("IMPROVING SET!");
  421. return true
  422. }
  423. return false;
  424. }
  425. /**
  426. * Parses the received content and creates the HTML with the new
  427. * rune options.
  428. *
  429. * @param content JSON received from server.
  430. */
  431. function showOptimizations(content, time){
  432. var container = document.getElementById('optimizations');
  433. var data = JSON.parse(content);
  434. //console.log(data);
  435. var candidates = [
  436. data[1],
  437. data[2],
  438. data[3],
  439. data[4],
  440. data[5],
  441. data[6]
  442. ];
  443. var total_combinations = data[1].length * data[2].length * data[3].length * data[4].length * data[5].length * data[6].length;
  444. var checked_combinations = 0;
  445. // Valic combinations that match the minimum requeriments
  446. var valid_combinations = [];
  447. console.log("TOTAL COMBINATIONS: " + total_combinations);
  448. // TODO Prevent user on high numbers
  449. // Counters to keep track on array indexes
  450. var counters = [0, 0, 0, 0, 0, 0];
  451. while (true){
  452. // Check loop exit condition
  453. if (
  454. counters[0] >= candidates[0].length &&
  455. counters[1] >= candidates[1].length &&
  456. counters[2] >= candidates[2].length &&
  457. counters[3] >= candidates[3].length &&
  458. counters[4] >= candidates[4].length &&
  459. counters[5] >= candidates[5].length
  460. ){
  461. console.log("BREAK BY condition");
  462. break;
  463. }
  464. // TODO DEBUG Exit a 3
  465. if (checked_combinations >= 3000000){
  466. console.log("BREAK BY hard limit");
  467. break;
  468. }
  469. if (valid_set([
  470. candidates[0][counters[0]],
  471. candidates[1][counters[1]],
  472. candidates[2][counters[2]],
  473. candidates[3][counters[3]],
  474. candidates[4][counters[4]],
  475. candidates[5][counters[5]]
  476. ])){
  477. valid_combinations.push({
  478. 'score': 0,
  479. 'runes': [
  480. candidates[0][counters[0]],
  481. candidates[1][counters[1]],
  482. candidates[2][counters[2]],
  483. candidates[3][counters[3]],
  484. candidates[4][counters[4]],
  485. candidates[5][counters[5]]
  486. ]
  487. });
  488. }
  489. // Increase counters
  490. checked_combinations ++;
  491. counters[5] ++;
  492. if (counters[5] >= candidates[5].length){
  493. counters[5] = 0;
  494. counters[4] ++;
  495. }
  496. if (counters[4] >= candidates[4].length){
  497. counters[4] = 0;
  498. counters[3] ++;
  499. }
  500. if (counters[3] >= candidates[3].length){
  501. counters[3] = 0;
  502. counters[2] ++;
  503. }
  504. if (counters[2] >= candidates[2].length){
  505. counters[2] = 0;
  506. counters[1] ++;
  507. }
  508. if (counters[1] >= candidates[1].length){
  509. counters[1] = 0;
  510. counters[0] ++;
  511. }
  512. if (counters[0] >= candidates[0].length){
  513. console.log("BREAK BY increments");
  514. break;
  515. }
  516. /*if (checked_combinations % 1000 == 0){
  517. console.log("COMBINATIONS CHECKED: " + checked_combinations + " / " + total_combinations + "(" + (checked_combinations * 100 / total_combinations) + "%)");
  518. console.log(" 0: " + counters[0] + "/" + candidates[0].length);
  519. console.log(" 1: " + counters[1] + "/" + candidates[1].length);
  520. console.log(" 2: " + counters[2] + "/" + candidates[2].length);
  521. console.log(" 3: " + counters[3] + "/" + candidates[3].length);
  522. console.log(" 4: " + counters[4] + "/" + candidates[4].length);
  523. console.log(" 5: " + counters[5] + "/" + candidates[5].length);
  524. }*/
  525. }
  526. // Foreach valid combination, rate it and sort the array
  527. for (var i = 0; i < valid_combinations.length; i ++){
  528. for (var r = 0; r < 6; r ++){
  529. valid_combinations[i]['score'] += valid_combinations[i]["runes"][r]["ATK"];
  530. valid_combinations[i]['score'] += valid_combinations[i]["runes"][r]["DEF"];
  531. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["HP"] / 15);
  532. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["SPD"] * 1.5);
  533. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["CRR"] * 1.2);
  534. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["CRD"] * 1.2);
  535. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["ACC"] * 1.2);
  536. valid_combinations[i]['score'] += (valid_combinations[i]["runes"][r]["ATK"] * 1.2);
  537. }
  538. }
  539. console.log("CHECKED: " + checked_combinations + "/" + total_combinations);
  540. valid_combinations.sort(function(a, b) {return b['score'] - a['score'];});
  541. valid_combinations = valid_combinations.slice(0, document.getElementById('limit').value);
  542. console.log("SIZE: " + valid_combinations.length);
  543. // for (var i = 0; i < valid_combinations.length; i ++){
  544. // console.log(valid_combinations[i]['score']);
  545. // }
  546. // Request to fetch the runes.
  547. // TODO
  548. // Make the request
  549. var xhttp = new XMLHttpRequest();
  550. xhttp.onreadystatechange = function() {
  551. if (this.readyState == 4){
  552. console.log("RUNES RECEIVED");
  553. console.log(this.response);
  554. if (this.status == 200) {
  555. //time = ((+ new Date()) - timestamp) / 1000;
  556. presentOptions(this.response, time);
  557. }
  558. /*document.getElementById('apply').removeAttribute('disabled');
  559. document.getElementById('wait').style.display = 'none';
  560. //console.log(this.response);
  561. if (this.status == 200) {
  562. time = ((+ new Date()) - timestamp) / 1000;
  563. showOptimizations(this.response, time);
  564. }
  565. else if (this.status == 413) { // Payload too large
  566. showMessage('Error', 'Too many combination found. Plesase narow your criteria and retry.');
  567. }
  568. else if (this.status == 500) { // Server error
  569. showMessage('Error', 'Too many rune combination found. Plesase narow your criteria and retry.');
  570. }*/
  571. }
  572. };
  573. params = 'uid=<?=$UID?>&unit=<?=$page->unit->id?>';
  574. params += '&options=' + JSON.stringify(valid_combinations);
  575. xhttp.open('POST', '/action/optimize_get_options/', true);
  576. xhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  577. xhttp.send(params);
  578. // Send the request
  579. return;
  580. }
  581. function presentOptions(content, time){
  582. var container = document.getElementById('optimizations');
  583. var data = JSON.parse(content);
  584. if (Number(data.total) == 0){
  585. showMessage('No results', 'No suitable combination found. Plesase relax your criteria and retry.');
  586. return;
  587. }
  588. document.getElementById('num_results').innerHTML = data.total;
  589. document.getElementById('num_skipped').innerHTML = data.skipped;
  590. document.getElementById('num_seconds').innerHTML = time;
  591. var option;
  592. var tr;
  593. var td;
  594. var stat_table;
  595. var stat_tr;
  596. var stat_td;
  597. var span;
  598. var text;
  599. for (i = 0; i < data.length; i++){
  600. option = data[i];
  601. tr = document.createElement('tr');
  602. td = document.createElement('td');
  603. td.setAttribute('class', 'option_stats');
  604. stat_table = document.createElement('table');
  605. stat_table.setAttribute('class', 'stat_table');
  606. // attack
  607. stat_tr = document.createElement('tr');
  608. stat_td = document.createElement('td');
  609. stat_td.setAttribute('class', 'label');
  610. text = document.createTextNode('ATK');
  611. stat_td.appendChild(text);
  612. stat_tr.appendChild(stat_td);
  613. stat_td = document.createElement('td');
  614. stat_td.setAttribute('class', 'value');
  615. span = document.createElement('span');
  616. span.setAttribute('class', 'stat');
  617. text = document.createTextNode(option.stats.attack + " ");
  618. span.appendChild(text);
  619. stat_td.appendChild(span);
  620. span = document.createElement('span');
  621. if (Number(option.stats.attack) > Number(current_stats["attack"])){
  622. span.setAttribute('class', 'variation increment');
  623. text = document.createTextNode(option.stats.attack - current_stats["attack"]);
  624. }
  625. else if (Number(option.stats.attack) < Number(current_stats["attack"])){
  626. span.setAttribute('class', 'variation decrement');
  627. text = document.createTextNode(current_stats["attack"] - option.stats.attack);
  628. }
  629. else{
  630. span.setAttribute('class', 'variation');
  631. text = document.createTextNode(" ");
  632. }
  633. span.appendChild(text);
  634. stat_td.appendChild(span);
  635. stat_tr.appendChild(stat_td);
  636. stat_table.appendChild(stat_tr);
  637. // defense
  638. stat_tr = document.createElement('tr');
  639. stat_td = document.createElement('td');
  640. stat_td.setAttribute('class', 'label');
  641. text = document.createTextNode('DEF');
  642. stat_td.appendChild(text);
  643. stat_tr.appendChild(stat_td);
  644. stat_td = document.createElement('td');
  645. stat_td.setAttribute('class', 'value');
  646. span = document.createElement('span');
  647. span.setAttribute('class', 'stat');
  648. text = document.createTextNode(option.stats.defense + " ");
  649. span.appendChild(text);
  650. stat_td.appendChild(span);
  651. span = document.createElement('span');
  652. if (Number(option.stats.defense) > Number(current_stats["defense"])){
  653. span.setAttribute('class', 'variation increment');
  654. text = document.createTextNode(option.stats.defense - current_stats["defense"]);
  655. }
  656. else if (Number(option.stats.defense) < Number(current_stats["defense"])){
  657. span.setAttribute('class', 'variation decrement');
  658. text = document.createTextNode(current_stats["defense"] - option.stats.defense);
  659. }
  660. else{
  661. span.setAttribute('class', 'variation');
  662. text = document.createTextNode(" ");
  663. }
  664. span.appendChild(text);
  665. stat_td.appendChild(span);
  666. stat_tr.appendChild(stat_td);
  667. stat_table.appendChild(stat_tr);
  668. // hp
  669. stat_tr = document.createElement('tr');
  670. stat_td = document.createElement('td');
  671. stat_td.setAttribute('class', 'label');
  672. text = document.createTextNode('HP ');
  673. stat_td.appendChild(text);
  674. stat_tr.appendChild(stat_td);
  675. stat_td = document.createElement('td');
  676. stat_td.setAttribute('class', 'value');
  677. span = document.createElement('span');
  678. span.setAttribute('class', 'stat');
  679. text = document.createTextNode(option.stats.hp + " ");
  680. span.appendChild(text);
  681. stat_td.appendChild(span);
  682. span = document.createElement('span');
  683. if (Number(option.stats.hp) > Number(current_stats["hp"])){
  684. span.setAttribute('class', 'variation increment');
  685. text = document.createTextNode(option.stats.hp - current_stats["hp"]);
  686. }
  687. else if (Number(option.stats.hp) < Number(current_stats["hp"])){
  688. span.setAttribute('class', 'variation decrement');
  689. text = document.createTextNode(current_stats["hp"] - option.stats.hp);
  690. }
  691. else{
  692. span.setAttribute('class', 'variation');
  693. text = document.createTextNode(" ");
  694. }
  695. span.appendChild(text);
  696. stat_td.appendChild(span);
  697. stat_tr.appendChild(stat_td);
  698. stat_table.appendChild(stat_tr);
  699. // speed
  700. stat_tr = document.createElement('tr');
  701. stat_td = document.createElement('td');
  702. stat_td.setAttribute('class', 'label');
  703. text = document.createTextNode('SPD');
  704. stat_td.appendChild(text);
  705. stat_tr.appendChild(stat_td);
  706. stat_td = document.createElement('td');
  707. stat_td.setAttribute('class', 'value');
  708. span = document.createElement('span');
  709. span.setAttribute('class', 'stat');
  710. text = document.createTextNode(option.stats.speed + " ");
  711. span.appendChild(text);
  712. stat_td.appendChild(span);
  713. span = document.createElement('span');
  714. if (Number(option.stats.speed) > Number(current_stats["speed"])){
  715. span.setAttribute('class', 'variation increment');
  716. text = document.createTextNode(option.stats.speed - current_stats["speed"]);
  717. }
  718. else if (Number(option.stats.speed) < Number(current_stats["speed"])){
  719. span.setAttribute('class', 'variation decrement');
  720. text = document.createTextNode(current_stats["speed"] - option.stats.speed);
  721. }
  722. else{
  723. span.setAttribute('class', 'variation');
  724. text = document.createTextNode(" ");
  725. }
  726. span.appendChild(text);
  727. stat_td.appendChild(span);
  728. stat_tr.appendChild(stat_td);
  729. stat_table.appendChild(stat_tr);
  730. // crit_rate
  731. stat_tr = document.createElement('tr');
  732. stat_td = document.createElement('td');
  733. stat_td.setAttribute('class', 'label');
  734. text = document.createTextNode('CRR');
  735. stat_td.appendChild(text);
  736. stat_tr.appendChild(stat_td);
  737. stat_td = document.createElement('td');
  738. stat_td.setAttribute('class', 'value');
  739. span = document.createElement('span');
  740. span.setAttribute('class', 'stat');
  741. text = document.createTextNode(option.stats.crit_rate + "%");
  742. span.appendChild(text);
  743. stat_td.appendChild(span);
  744. span = document.createElement('span');
  745. if (Number(option.stats.crit_rate) > Number(current_stats["crit_rate"])){
  746. span.setAttribute('class', 'variation increment');
  747. text = document.createTextNode(option.stats.crit_rate - current_stats["crit_rate"]);
  748. }
  749. else if (Number(option.stats.crit_rate) < Number(current_stats["crit_rate"])){
  750. span.setAttribute('class', 'variation decrement');
  751. text = document.createTextNode(current_stats["crit_rate"] - option.stats.crit_rate);
  752. }
  753. else{
  754. span.setAttribute('class', 'variation');
  755. text = document.createTextNode(" ");
  756. }
  757. span.appendChild(text);
  758. stat_td.appendChild(span);
  759. stat_tr.appendChild(stat_td);
  760. stat_table.appendChild(stat_tr);
  761. // crit_damage
  762. stat_tr = document.createElement('tr');
  763. stat_td = document.createElement('td');
  764. stat_td.setAttribute('class', 'label');
  765. text = document.createTextNode('CRD');
  766. stat_td.appendChild(text);
  767. stat_tr.appendChild(stat_td);
  768. stat_td = document.createElement('td');
  769. stat_td.setAttribute('class', 'value');
  770. span = document.createElement('span');
  771. span.setAttribute('class', 'stat');
  772. text = document.createTextNode(option.stats.crit_damage + "%");
  773. span.appendChild(text);
  774. stat_td.appendChild(span);
  775. span = document.createElement('span');
  776. if (Number(option.stats.crit_damage) > Number(current_stats["crit_damage"])){
  777. span.setAttribute('class', 'variation increment');
  778. text = document.createTextNode(option.stats.crit_damage - current_stats["crit_damage"]);
  779. }
  780. else if (Number(option.stats.crit_damage) < Number(current_stats["crit_damage"])){
  781. span.setAttribute('class', 'variation decrement');
  782. text = document.createTextNode(current_stats["crit_damage"] - option.stats.crit_damage);
  783. }
  784. else{
  785. span.setAttribute('class', 'variation');
  786. text = document.createTextNode(" ");
  787. }
  788. span.appendChild(text);
  789. stat_td.appendChild(span);
  790. stat_tr.appendChild(stat_td);
  791. stat_table.appendChild(stat_tr);
  792. // accuracy
  793. stat_tr = document.createElement('tr');
  794. stat_td = document.createElement('td');
  795. stat_td.setAttribute('class', 'label');
  796. text = document.createTextNode('ACC');
  797. stat_td.appendChild(text);
  798. stat_tr.appendChild(stat_td);
  799. stat_td = document.createElement('td');
  800. stat_td.setAttribute('class', 'value');
  801. span = document.createElement('span');
  802. span.setAttribute('class', 'stat');
  803. text = document.createTextNode(option.stats.accuracy + "%");
  804. span.appendChild(text);
  805. stat_td.appendChild(span);
  806. span = document.createElement('span');
  807. if (Number(option.stats.accuracy) > Number(current_stats["accuracy"])){
  808. span.setAttribute('class', 'variation increment');
  809. text = document.createTextNode(option.stats.accuracy - current_stats["accuracy"]);
  810. }
  811. else if (Number(option.stats.accuracy) < Number(current_stats["accuracy"])){
  812. span.setAttribute('class', 'variation decrement');
  813. text = document.createTextNode(current_stats["accuracy"] - option.stats.accuracy);
  814. }
  815. else{
  816. span.setAttribute('class', 'variation');
  817. text = document.createTextNode(" ");
  818. }
  819. span.appendChild(text);
  820. stat_td.appendChild(span);
  821. stat_tr.appendChild(stat_td);
  822. stat_table.appendChild(stat_tr);
  823. // resistance
  824. stat_tr = document.createElement('tr');
  825. stat_td = document.createElement('td');
  826. stat_td.setAttribute('class', 'label');
  827. text = document.createTextNode('RES');
  828. stat_td.appendChild(text);
  829. stat_tr.appendChild(stat_td);
  830. stat_td = document.createElement('td');
  831. stat_td.setAttribute('class', 'value');
  832. span = document.createElement('span');
  833. span.setAttribute('class', 'stat');
  834. text = document.createTextNode(option.stats.resistance + "%");
  835. span.appendChild(text);
  836. stat_td.appendChild(span);
  837. span = document.createElement('span');
  838. if (Number(option.stats.resistance) > Number(current_stats["resistance"])){
  839. span.setAttribute('class', 'variation increment');
  840. text = document.createTextNode(option.stats.resistance - current_stats["resistance"]);
  841. }
  842. else if (Number(option.stats.resistance) < Number(current_stats["resistance"])){
  843. span.setAttribute('class', 'variation decrement');
  844. text = document.createTextNode(current_stats["resistance"] - option.stats.resistance);
  845. }
  846. else{
  847. span.setAttribute('class', 'variation');
  848. text = document.createTextNode(" ");
  849. }
  850. span.appendChild(text);
  851. stat_td.appendChild(span);
  852. stat_tr.appendChild(stat_td);
  853. stat_table.appendChild(stat_tr);
  854. // ehp
  855. stat_tr = document.createElement('tr');
  856. stat_td = document.createElement('td');
  857. stat_td.setAttribute('class', 'label');
  858. text = document.createTextNode('EHP');
  859. stat_td.appendChild(text);
  860. stat_tr.appendChild(stat_td);
  861. stat_td = document.createElement('td');
  862. stat_td.setAttribute('class', 'value');
  863. span = document.createElement('span');
  864. span.setAttribute('class', 'stat');
  865. text = document.createTextNode(option.stats.ehp + " ");
  866. span.appendChild(text);
  867. stat_td.appendChild(span);
  868. span = document.createElement('span');
  869. if (Number(option.stats.ehp) > Number(current_stats["ehp"])){
  870. span.setAttribute('class', 'variation increment');
  871. text = document.createTextNode(option.stats.ehp - current_stats["ehp"]);
  872. }
  873. else if (Number(option.stats.ehp) < Number(current_stats["ehp"])){
  874. span.setAttribute('class', 'variation decrement');
  875. text = document.createTextNode(current_stats["ehp"] - option.stats.ehp);
  876. }
  877. else{
  878. span.setAttribute('class', 'variation');
  879. text = document.createTextNode(" ");
  880. }
  881. span.appendChild(text);
  882. stat_td.appendChild(span);
  883. stat_tr.appendChild(stat_td);
  884. stat_table.appendChild(stat_tr);
  885. // dmg
  886. stat_tr = document.createElement('tr');
  887. stat_td = document.createElement('td');
  888. stat_td.setAttribute('class', 'label');
  889. text = document.createTextNode('DMG');
  890. stat_td.appendChild(text);
  891. stat_tr.appendChild(stat_td);
  892. stat_td = document.createElement('td');
  893. stat_td.setAttribute('class', 'value');
  894. span = document.createElement('span');
  895. span.setAttribute('class', 'stat');
  896. text = document.createTextNode(option.stats.dmg + " ");
  897. span.appendChild(text);
  898. stat_td.appendChild(span);
  899. span = document.createElement('span');
  900. if (Number(option.stats.dmg) > Number(current_stats["dmg"])){
  901. span.setAttribute('class', 'variation increment');
  902. text = document.createTextNode(option.stats.dmg - current_stats["dmg"]);
  903. }
  904. else if (Number(option.stats.dmg) < Number(current_stats["dmg"])){
  905. span.setAttribute('class', 'variation decrement');
  906. text = document.createTextNode(current_stats["dmg"] - option.stats.dmg);
  907. }
  908. else{
  909. span.setAttribute('class', 'variation');
  910. text = document.createTextNode(" ");
  911. }
  912. span.appendChild(text);
  913. stat_td.appendChild(span);
  914. stat_tr.appendChild(stat_td);
  915. stat_table.appendChild(stat_tr);
  916. // Add to the main table
  917. td.appendChild(stat_table);
  918. tr.appendChild(td);
  919. // Runes td
  920. td = document.createElement('td');
  921. td.setAttribute('class', 'runes');
  922. td.innerHTML += option.runes[6 - 1].html;
  923. td.innerHTML += option.runes[1 - 1].html;
  924. td.innerHTML += option.runes[2 - 1].html;
  925. td.innerHTML += "<br/>";
  926. td.innerHTML += option.runes[5 - 1].html;
  927. td.innerHTML += option.runes[4 - 1].html;
  928. td.innerHTML += option.runes[3 - 1].html;
  929. // Add the table
  930. tr.appendChild(td);
  931. container.appendChild(tr);
  932. // Make the section visible
  933. document.getElementById('results').style.display = 'block';
  934. }
  935. }
  936. function sortOptions(a, b) {
  937. return b["score"] - a["score"];
  938. }
  939. /**
  940. * Displays a pop-up message.
  941. *
  942. * @param title Message title.
  943. * @param text Message content.
  944. */
  945. function showMessage(title, text){
  946. document.getElementById('message_title').innerHTML = title;
  947. document.getElementById('message_text').innerHTML = text;
  948. document.getElementById('message_container').style.display = 'block';
  949. }
  950. /**
  951. * Closes the message pop-up.
  952. */
  953. function closeMessage(){
  954. document.getElementById('message_container').style.display = 'none';
  955. }
  956. function debug(){
  957. document.getElementById('set_1').selectedIndex = 0;
  958. document.getElementById('set_2').selectedIndex = 0;
  959. document.getElementById('set_3').selectedIndex = 1;
  960. removeFilter('attack');
  961. removeFilter('defense');
  962. removeFilter('speed');
  963. removeFilter('crit_rate');
  964. removeFilter('crit_damage');
  965. removeFilter('accuracy');
  966. removeFilter('resistance');
  967. removeFilter('ehp');
  968. removeFilter('dmg');
  969. document.getElementById('lbl_min_hp').value = 13500;
  970. updateMinValue('hp', document.getElementById('lbl_min_hp'));
  971. //apply();
  972. }
  973. </script>
  974. </head>
  975. <body>
  976. <?php
  977. include __DIR__ . "/inc/header.php";
  978. ?>
  979. <aside>
  980. <h2>
  981. Optimize <?=$page->unit->title?>
  982. </h2>
  983. <div id='monster_info'>
  984. <div class='monster_panel'>
  985. <?=HTML::unit_panel($page->unit)?>
  986. </div>
  987. <?php
  988. if ($page->unit->experience_level != 0){
  989. $exp_pct = ceil($page->unit->exp_gained * 100 / $page->unit->experience_level);
  990. $exp_txt = $page->unit->exp_gained . " / " . $page->unit->experience_level;
  991. }
  992. else{
  993. $exp_pct = 100;
  994. $exp_txt = "MAX";
  995. }
  996. $now = time();
  997. //$datediff = $now - $page->unit->create_time->getTimestamp();
  998. $datediff = $now - strtotime($page->unit->create_time->format('Y-m-d H:i:s'));
  999. $datediff = floor($datediff / (60 * 60 * 24));
  1000. ?>
  1001. <div id='monster_details'>
  1002. <?php
  1003. if (sizeof($page->unit->teams) > 0){
  1004. ?>
  1005. <div id='teams'>
  1006. <h4>
  1007. Teams:
  1008. </h4>
  1009. <ul>
  1010. <?php
  1011. foreach($page->unit->teams as $team){
  1012. ?>
  1013. <li>
  1014. <a target='blank' href='/<?=$UID?>/teams/<?=$team->id?>'>
  1015. <?=$team->name?>
  1016. </a>
  1017. </li>
  1018. <?php
  1019. }
  1020. ?>
  1021. </ul>
  1022. </div>
  1023. <?php
  1024. }
  1025. ?>
  1026. </div>
  1027. </div>
  1028. </aside>
  1029. <main>
  1030. <section id='monster' class='content'>
  1031. <h2>
  1032. Optimize <?=$page->unit->title?>
  1033. </h2>
  1034. <article id='profile'>
  1035. <table id='stats'>
  1036. <tr>
  1037. <th>
  1038. Stats
  1039. </th>
  1040. <th>
  1041. Base
  1042. </th>
  1043. <th>
  1044. Runes
  1045. </th>
  1046. <th>
  1047. Artifacts
  1048. </th>
  1049. <th>
  1050. Buildings
  1051. </th>
  1052. <th>
  1053. Total
  1054. </th>
  1055. </tr>
  1056. <tr>
  1057. <th>
  1058. ATK
  1059. </th>
  1060. <td class='base'>
  1061. <?=$page->unit->attack?>
  1062. <span class='percent'>&nbsp;</span>
  1063. </td>
  1064. <td class='extra'>
  1065. +<?=$page->unit->rune_attack?>
  1066. <span class='percent'>&nbsp;</span>
  1067. </td>
  1068. <td class='extra'>
  1069. +<?=$page->unit->artifact_attack?>
  1070. <span class='percent'>&nbsp;</span>
  1071. </td>
  1072. <td class='extra'>
  1073. +<?=$page->unit->building_attack?>
  1074. <span class='percent'>&nbsp;</span>
  1075. </td>
  1076. <td class='total'>
  1077. <?=$page->unit->total_attack?>
  1078. <span class='percent'>&nbsp;</span>
  1079. </td>
  1080. </tr>
  1081. <tr>
  1082. <th>
  1083. DEF
  1084. </th>
  1085. <td class='base'>
  1086. <?=$page->unit->defense?>
  1087. <span class='percent'>&nbsp;</span>
  1088. </td>
  1089. <td class='extra'>
  1090. +<?=$page->unit->rune_defense?>
  1091. <span class='percent'>&nbsp;</span>
  1092. </td>
  1093. <td class='extra'>
  1094. +<?=$page->unit->artifact_defense?>
  1095. <span class='percent'>&nbsp;</span>
  1096. </td>
  1097. <td class='extra'>
  1098. +<?=$page->unit->building_defense?>
  1099. <span class='percent'>&nbsp;</span>
  1100. </td>
  1101. <td class='total'>
  1102. <?=$page->unit->total_defense?>
  1103. <span class='percent'>&nbsp;</span>
  1104. </td>
  1105. </tr>
  1106. <tr>
  1107. <th>
  1108. HP
  1109. </th>
  1110. <td class='base'>
  1111. <?=$page->unit->hp?>
  1112. <span class='percent'>&nbsp;</span>
  1113. </td>
  1114. <td class='extra'>
  1115. +<?=$page->unit->rune_hp?>
  1116. <span class='percent'>&nbsp;</span>
  1117. </td>
  1118. <td class='extra'>
  1119. +<?=$page->unit->artifact_hp?>
  1120. <span class='percent'>&nbsp;</span>
  1121. </td>
  1122. <td class='extra'>
  1123. +<?=$page->unit->building_hp?>
  1124. <span class='percent'>&nbsp;</span>
  1125. </td>
  1126. <td class='total'>
  1127. <?=$page->unit->total_hp?>
  1128. <span class='percent'>&nbsp;</span>
  1129. </td>
  1130. </tr>
  1131. <tr>
  1132. <th>
  1133. SPD
  1134. </th>
  1135. <td class='base'>
  1136. <?=$page->unit->speed?>
  1137. <span class='percent'>&nbsp;</span>
  1138. </td>
  1139. <td class='extra'>
  1140. +<?=$page->unit->rune_speed?>
  1141. <span class='percent'>&nbsp;</span>
  1142. </td>
  1143. <td class='extra'>
  1144. +<?=$page->unit->artifact_speed?>
  1145. <span class='percent'>&nbsp;</span>
  1146. </td>
  1147. <td class='extra'>
  1148. +<?=$page->unit->building_speed?>
  1149. <span class='percent'>&nbsp;</span>
  1150. </td>
  1151. <td class='total'>
  1152. <?=$page->unit->total_speed?>
  1153. <span class='percent'>&nbsp;</span>
  1154. </td>
  1155. </tr>
  1156. <tr>
  1157. <th>
  1158. CRR
  1159. </th>
  1160. <td class='base'>
  1161. <?=$page->unit->crit_rate?>
  1162. <span class='percent'>%</span>
  1163. </td>
  1164. <td class='extra'>
  1165. +<?=$page->unit->rune_crit_rate?>
  1166. <span class='percent'>%</span>
  1167. </td>
  1168. <td class='extra'>
  1169. +<?=$page->unit->artifact_crit_rate?>
  1170. <span class='percent'>%</span>
  1171. </td>
  1172. <td class='extra'>
  1173. +<?=$page->unit->building_crit_rate?>
  1174. <span class='percent'>%</span>
  1175. </td>
  1176. <td class='total'>
  1177. <?=$page->unit->total_crit_rate?>
  1178. <span class='percent'>%</span>
  1179. </td>
  1180. </tr>
  1181. <tr>
  1182. <th>
  1183. CRD
  1184. </th>
  1185. <td class='base'>
  1186. <?=$page->unit->crit_damage?>
  1187. <span class='percent'>%</span>
  1188. </td>
  1189. <td class='extra'>
  1190. +<?=$page->unit->rune_crit_damage?>
  1191. <span class='percent'>%</span>
  1192. </td>
  1193. <td class='extra'>
  1194. +<?=$page->unit->artifact_crit_damage?>
  1195. <span class='percent'>%</span>
  1196. </td>
  1197. <td class='extra'>
  1198. +<?=$page->unit->building_crit_damage?>
  1199. <span class='percent'>%</span>
  1200. </td>
  1201. <td class='total'>
  1202. <?=$page->unit->total_crit_damage?>
  1203. <span class='percent'>%</span>
  1204. </td>
  1205. </tr>
  1206. <tr>
  1207. <th>
  1208. ACC
  1209. </th>
  1210. <td class='base'>
  1211. <?=$page->unit->accuracy?>
  1212. <span class='percent'>%</span>
  1213. </td>
  1214. <td class='extra'>
  1215. +<?=$page->unit->rune_accuracy?>
  1216. <span class='percent'>%</span>
  1217. </td>
  1218. <td class='extra'>
  1219. +<?=$page->unit->artifact_accuracy?>
  1220. <span class='percent'>%</span>
  1221. </td>
  1222. <td class='extra'>
  1223. +<?=$page->unit->building_accuracy?>
  1224. <span class='percent'>%</span>
  1225. </td>
  1226. <td class='total'>
  1227. <?=$page->unit->total_accuracy?>
  1228. <span class='percent'>%</span>
  1229. </td>
  1230. </tr>
  1231. <tr>
  1232. <th>
  1233. RES
  1234. </th>
  1235. <td class='base'>
  1236. <?=$page->unit->resistance?>
  1237. <span class='percent'>%</span>
  1238. </td>
  1239. <td class='extra'>
  1240. +<?=$page->unit->rune_resistance?>
  1241. <span class='percent'>%</span>
  1242. </td>
  1243. <td class='extra'>
  1244. +<?=$page->unit->artifact_resistance?>
  1245. <span class='percent'>%</span>
  1246. </td>
  1247. <td class='extra'>
  1248. +<?=$page->unit->building_resistance?>
  1249. <span class='percent'>%</span>
  1250. </td>
  1251. <td class='total'>
  1252. <?=$page->unit->total_resistance?>
  1253. <span class='percent'>%</span>
  1254. </td>
  1255. </tr>
  1256. <tr>
  1257. <th colspan='5'>
  1258. Effective HP
  1259. </th>
  1260. <td class='total'>
  1261. <?=$page->unit->effective_hp?>
  1262. <span class='percent'>&nbsp;</span>
  1263. </td>
  1264. </tr>
  1265. <tr>
  1266. <th colspan='5'>
  1267. Effective DMG
  1268. </th>
  1269. <td class='total'>
  1270. <?=$page->unit->effective_dmg?>
  1271. <span class='percent'>&nbsp;</span>
  1272. </td>
  1273. </tr>
  1274. </table>
  1275. <div id='artifacts'>
  1276. <?=HTML::artifact_table($page->unit->artifact_type)?>
  1277. <?=HTML::artifact_table($page->unit->artifact_element)?>
  1278. </div>
  1279. </article> <!-- #profile -->
  1280. <article id='current_runes'>
  1281. <?php
  1282. $show_list = [6, 1, 2, 5, 4, 3];
  1283. //foreach ($page->unit->rune as $rune){
  1284. foreach ($show_list as $i){
  1285. $rune = $page->unit->rune[$i - 1];
  1286. $total_runes ++;
  1287. ?>
  1288. <?=HTML::rune_table($rune)?>
  1289. <?php
  1290. if ($i == 2){
  1291. ?>
  1292. <br/>
  1293. <?php
  1294. }
  1295. }
  1296. ?>
  1297. </article>
  1298. </section> <!-- runes -->
  1299. <section id='parameters' class='content'>
  1300. <h2>
  1301. Optimization parameters
  1302. </h2>
  1303. <article>
  1304. <table id='parameters'>
  1305. <tr>
  1306. <td class='name'>
  1307. Rune sets
  1308. </td>
  1309. <td class='value'>
  1310. <?php
  1311. $reflect = new ReflectionClass("RUNE_SET_ID");
  1312. ?>
  1313. <select id='set_1'>
  1314. <?php
  1315. foreach($reflect->getConstants() as $name => $id){
  1316. $selected = "";
  1317. if ($id == $sets[0]){
  1318. $selected = "selected='selected'";
  1319. }
  1320. ?>
  1321. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  1322. <?php
  1323. }
  1324. ?>
  1325. </select>
  1326. <select id='set_2'>
  1327. <?php
  1328. foreach($reflect->getConstants() as $name => $id){
  1329. $selected = "";
  1330. if ($id == $sets[1]){
  1331. $selected = "selected='selected'";
  1332. }
  1333. ?>
  1334. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  1335. <?php
  1336. }
  1337. ?>
  1338. </select>
  1339. <select id='set_3'>
  1340. <option value='' <?=$selected?>></option>
  1341. <?php
  1342. foreach($reflect->getConstants() as $name => $id){
  1343. $selected = "";
  1344. if ($id == $sets[2]){
  1345. $selected = "selected='selected'";
  1346. }
  1347. ?>
  1348. <option value='<?=$id?>' <?=$selected?>><?=substr($name, 0, 7)?></option>
  1349. <?php
  1350. }
  1351. ?>
  1352. </select>
  1353. </td>
  1354. <td class='empty'>
  1355. </td>
  1356. <td class='name'>
  1357. Min HP
  1358. </td>
  1359. <td class='value'>
  1360. <input id='min_hp' type='range' value='<?=$page->unit->total_hp?>' min='<?=$page->unit->hp?>' max='50000' oninput='updateMinValue("hp", this);'>
  1361. <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>
  1362. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("hp");'>
  1363. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1364. </a>
  1365. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("hp");'>
  1366. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1367. </a>
  1368. </td>
  1369. </tr>
  1370. <tr>
  1371. <td class='name'>
  1372. Even slots
  1373. </td>
  1374. <td class='value'>
  1375. <select id='slot_2'>
  1376. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[0] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1377. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[0] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1378. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[0] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1379. <option value='<?=RUNE_STAT_ID::SPD?>' <?=($mains[0] == RUNE_STAT_ID::SPD) ? ("selected='selected'") : ("");?>>SPD</option>
  1380. </select>
  1381. <select id='slot_4'>
  1382. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[1] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1383. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[1] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1384. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[1] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1385. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRR) ? ("selected='selected'") : ("");?>>CRR</option>
  1386. <option value='<?=RUNE_STAT_ID::CRR?>' <?=($mains[1] == RUNE_STAT_ID::CRD) ? ("selected='selected'") : ("");?>>CRD</option>
  1387. </select>
  1388. <select id='slot_6'>
  1389. <option value='<?=RUNE_STAT_ID::HP_P?>' <?=($mains[2] == RUNE_STAT_ID::HP_P) ? ("selected='selected'") : ("");?>>HP%</option>
  1390. <option value='<?=RUNE_STAT_ID::ATK_P?>' <?=($mains[2] == RUNE_STAT_ID::ATK_P) ? ("selected='selected'") : ("");?>>ATK%</option>
  1391. <option value='<?=RUNE_STAT_ID::DEF_P?>' <?=($mains[2] == RUNE_STAT_ID::DEF_P) ? ("selected='selected'") : ("");?>>DEF%</option>
  1392. <option value='<?=RUNE_STAT_ID::ACC?>' <?=($mains[2] == RUNE_STAT_ID::ACC) ? ("selected='selected'") : ("");?>>ACC</option>
  1393. <option value='<?=RUNE_STAT_ID::RES?>' <?=($mains[2] == RUNE_STAT_ID::RES) ? ("selected='selected'") : ("");?>>RES</option>
  1394. </select>
  1395. </td>
  1396. <td class='empty'>
  1397. </td>
  1398. <td class='name'>
  1399. Min ATK
  1400. </td>
  1401. <td class='value'>
  1402. <input id='min_attack' type='range' value='<?=$page->unit->total_attack?>' min='<?=$page->unit->attack?>' max='4000' oninput='updateMinValue("attack", this);'>
  1403. <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>
  1404. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("attack");'>
  1405. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1406. </a>
  1407. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("attack");'>
  1408. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1409. </a>
  1410. </td>
  1411. </tr>
  1412. <tr>
  1413. <td class='name'>
  1414. Use runes from
  1415. </td>
  1416. <td class='value'>
  1417. <select id='rune_source'>
  1418. <option value='0'>Storage only</option>
  1419. <option value='1'>Units in no teams</option>
  1420. <option value='2'>Units in teams with 0 score</option>
  1421. <option value='3'>Units with lower overall score</option>
  1422. <option value='4'>All runes</option>
  1423. </select>
  1424. </td>
  1425. <td class='empty'>
  1426. </td>
  1427. <td class='name'>
  1428. Min DEF
  1429. </td>
  1430. <td class='value'>
  1431. <input id='min_defense' type='range' value='<?=$page->unit->total_defense?>' min='<?=$page->unit->defense?>' max='4000' oninput='updateMinValue("defense", this);'>
  1432. <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>
  1433. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("defense");'>
  1434. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1435. </a>
  1436. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("defense");'>
  1437. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1438. </a>
  1439. </td>
  1440. </tr>
  1441. <tr>
  1442. <td class='name'>
  1443. Tune optimizer for
  1444. </td>
  1445. <td class='value'>
  1446. <select id='tuning'>
  1447. <option value='0'>Rune current levels</option>
  1448. <option value='1'>+12</option>
  1449. <option value='2'>2/4/6 +15, 1/3/5 + 12</option>
  1450. <option value='3'>+15</option>
  1451. </select>
  1452. </td>
  1453. <td class='empty'>
  1454. </td>
  1455. <td class='name'>
  1456. Min SPD
  1457. </td>
  1458. <td class='value'>
  1459. <input id='min_speed' type='range' value='<?=$page->unit->total_speed?>' min='<?=$page->unit->speed?>' max='400' oninput='updateMinValue("speed", this);'>
  1460. <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>
  1461. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("speed");'>
  1462. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1463. </a>
  1464. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("speed");'>
  1465. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1466. </a>
  1467. </td>
  1468. </tr>
  1469. <tr>
  1470. <td class='empty'>
  1471. Max. combinations
  1472. </td>
  1473. <td class='empty'>
  1474. <input id='limit' type='number' value='10' max='100' min='1'>
  1475. </td>
  1476. <td class='empty'>
  1477. </td>
  1478. <td class='name'>
  1479. Min CRR
  1480. </td>
  1481. <td class='value'>
  1482. <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);'>
  1483. <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>
  1484. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("crit_rate");'>
  1485. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1486. </a>
  1487. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("crit_rate");'>
  1488. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1489. </a>
  1490. </td>
  1491. </tr>
  1492. <tr>
  1493. <td class='empty'>
  1494. </td>
  1495. <td class='empty'>
  1496. </td>
  1497. <td class='empty'>
  1498. </td>
  1499. <td class='name'>
  1500. Min CRD
  1501. </td>
  1502. <td class='value'>
  1503. <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);'>
  1504. <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>
  1505. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("crit_damage");'>
  1506. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1507. </a>
  1508. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("crit_damage");'>
  1509. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1510. </a>
  1511. </td>
  1512. </tr>
  1513. <tr>
  1514. <td class='empty'>
  1515. </td>
  1516. <td class='empty'>
  1517. </td>
  1518. <td class='empty'>
  1519. </td>
  1520. <td class='name'>
  1521. Min ACC
  1522. </td>
  1523. <td class='value'>
  1524. <input id='min_accuracy' type='range' value='<?=$page->unit->total_accuracy?>' min='<?=$page->unit->accuracy?>' max='85' oninput='updateMinValue("accuracy", this);'>
  1525. <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>
  1526. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("accuracy");'>
  1527. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1528. </a>
  1529. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("accuracy");'>
  1530. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1531. </a>
  1532. </td>
  1533. </tr>
  1534. <tr>
  1535. <td class='empty'>
  1536. </td>
  1537. <td class='empty'>
  1538. </td>
  1539. <td class='empty'>
  1540. </td>
  1541. <td class='name'>
  1542. Min RES
  1543. </td>
  1544. <td class='value'>
  1545. <input id='min_resistance' type='range' value='<?=$page->unit->total_resistance?>' min='<?=$page->unit->resistance?>' max='85' oninput='updateMinValue("resistance", this);'>
  1546. <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>
  1547. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("resistance");'>
  1548. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1549. </a>
  1550. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("resistance");'>
  1551. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1552. </a>
  1553. </td>
  1554. </tr>
  1555. <tr>
  1556. <td class='empty'>
  1557. </td>
  1558. <td class='empty'>
  1559. </td>
  1560. <td class='empty'>
  1561. </td>
  1562. <td class='name'>
  1563. Min EHP
  1564. </td>
  1565. <td class='value'>
  1566. <input id='min_ehp' type='range' value='<?=$page->unit->effective_hp?>' min='0' max='200000' oninput='updateMinValue("ehp", this);'>
  1567. <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>
  1568. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("ehp");'>
  1569. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1570. </a>
  1571. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("ehp");'>
  1572. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1573. </a>
  1574. </td>
  1575. </tr>
  1576. <tr>
  1577. <td class='action'>
  1578. <input id='apply' type='button' value='Apply' onClick='apply();'/>
  1579. <input id='apply' type='button' value='DEBUG' onClick='debug();'/>
  1580. </td>
  1581. <td class='empty'>
  1582. <img id='wait' src='<?=URL::IMG["ICON"] . "wait.gif";?>'>
  1583. </td>
  1584. <td class='empty'>
  1585. </td>
  1586. <td class='name'>
  1587. Min DMG
  1588. </td>
  1589. <td class='value'>
  1590. <input id='min_dmg' type='range' value='<?=$page->unit->effective_dmg?>' min='0' max='7000' oninput='updateMinValue("dmg", this);'>
  1591. <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>
  1592. <a title='Remove filter' class='filter_control a_button' onclick='removeFilter("dmg");'>
  1593. <img alt='Remove filter' src='<?=URL::IMG["ICON"]?>nok.png'/>
  1594. </a>
  1595. <a title='Reset filter' class='filter_control a_button' onclick='resetFilter("dmg");'>
  1596. <img alt='Reset filter' src='<?=URL::IMG["ICON"]?>edit.png'/>
  1597. </a>
  1598. </td>
  1599. </tr>
  1600. </table>
  1601. </article>
  1602. </section>
  1603. <section id='results' class='content'>
  1604. <h2>
  1605. Optimization results
  1606. </h2>
  1607. <article>
  1608. <div id='results_info'>
  1609. <span id='num_results'></span> results (<span id='num_skipped'></span> skipped) in <span id='num_seconds'></span> seconds
  1610. </div>
  1611. <table id='table_optimizations'>
  1612. <tbody id='optimizations'>
  1613. </tbody>
  1614. </table>
  1615. </article>
  1616. </section>
  1617. </main>
  1618. <div id='message_container'>
  1619. <section class='content'>
  1620. <h2 id='message_title'>
  1621. Message
  1622. </h2>
  1623. <article>
  1624. <p id='message_text'>
  1625. Message Text
  1626. </p>
  1627. </article>
  1628. <input type='button' value='OK' id='message_button' onclick='closeMessage();'/>
  1629. </section>
  1630. </div>
  1631. <?php
  1632. include __DIR__ . "/inc/footer.php";
  1633. ?>
  1634. </body>
  1635. </html>