@pkmn/sim 0.7.28 → 0.7.30

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 (94) hide show
  1. package/build/cjs/config/formats.js +25 -37
  2. package/build/cjs/config/formats.js.map +1 -1
  3. package/build/cjs/data/abilities.js +10 -13
  4. package/build/cjs/data/abilities.js.map +1 -1
  5. package/build/cjs/data/formats-data.js +14 -18
  6. package/build/cjs/data/formats-data.js.map +1 -1
  7. package/build/cjs/data/items.js +6 -11
  8. package/build/cjs/data/items.js.map +1 -1
  9. package/build/cjs/data/mods/gen1/scripts.js +5 -4
  10. package/build/cjs/data/mods/gen1/scripts.js.map +1 -1
  11. package/build/cjs/data/mods/gen2/moves.js +10 -6
  12. package/build/cjs/data/mods/gen2/moves.js.map +1 -1
  13. package/build/cjs/data/mods/gen3/moves.js +16 -10
  14. package/build/cjs/data/mods/gen3/moves.js.map +1 -1
  15. package/build/cjs/data/mods/gen3/scripts.js +1 -1
  16. package/build/cjs/data/mods/gen3/scripts.js.map +1 -1
  17. package/build/cjs/data/mods/gen4/items.js +1 -1
  18. package/build/cjs/data/mods/gen4/items.js.map +1 -1
  19. package/build/cjs/data/mods/gen4/moves.js +22 -51
  20. package/build/cjs/data/mods/gen4/moves.js.map +1 -1
  21. package/build/cjs/data/mods/gen5/moves.js +28 -37
  22. package/build/cjs/data/mods/gen5/moves.js.map +1 -1
  23. package/build/cjs/data/mods/gen6/moves.js +25 -2
  24. package/build/cjs/data/mods/gen6/moves.js.map +1 -1
  25. package/build/cjs/data/mods/gen7/moves.js +1 -1
  26. package/build/cjs/data/mods/gen7/moves.js.map +1 -1
  27. package/build/cjs/data/mods/gen8/abilities.js +2 -2
  28. package/build/cjs/data/mods/gen8/abilities.js.map +1 -1
  29. package/build/cjs/data/mods/gen8/moves.js +55 -0
  30. package/build/cjs/data/mods/gen8/moves.js.map +1 -1
  31. package/build/cjs/data/moves.js +153 -179
  32. package/build/cjs/data/moves.js.map +1 -1
  33. package/build/cjs/data/text/abilities.js +16 -4
  34. package/build/cjs/data/text/abilities.js.map +1 -1
  35. package/build/cjs/data/text/moves.js +44 -11
  36. package/build/cjs/data/text/moves.js.map +1 -1
  37. package/build/cjs/sim/battle-actions.js +2 -1
  38. package/build/cjs/sim/battle-actions.js.map +1 -1
  39. package/build/cjs/sim/battle.js +2 -2
  40. package/build/cjs/sim/battle.js.map +1 -1
  41. package/build/cjs/sim/dex-moves.js.map +1 -1
  42. package/build/cjs/sim/pokemon.js +7 -13
  43. package/build/cjs/sim/pokemon.js.map +1 -1
  44. package/build/cjs/sim/team-validator.js +1 -1
  45. package/build/cjs/sim/team-validator.js.map +1 -1
  46. package/build/esm/config/formats.mjs +25 -37
  47. package/build/esm/config/formats.mjs.map +1 -1
  48. package/build/esm/data/abilities.mjs +10 -13
  49. package/build/esm/data/abilities.mjs.map +1 -1
  50. package/build/esm/data/formats-data.mjs +14 -18
  51. package/build/esm/data/formats-data.mjs.map +1 -1
  52. package/build/esm/data/items.mjs +6 -11
  53. package/build/esm/data/items.mjs.map +1 -1
  54. package/build/esm/data/mods/gen1/scripts.mjs +5 -4
  55. package/build/esm/data/mods/gen1/scripts.mjs.map +1 -1
  56. package/build/esm/data/mods/gen2/moves.mjs +10 -6
  57. package/build/esm/data/mods/gen2/moves.mjs.map +1 -1
  58. package/build/esm/data/mods/gen3/moves.mjs +16 -10
  59. package/build/esm/data/mods/gen3/moves.mjs.map +1 -1
  60. package/build/esm/data/mods/gen3/scripts.mjs +1 -1
  61. package/build/esm/data/mods/gen3/scripts.mjs.map +1 -1
  62. package/build/esm/data/mods/gen4/items.mjs +1 -1
  63. package/build/esm/data/mods/gen4/items.mjs.map +1 -1
  64. package/build/esm/data/mods/gen4/moves.mjs +22 -51
  65. package/build/esm/data/mods/gen4/moves.mjs.map +1 -1
  66. package/build/esm/data/mods/gen5/moves.mjs +28 -37
  67. package/build/esm/data/mods/gen5/moves.mjs.map +1 -1
  68. package/build/esm/data/mods/gen6/moves.mjs +25 -2
  69. package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
  70. package/build/esm/data/mods/gen7/moves.mjs +1 -1
  71. package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
  72. package/build/esm/data/mods/gen8/abilities.mjs +2 -2
  73. package/build/esm/data/mods/gen8/abilities.mjs.map +1 -1
  74. package/build/esm/data/mods/gen8/moves.mjs +55 -0
  75. package/build/esm/data/mods/gen8/moves.mjs.map +1 -1
  76. package/build/esm/data/moves.mjs +153 -179
  77. package/build/esm/data/moves.mjs.map +1 -1
  78. package/build/esm/data/text/abilities.mjs +16 -4
  79. package/build/esm/data/text/abilities.mjs.map +1 -1
  80. package/build/esm/data/text/moves.mjs +44 -11
  81. package/build/esm/data/text/moves.mjs.map +1 -1
  82. package/build/esm/sim/battle-actions.mjs +2 -1
  83. package/build/esm/sim/battle-actions.mjs.map +1 -1
  84. package/build/esm/sim/battle.mjs +2 -2
  85. package/build/esm/sim/battle.mjs.map +1 -1
  86. package/build/esm/sim/dex-moves.mjs.map +1 -1
  87. package/build/esm/sim/pokemon.mjs +7 -13
  88. package/build/esm/sim/pokemon.mjs.map +1 -1
  89. package/build/esm/sim/team-validator.mjs +1 -1
  90. package/build/esm/sim/team-validator.mjs.map +1 -1
  91. package/build/types/sim/dex-moves.d.ts +12 -2
  92. package/build/types/sim/exported-global-types.d.ts +1 -0
  93. package/build/types/sim/global-types.d.ts +1 -0
  94. package/package.json +1 -1
@@ -1,33 +1,5 @@
1
1
  "use strict";
2
- /*
3
-
4
- List of flags and their descriptions:
5
-
6
- bypasssub: Ignores a target's substitute.
7
- bite: Power is multiplied by 1.5 when used by a Pokemon with the Strong Jaw Ability.
8
- bullet: Has no effect on Pokemon with the Bulletproof Ability.
9
- charge: The user is unable to make a move between turns.
10
- contact: Makes contact.
11
- dance: When used by a Pokemon, other Pokemon with the Dancer Ability can attempt to execute the same move.
12
- defrost: Thaws the user if executed successfully while the user is frozen.
13
- distance: Can target a Pokemon positioned anywhere in a Triple Battle.
14
- gravity: Prevented from being executed or selected during Gravity's effect.
15
- heal: Prevented from being executed or selected during Heal Block's effect.
16
- mirror: Can be copied by Mirror Move.
17
- allyanim: Animates when used against allies
18
- nonsky: Prevented from being executed or selected in a Sky Battle.
19
- powder: Has no effect on Grass-type Pokemon, Pokemon with the Overcoat Ability, and Pokemon holding Safety Goggles.
20
- protect: Blocked by Detect, Protect, Spiky Shield, and if not a Status move, King's Shield.
21
- pulse: Power is multiplied by 1.5 when used by a Pokemon with the Mega Launcher Ability.
22
- punch: Power is multiplied by 1.2 when used by a Pokemon with the Iron Fist Ability.
23
- recharge: If this move is successful, the user must recharge on the following turn and cannot make a move.
24
- reflectable: Bounced back to the original user by Magic Coat or the Magic Bounce Ability.
25
- slicing: Power is multiplied by 1.5 when used by a Pokemon with the Ability Sharpness.
26
- snatch: Can be stolen from the original user and instead used by another Pokemon using Snatch.
27
- sound: Has no effect on Pokemon with the Soundproof Ability.
28
- wind: Activates the Wind Power and Wind Rider Abilities.
29
-
30
- */
2
+ // List of flags and their descriptions can be found in sim/dex-moves.ts
31
3
  Object.defineProperty(exports, "__esModule", { value: true });
32
4
  exports.Moves = void 0;
33
5
  exports.Moves = {
@@ -621,21 +593,16 @@ exports.Moves = {
621
593
  name: "Assist",
622
594
  pp: 20,
623
595
  priority: 0,
624
- flags: {},
596
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
625
597
  onHit(target) {
626
- const noAssist = [
627
- 'assist', 'banefulbunker', 'beakblast', 'belch', 'bestow', 'blazingtorque', 'bounce', 'celebrate', 'chatter', 'circlethrow', 'combattorque', 'copycat', 'counter', 'covet', 'destinybond', 'detect', 'dig', 'dive', 'dragontail', 'endure', 'feint', 'fly', 'focuspunch', 'followme', 'helpinghand', 'holdhands', 'kingsshield', 'magicaltorque', 'matblock', 'mefirst', 'metronome', 'mimic', 'mirrorcoat', 'mirrormove', 'naturepower', 'noxioustorque', 'phantomforce', 'protect', 'ragepowder', 'roar', 'shadowforce', 'shelltrap', 'sketch', 'skydrop', 'sleeptalk', 'snatch', 'spikyshield', 'spotlight', 'struggle', 'switcheroo', 'thief', 'transform', 'trick', 'whirlwind', 'wickedtorque',
628
- ];
629
598
  const moves = [];
630
599
  for (const pokemon of target.side.pokemon) {
631
600
  if (pokemon === target)
632
601
  continue;
633
602
  for (const moveSlot of pokemon.moveSlots) {
634
603
  const moveid = moveSlot.id;
635
- if (noAssist.includes(moveid))
636
- continue;
637
604
  const move = this.dex.moves.get(moveid);
638
- if (move.isZ || move.isMax) {
605
+ if (move.flags['noassist'] || move.isZ || move.isMax) {
639
606
  continue;
640
607
  }
641
608
  moves.push(moveid);
@@ -999,7 +966,7 @@ exports.Moves = {
999
966
  name: "Baddy Bad",
1000
967
  pp: 15,
1001
968
  priority: 0,
1002
- flags: { protect: 1 },
969
+ flags: { protect: 1, mirror: 1 },
1003
970
  self: {
1004
971
  sideCondition: 'reflect',
1005
972
  },
@@ -1016,7 +983,7 @@ exports.Moves = {
1016
983
  name: "Baneful Bunker",
1017
984
  pp: 10,
1018
985
  priority: 4,
1019
- flags: {},
986
+ flags: { noassist: 1, failcopycat: 1 },
1020
987
  stallingMove: true,
1021
988
  volatileStatus: 'banefulbunker',
1022
989
  onPrepareHit(pokemon) {
@@ -1163,7 +1130,7 @@ exports.Moves = {
1163
1130
  name: "Beak Blast",
1164
1131
  pp: 15,
1165
1132
  priority: -3,
1166
- flags: { bullet: 1, protect: 1 },
1133
+ flags: { bullet: 1, protect: 1, noassist: 1, failmefirst: 1, nosleeptalk: 1, failcopycat: 1, failinstruct: 1 },
1167
1134
  priorityChargeCallback(pokemon) {
1168
1135
  pokemon.addVolatile('beakblast');
1169
1136
  },
@@ -1219,7 +1186,7 @@ exports.Moves = {
1219
1186
  name: "Behemoth Bash",
1220
1187
  pp: 5,
1221
1188
  priority: 0,
1222
- flags: { contact: 1, protect: 1, mirror: 1 },
1189
+ flags: { contact: 1, protect: 1, mirror: 1, failcopycat: 1, failmimic: 1 },
1223
1190
  secondary: null,
1224
1191
  target: "normal",
1225
1192
  type: "Steel",
@@ -1232,7 +1199,7 @@ exports.Moves = {
1232
1199
  name: "Behemoth Blade",
1233
1200
  pp: 5,
1234
1201
  priority: 0,
1235
- flags: { contact: 1, protect: 1, mirror: 1, slicing: 1 },
1202
+ flags: { contact: 1, protect: 1, mirror: 1, slicing: 1, failcopycat: 1, failmimic: 1 },
1236
1203
  secondary: null,
1237
1204
  target: "normal",
1238
1205
  type: "Steel",
@@ -1245,7 +1212,7 @@ exports.Moves = {
1245
1212
  name: "Belch",
1246
1213
  pp: 10,
1247
1214
  priority: 0,
1248
- flags: { protect: 1 },
1215
+ flags: { protect: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
1249
1216
  onDisableMove(pokemon) {
1250
1217
  if (!pokemon.ateBerry)
1251
1218
  pokemon.disableMove('belch');
@@ -1286,7 +1253,7 @@ exports.Moves = {
1286
1253
  name: "Bestow",
1287
1254
  pp: 15,
1288
1255
  priority: 0,
1289
- flags: { mirror: 1, bypasssub: 1, allyanim: 1 },
1256
+ flags: { mirror: 1, bypasssub: 1, allyanim: 1, noassist: 1, failcopycat: 1 },
1290
1257
  onHit(target, source, move) {
1291
1258
  if (target.item) {
1292
1259
  return false;
@@ -1315,7 +1282,7 @@ exports.Moves = {
1315
1282
  name: "Bide",
1316
1283
  pp: 10,
1317
1284
  priority: 1,
1318
- flags: { contact: 1, protect: 1 },
1285
+ flags: { contact: 1, protect: 1, nosleeptalk: 1, failinstruct: 1 },
1319
1286
  volatileStatus: 'bide',
1320
1287
  ignoreImmunity: true,
1321
1288
  beforeMoveCallback(pokemon) {
@@ -1506,7 +1473,9 @@ exports.Moves = {
1506
1473
  name: "Blazing Torque",
1507
1474
  pp: 10,
1508
1475
  priority: 0,
1509
- flags: { protect: 1 },
1476
+ flags: {
1477
+ protect: 1, failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
1478
+ },
1510
1479
  secondary: {
1511
1480
  chance: 30,
1512
1481
  status: 'brn',
@@ -1751,7 +1720,9 @@ exports.Moves = {
1751
1720
  name: "Bounce",
1752
1721
  pp: 5,
1753
1722
  priority: 0,
1754
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1 },
1723
+ flags: {
1724
+ contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1,
1725
+ },
1755
1726
  onTryMove(attacker, defender, move) {
1756
1727
  if (attacker.removeVolatile(move.id)) {
1757
1728
  return;
@@ -1794,7 +1765,7 @@ exports.Moves = {
1794
1765
  name: "Bouncy Bubble",
1795
1766
  pp: 20,
1796
1767
  priority: 0,
1797
- flags: { protect: 1, heal: 1 },
1768
+ flags: { protect: 1, mirror: 1, heal: 1 },
1798
1769
  drain: [1, 2],
1799
1770
  secondary: null,
1800
1771
  target: "normal",
@@ -2127,7 +2098,7 @@ exports.Moves = {
2127
2098
  name: "Buzzy Buzz",
2128
2099
  pp: 20,
2129
2100
  priority: 0,
2130
- flags: { protect: 1 },
2101
+ flags: { protect: 1, mirror: 1 },
2131
2102
  secondary: {
2132
2103
  chance: 100,
2133
2104
  status: 'par',
@@ -2256,7 +2227,7 @@ exports.Moves = {
2256
2227
  name: "Celebrate",
2257
2228
  pp: 40,
2258
2229
  priority: 0,
2259
- flags: {},
2230
+ flags: { nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
2260
2231
  onTryHit(target, source) {
2261
2232
  this.add('-activate', target, 'move: Celebrate');
2262
2233
  },
@@ -2371,7 +2342,10 @@ exports.Moves = {
2371
2342
  name: "Chatter",
2372
2343
  pp: 20,
2373
2344
  priority: 0,
2374
- flags: { protect: 1, mirror: 1, sound: 1, distance: 1, bypasssub: 1 },
2345
+ flags: {
2346
+ protect: 1, mirror: 1, sound: 1, distance: 1, bypasssub: 1, nosleeptalk: 1, noassist: 1,
2347
+ failcopycat: 1, failinstruct: 1, failmimic: 1,
2348
+ },
2375
2349
  noSketch: true,
2376
2350
  secondary: {
2377
2351
  chance: 100,
@@ -2466,7 +2440,7 @@ exports.Moves = {
2466
2440
  name: "Circle Throw",
2467
2441
  pp: 10,
2468
2442
  priority: -6,
2469
- flags: { contact: 1, protect: 1, mirror: 1 },
2443
+ flags: { contact: 1, protect: 1, mirror: 1, noassist: 1, failcopycat: 1 },
2470
2444
  forceSwitch: true,
2471
2445
  target: "normal",
2472
2446
  type: "Fighting",
@@ -2673,7 +2647,9 @@ exports.Moves = {
2673
2647
  name: "Combat Torque",
2674
2648
  pp: 10,
2675
2649
  priority: 0,
2676
- flags: { protect: 1 },
2650
+ flags: {
2651
+ protect: 1, failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
2652
+ },
2677
2653
  secondary: {
2678
2654
  chance: 30,
2679
2655
  status: 'par',
@@ -2713,7 +2689,7 @@ exports.Moves = {
2713
2689
  name: "Comeuppance",
2714
2690
  pp: 10,
2715
2691
  priority: 0,
2716
- flags: { contact: 1, protect: 1, mirror: 1 },
2692
+ flags: { contact: 1, protect: 1, mirror: 1, failmefirst: 1 },
2717
2693
  onTry(source) {
2718
2694
  const lastDamagedBy = source.getLastDamagedBy(true);
2719
2695
  if (lastDamagedBy === undefined || !lastDamagedBy.thisTurn)
@@ -2885,17 +2861,14 @@ exports.Moves = {
2885
2861
  name: "Copycat",
2886
2862
  pp: 20,
2887
2863
  priority: 0,
2888
- flags: {},
2864
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
2889
2865
  onHit(pokemon) {
2890
- const noCopycat = [
2891
- 'assist', 'banefulbunker', 'beakblast', 'behemothbash', 'behemothblade', 'belch', 'bestow', 'celebrate', 'chatter', 'circlethrow', 'copycat', 'counter', 'covet', 'craftyshield', 'destinybond', 'detect', 'dragontail', 'dynamaxcannon', 'endure', 'feint', 'focuspunch', 'followme', 'helpinghand', 'holdhands', 'kingsshield', 'matblock', 'mefirst', 'metronome', 'mimic', 'mirrorcoat', 'mirrormove', 'naturepower', 'obstruct', 'protect', 'ragepowder', 'roar', 'shelltrap', 'sketch', 'sleeptalk', 'snatch', 'spikyshield', 'spotlight', 'struggle', 'switcheroo', 'thief', 'transform', 'trick', 'whirlwind',
2892
- ];
2893
2866
  let move = this.lastMove;
2894
2867
  if (!move)
2895
2868
  return;
2896
2869
  if (move.isMax && move.baseMove)
2897
2870
  move = this.dex.moves.get(move.baseMove);
2898
- if (noCopycat.includes(move.id) || move.isZ || move.isMax) {
2871
+ if (move.flags['failcopycat'] || move.isZ || move.isMax) {
2899
2872
  return false;
2900
2873
  }
2901
2874
  this.actions.useMove(move.id, pokemon);
@@ -3043,7 +3016,7 @@ exports.Moves = {
3043
3016
  name: "Counter",
3044
3017
  pp: 20,
3045
3018
  priority: -5,
3046
- flags: { contact: 1, protect: 1 },
3019
+ flags: { contact: 1, protect: 1, failmefirst: 1, noassist: 1, failcopycat: 1 },
3047
3020
  beforeTurnCallback(pokemon) {
3048
3021
  pokemon.addVolatile('counter');
3049
3022
  },
@@ -3167,7 +3140,7 @@ exports.Moves = {
3167
3140
  name: "Covet",
3168
3141
  pp: 25,
3169
3142
  priority: 0,
3170
- flags: { contact: 1, protect: 1, mirror: 1 },
3143
+ flags: { contact: 1, protect: 1, mirror: 1, failmefirst: 1, noassist: 1, failcopycat: 1 },
3171
3144
  onAfterHit(target, source, move) {
3172
3145
  if (source.item || source.volatiles['gem']) {
3173
3146
  return;
@@ -3574,7 +3547,7 @@ exports.Moves = {
3574
3547
  name: "Destiny Bond",
3575
3548
  pp: 5,
3576
3549
  priority: 0,
3577
- flags: { bypasssub: 1 },
3550
+ flags: { bypasssub: 1, noassist: 1, failcopycat: 1 },
3578
3551
  volatileStatus: 'destinybond',
3579
3552
  onPrepareHit(pokemon) {
3580
3553
  return !pokemon.removeVolatile('destinybond');
@@ -3586,7 +3559,7 @@ exports.Moves = {
3586
3559
  onFaint(target, source, effect) {
3587
3560
  if (!source || !effect || target.isAlly(source))
3588
3561
  return;
3589
- if (effect.effectType === 'Move' && !effect.isFutureMove) {
3562
+ if (effect.effectType === 'Move' && !effect.flags['futuremove']) {
3590
3563
  if (source.volatiles['dynamax']) {
3591
3564
  this.add('-hint', "Dynamaxed Pokémon are immune to Destiny Bond.");
3592
3565
  return;
@@ -3620,7 +3593,7 @@ exports.Moves = {
3620
3593
  name: "Detect",
3621
3594
  pp: 5,
3622
3595
  priority: 4,
3623
- flags: {},
3596
+ flags: { noassist: 1, failcopycat: 1 },
3624
3597
  stallingMove: true,
3625
3598
  volatileStatus: 'protect',
3626
3599
  onPrepareHit(pokemon) {
@@ -3681,7 +3654,7 @@ exports.Moves = {
3681
3654
  name: "Dig",
3682
3655
  pp: 10,
3683
3656
  priority: 0,
3684
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, nonsky: 1 },
3657
+ flags: { contact: 1, charge: 1, protect: 1, mirror: 1, nonsky: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1 },
3685
3658
  onTryMove(attacker, defender, move) {
3686
3659
  if (attacker.removeVolatile(move.id)) {
3687
3660
  return;
@@ -3852,7 +3825,9 @@ exports.Moves = {
3852
3825
  name: "Dive",
3853
3826
  pp: 10,
3854
3827
  priority: 0,
3855
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, nonsky: 1, allyanim: 1 },
3828
+ flags: {
3829
+ contact: 1, charge: 1, protect: 1, mirror: 1, nonsky: 1, allyanim: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1,
3830
+ },
3856
3831
  onTryMove(attacker, defender, move) {
3857
3832
  if (attacker.removeVolatile(move.id)) {
3858
3833
  return;
@@ -3953,8 +3928,7 @@ exports.Moves = {
3953
3928
  name: "Doom Desire",
3954
3929
  pp: 5,
3955
3930
  priority: 0,
3956
- flags: {},
3957
- isFutureMove: true,
3931
+ flags: { futuremove: 1 },
3958
3932
  onTry(source, target) {
3959
3933
  if (!target.side.addSlotCondition(target, 'futuremove'))
3960
3934
  return false;
@@ -3968,9 +3942,8 @@ exports.Moves = {
3968
3942
  basePower: 140,
3969
3943
  category: "Special",
3970
3944
  priority: 0,
3971
- flags: {},
3945
+ flags: { futuremove: 1 },
3972
3946
  effectType: 'Move',
3973
- isFutureMove: true,
3974
3947
  type: 'Steel',
3975
3948
  },
3976
3949
  });
@@ -4208,7 +4181,7 @@ exports.Moves = {
4208
4181
  name: "Dragon Darts",
4209
4182
  pp: 10,
4210
4183
  priority: 0,
4211
- flags: { protect: 1, mirror: 1 },
4184
+ flags: { protect: 1, mirror: 1, noparentalbond: 1 },
4212
4185
  multihit: 2,
4213
4186
  smartTarget: true,
4214
4187
  secondary: null,
@@ -4304,7 +4277,7 @@ exports.Moves = {
4304
4277
  name: "Dragon Tail",
4305
4278
  pp: 10,
4306
4279
  priority: -6,
4307
- flags: { contact: 1, protect: 1, mirror: 1 },
4280
+ flags: { contact: 1, protect: 1, mirror: 1, noassist: 1, failcopycat: 1 },
4308
4281
  forceSwitch: true,
4309
4282
  target: "normal",
4310
4283
  type: "Dragon",
@@ -4445,7 +4418,7 @@ exports.Moves = {
4445
4418
  name: "Dynamax Cannon",
4446
4419
  pp: 5,
4447
4420
  priority: 0,
4448
- flags: { protect: 1 },
4421
+ flags: { protect: 1, failencore: 1, nosleeptalk: 1, noparentalbond: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
4449
4422
  secondary: null,
4450
4423
  target: "normal",
4451
4424
  type: "Dragon",
@@ -4813,22 +4786,19 @@ exports.Moves = {
4813
4786
  name: "Encore",
4814
4787
  pp: 5,
4815
4788
  priority: 0,
4816
- flags: { protect: 1, reflectable: 1, mirror: 1, bypasssub: 1 },
4789
+ flags: { protect: 1, reflectable: 1, mirror: 1, bypasssub: 1, failencore: 1 },
4817
4790
  volatileStatus: 'encore',
4818
4791
  condition: {
4819
4792
  duration: 3,
4820
4793
  noCopy: true,
4821
4794
  onStart(target) {
4822
- const noEncore = [
4823
- 'assist', 'copycat', 'dynamaxcannon', 'encore', 'mefirst', 'metronome', 'mimic', 'mirrormove', 'naturepower', 'sketch', 'sleeptalk', 'struggle', 'transform',
4824
- ];
4825
4795
  let move = target.lastMove;
4826
4796
  if (!move || target.volatiles['dynamax'])
4827
4797
  return false;
4828
4798
  if (move.isMax && move.baseMove)
4829
4799
  move = this.dex.moves.get(move.baseMove);
4830
4800
  const moveIndex = target.moves.indexOf(move.id);
4831
- if (move.isZ || noEncore.includes(move.id) || !target.moveSlots[moveIndex] || target.moveSlots[moveIndex].pp <= 0) {
4801
+ if (move.isZ || move.flags['failencore'] || !target.moveSlots[moveIndex] || target.moveSlots[moveIndex].pp <= 0) {
4832
4802
  // it failed
4833
4803
  return false;
4834
4804
  }
@@ -4881,7 +4851,7 @@ exports.Moves = {
4881
4851
  name: "Endeavor",
4882
4852
  pp: 5,
4883
4853
  priority: 0,
4884
- flags: { contact: 1, protect: 1, mirror: 1 },
4854
+ flags: { contact: 1, protect: 1, mirror: 1, noparentalbond: 1 },
4885
4855
  onTryImmunity(target, pokemon) {
4886
4856
  return pokemon.hp < target.hp;
4887
4857
  },
@@ -4900,7 +4870,7 @@ exports.Moves = {
4900
4870
  name: "Endure",
4901
4871
  pp: 10,
4902
4872
  priority: 4,
4903
- flags: {},
4873
+ flags: { noassist: 1, failcopycat: 1 },
4904
4874
  stallingMove: true,
4905
4875
  volatileStatus: 'endure',
4906
4876
  onPrepareHit(pokemon) {
@@ -5075,7 +5045,7 @@ exports.Moves = {
5075
5045
  name: "Explosion",
5076
5046
  pp: 5,
5077
5047
  priority: 0,
5078
- flags: { protect: 1, mirror: 1 },
5048
+ flags: { protect: 1, mirror: 1, noparentalbond: 1 },
5079
5049
  selfdestruct: "always",
5080
5050
  secondary: null,
5081
5051
  target: "allAdjacent",
@@ -5293,7 +5263,7 @@ exports.Moves = {
5293
5263
  name: "Feint",
5294
5264
  pp: 10,
5295
5265
  priority: 2,
5296
- flags: { mirror: 1 },
5266
+ flags: { mirror: 1, noassist: 1, failcopycat: 1 },
5297
5267
  breaksProtect: true,
5298
5268
  // Breaking protection implemented in scripts.js
5299
5269
  secondary: null,
@@ -5414,7 +5384,7 @@ exports.Moves = {
5414
5384
  name: "Final Gambit",
5415
5385
  pp: 5,
5416
5386
  priority: 0,
5417
- flags: { protect: 1 },
5387
+ flags: { protect: 1, noparentalbond: 1 },
5418
5388
  secondary: null,
5419
5389
  target: "normal",
5420
5390
  type: "Fighting",
@@ -5494,7 +5464,7 @@ exports.Moves = {
5494
5464
  name: "Fire Pledge",
5495
5465
  pp: 10,
5496
5466
  priority: 0,
5497
- flags: { protect: 1, mirror: 1, nonsky: 1 },
5467
+ flags: { protect: 1, mirror: 1, nonsky: 1, pledgecombo: 1 },
5498
5468
  onPrepareHit(target, source, move) {
5499
5469
  for (const action of this.queue.list) {
5500
5470
  if (!action.move || !action.pokemon?.isActive ||
@@ -5855,7 +5825,7 @@ exports.Moves = {
5855
5825
  name: "Fling",
5856
5826
  pp: 10,
5857
5827
  priority: 0,
5858
- flags: { protect: 1, mirror: 1, allyanim: 1 },
5828
+ flags: { protect: 1, mirror: 1, allyanim: 1, noparentalbond: 1 },
5859
5829
  onPrepareHit(target, source, move) {
5860
5830
  if (source.ignoringItem())
5861
5831
  return false;
@@ -5931,7 +5901,7 @@ exports.Moves = {
5931
5901
  name: "Floaty Fall",
5932
5902
  pp: 15,
5933
5903
  priority: 0,
5934
- flags: { contact: 1, protect: 1, gravity: 1 },
5904
+ flags: { contact: 1, protect: 1, mirror: 1, gravity: 1 },
5935
5905
  secondary: {
5936
5906
  chance: 30,
5937
5907
  volatileStatus: 'flinch',
@@ -6027,7 +5997,9 @@ exports.Moves = {
6027
5997
  name: "Fly",
6028
5998
  pp: 15,
6029
5999
  priority: 0,
6030
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1 },
6000
+ flags: {
6001
+ contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1,
6002
+ },
6031
6003
  onTryMove(attacker, defender, move) {
6032
6004
  if (attacker.removeVolatile(move.id)) {
6033
6005
  return;
@@ -6135,7 +6107,7 @@ exports.Moves = {
6135
6107
  name: "Focus Punch",
6136
6108
  pp: 20,
6137
6109
  priority: -3,
6138
- flags: { contact: 1, protect: 1, punch: 1 },
6110
+ flags: { contact: 1, protect: 1, punch: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1 },
6139
6111
  priorityChargeCallback(pokemon) {
6140
6112
  pokemon.addVolatile('focuspunch');
6141
6113
  },
@@ -6173,7 +6145,7 @@ exports.Moves = {
6173
6145
  name: "Follow Me",
6174
6146
  pp: 20,
6175
6147
  priority: 2,
6176
- flags: {},
6148
+ flags: { noassist: 1, failcopycat: 1 },
6177
6149
  volatileStatus: 'followme',
6178
6150
  onTry(source) {
6179
6151
  return this.activePerHalf > 1;
@@ -6325,7 +6297,7 @@ exports.Moves = {
6325
6297
  name: "Freeze Shock",
6326
6298
  pp: 5,
6327
6299
  priority: 0,
6328
- flags: { charge: 1, protect: 1, mirror: 1 },
6300
+ flags: { charge: 1, protect: 1, mirror: 1, nosleeptalk: 1, failinstruct: 1 },
6329
6301
  onTryMove(attacker, defender, move) {
6330
6302
  if (attacker.removeVolatile(move.id)) {
6331
6303
  return;
@@ -6370,7 +6342,7 @@ exports.Moves = {
6370
6342
  name: "Freezy Frost",
6371
6343
  pp: 10,
6372
6344
  priority: 0,
6373
- flags: { protect: 1 },
6345
+ flags: { protect: 1, mirror: 1 },
6374
6346
  onHit() {
6375
6347
  this.add('-clearallboost');
6376
6348
  for (const pokemon of this.getAllActive()) {
@@ -6549,9 +6521,8 @@ exports.Moves = {
6549
6521
  name: "Future Sight",
6550
6522
  pp: 10,
6551
6523
  priority: 0,
6552
- flags: {},
6524
+ flags: { allyanim: 1, futuremove: 1 },
6553
6525
  ignoreImmunity: true,
6554
- isFutureMove: true,
6555
6526
  onTry(source, target) {
6556
6527
  if (!target.side.addSlotCondition(target, 'futuremove'))
6557
6528
  return false;
@@ -6566,10 +6537,9 @@ exports.Moves = {
6566
6537
  basePower: 120,
6567
6538
  category: "Special",
6568
6539
  priority: 0,
6569
- flags: {},
6540
+ flags: { allyanim: 1, futuremove: 1 },
6570
6541
  ignoreImmunity: false,
6571
6542
  effectType: 'Move',
6572
- isFutureMove: true,
6573
6543
  type: 'Psychic',
6574
6544
  },
6575
6545
  });
@@ -6696,7 +6666,7 @@ exports.Moves = {
6696
6666
  name: "Geomancy",
6697
6667
  pp: 10,
6698
6668
  priority: 0,
6699
- flags: { charge: 1, nonsky: 1 },
6669
+ flags: { charge: 1, nonsky: 1, nosleeptalk: 1, failinstruct: 1 },
6700
6670
  onTryMove(attacker, defender, move) {
6701
6671
  if (attacker.removeVolatile(move.id)) {
6702
6672
  return;
@@ -6885,7 +6855,7 @@ exports.Moves = {
6885
6855
  name: "Glitzy Glow",
6886
6856
  pp: 15,
6887
6857
  priority: 0,
6888
- flags: { protect: 1 },
6858
+ flags: { protect: 1, mirror: 1 },
6889
6859
  self: {
6890
6860
  sideCondition: 'lightscreen',
6891
6861
  },
@@ -7837,7 +7807,7 @@ exports.Moves = {
7837
7807
  name: "Grass Pledge",
7838
7808
  pp: 10,
7839
7809
  priority: 0,
7840
- flags: { protect: 1, mirror: 1, nonsky: 1 },
7810
+ flags: { protect: 1, mirror: 1, nonsky: 1, pledgecombo: 1 },
7841
7811
  onPrepareHit(target, source, move) {
7842
7812
  for (const action of this.queue.list) {
7843
7813
  if (!action.move || !action.pokemon?.isActive ||
@@ -7907,7 +7877,7 @@ exports.Moves = {
7907
7877
  name: "Grassy Glide",
7908
7878
  pp: 20,
7909
7879
  priority: 0,
7910
- flags: { contact: 1, protect: 1 },
7880
+ flags: { contact: 1, protect: 1, mirror: 1 },
7911
7881
  onModifyPriority(priority, source, target, move) {
7912
7882
  if (this.field.isTerrain('grassyterrain') && source.isGrounded()) {
7913
7883
  return priority + 1;
@@ -8152,7 +8122,7 @@ exports.Moves = {
8152
8122
  onFaint(target, source, effect) {
8153
8123
  if (!source || source.fainted || !effect)
8154
8124
  return;
8155
- if (effect.effectType === 'Move' && !effect.isFutureMove && source.lastMove) {
8125
+ if (effect.effectType === 'Move' && !effect.flags['futuremove'] && source.lastMove) {
8156
8126
  let move = source.lastMove;
8157
8127
  if (move.isMax && move.baseMove)
8158
8128
  move = this.dex.moves.get(move.baseMove);
@@ -8820,7 +8790,7 @@ exports.Moves = {
8820
8790
  name: "Helping Hand",
8821
8791
  pp: 20,
8822
8792
  priority: 5,
8823
- flags: { bypasssub: 1 },
8793
+ flags: { bypasssub: 1, noassist: 1, failcopycat: 1 },
8824
8794
  volatileStatus: 'helpinghand',
8825
8795
  onTryHit(target) {
8826
8796
  if (!target.newlySwitched && !this.queue.willMove(target))
@@ -9203,7 +9173,7 @@ exports.Moves = {
9203
9173
  name: "Hold Hands",
9204
9174
  pp: 40,
9205
9175
  priority: 0,
9206
- flags: { bypasssub: 1 },
9176
+ flags: { bypasssub: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
9207
9177
  secondary: null,
9208
9178
  target: "adjacentAlly",
9209
9179
  type: "Normal",
@@ -9540,7 +9510,7 @@ exports.Moves = {
9540
9510
  name: "Ice Ball",
9541
9511
  pp: 20,
9542
9512
  priority: 0,
9543
- flags: { bullet: 1, contact: 1, protect: 1, mirror: 1 },
9513
+ flags: { bullet: 1, contact: 1, protect: 1, mirror: 1, noparentalbond: 1, failinstruct: 1 },
9544
9514
  onModifyMove(move, pokemon, target) {
9545
9515
  if (pokemon.volatiles['iceball'] || pokemon.status === 'slp' || !target)
9546
9516
  return;
@@ -9608,7 +9578,7 @@ exports.Moves = {
9608
9578
  name: "Ice Burn",
9609
9579
  pp: 5,
9610
9580
  priority: 0,
9611
- flags: { charge: 1, protect: 1, mirror: 1 },
9581
+ flags: { charge: 1, protect: 1, mirror: 1, nosleeptalk: 1, failinstruct: 1 },
9612
9582
  onTryMove(attacker, defender, move) {
9613
9583
  if (attacker.removeVolatile(move.id)) {
9614
9584
  return;
@@ -9780,7 +9750,7 @@ exports.Moves = {
9780
9750
  name: "Imprison",
9781
9751
  pp: 10,
9782
9752
  priority: 0,
9783
- flags: { snatch: 1, bypasssub: 1 },
9753
+ flags: { snatch: 1, bypasssub: 1, mustpressure: 1 },
9784
9754
  volatileStatus: 'imprison',
9785
9755
  condition: {
9786
9756
  noCopy: true,
@@ -9804,7 +9774,6 @@ exports.Moves = {
9804
9774
  },
9805
9775
  },
9806
9776
  secondary: null,
9807
- pressureTarget: "foeSide",
9808
9777
  target: "self",
9809
9778
  type: "Psychic",
9810
9779
  zMove: { boost: { spd: 2 } },
@@ -9941,16 +9910,13 @@ exports.Moves = {
9941
9910
  name: "Instruct",
9942
9911
  pp: 15,
9943
9912
  priority: 0,
9944
- flags: { protect: 1, bypasssub: 1, allyanim: 1 },
9913
+ flags: { protect: 1, bypasssub: 1, allyanim: 1, failinstruct: 1 },
9945
9914
  onHit(target, source) {
9946
9915
  if (!target.lastMove || target.volatiles['dynamax'])
9947
9916
  return false;
9948
9917
  const lastMove = target.lastMove;
9949
9918
  const moveIndex = target.moves.indexOf(lastMove.id);
9950
- const noInstruct = [
9951
- 'assist', 'beakblast', 'belch', 'bide', 'celebrate', 'copycat', 'dynamaxcannon', 'focuspunch', 'iceball', 'instruct', 'kingsshield', 'mefirst', 'metronome', 'mimic', 'mirrormove', 'naturepower', 'obstruct', 'outrage', 'petaldance', 'rollout', 'shelltrap', 'sketch', 'sleeptalk', 'struggle', 'thrash', 'transform', 'uproar',
9952
- ];
9953
- if (noInstruct.includes(lastMove.id) || lastMove.isZ || lastMove.isMax ||
9919
+ if (lastMove.flags['failinstruct'] || lastMove.isZ || lastMove.isMax ||
9954
9920
  lastMove.flags['charge'] || lastMove.flags['recharge'] ||
9955
9921
  target.volatiles['beakblast'] || target.volatiles['focuspunch'] || target.volatiles['shelltrap'] ||
9956
9922
  (target.moveSlots[moveIndex] && target.moveSlots[moveIndex].pp <= 0)) {
@@ -10189,7 +10155,7 @@ exports.Moves = {
10189
10155
  name: "King's Shield",
10190
10156
  pp: 10,
10191
10157
  priority: 4,
10192
- flags: {},
10158
+ flags: { noassist: 1, failcopycat: 1, failinstruct: 1 },
10193
10159
  stallingMove: true,
10194
10160
  volatileStatus: 'kingsshield',
10195
10161
  onPrepareHit(pokemon) {
@@ -10999,7 +10965,9 @@ exports.Moves = {
10999
10965
  name: "Magical Torque",
11000
10966
  pp: 10,
11001
10967
  priority: 0,
11002
- flags: { protect: 1 },
10968
+ flags: {
10969
+ protect: 1, failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
10970
+ },
11003
10971
  secondary: {
11004
10972
  chance: 30,
11005
10973
  volatileStatus: 'confusion',
@@ -11308,7 +11276,7 @@ exports.Moves = {
11308
11276
  name: "Mat Block",
11309
11277
  pp: 10,
11310
11278
  priority: 0,
11311
- flags: { snatch: 1, nonsky: 1 },
11279
+ flags: { snatch: 1, nonsky: 1, noassist: 1, failcopycat: 1 },
11312
11280
  stallingMove: true,
11313
11281
  sideCondition: 'matblock',
11314
11282
  onTry(source) {
@@ -11865,20 +11833,20 @@ exports.Moves = {
11865
11833
  name: "Me First",
11866
11834
  pp: 20,
11867
11835
  priority: 0,
11868
- flags: { protect: 1, bypasssub: 1 },
11836
+ flags: {
11837
+ protect: 1, bypasssub: 1,
11838
+ failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
11839
+ },
11869
11840
  onTryHit(target, pokemon) {
11870
11841
  const action = this.queue.willMove(target);
11871
11842
  if (!action)
11872
11843
  return false;
11873
- const noMeFirst = [
11874
- 'beakblast', 'chatter', 'counter', 'covet', 'focuspunch', 'mefirst', 'metalburst', 'mirrorcoat', 'shelltrap', 'struggle', 'thief',
11875
- ];
11876
11844
  const move = this.dex.getActiveMove(action.move.id);
11877
11845
  if (action.zmove || move.isZ || move.isMax)
11878
11846
  return false;
11879
11847
  if (target.volatiles['mustrecharge'])
11880
11848
  return false;
11881
- if (move.category === 'Status' || noMeFirst.includes(move.id))
11849
+ if (move.category === 'Status' || move.flags['failmefirst'])
11882
11850
  return false;
11883
11851
  pokemon.addVolatile('mefirst');
11884
11852
  this.actions.useMove(move, pokemon, target);
@@ -12007,7 +11975,7 @@ exports.Moves = {
12007
11975
  name: "Metal Burst",
12008
11976
  pp: 10,
12009
11977
  priority: 0,
12010
- flags: { protect: 1, mirror: 1 },
11978
+ flags: { protect: 1, mirror: 1, failmefirst: 1 },
12011
11979
  onTry(source) {
12012
11980
  const lastDamagedBy = source.getLastDamagedBy(true);
12013
11981
  if (lastDamagedBy === undefined || !lastDamagedBy.thisTurn)
@@ -12072,7 +12040,7 @@ exports.Moves = {
12072
12040
  name: "Meteor Assault",
12073
12041
  pp: 5,
12074
12042
  priority: 0,
12075
- flags: { protect: 1, recharge: 1, mirror: 1 },
12043
+ flags: { protect: 1, recharge: 1, mirror: 1, failinstruct: 1 },
12076
12044
  self: {
12077
12045
  volatileStatus: 'mustrecharge',
12078
12046
  },
@@ -12134,7 +12102,7 @@ exports.Moves = {
12134
12102
  name: "Metronome",
12135
12103
  pp: 10,
12136
12104
  priority: 0,
12137
- flags: {},
12105
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
12138
12106
  noMetronome: [
12139
12107
  "After You", "Apple Acid", "Armor Cannon", "Assist", "Astral Barrage", "Aura Wheel", "Baneful Bunker", "Beak Blast", "Behemoth Bash", "Behemoth Blade", "Belch", "Bestow", "Blazing Torque", "Body Press", "Branch Poke", "Breaking Swipe", "Celebrate", "Chatter", "Chilling Water", "Chilly Reception", "Clangorous Soul", "Collision Course", "Combat Torque", "Comeuppance", "Copycat", "Counter", "Covet", "Crafty Shield", "Decorate", "Destiny Bond", "Detect", "Diamond Storm", "Doodle", "Double Iron Bash", "Double Shock", "Dragon Ascent", "Dragon Energy", "Drum Beating", "Dynamax Cannon", "Electro Drift", "Endure", "Eternabeam", "False Surrender", "Feint", "Fiery Wrath", "Fillet Away", "Fleur Cannon", "Focus Punch", "Follow Me", "Freeze Shock", "Freezing Glare", "Glacial Lance", "Grav Apple", "Helping Hand", "Hold Hands", "Hyper Drill", "Hyperspace Fury", "Hyperspace Hole", "Ice Burn", "Instruct", "Jet Punch", "Jungle Healing", "King's Shield", "Life Dew", "Light of Ruin", "Magical Torque", "Make It Rain", "Mat Block", "Me First", "Meteor Assault", "Metronome", "Mimic", "Mind Blown", "Mirror Coat", "Mirror Move", "Moongeist Beam", "Nature Power", "Nature's Madness", "Noxious Torque", "Obstruct", "Order Up", "Origin Pulse", "Overdrive", "Photon Geyser", "Plasma Fists", "Population Bomb", "Pounce", "Power Shift", "Precipice Blades", "Protect", "Pyro Ball", "Quash", "Quick Guard", "Rage Fist", "Rage Powder", "Raging Bull", "Raging Fury", "Relic Song", "Revival Blessing", "Ruination", "Salt Cure", "Secret Sword", "Shed Tail", "Shell Trap", "Silk Trap", "Sketch", "Sleep Talk", "Snap Trap", "Snarl", "Snatch", "Snore", "Snowscape", "Spectral Thief", "Spicy Extract", "Spiky Shield", "Spirit Break", "Spotlight", "Springtide Storm", "Steam Eruption", "Steel Beam", "Strange Steam", "Struggle", "Sunsteel Strike", "Surging Strikes", "Switcheroo", "Techno Blast", "Thief", "Thousand Arrows", "Thousand Waves", "Thunder Cage", "Thunderous Kick", "Tidy Up", "Trailblaze", "Transform", "Trick", "Twin Beam", "V-create", "Wicked Blow", "Wicked Torque", "Wide Guard",
12140
12108
  ],
@@ -12182,13 +12150,13 @@ exports.Moves = {
12182
12150
  name: "Mimic",
12183
12151
  pp: 10,
12184
12152
  priority: 0,
12185
- flags: { protect: 1, bypasssub: 1, allyanim: 1 },
12153
+ flags: {
12154
+ protect: 1, bypasssub: 1, allyanim: 1,
12155
+ failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
12156
+ },
12186
12157
  onHit(target, source) {
12187
- const disallowedMoves = [
12188
- 'behemothbash', 'behemothblade', 'chatter', 'dynamaxcannon', 'mimic', 'sketch', 'struggle', 'transform',
12189
- ];
12190
12158
  const move = target.lastMove;
12191
- if (source.transformed || !move || disallowedMoves.includes(move.id) || source.moves.includes(move.id)) {
12159
+ if (source.transformed || !move || move.flags['failmimic'] || source.moves.includes(move.id)) {
12192
12160
  return false;
12193
12161
  }
12194
12162
  if (move.isZ || move.isMax)
@@ -12352,7 +12320,7 @@ exports.Moves = {
12352
12320
  name: "Mirror Coat",
12353
12321
  pp: 20,
12354
12322
  priority: -5,
12355
- flags: { protect: 1 },
12323
+ flags: { protect: 1, failmefirst: 1, noassist: 1 },
12356
12324
  beforeTurnCallback(pokemon) {
12357
12325
  pokemon.addVolatile('mirrorcoat');
12358
12326
  },
@@ -12398,7 +12366,7 @@ exports.Moves = {
12398
12366
  name: "Mirror Move",
12399
12367
  pp: 20,
12400
12368
  priority: 0,
12401
- flags: {},
12369
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
12402
12370
  onTryHit(target, pokemon) {
12403
12371
  const move = target.lastMove;
12404
12372
  if (!move?.flags['mirror'] || move.isZ || move.isMax) {
@@ -12988,7 +12956,7 @@ exports.Moves = {
12988
12956
  name: "Nature Power",
12989
12957
  pp: 20,
12990
12958
  priority: 0,
12991
- flags: {},
12959
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
12992
12960
  onTryHit(target, pokemon) {
12993
12961
  let move = 'triattack';
12994
12962
  if (this.field.isTerrain('electricterrain')) {
@@ -13206,7 +13174,9 @@ exports.Moves = {
13206
13174
  name: "Noxious Torque",
13207
13175
  pp: 10,
13208
13176
  priority: 0,
13209
- flags: { protect: 1 },
13177
+ flags: {
13178
+ protect: 1, failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
13179
+ },
13210
13180
  secondary: {
13211
13181
  chance: 30,
13212
13182
  status: 'psn',
@@ -13256,7 +13226,7 @@ exports.Moves = {
13256
13226
  name: "Obstruct",
13257
13227
  pp: 10,
13258
13228
  priority: 4,
13259
- flags: {},
13229
+ flags: { failinstruct: 1 },
13260
13230
  stallingMove: true,
13261
13231
  volatileStatus: 'obstruct',
13262
13232
  onPrepareHit(pokemon) {
@@ -13480,7 +13450,7 @@ exports.Moves = {
13480
13450
  name: "Outrage",
13481
13451
  pp: 10,
13482
13452
  priority: 0,
13483
- flags: { contact: 1, protect: 1, mirror: 1 },
13453
+ flags: { contact: 1, protect: 1, mirror: 1, failinstruct: 1 },
13484
13454
  self: {
13485
13455
  volatileStatus: 'lockedmove',
13486
13456
  },
@@ -13729,7 +13699,7 @@ exports.Moves = {
13729
13699
  name: "Petal Dance",
13730
13700
  pp: 10,
13731
13701
  priority: 0,
13732
- flags: { contact: 1, protect: 1, mirror: 1, dance: 1 },
13702
+ flags: { contact: 1, protect: 1, mirror: 1, dance: 1, failinstruct: 1 },
13733
13703
  self: {
13734
13704
  volatileStatus: 'lockedmove',
13735
13705
  },
@@ -13751,7 +13721,7 @@ exports.Moves = {
13751
13721
  name: "Phantom Force",
13752
13722
  pp: 10,
13753
13723
  priority: 0,
13754
- flags: { contact: 1, charge: 1, mirror: 1 },
13724
+ flags: { contact: 1, charge: 1, mirror: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1 },
13755
13725
  breaksProtect: true,
13756
13726
  onTryMove(attacker, defender, move) {
13757
13727
  if (attacker.removeVolatile(move.id)) {
@@ -13807,7 +13777,7 @@ exports.Moves = {
13807
13777
  name: "Pika Papow",
13808
13778
  pp: 20,
13809
13779
  priority: 0,
13810
- flags: { protect: 1 },
13780
+ flags: { protect: 1, mirror: 1 },
13811
13781
  secondary: null,
13812
13782
  target: "normal",
13813
13783
  type: "Electric",
@@ -14427,7 +14397,7 @@ exports.Moves = {
14427
14397
  name: "Protect",
14428
14398
  pp: 10,
14429
14399
  priority: 4,
14430
- flags: {},
14400
+ flags: { noassist: 1, failcopycat: 1 },
14431
14401
  stallingMove: true,
14432
14402
  volatileStatus: 'protect',
14433
14403
  onPrepareHit(pokemon) {
@@ -15088,7 +15058,7 @@ exports.Moves = {
15088
15058
  name: "Rage Powder",
15089
15059
  pp: 20,
15090
15060
  priority: 2,
15091
- flags: { powder: 1 },
15061
+ flags: { powder: 1, noassist: 1, failcopycat: 1 },
15092
15062
  volatileStatus: 'ragepowder',
15093
15063
  onTry(source) {
15094
15064
  return this.activePerHalf > 1;
@@ -15279,7 +15249,7 @@ exports.Moves = {
15279
15249
  name: "Razor Wind",
15280
15250
  pp: 10,
15281
15251
  priority: 0,
15282
- flags: { charge: 1, protect: 1, mirror: 1 },
15252
+ flags: { charge: 1, protect: 1, mirror: 1, nosleeptalk: 1, failinstruct: 1 },
15283
15253
  onTryMove(attacker, defender, move) {
15284
15254
  if (attacker.removeVolatile(move.id)) {
15285
15255
  return;
@@ -15680,7 +15650,7 @@ exports.Moves = {
15680
15650
  name: "Roar",
15681
15651
  pp: 20,
15682
15652
  priority: -6,
15683
- flags: { reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, allyanim: 1 },
15653
+ flags: { reflectable: 1, mirror: 1, sound: 1, bypasssub: 1, allyanim: 1, noassist: 1, failcopycat: 1 },
15684
15654
  forceSwitch: true,
15685
15655
  secondary: null,
15686
15656
  target: "normal",
@@ -15925,7 +15895,7 @@ exports.Moves = {
15925
15895
  name: "Rollout",
15926
15896
  pp: 20,
15927
15897
  priority: 0,
15928
- flags: { contact: 1, protect: 1, mirror: 1 },
15898
+ flags: { contact: 1, protect: 1, mirror: 1, noparentalbond: 1, failinstruct: 1 },
15929
15899
  onModifyMove(move, pokemon, target) {
15930
15900
  if (pokemon.volatiles['rollout'] || pokemon.status === 'slp' || !target)
15931
15901
  return;
@@ -16290,7 +16260,7 @@ exports.Moves = {
16290
16260
  name: "Sappy Seed",
16291
16261
  pp: 10,
16292
16262
  priority: 0,
16293
- flags: { protect: 1, reflectable: 1 },
16263
+ flags: { protect: 1, reflectable: 1, mirror: 1 },
16294
16264
  onHit(target, source) {
16295
16265
  if (target.hasType('Grass'))
16296
16266
  return null;
@@ -16584,7 +16554,7 @@ exports.Moves = {
16584
16554
  name: "Self-Destruct",
16585
16555
  pp: 5,
16586
16556
  priority: 0,
16587
- flags: { protect: 1, mirror: 1 },
16557
+ flags: { protect: 1, mirror: 1, noparentalbond: 1 },
16588
16558
  selfdestruct: "always",
16589
16559
  secondary: null,
16590
16560
  target: "allAdjacent",
@@ -16653,7 +16623,7 @@ exports.Moves = {
16653
16623
  name: "Shadow Force",
16654
16624
  pp: 5,
16655
16625
  priority: 0,
16656
- flags: { contact: 1, charge: 1, mirror: 1 },
16626
+ flags: { contact: 1, charge: 1, mirror: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1 },
16657
16627
  breaksProtect: true,
16658
16628
  onTryMove(attacker, defender, move) {
16659
16629
  if (attacker.removeVolatile(move.id)) {
@@ -16888,7 +16858,7 @@ exports.Moves = {
16888
16858
  name: "Shell Trap",
16889
16859
  pp: 5,
16890
16860
  priority: -3,
16891
- flags: { protect: 1 },
16861
+ flags: { protect: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1 },
16892
16862
  priorityChargeCallback(pokemon) {
16893
16863
  pokemon.addVolatile('shelltrap');
16894
16864
  },
@@ -17166,7 +17136,7 @@ exports.Moves = {
17166
17136
  name: "Sizzly Slide",
17167
17137
  pp: 20,
17168
17138
  priority: 0,
17169
- flags: { contact: 1, protect: 1, defrost: 1 },
17139
+ flags: { contact: 1, protect: 1, mirror: 1, defrost: 1 },
17170
17140
  secondary: {
17171
17141
  chance: 100,
17172
17142
  status: 'brn',
@@ -17185,7 +17155,9 @@ exports.Moves = {
17185
17155
  pp: 1,
17186
17156
  noPPBoosts: true,
17187
17157
  priority: 0,
17188
- flags: { bypasssub: 1, allyanim: 1 },
17158
+ flags: {
17159
+ bypasssub: 1, allyanim: 1, failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
17160
+ },
17189
17161
  onHit(target, source) {
17190
17162
  const disallowedMoves = ['chatter', 'sketch', 'struggle'];
17191
17163
  const move = target.lastMove;
@@ -17295,7 +17267,7 @@ exports.Moves = {
17295
17267
  name: "Skull Bash",
17296
17268
  pp: 10,
17297
17269
  priority: 0,
17298
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1 },
17270
+ flags: { contact: 1, charge: 1, protect: 1, mirror: 1, nosleeptalk: 1, failinstruct: 1 },
17299
17271
  onTryMove(attacker, defender, move) {
17300
17272
  if (attacker.removeVolatile(move.id)) {
17301
17273
  return;
@@ -17321,7 +17293,7 @@ exports.Moves = {
17321
17293
  name: "Sky Attack",
17322
17294
  pp: 5,
17323
17295
  priority: 0,
17324
- flags: { charge: 1, protect: 1, mirror: 1, distance: 1 },
17296
+ flags: { charge: 1, protect: 1, mirror: 1, distance: 1, nosleeptalk: 1, failinstruct: 1 },
17325
17297
  critRatio: 2,
17326
17298
  onTryMove(attacker, defender, move) {
17327
17299
  if (attacker.removeVolatile(move.id)) {
@@ -17351,7 +17323,9 @@ exports.Moves = {
17351
17323
  name: "Sky Drop",
17352
17324
  pp: 10,
17353
17325
  priority: 0,
17354
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1 },
17326
+ flags: {
17327
+ contact: 1, charge: 1, protect: 1, mirror: 1, gravity: 1, distance: 1, nosleeptalk: 1, noassist: 1, failinstruct: 1,
17328
+ },
17355
17329
  onModifyMove(move, source) {
17356
17330
  if (!source.volatiles['skydrop']) {
17357
17331
  move.accuracy = true;
@@ -17543,22 +17517,19 @@ exports.Moves = {
17543
17517
  name: "Sleep Talk",
17544
17518
  pp: 10,
17545
17519
  priority: 0,
17546
- flags: {},
17520
+ flags: { failencore: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
17547
17521
  sleepUsable: true,
17548
17522
  onTry(source) {
17549
17523
  return source.status === 'slp' || source.hasAbility('comatose');
17550
17524
  },
17551
17525
  onHit(pokemon) {
17552
- const noSleepTalk = [
17553
- 'assist', 'beakblast', 'belch', 'bide', 'celebrate', 'chatter', 'copycat', 'dynamaxcannon', 'focuspunch', 'mefirst', 'metronome', 'mimic', 'mirrormove', 'naturepower', 'shelltrap', 'sketch', 'sleeptalk', 'uproar',
17554
- ];
17555
17526
  const moves = [];
17556
17527
  for (const moveSlot of pokemon.moveSlots) {
17557
17528
  const moveid = moveSlot.id;
17558
17529
  if (!moveid)
17559
17530
  continue;
17560
17531
  const move = this.dex.moves.get(moveid);
17561
- if (noSleepTalk.includes(moveid) || move.flags['charge'] || (move.isZ && move.basePower !== 1) || move.isMax) {
17532
+ if (move.flags['nosleeptalk'] || move.flags['charge'] || (move.isZ && move.basePower !== 1) || move.isMax) {
17562
17533
  continue;
17563
17534
  }
17564
17535
  moves.push(moveid);
@@ -17796,7 +17767,7 @@ exports.Moves = {
17796
17767
  name: "Snatch",
17797
17768
  pp: 10,
17798
17769
  priority: 4,
17799
- flags: { bypasssub: 1 },
17770
+ flags: { bypasssub: 1, mustpressure: 1, noassist: 1, failcopycat: 1 },
17800
17771
  volatileStatus: 'snatch',
17801
17772
  condition: {
17802
17773
  duration: 1,
@@ -17818,7 +17789,6 @@ exports.Moves = {
17818
17789
  },
17819
17790
  },
17820
17791
  secondary: null,
17821
- pressureTarget: "foeSide",
17822
17792
  target: "self",
17823
17793
  type: "Dark",
17824
17794
  zMove: { boost: { spe: 2 } },
@@ -17922,7 +17892,7 @@ exports.Moves = {
17922
17892
  name: "Solar Beam",
17923
17893
  pp: 10,
17924
17894
  priority: 0,
17925
- flags: { charge: 1, protect: 1, mirror: 1 },
17895
+ flags: { charge: 1, protect: 1, mirror: 1, nosleeptalk: 1, failinstruct: 1 },
17926
17896
  onTryMove(attacker, defender, move) {
17927
17897
  if (attacker.removeVolatile(move.id)) {
17928
17898
  return;
@@ -17959,7 +17929,7 @@ exports.Moves = {
17959
17929
  name: "Solar Blade",
17960
17930
  pp: 10,
17961
17931
  priority: 0,
17962
- flags: { contact: 1, charge: 1, protect: 1, mirror: 1, slicing: 1 },
17932
+ flags: { contact: 1, charge: 1, protect: 1, mirror: 1, slicing: 1, nosleeptalk: 1, failinstruct: 1 },
17963
17933
  onTryMove(attacker, defender, move) {
17964
17934
  if (attacker.removeVolatile(move.id)) {
17965
17935
  return;
@@ -18087,7 +18057,7 @@ exports.Moves = {
18087
18057
  name: "Sparkly Swirl",
18088
18058
  pp: 5,
18089
18059
  priority: 0,
18090
- flags: { protect: 1 },
18060
+ flags: { protect: 1, mirror: 1 },
18091
18061
  self: {
18092
18062
  onHit(pokemon, source, move) {
18093
18063
  this.add('-activate', source, 'move: Aromatherapy');
@@ -18203,7 +18173,7 @@ exports.Moves = {
18203
18173
  name: "Spikes",
18204
18174
  pp: 20,
18205
18175
  priority: 0,
18206
- flags: { reflectable: 1, nonsky: 1 },
18176
+ flags: { reflectable: 1, nonsky: 1, mustpressure: 1 },
18207
18177
  sideCondition: 'spikes',
18208
18178
  condition: {
18209
18179
  // this is a side condition
@@ -18238,7 +18208,7 @@ exports.Moves = {
18238
18208
  name: "Spiky Shield",
18239
18209
  pp: 10,
18240
18210
  priority: 4,
18241
- flags: {},
18211
+ flags: { noassist: 1, failcopycat: 1 },
18242
18212
  stallingMove: true,
18243
18213
  volatileStatus: 'spikyshield',
18244
18214
  onPrepareHit(pokemon) {
@@ -18454,7 +18424,7 @@ exports.Moves = {
18454
18424
  name: "Splishy Splash",
18455
18425
  pp: 15,
18456
18426
  priority: 0,
18457
- flags: { protect: 1 },
18427
+ flags: { protect: 1, mirror: 1 },
18458
18428
  secondary: {
18459
18429
  chance: 30,
18460
18430
  status: 'par',
@@ -18488,7 +18458,7 @@ exports.Moves = {
18488
18458
  name: "Spotlight",
18489
18459
  pp: 15,
18490
18460
  priority: 3,
18491
- flags: { protect: 1, reflectable: 1, allyanim: 1 },
18461
+ flags: { protect: 1, reflectable: 1, allyanim: 1, noassist: 1, failcopycat: 1 },
18492
18462
  volatileStatus: 'spotlight',
18493
18463
  onTryHit(target) {
18494
18464
  if (this.activePerHalf === 1)
@@ -18540,7 +18510,7 @@ exports.Moves = {
18540
18510
  name: "Stealth Rock",
18541
18511
  pp: 20,
18542
18512
  priority: 0,
18543
- flags: { reflectable: 1 },
18513
+ flags: { reflectable: 1, mustpressure: 1 },
18544
18514
  sideCondition: 'stealthrock',
18545
18515
  condition: {
18546
18516
  // this is a side condition
@@ -18684,7 +18654,6 @@ exports.Moves = {
18684
18654
  },
18685
18655
  },
18686
18656
  secondary: null,
18687
- pressureTarget: "self",
18688
18657
  target: "foeSide",
18689
18658
  type: "Bug",
18690
18659
  zMove: { boost: { spe: 1 } },
@@ -18962,7 +18931,10 @@ exports.Moves = {
18962
18931
  pp: 1,
18963
18932
  noPPBoosts: true,
18964
18933
  priority: 0,
18965
- flags: { contact: 1, protect: 1 },
18934
+ flags: {
18935
+ contact: 1, protect: 1,
18936
+ failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
18937
+ },
18966
18938
  noSketch: true,
18967
18939
  onModifyMove(move, pokemon, target) {
18968
18940
  move.type = '???';
@@ -19405,7 +19377,7 @@ exports.Moves = {
19405
19377
  name: "Switcheroo",
19406
19378
  pp: 10,
19407
19379
  priority: 0,
19408
- flags: { protect: 1, mirror: 1, allyanim: 1 },
19380
+ flags: { protect: 1, mirror: 1, allyanim: 1, noassist: 1, failcopycat: 1 },
19409
19381
  onTryImmunity(target) {
19410
19382
  return !target.hasAbility('stickyhold');
19411
19383
  },
@@ -19929,7 +19901,7 @@ exports.Moves = {
19929
19901
  name: "Tera Blast",
19930
19902
  pp: 10,
19931
19903
  priority: 0,
19932
- flags: { protect: 1, mirror: 1 },
19904
+ flags: { protect: 1, mirror: 1, mustpressure: 1 },
19933
19905
  onModifyType(move, pokemon, target) {
19934
19906
  if (pokemon.terastallized) {
19935
19907
  move.type = pokemon.teraType;
@@ -19991,7 +19963,7 @@ exports.Moves = {
19991
19963
  name: "Thief",
19992
19964
  pp: 25,
19993
19965
  priority: 0,
19994
- flags: { contact: 1, protect: 1, mirror: 1 },
19966
+ flags: { contact: 1, protect: 1, mirror: 1, failmefirst: 1, noassist: 1, failcopycat: 1 },
19995
19967
  onAfterHit(target, source, move) {
19996
19968
  if (source.item || source.volatiles['gem']) {
19997
19969
  return;
@@ -20069,7 +20041,7 @@ exports.Moves = {
20069
20041
  name: "Thrash",
20070
20042
  pp: 10,
20071
20043
  priority: 0,
20072
- flags: { contact: 1, protect: 1, mirror: 1 },
20044
+ flags: { contact: 1, protect: 1, mirror: 1, failinstruct: 1 },
20073
20045
  self: {
20074
20046
  volatileStatus: 'lockedmove',
20075
20047
  },
@@ -20445,7 +20417,7 @@ exports.Moves = {
20445
20417
  name: "Toxic Spikes",
20446
20418
  pp: 20,
20447
20419
  priority: 0,
20448
- flags: { reflectable: 1, nonsky: 1 },
20420
+ flags: { reflectable: 1, nonsky: 1, mustpressure: 1 },
20449
20421
  sideCondition: 'toxicspikes',
20450
20422
  condition: {
20451
20423
  // this is a side condition
@@ -20532,7 +20504,7 @@ exports.Moves = {
20532
20504
  name: "Transform",
20533
20505
  pp: 10,
20534
20506
  priority: 0,
20535
- flags: { allyanim: 1 },
20507
+ flags: { allyanim: 1, failencore: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1 },
20536
20508
  onHit(target, pokemon) {
20537
20509
  if (!pokemon.transformInto(target)) {
20538
20510
  return false;
@@ -20580,7 +20552,7 @@ exports.Moves = {
20580
20552
  name: "Trick",
20581
20553
  pp: 10,
20582
20554
  priority: 0,
20583
- flags: { protect: 1, mirror: 1, allyanim: 1 },
20555
+ flags: { protect: 1, mirror: 1, allyanim: 1, noassist: 1, failcopycat: 1 },
20584
20556
  onTryImmunity(target) {
20585
20557
  return !target.hasAbility('stickyhold');
20586
20558
  },
@@ -20935,7 +20907,7 @@ exports.Moves = {
20935
20907
  name: "Uproar",
20936
20908
  pp: 10,
20937
20909
  priority: 0,
20938
- flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1 },
20910
+ flags: { protect: 1, mirror: 1, sound: 1, bypasssub: 1, nosleeptalk: 1, failinstruct: 1 },
20939
20911
  self: {
20940
20912
  volatileStatus: 'uproar',
20941
20913
  },
@@ -21039,7 +21011,7 @@ exports.Moves = {
21039
21011
  name: "Veevee Volley",
21040
21012
  pp: 20,
21041
21013
  priority: 0,
21042
- flags: { contact: 1, protect: 1 },
21014
+ flags: { contact: 1, protect: 1, mirror: 1 },
21043
21015
  secondary: null,
21044
21016
  target: "normal",
21045
21017
  type: "Normal",
@@ -21253,7 +21225,7 @@ exports.Moves = {
21253
21225
  name: "Water Pledge",
21254
21226
  pp: 10,
21255
21227
  priority: 0,
21256
- flags: { protect: 1, mirror: 1, nonsky: 1 },
21228
+ flags: { protect: 1, mirror: 1, nonsky: 1, pledgecombo: 1 },
21257
21229
  onPrepareHit(target, source, move) {
21258
21230
  for (const action of this.queue) {
21259
21231
  if (action.choice !== 'move')
@@ -21497,7 +21469,7 @@ exports.Moves = {
21497
21469
  name: "Whirlwind",
21498
21470
  pp: 20,
21499
21471
  priority: -6,
21500
- flags: { reflectable: 1, mirror: 1, bypasssub: 1, allyanim: 1, wind: 1 },
21472
+ flags: { reflectable: 1, mirror: 1, bypasssub: 1, allyanim: 1, wind: 1, noassist: 1, failcopycat: 1 },
21501
21473
  forceSwitch: true,
21502
21474
  secondary: null,
21503
21475
  target: "normal",
@@ -21528,7 +21500,9 @@ exports.Moves = {
21528
21500
  name: "Wicked Torque",
21529
21501
  pp: 10,
21530
21502
  priority: 0,
21531
- flags: { protect: 1 },
21503
+ flags: {
21504
+ protect: 1, failencore: 1, failmefirst: 1, nosleeptalk: 1, noassist: 1, failcopycat: 1, failinstruct: 1, failmimic: 1,
21505
+ },
21532
21506
  secondary: {
21533
21507
  chance: 10,
21534
21508
  status: 'slp',
@@ -21968,7 +21942,7 @@ exports.Moves = {
21968
21942
  name: "Zippy Zap",
21969
21943
  pp: 10,
21970
21944
  priority: 2,
21971
- flags: { contact: 1, protect: 1 },
21945
+ flags: { contact: 1, protect: 1, mirror: 1 },
21972
21946
  secondary: {
21973
21947
  chance: 100,
21974
21948
  self: {