optimize_get_options.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. /**
  3. * File for the optimization action.
  4. *
  5. * Implements an action function to be called from the {@see Controller}.
  6. *
  7. * @category Action
  8. */
  9. /**
  10. * Executes the optimization action.
  11. *
  12. * Reads the POST parameters looking for the following KEYS:
  13. * player
  14. * unit
  15. * ... TODO
  16. *
  17. * @return int|string 0 on success, negative values on error. If the API
  18. * key has been updated, the new key.
  19. * @category Action
  20. */
  21. function action(){
  22. // Increase max execution time.
  23. set_time_limit(60);
  24. $runes = [];
  25. $response = null;
  26. $player = filter_input(INPUT_POST, 'player');
  27. if ($player == null){
  28. return -1;
  29. }
  30. $unit_id = filter_input(INPUT_POST, 'unit');
  31. if ($unit_id == null){
  32. return -2;
  33. }
  34. $unit = new Unit($unit_id, true, $player);
  35. $tuning = filter_input(INPUT_POST, 'tuning');
  36. if ($tuning == null){
  37. return -1;
  38. }
  39. $options = json_decode(filter_input(INPUT_POST, 'options'), true);
  40. if ($options == null){
  41. return -2;
  42. }
  43. foreach ($options as $option){
  44. $set = [
  45. "runes" => [],
  46. "stats" => [
  47. "attack" => $unit->attack,
  48. "defense" => $unit->defense,
  49. "hp" => $unit->hp,
  50. "speed" => $unit->speed,
  51. "crit_rate" => $unit->crit_rate,
  52. "crit_damage" => $unit->crit_damage,
  53. "accuracy" => $unit->accuracy,
  54. "resistance" => $unit->resistance,
  55. "ehp" => 0,
  56. "dmg" => 0
  57. ]
  58. ];
  59. foreach ($option["runes"] as $rune_option){
  60. $rune = new Rune($rune_option["ID"]);
  61. $r = [
  62. "id" => $rune_option["ID"],
  63. "html" => HTML::rune_table($rune)
  64. ];
  65. // Calculate stat increment
  66. // TODO: Main stat at level!
  67. $stat_ids = [
  68. $rune->get_main_stat()->get_stat(),
  69. ($rune->get_innate_stat() != null ? $rune->get_innate_stat()->get_stat() : null),
  70. (sizeof($rune->get_substats() > 0 ? $rune->get_substats()[0]->get_stat() : null)),
  71. (sizeof($rune->get_substats() > 1 ? $rune->get_substats()[1]->get_stat() : null)),
  72. (sizeof($rune->get_substats() > 2 ? $rune->get_substats()[2]->get_stat() : null)),
  73. (sizeof($rune->get_substats() > 3 ? $rune->get_substats()[3]->get_stat() : null))
  74. ];
  75. $main_value = $rune->get_main_stat()->get_value();
  76. switch ($tuning){
  77. case 1: // All +12
  78. if ($rune->get_level() < 12){
  79. $main_value = $rune->get_main_stat_at_level(12);
  80. }
  81. break;
  82. case 2: // Even +15, Odd + 12
  83. if ($rune->get_level() < 15 && $rune->get_slot() % 2 == 0){
  84. $main_value = $rune->get_main_stat_at_level(15);
  85. }
  86. elseif ($rune->get_level() < 12 && $rune->get_slot() % 2 != 0){
  87. $main_value = $rune->get_main_stat_at_level(12);
  88. }
  89. break;
  90. case 3: // All +15
  91. if ($rune->get_level() < 15){
  92. $main_value = $rune->get_main_stat_at_level(15);
  93. }
  94. break;
  95. }
  96. $stat_values = [
  97. $main_value,
  98. ($stat_ids[1] != null ? $rune->get_innate_stat()->get_value() : 0),
  99. ($stat_ids[2] != null ? $rune->get_substats()[0]->get_value() : 0),
  100. ($stat_ids[3] != null ? $rune->get_substats()[1]->get_value() : 0),
  101. ($stat_ids[4] != null ? $rune->get_substats()[2]->get_value() : 0),
  102. ($stat_ids[5] != null ? $rune->get_substats()[3]->get_value() : 0)
  103. ];
  104. for ($i = 0; $i < 6; $i ++){
  105. switch ($stat_ids[$i]){
  106. case RUNE_STAT_ID::ATK:
  107. $set["stats"]["attack"] += $stat_values[$i];
  108. break;
  109. case RUNE_STAT_ID::ATK_P:
  110. $set["stats"]["attack"] += ceil($unit->get_base_stats()["ATK"] * $stat_values[$i] / 100);
  111. break;
  112. case RUNE_STAT_ID::DEF:
  113. $set["stats"]["defense"] += $stat_values[$i];
  114. break;
  115. case RUNE_STAT_ID::DEF_P:
  116. $set["stats"]["defense"] += ceil($unit->get_base_stats()["DEF"] * $stat_values[$i] / 100);
  117. break;
  118. case RUNE_STAT_ID::HP:
  119. $set["stats"]["hp"] += $stat_values[$i];
  120. break;
  121. case RUNE_STAT_ID::HP_P:
  122. $set["stats"]["hp"] += ceil($unit->get_base_stats()["HP"] * $stat_values[$i] / 100);
  123. break;
  124. case RUNE_STAT_ID::SPD:
  125. $set["stats"]["speed"] += $stat_values[$i];
  126. break;
  127. case RUNE_STAT_ID::CRR:
  128. $set["stats"]["crit_rate"] += $stat_values[$i];
  129. break;
  130. case RUNE_STAT_ID::CRD:
  131. $set["stats"]["crit_damage"] += $stat_values[$i];
  132. break;
  133. case RUNE_STAT_ID::ACC:
  134. $set["stats"]["accuracy"] += $stat_values[$i];
  135. break;
  136. case RUNE_STAT_ID::CRR:
  137. $set["stats"]["resistance"] += $stat_values[$i];
  138. break;
  139. }
  140. }
  141. // Calculate EHP and DMG
  142. $set["stats"]["ehp"] = ceil(((($set["stats"]["def"] * 3.5) + 1140) * $set["stats"]["hp"]) / 1000);
  143. $atk = $set["stats"]["attack"];
  144. $crr = $set["stats"]["crit_rate"];
  145. if ($crr > 100){
  146. $crr = 100;
  147. }
  148. $crd = $set["stats"]["crit_damage"];
  149. $edmg = ceil(($atk * (100 - $crr) / 100) + (($atk + ($atk * $crd / 100)) * $crr / 100));
  150. $set["stats"]["dmg"] = $edmg;
  151. // Add to the array
  152. array_push($set["runes"], $r);
  153. }
  154. array_push($runes, $set);
  155. }
  156. // Send back the response
  157. $response = json_encode($runes);
  158. if ($response == null){
  159. return 0;
  160. }
  161. else{
  162. return $response;
  163. }
  164. }
  165. ?>