optimize_get_options.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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: {@todo Document properly}.
  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_base_stats();
  40. $artifact_stats = $unit->get_base_stats();
  41. $tuning = filter_input(INPUT_POST, 'tuning');
  42. if ($tuning == null){
  43. return -1;
  44. }
  45. $options = json_decode(filter_input(INPUT_POST, 'options'), true);
  46. if ($options == null){
  47. return -2;
  48. }
  49. foreach ($options as $option){
  50. $set = [
  51. "runes" => [],
  52. "stats" => [
  53. "atk" => $base_stats["atk"] + $building_stats["atk"] + $artifact_stats["atk"],
  54. "def" => $base_stats["def"] + $building_stats["def"] + $artifact_stats["def"],
  55. "hp" => $base_stats["hp"] + $building_stats["hp"] + $artifact_stats["hp"],
  56. "spd" => $base_stats["spd"] + $building_stats["spd"] + $artifact_stats["spd"],
  57. "crr" => $base_stats["crr"] + $building_stats["crr"] + $artifact_stats["crr"],
  58. "crd" => $base_stats["crd"] + $building_stats["crd"] + $artifact_stats["crd"],
  59. "acc" => $base_stats["acc"] + $building_stats["acc"] + $artifact_stats["acc"],
  60. "res" => $base_stats["res"] + $building_stats["res"] + $artifact_stats["res"],
  61. "ehp" => 0,
  62. "dmg" => 0
  63. ]
  64. ];
  65. foreach ($option["runes"] as $rune_option){
  66. $rune = new Rune($rune_option["ID"]);
  67. $r = [
  68. "id" => $rune_option["ID"],
  69. "html" => HTML::rune_table($rune)
  70. ];
  71. // Calculate stat increment
  72. // TODO: Main stat at level!
  73. $stat_ids = [
  74. $rune->get_main_stat()->get_stat(),
  75. ($rune->get_innate_stat() != null ? $rune->get_innate_stat()->get_stat() : null),
  76. (sizeof($rune->get_substats() > 0 ? $rune->get_substats()[0]->get_stat() : null)),
  77. (sizeof($rune->get_substats() > 1 ? $rune->get_substats()[1]->get_stat() : null)),
  78. (sizeof($rune->get_substats() > 2 ? $rune->get_substats()[2]->get_stat() : null)),
  79. (sizeof($rune->get_substats() > 3 ? $rune->get_substats()[3]->get_stat() : null))
  80. ];
  81. $main_value = $rune->get_main_stat()->get_value();
  82. switch ($tuning){
  83. case 1: // All +12
  84. if ($rune->get_level() < 12){
  85. $main_value = $rune->get_main_stat_at_level(12);
  86. }
  87. break;
  88. case 2: // Even +15, Odd + 12
  89. if ($rune->get_level() < 15 && $rune->get_slot() % 2 == 0){
  90. $main_value = $rune->get_main_stat_at_level(15);
  91. }
  92. elseif ($rune->get_level() < 12 && $rune->get_slot() % 2 != 0){
  93. $main_value = $rune->get_main_stat_at_level(12);
  94. }
  95. break;
  96. case 3: // All +15
  97. if ($rune->get_level() < 15){
  98. $main_value = $rune->get_main_stat_at_level(15);
  99. }
  100. break;
  101. }
  102. $stat_values = [
  103. $main_value,
  104. ($stat_ids[1] != null ? $rune->get_innate_stat()->get_value() : 0),
  105. ($stat_ids[2] != null ? $rune->get_substats()[0]->get_value() : 0),
  106. ($stat_ids[3] != null ? $rune->get_substats()[1]->get_value() : 0),
  107. ($stat_ids[4] != null ? $rune->get_substats()[2]->get_value() : 0),
  108. ($stat_ids[5] != null ? $rune->get_substats()[3]->get_value() : 0)
  109. ];
  110. for ($i = 0; $i < 6; $i ++){
  111. switch ($stat_ids[$i]){
  112. case RUNE_STAT_ID::ATK:
  113. $set["stats"]["atk"] += $stat_values[$i];
  114. break;
  115. case RUNE_STAT_ID::ATK_P:
  116. $set["stats"]["atk"] += ceil($base_stats()["atk"] * $stat_values[$i] / 100);
  117. break;
  118. case RUNE_STAT_ID::DEF:
  119. $set["stats"]["def"] += $stat_values[$i];
  120. break;
  121. case RUNE_STAT_ID::DEF_P:
  122. $set["stats"]["def"] += ceil($base_stats["def"] * $stat_values[$i] / 100);
  123. break;
  124. case RUNE_STAT_ID::HP:
  125. $set["stats"]["hp"] += $stat_values[$i];
  126. break;
  127. case RUNE_STAT_ID::HP_P:
  128. $set["stats"]["hp"] += ceil($base_stats["hp"] * $stat_values[$i] / 100);
  129. break;
  130. case RUNE_STAT_ID::SPD:
  131. $set["stats"]["spd"] += $stat_values[$i];
  132. break;
  133. case RUNE_STAT_ID::CRR:
  134. $set["stats"]["crr"] += $stat_values[$i];
  135. break;
  136. case RUNE_STAT_ID::CRD:
  137. $set["stats"]["crd"] += $stat_values[$i];
  138. break;
  139. case RUNE_STAT_ID::ACC:
  140. $set["stats"]["acc"] += $stat_values[$i];
  141. break;
  142. case RUNE_STAT_ID::RES:
  143. $set["stats"]["res"] += $stat_values[$i];
  144. break;
  145. }
  146. }
  147. // Calculate EHP and DMG
  148. $set["stats"]["ehp"] = ceil(((($set["stats"]["def"] * 3.5) + 1140) * $set["stats"]["hp"]) / 1000);
  149. $atk = $set["stats"]["atk"];
  150. $crr = $set["stats"]["crr"];
  151. if ($crr > 100){
  152. $crr = 100;
  153. }
  154. $crd = $set["stats"]["crd"];
  155. $edmg = ceil(($atk * (100 - $crr) / 100) + (($atk + ($atk * $crd / 100)) * $crr / 100));
  156. $set["stats"]["dmg"] = $edmg;
  157. // Add to the array
  158. array_push($set["runes"], $r);
  159. }
  160. array_push($runes, $set);
  161. }
  162. // Send back the response
  163. $response = json_encode($runes);
  164. if ($response == null){
  165. return 0;
  166. }
  167. else{
  168. return $response;
  169. }
  170. }