@pkmn/sim 0.9.30 → 0.9.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/build/cjs/config/formats.js +58 -43
  2. package/build/cjs/config/formats.js.map +1 -1
  3. package/build/cjs/data/abilities.js +41 -41
  4. package/build/cjs/data/abilities.js.map +1 -1
  5. package/build/cjs/data/aliases.js +2 -2
  6. package/build/cjs/data/aliases.js.map +1 -1
  7. package/build/cjs/data/conditions.js +20 -20
  8. package/build/cjs/data/conditions.js.map +1 -1
  9. package/build/cjs/data/formats-data.js +1 -1
  10. package/build/cjs/data/items.js +5 -5
  11. package/build/cjs/data/items.js.map +1 -1
  12. package/build/cjs/data/mods/gen1/conditions.js +1 -2
  13. package/build/cjs/data/mods/gen1/conditions.js.map +1 -1
  14. package/build/cjs/data/mods/gen1/moves.js +2 -2
  15. package/build/cjs/data/mods/gen1/moves.js.map +1 -1
  16. package/build/cjs/data/mods/gen1/pokedex.js.map +1 -1
  17. package/build/cjs/data/mods/gen1/scripts.js +6 -6
  18. package/build/cjs/data/mods/gen1/scripts.js.map +1 -1
  19. package/build/cjs/data/mods/gen2/conditions.js +2 -2
  20. package/build/cjs/data/mods/gen2/conditions.js.map +1 -1
  21. package/build/cjs/data/mods/gen2/moves.js +3 -3
  22. package/build/cjs/data/mods/gen2/moves.js.map +1 -1
  23. package/build/cjs/data/mods/gen2/rulesets.js.map +1 -1
  24. package/build/cjs/data/mods/gen2/scripts.js +2 -2
  25. package/build/cjs/data/mods/gen2/scripts.js.map +1 -1
  26. package/build/cjs/data/mods/gen3/abilities.js +1 -1
  27. package/build/cjs/data/mods/gen3/abilities.js.map +1 -1
  28. package/build/cjs/data/mods/gen3/conditions.js +1 -1
  29. package/build/cjs/data/mods/gen3/conditions.js.map +1 -1
  30. package/build/cjs/data/mods/gen3/moves.js +5 -5
  31. package/build/cjs/data/mods/gen3/moves.js.map +1 -1
  32. package/build/cjs/data/mods/gen3/scripts.js +2 -2
  33. package/build/cjs/data/mods/gen3/scripts.js.map +1 -1
  34. package/build/cjs/data/mods/gen4/abilities.js +4 -4
  35. package/build/cjs/data/mods/gen4/abilities.js.map +1 -1
  36. package/build/cjs/data/mods/gen4/conditions.js +1 -1
  37. package/build/cjs/data/mods/gen4/conditions.js.map +1 -1
  38. package/build/cjs/data/mods/gen4/items.js +2 -2
  39. package/build/cjs/data/mods/gen4/items.js.map +1 -1
  40. package/build/cjs/data/mods/gen4/moves.js +22 -22
  41. package/build/cjs/data/mods/gen4/moves.js.map +1 -1
  42. package/build/cjs/data/mods/gen4/scripts.js +1 -1
  43. package/build/cjs/data/mods/gen4/scripts.js.map +1 -1
  44. package/build/cjs/data/mods/gen5/abilities.js +1 -1
  45. package/build/cjs/data/mods/gen5/abilities.js.map +1 -1
  46. package/build/cjs/data/mods/gen5/conditions.js +2 -2
  47. package/build/cjs/data/mods/gen5/conditions.js.map +1 -1
  48. package/build/cjs/data/mods/gen5/moves.js +6 -6
  49. package/build/cjs/data/mods/gen5/moves.js.map +1 -1
  50. package/build/cjs/data/mods/gen5/pokedex.js.map +1 -1
  51. package/build/cjs/data/mods/gen6/abilities.js +2 -2
  52. package/build/cjs/data/mods/gen6/abilities.js.map +1 -1
  53. package/build/cjs/data/mods/gen6/moves.js +1 -1
  54. package/build/cjs/data/mods/gen6/moves.js.map +1 -1
  55. package/build/cjs/data/mods/gen6/pokedex.js.map +1 -1
  56. package/build/cjs/data/mods/gen7/abilities.js.map +1 -1
  57. package/build/cjs/data/mods/gen7/moves.js +8 -8
  58. package/build/cjs/data/mods/gen7/moves.js.map +1 -1
  59. package/build/cjs/data/mods/gen7/pokedex.js.map +1 -1
  60. package/build/cjs/data/mods/gen8/abilities.js.map +1 -1
  61. package/build/cjs/data/mods/gen8/moves.js.map +1 -1
  62. package/build/cjs/data/mods/gen8/pokedex.js.map +1 -1
  63. package/build/cjs/data/moves.js +105 -103
  64. package/build/cjs/data/moves.js.map +1 -1
  65. package/build/cjs/data/pokedex.js.map +1 -1
  66. package/build/cjs/data/pokemongo.js.map +1 -1
  67. package/build/cjs/data/rulesets.js +0 -1
  68. package/build/cjs/data/rulesets.js.map +1 -1
  69. package/build/cjs/data/tags.js.map +1 -1
  70. package/build/cjs/data/text/abilities.js.map +1 -1
  71. package/build/cjs/data/text/default.js.map +1 -1
  72. package/build/cjs/data/text/items.js.map +1 -1
  73. package/build/cjs/data/text/moves.js.map +1 -1
  74. package/build/cjs/data/typechart.js.map +1 -1
  75. package/build/cjs/lib/utils.d.ts +5 -5
  76. package/build/cjs/lib/utils.js +21 -11
  77. package/build/cjs/lib/utils.js.map +1 -1
  78. package/build/cjs/sim/battle-actions.js +8 -8
  79. package/build/cjs/sim/battle-actions.js.map +1 -1
  80. package/build/cjs/sim/battle-queue.js +0 -1
  81. package/build/cjs/sim/battle-queue.js.map +1 -1
  82. package/build/cjs/sim/battle-stream.d.ts +3 -2
  83. package/build/cjs/sim/battle-stream.js +1 -1
  84. package/build/cjs/sim/battle-stream.js.map +1 -1
  85. package/build/cjs/sim/battle.d.ts +8 -8
  86. package/build/cjs/sim/battle.js +41 -44
  87. package/build/cjs/sim/battle.js.map +1 -1
  88. package/build/cjs/sim/dex-abilities.js.map +1 -1
  89. package/build/cjs/sim/dex-conditions.js +2 -2
  90. package/build/cjs/sim/dex-conditions.js.map +1 -1
  91. package/build/cjs/sim/dex-data.js +1 -1
  92. package/build/cjs/sim/dex-data.js.map +1 -1
  93. package/build/cjs/sim/dex-formats.d.ts +1 -0
  94. package/build/cjs/sim/dex-formats.js +95 -37
  95. package/build/cjs/sim/dex-formats.js.map +1 -1
  96. package/build/cjs/sim/dex-items.js.map +1 -1
  97. package/build/cjs/sim/dex-moves.js +2 -3
  98. package/build/cjs/sim/dex-moves.js.map +1 -1
  99. package/build/cjs/sim/exported-global-types.d.ts +1 -9
  100. package/build/cjs/sim/field.d.ts +1 -1
  101. package/build/cjs/sim/field.js +3 -3
  102. package/build/cjs/sim/field.js.map +1 -1
  103. package/build/cjs/sim/global-types.d.ts +1 -9
  104. package/build/cjs/sim/pokemon.d.ts +14 -25
  105. package/build/cjs/sim/pokemon.js +21 -22
  106. package/build/cjs/sim/pokemon.js.map +1 -1
  107. package/build/cjs/sim/side.d.ts +105 -11
  108. package/build/cjs/sim/side.js +6 -6
  109. package/build/cjs/sim/side.js.map +1 -1
  110. package/build/cjs/sim/state.d.ts +1 -1
  111. package/build/cjs/sim/state.js +3 -3
  112. package/build/cjs/sim/state.js.map +1 -1
  113. package/build/cjs/sim/team-validator.d.ts +2 -1
  114. package/build/cjs/sim/team-validator.js +37 -27
  115. package/build/cjs/sim/team-validator.js.map +1 -1
  116. package/build/cjs/sim/tools/random-player-ai.d.ts +4 -3
  117. package/build/cjs/sim/tools/random-player-ai.js +6 -7
  118. package/build/cjs/sim/tools/random-player-ai.js.map +1 -1
  119. package/build/cjs/sim/tools/runner.d.ts +2 -2
  120. package/build/cjs/sim/tools/runner.js +1 -1
  121. package/build/cjs/sim/tools/runner.js.map +1 -1
  122. package/build/esm/config/formats.mjs +58 -43
  123. package/build/esm/config/formats.mjs.map +1 -1
  124. package/build/esm/data/abilities.mjs +41 -41
  125. package/build/esm/data/abilities.mjs.map +1 -1
  126. package/build/esm/data/aliases.mjs +2 -2
  127. package/build/esm/data/aliases.mjs.map +1 -1
  128. package/build/esm/data/conditions.mjs +20 -20
  129. package/build/esm/data/conditions.mjs.map +1 -1
  130. package/build/esm/data/formats-data.mjs +1 -1
  131. package/build/esm/data/items.mjs +5 -5
  132. package/build/esm/data/items.mjs.map +1 -1
  133. package/build/esm/data/mods/gen1/conditions.mjs +1 -2
  134. package/build/esm/data/mods/gen1/conditions.mjs.map +1 -1
  135. package/build/esm/data/mods/gen1/moves.mjs +2 -2
  136. package/build/esm/data/mods/gen1/moves.mjs.map +1 -1
  137. package/build/esm/data/mods/gen1/pokedex.mjs.map +1 -1
  138. package/build/esm/data/mods/gen1/scripts.mjs +6 -6
  139. package/build/esm/data/mods/gen1/scripts.mjs.map +1 -1
  140. package/build/esm/data/mods/gen2/conditions.mjs +2 -2
  141. package/build/esm/data/mods/gen2/conditions.mjs.map +1 -1
  142. package/build/esm/data/mods/gen2/moves.mjs +3 -3
  143. package/build/esm/data/mods/gen2/moves.mjs.map +1 -1
  144. package/build/esm/data/mods/gen2/rulesets.mjs.map +1 -1
  145. package/build/esm/data/mods/gen2/scripts.mjs +2 -2
  146. package/build/esm/data/mods/gen2/scripts.mjs.map +1 -1
  147. package/build/esm/data/mods/gen3/abilities.mjs +1 -1
  148. package/build/esm/data/mods/gen3/abilities.mjs.map +1 -1
  149. package/build/esm/data/mods/gen3/conditions.mjs +1 -1
  150. package/build/esm/data/mods/gen3/conditions.mjs.map +1 -1
  151. package/build/esm/data/mods/gen3/moves.mjs +5 -5
  152. package/build/esm/data/mods/gen3/moves.mjs.map +1 -1
  153. package/build/esm/data/mods/gen3/scripts.mjs +2 -2
  154. package/build/esm/data/mods/gen3/scripts.mjs.map +1 -1
  155. package/build/esm/data/mods/gen4/abilities.mjs +4 -4
  156. package/build/esm/data/mods/gen4/abilities.mjs.map +1 -1
  157. package/build/esm/data/mods/gen4/conditions.mjs +1 -1
  158. package/build/esm/data/mods/gen4/conditions.mjs.map +1 -1
  159. package/build/esm/data/mods/gen4/items.mjs +2 -2
  160. package/build/esm/data/mods/gen4/items.mjs.map +1 -1
  161. package/build/esm/data/mods/gen4/moves.mjs +22 -22
  162. package/build/esm/data/mods/gen4/moves.mjs.map +1 -1
  163. package/build/esm/data/mods/gen4/scripts.mjs +1 -1
  164. package/build/esm/data/mods/gen4/scripts.mjs.map +1 -1
  165. package/build/esm/data/mods/gen5/abilities.mjs +1 -1
  166. package/build/esm/data/mods/gen5/abilities.mjs.map +1 -1
  167. package/build/esm/data/mods/gen5/conditions.mjs +2 -2
  168. package/build/esm/data/mods/gen5/conditions.mjs.map +1 -1
  169. package/build/esm/data/mods/gen5/moves.mjs +6 -6
  170. package/build/esm/data/mods/gen5/moves.mjs.map +1 -1
  171. package/build/esm/data/mods/gen5/pokedex.mjs.map +1 -1
  172. package/build/esm/data/mods/gen6/abilities.mjs +2 -2
  173. package/build/esm/data/mods/gen6/abilities.mjs.map +1 -1
  174. package/build/esm/data/mods/gen6/moves.mjs +1 -1
  175. package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
  176. package/build/esm/data/mods/gen6/pokedex.mjs.map +1 -1
  177. package/build/esm/data/mods/gen7/abilities.mjs.map +1 -1
  178. package/build/esm/data/mods/gen7/moves.mjs +8 -8
  179. package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
  180. package/build/esm/data/mods/gen7/pokedex.mjs.map +1 -1
  181. package/build/esm/data/mods/gen8/abilities.mjs.map +1 -1
  182. package/build/esm/data/mods/gen8/moves.mjs.map +1 -1
  183. package/build/esm/data/mods/gen8/pokedex.mjs.map +1 -1
  184. package/build/esm/data/moves.mjs +105 -103
  185. package/build/esm/data/moves.mjs.map +1 -1
  186. package/build/esm/data/pokedex.mjs.map +1 -1
  187. package/build/esm/data/pokemongo.mjs.map +1 -1
  188. package/build/esm/data/rulesets.mjs +0 -1
  189. package/build/esm/data/rulesets.mjs.map +1 -1
  190. package/build/esm/data/tags.mjs.map +1 -1
  191. package/build/esm/data/text/abilities.mjs.map +1 -1
  192. package/build/esm/data/text/default.mjs.map +1 -1
  193. package/build/esm/data/text/items.mjs.map +1 -1
  194. package/build/esm/data/text/moves.mjs.map +1 -1
  195. package/build/esm/data/typechart.mjs.map +1 -1
  196. package/build/esm/lib/utils.d.mts +5 -5
  197. package/build/esm/lib/utils.mjs +21 -11
  198. package/build/esm/lib/utils.mjs.map +1 -1
  199. package/build/esm/sim/battle-actions.mjs +8 -8
  200. package/build/esm/sim/battle-actions.mjs.map +1 -1
  201. package/build/esm/sim/battle-queue.mjs +0 -1
  202. package/build/esm/sim/battle-queue.mjs.map +1 -1
  203. package/build/esm/sim/battle-stream.d.mts +3 -2
  204. package/build/esm/sim/battle-stream.mjs +1 -1
  205. package/build/esm/sim/battle-stream.mjs.map +1 -1
  206. package/build/esm/sim/battle.d.mts +8 -8
  207. package/build/esm/sim/battle.mjs +41 -44
  208. package/build/esm/sim/battle.mjs.map +1 -1
  209. package/build/esm/sim/dex-abilities.mjs.map +1 -1
  210. package/build/esm/sim/dex-conditions.mjs +2 -2
  211. package/build/esm/sim/dex-conditions.mjs.map +1 -1
  212. package/build/esm/sim/dex-data.mjs +1 -1
  213. package/build/esm/sim/dex-data.mjs.map +1 -1
  214. package/build/esm/sim/dex-formats.d.mts +1 -0
  215. package/build/esm/sim/dex-formats.mjs +95 -37
  216. package/build/esm/sim/dex-formats.mjs.map +1 -1
  217. package/build/esm/sim/dex-items.mjs.map +1 -1
  218. package/build/esm/sim/dex-moves.mjs +2 -3
  219. package/build/esm/sim/dex-moves.mjs.map +1 -1
  220. package/build/esm/sim/exported-global-types.d.mts +1 -9
  221. package/build/esm/sim/field.d.mts +1 -1
  222. package/build/esm/sim/field.mjs +3 -3
  223. package/build/esm/sim/field.mjs.map +1 -1
  224. package/build/esm/sim/global-types.d.mts +1 -9
  225. package/build/esm/sim/pokemon.d.mts +14 -25
  226. package/build/esm/sim/pokemon.mjs +21 -22
  227. package/build/esm/sim/pokemon.mjs.map +1 -1
  228. package/build/esm/sim/side.d.mts +105 -11
  229. package/build/esm/sim/side.mjs +6 -6
  230. package/build/esm/sim/side.mjs.map +1 -1
  231. package/build/esm/sim/state.d.mts +1 -1
  232. package/build/esm/sim/state.mjs +3 -3
  233. package/build/esm/sim/state.mjs.map +1 -1
  234. package/build/esm/sim/team-validator.d.mts +2 -1
  235. package/build/esm/sim/team-validator.mjs +37 -27
  236. package/build/esm/sim/team-validator.mjs.map +1 -1
  237. package/build/esm/sim/tools/random-player-ai.d.mts +4 -3
  238. package/build/esm/sim/tools/random-player-ai.mjs +6 -7
  239. package/build/esm/sim/tools/random-player-ai.mjs.map +1 -1
  240. package/build/esm/sim/tools/runner.d.mts +2 -2
  241. package/build/esm/sim/tools/runner.mjs +1 -1
  242. package/build/esm/sim/tools/runner.mjs.map +1 -1
  243. package/package.json +1 -1
@@ -352,7 +352,7 @@ class Battle {
352
352
  if (!(handler.state?.isSlotCondition))
353
353
  continue;
354
354
  }
355
- if (eventid === 'Residual' && handler.end && handler.state && handler.state.duration) {
355
+ if (eventid === 'Residual' && handler.end && handler.state?.duration) {
356
356
  handler.state.duration--;
357
357
  if (!handler.state.duration) {
358
358
  const endCallArgs = handler.endCallArgs || [handler.effectHolder, effect.id];
@@ -568,7 +568,6 @@ class Battle {
568
568
  if (onEffect) {
569
569
  if (!sourceEffect)
570
570
  throw new Error("onEffect passed without an effect");
571
- // @ts-ignore - dynamic lookup
572
571
  const callback = sourceEffect[`on${eventid}`];
573
572
  if (callback !== undefined) {
574
573
  if (Array.isArray(target))
@@ -737,11 +736,8 @@ class Battle {
737
736
  }
738
737
  resolvePriority(h, callbackName) {
739
738
  const handler = h;
740
- // @ts-ignore
741
739
  handler.order = handler.effect[`${callbackName}Order`] || false;
742
- // @ts-ignore
743
740
  handler.priority = handler.effect[`${callbackName}Priority`] || 0;
744
- // @ts-ignore
745
741
  handler.subOrder = handler.effect[`${callbackName}SubOrder`] || 0;
746
742
  if (!handler.subOrder) {
747
743
  // https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-59#post-8685465
@@ -810,7 +806,7 @@ class Battle {
810
806
  let handlers = [];
811
807
  if (Array.isArray(target)) {
812
808
  for (const [i, pokemon] of target.entries()) {
813
- // console.log(`Event: ${eventName}, Target: ${'' + pokemon}, ${i}`);
809
+ // console.log(`Event: ${eventName}, Target: ${pokemon}, ${i}`);
814
810
  const curHandlers = this.findEventHandlers(pokemon, eventName, source);
815
811
  for (const handler of curHandlers) {
816
812
  handler.target = pokemon; // Original "effectHolder"
@@ -860,7 +856,7 @@ class Battle {
860
856
  findPokemonEventHandlers(pokemon, callbackName, getKey) {
861
857
  const handlers = [];
862
858
  const status = pokemon.getStatus();
863
- // @ts-ignore - dynamic lookup
859
+ // @ts-expect-error dynamic lookup
864
860
  let callback = status[callbackName];
865
861
  if (callback !== undefined || (getKey && pokemon.statusState[getKey])) {
866
862
  handlers.push(this.resolvePriority({
@@ -870,7 +866,7 @@ class Battle {
870
866
  for (const id in pokemon.volatiles) {
871
867
  const volatileState = pokemon.volatiles[id];
872
868
  const volatile = this.dex.conditions.getByID(id);
873
- // @ts-ignore - dynamic lookup
869
+ // @ts-expect-error dynamic lookup
874
870
  callback = volatile[callbackName];
875
871
  if (callback !== undefined || (getKey && volatileState[getKey])) {
876
872
  handlers.push(this.resolvePriority({
@@ -879,7 +875,7 @@ class Battle {
879
875
  }
880
876
  else if (['ability', 'item'].includes(volatile.id.split(':')[0])) {
881
877
  // Innate abilities/items; see comment below
882
- // @ts-ignore - dynamic lookup
878
+ // @ts-expect-error dynamic lookup
883
879
  if (this.gen >= 5 && callbackName === 'onSwitchIn' && !volatile.onAnySwitchIn) {
884
880
  callback = volatile.onStart;
885
881
  if (callback !== undefined || (getKey && volatileState[getKey])) {
@@ -894,16 +890,16 @@ class Battle {
894
890
  // during the SwitchIn event instead of running the Start event during switch-ins
895
891
  // gens 4 and before still use the old system, though
896
892
  const ability = pokemon.getAbility();
897
- // @ts-ignore - dynamic lookup
893
+ // @ts-expect-error dynamic lookup
898
894
  callback = ability[callbackName];
899
895
  if (callback !== undefined || (getKey && pokemon.abilityState[getKey])) {
900
896
  handlers.push(this.resolvePriority({
901
897
  effect: ability, callback, state: pokemon.abilityState, end: pokemon.clearAbility, effectHolder: pokemon,
902
898
  }, callbackName));
903
- // @ts-ignore - dynamic lookup
899
+ // @ts-expect-error dynamic lookup
904
900
  }
905
901
  else if (this.gen >= 5 && callbackName === 'onSwitchIn' && !ability.onAnySwitchIn) {
906
- // @ts-ignore - dynamic lookup
902
+ // @ts-expect-error dynamic lookup
907
903
  callback = ability.onStart;
908
904
  if (callback !== undefined || (getKey && pokemon.abilityState[getKey])) {
909
905
  handlers.push(this.resolvePriority({
@@ -912,16 +908,15 @@ class Battle {
912
908
  }
913
909
  }
914
910
  const item = pokemon.getItem();
915
- // @ts-ignore - dynamic lookup
911
+ // @ts-expect-error dynamic lookup
916
912
  callback = item[callbackName];
917
913
  if (callback !== undefined || (getKey && pokemon.itemState[getKey])) {
918
914
  handlers.push(this.resolvePriority({
919
915
  effect: item, callback, state: pokemon.itemState, end: pokemon.clearItem, effectHolder: pokemon,
920
916
  }, callbackName));
921
- // @ts-ignore - dynamic lookup
917
+ // @ts-expect-error dynamic lookup
922
918
  }
923
919
  else if (this.gen >= 5 && callbackName === 'onSwitchIn' && !item.onAnySwitchIn) {
924
- // @ts-ignore - dynamic lookup
925
920
  callback = item.onStart;
926
921
  if (callback !== undefined || (getKey && pokemon.itemState[getKey])) {
927
922
  handlers.push(this.resolvePriority({
@@ -930,7 +925,7 @@ class Battle {
930
925
  }
931
926
  }
932
927
  const species = pokemon.baseSpecies;
933
- // @ts-ignore - dynamic lookup
928
+ // @ts-expect-error dynamic lookup
934
929
  callback = species[callbackName];
935
930
  if (callback !== undefined) {
936
931
  handlers.push(this.resolvePriority({
@@ -941,7 +936,7 @@ class Battle {
941
936
  for (const conditionid in side.slotConditions[pokemon.position]) {
942
937
  const slotConditionState = side.slotConditions[pokemon.position][conditionid];
943
938
  const slotCondition = this.dex.conditions.getByID(conditionid);
944
- // @ts-ignore - dynamic lookup
939
+ // @ts-expect-error dynamic lookup
945
940
  callback = slotCondition[callbackName];
946
941
  if (callback !== undefined || (getKey && slotConditionState[getKey])) {
947
942
  handlers.push(this.resolvePriority({
@@ -960,7 +955,7 @@ class Battle {
960
955
  const handlers = [];
961
956
  let callback;
962
957
  const format = this.format;
963
- // @ts-ignore - dynamic lookup
958
+ // @ts-expect-error dynamic lookup
964
959
  callback = format[callbackName];
965
960
  if (callback !== undefined || (getKey && this.formatData[getKey])) {
966
961
  handlers.push(this.resolvePriority({
@@ -984,7 +979,7 @@ class Battle {
984
979
  for (const id in field.pseudoWeather) {
985
980
  const pseudoWeatherState = field.pseudoWeather[id];
986
981
  const pseudoWeather = this.dex.conditions.getByID(id);
987
- // @ts-ignore - dynamic lookup
982
+ // @ts-expect-error dynamic lookup
988
983
  callback = pseudoWeather[callbackName];
989
984
  if (callback !== undefined || (getKey && pseudoWeatherState[getKey])) {
990
985
  handlers.push(this.resolvePriority({
@@ -994,7 +989,7 @@ class Battle {
994
989
  }
995
990
  }
996
991
  const weather = field.getWeather();
997
- // @ts-ignore - dynamic lookup
992
+ // @ts-expect-error dynamic lookup
998
993
  callback = weather[callbackName];
999
994
  if (callback !== undefined || (getKey && this.field.weatherState[getKey])) {
1000
995
  handlers.push(this.resolvePriority({
@@ -1003,7 +998,7 @@ class Battle {
1003
998
  }, callbackName));
1004
999
  }
1005
1000
  const terrain = field.getTerrain();
1006
- // @ts-ignore - dynamic lookup
1001
+ // @ts-expect-error dynamic lookup
1007
1002
  callback = terrain[callbackName];
1008
1003
  if (callback !== undefined || (getKey && field.terrainState[getKey])) {
1009
1004
  handlers.push(this.resolvePriority({
@@ -1018,7 +1013,7 @@ class Battle {
1018
1013
  for (const id in side.sideConditions) {
1019
1014
  const sideConditionData = side.sideConditions[id];
1020
1015
  const sideCondition = this.dex.conditions.getByID(id);
1021
- // @ts-ignore - dynamic lookup
1016
+ // @ts-expect-error dynamic lookup
1022
1017
  const callback = sideCondition[callbackName];
1023
1018
  if (callback !== undefined || (getKey && sideConditionData[getKey])) {
1024
1019
  handlers.push(this.resolvePriority({
@@ -1144,7 +1139,7 @@ class Battle {
1144
1139
  // the entire team order, unlike `pickedTeamSize = undefined` which
1145
1140
  // will only ask the user to select their lead(s).
1146
1141
  const pickedTeamSize = this.ruleTable.pickedTeamSize;
1147
- this.add('teampreview' + (pickedTeamSize ? '|' + pickedTeamSize : ''));
1142
+ this.add(`teampreview${pickedTeamSize ? `|${pickedTeamSize}` : ''}`);
1148
1143
  }
1149
1144
  const requests = this.getRequests(type);
1150
1145
  for (let i = 0; i < this.sides.length; i++) {
@@ -1837,10 +1832,10 @@ class Battle {
1837
1832
  this.add('-damage', target, target.getHealth);
1838
1833
  }
1839
1834
  else if (source && (source !== target || effect.effectType === 'Ability')) {
1840
- this.add('-damage', target, target.getHealth, '[from] ' + name, '[of] ' + source);
1835
+ this.add('-damage', target, target.getHealth, `[from] ${name}`, `[of] ${source}`);
1841
1836
  }
1842
1837
  else {
1843
- this.add('-damage', target, target.getHealth, '[from] ' + name);
1838
+ this.add('-damage', target, target.getHealth, `[from] ${name}`);
1844
1839
  }
1845
1840
  break;
1846
1841
  }
@@ -1869,7 +1864,7 @@ class Battle {
1869
1864
  if (!retVals[i] || !target)
1870
1865
  continue;
1871
1866
  if (target.hp <= 0) {
1872
- this.debug('instafaint: ' + this.faintQueue.map(entry => entry.target.name));
1867
+ this.debug(`instafaint: ${this.faintQueue.map(entry => entry.target.name)}`);
1873
1868
  this.faintMessages(true);
1874
1869
  if (this.gen <= 2) {
1875
1870
  target.faint();
@@ -1877,7 +1872,7 @@ class Battle {
1877
1872
  this.queue.clear();
1878
1873
  // Fainting clears accumulated Bide damage
1879
1874
  for (const pokemon of this.getAllActive()) {
1880
- if (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {
1875
+ if (pokemon.volatiles['bide']?.damage) {
1881
1876
  pokemon.volatiles['bide'].damage = 0;
1882
1877
  this.hint("Desync Clause Mod activated!");
1883
1878
  this.hint("In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.");
@@ -1982,7 +1977,7 @@ class Battle {
1982
1977
  this.add('-heal', target, target.getHealth, '[silent]');
1983
1978
  break;
1984
1979
  case 'drain':
1985
- this.add('-heal', target, target.getHealth, '[from] drain', '[of] ' + source);
1980
+ this.add('-heal', target, target.getHealth, '[from] drain', `[of] ${source}`);
1986
1981
  break;
1987
1982
  case 'wish':
1988
1983
  break;
@@ -1996,10 +1991,10 @@ class Battle {
1996
1991
  this.add('-heal', target, target.getHealth);
1997
1992
  }
1998
1993
  else if (source && source !== target) {
1999
- this.add('-heal', target, target.getHealth, '[from] ' + effect.fullname, '[of] ' + source);
1994
+ this.add('-heal', target, target.getHealth, `[from] ${effect.fullname}`, `[of] ${source}`);
2000
1995
  }
2001
1996
  else {
2002
- this.add('-heal', target, target.getHealth, '[from] ' + effect.fullname);
1997
+ this.add('-heal', target, target.getHealth, `[from] ${effect.fullname}`);
2003
1998
  }
2004
1999
  break;
2005
2000
  }
@@ -2134,7 +2129,7 @@ class Battle {
2134
2129
  // we need to manually check for Stalwart here
2135
2130
  if (pokemon.hasAbility(['stalwart', 'propellertail']))
2136
2131
  tracksTarget = true;
2137
- if (tracksTarget && originalTarget && originalTarget.isActive) {
2132
+ if (tracksTarget && originalTarget?.isActive) {
2138
2133
  // smart-tracking move's original target is on the field: target it
2139
2134
  return originalTarget;
2140
2135
  }
@@ -2235,8 +2230,7 @@ class Battle {
2235
2230
  faintQueueLeft = this.faintQueue.length;
2236
2231
  faintData = this.faintQueue.shift();
2237
2232
  const pokemon = faintData.target;
2238
- if (!pokemon.fainted &&
2239
- this.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {
2233
+ if (!pokemon.fainted && this.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {
2240
2234
  this.add('faint', pokemon);
2241
2235
  if (pokemon.side.pokemonLeft)
2242
2236
  pokemon.side.pokemonLeft--;
@@ -2272,7 +2266,7 @@ class Battle {
2272
2266
  this.queue.clear();
2273
2267
  // Fainting clears accumulated Bide damage
2274
2268
  for (const pokemon of this.getAllActive()) {
2275
- if (pokemon.volatiles['bide'] && pokemon.volatiles['bide'].damage) {
2269
+ if (pokemon.volatiles['bide']?.damage) {
2276
2270
  pokemon.volatiles['bide'].damage = 0;
2277
2271
  this.hint("Desync Clause Mod activated!");
2278
2272
  this.hint("In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.");
@@ -2392,8 +2386,8 @@ class Battle {
2392
2386
  pokemon.baseMoveSlots[ironHead] = {
2393
2387
  move: move.name,
2394
2388
  id: move.id,
2395
- pp: (move.noPPBoosts || move.isZ) ? move.pp : move.pp * 8 / 5,
2396
- maxpp: (move.noPPBoosts || move.isZ) ? move.pp : move.pp * 8 / 5,
2389
+ pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
2390
+ maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
2397
2391
  target: move.target,
2398
2392
  disabled: false,
2399
2393
  disabledSource: '',
@@ -2552,7 +2546,8 @@ class Battle {
2552
2546
  this.updateSpeed();
2553
2547
  residualPokemon = this.getAllActive().map(pokemon => [pokemon, pokemon.getUndynamaxedHP()]);
2554
2548
  this.fieldEvent('Residual');
2555
- this.add('upkeep');
2549
+ if (!this.ended)
2550
+ this.add('upkeep');
2556
2551
  break;
2557
2552
  }
2558
2553
  // phazing (Roar, etc)
@@ -2822,6 +2817,7 @@ class Battle {
2822
2817
  }
2823
2818
  addMove(...args) {
2824
2819
  this.lastMoveLine = this.log.length;
2820
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
2825
2821
  this.log.push(`|${args.join('|')}`);
2826
2822
  }
2827
2823
  attrLastMove(...args) {
@@ -2840,6 +2836,7 @@ class Battle {
2840
2836
  parts[4] = '';
2841
2837
  this.log[this.lastMoveLine] = parts.join('|');
2842
2838
  }
2839
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
2843
2840
  this.log[this.lastMoveLine] += `|${args.join('|')}`;
2844
2841
  }
2845
2842
  retargetLastMove(newTarget) {
@@ -2933,7 +2930,7 @@ class Battle {
2933
2930
  const team = this.getTeam(options);
2934
2931
  side = new side_1.Side(options.name || `Player ${slotNum + 1}`, this, slotNum, team);
2935
2932
  if (options.avatar)
2936
- side.avatar = '' + options.avatar;
2933
+ side.avatar = `${options.avatar}`;
2937
2934
  this.sides[slotNum] = side;
2938
2935
  }
2939
2936
  else {
@@ -2944,8 +2941,8 @@ class Battle {
2944
2941
  side.name = options.name;
2945
2942
  didSomething = true;
2946
2943
  }
2947
- if (options.avatar && side.avatar !== '' + options.avatar) {
2948
- side.avatar = '' + options.avatar;
2944
+ if (options.avatar && side.avatar !== `${options.avatar}`) {
2945
+ side.avatar = `${options.avatar}`;
2949
2946
  didSomething = true;
2950
2947
  }
2951
2948
  if (options.team)
@@ -2979,12 +2976,12 @@ class Battle {
2979
2976
  turns: this.turn,
2980
2977
  p1: this.sides[0].name,
2981
2978
  p2: this.sides[1].name,
2982
- p3: this.sides[2] && this.sides[2].name,
2983
- p4: this.sides[3] && this.sides[3].name,
2979
+ p3: this.sides[2]?.name,
2980
+ p4: this.sides[3]?.name,
2984
2981
  p1team: this.sides[0].team,
2985
2982
  p2team: this.sides[1].team,
2986
- p3team: this.sides[2] && this.sides[2].team,
2987
- p4team: this.sides[3] && this.sides[3].team,
2983
+ p3team: this.sides[2]?.team,
2984
+ p4team: this.sides[3]?.team,
2988
2985
  score: [this.sides[0].pokemonLeft, this.sides[1].pokemonLeft],
2989
2986
  inputLog: this.inputLog,
2990
2987
  };