stats.php 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. <?php
  2. /**
  3. * Runs view.
  4. *
  5. * Contains the view layout and ome code to present the data.
  6. *
  7. * @category View
  8. * @var Stats_Page $page The page model.
  9. * @var 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?>stats.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. function selectAreaType(){
  42. var areaType = document.getElementById('filter_area_type').options[document.getElementById('filter_area_type').selectedIndex].value;
  43. // Clear all selectors
  44. document.getElementById('filter_stage').style.display = 'none';
  45. document.getElementById('filter_difficulty').style.display = 'none';
  46. var areas = document.getElementsByClassName('filter_area');
  47. for (var i = 0; i < areas.length; i++) {
  48. areas[i].style.display = 'none';
  49. areas[i].removeAttribute('name');
  50. }
  51. // Show selected selector.
  52. switch (areaType){
  53. case '<?=AREA_TYPE_ID::SCENARIO?>':
  54. document.getElementById('filter_area_scenario').style.display = 'inline-block';
  55. document.getElementById('filter_area_scenario').setAttribute('name', 'area');
  56. populateStage(7);
  57. document.getElementById('filter_stage').style.display = 'inline-block';
  58. populateDifficulty();
  59. document.getElementById('filter_difficulty').style.display = 'inline-block';
  60. break;
  61. case '<?=AREA_TYPE_ID::CAIROS_DUNGEON?>':
  62. document.getElementById('filter_area_cairos').style.display = 'inline-block';
  63. document.getElementById('filter_area_cairos').setAttribute('name', 'area');
  64. populateStage(10);
  65. document.getElementById('filter_stage').style.display = 'inline-block';
  66. break;
  67. case '<?=AREA_TYPE_ID::RIFT_DUNGEON?>':
  68. document.getElementById('filter_area_rift_dungeon').style.display = 'inline-block';
  69. document.getElementById('filter_area_rift_dungeon').setAttribute('name', 'area');
  70. break;
  71. // TODO: Other areas
  72. // Rift Raid: Don't filter by area.
  73. // Arena: Don't filter by area.
  74. // Guild War: Don't filter by area.
  75. // Guild Siege: Don't filter by area.
  76. // Rift Raid: Don't filter by area.
  77. // Tartarus: Don't filter by area.
  78. // TOA: Don't filter by area.
  79. // Rift Raid: Don't filter by area.
  80. // WB: Don't filter by area.
  81. // Dimensional Rift: Don't filter by area.
  82. // TODO: Filter Dimensional Hole dungeon
  83. }
  84. }
  85. /**
  86. * Shows the stage selector in the filters.
  87. *
  88. * @param total The number of stages to show.
  89. */
  90. function populateStage(total){
  91. var sel = document.getElementById('filter_stage');
  92. while (sel.firstChild) {
  93. sel.removeChild(sel.firstChild);
  94. }
  95. var opt;
  96. var att;
  97. // Empty
  98. opt = document.createElement('option');
  99. tex = document.createTextNode('');
  100. opt.appendChild(tex);
  101. sel.appendChild(opt);
  102. for (var i = 1; i <= total; i ++){
  103. opt = document.createElement('option');
  104. tex = document.createTextNode('Stage ' + i);
  105. att = document.createAttribute('value');
  106. att.value = i;
  107. opt.setAttributeNode(att);
  108. opt.appendChild(tex);
  109. sel.appendChild(opt);
  110. }
  111. }
  112. /**
  113. * Shows the difficulty selector in the filter panel.
  114. *
  115. * @param labyrinth Indicates if the area type is the Tartarus
  116. * labyrinth. If so, it includes 'Easy'.
  117. * @param toa Indicates if the area type is the Tower of
  118. * Ascension. If so, it excludes 'Hell'.
  119. */
  120. function populateDifficulty(labyrinth = false, toa = false){
  121. var sel = document.getElementById('filter_difficulty');
  122. while (sel.firstChild) {
  123. sel.removeChild(sel.firstChild);
  124. }
  125. var opt;
  126. var att;
  127. var tex;
  128. // Empty
  129. opt = document.createElement('option');
  130. tex = document.createTextNode('');
  131. opt.appendChild(tex);
  132. sel.appendChild(opt);
  133. // Easy (Labyrinth only)
  134. if (labyrinth){
  135. opt = document.createElement('option');
  136. tex = document.createTextNode('Easy difficulty');
  137. att = document.createAttribute('value');
  138. att.value = '<?=DIFFICULTY_ID::EASY?>';
  139. opt.setAttributeNode(att);
  140. opt.appendChild(tex);
  141. sel.appendChild(opt);
  142. }
  143. // Normal
  144. opt = document.createElement('option');
  145. tex = document.createTextNode('Normal difficulty');
  146. att = document.createAttribute('value');
  147. att.value = '<?=DIFFICULTY_ID::NORMAL?>';
  148. opt.setAttributeNode(att);
  149. opt.appendChild(tex);
  150. sel.appendChild(opt);
  151. // Hard
  152. opt = document.createElement('option');
  153. tex = document.createTextNode('Hard difficulty');
  154. att = document.createAttribute('value');
  155. att.value = '<?=DIFFICULTY_ID::HARD?>';
  156. opt.setAttributeNode(att);
  157. opt.appendChild(tex);
  158. sel.appendChild(opt);
  159. // Hell
  160. if (!toa){
  161. opt = document.createElement('option');
  162. tex = document.createTextNode('Hell difficulty');
  163. att = document.createAttribute('value');
  164. att.value = '<?=DIFFICULTY_ID::HELL?>';
  165. opt.setAttributeNode(att);
  166. opt.appendChild(tex);
  167. sel.appendChild(opt);
  168. }
  169. }
  170. /**
  171. * Sets the values for the stage and difficulty at page load.
  172. */
  173. function initialValues(){
  174. <?php
  175. if ($page->filters["STAGE"] != null && $page->filters["STAGE"] > 0){
  176. ?>
  177. document.getElementById('filter_stage').selectedIndex = <?=$page->filters["STAGE"]?>;
  178. <?php
  179. }
  180. if ($page->filters["DIFFICULTY"] != null && $page->filters["DIFFICULTY"] > 0){
  181. ?>
  182. document.getElementById('filter_difficulty').selectedIndex = <?=$page->filters["DIFFICULTY"]?>;
  183. <?php
  184. }
  185. ?>
  186. }
  187. /**
  188. * Calls all required functions to draw all diagrams.
  189. */
  190. function populateDiagrams(){
  191. <?php
  192. if ($page->show_data){
  193. ?>
  194. diagramWin();
  195. diagramDropType();
  196. diagramDropRuneSlot();
  197. diagramDropRuneStars();
  198. diagramDropRuneQuality();
  199. <?php
  200. }
  201. ?>
  202. }
  203. /**
  204. * Generates the win rate diagram.
  205. */
  206. function diagramWin(){
  207. var canvas = document.getElementById("diagram_win");
  208. var ctx = canvas.getContext("2d");
  209. ctx.lineWidth = 2;
  210. var lastend = 0;
  211. var data = [<?=$page->win_lose[0]?>, <?=$page->win_lose[1]?>];
  212. var total = 0;
  213. var color = [
  214. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_1')).color,
  215. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_2')).color
  216. ];
  217. for(var e = 0; e < data.length; e++){
  218. total += data[e];
  219. }
  220. for (var i = 0; i < data.length; i++) {
  221. ctx.beginPath();
  222. ctx.moveTo(canvas.width / 2, canvas.height / 2);
  223. ctx.arc(canvas.width / 2, canvas.height / 2, canvas.height / 2, lastend, lastend + (Math.PI * 2 * (data[i] / total)), false);
  224. ctx.lineTo(canvas.width / 2, canvas.height / 2);
  225. ctx.fillStyle = '#000000';
  226. ctx.stroke();
  227. ctx.fillStyle = color[i];
  228. ctx.fill();
  229. lastend += Math.PI * 2 * (data[i] / total);
  230. }
  231. }
  232. /**
  233. * Generates the drop rate diagram.
  234. */
  235. function diagramDropType(){
  236. // TODO: Diferenciate scenario, dungeon and hall.
  237. var canvas = document.getElementById("diagram_drop_type");
  238. var ctx = canvas.getContext("2d");
  239. ctx.lineWidth = 2;
  240. var lastend = 0;
  241. var data = [
  242. <?=$page->drop_type["rune"]?>,
  243. <?=$page->drop_type["rune_craft"]?>,
  244. <?=$page->drop_type["item"]?>,
  245. <?=$page->drop_type["sd"]?>,
  246. <?=$page->drop_type["shapeshifting"]?>,
  247. <?=$page->drop_type["unit"]?>,
  248. ];
  249. var total = 0;
  250. var color = [
  251. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_1')).color,
  252. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_2')).color,
  253. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_3')).color,
  254. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_4')).color,
  255. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_5')).color,
  256. getComputedStyle(document.querySelector('div.diagram table.legend tr.color_6')).color,
  257. ];
  258. for(var e = 0; e < data.length; e++){
  259. total += data[e];
  260. }
  261. for (var i = 0; i < data.length; i++) {
  262. ctx.beginPath();
  263. ctx.moveTo(canvas.width/2, canvas.height/2);
  264. ctx.arc(canvas.width/2, canvas.height/2, canvas.height/2, lastend, lastend + (Math.PI * 2 * (data[i] / total)), false);
  265. ctx.lineTo(canvas.width/2, canvas.height/2);
  266. ctx.fillStyle = '#000000';
  267. ctx.stroke();
  268. ctx.fillStyle = color[i];
  269. ctx.fill();
  270. lastend += Math.PI * 2 * (data[i] / total);
  271. }
  272. }
  273. /**
  274. * Generates the rune slot rate diagram.
  275. */
  276. function diagramDropRuneSlot(){
  277. var canvas = document.getElementById("diagram_rune_slot");
  278. var data = [
  279. <?=$page->drop_rune_slot["1"]?>,
  280. <?=$page->drop_rune_slot["2"]?>,
  281. <?=$page->drop_rune_slot["3"]?>,
  282. <?=$page->drop_rune_slot["4"]?>,
  283. <?=$page->drop_rune_slot["5"]?>,
  284. <?=$page->drop_rune_slot["6"]?>
  285. ];
  286. var total = 6;
  287. // Polarchart base
  288. var ctx_base = canvas.getContext("2d");
  289. ctx_base.lineWidth = 1;
  290. ctx_base.font = '32px serif'
  291. ctx_base.textBaseline = 'middle'
  292. ctx_base.textAlign = 'middle'
  293. var lastend = Math.PI + Math.PI / total;
  294. var radius = Math.round((canvas.width / 2) * ((i + 1) / total));
  295. for (var i = 0; i < total; i++) {
  296. ctx_base.moveTo(canvas.width / 2, canvas.height / 2);
  297. ctx_base.arc(canvas.width / 2, canvas.height / 2, canvas.height / 2, lastend, lastend + (Math.PI * 2 / total), false);
  298. ctx_base.lineTo(canvas.width / 2, canvas.height / 2);
  299. ctx_base.strokeStyle = '#333333';
  300. ctx_base.stroke();
  301. lastend += (Math.PI * 2 / total);
  302. }
  303. ctx_base.fillStyle = '#33333366';
  304. ctx_base.fill();
  305. // Numbers
  306. ctx_base.fillStyle = '#ffffff';
  307. lastend = Math.PI + Math.PI / total;
  308. for (var i = 0; i < total; i ++){
  309. lastend += (Math.PI * 2 / total);
  310. tx = canvas.width / 2 + canvas.width / 2.3 * Math.cos(lastend);
  311. ty = canvas.width / 2 + canvas.width / 2.3 * Math.sin(lastend);
  312. ctx_base.fillText(i + 1, tx - 8, ty);
  313. }
  314. // Polarchart content
  315. var ctx_data = canvas.getContext("2d");
  316. max = Math.max.apply(null, data) * 1.1;
  317. var initX = 0;
  318. var initY = 0;
  319. let region = new Path2D();
  320. for (var i = 0; i < total; i++) {
  321. var r = Math.round((canvas.width / 2) * data[i] / max);
  322. var x = Math.round(r * Math.sin(Math.PI * 2 / total));
  323. var y = Math.round(r * Math.cos(Math.PI * 2 / total));
  324. // Rotate the point
  325. angle = (i + 4) * Math.PI * 2 / total;
  326. rx = x * Math.cos(angle) - y * Math.sin(angle)
  327. ry = y * Math.cos(angle) + x * Math.sin(angle)
  328. rx += canvas.width / 2;
  329. ry += canvas.width / 2;
  330. if (i == 0){
  331. region.moveTo(rx, ry);
  332. initX = rx;
  333. initY = ry;
  334. }
  335. else{
  336. region.lineTo(rx, ry);
  337. }
  338. }
  339. region.lineTo(initX, initY);
  340. ctx_data.lineWidth = 2;
  341. ctx_data.strokeStyle = '#ff0000';
  342. ctx_data.stroke(region)
  343. ctx_data.fillStyle = '#ff000055';
  344. ctx_data.fill(region)
  345. }
  346. /**
  347. * Generates the rune star rate diagram.
  348. */
  349. function diagramDropRuneStars(){
  350. var canvas = document.getElementById("diagram_rune_stars");
  351. var data = [
  352. <?=$page->drop_rune_stars["6"]?>,
  353. <?=$page->drop_rune_stars["5"]?>,
  354. <?=$page->drop_rune_stars["4"]?>,
  355. <?=$page->drop_rune_stars["3"]?>,
  356. <?=$page->drop_rune_stars["2"]?>,
  357. <?=$page->drop_rune_stars["1"]?>
  358. ];
  359. var total = 6;
  360. // Polarchart base
  361. var ctx_base = canvas.getContext("2d");
  362. ctx_base.lineWidth = 1;
  363. ctx_base.font = '32px serif'
  364. ctx_base.textBaseline = 'middle'
  365. ctx_base.textAlign = 'middle'
  366. var lastend = Math.PI + Math.PI / total;
  367. for (var i = 0; i < total; i++) {
  368. radius = Math.round((canvas.width / 2) * ((i + 1) / total));
  369. ctx_base.moveTo(canvas.width / 2, canvas.height / 2);
  370. ctx_base.arc(canvas.width / 2, canvas.height / 2, canvas.height / 2, lastend, lastend + (Math.PI * 2 / total), false);
  371. ctx_base.lineTo(canvas.width / 2, canvas.height / 2);
  372. ctx_base.strokeStyle = '#333333';
  373. ctx_base.stroke();
  374. lastend += (Math.PI * 2 / total);
  375. }
  376. ctx_base.fillStyle = '#33333366';
  377. ctx_base.fill();
  378. // Numbers
  379. ctx_base.fillStyle = '#ffffff';
  380. lastend = Math.PI + Math.PI / total;
  381. for (var i = 0; i < total; i ++){
  382. lastend += (Math.PI * 2 / total);
  383. tx = canvas.width / 2 + canvas.width / 2.3 * Math.cos(lastend);
  384. ty = canvas.width / 2 + canvas.width / 2.3 * Math.sin(lastend);
  385. ctx_base.fillText(6 - i, tx - 8, ty);
  386. }
  387. // Polarchart content
  388. var ctx_data = canvas.getContext("2d");
  389. max = Math.max.apply(null, data) * 1.1;
  390. var initX = 0;
  391. var initY = 0;
  392. let region = new Path2D();
  393. for (var i = 0; i < total; i++) {
  394. var r = Math.round((canvas.width / 2) * data[i] / max);
  395. var x = Math.round(r * Math.sin(Math.PI * 2 / total));
  396. var y = Math.round(r * Math.cos(Math.PI * 2 / total));
  397. // Rotate the point
  398. angle = (i + 4) * Math.PI * 2 / total;
  399. rx = x * Math.cos(angle) - y * Math.sin(angle)
  400. ry = y * Math.cos(angle) + x * Math.sin(angle)
  401. rx += canvas.width / 2;
  402. ry += canvas.width / 2;
  403. if (i == 0){
  404. region.moveTo(rx, ry);
  405. initX = rx;
  406. initY = ry;
  407. }
  408. else{
  409. region.lineTo(rx, ry);
  410. }
  411. }
  412. region.lineTo(initX, initY);
  413. ctx_data.lineWidth = 2;
  414. ctx_data.strokeStyle = '#ff0000';
  415. ctx_data.stroke(region)
  416. ctx_data.fillStyle = '#ff000055';
  417. ctx_data.fill(region)
  418. }
  419. /**
  420. * Generates the rune quality rate diagram.
  421. */
  422. function diagramDropRuneQuality(){
  423. var canvas = document.getElementById("diagram_rune_quality");
  424. var data = [
  425. <?=$page->drop_rune_quality[strval(QUALITY_ID::LEGEND)]?>,
  426. <?=$page->drop_rune_quality[strval(QUALITY_ID::HERO)]?>,
  427. <?=$page->drop_rune_quality[strval(QUALITY_ID::RARE)]?>,
  428. <?=$page->drop_rune_quality[strval(QUALITY_ID::MAGIC)]?>,
  429. <?=$page->drop_rune_quality[strval(QUALITY_ID::NORMAL)]?>
  430. ];
  431. var total = 5;
  432. // Polarchart base
  433. var ctx_base = canvas.getContext("2d");
  434. ctx_base.lineWidth = 1;
  435. //var lastend = Math.PI * 2 / (0.5 * total / Math.PI);
  436. var lastend = ((270 - (180 / (total))) * Math.PI / 180);
  437. var color = [
  438. '#f5790066', // LEGEND
  439. '#ad7fa866', // HERO
  440. '#15c6e166', // RARE
  441. '#55ff5566', // MAGIC
  442. '#cccccc66' // NORMAL
  443. ];
  444. for (var i = 0; i < total; i++) {
  445. ctx_base.beginPath();
  446. radius = Math.round((canvas.width / 2) * ((i + 1) / total));
  447. ctx_base.moveTo(canvas.width / 2, canvas.height / 2);
  448. ctx_base.arc(canvas.width / 2, canvas.height / 2, canvas.height / 2, lastend, lastend + (Math.PI * 2 / total), false);
  449. ctx_base.lineTo(canvas.width / 2, canvas.height / 2);
  450. ctx_base.fillStyle = color[i];
  451. ctx_base.fill();
  452. ctx_base.strokeStyle = '#333333';
  453. ctx_base.stroke();
  454. lastend += (Math.PI * 2 / total);
  455. }
  456. //ctx_base.fillStyle = '#33333366';
  457. //ctx_base.fill()
  458. // Polarchart content
  459. var ctx_data = canvas.getContext("2d");
  460. max = Math.max.apply(null, data) * 1.1;
  461. var initX = 0;
  462. var initY = 0;
  463. let region = new Path2D();
  464. for (var i = 0; i < total; i++) {
  465. var r = Math.round((canvas.width / 2) * data[i] / max);
  466. var x = Math.round(r * Math.sin(Math.PI * 2 / total));
  467. var y = Math.round(r * Math.cos(Math.PI * 2 / total));
  468. // Rotate the point
  469. // TOTALLY experimental, not reliable for a different number of sectors.
  470. angle = (i * Math.PI * 2 / total) + 2 * Math.PI / (2 * (total - 1)) + 270 * (4.6/6) * Math.PI / 180;
  471. rx = x * Math.cos(angle) - y * Math.sin(angle)
  472. ry = y * Math.cos(angle) + x * Math.sin(angle)
  473. rx += canvas.width / 2;
  474. ry += canvas.width / 2;
  475. if (i == 0){
  476. region.moveTo(rx, ry);
  477. initX = rx;
  478. initY = ry;
  479. }
  480. else{
  481. region.lineTo(rx, ry);
  482. }
  483. }
  484. region.lineTo(initX, initY);
  485. ctx_data.lineWidth = 2;
  486. ctx_data.strokeStyle = '#ff0000';
  487. ctx_data.stroke(region)
  488. ctx_data.fillStyle = '#ff000055';
  489. ctx_data.fill(region)
  490. }
  491. // TODO: Script to show/hide area selector
  492. </script>
  493. </head>
  494. <body onload='populateDiagrams();selectAreaType();initialValues();'>
  495. <?php
  496. include __DIR__ . "/inc/header.php";
  497. ?>
  498. <aside class='filters'>
  499. <h2>
  500. Statistics
  501. </h2>
  502. <form action='/<?=$UID?>/stats/' method='get' class='filter'>
  503. <table>
  504. <tr>
  505. <td class='filter'>
  506. <span>Area:</span>
  507. </td>
  508. </tr>
  509. <tr>
  510. <td class='filter'>
  511. <?php
  512. $selected = array_fill(0, 12 + 1, "");
  513. $selected[$page->filters["AREA_TYPE"]] = "selected";
  514. ?>
  515. <select name='area_type' id='filter_area_type' onChange='selectAreaType();'>
  516. <option value='0'></option>
  517. <option value='<?=AREA_TYPE_ID::SCENARIO?>' <?=$selected[AREA_TYPE_ID::SCENARIO]?>>Scenario</option>
  518. <option value='<?=AREA_TYPE_ID::CAIROS_DUNGEON?>' <?=$selected[AREA_TYPE_ID::CAIROS_DUNGEON]?>>Cairos Dungeon</option>
  519. <option value='<?=AREA_TYPE_ID::RIFT_DUNGEON?>' <?=$selected[AREA_TYPE_ID::RIFT_DUNGEON]?>>Rift Beast</option>
  520. <option value='<?=AREA_TYPE_ID::RIFT_RAID?>' <?=$selected[AREA_TYPE_ID::RIFT_RAID]?>>Rift Raid</option>
  521. <option value='<?=AREA_TYPE_ID::DIMENSIONAL_HOLE?>' <?=$selected[AREA_TYPE_ID::DIMENSIONAL_HOLE]?>>Dimensional Hole</option>
  522. </select>
  523. <?php
  524. $selected = array_fill(0, 9002, "");
  525. $selected[$page->filters["AREA"]] = "selected";
  526. ?>
  527. <select class='filter_area' id='filter_area_scenario'>
  528. <option value='0'></option>
  529. <option value='<?=AREA_TYPE_ID::SCENARIO?>' <?=$selected[AREA_TYPE_ID::SCENARIO]?>>Scenario</option>
  530. <option value='<?=AREA_TYPE_ID::CAIROS_DUNGEON?>' <?=$selected[AREA_TYPE_ID::CAIROS_DUNGEON]?>>Cairos Dungeon</option>
  531. <option value='<?=AREA_TYPE_ID::RIFT_DUNGEON?>' <?=$selected[AREA_TYPE_ID::RIFT_DUNGEON]?>>Rift Beast</option>
  532. <option value='<?=AREA_TYPE_ID::RIFT_RAID?>' <?=$selected[AREA_TYPE_ID::RIFT_RAID]?>>Rift Raid</option>
  533. <option value='<?=AREA_TYPE_ID::DIMENSIONAL_HOLE?>' <?=$selected[AREA_TYPE_ID::DIMENSIONAL_HOLE]?>>Dimensional Hole</option>
  534. <option value='<?=AREA_TYPE_ID::ARENA?>' <?=$selected[AREA_TYPE_ID::ARENA]?>>Arena</option>
  535. <option value='<?=AREA_TYPE_ID::GUILD_WAR?>' <?=$selected[AREA_TYPE_ID::GUILD_WAR]?>>Guild War</option>
  536. <option value='<?=AREA_TYPE_ID::GUILD_SIEGE?>' <?=$selected[AREA_TYPE_ID::GUILD_SIEGE]?>>Guild Siege</option>
  537. <option value='<?=AREA_TYPE_ID::TARTARUS_LABYRINTH?>' <?=$selected[AREA_TYPE_ID::TARTARUS_LABYRINTH]?>>Tartarus Labyrinth</option>
  538. <option value='<?=AREA_TYPE_ID::TRIAL_OF_ASCENSION?>' <?=$selected[AREA_TYPE_ID::TRIAL_OF_ASCENSION]?>>Trial of Ascension</option>
  539. <option value='<?=AREA_TYPE_ID::WORLD_BOSS?>' <?=$selected[AREA_TYPE_ID::WORLD_BOSS]?>>World Boss</option>
  540. <option value='<?=AREA_TYPE_ID::DIMENSIONAL_RIFT?>' <?=$selected[AREA_TYPE_ID::DIMENSIONAL_RIFT]?>>Dimensional Rift</option>
  541. </select>
  542. <select class='filter_area' id='filter_area_cairos'>
  543. <option value='0'></option>
  544. <option value='<?=DUNGEON_ID::GIANTS_KEEP?>' <?=$selected[DUNGEON_ID::GIANTS_KEEP]?>>Giant&#39;s Keep</option>
  545. <option value='<?=DUNGEON_ID::DRAGONS_LAIR?>' <?=$selected[DUNGEON_ID::DRAGONS_LAIR]?>>Dragon&#39;s Lair</option>
  546. <option value='<?=DUNGEON_ID::NECROPOLIS?>' <?=$selected[DUNGEON_ID::NECROPOLIS]?>>Necropolis</option>
  547. <option value='<?=DUNGEON_ID::HALL_OF_MAGIC?>' <?=$selected[DUNGEON_ID::HALL_OF_MAGIC]?>>Hall of Magic</option>
  548. <option value='<?=DUNGEON_ID::HALL_OF_LIGHT?>' <?=$selected[DUNGEON_ID::HALL_OF_LIGHT]?>>Hall of Light</option>
  549. <option value='<?=DUNGEON_ID::HALL_OF_DARK?>' <?=$selected[DUNGEON_ID::HALL_OF_DARK]?>>Hall of Dark</option>
  550. <option value='<?=DUNGEON_ID::HALL_OF_FIRE?>' <?=$selected[DUNGEON_ID::HALL_OF_FIRE]?>>Hall of Fire</option>
  551. <option value='<?=DUNGEON_ID::HALL_OF_WATER?>' <?=$selected[DUNGEON_ID::HALL_OF_WATER]?>>Hall of Water</option>
  552. <option value='<?=DUNGEON_ID::HALL_OF_WIND?>' <?=$selected[DUNGEON_ID::HALL_OF_WIND]?>>Hall of Wind</option>
  553. </select>
  554. <select id='filter_area_rift_dungeon' class='filter_area'>
  555. <option value='0'></option>
  556. <option value='<?=ELEMENTAL_RIFT_DUNGEON_ID::LIGHT_BEAST?>' <?=$selected[ELEMENTAL_RIFT_DUNGEON_ID::LIGHT_BEAST]?>>Light Beast</option>
  557. <option value='<?=ELEMENTAL_RIFT_DUNGEON_ID::DARK_BEAST?>' <?=$selected[ELEMENTAL_RIFT_DUNGEON_ID::DARK_BEAST]?>>Dark Beast</option>
  558. <option value='<?=ELEMENTAL_RIFT_DUNGEON_ID::FIRE_BEAST?>' <?=$selected[ELEMENTAL_RIFT_DUNGEON_ID::FIRE_BEAST]?>>Fire Beast</option>
  559. <option value='<?=ELEMENTAL_RIFT_DUNGEON_ID::ICE_BEAST?>' <?=$selected[ELEMENTAL_RIFT_DUNGEON_ID::ICE_BEAST]?>>Ice Beast</option>
  560. <option value='<?=ELEMENTAL_RIFT_DUNGEON_ID::WIND_BEAST?>' <?=$selected[ELEMENTAL_RIFT_DUNGEON_ID::WIND_BEAST]?>>Wind Beast</option>
  561. </select>
  562. <select id='filter_stage' name='stage'>
  563. </select>
  564. <select id='filter_difficulty' name='difficulty'>
  565. </select>
  566. </td>
  567. </tr>
  568. </table>
  569. <input type='submit' value='Apply'/>
  570. </form>
  571. </aside> <!-- #filters -->
  572. <main>
  573. <?php
  574. if ($page->show_data){
  575. ?>
  576. <section class='content'>
  577. <h2>
  578. Stats
  579. </h2>
  580. <article>
  581. <div id='win' class='diagram'>
  582. <h3>
  583. Victory rate
  584. </h3>
  585. <canvas id='diagram_win' width='200' height='200'></canvas>
  586. <?php
  587. $total = $page->win_lose[0] + $page->win_lose[1];
  588. // Fix divisions by 0 (dont use in total count):
  589. if ($total == 0){
  590. $total ++;
  591. }
  592. ?>
  593. <table class='legend'>
  594. <tr class='color_1'>
  595. <td>
  596. Victories:
  597. </td>
  598. <td>
  599. <?=$page->win_lose[0]?>
  600. </td>
  601. <td>
  602. (<?=number_format(($page->win_lose[0] * 100) / $total, 2, ".", ",")?>%)
  603. </td>
  604. </tr>
  605. <tr class='color_2'>
  606. <td>
  607. Defeats:
  608. </td>
  609. <td>
  610. <?=$page->win_lose[1]?>
  611. </td>
  612. <td>
  613. (<?=number_format(($page->win_lose[1] * 100) / $total, 2, ".", ",")?>%)
  614. </td>
  615. </tr>
  616. <tr class='color_0'>
  617. <td>
  618. Total:
  619. </td>
  620. <td colspan='2'>
  621. <?=($page->win_lose[0] + $page->win_lose[1])?>
  622. </td>
  623. </tr>
  624. </table>
  625. </div>
  626. <div id='drop_type' class='diagram'>
  627. <h3>
  628. Drop rate
  629. </h3>
  630. <canvas id='diagram_drop_type' width='200' height='200'></canvas>
  631. <table class='legend'>
  632. <?php
  633. // Do some calculations
  634. $rune = $page->drop_type["rune"];
  635. $rucr = $page->drop_type["rune_craft"];
  636. $item = $page->drop_type["item"];
  637. $sedu = $page->drop_type["sd"];
  638. $shap = $page->drop_type["shapeshifting"];
  639. $unit = $page->drop_type["unit"];
  640. $total = $rune + $rucr + $item + $sedu + $shap + $unit;
  641. // Fix divisions by 0:
  642. if ($total == 0){
  643. $total ++;
  644. }
  645. ?>
  646. <tr class='color_1'>
  647. <td>
  648. Rune:
  649. </td>
  650. <td>
  651. <?=$rune?>
  652. </td>
  653. <td>
  654. (<?=number_format(($rune * 100) / $total, 2, ".", ",")?>%)
  655. </td>
  656. </tr>
  657. <tr class='color_2'>
  658. <td>
  659. Rune craft item:
  660. </td>
  661. <td>
  662. <?=$rucr?>
  663. </td>
  664. <td>
  665. (<?=number_format(($rucr * 100) / $total, 2, ".", ",")?>%)
  666. </td>
  667. </tr>
  668. <tr class='color_3'>
  669. <td>
  670. Item:
  671. </td>
  672. <td>
  673. <?=$item?>
  674. </td>
  675. <td>
  676. (<?=number_format(($item * 100) / $total, 2, ".", ",")?>%)
  677. </td>
  678. </tr>
  679. <tr class='color_4'>
  680. <td>
  681. Secret Dungeon:
  682. </td>
  683. <td>
  684. <?=$sedu?>
  685. </td>
  686. <td>
  687. (<?=number_format(($sedu * 100) / $total, 2, ".", ",")?>%)
  688. </td>
  689. </tr>
  690. <tr class='color_5'>
  691. <td>
  692. Transmog Stone:
  693. </td>
  694. <td>
  695. <?=$shap?>
  696. </td>
  697. <td>
  698. (<?=number_format(($shap * 100) / $total, 2, ".", ",")?>%)
  699. </td>
  700. </tr>
  701. <tr class='color_6'>
  702. <td>
  703. Unit:
  704. </td>
  705. <td>
  706. <?=$unit?>
  707. </td>
  708. <td>
  709. (<?=number_format(($unit * 100) / $total, 2, ".", ",")?>%)
  710. </td>
  711. </tr>
  712. </table>
  713. </div>
  714. <div id='drop_rune_slot' class='diagram'>
  715. <h3>
  716. Rune drops by slot
  717. </h3>
  718. <canvas id='diagram_rune_slot' width='200' height='200'></canvas>
  719. <table class='legend'>
  720. <?php
  721. $total = array_sum($page->drop_rune_slot);
  722. // Fix divisions by 0:
  723. if ($total == 0){
  724. $total ++;
  725. }
  726. for ($i = 1; $i <= 6; $i ++){
  727. $val = $page->drop_rune_slot[strval($i)]
  728. ?>
  729. <tr class='color_0'>
  730. <td>
  731. Slot <?=$i?>:
  732. </td>
  733. <td>
  734. <?=$val?>
  735. </td>
  736. <td>
  737. (<?=number_format(($val * 100) / $total, 2, ".", ",")?>%)
  738. </td>
  739. </tr>
  740. <?php
  741. }
  742. ?>
  743. </table>
  744. </div>
  745. <div id='drop_rune_stars' class='diagram'>
  746. <h3>
  747. Rune drops by stars
  748. </h3>
  749. <canvas id='diagram_rune_stars' width='200' height='200'></canvas>
  750. <table class='legend'>
  751. <?php
  752. $total = array_sum($page->drop_rune_stars);
  753. // Fix divisions by 0:
  754. if ($total == 0){
  755. $total ++;
  756. }
  757. for ($i = 6; $i >= 1; $i --){
  758. $val = $page->drop_rune_stars[strval($i)]
  759. ?>
  760. <tr class='color_0'>
  761. <td>
  762. <?php
  763. for ($j = 1; $j <= $i; $j ++){
  764. ?>
  765. <img class='star star_gold' src='<?=URL::IMG["ICON"]?>star.png'/>
  766. <?php
  767. }
  768. ?>
  769. </td>
  770. <td>
  771. <?=$val?>
  772. </td>
  773. <td>
  774. (<?=number_format(($val * 100) / $total, 2, ".", ",")?>%)
  775. </td>
  776. </tr>
  777. <?php
  778. }
  779. ?>
  780. </table>
  781. </div>
  782. <div id='drop_rune_quality' class='diagram'>
  783. <h3>
  784. Rune drops by quality
  785. </h3>
  786. <canvas id='diagram_rune_quality' width='200' height='200'></canvas>
  787. <table class='legend'>
  788. <?php
  789. $total = array_sum($page->drop_rune_quality);
  790. // Fix divisions by 0:
  791. if ($total == 0){
  792. $total ++;
  793. }
  794. ?>
  795. <tr class='color_legend'>
  796. <td>
  797. Legend:
  798. </td>
  799. <td>
  800. <?=$page->drop_rune_quality[QUALITY_ID::LEGEND]?>
  801. </td>
  802. <td>
  803. (<?=number_format(($page->drop_rune_quality[QUALITY_ID::LEGEND] * 100) / $total, 2, ".", ",")?>%)
  804. </td>
  805. </tr>
  806. <tr class='color_hero'>
  807. <td>
  808. Hero:
  809. </td>
  810. <td>
  811. <?=$page->drop_rune_quality[QUALITY_ID::HERO]?>
  812. </td>
  813. <td>
  814. (<?=number_format(($page->drop_rune_quality[QUALITY_ID::HERO] * 100) / $total, 2, ".", ",")?>%)
  815. </td>
  816. </tr>
  817. <tr class='color_rare'>
  818. <td>
  819. Rare:
  820. </td>
  821. <td>
  822. <?=$page->drop_rune_quality[QUALITY_ID::RARE]?>
  823. </td>
  824. <td>
  825. (<?=number_format(($page->drop_rune_quality[QUALITY_ID::RARE] * 100) / $total, 2, ".", ",")?>%)
  826. </td>
  827. </tr>
  828. <tr class='color_magic'>
  829. <td>
  830. Magic:
  831. </td>
  832. <td>
  833. <?=$page->drop_rune_quality[QUALITY_ID::MAGIC]?>
  834. </td>
  835. <td>
  836. (<?=number_format(($page->drop_rune_quality[QUALITY_ID::MAGIC] * 100) / $total, 2, ".", ",")?>%)
  837. </td>
  838. </tr>
  839. <tr class='color_normal'>
  840. <td>
  841. Normal:
  842. </td>
  843. <td>
  844. <?=$page->drop_rune_quality[QUALITY_ID::NORMAL]?>
  845. </td>
  846. <td>
  847. (<?=number_format(($page->drop_rune_quality[QUALITY_ID::NORMAL] * 100) / $total, 2, ".", ",")?>%)
  848. </td>
  849. </tr>
  850. </table>
  851. </div>
  852. </article>
  853. </section>
  854. <?php
  855. }
  856. ?>
  857. </main>
  858. <?php
  859. include __DIR__ . "/inc/footer.php";
  860. ?>
  861. </body>
  862. </html>