Report_Runeupgrade_Page.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. <?php
  2. require_once($path["page"] . "Page.php");
  3. require_once($path["entity"] . "Custom_Filter.php");
  4. require_once($path["entity"] . "Unit.php");
  5. require_once($path["entity"] . "Rune.php");
  6. /**
  7. * Upgradeable runes report page.
  8. */
  9. class Report_Runeupgrade_Page extends Page{
  10. /**
  11. * Filtrs the eport can handle.
  12. */
  13. public $filters = [
  14. "monster_min_stars" => 5,
  15. "monster_max_stars" => 6,
  16. "monster_name" => "",
  17. "monster_in_storage" => false,
  18. "rune_min_stars" => 5,
  19. "rune_max_stars" => 6,
  20. "rune_min_level" => 0,
  21. "rune_max_level" => 15,
  22. "rune_min_quality" => 0,
  23. "rune_max_quality" => 5,
  24. "rune_min_original_quality" => 0,
  25. "rune_max_original_quality" => 5,
  26. "rune_min_efficiency" => 0,
  27. "rune_max_efficiency" => 100,
  28. "rune_min_max_efficiency" => 0,
  29. "rune_max_max_efficiency" => 100,
  30. "rune_slot" => [],
  31. "alternative_min_stars" => 5,
  32. "alternative_min_original_quality" => 0,
  33. "alternative_min_level" => 0,
  34. "alternative_condition" => 3,
  35. "alternative_source" => 0,
  36. ];
  37. /**
  38. * Custom filters for this page.
  39. */
  40. public $custom_filters = [];
  41. /**
  42. * List of available upgrades. Can be described as:
  43. * $upgrades = [
  44. * [
  45. * unit (Unit),
  46. * upgrade = [
  47. * [
  48. * rune (Rune),
  49. * alternative = [(Rune)]
  50. * ]
  51. * ]
  52. * ]
  53. * ]
  54. */
  55. public $upgrades = [];
  56. /**
  57. * Constructor.
  58. *
  59. * Retrieves the data and initializes the variables.
  60. *
  61. * @param SQLite3 $db Connection to the database.
  62. */
  63. public function __construct($db){
  64. global $path;
  65. global $root;
  66. global $UID;
  67. parent::__construct($db);
  68. $this->view = $path["view"] . "report_runeupgrade.php";
  69. $this->parse_filters();
  70. if (!isset($_GET["custom_filter"])){
  71. $s = $this->build_query();
  72. }
  73. else{
  74. $s = $this->build_custom_query($_GET["custom_filter"]);
  75. }
  76. $q = $this->db->query($s);
  77. $prev_monster = "";
  78. $prev_rune = "";
  79. $upgrade = null;
  80. $rupgrade = null;
  81. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  82. if ($r["unit"] != $prev_monster){
  83. if ($prev_rune != ""){
  84. array_push($upgrade["upgrade"], $rupgrade);
  85. }
  86. if ($prev_monster != ""){
  87. array_push($this->upgrades, $upgrade);
  88. }
  89. $prev_monster = $r["unit"];
  90. $prev_rune = "";
  91. $upgrade = [
  92. "unit" => new Unit($this->db, $r["unit"]),
  93. "upgrade" => [],
  94. ];
  95. $rupgrade = [
  96. "rune" => new Rune($this->db, $r["id"]),
  97. "alternative" => [],
  98. ];
  99. }
  100. if ($r["id"] != $prev_rune){
  101. if ($prev_rune != ""){
  102. array_push($upgrade["upgrade"], $rupgrade);
  103. }
  104. $prev_rune = $r["id"];
  105. $rupgrade = [
  106. "rune" => new Rune($this->db, $r["id"]),
  107. "alternative" => [],
  108. ];
  109. }
  110. $rune_alt = new Rune($this->db, $r["alternative"]);
  111. // If the alternative rune isassigned
  112. if ($this->filters["alternative_source"] > 0 && strlen($rune_alt->assigned_to) > 0){
  113. $rune_alt->assigned_to = new Unit($this->db, $rune_alt->assigned_to);
  114. }
  115. array_push($rupgrade["alternative"], $rune_alt);
  116. }
  117. // Last entries
  118. array_push($upgrade["upgrade"], $rupgrade);
  119. array_push($this->upgrades, $upgrade);
  120. // Get custom filters for the form
  121. $s = "
  122. SELECT id
  123. FROM filter
  124. WHERE
  125. uid = '$UID' AND
  126. page = 'REPORT_RUNEUPGRADE';
  127. ";
  128. $q = $this->db->query($s);
  129. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  130. array_push($this->custom_filters, new Custom_Filter($this->db, $r["id"]));
  131. }
  132. $this->title = "Replaceable runes - SWDB";
  133. $this->description = "Find equiped runes that can be substituted for better ones.";
  134. $this->canonical = $root . "report/runeupgrade/";
  135. }
  136. /**
  137. * Parses the filters passed in the request and sets $filters.
  138. * Filters must be in $_GET, nd the available ones are max_stars (1-6),
  139. * min_stars (1-6) and in_storage (on/off).
  140. */
  141. private function parse_filters(){
  142. global $QUALITY;
  143. // Monster
  144. if (isset($_GET["monster_min_stars"]) && intval($_GET["monster_min_stars"]) > 0 && intval($_GET["monster_min_stars"]) < 7){
  145. $this->filters["monster_min_stars"] = $_GET["monster_min_stars"];
  146. }
  147. if (isset($_GET["monster_max_stars"]) && intval($_GET["monster_max_stars"]) > 0 && intval($_GET["monster_max_stars"]) < 7){
  148. $this->filters["monster_max_stars"] = $_GET["monster_max_stars"];
  149. }
  150. if (isset($_GET["monster_in_storage"]) && $_GET["monster_in_storage"] == "on"){
  151. $this->filters["monster_in_storage"] = true;
  152. }
  153. else{
  154. $this->filters["monster_in_storage"] = false;
  155. }
  156. if (isset($_GET["monster_name"]) && strlen($_GET["monster_name"]) > 0){
  157. $this->filters["monster_name"] = SQLite3::escapeString($_GET["monster_name"]);
  158. }
  159. // Runes
  160. if (isset($_GET["rune_min_stars"]) && intval($_GET["rune_min_stars"]) > 0 && intval($_GET["rune_min_stars"]) < 7){
  161. $this->filters["rune_min_stars"] = $_GET["rune_min_stars"];
  162. }
  163. if (isset($_GET["rune_max_stars"]) && intval($_GET["rune_max_stars"]) > 0 && intval($_GET["rune_max_stars"]) < 7){
  164. $this->filters["rune_max_stars"] = $_GET["rune_max_stars"];
  165. }
  166. if (isset($_GET["rune_min_level"]) && intval($_GET["rune_min_level"]) >= 0 && intval($_GET["rune_min_level"]) <= 15){
  167. $this->filters["rune_min_level"] = $_GET["rune_min_level"];
  168. }
  169. if (isset($_GET["rune_max_level"]) && intval($_GET["rune_max_level"]) >= 0 && intval($_GET["rune_max_level"]) <= 15){
  170. $this->filters["rune_max_level"] = $_GET["rune_max_level"];
  171. }
  172. if (isset($_GET["rune_min_quality"]) && intval($_GET["rune_min_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_quality"]) <= $QUALITY["LEGEND"]){
  173. $this->filters["rune_min_quality"] = $_GET["rune_min_quality"];
  174. }
  175. if (isset($_GET["rune_max_quality"]) && intval($_GET["rune_max_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_quality"]) <= $QUALITY["LEGEND"]){
  176. $this->filters["rune_max_quality"] = $_GET["rune_max_quality"];
  177. }
  178. if (isset($_GET["rune_min_original_quality"]) && intval($_GET["rune_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_original_quality"]) <= $QUALITY["LEGEND"]){
  179. $this->filters["rune_min_original_quality"] = $_GET["rune_min_original_quality"];
  180. }
  181. if (isset($_GET["rune_max_original_quality"]) && intval($_GET["rune_max_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_original_quality"]) <= $QUALITY["LEGEND"]){
  182. $this->filters["rune_max_original_quality"] = $_GET["rune_max_original_quality"];
  183. }
  184. if (isset($_GET["rune_min_efficiency"]) && intval($_GET["rune_min_efficiency"]) >= 0 && intval($_GET["rune_min_efficiency"]) <= 100){
  185. $this->filters["rune_min_efficiency"] = $_GET["rune_min_efficiency"];
  186. }
  187. if (isset($_GET["rune_max_efficiency"]) && intval($_GET["rune_max_efficiency"]) >= 0 && intval($_GET["rune_max_efficiency"]) <= 100){
  188. $this->filters["rune_max_efficiency"] = $_GET["rune_max_efficiency"];
  189. }
  190. if (isset($_GET["rune_min_max_efficiency"]) && intval($_GET["rune_min_max_efficiency"]) >= 0 && intval($_GET["rune_min_max_efficiency"]) <= 100){
  191. $this->filters["rune_min_max_efficiency"] = $_GET["rune_min_max_efficiency"];
  192. }
  193. if (isset($_GET["rune_max_max_efficiency"]) && intval($_GET["rune_max_max_efficiency"]) >= 0 && intval($_GET["rune_max_max_efficiency"]) <= 100){
  194. $this->filters["rune_max_max_efficiency"] = $_GET["rune_max_max_efficiency"];
  195. }
  196. if (isset($_GET["rune_slot"])){
  197. $slots = $_GET["rune_slot"];
  198. foreach ($slots as $slot){
  199. if (intval($slot) >= 1 && intval($slot) < 7){
  200. array_push($this->filters["rune_slot"], intval($slot));
  201. }
  202. }
  203. }
  204. // Alternatives
  205. if (isset($_GET["alternative_min_stars"]) && intval($_GET["alternative_min_stars"]) > 0 && intval($_GET["alternative_min_stars"]) < 7){
  206. $this->filters["alternative_min_stars"] = $_GET["alternative_min_stars"];
  207. }
  208. if (isset($_GET["alternative_min_level"]) && intval($_GET["alternative_min_level"]) >= 0 && intval($_GET["alternative_min_level"]) <= 15){
  209. $this->filters["alternative_min_level"] = $_GET["alternative_min_level"];
  210. }
  211. if (isset($_GET["alternative_min_original_quality"]) && intval($_GET["alternative_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["alternative_min_original_quality"]) <= $QUALITY["LEGEND"]){
  212. $this->filters["alternative_min_original_quality"] = $_GET["alternative_min_original_quality"];
  213. }
  214. if (isset($_GET["alternative_condition"]) && intval($_GET["alternative_condition"]) >= 0 && intval($_GET["alternative_condition"]) <= $QUALITY["LEGEND"]){
  215. $this->filters["alternative_condition"] = $_GET["alternative_condition"];
  216. }
  217. if (isset($_GET["alternative_source"]) && intval($_GET["alternative_source"]) >= 0 && intval($_GET["alternative_source"]) <= 2){
  218. $this->filters["alternative_source"] = $_GET["alternative_source"];
  219. }
  220. return;
  221. }
  222. /**
  223. * Builds the query to the rune table using the a custom filter.
  224. *
  225. * @param int $filter Custom filter ID.
  226. * @return The query to be executed.
  227. */
  228. private function build_custom_query($filter){
  229. global $UID;
  230. $s = "
  231. SELECT condition
  232. FROM filter
  233. WHERE
  234. uid = '$UID' AND
  235. id = $filter;
  236. ";
  237. $q = $this->db->query($s);
  238. $r = $q->fetchArray(SQLITE3_ASSOC);
  239. $cond = $r["condition"];
  240. $s = "
  241. SELECT
  242. unit.id AS unit,
  243. rune.id AS id,
  244. rune_alt.id AS alternative
  245. FROM
  246. rune,
  247. rune rune_alt,
  248. unit,
  249. k_unit
  250. WHERE
  251. unit.uid = '$UID' AND
  252. rune.uid = '$UID' AND
  253. rune_alt.uid = '$UID' AND
  254. unit.id = rune.assigned_to AND
  255. unit.unit = k_unit.id AND
  256. rune.type = rune_alt.type AND
  257. rune.slot = rune_alt.slot AND
  258. rune.main_stat = rune_alt.main_stat AND
  259. rune.id <> rune_alt.id AND
  260. (
  261. $cond
  262. )
  263. ORDER BY
  264. unit.stars DESC,
  265. unit.level DESC,
  266. unit.id,
  267. rune.slot,
  268. id,
  269. rune_alt.stars DESC,
  270. rune_alt.original_quality DESC,
  271. rune_alt.main_stat_value DESC;
  272. ";
  273. return $s;
  274. }
  275. /**
  276. * Builds the query for the page, using the providded or default filters.
  277. *
  278. * @return The query to be executed.
  279. */
  280. private function build_query(){
  281. global $UID;
  282. $s = "
  283. SELECT
  284. unit.id AS unit,
  285. rune.id AS id,
  286. rune_alt.id AS alternative
  287. FROM
  288. rune,
  289. rune rune_alt,
  290. unit,
  291. k_unit
  292. WHERE
  293. unit.uid = '$UID' AND
  294. rune.uid = '$UID' AND
  295. rune_alt.uid = '$UID' AND
  296. unit.id = rune.assigned_to AND
  297. unit.unit = k_unit.id AND
  298. unit.stars >= " . $this->filters["monster_min_stars"] . " AND
  299. unit.stars <= " . $this->filters["monster_max_stars"] . " AND
  300. rune.stars >= " . $this->filters["rune_min_stars"] . " AND
  301. rune.stars <= " . $this->filters["rune_max_stars"] . " AND
  302. rune.level >= " . $this->filters["rune_min_level"] . " AND
  303. rune.level <= " . $this->filters["rune_max_level"] . " AND
  304. rune.quality >= " . $this->filters["rune_min_quality"] . " AND
  305. rune.quality <= " . $this->filters["rune_max_quality"] . " AND
  306. rune.original_quality >= " . $this->filters["rune_min_original_quality"] . " AND
  307. rune.original_quality <= " . $this->filters["rune_max_original_quality"] . " AND
  308. rune.efficiency >= " . $this->filters["rune_min_efficiency"] . " AND
  309. rune.efficiency <= " . $this->filters["rune_max_efficiency"] . " AND
  310. rune.max_efficiency >= " . $this->filters["rune_min_max_efficiency"] . " AND
  311. rune.max_efficiency <= " . $this->filters["rune_max_max_efficiency"] . " AND
  312. rune.type = rune_alt.type AND
  313. rune.slot = rune_alt.slot AND
  314. rune.main_stat = rune_alt.main_stat AND
  315. rune.id <> rune_alt.id AND
  316. rune_alt.stars >= " . $this->filters["alternative_min_stars"] . " AND
  317. rune_alt.level >= " . $this->filters["alternative_min_level"] . " AND
  318. rune_alt.original_quality >= " . $this->filters["alternative_min_original_quality"] . " AND
  319. ";
  320. switch ($this->filters["alternative_source"]){
  321. case 0: // Unassigned
  322. $s = $s . " rune_alt.assigned_to IS NULL AND ";
  323. break;
  324. case 1: // Unassigned or assigned to lower star monsters
  325. $s = $s . "
  326. (
  327. rune_alt.assigned_to IS NULL OR
  328. rune_alt.assigned_to IN (SELECT id FROM unit m WHERE m.stars < unit.stars)
  329. ) AND
  330. ";
  331. break;
  332. // Case 2: Assigned or unassigned.
  333. }
  334. switch ($this->filters["alternative_condition"]){
  335. case 0: // Higher grade, any quality
  336. $s = $s .
  337. " rune_alt.stars >= rune.stars ";
  338. break;
  339. case 1: // Higher grade or higher quality
  340. $s = $s .
  341. " ( " .
  342. " rune_alt.stars > rune.stars OR " .
  343. " rune_alt.original_quality > rune.original_quality " .
  344. " ) ";
  345. break;
  346. case 2: // Equal or higher grade and equal or higher quality
  347. $s = $s .
  348. " rune_alt.stars >= rune.stars AND " .
  349. " rune_alt.original_quality >= rune.original_quality ";
  350. break;
  351. case 3: // Equal or higher grade and higher quality
  352. $s = $s .
  353. " rune_alt.stars >= rune.stars AND " .
  354. " rune_alt.original_quality > rune.original_quality ";
  355. break;
  356. case 4: // Equal grade and equal or higher quality
  357. $s = $s .
  358. " rune_alt.stars > rune.stars AND " .
  359. " rune_alt.original_quality >= rune.original_quality ";
  360. break;
  361. default: // Case 5: Higher grade and higher quality
  362. $s = $s .
  363. " rune_alt.stars > rune.stars AND " .
  364. " rune_alt.original_quality > rune.original_quality ";
  365. break;
  366. }
  367. if (strlen($this->filters["monster_name"]) > 0){
  368. $s = $s . " AND upper(k_unit.name) LIKE = upper('%" . $this->filters["monster_name"] . "%') ";
  369. }
  370. if (!$this->filters["monster_in_storage"]){
  371. //$s = $s . " AND unit.in_storage = 0 ";
  372. }
  373. if (count($this->filters["rune_slot"]) > 0){
  374. $s = $s . " AND rune.slot IN ( ";
  375. foreach($this->filters["rune_slot"] as $t){
  376. $s = $s . "$t, ";
  377. }
  378. $s = $s . "-1) ";
  379. }
  380. $s = $s . "
  381. ORDER BY
  382. unit.stars DESC,
  383. unit.level DESC,
  384. unit.id,
  385. rune.slot,
  386. id,
  387. rune_alt.stars DESC,
  388. rune_alt.original_quality DESC,
  389. rune_alt.main_stat_value DESC;
  390. ";
  391. return $s;
  392. }
  393. }
  394. ?>