stats.php 43 KB

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