* @license https://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License V3 * @package SWDB */ require_once(PATH::ACTION . "Action.php"); /** * Executes the optimization action. * * Reads the POST parameters looking for the following KEYS: * player: The player ID. * unit: The unit ID. * tuning: 1: All +12; 2: Even +15, odd + 12; 3: All +15. * options: JSON with rune sets. * * @category Action */ class Optimize_Options_Action extends Action{ /** * Executes the action. */ function execute(){ // Increase max execution time. set_time_limit(60); $runes = []; $response = null; $player = filter_input(INPUT_POST, 'player'); if ($player == null){ $this->code = 400; $this->message = "POST parameter 'player' not specified or invalid."; return; } $unit_id = filter_input(INPUT_POST, 'unit'); if ($unit_id == null){ $this->code = 400; $this->message = "POST parameter 'unit' not specified or invalid."; return; } $unit = new Unit($unit_id, true, $player); $base_stats = $unit->get_base_stats(); $building_stats = $unit->get_building_stats(); $artifact_stats = $unit->get_artifact_stats(); //$total_stats = $unit->get_stats(); $tuning = filter_input(INPUT_POST, 'tuning'); if ($tuning == null){ $this->code = 400; $this->message = "POST parameter 'tuning' not specified or invalid."; return; } $options = json_decode(filter_input(INPUT_POST, 'options'), true); if ($options == null){ $this->code = 400; $this->message = "POST parameter 'options' not specified or invalid."; return; } foreach ($options as $option){ $set = [ "runes" => [], "stats" => [ "atk" => $base_stats["atk"], "def" => $base_stats["def"], "hp" => $base_stats["hp"], "spd" => $base_stats["spd"], "crr" => $base_stats["crr"], "crd" => $base_stats["crd"], "acc" => $base_stats["acc"], "res" => $base_stats["res"], "ehp" => $base_stats["ehp"], "dmg" => $base_stats["dmg"] ] ]; foreach ($option["runes"] as $rune_option){ $rune = new Rune($rune_option["ID"]); $r = [ "id" => $rune_option["ID"], "html" => HTML::rune_table($rune) ]; // Calculate stat increment // TODO: Main stat at level! $stat_ids = [ $rune->get_main_stat()->get_stat(), ($rune->get_innate_stat() != null ? $rune->get_innate_stat()->get_stat() : null), (sizeof($rune->get_substats()) > 0 ? $rune->get_substats()[0]->get_stat() : null), (sizeof($rune->get_substats()) > 1 ? $rune->get_substats()[1]->get_stat() : null), (sizeof($rune->get_substats()) > 2 ? $rune->get_substats()[2]->get_stat() : null), (sizeof($rune->get_substats()) > 3 ? $rune->get_substats()[3]->get_stat() : null) ]; $main_value = $rune->get_main_stat()->get_value(); switch ($tuning){ case 1: // All +12 if ($rune->get_level() < 12){ $main_value = $rune->get_main_stat_at_level(12); } break; case 2: // Even +15, Odd + 12 if ($rune->get_level() < 15 && $rune->get_slot() % 2 == 0){ $main_value = $rune->get_main_stat_at_level(15); } elseif ($rune->get_level() < 12 && $rune->get_slot() % 2 != 0){ $main_value = $rune->get_main_stat_at_level(12); } break; case 3: // All +15 if ($rune->get_level() < 15){ $main_value = $rune->get_main_stat_at_level(15); } break; } $stat_values = [ $main_value, ($stat_ids[1] != null ? $rune->get_innate_stat()->get_value() : 0), ($stat_ids[2] != null ? $rune->get_substats()[0]->get_value() : 0), ($stat_ids[3] != null ? $rune->get_substats()[1]->get_value() : 0), ($stat_ids[4] != null ? $rune->get_substats()[2]->get_value() : 0), ($stat_ids[5] != null ? $rune->get_substats()[3]->get_value() : 0) ]; for ($i = 0; $i < 6; $i ++){ switch ($stat_ids[$i]){ case RUNE_STAT_ID::ATK: $set["stats"]["atk"] += $stat_values[$i]; break; case RUNE_STAT_ID::ATK_P: $set["stats"]["atk"] += ceil($base_stats["atk"] * $stat_values[$i] / 100); break; case RUNE_STAT_ID::DEF: $set["stats"]["def"] += $stat_values[$i]; break; case RUNE_STAT_ID::DEF_P: $set["stats"]["def"] += ceil($base_stats["def"] * $stat_values[$i] / 100); break; case RUNE_STAT_ID::HP: $set["stats"]["hp"] += $stat_values[$i]; break; case RUNE_STAT_ID::HP_P: $set["stats"]["hp"] += ceil($base_stats["hp"] * $stat_values[$i] / 100); break; case RUNE_STAT_ID::SPD: $set["stats"]["spd"] += $stat_values[$i]; break; case RUNE_STAT_ID::CRR: $set["stats"]["crr"] += $stat_values[$i]; break; case RUNE_STAT_ID::CRD: $set["stats"]["crd"] += $stat_values[$i]; break; case RUNE_STAT_ID::ACC: $set["stats"]["acc"] += $stat_values[$i]; break; case RUNE_STAT_ID::RES: $set["stats"]["res"] += $stat_values[$i]; break; } } // Calculate EHP and DMG $set["stats"]["ehp"] = ceil(((($set["stats"]["def"] * 3.5) + 1140) * $set["stats"]["hp"]) / 1000); $atk = $set["stats"]["atk"]; $crr = $set["stats"]["crr"]; if ($crr > 100){ $crr = 100; } $crd = $set["stats"]["crd"]; $edmg = ceil(($atk * (100 - $crr) / 100) + (($atk + ($atk * $crd / 100)) * $crr / 100)); $set["stats"]["dmg"] = $edmg; //error_log("attack before extras: " . $set["stats"]["atk"]); // Add artifacts and buildings $set["stats"]["atk"] += ($building_stats["atk"] + $artifact_stats["atk"]); $set["stats"]["def"] += ($building_stats["def"] + $artifact_stats["def"]); $set["stats"]["hp"] += ($building_stats["hp"] + $artifact_stats["hp"]); $set["stats"]["spd"] += ($building_stats["spd"] + $artifact_stats["spd"]); $set["stats"]["crr"] += ($building_stats["crr"] + $artifact_stats["crr"]); $set["stats"]["crd"] += ($building_stats["crd"] + $artifact_stats["crd"]); $set["stats"]["acc"] += ($building_stats["acc"] + $artifact_stats["acc"]); $set["stats"]["res"] += ($building_stats["res"] + $artifact_stats["res"]); $set["stats"]["ehp"] += ($building_stats["ehp"] + $artifact_stats["ehp"]); $set["stats"]["dmg"] += ($building_stats["dmg"] + $artifact_stats["dmg"]); //error_log("attack after extras: " . $set["stats"]["atk"]); // Add to the array array_push($set["runes"], $r); } array_push($runes, $set); } // Send back the response $response = json_encode($runes); if ($response == null){ $this->code = 204; $this->message = "No combinations found."; } else{ $this->code = 200; $this->message = "OK."; $this->output = $response; } return; } }