Artifacts_Page.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. /**
  3. * Artifact list page file.
  4. *
  5. * Provides a class with all the properties and methods to display the page.
  6. *
  7. * @author Iñigo Valentin <i@inigovalentin.com>
  8. * @license https://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License V3
  9. * @package SWDB
  10. */
  11. require_once(PATH::PAGE . "Page.php");
  12. require_once(PATH::ENTITY . "Artifact.php");
  13. require_once(PATH::ENTITY . "Unit.php");
  14. /**
  15. * Artifact list page model.
  16. *
  17. * @category Page
  18. */
  19. class Artifacts_Page extends Page{
  20. /**
  21. * @var mixed[] Page filters
  22. */
  23. private $filters = [
  24. "TYPE" => 0,
  25. "ELEMENT" => [],
  26. "ARCHETYPE" => [],
  27. "MAIN" => [],
  28. "MIN_QUALITY" => QUALITY_ID::NORMAL,
  29. "MAX_QUALITY" => QUALITY_ID::LEGEND,
  30. "MIN_ORIGINAL_QUALITY" => QUALITY_ID::NORMAL,
  31. "MAX_ORIGINAL_QUALITY" => QUALITY_ID::LEGEND,
  32. "MIN_LEVEL" => 0,
  33. "MAX_LEVEL" => 15,
  34. "MIN_EFFICIENCY" => 0,
  35. "MAX_EFFICIENCY" => 100,
  36. "MIN_MAX_EFFICIENCY" => 0,
  37. "MAX_MAX_EFFICIENCY" => 100,
  38. "ASSIGNED" => 1
  39. ];
  40. /**
  41. * @var Artifact[] Artiffacts to show.
  42. *
  43. * In this case, the monster member is not the id, but a monster
  44. * instance.
  45. */
  46. private $artifacts = [];
  47. /**
  48. * Constructor.
  49. *
  50. * Retrieves the data and initializes the variables.
  51. */
  52. public function __construct(){
  53. parent::__construct();
  54. $this->set_public(true);
  55. $this->set_view("artifacts.php");
  56. $this->set_title("Artifacts");
  57. $this->set_description(get_context()->get_player()->get_name() . "'s artifacts");
  58. $this->set_canonical("player/" . get_context()->get_player()->get_id() . "/artifacts/");
  59. $this->add_css("artifacts.css");
  60. $this->parse_filters();
  61. $result_set = $this->prepare_statement()->execute();
  62. while ($result = $result_set->fetchArray(SQLITE3_ASSOC)){
  63. array_push($this->artifacts, new Artifact($result["id"]));
  64. }
  65. $this->set_code(200);
  66. $this->set_message("OK");
  67. }
  68. /**
  69. * Parses the request looking for the selected filters, validates them
  70. * and adds them to the $filters array.
  71. */
  72. private function parse_filters(){
  73. if (isset($_GET["element"])){
  74. $elements = $_GET["element"];
  75. foreach ($elements as $element){
  76. array_push($this->filters["ELEMENT"], intval($element));
  77. }
  78. }
  79. if (isset($_GET["archetype"])){
  80. $archetypes = $_GET["archetype"];
  81. foreach ($archetypes as $archetype){
  82. array_push($this->filters["ARCHETYPE"], intval($archetype));
  83. }
  84. }
  85. if (isset($_GET["main_stat"])){
  86. $mains = $_GET["main_stat"];
  87. foreach ($mains as $main){
  88. array_push($this->filters["MAIN"], intval($main));
  89. }
  90. }
  91. if (isset($_GET["min_level"]) && intval($_GET["min_level"]) >= 0 && intval($_GET["min_level"]) <= 15){
  92. $this->filters["MIN_LEVEL"] = $_GET["min_level"];
  93. }
  94. if (isset($_GET["max_level"]) && intval($_GET["max_level"]) >= 0 && intval($_GET["max_level"]) <= 15){
  95. $this->filters["MAX_LEVEL"] = $_GET["max_level"];
  96. }
  97. if (isset($_GET["min_quality"]) && intval($_GET["min_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["min_quality"]) <= QUALITY_ID::LEGEND){
  98. $this->filters["MIN_QUALITY"] = $_GET["min_quality"];
  99. }
  100. if (isset($_GET["max_quality"]) && intval($_GET["max_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["max_quality"]) <= QUALITY_ID::LEGEND){
  101. $this->filters["MAX_QUALITY"] = $_GET["max_quality"];
  102. }
  103. if (isset($_GET["min_original_quality"]) && intval($_GET["min_original_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["min_original_quality"]) <= QUALITY_ID::LEGEND){
  104. $this->filters["MIN_ORIGINAL_QUALITY"] = $_GET["min_original_quality"];
  105. }
  106. if (isset($_GET["max_original_quality"]) && intval($_GET["max_original_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["max_original_quality"]) <= QUALITY_ID::LEGEND){
  107. $this->filters["MAX_ORIGINAL_QUALITY"] = $_GET["max_original_quality"];
  108. }
  109. if (isset($_GET["assigned"]) && intval($_GET["assigned"]) >= 0 && intval($_GET["assigned"]) <= 4){
  110. $this->filters["ASSIGNED"] = $_GET["assigned"];
  111. }
  112. }
  113. /**
  114. * Prepares the statement to execute against the database using the filter values.
  115. *
  116. * @return SQLite3Stmt prepared statement.
  117. */
  118. private function prepare_statement(){
  119. // Common items
  120. $query = "
  121. SELECT id
  122. FROM artifact
  123. WHERE
  124. player = :player AND
  125. level BETWEEN :min_level AND :max_level AND
  126. quality BETWEEN :min_quality AND :max_quality AND
  127. original_quality BETWEEN :min_original_quality AND :max_original_quality AND
  128. efficiency BETWEEN :min_efficiency AND :max_efficiency AND
  129. max_efficiency BETWEEN :min_max_efficiency AND :max_max_efficiency
  130. ";
  131. // Some main stat selected.
  132. if (count($this->filters["MAIN"]) > 0){
  133. $query .= " AND id IN (SELECT artifact FROM artifact_stat WHERE stat IN (";
  134. for ($i = 0; $i < sizeof($this->filters["MAIN"]); $i ++){
  135. $query .= ":main_$i, ";
  136. }
  137. $query = rtrim($query, ", ") . ")) ";
  138. }
  139. // Elements / archetypes selected
  140. if (count($this->filters["ELEMENT"]) > 0 || count($this->filters["ARCHETYPE"]) > 0){
  141. $query .= " AND (attribute IN ( ";
  142. for ($i = 0; $i < sizeof($this->filters["ELEMENT"]); $i ++){
  143. $query .= ":element_$i, ";
  144. }
  145. $query = rtrim($query, ", ") . ") OR archetype IN (";
  146. for ($i = 0; $i < sizeof($this->filters["ARCHETYPE"]); $i ++){
  147. $query .= ":archetype_$i, ";
  148. }
  149. $query = rtrim($query, ", ") . ")) ";
  150. }
  151. // Assigned status
  152. switch ($this->filters["ASSIGNED"]){
  153. case 0: // Assigned or unassigned.
  154. break;
  155. case 1: // Assigned.
  156. $query .= "
  157. AND id IN (
  158. SELECT DISTINCT artifact
  159. FROM unit_artifact
  160. WHERE rta = :rta) ";
  161. break;
  162. case 2: // Unassigned.
  163. $query .= "
  164. AND id NOT IN (
  165. SELECT DISTINCT artifact
  166. FROM unit_artifact
  167. WHERE rta = :rta) ";
  168. break;
  169. case 3: // Unassigned or assignet to monsters not in storage.
  170. $query .= "
  171. AND (
  172. id NOT IN (
  173. SELECT DISTINCT artifact
  174. FROM unit_artifact
  175. WHERE rta = :rta
  176. ) OR (
  177. id IN (
  178. SELECT DISTINCT unit_artifact.artifact
  179. FROM
  180. unit_artifact,
  181. unit
  182. WHERE
  183. unit_artifact.rta = :rta AND
  184. unit_artifact.unit = unit.id AND
  185. unit.building = :storage_building
  186. )
  187. )
  188. )";
  189. break;
  190. case 4: //Assigned to monsters not in storage.
  191. $query .= "
  192. AND (
  193. id IN (
  194. SELECT DISTINCT unit_artifact.artifact
  195. FROM
  196. unit_artifact,
  197. unit
  198. WHERE
  199. unit_artifact.rta = :rta AND
  200. unit_artifact.unit = unit.id AND
  201. unit.building = :storage_building
  202. )
  203. )";
  204. break;
  205. }
  206. $query .= " ORDER BY type, attribute, archetype, level DESC, original_quality DESC;";
  207. $statement = get_context()->get_db()->prepare($query);
  208. $statement->bindValue(":rta", get_context()->get_game_mode(), SQLITE3_INTEGER);
  209. $statement->bindValue(":player", get_context()->get_player()->get_id(), SQLITE3_TEXT);
  210. $statement->bindValue(":min_level", $this->filters["MIN_LEVEL"], SQLITE3_INTEGER);
  211. $statement->bindValue(":max_level", $this->filters["MAX_LEVEL"], SQLITE3_INTEGER);
  212. $statement->bindValue(":min_quality", $this->filters["MIN_QUALITY"], SQLITE3_INTEGER);
  213. $statement->bindValue(":max_quality", $this->filters["MAX_QUALITY"], SQLITE3_INTEGER);
  214. $statement->bindValue(":min_original_quality", $this->filters["MIN_ORIGINAL_QUALITY"], SQLITE3_INTEGER);
  215. $statement->bindValue(":max_original_quality", $this->filters["MAX_ORIGINAL_QUALITY"], SQLITE3_INTEGER);
  216. $statement->bindValue(":min_efficiency", $this->filters["MIN_EFFICIENCY"], SQLITE3_FLOAT);
  217. $statement->bindValue(":max_efficiency", $this->filters["MAX_EFFICIENCY"], SQLITE3_FLOAT);
  218. $statement->bindValue(":min_max_efficiency", $this->filters["MIN_MAX_EFFICIENCY"], SQLITE3_FLOAT);
  219. $statement->bindValue(":max_max_efficiency", $this->filters["MAX_MAX_EFFICIENCY"], SQLITE3_FLOAT);
  220. for ($i = 0; $i < sizeof($this->filters["MAIN"]); $i ++){
  221. $statement->bindValue(":main_$i", $this->filters["MAIN"][$i], SQLITE3_INTEGER);
  222. }
  223. for ($i = 0; $i < sizeof($this->filters["ELEMENT"]); $i ++){
  224. $statement->bindValue(":element_$i", $this->filters["ELEMENT"][$i], SQLITE3_INTEGER);
  225. }
  226. for ($i = 0; $i < sizeof($this->filters["ARCHETYPE"]); $i ++){
  227. $statement->bindValue(":archetype_$i", $this->filters["ARCHETYPE"][$i], SQLITE3_INTEGER);
  228. }
  229. $statement->bindValue(":storage_building", BUILDING_ID::MONSTER_STORAGE, SQLITE3_INTEGER);
  230. return $statement;
  231. }
  232. /**
  233. * Retrieves the page filters.
  234. *
  235. * @return mixed[] Page filtes
  236. */
  237. public function get_filters(){
  238. return $this->filters;
  239. }
  240. /**
  241. * Retrieves one filter.
  242. *
  243. * @param string $key
  244. * @return mixed Filter value, null if if doesn't exist.
  245. */
  246. public function get_filter($key){
  247. if (array_key_exists($key, $this->filters)){
  248. return $this->filters[$key];
  249. }
  250. else{
  251. return null;
  252. }
  253. }
  254. /**
  255. * Retrieves the selection of artifacts.
  256. *
  257. * @return Artifact[] Artifacts to show on the page.
  258. */
  259. public function get_artifacts(){
  260. return $this->artifacts;
  261. }
  262. }