@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
@@ -359,7 +359,7 @@ exports.Moves = {
359
359
  // this.effectState.counter should never be undefined here.
360
360
  // However, just in case, use 1 if it is undefined.
361
361
  const counter = this.effectState.counter || 1;
362
- this.debug("Ally Switch success chance: " + Math.round(100 / counter) + "%");
362
+ this.debug(`Ally Switch success chance: ${Math.round(100 / counter)}%`);
363
363
  const success = this.randomChance(1, counter);
364
364
  if (!success) {
365
365
  delete pokemon.volatiles['allyswitch'];
@@ -597,7 +597,7 @@ exports.Moves = {
597
597
  let success = false;
598
598
  const allies = [...target.side.pokemon, ...target.side.allySide?.pokemon || []];
599
599
  for (const ally of allies) {
600
- if (ally !== source) {
600
+ if (ally !== source && !this.suppressingAbility(ally)) {
601
601
  if (ally.hasAbility('sapsipper')) {
602
602
  this.add('-immune', ally, '[from] ability: Sap Sipper');
603
603
  continue;
@@ -763,10 +763,10 @@ exports.Moves = {
763
763
  return false;
764
764
  }
765
765
  if (effect.name === 'Cute Charm') {
766
- this.add('-start', pokemon, 'Attract', '[from] ability: Cute Charm', '[of] ' + source);
766
+ this.add('-start', pokemon, 'Attract', '[from] ability: Cute Charm', `[of] ${source}`);
767
767
  }
768
768
  else if (effect.name === 'Destiny Knot') {
769
- this.add('-start', pokemon, 'Attract', '[from] item: Destiny Knot', '[of] ' + source);
769
+ this.add('-start', pokemon, 'Attract', '[from] item: Destiny Knot', `[of] ${source}`);
770
770
  }
771
771
  else {
772
772
  this.add('-start', pokemon, 'Attract');
@@ -774,7 +774,7 @@ exports.Moves = {
774
774
  },
775
775
  onUpdate(pokemon) {
776
776
  if (this.effectState.source && !this.effectState.source.isActive && pokemon.volatiles['attract']) {
777
- this.debug('Removing Attract volatile on ' + pokemon);
777
+ this.debug(`Removing Attract volatile on ${pokemon}`);
778
778
  pokemon.removeVolatile('attract');
779
779
  }
780
780
  },
@@ -957,7 +957,7 @@ exports.Moves = {
957
957
  basePowerCallback(pokemon, target, move) {
958
958
  const damagedByTarget = pokemon.attackedBy.some(p => p.source === target && p.damage > 0 && p.thisTurn);
959
959
  if (damagedByTarget) {
960
- this.debug('BP doubled for getting hit by ' + target);
960
+ this.debug(`BP doubled for getting hit by ${target}`);
961
961
  return move.basePower * 2;
962
962
  }
963
963
  return move.basePower;
@@ -1212,7 +1212,7 @@ exports.Moves = {
1212
1212
  basePowerCallback(pokemon, target, move) {
1213
1213
  const currentSpecies = move.allies.shift().species;
1214
1214
  const bp = 5 + Math.floor(currentSpecies.baseStats.atk / 10);
1215
- this.debug('BP for ' + currentSpecies.name + ' hit: ' + bp);
1215
+ this.debug(`BP for ${currentSpecies.name} hit: ${bp}`);
1216
1216
  return bp;
1217
1217
  },
1218
1218
  category: "Physical",
@@ -1316,7 +1316,7 @@ exports.Moves = {
1316
1316
  source.item = myItem.id;
1317
1317
  return false;
1318
1318
  }
1319
- this.add('-item', target, myItem.name, '[from] move: Bestow', '[of] ' + source);
1319
+ this.add('-item', target, myItem.name, '[from] move: Bestow', `[of] ${source}`);
1320
1320
  },
1321
1321
  secondary: null,
1322
1322
  target: "normal",
@@ -2006,7 +2006,7 @@ exports.Moves = {
2006
2006
  onHit(target, source) {
2007
2007
  const item = target.getItem();
2008
2008
  if (source.hp && item.isBerry && target.takeItem(source)) {
2009
- this.add('-enditem', target, item.name, '[from] stealeat', '[move] Bug Bite', '[of] ' + source);
2009
+ this.add('-enditem', target, item.name, '[from] stealeat', '[move] Bug Bite', `[of] ${source}`);
2010
2010
  if (this.singleEvent('Eat', item, null, source, null, null)) {
2011
2011
  this.runEvent('EatItem', source, null, null, item);
2012
2012
  if (item.id === 'leppaberry')
@@ -2814,7 +2814,7 @@ exports.Moves = {
2814
2814
  flags: { contact: 1, protect: 1, mirror: 1, failmefirst: 1 },
2815
2815
  onTry(source) {
2816
2816
  const lastDamagedBy = source.getLastDamagedBy(true);
2817
- if (lastDamagedBy === undefined || !lastDamagedBy.thisTurn)
2817
+ if (!lastDamagedBy?.thisTurn)
2818
2818
  return false;
2819
2819
  },
2820
2820
  onModifyTarget(targetRelayVar, source, target, move) {
@@ -3059,7 +3059,7 @@ exports.Moves = {
3059
3059
  onHit(target, source) {
3060
3060
  const item = target.takeItem(source);
3061
3061
  if (item) {
3062
- this.add('-enditem', target, item.name, '[from] move: Corrosive Gas', '[of] ' + source);
3062
+ this.add('-enditem', target, item.name, '[from] move: Corrosive Gas', `[of] ${source}`);
3063
3063
  }
3064
3064
  else {
3065
3065
  this.add('-fail', target, 'move: Corrosive Gas');
@@ -3275,7 +3275,7 @@ exports.Moves = {
3275
3275
  target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
3276
3276
  return;
3277
3277
  }
3278
- this.add('-item', source, yourItem, '[from] move: Covet', '[of] ' + target);
3278
+ this.add('-item', source, yourItem, '[from] move: Covet', `[of] ${target}`);
3279
3279
  },
3280
3280
  secondary: null,
3281
3281
  target: "normal",
@@ -3409,7 +3409,7 @@ exports.Moves = {
3409
3409
  const hp = target.hp;
3410
3410
  const maxHP = target.maxhp;
3411
3411
  const bp = Math.floor(Math.floor((120 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
3412
- this.debug('BP for ' + hp + '/' + maxHP + " HP: " + bp);
3412
+ this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
3413
3413
  return bp;
3414
3414
  },
3415
3415
  category: "Physical",
@@ -3457,7 +3457,7 @@ exports.Moves = {
3457
3457
  },
3458
3458
  condition: {
3459
3459
  onStart(pokemon, source) {
3460
- this.add('-start', pokemon, 'Curse', '[of] ' + source);
3460
+ this.add('-start', pokemon, 'Curse', `[of] ${source}`);
3461
3461
  },
3462
3462
  onResidualOrder: 12,
3463
3463
  onResidual(pokemon) {
@@ -3639,13 +3639,13 @@ exports.Moves = {
3639
3639
  if (target.side.removeSideCondition(targetCondition)) {
3640
3640
  if (!removeAll.includes(targetCondition))
3641
3641
  continue;
3642
- this.add('-sideend', target.side, this.dex.conditions.get(targetCondition).name, '[from] move: Defog', '[of] ' + source);
3642
+ this.add('-sideend', target.side, this.dex.conditions.get(targetCondition).name, '[from] move: Defog', `[of] ${source}`);
3643
3643
  success = true;
3644
3644
  }
3645
3645
  }
3646
3646
  for (const sideCondition of removeAll) {
3647
3647
  if (source.side.removeSideCondition(sideCondition)) {
3648
- this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', '[of] ' + source);
3648
+ this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: Defog', `[of] ${source}`);
3649
3649
  success = true;
3650
3650
  }
3651
3651
  }
@@ -3848,7 +3848,7 @@ exports.Moves = {
3848
3848
  }
3849
3849
  }
3850
3850
  if (effect.effectType === 'Ability') {
3851
- this.add('-start', pokemon, 'Disable', pokemon.lastMove.name, '[from] ability: ' + effect.name, '[of] ' + source);
3851
+ this.add('-start', pokemon, 'Disable', pokemon.lastMove.name, '[from] ability: ' + effect.name, `[of] ${source}`);
3852
3852
  }
3853
3853
  else {
3854
3854
  this.add('-start', pokemon, 'Disable', pokemon.lastMove.name);
@@ -4057,7 +4057,7 @@ exports.Moves = {
4057
4057
  return false;
4058
4058
  Object.assign(target.side.slotConditions[target.position]['futuremove'], {
4059
4059
  move: 'doomdesire',
4060
- source: source,
4060
+ source,
4061
4061
  moveData: {
4062
4062
  id: 'doomdesire',
4063
4063
  name: "Doom Desire",
@@ -4352,7 +4352,7 @@ exports.Moves = {
4352
4352
  basePower: 150,
4353
4353
  basePowerCallback(pokemon, target, move) {
4354
4354
  const bp = move.basePower * pokemon.hp / pokemon.maxhp;
4355
- this.debug('BP: ' + bp);
4355
+ this.debug(`BP: ${bp}`);
4356
4356
  return bp;
4357
4357
  },
4358
4358
  category: "Special",
@@ -4638,7 +4638,7 @@ exports.Moves = {
4638
4638
  if (this.field.pseudoWeather.echoedvoice) {
4639
4639
  bp = move.basePower * this.field.pseudoWeather.echoedvoice.multiplier;
4640
4640
  }
4641
- this.debug('BP: ' + move.basePower);
4641
+ this.debug(`BP: ${move.basePower}`);
4642
4642
  return bp;
4643
4643
  },
4644
4644
  category: "Special",
@@ -4772,7 +4772,7 @@ exports.Moves = {
4772
4772
  },
4773
4773
  onFieldStart(field, source, effect) {
4774
4774
  if (effect?.effectType === 'Ability') {
4775
- this.add('-fieldstart', 'move: Electric Terrain', '[from] ability: ' + effect.name, '[of] ' + source);
4775
+ this.add('-fieldstart', 'move: Electric Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
4776
4776
  }
4777
4777
  else {
4778
4778
  this.add('-fieldstart', 'move: Electric Terrain');
@@ -4833,7 +4833,7 @@ exports.Moves = {
4833
4833
  if (!isFinite(ratio))
4834
4834
  ratio = 0;
4835
4835
  const bp = [40, 60, 80, 120, 150][Math.min(ratio, 4)];
4836
- this.debug('BP: ' + bp);
4836
+ this.debug(`BP: ${bp}`);
4837
4837
  return bp;
4838
4838
  },
4839
4839
  category: "Special",
@@ -5144,7 +5144,7 @@ exports.Moves = {
5144
5144
  basePower: 150,
5145
5145
  basePowerCallback(pokemon, target, move) {
5146
5146
  const bp = move.basePower * pokemon.hp / pokemon.maxhp;
5147
- this.debug('BP: ' + bp);
5147
+ this.debug(`BP: ${bp}`);
5148
5148
  return bp;
5149
5149
  },
5150
5150
  category: "Special",
@@ -5831,7 +5831,7 @@ exports.Moves = {
5831
5831
  else {
5832
5832
  bp = 20;
5833
5833
  }
5834
- this.debug('BP: ' + bp);
5834
+ this.debug(`BP: ${bp}`);
5835
5835
  return bp;
5836
5836
  },
5837
5837
  category: "Physical",
@@ -6038,7 +6038,7 @@ exports.Moves = {
6038
6038
  if (!item.fling)
6039
6039
  return false;
6040
6040
  move.basePower = item.fling.basePower;
6041
- this.debug('BP: ' + move.basePower);
6041
+ this.debug(`BP: ${move.basePower}`);
6042
6042
  if (item.isBerry) {
6043
6043
  move.onHit = function (foe) {
6044
6044
  if (this.singleEvent('Eat', item, null, foe, null, null)) {
@@ -6312,7 +6312,9 @@ exports.Moves = {
6312
6312
  name: "Focus Punch",
6313
6313
  pp: 20,
6314
6314
  priority: -3,
6315
- flags: { contact: 1, protect: 1, punch: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1 },
6315
+ flags: {
6316
+ contact: 1, protect: 1, punch: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1,
6317
+ },
6316
6318
  priorityChargeCallback(pokemon) {
6317
6319
  pokemon.addVolatile('focuspunch');
6318
6320
  },
@@ -6633,7 +6635,7 @@ exports.Moves = {
6633
6635
  pokemon.addVolatile('furycutter');
6634
6636
  }
6635
6637
  const bp = this.clampIntRange(move.basePower * pokemon.volatiles['furycutter'].multiplier, 1, 160);
6636
- this.debug('BP: ' + bp);
6638
+ this.debug(`BP: ${bp}`);
6637
6639
  return bp;
6638
6640
  },
6639
6641
  category: "Physical",
@@ -6729,7 +6731,7 @@ exports.Moves = {
6729
6731
  return false;
6730
6732
  Object.assign(target.side.slotConditions[target.position]['futuremove'], {
6731
6733
  move: 'futuresight',
6732
- source: source,
6734
+ source,
6733
6735
  moveData: {
6734
6736
  id: 'futuresight',
6735
6737
  name: "Future Sight",
@@ -7617,7 +7619,7 @@ exports.Moves = {
7617
7619
  const steelHazard = this.dex.getActiveMove('Stealth Rock');
7618
7620
  steelHazard.type = 'Steel';
7619
7621
  const typeMod = this.clampIntRange(pokemon.runEffectiveness(steelHazard), -6, 6);
7620
- this.damage(pokemon.maxhp * Math.pow(2, typeMod) / 8);
7622
+ this.damage(pokemon.maxhp * (2 ** typeMod) / 8);
7621
7623
  },
7622
7624
  },
7623
7625
  secondary: null,
@@ -7911,13 +7913,13 @@ exports.Moves = {
7911
7913
  if (source.side.foe.removeSideCondition(targetCondition)) {
7912
7914
  if (!removeAll.includes(targetCondition))
7913
7915
  continue;
7914
- this.add('-sideend', source.side.foe, this.dex.conditions.get(targetCondition).name, '[from] move: G-Max Wind Rage', '[of] ' + source);
7916
+ this.add('-sideend', source.side.foe, this.dex.conditions.get(targetCondition).name, '[from] move: G-Max Wind Rage', `[of] ${source}`);
7915
7917
  success = true;
7916
7918
  }
7917
7919
  }
7918
7920
  for (const sideCondition of removeAll) {
7919
7921
  if (source.side.removeSideCondition(sideCondition)) {
7920
- this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: G-Max Wind Rage', '[of] ' + source);
7922
+ this.add('-sideend', source.side, this.dex.conditions.get(sideCondition).name, '[from] move: G-Max Wind Rage', `[of] ${source}`);
7921
7923
  success = true;
7922
7924
  }
7923
7925
  }
@@ -7955,7 +7957,7 @@ exports.Moves = {
7955
7957
  else {
7956
7958
  bp = 20;
7957
7959
  }
7958
- this.debug('BP: ' + bp);
7960
+ this.debug(`BP: ${bp}`);
7959
7961
  return bp;
7960
7962
  },
7961
7963
  category: "Special",
@@ -8105,7 +8107,7 @@ exports.Moves = {
8105
8107
  },
8106
8108
  onFieldStart(field, source, effect) {
8107
8109
  if (effect?.effectType === 'Ability') {
8108
- this.add('-fieldstart', 'move: Grassy Terrain', '[from] ability: ' + effect.name, '[of] ' + source);
8110
+ this.add('-fieldstart', 'move: Grassy Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
8109
8111
  }
8110
8112
  else {
8111
8113
  this.add('-fieldstart', 'move: Grassy Terrain');
@@ -8372,7 +8374,7 @@ exports.Moves = {
8372
8374
  const newspd = Math.floor((target.storedStats.spd + source.storedStats.spd) / 2);
8373
8375
  target.storedStats.spd = newspd;
8374
8376
  source.storedStats.spd = newspd;
8375
- this.add('-activate', source, 'move: Guard Split', '[of] ' + target);
8377
+ this.add('-activate', source, 'move: Guard Split', `[of] ${target}`);
8376
8378
  },
8377
8379
  secondary: null,
8378
8380
  target: "normal",
@@ -8465,7 +8467,7 @@ exports.Moves = {
8465
8467
  power = 1;
8466
8468
  if (power > 150)
8467
8469
  power = 150;
8468
- this.debug('BP: ' + power);
8470
+ this.debug(`BP: ${power}`);
8469
8471
  return power;
8470
8472
  },
8471
8473
  category: "Physical",
@@ -8560,7 +8562,7 @@ exports.Moves = {
8560
8562
  const hp = target.hp;
8561
8563
  const maxHP = target.maxhp;
8562
8564
  const bp = Math.floor(Math.floor((100 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
8563
- this.debug('BP for ' + hp + '/' + maxHP + " HP: " + bp);
8565
+ this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
8564
8566
  return bp;
8565
8567
  },
8566
8568
  category: "Physical",
@@ -8674,7 +8676,7 @@ exports.Moves = {
8674
8676
  let success = false;
8675
8677
  const allies = [...target.side.pokemon, ...target.side.allySide?.pokemon || []];
8676
8678
  for (const ally of allies) {
8677
- if (ally !== source) {
8679
+ if (ally !== source && !this.suppressingAbility(ally)) {
8678
8680
  if (ally.hasAbility('soundproof')) {
8679
8681
  this.add('-immune', ally, '[from] ability: Soundproof');
8680
8682
  continue;
@@ -8918,7 +8920,7 @@ exports.Moves = {
8918
8920
  else {
8919
8921
  bp = 40;
8920
8922
  }
8921
- this.debug('BP: ' + bp);
8923
+ this.debug(`BP: ${bp}`);
8922
8924
  return bp;
8923
8925
  },
8924
8926
  category: "Physical",
@@ -8980,7 +8982,7 @@ exports.Moves = {
8980
8982
  else {
8981
8983
  bp = 40;
8982
8984
  }
8983
- this.debug('BP: ' + bp);
8985
+ this.debug(`BP: ${bp}`);
8984
8986
  return bp;
8985
8987
  },
8986
8988
  category: "Physical",
@@ -9020,11 +9022,11 @@ exports.Moves = {
9020
9022
  duration: 1,
9021
9023
  onStart(target, source) {
9022
9024
  this.effectState.multiplier = 1.5;
9023
- this.add('-singleturn', target, 'Helping Hand', '[of] ' + source);
9025
+ this.add('-singleturn', target, 'Helping Hand', `[of] ${source}`);
9024
9026
  },
9025
9027
  onRestart(target, source) {
9026
9028
  this.effectState.multiplier *= 1.5;
9027
- this.add('-singleturn', target, 'Helping Hand', '[of] ' + source);
9029
+ this.add('-singleturn', target, 'Helping Hand', `[of] ${source}`);
9028
9030
  },
9029
9031
  onBasePowerPriority: 10,
9030
9032
  onBasePower(basePower) {
@@ -9712,7 +9714,7 @@ exports.Moves = {
9712
9714
  let bp = move.basePower;
9713
9715
  const iceballData = pokemon.volatiles['iceball'];
9714
9716
  if (iceballData?.hitCount) {
9715
- bp *= Math.pow(2, iceballData.contactHitCount);
9717
+ bp *= 2 ** iceballData.contactHitCount;
9716
9718
  }
9717
9719
  if (iceballData && pokemon.status !== 'slp') {
9718
9720
  iceballData.hitCount++;
@@ -9724,7 +9726,7 @@ exports.Moves = {
9724
9726
  if (pokemon.volatiles['defensecurl']) {
9725
9727
  bp *= 2;
9726
9728
  }
9727
- this.debug("BP: " + bp);
9729
+ this.debug(`BP: ${bp}`);
9728
9730
  return bp;
9729
9731
  },
9730
9732
  category: "Physical",
@@ -10144,7 +10146,7 @@ exports.Moves = {
10144
10146
  (target.moveSlots[moveIndex] && target.moveSlots[moveIndex].pp <= 0)) {
10145
10147
  return false;
10146
10148
  }
10147
- this.add('-singleturn', target, 'move: Instruct', '[of] ' + source);
10149
+ this.add('-singleturn', target, 'move: Instruct', `[of] ${source}`);
10148
10150
  this.queue.prioritizeAction(this.queue.resolveAction({
10149
10151
  choice: 'move',
10150
10152
  pokemon: target,
@@ -10485,7 +10487,7 @@ exports.Moves = {
10485
10487
  if (source.hp) {
10486
10488
  const item = target.takeItem();
10487
10489
  if (item) {
10488
- this.add('-enditem', target, item.name, '[from] move: Knock Off', '[of] ' + source);
10490
+ this.add('-enditem', target, item.name, '[from] move: Knock Off', `[of] ${source}`);
10489
10491
  }
10490
10492
  }
10491
10493
  },
@@ -10939,7 +10941,7 @@ exports.Moves = {
10939
10941
  },
10940
10942
  onHit(target, source) {
10941
10943
  source.addVolatile('lockon', target);
10942
- this.add('-activate', source, 'move: Lock-On', '[of] ' + target);
10944
+ this.add('-activate', source, 'move: Lock-On', `[of] ${target}`);
10943
10945
  },
10944
10946
  condition: {
10945
10947
  noCopy: true, // doesn't get copied by Baton Pass
@@ -11002,7 +11004,7 @@ exports.Moves = {
11002
11004
  else {
11003
11005
  bp = 20;
11004
11006
  }
11005
- this.debug('BP: ' + bp);
11007
+ this.debug(`BP: ${bp}`);
11006
11008
  return bp;
11007
11009
  },
11008
11010
  category: "Physical",
@@ -11319,10 +11321,10 @@ exports.Moves = {
11319
11321
  },
11320
11322
  onFieldStart(target, source) {
11321
11323
  if (source?.hasAbility('persistent')) {
11322
- this.add('-fieldstart', 'move: Magic Room', '[of] ' + source, '[persistent]');
11324
+ this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`, '[persistent]');
11323
11325
  }
11324
11326
  else {
11325
- this.add('-fieldstart', 'move: Magic Room', '[of] ' + source);
11327
+ this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`);
11326
11328
  }
11327
11329
  for (const mon of this.getAllActive()) {
11328
11330
  this.singleEvent('End', mon.getItem(), mon.itemState, mon);
@@ -12272,7 +12274,7 @@ exports.Moves = {
12272
12274
  flags: { protect: 1, mirror: 1, metronome: 1, failmefirst: 1 },
12273
12275
  onTry(source) {
12274
12276
  const lastDamagedBy = source.getLastDamagedBy(true);
12275
- if (lastDamagedBy === undefined || !lastDamagedBy.thisTurn)
12277
+ if (!lastDamagedBy?.thisTurn)
12276
12278
  return false;
12277
12279
  },
12278
12280
  onModifyTarget(targetRelayVar, source, target, move) {
@@ -12525,7 +12527,7 @@ exports.Moves = {
12525
12527
  },
12526
12528
  onHit(target, source) {
12527
12529
  source.addVolatile('lockon', target);
12528
- this.add('-activate', source, 'move: Mind Reader', '[of] ' + target);
12530
+ this.add('-activate', source, 'move: Mind Reader', `[of] ${target}`);
12529
12531
  },
12530
12532
  secondary: null,
12531
12533
  target: "normal",
@@ -12831,7 +12833,7 @@ exports.Moves = {
12831
12833
  },
12832
12834
  onFieldStart(field, source, effect) {
12833
12835
  if (effect?.effectType === 'Ability') {
12834
- this.add('-fieldstart', 'move: Misty Terrain', '[from] ability: ' + effect.name, '[of] ' + source);
12836
+ this.add('-fieldstart', 'move: Misty Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
12835
12837
  }
12836
12838
  else {
12837
12839
  this.add('-fieldstart', 'move: Misty Terrain');
@@ -12969,12 +12971,12 @@ exports.Moves = {
12969
12971
  onAfterHit(target, pokemon, move) {
12970
12972
  if (!move.hasSheerForce) {
12971
12973
  if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
12972
- this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', '[of] ' + pokemon);
12974
+ this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', `[of] ${pokemon}`);
12973
12975
  }
12974
12976
  const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
12975
12977
  for (const condition of sideConditions) {
12976
12978
  if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
12977
- this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', '[of] ' + pokemon);
12979
+ this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', `[of] ${pokemon}`);
12978
12980
  }
12979
12981
  }
12980
12982
  if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
@@ -12985,12 +12987,12 @@ exports.Moves = {
12985
12987
  onAfterSubDamage(damage, target, pokemon, move) {
12986
12988
  if (!move.hasSheerForce) {
12987
12989
  if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
12988
- this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', '[of] ' + pokemon);
12990
+ this.add('-end', pokemon, 'Leech Seed', '[from] move: Mortal Spin', `[of] ${pokemon}`);
12989
12991
  }
12990
12992
  const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
12991
12993
  for (const condition of sideConditions) {
12992
12994
  if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
12993
- this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', '[of] ' + pokemon);
12995
+ this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Mortal Spin', `[of] ${pokemon}`);
12994
12996
  }
12995
12997
  }
12996
12998
  if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
@@ -13093,7 +13095,7 @@ exports.Moves = {
13093
13095
  condition: {
13094
13096
  duration: 5,
13095
13097
  onFieldStart(field, source) {
13096
- this.add('-fieldstart', 'move: Mud Sport', '[of] ' + source);
13098
+ this.add('-fieldstart', 'move: Mud Sport', `[of] ${source}`);
13097
13099
  },
13098
13100
  onBasePowerPriority: 1,
13099
13101
  onBasePower(basePower, attacker, defender, move) {
@@ -13237,7 +13239,7 @@ exports.Moves = {
13237
13239
  if (!item.naturalGift)
13238
13240
  return false;
13239
13241
  move.basePower = item.naturalGift.basePower;
13240
- this.debug('BP: ' + move.basePower);
13242
+ this.debug(`BP: ${move.basePower}`);
13241
13243
  pokemon.setItem('');
13242
13244
  pokemon.lastItem = item.id;
13243
13245
  pokemon.usedItemThisTurn = true;
@@ -13634,7 +13636,7 @@ exports.Moves = {
13634
13636
  volatileStatus: 'octolock',
13635
13637
  condition: {
13636
13638
  onStart(pokemon, source) {
13637
- this.add('-start', pokemon, 'move: Octolock', '[of] ' + source);
13639
+ this.add('-start', pokemon, 'move: Octolock', `[of] ${source}`);
13638
13640
  },
13639
13641
  onResidualOrder: 14,
13640
13642
  onResidual(pokemon) {
@@ -13647,7 +13649,7 @@ exports.Moves = {
13647
13649
  this.boost({ def: -1, spd: -1 }, pokemon, source, this.dex.getActiveMove('octolock'));
13648
13650
  },
13649
13651
  onTrapPokemon(pokemon) {
13650
- if (this.effectState.source && this.effectState.source.isActive)
13652
+ if (this.effectState.source?.isActive)
13651
13653
  pokemon.tryTrap();
13652
13654
  },
13653
13655
  },
@@ -13953,7 +13955,7 @@ exports.Moves = {
13953
13955
  onResidualOrder: 24,
13954
13956
  onResidual(pokemon) {
13955
13957
  const duration = pokemon.volatiles['perishsong'].duration;
13956
- this.add('-start', pokemon, 'perish' + duration);
13958
+ this.add('-start', pokemon, `perish${duration}`);
13957
13959
  },
13958
13960
  },
13959
13961
  secondary: null,
@@ -14053,7 +14055,7 @@ exports.Moves = {
14053
14055
  basePower: 0,
14054
14056
  basePowerCallback(pokemon) {
14055
14057
  const bp = Math.floor((pokemon.happiness * 10) / 25) || 1;
14056
- this.debug('BP: ' + bp);
14058
+ this.debug(`BP: ${bp}`);
14057
14059
  return bp;
14058
14060
  },
14059
14061
  category: "Special",
@@ -14149,7 +14151,7 @@ exports.Moves = {
14149
14151
  onHit(target, source) {
14150
14152
  const item = target.getItem();
14151
14153
  if (source.hp && item.isBerry && target.takeItem(source)) {
14152
- this.add('-enditem', target, item.name, '[from] stealeat', '[move] Pluck', '[of] ' + source);
14154
+ this.add('-enditem', target, item.name, '[from] stealeat', '[move] Pluck', `[of] ${source}`);
14153
14155
  if (this.singleEvent('Eat', item, null, source, null, null)) {
14154
14156
  this.runEvent('EatItem', source, null, null, item);
14155
14157
  if (item.id === 'leppaberry')
@@ -14493,7 +14495,7 @@ exports.Moves = {
14493
14495
  const newspa = Math.floor((target.storedStats.spa + source.storedStats.spa) / 2);
14494
14496
  target.storedStats.spa = newspa;
14495
14497
  source.storedStats.spa = newspa;
14496
- this.add('-activate', source, 'move: Power Split', '[of] ' + target);
14498
+ this.add('-activate', source, 'move: Power Split', `[of] ${target}`);
14497
14499
  },
14498
14500
  secondary: null,
14499
14501
  target: "normal",
@@ -14575,7 +14577,7 @@ exports.Moves = {
14575
14577
  basePower: 20,
14576
14578
  basePowerCallback(pokemon, target, move) {
14577
14579
  const bp = move.basePower + 20 * pokemon.positiveBoosts();
14578
- this.debug('BP: ' + bp);
14580
+ this.debug(`BP: ${bp}`);
14579
14581
  return bp;
14580
14582
  },
14581
14583
  category: "Physical",
@@ -14910,7 +14912,7 @@ exports.Moves = {
14910
14912
  },
14911
14913
  onFieldStart(field, source, effect) {
14912
14914
  if (effect?.effectType === 'Ability') {
14913
- this.add('-fieldstart', 'move: Psychic Terrain', '[from] ability: ' + effect.name, '[of] ' + source);
14915
+ this.add('-fieldstart', 'move: Psychic Terrain', '[from] ability: ' + effect.name, `[of] ${source}`);
14914
14916
  }
14915
14917
  else {
14916
14918
  this.add('-fieldstart', 'move: Psychic Terrain');
@@ -15080,7 +15082,7 @@ exports.Moves = {
15080
15082
  let power = 60 + 20 * target.positiveBoosts();
15081
15083
  if (power > 200)
15082
15084
  power = 200;
15083
- this.debug('BP: ' + power);
15085
+ this.debug(`BP: ${power}`);
15084
15086
  return power;
15085
15087
  },
15086
15088
  category: "Physical",
@@ -15491,12 +15493,12 @@ exports.Moves = {
15491
15493
  onAfterHit(target, pokemon, move) {
15492
15494
  if (!move.hasSheerForce) {
15493
15495
  if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
15494
- this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', '[of] ' + pokemon);
15496
+ this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', `[of] ${pokemon}`);
15495
15497
  }
15496
15498
  const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
15497
15499
  for (const condition of sideConditions) {
15498
15500
  if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
15499
- this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', '[of] ' + pokemon);
15501
+ this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', `[of] ${pokemon}`);
15500
15502
  }
15501
15503
  }
15502
15504
  if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
@@ -15507,12 +15509,12 @@ exports.Moves = {
15507
15509
  onAfterSubDamage(damage, target, pokemon, move) {
15508
15510
  if (!move.hasSheerForce) {
15509
15511
  if (pokemon.hp && pokemon.removeVolatile('leechseed')) {
15510
- this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', '[of] ' + pokemon);
15512
+ this.add('-end', pokemon, 'Leech Seed', '[from] move: Rapid Spin', `[of] ${pokemon}`);
15511
15513
  }
15512
15514
  const sideConditions = ['spikes', 'toxicspikes', 'stealthrock', 'stickyweb', 'gmaxsteelsurge'];
15513
15515
  for (const condition of sideConditions) {
15514
15516
  if (pokemon.hp && pokemon.side.removeSideCondition(condition)) {
15515
- this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', '[of] ' + pokemon);
15517
+ this.add('-sideend', pokemon.side, this.dex.conditions.get(condition).name, '[from] move: Rapid Spin', `[of] ${pokemon}`);
15516
15518
  }
15517
15519
  }
15518
15520
  if (pokemon.hp && pokemon.volatiles['partiallytrapped']) {
@@ -15699,7 +15701,7 @@ exports.Moves = {
15699
15701
  return false;
15700
15702
  }
15701
15703
  }
15702
- this.add('-start', source, 'typechange', '[from] move: Reflect Type', '[of] ' + target);
15704
+ this.add('-start', source, 'typechange', '[from] move: Reflect Type', `[of] ${target}`);
15703
15705
  source.setType(newBaseTypes);
15704
15706
  source.addedType = target.addedType;
15705
15707
  source.knownType = target.isAlly(source) && target.knownType;
@@ -15779,11 +15781,11 @@ exports.Moves = {
15779
15781
  }
15780
15782
  // insomnia and vital spirit checks are separate so that the message is accurate in multi-ability mods
15781
15783
  if (source.hasAbility('insomnia')) {
15782
- this.add('-fail', source, '[from] ability: Insomnia', '[of] ' + source);
15784
+ this.add('-fail', source, '[from] ability: Insomnia', `[of] ${source}`);
15783
15785
  return null;
15784
15786
  }
15785
15787
  if (source.hasAbility('vitalspirit')) {
15786
- this.add('-fail', source, '[from] ability: Vital Spirit', '[of] ' + source);
15788
+ this.add('-fail', source, '[from] ability: Vital Spirit', `[of] ${source}`);
15787
15789
  return null;
15788
15790
  }
15789
15791
  },
@@ -15871,7 +15873,7 @@ exports.Moves = {
15871
15873
  basePowerCallback(pokemon, target, move) {
15872
15874
  const damagedByTarget = pokemon.attackedBy.some(p => p.source === target && p.damage > 0 && p.thisTurn);
15873
15875
  if (damagedByTarget) {
15874
- this.debug('BP doubled for getting hit by ' + target);
15876
+ this.debug(`BP doubled for getting hit by ${target}`);
15875
15877
  return move.basePower * 2;
15876
15878
  }
15877
15879
  return move.basePower;
@@ -15912,7 +15914,7 @@ exports.Moves = {
15912
15914
  else {
15913
15915
  bp = 20;
15914
15916
  }
15915
- this.debug('BP: ' + bp);
15917
+ this.debug(`BP: ${bp}`);
15916
15918
  return bp;
15917
15919
  },
15918
15920
  category: "Physical",
@@ -16166,7 +16168,7 @@ exports.Moves = {
16166
16168
  onHit(target, source) {
16167
16169
  const oldAbility = source.setAbility(target.ability);
16168
16170
  if (oldAbility) {
16169
- this.add('-ability', source, source.getAbility().name, '[from] move: Role Play', '[of] ' + target);
16171
+ this.add('-ability', source, source.getAbility().name, '[from] move: Role Play', `[of] ${target}`);
16170
16172
  return;
16171
16173
  }
16172
16174
  return oldAbility;
@@ -16203,7 +16205,7 @@ exports.Moves = {
16203
16205
  let bp = move.basePower;
16204
16206
  const rolloutData = pokemon.volatiles['rollout'];
16205
16207
  if (rolloutData?.hitCount) {
16206
- bp *= Math.pow(2, rolloutData.contactHitCount);
16208
+ bp *= 2 ** rolloutData.contactHitCount;
16207
16209
  }
16208
16210
  if (rolloutData && pokemon.status !== 'slp') {
16209
16211
  rolloutData.hitCount++;
@@ -16215,7 +16217,7 @@ exports.Moves = {
16215
16217
  if (pokemon.volatiles['defensecurl']) {
16216
16218
  bp *= 2;
16217
16219
  }
16218
- this.debug("BP: " + bp);
16220
+ this.debug(`BP: ${bp}`);
16219
16221
  return bp;
16220
16222
  },
16221
16223
  category: "Physical",
@@ -17517,17 +17519,17 @@ exports.Moves = {
17517
17519
  const targetAbility = target.getAbility();
17518
17520
  const sourceAbility = source.getAbility();
17519
17521
  if (target.isAlly(source)) {
17520
- this.add('-activate', source, 'move: Skill Swap', '', '', '[of] ' + target);
17522
+ this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`);
17521
17523
  }
17522
17524
  else {
17523
- this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, '[of] ' + target);
17525
+ this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`);
17524
17526
  }
17525
17527
  this.singleEvent('End', sourceAbility, source.abilityState, source);
17526
17528
  this.singleEvent('End', targetAbility, target.abilityState, target);
17527
17529
  source.ability = targetAbility.id;
17528
17530
  target.ability = sourceAbility.id;
17529
17531
  source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source });
17530
- target.abilityState = this.initEffectState({ id: this.toID(target.ability), target: target });
17532
+ target.abilityState = this.initEffectState({ id: this.toID(target.ability), target });
17531
17533
  source.volatileStaleness = undefined;
17532
17534
  if (!target.isAlly(source))
17533
17535
  target.volatileStaleness = 'external';
@@ -18085,7 +18087,7 @@ exports.Moves = {
18085
18087
  return;
18086
18088
  }
18087
18089
  snatchUser.removeVolatile('snatch');
18088
- this.add('-activate', snatchUser, 'move: Snatch', '[of] ' + source);
18090
+ this.add('-activate', snatchUser, 'move: Snatch', `[of] ${source}`);
18089
18091
  this.actions.useMove(move.id, snatchUser);
18090
18092
  return null;
18091
18093
  },
@@ -18405,7 +18407,7 @@ exports.Moves = {
18405
18407
  const targetSpe = target.storedStats.spe;
18406
18408
  target.storedStats.spe = source.storedStats.spe;
18407
18409
  source.storedStats.spe = targetSpe;
18408
- this.add('-activate', source, 'move: Speed Swap', '[of] ' + target);
18410
+ this.add('-activate', source, 'move: Speed Swap', `[of] ${target}`);
18409
18411
  },
18410
18412
  secondary: null,
18411
18413
  target: "normal",
@@ -18822,7 +18824,7 @@ exports.Moves = {
18822
18824
  if (pokemon.hasItem('heavydutyboots'))
18823
18825
  return;
18824
18826
  const typeMod = this.clampIntRange(pokemon.runEffectiveness(this.dex.getActiveMove('stealthrock')), -6, 6);
18825
- this.damage(pokemon.maxhp * Math.pow(2, typeMod) / 8);
18827
+ this.damage(pokemon.maxhp * (2 ** typeMod) / 8);
18826
18828
  },
18827
18829
  },
18828
18830
  secondary: null,
@@ -19127,7 +19129,7 @@ exports.Moves = {
19127
19129
  basePower: 20,
19128
19130
  basePowerCallback(pokemon, target, move) {
19129
19131
  const bp = move.basePower + 20 * pokemon.positiveBoosts();
19130
- this.debug('BP: ' + bp);
19132
+ this.debug(`BP: ${bp}`);
19131
19133
  return bp;
19132
19134
  },
19133
19135
  category: "Special",
@@ -19723,7 +19725,7 @@ exports.Moves = {
19723
19725
  source.item = myItem.id;
19724
19726
  return false;
19725
19727
  }
19726
- this.add('-activate', source, 'move: Trick', '[of] ' + target);
19728
+ this.add('-activate', source, 'move: Trick', `[of] ${target}`);
19727
19729
  if (myItem) {
19728
19730
  target.setItem(myItem);
19729
19731
  this.add('-item', target, myItem, '[from] move: Switcheroo');
@@ -20413,8 +20415,8 @@ exports.Moves = {
20413
20415
  target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
20414
20416
  return;
20415
20417
  }
20416
- this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', '[of] ' + source);
20417
- this.add('-item', source, yourItem, '[from] move: Thief', '[of] ' + target);
20418
+ this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', `[of] ${source}`);
20419
+ this.add('-item', source, yourItem, '[from] move: Thief', `[of] ${target}`);
20418
20420
  },
20419
20421
  secondary: null,
20420
20422
  target: "normal",
@@ -20891,11 +20893,11 @@ exports.Moves = {
20891
20893
  if (!pokemon.isGrounded())
20892
20894
  return;
20893
20895
  if (pokemon.hasType('Poison')) {
20894
- this.add('-sideend', pokemon.side, 'move: Toxic Spikes', '[of] ' + pokemon);
20896
+ this.add('-sideend', pokemon.side, 'move: Toxic Spikes', `[of] ${pokemon}`);
20895
20897
  pokemon.side.removeSideCondition('toxicspikes');
20896
20898
  }
20897
20899
  else if (pokemon.hasType('Steel') || pokemon.hasItem('heavydutyboots')) {
20898
- return;
20900
+ // do nothing
20899
20901
  }
20900
20902
  else if (this.effectState.layers >= 2) {
20901
20903
  pokemon.trySetStatus('tox', pokemon.side.foe.active[0]);
@@ -21029,7 +21031,7 @@ exports.Moves = {
21029
21031
  source.item = myItem.id;
21030
21032
  return false;
21031
21033
  }
21032
- this.add('-activate', source, 'move: Trick', '[of] ' + target);
21034
+ this.add('-activate', source, 'move: Trick', `[of] ${target}`);
21033
21035
  if (myItem) {
21034
21036
  target.setItem(myItem);
21035
21037
  this.add('-item', target, myItem, '[from] move: Trick');
@@ -21102,10 +21104,10 @@ exports.Moves = {
21102
21104
  },
21103
21105
  onFieldStart(target, source) {
21104
21106
  if (source?.hasAbility('persistent')) {
21105
- this.add('-fieldstart', 'move: Trick Room', '[of] ' + source, '[persistent]');
21107
+ this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`, '[persistent]');
21106
21108
  }
21107
21109
  else {
21108
- this.add('-fieldstart', 'move: Trick Room', '[of] ' + source);
21110
+ this.add('-fieldstart', 'move: Trick Room', `[of] ${source}`);
21109
21111
  }
21110
21112
  },
21111
21113
  onFieldRestart(target, source) {
@@ -21252,7 +21254,7 @@ exports.Moves = {
21252
21254
  break;
21253
21255
  }
21254
21256
  }
21255
- this.debug('BP: ' + bp);
21257
+ this.debug(`BP: ${bp}`);
21256
21258
  return bp;
21257
21259
  },
21258
21260
  category: "Special",
@@ -21480,7 +21482,7 @@ exports.Moves = {
21480
21482
  basePower: 0,
21481
21483
  basePowerCallback(pokemon) {
21482
21484
  const bp = Math.floor((pokemon.happiness * 10) / 25) || 1;
21483
- this.debug('BP: ' + bp);
21485
+ this.debug(`BP: ${bp}`);
21484
21486
  return bp;
21485
21487
  },
21486
21488
  category: "Physical",
@@ -21813,7 +21815,7 @@ exports.Moves = {
21813
21815
  condition: {
21814
21816
  duration: 5,
21815
21817
  onFieldStart(field, source) {
21816
- this.add('-fieldstart', 'move: Water Sport', '[of] ' + source);
21818
+ this.add('-fieldstart', 'move: Water Sport', `[of] ${source}`);
21817
21819
  },
21818
21820
  onBasePowerPriority: 1,
21819
21821
  onBasePower(basePower, attacker, defender, move) {
@@ -21840,7 +21842,7 @@ exports.Moves = {
21840
21842
  basePower: 150,
21841
21843
  basePowerCallback(pokemon, target, move) {
21842
21844
  const bp = move.basePower * pokemon.hp / pokemon.maxhp;
21843
- this.debug('BP: ' + bp);
21845
+ this.debug(`BP: ${bp}`);
21844
21846
  return bp;
21845
21847
  },
21846
21848
  category: "Special",
@@ -21913,7 +21915,7 @@ exports.Moves = {
21913
21915
  move.basePower *= 2;
21914
21916
  break;
21915
21917
  }
21916
- this.debug('BP: ' + move.basePower);
21918
+ this.debug(`BP: ${move.basePower}`);
21917
21919
  },
21918
21920
  secondary: null,
21919
21921
  target: "normal",
@@ -22191,10 +22193,10 @@ exports.Moves = {
22191
22193
  },
22192
22194
  onFieldStart(field, source) {
22193
22195
  if (source?.hasAbility('persistent')) {
22194
- this.add('-fieldstart', 'move: Wonder Room', '[of] ' + source, '[persistent]');
22196
+ this.add('-fieldstart', 'move: Wonder Room', `[of] ${source}`, '[persistent]');
22195
22197
  }
22196
22198
  else {
22197
- this.add('-fieldstart', 'move: Wonder Room', '[of] ' + source);
22199
+ this.add('-fieldstart', 'move: Wonder Room', `[of] ${source}`);
22198
22200
  }
22199
22201
  },
22200
22202
  onFieldRestart(target, source) {
@@ -22308,7 +22310,7 @@ exports.Moves = {
22308
22310
  const hp = target.hp;
22309
22311
  const maxHP = target.maxhp;
22310
22312
  const bp = Math.floor(Math.floor((120 * (100 * Math.floor(hp * 4096 / maxHP)) + 2048 - 1) / 4096) / 100) || 1;
22311
- this.debug('BP for ' + hp + '/' + maxHP + " HP: " + bp);
22313
+ this.debug(`BP for ${hp}/${maxHP} HP: ${bp}`);
22312
22314
  return bp;
22313
22315
  },
22314
22316
  category: "Special",
@@ -22357,7 +22359,7 @@ exports.Moves = {
22357
22359
  noCopy: true, // doesn't get copied by Baton Pass
22358
22360
  duration: 2,
22359
22361
  onStart(target, source) {
22360
- this.add('-start', target, 'move: Yawn', '[of] ' + source);
22362
+ this.add('-start', target, 'move: Yawn', `[of] ${source}`);
22361
22363
  },
22362
22364
  onResidualOrder: 23,
22363
22365
  onEnd(target) {