* @license https://www.gnu.org/licenses/gpl-3.0.en.html GNU General Public License V3 * @package SWDB */ /** * Executes the optimization action. * * Reads the POST parameters looking for the following KEYS: * player: The player ID. * unit: The unit ID. * tuning: {@todo Documentproperly}. * options: JSON with rune sets. * * @return int|string a JSON with the runes on success, negative integers on error. 0 if no errors * ocurred, but no results were found. * @category Action */ function action(){ // Increase max execution time. set_time_limit(60); $runes = []; $response = null; $player = filter_input(INPUT_POST, 'player'); if ($player == null){ return -1; } $unit_id = filter_input(INPUT_POST, 'unit'); if ($unit_id == null){ return -2; } $unit = new Unit($unit_id, true, $player); $base_stats = $unit->get_base_stats(); $building_stats = $unit->get_base_stats(); $artifact_stats = $unit->get_base_stats(); $tuning = filter_input(INPUT_POST, 'tuning'); if ($tuning == null){ return -1; } $options = json_decode(filter_input(INPUT_POST, 'options'), true); if ($options == null){ return -2; } foreach ($options as $option){ $set = [ "runes" => [], "stats" => [ "atk" => $base_stats["atk"] + $building_stats["atk"] + $artifact_stats["atk"], "def" => $base_stats["def"] + $building_stats["def"] + $artifact_stats["def"], "hp" => $base_stats["hp"] + $building_stats["hp"] + $artifact_stats["hp"], "spd" => $base_stats["spd"] + $building_stats["spd"] + $artifact_stats["spd"], "crr" => $base_stats["crr"] + $building_stats["crr"] + $artifact_stats["crr"], "crd" => $base_stats["crd"] + $building_stats["crd"] + $artifact_stats["crd"], "acc" => $base_stats["acc"] + $building_stats["acc"] + $artifact_stats["acc"], "res" => $base_stats["res"] + $building_stats["res"] + $artifact_stats["res"], "ehp" => 0, "dmg" => 0 ] ]; 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; // Add to the array array_push($set["runes"], $r); } array_push($runes, $set); } // Send back the response $response = json_encode($runes); if ($response == null){ return 0; } else{ return $response; } }