Optimize_Options_Action.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <?php
  2. /**
  3. * File for the team creation action.
  4. *
  5. * Implements an action function to be called from the {@see Controller}.
  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::ACTION . "Action.php");
  12. /**
  13. * Executes the optimization action.
  14. *
  15. * Reads the POST parameters looking for the following KEYS:
  16. * player: The player ID.
  17. * unit: The unit ID.
  18. * tuning: 1: All +12; 2: Even +15, odd + 12; 3: All +15.
  19. * options: JSON with rune sets.
  20. *
  21. * @category Action
  22. */
  23. class Optimize_Options_Action extends Action{
  24. /**
  25. * Executes the action.
  26. */
  27. function execute(){
  28. // Increase max execution time.
  29. set_time_limit(60);
  30. $runes = [];
  31. $response = null;
  32. $player = filter_input(INPUT_POST, 'player');
  33. if ($player == null){
  34. $this->code = 400;
  35. error_log("400 player");
  36. $this->message = "POST parameter 'player' not specified or invalid.";
  37. return;
  38. }
  39. $unit_id = filter_input(INPUT_POST, 'unit');
  40. if ($unit_id == null){
  41. $this->code = 400;
  42. error_log("400 unit");
  43. $this->message = "POST parameter 'unit' not specified or invalid.";
  44. return;
  45. }
  46. $unit = new Unit($unit_id, true, $player);
  47. $base_stats = $unit->get_base_stats();
  48. $building_stats = $unit->get_building_stats();
  49. $artifact_stats = $unit->get_artifact_stats();
  50. //$total_stats = $unit->get_stats();
  51. $tuning = filter_input(INPUT_POST, 'tuning');
  52. if ($tuning == null){
  53. $this->code = 400;
  54. error_log("400 tining");
  55. $this->message = "POST parameter 'tuning' not specified or invalid.";
  56. return;
  57. }
  58. if (filter_input(INPUT_POST, 'options') == null){
  59. $this->code = 400;
  60. error_log("400 option");
  61. $this->message = "POST parameter 'options' not specified or invalid.";
  62. return;
  63. }
  64. $options = json_decode(filter_input(INPUT_POST, 'options'), true);
  65. if ($options == null){
  66. }
  67. foreach ($options as $option){
  68. $set = [
  69. "runes" => [],
  70. "stats" => [
  71. "atk" => $base_stats["atk"],
  72. "def" => $base_stats["def"],
  73. "hp" => $base_stats["hp"],
  74. "spd" => $base_stats["spd"],
  75. "crr" => $base_stats["crr"],
  76. "crd" => $base_stats["crd"],
  77. "acc" => $base_stats["acc"],
  78. "res" => $base_stats["res"],
  79. "ehp" => $base_stats["ehp"],
  80. "dmg" => $base_stats["dmg"]
  81. ]
  82. ];
  83. foreach ($option["runes"] as $rune_option){
  84. $rune = new Rune($rune_option["ID"]);
  85. $r = [
  86. "id" => $rune_option["ID"],
  87. "html" => HTML::rune_table($rune)
  88. ];
  89. // Calculate stat increment
  90. // TODO: Main stat at level!
  91. $stat_ids = [
  92. $rune->get_main_stat()->get_stat(),
  93. ($rune->get_innate_stat() != null ? $rune->get_innate_stat()->get_stat() : null),
  94. (sizeof($rune->get_substats()) > 0 ? $rune->get_substats()[0]->get_stat() : null),
  95. (sizeof($rune->get_substats()) > 1 ? $rune->get_substats()[1]->get_stat() : null),
  96. (sizeof($rune->get_substats()) > 2 ? $rune->get_substats()[2]->get_stat() : null),
  97. (sizeof($rune->get_substats()) > 3 ? $rune->get_substats()[3]->get_stat() : null)
  98. ];
  99. $main_value = $rune->get_main_stat()->get_value();
  100. switch ($tuning){
  101. case 1: // All +12
  102. if ($rune->get_level() < 12){
  103. $main_value = $rune->get_main_stat_at_level(12);
  104. }
  105. break;
  106. case 2: // Even +15, Odd + 12
  107. if ($rune->get_level() < 15 && $rune->get_slot() % 2 == 0){
  108. $main_value = $rune->get_main_stat_at_level(15);
  109. }
  110. elseif ($rune->get_level() < 12 && $rune->get_slot() % 2 != 0){
  111. $main_value = $rune->get_main_stat_at_level(12);
  112. }
  113. break;
  114. case 3: // All +15
  115. if ($rune->get_level() < 15){
  116. $main_value = $rune->get_main_stat_at_level(15);
  117. }
  118. break;
  119. }
  120. $stat_values = [
  121. $main_value,
  122. ($stat_ids[1] != null ? $rune->get_innate_stat()->get_value() : 0),
  123. ($stat_ids[2] != null ? $rune->get_substats()[0]->get_value() : 0),
  124. ($stat_ids[3] != null ? $rune->get_substats()[1]->get_value() : 0),
  125. ($stat_ids[4] != null ? $rune->get_substats()[2]->get_value() : 0),
  126. ($stat_ids[5] != null ? $rune->get_substats()[3]->get_value() : 0)
  127. ];
  128. for ($i = 0; $i < 6; $i ++){
  129. switch ($stat_ids[$i]){
  130. case RUNE_STAT_ID::ATK:
  131. $set["stats"]["atk"] += $stat_values[$i];
  132. break;
  133. case RUNE_STAT_ID::ATK_P:
  134. $set["stats"]["atk"] += ceil($base_stats["atk"] * $stat_values[$i] / 100);
  135. break;
  136. case RUNE_STAT_ID::DEF:
  137. $set["stats"]["def"] += $stat_values[$i];
  138. break;
  139. case RUNE_STAT_ID::DEF_P:
  140. $set["stats"]["def"] += ceil($base_stats["def"] * $stat_values[$i] / 100);
  141. break;
  142. case RUNE_STAT_ID::HP:
  143. $set["stats"]["hp"] += $stat_values[$i];
  144. break;
  145. case RUNE_STAT_ID::HP_P:
  146. $set["stats"]["hp"] += ceil($base_stats["hp"] * $stat_values[$i] / 100);
  147. break;
  148. case RUNE_STAT_ID::SPD:
  149. $set["stats"]["spd"] += $stat_values[$i];
  150. break;
  151. case RUNE_STAT_ID::CRR:
  152. $set["stats"]["crr"] += $stat_values[$i];
  153. break;
  154. case RUNE_STAT_ID::CRD:
  155. $set["stats"]["crd"] += $stat_values[$i];
  156. break;
  157. case RUNE_STAT_ID::ACC:
  158. $set["stats"]["acc"] += $stat_values[$i];
  159. break;
  160. case RUNE_STAT_ID::RES:
  161. $set["stats"]["res"] += $stat_values[$i];
  162. break;
  163. }
  164. }
  165. // Calculate EHP and DMG
  166. $set["stats"]["ehp"] = ceil(((($set["stats"]["def"] * 3.5) + 1140) * $set["stats"]["hp"]) / 1000);
  167. $atk = $set["stats"]["atk"];
  168. $crr = $set["stats"]["crr"];
  169. if ($crr > 100){
  170. $crr = 100;
  171. }
  172. $crd = $set["stats"]["crd"];
  173. $edmg = ceil(($atk * (100 - $crr) / 100) + (($atk + ($atk * $crd / 100)) * $crr / 100));
  174. $set["stats"]["dmg"] = $edmg;
  175. //error_log("attack before extras: " . $set["stats"]["atk"]);
  176. // Add artifacts and buildings
  177. $set["stats"]["atk"] += ($building_stats["atk"] + $artifact_stats["atk"]);
  178. $set["stats"]["def"] += ($building_stats["def"] + $artifact_stats["def"]);
  179. $set["stats"]["hp"] += ($building_stats["hp"] + $artifact_stats["hp"]);
  180. $set["stats"]["spd"] += ($building_stats["spd"] + $artifact_stats["spd"]);
  181. $set["stats"]["crr"] += ($building_stats["crr"] + $artifact_stats["crr"]);
  182. $set["stats"]["crd"] += ($building_stats["crd"] + $artifact_stats["crd"]);
  183. $set["stats"]["acc"] += ($building_stats["acc"] + $artifact_stats["acc"]);
  184. $set["stats"]["res"] += ($building_stats["res"] + $artifact_stats["res"]);
  185. $set["stats"]["ehp"] += ($building_stats["ehp"] + $artifact_stats["ehp"]);
  186. $set["stats"]["dmg"] += ($building_stats["dmg"] + $artifact_stats["dmg"]);
  187. //error_log("attack after extras: " . $set["stats"]["atk"]);
  188. // Add to the array
  189. array_push($set["runes"], $r);
  190. }
  191. array_push($runes, $set);
  192. }
  193. // Send back the response
  194. $response = json_encode($runes);
  195. if ($response == null){
  196. $this->code = 204;
  197. $this->message = "No combinations found.";
  198. }
  199. else{
  200. $this->code = 200;
  201. $this->message = "OK.";
  202. $this->output = $response;
  203. }
  204. return;
  205. }
  206. }