@pkmn/sim 0.8.3 → 0.8.5

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 (286) hide show
  1. package/build/cjs/config/formats.js +163 -212
  2. package/build/cjs/config/formats.js.map +1 -1
  3. package/build/cjs/data/abilities.js +370 -165
  4. package/build/cjs/data/abilities.js.map +1 -1
  5. package/build/cjs/data/conditions.js +0 -3
  6. package/build/cjs/data/conditions.js.map +1 -1
  7. package/build/cjs/data/formats-data.js +330 -312
  8. package/build/cjs/data/formats-data.js.map +1 -1
  9. package/build/cjs/data/items.js +2 -2
  10. package/build/cjs/data/items.js.map +1 -1
  11. package/build/cjs/data/legality.js +424 -104
  12. package/build/cjs/data/legality.js.map +1 -1
  13. package/build/cjs/data/mods/gen1/formats-data.js +22 -22
  14. package/build/cjs/data/mods/gen1/moves.js +6 -8
  15. package/build/cjs/data/mods/gen1/moves.js.map +1 -1
  16. package/build/cjs/data/mods/gen2/formats-data.js +43 -43
  17. package/build/cjs/data/mods/gen2/formats-data.js.map +1 -1
  18. package/build/cjs/data/mods/gen2/moves.js +4 -7
  19. package/build/cjs/data/mods/gen2/moves.js.map +1 -1
  20. package/build/cjs/data/mods/gen3/abilities.js +6 -5
  21. package/build/cjs/data/mods/gen3/abilities.js.map +1 -1
  22. package/build/cjs/data/mods/gen3/formats-data.js +32 -32
  23. package/build/cjs/data/mods/gen3/formats-data.js.map +1 -1
  24. package/build/cjs/data/mods/gen3/moves.js +15 -10
  25. package/build/cjs/data/mods/gen3/moves.js.map +1 -1
  26. package/build/cjs/data/mods/gen3/scripts.js +11 -6
  27. package/build/cjs/data/mods/gen3/scripts.js.map +1 -1
  28. package/build/cjs/data/mods/gen4/abilities.js +8 -2
  29. package/build/cjs/data/mods/gen4/abilities.js.map +1 -1
  30. package/build/cjs/data/mods/gen4/moves.js +49 -45
  31. package/build/cjs/data/mods/gen4/moves.js.map +1 -1
  32. package/build/cjs/data/mods/gen4/scripts.js +11 -6
  33. package/build/cjs/data/mods/gen4/scripts.js.map +1 -1
  34. package/build/cjs/data/mods/gen5/abilities.js +1 -0
  35. package/build/cjs/data/mods/gen5/abilities.js.map +1 -1
  36. package/build/cjs/data/mods/gen5/moves.js +44 -66
  37. package/build/cjs/data/mods/gen5/moves.js.map +1 -1
  38. package/build/cjs/data/mods/gen6/abilities.js +1 -1
  39. package/build/cjs/data/mods/gen6/abilities.js.map +1 -1
  40. package/build/cjs/data/mods/gen6/moves.js +1 -1
  41. package/build/cjs/data/mods/gen6/moves.js.map +1 -1
  42. package/build/cjs/data/mods/gen7/abilities.js +2 -2
  43. package/build/cjs/data/mods/gen7/abilities.js.map +1 -1
  44. package/build/cjs/data/mods/gen7/moves.js +21 -9
  45. package/build/cjs/data/mods/gen7/moves.js.map +1 -1
  46. package/build/cjs/data/mods/gen8/abilities.js +3 -1
  47. package/build/cjs/data/mods/gen8/abilities.js.map +1 -1
  48. package/build/cjs/data/mods/gen8/moves.js +6 -2
  49. package/build/cjs/data/mods/gen8/moves.js.map +1 -1
  50. package/build/cjs/data/moves.js +760 -770
  51. package/build/cjs/data/moves.js.map +1 -1
  52. package/build/cjs/data/rulesets.js +33 -56
  53. package/build/cjs/data/rulesets.js.map +1 -1
  54. package/build/cjs/data/text/abilities.js +34 -12
  55. package/build/cjs/data/text/abilities.js.map +1 -1
  56. package/build/cjs/data/text/moves.js +9 -9
  57. package/build/cjs/data/text/moves.js.map +1 -1
  58. package/build/cjs/sim/battle-actions.js +21 -21
  59. package/build/cjs/sim/battle-actions.js.map +1 -1
  60. package/build/cjs/sim/battle.js +4 -5
  61. package/build/cjs/sim/battle.js.map +1 -1
  62. package/build/cjs/sim/dex-abilities.d.ts +11 -2
  63. package/build/cjs/sim/dex-abilities.js +1 -0
  64. package/build/cjs/sim/dex-abilities.js.map +1 -1
  65. package/build/cjs/sim/dex-conditions.d.ts +6 -0
  66. package/build/cjs/sim/dex-conditions.js.map +1 -1
  67. package/build/cjs/sim/dex-formats.d.ts +2 -0
  68. package/build/cjs/sim/dex-formats.js +1 -0
  69. package/build/cjs/sim/dex-formats.js.map +1 -1
  70. package/build/cjs/sim/dex-moves.d.ts +1 -4
  71. package/build/cjs/sim/dex-moves.js +0 -1
  72. package/build/cjs/sim/dex-moves.js.map +1 -1
  73. package/build/cjs/sim/exported-global-types.d.ts +2 -2
  74. package/build/cjs/sim/global-types.d.ts +2 -2
  75. package/build/cjs/sim/pokemon.js +7 -4
  76. package/build/cjs/sim/pokemon.js.map +1 -1
  77. package/build/cjs/sim/team-validator.js +1 -1
  78. package/build/cjs/sim/team-validator.js.map +1 -1
  79. package/build/cjs/sim/tools/runner.js +1 -1
  80. package/build/cjs/sim/tools/runner.js.map +1 -1
  81. package/build/esm/config/formats.mjs +163 -212
  82. package/build/esm/config/formats.mjs.map +1 -1
  83. package/build/esm/data/abilities.mjs +370 -165
  84. package/build/esm/data/abilities.mjs.map +1 -1
  85. package/build/esm/data/conditions.mjs +0 -3
  86. package/build/esm/data/conditions.mjs.map +1 -1
  87. package/build/esm/data/formats-data.mjs +330 -312
  88. package/build/esm/data/formats-data.mjs.map +1 -1
  89. package/build/esm/data/items.mjs +2 -2
  90. package/build/esm/data/items.mjs.map +1 -1
  91. package/build/esm/data/legality.mjs +424 -104
  92. package/build/esm/data/legality.mjs.map +1 -1
  93. package/build/esm/data/mods/gen1/formats-data.mjs +22 -22
  94. package/build/esm/data/mods/gen1/moves.mjs +6 -8
  95. package/build/esm/data/mods/gen1/moves.mjs.map +1 -1
  96. package/build/esm/data/mods/gen2/formats-data.mjs +43 -43
  97. package/build/esm/data/mods/gen2/formats-data.mjs.map +1 -1
  98. package/build/esm/data/mods/gen2/moves.mjs +4 -7
  99. package/build/esm/data/mods/gen2/moves.mjs.map +1 -1
  100. package/build/esm/data/mods/gen3/abilities.mjs +6 -5
  101. package/build/esm/data/mods/gen3/abilities.mjs.map +1 -1
  102. package/build/esm/data/mods/gen3/formats-data.mjs +32 -32
  103. package/build/esm/data/mods/gen3/formats-data.mjs.map +1 -1
  104. package/build/esm/data/mods/gen3/moves.mjs +15 -10
  105. package/build/esm/data/mods/gen3/moves.mjs.map +1 -1
  106. package/build/esm/data/mods/gen3/scripts.mjs +11 -6
  107. package/build/esm/data/mods/gen3/scripts.mjs.map +1 -1
  108. package/build/esm/data/mods/gen4/abilities.mjs +8 -2
  109. package/build/esm/data/mods/gen4/abilities.mjs.map +1 -1
  110. package/build/esm/data/mods/gen4/moves.mjs +49 -45
  111. package/build/esm/data/mods/gen4/moves.mjs.map +1 -1
  112. package/build/esm/data/mods/gen4/scripts.mjs +11 -6
  113. package/build/esm/data/mods/gen4/scripts.mjs.map +1 -1
  114. package/build/esm/data/mods/gen5/abilities.mjs +1 -0
  115. package/build/esm/data/mods/gen5/abilities.mjs.map +1 -1
  116. package/build/esm/data/mods/gen5/moves.mjs +44 -66
  117. package/build/esm/data/mods/gen5/moves.mjs.map +1 -1
  118. package/build/esm/data/mods/gen6/abilities.mjs +1 -1
  119. package/build/esm/data/mods/gen6/abilities.mjs.map +1 -1
  120. package/build/esm/data/mods/gen6/moves.mjs +1 -1
  121. package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
  122. package/build/esm/data/mods/gen7/abilities.mjs +2 -2
  123. package/build/esm/data/mods/gen7/abilities.mjs.map +1 -1
  124. package/build/esm/data/mods/gen7/moves.mjs +21 -9
  125. package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
  126. package/build/esm/data/mods/gen8/abilities.mjs +3 -1
  127. package/build/esm/data/mods/gen8/abilities.mjs.map +1 -1
  128. package/build/esm/data/mods/gen8/moves.mjs +6 -2
  129. package/build/esm/data/mods/gen8/moves.mjs.map +1 -1
  130. package/build/esm/data/moves.mjs +760 -770
  131. package/build/esm/data/moves.mjs.map +1 -1
  132. package/build/esm/data/rulesets.mjs +33 -56
  133. package/build/esm/data/rulesets.mjs.map +1 -1
  134. package/build/esm/data/text/abilities.mjs +34 -12
  135. package/build/esm/data/text/abilities.mjs.map +1 -1
  136. package/build/esm/data/text/moves.mjs +9 -9
  137. package/build/esm/data/text/moves.mjs.map +1 -1
  138. package/build/esm/sim/battle-actions.mjs +21 -21
  139. package/build/esm/sim/battle-actions.mjs.map +1 -1
  140. package/build/esm/sim/battle.mjs +4 -5
  141. package/build/esm/sim/battle.mjs.map +1 -1
  142. package/build/esm/sim/dex-abilities.d.mts +11 -2
  143. package/build/esm/sim/dex-abilities.mjs +1 -0
  144. package/build/esm/sim/dex-abilities.mjs.map +1 -1
  145. package/build/esm/sim/dex-conditions.d.mts +6 -0
  146. package/build/esm/sim/dex-conditions.mjs.map +1 -1
  147. package/build/esm/sim/dex-formats.d.mts +2 -0
  148. package/build/esm/sim/dex-formats.mjs +1 -0
  149. package/build/esm/sim/dex-formats.mjs.map +1 -1
  150. package/build/esm/sim/dex-moves.d.mts +1 -4
  151. package/build/esm/sim/dex-moves.mjs +0 -1
  152. package/build/esm/sim/dex-moves.mjs.map +1 -1
  153. package/build/esm/sim/exported-global-types.d.mts +2 -2
  154. package/build/esm/sim/global-types.d.mts +2 -2
  155. package/build/esm/sim/pokemon.mjs +7 -4
  156. package/build/esm/sim/pokemon.mjs.map +1 -1
  157. package/build/esm/sim/team-validator.mjs +1 -1
  158. package/build/esm/sim/team-validator.mjs.map +1 -1
  159. package/build/esm/sim/tools/runner.mjs +1 -1
  160. package/build/esm/sim/tools/runner.mjs.map +1 -1
  161. package/package.json +1 -1
  162. package/build/types/config/formats.d.ts +0 -1
  163. package/build/types/data/abilities.d.ts +0 -3
  164. package/build/types/data/aliases.d.ts +0 -3
  165. package/build/types/data/conditions.d.ts +0 -3
  166. package/build/types/data/formats-data.d.ts +0 -3
  167. package/build/types/data/index.d.ts +0 -11
  168. package/build/types/data/items.d.ts +0 -3
  169. package/build/types/data/learnsets.d.ts +0 -3
  170. package/build/types/data/legality.d.ts +0 -3
  171. package/build/types/data/mods/gen1/conditions.d.ts +0 -12
  172. package/build/types/data/mods/gen1/formats-data.d.ts +0 -3
  173. package/build/types/data/mods/gen1/index.d.ts +0 -7
  174. package/build/types/data/mods/gen1/moves.d.ts +0 -7
  175. package/build/types/data/mods/gen1/pokedex.d.ts +0 -3
  176. package/build/types/data/mods/gen1/rulesets.d.ts +0 -3
  177. package/build/types/data/mods/gen1/scripts.d.ts +0 -6
  178. package/build/types/data/mods/gen1/typechart.d.ts +0 -10
  179. package/build/types/data/mods/gen2/conditions.d.ts +0 -3
  180. package/build/types/data/mods/gen2/formats-data.d.ts +0 -3
  181. package/build/types/data/mods/gen2/index.d.ts +0 -8
  182. package/build/types/data/mods/gen2/items.d.ts +0 -3
  183. package/build/types/data/mods/gen2/learnsets.d.ts +0 -3
  184. package/build/types/data/mods/gen2/legality.d.ts +0 -3
  185. package/build/types/data/mods/gen2/moves.d.ts +0 -6
  186. package/build/types/data/mods/gen2/pokedex.d.ts +0 -3
  187. package/build/types/data/mods/gen2/rulesets.d.ts +0 -3
  188. package/build/types/data/mods/gen2/scripts.d.ts +0 -4
  189. package/build/types/data/mods/gen2/typechart.d.ts +0 -3
  190. package/build/types/data/mods/gen3/abilities.d.ts +0 -3
  191. package/build/types/data/mods/gen3/conditions.d.ts +0 -3
  192. package/build/types/data/mods/gen3/formats-data.d.ts +0 -3
  193. package/build/types/data/mods/gen3/index.d.ts +0 -7
  194. package/build/types/data/mods/gen3/items.d.ts +0 -3
  195. package/build/types/data/mods/gen3/moves.d.ts +0 -6
  196. package/build/types/data/mods/gen3/rulesets.d.ts +0 -3
  197. package/build/types/data/mods/gen3/scripts.d.ts +0 -1
  198. package/build/types/data/mods/gen4/abilities.d.ts +0 -3
  199. package/build/types/data/mods/gen4/conditions.d.ts +0 -3
  200. package/build/types/data/mods/gen4/formats-data.d.ts +0 -3
  201. package/build/types/data/mods/gen4/index.d.ts +0 -8
  202. package/build/types/data/mods/gen4/items.d.ts +0 -3
  203. package/build/types/data/mods/gen4/moves.d.ts +0 -3
  204. package/build/types/data/mods/gen4/pokedex.d.ts +0 -3
  205. package/build/types/data/mods/gen4/rulesets.d.ts +0 -3
  206. package/build/types/data/mods/gen4/scripts.d.ts +0 -1
  207. package/build/types/data/mods/gen5/abilities.d.ts +0 -3
  208. package/build/types/data/mods/gen5/conditions.d.ts +0 -3
  209. package/build/types/data/mods/gen5/formats-data.d.ts +0 -3
  210. package/build/types/data/mods/gen5/index.d.ts +0 -9
  211. package/build/types/data/mods/gen5/items.d.ts +0 -3
  212. package/build/types/data/mods/gen5/moves.d.ts +0 -3
  213. package/build/types/data/mods/gen5/pokedex.d.ts +0 -3
  214. package/build/types/data/mods/gen5/rulesets.d.ts +0 -3
  215. package/build/types/data/mods/gen5/scripts.d.ts +0 -1
  216. package/build/types/data/mods/gen5/typechart.d.ts +0 -3
  217. package/build/types/data/mods/gen6/abilities.d.ts +0 -3
  218. package/build/types/data/mods/gen6/conditions.d.ts +0 -3
  219. package/build/types/data/mods/gen6/formats-data.d.ts +0 -3
  220. package/build/types/data/mods/gen6/index.d.ts +0 -8
  221. package/build/types/data/mods/gen6/items.d.ts +0 -3
  222. package/build/types/data/mods/gen6/learnsets.d.ts +0 -3
  223. package/build/types/data/mods/gen6/legality.d.ts +0 -3
  224. package/build/types/data/mods/gen6/moves.d.ts +0 -3
  225. package/build/types/data/mods/gen6/pokedex.d.ts +0 -3
  226. package/build/types/data/mods/gen6/scripts.d.ts +0 -1
  227. package/build/types/data/mods/gen6/typechart.d.ts +0 -3
  228. package/build/types/data/mods/gen7/abilities.d.ts +0 -3
  229. package/build/types/data/mods/gen7/formats-data.d.ts +0 -3
  230. package/build/types/data/mods/gen7/index.d.ts +0 -7
  231. package/build/types/data/mods/gen7/items.d.ts +0 -3
  232. package/build/types/data/mods/gen7/moves.d.ts +0 -3
  233. package/build/types/data/mods/gen7/pokedex.d.ts +0 -3
  234. package/build/types/data/mods/gen7/rulesets.d.ts +0 -3
  235. package/build/types/data/mods/gen7/scripts.d.ts +0 -1
  236. package/build/types/data/mods/gen8/abilities.d.ts +0 -3
  237. package/build/types/data/mods/gen8/formats-data.d.ts +0 -3
  238. package/build/types/data/mods/gen8/index.d.ts +0 -7
  239. package/build/types/data/mods/gen8/items.d.ts +0 -3
  240. package/build/types/data/mods/gen8/learnsets.d.ts +0 -3
  241. package/build/types/data/mods/gen8/legality.d.ts +0 -3
  242. package/build/types/data/mods/gen8/moves.d.ts +0 -3
  243. package/build/types/data/mods/gen8/pokedex.d.ts +0 -3
  244. package/build/types/data/mods/gen8/rulesets.d.ts +0 -3
  245. package/build/types/data/mods/gen8/scripts.d.ts +0 -1
  246. package/build/types/data/moves.d.ts +0 -3
  247. package/build/types/data/natures.d.ts +0 -3
  248. package/build/types/data/pokedex.d.ts +0 -3
  249. package/build/types/data/pokemongo.d.ts +0 -31
  250. package/build/types/data/rulesets.d.ts +0 -3
  251. package/build/types/data/scripts.d.ts +0 -1
  252. package/build/types/data/tags.d.ts +0 -15
  253. package/build/types/data/text/abilities.d.ts +0 -3
  254. package/build/types/data/text/default.d.ts +0 -3
  255. package/build/types/data/text/items.d.ts +0 -3
  256. package/build/types/data/text/moves.d.ts +0 -3
  257. package/build/types/data/typechart.d.ts +0 -3
  258. package/build/types/lib/index.d.ts +0 -2
  259. package/build/types/lib/streams.d.ts +0 -1
  260. package/build/types/lib/utils.d.ts +0 -139
  261. package/build/types/sim/battle-actions.d.ts +0 -90
  262. package/build/types/sim/battle-queue.d.ts +0 -164
  263. package/build/types/sim/battle-stream.d.ts +0 -67
  264. package/build/types/sim/battle.d.ts +0 -396
  265. package/build/types/sim/dex-abilities.d.ts +0 -35
  266. package/build/types/sim/dex-conditions.d.ts +0 -518
  267. package/build/types/sim/dex-data.d.ts +0 -169
  268. package/build/types/sim/dex-formats.d.ts +0 -170
  269. package/build/types/sim/dex-items.d.ts +0 -110
  270. package/build/types/sim/dex-moves.d.ts +0 -441
  271. package/build/types/sim/dex-species.d.ts +0 -289
  272. package/build/types/sim/dex.d.ts +0 -162
  273. package/build/types/sim/exported-global-types.d.ts +0 -510
  274. package/build/types/sim/field.d.ts +0 -30
  275. package/build/types/sim/global-types.d.ts +0 -510
  276. package/build/types/sim/index.d.ts +0 -13
  277. package/build/types/sim/pokemon.d.ts +0 -427
  278. package/build/types/sim/prng.d.ts +0 -97
  279. package/build/types/sim/side.d.ts +0 -127
  280. package/build/types/sim/state.d.ts +0 -42
  281. package/build/types/sim/team-validator.d.ts +0 -198
  282. package/build/types/sim/teams.d.ts +0 -26
  283. package/build/types/sim/tools/exhaustive-runner.d.ts +0 -52
  284. package/build/types/sim/tools/index.d.ts +0 -2
  285. package/build/types/sim/tools/random-player-ai.d.ts +0 -32
  286. package/build/types/sim/tools/runner.d.ts +0 -41
@@ -34,14 +34,21 @@ Ratings and how they work:
34
34
  export const Abilities = {
35
35
  noability: {
36
36
  isNonstandard: "Past",
37
+ flags: {},
37
38
  name: "No Ability",
38
39
  rating: 0.1,
39
40
  num: 0,
40
41
  },
41
42
  adaptability: {
42
- onModifyMove(move) {
43
- move.stab = 2;
43
+ onModifySTAB(stab, source, target, move) {
44
+ if (move.forceSTAB || source.hasType(move.type)) {
45
+ if (stab === 2) {
46
+ return 2.25;
47
+ }
48
+ return 2;
49
+ }
44
50
  },
51
+ flags: {},
45
52
  name: "Adaptability",
46
53
  rating: 4,
47
54
  num: 91,
@@ -63,18 +70,20 @@ export const Abilities = {
63
70
  if (move.typeChangerBoosted === this.effect)
64
71
  return this.chainModify([4915, 4096]);
65
72
  },
73
+ flags: {},
66
74
  name: "Aerilate",
67
75
  rating: 4,
68
76
  num: 184,
69
77
  },
70
78
  aftermath: {
71
- name: "Aftermath",
72
79
  onDamagingHitOrder: 1,
73
80
  onDamagingHit(damage, target, source, move) {
74
81
  if (!target.hp && this.checkMoveMakesContact(move, source, target, true)) {
75
82
  this.damage(source.baseMaxhp / 4, source, target);
76
83
  }
77
84
  },
85
+ flags: {},
86
+ name: "Aftermath",
78
87
  rating: 2,
79
88
  num: 106,
80
89
  },
@@ -94,6 +103,7 @@ export const Abilities = {
94
103
  this.eachEvent('WeatherChange', this.effect);
95
104
  },
96
105
  suppressWeather: true,
106
+ flags: {},
97
107
  name: "Air Lock",
98
108
  rating: 1.5,
99
109
  num: 76,
@@ -115,6 +125,7 @@ export const Abilities = {
115
125
  return this.chainModify([5325, 4096]);
116
126
  }
117
127
  },
128
+ flags: {},
118
129
  name: "Analytic",
119
130
  rating: 2.5,
120
131
  num: 148,
@@ -127,6 +138,7 @@ export const Abilities = {
127
138
  this.boost({ atk: 12 }, target, target);
128
139
  }
129
140
  },
141
+ flags: {},
130
142
  name: "Anger Point",
131
143
  rating: 1,
132
144
  num: 83,
@@ -163,6 +175,7 @@ export const Abilities = {
163
175
  this.boost({ atk: 1, spa: 1, spe: 1, def: -1, spd: -1 }, target, target);
164
176
  }
165
177
  },
178
+ flags: {},
166
179
  name: "Anger Shell",
167
180
  rating: 3,
168
181
  num: 271,
@@ -183,6 +196,7 @@ export const Abilities = {
183
196
  }
184
197
  }
185
198
  },
199
+ flags: {},
186
200
  name: "Anticipation",
187
201
  rating: 0.5,
188
202
  num: 107,
@@ -204,6 +218,7 @@ export const Abilities = {
204
218
  pokemon.maybeTrapped = true;
205
219
  }
206
220
  },
221
+ flags: {},
207
222
  name: "Arena Trap",
208
223
  rating: 5,
209
224
  num: 71,
@@ -221,7 +236,7 @@ export const Abilities = {
221
236
  return false;
222
237
  }
223
238
  },
224
- isBreakable: true,
239
+ flags: { breakable: 1 },
225
240
  name: "Armor Tail",
226
241
  rating: 2.5,
227
242
  num: 296,
@@ -236,7 +251,7 @@ export const Abilities = {
236
251
  return null;
237
252
  }
238
253
  },
239
- isBreakable: true,
254
+ flags: { breakable: 1 },
240
255
  name: "Aroma Veil",
241
256
  rating: 2,
242
257
  num: 165,
@@ -258,7 +273,7 @@ export const Abilities = {
258
273
  this.boost({ atk: length }, source, source, this.dex.abilities.get('chillingneigh'));
259
274
  }
260
275
  },
261
- isPermanent: true,
276
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
262
277
  name: "As One (Glastrier)",
263
278
  rating: 3.5,
264
279
  num: 266,
@@ -280,7 +295,7 @@ export const Abilities = {
280
295
  this.boost({ spa: length }, source, source, this.dex.abilities.get('grimneigh'));
281
296
  }
282
297
  },
283
- isPermanent: true,
298
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
284
299
  name: "As One (Spectrier)",
285
300
  rating: 3.5,
286
301
  num: 267,
@@ -296,7 +311,7 @@ export const Abilities = {
296
311
  return;
297
312
  move.hasAuraBreak = true;
298
313
  },
299
- isBreakable: true,
314
+ flags: { breakable: 1 },
300
315
  name: "Aura Break",
301
316
  rating: 1,
302
317
  num: 188,
@@ -313,11 +328,13 @@ export const Abilities = {
313
328
  }
314
329
  }
315
330
  },
331
+ flags: {},
316
332
  name: "Bad Dreams",
317
333
  rating: 1.5,
318
334
  num: 123,
319
335
  },
320
336
  ballfetch: {
337
+ flags: {},
321
338
  name: "Ball Fetch",
322
339
  rating: 0,
323
340
  num: 237,
@@ -330,13 +347,14 @@ export const Abilities = {
330
347
  return this.chainModify([5325, 4096]);
331
348
  }
332
349
  },
350
+ flags: {},
333
351
  name: "Battery",
334
352
  rating: 0,
335
353
  num: 217,
336
354
  },
337
355
  battlearmor: {
338
356
  onCriticalHit: false,
339
- isBreakable: true,
357
+ flags: { breakable: 1 },
340
358
  name: "Battle Armor",
341
359
  rating: 1,
342
360
  num: 4,
@@ -353,7 +371,7 @@ export const Abilities = {
353
371
  source.abilityState.battleBondTriggered = true;
354
372
  }
355
373
  },
356
- isPermanent: true,
374
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
357
375
  name: "Battle Bond",
358
376
  rating: 3.5,
359
377
  num: 210,
@@ -375,6 +393,7 @@ export const Abilities = {
375
393
  this.debug('Beads of Ruin SpD drop');
376
394
  return this.chainModify(0.75);
377
395
  },
396
+ flags: {},
378
397
  name: "Beads of Ruin",
379
398
  rating: 4.5,
380
399
  num: 284,
@@ -386,6 +405,7 @@ export const Abilities = {
386
405
  this.boost({ [bestStat]: length }, source);
387
406
  }
388
407
  },
408
+ flags: {},
389
409
  name: "Beast Boost",
390
410
  rating: 3.5,
391
411
  num: 224,
@@ -422,6 +442,7 @@ export const Abilities = {
422
442
  this.boost({ spa: 1 }, target, target);
423
443
  }
424
444
  },
445
+ flags: {},
425
446
  name: "Berserk",
426
447
  rating: 2,
427
448
  num: 201,
@@ -437,7 +458,7 @@ export const Abilities = {
437
458
  }
438
459
  }
439
460
  },
440
- isBreakable: true,
461
+ flags: { breakable: 1 },
441
462
  name: "Big Pecks",
442
463
  rating: 0.5,
443
464
  num: 145,
@@ -457,6 +478,7 @@ export const Abilities = {
457
478
  return this.chainModify(1.5);
458
479
  }
459
480
  },
481
+ flags: {},
460
482
  name: "Blaze",
461
483
  rating: 2,
462
484
  num: 66,
@@ -468,7 +490,7 @@ export const Abilities = {
468
490
  return null;
469
491
  }
470
492
  },
471
- isBreakable: true,
493
+ flags: { breakable: 1 },
472
494
  name: "Bulletproof",
473
495
  rating: 3,
474
496
  num: 171,
@@ -477,6 +499,7 @@ export const Abilities = {
477
499
  onEatItem(item, pokemon) {
478
500
  this.heal(pokemon.baseMaxhp / 3);
479
501
  },
502
+ flags: {},
480
503
  name: "Cheek Pouch",
481
504
  rating: 2,
482
505
  num: 167,
@@ -487,6 +510,7 @@ export const Abilities = {
487
510
  this.boost({ atk: length }, source);
488
511
  }
489
512
  },
513
+ flags: {},
490
514
  name: "Chilling Neigh",
491
515
  rating: 3,
492
516
  num: 264,
@@ -497,6 +521,7 @@ export const Abilities = {
497
521
  return this.chainModify(2);
498
522
  }
499
523
  },
524
+ flags: {},
500
525
  name: "Chlorophyll",
501
526
  rating: 3,
502
527
  num: 34,
@@ -517,7 +542,7 @@ export const Abilities = {
517
542
  this.add("-fail", target, "unboost", "[from] ability: Clear Body", "[of] " + target);
518
543
  }
519
544
  },
520
- isBreakable: true,
545
+ flags: { breakable: 1 },
521
546
  name: "Clear Body",
522
547
  rating: 2,
523
548
  num: 29,
@@ -538,6 +563,7 @@ export const Abilities = {
538
563
  this.eachEvent('WeatherChange', this.effect);
539
564
  },
540
565
  suppressWeather: true,
566
+ flags: {},
541
567
  name: "Cloud Nine",
542
568
  rating: 1.5,
543
569
  num: 13,
@@ -561,6 +587,7 @@ export const Abilities = {
561
587
  }
562
588
  }
563
589
  },
590
+ flags: {},
564
591
  name: "Color Change",
565
592
  rating: 0,
566
593
  num: 16,
@@ -576,7 +603,7 @@ export const Abilities = {
576
603
  return false;
577
604
  },
578
605
  // Permanent sleep "status" implemented in the relevant sleep-checking effects
579
- isPermanent: true,
606
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
580
607
  name: "Comatose",
581
608
  rating: 4,
582
609
  num: 213,
@@ -586,8 +613,7 @@ export const Abilities = {
586
613
  if (this.gameType !== 'doubles')
587
614
  return;
588
615
  const ally = pokemon.allies()[0];
589
- if (!ally || pokemon.transformed ||
590
- pokemon.baseSpecies.baseSpecies !== 'Tatsugiri' || ally.baseSpecies.baseSpecies !== 'Dondozo') {
616
+ if (!ally || pokemon.baseSpecies.baseSpecies !== 'Tatsugiri' || ally.baseSpecies.baseSpecies !== 'Dondozo') {
591
617
  // Handle any edge cases
592
618
  if (pokemon.getVolatile('commanding'))
593
619
  pokemon.removeVolatile('commanding');
@@ -611,6 +637,7 @@ export const Abilities = {
611
637
  pokemon.removeVolatile('commanding');
612
638
  }
613
639
  },
640
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1 },
614
641
  name: "Commander",
615
642
  rating: 0,
616
643
  num: 279,
@@ -634,6 +661,7 @@ export const Abilities = {
634
661
  this.boost({ spa: 2 }, target, target, null, false, true);
635
662
  }
636
663
  },
664
+ flags: {},
637
665
  name: "Competitive",
638
666
  rating: 2.5,
639
667
  num: 172,
@@ -646,6 +674,7 @@ export const Abilities = {
646
674
  this.debug('compoundeyes - enhancing accuracy');
647
675
  return this.chainModify([5325, 4096]);
648
676
  },
677
+ flags: {},
649
678
  name: "Compound Eyes",
650
679
  rating: 3,
651
680
  num: 14,
@@ -659,13 +688,14 @@ export const Abilities = {
659
688
  boost[i] *= -1;
660
689
  }
661
690
  },
662
- isBreakable: true,
691
+ flags: { breakable: 1 },
663
692
  name: "Contrary",
664
693
  rating: 4.5,
665
694
  num: 126,
666
695
  },
667
696
  corrosion: {
668
697
  // Implemented in sim/pokemon.js:Pokemon#setStatus
698
+ flags: {},
669
699
  name: "Corrosion",
670
700
  rating: 2.5,
671
701
  num: 212,
@@ -692,6 +722,7 @@ export const Abilities = {
692
722
  }
693
723
  this.add('-copyboost', pokemon, ally, '[from] ability: Costar');
694
724
  },
725
+ flags: {},
695
726
  name: "Costar",
696
727
  rating: 0,
697
728
  num: 294,
@@ -709,6 +740,7 @@ export const Abilities = {
709
740
  this.boost({ spe: -1 }, pokemon, target, null, true);
710
741
  }
711
742
  },
743
+ flags: {},
712
744
  name: "Cotton Down",
713
745
  rating: 2,
714
746
  num: 238,
@@ -743,6 +775,7 @@ export const Abilities = {
743
775
  }
744
776
  },
745
777
  },
778
+ flags: {},
746
779
  name: "Cud Chew",
747
780
  rating: 2,
748
781
  num: 291,
@@ -754,6 +787,7 @@ export const Abilities = {
754
787
  this.add('-clearboost', ally, '[from] ability: Curious Medicine', '[of] ' + pokemon);
755
788
  }
756
789
  },
790
+ flags: {},
757
791
  name: "Curious Medicine",
758
792
  rating: 0,
759
793
  num: 261,
@@ -768,6 +802,7 @@ export const Abilities = {
768
802
  }
769
803
  }
770
804
  },
805
+ flags: {},
771
806
  name: "Cursed Body",
772
807
  rating: 2,
773
808
  num: 130,
@@ -780,6 +815,7 @@ export const Abilities = {
780
815
  }
781
816
  }
782
817
  },
818
+ flags: {},
783
819
  name: "Cute Charm",
784
820
  rating: 0.5,
785
821
  num: 56,
@@ -797,12 +833,13 @@ export const Abilities = {
797
833
  return false;
798
834
  }
799
835
  },
800
- isBreakable: true,
836
+ flags: { breakable: 1 },
801
837
  name: "Damp",
802
838
  rating: 0.5,
803
839
  num: 6,
804
840
  },
805
841
  dancer: {
842
+ flags: {},
806
843
  name: "Dancer",
807
844
  // implemented in runMove in scripts.js
808
845
  rating: 1.5,
@@ -824,6 +861,7 @@ export const Abilities = {
824
861
  return;
825
862
  return this.chainModify([move.hasAuraBreak ? 3072 : 5448, 4096]);
826
863
  },
864
+ flags: {},
827
865
  name: "Dark Aura",
828
866
  rating: 3,
829
867
  num: 186,
@@ -835,6 +873,7 @@ export const Abilities = {
835
873
  pokemon.shieldBoost = true;
836
874
  this.boost({ def: 1 }, pokemon);
837
875
  },
876
+ flags: {},
838
877
  name: "Dauntless Shield",
839
878
  rating: 3.5,
840
879
  num: 235,
@@ -852,7 +891,7 @@ export const Abilities = {
852
891
  return false;
853
892
  }
854
893
  },
855
- isBreakable: true,
894
+ flags: { breakable: 1 },
856
895
  name: "Dazzling",
857
896
  rating: 2.5,
858
897
  num: 219,
@@ -870,6 +909,7 @@ export const Abilities = {
870
909
  return this.chainModify(0.5);
871
910
  }
872
911
  },
912
+ flags: {},
873
913
  name: "Defeatist",
874
914
  rating: -1,
875
915
  num: 129,
@@ -893,6 +933,7 @@ export const Abilities = {
893
933
  this.boost({ atk: 2 }, target, target, null, false, true);
894
934
  }
895
935
  },
936
+ flags: {},
896
937
  name: "Defiant",
897
938
  rating: 3,
898
939
  num: 128,
@@ -919,6 +960,7 @@ export const Abilities = {
919
960
  }
920
961
  this.field.clearWeather();
921
962
  },
963
+ flags: {},
922
964
  name: "Delta Stream",
923
965
  rating: 4,
924
966
  num: 191,
@@ -945,6 +987,7 @@ export const Abilities = {
945
987
  }
946
988
  this.field.clearWeather();
947
989
  },
990
+ flags: {},
948
991
  name: "Desolate Land",
949
992
  rating: 4.5,
950
993
  num: 190,
@@ -952,8 +995,7 @@ export const Abilities = {
952
995
  disguise: {
953
996
  onDamagePriority: 1,
954
997
  onDamage(damage, target, source, effect) {
955
- if (effect && effect.effectType === 'Move' &&
956
- ['mimikyu', 'mimikyutotem'].includes(target.species.id) && !target.transformed) {
998
+ if (effect?.effectType === 'Move' && ['mimikyu', 'mimikyutotem'].includes(target.species.id)) {
957
999
  this.add('-activate', target, 'ability: Disguise');
958
1000
  this.effectState.busted = true;
959
1001
  return 0;
@@ -962,7 +1004,7 @@ export const Abilities = {
962
1004
  onCriticalHit(target, source, move) {
963
1005
  if (!target)
964
1006
  return;
965
- if (!['mimikyu', 'mimikyutotem'].includes(target.species.id) || target.transformed) {
1007
+ if (!['mimikyu', 'mimikyutotem'].includes(target.species.id)) {
966
1008
  return;
967
1009
  }
968
1010
  const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6);
@@ -975,7 +1017,7 @@ export const Abilities = {
975
1017
  onEffectiveness(typeMod, target, type, move) {
976
1018
  if (!target || move.category === 'Status')
977
1019
  return;
978
- if (!['mimikyu', 'mimikyutotem'].includes(target.species.id) || target.transformed) {
1020
+ if (!['mimikyu', 'mimikyutotem'].includes(target.species.id)) {
979
1021
  return;
980
1022
  }
981
1023
  const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6);
@@ -992,8 +1034,10 @@ export const Abilities = {
992
1034
  this.damage(pokemon.baseMaxhp / 8, pokemon, pokemon, this.dex.species.get(speciesid));
993
1035
  }
994
1036
  },
995
- isBreakable: true,
996
- isPermanent: true,
1037
+ flags: {
1038
+ failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1,
1039
+ breakable: 1, notransform: 1,
1040
+ },
997
1041
  name: "Disguise",
998
1042
  rating: 3.5,
999
1043
  num: 209,
@@ -1013,6 +1057,7 @@ export const Abilities = {
1013
1057
  this.boost({ atk: 1 });
1014
1058
  }
1015
1059
  },
1060
+ flags: {},
1016
1061
  name: "Download",
1017
1062
  rating: 3.5,
1018
1063
  num: 88,
@@ -1032,6 +1077,7 @@ export const Abilities = {
1032
1077
  return this.chainModify(1.5);
1033
1078
  }
1034
1079
  },
1080
+ flags: {},
1035
1081
  name: "Dragon's Maw",
1036
1082
  rating: 3.5,
1037
1083
  num: 263,
@@ -1046,6 +1092,7 @@ export const Abilities = {
1046
1092
  }
1047
1093
  this.field.setWeather('raindance');
1048
1094
  },
1095
+ flags: {},
1049
1096
  name: "Drizzle",
1050
1097
  rating: 4,
1051
1098
  num: 2,
@@ -1060,6 +1107,7 @@ export const Abilities = {
1060
1107
  }
1061
1108
  this.field.setWeather('sunnyday');
1062
1109
  },
1110
+ flags: {},
1063
1111
  name: "Drought",
1064
1112
  rating: 4,
1065
1113
  num: 70,
@@ -1089,12 +1137,13 @@ export const Abilities = {
1089
1137
  this.damage(target.baseMaxhp / 8, target, target);
1090
1138
  }
1091
1139
  },
1092
- isBreakable: true,
1140
+ flags: { breakable: 1 },
1093
1141
  name: "Dry Skin",
1094
1142
  rating: 3,
1095
1143
  num: 87,
1096
1144
  },
1097
1145
  earlybird: {
1146
+ flags: {},
1098
1147
  name: "Early Bird",
1099
1148
  // Implemented in statuses.js
1100
1149
  rating: 1.5,
@@ -1109,7 +1158,7 @@ export const Abilities = {
1109
1158
  return null;
1110
1159
  }
1111
1160
  },
1112
- isBreakable: true,
1161
+ flags: { breakable: 1 },
1113
1162
  name: "Earth Eater",
1114
1163
  rating: 3.5,
1115
1164
  num: 297,
@@ -1129,6 +1178,7 @@ export const Abilities = {
1129
1178
  }
1130
1179
  }
1131
1180
  },
1181
+ flags: {},
1132
1182
  name: "Effect Spore",
1133
1183
  rating: 2,
1134
1184
  num: 27,
@@ -1137,6 +1187,7 @@ export const Abilities = {
1137
1187
  onStart(source) {
1138
1188
  this.field.setTerrain('electricterrain');
1139
1189
  },
1190
+ flags: {},
1140
1191
  name: "Electric Surge",
1141
1192
  rating: 4,
1142
1193
  num: 226,
@@ -1146,13 +1197,14 @@ export const Abilities = {
1146
1197
  onDamagingHit(damage, target, source, move) {
1147
1198
  target.addVolatile('charge');
1148
1199
  },
1200
+ flags: {},
1149
1201
  name: "Electromorphosis",
1150
1202
  rating: 3,
1151
1203
  num: 280,
1152
1204
  },
1153
1205
  embodyaspectcornerstone: {
1154
1206
  onStart(pokemon) {
1155
- if (pokemon.baseSpecies.name === 'Ogerpon-Cornerstone-Tera' && !pokemon.transformed && !this.effectState.embodied) {
1207
+ if (pokemon.baseSpecies.name === 'Ogerpon-Cornerstone-Tera' && !this.effectState.embodied) {
1156
1208
  this.effectState.embodied = true;
1157
1209
  this.boost({ def: 1 }, pokemon);
1158
1210
  }
@@ -1160,13 +1212,14 @@ export const Abilities = {
1160
1212
  onSwitchIn() {
1161
1213
  delete this.effectState.embodied;
1162
1214
  },
1215
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
1163
1216
  name: "Embody Aspect (Cornerstone)",
1164
1217
  rating: 3.5,
1165
1218
  num: 304,
1166
1219
  },
1167
1220
  embodyaspecthearthflame: {
1168
1221
  onStart(pokemon) {
1169
- if (pokemon.baseSpecies.name === 'Ogerpon-Hearthflame-Tera' && !pokemon.transformed && !this.effectState.embodied) {
1222
+ if (pokemon.baseSpecies.name === 'Ogerpon-Hearthflame-Tera' && !this.effectState.embodied) {
1170
1223
  this.effectState.embodied = true;
1171
1224
  this.boost({ atk: 1 }, pokemon);
1172
1225
  }
@@ -1174,13 +1227,14 @@ export const Abilities = {
1174
1227
  onSwitchIn() {
1175
1228
  delete this.effectState.embodied;
1176
1229
  },
1230
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
1177
1231
  name: "Embody Aspect (Hearthflame)",
1178
1232
  rating: 3.5,
1179
1233
  num: 303,
1180
1234
  },
1181
1235
  embodyaspectteal: {
1182
1236
  onStart(pokemon) {
1183
- if (pokemon.baseSpecies.name === 'Ogerpon-Teal-Tera' && !pokemon.transformed && !this.effectState.embodied) {
1237
+ if (pokemon.baseSpecies.name === 'Ogerpon-Teal-Tera' && !this.effectState.embodied) {
1184
1238
  this.effectState.embodied = true;
1185
1239
  this.boost({ spe: 1 }, pokemon);
1186
1240
  }
@@ -1188,13 +1242,14 @@ export const Abilities = {
1188
1242
  onSwitchIn() {
1189
1243
  delete this.effectState.embodied;
1190
1244
  },
1245
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
1191
1246
  name: "Embody Aspect (Teal)",
1192
1247
  rating: 3.5,
1193
1248
  num: 301,
1194
1249
  },
1195
1250
  embodyaspectwellspring: {
1196
1251
  onStart(pokemon) {
1197
- if (pokemon.baseSpecies.name === 'Ogerpon-Wellspring-Tera' && !pokemon.transformed && !this.effectState.embodied) {
1252
+ if (pokemon.baseSpecies.name === 'Ogerpon-Wellspring-Tera' && !this.effectState.embodied) {
1198
1253
  this.effectState.embodied = true;
1199
1254
  this.boost({ spd: 1 }, pokemon);
1200
1255
  }
@@ -1202,6 +1257,7 @@ export const Abilities = {
1202
1257
  onSwitchIn() {
1203
1258
  delete this.effectState.embodied;
1204
1259
  },
1260
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
1205
1261
  name: "Embody Aspect (Wellspring)",
1206
1262
  rating: 3.5,
1207
1263
  num: 302,
@@ -1218,6 +1274,7 @@ export const Abilities = {
1218
1274
  target.switchFlag = true;
1219
1275
  this.add('-activate', target, 'ability: Emergency Exit');
1220
1276
  },
1277
+ flags: {},
1221
1278
  name: "Emergency Exit",
1222
1279
  rating: 1,
1223
1280
  num: 194,
@@ -1238,6 +1295,7 @@ export const Abilities = {
1238
1295
  return;
1239
1296
  return this.chainModify([move.hasAuraBreak ? 3072 : 5448, 4096]);
1240
1297
  },
1298
+ flags: {},
1241
1299
  name: "Fairy Aura",
1242
1300
  rating: 3,
1243
1301
  num: 187,
@@ -1249,7 +1307,7 @@ export const Abilities = {
1249
1307
  return this.chainModify(0.75);
1250
1308
  }
1251
1309
  },
1252
- isBreakable: true,
1310
+ flags: { breakable: 1 },
1253
1311
  name: "Filter",
1254
1312
  rating: 3,
1255
1313
  num: 111,
@@ -1262,6 +1320,7 @@ export const Abilities = {
1262
1320
  }
1263
1321
  }
1264
1322
  },
1323
+ flags: {},
1265
1324
  name: "Flame Body",
1266
1325
  rating: 2,
1267
1326
  num: 49,
@@ -1273,6 +1332,7 @@ export const Abilities = {
1273
1332
  return this.chainModify(1.5);
1274
1333
  }
1275
1334
  },
1335
+ flags: {},
1276
1336
  name: "Flare Boost",
1277
1337
  rating: 2,
1278
1338
  num: 138,
@@ -1313,7 +1373,7 @@ export const Abilities = {
1313
1373
  this.add('-end', target, 'ability: Flash Fire', '[silent]');
1314
1374
  },
1315
1375
  },
1316
- isBreakable: true,
1376
+ flags: { breakable: 1 },
1317
1377
  name: "Flash Fire",
1318
1378
  rating: 3.5,
1319
1379
  num: 18,
@@ -1354,7 +1414,7 @@ export const Abilities = {
1354
1414
  return this.chainModify(1.5);
1355
1415
  }
1356
1416
  },
1357
- isBreakable: true,
1417
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, breakable: 1 },
1358
1418
  name: "Flower Gift",
1359
1419
  rating: 1,
1360
1420
  num: 122,
@@ -1394,7 +1454,7 @@ export const Abilities = {
1394
1454
  return null;
1395
1455
  }
1396
1456
  },
1397
- isBreakable: true,
1457
+ flags: { breakable: 1 },
1398
1458
  name: "Flower Veil",
1399
1459
  rating: 0,
1400
1460
  num: 166,
@@ -1408,7 +1468,7 @@ export const Abilities = {
1408
1468
  mod /= 2;
1409
1469
  return this.chainModify(mod);
1410
1470
  },
1411
- isBreakable: true,
1471
+ flags: { breakable: 1 },
1412
1472
  name: "Fluffy",
1413
1473
  rating: 3.5,
1414
1474
  num: 218,
@@ -1446,6 +1506,7 @@ export const Abilities = {
1446
1506
  pokemon.formeChange(forme, this.effect, false, '[msg]');
1447
1507
  }
1448
1508
  },
1509
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1 },
1449
1510
  name: "Forecast",
1450
1511
  rating: 2,
1451
1512
  num: 59,
@@ -1480,19 +1541,20 @@ export const Abilities = {
1480
1541
  const [warnMoveName, warnTarget] = this.sample(warnMoves);
1481
1542
  this.add('-activate', pokemon, 'ability: Forewarn', warnMoveName, '[of] ' + warnTarget);
1482
1543
  },
1544
+ flags: {},
1483
1545
  name: "Forewarn",
1484
1546
  rating: 0.5,
1485
1547
  num: 108,
1486
1548
  },
1487
1549
  friendguard: {
1488
- name: "Friend Guard",
1489
1550
  onAnyModifyDamage(damage, source, target, move) {
1490
1551
  if (target !== this.effectState.target && target.isAlly(this.effectState.target)) {
1491
1552
  this.debug('Friend Guard weaken');
1492
1553
  return this.chainModify(0.75);
1493
1554
  }
1494
1555
  },
1495
- isBreakable: true,
1556
+ flags: { breakable: 1 },
1557
+ name: "Friend Guard",
1496
1558
  rating: 0,
1497
1559
  num: 132,
1498
1560
  },
@@ -1504,6 +1566,7 @@ export const Abilities = {
1504
1566
  }
1505
1567
  }
1506
1568
  },
1569
+ flags: {},
1507
1570
  name: "Frisk",
1508
1571
  rating: 1.5,
1509
1572
  num: 119,
@@ -1524,6 +1587,7 @@ export const Abilities = {
1524
1587
  this.add("-fail", target, "unboost", "[from] ability: Full Metal Body", "[of] " + target);
1525
1588
  }
1526
1589
  },
1590
+ flags: {},
1527
1591
  name: "Full Metal Body",
1528
1592
  rating: 2,
1529
1593
  num: 230,
@@ -1533,7 +1597,7 @@ export const Abilities = {
1533
1597
  onModifyDef(def) {
1534
1598
  return this.chainModify(2);
1535
1599
  },
1536
- isBreakable: true,
1600
+ flags: { breakable: 1 },
1537
1601
  name: "Fur Coat",
1538
1602
  rating: 4,
1539
1603
  num: 169,
@@ -1543,6 +1607,7 @@ export const Abilities = {
1543
1607
  if (move?.type === 'Flying' && pokemon.hp === pokemon.maxhp)
1544
1608
  return priority + 1;
1545
1609
  },
1610
+ flags: {},
1546
1611
  name: "Gale Wings",
1547
1612
  rating: 1.5,
1548
1613
  num: 177,
@@ -1564,20 +1629,22 @@ export const Abilities = {
1564
1629
  if (move.typeChangerBoosted === this.effect)
1565
1630
  return this.chainModify([4915, 4096]);
1566
1631
  },
1632
+ flags: {},
1567
1633
  name: "Galvanize",
1568
1634
  rating: 4,
1569
1635
  num: 206,
1570
1636
  },
1571
1637
  gluttony: {
1572
- name: "Gluttony",
1573
- rating: 1.5,
1574
- num: 82,
1575
1638
  onStart(pokemon) {
1576
1639
  pokemon.abilityState.gluttony = true;
1577
1640
  },
1578
1641
  onDamage(item, pokemon) {
1579
1642
  pokemon.abilityState.gluttony = true;
1580
1643
  },
1644
+ flags: {},
1645
+ name: "Gluttony",
1646
+ rating: 1.5,
1647
+ num: 82,
1581
1648
  },
1582
1649
  goodasgold: {
1583
1650
  onTryHit(target, source, move) {
@@ -1586,7 +1653,7 @@ export const Abilities = {
1586
1653
  return null;
1587
1654
  }
1588
1655
  },
1589
- isBreakable: true,
1656
+ flags: { breakable: 1 },
1590
1657
  name: "Good as Gold",
1591
1658
  rating: 5,
1592
1659
  num: 283,
@@ -1598,6 +1665,7 @@ export const Abilities = {
1598
1665
  this.boost({ spe: -1 }, source, target, null, true);
1599
1666
  }
1600
1667
  },
1668
+ flags: {},
1601
1669
  name: "Gooey",
1602
1670
  rating: 2,
1603
1671
  num: 183,
@@ -1645,6 +1713,7 @@ export const Abilities = {
1645
1713
  onEnd(pokemon) {
1646
1714
  pokemon.abilityState.choiceLock = "";
1647
1715
  },
1716
+ flags: {},
1648
1717
  name: "Gorilla Tactics",
1649
1718
  rating: 4.5,
1650
1719
  num: 255,
@@ -1655,7 +1724,7 @@ export const Abilities = {
1655
1724
  if (this.field.isTerrain('grassyterrain'))
1656
1725
  return this.chainModify(1.5);
1657
1726
  },
1658
- isBreakable: true,
1727
+ flags: { breakable: 1 },
1659
1728
  name: "Grass Pelt",
1660
1729
  rating: 0.5,
1661
1730
  num: 179,
@@ -1664,6 +1733,7 @@ export const Abilities = {
1664
1733
  onStart(source) {
1665
1734
  this.field.setTerrain('grassyterrain');
1666
1735
  },
1736
+ flags: {},
1667
1737
  name: "Grassy Surge",
1668
1738
  rating: 4,
1669
1739
  num: 229,
@@ -1674,6 +1744,7 @@ export const Abilities = {
1674
1744
  this.boost({ spa: length }, source);
1675
1745
  }
1676
1746
  },
1747
+ flags: {},
1677
1748
  name: "Grim Neigh",
1678
1749
  rating: 3,
1679
1750
  num: 265,
@@ -1690,14 +1761,14 @@ export const Abilities = {
1690
1761
  this.boost({ atk: 1 }, target, target, null, false, true);
1691
1762
  }
1692
1763
  },
1693
- isBreakable: true,
1764
+ flags: { breakable: 1 },
1694
1765
  name: "Guard Dog",
1695
1766
  rating: 2,
1696
1767
  num: 275,
1697
1768
  },
1698
1769
  gulpmissile: {
1699
1770
  onDamagingHit(damage, target, source, move) {
1700
- if (!source.hp || !source.isActive || target.transformed || target.isSemiInvulnerable())
1771
+ if (!source.hp || !source.isActive || target.isSemiInvulnerable())
1701
1772
  return;
1702
1773
  if (['cramorantgulping', 'cramorantgorging'].includes(target.species.id)) {
1703
1774
  this.damage(source.baseMaxhp / 4, source, target);
@@ -1712,13 +1783,12 @@ export const Abilities = {
1712
1783
  },
1713
1784
  // The Dive part of this mechanic is implemented in Dive's `onTryMove` in moves.ts
1714
1785
  onSourceTryPrimaryHit(target, source, effect) {
1715
- if (effect && effect.id === 'surf' && source.hasAbility('gulpmissile') &&
1716
- source.species.name === 'Cramorant' && !source.transformed) {
1786
+ if (effect?.id === 'surf' && source.hasAbility('gulpmissile') && source.species.name === 'Cramorant') {
1717
1787
  const forme = source.hp <= source.maxhp / 2 ? 'cramorantgorging' : 'cramorantgulping';
1718
1788
  source.formeChange(forme, effect);
1719
1789
  }
1720
1790
  },
1721
- isPermanent: true,
1791
+ flags: { cantsuppress: 1, notransform: 1 },
1722
1792
  name: "Gulp Missile",
1723
1793
  rating: 2.5,
1724
1794
  num: 241,
@@ -1730,6 +1800,7 @@ export const Abilities = {
1730
1800
  return this.chainModify(1.5);
1731
1801
  }
1732
1802
  },
1803
+ flags: {},
1733
1804
  name: "Guts",
1734
1805
  rating: 3.5,
1735
1806
  num: 62,
@@ -1747,12 +1818,12 @@ export const Abilities = {
1747
1818
  return this.chainModify([5461, 4096]);
1748
1819
  }
1749
1820
  },
1821
+ flags: {},
1750
1822
  name: "Hadron Engine",
1751
1823
  rating: 4.5,
1752
1824
  num: 289,
1753
1825
  },
1754
1826
  harvest: {
1755
- name: "Harvest",
1756
1827
  onResidualOrder: 28,
1757
1828
  onResidualSubOrder: 2,
1758
1829
  onResidual(pokemon) {
@@ -1764,11 +1835,12 @@ export const Abilities = {
1764
1835
  }
1765
1836
  }
1766
1837
  },
1838
+ flags: {},
1839
+ name: "Harvest",
1767
1840
  rating: 2.5,
1768
1841
  num: 139,
1769
1842
  },
1770
1843
  healer: {
1771
- name: "Healer",
1772
1844
  onResidualOrder: 5,
1773
1845
  onResidualSubOrder: 3,
1774
1846
  onResidual(pokemon) {
@@ -1779,6 +1851,8 @@ export const Abilities = {
1779
1851
  }
1780
1852
  }
1781
1853
  },
1854
+ flags: {},
1855
+ name: "Healer",
1782
1856
  rating: 0,
1783
1857
  num: 131,
1784
1858
  },
@@ -1802,7 +1876,7 @@ export const Abilities = {
1802
1876
  return damage / 2;
1803
1877
  }
1804
1878
  },
1805
- isBreakable: true,
1879
+ flags: { breakable: 1 },
1806
1880
  name: "Heatproof",
1807
1881
  rating: 2,
1808
1882
  num: 85,
@@ -1812,12 +1886,13 @@ export const Abilities = {
1812
1886
  onModifyWeight(weighthg) {
1813
1887
  return weighthg * 2;
1814
1888
  },
1815
- isBreakable: true,
1889
+ flags: { breakable: 1 },
1816
1890
  name: "Heavy Metal",
1817
1891
  rating: 0,
1818
1892
  num: 134,
1819
1893
  },
1820
1894
  honeygather: {
1895
+ flags: {},
1821
1896
  name: "Honey Gather",
1822
1897
  rating: 0,
1823
1898
  num: 118,
@@ -1828,6 +1903,7 @@ export const Abilities = {
1828
1903
  this.heal(ally.baseMaxhp / 4, ally, pokemon);
1829
1904
  }
1830
1905
  },
1906
+ flags: {},
1831
1907
  name: "Hospitality",
1832
1908
  rating: 0,
1833
1909
  num: 299,
@@ -1837,6 +1913,7 @@ export const Abilities = {
1837
1913
  onModifyAtk(atk) {
1838
1914
  return this.chainModify(2);
1839
1915
  },
1916
+ flags: {},
1840
1917
  name: "Huge Power",
1841
1918
  rating: 5,
1842
1919
  num: 37,
@@ -1844,11 +1921,12 @@ export const Abilities = {
1844
1921
  hungerswitch: {
1845
1922
  onResidualOrder: 29,
1846
1923
  onResidual(pokemon) {
1847
- if (pokemon.species.baseSpecies !== 'Morpeko' || pokemon.transformed || pokemon.terastallized)
1924
+ if (pokemon.species.baseSpecies !== 'Morpeko' || pokemon.terastallized)
1848
1925
  return;
1849
1926
  const targetForme = pokemon.species.name === 'Morpeko' ? 'Morpeko-Hangry' : 'Morpeko';
1850
1927
  pokemon.formeChange(targetForme);
1851
1928
  },
1929
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
1852
1930
  name: "Hunger Switch",
1853
1931
  rating: 1,
1854
1932
  num: 258,
@@ -1865,6 +1943,7 @@ export const Abilities = {
1865
1943
  return this.chainModify([3277, 4096]);
1866
1944
  }
1867
1945
  },
1946
+ flags: {},
1868
1947
  name: "Hustle",
1869
1948
  rating: 3.5,
1870
1949
  num: 55,
@@ -1879,6 +1958,7 @@ export const Abilities = {
1879
1958
  pokemon.cureStatus();
1880
1959
  }
1881
1960
  },
1961
+ flags: {},
1882
1962
  name: "Hydration",
1883
1963
  rating: 1.5,
1884
1964
  num: 93,
@@ -1894,7 +1974,7 @@ export const Abilities = {
1894
1974
  }
1895
1975
  }
1896
1976
  },
1897
- isBreakable: true,
1977
+ flags: { breakable: 1 },
1898
1978
  name: "Hyper Cutter",
1899
1979
  rating: 1.5,
1900
1980
  num: 52,
@@ -1909,14 +1989,14 @@ export const Abilities = {
1909
1989
  if (type === 'hail')
1910
1990
  return false;
1911
1991
  },
1992
+ flags: {},
1912
1993
  name: "Ice Body",
1913
1994
  rating: 1,
1914
1995
  num: 115,
1915
1996
  },
1916
1997
  iceface: {
1917
1998
  onStart(pokemon) {
1918
- if (this.field.isWeather(['hail', 'snow']) &&
1919
- pokemon.species.id === 'eiscuenoice' && !pokemon.transformed) {
1999
+ if (this.field.isWeather(['hail', 'snow']) && pokemon.species.id === 'eiscuenoice') {
1920
2000
  this.add('-activate', pokemon, 'ability: Ice Face');
1921
2001
  this.effectState.busted = false;
1922
2002
  pokemon.formeChange('Eiscue', this.effect, true);
@@ -1924,8 +2004,7 @@ export const Abilities = {
1924
2004
  },
1925
2005
  onDamagePriority: 1,
1926
2006
  onDamage(damage, target, source, effect) {
1927
- if (effect && effect.effectType === 'Move' && effect.category === 'Physical' &&
1928
- target.species.id === 'eiscue' && !target.transformed) {
2007
+ if (effect?.effectType === 'Move' && effect.category === 'Physical' && target.species.id === 'eiscue') {
1929
2008
  this.add('-activate', target, 'ability: Ice Face');
1930
2009
  this.effectState.busted = true;
1931
2010
  return 0;
@@ -1934,7 +2013,7 @@ export const Abilities = {
1934
2013
  onCriticalHit(target, type, move) {
1935
2014
  if (!target)
1936
2015
  return;
1937
- if (move.category !== 'Physical' || target.species.id !== 'eiscue' || target.transformed)
2016
+ if (move.category !== 'Physical' || target.species.id !== 'eiscue')
1938
2017
  return;
1939
2018
  if (target.volatiles['substitute'] && !(move.flags['bypasssub'] || move.infiltrates))
1940
2019
  return;
@@ -1945,7 +2024,7 @@ export const Abilities = {
1945
2024
  onEffectiveness(typeMod, target, type, move) {
1946
2025
  if (!target)
1947
2026
  return;
1948
- if (move.category !== 'Physical' || target.species.id !== 'eiscue' || target.transformed)
2027
+ if (move.category !== 'Physical' || target.species.id !== 'eiscue')
1949
2028
  return;
1950
2029
  const hitSub = target.volatiles['substitute'] && !move.flags['bypasssub'] && !(move.infiltrates && this.gen >= 6);
1951
2030
  if (hitSub)
@@ -1965,15 +2044,16 @@ export const Abilities = {
1965
2044
  return;
1966
2045
  if (!pokemon.hp)
1967
2046
  return;
1968
- if (this.field.isWeather(['hail', 'snow']) &&
1969
- pokemon.species.id === 'eiscuenoice' && !pokemon.transformed) {
2047
+ if (this.field.isWeather(['hail', 'snow']) && pokemon.species.id === 'eiscuenoice') {
1970
2048
  this.add('-activate', pokemon, 'ability: Ice Face');
1971
2049
  this.effectState.busted = false;
1972
2050
  pokemon.formeChange('Eiscue', this.effect, true);
1973
2051
  }
1974
2052
  },
1975
- isBreakable: true,
1976
- isPermanent: true,
2053
+ flags: {
2054
+ failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1,
2055
+ breakable: 1, notransform: 1,
2056
+ },
1977
2057
  name: "Ice Face",
1978
2058
  rating: 3,
1979
2059
  num: 248,
@@ -1984,7 +2064,7 @@ export const Abilities = {
1984
2064
  return this.chainModify(0.5);
1985
2065
  }
1986
2066
  },
1987
- isBreakable: true,
2067
+ flags: { breakable: 1 },
1988
2068
  name: "Ice Scales",
1989
2069
  rating: 4,
1990
2070
  num: 246,
@@ -2003,7 +2083,7 @@ export const Abilities = {
2003
2083
  onModifyMove(move) {
2004
2084
  move.ignoreEvasion = true;
2005
2085
  },
2006
- isBreakable: true,
2086
+ flags: { breakable: 1 },
2007
2087
  name: "Illuminate",
2008
2088
  rating: 0.5,
2009
2089
  num: 35,
@@ -2045,6 +2125,7 @@ export const Abilities = {
2045
2125
  onFaint(pokemon) {
2046
2126
  pokemon.illusion = null;
2047
2127
  },
2128
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1 },
2048
2129
  name: "Illusion",
2049
2130
  rating: 4.5,
2050
2131
  num: 149,
@@ -2064,7 +2145,7 @@ export const Abilities = {
2064
2145
  }
2065
2146
  return false;
2066
2147
  },
2067
- isBreakable: true,
2148
+ flags: { breakable: 1 },
2068
2149
  name: "Immunity",
2069
2150
  rating: 2,
2070
2151
  num: 17,
@@ -2086,6 +2167,7 @@ export const Abilities = {
2086
2167
  }
2087
2168
  this.effectState.switchingIn = false;
2088
2169
  },
2170
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1 },
2089
2171
  name: "Imposter",
2090
2172
  rating: 5,
2091
2173
  num: 150,
@@ -2094,18 +2176,20 @@ export const Abilities = {
2094
2176
  onModifyMove(move) {
2095
2177
  move.infiltrates = true;
2096
2178
  },
2179
+ flags: {},
2097
2180
  name: "Infiltrator",
2098
2181
  rating: 2.5,
2099
2182
  num: 151,
2100
2183
  },
2101
2184
  innardsout: {
2102
- name: "Innards Out",
2103
2185
  onDamagingHitOrder: 1,
2104
2186
  onDamagingHit(damage, target, source, move) {
2105
2187
  if (!target.hp) {
2106
2188
  this.damage(target.getUndynamaxedHP(damage), source, target);
2107
2189
  }
2108
2190
  },
2191
+ flags: {},
2192
+ name: "Innards Out",
2109
2193
  rating: 4,
2110
2194
  num: 215,
2111
2195
  },
@@ -2120,7 +2204,7 @@ export const Abilities = {
2120
2204
  this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Inner Focus', '[of] ' + target);
2121
2205
  }
2122
2206
  },
2123
- isBreakable: true,
2207
+ flags: { breakable: 1 },
2124
2208
  name: "Inner Focus",
2125
2209
  rating: 1,
2126
2210
  num: 39,
@@ -2146,7 +2230,7 @@ export const Abilities = {
2146
2230
  return null;
2147
2231
  }
2148
2232
  },
2149
- isBreakable: true,
2233
+ flags: { breakable: 1 },
2150
2234
  name: "Insomnia",
2151
2235
  rating: 1.5,
2152
2236
  num: 15,
@@ -2167,6 +2251,7 @@ export const Abilities = {
2167
2251
  }
2168
2252
  }
2169
2253
  },
2254
+ flags: {},
2170
2255
  name: "Intimidate",
2171
2256
  rating: 3.5,
2172
2257
  num: 22,
@@ -2178,6 +2263,7 @@ export const Abilities = {
2178
2263
  pokemon.swordBoost = true;
2179
2264
  this.boost({ atk: 1 }, pokemon);
2180
2265
  },
2266
+ flags: {},
2181
2267
  name: "Intrepid Sword",
2182
2268
  rating: 4,
2183
2269
  num: 234,
@@ -2189,6 +2275,7 @@ export const Abilities = {
2189
2275
  this.damage(source.baseMaxhp / 8, source, target);
2190
2276
  }
2191
2277
  },
2278
+ flags: {},
2192
2279
  name: "Iron Barbs",
2193
2280
  rating: 2.5,
2194
2281
  num: 160,
@@ -2201,6 +2288,7 @@ export const Abilities = {
2201
2288
  return this.chainModify([4915, 4096]);
2202
2289
  }
2203
2290
  },
2291
+ flags: {},
2204
2292
  name: "Iron Fist",
2205
2293
  rating: 3,
2206
2294
  num: 89,
@@ -2211,6 +2299,7 @@ export const Abilities = {
2211
2299
  this.boost({ atk: 1 });
2212
2300
  }
2213
2301
  },
2302
+ flags: {},
2214
2303
  name: "Justified",
2215
2304
  rating: 2.5,
2216
2305
  num: 154,
@@ -2229,7 +2318,7 @@ export const Abilities = {
2229
2318
  onModifyMove(move) {
2230
2319
  move.ignoreEvasion = true;
2231
2320
  },
2232
- isBreakable: true,
2321
+ flags: { breakable: 1 },
2233
2322
  name: "Keen Eye",
2234
2323
  rating: 0.5,
2235
2324
  num: 51,
@@ -2239,6 +2328,7 @@ export const Abilities = {
2239
2328
  onStart(pokemon) {
2240
2329
  this.singleEvent('End', pokemon.getItem(), pokemon.itemState, pokemon);
2241
2330
  },
2331
+ flags: {},
2242
2332
  name: "Klutz",
2243
2333
  rating: -1,
2244
2334
  num: 103,
@@ -2258,14 +2348,14 @@ export const Abilities = {
2258
2348
  return null;
2259
2349
  }
2260
2350
  },
2261
- isBreakable: true,
2351
+ flags: { breakable: 1 },
2262
2352
  name: "Leaf Guard",
2263
2353
  rating: 0.5,
2264
2354
  num: 102,
2265
2355
  },
2266
2356
  levitate: {
2267
2357
  // airborneness implemented in sim/pokemon.js:Pokemon#isGrounded
2268
- isBreakable: true,
2358
+ flags: { breakable: 1 },
2269
2359
  name: "Levitate",
2270
2360
  rating: 3.5,
2271
2361
  num: 26,
@@ -2287,6 +2377,7 @@ export const Abilities = {
2287
2377
  onSwitchIn() {
2288
2378
  delete this.effectState.libero;
2289
2379
  },
2380
+ flags: {},
2290
2381
  name: "Libero",
2291
2382
  rating: 4,
2292
2383
  num: 236,
@@ -2295,7 +2386,7 @@ export const Abilities = {
2295
2386
  onModifyWeight(weighthg) {
2296
2387
  return this.trunc(weighthg / 2);
2297
2388
  },
2298
- isBreakable: true,
2389
+ flags: { breakable: 1 },
2299
2390
  name: "Light Metal",
2300
2391
  rating: 1,
2301
2392
  num: 135,
@@ -2322,7 +2413,7 @@ export const Abilities = {
2322
2413
  return this.effectState.target;
2323
2414
  }
2324
2415
  },
2325
- isBreakable: true,
2416
+ flags: { breakable: 1 },
2326
2417
  name: "Lightning Rod",
2327
2418
  rating: 3,
2328
2419
  num: 31,
@@ -2342,7 +2433,7 @@ export const Abilities = {
2342
2433
  }
2343
2434
  return false;
2344
2435
  },
2345
- isBreakable: true,
2436
+ flags: { breakable: 1 },
2346
2437
  name: "Limber",
2347
2438
  rating: 2,
2348
2439
  num: 7,
@@ -2350,7 +2441,7 @@ export const Abilities = {
2350
2441
  lingeringaroma: {
2351
2442
  onDamagingHit(damage, target, source, move) {
2352
2443
  const sourceAbility = source.getAbility();
2353
- if (sourceAbility.isPermanent || sourceAbility.id === 'lingeringaroma') {
2444
+ if (sourceAbility.flags['cantsuppress'] || sourceAbility.id === 'lingeringaroma') {
2354
2445
  return;
2355
2446
  }
2356
2447
  if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) {
@@ -2360,6 +2451,7 @@ export const Abilities = {
2360
2451
  }
2361
2452
  }
2362
2453
  },
2454
+ flags: {},
2363
2455
  name: "Lingering Aroma",
2364
2456
  rating: 2,
2365
2457
  num: 268,
@@ -2373,6 +2465,7 @@ export const Abilities = {
2373
2465
  return 0;
2374
2466
  }
2375
2467
  },
2468
+ flags: {},
2376
2469
  name: "Liquid Ooze",
2377
2470
  rating: 2.5,
2378
2471
  num: 64,
@@ -2384,6 +2477,7 @@ export const Abilities = {
2384
2477
  move.type = 'Water';
2385
2478
  }
2386
2479
  },
2480
+ flags: {},
2387
2481
  name: "Liquid Voice",
2388
2482
  rating: 1.5,
2389
2483
  num: 204,
@@ -2392,12 +2486,12 @@ export const Abilities = {
2392
2486
  onModifyMove(move) {
2393
2487
  delete move.flags['contact'];
2394
2488
  },
2489
+ flags: {},
2395
2490
  name: "Long Reach",
2396
2491
  rating: 1,
2397
2492
  num: 203,
2398
2493
  },
2399
2494
  magicbounce: {
2400
- name: "Magic Bounce",
2401
2495
  onTryHitPriority: 1,
2402
2496
  onTryHit(target, source, move) {
2403
2497
  if (target === source || move.hasBounced || !move.flags['reflectable']) {
@@ -2422,7 +2516,8 @@ export const Abilities = {
2422
2516
  condition: {
2423
2517
  duration: 1,
2424
2518
  },
2425
- isBreakable: true,
2519
+ flags: { breakable: 1 },
2520
+ name: "Magic Bounce",
2426
2521
  rating: 4,
2427
2522
  num: 156,
2428
2523
  },
@@ -2434,6 +2529,7 @@ export const Abilities = {
2434
2529
  return false;
2435
2530
  }
2436
2531
  },
2532
+ flags: {},
2437
2533
  name: "Magic Guard",
2438
2534
  rating: 4,
2439
2535
  num: 98,
@@ -2455,6 +2551,7 @@ export const Abilities = {
2455
2551
  this.add('-item', source, yourItem, '[from] ability: Magician', '[of] ' + target);
2456
2552
  }
2457
2553
  },
2554
+ flags: {},
2458
2555
  name: "Magician",
2459
2556
  rating: 1,
2460
2557
  num: 170,
@@ -2470,7 +2567,7 @@ export const Abilities = {
2470
2567
  if (type === 'frz')
2471
2568
  return false;
2472
2569
  },
2473
- isBreakable: true,
2570
+ flags: { breakable: 1 },
2474
2571
  name: "Magma Armor",
2475
2572
  rating: 0.5,
2476
2573
  num: 40,
@@ -2490,6 +2587,7 @@ export const Abilities = {
2490
2587
  pokemon.maybeTrapped = true;
2491
2588
  }
2492
2589
  },
2590
+ flags: {},
2493
2591
  name: "Magnet Pull",
2494
2592
  rating: 4,
2495
2593
  num: 42,
@@ -2501,7 +2599,7 @@ export const Abilities = {
2501
2599
  return this.chainModify(1.5);
2502
2600
  }
2503
2601
  },
2504
- isBreakable: true,
2602
+ flags: { breakable: 1 },
2505
2603
  name: "Marvel Scale",
2506
2604
  rating: 2.5,
2507
2605
  num: 63,
@@ -2513,6 +2611,7 @@ export const Abilities = {
2513
2611
  return this.chainModify(1.5);
2514
2612
  }
2515
2613
  },
2614
+ flags: {},
2516
2615
  name: "Mega Launcher",
2517
2616
  rating: 3,
2518
2617
  num: 178,
@@ -2522,6 +2621,7 @@ export const Abilities = {
2522
2621
  if (target && ['psn', 'tox'].includes(target.status))
2523
2622
  return 5;
2524
2623
  },
2624
+ flags: {},
2525
2625
  name: "Merciless",
2526
2626
  rating: 1.5,
2527
2627
  num: 196,
@@ -2561,6 +2661,7 @@ export const Abilities = {
2561
2661
  this.add('-end', pokemon, 'typechange', '[silent]');
2562
2662
  }
2563
2663
  },
2664
+ flags: {},
2564
2665
  name: "Mimicry",
2565
2666
  rating: 0,
2566
2667
  num: 250,
@@ -2586,6 +2687,7 @@ export const Abilities = {
2586
2687
  move.ignoreImmunity['Normal'] = true;
2587
2688
  }
2588
2689
  },
2690
+ flags: { breakable: 1 },
2589
2691
  name: "Mind's Eye",
2590
2692
  rating: 0,
2591
2693
  num: 300,
@@ -2599,6 +2701,7 @@ export const Abilities = {
2599
2701
  }
2600
2702
  }
2601
2703
  },
2704
+ flags: {},
2602
2705
  name: "Minus",
2603
2706
  rating: 0,
2604
2707
  num: 58,
@@ -2623,7 +2726,7 @@ export const Abilities = {
2623
2726
  }
2624
2727
  }
2625
2728
  },
2626
- isBreakable: true,
2729
+ flags: { breakable: 1 },
2627
2730
  name: "Mirror Armor",
2628
2731
  rating: 2,
2629
2732
  num: 240,
@@ -2632,6 +2735,7 @@ export const Abilities = {
2632
2735
  onStart(source) {
2633
2736
  this.field.setTerrain('mistyterrain');
2634
2737
  },
2738
+ flags: {},
2635
2739
  name: "Misty Surge",
2636
2740
  rating: 3.5,
2637
2741
  num: 228,
@@ -2643,6 +2747,7 @@ export const Abilities = {
2643
2747
  onModifyMove(move) {
2644
2748
  move.ignoreAbility = true;
2645
2749
  },
2750
+ flags: {},
2646
2751
  name: "Mold Breaker",
2647
2752
  rating: 3,
2648
2753
  num: 104,
@@ -2678,6 +2783,7 @@ export const Abilities = {
2678
2783
  boost[randomStat] = -1;
2679
2784
  this.boost(boost, pokemon, pokemon);
2680
2785
  },
2786
+ flags: {},
2681
2787
  name: "Moody",
2682
2788
  rating: 5,
2683
2789
  num: 141,
@@ -2691,7 +2797,7 @@ export const Abilities = {
2691
2797
  return null;
2692
2798
  }
2693
2799
  },
2694
- isBreakable: true,
2800
+ flags: { breakable: 1 },
2695
2801
  name: "Motor Drive",
2696
2802
  rating: 3,
2697
2803
  num: 78,
@@ -2702,6 +2808,7 @@ export const Abilities = {
2702
2808
  this.boost({ atk: length }, source);
2703
2809
  }
2704
2810
  },
2811
+ flags: {},
2705
2812
  name: "Moxie",
2706
2813
  rating: 3,
2707
2814
  num: 153,
@@ -2713,23 +2820,22 @@ export const Abilities = {
2713
2820
  return this.chainModify(0.5);
2714
2821
  }
2715
2822
  },
2716
- isBreakable: true,
2823
+ flags: { breakable: 1 },
2717
2824
  name: "Multiscale",
2718
2825
  rating: 3.5,
2719
2826
  num: 136,
2720
2827
  },
2721
2828
  multitype: {
2722
2829
  // Multitype's type-changing itself is implemented in statuses.js
2723
- isPermanent: true,
2830
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
2724
2831
  name: "Multitype",
2725
2832
  rating: 4,
2726
2833
  num: 121,
2727
2834
  },
2728
2835
  mummy: {
2729
- name: "Mummy",
2730
2836
  onDamagingHit(damage, target, source, move) {
2731
2837
  const sourceAbility = source.getAbility();
2732
- if (sourceAbility.isPermanent || sourceAbility.id === 'mummy') {
2838
+ if (sourceAbility.flags['cantsuppress'] || sourceAbility.id === 'mummy') {
2733
2839
  return;
2734
2840
  }
2735
2841
  if (this.checkMoveMakesContact(move, source, target, !source.isAlly(target))) {
@@ -2739,6 +2845,8 @@ export const Abilities = {
2739
2845
  }
2740
2846
  }
2741
2847
  },
2848
+ flags: {},
2849
+ name: "Mummy",
2742
2850
  rating: 2,
2743
2851
  num: 152,
2744
2852
  },
@@ -2754,6 +2862,7 @@ export const Abilities = {
2754
2862
  move.ignoreAbility = true;
2755
2863
  }
2756
2864
  },
2865
+ flags: {},
2757
2866
  name: "Mycelium Might",
2758
2867
  rating: 2,
2759
2868
  num: 298,
@@ -2836,6 +2945,7 @@ export const Abilities = {
2836
2945
  if (!pokemon.showCure)
2837
2946
  pokemon.showCure = undefined;
2838
2947
  },
2948
+ flags: {},
2839
2949
  name: "Natural Cure",
2840
2950
  rating: 2.5,
2841
2951
  num: 30,
@@ -2846,6 +2956,7 @@ export const Abilities = {
2846
2956
  return this.chainModify([5120, 4096]);
2847
2957
  }
2848
2958
  },
2959
+ flags: {},
2849
2960
  name: "Neuroforce",
2850
2961
  rating: 2.5,
2851
2962
  num: 233,
@@ -2853,8 +2964,6 @@ export const Abilities = {
2853
2964
  neutralizinggas: {
2854
2965
  // Ability suppression implemented in sim/pokemon.ts:Pokemon#ignoringAbility
2855
2966
  onPreStart(pokemon) {
2856
- if (pokemon.transformed)
2857
- return;
2858
2967
  this.add('-ability', pokemon, 'Neutralizing Gas');
2859
2968
  pokemon.abilityState.ending = false;
2860
2969
  const strongWeathers = ['desolateland', 'primordialsea', 'deltastream'];
@@ -2900,7 +3009,7 @@ export const Abilities = {
2900
3009
  this.speedSort(sortedActive);
2901
3010
  for (const pokemon of sortedActive) {
2902
3011
  if (pokemon !== source) {
2903
- if (pokemon.getAbility().isPermanent)
3012
+ if (pokemon.getAbility().flags['cantsuppress'])
2904
3013
  continue; // does not interact with e.g Ice Face, Zen Mode
2905
3014
  if (pokemon.hasItem('abilityshield'))
2906
3015
  continue; // don't restart abilities that weren't suppressed
@@ -2912,6 +3021,7 @@ export const Abilities = {
2912
3021
  }
2913
3022
  }
2914
3023
  },
3024
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
2915
3025
  name: "Neutralizing Gas",
2916
3026
  rating: 3.5,
2917
3027
  num: 256,
@@ -2928,6 +3038,7 @@ export const Abilities = {
2928
3038
  }
2929
3039
  return accuracy;
2930
3040
  },
3041
+ flags: {},
2931
3042
  name: "No Guard",
2932
3043
  rating: 4,
2933
3044
  num: 99,
@@ -2950,6 +3061,7 @@ export const Abilities = {
2950
3061
  if (move.typeChangerBoosted === this.effect)
2951
3062
  return this.chainModify([4915, 4096]);
2952
3063
  },
3064
+ flags: {},
2953
3065
  name: "Normalize",
2954
3066
  rating: 0,
2955
3067
  num: 96,
@@ -2983,7 +3095,7 @@ export const Abilities = {
2983
3095
  this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Oblivious', '[of] ' + target);
2984
3096
  }
2985
3097
  },
2986
- isBreakable: true,
3098
+ flags: { breakable: 1 },
2987
3099
  name: "Oblivious",
2988
3100
  rating: 1.5,
2989
3101
  num: 12,
@@ -3004,6 +3116,7 @@ export const Abilities = {
3004
3116
  return;
3005
3117
  this.boost(positiveBoosts, pokemon);
3006
3118
  },
3119
+ flags: {},
3007
3120
  name: "Opportunist",
3008
3121
  rating: 3,
3009
3122
  num: 290,
@@ -3024,6 +3137,7 @@ export const Abilities = {
3024
3137
  return this.chainModify([5461, 4096]);
3025
3138
  }
3026
3139
  },
3140
+ flags: {},
3027
3141
  name: "Orichalcum Pulse",
3028
3142
  rating: 4.5,
3029
3143
  num: 288,
@@ -3040,7 +3154,7 @@ export const Abilities = {
3040
3154
  return null;
3041
3155
  }
3042
3156
  },
3043
- isBreakable: true,
3157
+ flags: { breakable: 1 },
3044
3158
  name: "Overcoat",
3045
3159
  rating: 2,
3046
3160
  num: 142,
@@ -3060,6 +3174,7 @@ export const Abilities = {
3060
3174
  return this.chainModify(1.5);
3061
3175
  }
3062
3176
  },
3177
+ flags: {},
3063
3178
  name: "Overgrow",
3064
3179
  rating: 2,
3065
3180
  num: 65,
@@ -3086,7 +3201,7 @@ export const Abilities = {
3086
3201
  this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Own Tempo', '[of] ' + target);
3087
3202
  }
3088
3203
  },
3089
- isBreakable: true,
3204
+ flags: { breakable: 1 },
3090
3205
  name: "Own Tempo",
3091
3206
  rating: 1.5,
3092
3207
  num: 20,
@@ -3106,6 +3221,7 @@ export const Abilities = {
3106
3221
  return secondaries.filter(effect => effect.volatileStatus === 'flinch');
3107
3222
  }
3108
3223
  },
3224
+ flags: {},
3109
3225
  name: "Parental Bond",
3110
3226
  rating: 4.5,
3111
3227
  num: 185,
@@ -3148,7 +3264,7 @@ export const Abilities = {
3148
3264
  }
3149
3265
  return false;
3150
3266
  },
3151
- isBreakable: true,
3267
+ flags: { breakable: 1 },
3152
3268
  name: "Pastel Veil",
3153
3269
  rating: 2,
3154
3270
  num: 257,
@@ -3168,6 +3284,7 @@ export const Abilities = {
3168
3284
  pokemon.addVolatile('perishsong');
3169
3285
  }
3170
3286
  },
3287
+ flags: {},
3171
3288
  name: "Perish Body",
3172
3289
  rating: 1,
3173
3290
  num: 253,
@@ -3190,6 +3307,7 @@ export const Abilities = {
3190
3307
  this.add('-item', target, yourItem, '[from] ability: Pickpocket', '[of] ' + source);
3191
3308
  }
3192
3309
  },
3310
+ flags: {},
3193
3311
  name: "Pickpocket",
3194
3312
  rating: 1,
3195
3313
  num: 124,
@@ -3209,6 +3327,7 @@ export const Abilities = {
3209
3327
  this.add('-item', pokemon, this.dex.items.get(item), '[from] ability: Pickup');
3210
3328
  pokemon.setItem(item);
3211
3329
  },
3330
+ flags: {},
3212
3331
  name: "Pickup",
3213
3332
  rating: 0.5,
3214
3333
  num: 53,
@@ -3230,6 +3349,7 @@ export const Abilities = {
3230
3349
  if (move.typeChangerBoosted === this.effect)
3231
3350
  return this.chainModify([4915, 4096]);
3232
3351
  },
3352
+ flags: {},
3233
3353
  name: "Pixilate",
3234
3354
  rating: 4,
3235
3355
  num: 182,
@@ -3243,6 +3363,7 @@ export const Abilities = {
3243
3363
  }
3244
3364
  }
3245
3365
  },
3366
+ flags: {},
3246
3367
  name: "Plus",
3247
3368
  rating: 0,
3248
3369
  num: 57,
@@ -3255,6 +3376,7 @@ export const Abilities = {
3255
3376
  return false;
3256
3377
  }
3257
3378
  },
3379
+ flags: {},
3258
3380
  name: "Poison Heal",
3259
3381
  rating: 4,
3260
3382
  num: 90,
@@ -3267,18 +3389,22 @@ export const Abilities = {
3267
3389
  }
3268
3390
  }
3269
3391
  },
3392
+ flags: {},
3270
3393
  name: "Poison Point",
3271
3394
  rating: 1.5,
3272
3395
  num: 38,
3273
3396
  },
3274
3397
  poisonpuppeteer: {
3275
3398
  onAnyAfterSetStatus(status, target, source, effect) {
3399
+ if (source.baseSpecies.name !== "Pecharunt")
3400
+ return;
3276
3401
  if (source !== this.effectState.target || target === source || effect.effectType !== 'Move')
3277
3402
  return;
3278
3403
  if (status.id === 'psn' || status.id === 'tox') {
3279
3404
  target.addVolatile('confusion');
3280
3405
  }
3281
3406
  },
3407
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1 },
3282
3408
  name: "Poison Puppeteer",
3283
3409
  rating: 3,
3284
3410
  num: 310,
@@ -3294,6 +3420,7 @@ export const Abilities = {
3294
3420
  }
3295
3421
  }
3296
3422
  },
3423
+ flags: {},
3297
3424
  name: "Poison Touch",
3298
3425
  rating: 2,
3299
3426
  num: 143,
@@ -3313,7 +3440,7 @@ export const Abilities = {
3313
3440
  pokemon.maxhp = newMaxHP;
3314
3441
  this.add('-heal', pokemon, pokemon.getHealth, '[silent]');
3315
3442
  },
3316
- isPermanent: true,
3443
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
3317
3444
  name: "Power Construct",
3318
3445
  rating: 5,
3319
3446
  num: 211,
@@ -3323,15 +3450,13 @@ export const Abilities = {
3323
3450
  if (!this.effectState.target.hp)
3324
3451
  return;
3325
3452
  const ability = target.getAbility();
3326
- const additionalBannedAbilities = [
3327
- 'noability', 'commander', 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'wonderguard',
3328
- ];
3329
- if (target.getAbility().isPermanent || additionalBannedAbilities.includes(target.ability))
3453
+ if (ability.flags['noreceiver'] || ability.id === 'noability')
3330
3454
  return;
3331
3455
  if (this.effectState.target.setAbility(ability)) {
3332
3456
  this.add('-ability', this.effectState.target, ability, '[from] ability: Power of Alchemy', '[of] ' + target);
3333
3457
  }
3334
3458
  },
3459
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1 },
3335
3460
  name: "Power of Alchemy",
3336
3461
  rating: 0,
3337
3462
  num: 223,
@@ -3344,6 +3469,7 @@ export const Abilities = {
3344
3469
  return this.chainModify([5325, 4096]);
3345
3470
  }
3346
3471
  },
3472
+ flags: {},
3347
3473
  name: "Power Spot",
3348
3474
  rating: 0,
3349
3475
  num: 249,
@@ -3355,6 +3481,7 @@ export const Abilities = {
3355
3481
  return priority + 1;
3356
3482
  }
3357
3483
  },
3484
+ flags: {},
3358
3485
  name: "Prankster",
3359
3486
  rating: 4,
3360
3487
  num: 158,
@@ -3368,6 +3495,7 @@ export const Abilities = {
3368
3495
  return;
3369
3496
  return 1;
3370
3497
  },
3498
+ flags: {},
3371
3499
  name: "Pressure",
3372
3500
  rating: 2.5,
3373
3501
  num: 46,
@@ -3394,6 +3522,7 @@ export const Abilities = {
3394
3522
  }
3395
3523
  this.field.clearWeather();
3396
3524
  },
3525
+ flags: {},
3397
3526
  name: "Primordial Sea",
3398
3527
  rating: 4.5,
3399
3528
  num: 189,
@@ -3405,6 +3534,7 @@ export const Abilities = {
3405
3534
  return this.chainModify(0.75);
3406
3535
  }
3407
3536
  },
3537
+ flags: {},
3408
3538
  name: "Prism Armor",
3409
3539
  rating: 3,
3410
3540
  num: 232,
@@ -3415,6 +3545,7 @@ export const Abilities = {
3415
3545
  // most of the implementation is in Battle#getTarget
3416
3546
  move.tracksTarget = move.target !== 'scripted';
3417
3547
  },
3548
+ flags: {},
3418
3549
  name: "Propeller Tail",
3419
3550
  rating: 0,
3420
3551
  num: 239,
@@ -3436,6 +3567,7 @@ export const Abilities = {
3436
3567
  onSwitchIn(pokemon) {
3437
3568
  delete this.effectState.protean;
3438
3569
  },
3570
+ flags: {},
3439
3571
  name: "Protean",
3440
3572
  rating: 4,
3441
3573
  num: 168,
@@ -3445,8 +3577,6 @@ export const Abilities = {
3445
3577
  this.singleEvent('WeatherChange', this.effect, this.effectState, pokemon);
3446
3578
  },
3447
3579
  onWeatherChange(pokemon) {
3448
- if (pokemon.transformed)
3449
- return;
3450
3580
  // Protosynthesis is not affected by Utility Umbrella
3451
3581
  if (this.field.isWeather('sunnyday')) {
3452
3582
  pokemon.addVolatile('protosynthesis');
@@ -3510,6 +3640,7 @@ export const Abilities = {
3510
3640
  this.add('-end', pokemon, 'Protosynthesis');
3511
3641
  },
3512
3642
  },
3643
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
3513
3644
  name: "Protosynthesis",
3514
3645
  rating: 3,
3515
3646
  num: 281,
@@ -3518,6 +3649,7 @@ export const Abilities = {
3518
3649
  onStart(source) {
3519
3650
  this.field.setTerrain('psychicterrain');
3520
3651
  },
3652
+ flags: {},
3521
3653
  name: "Psychic Surge",
3522
3654
  rating: 4,
3523
3655
  num: 227,
@@ -3536,7 +3668,7 @@ export const Abilities = {
3536
3668
  return this.chainModify(0.5);
3537
3669
  }
3538
3670
  },
3539
- isBreakable: true,
3671
+ flags: { breakable: 1 },
3540
3672
  name: "Punk Rock",
3541
3673
  rating: 3.5,
3542
3674
  num: 244,
@@ -3546,6 +3678,7 @@ export const Abilities = {
3546
3678
  onModifyAtk(atk) {
3547
3679
  return this.chainModify(2);
3548
3680
  },
3681
+ flags: {},
3549
3682
  name: "Pure Power",
3550
3683
  rating: 5,
3551
3684
  num: 74,
@@ -3577,7 +3710,7 @@ export const Abilities = {
3577
3710
  return this.chainModify(0.5);
3578
3711
  }
3579
3712
  },
3580
- isBreakable: true,
3713
+ flags: { breakable: 1 },
3581
3714
  name: "Purifying Salt",
3582
3715
  rating: 4,
3583
3716
  num: 272,
@@ -3587,8 +3720,6 @@ export const Abilities = {
3587
3720
  this.singleEvent('TerrainChange', this.effect, this.effectState, pokemon);
3588
3721
  },
3589
3722
  onTerrainChange(pokemon) {
3590
- if (pokemon.transformed)
3591
- return;
3592
3723
  if (this.field.isTerrain('electricterrain')) {
3593
3724
  pokemon.addVolatile('quarkdrive');
3594
3725
  }
@@ -3651,6 +3782,7 @@ export const Abilities = {
3651
3782
  this.add('-end', pokemon, 'Quark Drive');
3652
3783
  },
3653
3784
  },
3785
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, notransform: 1 },
3654
3786
  name: "Quark Drive",
3655
3787
  rating: 3,
3656
3788
  num: 282,
@@ -3668,7 +3800,7 @@ export const Abilities = {
3668
3800
  return false;
3669
3801
  }
3670
3802
  },
3671
- isBreakable: true,
3803
+ flags: { breakable: 1 },
3672
3804
  name: "Queenly Majesty",
3673
3805
  rating: 2.5,
3674
3806
  num: 214,
@@ -3681,6 +3813,7 @@ export const Abilities = {
3681
3813
  return 0.1;
3682
3814
  }
3683
3815
  },
3816
+ flags: {},
3684
3817
  name: "Quick Draw",
3685
3818
  rating: 2.5,
3686
3819
  num: 259,
@@ -3691,6 +3824,7 @@ export const Abilities = {
3691
3824
  return this.chainModify(1.5);
3692
3825
  }
3693
3826
  },
3827
+ flags: {},
3694
3828
  name: "Quick Feet",
3695
3829
  rating: 2.5,
3696
3830
  num: 95,
@@ -3703,6 +3837,7 @@ export const Abilities = {
3703
3837
  this.heal(target.baseMaxhp / 16);
3704
3838
  }
3705
3839
  },
3840
+ flags: {},
3706
3841
  name: "Rain Dish",
3707
3842
  rating: 1.5,
3708
3843
  num: 44,
@@ -3718,6 +3853,7 @@ export const Abilities = {
3718
3853
  this.boost({ spe: 1 });
3719
3854
  }
3720
3855
  },
3856
+ flags: {},
3721
3857
  name: "Rattled",
3722
3858
  rating: 1,
3723
3859
  num: 155,
@@ -3727,15 +3863,13 @@ export const Abilities = {
3727
3863
  if (!this.effectState.target.hp)
3728
3864
  return;
3729
3865
  const ability = target.getAbility();
3730
- const additionalBannedAbilities = [
3731
- 'noability', 'commander', 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'wonderguard',
3732
- ];
3733
- if (target.getAbility().isPermanent || additionalBannedAbilities.includes(target.ability))
3866
+ if (ability.flags['noreceiver'] || ability.id === 'noability')
3734
3867
  return;
3735
3868
  if (this.effectState.target.setAbility(ability)) {
3736
3869
  this.add('-ability', this.effectState.target, ability, '[from] ability: Receiver', '[of] ' + target);
3737
3870
  }
3738
3871
  },
3872
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1 },
3739
3873
  name: "Receiver",
3740
3874
  rating: 0,
3741
3875
  num: 222,
@@ -3748,6 +3882,7 @@ export const Abilities = {
3748
3882
  return this.chainModify([4915, 4096]);
3749
3883
  }
3750
3884
  },
3885
+ flags: {},
3751
3886
  name: "Reckless",
3752
3887
  rating: 3,
3753
3888
  num: 120,
@@ -3769,6 +3904,7 @@ export const Abilities = {
3769
3904
  if (move.typeChangerBoosted === this.effect)
3770
3905
  return this.chainModify([4915, 4096]);
3771
3906
  },
3907
+ flags: {},
3772
3908
  name: "Refrigerate",
3773
3909
  rating: 4,
3774
3910
  num: 174,
@@ -3777,6 +3913,7 @@ export const Abilities = {
3777
3913
  onSwitchOut(pokemon) {
3778
3914
  pokemon.heal(pokemon.baseMaxhp / 3);
3779
3915
  },
3916
+ flags: {},
3780
3917
  name: "Regenerator",
3781
3918
  rating: 4.5,
3782
3919
  num: 144,
@@ -3817,6 +3954,7 @@ export const Abilities = {
3817
3954
  // Record if the pokemon ate a berry to resist the attack
3818
3955
  pokemon.abilityState.berryWeaken = weakenBerries.includes(item.name);
3819
3956
  },
3957
+ flags: {},
3820
3958
  name: "Ripen",
3821
3959
  rating: 2,
3822
3960
  num: 247,
@@ -3835,13 +3973,14 @@ export const Abilities = {
3835
3973
  }
3836
3974
  }
3837
3975
  },
3976
+ flags: {},
3838
3977
  name: "Rivalry",
3839
3978
  rating: 0,
3840
3979
  num: 79,
3841
3980
  },
3842
3981
  rkssystem: {
3843
3982
  // RKS System's type-changing itself is implemented in statuses.js
3844
- isPermanent: true,
3983
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
3845
3984
  name: "RKS System",
3846
3985
  rating: 4,
3847
3986
  num: 225,
@@ -3855,6 +3994,7 @@ export const Abilities = {
3855
3994
  return null;
3856
3995
  }
3857
3996
  },
3997
+ flags: {},
3858
3998
  name: "Rock Head",
3859
3999
  rating: 3,
3860
4000
  num: 69,
@@ -3874,6 +4014,7 @@ export const Abilities = {
3874
4014
  return this.chainModify(1.5);
3875
4015
  }
3876
4016
  },
4017
+ flags: {},
3877
4018
  name: "Rocky Payload",
3878
4019
  rating: 3.5,
3879
4020
  num: 276,
@@ -3885,11 +4026,13 @@ export const Abilities = {
3885
4026
  this.damage(source.baseMaxhp / 8, source, target);
3886
4027
  }
3887
4028
  },
4029
+ flags: {},
3888
4030
  name: "Rough Skin",
3889
4031
  rating: 2.5,
3890
4032
  num: 24,
3891
4033
  },
3892
4034
  runaway: {
4035
+ flags: {},
3893
4036
  name: "Run Away",
3894
4037
  rating: 0,
3895
4038
  num: 50,
@@ -3908,6 +4051,7 @@ export const Abilities = {
3908
4051
  if (type === 'sandstorm')
3909
4052
  return false;
3910
4053
  },
4054
+ flags: {},
3911
4055
  name: "Sand Force",
3912
4056
  rating: 2,
3913
4057
  num: 159,
@@ -3922,6 +4066,7 @@ export const Abilities = {
3922
4066
  if (type === 'sandstorm')
3923
4067
  return false;
3924
4068
  },
4069
+ flags: {},
3925
4070
  name: "Sand Rush",
3926
4071
  rating: 3,
3927
4072
  num: 146,
@@ -3930,6 +4075,7 @@ export const Abilities = {
3930
4075
  onDamagingHit(damage, target, source, move) {
3931
4076
  this.field.setWeather('sandstorm');
3932
4077
  },
4078
+ flags: {},
3933
4079
  name: "Sand Spit",
3934
4080
  rating: 1,
3935
4081
  num: 245,
@@ -3938,6 +4084,7 @@ export const Abilities = {
3938
4084
  onStart(source) {
3939
4085
  this.field.setWeather('sandstorm');
3940
4086
  },
4087
+ flags: {},
3941
4088
  name: "Sand Stream",
3942
4089
  rating: 4,
3943
4090
  num: 45,
@@ -3956,7 +4103,7 @@ export const Abilities = {
3956
4103
  return this.chainModify([3277, 4096]);
3957
4104
  }
3958
4105
  },
3959
- isBreakable: true,
4106
+ flags: { breakable: 1 },
3960
4107
  name: "Sand Veil",
3961
4108
  rating: 1.5,
3962
4109
  num: 8,
@@ -3978,7 +4125,7 @@ export const Abilities = {
3978
4125
  this.boost({ atk: 1 }, this.effectState.target);
3979
4126
  }
3980
4127
  },
3981
- isBreakable: true,
4128
+ flags: { breakable: 1 },
3982
4129
  name: "Sap Sipper",
3983
4130
  rating: 3,
3984
4131
  num: 157,
@@ -4014,7 +4161,7 @@ export const Abilities = {
4014
4161
  }
4015
4162
  }
4016
4163
  },
4017
- isPermanent: true,
4164
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
4018
4165
  name: "Schooling",
4019
4166
  rating: 3,
4020
4167
  num: 208,
@@ -4035,6 +4182,7 @@ export const Abilities = {
4035
4182
  this.add('-fail', target, 'unboost', 'Attack', '[from] ability: Scrappy', '[of] ' + target);
4036
4183
  }
4037
4184
  },
4185
+ flags: {},
4038
4186
  name: "Scrappy",
4039
4187
  rating: 3,
4040
4188
  num: 113,
@@ -4054,6 +4202,7 @@ export const Abilities = {
4054
4202
  }
4055
4203
  }
4056
4204
  },
4205
+ flags: {},
4057
4206
  name: "Screen Cleaner",
4058
4207
  rating: 2,
4059
4208
  num: 251,
@@ -4062,6 +4211,7 @@ export const Abilities = {
4062
4211
  onDamagingHit(damage, target, source, move) {
4063
4212
  this.field.setTerrain('grassyterrain');
4064
4213
  },
4214
+ flags: {},
4065
4215
  name: "Seed Sower",
4066
4216
  rating: 2.5,
4067
4217
  num: 269,
@@ -4079,6 +4229,7 @@ export const Abilities = {
4079
4229
  if (move.self?.chance)
4080
4230
  move.self.chance *= 2;
4081
4231
  },
4232
+ flags: {},
4082
4233
  name: "Serene Grace",
4083
4234
  rating: 3.5,
4084
4235
  num: 32,
@@ -4090,6 +4241,7 @@ export const Abilities = {
4090
4241
  return this.chainModify(0.5);
4091
4242
  }
4092
4243
  },
4244
+ flags: {},
4093
4245
  name: "Shadow Shield",
4094
4246
  rating: 3.5,
4095
4247
  num: 231,
@@ -4109,6 +4261,7 @@ export const Abilities = {
4109
4261
  pokemon.maybeTrapped = true;
4110
4262
  }
4111
4263
  },
4264
+ flags: {},
4112
4265
  name: "Shadow Tag",
4113
4266
  rating: 5,
4114
4267
  num: 23,
@@ -4121,6 +4274,7 @@ export const Abilities = {
4121
4274
  return this.chainModify(1.5);
4122
4275
  }
4123
4276
  },
4277
+ flags: {},
4124
4278
  name: "Sharpness",
4125
4279
  rating: 3.5,
4126
4280
  num: 292,
@@ -4135,6 +4289,7 @@ export const Abilities = {
4135
4289
  pokemon.cureStatus();
4136
4290
  }
4137
4291
  },
4292
+ flags: {},
4138
4293
  name: "Shed Skin",
4139
4294
  rating: 3,
4140
4295
  num: 61,
@@ -4156,13 +4311,14 @@ export const Abilities = {
4156
4311
  if (move.hasSheerForce)
4157
4312
  return this.chainModify([5325, 4096]);
4158
4313
  },
4314
+ flags: {},
4159
4315
  name: "Sheer Force",
4160
4316
  rating: 3.5,
4161
4317
  num: 125,
4162
4318
  },
4163
4319
  shellarmor: {
4164
4320
  onCriticalHit: false,
4165
- isBreakable: true,
4321
+ flags: { breakable: 1 },
4166
4322
  name: "Shell Armor",
4167
4323
  rating: 1,
4168
4324
  num: 75,
@@ -4172,7 +4328,7 @@ export const Abilities = {
4172
4328
  this.debug('Shield Dust prevent secondary');
4173
4329
  return secondaries.filter(effect => !!(effect.self || effect.dustproof));
4174
4330
  },
4175
- isBreakable: true,
4331
+ flags: { breakable: 1 },
4176
4332
  name: "Shield Dust",
4177
4333
  rating: 2,
4178
4334
  num: 19,
@@ -4223,7 +4379,7 @@ export const Abilities = {
4223
4379
  this.add('-immune', target, '[from] ability: Shields Down');
4224
4380
  return null;
4225
4381
  },
4226
- isPermanent: true,
4382
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
4227
4383
  name: "Shields Down",
4228
4384
  rating: 3,
4229
4385
  num: 197,
@@ -4237,7 +4393,7 @@ export const Abilities = {
4237
4393
  boost[i] *= 2;
4238
4394
  }
4239
4395
  },
4240
- isBreakable: true,
4396
+ flags: { breakable: 1 },
4241
4397
  name: "Simple",
4242
4398
  rating: 4,
4243
4399
  num: 86,
@@ -4251,6 +4407,7 @@ export const Abilities = {
4251
4407
  delete move.multiaccuracy;
4252
4408
  }
4253
4409
  },
4410
+ flags: {},
4254
4411
  name: "Skill Link",
4255
4412
  rating: 3,
4256
4413
  num: 92,
@@ -4281,6 +4438,7 @@ export const Abilities = {
4281
4438
  this.add('-end', target, 'Slow Start');
4282
4439
  },
4283
4440
  },
4441
+ flags: {},
4284
4442
  name: "Slow Start",
4285
4443
  rating: -1,
4286
4444
  num: 112,
@@ -4291,6 +4449,7 @@ export const Abilities = {
4291
4449
  return this.chainModify(2);
4292
4450
  }
4293
4451
  },
4452
+ flags: {},
4294
4453
  name: "Slush Rush",
4295
4454
  rating: 3,
4296
4455
  num: 202,
@@ -4302,6 +4461,7 @@ export const Abilities = {
4302
4461
  return this.chainModify(1.5);
4303
4462
  }
4304
4463
  },
4464
+ flags: {},
4305
4465
  name: "Sniper",
4306
4466
  rating: 2,
4307
4467
  num: 97,
@@ -4320,7 +4480,7 @@ export const Abilities = {
4320
4480
  return this.chainModify([3277, 4096]);
4321
4481
  }
4322
4482
  },
4323
- isBreakable: true,
4483
+ flags: { breakable: 1 },
4324
4484
  name: "Snow Cloak",
4325
4485
  rating: 1.5,
4326
4486
  num: 81,
@@ -4329,6 +4489,7 @@ export const Abilities = {
4329
4489
  onStart(source) {
4330
4490
  this.field.setWeather('snow');
4331
4491
  },
4492
+ flags: {},
4332
4493
  name: "Snow Warning",
4333
4494
  rating: 4,
4334
4495
  num: 117,
@@ -4347,6 +4508,7 @@ export const Abilities = {
4347
4508
  this.damage(target.baseMaxhp / 8, target, target);
4348
4509
  }
4349
4510
  },
4511
+ flags: {},
4350
4512
  name: "Solar Power",
4351
4513
  rating: 2,
4352
4514
  num: 94,
@@ -4358,7 +4520,7 @@ export const Abilities = {
4358
4520
  return this.chainModify(0.75);
4359
4521
  }
4360
4522
  },
4361
- isBreakable: true,
4523
+ flags: { breakable: 1 },
4362
4524
  name: "Solid Rock",
4363
4525
  rating: 3,
4364
4526
  num: 116,
@@ -4368,6 +4530,7 @@ export const Abilities = {
4368
4530
  onAnyFaint() {
4369
4531
  this.boost({ spa: 1 }, this.effectState.target);
4370
4532
  },
4533
+ flags: {},
4371
4534
  name: "Soul-Heart",
4372
4535
  rating: 3.5,
4373
4536
  num: 220,
@@ -4384,7 +4547,7 @@ export const Abilities = {
4384
4547
  this.add('-immune', this.effectState.target, '[from] ability: Soundproof');
4385
4548
  }
4386
4549
  },
4387
- isBreakable: true,
4550
+ flags: { breakable: 1 },
4388
4551
  name: "Soundproof",
4389
4552
  rating: 2,
4390
4553
  num: 43,
@@ -4397,6 +4560,7 @@ export const Abilities = {
4397
4560
  this.boost({ spe: 1 });
4398
4561
  }
4399
4562
  },
4563
+ flags: {},
4400
4564
  name: "Speed Boost",
4401
4565
  rating: 4.5,
4402
4566
  num: 3,
@@ -4416,12 +4580,14 @@ export const Abilities = {
4416
4580
  return this.chainModify(2);
4417
4581
  }
4418
4582
  },
4583
+ flags: {},
4419
4584
  name: "Stakeout",
4420
4585
  rating: 4.5,
4421
4586
  num: 198,
4422
4587
  },
4423
4588
  stall: {
4424
4589
  onFractionalPriority: -0.1,
4590
+ flags: {},
4425
4591
  name: "Stall",
4426
4592
  rating: -1,
4427
4593
  num: 100,
@@ -4432,6 +4598,7 @@ export const Abilities = {
4432
4598
  // most of the implementation is in Battle#getTarget
4433
4599
  move.tracksTarget = move.target !== 'scripted';
4434
4600
  },
4601
+ flags: {},
4435
4602
  name: "Stalwart",
4436
4603
  rating: 0,
4437
4604
  num: 242,
@@ -4440,6 +4607,7 @@ export const Abilities = {
4440
4607
  onDamagingHit(damage, target, source, effect) {
4441
4608
  this.boost({ def: 1 });
4442
4609
  },
4610
+ flags: {},
4443
4611
  name: "Stamina",
4444
4612
  rating: 4,
4445
4613
  num: 192,
@@ -4455,7 +4623,7 @@ export const Abilities = {
4455
4623
  if (attacker.species.name !== targetForme)
4456
4624
  attacker.formeChange(targetForme);
4457
4625
  },
4458
- isPermanent: true,
4626
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
4459
4627
  name: "Stance Change",
4460
4628
  rating: 4,
4461
4629
  num: 176,
@@ -4468,6 +4636,7 @@ export const Abilities = {
4468
4636
  }
4469
4637
  }
4470
4638
  },
4639
+ flags: {},
4471
4640
  name: "Static",
4472
4641
  rating: 2,
4473
4642
  num: 9,
@@ -4476,6 +4645,7 @@ export const Abilities = {
4476
4645
  onFlinch(pokemon) {
4477
4646
  this.boost({ spe: 1 });
4478
4647
  },
4648
+ flags: {},
4479
4649
  name: "Steadfast",
4480
4650
  rating: 1,
4481
4651
  num: 80,
@@ -4486,6 +4656,7 @@ export const Abilities = {
4486
4656
  this.boost({ spe: 6 });
4487
4657
  }
4488
4658
  },
4659
+ flags: {},
4489
4660
  name: "Steam Engine",
4490
4661
  rating: 2,
4491
4662
  num: 243,
@@ -4505,6 +4676,7 @@ export const Abilities = {
4505
4676
  return this.chainModify(1.5);
4506
4677
  }
4507
4678
  },
4679
+ flags: {},
4508
4680
  name: "Steelworker",
4509
4681
  rating: 3.5,
4510
4682
  num: 200,
@@ -4517,6 +4689,7 @@ export const Abilities = {
4517
4689
  return this.chainModify(1.5);
4518
4690
  }
4519
4691
  },
4692
+ flags: {},
4520
4693
  name: "Steely Spirit",
4521
4694
  rating: 3.5,
4522
4695
  num: 252,
@@ -4538,6 +4711,7 @@ export const Abilities = {
4538
4711
  });
4539
4712
  }
4540
4713
  },
4714
+ flags: {},
4541
4715
  name: "Stench",
4542
4716
  rating: 0.5,
4543
4717
  num: 1,
@@ -4553,7 +4727,7 @@ export const Abilities = {
4553
4727
  return false;
4554
4728
  }
4555
4729
  },
4556
- isBreakable: true,
4730
+ flags: { breakable: 1 },
4557
4731
  name: "Sticky Hold",
4558
4732
  rating: 1.5,
4559
4733
  num: 60,
@@ -4580,7 +4754,7 @@ export const Abilities = {
4580
4754
  return this.effectState.target;
4581
4755
  }
4582
4756
  },
4583
- isBreakable: true,
4757
+ flags: { breakable: 1 },
4584
4758
  name: "Storm Drain",
4585
4759
  rating: 3,
4586
4760
  num: 114,
@@ -4592,6 +4766,7 @@ export const Abilities = {
4592
4766
  return this.chainModify(1.5);
4593
4767
  }
4594
4768
  },
4769
+ flags: {},
4595
4770
  name: "Strong Jaw",
4596
4771
  rating: 3.5,
4597
4772
  num: 173,
@@ -4610,7 +4785,7 @@ export const Abilities = {
4610
4785
  return target.hp - 1;
4611
4786
  }
4612
4787
  },
4613
- isBreakable: true,
4788
+ flags: { breakable: 1 },
4614
4789
  name: "Sturdy",
4615
4790
  rating: 3,
4616
4791
  num: 5,
@@ -4621,7 +4796,7 @@ export const Abilities = {
4621
4796
  this.add('-activate', pokemon, 'ability: Suction Cups');
4622
4797
  return null;
4623
4798
  },
4624
- isBreakable: true,
4799
+ flags: { breakable: 1 },
4625
4800
  name: "Suction Cups",
4626
4801
  rating: 1,
4627
4802
  num: 21,
@@ -4630,6 +4805,7 @@ export const Abilities = {
4630
4805
  onModifyCritRatio(critRatio) {
4631
4806
  return critRatio + 1;
4632
4807
  },
4808
+ flags: {},
4633
4809
  name: "Super Luck",
4634
4810
  rating: 1.5,
4635
4811
  num: 105,
@@ -4654,6 +4830,7 @@ export const Abilities = {
4654
4830
  }
4655
4831
  }
4656
4832
  },
4833
+ flags: {},
4657
4834
  name: "Supersweet Syrup",
4658
4835
  rating: 1.5,
4659
4836
  num: 306,
@@ -4678,6 +4855,7 @@ export const Abilities = {
4678
4855
  return this.chainModify([powMod[this.effectState.fallen], 4096]);
4679
4856
  }
4680
4857
  },
4858
+ flags: {},
4681
4859
  name: "Supreme Overlord",
4682
4860
  rating: 4,
4683
4861
  num: 293,
@@ -4688,6 +4866,7 @@ export const Abilities = {
4688
4866
  return this.chainModify(2);
4689
4867
  }
4690
4868
  },
4869
+ flags: {},
4691
4870
  name: "Surge Surfer",
4692
4871
  rating: 3,
4693
4872
  num: 207,
@@ -4707,12 +4886,12 @@ export const Abilities = {
4707
4886
  return this.chainModify(1.5);
4708
4887
  }
4709
4888
  },
4889
+ flags: {},
4710
4890
  name: "Swarm",
4711
4891
  rating: 2,
4712
4892
  num: 68,
4713
4893
  },
4714
4894
  sweetveil: {
4715
- name: "Sweet Veil",
4716
4895
  onAllySetStatus(status, target, source, effect) {
4717
4896
  if (status.id === 'slp') {
4718
4897
  this.debug('Sweet Veil interrupts sleep');
@@ -4729,7 +4908,8 @@ export const Abilities = {
4729
4908
  return null;
4730
4909
  }
4731
4910
  },
4732
- isBreakable: true,
4911
+ flags: { breakable: 1 },
4912
+ name: "Sweet Veil",
4733
4913
  rating: 2,
4734
4914
  num: 175,
4735
4915
  },
@@ -4739,6 +4919,7 @@ export const Abilities = {
4739
4919
  return this.chainModify(2);
4740
4920
  }
4741
4921
  },
4922
+ flags: {},
4742
4923
  name: "Swift Swim",
4743
4924
  rating: 3,
4744
4925
  num: 33,
@@ -4758,6 +4939,7 @@ export const Abilities = {
4758
4939
  }
4759
4940
  this.add('-activate', source, 'ability: Symbiosis', myItem, '[of] ' + pokemon);
4760
4941
  },
4942
+ flags: {},
4761
4943
  name: "Symbiosis",
4762
4944
  rating: 0,
4763
4945
  num: 180,
@@ -4775,6 +4957,7 @@ export const Abilities = {
4775
4957
  // and show messages when activating against it.
4776
4958
  source.trySetStatus(status, target, { status: status.id, id: 'synchronize' });
4777
4959
  },
4960
+ flags: {},
4778
4961
  name: "Synchronize",
4779
4962
  rating: 2,
4780
4963
  num: 28,
@@ -4796,6 +4979,7 @@ export const Abilities = {
4796
4979
  this.debug('Sword of Ruin Def drop');
4797
4980
  return this.chainModify(0.75);
4798
4981
  },
4982
+ flags: {},
4799
4983
  name: "Sword of Ruin",
4800
4984
  rating: 4.5,
4801
4985
  num: 285,
@@ -4817,6 +5001,7 @@ export const Abilities = {
4817
5001
  this.debug('Tablets of Ruin Atk drop');
4818
5002
  return this.chainModify(0.75);
4819
5003
  },
5004
+ flags: {},
4820
5005
  name: "Tablets of Ruin",
4821
5006
  rating: 4.5,
4822
5007
  num: 284,
@@ -4831,7 +5016,7 @@ export const Abilities = {
4831
5016
  return this.chainModify(0.5);
4832
5017
  }
4833
5018
  },
4834
- isBreakable: true,
5019
+ flags: { breakable: 1 },
4835
5020
  name: "Tangled Feet",
4836
5021
  rating: 1,
4837
5022
  num: 77,
@@ -4843,6 +5028,7 @@ export const Abilities = {
4843
5028
  this.boost({ spe: -1 }, source, target, null, true);
4844
5029
  }
4845
5030
  },
5031
+ flags: {},
4846
5032
  name: "Tangling Hair",
4847
5033
  rating: 2,
4848
5034
  num: 221,
@@ -4857,6 +5043,7 @@ export const Abilities = {
4857
5043
  return this.chainModify(1.5);
4858
5044
  }
4859
5045
  },
5046
+ flags: {},
4860
5047
  name: "Technician",
4861
5048
  rating: 3.5,
4862
5049
  num: 101,
@@ -4868,7 +5055,7 @@ export const Abilities = {
4868
5055
  return null;
4869
5056
  }
4870
5057
  },
4871
- isBreakable: true,
5058
+ flags: { breakable: 1 },
4872
5059
  name: "Telepathy",
4873
5060
  rating: 0,
4874
5061
  num: 140,
@@ -4883,13 +5070,14 @@ export const Abilities = {
4883
5070
  this.field.clearTerrain();
4884
5071
  }
4885
5072
  },
5073
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1 },
4886
5074
  name: "Teraform Zero",
4887
5075
  rating: 3,
4888
5076
  num: 309,
4889
5077
  },
4890
5078
  terashell: {
4891
5079
  onEffectiveness(typeMod, target, type, move) {
4892
- if (!target || target.species.name !== 'Terapagos-Terastal')
5080
+ if (!target || target.baseSpecies.name !== 'Terapagos-Terastal')
4893
5081
  return;
4894
5082
  if (this.effectState.resisted)
4895
5083
  return -1; // all hits of multi-hit move should be not very effective
@@ -4906,21 +5094,21 @@ export const Abilities = {
4906
5094
  onAnyAfterMove() {
4907
5095
  this.effectState.resisted = false;
4908
5096
  },
4909
- isBreakable: true,
5097
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, breakable: 1 },
4910
5098
  name: "Tera Shell",
4911
5099
  rating: 3.5,
4912
5100
  num: 308,
4913
5101
  },
4914
5102
  terashift: {
4915
5103
  onPreStart(pokemon) {
4916
- if (pokemon.baseSpecies.baseSpecies !== 'Terapagos' || pokemon.transformed)
5104
+ if (pokemon.baseSpecies.baseSpecies !== 'Terapagos')
4917
5105
  return;
4918
5106
  if (pokemon.species.forme !== 'Terastal') {
4919
5107
  this.add('-activate', pokemon, 'ability: Tera Shift');
4920
5108
  pokemon.formeChange('Terapagos-Terastal', this.effect, true);
4921
5109
  }
4922
5110
  },
4923
- isPermanent: true,
5111
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1, notransform: 1 },
4924
5112
  name: "Tera Shift",
4925
5113
  rating: 3,
4926
5114
  num: 307,
@@ -4932,6 +5120,7 @@ export const Abilities = {
4932
5120
  onModifyMove(move) {
4933
5121
  move.ignoreAbility = true;
4934
5122
  },
5123
+ flags: {},
4935
5124
  name: "Teravolt",
4936
5125
  rating: 3,
4937
5126
  num: 164,
@@ -4956,6 +5145,7 @@ export const Abilities = {
4956
5145
  }
4957
5146
  return false;
4958
5147
  },
5148
+ flags: { breakable: 1 },
4959
5149
  name: "Thermal Exchange",
4960
5150
  rating: 2.5,
4961
5151
  num: 270,
@@ -4975,7 +5165,7 @@ export const Abilities = {
4975
5165
  return this.chainModify(0.5);
4976
5166
  }
4977
5167
  },
4978
- isBreakable: true,
5168
+ flags: { breakable: 1 },
4979
5169
  name: "Thick Fat",
4980
5170
  rating: 3.5,
4981
5171
  num: 47,
@@ -4987,6 +5177,7 @@ export const Abilities = {
4987
5177
  return this.chainModify(2);
4988
5178
  }
4989
5179
  },
5180
+ flags: {},
4990
5181
  name: "Tinted Lens",
4991
5182
  rating: 4,
4992
5183
  num: 110,
@@ -5006,6 +5197,7 @@ export const Abilities = {
5006
5197
  return this.chainModify(1.5);
5007
5198
  }
5008
5199
  },
5200
+ flags: {},
5009
5201
  name: "Torrent",
5010
5202
  rating: 2,
5011
5203
  num: 67,
@@ -5017,6 +5209,7 @@ export const Abilities = {
5017
5209
  return this.chainModify([5325, 4096]);
5018
5210
  }
5019
5211
  },
5212
+ flags: {},
5020
5213
  name: "Tough Claws",
5021
5214
  rating: 3.5,
5022
5215
  num: 181,
@@ -5028,6 +5221,7 @@ export const Abilities = {
5028
5221
  return this.chainModify(1.5);
5029
5222
  }
5030
5223
  },
5224
+ flags: {},
5031
5225
  name: "Toxic Boost",
5032
5226
  rating: 3,
5033
5227
  num: 137,
@@ -5041,6 +5235,7 @@ export const Abilities = {
5041
5235
  target.trySetStatus('tox', source);
5042
5236
  }
5043
5237
  },
5238
+ flags: {},
5044
5239
  name: "Toxic Chain",
5045
5240
  rating: 4.5,
5046
5241
  num: 305,
@@ -5054,6 +5249,7 @@ export const Abilities = {
5054
5249
  side.addSideCondition('toxicspikes', target);
5055
5250
  }
5056
5251
  },
5252
+ flags: {},
5057
5253
  name: "Toxic Debris",
5058
5254
  rating: 3.5,
5059
5255
  num: 295,
@@ -5074,11 +5270,7 @@ export const Abilities = {
5074
5270
  onUpdate(pokemon) {
5075
5271
  if (!pokemon.isStarted || this.effectState.gaveUp)
5076
5272
  return;
5077
- const additionalBannedAbilities = [
5078
- // Zen Mode included here for compatability with Gen 5-6
5079
- 'noability', 'commander', 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'zenmode',
5080
- ];
5081
- const possibleTargets = pokemon.adjacentFoes().filter(target => (!target.getAbility().isPermanent && !additionalBannedAbilities.includes(target.ability)));
5273
+ const possibleTargets = pokemon.adjacentFoes().filter(target => !target.getAbility().flags['notrace'] && target.ability !== 'noability');
5082
5274
  if (!possibleTargets.length)
5083
5275
  return;
5084
5276
  const target = this.sample(possibleTargets);
@@ -5087,6 +5279,7 @@ export const Abilities = {
5087
5279
  this.add('-ability', pokemon, ability, '[from] ability: Trace', '[of] ' + target);
5088
5280
  }
5089
5281
  },
5282
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1 },
5090
5283
  name: "Trace",
5091
5284
  rating: 2.5,
5092
5285
  num: 36,
@@ -5106,6 +5299,7 @@ export const Abilities = {
5106
5299
  return this.chainModify([5325, 4096]);
5107
5300
  }
5108
5301
  },
5302
+ flags: {},
5109
5303
  name: "Transistor",
5110
5304
  rating: 3.5,
5111
5305
  num: 262,
@@ -5115,6 +5309,7 @@ export const Abilities = {
5115
5309
  if (move?.flags['heal'])
5116
5310
  return priority + 3;
5117
5311
  },
5312
+ flags: {},
5118
5313
  name: "Triage",
5119
5314
  rating: 3.5,
5120
5315
  num: 205,
@@ -5135,6 +5330,7 @@ export const Abilities = {
5135
5330
  pokemon.addVolatile('truant');
5136
5331
  },
5137
5332
  condition: {},
5333
+ flags: {},
5138
5334
  name: "Truant",
5139
5335
  rating: -1,
5140
5336
  num: 54,
@@ -5146,12 +5342,12 @@ export const Abilities = {
5146
5342
  onModifyMove(move) {
5147
5343
  move.ignoreAbility = true;
5148
5344
  },
5345
+ flags: {},
5149
5346
  name: "Turboblaze",
5150
5347
  rating: 3,
5151
5348
  num: 163,
5152
5349
  },
5153
5350
  unaware: {
5154
- name: "Unaware",
5155
5351
  onAnyModifyBoost(boosts, pokemon) {
5156
5352
  const unawareUser = this.effectState.target;
5157
5353
  if (unawareUser === pokemon)
@@ -5168,7 +5364,8 @@ export const Abilities = {
5168
5364
  boosts['accuracy'] = 0;
5169
5365
  }
5170
5366
  },
5171
- isBreakable: true,
5367
+ flags: { breakable: 1 },
5368
+ name: "Unaware",
5172
5369
  rating: 4,
5173
5370
  num: 109,
5174
5371
  },
@@ -5191,6 +5388,7 @@ export const Abilities = {
5191
5388
  }
5192
5389
  },
5193
5390
  },
5391
+ flags: {},
5194
5392
  name: "Unburden",
5195
5393
  rating: 3.5,
5196
5394
  num: 84,
@@ -5212,6 +5410,7 @@ export const Abilities = {
5212
5410
  onFoeTryEatItem() {
5213
5411
  return !this.effectState.unnerved;
5214
5412
  },
5413
+ flags: {},
5215
5414
  name: "Unnerve",
5216
5415
  rating: 1,
5217
5416
  num: 127,
@@ -5221,6 +5420,7 @@ export const Abilities = {
5221
5420
  if (move.flags['contact'])
5222
5421
  delete move.flags['protect'];
5223
5422
  },
5423
+ flags: {},
5224
5424
  name: "Unseen Fist",
5225
5425
  rating: 2,
5226
5426
  num: 260,
@@ -5242,6 +5442,7 @@ export const Abilities = {
5242
5442
  this.debug('Vessel of Ruin SpA drop');
5243
5443
  return this.chainModify(0.75);
5244
5444
  },
5445
+ flags: {},
5245
5446
  name: "Vessel of Ruin",
5246
5447
  rating: 4.5,
5247
5448
  num: 284,
@@ -5253,6 +5454,7 @@ export const Abilities = {
5253
5454
  return this.chainModify([4506, 4096]);
5254
5455
  }
5255
5456
  },
5457
+ flags: {},
5256
5458
  name: "Victory Star",
5257
5459
  rating: 2,
5258
5460
  num: 162,
@@ -5278,7 +5480,7 @@ export const Abilities = {
5278
5480
  return null;
5279
5481
  }
5280
5482
  },
5281
- isBreakable: true,
5483
+ flags: { breakable: 1 },
5282
5484
  name: "Vital Spirit",
5283
5485
  rating: 1.5,
5284
5486
  num: 72,
@@ -5292,18 +5494,15 @@ export const Abilities = {
5292
5494
  return null;
5293
5495
  }
5294
5496
  },
5295
- isBreakable: true,
5497
+ flags: { breakable: 1 },
5296
5498
  name: "Volt Absorb",
5297
5499
  rating: 3.5,
5298
5500
  num: 10,
5299
5501
  },
5300
5502
  wanderingspirit: {
5301
5503
  onDamagingHit(damage, target, source, move) {
5302
- const additionalBannedAbilities = ['commander', 'hungerswitch', 'illusion', 'neutralizinggas', 'wonderguard'];
5303
- if (source.getAbility().isPermanent || additionalBannedAbilities.includes(source.ability) ||
5304
- target.volatiles['dynamax']) {
5504
+ if (source.getAbility().flags['failskillswap'] || target.volatiles['dynamax'])
5305
5505
  return;
5306
- }
5307
5506
  if (this.checkMoveMakesContact(move, source, target)) {
5308
5507
  const targetCanBeSet = this.runEvent('SetAbility', target, source, this.effect, source.ability);
5309
5508
  if (!targetCanBeSet)
@@ -5320,6 +5519,7 @@ export const Abilities = {
5320
5519
  target.setAbility(sourceAbility);
5321
5520
  }
5322
5521
  },
5522
+ flags: {},
5323
5523
  name: "Wandering Spirit",
5324
5524
  rating: 2.5,
5325
5525
  num: 254,
@@ -5333,7 +5533,7 @@ export const Abilities = {
5333
5533
  return null;
5334
5534
  }
5335
5535
  },
5336
- isBreakable: true,
5536
+ flags: { breakable: 1 },
5337
5537
  name: "Water Absorb",
5338
5538
  rating: 3.5,
5339
5539
  num: 11,
@@ -5375,7 +5575,7 @@ export const Abilities = {
5375
5575
  }
5376
5576
  return false;
5377
5577
  },
5378
- isBreakable: true,
5578
+ flags: { breakable: 1 },
5379
5579
  name: "Water Bubble",
5380
5580
  rating: 4.5,
5381
5581
  num: 199,
@@ -5386,6 +5586,7 @@ export const Abilities = {
5386
5586
  this.boost({ def: 2 });
5387
5587
  }
5388
5588
  },
5589
+ flags: {},
5389
5590
  name: "Water Compaction",
5390
5591
  rating: 1.5,
5391
5592
  num: 195,
@@ -5405,7 +5606,7 @@ export const Abilities = {
5405
5606
  }
5406
5607
  return false;
5407
5608
  },
5408
- isBreakable: true,
5609
+ flags: { breakable: 1 },
5409
5610
  name: "Water Veil",
5410
5611
  rating: 2,
5411
5612
  num: 41,
@@ -5416,6 +5617,7 @@ export const Abilities = {
5416
5617
  this.boost({ def: -1, spe: 2 }, target, target);
5417
5618
  }
5418
5619
  },
5620
+ flags: {},
5419
5621
  name: "Weak Armor",
5420
5622
  rating: 1,
5421
5623
  num: 133,
@@ -5429,7 +5631,7 @@ export const Abilities = {
5429
5631
  return null;
5430
5632
  }
5431
5633
  },
5432
- isBreakable: true,
5634
+ flags: { breakable: 1 },
5433
5635
  name: "Well-Baked Body",
5434
5636
  rating: 3.5,
5435
5637
  num: 273,
@@ -5450,7 +5652,7 @@ export const Abilities = {
5450
5652
  this.add("-fail", target, "unboost", "[from] ability: White Smoke", "[of] " + target);
5451
5653
  }
5452
5654
  },
5453
- isBreakable: true,
5655
+ flags: { breakable: 1 },
5454
5656
  name: "White Smoke",
5455
5657
  rating: 2,
5456
5658
  num: 73,
@@ -5467,6 +5669,7 @@ export const Abilities = {
5467
5669
  target.switchFlag = true;
5468
5670
  this.add('-activate', target, 'ability: Wimp Out');
5469
5671
  },
5672
+ flags: {},
5470
5673
  name: "Wimp Out",
5471
5674
  rating: 1,
5472
5675
  num: 193,
@@ -5484,6 +5687,7 @@ export const Abilities = {
5484
5687
  pokemon.addVolatile('charge');
5485
5688
  }
5486
5689
  },
5690
+ flags: {},
5487
5691
  name: "Wind Power",
5488
5692
  rating: 1,
5489
5693
  num: 277,
@@ -5508,7 +5712,7 @@ export const Abilities = {
5508
5712
  this.boost({ atk: 1 }, pokemon, pokemon);
5509
5713
  }
5510
5714
  },
5511
- isBreakable: true,
5715
+ flags: { breakable: 1 },
5512
5716
  name: "Wind Rider",
5513
5717
  rating: 3.5,
5514
5718
  // We do not want Brambleghast to get Infiltrator in Randbats
@@ -5531,7 +5735,7 @@ export const Abilities = {
5531
5735
  return null;
5532
5736
  }
5533
5737
  },
5534
- isBreakable: true,
5738
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, failskillswap: 1, breakable: 1 },
5535
5739
  name: "Wonder Guard",
5536
5740
  rating: 5,
5537
5741
  num: 25,
@@ -5544,7 +5748,7 @@ export const Abilities = {
5544
5748
  return 50;
5545
5749
  }
5546
5750
  },
5547
- isBreakable: true,
5751
+ flags: { breakable: 1 },
5548
5752
  name: "Wonder Skin",
5549
5753
  rating: 2,
5550
5754
  num: 147,
@@ -5589,14 +5793,14 @@ export const Abilities = {
5589
5793
  }
5590
5794
  },
5591
5795
  },
5592
- isPermanent: true,
5796
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
5593
5797
  name: "Zen Mode",
5594
5798
  rating: 0,
5595
5799
  num: 161,
5596
5800
  },
5597
5801
  zerotohero: {
5598
5802
  onSwitchOut(pokemon) {
5599
- if (pokemon.baseSpecies.baseSpecies !== 'Palafin' || pokemon.transformed)
5803
+ if (pokemon.baseSpecies.baseSpecies !== 'Palafin')
5600
5804
  return;
5601
5805
  if (pokemon.species.forme !== 'Hero') {
5602
5806
  pokemon.formeChange('Palafin-Hero', this.effect, true);
@@ -5609,14 +5813,14 @@ export const Abilities = {
5609
5813
  if (!this.effectState.switchingIn)
5610
5814
  return;
5611
5815
  this.effectState.switchingIn = false;
5612
- if (pokemon.baseSpecies.baseSpecies !== 'Palafin' || pokemon.transformed)
5816
+ if (pokemon.baseSpecies.baseSpecies !== 'Palafin')
5613
5817
  return;
5614
5818
  if (!this.effectState.heroMessageDisplayed && pokemon.species.forme === 'Hero') {
5615
5819
  this.add('-activate', pokemon, 'ability: Zero to Hero');
5616
5820
  this.effectState.heroMessageDisplayed = true;
5617
5821
  }
5618
5822
  },
5619
- isPermanent: true,
5823
+ flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1, notransform: 1 },
5620
5824
  name: "Zero to Hero",
5621
5825
  rating: 5,
5622
5826
  num: 278,
@@ -5635,14 +5839,13 @@ export const Abilities = {
5635
5839
  }
5636
5840
  },
5637
5841
  isNonstandard: "CAP",
5638
- isBreakable: true,
5842
+ flags: { breakable: 1 },
5639
5843
  name: "Mountaineer",
5640
5844
  rating: 3,
5641
5845
  num: -2,
5642
5846
  },
5643
5847
  rebound: {
5644
5848
  isNonstandard: "CAP",
5645
- name: "Rebound",
5646
5849
  onTryHitPriority: 1,
5647
5850
  onTryHit(target, source, move) {
5648
5851
  if (this.effectState.target.activeTurns)
@@ -5669,14 +5872,16 @@ export const Abilities = {
5669
5872
  condition: {
5670
5873
  duration: 1,
5671
5874
  },
5672
- isBreakable: true,
5875
+ flags: { breakable: 1 },
5876
+ name: "Rebound",
5673
5877
  rating: 3,
5674
5878
  num: -3,
5675
5879
  },
5676
5880
  persistent: {
5677
5881
  isNonstandard: "CAP",
5678
- name: "Persistent",
5679
5882
  // implemented in the corresponding move
5883
+ flags: {},
5884
+ name: "Persistent",
5680
5885
  rating: 3,
5681
5886
  num: -4,
5682
5887
  },