@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.
- package/build/cjs/config/formats.js +39 -85
- package/build/cjs/config/formats.js.map +1 -1
- package/build/cjs/data/formats-data.js +4 -4
- package/build/cjs/data/formats-data.js.map +1 -1
- package/build/cjs/data/learnsets.js +0 -1
- package/build/cjs/data/learnsets.js.map +1 -1
- package/build/cjs/data/mods/gen1/conditions.js +60 -10
- package/build/cjs/data/mods/gen1/conditions.js.map +1 -1
- package/build/cjs/data/mods/gen1/formats-data.js +2 -2
- package/build/cjs/data/mods/gen1/formats-data.js.map +1 -1
- package/build/cjs/data/mods/gen1/moves.js +0 -56
- package/build/cjs/data/mods/gen1/moves.js.map +1 -1
- package/build/cjs/data/mods/gen1/scripts.js +22 -31
- package/build/cjs/data/mods/gen1/scripts.js.map +1 -1
- package/build/cjs/data/mods/gen6/moves.js +1 -0
- package/build/cjs/data/mods/gen6/moves.js.map +1 -1
- package/build/cjs/data/mods/gen7/moves.js +3 -0
- package/build/cjs/data/mods/gen7/moves.js.map +1 -1
- package/build/cjs/data/moves.js +26 -11
- package/build/cjs/data/moves.js.map +1 -1
- package/build/cjs/data/pokedex.js +1 -1
- package/build/cjs/data/rulesets.js +81 -63
- package/build/cjs/data/rulesets.js.map +1 -1
- package/build/cjs/data/text/moves.js +1 -2
- package/build/cjs/data/text/moves.js.map +1 -1
- package/build/cjs/sim/battle-actions.js +7 -4
- package/build/cjs/sim/battle-actions.js.map +1 -1
- package/build/cjs/sim/battle.js +40 -0
- package/build/cjs/sim/battle.js.map +1 -1
- package/build/cjs/sim/dex-conditions.d.ts +2 -2
- package/build/cjs/sim/dex-conditions.js +1 -1
- package/build/cjs/sim/dex-conditions.js.map +1 -1
- package/build/cjs/sim/exported-global-types.d.ts +1 -1
- package/build/cjs/sim/global-types.d.ts +1 -1
- package/build/cjs/sim/pokemon.d.ts +2 -0
- package/build/cjs/sim/pokemon.js +8 -7
- package/build/cjs/sim/pokemon.js.map +1 -1
- package/build/cjs/sim/side.d.ts +7 -2
- package/build/cjs/sim/side.js +55 -39
- package/build/cjs/sim/side.js.map +1 -1
- package/build/esm/config/formats.mjs +39 -85
- package/build/esm/config/formats.mjs.map +1 -1
- package/build/esm/data/formats-data.mjs +4 -4
- package/build/esm/data/formats-data.mjs.map +1 -1
- package/build/esm/data/learnsets.mjs +0 -1
- package/build/esm/data/learnsets.mjs.map +1 -1
- package/build/esm/data/mods/gen1/conditions.mjs +60 -10
- package/build/esm/data/mods/gen1/conditions.mjs.map +1 -1
- package/build/esm/data/mods/gen1/formats-data.mjs +2 -2
- package/build/esm/data/mods/gen1/formats-data.mjs.map +1 -1
- package/build/esm/data/mods/gen1/moves.mjs +0 -56
- package/build/esm/data/mods/gen1/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen1/scripts.mjs +22 -31
- package/build/esm/data/mods/gen1/scripts.mjs.map +1 -1
- package/build/esm/data/mods/gen6/moves.mjs +1 -0
- package/build/esm/data/mods/gen6/moves.mjs.map +1 -1
- package/build/esm/data/mods/gen7/moves.mjs +3 -0
- package/build/esm/data/mods/gen7/moves.mjs.map +1 -1
- package/build/esm/data/moves.mjs +26 -11
- package/build/esm/data/moves.mjs.map +1 -1
- package/build/esm/data/pokedex.mjs +1 -1
- package/build/esm/data/rulesets.mjs +81 -63
- package/build/esm/data/rulesets.mjs.map +1 -1
- package/build/esm/data/text/moves.mjs +1 -2
- package/build/esm/data/text/moves.mjs.map +1 -1
- package/build/esm/sim/battle-actions.mjs +7 -4
- package/build/esm/sim/battle-actions.mjs.map +1 -1
- package/build/esm/sim/battle.mjs +40 -0
- package/build/esm/sim/battle.mjs.map +1 -1
- package/build/esm/sim/dex-conditions.d.mts +2 -2
- package/build/esm/sim/dex-conditions.mjs +1 -1
- package/build/esm/sim/dex-conditions.mjs.map +1 -1
- package/build/esm/sim/exported-global-types.d.mts +1 -1
- package/build/esm/sim/global-types.d.mts +1 -1
- package/build/esm/sim/pokemon.d.mts +2 -0
- package/build/esm/sim/pokemon.mjs +8 -7
- package/build/esm/sim/pokemon.mjs.map +1 -1
- package/build/esm/sim/side.d.mts +7 -2
- package/build/esm/sim/side.mjs +55 -39
- package/build/esm/sim/side.mjs.map +1 -1
- 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:
|
|
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
|
-
'
|
|
15
|
-
'
|
|
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
|
-
'
|
|
63
|
-
'
|
|
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
|
-
'
|
|
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
|
-
//
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
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
|
|
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 ((
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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",
|