optimize_get_options.php 7.8 KB

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