* @license https://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License V3 * @package SWDB */ require_once(PATH::PAGE . "Page.php"); require_once(PATH::ENTITY . "Artifact.php"); require_once(PATH::ENTITY . "Unit.php"); /** * Artifact list page model. * * @category Page */ class Artifacts_Page extends Page{ /** * @var mixed[] Page filters */ private $filters = [ "TYPE" => 0, "ELEMENT" => [], "ARCHETYPE" => [], "MAIN" => [], "MIN_QUALITY" => QUALITY_ID::NORMAL, "MAX_QUALITY" => QUALITY_ID::LEGEND, "MIN_ORIGINAL_QUALITY" => QUALITY_ID::NORMAL, "MAX_ORIGINAL_QUALITY" => QUALITY_ID::LEGEND, "MIN_LEVEL" => 0, "MAX_LEVEL" => 15, "MIN_EFFICIENCY" => 0, "MAX_EFFICIENCY" => 100, "MIN_MAX_EFFICIENCY" => 0, "MAX_MAX_EFFICIENCY" => 100, "ASSIGNED" => 1 ]; /** * @var Artifact[] Artiffacts to show. * * In this case, the monster member is not the id, but a monster * instance. */ private $artifacts = []; /** * Constructor. * * Retrieves the data and initializes the variables. */ public function __construct(){ $this->view = PATH::VIEW . "artifacts.php"; $this->parse_filters(); $result_set = $this->prepare_statement()->execute(); while ($result = $result_set->fetchArray(SQLITE3_ASSOC)){ array_push($this->artifacts, new Artifact($result["id"])); } $this->title = "Artifacts - SWDB"; $this->description = "Artifact inventory"; $this->canonical = URL::BASE . "artifacts/"; } /** * Parses the request looking for the selected filters, validates them * and adds them to the $filters array. */ private function parse_filters(){ if (isset($_GET["element"])){ $elements = $_GET["element"]; foreach ($elements as $element){ array_push($this->filters["ELEMENT"], intval($element)); } } if (isset($_GET["archetype"])){ $archetypes = $_GET["archetype"]; foreach ($archetypes as $archetype){ array_push($this->filters["ARCHETYPE"], intval($archetype)); } } if (isset($_GET["main_stat"])){ $mains = $_GET["main_stat"]; foreach ($mains as $main){ array_push($this->filters["MAIN"], intval($main)); } } if (isset($_GET["min_level"]) && intval($_GET["min_level"]) >= 0 && intval($_GET["min_level"]) <= 15){ $this->filters["MIN_LEVEL"] = $_GET["min_level"]; } if (isset($_GET["max_level"]) && intval($_GET["max_level"]) >= 0 && intval($_GET["max_level"]) <= 15){ $this->filters["MAX_LEVEL"] = $_GET["max_level"]; } if (isset($_GET["min_quality"]) && intval($_GET["min_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["min_quality"]) <= QUALITY_ID::LEGEND){ $this->filters["MIN_QUALITY"] = $_GET["min_quality"]; } if (isset($_GET["max_quality"]) && intval($_GET["max_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["max_quality"]) <= QUALITY_ID::LEGEND){ $this->filters["MAX_QUALITY"] = $_GET["max_quality"]; } if (isset($_GET["min_original_quality"]) && intval($_GET["min_original_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["min_original_quality"]) <= QUALITY_ID::LEGEND){ $this->filters["MIN_ORIGINAL_QUALITY"] = $_GET["min_original_quality"]; } if (isset($_GET["max_original_quality"]) && intval($_GET["max_original_quality"]) >= QUALITY_ID::NORMAL && intval($_GET["max_original_quality"]) <= QUALITY_ID::LEGEND){ $this->filters["MAX_ORIGINAL_QUALITY"] = $_GET["max_original_quality"]; } if (isset($_GET["assigned"]) && intval($_GET["assigned"]) >= 0 && intval($_GET["assigned"]) <= 4){ $this->filters["ASSIGNED"] = $_GET["assigned"]; } } /** * Prepares the statement to execute against the database using the filter values. * * @return SQLite3Stmt prepared statement. */ private function prepare_statement(){ // Common items $query = " SELECT id FROM artifact WHERE player = :player AND level BETWEEN :min_level AND :max_level AND quality BETWEEN :min_quality AND :max_quality AND original_quality BETWEEN :min_original_quality AND :max_original_quality AND efficiency BETWEEN :min_efficiency AND :max_efficiency AND max_efficiency BETWEEN :min_max_efficiency AND :max_max_efficiency "; // Some main stat selected. if (count($this->filters["MAIN"]) > 0){ $query .= " AND id IN (SELECT artifact FROM artifact_stat WHERE stat IN ("; for ($i = 0; $i < sizeof($this->filters["MAIN"]); $i ++){ $query .= ":main_$i, "; } $query = rtrim($query, ", ") . ")) "; } // Elements / archetypes selected if (count($this->filters["ELEMENT"]) > 0 || count($this->filters["ARCHETYPE"]) > 0){ $query .= " AND (attribute IN ( "; for ($i = 0; $i < sizeof($this->filters["ELEMENT"]); $i ++){ $query .= ":element_$i, "; } $query = rtrim($query, ", ") . ") OR archetype IN ("; for ($i = 0; $i < sizeof($this->filters["ARCHETYPE"]); $i ++){ $query .= ":archetype_$i, "; } $query = rtrim($query, ", ") . ")) "; } // Assigned status switch ($this->filters["ASSIGNED"]){ case 0: // Assigned or unassigned. break; case 1: // Assigned. $query .= " AND id IN ( SELECT DISTINCT artifact FROM unit_artifact WHERE rta = :rta) "; break; case 2: // Unassigned. $query .= " AND id NOT IN ( SELECT DISTINCT artifact FROM unit_artifact WHERE rta = :rta) "; break; case 3: // Unassigned or assignet to monsters not in storage. $query .= " AND ( id NOT IN ( SELECT DISTINCT artifact FROM unit_artifact WHERE rta = :rta ) OR ( id IN ( SELECT DISTINCT unit_artifact.artifact FROM unit_artifact, unit WHERE unit_artifact.rta = :rta AND unit_artifact.unit = unit.id AND unit.building = :storage_building ) ) )"; break; case 4: //Assigned to monsters not in storage. $query .= " AND ( id IN ( SELECT DISTINCT unit_artifact.artifact FROM unit_artifact, unit WHERE unit_artifact.rta = :rta AND unit_artifact.unit = unit.id AND unit.building = :storage_building ) )"; break; } $query .= " ORDER BY type, attribute, archetype, level DESC, original_quality DESC;"; $statement = get_context()->get_db()->prepare($query); $statement->bindValue(":rta", get_context()->get_game_mode(), SQLITE3_INTEGER); $statement->bindValue(":player", get_context()->get_player()->get_id(), SQLITE3_TEXT); $statement->bindValue(":min_level", $this->filters["MIN_LEVEL"], SQLITE3_INTEGER); $statement->bindValue(":max_level", $this->filters["MAX_LEVEL"], SQLITE3_INTEGER); $statement->bindValue(":min_quality", $this->filters["MIN_QUALITY"], SQLITE3_INTEGER); $statement->bindValue(":max_quality", $this->filters["MAX_QUALITY"], SQLITE3_INTEGER); $statement->bindValue(":min_original_quality", $this->filters["MIN_ORIGINAL_QUALITY"], SQLITE3_INTEGER); $statement->bindValue(":max_original_quality", $this->filters["MAX_ORIGINAL_QUALITY"], SQLITE3_INTEGER); $statement->bindValue(":min_efficiency", $this->filters["MIN_EFFICIENCY"], SQLITE3_FLOAT); $statement->bindValue(":max_efficiency", $this->filters["MAX_EFFICIENCY"], SQLITE3_FLOAT); $statement->bindValue(":min_max_efficiency", $this->filters["MIN_MAX_EFFICIENCY"], SQLITE3_FLOAT); $statement->bindValue(":max_max_efficiency", $this->filters["MAX_MAX_EFFICIENCY"], SQLITE3_FLOAT); for ($i = 0; $i < sizeof($this->filters["MAIN"]); $i ++){ $statement->bindValue(":main_$i", $this->filters["MAIN"][$i], SQLITE3_INTEGER); } for ($i = 0; $i < sizeof($this->filters["ELEMENT"]); $i ++){ $statement->bindValue(":element_$i", $this->filters["ELEMENT"][$i], SQLITE3_INTEGER); } for ($i = 0; $i < sizeof($this->filters["ARCHETYPE"]); $i ++){ $statement->bindValue(":archetype_$i", $this->filters["ARCHETYPE"][$i], SQLITE3_INTEGER); } $statement->bindValue(":storage_building", BUILDING_ID::MONSTER_STORAGE, SQLITE3_INTEGER); return $statement; } /** * Retrieves the page filters. * * @return mixed[] Page filtes */ public function get_filters(){ return $this->filters; } /** * Retrieves one filter. * * @param string $key * @return mixed Filter value, null if if doesn't exist. */ public function get_filter($key){ if (array_key_exists($key, $this->filters)){ return $this->filters[$key]; } else{ return null; } } /** * Retrieves the selection of artifacts. * * @return Artifact[] Artifacts to show on the page. */ public function get_artifacts(){ return $this->artifacts; } }