@pkmn/sim 0.4.24 → 0.5.2

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 (61) hide show
  1. package/build/config/formats.js +238 -170
  2. package/build/config/formats.js.map +1 -1
  3. package/build/data/abilities.js +5 -1
  4. package/build/data/abilities.js.map +1 -1
  5. package/build/data/aliases.js +2 -2
  6. package/build/data/aliases.js.map +1 -1
  7. package/build/data/conditions.js +1 -0
  8. package/build/data/conditions.js.map +1 -1
  9. package/build/data/formats-data.js +16 -8
  10. package/build/data/formats-data.js.map +1 -1
  11. package/build/data/items.js +26 -2
  12. package/build/data/items.js.map +1 -1
  13. package/build/data/learnsets.js +34 -0
  14. package/build/data/learnsets.js.map +1 -1
  15. package/build/data/mods/gen2/formats-data.js +2 -2
  16. package/build/data/mods/gen2/formats-data.js.map +1 -1
  17. package/build/data/mods/gen3/formats-data.js +1 -1
  18. package/build/data/mods/gen3/formats-data.js.map +1 -1
  19. package/build/data/mods/gen6/pokedex.js +17 -17
  20. package/build/data/mods/gen6/pokedex.js.map +1 -1
  21. package/build/data/moves.js +4 -1
  22. package/build/data/moves.js.map +1 -1
  23. package/build/data/pokedex.js +33 -0
  24. package/build/data/pokedex.js.map +1 -1
  25. package/build/data/rulesets.js +39 -5
  26. package/build/data/rulesets.js.map +1 -1
  27. package/build/data/text/items.js +4 -0
  28. package/build/data/text/items.js.map +1 -1
  29. package/build/data/text/moves.js +1 -1
  30. package/build/data/text/moves.js.map +1 -1
  31. package/build/sim/battle-actions.js +1 -1
  32. package/build/sim/battle-actions.js.map +1 -1
  33. package/build/sim/dex-formats.js +1 -1
  34. package/build/sim/dex-formats.js.map +1 -1
  35. package/build/sim/dex-species.js +4 -3
  36. package/build/sim/dex-species.js.map +1 -1
  37. package/build/sim/pokemon.js +1 -1
  38. package/build/sim/pokemon.js.map +1 -1
  39. package/build/sim/team-validator.js +3 -0
  40. package/build/sim/team-validator.js.map +1 -1
  41. package/config/formats.ts +242 -171
  42. package/data/abilities.ts +3 -1
  43. package/data/aliases.ts +2 -2
  44. package/data/conditions.ts +1 -0
  45. package/data/formats-data.ts +16 -8
  46. package/data/items.ts +26 -2
  47. package/data/learnsets.ts +34 -0
  48. package/data/mods/gen2/formats-data.ts +2 -2
  49. package/data/mods/gen3/formats-data.ts +1 -1
  50. package/data/mods/gen6/pokedex.ts +17 -17
  51. package/data/moves.ts +4 -1
  52. package/data/pokedex.ts +33 -0
  53. package/data/rulesets.ts +35 -6
  54. package/data/text/items.ts +4 -0
  55. package/data/text/moves.ts +1 -1
  56. package/package.json +1 -1
  57. package/sim/battle-actions.ts +1 -1
  58. package/sim/dex-formats.ts +1 -1
  59. package/sim/dex-species.ts +4 -3
  60. package/sim/pokemon.ts +1 -1
  61. package/sim/team-validator.ts +3 -0
package/data/abilities.ts CHANGED
@@ -2349,6 +2349,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = {
2349
2349
  neutralizinggas: {
2350
2350
  // Ability suppression implemented in sim/pokemon.ts:Pokemon#ignoringAbility
2351
2351
  onPreStart(pokemon) {
2352
+ if (pokemon.transformed) return;
2352
2353
  this.add('-ability', pokemon, 'Neutralizing Gas');
2353
2354
  pokemon.abilityState.ending = false;
2354
2355
  for (const target of this.getAllActive()) {
@@ -2362,6 +2363,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = {
2362
2363
  }
2363
2364
  },
2364
2365
  onEnd(source) {
2366
+ if (source.transformed) return;
2365
2367
  for (const pokemon of this.getAllActive()) {
2366
2368
  if (pokemon !== source && pokemon.hasAbility('Neutralizing Gas')) {
2367
2369
  return;
@@ -2523,7 +2525,7 @@ export const Abilities: {[abilityid: string]: AbilityData} = {
2523
2525
  parentalbond: {
2524
2526
  onPrepareHit(source, target, move) {
2525
2527
  if (move.category === 'Status' || move.selfdestruct || move.multihit) return;
2526
- if (['endeavor', 'fling', 'iceball', 'rollout'].includes(move.id)) return;
2528
+ if (['dynamaxcannon', 'endeavor', 'fling', 'iceball', 'rollout'].includes(move.id)) return;
2527
2529
  if (!move.flags['charge'] && !move.spreadHit && !move.isZ && !move.isMax) {
2528
2530
  move.multihit = 2;
2529
2531
  move.multihitType = 'parentalbond';
package/data/aliases.ts CHANGED
@@ -67,8 +67,8 @@ export const Aliases: {[alias: string]: string} = {
67
67
  gen6mono: "[Gen 6] Monotype",
68
68
  gen6ag: "[Gen 6] Anything Goes",
69
69
  crossevo: "[Gen 8] Cross Evolution",
70
- omotm: "[Gen 8] Sketchmons",
71
- lcotm: "[Gen 8] AAA Doubles",
70
+ omotm: "[Gen 8] Revelationmons",
71
+ lcotm: "[Gen 8 BDSP] Balanced Hackmons",
72
72
 
73
73
  // mega evos
74
74
  fabio: "Ampharos-Mega",
@@ -396,6 +396,7 @@ export const Conditions: {[k: string]: ConditionData} = {
396
396
  if (data.source.isActive && data.source.hasItem('lifeorb') && this.gen >= 5) {
397
397
  this.singleEvent('AfterMoveSecondarySelf', data.source.getItem(), data.source.itemState, data.source, target, data.source.getItem());
398
398
  }
399
+ this.activeMove = null;
399
400
 
400
401
  this.checkWin();
401
402
  },
@@ -710,7 +710,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
710
710
  randomBattleMoves: ["bravebird", "closecombat", "firstimpression", "knockoff", "swordsdance"],
711
711
  randomBattleLevel: 82,
712
712
  randomDoubleBattleMoves: ["bravebird", "closecombat", "firstimpression", "knockoff", "poisonjab", "protect", "swordsdance"],
713
- randomDoubleBattleLevel: 84,
713
+ randomDoubleBattleLevel: 85,
714
714
  randomBattleNoDynamaxMoves: ["bravebird", "closecombat", "firstimpression", "knockoff", "poisonjab", "swordsdance"],
715
715
  tier: "NU",
716
716
  doublesTier: "(DUU)",
@@ -1965,7 +1965,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
1965
1965
  tier: "Illegal",
1966
1966
  },
1967
1967
  zigzagoon: {
1968
- tier: "LC",
1968
+ tier: "NFE",
1969
1969
  },
1970
1970
  zigzagoongalar: {
1971
1971
  tier: "LC",
@@ -3443,7 +3443,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
3443
3443
  },
3444
3444
  audino: {
3445
3445
  randomBattleMoves: ["healbell", "knockoff", "protect", "toxic", "wish"],
3446
- randomBattleLevel: 88,
3446
+ randomBattleLevel: 90,
3447
3447
  randomDoubleBattleMoves: ["bodyslam", "healpulse", "helpinghand", "knockoff", "protect", "thunderwave"],
3448
3448
  randomDoubleBattleLevel: 89,
3449
3449
  tier: "PU",
@@ -3832,7 +3832,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
3832
3832
  randomBattleMoves: ["bugbuzz", "gigadrain", "stickyweb", "thunder", "voltswitch"],
3833
3833
  randomBattleLevel: 82,
3834
3834
  randomDoubleBattleMoves: ["bugbuzz", "electroweb", "energyball", "protect", "stickyweb", "thunder"],
3835
- randomDoubleBattleLevel: 86,
3835
+ randomDoubleBattleLevel: 85,
3836
3836
  tier: "PU",
3837
3837
  doublesTier: "(DUU)",
3838
3838
  },
@@ -3968,7 +3968,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
3968
3968
  randomBattleLevel: 82,
3969
3969
  randomDoubleBattleMoves: ["closecombat", "fakeout", "knockoff", "poisonjab", "protect", "uturn"],
3970
3970
  randomDoubleBattleLevel: 84,
3971
- tier: "RUBL",
3971
+ tier: "UUBL",
3972
3972
  doublesTier: "(DUU)",
3973
3973
  },
3974
3974
  druddigon: {
@@ -4167,7 +4167,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
4167
4167
  randomBattleLevel: 80,
4168
4168
  randomDoubleBattleMoves: ["dracometeor", "earthpower", "freezedry", "glaciate", "protect", "roost"],
4169
4169
  randomDoubleBattleLevel: 78,
4170
- tier: "OU",
4170
+ tier: "Uber",
4171
4171
  doublesTier: "DUU",
4172
4172
  },
4173
4173
  kyuremblack: {
@@ -4194,7 +4194,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
4194
4194
  },
4195
4195
  keldeoresolute: {
4196
4196
  randomBattleMoves: ["airslash", "calmmind", "hydropump", "icywind", "scald", "secretsword", "substitute"],
4197
- randomBattleLevel: 80,
4197
+ randomBattleLevel: 79,
4198
4198
  },
4199
4199
  meloetta: {
4200
4200
  isNonstandard: "Past",
@@ -5936,7 +5936,7 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
5936
5936
  },
5937
5937
  dracozolt: {
5938
5938
  randomBattleMoves: ["aerialace", "boltbeak", "earthquake", "lowkick", "outrage"],
5939
- randomBattleLevel: 79,
5939
+ randomBattleLevel: 78,
5940
5940
  randomDoubleBattleMoves: ["aerialace", "boltbeak", "dragonclaw", "highhorsepower", "rockslide"],
5941
5941
  randomDoubleBattleLevel: 82,
5942
5942
  randomBattleNoDynamaxMoves: ["boltbeak", "dragonclaw", "earthquake", "outrage"],
@@ -6410,6 +6410,14 @@ export const FormatsData: {[k: string]: SpeciesFormatsData} = {
6410
6410
  isNonstandard: "CAP",
6411
6411
  tier: "CAP",
6412
6412
  },
6413
+ venomicon: {
6414
+ isNonstandard: "CAP",
6415
+ tier: "CAP",
6416
+ },
6417
+ venomiconepilogue: {
6418
+ isNonstandard: "CAP",
6419
+ tier: "CAP",
6420
+ },
6413
6421
  pokestarsmeargle: {
6414
6422
  isNonstandard: "Custom",
6415
6423
  tier: "Illegal",
package/data/items.ts CHANGED
@@ -1274,7 +1274,7 @@ export const Items: {[itemid: string]: ItemData} = {
1274
1274
  fling: {
1275
1275
  basePower: 30,
1276
1276
  },
1277
- num: 250,
1277
+ num: 235,
1278
1278
  gen: 2,
1279
1279
  },
1280
1280
  dragoniumz: {
@@ -3179,7 +3179,7 @@ export const Items: {[itemid: string]: ItemData} = {
3179
3179
  if (!this.activeMove) return false;
3180
3180
  if (this.activeMove.id !== 'knockoff' && this.activeMove.id !== 'thief' && this.activeMove.id !== 'covet') return false;
3181
3181
  },
3182
- num: 0,
3182
+ num: 137,
3183
3183
  gen: 2,
3184
3184
  isNonstandard: "Past",
3185
3185
  },
@@ -7107,4 +7107,28 @@ export const Items: {[itemid: string]: ItemData} = {
7107
7107
  gen: 6,
7108
7108
  isNonstandard: "CAP",
7109
7109
  },
7110
+ vilevial: {
7111
+ name: "Vile Vial",
7112
+ spritenum: 752,
7113
+ fling: {
7114
+ basePower: 60,
7115
+ },
7116
+ onBasePowerPriority: 15,
7117
+ onBasePower(basePower, user, target, move) {
7118
+ if (user.baseSpecies.num === -66 && ['Poison', 'Flying'].includes(move.type)) {
7119
+ return this.chainModify([4915, 4096]);
7120
+ }
7121
+ },
7122
+ onTakeItem(item, pokemon, source) {
7123
+ if (source?.baseSpecies.num === -66 || pokemon.baseSpecies.num === -66) {
7124
+ return false;
7125
+ }
7126
+ return true;
7127
+ },
7128
+ forcedForme: "Venomicon-Epilogue",
7129
+ itemUser: ["Venomicon-Epilogue"],
7130
+ num: -2,
7131
+ gen: 8,
7132
+ isNonstandard: "CAP",
7133
+ },
7110
7134
  };
package/data/learnsets.ts CHANGED
@@ -82815,6 +82815,40 @@ export const Learnsets: {[speciesid: string]: LearnsetData} = {
82815
82815
  watergun: ["8L1"],
82816
82816
  },
82817
82817
  },
82818
+ venomicon: {
82819
+ learnset: {
82820
+ acidarmor: ["8L1"],
82821
+ attract: ["8M"],
82822
+ bodypress: ["8M"],
82823
+ bravebird: ["8M"],
82824
+ coil: ["8L1"],
82825
+ discharge: ["8L1"],
82826
+ drillpeck: ["8L1"],
82827
+ earthpower: ["8M"],
82828
+ endure: ["8M"],
82829
+ facade: ["8M"],
82830
+ gunkshot: ["8M"],
82831
+ hurricane: ["8M"],
82832
+ imprison: ["8M"],
82833
+ knockoff: ["8L1"],
82834
+ mysticalfire: ["8M"],
82835
+ nastyplot: ["8M"],
82836
+ poisonjab: ["8M"],
82837
+ protect: ["8M"],
82838
+ rest: ["8M"],
82839
+ roost: ["8L1"],
82840
+ round: ["8M"],
82841
+ sleeptalk: ["8M"],
82842
+ sludgebomb: ["8M"],
82843
+ snore: ["8M"],
82844
+ stealthrock: ["8M"],
82845
+ substitute: ["8M"],
82846
+ swordsdance: ["8M"],
82847
+ thunderwave: ["8M"],
82848
+ toxic: ["8L1"],
82849
+ uturn: ["8M"],
82850
+ },
82851
+ },
82818
82852
  pokestarsmeargle: {
82819
82853
  eventData: [
82820
82854
  {generation: 5, level: 60, gender: "M", abilities: ["owntempo"], moves: ["mindreader", "guillotine", "tailwhip", "gastroacid"]},
@@ -691,7 +691,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
691
691
  tier: "LC",
692
692
  },
693
693
  azumarill: {
694
- randomBattleMoves: ["charm", "rest", "sleeptalk", "surf", "toxic"],
694
+ randomBattleMoves: ["perishsong", "rest", "surf", "whirlpool"],
695
695
  tier: "NU",
696
696
  },
697
697
  sudowoodo: {
@@ -817,7 +817,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
817
817
  tier: "LC",
818
818
  },
819
819
  octillery: {
820
- randomBattleMoves: ["fireblast", "hiddenpowerelectric", "icebeam", "rest", "sleeptalk", "surf"],
820
+ randomBattleMoves: ["flamethrower", "hiddenpowerelectric", "icebeam", "rest", "sleeptalk", "surf"],
821
821
  tier: "NU",
822
822
  },
823
823
  delibird: {
@@ -1364,7 +1364,7 @@ export const FormatsData: {[k: string]: ModdedSpeciesFormatsData} = {
1364
1364
  tier: "Uber",
1365
1365
  },
1366
1366
  kyogre: {
1367
- randomBattleMoves: ["calmmind", "icebeam", "rest", "sleeptalk", "surf", "thunder", "waterspout"],
1367
+ randomBattleMoves: ["calmmind", "icebeam", "rest", "sleeptalk", "surf", "thunder"],
1368
1368
  tier: "Uber",
1369
1369
  },
1370
1370
  groudon: {
@@ -171,87 +171,87 @@ export const Pokedex: {[k: string]: ModdedSpeciesData} = {
171
171
  arceusbug: {
172
172
  inherit: true,
173
173
  color: "Gray",
174
- requiredItem: "Insect Plate",
174
+ requiredItems: ["Insect Plate"],
175
175
  },
176
176
  arceusdark: {
177
177
  inherit: true,
178
178
  color: "Gray",
179
- requiredItem: "Dread Plate",
179
+ requiredItems: ["Dread Plate"],
180
180
  },
181
181
  arceusdragon: {
182
182
  inherit: true,
183
183
  color: "Gray",
184
- requiredItem: "Draco Plate",
184
+ requiredItems: ["Draco Plate"],
185
185
  },
186
186
  arceuselectric: {
187
187
  inherit: true,
188
188
  color: "Gray",
189
- requiredItem: "Zap Plate",
189
+ requiredItems: ["Zap Plate"],
190
190
  },
191
191
  arceusfairy: {
192
192
  inherit: true,
193
193
  color: "Gray",
194
- requiredItem: "Pixie Plate",
194
+ requiredItems: ["Pixie Plate"],
195
195
  },
196
196
  arceusfighting: {
197
197
  inherit: true,
198
198
  color: "Gray",
199
- requiredItem: "Fist Plate",
199
+ requiredItems: ["Fist Plate"],
200
200
  },
201
201
  arceusfire: {
202
202
  inherit: true,
203
203
  color: "Gray",
204
- requiredItem: "Flame Plate",
204
+ requiredItems: ["Flame Plate"],
205
205
  },
206
206
  arceusflying: {
207
207
  inherit: true,
208
208
  color: "Gray",
209
- requiredItem: "Sky Plate",
209
+ requiredItems: ["Sky Plate"],
210
210
  },
211
211
  arceusghost: {
212
212
  inherit: true,
213
213
  color: "Gray",
214
- requiredItem: "Spooky Plate",
214
+ requiredItems: ["Spooky Plate"],
215
215
  },
216
216
  arceusgrass: {
217
217
  inherit: true,
218
218
  color: "Gray",
219
- requiredItem: "Meadow Plate",
219
+ requiredItems: ["Meadow Plate"],
220
220
  },
221
221
  arceusground: {
222
222
  inherit: true,
223
223
  color: "Gray",
224
- requiredItem: "Earth Plate",
224
+ requiredItems: ["Earth Plate"],
225
225
  },
226
226
  arceusice: {
227
227
  inherit: true,
228
228
  color: "Gray",
229
- requiredItem: "Icicle Plate",
229
+ requiredItems: ["Icicle Plate"],
230
230
  },
231
231
  arceuspoison: {
232
232
  inherit: true,
233
233
  color: "Gray",
234
- requiredItem: "Toxic Plate",
234
+ requiredItems: ["Toxic Plate"],
235
235
  },
236
236
  arceuspsychic: {
237
237
  inherit: true,
238
238
  color: "Gray",
239
- requiredItem: "Mind Plate",
239
+ requiredItems: ["Mind Plate"],
240
240
  },
241
241
  arceusrock: {
242
242
  inherit: true,
243
243
  color: "Gray",
244
- requiredItem: "Stone Plate",
244
+ requiredItems: ["Stone Plate"],
245
245
  },
246
246
  arceussteel: {
247
247
  inherit: true,
248
248
  color: "Gray",
249
- requiredItem: "Iron Plate",
249
+ requiredItems: ["Iron Plate"],
250
250
  },
251
251
  arceuswater: {
252
252
  inherit: true,
253
253
  color: "Gray",
254
- requiredItem: "Splash Plate",
254
+ requiredItems: ["Splash Plate"],
255
255
  },
256
256
  roggenrola: {
257
257
  inherit: true,
package/data/moves.ts CHANGED
@@ -11090,7 +11090,9 @@ export const Moves: {[moveid: string]: MoveData} = {
11090
11090
  priority: 0,
11091
11091
  flags: {protect: 1, bypasssub: 1, allyanim: 1},
11092
11092
  onHit(target, source) {
11093
- const disallowedMoves = ['chatter', 'dynamaxcannon', 'mimic', 'sketch', 'struggle', 'transform'];
11093
+ const disallowedMoves = [
11094
+ 'behemothbash', 'behemothblade', 'chatter', 'dynamaxcannon', 'mimic', 'sketch', 'struggle', 'transform',
11095
+ ];
11094
11096
  const move = target.lastMove;
11095
11097
  if (source.transformed || !move || disallowedMoves.includes(move.id) || source.moves.includes(move.id)) {
11096
11098
  return false;
@@ -15857,6 +15859,7 @@ export const Moves: {[moveid: string]: MoveData} = {
15857
15859
  onRestart(pokemon) {
15858
15860
  if (pokemon.removeVolatile('fly') || pokemon.removeVolatile('bounce')) {
15859
15861
  this.queue.cancelMove(pokemon);
15862
+ pokemon.removeVolatile('twoturnmove');
15860
15863
  this.add('-start', pokemon, 'Smack Down');
15861
15864
  }
15862
15865
  },
package/data/pokedex.ts CHANGED
@@ -16910,6 +16910,39 @@ export const Pokedex: {[speciesid: string]: SpeciesData} = {
16910
16910
  eggGroups: ["Water 1", "Fairy"],
16911
16911
  gen: 4,
16912
16912
  },
16913
+ venomicon: {
16914
+ num: -66,
16915
+ name: "Venomicon",
16916
+ baseForme: "Prologue",
16917
+ types: ["Poison", "Flying"],
16918
+ gender: "N",
16919
+ baseStats: {hp: 85, atk: 70, def: 113, spa: 118, spd: 90, spe: 64},
16920
+ abilities: {0: "Stamina"},
16921
+ heightm: 0.8,
16922
+ weightkg: 11.5,
16923
+ color: "Purple",
16924
+ eggGroups: ["Undiscovered"],
16925
+ otherFormes: ["Venomicon-Epilogue"],
16926
+ formeOrder: ["Venomicon", "Venomicon-Epilogue"],
16927
+ gen: 8,
16928
+ },
16929
+ venomiconepilogue: {
16930
+ num: -66,
16931
+ name: "Venomicon-Epilogue",
16932
+ baseSpecies: "Venomicon",
16933
+ forme: "Epilogue",
16934
+ types: ["Poison", "Flying"],
16935
+ gender: "N",
16936
+ baseStats: {hp: 85, atk: 110, def: 85, spa: 55, spd: 85, spe: 120},
16937
+ abilities: {0: "Tinted Lens"},
16938
+ heightm: 0.8,
16939
+ weightkg: 12.4,
16940
+ color: "Purple",
16941
+ eggGroups: ["Undiscovered"],
16942
+ requiredItem: "Vile Vial",
16943
+ changesFrom: "Venomicon",
16944
+ gen: 8,
16945
+ },
16913
16946
  // NOTE: PokeStar "formes" are not actually formes and thus do not have a formeOrder
16914
16947
  pokestarsmeargle: {
16915
16948
  num: -5000,
package/data/rulesets.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Note: These are the rules that formats use
1
+ // Note: These are the rules that formats use
2
2
 
3
3
  import {Utils} from "../lib";
4
4
 
@@ -791,13 +791,42 @@ export const Rulesets: {[k: string]: FormatData} = {
791
791
  ];
792
792
  },
793
793
  },
794
- "3batonpassclause": {
794
+ oneboostpasserclause: {
795
795
  effectType: 'ValidatorRule',
796
- name: '3 Baton Pass Clause',
797
- desc: "Stops teams from having more than three Pokémon with Baton Pass",
798
- banlist: ["Baton Pass > 3"],
796
+ name: 'One Boost Passer Clause',
797
+ desc: "Stops teams from having a Pokémon with Baton Pass that has multiple ways to boost its stats, and no more than one Baton Passer may be able to boost its stats",
799
798
  onBegin() {
800
- this.add('rule', '3 Baton Pass Clause: Limit three Baton Passers');
799
+ this.add('rule', 'One Boost Passer Clause: Limit one Baton Passer that has a way to boost its stats');
800
+ },
801
+ onValidateTeam(team) {
802
+ const boostingEffects = [
803
+ 'acidarmor', 'agility', 'amnesia', 'apicotberry', 'barrier', 'bellydrum', 'bulkup', 'calmmind', 'cosmicpower', 'curse',
804
+ 'defensecurl', 'dragondance', 'ganlonberry', 'growth', 'harden', 'howl', 'irondefense', 'liechiberry', 'meditate',
805
+ 'petayaberry', 'salacberry', 'sharpen', 'speedboost', 'starfberry', 'swordsdance', 'tailglow', 'withdraw',
806
+ ];
807
+ let passers = 0;
808
+ for (const set of team) {
809
+ if (!set.moves.includes('Baton Pass')) continue;
810
+ let passableBoosts = 0;
811
+ const item = this.toID(set.item);
812
+ const ability = this.toID(set.ability);
813
+ for (const move of set.moves) {
814
+ if (boostingEffects.includes(this.toID(move))) passableBoosts++;
815
+ }
816
+ if (boostingEffects.includes(item)) passableBoosts++;
817
+ if (boostingEffects.includes(ability)) passableBoosts++;
818
+ if (passableBoosts === 1) passers++;
819
+ if (passableBoosts > 1) {
820
+ return [
821
+ `${set.name || set.species} has Baton Pass and multiple ways to boost its stats, which is banned by One Boost Passer Clause.`,
822
+ ];
823
+ }
824
+ if (passers > 1) {
825
+ return [
826
+ `Multiple Pokemon have Baton Pass and a way to boost their stats, which is banned by One Boost Passer Clause.`,
827
+ ];
828
+ }
829
+ }
801
830
  },
802
831
  },
803
832
  cfzclause: {
@@ -2336,4 +2336,8 @@ export const ItemsText: {[k: string]: ItemText} = {
2336
2336
  name: "Crucibellite",
2337
2337
  desc: "If held by a Crucibelle, this item allows it to Mega Evolve in battle.",
2338
2338
  },
2339
+ vilevial: {
2340
+ name: "Vile Vial",
2341
+ desc: "If held by a Venomicon, its Poison- and Flying-type attacks have 1.2x power.",
2342
+ },
2339
2343
  };
@@ -3729,7 +3729,7 @@ export const MovesText: {[k: string]: MoveText} = {
3729
3729
  },
3730
3730
  mimic: {
3731
3731
  name: "Mimic",
3732
- desc: "While the user remains active, this move is replaced by the last move used by the target. The copied move has the maximum PP for that move. Fails if the target has not made a move, if the user has Transformed, if the user already knows the move, or if the move is Chatter, Dynamax Cannon, Mimic, Sketch, Struggle, Transform, or any Z-Move.",
3732
+ desc: "While the user remains active, this move is replaced by the last move used by the target. The copied move has the maximum PP for that move. Fails if the target has not made a move, if the user has Transformed, if the user already knows the move, or if the move is Behemoth Bash, Behemoth Blade, Chatter, Dynamax Cannon, Mimic, Sketch, Struggle, Transform, or any Z-Move.",
3733
3733
  shortDesc: "The last move the target used replaces this one.",
3734
3734
  gen6: {
3735
3735
  desc: "While the user remains active, this move is replaced by the last move used by the target. The copied move has the maximum PP for that move. Fails if the target has not made a move, if the user has Transformed, if the user already knows the move, or if the move is Chatter, Mimic, Sketch, Struggle, or Transform.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkmn/sim",
3
- "version": "0.4.24",
3
+ "version": "0.5.2",
4
4
  "description": "An automatically generated extraction of just the simulator portion of Pokémon Showdown",
5
5
  "homepage": "https://psim.us",
6
6
  "main": "build/sim/index.js",
@@ -549,7 +549,7 @@ export class BattleActions {
549
549
  [moveSteps[2], moveSteps[4]] = [moveSteps[4], moveSteps[2]];
550
550
  }
551
551
 
552
- if (!notActive) this.battle.setActiveMove(move, pokemon, targets[0]);
552
+ if (notActive) this.battle.setActiveMove(move, pokemon, targets[0]);
553
553
 
554
554
  const hitResult = this.battle.singleEvent('Try', move, null, pokemon, targets[0], move) &&
555
555
  this.battle.singleEvent('PrepareHit', move, {}, targets[0], pokemon, move) &&
@@ -883,7 +883,7 @@ export class DexFormats {
883
883
  if (table.hasOwnProperty(id)) {
884
884
  if (matchType === 'pokemon') {
885
885
  const species: Species = table[id] as Species;
886
- if (species.otherFormes && ruleid !== species.id + toID(species.baseForme)) {
886
+ if ((species.otherFormes || species.cosmeticFormes) && ruleid !== species.id + toID(species.baseForme)) {
887
887
  matches.push('basepokemon:' + id);
888
888
  continue;
889
889
  }
@@ -485,9 +485,10 @@ export class DexSpecies {
485
485
  if (!isLetsGo) species.isNonstandard = 'Past';
486
486
  }
487
487
  if (this.dex.currentMod === 'gen8bdsp' &&
488
- (!species.isNonstandard || species.isNonstandard === "Gigantamax")) {
489
- if (species.gen > 4 || species.num < 1 || species.id === 'pichuspikyeared') {
490
- species.isNonstandard = 'Past';
488
+ (!species.isNonstandard || ["Gigantamax", "CAP"].includes(species.isNonstandard))) {
489
+ if (species.gen > 4 || (species.num < 1 && species.isNonstandard !== 'CAP') ||
490
+ species.id === 'pichuspikyeared') {
491
+ species.isNonstandard = 'Future';
491
492
  species.tier = species.doublesTier = 'Illegal';
492
493
  }
493
494
  }
package/sim/pokemon.ts CHANGED
@@ -794,7 +794,7 @@ export class Pokemon {
794
794
  for (const pokemon of this.battle.getAllActive()) {
795
795
  // can't use hasAbility because it would lead to infinite recursion
796
796
  if (pokemon.ability === ('neutralizinggas' as ID) && !pokemon.volatiles['gastroacid'] &&
797
- !pokemon.abilityState.ending) {
797
+ !pokemon.transformed && !pokemon.abilityState.ending) {
798
798
  neutralizinggas = true;
799
799
  break;
800
800
  }
@@ -540,6 +540,9 @@ export class TeamValidator {
540
540
  problem = this.checkItem(set, item, setHas);
541
541
  if (problem) problems.push(problem);
542
542
  if (ruleTable.has('obtainablemisc')) {
543
+ if (dex.gen === 4 && item.id === 'griseousorb' && species.num !== 487) {
544
+ problems.push(`${set.name} cannot hold the Griseous Orb.`, `(In Gen 4, only Giratina could hold the Griseous Orb).`);
545
+ }
543
546
  if (dex.gen <= 1) {
544
547
  if (item.id) {
545
548
  // no items allowed