@pkmn/sim 0.5.13 → 0.5.16

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 (98) hide show
  1. package/build/config/formats.js +151 -145
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/aliases.js +2 -2
  4. package/build/data/aliases.js.map +1 -1
  5. package/build/data/conditions.js +4 -1
  6. package/build/data/conditions.js.map +1 -1
  7. package/build/data/formats-data.js +3 -3
  8. package/build/data/formats-data.js.map +1 -1
  9. package/build/data/items.js +4 -2
  10. package/build/data/items.js.map +1 -1
  11. package/build/data/learnsets.js +5 -4
  12. package/build/data/learnsets.js.map +1 -1
  13. package/build/data/mods/gen1/formats-data.js +32 -32
  14. package/build/data/mods/gen1/formats-data.js.map +1 -1
  15. package/build/data/mods/gen1/scripts.js +1 -1
  16. package/build/data/mods/gen1/scripts.js.map +1 -1
  17. package/build/data/mods/gen2/items.js +28 -0
  18. package/build/data/mods/gen2/items.js.map +1 -1
  19. package/build/data/mods/gen2/moves.js +2 -5
  20. package/build/data/mods/gen2/moves.js.map +1 -1
  21. package/build/data/mods/gen3/items.js +28 -0
  22. package/build/data/mods/gen3/items.js.map +1 -1
  23. package/build/data/mods/gen3/moves.js +0 -3
  24. package/build/data/mods/gen3/moves.js.map +1 -1
  25. package/build/data/mods/gen4/abilities.js +20 -0
  26. package/build/data/mods/gen4/abilities.js.map +1 -1
  27. package/build/data/mods/gen4/items.js +28 -0
  28. package/build/data/mods/gen4/items.js.map +1 -1
  29. package/build/data/mods/gen4/moves.js +16 -9
  30. package/build/data/mods/gen4/moves.js.map +1 -1
  31. package/build/data/mods/gen5/items.js +0 -4
  32. package/build/data/mods/gen5/items.js.map +1 -1
  33. package/build/data/mods/gen6/items.js +24 -0
  34. package/build/data/mods/gen6/items.js.map +1 -1
  35. package/build/data/mods/gen7/abilities.js +31 -0
  36. package/build/data/mods/gen7/abilities.js.map +1 -1
  37. package/build/data/mods/gen7/items.js +12 -0
  38. package/build/data/mods/gen7/items.js.map +1 -1
  39. package/build/data/mods/gen7/moves.js +14 -0
  40. package/build/data/mods/gen7/moves.js.map +1 -1
  41. package/build/data/moves.js +45 -20
  42. package/build/data/moves.js.map +1 -1
  43. package/build/data/rulesets.js +71 -0
  44. package/build/data/rulesets.js.map +1 -1
  45. package/build/data/tags.js +3 -3
  46. package/build/data/tags.js.map +1 -1
  47. package/build/data/text/moves.js +8 -8
  48. package/build/data/text/moves.js.map +1 -1
  49. package/build/sim/battle-actions.js +3 -3
  50. package/build/sim/battle-actions.js.map +1 -1
  51. package/build/sim/battle-queue.d.ts +2 -2
  52. package/build/sim/battle-queue.js +8 -0
  53. package/build/sim/battle-queue.js.map +1 -1
  54. package/build/sim/battle.js +46 -6
  55. package/build/sim/battle.js.map +1 -1
  56. package/build/sim/dex-conditions.d.ts +2 -2
  57. package/build/sim/dex-conditions.js.map +1 -1
  58. package/build/sim/dex-data.js +0 -1
  59. package/build/sim/dex-data.js.map +1 -1
  60. package/build/sim/dex-moves.d.ts +2 -1
  61. package/build/sim/dex-moves.js.map +1 -1
  62. package/build/sim/pokemon.js +18 -5
  63. package/build/sim/pokemon.js.map +1 -1
  64. package/build/sim/team-validator.js +1 -1
  65. package/build/sim/team-validator.js.map +1 -1
  66. package/config/formats.ts +156 -150
  67. package/data/aliases.ts +2 -2
  68. package/data/conditions.ts +4 -1
  69. package/data/formats-data.ts +3 -3
  70. package/data/items.ts +4 -2
  71. package/data/learnsets.ts +5 -4
  72. package/data/mods/gen1/formats-data.ts +32 -32
  73. package/data/mods/gen1/scripts.ts +1 -1
  74. package/data/mods/gen2/items.ts +28 -0
  75. package/data/mods/gen2/moves.ts +2 -5
  76. package/data/mods/gen3/items.ts +28 -0
  77. package/data/mods/gen3/moves.ts +0 -3
  78. package/data/mods/gen4/abilities.ts +20 -0
  79. package/data/mods/gen4/items.ts +28 -0
  80. package/data/mods/gen4/moves.ts +15 -10
  81. package/data/mods/gen5/items.ts +0 -4
  82. package/data/mods/gen6/items.ts +24 -0
  83. package/data/mods/gen7/abilities.ts +31 -0
  84. package/data/mods/gen7/items.ts +12 -0
  85. package/data/mods/gen7/moves.ts +14 -0
  86. package/data/moves.ts +45 -19
  87. package/data/rulesets.ts +70 -0
  88. package/data/tags.ts +3 -3
  89. package/data/text/moves.ts +8 -8
  90. package/package.json +2 -2
  91. package/sim/battle-actions.ts +3 -4
  92. package/sim/battle-queue.ts +10 -2
  93. package/sim/battle.ts +43 -6
  94. package/sim/dex-conditions.ts +6 -2
  95. package/sim/dex-data.ts +0 -1
  96. package/sim/dex-moves.ts +2 -1
  97. package/sim/pokemon.ts +19 -7
  98. package/sim/team-validator.ts +1 -1
@@ -61,7 +61,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
61
61
  butterfree: {
62
62
  randomBattleMoves: ["psychic", "sleeppowder", "stunspore"],
63
63
  exclusiveMoves: ["megadrain", "psywave"],
64
- tier: "NU",
64
+ tier: "PU",
65
65
  },
66
66
  weedle: {
67
67
  randomBattleMoves: ["poisonsting", "stringshot"],
@@ -75,7 +75,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
75
75
  randomBattleMoves: ["megadrain", "swordsdance", "twineedle"],
76
76
  exclusiveMoves: ["doubleedge", "doubleedge", "hyperbeam"],
77
77
  comboMoves: ["agility", "hyperbeam", "swordsdance", "twineedle"],
78
- tier: "NU",
78
+ tier: "PU",
79
79
  },
80
80
  pidgey: {
81
81
  randomBattleMoves: ["agility", "doubleedge", "skyattack"],
@@ -90,7 +90,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
90
90
  pidgeot: {
91
91
  randomBattleMoves: ["agility", "doubleedge", "hyperbeam"],
92
92
  exclusiveMoves: ["mimic", "mirrormove", "reflect", "sandattack", "skyattack", "skyattack", "substitute", "quickattack", "toxic"],
93
- tier: "NU",
93
+ tier: "PU",
94
94
  },
95
95
  rattata: {
96
96
  randomBattleMoves: ["blizzard", "bodyslam"],
@@ -111,7 +111,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
111
111
  },
112
112
  fearow: {
113
113
  randomBattleMoves: ["agility", "doubleedge", "drillpeck", "hyperbeam"],
114
- tier: "NU",
114
+ tier: "PU",
115
115
  },
116
116
  ekans: {
117
117
  randomBattleMoves: ["bodyslam", "earthquake", "glare", "rockslide"],
@@ -120,7 +120,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
120
120
  arbok: {
121
121
  randomBattleMoves: ["earthquake", "glare", "hyperbeam"],
122
122
  exclusiveMoves: ["bodyslam", "rockslide"],
123
- tier: "NU",
123
+ tier: "PU",
124
124
  },
125
125
  pikachu: {
126
126
  randomBattleMoves: ["surf", "thunderwave"],
@@ -142,7 +142,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
142
142
  sandslash: {
143
143
  randomBattleMoves: ["bodyslam", "rockslide", "swordsdance"],
144
144
  essentialMove: "earthquake",
145
- tier: "NU",
145
+ tier: "PU",
146
146
  },
147
147
  nidoranf: {
148
148
  randomBattleMoves: ["blizzard", "bodyslam", "thunderbolt"],
@@ -157,7 +157,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
157
157
  nidoqueen: {
158
158
  randomBattleMoves: ["blizzard", "bodyslam", "thunderbolt"],
159
159
  essentialMove: "earthquake",
160
- tier: "NU",
160
+ tier: "PU",
161
161
  },
162
162
  nidoranm: {
163
163
  randomBattleMoves: ["blizzard", "bodyslam", "thunderbolt"],
@@ -213,7 +213,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
213
213
  },
214
214
  golbat: {
215
215
  randomBattleMoves: ["confuseray", "doubleedge", "hyperbeam", "megadrain"],
216
- tier: "NU",
216
+ tier: "PU",
217
217
  },
218
218
  oddish: {
219
219
  randomBattleMoves: ["doubleedge", "sleeppowder"],
@@ -230,7 +230,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
230
230
  vileplume: {
231
231
  randomBattleMoves: ["bodyslam", "sleeppowder", "stunspore", "swordsdance"],
232
232
  essentialMove: "megadrain",
233
- tier: "NU",
233
+ tier: "PU",
234
234
  },
235
235
  paras: {
236
236
  randomBattleMoves: ["bodyslam", "megadrain"],
@@ -242,7 +242,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
242
242
  randomBattleMoves: ["bodyslam", "megadrain"],
243
243
  essentialMove: "spore",
244
244
  exclusiveMoves: ["growth", "hyperbeam", "slash", "stunspore", "stunspore", "swordsdance"],
245
- tier: "NU",
245
+ tier: "PU",
246
246
  },
247
247
  venonat: {
248
248
  randomBattleMoves: ["psychic", "sleeppowder", "stunspore"],
@@ -296,7 +296,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
296
296
  primeape: {
297
297
  randomBattleMoves: ["bodyslam", "rockslide", "submission"],
298
298
  exclusiveMoves: ["counter", "hyperbeam", "hyperbeam"],
299
- tier: "NU",
299
+ tier: "PU",
300
300
  },
301
301
  growlithe: {
302
302
  randomBattleMoves: ["bodyslam", "fireblast", "flamethrower", "reflect"],
@@ -305,7 +305,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
305
305
  arcanine: {
306
306
  randomBattleMoves: ["bodyslam", "fireblast", "hyperbeam"],
307
307
  exclusiveMoves: ["flamethrower", "reflect"],
308
- tier: "NU",
308
+ tier: "PU",
309
309
  },
310
310
  poliwag: {
311
311
  randomBattleMoves: ["blizzard", "surf"],
@@ -317,7 +317,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
317
317
  randomBattleMoves: ["blizzard", "surf"],
318
318
  essentialMove: "amnesia",
319
319
  exclusiveMoves: ["counter", "hypnosis", "hypnosis", "psychic"],
320
- tier: "NFE",
320
+ tier: "NU",
321
321
  },
322
322
  poliwrath: {
323
323
  randomBattleMoves: ["blizzard", "bodyslam", "earthquake", "submission"],
@@ -354,7 +354,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
354
354
  machamp: {
355
355
  randomBattleMoves: ["bodyslam", "earthquake", "submission"],
356
356
  exclusiveMoves: ["counter", "hyperbeam", "rockslide", "rockslide"],
357
- tier: "NU",
357
+ tier: "PU",
358
358
  },
359
359
  bellsprout: {
360
360
  randomBattleMoves: ["doubleedge", "sleeppowder", "stunspore", "swordsdance"],
@@ -402,7 +402,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
402
402
  },
403
403
  rapidash: {
404
404
  randomBattleMoves: ["agility", "bodyslam", "fireblast", "hyperbeam"],
405
- tier: "NU",
405
+ tier: "PU",
406
406
  },
407
407
  slowpoke: {
408
408
  randomBattleMoves: ["earthquake", "surf"],
@@ -424,12 +424,12 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
424
424
  magneton: {
425
425
  randomBattleMoves: ["thunder", "thunderbolt", "thunderwave"],
426
426
  exclusiveMoves: ["doubleedge", "hyperbeam", "hyperbeam", "mimic", "substitute", "toxic"],
427
- tier: "NU",
427
+ tier: "PU",
428
428
  },
429
429
  farfetchd: {
430
430
  randomBattleMoves: ["agility", "bodyslam", "swordsdance"],
431
431
  essentialMove: "slash",
432
- tier: "NU",
432
+ tier: "PU",
433
433
  },
434
434
  doduo: {
435
435
  randomBattleMoves: ["agility", "bodyslam", "doubleedge", "drillpeck"],
@@ -459,7 +459,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
459
459
  randomBattleMoves: ["bodyslam", "sludge"],
460
460
  essentialMove: "explosion",
461
461
  exclusiveMoves: ["fireblast", "hyperbeam", "megadrain", "megadrain"],
462
- tier: "NU",
462
+ tier: "PU",
463
463
  },
464
464
  shellder: {
465
465
  randomBattleMoves: ["blizzard", "doubleedge", "explosion", "surf"],
@@ -490,7 +490,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
490
490
  },
491
491
  onix: {
492
492
  randomBattleMoves: ["bodyslam", "earthquake", "explosion", "rockslide"],
493
- tier: "NU",
493
+ tier: "PU",
494
494
  },
495
495
  drowzee: {
496
496
  randomBattleMoves: ["hypnosis", "psychic", "thunderwave"],
@@ -518,13 +518,13 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
518
518
  electrode: {
519
519
  randomBattleMoves: ["explosion", "thunderbolt", "thunderwave"],
520
520
  exclusiveMoves: ["hyperbeam", "screech", "thunder", "toxic"],
521
- tier: "NU",
521
+ tier: "PU",
522
522
  },
523
523
  exeggcute: {
524
524
  randomBattleMoves: ["sleeppowder", "stunspore"],
525
525
  essentialMove: "psychic",
526
526
  exclusiveMoves: ["doubleedge", "explosion", "explosion"],
527
- tier: "LC",
527
+ tier: "NU",
528
528
  },
529
529
  exeggutor: {
530
530
  randomBattleMoves: ["explosion", "psychic", "sleeppowder"],
@@ -537,23 +537,23 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
537
537
  },
538
538
  marowak: {
539
539
  randomBattleMoves: ["blizzard", "bodyslam", "earthquake", "seismictoss"],
540
- tier: "NU",
540
+ tier: "PU",
541
541
  },
542
542
  hitmonlee: {
543
543
  randomBattleMoves: ["bodyslam", "highjumpkick", "seismictoss"],
544
544
  exclusiveMoves: ["counter", "counter", "meditate"],
545
- tier: "NU",
545
+ tier: "PU",
546
546
  },
547
547
  hitmonchan: {
548
548
  randomBattleMoves: ["bodyslam", "seismictoss", "submission"],
549
549
  exclusiveMoves: ["agility", "counter", "counter"],
550
- tier: "NU",
550
+ tier: "PU",
551
551
  },
552
552
  lickitung: {
553
553
  randomBattleMoves: ["hyperbeam", "swordsdance"],
554
554
  essentialMove: "bodyslam",
555
555
  exclusiveMoves: ["blizzard", "earthquake", "earthquake", "earthquake"],
556
- tier: "NU",
556
+ tier: "PU",
557
557
  },
558
558
  koffing: {
559
559
  randomBattleMoves: ["explosion", "fireblast", "sludge", "thunderbolt"],
@@ -561,7 +561,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
561
561
  },
562
562
  weezing: {
563
563
  randomBattleMoves: ["explosion", "fireblast", "sludge", "thunderbolt"],
564
- tier: "NU",
564
+ tier: "PU",
565
565
  },
566
566
  rhyhorn: {
567
567
  randomBattleMoves: ["bodyslam", "earthquake", "rockslide", "substitute"],
@@ -608,7 +608,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
608
608
  seaking: {
609
609
  randomBattleMoves: ["blizzard", "doubleedge", "surf"],
610
610
  exclusiveMoves: ["agility", "agility", "hyperbeam"],
611
- tier: "NU",
611
+ tier: "PU",
612
612
  },
613
613
  staryu: {
614
614
  randomBattleMoves: ["blizzard", "thunderbolt", "thunderwave"],
@@ -628,7 +628,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
628
628
  },
629
629
  scyther: {
630
630
  randomBattleMoves: ["agility", "hyperbeam", "slash", "swordsdance"],
631
- tier: "NU",
631
+ tier: "PU",
632
632
  },
633
633
  jynx: {
634
634
  randomBattleMoves: ["blizzard", "lovelykiss", "psychic"],
@@ -642,12 +642,12 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
642
642
  magmar: {
643
643
  randomBattleMoves: ["bodyslam", "confuseray", "fireblast"],
644
644
  exclusiveMoves: ["hyperbeam", "psychic"],
645
- tier: "NU",
645
+ tier: "PU",
646
646
  },
647
647
  pinsir: {
648
648
  randomBattleMoves: ["bodyslam", "hyperbeam", "swordsdance"],
649
649
  exclusiveMoves: ["seismictoss", "submission", "submission"],
650
- tier: "NU",
650
+ tier: "PU",
651
651
  },
652
652
  tauros: {
653
653
  randomBattleMoves: ["bodyslam", "earthquake", "hyperbeam"],
@@ -671,7 +671,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
671
671
  },
672
672
  ditto: {
673
673
  randomBattleMoves: ["transform"],
674
- tier: "NU",
674
+ tier: "PU",
675
675
  },
676
676
  eevee: {
677
677
  randomBattleMoves: ["doubleedge", "quickattack", "reflect"],
@@ -692,7 +692,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
692
692
  },
693
693
  flareon: {
694
694
  randomBattleMoves: ["bodyslam", "fireblast", "hyperbeam", "quickattack"],
695
- tier: "NU",
695
+ tier: "PU",
696
696
  },
697
697
  porygon: {
698
698
  randomBattleMoves: ["blizzard", "thunderwave"],
@@ -662,7 +662,7 @@ export const Scripts: ModdedBattleScriptsData = {
662
662
  if (!isCrit) {
663
663
  // In gen 1, the critical chance is based on speed.
664
664
  // First, we get the base speed, divide it by 2 and floor it. This is our current crit chance.
665
- let critChance = Math.floor(source.species.baseStats['spe'] / 2);
665
+ let critChance = Math.floor(this.dex.species.get(source.set.species).baseStats['spe'] / 2);
666
666
 
667
667
  // Now we check for focus energy volatile.
668
668
  if (source.volatiles['focusenergy']) {
@@ -50,6 +50,10 @@ export const Items: {[k: string]: ModdedItemData} = {
50
50
  }
51
51
  },
52
52
  },
53
+ fastball: {
54
+ inherit: true,
55
+ isNonstandard: null,
56
+ },
53
57
  focusband: {
54
58
  inherit: true,
55
59
  onDamage(damage, target, source, effect) {
@@ -68,6 +72,10 @@ export const Items: {[k: string]: ModdedItemData} = {
68
72
  }
69
73
  },
70
74
  },
75
+ heavyball: {
76
+ inherit: true,
77
+ isNonstandard: null,
78
+ },
71
79
  kingsrock: {
72
80
  inherit: true,
73
81
  onModifyMove(move) {
@@ -91,11 +99,19 @@ export const Items: {[k: string]: ModdedItemData} = {
91
99
  onResidualOrder: 5,
92
100
  onResidualSubOrder: 1,
93
101
  },
102
+ levelball: {
103
+ inherit: true,
104
+ isNonstandard: null,
105
+ },
94
106
  lightball: {
95
107
  inherit: true,
96
108
  // In Gen 2 this happens in stat calculation directly.
97
109
  onModifySpA() {},
98
110
  },
111
+ loveball: {
112
+ inherit: true,
113
+ isNonstandard: null,
114
+ },
99
115
  luckypunch: {
100
116
  inherit: true,
101
117
  onModifyCritRatioPriority: -1,
@@ -105,6 +121,10 @@ export const Items: {[k: string]: ModdedItemData} = {
105
121
  }
106
122
  },
107
123
  },
124
+ lureball: {
125
+ inherit: true,
126
+ isNonstandard: null,
127
+ },
108
128
  magnet: {
109
129
  inherit: true,
110
130
  onModifySpA() {},
@@ -138,6 +158,10 @@ export const Items: {[k: string]: ModdedItemData} = {
138
158
  }
139
159
  },
140
160
  },
161
+ moonball: {
162
+ inherit: true,
163
+ isNonstandard: null,
164
+ },
141
165
  mysticwater: {
142
166
  inherit: true,
143
167
  onModifySpA() {},
@@ -201,6 +225,10 @@ export const Items: {[k: string]: ModdedItemData} = {
201
225
  }
202
226
  },
203
227
  },
228
+ sportball: {
229
+ inherit: true,
230
+ isNonstandard: null,
231
+ },
204
232
  stick: {
205
233
  inherit: true,
206
234
  onModifyCritRatioPriority: -1,
@@ -129,7 +129,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
129
129
  return false;
130
130
  },
131
131
  beforeTurnCallback() {},
132
- onTryHit() {},
132
+ onTry() {},
133
133
  condition: {},
134
134
  priority: -1,
135
135
  },
@@ -204,9 +204,6 @@ export const Moves: {[k: string]: ModdedMoveData} = {
204
204
  }
205
205
  this.effectState.move = lockedMove;
206
206
  this.add('-start', target, 'Encore');
207
- if (!this.queue.willMove(target)) {
208
- this.effectState.duration++;
209
- }
210
207
  },
211
208
  onOverrideAction(pokemon) {
212
209
  return this.effectState.move;
@@ -446,7 +443,7 @@ export const Moves: {[k: string]: ModdedMoveData} = {
446
443
  return false;
447
444
  },
448
445
  beforeTurnCallback() {},
449
- onTryHit() {},
446
+ onTry() {},
450
447
  condition: {},
451
448
  priority: -1,
452
449
  },
@@ -83,6 +83,10 @@ export const Items: {[k: string]: ModdedItemData} = {
83
83
  gen: 3,
84
84
  isNonstandard: "Unobtainable",
85
85
  },
86
+ fastball: {
87
+ inherit: true,
88
+ isNonstandard: "Unobtainable",
89
+ },
86
90
  figyberry: {
87
91
  inherit: true,
88
92
  onUpdate() {},
@@ -115,6 +119,10 @@ export const Items: {[k: string]: ModdedItemData} = {
115
119
  }
116
120
  },
117
121
  },
122
+ heavyball: {
123
+ inherit: true,
124
+ isNonstandard: "Unobtainable",
125
+ },
118
126
  iapapaberry: {
119
127
  inherit: true,
120
128
  onUpdate() {},
@@ -160,6 +168,10 @@ export const Items: {[k: string]: ModdedItemData} = {
160
168
  return accuracy * 0.95;
161
169
  },
162
170
  },
171
+ levelball: {
172
+ inherit: true,
173
+ isNonstandard: "Unobtainable",
174
+ },
163
175
  liechiberry: {
164
176
  inherit: true,
165
177
  onUpdate() {},
@@ -180,6 +192,14 @@ export const Items: {[k: string]: ModdedItemData} = {
180
192
  },
181
193
  onBasePower() {},
182
194
  },
195
+ loveball: {
196
+ inherit: true,
197
+ isNonstandard: "Unobtainable",
198
+ },
199
+ lureball: {
200
+ inherit: true,
201
+ isNonstandard: "Unobtainable",
202
+ },
183
203
  magnet: {
184
204
  inherit: true,
185
205
  onBasePower() {},
@@ -221,6 +241,10 @@ export const Items: {[k: string]: ModdedItemData} = {
221
241
  }
222
242
  },
223
243
  },
244
+ moonball: {
245
+ inherit: true,
246
+ isNonstandard: "Unobtainable",
247
+ },
224
248
  mysticwater: {
225
249
  inherit: true,
226
250
  onBasePower() {},
@@ -363,6 +387,10 @@ export const Items: {[k: string]: ModdedItemData} = {
363
387
  }
364
388
  },
365
389
  },
390
+ sportball: {
391
+ inherit: true,
392
+ isNonstandard: "Unobtainable",
393
+ },
366
394
  starfberry: {
367
395
  inherit: true,
368
396
  onUpdate() {},
@@ -304,9 +304,6 @@ export const Moves: {[k: string]: ModdedMoveData} = {
304
304
  }
305
305
  this.effectState.move = target.lastMove.id;
306
306
  this.add('-start', target, 'Encore');
307
- if (!this.queue.willMove(target)) {
308
- this.effectState.duration++;
309
- }
310
307
  },
311
308
  onOverrideAction(pokemon) {
312
309
  return this.effectState.move;
@@ -160,6 +160,16 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
160
160
  this.add('-activate', pokemon, 'ability: Forewarn', warnMove);
161
161
  },
162
162
  },
163
+ frisk: {
164
+ inherit: true,
165
+ onStart(pokemon) {
166
+ for (const target of pokemon.foes()) {
167
+ if (target.item && !target.itemState.knockedOff) {
168
+ this.add('-item', target, target.getItem().name, '[from] ability: Frisk', '[of] ' + pokemon, '[identify]');
169
+ }
170
+ }
171
+ },
172
+ },
163
173
  hustle: {
164
174
  inherit: true,
165
175
  onSourceModifyAccuracyPriority: 7,
@@ -504,6 +514,16 @@ export const Abilities: {[k: string]: ModdedAbilityData} = {
504
514
  }
505
515
  },
506
516
  },
517
+ unburden: {
518
+ inherit: true,
519
+ condition: {
520
+ onModifySpe(spe, pokemon) {
521
+ if ((!pokemon.item || pokemon.itemState.knockedOff) && !pokemon.ignoringAbility()) {
522
+ return this.chainModify(2);
523
+ }
524
+ },
525
+ },
526
+ },
507
527
  vitalspirit: {
508
528
  inherit: true,
509
529
  rating: 2.5,
@@ -113,6 +113,10 @@ export const Items: {[k: string]: ModdedItemData} = {
113
113
  }
114
114
  },
115
115
  },
116
+ fastball: {
117
+ inherit: true,
118
+ isNonstandard: null,
119
+ },
116
120
  flameorb: {
117
121
  inherit: true,
118
122
  onResidualOrder: 10,
@@ -148,6 +152,10 @@ export const Items: {[k: string]: ModdedItemData} = {
148
152
  }
149
153
  },
150
154
  },
155
+ heavyball: {
156
+ inherit: true,
157
+ isNonstandard: null,
158
+ },
151
159
  ironball: {
152
160
  inherit: true,
153
161
  onEffectiveness() {},
@@ -181,6 +189,10 @@ export const Items: {[k: string]: ModdedItemData} = {
181
189
  onResidualOrder: 10,
182
190
  onResidualSubOrder: 4,
183
191
  },
192
+ levelball: {
193
+ inherit: true,
194
+ isNonstandard: null,
195
+ },
184
196
  lifeorb: {
185
197
  inherit: true,
186
198
  onModifyDamage() {},
@@ -214,6 +226,10 @@ export const Items: {[k: string]: ModdedItemData} = {
214
226
  }
215
227
  },
216
228
  },
229
+ loveball: {
230
+ inherit: true,
231
+ isNonstandard: null,
232
+ },
217
233
  luckypunch: {
218
234
  inherit: true,
219
235
  onModifyCritRatio(critRatio, user) {
@@ -222,6 +238,10 @@ export const Items: {[k: string]: ModdedItemData} = {
222
238
  }
223
239
  },
224
240
  },
241
+ lureball: {
242
+ inherit: true,
243
+ isNonstandard: null,
244
+ },
225
245
  lustrousorb: {
226
246
  inherit: true,
227
247
  onBasePower(basePower, user, target, move) {
@@ -286,6 +306,10 @@ export const Items: {[k: string]: ModdedItemData} = {
286
306
  },
287
307
  },
288
308
  },
309
+ moonball: {
310
+ inherit: true,
311
+ isNonstandard: null,
312
+ },
289
313
  razorfang: {
290
314
  inherit: true,
291
315
  onModifyMove(move) {
@@ -301,6 +325,10 @@ export const Items: {[k: string]: ModdedItemData} = {
301
325
  }
302
326
  },
303
327
  },
328
+ sportball: {
329
+ inherit: true,
330
+ isNonstandard: null,
331
+ },
304
332
  stick: {
305
333
  inherit: true,
306
334
  onModifyCritRatio(critRatio, user) {
@@ -448,9 +448,6 @@ export const Moves: {[k: string]: ModdedMoveData} = {
448
448
  }
449
449
  this.effectState.move = target.lastMove.id;
450
450
  this.add('-start', target, 'Encore');
451
- if (!this.queue.willMove(target)) {
452
- this.effectState.duration++;
453
- }
454
451
  },
455
452
  onOverrideAction(pokemon) {
456
453
  return this.effectState.move;
@@ -541,12 +538,16 @@ export const Moves: {[k: string]: ModdedMoveData} = {
541
538
  },
542
539
  focuspunch: {
543
540
  inherit: true,
544
- beforeMoveCallback() { },
541
+ priorityChargeCallback() {},
542
+ beforeTurnCallback(pokemon) {
543
+ pokemon.addVolatile('focuspunch');
544
+ },
545
+ beforeMoveCallback() {},
545
546
  onTry(pokemon) {
546
- if (pokemon.volatiles['focuspunch'] && pokemon.volatiles['focuspunch'].lostFocus) {
547
+ if (pokemon.volatiles['focuspunch']?.lostFocus) {
547
548
  this.attrLastMove('[still]');
548
549
  this.add('cant', pokemon, 'Focus Punch', 'Focus Punch');
549
- return false;
550
+ return null;
550
551
  }
551
552
  },
552
553
  },
@@ -829,10 +830,14 @@ export const Moves: {[k: string]: ModdedMoveData} = {
829
830
  },
830
831
  knockoff: {
831
832
  inherit: true,
832
- onAfterHit(target, source) {
833
- const item = target.takeItem();
834
- if (item) {
835
- this.add('-enditem', target, item.name, '[from] move: Knock Off', '[of] ' + source);
833
+ onAfterHit(target, source, move) {
834
+ if (!target.item || target.itemState.knockedOff) return;
835
+ if (target.ability === 'multitype') return;
836
+ const item = target.getItem();
837
+ if (this.runEvent('TakeItem', target, source, move, item)) {
838
+ target.itemState.knockedOff = true;
839
+ this.add('-enditem', target, item.name, '[from] move: Knock Off');
840
+ this.hint("In Gens 3-4, Knock Off only makes the target's item unusable; it cannot obtain a new item.", true);
836
841
  }
837
842
  },
838
843
  },
@@ -299,10 +299,6 @@ export const Items: {[k: string]: ModdedItemData} = {
299
299
  type: "Dragon",
300
300
  },
301
301
  },
302
- normalgem: {
303
- inherit: true,
304
- isNonstandard: null,
305
- },
306
302
  occaberry: {
307
303
  inherit: true,
308
304
  naturalGift: {
@@ -25,6 +25,10 @@ export const Items: {[k: string]: ModdedItemData} = {
25
25
  inherit: true,
26
26
  isNonstandard: null,
27
27
  },
28
+ fastball: {
29
+ inherit: true,
30
+ isNonstandard: "Unobtainable",
31
+ },
28
32
  figyberry: {
29
33
  inherit: true,
30
34
  onUpdate(pokemon) {
@@ -39,6 +43,10 @@ export const Items: {[k: string]: ModdedItemData} = {
39
43
  }
40
44
  },
41
45
  },
46
+ heavyball: {
47
+ inherit: true,
48
+ isNonstandard: "Unobtainable",
49
+ },
42
50
  iapapaberry: {
43
51
  inherit: true,
44
52
  onUpdate(pokemon) {
@@ -63,6 +71,10 @@ export const Items: {[k: string]: ModdedItemData} = {
63
71
  }
64
72
  },
65
73
  },
74
+ levelball: {
75
+ inherit: true,
76
+ isNonstandard: "Unobtainable",
77
+ },
66
78
  lifeorb: {
67
79
  inherit: true,
68
80
  onAfterMoveSecondarySelf(source, target, move) {
@@ -71,6 +83,14 @@ export const Items: {[k: string]: ModdedItemData} = {
71
83
  }
72
84
  },
73
85
  },
86
+ loveball: {
87
+ inherit: true,
88
+ isNonstandard: "Unobtainable",
89
+ },
90
+ lureball: {
91
+ inherit: true,
92
+ isNonstandard: "Unobtainable",
93
+ },
74
94
  machobrace: {
75
95
  inherit: true,
76
96
  isNonstandard: null,
@@ -93,6 +113,10 @@ export const Items: {[k: string]: ModdedItemData} = {
93
113
  inherit: true,
94
114
  isNonstandard: null,
95
115
  },
116
+ moonball: {
117
+ inherit: true,
118
+ isNonstandard: "Unobtainable",
119
+ },
96
120
  nanabberry: {
97
121
  inherit: true,
98
122
  isNonstandard: null,