db = $db; } } /** * Upgradeable runes report page. */ class Report_Runeupgrade_Page extends Page{ /** * Filtrs the eport can handle. */ public $filters = [ "monster_min_stars" => 5, "monster_max_stars" => 6, "monster_name" => "", "monster_in_storage" => false, "rune_min_stars" => 5, "rune_max_stars" => 6, "rune_min_level" => 0, "rune_max_level" => 15, "rune_min_quality" => 0, "rune_max_quality" => 4, "rune_min_original_quality" => 0, "rune_max_original_quality" => 4, "rune_min_efficiency" => 0, "rune_max_efficiency" => 100, "rune_min_max_efficiency" => 0, "rune_max_max_efficiency" => 100, "rune_slot" => [], "alternative_min_stars" => 5, "alternative_min_original_quality" => 0, "alternative_min_level" => 0, "alternative_condition" => 3, "alternative_source" => 0, ]; /** * List of available upgrades. Can be described as: * $upgrades = [ * [ * unit (Unit), * upgrade = [ * [ * rune (Rune), * alternative = [(Rune)] * ] * ] * ] * ] */ public $upgrades = []; /** * Constructor. * * Retrieves the data and initializes the variables. * * @param SQLite3 $db Connection to the database. */ public function __construct($db){ global $path; global $root; parent::__construct($db); $this->view = $path["view"] . "report_runeupgrade.php"; $this->parse_filters(); $s = $this->build_query(); $q = $this->db->query($s); $prev_monster = ""; $prev_rune = ""; $upgrade = null; $rupgrade = null; while ($r = $q->fetchArray(SQLITE3_ASSOC)){ if ($r["unit"] != $prev_monster){ if ($prev_rune != ""){ array_push($upgrade["upgrade"], $rupgrade); } if ($prev_monster != ""){ array_push($this->upgrades, $upgrade); } $prev_monster = $r["unit"]; $prev_rune = ""; $upgrade = [ "unit" => new Unit($this->db, $r["unit"]), "upgrade" => [], ]; $rupgrade = [ "rune" => new Rune($this->db, $r["id"]), "alternative" => [], ]; } if ($r["id"] != $prev_rune){ if ($prev_rune != ""){ array_push($upgrade["upgrade"], $rupgrade); } $prev_rune = $r["id"]; $rupgrade = [ "rune" => new Rune($this->db, $r["id"]), "alternative" => [], ]; } $rune_alt = new Rune($this->db, $r["alternative"]); // If the alternative rune isassigned if ($this->filters["alternative_source"] > 0 && strlen($rune_alt->assigned_to) > 0){ $rune_alt->assigned_to = new Unit($this->db, $rune_alt->assigned_to); } array_push($rupgrade["alternative"], $rune_alt); } // Last entries array_push($upgrade["upgrade"], $rupgrade); array_push($this->upgrades, $upgrade); $this->title = "Replaceable runes - SWDB"; $this->description = "Find equiped runes that can be substituted for better ones."; $this->canonical = $root . "report/runeupgrade/"; } /** * Parses the filters passed in the request and sets $filters. * Filters must be in $_GET, nd the available ones are max_stars (1-6), * min_stars (1-6) and in_storage (on/off). */ private function parse_filters(){ global $QUALITY; // Monster if (isset($_GET["monster_min_stars"]) && intval($_GET["monster_min_stars"]) > 0 && intval($_GET["monster_min_stars"]) < 7){ $this->filters["monster_min_stars"] = $_GET["monster_min_stars"]; } if (isset($_GET["monster_max_stars"]) && intval($_GET["monster_max_stars"]) > 0 && intval($_GET["monster_max_stars"]) < 7){ $this->filters["monster_max_stars"] = $_GET["monster_max_stars"]; } if (isset($_GET["monster_in_storage"]) && $_GET["monster_in_storage"] == "on"){ $this->filters["monster_in_storage"] = true; } else{ $this->filters["monster_in_storage"] = false; } if (isset($_GET["monster_name"]) && strlen($_GET["monster_name"]) > 0){ $this->filters["monster_name"] = SQLite3::escapeString($_GET["monster_name"]); } // Runes if (isset($_GET["rune_min_stars"]) && intval($_GET["rune_min_stars"]) > 0 && intval($_GET["rune_min_stars"]) < 7){ $this->filters["rune_min_stars"] = $_GET["rune_min_stars"]; } if (isset($_GET["rune_max_stars"]) && intval($_GET["rune_max_stars"]) > 0 && intval($_GET["rune_max_stars"]) < 7){ $this->filters["rune_max_stars"] = $_GET["rune_max_stars"]; } if (isset($_GET["rune_min_level"]) && intval($_GET["rune_min_level"]) >= 0 && intval($_GET["rune_min_level"]) <= 15){ $this->filters["rune_min_level"] = $_GET["rune_min_level"]; } if (isset($_GET["rune_max_level"]) && intval($_GET["rune_max_level"]) >= 0 && intval($_GET["rune_max_level"]) <= 15){ $this->filters["rune_max_level"] = $_GET["rune_max_level"]; } if (isset($_GET["rune_min_quality"]) && intval($_GET["rune_min_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_quality"]) <= $QUALITY["LEGEND"]){ $this->filters["rune_min_quality"] = $_GET["rune_min_quality"]; } if (isset($_GET["rune_max_quality"]) && intval($_GET["rune_max_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_quality"]) <= $QUALITY["LEGEND"]){ $this->filters["rune_max_quality"] = $_GET["rune_max_quality"]; } if (isset($_GET["rune_min_original_quality"]) && intval($_GET["rune_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_min_original_quality"]) <= $QUALITY["LEGEND"]){ $this->filters["rune_min_original_quality"] = $_GET["rune_min_original_quality"]; } if (isset($_GET["rune_max_original_quality"]) && intval($_GET["rune_max_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["rune_max_original_quality"]) <= $QUALITY["LEGEND"]){ $this->filters["rune_max_original_quality"] = $_GET["rune_max_original_quality"]; } if (isset($_GET["rune_min_efficiency"]) && intval($_GET["rune_min_efficiency"]) >= 0 && intval($_GET["rune_min_efficiency"]) <= 100){ $this->filters["rune_min_efficiency"] = $_GET["rune_min_efficiency"]; } if (isset($_GET["rune_max_efficiency"]) && intval($_GET["rune_max_efficiency"]) >= 0 && intval($_GET["rune_max_efficiency"]) <= 100){ $this->filters["rune_max_efficiency"] = $_GET["rune_max_efficiency"]; } if (isset($_GET["rune_min_max_efficiency"]) && intval($_GET["rune_min_max_efficiency"]) >= 0 && intval($_GET["rune_min_max_efficiency"]) <= 100){ $this->filters["rune_min_max_efficiency"] = $_GET["rune_min_max_efficiency"]; } if (isset($_GET["rune_max_max_efficiency"]) && intval($_GET["rune_max_max_efficiency"]) >= 0 && intval($_GET["rune_max_max_efficiency"]) <= 100){ $this->filters["rune_max_max_efficiency"] = $_GET["rune_max_max_efficiency"]; } if (isset($_GET["rune_slot"])){ $slots = $_GET["rune_slot"]; foreach ($slots as $slot){ if (intval($slot) >= 1 && intval($slot) < 7){ array_push($this->filters["rune_slot"], intval($slot)); } } } // Alternatives if (isset($_GET["alternative_min_stars"]) && intval($_GET["alternative_min_stars"]) > 0 && intval($_GET["alternative_min_stars"]) < 7){ $this->filters["alternative_min_stars"] = $_GET["alternative_min_stars"]; } if (isset($_GET["alternative_min_level"]) && intval($_GET["alternative_min_level"]) >= 0 && intval($_GET["alternative_min_level"]) <= 15){ $this->filters["alternative_min_level"] = $_GET["alternative_min_level"]; } if (isset($_GET["alternative_min_original_quality"]) && intval($_GET["alternative_min_original_quality"]) >= $QUALITY["NORMAL"] && intval($_GET["alternative_min_original_quality"]) <= $QUALITY["LEGEND"]){ $this->filters["alternative_min_original_quality"] = $_GET["alternative_min_original_quality"]; } if (isset($_GET["alternative_condition"]) && intval($_GET["alternative_condition"]) >= 0 && intval($_GET["alternative_condition"]) <= $QUALITY["LEGEND"]){ $this->filters["alternative_condition"] = $_GET["alternative_condition"]; } if (isset($_GET["alternative_source"]) && intval($_GET["alternative_source"]) >= 0 && intval($_GET["alternative_source"]) <= 2){ $this->filters["alternative_source"] = $_GET["alternative_source"]; } return; } /** * Builds the query for the page, using the providded or default filters. * * @return The query to be executed. */ private function build_query(){ global $UID; $s = " SELECT unit.id AS unit, rune.id AS id, rune_alt.id AS alternative FROM rune, rune rune_alt, unit, k_unit WHERE unit.uid = '$UID' AND rune.uid = '$UID' AND rune_alt.uid = '$UID' AND unit.id = rune.assigned_to AND unit.unit = k_unit.id AND unit.stars >= " . $this->filters["monster_min_stars"] . " AND unit.stars <= " . $this->filters["monster_max_stars"] . " AND rune.stars >= " . $this->filters["rune_min_stars"] . " AND rune.stars <= " . $this->filters["rune_max_stars"] . " AND rune.level >= " . $this->filters["rune_min_level"] . " AND rune.level <= " . $this->filters["rune_max_level"] . " AND rune.quality >= " . $this->filters["rune_min_quality"] . " AND rune.quality <= " . $this->filters["rune_max_quality"] . " AND rune.original_quality >= " . $this->filters["rune_min_original_quality"] . " AND rune.original_quality <= " . $this->filters["rune_max_original_quality"] . " AND rune.efficiency >= " . $this->filters["rune_min_efficiency"] . " AND rune.efficiency <= " . $this->filters["rune_max_efficiency"] . " AND rune.max_efficiency >= " . $this->filters["rune_min_max_efficiency"] . " AND rune.max_efficiency <= " . $this->filters["rune_max_max_efficiency"] . " AND rune.type = rune_alt.type AND rune.slot = rune_alt.slot AND rune.main_stat = rune_alt.main_stat AND rune.id <> rune_alt.id AND rune_alt.stars >= " . $this->filters["alternative_min_stars"] . " AND rune_alt.level >= " . $this->filters["alternative_min_level"] . " AND rune_alt.original_quality >= " . $this->filters["alternative_min_original_quality"] . " AND "; switch ($this->filters["alternative_source"]){ case 0: // Unassigned $s = $s . " rune_alt.assigned_to IS NULL AND "; break; case 1: // Unassigned or assigned to lower star monsters $s = $s . " ( rune_alt.assigned_to IS NULL OR rune_alt.assigned_to IN (SELECT id FROM unit m WHERE m.stars < unit.stars) ) AND "; break; // Case 2: Assigned or unassigned. } switch ($this->filters["alternative_condition"]){ case 0: // Higher grade, any quality $s = $s . " rune_alt.stars >= rune.stars "; break; case 1: // Higher grade or higher quality $s = $s . " ( " . " rune_alt.stars > rune.stars OR " . " rune_alt.original_quality > rune.original_quality " . " ) "; break; case 2: // Equal or higher grade and equal or higher quality $s = $s . " rune_alt.stars >= rune.stars AND " . " rune_alt.original_quality >= rune.original_quality "; break; case 3: // Equal or higher grade and higher quality $s = $s . " rune_alt.stars >= rune.stars AND " . " rune_alt.original_quality > rune.original_quality "; break; case 4: // Equal grade and equal or higher quality $s = $s . " rune_alt.stars > rune.stars AND " . " rune_alt.original_quality >= rune.original_quality "; break; default: // Case 5: Higher grade and higher quality $s = $s . " rune_alt.stars > rune.stars AND " . " rune_alt.original_quality > rune.original_quality "; break; } if (strlen($this->filters["monster_name"]) > 0){ $s = $s . " AND upper(k_unit.name) LIKE = upper('%" . $this->filters["monster_name"] . "%') "; } if (!$this->filters["monster_in_storage"]){ //$s = $s . " AND unit.in_storage = 0 "; } if (count($this->filters["rune_slot"]) > 0){ $s = $s . " AND rune.slot IN ( "; foreach($this->filters["rune_slot"] as $t){ $s = $s . "$t, "; } $s = $s . "-1) "; } $s = $s . " ORDER BY unit.stars DESC, unit.level DESC, unit.id, rune.slot, id, rune_alt.stars DESC, rune_alt.original_quality DESC, rune_alt.main_stat_value DESC; "; return $s; } } ?>