@pkmn/sim 0.9.31 → 0.9.32

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 (81) hide show
  1. package/build/cjs/config/formats.js +39 -85
  2. package/build/cjs/config/formats.js.map +1 -1
  3. package/build/cjs/data/formats-data.js +4 -4
  4. package/build/cjs/data/formats-data.js.map +1 -1
  5. package/build/cjs/data/learnsets.js +0 -1
  6. package/build/cjs/data/learnsets.js.map +1 -1
  7. package/build/cjs/data/mods/gen1/conditions.js +60 -10
  8. package/build/cjs/data/mods/gen1/conditions.js.map +1 -1
  9. package/build/cjs/data/mods/gen1/formats-data.js +2 -2
  10. package/build/cjs/data/mods/gen1/formats-data.js.map +1 -1
  11. package/build/cjs/data/mods/gen1/moves.js +0 -56
  12. package/build/cjs/data/mods/gen1/moves.js.map +1 -1
  13. package/build/cjs/data/mods/gen1/scripts.js +22 -31
  14. package/build/cjs/data/mods/gen1/scripts.js.map +1 -1
  15. package/build/cjs/data/mods/gen6/moves.js +1 -0
  16. package/build/cjs/data/mods/gen6/moves.js.map +1 -1
  17. package/build/cjs/data/mods/gen7/moves.js +3 -0
  18. package/build/cjs/data/mods/gen7/moves.js.map +1 -1
  19. package/build/cjs/data/moves.js +26 -11
  20. package/build/cjs/data/moves.js.map +1 -1
  21. package/build/cjs/data/pokedex.js +1 -1
  22. package/build/cjs/data/rulesets.js +81 -63
  23. package/build/cjs/data/rulesets.js.map +1 -1
  24. package/build/cjs/data/text/moves.js +1 -2
  25. package/build/cjs/data/text/moves.js.map +1 -1
  26. package/build/cjs/sim/battle-actions.js +7 -4
  27. package/build/cjs/sim/battle-actions.js.map +1 -1
  28. package/build/cjs/sim/battle.js +40 -0
  29. package/build/cjs/sim/battle.js.map +1 -1
  30. package/build/cjs/sim/dex-conditions.d.ts +2 -2
  31. package/build/cjs/sim/dex-conditions.js +1 -1
  32. package/build/cjs/sim/dex-conditions.js.map +1 -1
  33. package/build/cjs/sim/exported-global-types.d.ts +1 -1
  34. package/build/cjs/sim/global-types.d.ts +1 -1
  35. package/build/cjs/sim/pokemon.d.ts +2 -0
  36. package/build/cjs/sim/pokemon.js +8 -7
  37. package/build/cjs/sim/pokemon.js.map +1 -1
  38. package/build/cjs/sim/side.d.ts +7 -2
  39. package/build/cjs/sim/side.js +55 -39
  40. package/build/cjs/sim/side.js.map +1 -1
  41. package/build/esm/config/formats.mjs +39 -85
  42. package/build/esm/config/formats.mjs.map +1 -1
  43. package/build/esm/data/formats-data.mjs +4 -4
  44. package/build/esm/data/formats-data.mjs.map +1 -1
  45. package/build/esm/data/learnsets.mjs +0 -1
  46. package/build/esm/data/learnsets.mjs.map +1 -1
  47. package/build/esm/data/mods/gen1/conditions.mjs +60 -10
  48. package/build/esm/data/mods/gen1/conditions.mjs.map +1 -1
  49. package/build/esm/data/mods/gen1/formats-data.mjs +2 -2
  50. package/build/esm/data/mods/gen1/formats-data.mjs.map +1 -1
  51. package/build/esm/data/mods/gen1/moves.mjs +0 -56
  52. package/build/esm/data/mods/gen1/moves.mjs.map +1 -1
  53. package/build/esm/data/mods/gen1/scripts.mjs +22 -31
  54. package/build/esm/data/mods/gen1/scripts.mjs.map +1 -1
  55. package/build/esm/data/mods/gen6/moves.mjs +1 -0
  56. package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
  57. package/build/esm/data/mods/gen7/moves.mjs +3 -0
  58. package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
  59. package/build/esm/data/moves.mjs +26 -11
  60. package/build/esm/data/moves.mjs.map +1 -1
  61. package/build/esm/data/pokedex.mjs +1 -1
  62. package/build/esm/data/rulesets.mjs +81 -63
  63. package/build/esm/data/rulesets.mjs.map +1 -1
  64. package/build/esm/data/text/moves.mjs +1 -2
  65. package/build/esm/data/text/moves.mjs.map +1 -1
  66. package/build/esm/sim/battle-actions.mjs +7 -4
  67. package/build/esm/sim/battle-actions.mjs.map +1 -1
  68. package/build/esm/sim/battle.mjs +40 -0
  69. package/build/esm/sim/battle.mjs.map +1 -1
  70. package/build/esm/sim/dex-conditions.d.mts +2 -2
  71. package/build/esm/sim/dex-conditions.mjs +1 -1
  72. package/build/esm/sim/dex-conditions.mjs.map +1 -1
  73. package/build/esm/sim/exported-global-types.d.mts +1 -1
  74. package/build/esm/sim/global-types.d.mts +1 -1
  75. package/build/esm/sim/pokemon.d.mts +2 -0
  76. package/build/esm/sim/pokemon.mjs +8 -7
  77. package/build/esm/sim/pokemon.mjs.map +1 -1
  78. package/build/esm/sim/side.d.mts +7 -2
  79. package/build/esm/sim/side.mjs +55 -39
  80. package/build/esm/sim/side.mjs.map +1 -1
  81. package/package.json +1 -1
@@ -18662,7 +18662,7 @@ exports.Pokedex = {
18662
18662
  num: -14,
18663
18663
  name: "Kitsunoh",
18664
18664
  types: ["Ghost", "Steel"],
18665
- baseStats: { hp: 80, atk: 117, def: 85, spa: 55, spd: 80, spe: 128 },
18665
+ baseStats: { hp: 80, atk: 103, def: 85, spa: 55, spd: 80, spe: 120 },
18666
18666
  abilities: { 0: "Frisk", 1: "Limber", H: "Trace" },
18667
18667
  heightm: 1.1,
18668
18668
  weightkg: 51,
@@ -6,13 +6,21 @@ exports.Rulesets = void 0;
6
6
  exports.Rulesets = {
7
7
  // Rulesets
8
8
  ///////////////////////////////////////////////////////////////////
9
+ standardag: {
10
+ effectType: 'ValidatorRule',
11
+ name: 'Standard AG',
12
+ desc: "The minimal ruleset for Anything Goes",
13
+ ruleset: [
14
+ 'Obtainable', 'Team Preview', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause',
15
+ ],
16
+ },
9
17
  standard: {
10
18
  effectType: 'ValidatorRule',
11
19
  name: 'Standard',
12
20
  desc: "The standard ruleset for all offical Smogon singles tiers (Ubers, OU, etc.)",
13
21
  ruleset: [
14
- 'Obtainable', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod',
15
- 'Min Source Gen = 9',
22
+ 'Standard AG',
23
+ 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Items Clause', 'Evasion Moves Clause',
16
24
  ],
17
25
  },
18
26
  flatrules: {
@@ -59,8 +67,8 @@ exports.Rulesets = {
59
67
  name: 'Standard Doubles',
60
68
  desc: "The standard ruleset for all official Smogon doubles tiers",
61
69
  ruleset: [
62
- 'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod',
63
- 'Min Source Gen = 9',
70
+ 'Standard AG',
71
+ 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause',
64
72
  ],
65
73
  },
66
74
  standardnatdex: {
@@ -68,9 +76,17 @@ exports.Rulesets = {
68
76
  name: 'Standard NatDex',
69
77
  desc: "The standard ruleset for all National Dex tiers",
70
78
  ruleset: [
71
- 'Obtainable', '+Unobtainable', '+Past', 'Sketch Post-Gen 7 Moves', 'Team Preview', 'Nickname Clause', 'HP Percentage Mod', 'Cancel Mod', 'Endless Battle Clause',
79
+ 'Standard AG', 'NatDex Mod',
80
+ 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Clause', 'Sleep Clause Mod',
81
+ ],
82
+ },
83
+ natdexmod: {
84
+ effectType: 'ValidatorRule',
85
+ name: 'NatDex Mod',
86
+ desc: "Mechanics for National Dex formats",
87
+ ruleset: [
88
+ '+Unobtainable', '+Past', 'Sketch Post-Gen 7 Moves',
72
89
  ],
73
- unbanlist: ['Bleakwind Storm', 'Lunar Blessing', 'Mystical Power', 'Sandsear Storm', 'Wildbolt Storm'],
74
90
  onValidateSet(set) {
75
91
  const species = this.dex.species.get(set.species);
76
92
  if (species.natDexTier === 'Illegal') {
@@ -102,19 +118,28 @@ exports.Rulesets = {
102
118
  }
103
119
  }
104
120
  }
105
- // Items other than Z-Crystals and Pokémon-specific items should be illegal
121
+ // Any item that was legal in Gen 7 (Normal Gem for example) should be usable
106
122
  if (!set.item)
107
123
  return;
108
- const item = this.dex.items.get(set.item);
109
- if (!item.isNonstandard)
110
- return;
111
- if ((item.isNonstandard === 'Past' || requireObtainable && item.isNonstandard === 'Unobtainable') &&
112
- !item.zMove && !item.itemUser && !item.forcedForme && !item.isBerry) {
124
+ let item = this.dex.items.get(set.item);
125
+ let gen = this.dex.gen;
126
+ while (item.isNonstandard && gen >= 7) {
127
+ item = this.dex.forGen(gen).items.get(item.id);
128
+ gen--;
129
+ }
130
+ if (requireObtainable && item.isNonstandard) {
113
131
  if (this.ruleTable.has(`+item:${item.id}`))
114
132
  return;
115
133
  return [`${set.name}'s item ${item.name} does not exist in Gen ${this.dex.gen}.`];
116
134
  }
117
135
  },
136
+ onBegin() {
137
+ for (const pokemon of this.getAllPokemon()) {
138
+ if (pokemon.species.isMega || pokemon.species.isPrimal || pokemon.species.forme === "Ultra") {
139
+ pokemon.canTerastallize = null;
140
+ }
141
+ }
142
+ },
118
143
  },
119
144
  obtainable: {
120
145
  effectType: 'ValidatorRule',
@@ -388,7 +413,7 @@ exports.Rulesets = {
388
413
  name: 'PotD',
389
414
  desc: "Forces the Pokemon of the Day onto every random team.",
390
415
  onBegin() {
391
- if (global.Config && global.Config.potd) {
416
+ if (global.Config?.potd) {
392
417
  this.add('rule', "Pokemon of the Day: " + this.dex.species.get(Config.potd).name);
393
418
  }
394
419
  },
@@ -397,6 +422,11 @@ exports.Rulesets = {
397
422
  effectType: 'Rule',
398
423
  name: 'Team Preview',
399
424
  desc: "Allows each player to see the Pokémon on their opponent's team before they choose their lead Pokémon",
425
+ onBegin() {
426
+ if (this.ruleTable.has(`teratypepreview`)) {
427
+ this.add('rule', 'Tera Type Preview: Tera Types are shown at Team Preview');
428
+ }
429
+ },
400
430
  onTeamPreview() {
401
431
  this.add('clearpoke');
402
432
  for (const pokemon of this.getAllPokemon()) {
@@ -409,6 +439,16 @@ exports.Rulesets = {
409
439
  this.add('poke', pokemon.side.id, details, '');
410
440
  }
411
441
  this.makeRequest('teampreview');
442
+ if (this.ruleTable.has(`teratypepreview`)) {
443
+ for (const side of this.sides) {
444
+ let buf = ``;
445
+ for (const pokemon of side.pokemon) {
446
+ buf += buf ? ` / ` : `raw|${side.name}'s Tera Types:<br />`;
447
+ buf += `<psicon pokemon="${pokemon.species.id}" /><psicon type="${pokemon.teraType}" />`;
448
+ }
449
+ this.add(`${buf}`);
450
+ }
451
+ }
412
452
  },
413
453
  },
414
454
  littlecup: {
@@ -654,7 +694,7 @@ exports.Rulesets = {
654
694
  desc: "Bans all moves that induce sleep, such as Hypnosis",
655
695
  banlist: ['Yawn'],
656
696
  onBegin() {
657
- this.add('rule', 'Sleep Clause: Sleep-inducing moves are banned');
697
+ this.add('rule', 'Sleep Moves Clause: Sleep-inducing moves are banned');
658
698
  },
659
699
  onValidateSet(set) {
660
700
  const problems = [];
@@ -690,8 +730,9 @@ exports.Rulesets = {
690
730
  // this variable is true if the move never misses (even with lowered acc) or has a chance to miss,
691
731
  // but false if the move's accuracy is 100% (yet can be lowered).
692
732
  const hasMissChanceOrNeverMisses = move.accuracy === true || move.accuracy < 100;
693
- if (move.status === 'slp' && hasMissChanceOrNeverMisses)
733
+ if (move.status === 'slp' && hasMissChanceOrNeverMisses) {
694
734
  hasSleepMove = true;
735
+ }
695
736
  }
696
737
  }
697
738
  if (hasOrbeetle && hasSleepMove) {
@@ -746,7 +787,7 @@ exports.Rulesets = {
746
787
  let nonSpeedBoosted = false;
747
788
  for (const moveId of set.moves) {
748
789
  const move = this.dex.moves.get(moveId);
749
- if (move.id === 'flamecharge' || (move.boosts && move.boosts.spe && move.boosts.spe > 0)) {
790
+ if (move.id === 'flamecharge' || (move.boosts?.spe && move.boosts.spe > 0)) {
750
791
  speedBoosted = true;
751
792
  }
752
793
  const nonSpeedBoostedMoves = [
@@ -764,8 +805,8 @@ exports.Rulesets = {
764
805
  if (!speedBoosted)
765
806
  speedBoosted = move.name;
766
807
  }
767
- if (((boosts.atk && boosts.atk > 0) || (boosts.def && boosts.def > 0) ||
768
- (boosts.spa && boosts.spa > 0) || (boosts.spd && boosts.spd > 0))) {
808
+ if ((boosts.atk && boosts.atk > 0) || (boosts.def && boosts.def > 0) ||
809
+ (boosts.spa && boosts.spa > 0) || (boosts.spd && boosts.spd > 0)) {
769
810
  if (!nonSpeedBoosted || move.name === speedBoosted)
770
811
  nonSpeedBoosted = move.name;
771
812
  }
@@ -860,9 +901,9 @@ exports.Rulesets = {
860
901
  onValidateTeam(team) {
861
902
  const boostingEffects = [
862
903
  'absorbbulb', 'acidarmor', 'acupressure', 'agility', 'amnesia', 'ancientpower', 'angerpoint', 'apicotberry', 'autotomize',
863
- 'barrier', 'bellydrum', 'bulkup', 'calmmind', 'cellbattery', 'chargebeam', 'coil', 'cosmicpower', 'cottonguard', 'curse',
864
- 'defendorder', 'defiant', 'download', 'dragondance', 'fierydance', 'flamecharge', 'focusenergy', 'ganlonberry', 'growth',
865
- 'harden', 'honeclaws', 'howl', 'irondefense', 'justified', 'liechiberry', 'lightningrod', 'meditate', 'metalclaw',
904
+ 'barrier', 'bellydrum', 'bulkup', 'calmmind', 'cellbattery', 'charge', 'chargebeam', 'coil', 'cosmicpower', 'cottonguard', 'curse',
905
+ 'defensecurl', 'defendorder', 'defiant', 'download', 'dragondance', 'fierydance', 'flamecharge', 'focusenergy', 'ganlonberry', 'growth',
906
+ 'harden', 'honeclaws', 'howl', 'irondefense', 'justified', 'lansatberry', 'liechiberry', 'lightningrod', 'meditate', 'metalclaw',
866
907
  'meteormash', 'motordrive', 'moxie', 'nastyplot', 'ominouswind', 'petayaberry', 'quiverdance', 'rage', 'rattled',
867
908
  'rockpolish', 'salacberry', 'sapsipper', 'sharpen', 'shellsmash', 'shiftgear', 'silverwind', 'skullbash', 'speedboost',
868
909
  'starfberry', 'steadfast', 'steelwing', 'stockpile', 'stormdrain', 'swordsdance', 'tailglow', 'weakarmor', 'withdraw',
@@ -960,14 +1001,15 @@ exports.Rulesets = {
960
1001
  this.add('rule', 'Sleep Clause Mod: Limit one foe put to sleep');
961
1002
  },
962
1003
  onSetStatus(status, target, source) {
963
- if (source && source.isAlly(target)) {
1004
+ if (source?.isAlly(target)) {
964
1005
  return;
965
1006
  }
966
1007
  if (status.id === 'slp') {
967
1008
  for (const pokemon of target.side.pokemon) {
968
1009
  if (pokemon.hp && pokemon.status === 'slp') {
969
- if (!pokemon.statusState.source || !pokemon.statusState.source.isAlly(pokemon)) {
1010
+ if (!pokemon.statusState.source?.isAlly(pokemon)) {
970
1011
  this.add('-message', 'Sleep Clause Mod activated.');
1012
+ this.hint("Sleep Clause Mod prevents players from putting more than one of their opponent's Pokémon to sleep at a time");
971
1013
  return false;
972
1014
  }
973
1015
  }
@@ -983,7 +1025,7 @@ exports.Rulesets = {
983
1025
  this.add('rule', 'Stadium Sleep Clause: Limit one foe put to sleep');
984
1026
  },
985
1027
  onSetStatus(status, target, source) {
986
- if (source && source.isAlly(target)) {
1028
+ if (source?.isAlly(target)) {
987
1029
  return;
988
1030
  }
989
1031
  if (status.id === 'slp') {
@@ -1031,7 +1073,7 @@ exports.Rulesets = {
1031
1073
  this.add('rule', 'Freeze Clause Mod: Limit one foe frozen');
1032
1074
  },
1033
1075
  onSetStatus(status, target, source) {
1034
- if (source && source.isAlly(target)) {
1076
+ if (source?.isAlly(target)) {
1035
1077
  return;
1036
1078
  }
1037
1079
  if (status.id === 'frz') {
@@ -1090,8 +1132,13 @@ exports.Rulesets = {
1090
1132
  onBegin() {
1091
1133
  this.add('rule', 'Mega Rayquaza Clause: You cannot mega evolve Rayquaza');
1092
1134
  for (const pokemon of this.getAllPokemon()) {
1093
- if (pokemon.species.id === 'rayquaza')
1135
+ if (pokemon.species.id === 'rayquaza') {
1094
1136
  pokemon.canMegaEvo = null;
1137
+ // ability to terastal was determined before the clause activated, causing incorrect behavior
1138
+ if (!this.ruleTable.has('terastalclause')) {
1139
+ pokemon.canTerastallize = this.actions.canTerastallize(pokemon);
1140
+ }
1141
+ }
1095
1142
  }
1096
1143
  },
1097
1144
  },
@@ -1195,7 +1242,7 @@ exports.Rulesets = {
1195
1242
  'sketchpostgen7moves': {
1196
1243
  effectType: 'ValidatorRule',
1197
1244
  name: 'Sketch Post-Gen 7 Moves',
1198
- desc: "Allows Pokémon who learn Sketch to learn any Gen 8+ move (normally, Sketch is not usable in Gen 8+).",
1245
+ desc: "Allows Pokémon who learn Sketch to learn any Gen 8+ move (normally, Sketch is not usable in Gen 8 or Gen 9 Pre-DLC2).",
1199
1246
  // Implemented in sim/team-validator.ts
1200
1247
  },
1201
1248
  overflowstatmod: {
@@ -1240,35 +1287,6 @@ exports.Rulesets = {
1240
1287
  this.showOpenTeamSheets();
1241
1288
  },
1242
1289
  },
1243
- eventmovesclause: {
1244
- effectType: 'ValidatorRule',
1245
- name: 'Event Moves Clause',
1246
- desc: "Bans moves only obtainable through events.",
1247
- onBegin() {
1248
- this.add('rule', 'Event Moves Clause: Event-only moves are banned');
1249
- },
1250
- onValidateSet(set) {
1251
- if (!set.moves)
1252
- return;
1253
- const moveSources = Object.fromEntries(set.moves.map((move) => [this.toID(move), []]));
1254
- const species = this.dex.species.get(set.species);
1255
- for (const { learnset } of this.dex.species.getFullLearnset(species.id)) {
1256
- for (const moveid in moveSources) {
1257
- moveSources[moveid].push(...(learnset[moveid] || []));
1258
- }
1259
- }
1260
- const problems = [];
1261
- for (const move of set.moves) {
1262
- const sources = moveSources[this.toID(move)];
1263
- if (sources?.length && sources.every((learned) => learned.includes('S'))) {
1264
- problems.push(`${species.name}'s move ${move} is obtainable only through events.`);
1265
- }
1266
- }
1267
- if (problems.length)
1268
- problems.push(`(Event-only moves are banned.)`);
1269
- return problems;
1270
- },
1271
- },
1272
1290
  pickedteamsize: {
1273
1291
  effectType: 'Rule',
1274
1292
  name: 'Picked Team Size',
@@ -1288,13 +1306,6 @@ exports.Rulesets = {
1288
1306
  hasValue: 'positive-integer',
1289
1307
  // hardcoded in sim/team-validator
1290
1308
  },
1291
- evlimit: {
1292
- effectType: 'ValidatorRule',
1293
- name: "EV Limit",
1294
- desc: "Maximum total EVs on each pokemon.",
1295
- hasValue: 'integer',
1296
- // hardcoded in sim/team-validator
1297
- },
1298
1309
  maxteamsize: {
1299
1310
  effectType: 'ValidatorRule',
1300
1311
  name: "Max Team Size",
@@ -1302,6 +1313,13 @@ exports.Rulesets = {
1302
1313
  hasValue: 'positive-integer',
1303
1314
  // hardcoded in sim/team-validator
1304
1315
  },
1316
+ evlimit: {
1317
+ effectType: 'ValidatorRule',
1318
+ name: "EV Limit",
1319
+ desc: "Maximum total EVs on each pokemon.",
1320
+ hasValue: 'integer',
1321
+ // hardcoded in sim/team-validator
1322
+ },
1305
1323
  maxmovecount: {
1306
1324
  effectType: 'ValidatorRule',
1307
1325
  name: "Max Move Count",