@pkmn/sim 0.5.21 → 0.5.24
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/LICENSE +1 -1
- package/build/config/formats.js +412 -419
- package/build/config/formats.js.map +1 -1
- package/build/data/abilities.js +1 -3
- package/build/data/abilities.js.map +1 -1
- package/build/data/aliases.js +4 -4
- package/build/data/aliases.js.map +1 -1
- package/build/data/conditions.js +5 -2
- package/build/data/conditions.js.map +1 -1
- package/build/data/formats-data.js +9 -10
- package/build/data/formats-data.js.map +1 -1
- package/build/data/mods/gen1/conditions.js +3 -0
- package/build/data/mods/gen1/conditions.js.map +1 -1
- package/build/data/mods/gen1/formats-data.js +1 -1
- package/build/data/mods/gen1/formats-data.js.map +1 -1
- package/build/data/mods/gen1/moves.js +5 -2
- package/build/data/mods/gen1/moves.js.map +1 -1
- package/build/data/mods/gen1/scripts.js +4 -2
- package/build/data/mods/gen1/scripts.js.map +1 -1
- package/build/data/mods/gen2/conditions.js +3 -0
- package/build/data/mods/gen2/conditions.js.map +1 -1
- package/build/data/mods/gen3/conditions.js +3 -0
- package/build/data/mods/gen3/conditions.js.map +1 -1
- package/build/data/mods/gen3/formats-data.js +3 -3
- package/build/data/mods/gen3/formats-data.js.map +1 -1
- package/build/data/mods/gen4/abilities.js +1 -1
- package/build/data/mods/gen4/abilities.js.map +1 -1
- package/build/data/mods/gen4/conditions.js +3 -0
- package/build/data/mods/gen4/conditions.js.map +1 -1
- package/build/data/mods/gen4/moves.js +9 -2
- package/build/data/mods/gen4/moves.js.map +1 -1
- package/build/data/mods/gen5/moves.js +4 -7
- package/build/data/mods/gen5/moves.js.map +1 -1
- package/build/data/mods/gen5/pokedex.js +24 -0
- package/build/data/mods/gen5/pokedex.js.map +1 -1
- package/build/data/mods/gen6/formats-data.js +64 -64
- package/build/data/mods/gen6/formats-data.js.map +1 -1
- package/build/data/mods/gen7/abilities.js +8 -0
- package/build/data/mods/gen7/abilities.js.map +1 -1
- package/build/data/mods/gen7/moves.js +2 -2
- package/build/data/mods/gen7/moves.js.map +1 -1
- package/build/data/moves.js +8 -3
- package/build/data/moves.js.map +1 -1
- package/build/data/pokedex.js +1 -1
- package/build/data/rulesets.js +270 -3
- package/build/data/rulesets.js.map +1 -1
- package/build/lib/utils.d.ts +4 -0
- package/build/lib/utils.js +20 -1
- package/build/lib/utils.js.map +1 -1
- package/build/sim/battle-stream.js +3 -0
- package/build/sim/battle-stream.js.map +1 -1
- package/build/sim/exported-global-types.d.ts +2 -0
- package/build/sim/global-types.d.ts +2 -0
- package/build/sim/pokemon.d.ts +1 -0
- package/build/sim/pokemon.js +9 -2
- package/build/sim/pokemon.js.map +1 -1
- package/build/sim/side.js +21 -0
- package/build/sim/side.js.map +1 -1
- package/config/formats.ts +407 -406
- package/data/abilities.ts +1 -3
- package/data/aliases.ts +4 -4
- package/data/conditions.ts +6 -2
- package/data/formats-data.ts +9 -10
- package/data/mods/gen1/conditions.ts +4 -0
- package/data/mods/gen1/formats-data.ts +1 -1
- package/data/mods/gen1/moves.ts +5 -1
- package/data/mods/gen1/scripts.ts +3 -2
- package/data/mods/gen2/conditions.ts +4 -0
- package/data/mods/gen3/conditions.ts +4 -0
- package/data/mods/gen3/formats-data.ts +3 -3
- package/data/mods/gen4/abilities.ts +1 -1
- package/data/mods/gen4/conditions.ts +4 -0
- package/data/mods/gen4/moves.ts +9 -2
- package/data/mods/gen5/moves.ts +4 -7
- package/data/mods/gen5/pokedex.ts +24 -0
- package/data/mods/gen6/formats-data.ts +64 -64
- package/data/mods/gen7/abilities.ts +8 -0
- package/data/mods/gen7/moves.ts +2 -2
- package/data/moves.ts +8 -3
- package/data/pokedex.ts +1 -1
- package/data/rulesets.ts +247 -3
- package/lib/utils.ts +16 -0
- package/package.json +2 -2
- package/sim/battle-stream.ts +3 -0
- package/sim/exported-global-types.ts +2 -0
- package/sim/global-types.ts +2 -0
- package/sim/pokemon.ts +9 -2
- package/sim/side.ts +20 -0
package/build/data/pokedex.js
CHANGED
|
@@ -16539,7 +16539,7 @@ exports.Pokedex = {
|
|
|
16539
16539
|
num: -6,
|
|
16540
16540
|
name: "Pyroak",
|
|
16541
16541
|
types: ["Fire", "Grass"],
|
|
16542
|
-
baseStats: { hp: 120, atk: 70, def: 105, spa:
|
|
16542
|
+
baseStats: { hp: 120, atk: 70, def: 105, spa: 70, spd: 65, spe: 60 },
|
|
16543
16543
|
abilities: { 0: "Rock Head", 1: "Battle Armor", H: "Contrary" },
|
|
16544
16544
|
heightm: 2.1,
|
|
16545
16545
|
weightkg: 168,
|
package/build/data/rulesets.js
CHANGED
|
@@ -13,7 +13,7 @@ exports.Rulesets = {
|
|
|
13
13
|
name: 'Standard',
|
|
14
14
|
desc: "The standard ruleset for all offical Smogon singles tiers (Ubers, OU, etc.)",
|
|
15
15
|
ruleset: [
|
|
16
|
-
'Obtainable', 'Team Preview', 'Sleep Clause Mod', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod',
|
|
16
|
+
'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',
|
|
17
17
|
],
|
|
18
18
|
},
|
|
19
19
|
standardnext: {
|
|
@@ -72,6 +72,14 @@ exports.Rulesets = {
|
|
|
72
72
|
'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Gravity Sleep Clause', 'Endless Battle Clause', 'HP Percentage Mod', 'Cancel Mod',
|
|
73
73
|
],
|
|
74
74
|
},
|
|
75
|
+
standardoms: {
|
|
76
|
+
effectType: 'ValidatorRule',
|
|
77
|
+
name: 'Standard OMs',
|
|
78
|
+
desc: "The standard ruleset for all Smogon OMs (Almost Any Ability, STABmons, etc.)",
|
|
79
|
+
ruleset: [
|
|
80
|
+
'Obtainable', 'Team Preview', 'Species Clause', 'Nickname Clause', 'OHKO Clause', 'Evasion Moves Clause', 'Endless Battle Clause', 'Dynamax Clause', 'HP Percentage Mod', 'Cancel Mod', 'Overflow Stat Mod',
|
|
81
|
+
],
|
|
82
|
+
},
|
|
75
83
|
standardnatdex: {
|
|
76
84
|
effectType: 'ValidatorRule',
|
|
77
85
|
name: 'Standard NatDex',
|
|
@@ -405,6 +413,30 @@ exports.Rulesets = {
|
|
|
405
413
|
}
|
|
406
414
|
},
|
|
407
415
|
},
|
|
416
|
+
forceselect: {
|
|
417
|
+
effectType: 'ValidatorRule',
|
|
418
|
+
name: 'Force Select',
|
|
419
|
+
desc: `Forces a Pokemon to be on the team and selected at Team Preview. Usage: Force Select = [Pokemon], e.g. "Force Select = Magikarp"`,
|
|
420
|
+
hasValue: true,
|
|
421
|
+
onValidateRule(value) {
|
|
422
|
+
if (!this.dex.species.get(value).exists)
|
|
423
|
+
throw new Error(`Misspelled Pokemon "${value}"`);
|
|
424
|
+
},
|
|
425
|
+
onValidateTeam(team) {
|
|
426
|
+
let hasSelection = false;
|
|
427
|
+
const species = this.dex.species.get(this.ruleTable.valueRules.get('forceselect'));
|
|
428
|
+
for (const set of team) {
|
|
429
|
+
if (species.name === set.species) {
|
|
430
|
+
hasSelection = true;
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (!hasSelection) {
|
|
435
|
+
return [`Your team must contain ${species.name}.`];
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
// hardcoded in sim/side
|
|
439
|
+
},
|
|
408
440
|
evlimits: {
|
|
409
441
|
effectType: 'ValidatorRule',
|
|
410
442
|
name: 'EV Limits',
|
|
@@ -630,6 +662,15 @@ exports.Rulesets = {
|
|
|
630
662
|
return problems;
|
|
631
663
|
},
|
|
632
664
|
},
|
|
665
|
+
evasionclause: {
|
|
666
|
+
effectType: 'ValidatorRule',
|
|
667
|
+
name: 'Evasion Clause',
|
|
668
|
+
desc: "Bans abilities, items, and moves that boost Evasion",
|
|
669
|
+
ruleset: ['Evasion Abilities Clause', 'Evasion Items Clause', 'Evasion Moves Clause'],
|
|
670
|
+
onBegin() {
|
|
671
|
+
this.add('rule', 'Evasion Clause: Evasion abilities, items, and moves are banned');
|
|
672
|
+
},
|
|
673
|
+
},
|
|
633
674
|
evasionabilitiesclause: {
|
|
634
675
|
effectType: 'ValidatorRule',
|
|
635
676
|
name: 'Evasion Abilities Clause',
|
|
@@ -639,6 +680,15 @@ exports.Rulesets = {
|
|
|
639
680
|
this.add('rule', 'Evasion Abilities Clause: Evasion abilities are banned');
|
|
640
681
|
},
|
|
641
682
|
},
|
|
683
|
+
evasionitemsclause: {
|
|
684
|
+
effectType: 'ValidatorRule',
|
|
685
|
+
name: 'Evasion Items Clause',
|
|
686
|
+
desc: "Bans moves that lower the accuracy of moves used against the user",
|
|
687
|
+
banlist: ['Bright Powder', 'Lax Incense'],
|
|
688
|
+
onBegin() {
|
|
689
|
+
this.add('rule', 'Evasion Items Clause: Evasion items are banned');
|
|
690
|
+
},
|
|
691
|
+
},
|
|
642
692
|
evasionmovesclause: {
|
|
643
693
|
effectType: 'ValidatorRule',
|
|
644
694
|
name: 'Evasion Moves Clause',
|
|
@@ -1288,6 +1338,21 @@ exports.Rulesets = {
|
|
|
1288
1338
|
}
|
|
1289
1339
|
},
|
|
1290
1340
|
},
|
|
1341
|
+
gemsclause: {
|
|
1342
|
+
effectType: 'ValidatorRule',
|
|
1343
|
+
name: 'Gems Clause',
|
|
1344
|
+
desc: "Bans all Gems",
|
|
1345
|
+
onValidateSet(set) {
|
|
1346
|
+
if (!set.item)
|
|
1347
|
+
return;
|
|
1348
|
+
const item = this.dex.items.get(set.item);
|
|
1349
|
+
if (item.isGem) {
|
|
1350
|
+
if (this.ruleTable.has(`+item:${item.id}`))
|
|
1351
|
+
return;
|
|
1352
|
+
return [`${item.name} is banned due to Gems Clause.`];
|
|
1353
|
+
}
|
|
1354
|
+
},
|
|
1355
|
+
},
|
|
1291
1356
|
'sketchgen8moves': {
|
|
1292
1357
|
effectType: 'ValidatorRule',
|
|
1293
1358
|
name: 'Sketch Gen 8 Moves',
|
|
@@ -1869,8 +1934,7 @@ exports.Rulesets = {
|
|
|
1869
1934
|
reevolutionmod: {
|
|
1870
1935
|
effectType: "Rule",
|
|
1871
1936
|
name: "Re-Evolution Mod",
|
|
1872
|
-
desc: "Pokémon gain the
|
|
1873
|
-
ruleset: ['Overflow Stat Mod'],
|
|
1937
|
+
desc: "Pokémon gain the stat changes they would gain from evolving again.",
|
|
1874
1938
|
onBegin() {
|
|
1875
1939
|
this.add('rule', 'Re-Evolution Mod: Pok\u00e9mon gain the boosts they would gain from evolving again');
|
|
1876
1940
|
},
|
|
@@ -1889,5 +1953,208 @@ exports.Rulesets = {
|
|
|
1889
1953
|
return newSpecies;
|
|
1890
1954
|
},
|
|
1891
1955
|
},
|
|
1956
|
+
brokenrecordmod: {
|
|
1957
|
+
effectType: "Rule",
|
|
1958
|
+
name: "Broken Record Mod",
|
|
1959
|
+
desc: `Pokémon can hold a TR to use that move in battle.`,
|
|
1960
|
+
onValidateSet(set) {
|
|
1961
|
+
if (!set.item)
|
|
1962
|
+
return;
|
|
1963
|
+
const item = this.dex.items.get(set.item);
|
|
1964
|
+
if (!/^tr\d\d/i.test(item.name))
|
|
1965
|
+
return;
|
|
1966
|
+
const moveName = item.desc.split('move ')[1].split('.')[0];
|
|
1967
|
+
if (set.moves.map(this.toID).includes(this.toID(moveName))) {
|
|
1968
|
+
return [
|
|
1969
|
+
`${set.species} can't run ${item.name} (${moveName}) as its item because it already has that move in its moveset.`,
|
|
1970
|
+
];
|
|
1971
|
+
}
|
|
1972
|
+
},
|
|
1973
|
+
onValidateTeam(team) {
|
|
1974
|
+
const trs = new Set();
|
|
1975
|
+
for (const set of team) {
|
|
1976
|
+
if (!set.item)
|
|
1977
|
+
continue;
|
|
1978
|
+
const item = this.dex.items.get(set.item).name;
|
|
1979
|
+
if (!/^tr\d\d/i.test(item))
|
|
1980
|
+
continue;
|
|
1981
|
+
if (trs.has(item)) {
|
|
1982
|
+
return [`Your team already has a Pok\u00e9mon with ${item}.`];
|
|
1983
|
+
}
|
|
1984
|
+
trs.add(item);
|
|
1985
|
+
}
|
|
1986
|
+
},
|
|
1987
|
+
onTakeItem(item) {
|
|
1988
|
+
return !/^tr\d\d/i.test(item.name);
|
|
1989
|
+
},
|
|
1990
|
+
onModifyMove(move) {
|
|
1991
|
+
if (move.id === 'knockoff') {
|
|
1992
|
+
move.onBasePower = function (basePower, source, target, m) {
|
|
1993
|
+
const item = target.getItem();
|
|
1994
|
+
if (!this.singleEvent('TakeItem', item, target.itemState, target, target, m, item))
|
|
1995
|
+
return;
|
|
1996
|
+
// Very hardcode but I'd prefer to not make a mod for one damage calculation change
|
|
1997
|
+
if (item.id && !/^tr\d\d/i.test(item.id)) {
|
|
1998
|
+
return this.chainModify(1.5);
|
|
1999
|
+
}
|
|
2000
|
+
};
|
|
2001
|
+
}
|
|
2002
|
+
else if (move.id === 'fling') {
|
|
2003
|
+
move.onPrepareHit = function (target, source, m) {
|
|
2004
|
+
if (source.ignoringItem())
|
|
2005
|
+
return false;
|
|
2006
|
+
const item = source.getItem();
|
|
2007
|
+
if (!this.singleEvent('TakeItem', item, source.itemState, source, source, m, item))
|
|
2008
|
+
return false;
|
|
2009
|
+
if (!item.fling)
|
|
2010
|
+
return false;
|
|
2011
|
+
if (/^tr\d\d/i.test(item.id))
|
|
2012
|
+
return false;
|
|
2013
|
+
m.basePower = item.fling.basePower;
|
|
2014
|
+
if (item.isBerry) {
|
|
2015
|
+
m.onHit = function (foe) {
|
|
2016
|
+
if (this.singleEvent('Eat', item, null, foe, null, null)) {
|
|
2017
|
+
this.runEvent('EatItem', foe, null, null, item);
|
|
2018
|
+
if (item.id === 'leppaberry')
|
|
2019
|
+
foe.staleness = 'external';
|
|
2020
|
+
}
|
|
2021
|
+
if (item.onEat)
|
|
2022
|
+
foe.ateBerry = true;
|
|
2023
|
+
};
|
|
2024
|
+
}
|
|
2025
|
+
else if (item.fling.effect) {
|
|
2026
|
+
m.onHit = item.fling.effect;
|
|
2027
|
+
}
|
|
2028
|
+
else {
|
|
2029
|
+
if (!m.secondaries)
|
|
2030
|
+
m.secondaries = [];
|
|
2031
|
+
if (item.fling.status) {
|
|
2032
|
+
m.secondaries.push({ status: item.fling.status });
|
|
2033
|
+
}
|
|
2034
|
+
else if (item.fling.volatileStatus) {
|
|
2035
|
+
m.secondaries.push({ volatileStatus: item.fling.volatileStatus });
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
source.addVolatile('fling');
|
|
2039
|
+
};
|
|
2040
|
+
}
|
|
2041
|
+
},
|
|
2042
|
+
onBegin() {
|
|
2043
|
+
for (const pokemon of this.getAllPokemon()) {
|
|
2044
|
+
const item = pokemon.getItem();
|
|
2045
|
+
if (/^tr\d\d/i.test(item.name)) {
|
|
2046
|
+
const move = this.dex.moves.get(item.desc.split('move ')[1].split('.')[0]);
|
|
2047
|
+
pokemon.moveSlots = pokemon.baseMoveSlots = [
|
|
2048
|
+
...pokemon.baseMoveSlots, {
|
|
2049
|
+
id: move.id,
|
|
2050
|
+
move: move.name,
|
|
2051
|
+
pp: move.pp * 8 / 5,
|
|
2052
|
+
maxpp: move.pp * 8 / 5,
|
|
2053
|
+
target: move.target,
|
|
2054
|
+
disabled: false,
|
|
2055
|
+
disabledSource: '',
|
|
2056
|
+
used: false,
|
|
2057
|
+
},
|
|
2058
|
+
];
|
|
2059
|
+
}
|
|
2060
|
+
}
|
|
2061
|
+
},
|
|
2062
|
+
},
|
|
2063
|
+
categoryswapmod: {
|
|
2064
|
+
effectType: 'Rule',
|
|
2065
|
+
name: 'Category Swap Mod',
|
|
2066
|
+
desc: `All physical moves become special, and all special moves become physical.`,
|
|
2067
|
+
onBegin() {
|
|
2068
|
+
this.add('rule', 'Category Swap Mod: All physical moves become special, and vice versa');
|
|
2069
|
+
},
|
|
2070
|
+
onModifyMove(move, pokemon, target) {
|
|
2071
|
+
if (move.category === "Status")
|
|
2072
|
+
return;
|
|
2073
|
+
if (move.category === "Physical") {
|
|
2074
|
+
move.category = "Special";
|
|
2075
|
+
}
|
|
2076
|
+
else if (move.category === "Special") {
|
|
2077
|
+
move.category = "Physical";
|
|
2078
|
+
}
|
|
2079
|
+
switch (move.id) {
|
|
2080
|
+
case 'doomdesire': {
|
|
2081
|
+
move.onTry = function (source, subtarget) {
|
|
2082
|
+
if (!subtarget.side.addSlotCondition(subtarget, 'futuremove'))
|
|
2083
|
+
return false;
|
|
2084
|
+
Object.assign(subtarget.side.slotConditions[subtarget.position]['futuremove'], {
|
|
2085
|
+
move: 'doomdesire',
|
|
2086
|
+
source: source,
|
|
2087
|
+
moveData: {
|
|
2088
|
+
id: 'doomdesire',
|
|
2089
|
+
name: "Doom Desire",
|
|
2090
|
+
accuracy: 100,
|
|
2091
|
+
basePower: 140,
|
|
2092
|
+
category: "Physical",
|
|
2093
|
+
priority: 0,
|
|
2094
|
+
flags: {},
|
|
2095
|
+
effectType: 'Move',
|
|
2096
|
+
isFutureMove: true,
|
|
2097
|
+
type: 'Steel',
|
|
2098
|
+
},
|
|
2099
|
+
});
|
|
2100
|
+
this.add('-start', source, 'Doom Desire');
|
|
2101
|
+
return this.NOT_FAIL;
|
|
2102
|
+
};
|
|
2103
|
+
break;
|
|
2104
|
+
}
|
|
2105
|
+
case 'futuresight': {
|
|
2106
|
+
move.onTry = function (source, subtarget) {
|
|
2107
|
+
if (!subtarget.side.addSlotCondition(subtarget, 'futuremove'))
|
|
2108
|
+
return false;
|
|
2109
|
+
Object.assign(subtarget.side.slotConditions[subtarget.position]['futuremove'], {
|
|
2110
|
+
duration: 3,
|
|
2111
|
+
move: 'futuresight',
|
|
2112
|
+
source: source,
|
|
2113
|
+
moveData: {
|
|
2114
|
+
id: 'futuresight',
|
|
2115
|
+
name: "Future Sight",
|
|
2116
|
+
accuracy: 100,
|
|
2117
|
+
basePower: 120,
|
|
2118
|
+
category: "Physical",
|
|
2119
|
+
priority: 0,
|
|
2120
|
+
flags: {},
|
|
2121
|
+
ignoreImmunity: false,
|
|
2122
|
+
effectType: 'Move',
|
|
2123
|
+
isFutureMove: true,
|
|
2124
|
+
type: 'Psychic',
|
|
2125
|
+
},
|
|
2126
|
+
});
|
|
2127
|
+
this.add('-start', source, 'move: Future Sight');
|
|
2128
|
+
return this.NOT_FAIL;
|
|
2129
|
+
};
|
|
2130
|
+
break;
|
|
2131
|
+
}
|
|
2132
|
+
// Moves with dynamic categories will always be physical if not special-cased
|
|
2133
|
+
case 'lightthatburnsthesky':
|
|
2134
|
+
case 'photongeyser': {
|
|
2135
|
+
move.category = 'Special';
|
|
2136
|
+
if (pokemon.getStat('atk', false, true) > pokemon.getStat('spa', false, true))
|
|
2137
|
+
move.category = 'Physical';
|
|
2138
|
+
break;
|
|
2139
|
+
}
|
|
2140
|
+
case 'shellsidearm': {
|
|
2141
|
+
if (!target)
|
|
2142
|
+
return;
|
|
2143
|
+
move.category = 'Special';
|
|
2144
|
+
const atk = pokemon.getStat('atk', false, true);
|
|
2145
|
+
const spa = pokemon.getStat('spa', false, true);
|
|
2146
|
+
const def = target.getStat('def', false, true);
|
|
2147
|
+
const spd = target.getStat('spd', false, true);
|
|
2148
|
+
const physical = Math.floor(Math.floor(Math.floor(Math.floor(2 * pokemon.level / 5 + 2) * 90 * atk) / def) / 50);
|
|
2149
|
+
const special = Math.floor(Math.floor(Math.floor(Math.floor(2 * pokemon.level / 5 + 2) * 90 * spa) / spd) / 50);
|
|
2150
|
+
if (physical > special || (physical === special && this.random(2) === 0)) {
|
|
2151
|
+
move.category = 'Physical';
|
|
2152
|
+
move.flags.contact = 1;
|
|
2153
|
+
}
|
|
2154
|
+
break;
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
},
|
|
2158
|
+
},
|
|
1892
2159
|
};
|
|
1893
2160
|
//# sourceMappingURL=rulesets.js.map
|