Merge branch 'master' into booster-energy

This commit is contained in:
André Bastos Dias 2026-01-04 13:57:13 +00:00 committed by GitHub
commit b9e5f8f7f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
137 changed files with 26867 additions and 17467 deletions

File diff suppressed because it is too large Load Diff

View File

@ -108,6 +108,7 @@ export const Aliases: import('../sim/dex').AliasesTable = {
megacharizardy: "Charizard-Mega-Y",
yard: "Charizard-Mega-Y",
zardy: "Charizard-Mega-Y",
megacruci: "Crucibelle-Mega",
mdia: "Diancie-Mega",
floetteeternalmega: "Floette-Mega",
megafloetteeternal: "Floette-Mega",
@ -126,6 +127,7 @@ export const Aliases: import('../sim/dex').AliasesTable = {
megamaw: "Mawile-Mega",
mmedi: "Medicham-Mega",
megamedi: "Medicham-Mega",
meowsticmega: "Meowstic-M-Mega",
mmx: "Mewtwo-Mega-X",
megamewtwox: "Mewtwo-Mega-X",
mewtwox: "Mewtwo-Mega-X",
@ -136,6 +138,7 @@ export const Aliases: import('../sim/dex').AliasesTable = {
megashark: "Sharpedo-Mega",
mbro: "Slowbro-Mega",
megabro: "Slowbro-Mega",
tatsugirimega: "Tatsugiri-Curly-Mega",
megasaur: "Venusaur-Mega",
megazygardecomplete: "Zygarde-Mega",
zygardecompletemega: "Zygarde-Mega",
@ -723,8 +726,6 @@ export const Aliases: import('../sim/dex').AliasesTable = {
sawsbuckautumn: "Sawsbuck",
sawsbuckwinter: "Sawsbuck",
tatsugiricurly: "Tatsugiri",
tatsugiridroopy: "Tatsugiri",
tatsugiristretchy: "Tatsugiri",
unowna: "Unown",
unownb: "Unown",
unownc: "Unown",
@ -2557,7 +2558,6 @@ export const Aliases: import('../sim/dex').AliasesTable = {
krilo: "Krilowatt",
libra: "Equilibra",
mala: "Malaconda",
megacruci: "Crucibelle-Mega",
navi: "Naviathan",
nect: "Necturna",
ohmagod: "Plasmanta",

View File

@ -259,6 +259,14 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
raichumegax: {
isNonstandard: "Future",
tier: "Illegal",
},
raichumegay: {
isNonstandard: "Future",
tier: "Illegal",
},
sandshrew: {
tier: "LC",
},
@ -488,7 +496,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "RU",
},
politoed: {
tier: "NUBL",
tier: "RU",
doublesTier: "DUU",
natDexTier: "RU",
},
@ -552,7 +560,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tentacruel: {
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
geodude: {
tier: "LC",
@ -610,7 +618,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
slowbromega: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "UU",
natDexTier: "RUBL",
},
slowbrogalar: {
tier: "NU",
@ -620,7 +628,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
slowking: {
tier: "UU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
slowkinggalar: {
tier: "OU",
@ -638,7 +646,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
magnezone: {
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "UU",
natDexTier: "RU",
},
farfetchd: {
isNonstandard: "Past",
@ -860,14 +868,14 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
chansey: {
tier: "RU",
tier: "NU",
doublesTier: "NFE",
natDexTier: "UU",
},
blissey: {
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
tangela: {
isNonstandard: "Past",
@ -950,7 +958,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "NFE",
},
scizor: {
tier: "OU",
tier: "UU",
doublesTier: "(DUU)",
natDexTier: "UU",
},
@ -1080,7 +1088,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "RU",
},
espeon: {
tier: "PU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -1113,7 +1121,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "NFE",
},
porygonz: {
tier: "NUBL",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "UU",
},
@ -1470,7 +1478,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
dudunsparce: {
tier: "PU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -1520,7 +1528,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
heracrossmega: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "RUBL",
natDexTier: "UU",
},
sneasel: {
tier: "NFE",
@ -1674,7 +1682,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "RU",
},
suicune: {
tier: "NUBL",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -1685,7 +1693,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
tyranitar: {
tier: "UU",
tier: "OU",
doublesTier: "DOU",
natDexTier: "UU",
},
@ -1755,7 +1763,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
swampertmega: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "RU",
natDexTier: "UU",
},
poochyena: {
tier: "LC",
@ -1869,7 +1877,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
gardevoirmega: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "UU",
natDexTier: "RUBL",
},
gallade: {
tier: "RU",
@ -1893,7 +1901,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
breloom: {
tier: "NU",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -2293,6 +2301,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
chimechomega: {
isNonstandard: "Future",
tier: "Illegal",
},
absol: {
isNonstandard: "Past",
tier: "Illegal",
@ -2303,6 +2315,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "RU",
},
absolmegaz: {
isNonstandard: "Future",
tier: "Illegal",
},
snorunt: {
tier: "LC",
},
@ -2374,7 +2390,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
salamence: {
tier: "RUBL",
doublesTier: "(DUU)",
natDexTier: "UU",
natDexTier: "RUBL",
},
salamencemega: {
isNonstandard: "Past",
@ -2494,7 +2510,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
torterra: {
tier: "PUBL",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -2518,7 +2534,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
empoleon: {
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
starly: {
tier: "LC",
@ -2531,6 +2547,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
staraptormega: {
isNonstandard: "Future",
tier: "Illegal",
},
bidoof: {
isNonstandard: "Past",
tier: "Illegal",
@ -2618,7 +2638,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
floatzel: {
tier: "ZUBL",
tier: "PU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -2719,6 +2739,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "(OU)",
},
garchompmegaz: {
isNonstandard: "Future",
tier: "Illegal",
},
riolu: {
tier: "LC",
},
@ -2732,11 +2756,15 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "Uber",
},
lucariomegaz: {
isNonstandard: "Future",
tier: "Illegal",
},
hippopotas: {
tier: "LC",
},
hippowdon: {
tier: "RU",
tier: "UU",
doublesTier: "DUU",
natDexTier: "UU",
},
@ -2754,7 +2782,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
toxicroak: {
tier: "NU",
tier: "ZU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -2854,6 +2882,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "DUU",
natDexTier: "OU",
},
heatranmega: {
isNonstandard: "Future",
tier: "Illegal",
},
regigigas: {
tier: "ZU",
doublesTier: "(DUU)",
@ -2889,6 +2921,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "DUber",
natDexTier: "Uber",
},
darkraimega: {
isNonstandard: "Future",
tier: "Illegal",
},
shaymin: {
tier: "ZU",
doublesTier: "(DUU)",
@ -3179,7 +3215,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "RU",
},
lilliganthisui: {
tier: "RU",
tier: "RUBL",
doublesTier: "(DUU)",
natDexTier: "RUBL",
},
@ -3363,7 +3399,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
reuniclus: {
tier: "RU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -3419,7 +3455,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
amoonguss: {
tier: "PU",
doublesTier: "DOU",
natDexTier: "RU",
natDexTier: "UU",
},
frillish: {
isNonstandard: "Past",
@ -3440,7 +3476,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
galvantula: {
tier: "NU",
tier: "PU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -3557,7 +3593,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
mienshao: {
tier: "NUBL",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RUBL",
},
@ -3574,6 +3610,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
golurkmega: {
isNonstandard: "Future",
tier: "Illegal",
},
pawniard: {
tier: "LC",
},
@ -3591,7 +3631,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
braviary: {
tier: "ZU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -3606,7 +3646,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
mandibuzz: {
tier: "UU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
heatmor: {
isNonstandard: "Past",
@ -3660,12 +3700,12 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tornadustherian: {
tier: "OU",
doublesTier: "(DUU)",
natDexTier: "UUBL",
natDexTier: "OU",
},
thundurus: {
tier: "RUBL",
doublesTier: "DUU",
natDexTier: "RUBL",
natDexTier: "UU",
},
thundurustherian: {
tier: "UU",
@ -3694,7 +3734,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
},
kyurem: {
tier: "OU",
doublesTier: "DUU",
doublesTier: "DOU",
natDexTier: "OU",
},
kyuremblack: {
@ -3809,7 +3849,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
},
talonflame: {
tier: "RU",
doublesTier: "DUU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
scatterbug: {
@ -3885,6 +3925,14 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
meowsticmmega: {
isNonstandard: "Future",
tier: "Illegal",
},
meowsticfmega: {
isNonstandard: "Future",
tier: "Illegal",
},
honedge: {
isNonstandard: "Past",
tier: "Illegal",
@ -4028,7 +4076,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
goodra: {
tier: "PU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -4192,8 +4240,8 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
},
primarina: {
tier: "OU",
doublesTier: "DUU",
natDexTier: "RU",
doublesTier: "DOU",
natDexTier: "UU",
},
pikipek: {
tier: "LC",
@ -4241,6 +4289,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
crabominablemega: {
isNonstandard: "Future",
tier: "Illegal",
},
oricorio: {
tier: "ZU",
doublesTier: "(DUU)",
@ -4265,7 +4317,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "NFE",
},
ribombee: {
tier: "NU",
tier: "RU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -4408,7 +4460,11 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
golisopod: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "RU",
natDexTier: "UU",
},
golisopodmega: {
isNonstandard: "Future",
tier: "Illegal",
},
sandygast: {
tier: "LC",
@ -4653,7 +4709,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
kartana: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "OU",
natDexTier: "UUBL",
},
guzzlord: {
isNonstandard: "Past",
@ -4685,6 +4741,14 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "DUber",
natDexTier: "Uber",
},
magearnamega: {
isNonstandard: "Future",
tier: "Illegal",
},
magearnaoriginalmega: {
isNonstandard: "Future",
tier: "Illegal",
},
marshadow: {
isNonstandard: "Past",
tier: "Illegal",
@ -4713,7 +4777,11 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
zeraora: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "UU",
natDexTier: "RU",
},
zeraoramega: {
isNonstandard: "Future",
tier: "Illegal",
},
meltan: {
isNonstandard: "Past",
@ -4733,7 +4801,9 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
thwackey: {
tier: "NFE",
tier: "NU",
doublesTier: "NFE",
natDexTier: "NFE",
},
rillaboom: {
tier: "OU",
@ -5040,7 +5110,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
frosmoth: {
tier: "PU",
tier: "PUBL",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -5172,7 +5242,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
},
zarude: {
tier: "UU",
tier: "UUBL",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -5213,7 +5283,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
},
enamorus: {
tier: "OU",
doublesTier: "(DUU)",
doublesTier: "DUU",
natDexTier: "RUBL",
},
enamorustherian: {
@ -5281,7 +5351,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
lokix: {
tier: "UU",
doublesTier: "(DUU)",
natDexTier: "RU",
natDexTier: "UU",
},
rellor: {
tier: "LC",
@ -5352,6 +5422,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
scovillainmega: {
isNonstandard: "Future",
tier: "Illegal",
},
tadbulb: {
tier: "LC",
},
@ -5400,11 +5474,27 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "DUU",
natDexTier: "Uber",
},
baxcaliburmega: {
isNonstandard: "Future",
tier: "Illegal",
},
tatsugiri: {
tier: "PU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
tatsugiricurlymega: {
isNonstandard: "Future",
tier: "Illegal",
},
tatsugiridroopymega: {
isNonstandard: "Future",
tier: "Illegal",
},
tatsugiristretchymega: {
isNonstandard: "Future",
tier: "Illegal",
},
cyclizar: {
tier: "RU",
doublesTier: "(DUU)",
@ -5466,13 +5556,17 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
glimmora: {
tier: "OU",
doublesTier: "DOU",
natDexTier: "UU",
natDexTier: "RU",
},
glimmoramega: {
isNonstandard: "Future",
tier: "Illegal",
},
shroodle: {
tier: "LC",
},
grafaiai: {
tier: "ZU",
tier: "NU",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -5517,7 +5611,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
natDexTier: "OU",
},
brutebonnet: {
tier: "PU",
tier: "ZU",
doublesTier: "DUU",
natDexTier: "RU",
},
@ -5554,7 +5648,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
ironmoth: {
tier: "OU",
doublesTier: "(DUU)",
natDexTier: "UU",
natDexTier: "UUBL",
},
ironhands: {
tier: "UUBL",

View File

@ -47,6 +47,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 6,
isNonstandard: "Past",
},
absolitez: {
name: "Absolite Z",
spritenum: 576,
megaStone: "Absol-Mega-Z",
megaEvolves: "Absol",
itemUser: ["Absol"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2588,
gen: 9,
isNonstandard: "Future",
},
absorbbulb: {
name: "Absorb Bulb",
spritenum: 2,
@ -408,6 +422,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 9,
isNonstandard: "Future",
},
baxcalibrite: {
name: "Baxcalibrite",
spritenum: 0,
megaStone: "Baxcalibur-Mega",
megaEvolves: "Baxcalibur",
itemUser: ["Baxcalibur"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2601,
gen: 9,
isNonstandard: "Future",
},
beastball: {
name: "Beast Ball",
spritenum: 661,
@ -938,6 +966,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 5,
isNonstandard: "Past",
},
chimechite: {
name: "Chimechite",
spritenum: 0,
megaStone: "Chimecho-Mega",
megaEvolves: "Chimecho",
itemUser: ["Chimecho"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2587,
gen: 9,
isNonstandard: "Future",
},
chippedpot: {
name: "Chipped Pot",
spritenum: 720,
@ -1204,6 +1246,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 1885,
gen: 9,
},
crabominite: {
name: "Crabominite",
spritenum: 0,
megaStone: "Crabominable-Mega",
megaEvolves: "Crabominable",
itemUser: ["Crabominable"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2595,
gen: 9,
isNonstandard: "Future",
},
crackedpot: {
name: "Cracked Pot",
spritenum: 719,
@ -1289,6 +1345,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 7,
isNonstandard: "Past",
},
darkranite: {
name: "Darkranite",
spritenum: 0,
megaStone: "Darkrai-Mega",
megaEvolves: "Darkrai",
itemUser: ["Darkrai"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2593,
gen: 9,
isNonstandard: "Future",
},
dawnstone: {
name: "Dawn Stone",
spritenum: 92,
@ -2406,6 +2476,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 6,
isNonstandard: "Past",
},
garchompitez: {
name: "Garchompite Z",
spritenum: 573,
megaStone: "Garchomp-Mega-Z",
megaEvolves: "Garchomp",
itemUser: ["Garchomp"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2590,
gen: 9,
isNonstandard: "Future",
},
gardevoirite: {
name: "Gardevoirite",
spritenum: 587,
@ -2490,6 +2574,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 6,
isNonstandard: "Past",
},
glimmoranite: {
name: "Glimmoranite",
spritenum: 0,
megaStone: "Glimmora-Mega",
megaEvolves: "Glimmora",
itemUser: ["Glimmora"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2600,
gen: 9,
isNonstandard: "Future",
},
goldbottlecap: {
name: "Gold Bottle Cap",
spritenum: 697,
@ -2499,6 +2597,34 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 796,
gen: 7,
},
golisopite: {
name: "Golisopite",
spritenum: 0,
megaStone: "Golisopod-Mega",
megaEvolves: "Golisopod",
itemUser: ["Golisopod"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2596,
gen: 9,
isNonstandard: "Future",
},
golurkite: {
name: "Golurkite",
spritenum: 0,
megaStone: "Golurk-Mega",
megaEvolves: "Golurk",
itemUser: ["Golurk"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2594,
gen: 9,
isNonstandard: "Future",
},
grassgem: {
name: "Grass Gem",
spritenum: 172,
@ -2781,6 +2907,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 2408,
gen: 9,
},
heatranite: {
name: "Heatranite",
spritenum: 0,
megaStone: "Heatran-Mega",
megaEvolves: "Heatran",
itemUser: ["Heatran"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2592,
gen: 9,
isNonstandard: "Future",
},
heatrock: {
name: "Heat Rock",
spritenum: 193,
@ -3463,6 +3603,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 6,
isNonstandard: "Past",
},
lucarionitez: {
name: "Lucarionite Z",
spritenum: 594,
megaStone: "Lucario-Mega-Z",
megaEvolves: "Lucario",
itemUser: ["Lucario"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2591,
gen: 9,
isNonstandard: "Future",
},
luckypunch: {
name: "Lucky Punch",
spritenum: 261,
@ -3606,6 +3760,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 3,
isNonstandard: "Past",
},
magearnite: {
name: "Magearnite",
spritenum: 0,
megaStone: ["Magearna-Mega", "Magearna-Original-Mega"],
megaEvolves: ["Magearna", "Magearna-Original"],
itemUser: ["Magearna", "Magearna-Original"],
onTakeItem(item, source) {
if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false;
return true;
},
num: 2597,
gen: 9,
isNonstandard: "Future",
},
magmarizer: {
name: "Magmarizer",
spritenum: 272,
@ -3863,6 +4031,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 219,
gen: 3,
},
meowsticite: {
name: "Meowsticite",
spritenum: 0,
megaStone: ["Meowstic-M-Mega", "Meowstic-F-Mega"],
megaEvolves: ["Meowstic", "Meowstic-F"],
itemUser: ["Meowstic", "Meowstic-F"],
onTakeItem(item, source) {
if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false;
return true;
},
num: 2594,
gen: 9,
isNonstandard: "Future",
},
metagrossite: {
name: "Metagrossite",
spritenum: 618,
@ -4967,6 +5149,36 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 3,
isNonstandard: "Past",
},
raichunitex: {
name: "Raichunite X",
spritenum: 0,
megaStone: "Raichu-Mega-X",
megaEvolves: "Raichu",
itemUser: ["Raichu"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.name ||
item.megaStone === source.baseSpecies.name) return false;
return true;
},
num: 2585,
gen: 9,
isNonstandard: "Future",
},
raichunitey: {
name: "Raichunite Y",
spritenum: 0,
megaStone: "Raichu-Mega-Y",
megaEvolves: "Raichu",
itemUser: ["Raichu"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.name ||
item.megaStone === source.baseSpecies.name) return false;
return true;
},
num: 2586,
gen: 9,
isNonstandard: "Future",
},
rarebone: {
name: "Rare Bone",
spritenum: 379,
@ -5484,6 +5696,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 232,
gen: 2,
},
scovillainite: {
name: "Scovillainite",
spritenum: 0,
megaStone: "Scovillain-Mega",
megaEvolves: "Scovillain",
itemUser: ["Scovillain"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2599,
gen: 9,
isNonstandard: "Future",
},
scraftinite: {
name: "Scraftinite",
spritenum: 555,
@ -5891,6 +6117,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
gen: 2,
isPokeball: true,
},
staraptite: {
name: "Staraptite",
spritenum: 0,
megaStone: "Staraptor-Mega",
megaEvolves: "Staraptor",
itemUser: ["Staraptor"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2589,
gen: 9,
isNonstandard: "Future",
},
starfberry: {
name: "Starf Berry",
spritenum: 472,
@ -6174,6 +6414,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 1117,
gen: 8,
},
tatsugirinite: {
name: "Tatsugirinite",
spritenum: 0,
megaStone: ["Tatsugiri-Curly-Mega", "Tatsugiri-Droopy-Mega", "Tatsugiri-Stretchy-Mega"],
megaEvolves: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"],
itemUser: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"],
onTakeItem(item, source) {
if (item.megaEvolves!.includes(source.baseSpecies.baseSpecies)) return false;
return true;
},
num: 2601,
gen: 9,
isNonstandard: "Future",
},
terrainextender: {
name: "Terrain Extender",
spritenum: 662,
@ -7710,6 +7964,20 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
num: 300,
gen: 4,
},
zeraorite: {
name: "Zeraorite",
spritenum: 0,
megaStone: "Zeraora-Mega",
megaEvolves: "Zeraora",
itemUser: ["Zeraora"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
num: 2598,
gen: 9,
isNonstandard: "Future",
},
zoomlens: {
name: "Zoom Lens",
spritenum: 574,
@ -7733,7 +8001,7 @@ export const Items: import('../sim/dex-items').ItemDataTable = {
megaEvolves: "Zygarde-Complete",
itemUser: ["Zygarde-Complete"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
if (source.baseSpecies.baseSpecies === 'Zygarde') return false;
return true;
},
num: 2584,

View File

@ -23086,6 +23086,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
{generation: 8, level: 70, shiny: 1, moves: ["psychic", "disable", "recover", "blizzard"]},
{generation: 8, level: 70, shiny: 1, isHidden: true, moves: ['mist', 'guardswap', 'powerswap', 'psychic'], source: "gen8bdsp"},
{generation: 9, level: 100, nature: "Modest", perfectIVs: 6, isHidden: true, moves: ["psystrike", "aurasphere", "icebeam", "calmmind"]},
{generation: 9, level: 70, moves: ["psychic", "aurasphere", "psychocut", "amnesia"], source: "gen9legends"},
],
encounters: [
{generation: 1, level: 70},
@ -23497,7 +23498,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
{generation: 7, level: 5, perfectIVs: 5, moves: ["pound"], pokeball: "pokeball"},
{generation: 7, level: 50, moves: ["psychic", "barrier", "metronome", "transform"], pokeball: "cherishball"},
{generation: 8, level: 1, moves: ["pound"], pokeball: "pokeball"},
{generation: 8, level: 1, moves: ['pound', 'reflecttype'], source: "gen8bdsp"},
{generation: 8, level: 1, moves: ['pound', 'reflecttype'], pokeball: "pokeball", source: "gen8bdsp"},
{generation: 9, level: 5, moves: ["pollenpuff", "darkpulse", "dragonpulse", "thunderbolt", "dazzlinggleam", "aurasphere", "flamethrower", "airslash", "shadowball", "energyball", "earthpower", "icebeam", "hypervoice", "sludgebomb", "psyshock", "powergem", "flashcannon", "surf", "swift", "lightscreen", "lifedew"], pokeball: "pokeball"},
],
eventOnly: true,
@ -46634,7 +46635,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
{generation: 6, level: 100, moves: ["wish", "confusion", "rest"], pokeball: "cherishball"},
{generation: 7, level: 15, moves: ["swift", "wish", "healingwish", "rest"], pokeball: "cherishball"},
{generation: 8, level: 70, nature: "Timid", moves: ["meteormash", "psychic", "rest", "wish"], pokeball: "cherishball"},
{generation: 8, level: 5, moves: ['confusion', 'wish'], source: "gen8bdsp"},
{generation: 8, level: 5, moves: ['confusion', 'wish'], pokeball: "pokeball", source: "gen8bdsp"},
],
eventOnly: true,
},
@ -69513,7 +69514,7 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
worryseed: ["7T"],
},
eventData: [
{generation: 9, level: 72, nature: "Modest", moves: ["lightofruin", "energyball", "gigadrain", "synthesis"], source: "gen9legends"},
{generation: 9, level: 72, nature: "Modest", moves: ["lightofruin", "energyball", "gigadrain", "synthesis"], pokeball: "pokeball", source: "gen9legends"},
],
eventOnly: true,
},
@ -99529,7 +99530,6 @@ export const Learnsets: import('../sim/dex-species').LearnsetDataTable = {
dazzlinggleam: ["9M"],
doubleedge: ["9M", "9L60"],
earthquake: ["9M"],
encore: ["9M"],
endure: ["9M"],
facade: ["9M"],
gigaimpact: ["9M"],

View File

@ -0,0 +1,206 @@
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
magician: {
inherit: true,
onAfterMoveSecondarySelf(source, target, move) {
if (!move || source.switchFlag === true || !move.hitTargets || source.item || source.volatiles['gem'] ||
move.id === 'fling' || move.category === 'Status') return;
const hitTargets = move.hitTargets;
this.speedSort(hitTargets);
for (const pokemon of hitTargets) {
if (pokemon !== source) {
const yourItem = pokemon.takeItem(source);
if (!yourItem) continue;
if (!source.setItem(yourItem)) {
if (!this.dex.items.get(yourItem.id).exists) {
pokemon.setItem(yourItem.id);
continue;
}
pokemon.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
continue;
}
this.add('-item', source, yourItem, '[from] ability: Magician', `[of] ${pokemon}`);
return;
}
}
},
},
neutralizinggas: {
inherit: true,
onSwitchIn(pokemon) {
this.add('-ability', pokemon, 'Neutralizing Gas');
pokemon.abilityState.ending = false;
const strongWeathers = ['desolateland', 'primordialsea', 'deltastream'];
for (const target of this.getAllActive()) {
if (target.hasItem('Ability Shield')) {
this.add('-block', target, 'item: Ability Shield');
continue;
}
// Can't suppress a Tatsugiri inside of Dondozo already
if (target.volatiles['commanding']) {
continue;
}
if (target.illusion) {
this.singleEvent('End', this.dex.abilities.get('Illusion'), target.abilityState, target, pokemon, 'neutralizinggas');
}
if (target.volatiles['slowstart']) {
delete target.volatiles['slowstart'];
this.add('-end', target, 'Slow Start', '[silent]');
}
if (strongWeathers.includes(target.getAbility().id)) {
this.singleEvent('End', this.dex.abilities.get(target.getAbility().id), target.abilityState, target, pokemon, 'neutralizinggas');
}
if (!this.dex.abilities.get(target.ability).exists) {
const isItem = (target.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
target.removeVolatile('item:' + this.toID(target.m.scrambled.items[isItem].thing));
} else if ((target.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const isMove = (target.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
const indexOfMove = target.moveSlots.findIndex(m => this.toID(target.m.scrambled.moves[isMove].thing) === m.id);
if (indexOfMove >= 0) target.moveSlots.splice(indexOfMove, 1);
}
}
}
},
onEnd(source) {
if (source.transformed) return;
for (const pokemon of this.getAllActive()) {
if (pokemon !== source && pokemon.hasAbility('Neutralizing Gas')) {
return;
}
}
this.add('-end', source, 'ability: Neutralizing Gas');
// FIXME this happens before the pokemon switches out, should be the opposite order.
// Not an easy fix since we cant use a supported event. Would need some kind of special event that
// gathers events to run after the switch and then runs them when the ability is no longer accessible.
// (If you're tackling this, do note extreme weathers have the same issue)
// Mark this pokemon's ability as ending so Pokemon#ignoringAbility skips it
if (source.abilityState.ending) return;
source.abilityState.ending = true;
const sortedActive = this.getAllActive();
this.speedSort(sortedActive);
for (const pokemon of sortedActive) {
if (pokemon !== source) {
if (pokemon.getAbility().flags['cantsuppress']) continue; // does not interact with e.g Ice Face, Zen Mode
if (pokemon.hasItem('abilityshield')) continue; // don't restart abilities that weren't suppressed
// Will be suppressed by Pokemon#ignoringAbility if needed
this.singleEvent('Start', pokemon.getAbility(), pokemon.abilityState, pokemon);
if (pokemon.ability === "gluttony") {
pokemon.abilityState.gluttony = false;
}
}
if (!this.dex.abilities.get(pokemon.ability).exists) {
const isItem = (pokemon.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
pokemon.addVolatile('item:' + this.toID(pokemon.m.scrambled.items[isItem].thing));
} else if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const findMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
const findSlot = pokemon.baseMoveSlots.find(e => e.id === this.toID(pokemon.m.scrambled.moves[findMove].thing));
pokemon.moveSlots.push(this.dex.deepClone(findSlot));
}
}
}
},
},
pickpocket: {
inherit: true,
onAfterMoveSecondary(target, source, move) {
if (source && source !== target && move?.flags['contact']) {
if (target.item || target.switchFlag || target.forceSwitchFlag || source.switchFlag === true) {
return;
}
const yourItem = source.takeItem(target);
if (!yourItem) {
return;
}
if (!target.setItem(yourItem)) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
return;
}
source.item = yourItem.id;
return;
}
this.add('-enditem', source, yourItem, '[silent]', '[from] ability: Pickpocket', `[of] ${source}`);
this.add('-item', target, yourItem, '[from] ability: Pickpocket', `[of] ${source}`);
}
},
},
trace: {
inherit: true,
onStart(pokemon) {
this.effectState.seek = true;
// n.b. only affects Hackmons
// interaction with No Ability is complicated: https://www.smogon.com/forums/threads/pokemon-sun-moon-battle-mechanics-research.3586701/page-76#post-7790209
if (pokemon.adjacentFoes().some(foeActive => foeActive.ability === 'noability')) {
this.effectState.seek = false;
}
// interaction with Ability Shield is similar to No Ability
if (pokemon.hasItem('Ability Shield') && this.toID(pokemon.ability) === 'trace') {
this.add('-block', pokemon, 'item: Ability Shield');
this.effectState.seek = false;
}
if (this.effectState.seek) {
this.singleEvent('Update', this.effect, this.effectState, pokemon);
}
},
onUpdate(pokemon) {
if (!this.effectState.seek) return;
const possibleTargets = pokemon.adjacentFoes().filter(
target => !target.getAbility().flags['notrace'] && target.ability !== 'noability'
);
if (!possibleTargets.length) return;
const target = this.sample(possibleTargets);
const ability = target.getAbility();
if (this.toID(pokemon.item) === 'trace') {
this.add('-ability', pokemon, ability.name, 'Trace');
pokemon.setItem(ability.name);
return;
} else if (pokemon.volatiles['ability:trace']?.inSlot === 'Move') {
if (this.dex.abilities.get(ability.name).exists) {
pokemon.removeVolatile('ability:trace');
pokemon.m.scrambled.abilities.splice(
(pokemon.m.scrambled.abilities as { thing: string, inSlot: string }[]).findIndex(e =>
this.toID(e.thing) === 'trace' && e.inSlot === 'Move'), 1);
this.add('-ability', pokemon, ability.name, 'Trace');
pokemon.addVolatile(`ability:${ability.id}`);
pokemon.m.scrambled.abilities.push({ thing: ability.name, inSlot: 'Move' });
} else if (this.dex.items.get(ability.name).exists) {
pokemon.removeVolatile('ability:trace');
pokemon.m.scrambled.abilities.splice(
(pokemon.m.scrambled.abilities as { thing: string, inSlot: string }[]).findIndex(e =>
this.toID(e.thing) === 'trace' && e.inSlot === 'Move'), 1);
this.add('-ability', pokemon, ability.name, 'Trace');
pokemon.addVolatile(`item:${ability.id}`);
pokemon.m.scrambled.items.push({ thing: this.dex.items.get(ability.name).name, inSlot: 'Move' });
} else {
const move = this.dex.moves.get(ability.name);
if (move.exists) {
pokemon.removeVolatile('ability:trace');
pokemon.m.scrambled.abilities.splice(
(pokemon.m.scrambled.abilities as { thing: string, inSlot: string }[]).findIndex(e =>
this.toID(e.thing) === 'trace' && e.inSlot === 'Move'), 1);
this.add('-ability', pokemon, move.name, 'Trace');
const newMove = {
move: move.name,
id: move.id,
pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
target: move.target,
disabled: false,
used: false,
};
pokemon.baseMoveSlots.push(newMove);
pokemon.moveSlots.push(newMove);
}
}
return;
}
pokemon.setAbility(ability, target);
},
},
};

View File

@ -0,0 +1,44 @@
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
choicelock: {
inherit: true,
onBeforeMove(pokemon, target, move) {
const choiceItem = pokemon.getItem().isChoice ||
Object.keys(pokemon.volatiles).some(v => (
v.startsWith('item:') && this.dex.items.get(v.split(':')[1]).isChoice
));
if (!choiceItem) {
pokemon.removeVolatile('choicelock');
return;
}
if (
!pokemon.ignoringItem() && !pokemon.volatiles['dynamax'] &&
move.id !== this.effectState.move && move.id !== 'struggle'
) {
// Fails unless the Choice item is being ignored, and no PP is lost
this.addMove('move', pokemon, move.name);
this.attrLastMove('[still]');
this.debug("Disabled by Choice item lock");
this.add('-fail', pokemon);
return false;
}
},
onDisableMove(pokemon) {
const choiceItem = pokemon.getItem().isChoice ||
Object.keys(pokemon.volatiles).some(v => (
v.startsWith('item:') && this.dex.items.get(v.split(':')[1]).isChoice
));
if (!choiceItem || !pokemon.hasMove(this.effectState.move)) {
pokemon.removeVolatile('choicelock');
return;
}
if (pokemon.ignoringItem() || pokemon.volatiles['dynamax']) {
return;
}
for (const moveSlot of pokemon.moveSlots) {
if (moveSlot.id !== this.effectState.move) {
pokemon.disableMove(moveSlot.id, false, this.effectState.sourceEffect);
}
}
},
},
};

View File

@ -0,0 +1,41 @@
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
airballoon: {
inherit: true,
// airborneness implemented in sim/pokemon.js:Pokemon#isGrounded
onDamagingHit(damage, target, source, move) {
this.add('-enditem', target, 'Air Balloon');
if (target.item === 'airballoon') {
target.item = '';
this.clearEffectState(target.itemState);
} else {
const isBMM = target.volatiles['item:airballoon']?.inSlot;
if (isBMM) {
target.removeVolatile('item:airballoon');
target.m.scrambled.items.splice((target.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
this.toID(e.thing) === 'airballoon' && e.inSlot === isBMM), 1);
if (isBMM === 'Ability') target.setAbility('No Ability');
}
}
this.runEvent('AfterUseItem', target, null, null, this.dex.items.get('airballoon'));
},
onAfterSubDamage(damage, target, source, effect) {
this.debug('effect: ' + effect.id);
if (effect.effectType === 'Move') {
this.add('-enditem', target, 'Air Balloon');
if (target.item === 'airballoon') {
target.item = '';
this.clearEffectState(target.itemState);
} else {
const isBMM = target.volatiles['item:airballoon']?.inSlot;
if (isBMM) {
target.removeVolatile('item:airballoon');
target.m.scrambled.items.splice((target.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
this.toID(e.thing) === 'airballoon' && e.inSlot === isBMM), 1);
if (isBMM === 'Ability') target.setAbility('No Ability');
}
}
this.runEvent('AfterUseItem', target, null, null, this.dex.items.get('airballoon'));
}
},
},
};

View File

@ -0,0 +1,401 @@
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
// Remember, everything deals with SLOTS not with properties as they are!
covet: {
inherit: true,
onAfterHit(target, source, move) {
if (source.item || source.volatiles['gem']) {
return;
}
const yourItem = target.takeItem(source);
if (!yourItem) {
return;
}
if (
!this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem) ||
!source.setItem(yourItem)
) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
return;
}
target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
return;
}
this.add('-item', source, yourItem, '[from] move: Covet', `[of] ${target}`);
},
},
embargo: {
inherit: true,
condition: {
duration: 5,
onStart(pokemon) {
this.add('-start', pokemon, 'Embargo');
this.singleEvent('End', pokemon.getItem(), pokemon.itemState, pokemon);
if (!this.dex.items.get(pokemon.item).exists) {
const isAbil = (pokemon.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (isAbil >= 0) {
pokemon.removeVolatile('ability:' + this.toID(pokemon.m.scrambled.abilities[isAbil].thing));
} else if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
const slotNo = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id);
if (slotNo >= 0) pokemon.moveSlots.splice(slotNo, 1);
}
}
},
// Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js
onResidualOrder: 21,
onEnd(pokemon) {
this.add('-end', pokemon, 'Embargo');
if (!this.dex.items.get(pokemon.item).exists) {
const isAbil = (pokemon.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (isAbil >= 0) {
pokemon.addVolatile('ability:' + this.toID(pokemon.m.scrambled.abilities[isAbil].thing));
} else if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
const findMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
const findSlot = pokemon.baseMoveSlots.find(e => e.id === this.toID(pokemon.m.scrambled.moves[findMove].thing));
pokemon.moveSlots.push(this.dex.deepClone(findSlot));
}
}
},
},
},
magicroom: {
inherit: true,
condition: {
duration: 5,
durationCallback(source, effect) {
if (source?.hasAbility('persistent')) {
this.add('-activate', source, 'ability: Persistent', '[move] Magic Room');
return 7;
}
return 5;
},
onFieldStart(target, source) {
if (source?.hasAbility('persistent')) {
this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`, '[persistent]');
} else {
this.add('-fieldstart', 'move: Magic Room', `[of] ${source}`);
}
for (const mon of this.getAllActive()) {
this.singleEvent('End', mon.getItem(), mon.itemState, mon);
if (!this.dex.items.get(mon.item).exists) {
const isAbil = (mon.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (isAbil >= 0) {
mon.removeVolatile('ability:' + this.toID(mon.m.scrambled.abilities[isAbil].thing));
} else if ((mon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
const isMove = (mon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
const slotNo = mon.moveSlots.findIndex(m => this.toID(mon.m.scrambled.moves[isMove].thing) === m.id);
if (slotNo >= 0) mon.moveSlots.splice(slotNo, 1);
}
}
}
},
onFieldRestart(target, source) {
this.field.removePseudoWeather('magicroom');
},
// Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js
onFieldResidualOrder: 27,
onFieldResidualSubOrder: 6,
onFieldEnd() {
this.add('-fieldend', 'move: Magic Room', '[of] ' + this.effectState.source);
for (const pokemon of this.getAllActive()) {
if (!this.dex.items.get(pokemon.item).exists) {
const isAbil = (pokemon.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (isAbil >= 0) {
pokemon.addVolatile('ability:' + this.toID(pokemon.m.scrambled.abilities[isAbil].thing));
} else if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
const findMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
const findSlot = pokemon.baseMoveSlots.find(e => e.id === this.toID(pokemon.m.scrambled.moves[findMove].thing));
pokemon.moveSlots.push(this.dex.deepClone(findSlot));
}
}
}
},
},
},
gastroacid: {
inherit: true,
condition: {
// Ability suppression implemented in Pokemon.ignoringAbility() within sim/pokemon.js
onStart(pokemon) {
this.add('-endability', pokemon);
this.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon, pokemon, 'gastroacid');
if (!this.dex.abilities.get(pokemon.ability).exists) {
const isItem = (pokemon.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
pokemon.removeVolatile('item:' + this.toID(pokemon.m.scrambled.items[isItem].thing));
} else if ((pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const isMove = (pokemon.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
const slotNo = pokemon.moveSlots.findIndex(m => this.toID(pokemon.m.scrambled.moves[isMove].thing) === m.id);
if (slotNo >= 0) pokemon.moveSlots.splice(slotNo, 1);
}
}
},
},
},
trick: {
inherit: true,
onHit(target, source, move) {
const yourItem = target.takeItem(source);
const myItem = source.takeItem();
if (target.item || source.item || (!yourItem && !myItem)) {
if (yourItem) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
} else {
target.item = yourItem.id;
}
}
if (myItem) {
if (!this.dex.items.get(myItem.id).exists) {
source.setItem(myItem.id);
} else {
source.item = myItem.id;
}
}
return false;
}
if (
(myItem && !this.singleEvent('TakeItem', myItem, source.itemState, target, source, move, myItem)) ||
(yourItem && !this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem))
) {
if (yourItem) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
} else {
target.item = yourItem.id;
}
}
if (myItem) {
if (!this.dex.items.get(myItem.id).exists) {
source.setItem(myItem.id);
} else {
source.item = myItem.id;
}
}
return false;
}
this.add('-activate', source, 'move: Trick', `[of] ${target}`);
if (myItem) {
target.setItem(myItem);
this.add('-item', target, myItem, '[from] move: Trick');
} else {
this.add('-enditem', target, yourItem, '[silent]', '[from] move: Trick');
}
if (yourItem) {
source.setItem(yourItem);
this.add('-item', source, yourItem, '[from] move: Trick');
} else {
this.add('-enditem', source, myItem, '[silent]', '[from] move: Trick');
}
},
},
sketch: {
inherit: true,
onHit(target, source) {
const move = target.lastMove;
if (source.transformed || !move || source.moves.includes(move.id)) return false;
if (move.flags['nosketch'] || move.isZ || move.isMax) return false;
const sketchIndex = source.moves.indexOf('sketch');
if (sketchIndex < 0) return false;
if (this.toID(source.item) === 'sketch') {
source.setItem(move.name);
this.add('-activate', source, 'move: Sketch', move.name);
return;
} else if (this.toID(source.ability) === 'sketch') {
source.setAbility(move.name);
this.add('-activate', source, 'move: Sketch', move.name);
return;
}
const sketchedMove = {
move: move.name,
id: move.id,
pp: move.pp,
maxpp: move.pp,
target: move.target,
disabled: false,
used: false,
};
source.moveSlots[sketchIndex] = sketchedMove;
source.baseMoveSlots[sketchIndex] = sketchedMove;
this.add('-activate', source, 'move: Sketch', move.name);
},
},
skillswap: {
inherit: true,
onHit(target, source, move) {
const targetAbility = target.getAbility();
const sourceAbility = source.getAbility();
const sourceIsBMM = !this.dex.abilities.get(sourceAbility).exists;
const targetIsBMM = !this.dex.abilities.get(targetAbility).exists;
if (target.isAlly(source)) {
this.add('-activate', source, 'move: Skill Swap', '', '', `[of] ${target}`);
} else {
this.add('-activate', source, 'move: Skill Swap', targetAbility, sourceAbility, `[of] ${target}`);
}
this.singleEvent('End', sourceAbility, source.abilityState, source);
if (sourceIsBMM) {
const isItem = (source.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
source.removeVolatile('item:' + this.toID(source.m.scrambled.items[isItem].thing));
source.m.scrambled.items.splice(isItem, 1);
} else if ((source.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const isMove = (source.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
source.baseMoveSlots.splice(
source.baseMoveSlots.findIndex(m => this.toID(source.m.scrambled.moves[isMove].thing) === m.id), 1);
source.moveSlots.splice(source.moveSlots.findIndex(m => this.toID(source.m.scrambled.moves[isMove].thing) === m.id), 1);
source.m.scrambled.moves.splice(isMove, 1);
}
}
this.singleEvent('End', targetAbility, target.abilityState, target);
if (targetIsBMM) {
const isItem = (target.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
target.removeVolatile('item:' + this.toID(target.m.scrambled.items[isItem].thing));
target.m.scrambled.items.splice(isItem, 1);
} else if ((target.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const isMove = (target.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
target.baseMoveSlots.splice(
target.baseMoveSlots.findIndex(m => this.toID(target.m.scrambled.moves[isMove].thing) === m.id), 1);
target.moveSlots.splice(target.moveSlots.findIndex(m => this.toID(target.m.scrambled.moves[isMove].thing) === m.id), 1);
target.m.scrambled.moves.splice(isMove, 1);
}
}
source.ability = source.baseAbility = targetAbility.id;
target.ability = target.baseAbility = sourceAbility.id;
source.abilityState = this.initEffectState({ id: this.toID(source.ability), target: source });
target.abilityState = this.initEffectState({ id: this.toID(target.ability), target });
source.volatileStaleness = undefined;
if (!target.isAlly(source)) target.volatileStaleness = 'external';
this.singleEvent('Start', targetAbility, source.abilityState, source);
if (targetIsBMM) {
if (this.dex.items.get(targetAbility.id).exists) {
source.m.scrambled.items.push({ thing: targetAbility.id, inSlot: 'Ability' });
const effect = 'item:' + this.toID(targetAbility.id);
source.addVolatile(effect);
source.volatiles[effect].inSlot = 'Ability';
} else {
source.m.scrambled.moves.push({ thing: targetAbility.id, inSlot: 'Ability' });
const bmmMove = Dex.moves.get(targetAbility.id);
const newMove = {
move: bmmMove.name,
id: bmmMove.id,
pp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5,
maxpp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5,
target: bmmMove.target,
disabled: false,
used: false,
};
source.baseMoveSlots.push(newMove);
source.moveSlots.push(newMove);
}
}
this.singleEvent('Start', sourceAbility, target.abilityState, target);
if (sourceIsBMM) {
if (this.dex.items.get(sourceAbility.id).exists) {
target.m.scrambled.items.push({ thing: sourceAbility.id, inSlot: 'Ability' });
const effect = 'item:' + this.toID(sourceAbility.id);
target.addVolatile(effect);
target.volatiles[effect].inSlot = 'Ability';
} else {
target.m.scrambled.moves.push({ thing: sourceAbility.id, inSlot: 'Ability' });
const bmmMove = Dex.moves.get(sourceAbility.id);
const newMove = {
move: bmmMove.name,
id: bmmMove.id,
pp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5,
maxpp: bmmMove.noPPBoosts ? bmmMove.pp : bmmMove.pp * 8 / 5,
target: bmmMove.target,
disabled: false,
used: false,
};
target.baseMoveSlots.push(newMove);
target.moveSlots.push(newMove);
}
}
},
},
switcheroo: {
inherit: true,
onHit(target, source, move) {
const yourItem = target.takeItem(source);
const myItem = source.takeItem();
if (target.item || source.item || (!yourItem && !myItem)) {
if (yourItem) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
} else {
target.item = yourItem.id;
}
}
if (myItem) {
if (!this.dex.items.get(myItem.id).exists) {
source.setItem(myItem.id);
} else {
source.item = myItem.id;
}
}
return false;
}
if (
(myItem && !this.singleEvent('TakeItem', myItem, source.itemState, target, source, move, myItem)) ||
(yourItem && !this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem))
) {
if (yourItem) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
} else {
target.item = yourItem.id;
}
}
if (myItem) {
if (!this.dex.items.get(myItem.id).exists) {
source.setItem(myItem.id);
} else {
source.item = myItem.id;
}
}
return false;
}
this.add('-activate', source, 'move: Trick', `[of] ${target}`);
if (myItem) {
target.setItem(myItem);
this.add('-item', target, myItem, '[from] move: Switcheroo');
} else {
this.add('-enditem', target, yourItem, '[silent]', '[from] move: Switcheroo');
}
if (yourItem) {
source.setItem(yourItem);
this.add('-item', source, yourItem, '[from] move: Switcheroo');
} else {
this.add('-enditem', source, myItem, '[silent]', '[from] move: Switcheroo');
}
},
},
thief: {
inherit: true,
onAfterHit(target, source, move) {
if (source.item || source.volatiles['gem']) {
return;
}
const yourItem = target.takeItem(source);
if (!yourItem) {
return;
}
if (!this.singleEvent('TakeItem', yourItem, target.itemState, source, target, move, yourItem) ||
!source.setItem(yourItem)) {
if (!this.dex.items.get(yourItem.id).exists) {
target.setItem(yourItem.id);
return;
}
target.item = yourItem.id; // bypass setItem so we don't break choicelock or anything
return;
}
this.add('-enditem', target, yourItem, '[silent]', '[from] move: Thief', `[of] ${source}`);
this.add('-item', source, yourItem, '[from] move: Thief', `[of] ${target}`);
},
},
};

View File

@ -0,0 +1,546 @@
import { RESTORATIVE_BERRIES } from "../../../sim/pokemon";
export const Scripts: ModdedBattleScriptsData = {
pokemon: {
isGrounded(negateImmunity) {
if ('gravity' in this.battle.field.pseudoWeather) return true;
if ('ingrain' in this.volatiles && this.battle.gen >= 4) return true;
if ('smackdown' in this.volatiles) return true;
const item = (this.ignoringItem() ? '' : this.item);
if (item === 'ironball' || (this.volatiles['item:ironball'] && !this.ignoringItem())) return true;
// If a Fire/Flying type uses Burn Up and Roost, it becomes ???/Flying-type, but it's still grounded.
if (!negateImmunity && this.hasType('Flying') && !(this.hasType('???') && 'roost' in this.volatiles)) return false;
if (this.hasAbility('levitate') && !this.battle.suppressingAbility(this)) return null;
if ('magnetrise' in this.volatiles) return false;
if ('telekinesis' in this.volatiles) return false;
if (item === 'airballoon' || (this.volatiles['item:airballoon'] && !this.ignoringItem())) return false;
return true;
},
getAbility() {
const ability = this.battle.dex.abilities.getByID(this.ability);
if (ability.exists) return ability;
let abil = this.battle.dex.items.getByID(this.ability) as Item | Move;
if (!abil.exists) abil = this.battle.dex.moves.getByID(this.ability);
return {
id: this.ability,
name: abil.name || this.ability,
flags: {},
effectType: "Ability",
toString() {
return abil.name || this.id;
},
} as Ability;
},
hasAbility(ability) {
if (this.ignoringAbility()) return false;
if (Array.isArray(ability)) return ability.some(abil => this.hasAbility(abil));
const abilityid = this.battle.toID(ability);
return this.ability === abilityid || !!this.volatiles['ability:' + abilityid];
},
ignoringAbility() {
// Check if any active pokemon have the ability Neutralizing Gas
let neutralizinggas = false;
for (const pokemon of this.battle.getAllActive()) {
// can't use hasAbility because it would lead to infinite recursion
if (
(pokemon.ability === ('neutralizinggas' as ID) ||
(pokemon.m.scrambled.abilities as { thing: string }[]).some(
abils => this.battle.toID(abils.thing) === 'neutralizinggas')) &&
!pokemon.volatiles['gastroacid'] && !pokemon.abilityState.ending
) {
neutralizinggas = true;
break;
}
}
return !!(
(this.battle.gen >= 5 && !this.isActive) ||
((this.volatiles['gastroacid'] ||
(neutralizinggas && (this.ability !== ('neutralizinggas' as ID) ||
(this.m.scrambled.abilities as { thing: string }[]).some(abils => this.battle.toID(abils.thing) === 'neutralizinggas'))
)) && !this.getAbility().flags['cantsuppress']
)
);
},
setAbility(ability, source, sourceEffect, isFromFormeChange = false, isTransform = false) {
let isBMMAbil = false;
let isOldBMMAbil = false;
if (!this.hp) return false;
if (!this.battle.dex.abilities.get(ability).exists) isBMMAbil = true;
if (typeof ability === 'string') {
if (this.battle.dex.abilities.get(ability).exists) {
ability = this.battle.dex.abilities.get(ability);
} else {
const abilString = ability;
let abil = this.battle.dex.items.get(abilString) as Item | Move;
if (!abil.exists) abil = this.battle.dex.moves.get(abilString);
ability = {
id: abil.id || abilString,
name: abil.name || abilString,
flags: {},
effectType: "Ability",
toString() {
return abil.name || abilString;
},
} as Ability;
}
}
if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;
let oldAbility;
if (this.battle.dex.abilities.get(this.ability).exists) {
oldAbility = this.battle.dex.abilities.get(this.ability);
} else {
let abil = this.battle.dex.items.getByID(this.ability) as Item | Move;
if (!abil.exists) abil = this.battle.dex.moves.getByID(this.ability);
oldAbility = {
id: this.ability,
name: abil.name || this.ability,
flags: {},
effectType: "Ability",
toString() {
return abil.name || this.id;
},
} as Ability;
isOldBMMAbil = true;
}
if (!isFromFormeChange) {
if (ability.flags['cantsuppress'] || this.getAbility().flags['cantsuppress']) return false;
}
if (!isFromFormeChange && !isTransform) {
const setAbilityEvent: boolean | null = this.battle.runEvent('SetAbility', this, source, sourceEffect, ability);
if (!setAbilityEvent) return setAbilityEvent;
}
this.battle.singleEvent('End', oldAbility, this.abilityState, this, source);
if (isOldBMMAbil) {
const isItem = (this.m.scrambled.items as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (isItem >= 0) {
this.removeVolatile('item:' + this.battle.toID(this.m.scrambled.items[isItem].thing));
this.m.scrambled.items.splice(isItem, 1);
} else if ((this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability') >= 0) {
const isMove = (this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Ability');
if (!isTransform) {
let indexOfMove = this.baseMoveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[isMove].thing) === m.id);
if (indexOfMove >= 0) this.baseMoveSlots.splice(indexOfMove, 1);
if (oldAbility.id !== 'mimic') {
indexOfMove = this.moveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[isMove].thing) === m.id);
}
if (indexOfMove >= 0) this.moveSlots.splice(indexOfMove, 1);
}
this.m.scrambled.moves.splice(isMove, 1);
}
}
this.ability = ability.id;
// ability changes are permanent in BioMechMons
if (!isTransform && !this.transformed) this.baseAbility = ability.id;
this.abilityState = this.battle.initEffectState({ id: ability.id, target: this });
if (sourceEffect && !isFromFormeChange && !isTransform) {
if (source) {
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`, `[of] ${source}`);
} else {
this.battle.add('-ability', this, ability.name, oldAbility.name, `[from] ${sourceEffect.fullname}`);
}
}
if (ability.id && this.battle.gen > 3 &&
(!isTransform || oldAbility.id !== ability.id || this.battle.gen <= 4)) {
this.battle.singleEvent('Start', ability, this.abilityState, this, source);
}
if (isBMMAbil) {
if (this.battle.dex.items.get(ability.id).exists) {
this.m.scrambled.items.push({ thing: ability.id, inSlot: 'Ability' });
const effect = 'item:' + this.battle.toID(ability.id);
this.addVolatile(effect);
this.volatiles[effect].inSlot = 'Ability';
} else {
this.m.scrambled.moves.push({ thing: ability.id, inSlot: 'Ability' });
const move = Dex.moves.get(ability.id);
const newMove = {
move: move.name,
id: move.id,
pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
target: move.target,
disabled: false,
used: false,
};
if (!isTransform) {
this.baseMoveSlots.push(newMove);
this.moveSlots.push(newMove);
}
}
}
return oldAbility.id;
},
getItem() {
const item = this.battle.dex.items.getByID(this.item);
if (item.exists) return item;
let bmmItem = this.battle.dex.abilities.getByID(this.item) as Ability | Move;
if (!bmmItem.exists) bmmItem = this.battle.dex.moves.getByID(this.item);
return {
id: this.item,
name: bmmItem.name || this.name,
effectType: "Item",
toString() {
return bmmItem.name || this.id;
},
} as Item;
},
hasItem(item) {
if (this.ignoringItem()) return false;
if (Array.isArray(item)) return item.some(i => this.hasItem(i));
const itemId = this.battle.toID(item);
return this.item === itemId || !!this.volatiles['item:' + itemId];
},
takeItem(source) {
if (!this.item) return false;
if (!source) source = this;
if (this.battle.gen <= 4) {
if (source.itemKnockedOff) return false;
if (this.battle.toID(this.ability) === 'multitype') return false;
if (this.battle.toID(source.ability) === 'multitype') return false;
}
const item = this.getItem();
if (this.battle.runEvent('TakeItem', this, source, null, item)) {
this.item = '';
let wrongSlot = (this.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (wrongSlot >= 0) {
this.removeVolatile('ability:' + this.battle.toID(this.m.scrambled.abilities[wrongSlot].thing));
this.m.scrambled.abilities.splice(wrongSlot, 1);
} else if ((this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
wrongSlot = (this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
let indexOfMove = this.baseMoveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[wrongSlot].thing) === m.id);
if (indexOfMove >= 0) this.baseMoveSlots.splice(indexOfMove, 1);
if (item.id !== 'mimic') {
indexOfMove = this.moveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[wrongSlot].thing) === m.id);
}
if (indexOfMove >= 0) this.moveSlots.splice(indexOfMove, 1);
this.m.scrambled.moves.splice(wrongSlot, 1);
}
const oldItemState = this.itemState;
this.battle.clearEffectState(this.itemState);
this.pendingStaleness = undefined;
this.battle.singleEvent('End', item, oldItemState, this);
this.battle.runEvent('AfterTakeItem', this, null, null, item);
return item;
}
return false;
},
setItem(item, source, effect) {
let isBMMItem = false;
let isOldBMMItem = false;
if (!this.hp || !this.isActive) return false;
if (!this.battle.dex.items.get(item).exists) isBMMItem = true;
if (typeof item === 'string') {
if (this.battle.dex.items.get(item).exists) {
item = this.battle.dex.items.get(item);
} else {
const itemString = item;
let newData = this.battle.dex.abilities.get(itemString) as Ability | Move;
if (!newData.exists) newData = this.battle.dex.moves.get(itemString);
item = {
id: newData.id || itemString,
name: newData.name || itemString,
effectType: "Item",
toString() {
return newData.name || itemString;
},
} as Item;
}
}
const effectid = this.battle.effect ? this.battle.effect.id : '';
if (RESTORATIVE_BERRIES.has('leppaberry' as ID)) {
const inflicted = ['trick', 'switcheroo'].includes(effectid);
const external = inflicted && source && !source.isAlly(this);
this.pendingStaleness = external ? 'external' : 'internal';
} else {
this.pendingStaleness = undefined;
}
const oldItem = this.getItem();
if (!this.battle.dex.items.get(oldItem).exists) isOldBMMItem = true;
const oldItemState = this.itemState;
this.item = item.id;
this.itemState = this.battle.initEffectState({ id: item.id, target: this });
if (oldItem.exists) this.battle.singleEvent('End', oldItem, oldItemState, this);
if (isOldBMMItem) {
const isAbil = (this.m.scrambled.abilities as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
if (isAbil >= 0) {
this.removeVolatile('ability:' + this.battle.toID(this.m.scrambled.items[isAbil].thing));
this.m.scrambled.abilities.splice(isAbil, 1);
} else if ((this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item') >= 0) {
const isMove = (this.m.scrambled.moves as { inSlot: string }[]).findIndex(e => e.inSlot === 'Item');
let indexOfMove = this.baseMoveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[isMove].thing) === m.id);
if (indexOfMove >= 0) this.baseMoveSlots.splice(indexOfMove, 1);
if (oldItem.id !== 'mimic') {
indexOfMove = this.moveSlots.findIndex(m => this.battle.toID(this.m.scrambled.moves[isMove].thing) === m.id);
}
if (indexOfMove >= 0) this.moveSlots.splice(indexOfMove, 1);
this.m.scrambled.moves.splice(isMove, 1);
}
}
if (item.id) {
this.battle.singleEvent('Start', item, this.itemState, this, source, effect);
}
if (isBMMItem) {
if (this.battle.dex.abilities.get(item.id).exists) {
this.m.scrambled.abilities.push({ thing: item.id, inSlot: 'Item' });
const abileffect = 'ability:' + this.battle.toID(item.id);
this.addVolatile(abileffect);
this.volatiles[abileffect].inSlot = 'Item';
} else {
this.m.scrambled.moves.push({ thing: item.id, inSlot: 'Item' });
const move = Dex.moves.get(item.id);
const newMove = {
move: move.name,
id: move.id,
pp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
maxpp: move.noPPBoosts ? move.pp : move.pp * 8 / 5,
target: move.target,
disabled: false,
used: false,
};
this.baseMoveSlots.push(newMove);
this.moveSlots.push(newMove);
}
}
return true;
},
eatItem(force, source, sourceEffect) {
const item = sourceEffect?.effectType === 'Item' ? sourceEffect :
this.battle.effect.effectType === 'Item' ? this.battle.effect : this.getItem();
if (!item) return false;
if ((!this.hp && this.battle.toID(item.name) !== 'jabocaberry' && this.battle.toID(item.name) !== 'rowapberry') ||
!this.isActive) return false;
if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;
if (!source && this.battle.event?.target) source = this.battle.event.target;
// if (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {
// // if an item is telling us to eat it but we aren't holding it, we probably shouldn't eat what we are holding
// return false;
// }
if (
this.battle.runEvent('UseItem', this, null, null, Dex.items.get(item.name)) &&
(force || this.battle.runEvent('TryEatItem', this, null, null, Dex.items.get(item.name)))
) {
this.battle.add('-enditem', this, Dex.items.get(item.name), '[eat]');
this.battle.singleEvent('Eat', Dex.items.get(item.name), this.itemState, this, source, sourceEffect);
this.battle.runEvent('EatItem', this, source, sourceEffect, Dex.items.get(item.name));
if (RESTORATIVE_BERRIES.has(item.id)) {
switch (this.pendingStaleness) {
case 'internal':
if (this.staleness !== 'external') this.staleness = 'internal';
break;
case 'external':
this.staleness = 'external';
break;
}
this.pendingStaleness = undefined;
}
const isBMM = this.volatiles[item.id]?.inSlot;
if (isBMM) {
this.removeVolatile(item.id);
this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1);
if (isBMM === 'Ability') this.setAbility('No Ability');
} else {
this.lastItem = this.item;
this.item = '';
}
this.battle.clearEffectState(this.itemState);
this.usedItemThisTurn = true;
this.ateBerry = true;
this.battle.runEvent('AfterUseItem', this, null, null, Dex.items.get(item.name));
return true;
}
return false;
},
useItem(source, sourceEffect) {
const item = sourceEffect?.effectType === 'Item' ? sourceEffect :
this.battle.effect.effectType === 'Item' ? this.battle.effect : this.getItem();
if ((!this.hp && !item.isGem) || !this.isActive) return false;
if (!item) return false;
if (!sourceEffect && this.battle.effect) sourceEffect = this.battle.effect;
if (!source && this.battle.event?.target) source = this.battle.event.target;
// const item = this.getItem();
// if (sourceEffect?.effectType === 'Item' && this.item !== sourceEffect.id && source === this) {
// // if an item is telling us to eat it but we aren't holding it, we probably shouldn't eat what we are holding
// return false;
// }
if (this.battle.runEvent('UseItem', this, null, null, Dex.items.get(item.name))) {
switch (item.id) {
case 'redcard':
this.battle.add('-enditem', this, Dex.items.get(item.name), `[of] ${source}`);
break;
default:
if (item.isGem) {
this.battle.add('-enditem', this, Dex.items.get(item.name), '[from] gem');
} else {
this.battle.add('-enditem', this, Dex.items.get(item.name));
}
break;
}
if (item.boosts) {
this.battle.boost(item.boosts, this, source, Dex.items.get(item.name));
}
this.battle.singleEvent('Use', Dex.items.get(item.name), this.itemState, this, source, sourceEffect);
const isBMM = this.volatiles[item.id]?.inSlot;
if (isBMM) {
this.removeVolatile(item.id);
this.m.scrambled.items.splice((this.m.scrambled.items as { thing: string, inSlot: string }[]).findIndex(e =>
e.thing === this.battle.toID(item.name) && e.inSlot === isBMM), 1);
if (isBMM === 'Ability') this.setAbility('No Ability');
} else {
this.lastItem = this.item;
this.item = '';
}
this.battle.clearEffectState(this.itemState);
this.usedItemThisTurn = true;
this.battle.runEvent('AfterUseItem', this, null, null, item);
return true;
}
return false;
},
transformInto(pokemon, effect) {
const species = pokemon.species;
if (
pokemon.fainted || this.illusion || pokemon.illusion || (pokemon.volatiles['substitute'] && this.battle.gen >= 5) ||
(pokemon.transformed && this.battle.gen >= 2) || (this.transformed && this.battle.gen >= 5) ||
species.name === 'Eternatus-Eternamax' ||
(['Ogerpon', 'Terapagos'].includes(species.baseSpecies) && (this.terastallized || pokemon.terastallized)) ||
this.terastallized === 'Stellar'
) {
return false;
}
if (this.battle.dex.currentMod === 'gen1stadium' && (
species.name === 'Ditto' ||
(this.species.name === 'Ditto' && pokemon.moves.includes('transform'))
)) {
return false;
}
if (!this.setSpecies(species, effect, true)) return false;
this.transformed = true;
this.weighthg = pokemon.weighthg;
const types = pokemon.getTypes(true, true);
this.setType(pokemon.volatiles['roost'] ? pokemon.volatiles['roost'].typeWas : types, true);
this.addedType = pokemon.addedType;
this.knownType = this.isAlly(pokemon) && pokemon.knownType;
this.apparentType = pokemon.apparentType;
let statName: StatIDExceptHP;
for (statName in this.storedStats) {
this.storedStats[statName] = pokemon.storedStats[statName];
if (this.modifiedStats) this.modifiedStats[statName] = pokemon.modifiedStats![statName]; // Gen 1: Copy modified stats.
}
this.moveSlots = [];
this.hpType = (this.battle.gen >= 5 ? this.hpType : pokemon.hpType);
this.hpPower = (this.battle.gen >= 5 ? this.hpPower : pokemon.hpPower);
this.timesAttacked = pokemon.timesAttacked;
for (const moveSlot of pokemon.moveSlots) {
let moveName = moveSlot.move;
if (moveSlot.id === 'hiddenpower') {
moveName = 'Hidden Power ' + this.hpType;
}
this.moveSlots.push({
move: moveName,
id: moveSlot.id,
pp: moveSlot.maxpp === 1 ? 1 : 5,
maxpp: this.battle.gen >= 5 ? (moveSlot.maxpp === 1 ? 1 : 5) : moveSlot.maxpp,
target: moveSlot.target,
disabled: false,
used: false,
virtual: true,
});
}
let boostName: BoostID;
for (boostName in pokemon.boosts) {
this.boosts[boostName] = pokemon.boosts[boostName];
}
if (this.battle.gen >= 6) {
// we need to remove all of the overlapping crit volatiles before adding any of them
const volatilesToCopy = ['dragoncheer', 'focusenergy', 'gmaxchistrike', 'laserfocus'];
for (const volatile of volatilesToCopy) this.removeVolatile(volatile);
for (const volatile of volatilesToCopy) {
if (pokemon.volatiles[volatile]) {
this.addVolatile(volatile);
if (volatile === 'gmaxchistrike') this.volatiles[volatile].layers = pokemon.volatiles[volatile].layers;
if (volatile === 'dragoncheer') this.volatiles[volatile].hasDragonType = pokemon.volatiles[volatile].hasDragonType;
}
}
}
if (effect) {
this.battle.add('-transform', this, pokemon, '[from] ' + effect.fullname);
} else {
this.battle.add('-transform', this, pokemon);
}
if (this.terastallized) {
this.knownType = true;
this.apparentType = this.terastallized;
}
if (this.battle.gen > 2) this.setAbility(pokemon.ability, this, null, true, true);
// Change formes based on held items (for Transform)
// Only ever relevant in Generation 4 since Generation 3 didn't have item-based forme changes
if (this.battle.gen === 4) {
if (this.species.num === 487) {
// Giratina formes
if (this.species.name === 'Giratina' && this.item === 'griseousorb') {
this.formeChange('Giratina-Origin');
} else if (this.species.name === 'Giratina-Origin' && this.item !== 'griseousorb') {
this.formeChange('Giratina');
}
}
if (this.species.num === 493) {
// Arceus formes
const item = this.getItem();
const targetForme = (item?.onPlate ? 'Arceus-' + item.onPlate : 'Arceus');
if (this.species.name !== targetForme) {
this.formeChange(targetForme);
}
}
}
// Pokemon transformed into Ogerpon cannot Terastallize
// restoring their ability to tera after they untransform is handled ELSEWHERE
if (['Ogerpon', 'Terapagos'].includes(this.species.baseSpecies) && this.canTerastallize) this.canTerastallize = false;
for (const volatile in this.volatiles) {
if (this.volatiles[volatile].inSlot && this.volatiles[volatile].inSlot === 'Move') {
this.removeVolatile(volatile);
}
}
for (const volatile in pokemon.volatiles) {
if (pokemon.volatiles[volatile].inSlot && pokemon.volatiles[volatile].inSlot === 'Move') {
this.addVolatile(volatile);
this.volatiles[volatile].inSlot = 'Move';
}
}
return true;
},
},
field: {
suppressingWeather() {
for (const pokemon of this.battle.getAllActive()) {
const innates = Object.keys(pokemon.volatiles).filter(x => x.startsWith('ability:'));
if (pokemon && !pokemon.ignoringAbility() &&
(pokemon.getAbility().suppressWeather || innates.some(x => (
this.battle.dex.abilities.get(x.replace('ability:', '')).suppressWeather
)))) {
return true;
}
}
return false;
},
},
};

View File

@ -1,310 +0,0 @@
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
piss: {
tier: "UU",
},
snabterra: {
tier: "UU",
},
drakkannon: {
tier: "UU",
},
arsenstorm: {
tier: "UU",
},
badjur: {
tier: "UU",
},
vipult: {
tier: "UU",
},
fettogre: {
tier: "UU",
},
crystuit: {
tier: "UU",
},
monmothra: {
tier: "UU",
},
wizhazard: {
tier: "UU",
},
jackoswarm: {
tier: "UU",
},
kadraoke: {
tier: "UU",
},
karmalice: {
tier: "UU",
},
goblantern: {
tier: "UU",
},
hippaint: {
tier: "UU",
},
pinaturbo: {
tier: "UU",
},
eolikopter: {
tier: "UU",
},
mohawtter: {
tier: "UU",
},
arachnode: {
tier: "UU",
},
blobbiam: {
tier: "UU",
},
florustitia: {
tier: "UU",
},
primordialith: {
tier: "UU",
},
faeruin: {
tier: "UU",
},
versalyre: {
tier: "UU",
},
capricorrie: {
tier: "UU",
},
reversadusa: {
tier: "UU",
},
llanfairwyrm: {
tier: "UU",
},
frostengu: {
tier: "UU",
},
bulionage: {
tier: "UU",
},
yamateraph: {
tier: "UU",
},
bugswarm: {
tier: "UU",
},
freightmare: {
tier: "UU",
},
brasspecter: {
tier: "UU",
},
copperhead: {
tier: "UU",
},
thaumaton: {
tier: "UU",
},
sculptera: {
tier: "UU",
},
lavalisk: {
tier: "UU",
},
martorse: {
tier: "UU",
},
parasike: {
tier: "UU",
},
massassin: {
tier: "UU",
},
searytch: {
tier: "UU",
},
jokerpent: {
tier: "UU",
},
socknbuskn: {
tier: "UU",
},
sleetshell: {
tier: "UU",
},
craggon: {
tier: "UU",
},
// Meta B
flarenheit: {
tier: "OU",
},
groundead: {
tier: "OU",
},
actaniathan: {
tier: "OU",
},
deadward: {
tier: "OU",
},
obaki: {
tier: "OU",
},
sylravage: {
tier: "OU",
},
twinkaton: {
tier: "OU",
},
fausteil: {
tier: "OU",
},
geoporka: {
tier: "OU",
},
seaode: {
tier: "OU",
},
plasmage: {
tier: "OU",
},
porcupyre: {
tier: "OU",
},
bellolysk: {
tier: "OU",
},
tryonite: {
tier: "OU",
},
scarachnid: {
tier: "OU",
},
geigeramp: {
tier: "OU",
},
maldractice: {
tier: "OU",
},
serpvoltidae: {
tier: "OU",
},
sheepquake: {
tier: "OU",
},
bufferfly: {
tier: "OU",
},
dastard: {
tier: "OU",
},
cottentration: {
tier: "OU",
},
sorrowcean: {
tier: "OU",
},
psyllapse: {
tier: "OU",
},
haarstorm: {
tier: "OU",
},
borealis: {
tier: "OU",
},
bazhigangquan: {
tier: "OU",
},
leechmonner: {
tier: "OU",
},
ironcrest: {
tier: "OU",
},
odonata: {
tier: "OU",
},
hebicikuga: {
tier: "OU",
},
devestial: {
tier: "OU",
},
lundicare: {
tier: "OU",
},
// Meta C
lyvamp: {
tier: "RU",
},
treatmint: {
tier: "RU",
},
turvarpega: {
tier: "RU",
},
goodjur: {
tier: "RU",
},
liftaton: {
tier: "RU",
},
triceracotta: {
tier: "RU",
},
woolverine: {
tier: "RU",
},
combustoad: {
tier: "RU",
},
hearthind: {
tier: "RU",
},
koiryu: {
tier: "RU",
},
pestiligy: {
tier: "RU",
},
saxum: {
tier: "RU",
},
sascratch: {
tier: "RU",
},
guttergar: {
tier: "RU",
},
rakasa: {
tier: "RU",
},
thermostatic: {
tier: "RU",
},
formaldehydra: {
tier: "RU",
},
strumorthio: {
tier: "RU",
},
ironmike: {
tier: "RU",
},
whalestro: {
tier: "RU",
},
urslag: {
tier: "RU",
},
centaghoul: {
tier: "RU",
},
noirwark: {
tier: "RU",
},
metarachne: {
tier: "RU",
},
};

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +0,0 @@
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
meditate: {
inherit: true,
isNonstandard: null,
},
dragonrage: {
inherit: true,
isNonstandard: null,
},
boneclub: {
inherit: true,
isNonstandard: null,
},
powershift: {
inherit: true,
isNonstandard: null,
},
blazingtorque: {
inherit: true,
isNonstandard: null,
},
camouflage: {
inherit: true,
isNonstandard: null,
},
};

View File

@ -1,926 +0,0 @@
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
piss: {
num: 9001,
name: "Piss",
types: ["Normal"],
baseStats: { hp: 70, atk: 95, def: 60, spa: 50, spd: 60, spe: 95 },
abilities: { 0: "Magic Guard" },
weightkg: 382,
eggGroups: ["Undiscovered"],
},
snabterra: {
num: 9002,
name: "Snabterra",
types: ["Bug", "Ground"],
baseStats: { hp: 85, atk: 110, def: 85, spa: 40, spd: 80, spe: 85 },
abilities: { 0: "Compound Eyes" },
weightkg: 600,
eggGroups: ["Undiscovered"],
},
drakkannon: {
num: 9003,
name: "Drakkannon",
types: ["Fighting", "Dragon"],
baseStats: { hp: 80, atk: 50, def: 95, spa: 100, spd: 105, spe: 73 },
abilities: { 0: "Mega Launcher" },
weightkg: 59,
eggGroups: ["Undiscovered"],
},
arsenstorm: {
num: 9004,
name: "Arsenstorm",
types: ["Poison", "Ground"],
baseStats: { hp: 110, atk: 50, def: 65, spa: 80, spd: 90, spe: 55 },
abilities: { 0: "Neutralizing Gas", H: "Levitate" },
weightkg: 15,
eggGroups: ["Undiscovered"],
},
badjur: {
num: 9005,
name: "Badjur",
types: ["Normal"],
baseStats: { hp: 85, atk: 100, def: 75, spa: 60, spd: 75, spe: 80 },
abilities: { 0: "Poison Heal" },
weightkg: 16,
eggGroups: ["Undiscovered"],
},
vipult: {
num: 9006,
name: "Vipult",
types: ["Poison", "Dark"],
baseStats: { hp: 100, atk: 65, def: 70, spa: 100, spd: 100, spe: 70 },
abilities: { 0: "Intimidate" },
weightkg: 23,
eggGroups: ["Undiscovered"],
},
fettogre: {
num: 9007,
name: "Fettogre",
types: ["Ghost", "Fighting"],
baseStats: { hp: 70, atk: 45, def: 140, spa: 45, spd: 80, spe: 55 },
abilities: { 0: "Immunity", H: "Oblivious" },
weightkg: 200,
eggGroups: ["Undiscovered"],
},
crystuit: {
num: 9008,
name: "Crystuit",
types: ["Rock", "Electric"],
baseStats: { hp: 70, atk: 50, def: 80, spa: 105, spd: 70, spe: 110 },
abilities: { 0: "Sturdy", H: "Levitate" },
weightkg: 420.6,
eggGroups: ["Undiscovered"],
},
monmothra: {
num: 9009,
name: "Mon Mothra",
types: ["Fairy", "Bug"],
baseStats: { hp: 80, atk: 50, def: 70, spa: 100, spd: 70, spe: 90 },
abilities: { 0: "Fluffy", H: "Tinted Lens" },
weightkg: 50,
eggGroups: ["Undiscovered"],
},
wizhazard: {
num: 9010,
name: "Wizhazard",
types: ["Psychic", "Steel"],
baseStats: { hp: 95, atk: 40, def: 90, spa: 100, spd: 70, spe: 60 },
abilities: { 0: "Magic Bounce", H: "Battle Armor" },
weightkg: 69,
eggGroups: ["Undiscovered"],
},
jackoswarm: {
num: 9011,
name: "Jack-o-swarm",
types: ["Steel", "Flying"],
baseStats: { hp: 90, atk: 50, def: 95, spa: 70, spd: 90, spe: 70 },
abilities: { 0: "Pickpocket", H: "Rough Skin" },
weightkg: 74.8,
eggGroups: ["Undiscovered"],
},
kadraoke: {
num: 9012,
name: "Kadraoke",
types: ["Psychic", "Dragon"],
baseStats: { hp: 90, atk: 30, def: 80, spa: 85, spd: 100, spe: 85 },
abilities: { 0: "Punk Rock" },
weightkg: 19.7,
eggGroups: ["Undiscovered"],
},
karmalice: {
num: 9013,
name: "Karmalice",
types: ["Ice", "Electric"],
baseStats: { hp: 70, atk: 55, def: 40, spa: 105, spd: 55, spe: 111 },
abilities: { 0: "Refrigerate" },
weightkg: 690,
eggGroups: ["Undiscovered"],
},
goblantern: {
num: 9014,
name: "Goblantern",
types: ["Fire", "Grass"],
baseStats: { hp: 90, atk: 40, def: 80, spa: 100, spd: 80, spe: 77 },
abilities: { 0: "Prankster" },
weightkg: 3,
eggGroups: ["Undiscovered"],
},
hippaint: {
num: 9015,
name: "Hippaint",
types: ["Water", "Ground"],
baseStats: { hp: 70, atk: 40, def: 70, spa: 110, spd: 85, spe: 80 },
abilities: { 0: "Pastel Veil" },
weightkg: 90,
eggGroups: ["Undiscovered"],
},
pinaturbo: {
num: 9016,
name: "Pinaturbo",
types: ["Fire"],
baseStats: { hp: 70, atk: 70, def: 60, spa: 100, spd: 95, spe: 115 },
abilities: { 0: "Mold Breaker", H: "Regenerator" },
weightkg: 126,
eggGroups: ["Undiscovered"],
},
eolikopter: {
num: 9017,
name: "Eolikopter",
types: ["Flying", "Electric"],
baseStats: { hp: 90, atk: 50, def: 80, spa: 100, spd: 70, spe: 110 },
abilities: { 0: "Cloud Nine", H: "Static" },
weightkg: 400,
eggGroups: ["Undiscovered"],
},
mohawtter: {
num: 9018,
name: "Mohawtter",
types: ["Water", "Grass"],
baseStats: { hp: 85, atk: 50, def: 70, spa: 70, spd: 110, spe: 55 },
abilities: { 0: "Tablets of Ruin", H: "Hydration" },
weightkg: 32,
eggGroups: ["Undiscovered"],
},
arachnode: {
num: 9019,
name: "Arachnode",
types: ["Electric"],
baseStats: { hp: 105, atk: 30, def: 75, spa: 85, spd: 100, spe: 60 },
abilities: { 0: "Clear Body", H: "Thick Fat" },
weightkg: 61.5,
eggGroups: ["Undiscovered"],
},
blobbiam: {
num: 9020,
name: "Blobbiam",
types: ["Water", "Fairy"],
baseStats: { hp: 95, atk: 100, def: 110, spa: 20, spd: 80, spe: 75 },
abilities: { 0: "Volt Absorb" },
weightkg: 12,
eggGroups: ["Undiscovered"],
},
florustitia: {
num: 9021,
name: "Florustitia",
types: ["Grass", "Fighting"],
baseStats: { hp: 70, atk: 85, def: 60, spa: 40, spd: 95, spe: 100 },
abilities: { 0: "Sharpness", H: "Grassy Surge" },
weightkg: 110,
eggGroups: ["Undiscovered"],
},
primordialith: {
num: 9022,
name: "Primordialith",
types: ["Rock"],
baseStats: { hp: 100, atk: 100, def: 100, spa: 35, spd: 90, spe: 30 },
abilities: { 0: "Sand Stream", H: "Vital Spirit" },
weightkg: 90,
eggGroups: ["Undiscovered"],
},
faeruin: {
num: 9023,
name: "Faeruin",
types: ["Ghost", "Fairy"],
baseStats: { hp: 90, atk: 96, def: 70, spa: 40, spd: 80, spe: 93 },
abilities: { 0: "Prankster", H: "Wandering Spirit" },
weightkg: 33,
eggGroups: ["Undiscovered"],
},
versalyre: {
num: 9024,
name: "Versalyre",
types: ["Flying"],
baseStats: { hp: 70, atk: 110, def: 65, spa: 30, spd: 70, spe: 90 },
abilities: { 0: "Protean" },
weightkg: 2,
eggGroups: ["Undiscovered"],
},
capricorrie: {
num: 9025,
name: "Capricorrie",
types: ["Ice", "Ground"],
baseStats: { hp: 100, atk: 110, def: 80, spa: 50, spd: 70, spe: 90 },
abilities: { 0: "Snow Warning", H: "Vital Spirit" },
weightkg: 146,
eggGroups: ["Undiscovered"],
},
reversadusa: {
num: 9026,
name: "Reversadusa",
types: ["Psychic", "Dark"],
baseStats: { hp: 90, atk: 90, def: 80, spa: 70, spd: 70, spe: 95 },
abilities: { 0: "Contrary" },
weightkg: 55.2,
eggGroups: ["Undiscovered"],
},
llanfairwyrm: {
num: 9027,
name: "Llanfairwyrm",
types: ["Dragon"],
baseStats: { hp: 85, atk: 120, def: 100, spa: 55, spd: 90, spe: 70 },
abilities: { 0: "Rough Skin" },
weightkg: 600,
eggGroups: ["Undiscovered"],
},
frostengu: {
num: 9028,
name: "Frostengu",
types: ["Fighting", "Ice"],
baseStats: { hp: 50, atk: 110, def: 50, spa: 110, spd: 50, spe: 87 },
abilities: { 0: "No Guard" },
weightkg: 68,
eggGroups: ["Undiscovered"],
},
bulionage: {
num: 9029,
name: "Bulionage",
types: ["Dark", "Water"],
baseStats: { hp: 95, atk: 90, def: 85, spa: 40, spd: 120, spe: 50 },
abilities: { 0: "Strong Jaw", 1: "Thermal Exchange", H: "White Smoke" },
weightkg: 300,
eggGroups: ["Undiscovered"],
},
yamateraph: {
num: 9030,
name: "Yamateraph",
types: ["Normal", "Fairy"],
baseStats: { hp: 90, atk: 110, def: 80, spa: 15, spd: 80, spe: 105 },
abilities: { 0: "Psychic Surge", H: "Vital Spirit" },
weightkg: 255,
eggGroups: ["Undiscovered"],
},
bugswarm: {
num: 9031,
name: "Bugswarm",
types: ["Fire", "Bug"],
baseStats: { hp: 100, atk: 90, def: 70, spa: 70, spd: 70, spe: 60 },
abilities: { 0: "Triage" },
weightkg: 420,
eggGroups: ["Undiscovered"],
},
freightmare: {
num: 9032,
name: "Freightmare",
types: ["Ghost", "Steel"],
baseStats: { hp: 100, atk: 40, def: 80, spa: 105, spd: 85, spe: 74 },
abilities: { 0: "Sand Rush", H: "Steam Engine" },
weightkg: 720,
eggGroups: ["Undiscovered"],
},
brasspecter: {
num: 9033,
name: "Brasspecter",
types: ["Steel", "Ghost"],
baseStats: { hp: 110, atk: 95, def: 100, spa: 40, spd: 95, spe: 35 },
abilities: { 0: "Tough Claws" },
weightkg: 40,
eggGroups: ["Undiscovered"],
},
copperhead: {
num: 9034,
name: "Copperhead",
types: ["Ground", "Steel"],
baseStats: { hp: 85, atk: 80, def: 100, spa: 50, spd: 90, spe: 50 },
abilities: { 0: "Water Absorb" },
weightkg: 101.9,
eggGroups: ["Undiscovered"],
},
thaumaton: {
num: 9035,
name: "Thaumaton",
types: ["Poison", "Steel"],
baseStats: { hp: 95, atk: 70, def: 70, spa: 100, spd: 100, spe: 75 },
abilities: { 0: "Unburden", H: "Flash Fire" },
weightkg: 666,
eggGroups: ["Undiscovered"],
},
sculptera: {
num: 9036,
name: "Sculptera",
types: ["Rock", "Dragon"],
baseStats: { hp: 100, atk: 105, def: 70, spa: 40, spd: 85, spe: 85 },
abilities: { 0: "Skill Link", H: "Defiant" },
weightkg: 729,
eggGroups: ["Undiscovered"],
},
lavalisk: {
num: 9037,
name: "Lavalisk",
types: ["Poison", "Fire"],
baseStats: { hp: 100, atk: 105, def: 80, spa: 40, spd: 80, spe: 76 },
abilities: { 0: "Mold Breaker" },
weightkg: 150,
eggGroups: ["Undiscovered"],
},
martorse: {
num: 9038,
name: "Martorse",
types: ["Ground", "Fire"],
baseStats: { hp: 75, atk: 90, def: 70, spa: 35, spd: 90, spe: 105 },
abilities: { 0: "Trace", H: "Prankster" },
weightkg: 173,
eggGroups: ["Undiscovered"],
},
parasike: {
num: 9039,
name: "Parasike",
types: ["Psychic", "Bug"],
baseStats: { hp: 50, atk: 90, def: 75, spa: 50, spd: 55, spe: 109 },
abilities: { 0: "Strong Jaw", H: "Tinted Lens" },
weightkg: 0.8,
eggGroups: ["Undiscovered"],
},
massassin: {
num: 9040,
name: "Massassin",
types: ["Fighting", "Dark"],
baseStats: { hp: 110, atk: 110, def: 80, spa: 50, spd: 80, spe: 30 },
abilities: { 0: "Quark Drive" },
weightkg: 888,
eggGroups: ["Undiscovered"],
tags: ["Paradox"],
},
searytch: {
num: 9041,
name: "Searytch",
types: ["Fairy", "Fire"],
baseStats: { hp: 85, atk: 30, def: 75, spa: 105, spd: 100, spe: 60 },
abilities: { 0: "Stamina" },
weightkg: 42,
eggGroups: ["Undiscovered"],
},
jokerpent: {
num: 9042,
name: "Jokerpent",
types: ["Dragon", "Poison"],
baseStats: { hp: 100, atk: 70, def: 100, spa: 30, spd: 75, spe: 20 },
abilities: { 0: "Unaware" },
weightkg: 67,
eggGroups: ["Undiscovered"],
},
socknbuskn: {
num: 9043,
name: "Socknbusk\u2019n",
types: ["Normal", "Fighting"],
baseStats: { hp: 95, atk: 95, def: 75, spa: 40, spd: 70, spe: 110 },
abilities: { 0: "Scrappy" },
weightkg: 65,
eggGroups: ["Undiscovered"],
},
sleetshell: {
num: 8045,
name: "Sleet Shell",
types: ["Ice", "Steel"],
baseStats: { hp: 83, atk: 95, def: 107, spa: 47, spd: 71, spe: 103 },
abilities: { 0: "Protosynthesis" },
weightkg: 674.5,
eggGroups: ["Undiscovered"],
tags: ["Paradox"],
},
craggon: {
num: 9044,
name: "Craggon",
types: ["Dragon", "Ground"],
baseStats: { hp: 120, atk: 81, def: 81, spa: 82, spd: 81, spe: 100 },
abilities: { 0: "Natural Cure", H: "Emergency Exit" },
weightkg: 404,
eggGroups: ["Undiscovered"],
},
// Meta B
flarenheit: {
num: 9045,
name: "Flarenheit",
types: ["Ice", "Fire"],
baseStats: { hp: 55, atk: 110, def: 50, spa: 70, spd: 40, spe: 130 },
abilities: { 0: "Motor Drive", H: "Surge Surfer" },
weightkg: 45.1,
eggGroups: ["Undiscovered"],
},
groundead: {
num: 9046,
name: "Groundead",
types: ["Ground", "Ghost"],
baseStats: { hp: 80, atk: 115, def: 110, spa: 50, spd: 80, spe: 50 },
abilities: { 0: "Misty Surge", 1: "Solid Rock", H: "Earth Eater" },
weightkg: 0.2,
eggGroups: ["Undiscovered"],
},
actaniathan: {
num: 9047,
name: "Actaniathan",
types: ["Water", "Steel"],
baseStats: { hp: 100, atk: 40, def: 80, spa: 105, spd: 105, spe: 50 },
abilities: { 0: "Torrent", H: "Lightning Rod" },
weightkg: 800,
eggGroups: ["Undiscovered"],
},
deadward: {
num: 9048,
name: "Deadward",
types: ["Dark", "Flying"],
baseStats: { hp: 90, atk: 100, def: 85, spa: 40, spd: 90, spe: 110 },
abilities: { 0: "Filter", H: "Intimidate" },
weightkg: 66.6,
eggGroups: ["Undiscovered"],
},
obaki: {
num: 9049,
name: "Obaki",
types: ["Fighting", "Ghost"],
baseStats: { hp: 85, atk: 75, def: 65, spa: 125, spd: 105, spe: 55 },
abilities: { 0: "Purifying Salt" },
weightkg: 40,
eggGroups: ["Undiscovered"],
},
sylravage: {
num: 9050,
name: "Sylravage",
types: ["Grass", "Fighting"],
baseStats: { hp: 103, atk: 110, def: 86, spa: 41, spd: 80, spe: 80 },
abilities: { 0: "Defiant", H: "Grassy Surge" },
weightkg: 72,
eggGroups: ["Undiscovered"],
},
twinkaton: {
num: 9051,
name: "Twinkaton",
types: ["Fairy", "Steel"],
baseStats: { hp: 90, atk: 75, def: 75, spa: 75, spd: 120, spe: 45 },
abilities: { 0: "Mold Breaker", H: "Filter" },
weightkg: 90,
eggGroups: ["Undiscovered"],
},
fausteil: {
num: 9052,
name: "Fausteil",
types: ["Fire", "Flying"],
baseStats: { hp: 110, atk: 90, def: 80, spa: 35, spd: 110, spe: 50 },
abilities: { 0: "Flame Body" },
weightkg: 26,
eggGroups: ["Undiscovered"],
},
geoporka: {
num: 9053,
name: "Geoporka",
types: ["Grass", "Poison"],
baseStats: { hp: 100, atk: 85, def: 80, spa: 70, spd: 95, spe: 45 },
abilities: { 0: "Thick Fat" },
weightkg: 38,
eggGroups: ["Undiscovered"],
},
seaode: {
num: 9054,
name: "Seaode",
types: ["Rock", "Water"],
baseStats: { hp: 70, atk: 110, def: 100, spa: 40, spd: 70, spe: 95 },
abilities: { 0: "Rock Head" },
weightkg: 121,
eggGroups: ["Undiscovered"],
},
plasmage: {
num: 9055,
name: "Plasmage",
types: ["Psychic", "Electric"],
baseStats: { hp: 100, atk: 55, def: 70, spa: 105, spd: 75, spe: 115 },
abilities: { 0: "Magician" },
weightkg: 85,
eggGroups: ["Undiscovered"],
},
porcupyre: {
num: 9056,
name: "Porcupyre",
types: ["Dark", "Fire"],
baseStats: { hp: 90, atk: 90, def: 125, spa: 40, spd: 80, spe: 70 },
abilities: { 0: "Bulletproof", H: "Rough Skin" },
weightkg: 66.6,
eggGroups: ["Undiscovered"],
},
bellolysk: {
num: 9057,
name: "Bellolysk",
types: ["Dragon", "Steel"],
baseStats: { hp: 100, atk: 90, def: 85, spa: 105, spd: 75, spe: 70 },
abilities: { 0: "Magic Guard", H: "Multiscale" },
weightkg: 999,
eggGroups: ["Undiscovered"],
},
tryonite: {
num: 9058,
name: "Tryonite",
types: ["Bug", "Ground"],
baseStats: { hp: 75, atk: 75, def: 90, spa: 100, spd: 105, spe: 90 },
abilities: { 0: "Drought", H: "Sturdy" },
weightkg: 7,
eggGroups: ["Undiscovered"],
},
scarachnid: {
num: 9059,
name: "Scarachnid",
types: ["Ghost", "Bug"],
baseStats: { hp: 81, atk: 112, def: 70, spa: 31, spd: 70, spe: 121 },
abilities: { 0: "Regenerator", H: "Perish Body" },
weightkg: 14,
eggGroups: ["Undiscovered"],
},
geigeramp: {
num: 9060,
name: "Geigeramp",
types: ["Poison", "Electric"],
baseStats: { hp: 100, atk: 50, def: 100, spa: 100, spd: 100, spe: 75 },
abilities: { 0: "Levitate" },
weightkg: 20,
eggGroups: ["Undiscovered"],
},
maldractice: {
num: 9061,
name: "Maldractice",
types: ["Dragon", "Poison"],
baseStats: { hp: 110, atk: 100, def: 60, spa: 20, spd: 115, spe: 40 },
abilities: { 0: "Own Tempo", H: "Corrosion" },
weightkg: 67,
eggGroups: ["Undiscovered"],
},
serpvoltidae: {
num: 9062,
name: "Serpvoltidae",
types: ["Electric", "Ground"],
baseStats: { hp: 110, atk: 45, def: 90, spa: 115, spd: 90, spe: 45 },
abilities: { 0: "Teravolt", 1: "Shed Skin", H: "Natural Cure" },
weightkg: 69,
eggGroups: ["Undiscovered"],
},
sheepquake: {
num: 9063,
name: "Sheepquake",
types: ["Normal", "Ground"],
baseStats: { hp: 110, atk: 30, def: 95, spa: 85, spd: 95, spe: 95 },
abilities: { 0: "Sheer Force" },
weightkg: 126,
eggGroups: ["Undiscovered"],
},
bufferfly: {
num: 9064,
name: "Bufferfly",
types: ["Fighting", "Bug"],
baseStats: { hp: 105, atk: 110, def: 70, spa: 20, spd: 90, spe: 65 },
abilities: { 0: "Magic Bounce" },
weightkg: 121,
eggGroups: ["Undiscovered"],
},
dastard: {
num: 9065,
name: "Dastard",
types: ["Fairy", "Poison"],
baseStats: { hp: 80, atk: 90, def: 110, spa: 100, spd: 80, spe: 100 },
abilities: { 0: "Competitive" },
weightkg: 55,
eggGroups: ["Undiscovered"],
},
cottentration: {
num: 9066,
name: "Cottentration",
types: ["Grass", "Fighting"],
baseStats: { hp: 50, atk: 50, def: 50, spa: 110, spd: 110, spe: 110 },
abilities: { 0: "Chlorophyll" },
weightkg: 0.8,
eggGroups: ["Undiscovered"],
},
sorrowcean: {
num: 9067,
name: "Sorrowcean",
types: ["Water", "Ghost"],
baseStats: { hp: 85, atk: 30, def: 85, spa: 100, spd: 70, spe: 108 },
abilities: { 0: "Flare Boost", H: "Illusion" },
weightkg: 15,
eggGroups: ["Undiscovered"],
},
psyllapse: {
num: 9068,
name: "Psyllapse",
types: ["Psychic", "Normal"],
baseStats: { hp: 100, atk: 95, def: 85, spa: 95, spd: 85, spe: 60 },
abilities: { 0: "Prankster" },
weightkg: 70,
eggGroups: ["Undiscovered"],
},
haarstorm: {
num: 9069,
name: "Haarstorm",
types: ["Ghost", "Electric"],
baseStats: { hp: 80, atk: 90, def: 75, spa: 30, spd: 115, spe: 105 },
abilities: { 0: "Neutralizing Gas", H: "Natural Cure" },
weightkg: 9,
eggGroups: ["Undiscovered"],
},
borealis: {
num: 9070,
name: "Borealis",
types: ["Ice", "Flying"],
baseStats: { hp: 95, atk: 75, def: 90, spa: 95, spd: 90, spe: 131 },
abilities: { 0: "Supreme Overlord" },
weightkg: 63,
eggGroups: ["Undiscovered"],
},
bazhigangquan: {
num: 9071,
name: "Bazhigangquan",
types: ["Fighting", "Steel"],
baseStats: { hp: 101, atk: 104, def: 100, spa: 35, spd: 61, spe: 68 },
abilities: { 0: "Technician" },
weightkg: 219,
eggGroups: ["Undiscovered"],
},
leechmonner: {
num: 9072,
name: "Leechmonner",
types: ["Water", "Bug"],
baseStats: { hp: 105, atk: 115, def: 70, spa: 40, spd: 110, spe: 65 },
abilities: { 0: "Drizzle", H: "Water Veil" },
weightkg: 922,
eggGroups: ["Undiscovered"],
},
ironcrest: {
num: 9073,
name: "Iron Crest",
types: ["Flying", "Fighting"],
baseStats: { hp: 72, atk: 96, def: 78, spa: 114, spd: 72, spe: 98 },
abilities: { 0: "Quark Drive" },
weightkg: 1.9,
eggGroups: ["Undiscovered"],
tags: ["Paradox"],
},
odonata: {
num: 9074,
name: "Odonata",
types: ["Flying", "Dragon"],
baseStats: { hp: 125, atk: 100, def: 80, spa: 60, spd: 80, spe: 75 },
abilities: { 0: "Shield Dust", 1: "Aerilate", H: "Tough Claws" },
weightkg: 45,
eggGroups: ["Undiscovered"],
},
hebicikuga: {
num: 9075,
name: "Hebicikuga",
types: ["Bug", "Dragon"],
baseStats: { hp: 85, atk: 115, def: 75, spa: 80, spd: 95, spe: 115 },
abilities: { 0: "Soul-Heart", H: "Technician" },
weightkg: 382.5,
eggGroups: ["Undiscovered"],
},
devestial: {
num: 9076,
name: "Devestial",
types: ["Fairy", "Ground"],
baseStats: { hp: 110, atk: 105, def: 100, spa: 115, spd: 90, spe: 80 },
abilities: { 0: "Cud Chew" },
weightkg: 340,
eggGroups: ["Undiscovered"],
},
lundicare: {
num: 9077,
name: "Lundicare",
types: ["Normal", "Fairy"],
baseStats: { hp: 101, atk: 81, def: 103, spa: 101, spd: 109, spe: 111 },
abilities: { 0: "Prism Armor", H: "Trace" },
weightkg: 606,
eggGroups: ["Undiscovered"],
},
// Meta C
lyvamp: {
num: 9078,
name: "Lyvamp",
types: ["Electric", "Flying"],
baseStats: { hp: 96, atk: 100, def: 70, spa: 41, spd: 70, spe: 91 },
abilities: { 0: "Regenerator", H: "Insomnia" },
weightkg: 189,
eggGroups: ["Undiscovered"],
},
treatmint: {
num: 9079,
name: "Treatmint",
types: ["Grass", "Poison"],
baseStats: { hp: 100, atk: 25, def: 90, spa: 100, spd: 70, spe: 45 },
abilities: { 0: "Filter", H: "Natural Cure" },
weightkg: 8.4,
eggGroups: ["Undiscovered"],
},
turvarpega: {
num: 9080,
name: "Turvarpega",
types: ["Ground", "Flying"],
baseStats: { hp: 100, atk: 100, def: 85, spa: 30, spd: 70, spe: 55 },
abilities: { 0: "Rock Head", H: "Big Pecks" },
weightkg: 680,
eggGroups: ["Undiscovered"],
},
goodjur: {
num: 9081,
name: "Goodjur",
types: ["Psychic", "Fighting"],
baseStats: { hp: 70, atk: 25, def: 60, spa: 120, spd: 70, spe: 90 },
abilities: { 0: "Natural Cure" },
weightkg: 42.5,
eggGroups: ["Undiscovered"],
},
liftaton: {
num: 9082,
name: "Liftaton",
types: ["Steel"],
baseStats: { hp: 110, atk: 90, def: 80, spa: 80, spd: 85, spe: 20 },
abilities: { 0: "Mold Breaker" },
weightkg: 180,
eggGroups: ["Undiscovered"],
},
triceracotta: {
num: 9083,
name: "Triceracotta",
types: ["Ground", "Ghost"],
baseStats: { hp: 84, atk: 111, def: 95, spa: 35, spd: 75, spe: 84 },
abilities: { 0: "Flash Fire", H: "Technician" },
weightkg: 100,
eggGroups: ["Undiscovered"],
},
woolverine: {
num: 9084,
name: "Woolverine",
types: ["Dark", "Fairy"],
baseStats: { hp: 70, atk: 120, def: 70, spa: 40, spd: 70, spe: 70 },
abilities: { 0: "Lingering Aroma", H: "Fluffy" },
weightkg: 40,
eggGroups: ["Undiscovered"],
},
combustoad: {
num: 9085,
name: "Combustoad",
types: ["Fire", "Ground"],
baseStats: { hp: 70, atk: 95, def: 70, spa: 63, spd: 70, spe: 108 },
abilities: { 0: "Neutralizing Gas" },
weightkg: 2,
eggGroups: ["Undiscovered"],
},
hearthind: {
num: 9086,
name: "Hearthind",
types: ["Fire", "Fighting"],
baseStats: { hp: 71, atk: 93, def: 68, spa: 20, spd: 66, spe: 122 },
abilities: { 0: "Grassy Surge" },
weightkg: 11.3,
eggGroups: ["Undiscovered"],
},
koiryu: {
num: 9087,
name: "Koiryu",
types: ["Water", "Dragon"],
baseStats: { hp: 90, atk: 25, def: 60, spa: 100, spd: 90, spe: 60 },
abilities: { 0: "Multiscale", 1: "Water Veil", H: "Torrent" },
weightkg: 829.7,
eggGroups: ["Undiscovered"],
},
pestiligy: {
num: 9088,
name: "Pestiligy",
types: ["Poison", "Ghost"],
baseStats: { hp: 105, atk: 15, def: 107, spa: 77, spd: 96, spe: 61 },
abilities: { 0: "Liquid Ooze", H: "Sheer Force" },
weightkg: 11.3,
eggGroups: ["Undiscovered"],
},
saxum: {
num: 9089,
name: "Saxum",
types: ["Rock", "Ground"],
baseStats: { hp: 70, atk: 100, def: 70, spa: 100, spd: 70, spe: 65 },
abilities: { 0: "Levitate" },
weightkg: 430,
eggGroups: ["Undiscovered"],
},
sascratch: {
num: 9090,
name: "Sascratch",
types: ["Ice", "Rock"],
baseStats: { hp: 70, atk: 100, def: 95, spa: 50, spd: 60, spe: 110 },
abilities: { 0: "Tough Claws", 1: "Unnerve", H: "Perish Body" },
weightkg: 20,
eggGroups: ["Undiscovered"],
},
guttergar: {
num: 9091,
name: "Guttergar",
types: ["Water"],
baseStats: { hp: 116, atk: 108, def: 55, spa: 30, spd: 104, spe: 63 },
abilities: { 0: "Mold Breaker", H: "Water Veil" },
weightkg: 106,
eggGroups: ["Undiscovered"],
},
rakasa: {
num: 9092,
name: "Rakasa",
types: ["Psychic", "Fairy"],
baseStats: { hp: 101, atk: 31, def: 79, spa: 105, spd: 81, spe: 23 },
abilities: { 0: "Prankster" },
weightkg: 19,
eggGroups: ["Undiscovered"],
},
thermostatic: {
num: 9093,
name: "Thermostatic",
types: ["Electric"],
baseStats: { hp: 90, atk: 50, def: 105, spa: 90, spd: 85, spe: 35 },
abilities: { 0: "Electromorphosis", H: "Wind Power" },
weightkg: 60,
eggGroups: ["Undiscovered"],
},
formaldehydra: {
num: 9094,
name: "Formaldehydra",
types: ["Poison", "Dragon"],
baseStats: { hp: 95, atk: 100, def: 110, spa: 60, spd: 85, spe: 60 },
abilities: { 0: "Rough Skin", H: "Stench" },
weightkg: 165.5,
eggGroups: ["Undiscovered"],
},
strumorthio: {
num: 9095,
name: "Strumorthio",
types: ["Normal", "Ghost"],
baseStats: { hp: 90, atk: 20, def: 87, spa: 95, spd: 95, spe: 20 },
abilities: { 0: "Early Bird", H: "Levitate" },
weightkg: 110,
eggGroups: ["Undiscovered"],
},
ironmike: {
num: 9096,
name: "Iron Mike",
types: ["Fairy", "Normal"],
baseStats: { hp: 88, atk: 30, def: 68, spa: 106, spd: 76, spe: 106 },
abilities: { 0: "Quark Drive" },
weightkg: 51.8,
eggGroups: ["Undiscovered"],
tags: ["Paradox"],
},
whalestro: {
num: 9097,
name: "Whalestro",
types: ["Steel", "Water"],
baseStats: { hp: 90, atk: 40, def: 100, spa: 90, spd: 70, spe: 40 },
abilities: { 0: "Punk Rock" },
weightkg: 999,
eggGroups: ["Undiscovered"],
},
urslag: {
num: 9098,
name: "Urslag",
types: ["Ground", "Steel"],
baseStats: { hp: 90, atk: 30, def: 105, spa: 109, spd: 85, spe: 74 },
abilities: { 0: "Flash Fire", H: "Iron Barbs" },
weightkg: 723,
eggGroups: ["Undiscovered"],
},
centaghoul: {
num: 9099,
name: "Centaghoul",
types: ["Ghost", "Steel"],
baseStats: { hp: 87, atk: 108, def: 94, spa: 30, spd: 115, spe: 31 },
abilities: { 0: "Bulletproof", H: "Pickpocket" },
weightkg: 105,
eggGroups: ["Undiscovered"],
},
noirwark: {
num: 9100,
name: "Noirwark",
types: ["Dark", "Fighting"],
baseStats: { hp: 85, atk: 30, def: 95, spa: 80, spd: 85, spe: 95 },
abilities: { 0: "Shadow Shield" },
weightkg: 75,
eggGroups: ["Undiscovered"],
},
metarachne: {
num: 9101,
name: "Metarachne",
types: ["Bug", "Steel"],
baseStats: { hp: 105, atk: 105, def: 70, spa: 45, spd: 70, spe: 30 },
abilities: { 0: "Analytic", 1: "Bulletproof", H: "Swarm" },
weightkg: 985.9,
eggGroups: ["Undiscovered"],
},
};

View File

@ -1,17 +0,0 @@
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
spriteviewer: {
effectType: 'ValidatorRule',
name: 'Sprite Viewer',
desc: "Displays a fakemon's sprite in chat when it is switched in for the first time",
onBegin() {
this.add('rule', 'Sprite Viewer: Displays sprites in chat');
},
onSwitchIn(pokemon) {
if (!this.effectState[pokemon.species.id]) {
this.add('-message', `${pokemon.species.name}'s Sprite:`);
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/refs/heads/main/data/mods/blankcanvas/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
this.effectState[pokemon.species.id] = true;
}
},
},
};

View File

@ -604,7 +604,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa
shortDesc: "Moves ignore charge/recharge turns.",
},
biogenesis: {
onSwitchInPriority: 1,
onSwitchInPriority: -1,
onBeforeSwitchIn(pokemon) {
if (pokemon.m.didRandomMoves) return;
const moves = this.dex.moves.all();
@ -810,4 +810,147 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa
num: -117,
shortDesc: "Sets terrain depending on HP value.",
},
dragonsjaw: {
onBasePower(basePower, attacker, defender, move) {
if (defender.hasType('Dragon') && defender.hasType('Steel')) {
return this.chainModify(1.5);
} else if (defender.hasType('Dragon')) {
return this.chainModify(2.25);
} else if (defender.hasType('Steel')) {
return;
} else return this.chainModify(1.5);
},
onTryHit(target, source, move) {
if (target.hasType('Fairy')) {
return null;
}
},
onModifyMovePriority: -2,
onModifyMove(move) {
if (move.secondaries) {
this.debug('doubling secondary chance');
for (const secondary of move.secondaries) {
if (secondary.chance) secondary.chance *= 2;
}
}
if (move.self?.chance) move.self.chance *= 2;
},
flags: {},
name: "Dragon's Jaw",
rating: 5,
num: -118,
shortDesc: "Serene Grace + Bite attacks are Dragon type.",
},
corrosivesoul: {
onStart(source) {
this.field.setTerrain('corrosivesoul');
},
condition: {
effectType: 'Terrain',
duration: 5,
durationCallback(source, effect) {
if (source?.hasItem('terrainextender')) {
return 8;
}
return 5;
},
onFieldStart(field, source, effect) {
if (effect?.effectType === 'Ability') {
this.add('-fieldstart', 'move: Corrosive Soul', '[from] ability: ' + effect.name, `[of] ${source}`);
} else {
this.add('-fieldstart', 'move: Corrosive Soul');
}
},
onResidualOrder: 5,
onResidualSubOrder: 2,
onResidual(pokemon) {
const move = this.dex.getActiveMove('smog');
move.accuracy = 100;
const target = pokemon.foes()[0];
if (target && !target.fainted) {
this.actions.useMove(move, pokemon, { target });
}
},
onFieldResidualOrder: 27,
onFieldResidualSubOrder: 7,
onFieldEnd() {
this.add('-fieldend', 'move: Corrosive Soul');
},
},
flags: {},
name: "Corrosive Soul",
rating: 5,
num: -119,
shortDesc: "Sets Corrosive Terrian: active Pokemon hit each other with Smog.",
},
oceanicblessing: {
onSwitchInPriority: -2,
onStart(pokemon) {
this.singleEvent('WeatherChange', this.effect, this.effectState, pokemon);
},
onWeatherChange(pokemon) {
if (!pokemon.isActive || pokemon.baseSpecies.baseSpecies !== 'Kyogre' || pokemon.transformed) return;
if (!pokemon.hp) return;
if (['raindance', 'primordialsea'].includes(pokemon.effectiveWeather())) {
if (pokemon.species.id !== 'kyogreprimal') {
pokemon.formeChange('Kyogre-Primal', this.effect, false);
}
} else {
if (pokemon.species.id === 'kyogreprimal') {
pokemon.formeChange('kyogre', this.effect, false);
}
}
},
onAllyModifyAtkPriority: 3,
onAllyModifyAtk(atk, pokemon) {
if (this.effectState.target.baseSpecies.baseSpecies !== 'Kyogre') return;
if (['raindance', 'primordialsea'].includes(pokemon.effectiveWeather())) {
return this.chainModify(1.5);
}
},
onAllyModifySpDPriority: 4,
onAllyModifySpD(spd, pokemon) {
if (this.effectState.target.baseSpecies.baseSpecies !== 'Kyogre') return;
if (['raindance', 'primordialsea'].includes(pokemon.effectiveWeather())) {
return this.chainModify(1.5);
}
},
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, breakable: 1 },
name: "Oceanic Blessing",
rating: 5,
num: -120,
shortDesc: "Flower Gift but Kyogre",
},
autospin: {
onResidual(pokemon, s, effect) {
const move = this.dex.getActiveMove('metronome');
const target = pokemon.foes()[0];
if (target && !target.fainted && (pokemon.hp >= pokemon.maxhp / 2)) {
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
} else if (target && !target.fainted && (pokemon.hp <= pokemon.maxhp / 10)) {
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
} else if (target && !target.fainted) {
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
this.actions.useMove(move, pokemon, { target, sourceEffect: effect });
}
},
flags: {},
name: "Auto Spin",
rating: 5,
num: -121,
shortDesc: "Use Metronome at end of turn.",
},
corrosion: {
inherit: true,
onModifyMovePriority: -5,
onModifyMove(move) {
if (!move.ignoreImmunity) move.ignoreImmunity = {};
if (move.ignoreImmunity !== true) {
move.ignoreImmunity['Poison'] = true;
}
},
shortDesc: "This Pokemon can poison a Pokemon regardless of its typing and hit them with Poison moves.",
},
};

View File

@ -119,4 +119,22 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
gen: 2,
desc: "Doubles Attack.",
},
focusband: {
name: "Focus Band",
spritenum: 150,
fling: {
basePower: 10,
},
onDamagePriority: -40,
onDamage(damage, target, source, effect) {
const chance = Math.max(Math.floor(target.hp / target.maxhp), 10);
if (this.randomChance(chance, 100) && damage >= target.hp && effect && effect.effectType === 'Move') {
this.add("-activate", target, "item: Focus Band");
return target.hp - 1;
}
},
num: 230,
gen: 2,
desc: "Chance to survive attack equal to percentage of remaining HP, minimum 10%.",
},
};

View File

@ -284,7 +284,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
secondary: null,
target: "normal",
type: "Water",
zMove: { boost: { atk: 1 } },
zMove: { boost: { spe: 1 } },
contestType: "Beautiful",
desc: "Encore + Rain Dance",
shortDesc: "Encore + Rain Dance",
@ -531,7 +531,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
} else {
this.boost({ spe: 3 }, pokemon);
}
// adds volatile ordered, which prevents the order up effect from occuring again until Dondozo switches out
// adds volatile ordered, which prevents the order up effect from occurring again until Dondozo switches out
pokemon.addVolatile('ordered');
// removes the side condition
pokemon.side.removeSideCondition('orderup');
@ -1603,4 +1603,118 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
shortDesc: "5 turns. Can't status,-Dragon power vs grounded, +Fairy power.",
desc: "5 turns. Can't status,-Dragon power vs grounded, +Fairy power.",
},
lootbox: {
num: -1015,
accuracy: 100,
basePower: 0,
category: "Physical",
name: "Loot Box",
pp: 15,
priority: 0,
flags: { protect: 1, mirror: 1, metronome: 1 },
onModifyMove(move, pokemon, target) {
const rand = this.random(8);
if (rand < 2) {
move.basePower = 0;
} else if (rand < 4) {
move.basePower = 60;
} else if (rand < 6) {
move.basePower = 120;
} else {
move.basePower = 150;
}
},
onTryMove() {
this.attrLastMove('[still]');
},
onPrepareHit(target, source) {
this.add('-anim', source, 'Explosion', target);
this.add('-anim', source, 'Mind Blown', target);
},
secondary: null,
target: "normal",
type: "Normal",
contestType: "Cute",
},
sinisterarrows: {
num: -1016,
accuracy: 100,
basePower: 50,
category: "Physical",
name: "Sinister Arrows",
pp: 10,
priority: 0,
flags: { allyanim: 1, metronome: 1, futuremove: 1 },
ignoreImmunity: true,
onTry(source, target) {
if (!target.side.addSlotCondition(target, 'sinisterarrows')) return false;
Object.assign(target.side.slotConditions[target.position]['sinisterarrows'], {
move: 'sinisterarrows',
source,
moveData: {
id: 'sinisterarrows',
name: "Sinister Arrows",
accuracy: 100,
basePower: 50,
category: "Physical",
priority: 0,
flags: { allyanim: 1, metronome: 1, futuremove: 1 },
ignoreImmunity: false,
effectType: 'Move',
type: 'Ghost',
},
});
this.add('-start', source, 'move: Sinister Arrows');
return this.NOT_FAIL;
},
onTryMove(target, source, move) {
this.add('-anim', source, 'Curse', target);
this.add('-anim', source, 'Spite', target);
},
condition: {
onStart(target) {
this.effectState.targetSlot = target.getSlot();
this.effectState.endingTurn = (this.turn - 1) + 3;
},
onResidualOrder: 5,
onResidualSubOrder: 2,
onResidual(target) {
const data = this.effectState;
// time's up; time to hit! :D
const move = this.dex.moves.get(data.move);
if (target.fainted || target === data.source) {
this.hint(`${move.name} did not hit because the target is ${(target.fainted ? 'fainted' : 'the user')}.`);
return;
}
if (!this.getOverflowedTurnCount()) return;
target.removeVolatile('Protect');
target.removeVolatile('Endure');
if (data.source.hasAbility('infiltrator') && this.gen >= 6) {
data.moveData.infiltrates = true;
}
if (data.source.hasAbility('normalize') && this.gen >= 6) {
data.moveData.type = 'Normal';
}
const hitMove = new this.dex.Move(data.moveData) as ActiveMove;
this.actions.trySpreadMoveHit([target], data.source, hitMove, true);
this.hint(`${move.name} hits.`);
if (data.source.isActive && data.source.hasItem('lifeorb') && this.gen >= 5) {
this.singleEvent('AfterMoveSecondarySelf', data.source.getItem(), data.source.itemState, data.source, target, data.source.getItem());
}
this.activeMove = null;
this.checkWin();
if (this.getOverflowedTurnCount() >= this.effectState.endingTurn) {
target.side.removeSlotCondition(this.getAtSlot(this.effectState.targetSlot), 'sinisterarrows');
}
},
},
secondary: null,
target: "normal",
type: "Ghost",
contestType: "Clever",
},
mortalspin: {
inherit: true,
category: "Special",
},
};

View File

@ -443,4 +443,49 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
abilities: { 0: "Weak Armor" },
types: ["Dark", "Ground"],
},
feraligatr: {
inherit: true,
},
feraligatrmega: {
num: -988,
name: "Feraligatr-Mega",
baseSpecies: "Feraligatr",
forme: "Mega",
types: ["Dragon"],
genderRatio: { M: 0.875, F: 0.125 },
baseStats: { hp: 85, atk: 145, def: 120, spa: 99, spd: 103, spe: 78 },
abilities: { 0: "Dragon's Jaw" },
heightm: 2.3,
weightkg: 108.8,
color: "Blue",
eggGroups: ["Monster", "Water 1"],
requiredItem: "Feraligite",
gen: 9,
},
salazzle: {
inherit: true,
abilities: { 0: "Corrosive Soul" },
},
kyogre: {
inherit: true,
abilities: { 0: "Oceanic Blessing" },
},
azelf: {
inherit: true,
abilities: { 0: "Auto Spin" },
types: ["Psychic", "Normal"],
},
decidueye: {
inherit: true,
abilities: { 0: "Overgrow", 1: "Sniper" },
},
ogerponcornerstone: {
inherit: true,
abilities: { 0: "Solid Rock" },
types: ["Psychic", "Normal"],
},
glimmora: {
inherit: true,
abilities: { 0: "Corrosion" },
},
};

View File

@ -270,5 +270,29 @@ export const Scripts: ModdedBattleScriptsData = {
this.modData('Learnsets', 'mandibuzz').learnset.fling = ['9L1'];
this.modData('Learnsets', 'mandibuzz').learnset.scavenge = ['9L1'];
this.modData('Learnsets', 'mandibuzz').learnset.bonemerang = ['9L1'];
this.modData('Learnsets', 'feraligatr').learnset.firefang = ['9L1'];
this.modData('Learnsets', 'feraligatr').learnset.thunderfang = ['9L1'];
this.modData('Learnsets', 'feraligatr').learnset.poisonfang = ['9L1'];
this.modData('Learnsets', 'salazzle').learnset.magmastorm = ['9L1'];
this.modData('Learnsets', 'salazzle').learnset.malignantchain = ['9L1'];
this.modData('Learnsets', 'salazzle').learnset.psychicnoise = ['9L1'];
this.modData('Learnsets', 'salazzle').learnset.banefulbunker = ['9L1'];
this.modData('Learnsets', 'kyogre').learnset.hurricane = ['9L1'];
this.modData('Learnsets', 'kyogre').learnset.tidalsurge = ['9L1'];
this.modData('Learnsets', 'azelf').learnset.rapidspin = ['9L1'];
this.modData('Learnsets', 'azelf').learnset.lootbox = ['9L1'];
this.modData('Learnsets', 'azelf').learnset.acupressure = ['9L1'];
this.modData('Learnsets', 'decidueye').learnset.sinisterarrows = ['9L1'];
this.modData('Learnsets', 'ogerpon').learnset.sappyseed = ['9L1'];
this.modData('Learnsets', 'ogerpon').learnset.thousandwaves = ['9L1'];
this.modData('Learnsets', 'glimmora').learnset.icebeam = ['9L1'];
this.modData('Learnsets', 'glimmora').learnset.malignantchain = ['9L1'];
},
};

View File

@ -51,7 +51,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
pidgeot: {
tier: "ZU",
tier: "PU",
},
rattata: {
tier: "LC",
@ -90,7 +90,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
nidoqueen: {
tier: "PU",
tier: "ZU",
},
nidoranm: {
tier: "LC",
@ -117,7 +117,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
wigglytuff: {
tier: "PU",
tier: "ZU",
},
zubat: {
tier: "LC",
@ -132,7 +132,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
vileplume: {
tier: "PU",
tier: "ZU",
},
paras: {
tier: "LC",
@ -168,7 +168,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
primeape: {
tier: "ZU",
tier: "PU",
},
growlithe: {
tier: "LC",
@ -189,7 +189,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "PU",
},
kadabra: {
tier: "UU",
tier: "NU",
},
alakazam: {
tier: "OU",
@ -201,7 +201,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
machamp: {
tier: "PU",
tier: "ZU",
},
bellsprout: {
tier: "LC",
@ -216,7 +216,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "ZU",
},
tentacruel: {
tier: "UU",
tier: "NU",
},
geodude: {
tier: "LC",
@ -225,13 +225,13 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "PU",
},
golem: {
tier: "UU",
tier: "NU",
},
ponyta: {
tier: "LC",
},
rapidash: {
tier: "PUBL",
tier: "UU",
},
slowpoke: {
tier: "ZU",
@ -258,7 +258,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
dewgong: {
tier: "UU",
tier: "NU",
},
grimer: {
tier: "LC",
@ -294,13 +294,13 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
kingler: {
tier: "PU",
tier: "ZU",
},
voltorb: {
tier: "LC",
},
electrode: {
tier: "UU",
tier: "NU",
},
exeggcute: {
tier: "PU",
@ -339,7 +339,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
tangela: {
tier: "UU",
tier: "NU",
},
kangaskhan: {
tier: "UU",
@ -366,7 +366,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NU",
},
scyther: {
tier: "ZU",
tier: "PU",
},
jynx: {
tier: "OU",
@ -375,10 +375,10 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
magmar: {
tier: "ZU",
tier: "PU",
},
pinsir: {
tier: "PU",
tier: "ZU",
},
tauros: {
tier: "OU",
@ -399,7 +399,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
vaporeon: {
tier: "UU",
tier: "NU",
},
jolteon: {
tier: "OU",
@ -414,7 +414,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "ZU",
},
omastar: {
tier: "UU",
tier: "NU",
},
kabuto: {
tier: "LC",
@ -435,7 +435,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
moltres: {
tier: "NU",
tier: "UU",
},
dratini: {
tier: "LC",

View File

@ -554,7 +554,7 @@ export const Scripts: ModdedBattleScriptsData = {
didSomething = true;
// Check the status of the Pokémon whose turn is not.
// When a move that affects stat levels is used, if the Pokémon whose turn it is not right now is paralyzed or
// burned, the correspoding stat penalties will be applied again to that Pokémon.
// burned, the corresponding stat penalties will be applied again to that Pokémon.
if (pokemon.side.foe.active[0].status) {
// If it's paralysed, quarter its speed.
if (pokemon.side.foe.active[0].status === 'par') {

View File

@ -138,8 +138,8 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
inherit: true,
onModifyMove(move) {
const affectedByKingsRock = [
'aerialace', 'aeroblast', 'aircutter', 'armthrust', 'barrage', 'beatup', 'bide', 'bind', 'blastburn', 'bonerush', 'bonemerang', 'bounce', 'brickbreak', 'bulletseed', 'clamp', 'cometpunch', 'crabhammer', 'crosschop', 'cut', 'dig', 'dive', 'doublekick', 'doubleslap', 'doubleedge', 'dragonbreath', 'dragonclaw', 'dragonrage', 'drillpeck', 'earthquake', 'eggbomb', 'endeavor', 'eruption', 'explosion', 'extremespeed', 'falseswipe', 'feintattack', 'firespin', 'flail', 'fly', 'frenzyplant', 'frustration', 'furyattack', 'furycutter', 'furyswipes', 'gust', 'hiddenpower', 'highjumpkick', 'hornattack', 'hydrocannon', 'hydropump', 'hyperbeam', 'iceball', 'iciclespear', 'jumpkick', 'karatechop', 'leafblade', 'lowkick', 'machpunch', 'magicalleaf', 'magnitude', 'megakick', 'megapunch', 'megahorn', 'meteormash', 'mudshot', 'muddywater', 'nightshade', 'outrage', 'overheat', 'payday', 'peck', 'petaldance', 'pinmissile', 'poisontail', 'pound', 'psychoboost', 'psywave', 'quickattack', 'rage', 'rapidspin', 'razorleaf', 'razorwind', 'return', 'revenge', 'reversal', 'rockblast', 'rockthrow', 'rollingkick', 'rollout', 'sandtomb', 'scratch', 'seismictoss', 'selfdestruct', 'shadowpunch', 'shockwave', 'signalbeam', 'silverwind', 'skullbash', 'skyattack', 'skyuppercut', 'slam', 'slash', 'snore', 'solarbeam', 'sonicboom', 'spikecannon', 'spitup', 'steelwing', 'strength', 'struggle', 'submission', 'surf', 'swift', 'tackle', 'takedown', 'thrash', 'tickle', 'triplekick', 'twister', 'uproar', 'visegrip', 'vinewhip', 'vitalthrow', 'volttackle', 'watergun', 'waterpulse', 'waterfall', 'weatherball', 'whirlpool', 'wingattack', 'wrap',
];
'aerialace', 'aeroblast', 'aircutter', 'armthrust', 'barrage', 'beatup', 'bide', 'bind', 'blastburn', 'bonerush', 'bonemerang', 'bounce', 'brickbreak', 'bulletseed', 'clamp', 'cometpunch', 'crabhammer', 'crosschop', 'cut', 'dig', 'dive', 'doublekick', 'doubleslap', 'doubleedge', 'dragonbreath', 'dragonclaw', 'dragonrage', 'drillpeck', 'earthquake', 'eggbomb', 'endeavor', 'eruption', 'explosion', 'extremespeed', 'falseswipe', 'feintattack', 'firespin', 'flail', 'fly', 'frenzyplant', 'frustration', 'furyattack', 'furycutter', 'furyswipes', 'gust', 'hiddenpower', 'highjumpkick', 'hornattack', 'hydrocannon', 'hydropump', 'hyperbeam', 'iceball', 'iciclespear', 'jumpkick', 'karatechop', 'leafblade', 'lowkick', 'machpunch', 'magicalleaf', 'magnitude', 'megakick', 'megapunch', 'megahorn', 'meteormash', 'mudshot', 'muddywater', 'nightshade', 'outrage', 'overheat', 'payday', 'peck', 'petaldance', 'pinmissile', 'poisontail', 'pound', 'psychoboost', 'psywave', 'quickattack', 'rage', 'rapidspin', 'razorleaf', 'razorwind', 'return', 'revenge', 'reversal', 'rockblast', 'rockthrow', 'rollingkick', 'rollout', 'sandtomb', 'scratch', 'seismictoss', 'selfdestruct', 'shadowpunch', 'shockwave', 'signalbeam', 'silverwind', 'skullbash', 'skyattack', 'skyuppercut', 'slam', 'slash', 'snore', 'solarbeam', 'sonicboom', 'spikecannon', 'spitup', 'steelwing', 'strength', 'struggle', 'submission', 'surf', 'swift', 'tackle', 'takedown', 'thrash', 'triplekick', 'twister', 'uproar', 'visegrip', 'vinewhip', 'vitalthrow', 'volttackle', 'watergun', 'waterpulse', 'waterfall', 'weatherball', 'whirlpool', 'wingattack', 'wrap',
]; // Tickle also has the move flag, but can never flinch because King's Rock requires damage to trigger
if (affectedByKingsRock.includes(move.id)) {
if (!move.secondaries) move.secondaries = [];
move.secondaries.push({

View File

@ -169,7 +169,7 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
}
// In SwSh, Fly's animation leaks the initial target through a camera focus
// The animation leak target itself isn't "accurate"; the target it reveals is as if Fly weren't a charge movee
// The animation leak target itself isn't "accurate"; the target it reveals is as if Fly weren't a charge move
// (Fly, like all other charge moves, will actually target slots on its charging turn, relevant for things like Follow Me)
// We use a generic single-target move to represent this
if (this.sides.length > 2) {

View File

@ -95,7 +95,7 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable
if (set.item && this.dex.items.get(set.item).megaStone) {
const item = this.dex.items.get(set.item);
if (item.megaEvolves === species.baseSpecies) {
species = this.dex.species.get(item.megaStone);
species = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone);
}
}
if (
@ -123,7 +123,9 @@ export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable
}
if (set.item) {
const item = this.dex.items.get(set.item);
if (item.megaEvolves === set.species) godSpecies = this.dex.species.get(item.megaStone);
if (item.megaEvolves === set.species) {
godSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone);
}
if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) {
godSpecies = this.dex.species.get(set.species + "-Crowned");
}

View File

@ -1380,7 +1380,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
doublesTier: "DUU",
},
absol: {
tier: "RU",
tier: "RUBL",
doublesTier: "DUU",
},
snorunt: {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,6 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
baseStats: { hp: 60, atk: 140, def: 105, spa: 130, spd: 105, spe: 120 },
},
scyther: {
inherit: true,
evos: ["Scizor"],
},
mawilemega: {
inherit: true,
baseStats: { hp: 50, atk: 147, def: 125, spa: 55, spd: 95, spe: 50 },

View File

@ -1,140 +0,0 @@
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
ange: {
gen: 9,
desc: "Gain 1/12 of max HP at the end of every turn. Opposing Megas lose 1/10 max HP every turn.",
shortDesc: "Gain 1/12 of max HP at the end of every turn. Opposing Megas lose 1/10 max HP every turn.",
onResidualOrder: 5,
onResidualSubOrder: 4,
onResidual(pokemon) {
if (!pokemon.hp) return;
const megaFoes = [];
for (const target of pokemon.foes()) {
if (target.baseSpecies.isMega) megaFoes.push(target);
}
if (megaFoes.length) {
for (const target of megaFoes) {
this.damage(target.baseMaxhp / 10, target, pokemon);
this.heal(target.baseMaxhp / 10);
}
} else {
this.heal(pokemon.baseMaxhp / 12);
}
},
name: "Ange",
},
brassbond: {
onPrepareHit(source, target, move) {
if (move.category === 'Status' || move.multihit || move.flags['noparentalbond'] || move.flags['charge'] ||
move.flags['futuremove'] || move.spreadHit || move.isZ || move.isMax) return;
move.multihit = 3;
move.multihitType = 'brassbond' as 'parentalbond';
},
onTryBoost(boost, target, source, effect) {
if (effect.effectType === 'Move' && effect.multihitType && effect.hit > 1 &&
source && target === source) {
let i: keyof BoostsTable;
for (i in boost) {
delete boost[i];
}
}
},
// Damage modifier implemented in BattleActions#modifyDamage()
onSourceModifySecondaries(secondaries, target, source, move) {
if (move.multihitType && move.hit > 1) {
return [];
}
},
flags: {},
name: "Brass Bond",
gen: 9,
desc: "This Pokemon's damaging moves hit 3x. Successive hits do 15% damage without added effects.",
shortDesc: "This Pokemon's damaging moves hit 3x. Successive hits do 15% damage without added effects.",
},
contrarian: {
onChangeBoost(boost, target, source, effect) {
if (effect && effect.id === 'zpower') return;
let i: BoostID;
for (i in boost) {
boost[i]! *= -2;
}
},
name: "Contrarian",
desc: "This Pokemon has its stat changes inverted and doubled.",
shortDesc: "This Pokemon has its stat changes inverted and doubled.",
gen: 9,
},
corrosion: {
inherit: true,
onModifyMovePriority: -5,
onModifyMove(move) {
if (!move.ignoreImmunity) move.ignoreImmunity = {};
if (move.ignoreImmunity !== true) {
move.ignoreImmunity['Poison'] = true;
}
},
shortDesc: "This Pokemon can poison a Pokemon regardless of its typing and hit them with Poison moves.",
},
ionbattery: {
onModifySpAPriority: 5,
onModifySpA(spa, pokemon) {
return this.chainModify(1.5);
},
flags: { breakable: 1 },
name: "Ion Battery",
desc: "This Pokemon floats and has 1.5x Sp. Atk.",
shortDesc: "This Pokemon floats and has 1.5x Sp. Atk.",
},
luchadorspride: {
onSourceAfterFaint(length, target, source, effect) {
if (effect && effect.effectType === 'Move') {
this.boost({ spe: length }, source);
}
},
flags: {},
name: "Luchador's Pride",
desc: "This Pokemon's Speed is raised by 1 stage if it attacks and knocks out another Pokemon.",
shortDesc: "This Pokemon's Speed is raised by 1 stage if it attacks and KOes another Pokemon.",
gen: 9,
},
protectivethorns: {
gen: 9,
name: "Protective Thorns",
desc: "Bulletproof + Iron Barbs.",
shortDesc: "Bulletproof + Iron Barbs.",
onTryHit(pokemon, target, move) {
if (move.flags['bullet']) {
this.add('-immune', pokemon, '[from] ability: Protective Thorns');
return null;
}
},
onDamagingHitOrder: 1,
onDamagingHit(damage, target, source, move) {
if (this.checkMoveMakesContact(move, source, target, true)) {
this.damage(source.baseMaxhp / 8, source, target);
}
},
flags: { breakable: 1 },
},
minus: {
inherit: true,
onModifySpAPriority: 5,
onModifySpA(spa, pokemon) {
for (const allyActive of pokemon.allies()) {
if (allyActive.hasAbility(['minus', 'plus', 'ionbattery'])) {
return this.chainModify(1.5);
}
}
},
},
plus: {
inherit: true,
onModifySpAPriority: 5,
onModifySpA(spa, pokemon) {
for (const allyActive of pokemon.allies()) {
if (allyActive.hasAbility(['minus', 'plus', 'ionbattery'])) {
return this.chainModify(1.5);
}
}
},
},
};

View File

@ -77,6 +77,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
raichualola: {
tier: "UU",
},
raichumegax: {
tier: "UU",
},
raichumegay: {
tier: "UU",
},
clefairy: {
tier: "NFE",
},
@ -86,6 +92,51 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
clefablemega: {
tier: "(OU)",
},
igglybuff: {
tier: "LC",
},
jigglypuff: {
tier: "NFE",
},
wigglytuff: {
tier: "UU",
},
zubat: {
tier: "LC",
},
golbat: {
tier: "NFE",
},
crobat: {
tier: "UU",
},
meowth: {
tier: "LC",
},
meowthalola: {
tier: "LC",
},
meowthgalar: {
tier: "LC",
},
persian: {
tier: "UU",
},
persianalola: {
tier: "UU",
},
perrserker: {
tier: "UU",
},
mankey: {
tier: "LC",
},
primeape: {
tier: "NFE",
},
annihilape: {
tier: "Uber",
},
abra: {
tier: "LC",
},
@ -93,7 +144,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
alakazam: {
tier: "OU",
tier: "UU",
},
alakazammega: {
tier: "Uber",
@ -134,6 +185,15 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
slowbrogalar: {
tier: "UU",
},
farfetchd: {
tier: "UU",
},
farfetchdgalar: {
tier: "LC",
},
sirfetchd: {
tier: "UU",
},
gastly: {
tier: "LC",
},
@ -141,7 +201,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
gengar: {
tier: "OU",
tier: "UU",
},
gengarmega: {
tier: "Uber",
@ -149,6 +209,15 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
onix: {
tier: "LC",
},
cubone: {
tier: "LC",
},
marowak: {
tier: "UU",
},
marowakalola: {
tier: "UU",
},
kangaskhan: {
tier: "UU",
},
@ -159,11 +228,23 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
starmie: {
tier: "OU",
tier: "UU",
},
starmiemega: {
tier: "OU",
},
mimejr: {
tier: "LC",
},
mrmime: {
tier: "UU",
},
mrmimegalar: {
tier: "NFE",
},
mrrime: {
tier: "UU",
},
scyther: {
tier: "LC",
},
@ -173,6 +254,15 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
pinsirmega: {
tier: "UU",
},
porygon: {
tier: "LC",
},
porygon2: {
tier: "NFE",
},
porygonz: {
tier: "UU",
},
magikarp: {
tier: "LC",
},
@ -186,7 +276,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "LC",
},
vaporeon: {
tier: "OU",
tier: "UU",
},
jolteon: {
tier: "UU",
@ -210,7 +300,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
dragonitemega: {
tier: "OU",
tier: "(OU)",
},
mewtwo: {
tier: "Uber",
@ -273,10 +363,10 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
umbreon: {
tier: "OU",
tier: "UU",
},
slowking: {
tier: "OU",
tier: "UU",
},
slowkinggalar: {
tier: "OU",
@ -287,6 +377,15 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
steelixmega: {
tier: "UU",
},
qwilfish: {
tier: "UU",
},
qwilfishhisui: {
tier: "LC",
},
overqwil: {
tier: "UU",
},
scizor: {
tier: "OU",
},
@ -306,7 +405,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
skarmorymega: {
tier: "OU",
tier: "(OU)",
},
houndour: {
tier: "LC",
@ -329,6 +428,42 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tyranitarmega: {
tier: "(OU)",
},
treecko: {
tier: "LC",
},
grovyle: {
tier: "NFE",
},
sceptile: {
tier: "UU",
},
sceptilemega: {
tier: "UU",
},
torchic: {
tier: "LC",
},
combusken: {
tier: "NFE",
},
blaziken: {
tier: "OU",
},
blazikenmega: {
tier: "Uber",
},
mudkip: {
tier: "LC",
},
marshtomp: {
tier: "NFE",
},
swampert: {
tier: "UU",
},
swampertmega: {
tier: "UU",
},
ralts: {
tier: "LC",
},
@ -386,6 +521,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
roselia: {
tier: "NFE",
},
gulpin: {
tier: "LC",
},
swalot: {
tier: "UU",
},
carvanha: {
tier: "LC",
},
@ -404,6 +545,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
cameruptmega: {
tier: "UU",
},
spoink: {
tier: "LC",
},
grumpig: {
tier: "UU",
},
swablu: {
tier: "LC",
},
@ -413,6 +560,21 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
altariamega: {
tier: "UU",
},
zangoose: {
tier: "UU",
},
seviper: {
tier: "UU",
},
feebas: {
tier: "LC",
},
milotic: {
tier: "UU",
},
kecleon: {
tier: "UU",
},
shuppet: {
tier: "LC",
},
@ -422,12 +584,24 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
banettemega: {
tier: "UU",
},
chingling: {
tier: "LC",
},
chimecho: {
tier: "UU",
},
chimechomega: {
tier: "UU",
},
absol: {
tier: "UU",
},
absolmega: {
tier: "UU",
},
absolmegaz: {
tier: "OU",
},
snorunt: {
tier: "LC",
},
@ -461,6 +635,48 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
metagrossmega: {
tier: "Uber",
},
latias: {
tier: "UU",
},
latiasmega: {
tier: "UU",
},
latios: {
tier: "OU",
},
latiosmega: {
tier: "(OU)",
},
kyogre: {
tier: "Uber",
},
kyogreprimal: {
tier: "Uber",
},
groudon: {
tier: "Uber",
},
groudonprimal: {
tier: "Uber",
},
rayquaza: {
tier: "Uber",
},
rayquazamega: {
tier: "Uber",
},
starly: {
tier: "LC",
},
staravia: {
tier: "NFE",
},
staraptor: {
tier: "UU",
},
staraptormega: {
tier: "UU",
},
budew: {
tier: "LC",
},
@ -488,6 +704,9 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
garchompmega: {
tier: "(OU)",
},
garchompmegaz: {
tier: "OU",
},
riolu: {
tier: "LC",
},
@ -497,6 +716,9 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
lucariomega: {
tier: "Uber",
},
lucariomegaz: {
tier: "OU",
},
hippopotas: {
tier: "LC",
},
@ -530,6 +752,36 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
froslassmega: {
tier: "UU",
},
rotom: {
tier: "UU",
},
rotomheat: {
tier: "UU",
},
rotomwash: {
tier: "OU",
},
rotomfrost: {
tier: "UU",
},
rotomfan: {
tier: "UU",
},
rotommow: {
tier: "UU",
},
heatran: {
tier: "OU",
},
heatranmega: {
tier: "OU",
},
darkrai: {
tier: "OU",
},
darkraimega: {
tier: "(OU)",
},
tepig: {
tier: "LC",
},
@ -548,6 +800,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
watchog: {
tier: "UU",
},
purrloin: {
tier: "LC",
},
liepard: {
tier: "UU",
},
pansage: {
tier: "LC",
},
@ -566,6 +824,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
simipour: {
tier: "UU",
},
munna: {
tier: "LC",
},
musharna: {
tier: "UU",
},
drilbur: {
tier: "LC",
},
@ -581,6 +845,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
audinomega: {
tier: "UU",
},
throh: {
tier: "UU",
},
sawk: {
tier: "UU",
},
venipede: {
tier: "LC",
},
@ -611,6 +881,18 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
scraftymega: {
tier: "UU",
},
yamask: {
tier: "LC",
},
yamaskgalar: {
tier: "LC",
},
cofagrigus: {
tier: "UU",
},
runerigus: {
tier: "UU",
},
trubbish: {
tier: "LC",
},
@ -629,6 +911,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
emolga: {
tier: "UU",
},
foongus: {
tier: "LC",
},
amoonguss: {
tier: "UU",
},
tynamo: {
tier: "LC",
},
@ -653,12 +941,54 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
chandeluremega: {
tier: "UU",
},
cryogonal: {
tier: "UU",
},
stunfisk: {
tier: "UU",
},
stunfiskgalar: {
tier: "UU",
},
golett: {
tier: "LC",
},
golurk: {
tier: "UU",
},
golurkmega: {
tier: "UU",
},
cobalion: {
tier: "UU",
},
terrakion: {
tier: "UU",
},
virizion: {
tier: "UU",
},
keldeo: {
tier: "OU",
},
keldeoresolute: {
},
meloetta: {
tier: "UU",
},
meloettapirouette: {
},
genesect: {
tier: "Uber",
},
genesectdouse: {
},
genesectshock: {
},
genesectburn: {
},
genesectchill: {
},
chespin: {
tier: "LC",
},
@ -666,10 +996,10 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
chesnaught: {
tier: "OU",
tier: "UU",
},
chesnaughtmega: {
tier: "(OU)",
tier: "UU",
},
fennekin: {
tier: "LC",
@ -681,7 +1011,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
delphoxmega: {
tier: "OU",
tier: "UU",
},
froakie: {
tier: "LC",
@ -696,7 +1026,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
greninjamega: {
tier: "OU",
tier: "(OU)",
},
bunnelby: {
tier: "LC",
@ -747,7 +1077,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
floettemega: {
tier: "OU",
tier: "UU",
},
florges: {
tier: "UU",
@ -774,6 +1104,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
meowsticf: {
tier: "OU",
},
meowsticmmega: {
tier: "(OU)",
},
meowsticfmega: {
tier: "(OU)",
},
honedge: {
@ -783,7 +1119,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "NFE",
},
aegislash: {
tier: "OU",
tier: "UU",
},
aegislashblade: {
},
@ -878,7 +1214,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
goodrahisui: {
tier: "OU",
tier: "UU",
},
klefki: {
tier: "UU",
@ -911,7 +1247,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
gourgeistsuper: {
tier: "OU",
tier: "UU",
},
bergmite: {
tier: "LC",
@ -938,7 +1274,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "Uber",
},
zygarde10: {
tier: "OU",
tier: "UU",
},
zygardecomplete: {
tier: "Uber",
@ -961,16 +1297,239 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
volcanion: {
tier: "OU",
},
crabrawler: {
tier: "LC",
},
crabominable: {
tier: "UU",
},
crabominablemega: {
tier: "UU",
},
wimpod: {
tier: "LC",
},
golisopod: {
tier: "UU",
},
golisopodmega: {
tier: "OU",
},
sandygast: {
tier: "LC",
},
palossand: {
tier: "UU",
},
drampa: {
tier: "UU",
},
drampamega: {
tier: "UU",
},
mimikyu: {
tier: "UU",
},
magearna: {
tier: "OU",
},
magearnaoriginal: {
tier: "OU",
},
magearnamega: {
tier: "Uber",
},
magearnaoriginalmega: {
tier: "Uber",
},
marshadow: {
tier: "Uber",
},
zeraora: {
tier: "OU",
},
zeraoramega: {
tier: "OU",
},
meltan: {
tier: "UU",
},
melmetal: {
tier: "OU",
},
rookidee: {
tier: "LC",
},
corvisquire: {
tier: "NFE",
},
corviknight: {
tier: "OU",
},
nickit: {
tier: "LC",
},
thievul: {
tier: "UU",
},
toxel: {
tier: "LC",
},
toxtricity: {
tier: "UU",
},
toxtricitylowkey: {
},
clobbopus: {
tier: "LC",
},
grapploct: {
tier: "UU",
},
falinks: {
tier: "UU",
},
falinksmega: {
tier: "UU",
},
indeedee: {
tier: "UU",
},
indeedeef: {
tier: "UU",
},
morpeko: {
tier: "UU",
},
morpekohangry: {
},
kleavor: {
tier: "UU",
},
fidough: {
tier: "LC",
},
dachsbun: {
tier: "UU",
},
squawkabilly: {
tier: "UU",
},
squawkabillyblue: {
},
squawkabillywhite: {
},
squawkabillyyellow: {
},
nacli: {
tier: "LC",
},
naclstack: {
tier: "NFE",
},
garganacl: {
tier: "UU",
},
charcadet: {
tier: "LC",
},
armarouge: {
tier: "UU",
},
ceruledge: {
tier: "OU",
},
maschiff: {
tier: "LC",
},
mabosstiff: {
tier: "UU",
},
shroodle: {
tier: "LC",
},
grafaiai: {
tier: "UU",
},
capsakid: {
tier: "LC",
},
scovillain: {
tier: "UU",
},
scovillainmega: {
tier: "UU",
},
tinkatink: {
tier: "LC",
},
tinkatuff: {
tier: "NFE",
},
tinkaton: {
tier: "UU",
},
cyclizar: {
tier: "UU",
},
glimmet: {
tier: "LC",
},
glimmora: {
tier: "OU",
},
glimmoramega: {
tier: "(OU)",
},
greavard: {
tier: "LC",
},
houndstone: {
tier: "UU",
},
flamigo: {
tier: "UU",
},
dondozo: {
tier: "UU",
},
tatsugiri: {
tier: "UU",
},
tatsugiridroopy: {
tier: "UU",
},
tatsugiristretchy: {
tier: "UU",
},
tatsugiricurlymega: {
tier: "UU",
},
tatsugiridroopymega: {
tier: "UU",
},
tatsugiristretchymega: {
tier: "UU",
},
frigibax: {
tier: "LC",
},
arctibax: {
tier: "NFE",
},
baxcalibur: {
tier: "OU",
},
baxcaliburmega: {
tier: "(OU)",
},
gimmighoul: {
tier: "LC",
},
gimmighoulroaming: {
tier: "LC",
},
gholdengo: {
tier: "OU",
},
};

View File

@ -13,26 +13,6 @@ export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
return true;
},
},
chesnaughtite: {
inherit: true,
isNonstandard: "Unobtainable",
},
delphoxite: {
inherit: true,
isNonstandard: "Unobtainable",
},
mewtwonitex: {
inherit: true,
isNonstandard: "Unobtainable",
},
mewtwonitey: {
inherit: true,
isNonstandard: "Unobtainable",
},
diancite: {
inherit: true,
isNonstandard: "Unobtainable",
},
zygardite: {
inherit: true,
onTakeItem(item, source) {

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +1,10 @@
export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
gearup: {
volttackle: {
inherit: true,
onHitSide(side, source, move) {
const targets = side.allies().filter(target => (
target.hasAbility(['plus', 'minus', 'magneticflux']) &&
(!target.volatiles['maxguard'] || this.runEvent('TryHit', target, source, move))
));
if (!targets.length) return false;
let didSomething = false;
for (const target of targets) {
didSomething = this.boost({ atk: 1, spa: 1 }, target, source, move, false, true) || didSomething;
onModifyMove(move, pokemon, target) {
if (pokemon.baseSpecies.name === "Raichu-Mega-X") {
move.self = { boosts: { atk: 1 } };
}
return didSomething;
},
},
magneticflux: {
inherit: true,
onHitSide(side, source, move) {
const targets = side.allies().filter(target => (
target.hasAbility(['plus', 'minus', 'magneticflux']) &&
(!target.volatiles['maxguard'] || this.runEvent('TryHit', target, source, move))
));
if (!targets.length) return false;
let didSomething = false;
for (const target of targets) {
didSomething = this.boost({ def: 1, spd: 1 }, target, source, move, false, true) || didSomething;
}
return didSomething;
},
},
smackdown: {
inherit: true,
condition: {
noCopy: true,
onStart(pokemon) {
let applies = false;
if (pokemon.hasType('Flying') || pokemon.hasAbility(['levitate', 'ionbattery'])) applies = true;
if (pokemon.hasItem('ironball') || pokemon.volatiles['ingrain'] ||
this.field.getPseudoWeather('gravity')) applies = false;
if (pokemon.removeVolatile('fly') || pokemon.removeVolatile('bounce')) {
applies = true;
this.queue.cancelMove(pokemon);
pokemon.removeVolatile('twoturnmove');
}
if (pokemon.volatiles['magnetrise']) {
applies = true;
delete pokemon.volatiles['magnetrise'];
}
if (pokemon.volatiles['telekinesis']) {
applies = true;
delete pokemon.volatiles['telekinesis'];
}
if (!applies) return false;
this.add('-start', pokemon, 'Smack Down');
},
onRestart(pokemon) {
if (pokemon.removeVolatile('fly') || pokemon.removeVolatile('bounce')) {
this.queue.cancelMove(pokemon);
pokemon.removeVolatile('twoturnmove');
this.add('-start', pokemon, 'Smack Down');
}
},
// groundedness implemented in battle.engine.js:BattlePokemon#isGrounded
},
},
};

View File

@ -1,11 +1,19 @@
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
clefablemega: {
inherit: true,
abilities: { 0: "Serene Grace" },
abilities: { 0: "Prankster" },
},
victreebelmega: {
inherit: true,
abilities: { 0: "Corrosion" },
abilities: { 0: "Triage" },
},
raichumegax: {
inherit: true,
abilities: { 0: "Levitate" },
},
raichumegay: {
inherit: true,
abilities: { 0: "Transistor" },
},
starmiemega: {
inherit: true,
@ -14,7 +22,7 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
dragonitemega: {
inherit: true,
abilities: { 0: "Soul-Heart" },
abilities: { 0: "Sheer Force" },
},
meganiummega: {
inherit: true,
@ -28,6 +36,14 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
abilities: { 0: "Fluffy" },
},
absolmegaz: {
inherit: true,
abilities: { 0: "Technician" },
},
chimechomega: {
inherit: true,
abilities: { 0: "Levitate" },
},
skarmorymega: {
inherit: true,
abilities: { 0: "Tough Claws" },
@ -40,6 +56,10 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
baseStats: { hp: 60, atk: 100, def: 85, spa: 80, spd: 85, spe: 100 },
},
staraptormega: {
inherit: true,
abilities: { 0: "Tough Claws" },
},
gallademega: {
inherit: true,
abilities: { 0: "Sharpness" },
@ -48,13 +68,33 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
abilities: { 0: "Snow Warning" },
},
garchompmegaz: {
inherit: true,
abilities: { 0: "Rough Skin" },
},
lucariomegaz: {
inherit: true,
abilities: { 0: "Mind's Eye" },
},
heatranmega: {
inherit: true,
abilities: { 0: "Filter" },
},
darkraimega: {
inherit: true,
abilities: { 0: "Dark Aura" },
},
emboarmega: {
inherit: true,
abilities: { 0: "Supreme Overlord" },
},
excadrillmega: {
inherit: true,
abilities: { 0: "Mold Breaker" },
abilities: { 0: "Sand Rush" },
},
golurkmega: {
inherit: true,
abilities: { 0: "Adaptability" },
},
audinomega: {
inherit: true,
@ -70,7 +110,7 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
eelektrossmega: {
inherit: true,
abilities: { 0: "Ion Battery" },
abilities: { 0: "Hadron Engine" },
},
chandeluremega: {
inherit: true,
@ -78,7 +118,7 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
chesnaughtmega: {
inherit: true,
abilities: { 0: "Protective Thorns" },
abilities: { 0: "Grassy Surge" },
},
delphoxmega: {
inherit: true,
@ -88,6 +128,14 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
abilities: { 0: "Protean" },
},
meowsticmmega: {
inherit: true,
abilities: { 0: "Psychic Surge" },
},
meowsticfmega: {
inherit: true,
abilities: { 0: "Psychic Surge" },
},
pyroarmega: {
inherit: true,
abilities: { 0: "Drought" },
@ -98,11 +146,11 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
floettemega: {
inherit: true,
abilities: { 0: "Ange" },
abilities: { 0: "Regenerator" },
},
malamarmega: {
inherit: true,
abilities: { 0: "Contrarian" },
abilities: { 0: "Contrary" },
},
barbaraclemega: {
inherit: true,
@ -110,18 +158,62 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
hawluchamega: {
inherit: true,
abilities: { 0: "Luchador's Pride" },
abilities: { 0: "Stamina" },
},
zygardemega: {
inherit: true,
abilities: { 0: "Aura Break" },
},
crabominablemega: {
inherit: true,
abilities: { 0: "Ice Scales" },
},
golisopodmega: {
inherit: true,
abilities: { 0: "Heatproof" },
},
drampamega: {
inherit: true,
abilities: { 0: "Drizzle" },
abilities: { 0: "Adaptability" },
},
magearnamega: {
inherit: true,
abilities: { 0: "Soul-Heart" },
},
magearnaoriginalmega: {
inherit: true,
abilities: { 0: "Soul-Heart" },
},
zeraoramega: {
inherit: true,
abilities: { 0: "Volt Absorb" },
},
falinksmega: {
inherit: true,
abilities: { 0: "Brass Bond" },
abilities: { 0: "Dauntless Shield" },
},
scovillainmega: {
inherit: true,
abilities: { 0: "Contrary" },
},
glimmoramega: {
inherit: true,
abilities: { 0: "Levitate" },
},
tatsugiricurlymega: {
inherit: true,
abilities: { 0: "Drizzle" },
},
tatsugiridroopymega: {
inherit: true,
abilities: { 0: "Drizzle" },
},
tatsugiristretchymega: {
inherit: true,
abilities: { 0: "Drizzle" },
},
baxcaliburmega: {
inherit: true,
abilities: { 0: "Thermal Exchange" },
},
};

View File

@ -9,7 +9,9 @@ export const Scripts: ModdedBattleScriptsData = {
'powerlens', 'powerweight', 'quickclaw', 'rockyhelmet', 'scopelens', 'sharpbeak', 'shellbell', 'silkscarf', 'silverpowder',
'softsand', 'spelltag', 'twistedspoon', 'weaknesspolicy', 'whiteherb', 'wiseglasses', 'bottlecap', 'goldbottlecap', 'dawnstone',
'duskstone', 'firestone', 'galaricacuff', 'galaricawreath', 'icestone', 'leafstone', 'moonstone', 'sachet', 'shinystone',
'sunstone', 'thunderstone', 'waterstone', 'whippeddream', 'bignugget',
'sunstone', 'thunderstone', 'waterstone', 'whippeddream', 'bignugget', 'redorb', 'blueorb', 'leek', 'thickclub', 'upgrade',
'dubiousdisc', 'prismscale', 'maliciousarmor', 'auspiciousarmor', 'poweranklet', 'powerband', 'powerbelt', 'powerbracer',
'powerlens', 'powerweight', 'bignugget', 'bottlecap', 'goldbottlecap', 'prismscale', 'sachet', 'whippeddream',
];
const legalBerries = [
'aspearberry', 'babiriberry', 'chartiberry', 'cheriberry', 'chestoberry', 'chilanberry', 'chopleberry', 'cobaberry', 'colburberry',
@ -18,12 +20,21 @@ export const Scripts: ModdedBattleScriptsData = {
'sitrusberry', 'tamatoberry', 'tangaberry', 'wacanberry', 'yacheberry',
];
const votedLegalitems = [
'heavydutyboots', 'choiceband', 'choicescarf', 'choicespecs',
'heavydutyboots', 'choiceband', 'choicescarf', 'choicespecs', 'airballoon', 'loadeddice', 'mentalherb', 'powerherb', 'mirrorherb',
'aguavberry', 'apicotberry', 'custapberry', 'enigmaberry', 'figyberry', 'ganlonberry', 'iapapaberry', 'jabocaberry', 'keeberry',
'lansatberry', 'leppaberry', 'liechiberry', 'magoberry', 'marangaberry', 'micleberry', 'petayaberry', 'rowapberry', 'salacberry',
'starfberry', 'wikiberry', 'abilityshield', 'blunderpolicy', 'blacksludge', 'lightclay', 'brightpowder', 'adrenalineorb', 'absorbbulb',
'clearamulet', 'covertcloak', 'damprock', 'heatrock', 'icyrock', 'smoothrock', 'electricseed', 'mistyseed', 'psychicseed', 'grassyseed',
'flameorb', 'toxicorb', 'gripclaw', 'laggingtail', 'metronome', 'protectivepads', 'punchingglove', 'razorclaw', 'razorfang', 'roomservice',
'safetygoggles', 'shellbell', 'shedshell', 'stickybarb', 'terrainextender', 'throatspray', 'utilityumbrella', 'zoomlens', 'bindingband',
'destinyknot', 'floatstone', 'ironball', 'machobrace', 'ringtarget', 'redcard', 'ejectpack', 'ejectbutton', 'souldew', 'cellbattery',
'luminousmoss', 'oddincense', 'roseincense', 'seaincense', 'waveincense', 'snowball',
];
for (const i in this.data.Items) {
if (this.data.Items[i].isNonstandard === 'CAP' || this.data.Items[i].isNonstandard === 'Custom') continue;
if ([...legalItems, ...votedLegalitems, ...legalBerries].includes(i) || this.data.Items[i].megaStone) {
if (['blazikenite', 'swampertite', 'sceptilite'].includes(i)) continue;
if ([...legalItems, ...votedLegalitems, ...legalBerries].includes(i) ||
this.data.Items[i].megaStone || this.data.Items[i].onDrive ||
(this.data.Items[i].onPlate && !this.data.Items[i].zMove)) {
this.modData('Items', i).isNonstandard = null;
} else {
this.modData('Items', i).isNonstandard = 'Past';
@ -34,21 +45,6 @@ export const Scripts: ModdedBattleScriptsData = {
this.modData('Moves', i).isNonstandard = null;
}
},
pokemon: {
isGrounded(negateImmunity = false) {
if ('gravity' in this.battle.field.pseudoWeather) return true;
if ('ingrain' in this.volatiles && this.battle.gen >= 4) return true;
if ('smackdown' in this.volatiles) return true;
const item = (this.ignoringItem() ? '' : this.item);
if (item === 'ironball') return true;
// If a Fire/Flying type uses Burn Up and Roost, it becomes ???/Flying-type, but it's still grounded.
if (!negateImmunity && this.hasType('Flying') && !(this.hasType('???') && 'roost' in this.volatiles)) return false;
if (this.hasAbility(['levitate', 'ionbattery']) && !this.battle.suppressingAbility(this)) return null;
if ('magnetrise' in this.volatiles) return false;
if ('telekinesis' in this.volatiles) return false;
return item !== 'airballoon';
},
},
actions: {
canMegaEvo(pokemon) {
const species = pokemon.baseSpecies;
@ -61,8 +57,21 @@ export const Scripts: ModdedBattleScriptsData = {
pokemon.baseMoves.includes(this.battle.toID(altForme.requiredMove)) && !item.zMove) {
return altForme.name;
}
if (item.megaEvolves === species.name) {
return item.megaStone;
if (Array.isArray(item.megaEvolves)) {
if (!Array.isArray(item.megaStone)) {
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
}
if (item.megaEvolves.length !== item.megaStone.length) {
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`);
}
const index = item.megaEvolves.indexOf(species.name);
if (index < 0) return null;
return item.megaStone[index];
} else {
if (item.megaEvolves === species.name) {
if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
return item.megaStone;
}
}
return null;
},
@ -101,123 +110,5 @@ export const Scripts: ModdedBattleScriptsData = {
this.battle.runEvent('AfterMega', pokemon);
return true;
},
modifyDamage(baseDamage, pokemon, target, move, suppressMessages = false) {
const tr = this.battle.trunc;
if (!move.type) move.type = '???';
const type = move.type;
baseDamage += 2;
if (move.spreadHit) {
// multi-target modifier (doubles only)
const spreadModifier = this.battle.gameType === 'freeforall' ? 0.5 : 0.75;
this.battle.debug(`Spread modifier: ${spreadModifier}`);
baseDamage = this.battle.modify(baseDamage, spreadModifier);
} else if (move.multihitType === 'parentalbond' && move.hit > 1) {
// Parental Bond modifier
const bondModifier = this.battle.gen > 6 ? 0.25 : 0.5;
this.battle.debug(`Parental Bond modifier: ${bondModifier}`);
baseDamage = this.battle.modify(baseDamage, bondModifier);
} else if (move.multihitType === 'brassbond' as 'parentalbond' && move.hit > 1) {
// Brass Bond modifier
const bondModifier = 0.15;
this.battle.debug(`Brass Bond modifier: ${bondModifier}`);
baseDamage = this.battle.modify(baseDamage, bondModifier);
}
// weather modifier
baseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);
// crit - not a modifier
const isCrit = target.getMoveHitData(move).crit;
if (isCrit) {
baseDamage = tr(baseDamage * (move.critModifier || (this.battle.gen >= 6 ? 1.5 : 2)));
}
// random factor - also not a modifier
baseDamage = this.battle.randomizer(baseDamage);
// STAB
// The "???" type never gets STAB
// Not even if you Roost in Gen 4 and somehow manage to use
// Struggle in the same turn.
// (On second thought, it might be easier to get a MissingNo.)
if (type !== '???') {
let stab: number | [number, number] = 1;
const isSTAB = move.forceSTAB || pokemon.hasType(type) || pokemon.getTypes(false, true).includes(type);
if (isSTAB) {
stab = 1.5;
}
// The Stellar tera type makes this incredibly confusing
// If the move's type does not match one of the user's base types,
// the Stellar tera type applies a one-time 1.2x damage boost for that type.
//
// If the move's type does match one of the user's base types,
// then the Stellar tera type applies a one-time 2x STAB boost for that type,
// and then goes back to using the regular 1.5x STAB boost for those types.
if (pokemon.terastallized === 'Stellar') {
if (!pokemon.stellarBoostedTypes.includes(type) || move.stellarBoosted) {
stab = isSTAB ? 2 : [4915, 4096];
move.stellarBoosted = true;
if (pokemon.species.name !== 'Terapagos-Stellar') {
pokemon.stellarBoostedTypes.push(type);
}
}
} else {
if (pokemon.terastallized === type && pokemon.getTypes(false, true).includes(type)) {
stab = 2;
}
stab = this.battle.runEvent('ModifySTAB', pokemon, target, move, stab);
}
baseDamage = this.battle.modify(baseDamage, stab);
}
// types
let typeMod = target.runEffectiveness(move);
typeMod = this.battle.clampIntRange(typeMod, -6, 6);
target.getMoveHitData(move).typeMod = typeMod;
if (typeMod > 0) {
if (!suppressMessages) this.battle.add('-supereffective', target);
for (let i = 0; i < typeMod; i++) {
baseDamage *= 2;
}
}
if (typeMod < 0) {
if (!suppressMessages) this.battle.add('-resisted', target);
for (let i = 0; i > typeMod; i--) {
baseDamage = tr(baseDamage / 2);
}
}
if (isCrit && !suppressMessages) this.battle.add('-crit', target);
if (pokemon.status === 'brn' && move.category === 'Physical' && !pokemon.hasAbility('guts')) {
if (this.battle.gen < 6 || move.id !== 'facade') {
baseDamage = this.battle.modify(baseDamage, 0.5);
}
}
// Generation 5, but nothing later, sets damage to 1 before the final damage modifiers
if (this.battle.gen === 5 && !baseDamage) baseDamage = 1;
// Final modifier. Modifiers that modify damage after min damage check, such as Life Orb.
baseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage);
if (move.isZOrMaxPowered && target.getMoveHitData(move).zBrokeProtect) {
baseDamage = this.battle.modify(baseDamage, 0.25);
this.battle.add('-zbroken', target);
}
// Generation 6-7 moves the check for minimum 1 damage after the final modifier...
if (this.battle.gen !== 5 && !baseDamage) return 1;
// ...but 16-bit truncation happens even later, and can truncate to 0
return tr(baseDamage, 16);
},
},
};

View File

@ -3084,7 +3084,7 @@ export const Conditions: { [id: IDEntry]: ModdedConditionData & { innateName?: s
},
},
// Effects needed to be overriden for things to happen
// Effects needed to be overridden for things to happen
attract: {
onStart(pokemon, source, effect) {
if (!(pokemon.gender === 'M' && source.gender === 'F') && !(pokemon.gender === 'F' && source.gender === 'M')) {

View File

@ -27,9 +27,9 @@ export const ssbSets: SSBSets = {
signatureMove: 'Move Name',
evs: {stat: number}, ivs: {stat: number}, nature: 'Nature', teraType: 'Type',
},
// Species, ability, and item need to be captialized properly ex: Ludicolo, Swift Swim, Life Orb
// Species, ability, and item need to be capitalized properly ex: Ludicolo, Swift Swim, Life Orb
// Gender can be M, F, N, or left as an empty string
// each slot in moves needs to be a string (the move name, captialized properly ex: Hydro Pump), or an array of strings (also move names)
// each slot in moves needs to be a string (the move name, capitalized properly ex: Hydro Pump), or an array of strings (also move names)
// signatureMove also needs to be capitalized properly ex: Scripting
// You can skip Evs (defaults to 84 all) and/or Ivs (defaults to 31 all), or just skip part of the Evs (skipped evs are 0) and/or Ivs (skipped Ivs are 31)
// You can also skip shiny, defaults to false. Level can be skipped (defaults to 100).

View File

@ -964,8 +964,23 @@ export const Scripts: ModdedBattleScriptsData = {
return altForme.name;
}
// a hacked-in Megazard X can mega evolve into Megazard Y, but not into Megazard X
if (item.megaEvolves === species.baseSpecies && item.megaStone !== species.name) {
return item.megaStone;
if (Array.isArray(item.megaEvolves)) {
if (!Array.isArray(item.megaStone)) {
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
}
if (item.megaEvolves.length !== item.megaStone.length) {
throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone length mismatch`);
}
// FIXME: Change to species.name when champions comes
const index = item.megaEvolves.indexOf(species.baseSpecies);
if (index < 0) return null;
return item.megaStone[index];
// FIXME: Change to species.name when champions comes
} else {
if (item.megaEvolves === species.baseSpecies) {
if (Array.isArray(item.megaStone)) throw new Error(`${item.name}#megaEvolves and ${item.name}#megaStone type mismatch`);
return item.megaStone;
}
}
return null;
},

View File

@ -5,10 +5,10 @@ export const Scripts: ModdedBattleScriptsData = {
const item = this.data.Items[i];
if (!item.megaStone && !item.onDrive && !(item.onPlate && !item.zMove) && !item.onMemory) continue;
this.modData('Items', i).onTakeItem = false;
if (item.isNonstandard === "Past") this.modData('Items', i).isNonstandard = null;
if (item.megaStone) {
if (item.isNonstandard === "Past" || item.isNonstandard === "Future") this.modData('Items', i).isNonstandard = null;
/* if (item.megaStone) {
this.modData('FormatsData', this.toID(item.megaStone)).isNonstandard = null;
}
} */
}
},
start() {
@ -386,8 +386,8 @@ export const Scripts: ModdedBattleScriptsData = {
const item = pokemon.getItem();
if (item.megaStone) {
if (item.megaStone === pokemon.baseSpecies.name) return null;
return item.megaStone;
if (item.megaStone.includes(pokemon.baseSpecies.name)) return null;
return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone;
} else {
return null;
}
@ -405,7 +405,7 @@ export const Scripts: ModdedBattleScriptsData = {
const oMegaSpecies = this.dex.species.get((species as any).originalSpecies);
pokemon.formeChange(species, pokemon.getItem(), true);
this.battle.add('-start', pokemon, oMegaSpecies.requiredItem, '[silent]');
if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1]) {
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
this.battle.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
}
// }
@ -466,7 +466,12 @@ export const Scripts: ModdedBattleScriptsData = {
return species;
},
getFormeChangeDeltas(formeChangeSpecies, pokemon) {
const baseSpecies = this.dex.species.get(formeChangeSpecies.baseSpecies);
// Should be fine as long as Necrozma-U doesn't get added or Game Freak makes me sad with some convoluted forme change
let baseSpecies = this.dex.species.get(formeChangeSpecies.isMega ?
formeChangeSpecies.battleOnly as string : formeChangeSpecies.baseSpecies);
if (formeChangeSpecies.name === 'Zygarde-Mega') {
baseSpecies = this.dex.species.get('Zygarde-Complete');
}
const deltas: {
ability: string,
baseStats: SparseStatsTable,
@ -476,6 +481,7 @@ export const Scripts: ModdedBattleScriptsData = {
requiredItem: string | undefined,
type?: string,
formeType?: string,
isMega?: boolean,
} = {
ability: formeChangeSpecies.abilities['0'],
baseStats: {},
@ -491,15 +497,19 @@ export const Scripts: ModdedBattleScriptsData = {
let formeType: string | null = null;
if (['Arceus', 'Silvally'].includes(baseSpecies.name)) {
deltas.type = formeChangeSpecies.types[0];
formeType = 'Arceus';
formeType = 'Primary';
} else if (formeChangeSpecies.types.length > baseSpecies.types.length) {
deltas.type = formeChangeSpecies.types[1];
} else if (formeChangeSpecies.types.length < baseSpecies.types.length) {
deltas.type = this.battle.ruleTable.has('mixandmegaoldaggronite') ? 'mono' : baseSpecies.types[0];
} else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) {
deltas.type = formeChangeSpecies.types[1];
} else if (formeChangeSpecies.types[0] !== baseSpecies.types[0]) {
deltas.type = formeChangeSpecies.types[0];
formeType = 'Primary';
deltas.isMega = true;
}
if (formeChangeSpecies.isMega) formeType = 'Mega';
if (formeChangeSpecies.isMega && !formeType) formeType = 'Mega';
if (formeChangeSpecies.isPrimal) formeType = 'Primal';
if (formeChangeSpecies.name.endsWith('Crowned')) formeType = 'Crowned';
if (formeType) deltas.formeType = formeType;
@ -513,7 +523,7 @@ export const Scripts: ModdedBattleScriptsData = {
if (!deltas) throw new TypeError("Must specify deltas!");
const species = this.dex.deepClone(this.dex.species.get(speciesOrForme));
species.abilities = { '0': deltas.ability };
if (deltas.formeType === 'Arceus') {
if (deltas.formeType === 'Primary') {
const secondType = species.types[1];
species.types = [deltas.type];
if (secondType && secondType !== deltas.type) species.types.push(secondType);
@ -532,7 +542,7 @@ export const Scripts: ModdedBattleScriptsData = {
species.heightm = Math.max(0.1, ((species.heightm * 10) + (deltas.heightm * 10)) / 10);
species.originalSpecies = deltas.originalSpecies;
species.requiredItem = deltas.requiredItem;
if (deltas.formeType === 'Mega') species.isMega = true;
if (deltas.formeType === 'Mega' || deltas.isMega) species.isMega = true;
if (deltas.formeType === 'Primal') species.isPrimal = true;
return species;
},

View File

@ -90,7 +90,7 @@ export const Scripts: ModdedBattleScriptsData = {
this.add('rated', typeof this.rated === 'string' ? this.rated : '');
}
format.onBegin?.call(this);
this.format.onBegin?.call(this);
for (const rule of this.ruleTable.keys()) {
if ('+*-!'.includes(rule.charAt(0))) continue;
const subFormat = this.dex.formats.get(rule);

View File

@ -0,0 +1,135 @@
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
mythicalpresence: {
name: "Mythical Presence",
shortDesc: "Lowers opposing Pokemon Special Attack by 1 stage when switching in.",
onStart(pokemon) {
let activated = false;
for (const target of pokemon.adjacentFoes()) {
if (!activated) {
this.add('-ability', pokemon, 'Mythical Presence', 'boost');
activated = true;
}
if (target.volatiles['substitute']) {
this.add('-immune', target);
} else {
this.boost({ spa: -1 }, target, pokemon, null, true);
}
}
},
},
powerconstruct: {
onResidualOrder: 27,
onResidual(pokemon) {
if (pokemon.baseSpecies.baseSpecies !== 'Flocura' || pokemon.transformed || !pokemon.hp) return;
if (pokemon.species.id === 'flocuranexus' || pokemon.hp > pokemon.maxhp / 2) return;
this.add('-activate', pokemon, 'ability: Power Construct');
pokemon.formeChange('Flocura-Nexus', this.effect, true);
pokemon.baseMaxhp = Math.floor(Math.floor(
2 * pokemon.species.baseStats['hp'] + pokemon.set.ivs['hp'] + Math.floor(pokemon.set.evs['hp'] / 4) + 100
) * pokemon.level / 100 + 10);
const newMaxHP = pokemon.volatiles['dynamax'] ? (2 * pokemon.baseMaxhp) : pokemon.baseMaxhp;
pokemon.hp = newMaxHP - (pokemon.maxhp - pokemon.hp);
pokemon.maxhp = newMaxHP;
this.add('-heal', pokemon, pokemon.getHealth, '[silent]');
},
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
name: "Power Construct",
rating: 5,
num: 211,
},
battlebond: {
shortDesc: "Change to a stronger forme after getting a KO.",
onSourceAfterFaint(length, target, source, effect) {
if (effect?.effectType !== 'Move') {
return;
}
if (source.species.id === 'soleron' && source.hp && !source.transformed && source.side.foe.pokemonLeft) {
this.add('-activate', source, 'ability: Battle Bond');
source.formeChange('Soleron-Awakened', this.effect, true);
}
},
onModifyMovePriority: -1,
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
name: "Battle Bond",
rating: 4,
num: 210,
},
crystalheart: {
shortDesc: "User becomes Crystal type. While Crystal type, 33% boost to Def and SpD",
onStart(pokemon) {
if (pokemon.hasType('Crystal')) return false;
if (!pokemon.addType('Crystal')) return false;
pokemon.setType(["Crystal"]);
this.add('-start', pokemon, 'typechange', 'Crystal', '[from] ability: Crystal Heart');
},
onModifyDefPriority: 6,
onModifyDef(def, pokemon) {
if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3));
},
onModifySpDPriority: 6,
onModifySpD(spd, pokemon) {
if (pokemon.hasType('Crystal')) return this.chainModify(1 + (1 / 3));
},
name: "Crystal Heart",
},
wildheart: {
onStart(pokemon) {
if (pokemon.hasType('Feral')) return false;
if (!pokemon.addType('Feral')) return false;
pokemon.setType(["Feral"]);
this.add('-start', pokemon, 'typechange', "Feral", '[from] ability: Wild Heart');
},
onModifyAtkPriority: 6,
onModifyAtk(atk, pokemon) {
if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3));
},
onModifySpAPriority: 6,
onModifySpA(spa, pokemon) {
if (pokemon.hasType('Feral')) return this.chainModify(1 + (1 / 3));
},
name: "Wild Heart",
shortDesc: "User becomes Feral type. While Feral type, 33% boost to Atk and SpA",
},
schooling: {
onStart(pokemon) {
if (pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed) return;
if (pokemon.hp > pokemon.maxhp / 4) {
if (pokemon.species.id === 'jaegorm') {
pokemon.formeChange('Jaegorm-Collective');
}
} else {
if (pokemon.species.id === 'jaegormcollective') {
pokemon.formeChange('Jaegorm');
}
}
},
onResidualOrder: 27,
onResidual(pokemon) {
if (
pokemon.baseSpecies.baseSpecies !== 'Jaegorm' || pokemon.transformed || !pokemon.hp
) return;
if (pokemon.hp > pokemon.maxhp / 4) {
if (pokemon.species.id === 'jaegorm') {
pokemon.formeChange('Jaegorm-Collective');
}
} else {
if (pokemon.species.id === 'jaegormcollective') {
pokemon.formeChange('Jaegorm');
}
}
},
flags: { failroleplay: 1, noreceiver: 1, noentrain: 1, notrace: 1, failskillswap: 1, cantsuppress: 1 },
name: "Schooling",
shortDesc: "If user is Jaegorm, changes to Collective Form if it has > 1/4 max HP, else Solo Form.",
rating: 3,
num: 208,
},
shellbunker: {
onDamage(damage, target, source, effect) {
if (effect.effectType !== 'Move' || !target.hurtThisTurn) return damage;
return damage / 2;
},
name: "Shell Bunker",
shortDesc: "After taking damage, Def and SpD are doubled for the rest of the turn.",
},
};

View File

@ -0,0 +1,67 @@
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
frz: {
name: 'frz',
/*
start: " [Pokemon] was chilled!",
alreadyStarted: " [POKEMON] is already chilled!",
end: " [POKEMON] warmed up!",
endFromItem: " [POKEMON]'s [ITEM] warmed it up!",
endFromMove: " [POKEMON]'s [MOVE] warmed it up!",
cant: "[POKEMON] is chilled!",
*/
effectType: 'Status',
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
} else {
this.add('-status', target, 'frz');
}
},
onResidualOrder: 9,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 16);
},
onModifySpA(spa, pokemon) {
return this.chainModify(0.5);
},
},
slp: {
name: 'slp',
effectType: 'Status',
onStart(target, source, sourceEffect) {
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'slp', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
} else if (sourceEffect && sourceEffect.effectType === 'Move') {
this.add('-status', target, 'slp', '[from] move: ' + sourceEffect.name);
} else {
this.add('-status', target, 'slp');
}
// 1-3 turns
this.effectState.startTime = 3;
const sleepMoves = ["sleeppowder", "spore", "grasswhistle", "darkvoid", "hypnosis"];
if (sourceEffect && sourceEffect.effectType === 'Move') {
if (sleepMoves.includes(sourceEffect.id)) this.effectState.startTime = 2;
}
this.effectState.time = this.effectState.startTime;
},
onBeforeMovePriority: 10,
onBeforeMove(pokemon, target, move) {
if (pokemon.hasAbility('earlybird')) {
pokemon.statusState.time--;
}
pokemon.statusState.time--;
if (pokemon.statusState.time <= 0) {
pokemon.cureStatus();
return;
}
this.add('cant', pokemon, 'slp');
if (move.sleepUsable) {
return;
}
return false;
},
onModifySpe(spe, pokemon) {
return this.chainModify(0.5);
},
},
};

View File

@ -0,0 +1,218 @@
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
arbrella: {
tier: "OU",
doublesTier: "DOU",
},
krachiten: {
tier: "OU",
doublesTier: "DOU",
},
scalaron: {
tier: "OU",
doublesTier: "DOU",
},
rantler: {
tier: "OU",
doublesTier: "DOU",
},
woolora: {
tier: "OU",
doublesTier: "DOU",
},
albatrygon: {
tier: "OU",
doublesTier: "DOU",
},
orchile: {
tier: "OU",
doublesTier: "DOU",
},
embuck: {
tier: "OU",
doublesTier: "DOU",
},
cindoe: {
tier: "OU",
doublesTier: "DOU",
},
cobracotta: {
tier: "OU",
doublesTier: "DOU",
},
minillow: {
tier: "OU",
doublesTier: "DOU",
},
crossont: {
tier: "OU",
doublesTier: "DOU",
},
torgeist: {
tier: "OU",
doublesTier: "DOU",
},
platypad: {
tier: "OU",
doublesTier: "DOU",
},
lumoth: {
tier: "OU",
doublesTier: "DOU",
},
aurorowl: {
tier: "OU",
doublesTier: "DOU",
},
carapex: {
tier: "OU",
doublesTier: "DOU",
},
dojodo: {
tier: "OU",
doublesTier: "DOU",
},
nunopod: {
tier: "OU",
doublesTier: "DOU",
},
zeploom: {
tier: "OU",
doublesTier: "DOU",
},
sturgard: {
tier: "OU",
doublesTier: "DOU",
},
brawnkey: {
tier: "OU",
doublesTier: "DOU",
},
salamalix: {
tier: "OU",
doublesTier: "DOU",
},
cinnastar: {
tier: "OU",
doublesTier: "DOU",
},
muabboa: {
tier: "OU",
doublesTier: "DOU",
},
harzodia: {
tier: "OU",
doublesTier: "DOU",
},
cyllindrake: {
tier: "OU",
doublesTier: "DOU",
},
kodokai: {
tier: "OU",
doublesTier: "DOU",
},
electangle: {
tier: "OU",
doublesTier: "DOU",
},
dolphena: {
tier: "OU",
doublesTier: "DOU",
},
soleron: {
tier: "OU",
doublesTier: "DOU",
},
jaegorm: {
tier: "OU",
doublesTier: "DOU",
},
elemadillo: {
tier: "OU",
doublesTier: "DOU",
},
axolacred: {
tier: "OU",
doublesTier: "DOU",
},
roscenti: {
tier: "OU",
doublesTier: "DOU",
},
blunderbusk: {
tier: "OU",
doublesTier: "DOU",
},
barracoth: {
tier: "OU",
doublesTier: "DOU",
},
jamborai: {
tier: "OU",
doublesTier: "DOU",
},
dracoil: {
tier: "OU",
doublesTier: "DOU",
},
celespirit: {
tier: "OU",
doublesTier: "DOU",
},
noxtrice: {
tier: "OU",
doublesTier: "DOU",
},
avastar: {
tier: "OU",
doublesTier: "DOU",
},
faerenheit: {
tier: "OU",
doublesTier: "DOU",
},
cellsius: {
tier: "OU",
doublesTier: "DOU",
},
kelven: {
tier: "OU",
doublesTier: "DOU",
},
salaos: {
tier: "OU",
doublesTier: "DOU",
},
morndos: {
tier: "OU",
doublesTier: "DOU",
},
pythos: {
tier: "OU",
doublesTier: "DOU",
},
corundell: {
tier: "OU",
doublesTier: "DOU",
},
quadringo: {
tier: "OU",
doublesTier: "DOU",
},
saphor: {
tier: "OU",
doublesTier: "DOU",
},
fenreil: {
tier: "OU",
doublesTier: "DOU",
},
efflor: {
tier: "OU",
doublesTier: "DOU",
},
flocura: {
tier: "OU",
doublesTier: "DOU",
},
};

View File

@ -0,0 +1,88 @@
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
crystalorb: {
name: "Crystal Orb",
num: 1001,
desc: "The holder's secondary type is replaced with Crystal. 20% boost to Crystal attacks.",
onBeforeSwitchIn(pokemon) {
if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false;
if (pokemon.hasType('Crystal')) return false;
if (!pokemon.addType('Crystal')) return false;
pokemon.setType([pokemon.types[0], "Crystal"]);
this.effectState.usedSuperType = true;
this.effectState.superTypeUser = "first_switch";
},
onStart(pokemon) {
if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") {
this.add('-message', pokemon.name + " is a Crystal type!");
this.effectState.superTypeUser = pokemon.fullname;
}
if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) {
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
}
},
onUpdate(pokemon) {
if (
this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Crystal')
) {
pokemon.setType([pokemon.types[0], "Crystal"]);
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
}
},
onTakeItem(item, pokemon, source) {
if (source?.hasType("Crystal")) {
return false;
}
return true;
},
onBasePowerPriority: 15,
onBasePower(basePower, user, target, move) {
if (move && move.type === 'Crystal') {
return this.chainModify([0x1333, 0x1000]);
}
},
gen: 9,
},
feralorb: {
name: "Feral Orb",
num: 1002,
desc: "The holder's secondary type is replaced with Feral. 20% boost to Feral attacks.",
onBeforeSwitchIn(pokemon) {
if (this.effectState.usedSuperType && this.effectState.superTypeUser !== pokemon.fullname) return false;
if (pokemon.hasType('Feral')) return false;
if (!pokemon.addType('Feral')) return false;
pokemon.setType([pokemon.types[0], "Feral"]);
this.effectState.usedSuperType = true;
this.effectState.superTypeUser = "first_switch";
},
onStart(pokemon) {
if (this.effectState.usedSuperType && this.effectState.superTypeUser === "first_switch") {
this.add('-message', pokemon.name + " is a Feral type!");
this.effectState.superTypeUser = pokemon.fullname;
}
if (this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname) {
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
}
},
onUpdate(pokemon) {
if (
this.effectState.usedSuperType && this.effectState.superTypeUser === pokemon.fullname && !pokemon.hasType('Feral')
) {
pokemon.setType([pokemon.types[0], "Feral"]);
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
}
},
onTakeItem(item, pokemon, source) {
if (source?.hasType("Feral")) {
return false;
}
return true;
},
onBasePowerPriority: 15,
onBasePower(basePower, user, target, move) {
if (move && move.type === 'Feral') {
return this.chainModify([0x1333, 0x1000]);
}
},
gen: 9,
},
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,551 @@
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
arbrella: {
num: 2001,
name: "Arbrella",
types: ["Grass", "Ground"],
baseStats: { hp: 80, atk: 115, def: 100, spa: 80, spd: 80, spe: 75 },
abilities: { 0: "Overgrow", H: "Tough Claws" },
weightkg: 211,
eggGroups: ["Undiscovered"],
},
krachiten: {
num: 2002,
name: "Krachiten",
types: ["Water", "Bug"],
baseStats: { hp: 90, atk: 120, def: 70, spa: 78, spd: 60, spe: 112 },
abilities: { 0: "Torrent", H: "Sniper" },
weightkg: 59,
eggGroups: ["Undiscovered"],
},
scalaron: {
num: 2003,
name: "Scalaron",
types: ["Fire", "Flying"],
baseStats: { hp: 90, atk: 70, def: 90, spa: 100, spd: 105, spe: 75 },
abilities: { 0: "Blaze", H: "Filter" },
weightkg: 70,
eggGroups: ["Undiscovered"],
},
rantler: {
num: 2004,
name: "Rantler",
types: ["Normal", "Ice"],
baseStats: { hp: 68, atk: 118, def: 94, spa: 43, spd: 79, spe: 73 },
abilities: { 0: "Intimidate", 1: "Slush Rush", H: "Tough Claws" },
weightkg: 67,
eggGroups: ["Undiscovered"],
},
woolora: {
num: 2005,
name: "Woolora",
types: ["Fairy"],
baseStats: { hp: 70, atk: 75, def: 70, spa: 95, spd: 115, spe: 70 },
abilities: { 0: "Fluffy", 1: "Rattled", H: "Pastel Veil" },
weightkg: 50.3,
eggGroups: ["Undiscovered"],
},
albatrygon: {
num: 2006,
name: "Albatrygon",
types: ["Flying"],
baseStats: { hp: 80, atk: 105, def: 70, spa: 65, spd: 60, spe: 95 },
abilities: { 0: "Prankster", 1: "Klutz", H: "Unburden" },
weightkg: 10.1,
eggGroups: ["Undiscovered"],
},
orchile: {
num: 2007,
name: "Orchile",
types: ["Grass", "Fairy"],
baseStats: { hp: 65, atk: 60, def: 75, spa: 110, spd: 121, spe: 64 },
abilities: { 0: "Sweet Veil", 1: "Aroma Veil", H: "Flower Veil" },
weightkg: 45,
eggGroups: ["Undiscovered"],
},
embuck: {
num: 2008,
name: "Embuck",
types: ["Fire", "Fighting"],
baseStats: { hp: 90, atk: 125, def: 80, spa: 83, spd: 65, spe: 82 },
abilities: { 0: "Intimidate", H: "Flash Fire" },
weightkg: 113,
eggGroups: ["Undiscovered"],
},
cindoe: {
num: 2009,
name: "Cindoe",
types: ["Fire", "Dark"],
baseStats: { hp: 80, atk: 74, def: 55, spa: 110, spd: 100, spe: 106 },
abilities: { 0: "Natural Cure", H: "Flash Fire" },
weightkg: 67,
eggGroups: ["Undiscovered"],
},
cobracotta: {
num: 2010,
name: "Cobracotta",
types: ["Grass", "Poison"],
baseStats: { hp: 80, atk: 90, def: 95, spa: 80, spd: 115, spe: 35 },
abilities: { 0: "Mold Breaker", 1: "Weak Armor", H: "Heatproof" },
weightkg: 68,
eggGroups: ["Undiscovered"],
},
minillow: {
num: 2011,
name: "Minillow",
types: ["Water", "Fairy"],
baseStats: { hp: 70, atk: 64, def: 75, spa: 90, spd: 95, spe: 81 },
abilities: { 0: "Swift Swim", 1: "Dazzling", H: "Adaptability" },
weightkg: 22,
eggGroups: ["Undiscovered"],
},
crossont: {
num: 2012,
name: "Crossont",
types: ["Bug", "Fighting"],
baseStats: { hp: 80, atk: 125, def: 100, spa: 60, spd: 80, spe: 80 },
abilities: { 0: "Sniper", 1: "Long Reach", H: "Gooey" },
weightkg: 121,
eggGroups: ["Undiscovered"],
},
torgeist: {
num: 2013,
name: "Torgeist",
types: ["Ghost", "Flying"],
baseStats: { hp: 55, atk: 65, def: 95, spa: 115, spd: 100, spe: 105 },
abilities: { 0: "Cursed Body", 1: "Clear Body", H: "Merciless" },
weightkg: 9.7,
eggGroups: ["Undiscovered"],
},
platypad: {
num: 2014,
name: "Platypad",
types: ["Grass", "Water"],
baseStats: { hp: 120, atk: 100, def: 80, spa: 100, spd: 80, spe: 40 },
abilities: { 0: "Thick Fat", 1: "Triage", H: "Flower Veil" },
weightkg: 89,
eggGroups: ["Undiscovered"],
},
lumoth: {
num: 2015,
name: "Lumoth",
types: ["Bug", "Ghost"],
baseStats: { hp: 60, atk: 55, def: 91, spa: 110, spd: 85, spe: 94 },
abilities: { 0: "Levitate" },
weightkg: 0.5,
eggGroups: ["Undiscovered"],
},
aurorowl: {
num: 2016,
name: "Aurorowl",
types: ["Ice", "Flying"],
baseStats: { hp: 70, atk: 70, def: 65, spa: 95, spd: 95, spe: 115 },
abilities: { 0: "Snow Cloak", H: "Technician" },
weightkg: 15,
eggGroups: ["Undiscovered"],
},
carapex: {
num: 2017,
name: "Carapex",
types: ["Bug", "Flying"],
baseStats: { hp: 75, atk: 105, def: 155, spa: 55, spd: 90, spe: 60 },
abilities: { 0: "Wind Rider", 1: "Mold Breaker", H: "Sturdy" },
weightkg: 135,
eggGroups: ["Undiscovered"],
},
dojodo: {
num: 2018,
name: "Dojodo",
types: ["Fighting"],
baseStats: { hp: 90, atk: 115, def: 80, spa: 65, spd: 100, spe: 80 },
abilities: { 0: "Iron Fist", 1: "Stamina", H: "Supreme Overlord" },
weightkg: 53,
eggGroups: ["Undiscovered"],
},
nunopod: {
num: 2019,
name: "Nunopod",
types: ["Ground", "Bug"],
baseStats: { hp: 80, atk: 110, def: 125, spa: 68, spd: 75, spe: 67 },
abilities: { 0: "Earth Eater", H: "Opportunist" },
weightkg: 68,
eggGroups: ["Undiscovered"],
},
zeploom: {
num: 2020,
name: "Zeploom",
types: ["Grass", "Ground"],
baseStats: { hp: 55, atk: 55, def: 145, spa: 65, spd: 150, spe: 45 },
abilities: { 0: "Wind Rider", H: "Levitate" },
weightkg: 5,
eggGroups: ["Undiscovered"],
},
brawnkey: {
num: 2021,
name: "Brawnkey",
types: ["Steel", "Fighting"],
baseStats: { hp: 95, atk: 105, def: 105, spa: 85, spd: 80, spe: 50 },
abilities: { 0: "Levitate" },
weightkg: 85,
eggGroups: ["Undiscovered"],
},
salamalix: {
num: 2022,
name: "Salamalix",
types: ["Rock", "Steel"],
baseStats: { hp: 70, atk: 120, def: 120, spa: 45, spd: 65, spe: 90 },
abilities: { 0: "No Guard", 1: "Mold Breaker", H: "Intimidate" },
weightkg: 85,
eggGroups: ["Undiscovered"],
},
cinnastar: {
num: 2023,
name: "Cinnastar",
types: ["Rock", "Poison"],
baseStats: { hp: 110, atk: 95, def: 80, spa: 95, spd: 80, spe: 80 },
abilities: { 0: "Liquid Ooze", H: "Regenerator" },
weightkg: 56,
eggGroups: ["Undiscovered"],
},
muabboa: {
num: 2024,
name: "MuabBoa",
types: ["Ground", "Fighting"],
baseStats: { hp: 65, atk: 100, def: 75, spa: 55, spd: 65, spe: 120 },
abilities: { 0: "Anticipation", 1: "Sand Rush", H: "Inner Focus" },
weightkg: 25,
eggGroups: ["Undiscovered"],
},
volvolpa: {
num: 2025,
name: "Volvolpa",
types: ["Electric", "Ice"],
baseStats: { hp: 76, atk: 97, def: 64, spa: 70, spd: 102, spe: 121 },
abilities: { 0: "Slush Rush", 1: "Volt Absorb", H: "Strong Jaw" },
weightkg: 27,
eggGroups: ["Undiscovered"],
},
harzodia: {
num: 2026,
name: "Harzodia",
types: ["Psychic"],
baseStats: { hp: 65, atk: 55, def: 75, spa: 125, spd: 75, spe: 95 },
abilities: { 0: "Prankster", 1: "Unburden", H: "Solar Power" },
weightkg: 35,
eggGroups: ["Undiscovered"],
},
cyllindrake: {
num: 2027,
name: "Cyllindrake",
types: ["Steel", "Dragon"],
baseStats: { hp: 70, atk: 85, def: 115, spa: 95, spd: 70, spe: 110 },
abilities: { 0: "Heavy Metal", 1: "Punk Rock", H: "Scrappy" },
weightkg: 180,
eggGroups: ["Undiscovered"],
},
kodokai: {
num: 2028,
name: "Kodokai",
types: ["Ghost", "Fire"],
baseStats: { hp: 110, atk: 65, def: 100, spa: 110, spd: 90, spe: 30 },
abilities: { 0: "White Smoke", H: "Aroma Veil" },
weightkg: 50,
eggGroups: ["Undiscovered"],
},
electangle: {
num: 2029,
name: "Electangle",
types: ["Steel", "Electric"],
baseStats: { hp: 120, atk: 90, def: 110, spa: 90, spd: 90, spe: 25 },
abilities: { 0: "Filter" },
weightkg: 190,
eggGroups: ["Undiscovered"],
},
dolphena: {
num: 2030,
name: "Dolphena",
types: ["Water", "Dragon"],
baseStats: { hp: 95, atk: 125, def: 80, spa: 84, spd: 75, spe: 81 },
abilities: { 0: "Anger Point", H: "Mythical Presence" },
weightkg: 271,
eggGroups: ["Undiscovered"],
},
elemadillo: {
num: 2035,
name: "Elemadillo",
types: ["Steel", "Electric"],
baseStats: { hp: 67, atk: 94, def: 73, spa: 103, spd: 64, spe: 129 },
abilities: { 0: "Weak Armor", 1: "Motor Drive", H: "Stalwart" },
weightkg: 58,
eggGroups: ["Undiscovered"],
},
axolacred: {
num: 2036,
name: "Axolacred",
types: ["Dragon"],
baseStats: { hp: 85, atk: 90, def: 85, spa: 95, spd: 95, spe: 65 },
abilities: { 0: "Magic Guard", H: "Purifying Salt" },
weightkg: 33,
eggGroups: ["Undiscovered"],
},
roscenti: {
num: 2037,
name: "Roscenti",
types: ["Bug", "Grass"],
baseStats: { hp: 80, atk: 115, def: 100, spa: 75, spd: 80, spe: 100 },
abilities: { 0: "Sheer Force", 1: "Chlorophyll", H: "Skill Link" },
eggGroups: ["Undiscovered"],
weightkg: 37,
},
blunderbusk: {
num: 2038,
name: "Blunderbusk",
types: ["Water"],
baseStats: { hp: 73, atk: 67, def: 124, spa: 128, spd: 89, spe: 24 },
abilities: { 0: "Mega Launcher", H: "Shell Bunker" },
weightkg: 86,
eggGroups: ["Undiscovered"],
},
barracoth: {
num: 2039,
name: "Barracoth",
types: ["Ice", "Water"],
baseStats: { hp: 140, atk: 115, def: 110, spa: 55, spd: 65, spe: 35 },
abilities: { 0: "Filter", 1: "Thick Fat", H: "Multiscale" },
weightkg: 356,
eggGroups: ["Undiscovered"],
},
jamborai: {
num: 2040,
name: "Jamborai",
types: ["Poison", "Psychic"],
baseStats: { hp: 75, atk: 55, def: 125, spa: 120, spd: 85, spe: 65 },
abilities: { 0: "Clear Body", 1: "Gooey", H: "Water Absorb" },
weightkg: 84,
eggGroups: ["Undiscovered"],
},
dracoil: {
num: 2041,
name: "Dracoil",
types: ["Dragon", "Flying"],
baseStats: { hp: 105, atk: 106, def: 85, spa: 96, spd: 60, spe: 78 },
abilities: { 0: "Mythical Presence", 1: "Gluttony", H: "Marvel Scale" },
weightkg: 428,
eggGroups: ["Undiscovered"],
},
celespirit: {
num: 2042,
name: "Celespirit",
types: ["Ghost"],
baseStats: { hp: 75, atk: 61, def: 73, spa: 117, spd: 135, spe: 69 },
abilities: { 0: "Levitate", H: "Power Spot" },
weightkg: 25.8,
eggGroups: ["Undiscovered"],
},
noxtrice: {
num: 2043,
name: "Noxtrice",
types: ["Poison", "Fire"],
baseStats: { hp: 65, atk: 118, def: 75, spa: 63, spd: 80, spe: 114 },
abilities: { 0: "Poison Touch", H: "Flash Fire" },
weightkg: 73.7,
eggGroups: ["Undiscovered"],
},
sturgard: {
num: 2055,
name: "Sturgard",
types: ["Water", "Ground"],
baseStats: { hp: 105, atk: 110, def: 105, spa: 65, spd: 70, spe: 70 },
abilities: { 0: "Rock Head", 1: "Battle Armor", H: "Mold Breaker" },
weightkg: 143,
eggGroups: ["Undiscovered"],
},
avastar: {
num: 2034,
name: "Avastar",
types: ["Psychic", "Steel"],
baseStats: { hp: 75, atk: 85, def: 110, spa: 115, spd: 100, spe: 60 },
abilities: { 0: "Stalwart", 1: "Heavy Metal", H: "Shell Bunker" },
weightkg: 999.9,
eggGroups: ["Undiscovered"],
},
faerenheit: {
num: 2044,
name: "Faerenheit",
types: ["Fire", "Fairy"],
baseStats: { hp: 71, atk: 83, def: 127, spa: 97, spd: 109, spe: 83 },
abilities: { 0: "Beast Boost" },
weightkg: 2.1,
eggGroups: ["Undiscovered"],
},
cellsius: {
num: 2045,
name: "Cellsius",
types: ["Water", "Fairy"],
baseStats: { hp: 71, atk: 83, def: 83, spa: 109, spd: 127, spe: 97 },
abilities: { 0: "Beast Boost" },
weightkg: 2.4,
eggGroups: ["Undiscovered"],
},
kelven: {
num: 2046,
name: "Kelven",
types: ["Ice", "Fairy"],
baseStats: { hp: 71, atk: 127, def: 109, spa: 83, spd: 83, spe: 97 },
abilities: { 0: "Beast Boost" },
weightkg: 2.8,
eggGroups: ["Undiscovered"],
},
salaos: {
num: 2047,
name: "Salaos",
types: ["Dark"],
baseStats: { hp: 75, atk: 85, def: 90, spa: 110, spd: 130, spe: 90 },
abilities: { 0: "Good as Gold" },
weightkg: 74,
eggGroups: ["Undiscovered"],
},
morndos: {
num: 2048,
name: "Morndos",
types: ["Dark", "Flying"],
baseStats: { hp: 110, atk: 90, def: 75, spa: 90, spd: 85, spe: 130 },
abilities: { 0: "Synchronize" },
weightkg: 56,
eggGroups: ["Undiscovered"],
},
pythos: {
num: 2049,
name: "Pythos",
types: ["Dark"],
baseStats: { hp: 90, atk: 110, def: 130, spa: 85, spd: 90, spe: 75 },
abilities: { 0: "Guts" },
weightkg: 178,
eggGroups: ["Undiscovered"],
},
corundell: {
num: 2050,
name: "Corundell",
types: ["Rock", "Electric"],
baseStats: { hp: 75, atk: 100, def: 130, spa: 105, spd: 80, spe: 110 },
abilities: { 0: "Lightning Rod", H: "Protosynthesis" },
weightkg: 137,
eggGroups: ["Undiscovered"],
},
quadringo: {
num: 2051,
name: "Quadringo",
types: ["Fairy", "Dragon"],
baseStats: { hp: 80, atk: 120, def: 95, spa: 100, spd: 120, spe: 85 },
abilities: { 0: "Hydration", 1: "Pastel Veil", H: "Inner Focus" },
weightkg: 156,
eggGroups: ["Undiscovered"],
},
saphor: {
num: 2052,
name: "Saphor",
types: ["Ground", "Normal"],
baseStats: { hp: 95, atk: 100, def: 105, spa: 100, spd: 105, spe: 95 },
abilities: { 0: "Thick Fat", 1: "Crystal Heart" },
weightkg: 638,
eggGroups: ["Undiscovered"],
},
fenreil: {
num: 2053,
name: "Fenreil",
types: ["Dark", "Normal"],
baseStats: { hp: 80, atk: 105, def: 97, spa: 105, spd: 97, spe: 116 },
abilities: { 0: "Natural Cure", 1: "Wild Heart" },
weightkg: 232,
eggGroups: ["Undiscovered"],
},
soleron: {
num: 2031,
name: "Soleron",
types: ["Electric", "Flying"],
baseStats: { hp: 70, atk: 75, def: 65, spa: 115, spd: 75, spe: 115 },
abilities: { 0: "Battle Bond" },
otherFormes: ["Soleron-Awakened"],
formeOrder: ["Soleron", "Soleron-Awakened"],
weightkg: 12,
eggGroups: ["Undiscovered"],
},
soleronawakened: {
num: 2031,
name: "Soleron-Awakened",
baseSpecies: "Soleron",
forme: "Awakened",
types: ["Electric", "Flying"],
baseStats: { hp: 70, atk: 105, def: 85, spa: 135, spd: 95, spe: 125 },
abilities: { 0: "Battle Bond" },
requiredAbility: "Battle Bond",
battleOnly: "Soleron",
weightkg: 24,
eggGroups: ["Undiscovered"],
},
efflor: {
num: 2032,
name: "Efflor",
types: ["Rock", "Grass"],
baseStats: { hp: 80, atk: 85, def: 110, spa: 105, spd: 110, spe: 25 },
abilities: { 0: "Solid Rock", 1: "Unaware", H: "Seed Sower" },
weightkg: 113,
eggGroups: ["Undiscovered"],
},
pictagon: {
num: 2055,
name: "Pictagon",
types: ["Dragon", "Ghost"],
baseStats: { hp: 105, atk: 105, def: 60, spa: 80, spd: 85, spe: 95 },
abilities: { 0: "Clear Body", 1: "Infiltrator", H: "No Guard" },
weightkg: 113,
eggGroups: ["Undiscovered"],
},
jaegorm: {
num: 2033,
name: "Jaegorm",
types: ["Bug", "Psychic"],
baseStats: { hp: 60, atk: 65, def: 40, spa: 130, spd: 40, spe: 130 },
abilities: { 0: "Schooling" },
otherFormes: ["Jaegorm-Collective"],
formeOrder: ["Jaegorm", "Jaegorm-Collective"],
weightkg: 10,
eggGroups: ["Undiscovered"],
},
jaegormcollective: {
num: 2033,
name: "Jaegorm-Collective",
baseSpecies: "Jaegorm",
forme: "Collective",
types: ["Bug", "Psychic"],
baseStats: { hp: 60, atk: 145, def: 130, spa: 100, spd: 130, spe: 80 },
abilities: { 0: "Schooling" },
requiredAbility: "Schooling",
battleOnly: "Jaegorm",
weightkg: 122,
eggGroups: ["Undiscovered"],
},
flocura: {
num: 2054,
name: "Flocura",
types: ["Grass", "Psychic"],
baseStats: { hp: 55, atk: 85, def: 55, spa: 107, spd: 180, spe: 118 },
abilities: { 0: "Levitate", H: "Power Construct" },
otherFormes: ["Flocura-Nexus"],
formeOrder: ["Flocura", "Flocura-Nexus"],
weightkg: 7.1,
eggGroups: ["Undiscovered"],
},
flocuranexus: {
num: 2054,
name: "Flocura-Nexus",
baseSpecies: "Flocura",
forme: "Nexus",
types: ["Grass", "Psychic"],
baseStats: { hp: 105, atk: 125, def: 105, spa: 137, spd: 180, spe: 48 },
abilities: { 0: "Levitate", H: "Power Construct" },
requiredAbility: "Power Construct",
battleOnly: "Flocura",
weightkg: 999,
eggGroups: ["Undiscovered"],
},
};

View File

@ -0,0 +1,38 @@
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
supertypemovesrule: {
effectType: 'Rule',
name: 'Super Type Moves Rule',
desc: 'Prevents pokemon from using Crystal or Feral moves unless they have a matching type.',
onBeforeMove(pokemon, target, move) {
move = {
...this.dex.moves.get(move),
hit: move.hit,
};
if (move.type === "Crystal" && !pokemon.hasType("Crystal")) return false;
if (move.type === "Feral" && !pokemon.hasType("Feral")) return false;
},
onDisableMove(pokemon) {
for (const moveSlot of pokemon.moveSlots) {
const move = this.dex.moves.get(moveSlot.id);
if ((move.type === "Crystal" && !pokemon.hasType("Crystal")) || (move.type === "Feral" && !pokemon.hasType("Feral"))) {
pokemon.disableMove(moveSlot.id, false);
}
}
},
},
spriteviewer: {
effectType: 'ValidatorRule',
name: 'Sprite Viewer',
desc: "Displays a fakemon's sprite in chat when it is switched in for the first time",
onBegin() {
this.add('rule', 'Sprite Viewer: Displays sprites in chat');
},
onSwitchIn(pokemon) {
if (!this.effectState[pokemon.species.id]) {
this.add('-message', `${pokemon.species.name}'s Sprite:`);
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/refs/heads/main/data/mods/scootopia/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
this.effectState[pokemon.species.id] = true;
}
},
},
};

View File

@ -0,0 +1,530 @@
export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = {
bug: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 2,
Fire: 1,
Flying: 1,
Ghost: 0,
Grass: 2,
Ground: 2,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 1,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 0,
},
HPivs: { atk: 30, def: 30, spd: 30 },
HPdvs: { atk: 13, def: 13 },
},
dark: {
damageTaken: {
prankster: 3,
Bug: 1,
Dark: 2,
Dragon: 0,
Electric: 0,
Fairy: 1,
Fighting: 1,
Fire: 0,
Flying: 0,
Ghost: 2,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 3,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 1,
Feral: 0,
},
HPivs: {},
},
dragon: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 1,
Electric: 2,
Fairy: 1,
Fighting: 0,
Fire: 2,
Flying: 0,
Ghost: 0,
Grass: 2,
Ground: 0,
Ice: 1,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 0,
Water: 2,
Crystal: 0,
Feral: 2,
},
HPivs: { atk: 30 },
HPdvs: { def: 14 },
},
electric: {
damageTaken: {
par: 3,
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 2,
Fairy: 0,
Fighting: 0,
Fire: 0,
Flying: 2,
Ghost: 0,
Grass: 0,
Ground: 1,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 2,
Water: 0,
Crystal: 2,
Feral: 0,
},
HPivs: { spa: 30 },
HPdvs: { atk: 14 },
},
fairy: {
damageTaken: {
Bug: 2,
Dark: 2,
Dragon: 3,
Electric: 0,
Fairy: 0,
Fighting: 2,
Fire: 0,
Flying: 0,
Ghost: 0,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 1,
Psychic: 0,
Rock: 0,
Steel: 1,
Water: 0,
Crystal: 0,
Feral: 1,
},
},
fighting: {
damageTaken: {
Bug: 2,
Dark: 2,
Dragon: 0,
Electric: 0,
Fairy: 1,
Fighting: 0,
Fire: 0,
Flying: 1,
Ghost: 0,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 1,
Rock: 2,
Steel: 0,
Water: 0,
Crystal: 2,
Feral: 0,
},
HPivs: { def: 30, spa: 30, spd: 30, spe: 30 },
HPdvs: { atk: 12, def: 12 },
},
fire: {
damageTaken: {
brn: 3,
Bug: 2,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 2,
Fighting: 0,
Fire: 2,
Flying: 0,
Ghost: 0,
Grass: 2,
Ground: 1,
Ice: 2,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 1,
Steel: 2,
Water: 1,
Crystal: 1,
Feral: 2,
},
HPivs: { atk: 30, spa: 30, spe: 30 },
HPdvs: { atk: 14, def: 12 },
},
flying: {
damageTaken: {
Bug: 2,
Dark: 0,
Dragon: 0,
Electric: 1,
Fairy: 0,
Fighting: 2,
Fire: 0,
Flying: 0,
Ghost: 0,
Grass: 2,
Ground: 3,
Ice: 1,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 1,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 1,
},
HPivs: { hp: 30, atk: 30, def: 30, spa: 30, spd: 30 },
HPdvs: { atk: 12, def: 13 },
},
ghost: {
damageTaken: {
trapped: 3,
Bug: 2,
Dark: 1,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 3,
Fire: 0,
Flying: 0,
Ghost: 1,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 3,
Poison: 2,
Psychic: 0,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 1,
Feral: 2,
},
HPivs: { def: 30, spd: 30 },
HPdvs: { atk: 13, def: 14 },
},
grass: {
damageTaken: {
powder: 3,
Bug: 1,
Dark: 0,
Dragon: 0,
Electric: 2,
Fairy: 0,
Fighting: 0,
Fire: 1,
Flying: 1,
Ghost: 0,
Grass: 2,
Ground: 2,
Ice: 1,
Normal: 0,
Poison: 1,
Psychic: 0,
Rock: 0,
Steel: 0,
Water: 2,
Crystal: 0,
Feral: 1,
},
HPivs: { atk: 30, spa: 30 },
HPdvs: { atk: 14, def: 14 },
},
ground: {
damageTaken: {
sandstorm: 3,
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 3,
Fairy: 0,
Fighting: 0,
Fire: 0,
Flying: 0,
Ghost: 0,
Grass: 1,
Ground: 0,
Ice: 1,
Normal: 0,
Poison: 2,
Psychic: 0,
Rock: 2,
Steel: 0,
Water: 1,
Crystal: 0,
Feral: 0,
},
HPivs: { spa: 30, spd: 30 },
HPdvs: { atk: 12 },
},
ice: {
damageTaken: {
hail: 3,
frz: 3,
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 1,
Fire: 1,
Flying: 0,
Ghost: 0,
Grass: 0,
Ground: 0,
Ice: 2,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 1,
Steel: 1,
Water: 0,
Crystal: 0,
Feral: 0,
},
HPivs: { atk: 30, def: 30 },
HPdvs: { def: 13 },
},
normal: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 1,
Fire: 0,
Flying: 0,
Ghost: 3,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 1,
},
},
poison: {
damageTaken: {
psn: 3,
tox: 3,
Bug: 2,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 2,
Fighting: 2,
Fire: 0,
Flying: 0,
Ghost: 0,
Grass: 2,
Ground: 1,
Ice: 0,
Normal: 0,
Poison: 2,
Psychic: 1,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 2,
},
HPivs: { def: 30, spa: 30, spd: 30 },
HPdvs: { atk: 12, def: 14 },
},
psychic: {
damageTaken: {
Bug: 1,
Dark: 1,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 2,
Fire: 0,
Flying: 0,
Ghost: 1,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 2,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 0,
},
HPivs: { atk: 30, spe: 30 },
HPdvs: { def: 12 },
},
rock: {
damageTaken: {
sandstorm: 3,
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 1,
Fire: 2,
Flying: 2,
Ghost: 0,
Grass: 1,
Ground: 1,
Ice: 0,
Normal: 2,
Poison: 2,
Psychic: 0,
Rock: 0,
Steel: 1,
Water: 1,
Crystal: 0,
Feral: 0,
},
HPivs: { def: 30, spd: 30, spe: 30 },
HPdvs: { atk: 13, def: 12 },
},
steel: {
damageTaken: {
psn: 3,
tox: 3,
sandstorm: 3,
Bug: 2,
Dark: 0,
Dragon: 2,
Electric: 0,
Fairy: 2,
Fighting: 1,
Fire: 1,
Flying: 2,
Ghost: 0,
Grass: 2,
Ground: 1,
Ice: 2,
Normal: 2,
Poison: 3,
Psychic: 2,
Rock: 2,
Steel: 2,
Water: 0,
Crystal: 2,
Feral: 0,
},
HPivs: { spd: 30 },
HPdvs: { atk: 13 },
},
water: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 1,
Fairy: 0,
Fighting: 0,
Fire: 2,
Flying: 0,
Ghost: 0,
Grass: 1,
Ground: 0,
Ice: 2,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 2,
Water: 2,
Crystal: 0,
Feral: 1,
},
HPivs: { atk: 30, def: 30, spa: 30 },
HPdvs: { atk: 14, def: 13 },
},
crystal: {
damageTaken: {
brn: 3,
sandstorm: 3,
Bug: 0,
Dark: 2,
Dragon: 0,
Electric: 1,
Fairy: 0,
Fighting: 1,
Fire: 2,
Flying: 0,
Ghost: 0,
Grass: 0,
Ground: 2,
Ice: 0,
Normal: 2,
Poison: 0,
Psychic: 0,
Rock: 2,
Steel: 1,
Water: 2,
Crystal: 2,
Feral: 2,
},
},
feral: {
damageTaken: {
slp: 3,
Bug: 0,
Dark: 0,
Dragon: 1,
Electric: 0,
Fairy: 2,
Fighting: 0,
Fire: 1,
Flying: 0,
Ghost: 2,
Grass: 0,
Ground: 0,
Ice: 2,
Normal: 0,
Poison: 1,
Psychic: 0,
Rock: 0,
Steel: 0,
Water: 0,
Crystal: 0,
Feral: 0,
},
},
};

View File

@ -1,414 +0,0 @@
export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTable = {
abyssallight: {
onSourceModifyAtkPriority: 6,
onSourceModifyAtk(atk, attacker, defender, move) {
if (move.type === 'Dark' || move.type === 'Ghost') {
this.debug('Abyssal Light weaken');
return this.chainModify(0.5);
}
},
onSourceModifySpAPriority: 5,
onSourceModifySpA(atk, attacker, defender, move) {
if (move.type === 'Dark' || move.type === 'Ghost') {
this.debug('Abyssal Light weaken');
return this.chainModify(0.5);
}
},
flags: { breakable: 1 },
name: "Abyssal Light",
shortDesc: "This Pokemon takes halved damage from Dark and Ghost-type moves.",
},
ahexual: {
onTryHit(target, source, move) {
const tricks = [
'bombinomicon', 'wordsdance', 'hex', 'trickortreat', 'confuseray',
'flowertrick', 'powertrick', 'trick', 'trickroom',
];
if (tricks.includes(move.id)) {
if (!this.heal(target.baseMaxhp / 4)) {
this.add('-immune', target, '[from] ability: Ahexual');
}
return null;
}
},
flags: { breakable: 1 },
name: "Ahexual",
shortDesc: "This Pokemon heals 1/2 max HP when hit by a trick move; immune to tricks.",
},
cursedbody: {
onSourceModifyDamage(damage, source, target, move) {
if (this.effectState.cursed) return;
return this.chainModify(0.75);
},
onDamagingHit(damage, target, source, move) {
if (this.effectState.cursed || source.volatiles['disable']) return;
if (!move.isMax && !move.flags['futuremove'] && move.id !== 'struggle') {
this.effectState.cursed = true;
source.addVolatile('disable', this.effectState.target);
}
},
onSwitchIn(pokemon) {
delete this.effectState.cursed;
},
name: "Cursed Body",
shortDesc: "When attacked, takes 75% damage and disables the move. Once per switch in.",
},
dummy: {
onStart(pokemon) {
this.actions.useMove("substitute", pokemon);
},
name: "Dummy",
shortDesc: "On switchin, this Pokemon uses Substitute.",
},
jankster: {
onDamagingHit(damage, target, source, move) {
this.add('-ability', target, 'Jankster');
if (move.category === 'Physical') {
const newatk = target.storedStats.atk;
target.storedStats.atk = source.storedStats.atk;
source.storedStats.atk = newatk;
this.add('-message', `${target.name}'s and ${target.name}'s Attack were swapped!`);
} else {
const newspa = target.storedStats.spa;
target.storedStats.spa = newspa;
source.storedStats.spa = newspa;
this.add('-message', `${target.name}'s and ${target.name}'s Special Attack were swapped!`);
}
},
flags: { breakable: 1 },
name: "Jankster",
shortDesc: "When this Pokemon is hit, it swaps its corresponding attack stat with the attacker.",
},
jumpscare: {
onStart(pokemon) {
if (!this.effectState.scare) {
this.effectState.scare = true;
this.add('-ability', pokemon, 'Jumpscare');
for (const target of pokemon.adjacentFoes()) {
if (target.volatiles['substitute']) {
this.add('-immune', target);
} else {
target.addVolatile('jumpscare');
}
}
}
},
name: "Jumpscare",
shortDesc: "On switchin, opposing Pokemon flinch. Once per battle.",
},
magician: {
name: "Magician",
shortDesc: "This Pokemon heals 1/16 max HP while behind a Substitute.",
onStart(pokemon) {
const switchin = [
'I am here!',
'I have come!',
'Merasmus has risen!',
'Cower fools! Merasmus is here!',
'Run fools! Run from Merasmus!',
'Merasmus the Wizard has come for your souls!',
'(evil laughter)',
'(wicked laughter)',
'(diabolical laughter)',
'Soldier! Never anger a magician!',
'Welcome. To your doom!',
'DOOM! All of you are doomed!',
'Enjoy Halloween mortals, for it will be your last!',
'Merasmus arrives on a tide of blood! *sotto voce* Oh hello, Soldier.',
];
this.add('-message', `${this.sample(switchin)}`);
},
onResidual(pokemon) {
if (pokemon.volatiles['substitute']) {
const sub = [
'Must hide and heal.',
'Must hide and heal.',
'Must hide. Get stronger.',
'Must hide. Must heal.',
'Must hide. Must heal.',
'Merasmus must hide.',
'Merasmus must hide.',
'No strength. Must hide.',
'No! This cannot be the end! Must hide.',
'Fools! I will come back stronger!',
'Fools! Do you not know you deal with the master of hiding!',
'Fools! Feel the terror of my hiding!',
'You cannot kill me fools! For I am great at hiding!',
'The hide-ening! It is here! Okay, need to find a hiding-spot.',
'Time to play hide-and-seek...your doom!',
'Must hide. Get stronger.',
'You have bested my magic! But can you withstand the dark power...of HIDING!',
];
this.add('-message', `${this.sample(sub)}`);
this.heal(pokemon.baseMaxhp / 16, pokemon, pokemon);
}
},
onSwitchOut(pokemon) {
const switchout = [
'Goodbye... Forever!',
'Alright, I\'m leaving now.',
'Alright, I\'m leaving now.',
'Goodbye, everyone!',
'Well, that was fun. Off I go!',
'Alright, goodbye everyone!',
'Enough! I leave.',
'A-ha! Too slow! I leave!',
'*Evil laugh* Goodbye, forever!',
'*Evil laugh* Goodbye, forever! *sotto voce* I\'ll see you at home, Soldier.',
'You have amused Merasmus, but now I must attend to other eldritch business. Farewell!',
'*Evil laugh* I bid you, farewell!',
'Farewell! Happy Halloween, everyone!',
'I leave you... to your doom!',
];
this.add('-message', `${this.sample(switchout)}`);
},
onFaint(pokemon) {
const faint = [
'Ach, no!',
'You win. No, wait, it\'s a tie! Argh...',
'Aaah!',
'Aaah!',
'Oooh!',
'Nyyaaagh! I hate you so much, Soldier!',
'You haven\'t heard the last of Merasmus the Magician!',
'I die, I diieeee... bye Soldier.', 'I die! Soldier, you were the wooorst roommate!',
'I die! I curse this land, for a hundred years!- No! A thousand! Thousand year-oh, I die!',
'Noooo!',
'Noooo!',
];
this.add('-message', `${this.sample(faint)}`);
},
},
mutualexclusion: {
onStart(target) {
this.add('-activate', target, 'ability: Mutual Exclusion');
target.addVolatile('imprison');
},
name: "Mutual Exclusion",
shortDesc: "On switchin, this Pokemon gains Imprison.",
},
onderguard: {
onDamagingHit(damage, target, source, effect) {
if (this.randomChance(1, 2)) this.boost({ def: 1, spd: -1 });
else this.boost({ def: -1, spd: 1 });
},
name: "Onder Guard",
shortDesc: "When his Pokemon is hit, Def +1/SpD -1 or vice versa.",
},
perishbody: {
onDamagingHit(damage, target, source, move) {
if (source.volatiles['perishsong']) return;
this.add('-ability', target, 'Perish Body');
source.addVolatile('perishsong');
},
flags: { },
name: "Perish Body",
shortDesc: "When this Pokemon is damaged by an attack, the attacker gains Perish Song.",
},
pinfiltrator: {
onModifyMove(move) {
move.infiltrates = true;
},
onSourceDamagingHit(damage, target, source, move) {
this.damage(target.baseMaxhp / 8, target, source);
},
name: "PInfiltrator",
shortDesc: "This Pokemon's moves ignore Substitute/screens and deal an extra 1/8 max HP.",
},
powerofalchemy: {
name: "Power of Alchemy",
shortDesc: "On switch-in, swaps ability with the opponent.",
onSwitchIn(pokemon) {
this.effectState.switchingIn = true;
},
onStart(pokemon) {
if (!pokemon.isStarted || !this.effectState.switchingIn) return;
const additionalBannedAbilities = [
// Zen Mode included here for compatability with Gen 5-6
'noability', 'flowergift', 'forecast', 'hungerswitch', 'illusion', 'wanderingspirit',
'imposter', 'neutralizinggas', 'powerofalchemy', 'receiver', 'trace', 'zenmode',
];
const possibleTargets = pokemon.foes().filter(foeActive => foeActive && !foeActive.getAbility().flags['cantsuppress'] &&
!additionalBannedAbilities.includes(foeActive.ability) && foeActive.isAdjacent(pokemon));
if (possibleTargets.length) {
let rand = 0;
if (possibleTargets.length > 1) rand = this.random(possibleTargets.length);
const target = possibleTargets[rand];
const ability = target.getAbility();
if (pokemon.setAbility(ability) && target.setAbility('powerofalchemy')) {
this.add('-ability', target, 'Power of Alchemy');
this.add('-ability', pokemon, ability.name);
} else {
pokemon.setAbility('powerofalchemy');
}
}
},
},
ppressure: {
onStart(pokemon) {
this.add('-ability', pokemon, 'PPressure');
},
onDeductPP(target, source) {
if (target.isAlly(source)) return;
return 2;
},
onModifyAtkPriority: 5,
name: "PPressure",
shortDesc: "When a move targets this Pokemon, that move loses 2 additional PP.",
},
pulpup: {
onDamagingHit(damage, target, source, effect) {
target.addVolatile('stockpile');
},
onModifyTypePriority: -1,
onModifyType(move, pokemon) {
const noModifyType = [
'judgment', 'multiattack', 'naturalgift', 'revelationdance', 'technoblast', 'terrainpulse', 'weatherball',
];
if (move.type === 'Normal' && !noModifyType.includes(move.id) &&
!(move.isZ && move.category !== 'Status') && move.name !== 'Explosion' &&
!(move.name === 'Tera Blast' && pokemon.terastallized)) {
move.type = 'Fire';
move.typeChangerBoosted = this.effect;
}
},
name: "Pulp Up",
shortDesc: "This Pokemon gains 1 Stockpile upon damage. Normal-type moves become Fire-type.",
},
wandrush: {
onStart(source) {
this.field.setWeather('sandstorm');
},
onModifySpe(spe, pokemon) {
if (this.field.isWeather('sandstorm')) {
return this.chainModify(1.5);
}
},
onModifySpAPriority: 5,
onModifySpA(spa, pokemon) {
if (this.field.isWeather('sandstorm')) {
return this.chainModify(1.5);
}
},
onImmunity(type, pokemon) {
if (type === 'sandstorm') return false;
},
name: "Wand Rush",
shortDesc: "On switchin, sets Sandstorm. Sandstorm: SpA/Spe 1.5x; immunity to sand.",
},
revive: {
// see scripts.ts
name: "Revive",
shortDesc: "Non-functional placeholder",
/* shortDesc: "When this Pokemon has 0 HP, it switches out and is revived to 1/2 max HP. Once per battle.",
onBeforeSwitchIn(pokemon) {
if (this.effectState.zombie) {
this.effectState.zombie = false;
this.effectState.switchedIn = undefined;
}
},
onFaint(pokemon) {
if (pokemon.name === 'Trevenant' && !this.effectState.zombie && this.canSwitch(pokemon.side)) {
if (pokemon.formeChange('Trevenant-Revenant', this.effect, true)) {
this.add('-ability', pokemon, 'Revive');
this.effectState.zombie = true;
pokemon.hp = Math.floor(pokemon.maxhp / 2);
pokemon.setAbility('reckless');
}
}
}, */
},
shapeshift: {
name: "Shapeshift",
shortDesc: "If this Pokemon is a Rotom, certain moves cause it to change forme.",
onBeforeMove(source, target, move) {
switch (move.type) {
case "Fire":
if (source.species.id !== "rotomheat") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom-Heat");
}
break;
case "Water":
if (source.species.id !== "rotomwash") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom-Wash");
}
break;
case "Grass":
if (source.species.id !== "rotommow") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom-Mow");
}
break;
case "Ice":
if (source.species.id !== "rotomfrost") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom-Frost");
}
break;
case "Flying":
if (source.species.id !== "rotomfan") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom-Fan");
}
break;
case "Ghost":
if (source.species.id !== "rotom") {
this.add('-activate', source, 'ability: Shapeshift');
source.formeChange("Rotom");
}
break;
}
},
},
spoky: {
name: "Spoky",
shortDesc: "This Pokemon's type effectiveness is reversed when attacking or getting attacked.",
onStart(target) {
this.add('-ability', target, 'Spoky');
},
onEffectiveness(typeMod) {
return typeMod * -1;
},
onFoeEffectiveness(typeMod) {
return typeMod * -1;
},
},
undead: {
onModifyMovePriority: -5,
onModifyMove(move) {
if (!move.ignoreImmunity) move.ignoreImmunity = {};
if (move.ignoreImmunity !== true) {
move.ignoreImmunity['Ghost'] = true;
}
},
name: "Undead",
shortDesc: "This Pokemon can hit Normal-types with Ghost attacks.",
},
vamp: {
onModifyMove(move) {
if (!move.drain) move.drain = [1, 3];
},
name: "Vamp",
shortDesc: "This Pokemon's attacks heal for 33% of the damage dealt.",
},
wonderguard: {
onTryHit(target, source, move) {
if (target === source || move.category === 'Status' || move.type === '???' || move.id === 'struggle') return;
if (move.id === 'skydrop' && !source.volatiles['skydrop']) return;
this.debug('Wonder Guard immunity: ' + move.id);
if (target.runEffectiveness(move) !== 0) {
if (move.smartTarget) {
move.smartTarget = false;
} else {
this.add('-immune', target, '[from] ability: Wonder Guard');
}
return null;
}
},
flags: { breakable: 1 },
name: "Wonder Guard",
shortDesc: "This Pokemon can only be hit by neutral attacks.",
},
};

View File

@ -1,225 +0,0 @@
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
brn: {
inherit: true,
duration: 10,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 12);
},
onModifyMove(move, pokemon) {
if (move.type === "Water") {
this.add('-curestatus', pokemon, 'brn', `[from] move: ${move}`);
pokemon.clearStatus();
}
},
onDamagingHit(damage, target, source, move) {
if (move.type === 'Water' && move.category !== 'Status') {
this.add('-curestatus', target, 'brn', `[from] move: ${move}`);
target.cureStatus();
}
},
onEnd(target) {
this.add('-end', target, 'brn');
target.clearStatus();
},
},
psn: {
inherit: true,
duration: 5,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 12);
},
onEnd(target) {
this.add('-end', target, 'psn');
target.clearStatus();
},
},
superjump: {
name: 'Super Jump',
effectType: 'Weather',
duration: 5,
onWeatherModifyDamage(damage, attacker, defender, move) {
if ([
'highjumpkick', 'jumpkick', 'axe kick', 'doublekick', 'thunderouskick', 'lowkick', 'megakick', 'triplekick',
'tropkick', 'skyuppercut', 'stomp', 'stompingtantrum', 'bounce', 'fly', 'skyattack', 'blastjump',
].includes(move.id)) {
this.debug('Jump boost');
return this.chainModify(1.5);
}
},
onFieldStart(battle, source, effect) {
if (effect?.effectType === 'Ability') {
if (this.gen <= 5) this.effectState.duration = 0;
this.add('-weather', 'Super Jump', '[from] ability: ' + effect.name, `[of] ${source}`);
} else {
this.add('-weather', 'Super Jump', '-silent');
}
},
onTryMovePriority: 1,
onTryMove(attacker, defender, move) {
if (move.type === 'Ground' && move.category !== 'Status') {
this.debug('Super Jump suppress');
this.add('-fail', attacker, move, '[from] Super Jump');
this.attrLastMove('[still]');
return null;
}
},
onFieldResidualOrder: 1,
onFieldResidual() {
this.add('-weather', 'Super Jump', '[upkeep]');
this.eachEvent('Weather');
},
onFieldEnd() {
this.add('-weather', 'none');
},
},
ubercharge: {
name: 'ubercharge',
duration: 1,
// this is a volatile status
onStart(target, source, sourceEffect) {
this.add('-start', target, 'ubercharge', "[silent]");
this.add('-message', `${target.name} was ubercharged!`);
},
onEnd(target) {
this.add('-end', target, 'ubercharge', "[silent]");
this.add('-message', `${target.name}'s ubercharge wore off!`);
},
onInvulnerability(target, source, move) {
return false;
},
},
jarate: {
name: 'Jarate',
duration: 1,
// this is a volatile status
onStart(target, source, sourceEffect) {
this.add('-start', target, 'jarate', '[silent]');
this.add('-message', `${target.name} was covered in Jarate!`);
},
onEnd(target) {
this.add('-end', target, 'jarate', "[silent]");
this.add('-message', `${target.name}'s Jarate wore off!`);
},
onSourceModifyDamage(damage, source, target, move) {
this.add("-crit", target);
return this.chainModify(1.35);
},
},
flinch: {
inherit: true,
// flinches: true,
},
jumpscare: {
name: 'jumpscare',
// flinches: true,
duration: 1,
onBeforeMovePriority: 8,
onBeforeMove(pokemon) {
const rand = this.random(6);
switch (rand) {
case 0:
this.add(`raw|<img src="https://pbs.twimg.com/media/E5tJ3LOWEAEuOx5.jpg" height="400" width="400">`);
this.add('-message', `BOO! Did I scare you? I'm a job application 😂😂`);
break;
case 1:
this.add(`raw|<img src="https://i.kym-cdn.com/photos/images/list/002/166/933/8a3.gif" height="400" width="400">`);
break;
case 2:
this.add(`raw|<img src="https://i.pinimg.com/originals/68/12/4c/68124cdddd5615b4c11df6dcdbe1ff7f.gif" height="400" width="400">`);
break;
case 3:
this.add(`raw|<img src="https://www.videomeme.in/wp-content/uploads/2022/12/1669720009775.jpg" height="400" width="400">`);
this.add('-message', `Ghost, From That Game With The Ghost Guy In It (I Don't Remember What It Was Called)`);
break;
case 4:
this.add(`raw|<img src="https://static.wikia.nocookie.net/slenderfortress/images/4/46/Zepheniah_Ghost.png" height="400" width="400">`);
this.add('-message', `BOO`);
break;
case 5:
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/38ec8d41f26b57766acda4ab509659b7e134b4f8/data/mods/spookymod/sprites/front/talkinchu.png" height="4540" width="411">`);
this.add('-message', `"Deez" ~ DuoM2`);
break;
default:
this.add(`raw|<img src="https://steamuserimages-a.akamaihd.net/ugc/950713639436160734/A6DB24F241B8A496DED1033A4A345E05A8336DFA/?imw=637&imh=358&ima=fit&impolicy=Letterbox&imcolor=%23000000&letterbox=true" height="400" width="400">`);
this.hint("Connection Lost: Auto-disconnect in 24.7 seconds");
}
this.add('cant', pokemon, 'flinch');
this.runEvent('Flinch', pokemon);
return false;
},
},
fakedynamax: {
inherit: true,
duration: 1,
onStart(pokemon) {
this.add('-start', pokemon, 'Dynamax', '[silent]');
if (pokemon.species.id === 'gourgeistgigantic') {
this.add('-message', `${pokemon.name} grew so large it exploded!`);
this.actions.useMove('Explosion', pokemon);
}
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Dynamax', '[silent]');
},
},
summon: {
// this is a slot condition
onResidualOrder: 3,
onResidual(target) {
this.effectState.target = this.effectState.side.active[this.effectState.position];
const data = this.effectState;
const move = this.dex.moves.get(data.move);
if (data.target.fainted || data.target === data.source) {
this.hint(`${move.name} did not hit because the target is ${(data.fainted ? 'fainted' : 'the user')}.`);
return;
}
this.add('-message', `${(data.target.illusion ? data.target.illusion.name : data.target.name)} took the ${move.name} attack!`);
data.moveData.accuracy = true;
data.moveData.isFutureMove = true;
delete data.moveData.flags['protect'];
const hitMove = new this.dex.Move(data.moveData) as ActiveMove;
if (data.source.isActive) {
this.add('-anim', data.source, hitMove, data.target);
}
this.actions.trySpreadMoveHit([data.target], data.source, hitMove);
},
onEnd(target) {
this.effectState.target = this.effectState.side.active[this.effectState.position];
const data = this.effectState;
const move = this.dex.moves.get(data.move);
if (data.target.fainted || data.target === data.source) {
this.hint(`${move.name} did not hit because the target is ${(data.fainted ? 'fainted' : 'the user')}.`);
return;
}
this.add('-message', `${(data.target.illusion ? data.target.illusion.name : data.target.name)} took the ${move.name} attack!`);
data.moveData.accuracy = true;
data.moveData.isFutureMove = true;
delete data.moveData.flags['protect'];
const hitMove = new this.dex.Move(data.moveData) as ActiveMove;
if (data.source.isActive) {
this.add('-anim', data.source, hitMove, data.target);
}
this.actions.trySpreadMoveHit([data.target], data.source, hitMove);
},
},
shrunken: {
name: 'Shrunken',
duration: 1,
// this is a volatile status
onStart(target, source, sourceEffect) {
this.add('-start', target, 'shrunken', '[silent]');
this.add('-message', `${target.name} shrunk!`);
target.formeChange(target.species.id + 'shrunken');
if (target.species.id === 'gourgeisttinyshrunken') {
this.add('-message', `${target.name} shrunk so small it disappeared from existence!`);
target.faint();
}
},
onEnd(target) {
this.add('-end', target, 'shrunken', "[silent]");
this.add('-message', `${target.name} returned to full size!`);
target.formeChange(target.baseSpecies);
},
},
};

View File

@ -1,262 +0,0 @@
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
aegislash: {
tier: "OU",
doublesTier: "DOU",
},
banettemega: {
tier: "OU",
doublesTier: "DOU",
},
ceruledge: {
tier: "OU",
doublesTier: "DOU",
},
dofagrigus: {
tier: "OU",
doublesTier: "DOU",
},
eddyazbear: {
tier: "OU",
doublesTier: "DOU",
},
fluttermane: {
tier: "OU",
doublesTier: "DOU",
},
fluttermane2: {
tier: "OU",
doublesTier: "DOU",
},
gourgeisttiny: {
tier: "OU",
doublesTier: "DOU",
},
gourgeist: {
tier: "OU",
doublesTier: "DOU",
},
gourgeistlarge: {
tier: "OU",
doublesTier: "DOU",
},
gourgeistgigantic: {
tier: "OU",
doublesTier: "DOU",
},
houndstone: {
tier: "OU",
doublesTier: "DOU",
},
indeedee: {
tier: "OU",
doublesTier: "DOU",
},
jableye: {
tier: "OU",
doublesTier: "DOU",
},
jobapplication: {
tier: "OU",
doublesTier: "DOU",
},
lanturnevil: {
tier: "OU",
doublesTier: "DOU",
},
merasmus: {
tier: "OU",
doublesTier: "DOU",
},
nursola: {
tier: "OU",
doublesTier: "DOU",
},
okestarspirit: {
tier: "OU",
doublesTier: "DOU",
},
ppiritomb: {
tier: "OU",
doublesTier: "DOU",
},
quagsiredead: {
tier: "OU",
doublesTier: "DOU",
},
rotom: {
tier: "OU",
doublesTier: "DOU",
},
shedinja: {
tier: "OU",
doublesTier: "DOU",
},
trevenant: {
tier: "OU",
doublesTier: "DOU",
},
ursalunabloodmoon: {
tier: "OU",
doublesTier: "DOU",
},
kilotic: {
tier: "OU",
doublesTier: "DOU",
},
vampharos: {
tier: "OU",
doublesTier: "DOU",
},
wunala: {
tier: "OU",
doublesTier: "DOU",
},
xorygonz: {
tier: "OU",
doublesTier: "DOU",
},
yveltal: {
tier: "OU",
doublesTier: "DOU",
},
zoroarkhisui: {
tier: "OU",
doublesTier: "DOU",
},
aegislashshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
banettemegashrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
ceruledgeshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
dofagrigusshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
eddyazbearshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
fluttermaneshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
fluttermane2shrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeisttinyshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeistshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeistlargeshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeistgiganticshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
houndstoneshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
indeedeeshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
jableyeshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
jobapplicationshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
lanturnevilshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
merasmusshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
nursolashrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
okestarspiritshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
ppiritombshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
quagsiredeadshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
rotomshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
shedinjashrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
trevenantshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
ursalunabloodmoonshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
kiloticshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
vampharosshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
wunalashrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
xorygonzshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
yveltalshrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
zoroarkhisuishrunken: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeistsmall: {
tier: "Illegal",
doublesTier: "Illegal",
},
gourgeistsuper: {
tier: "Illegal",
doublesTier: "Illegal",
},
trevenantrevenant: {
tier: "Illegal",
doublesTier: "Illegal",
},
};

View File

@ -1,39 +0,0 @@
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
spellbookmagazine: {
name: "Spellbook Magazine",
shortDesc: "Lets the user pick up and cast spells.",
onTakeItem(item, pokemon, source, move) {
return false;
},
onResidual(pokemon) {
if (pokemon.volatiles['spellbookmagazine']) return;
const rand = this.random(4);
const spells = [
"Shadow Leap", "Fire BaIl", "Blast Jump", "Overheal", "Bat Swarm", "Pumpkin MIRV", "Stealth",
"MONOCULUS!", "Skeleton Horde", "Ball O' Lightning", "Meteor Shower", "Minify",
].map(x => ({ move: x, id: this.toID(x), pp: 1, maxpp: 1, target: "normal", disabled: false, used: false }));
if (rand === 0) {
const randSpell = this.sample(spells);
pokemon.moveSlots.push(randSpell);
pokemon.addVolatile("spellbookmagazine");
}
},
condition: {
onResidual(pokemon) {
if (!pokemon.lastMoveUsed) {
return false;
}
const spells = [
'Shadow Leap', 'FirebaIl', 'Blast Jump', 'Overheal', 'Bat Swarm', 'Pumpkin MIRV', 'Stealth',
'MONOCULUS!', 'Skeleton Horde', 'Ball O\' Lightning', 'Meteor Shower', 'Minify',
];
if (!spells.includes(pokemon.lastMoveUsed.name) || pokemon.lastMoveUsed.pp !== 0) return;
pokemon.moveSlots.pop();
pokemon.removeVolatile("spellbookmagazine");
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Spell', '[silent]');
},
},
},
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,769 +0,0 @@
export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable = {
aegislash: {
inherit: true,
num: 1,
name: "Aegislash",
types: ["Ghost", "Steel"],
baseStats: { hp: 120, atk: 60, def: 100, spa: 60, spd: 100, spe: 60 },
abilities: { 0: "Stance Change", H: "Bulletproof" },
},
aegislashblade: {
inherit: true,
num: 1,
name: "Aegislash-Blade",
types: ["Ghost", "Steel"],
baseStats: { hp: 120, atk: 100, def: 60, spa: 100, spd: 60, spe: 60 },
abilities: { 0: "Stance Change", H: "Bulletproof" },
},
banettemega: {
inherit: true,
num: 2,
name: "Banette-Mega",
baseSpecies: "",
forme: "",
types: ["Ghost"],
baseStats: { hp: 64, atk: 165, def: 63, spa: 110, spd: 63, spe: 35 },
abilities: { 0: "Tough Claws" },
requiredItem: "",
},
ceruledge: {
inherit: true,
num: 3,
name: "Ceruledge",
types: ["Ghost", "Fire"],
baseStats: { hp: 85, atk: 115, def: 80, spa: 60, spd: 110, spe: 75 },
abilities: { 0: "Sharpness", H: "Triage" },
},
dofagrigus: {
num: 4,
name: "Dofagrigus",
types: ["Ghost"],
baseStats: { hp: 70, atk: 55, def: 145, spa: 95, spd: 105, spe: 30 },
abilities: { 0: "Dummy" },
weightkg: 76.5,
eggGroups: ["Mineral", "Amorphous"],
},
eddyazbear: {
num: 5,
name: "Eddy Azbear",
types: ["Ghost", "Fighting"],
baseStats: { hp: 183, atk: 117, def: 40, spa: 100, spd: 40, spe: 90 },
abilities: { 0: "Jumpscare", H: "Strong Jaw" },
weightkg: 555,
eggGroups: ["Undiscovered"],
},
fluttermane: {
inherit: true,
num: 6,
name: "Flutter Mane",
types: ["Ghost", "Dark", "Fairy"],
baseStats: { hp: 95, atk: 95, def: 95, spa: 95, spd: 95, spe: 95 },
abilities: { 0: "Protosynthesis", H: "Levitate" },
},
fluttermane2: {
num: 6,
name: "Flutter Mane 2",
types: ["Ghost", "Dark", "Fairy"],
baseStats: { hp: 95, atk: 95, def: 95, spa: 95, spd: 95, spe: 95 },
abilities: { 0: "Protosynthesis", H: "Levitate" },
weightkg: 4.2,
tags: ["Paradox"],
eggGroups: ["Undiscovered"],
},
gourgeisttiny: {
num: 8,
name: "Gourgeist-Tiny",
baseSpecies: "Gourgeist",
forme: "Tiny",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 5, atk: 81, def: 129, spa: 81, spd: 75, spe: 169 },
abilities: { 0: "Dazzling" },
weightkg: 4.8,
eggGroups: ["Amorphous"],
},
gourgeist: {
inherit: true,
num: 9,
name: "Gourgeist",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 55, atk: 91, def: 109, spa: 91, spd: 75, spe: 119 },
abilities: { 0: "Desolate Land" },
},
gourgeistlarge: {
inherit: true,
num: 10,
name: "Gourgeist-Large",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 105, atk: 101, def: 89, spa: 101, spd: 75, spe: 69 },
abilities: { 0: "Spoky" },
},
gourgeistgigantic: {
num: 11,
name: "Gourgeist-Gigantic",
baseSpecies: "Gourgeist",
forme: "Gigantic",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 155, atk: 111, def: 69, spa: 111, spd: 75, spe: 19 },
abilities: { 0: "Pulp Up" },
weightkg: 78,
eggGroups: ["Amorphous"],
},
houndstone: {
inherit: true,
num: 12,
name: "Houndstone",
types: ["Ghost", "Fighting", "Normal"],
baseStats: { hp: 82, atk: 91, def: 140, spa: 50, spd: 97, spe: 70 },
abilities: { 0: "Jumpscare", 1: "Undead", H: "Fluffy" },
},
indeedee: {
inherit: true,
num: 13,
name: "Indeedee",
types: ["Ghost", "Normal", "Psychic"],
baseStats: { hp: 70, atk: 85, def: 75, spa: 105, spd: 95, spe: 95 },
abilities: { 0: "Inner Focus", 1: "Scrappy", H: "Psychic Surge" },
},
jableye: {
num: 14,
name: "Jableye",
types: ["Ghost", "Dark", "Poison"],
baseStats: { hp: 75, atk: 75, def: 100, spa: 75, spd: 100, spe: 50 },
abilities: { 0: "Justified", H: "Jankster" },
weightkg: 11,
eggGroups: ["Human-Like"],
},
jobapplication: {
num: 15,
name: "JOB APPLICATION",
types: ["Ghost", "Normal"],
baseStats: { hp: 130, atk: 130, def: 70, spa: 50, spd: 70, spe: 80 },
abilities: { 0: "Jumpscare" },
weightkg: 4.3,
eggGroups: ["Undiscovered"],
},
kilotic: {
num: -196,
name: "Kilotic",
types: ["Ghost", "Water"],
baseStats: { hp: 81, atk: 60, def: 125, spa: 100, spd: 79, spe: 95 },
abilities: { 0: "Flare Boost", 1: "Intimidate", H: "Cursed Body" },
weightkg: 162,
eggGroups: ["Water 1", "Dragon"],
},
lanturnevil: {
num: 16,
name: "Lanturn-Evil",
baseSpecies: "Lanturn",
forme: "Evil",
types: ["Ghost", "Retaw", "Critcele"],
baseStats: { hp: 67, atk: 96, def: 96, spa: 58, spd: 58, spe: 125 },
abilities: { 0: "Abyssal Light" },
weightkg: 22.5,
eggGroups: ["Water 2"],
},
merasmus: {
num: 17,
name: "MERASMUS",
types: ["Ghost", "Psychic", "Fairy", "Dark"],
baseStats: { hp: 111, atk: 111, def: 111, spa: 111, spd: 111, spe: 111 },
abilities: { 0: "Magician" },
weightkg: 666,
eggGroups: ["Undiscovered"],
},
nursola: {
num: -195,
name: "Nursola",
types: ["Ghost", "Grass", "Rock"],
baseStats: { hp: 145, atk: 50, def: 60, spa: 95, spd: 130, spe: 30 },
abilities: { 0: "Solid Rock", 1: "Purifying Salt", H: "Perish Body" },
weightkg: 0.4,
eggGroups: ["Water 1", "Water 3"],
},
okestarspirit: {
num: 19,
name: "Okestar Spirit",
types: ["Ghost", "ark"],
baseStats: { hp: 100, atk: 100, def: 100, spa: 100, spd: 100, spe: 100 },
abilities: { 0: "Onder Guard" },
weightkg: 61,
eggGroups: ["Field"],
},
ppiritomb: {
num: 20,
name: "PPiritomb",
types: ["Ghost", "PDark", "PRock"],
baseStats: { hp: 50, atk: 92, def: 108, spa: 92, spd: 108, spe: 50 },
abilities: { 0: "PPressure", H: "Pinfiltrator" },
weightkg: 108,
eggGroups: ["Amorphous"],
},
quagsiredead: {
num: 21,
name: "Quagsire-Dead",
baseSpecies: "Quagsire",
forme: "Dead",
types: ["Ghost", "Water", "Ground"],
baseStats: { hp: 115, atk: 95, def: 95, spa: 75, spd: 75, spe: 45 },
abilities: { 0: "Cursed Body", H: "Unaware" },
weightkg: 7.5,
eggGroups: ["Water 1", "Field"],
},
rotom: {
inherit: true,
num: 22,
name: "Rotom",
types: ["Ghost", "Electric"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
rotomheat: {
inherit: true,
num: 22,
types: ["Ghost", "Electric", "Fire"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
rotomwash: {
inherit: true,
num: 22,
types: ["Ghost", "Electric", "Water"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
rotomfrost: {
inherit: true,
num: 22,
types: ["Ghost", "Electric", "Ice"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
rotomfan: {
inherit: true,
num: 22,
types: ["Ghost", "Electric", "Flying"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
rotommow: {
inherit: true,
num: 22,
types: ["Ghost", "Electric", "Grass"],
baseStats: { hp: 80, atk: 50, def: 97, spa: 115, spd: 97, spe: 91 },
abilities: { 0: "Levitate", H: "Shapeshift" },
},
shedinja: {
inherit: true,
num: 23,
name: "Shedinja",
types: ["Ghost", "Bug"],
baseStats: { hp: 1, atk: 90, def: 1, spa: 90, spd: 1, spe: 42 },
abilities: { 0: "Wonder Guard" },
},
trevenant: {
inherit: true,
num: 24,
name: "Trevenant",
types: ["Ghost", "Grass", "Fighting"],
baseStats: { hp: 85, atk: 110, def: 106, spa: 65, spd: 102, spe: 57 },
abilities: { 0: "Natural Cure", 1: "Triage", H: "Revive" },
},
trevenantrevenant: {
num: 24,
name: "Trevenant-Revenant",
baseSpecies: "Trevenant",
forme: "Revenant",
types: ["Ghost", "Rock", "Fighting"],
baseStats: { hp: 85, atk: 110, def: 76, spa: 65, spd: 72, spe: 117 },
abilities: { 0: "Reckless" },
weightkg: 71,
eggGroups: ["Grass", "Amorphous"],
},
ursalunabloodmoon: {
inherit: true,
num: 25,
types: ["Ghost", "Normal", "Ground"],
baseStats: { hp: 113, atk: 100, def: 90, spa: 135, spd: 65, spe: 52 },
abilities: { 0: "Mind's Eye", H: "Undead" },
},
vampharos: {
num: -194,
name: "Vampharos",
types: ["Ghost", "Electric", "Dragon"],
baseStats: { hp: 90, atk: 85, def: 95, spa: 140, spd: 100, spe: 50 },
abilities: { 0: "Cotton Down", 1: "Mold Breaker", H: "Vamp" },
weightkg: 61.5,
eggGroups: ["Monster", "Field"],
},
wunala: {
num: 28,
name: "Wunala",
types: ["Ghost", "Psychic", "Dark"],
baseStats: { hp: 67, atk: 113, def: 109, spa: 67, spd: 107, spe: 67 },
abilities: { 0: "Wandering Spirit", 1: "Wonder Skin", H: "Wand Rush" },
weightkg: 120,
eggGroups: ["Undiscovered"],
},
xorygonz: {
num: 29,
name: "XORygon-Z",
types: ["Ghost", "Steel", "Ice", "Poison"],
baseStats: { hp: 85, atk: 90, def: 70, spa: 125, spd: 75, spe: 90 },
abilities: { 0: "Mutual Exclusion", H: "Ahexual" },
weightkg: 36.5,
eggGroups: ["Mineral"],
},
yveltal: {
inherit: true,
num: 30,
name: "Yveltal",
types: ["Ghost", "Dragon", "Flying"],
baseStats: { hp: 116, atk: 91, def: 95, spa: 91, spd: 98, spe: 79 },
abilities: { 0: "Dark Aura", H: "Intimidate" },
},
zoroarkhisui: {
inherit: true,
num: 31,
name: "Zoroark-Hisui",
baseSpecies: "Zoroark",
forme: "Hisui",
types: ["Ghost", "Normal", "Ice"],
baseStats: { hp: 65, atk: 110, def: 70, spa: 105, spd: 70, spe: 110 },
abilities: { 0: "Cursed Body", 1: "Snow Warning", H: "Illusion" },
},
// shrunken
aegislashshrunken: {
num: 1,
name: "Aegislash-Shrunken",
baseSpecies: "Aegislash",
forme: "Shrunken",
types: ["Ghost", "Steel"],
baseStats: { hp: 120, atk: 30, def: 50, spa: 30, spd: 50, spe: 30 },
abilities: { 0: "Stance Change", H: "Bulletproof" },
battleOnly: "Aegislash",
weightkg: 5.3,
eggGroups: ["Mineral"],
},
banettemegashrunken: {
num: 2,
name: "Banette-Mega-Shrunken",
baseSpecies: "Banette",
forme: "Mega-Shrunken",
types: ["Ghost"],
baseStats: { hp: 64, atk: 82, def: 32, spa: 55, spd: 32, spe: 17 },
abilities: { 0: "Tough Claws" },
battleOnly: "Banette-Mega",
weightkg: 1.3,
eggGroups: ["Amorphous"],
},
ceruledgeshrunken: {
num: 3,
name: "Ceruledge-Shrunken",
baseSpecies: "Ceruledge",
forme: "Shrunken",
types: ["Ghost", "Fire"],
baseStats: { hp: 85, atk: 57, def: 40, spa: 30, spd: 55, spe: 37 },
abilities: { 0: "Sharpness", H: "Triage" },
battleOnly: "Ceruledge",
weightkg: 6.2,
eggGroups: ["Human-Like"],
},
dofagrigusshrunken: {
num: 4,
name: "Dofagrigus-Shrunken",
baseSpecies: "Dofagrigus",
forme: "Shrunken",
types: ["Ghost"],
baseStats: { hp: 70, atk: 27, def: 73, spa: 47, spd: 53, spe: 15 },
abilities: { 0: "Dummy", H: "Bulletproof" },
battleOnly: "Dofagrigus",
weightkg: 7.7,
eggGroups: ["Mineral", "Amorphous"],
},
eddyazbearshrunken: {
num: 5,
name: "Eddy Azbear-Shrunken",
baseSpecies: "Eddy Azbear",
forme: "Shrunken",
types: ["Ghost", "Fighting"],
baseStats: { hp: 183, atk: 58, def: 20, spa: 50, spd: 20, spe: 45 },
abilities: { 0: "Jumpscare", H: "Strong Jaw" },
battleOnly: "Eddy Azbear",
weightkg: 55.5,
eggGroups: ["Undiscovered"],
},
fluttermaneshrunken: {
num: 6,
name: "Flutter Mane-Shrunken",
baseSpecies: "Flutter Mane",
forme: "Shrunken",
types: ["Ghost", "Dark", "Fairy"],
baseStats: { hp: 95, atk: 47, def: 48, spa: 47, spd: 48, spe: 47 },
abilities: { 0: "Protosynthesis", H: "Levitate" },
battleOnly: "Flutter Mane",
weightkg: 0.4,
tags: ["Paradox"],
eggGroups: ["Undiscovered"],
},
fluttermane2shrunken: {
num: 7,
name: "Flutter Mane 2-Shrunken",
baseSpecies: "Flutter Mane 2",
forme: "Shrunken",
types: ["Ghost", "Dark", "Fairy"],
baseStats: { hp: 95, atk: 47, def: 48, spa: 47, spd: 48, spe: 47 },
abilities: { 0: "Protosynthesis", H: "Levitate" },
battleOnly: "Flutter Mane 2",
weightkg: 0.4,
tags: ["Paradox"],
eggGroups: ["Undiscovered"],
},
gourgeisttinyshrunken: {
num: 8,
name: "Gourgeist-Tiny-Shrunken",
baseSpecies: "Gourgeist",
forme: "Tiny-Shrunken",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 5, atk: 40, def: 65, spa: 40, spd: 38, spe: 84 },
abilities: { 0: "Grassy Surge" },
battleOnly: "Gourgeist-Tiny",
weightkg: 0.5,
eggGroups: ["Amorphous"],
},
gourgeistshrunken: {
num: 9,
name: "Gourgeist-Shrunken",
baseSpecies: "Gourgeist",
forme: "Shrunken",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 55, atk: 45, def: 55, spa: 45, spd: 38, spe: 59 },
abilities: { 0: "Poison Heal" },
battleOnly: "Gourgeist",
weightkg: 1.3,
eggGroups: ["Amorphous"],
},
gourgeistlargeshrunken: {
num: 10,
name: "Gourgeist-Large-Shrunken",
baseSpecies: "Gourgeist",
forme: "Large-Shrunken",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 105, atk: 50, def: 45, spa: 50, spd: 38, spe: 34 },
abilities: { 0: "Spoky" },
battleOnly: "Gourgeist-Large",
weightkg: 1.4,
eggGroups: ["Amorphous"],
},
gourgeistgiganticshrunken: {
num: 11,
name: "Gourgeist-Gigantic-Shrunken",
baseSpecies: "Gourgeist",
forme: "Gigantic-Shrunken",
types: ["Ghost", "Grass", "Fire", "Fairy"],
baseStats: { hp: 155, atk: 55, def: 35, spa: 55, spd: 38, spe: 9 },
abilities: { 0: "Pulp Up" },
battleOnly: "Gourgeist-Gigantic",
weightkg: 7.8,
eggGroups: ["Amorphous"],
},
houndstoneshrunken: {
num: 12,
name: "Houndstone-Shrunken",
baseSpecies: "Houndstone",
forme: "Shrunken",
types: ["Ghost", "Fighting"],
baseStats: { hp: 82, atk: 46, def: 70, spa: 25, spd: 49, spe: 35 },
abilities: { 0: "Jumpscare", 1: "Scrappy", H: "Fluffy" },
battleOnly: "Houndstone",
weightkg: 1.5,
eggGroups: ["Field"],
},
indeedeeshrunken: {
num: 13,
name: "Indeedee-Shrunken",
baseSpecies: "Indeedee",
forme: "Shrunken",
types: ["Ghost", "Normal", "Psychic"],
baseStats: { hp: 70, atk: 42, def: 38, spa: 52, spd: 48, spe: 47 },
abilities: { 0: "Inner Focus", 1: "Scrappy", H: "Psychic Surge" },
battleOnly: "Indeedee",
weightkg: 2.8,
eggGroups: ["Fairy"],
},
jableyeshrunken: {
num: 14,
name: "Jableye-Shrunken",
baseSpecies: "Jableye",
forme: "Shrunken",
types: ["Ghost", "Dark"],
baseStats: { hp: 75, atk: 25, def: 38, spa: 25, spd: 38, spe: 25 },
abilities: { 0: "Justified", H: "Jankster" },
battleOnly: "Jableye",
weightkg: 1.1,
eggGroups: ["Human-Like"],
},
jobapplicationshrunken: {
num: 15,
name: "JOB APPLICATION-Shrunken",
baseSpecies: "JOB APPLICATION",
forme: "Shrunken",
types: ["Ghost", "Normal"],
baseStats: { hp: 130, atk: 65, def: 35, spa: 25, spd: 35, spe: 40 },
abilities: { 0: "Jumpscare" },
battleOnly: "JOB APPLICATION",
weightkg: 0.4,
eggGroups: ["Undiscovered"],
},
lanturnevilshrunken: {
num: 16,
name: "Lanturn-Evil-Shrunken",
baseSpecies: "Lanturn",
forme: "Evil-Shrunken",
types: ["Ghost", "Retaw", "Critcele"],
baseStats: { hp: 97, atk: 48, def: 48, spa: 29, spd: 29, spe: 62 },
abilities: { 0: "Volt Absorb", 1: "Illuminate", H: "Abyssal Light" },
battleOnly: "Lanturn-Evil",
weightkg: 2.3,
eggGroups: ["Water 2"],
},
merasmusshrunken: {
num: 17,
name: "MERASMUS-Shrunken",
baseSpecies: "MERASMUS",
forme: "Shrunken",
types: ["Ghost", "Psychic", "Fairy", "Dark"],
baseStats: { hp: 111, atk: 55, def: 56, spa: 55, spd: 56, spe: 55 },
abilities: { 0: "Magician" },
battleOnly: "MERASMUS",
weightkg: 66.6,
eggGroups: ["Undiscovered"],
},
nursolashrunken: {
num: 18,
name: "Nursola-Shrunken",
baseSpecies: "Nursola",
forme: "Shrunken",
types: ["Ghost", "Grass", "Rock"],
baseStats: { hp: 145, atk: 25, def: 30, spa: 48, spd: 65, spe: 15 },
abilities: { 0: "Solid Rock", 1: "Purifying Salt", H: "Perish Body" },
battleOnly: "Nursola",
weightkg: 0.1,
eggGroups: ["Water 1", "Water 3"],
},
okestarspiritshrunken: {
num: 19,
name: "Okestar Spirit-Shrunken",
baseSpecies: "Okestar Spirit",
forme: "Shrunken",
types: ["Ghost", "ark"],
baseStats: { hp: 100, atk: 50, def: 50, spa: 50, spd: 50, spe: 50 },
abilities: { 0: "Onder Guard" },
battleOnly: "Okestar Spirit",
weightkg: 6.1,
eggGroups: ["Undiscovered"],
},
ppiritombshrunken: {
num: 20,
name: "PPiritomb-Shrunken",
baseSpecies: "PPiritomb",
forme: "Shrunken",
types: ["Ghost", "PDark", "PRock"],
baseStats: { hp: 50, atk: 46, def: 54, spa: 46, spd: 54, spe: 25 },
abilities: { 0: "PPressure", H: "Pinfiltrator" },
battleOnly: "PPiritomb",
weightkg: 10.8,
eggGroups: ["Amorphous"],
},
quagsiredeadshrunken: {
num: 21,
name: "Quagsire-Dead-Shrunken",
baseSpecies: "Quagsire",
forme: "Dead-Shrunken",
types: ["Ghost", "Water", "Ground"],
baseStats: { hp: 115, atk: 47, def: 48, spa: 37, spd: 38, spe: 22 },
abilities: { 0: "Cursed Body", H: "Unaware" },
battleOnly: "Quagsire-Dead",
weightkg: 0.8,
eggGroups: ["Water 1", "Field"],
},
rotomshrunken: {
num: 22,
name: "Rotom-Shrunken",
baseSpecies: "Rotom",
forme: "Shrunken",
types: ["Ghost", "Electric"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
rotomheatshrunken: {
num: 22,
name: "Rotom-Heat-Shrunken",
baseSpecies: "Rotom-Heat",
forme: "Shrunken",
types: ["Ghost", "Electric", "Fire"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom-Heat",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
rotomwashshrunken: {
num: 22,
name: "Rotom-Wash-Shrunken",
baseSpecies: "Rotom-Wash",
forme: "Shrunken",
types: ["Ghost", "Electric", "Water"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom-Wash",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
rotommowshrunken: {
num: 22,
name: "Rotom-Mow-Shrunken",
baseSpecies: "Rotom-Mow",
forme: "Shrunken",
types: ["Ghost", "Electric", "Grass"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom-Mow",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
rotomfrostshrunken: {
num: 22,
name: "Rotom-Frost-Shrunken",
baseSpecies: "Rotom-Frost",
forme: "Shrunken",
types: ["Ghost", "Electric", "Ice"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom-Frost",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
rotomfanshrunken: {
num: 22,
name: "Rotom-Fan-Shrunken",
baseSpecies: "Rotom-Fan",
forme: "Shrunken",
types: ["Ghost", "Electric", "Flying"],
baseStats: { hp: 80, atk: 25, def: 49, spa: 57, spd: 49, spe: 45 },
abilities: { 0: "Levitate", H: "Shapeshift" },
battleOnly: "Rotom-Fan",
weightkg: 0.1,
eggGroups: ["Amorphous"],
},
shedinjashrunken: {
num: 23,
name: "Shedinja-Shrunken",
baseSpecies: "Shedinja",
forme: "Shrunken",
types: ["Ghost", "Bug"],
baseStats: { hp: 1, atk: 45, def: 1, spa: 45, spd: 1, spe: 21 },
abilities: { 0: "Wonder Guard" },
battleOnly: "Shedinja",
weightkg: 0.6,
eggGroups: ["Bug"],
},
trevenantshrunken: {
num: 24,
name: "Trevenant-Shrunken",
baseSpecies: "Trevenant",
forme: "Shrunken",
types: ["Ghost", "Grass", "Fighting"],
baseStats: { hp: 85, atk: 55, def: 53, spa: 32, spd: 51, spe: 28 },
abilities: { 0: "Natural Cure", 1: "Triage", H: "Revive" },
battleOnly: "Trevenant",
weightkg: 7.1,
eggGroups: ["Grass", "Amorphous"],
},
ursalunabloodmoonshrunken: {
num: 25,
name: "Ursaluna-Bloodmoon-Shrunken",
baseSpecies: "Ursaluna",
forme: "Bloodmoon-Shrunken",
types: ["Ghost", "Normal", "Ground"],
baseStats: { hp: 113, atk: 50, def: 45, spa: 67, spd: 33, spe: 26 },
abilities: { 0: "Mind's Eye", H: "Undead" },
battleOnly: "Ursaluna-Bloodmoon",
weightkg: 33.3,
eggGroups: ["Field"],
},
kiloticshrunken: {
num: 26,
name: "Kilotic-Shrunken",
baseSpecies: "Kilotic",
forme: "Shrunken",
types: ["Ghost", "Water"],
baseStats: { hp: 81, atk: 30, def: 63, spa: 50, spd: 40, spe: 48 },
abilities: { 0: "Flare Boost", 1: "Intimidate", H: "Cursed Body" },
battleOnly: "Kilotic",
weightkg: 16.2,
eggGroups: ["Water 1", "Dragon"],
},
vampharosshrunken: {
num: 27,
name: "Vampharos-Shrunken",
baseSpecies: "Vampharos",
forme: "Shrunken",
types: ["Ghost", "Electric", "Dragon"],
baseStats: { hp: 90, atk: 43, def: 48, spa: 70, spd: 50, spe: 25 },
abilities: { 0: "Cotton Down", 1: "Mold Breaker", H: "Vamp" },
battleOnly: "Vampharos",
weightkg: 6.2,
eggGroups: ["Monster", "Field"],
},
wunalashrunken: {
num: 28,
name: "Wunala-Shrunken",
baseSpecies: "Wunala",
forme: "Shrunken",
types: ["Ghost", "Psychic", "Dark"],
baseStats: { hp: 67, atk: 56, def: 55, spa: 33, spd: 54, spe: 33 },
abilities: { 0: "Wandering Spirit", 1: "Wonder Skin", H: "Wand Rush" },
battleOnly: "Wunala",
weightkg: 12,
eggGroups: ["Undiscovered"],
},
xorygonzshrunken: {
num: 29,
name: "XORygon-Z-Shrunken",
baseSpecies: "XORygon-Z",
forme: "Z-Shrunken",
types: ["Ghost", "Steel", "Ice", "Poison"],
baseStats: { hp: 85, atk: 45, def: 35, spa: 62, spd: 38, spe: 45 },
abilities: { 0: "Mutual Exclusion", H: "Ahexual" },
battleOnly: "XORygon-Z",
weightkg: 3.4,
eggGroups: ["Mineral"],
},
yveltalshrunken: {
num: 30,
name: "Yveltal-Shrunken",
baseSpecies: "Yveltal",
forme: "Shrunken",
types: ["Ghost", "Dragon", "Flying"],
baseStats: { hp: 116, atk: 46, def: 48, spa: 46, spd: 49, spe: 39 },
abilities: { 0: "Dark Aura", H: "Intimidate" },
battleOnly: "Yveltal",
weightkg: 20.3,
eggGroups: ["Undiscovered"],
},
zoroarkhisuishrunken: {
num: 31,
name: "Zoroark-Hisui-Shrunken",
baseSpecies: "Zoroark",
forme: "Hisui-Shrunken",
types: ["Ghost", "Normal", "Ice"],
baseStats: { hp: 65, atk: 55, def: 35, spa: 52, spd: 35, spe: 55 },
abilities: { 0: "Cursed Body", 1: "Snow Warning", H: "Illusion" },
battleOnly: "Zoroark-Hisui",
weightkg: 7.3,
eggGroups: ["Field"],
},
};

View File

@ -1,255 +0,0 @@
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
spokymod: {
effectType: 'Rule',
name: 'Spokymod',
desc: 'spookymod jumpscare',
onBegin() {
const intro = [
"Welcome mortals to my Magic Kingdom!...which is unaffiliated with any other Magic Kingdom that may or may not exist.",
"Step right up and get your spells from me! For I am the Spell Master!...again, not a term Merasmus officially owns.",
"Greetings mortals and こんにちは! Yes Merasmus is learning Japanese, in the likely event he will have to beg for his life!",
"Why? Well, therein lies a tale of horror! Short version: Merasmus owes $12,000 to the Japanese Mafia!",
"It is Halloween! The time of year when the doorways between our world and the next swing wide!",
// "That...and President's Day. That's still only two times! So you've got to pick your battles if you're Merasmus!",
"A harvest moon hangs pendulously in the sky, mortals!",
/* "That's right, */ "The moon's giving us the green light for harvesting! Apropos of nothing,",
"I hope you all brought your souls! (laughter) And money. Because Merasmus has sunk a lot into this metagame.",
"It is I, mortals, Merasmus the wizard! Welcome to my dark carnival of the macabre! Admit One...to MADNESS!",
"(laughter) Step right up and test your measly minds on my Metagame of the Danged!",
];
this.add('-message', `${this.sample(intro)}`);
},
onResidual(pokemon) {
// make sure it only rolls once
let temp = false;
for (const p of this.sides[0].pokemon) {
if (p.isActive && p === pokemon) temp = true;
}
if (!temp) return;
const spinSet = [
"The wheel spins!",
"The wheel spins!",
"I spin the Wheel of Fate!",
"The Wheel of Fate spins!",
"You cannot escape the Wheel of Fate!",
"Spin, wheel! Spin!",
"Spin the wheel, and seal your fate!",
"Yes, spin the wheel, you fools. See what horrors are in store for you.",
"Prepare to feel the wrath of the Wheel of Fate!",
"Yes, spin the Wheel of Fate!",
"Your fate... is at hand!",
"The Wheel of Fate is a fickle mistress.",
"The wheel spins!",
"(laughter) Your fate is at hand.",
"The wheel will be your undoing.",
"Yes... Yes! The wheel!",
"Yes... Yes! Fate!",
"The wheel! Come on wheel, Merasmus needs this.",
"The wheel! Come on wheel, you owe me.",
"The wheel! Come on... Set them all on fire.",
"The wheel! Come on... Big. Head. Come on, big head.",
];
const bighead = [
"Big heads!",
"(laughter) Big head fate! Big head fate!",
"I curse your heads... with bigness!",
"You cannot escape the terror... of your own giant head!",
"Super big heads!",
"Plague of head-biggening!",
"Big heads! The horror! The horror!",
];
const smallhead = [
"Shrunken heads!",
"Tiny heads!",
"Teeny, tiny heads! As foretold in prophecy.",
"Feel the tiny eldritch terror of an itty... bitty... head!",
"Like your tiny heads? THANK MAGIC!",
"Teeny, tiny heads!",
];
const superspeed = ["Super Speed!"];
const dance = [
"Dance fools!",
"Darkness falls across the land! The dancing hour is close at hand!",
"And though you fight to stay alive, your body starts to spasmus. For no mere mortal can resist the magic of Merasmus!",
"Dance. Dance! DANCE!",
"Plague of dancing!",
];
const bleed = [
"The bloodening!",
"Blood-letting!",
"Let the blood flow!",
"Blood fate!",
"Plague of blood!",
];
const fire = [
"Firestorm!",
"Fire!",
"Fire, yes! Now you're all on fire!",
"Fire! Oh, that's a good one!",
"Burn fools, burn!",
"BURN!",
"Burn fools!",
"Hellfire!",
];
const jarate = [
"Jarate!",
"Jarate! No magic is beneath Merasmus!",
"Jarate! That is what you think it is!",
"Rain of waste!",
"Jarate! Merasmus is...sorry about this one.",
"Jarate! Merasmus is...not proud...of this one.",
"Rain of Jarate!",
"Rain of Jarate! *sotto voce* I'm sorry about this.",
"Jarate!",
"Jarate! Jarate for everyone!",
"Jarate for everyone! I'm so, so sorry!",
];
const ghosts = [
"Ghosts!",
"Let the haunting... begin!",
"Rise, rise from your graves!",
"Plague of ghosts!",
];
const lowgravity = [
"Low gravity!",
"Gravity displeases me, so I have removed it!",
"Gravity displeases me, so I have removed it! ...Most of it!",
"Gravity! I banish thee!",
"Bid farewell to your precious gravity!",
];
const superjump = ["Super jumping!", "High jump!"];
const crithit = ["It is the crit boostening!"];
const ubercharge = [
"You are GODS! *sotto voce* ...I don't know why I put that on the wheel...",
"You are GODS! Magic! It is not an exact science.",
"Invincible! INVINCIBL- Wait, wait, what?",
"Everybody's invincible! Muhahahaha! Fools! Ahahaha... eheh... Hold on...",
"You are GODS! Nahahaha... Enjoy your false confidence. It will be your doom!",
"You are GODS! Aha, that may seem good, but it will be bad. In the fullness of time.",
"You are GODS! I... meant to do that. It will go badly for you. You watch.",
"You are GODS! Wait, no no no no no!",
"ÜBERCHARGE!",
];
if (this.turn % 3 !== 0) return;
this.add('-message', `${this.sample(spinSet)}`);
const result = this.random(9);
// result = 0;
switch (result) {
case 0:
this.add('-message', `${this.sample(bighead)}`);
for (const pokemons of this.getAllActive()) {
pokemons.removeVolatile('shrunken');
pokemons.addVolatile('fakedynamax', pokemons);
}
break;
case 1:
this.add('-message', `${this.sample(smallhead)}`);
for (const pokemons of this.getAllActive()) {
pokemons.removeVolatile('fakedynamax');
pokemons.addVolatile('shrunken', pokemons);
}
break;
case 2:
this.add('-message', `${this.sample(superspeed)}`);
for (const pokemons of this.getAllActive()) {
this.boost({ spe: 2 }, pokemons, pokemons, null, true);
}
break;
case 3:
this.add('-message', `${this.sample(dance)}`);
for (const pokemons of this.getAllActive()) {
this.add('-anim', pokemons, "Teeter Dance", pokemons);
this.add('-anim', pokemons, "Revelation Dance", pokemons);
this.add('-anim', pokemons, "Quiver Dance", pokemons);
this.add('-anim', pokemons, "Victory Dance", pokemons);
this.add('-anim', pokemons, "Dragon Dance", pokemons);
this.add('-anim', pokemons, "Swords Dance", pokemons);
this.add('-anim', pokemons, "Petal Dance", pokemons);
this.add('-anim', pokemons, "Lunar Dance", pokemons);
this.add('-anim', pokemons, "Feather Dance", pokemons);
this.add('-anim', pokemons, "Rain Dance", pokemons);
}
break;
case 4:
const temps = this.random(4);
// const temps = 3;
switch (temps) {
case 0:
this.add('-message', `${this.sample(bleed)}`);
for (const pokemons of this.getAllActive()) {
pokemons.trySetStatus('psn', pokemons);
}
break;
case 1:
this.add('-message', `${this.sample(fire)}`);
for (const pokemons of this.getAllActive()) {
pokemons.trySetStatus('brn', pokemons);
}
break;
case 2:
this.add('-message', `${this.sample(jarate)}`);
for (const pokemons of this.getAllActive()) {
pokemons.addVolatile('jarate', pokemons);
this.hint('pokemons covered in Jarate take 1.35x damage from opponent\'s attacks.');
}
break;
case 3:
this.add('-message', `${this.sample(ghosts)}`);
for (const pokemons of this.getAllActive()) {
pokemons.addVolatile('jumpscare', pokemons);
}
break;
}
break;
case 5:
this.add('-message', `${this.sample(lowgravity)}`);
for (const pokemons of this.getAllActive()) {
pokemons.addVolatile('telekinesis', pokemons);
}
break;
case 6:
this.add('-message', `${this.sample(superjump)}`);
this.field.setWeather('superjump');
break;
case 7:
this.add('-message', `${this.sample(crithit)}`);
for (const pokemons of this.getAllActive()) {
pokemons.addVolatile('laserfocus', pokemons);
}
break;
default:
this.add('-message', `${this.sample(ubercharge)}`);
for (const pokemons of this.getAllActive()) {
pokemons.addVolatile('ubercharge', pokemons);
}
this.hint('Ubercharged Pokemon take no damage from attacks.');
}
},
onBasePowerPriority: 19,
onBasePower(basePower, attacker, defender, move) {
if ((attacker.hasType('Retaw') && move.type === 'Water') ||
(attacker.hasType('Critcele') && move.type === 'Electric') ||
(attacker.hasType('Pdark') && move.type === 'Dark') ||
(attacker.hasType('Prock') && move.type === 'Rock') ||
(attacker.hasType('ark') && move.type === 'Dark')) {
return this.chainModify(1.5);
}
},
},
spriteviewer: {
effectType: 'ValidatorRule',
name: 'Sprite Viewer',
desc: "Displays a fakemon's sprite in chat when it is switched in for the first time",
onBegin() {
this.add('rule', 'Sprite Viewer: Displays sprites in chat');
},
onSwitchIn(pokemon) {
if (!this.effectState[pokemon.species.id]) {
this.add('-message', `${pokemon.species.name}'s Sprite:`);
this.add(`raw|<img src="https://raw.githubusercontent.com/scoopapa/DH2/refs/heads/main/data/mods/spookymod/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
this.effectState[pokemon.species.id] = true;
}
},
},
};

View File

@ -1,101 +0,0 @@
export const Scripts: ModdedBattleScriptsData = {
gen: 9,
// the below is all commented out due to an ability that requires checkFainted, but it seems like we can't edit checkFainted
/* checkFainted() {
for (const side of this.sides) {
for (const pokemon of side.active) {
if (pokemon.fainted) {
pokemon.status = 'fnt' as ID;
pokemon.switchFlag = true;
} else if (pokemon.effectState.zombie) {
pokemon.status = '';
pokemon.switchFlag = true;
}
}
}
},
faintMessages(lastFirst = false, forceCheck = false, checkWin = true) {
if (this.ended) return;
const length = this.faintQueue.length;
if (!length) {
if (forceCheck && this.checkWin()) return true;
return false;
}
if (lastFirst) {
this.faintQueue.unshift(this.faintQueue[this.faintQueue.length - 1]);
this.faintQueue.pop();
}
let faintQueueLeft, faintData;
while (this.faintQueue.length) {
faintQueueLeft = this.faintQueue.length;
faintData = this.faintQueue.shift()!;
const pokemon: Pokemon = faintData.target;
if (!pokemon.fainted && this.runEvent('BeforeFaint', pokemon, faintData.source, faintData.effect)) {
this.add('faint', pokemon);
if (
!(pokemon.species.name === 'Trevenant' && pokemon.ability === 'revive' && !this.effectState.zombie &&
!pokemon.transformed && this.canSwitch(pokemon.side))
) {
pokemon.side.pokemonLeft--;
}
this.runEvent('Faint', pokemon, faintData.source, faintData.effect);
this.singleEvent('End', pokemon.getAbility(), pokemon.abilityState, pokemon);
this.singleEvent('End', pokemon.getItem(), pokemon.itemState, pokemon);
if (pokemon.formeRegression && !pokemon.transformed) {
// before clearing volatiles
pokemon.baseSpecies = this.dex.species.get(pokemon.set.species || pokemon.set.name);
pokemon.baseAbility = toID(pokemon.set.ability);
}
pokemon.clearVolatile(false);
if (!this.effectState.zombie) {
pokemon.fainted = true;
} else {
pokemon.faintQueued = false;
}
pokemon.illusion = null;
pokemon.isActive = false;
pokemon.isStarted = false;
delete pokemon.terastallized;
if (pokemon.formeRegression) {
// after clearing volatiles
pokemon.details = pokemon.getUpdatedDetails();
this.add('detailschange', pokemon, pokemon.details, '[silent]');
pokemon.updateMaxHp();
pokemon.formeRegression = false;
}
pokemon.side.faintedThisTurn = pokemon;
if (this.faintQueue.length >= faintQueueLeft) checkWin = true;
}
}
if (this.gen <= 1) {
// in gen 1, fainting skips the rest of the turn
// residuals don't exist in gen 1
this.queue.clear();
// Fainting clears accumulated Bide damage
for (const pokemon of this.getAllActive()) {
if (pokemon.volatiles['bide']?.damage) {
pokemon.volatiles['bide'].damage = 0;
this.hint("Desync Clause Mod activated!");
this.hint("In Gen 1, Bide's accumulated damage is reset to 0 when a Pokemon faints.");
}
}
} else if (this.gen <= 3 && this.gameType === 'singles') {
// in gen 3 or earlier, fainting in singles skips to residuals
for (const pokemon of this.getAllActive()) {
if (this.gen <= 2) {
// in gen 2, fainting skips moves only
this.queue.cancelMove(pokemon);
} else {
// in gen 3, fainting skips all moves and switches
this.queue.cancelAction(pokemon);
}
}
}
if (checkWin && this.checkWin(faintData)) return true;
if (faintData && length) {
this.runEvent('AfterFaint', faintData.target, faintData.source, faintData.effect, length);
}
return false;
},
*/
};

View File

@ -1,112 +0,0 @@
export const TypeChart: import('../../../sim/dex-data').ModdedTypeDataTable = {
ark: {
damageTaken: {
Bug: 1,
Dark: 2,
Dragon: 0,
Electric: 0,
Fairy: 1,
Fighting: 1,
Fire: 0,
Flying: 0,
Ghost: 2,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 3,
Rock: 0,
Steel: 0,
Water: 0,
},
},
critcele: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 1,
Fairy: 0,
Fighting: 0,
Fire: 0,
Flying: 1,
Ghost: 0,
Grass: 0,
Ground: 2,
Ice: 0,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 1,
Water: 0,
},
},
pdark: {
damageTaken: {
Bug: 1,
Dark: 2,
Dragon: 0,
Electric: 0,
Fairy: 1,
Fighting: 1,
Fire: 0,
Flying: 0,
Ghost: 2,
Grass: 0,
Ground: 0,
Ice: 0,
Normal: 0,
Poison: 2,
Psychic: 3,
Rock: 0,
Steel: 0,
Water: 0,
},
},
prock: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 0,
Fairy: 0,
Fighting: 1,
Fire: 2,
Flying: 2,
Ghost: 0,
Grass: 1,
Ground: 1,
Ice: 0,
Normal: 2,
Poison: 2,
Psychic: 2,
Rock: 0,
Steel: 1,
Water: 1,
},
},
retaw: {
damageTaken: {
Bug: 0,
Dark: 0,
Dragon: 0,
Electric: 2,
Fairy: 0,
Fighting: 0,
Fire: 1,
Flying: 0,
Ghost: 0,
Grass: 2,
Ground: 0,
Ice: 1,
Normal: 0,
Poison: 0,
Psychic: 0,
Rock: 0,
Steel: 1,
Water: 1,
},
},
};

View File

@ -3789,7 +3789,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
flags: { protect: 1, reflectable: 1, mirror: 1, bypasssub: 1, metronome: 1 },
volatileStatus: 'disable',
onTryHit(target) {
if (!target.lastMove || target.lastMove.isZ || target.lastMove.isMax || target.lastMove.id === 'struggle') {
if (!target.lastMove || target.lastMove.isZOrMaxPowered || target.lastMove.isMax || target.lastMove.id === 'struggle') {
return false;
}
},
@ -3829,7 +3829,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
},
onBeforeMovePriority: 7,
onBeforeMove(attacker, defender, move) {
if (!move.isZ && move.id === this.effectState.move) {
if (!(move.isZ && move.isZOrMaxPowered) && move.id === this.effectState.move) {
this.add('cant', attacker, 'Disable', move);
return false;
}
@ -4909,9 +4909,10 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
let move: Move | ActiveMove | null = target.lastMove;
if (!move || target.volatiles['dynamax']) return false;
// Encore only works on Max Moves if the base move is not itself a Max Move
if (move.isMax && move.baseMove) move = this.dex.moves.get(move.baseMove);
const moveSlot = target.getMoveData(move.id);
if (move.isZ || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
if (move.isZ || move.isMax || move.flags['failencore'] || !moveSlot || moveSlot.pp <= 0) {
// it failed
return false;
}
@ -8630,7 +8631,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
onRestart(target, source, effect) {
if (effect?.name === 'Psychic Noise') return;
this.add('-fail', target, 'move: Heal Block'); // Succeeds to supress downstream messages
this.add('-fail', target, 'move: Heal Block'); // Succeeds to suppress downstream messages
if (!source.moveThisTurnResult) {
source.moveThisTurnResult = false;
}
@ -9858,7 +9859,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
},
onFoeBeforeMovePriority: 4,
onFoeBeforeMove(attacker, defender, move) {
if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZ && !move.isMax) {
if (move.id !== 'struggle' && this.effectState.source.hasMove(move.id) && !move.isZOrMaxPowered) {
this.add('cant', attacker, 'move: Imprison', move);
return false;
}
@ -19739,7 +19740,7 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
},
onBeforeMovePriority: 5,
onBeforeMove(attacker, defender, move) {
if (!move.isZ && move.category === 'Status' && move.id !== 'mefirst') {
if (!(move.isZ && move.isZOrMaxPowered) && move.category === 'Status' && move.id !== 'mefirst') {
this.add('cant', attacker, 'move: Taunt', move);
return false;
}
@ -20161,13 +20162,13 @@ export const Moves: import('../sim/dex-moves').MoveDataTable = {
},
onBeforeMovePriority: 6,
onBeforeMove(pokemon, target, move) {
if (!move.isZ && !move.isMax && move.flags['sound']) {
if (!move.isZOrMaxPowered && move.flags['sound']) {
this.add('cant', pokemon, 'move: Throat Chop');
return false;
}
},
onModifyMove(move, pokemon, target) {
if (!move.isZ && !move.isMax && move.flags['sound']) {
if (!move.isZOrMaxPowered && move.flags['sound']) {
this.add('cant', pokemon, 'move: Throat Chop');
return false;
}

View File

@ -803,8 +803,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoType: "useItem",
evoItem: "Thunder Stone",
eggGroups: ["Field", "Fairy"],
otherFormes: ["Raichu-Alola"],
formeOrder: ["Raichu", "Raichu-Alola"],
otherFormes: ["Raichu-Alola", "Raichu-Mega-X", "Raichu-Mega-Y"],
formeOrder: ["Raichu", "Raichu-Alola", "Raichu-Mega-X", "Raichu-Mega-Y"],
},
raichualola: {
num: 26,
@ -823,6 +823,36 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoRegion: "Alola",
eggGroups: ["Field", "Fairy"],
},
raichumegax: {
num: 26,
name: "Raichu-Mega-X",
baseSpecies: "Raichu",
forme: "Mega-X",
types: ["Electric"],
baseStats: { hp: 60, atk: 135, def: 95, spa: 90, spd: 95, spe: 110 },
abilities: { 0: "Surge Surfer" },
heightm: 1.2,
weightkg: 38,
color: "Yellow",
eggGroups: ["Field", "Fairy"],
requiredItem: "Raichunite X",
gen: 9,
},
raichumegay: {
num: 26,
name: "Raichu-Mega-Y",
baseSpecies: "Raichu",
forme: "Mega-Y",
types: ["Electric"],
baseStats: { hp: 60, atk: 100, def: 55, spa: 160, spd: 80, spe: 130 },
abilities: { 0: "Surge Surfer" },
heightm: 1,
weightkg: 26,
color: "Yellow",
eggGroups: ["Field", "Fairy"],
requiredItem: "Raichunite Y",
gen: 9,
},
sandshrew: {
num: 27,
name: "Sandshrew",
@ -6626,6 +6656,23 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoCondition: "at night",
eggGroups: ["Amorphous"],
canHatch: true,
otherFormes: ["Chimecho-Mega"],
formeOrder: ["Chimecho", "Chimecho-Mega"],
},
chimechomega: {
num: 358,
name: "Chimecho-Mega",
baseSpecies: "Chimecho",
forme: "Mega",
types: ["Psychic", "Steel"],
baseStats: { hp: 75, atk: 50, def: 110, spa: 135, spd: 120, spe: 65 },
abilities: { 0: "Levitate" },
heightm: 1.2,
weightkg: 8,
color: "Blue",
eggGroups: ["Amorphous"],
requiredItem: "Chimechite",
gen: 9,
},
absol: {
num: 359,
@ -6637,8 +6684,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
weightkg: 47,
color: "White",
eggGroups: ["Field"],
otherFormes: ["Absol-Mega"],
formeOrder: ["Absol", "Absol-Mega"],
otherFormes: ["Absol-Mega", "Absol-Mega-Z"],
formeOrder: ["Absol", "Absol-Mega", "Absol-Mega-Z"],
},
absolmega: {
num: 359,
@ -6654,6 +6701,21 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
eggGroups: ["Field"],
requiredItem: "Absolite",
},
absolmegaz: {
num: 359,
name: "Absol-Mega-Z",
baseSpecies: "Absol",
forme: "Mega-Z",
types: ["Dark", "Ghost"],
baseStats: { hp: 65, atk: 154, def: 60, spa: 75, spd: 60, spe: 151 },
abilities: { 0: "Magic Bounce" },
heightm: 1.2,
weightkg: 49,
color: "Black",
eggGroups: ["Field"],
requiredItem: "Absolite Z",
gen: 9,
},
wynaut: {
num: 360,
name: "Wynaut",
@ -7352,6 +7414,23 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Staravia",
evoLevel: 34,
eggGroups: ["Flying"],
otherFormes: ["Staraptor-Mega"],
formeOrder: ["Staraptor", "Staraptor-Mega"],
},
staraptormega: {
num: 398,
name: "Staraptor-Mega",
baseSpecies: "Staraptor",
forme: "Mega",
types: ["Fighting", "Flying"],
baseStats: { hp: 85, atk: 140, def: 100, spa: 60, spd: 90, spe: 110 },
abilities: { 0: "Intimidate", H: "Reckless" },
heightm: 1.9,
weightkg: 50,
color: "Gray",
eggGroups: ["Flying"],
requiredItem: "Staraptite",
gen: 9,
},
bidoof: {
num: 399,
@ -8066,8 +8145,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Gabite",
evoLevel: 48,
eggGroups: ["Monster", "Dragon"],
otherFormes: ["Garchomp-Mega"],
formeOrder: ["Garchomp", "Garchomp-Mega"],
otherFormes: ["Garchomp-Mega", "Garchomp-Mega-Z"],
formeOrder: ["Garchomp", "Garchomp-Mega", "Garchomp-Mega-Z"],
},
garchompmega: {
num: 445,
@ -8083,6 +8162,21 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
eggGroups: ["Monster", "Dragon"],
requiredItem: "Garchompite",
},
garchompmegaz: {
num: 445,
name: "Garchomp-Mega-Z",
baseSpecies: "Garchomp",
forme: "Mega-Z",
types: ["Dragon"],
baseStats: { hp: 108, atk: 130, def: 85, spa: 141, spd: 85, spe: 151 },
abilities: { 0: "Sand Force" },
heightm: 1.9,
weightkg: 99,
color: "Blue",
eggGroups: ["Monster", "Dragon"],
requiredItem: "Garchompite Z",
gen: 9,
},
munchlax: {
num: 446,
name: "Munchlax",
@ -8125,8 +8219,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoType: "levelFriendship",
evoCondition: "during the day",
eggGroups: ["Field", "Human-Like"],
otherFormes: ["Lucario-Mega"],
formeOrder: ["Lucario", "Lucario-Mega"],
otherFormes: ["Lucario-Mega", "Lucario-Mega-Z"],
formeOrder: ["Lucario", "Lucario-Mega", "Lucario-Mega-Z"],
},
lucariomega: {
num: 448,
@ -8143,6 +8237,22 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
eggGroups: ["Field", "Human-Like"],
requiredItem: "Lucarionite",
},
lucariomegaz: {
num: 448,
name: "Lucario-Mega-Z",
baseSpecies: "Lucario",
forme: "Mega-Z",
types: ["Fighting", "Steel"],
genderRatio: { M: 0.875, F: 0.125 },
baseStats: { hp: 70, atk: 100, def: 70, spa: 164, spd: 70, spe: 151 },
abilities: { 0: "Adaptability" },
heightm: 1.3,
weightkg: 49.4,
color: "Gray",
eggGroups: ["Field", "Human-Like"],
requiredItem: "Lucarionite Z",
gen: 9,
},
hippopotas: {
num: 449,
name: "Hippopotas",
@ -8809,6 +8919,24 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
color: "Brown",
tags: ["Sub-Legendary"],
eggGroups: ["Undiscovered"],
otherFormes: ["Heatran-Mega"],
formeOrder: ["Heatran", "Heatran-Mega"],
},
heatranmega: {
num: 485,
name: "Heatran-Mega",
baseSpecies: "Heatran",
forme: "Mega",
types: ["Fire", "Steel"],
baseStats: { hp: 91, atk: 120, def: 106, spa: 175, spd: 141, spe: 67 },
abilities: { 0: "Flash Fire", H: "Flame Body" },
heightm: 2.8,
weightkg: 570,
color: "Brown",
tags: ["Sub-Legendary"],
eggGroups: ["Undiscovered"],
requiredItem: "Heatranite",
gen: 9,
},
regigigas: {
num: 486,
@ -8906,6 +9034,25 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
color: "Black",
tags: ["Mythical"],
eggGroups: ["Undiscovered"],
otherFormes: ["Darkrai-Mega"],
formeOrder: ["Darkrai", "Darkrai-Mega"],
},
darkraimega: {
num: 491,
name: "Darkrai-Mega",
baseSpecies: "Darkrai",
forme: "Mega",
types: ["Dark"],
gender: "N",
baseStats: { hp: 70, atk: 120, def: 130, spa: 165, spd: 130, spe: 85 },
abilities: { 0: "Bad Dreams" },
heightm: 3,
weightkg: 240,
color: "Black",
tags: ["Mythical"],
eggGroups: ["Undiscovered"],
requiredItem: "Darkranite",
gen: 9,
},
shaymin: {
num: 492,
@ -11275,6 +11422,24 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Golett",
evoLevel: 43,
eggGroups: ["Mineral"],
otherFormes: ["Golurk-Mega"],
formeOrder: ["Golurk", "Golurk-Mega"],
},
golurkmega: {
num: 623,
name: "Golurk-Mega",
baseSpecies: "Golurk",
forme: "Mega",
types: ["Ground", "Ghost"],
gender: "N",
baseStats: { hp: 89, atk: 159, def: 105, spa: 70, spd: 105, spe: 55 },
abilities: { 0: "Iron Fist", 1: "Klutz", H: "No Guard" },
heightm: 4,
weightkg: 330,
color: "Green",
eggGroups: ["Mineral"],
requiredItem: "Golurkite",
gen: 9,
},
pawniard: {
num: 624,
@ -12537,8 +12702,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Espurr",
evoLevel: 25,
eggGroups: ["Field"],
otherFormes: ["Meowstic-F"],
formeOrder: ["Meowstic", "Meowstic-F"],
otherFormes: ["Meowstic-F", "Meowstic-M-Mega", "Meowstic-F-Mega"],
formeOrder: ["Meowstic", "Meowstic-F", "Meowstic-M-Mega", "Meowstic-F-Mega"],
},
meowsticf: {
num: 678,
@ -12556,6 +12721,40 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoLevel: 25,
eggGroups: ["Field"],
},
meowsticmmega: {
num: 678,
name: "Meowstic-M-Mega",
baseSpecies: "Meowstic",
forme: "M-Mega",
types: ["Psychic"],
gender: "M",
baseStats: { hp: 74, atk: 48, def: 76, spa: 143, spd: 101, spe: 124 },
abilities: { 0: "Keen Eye", 1: "Infiltrator", H: "Competitive" },
heightm: 0.8,
weightkg: 10.1,
color: "Blue",
eggGroups: ["Field"],
requiredItem: "Meowsticite",
battleOnly: "Meowstic",
gen: 9,
},
meowsticfmega: {
num: 678,
name: "Meowstic-F-Mega",
baseSpecies: "Meowstic",
forme: "F-Mega",
types: ["Psychic"],
gender: "F",
baseStats: { hp: 74, atk: 48, def: 76, spa: 143, spd: 101, spe: 124 },
abilities: { 0: "Keen Eye", 1: "Infiltrator", H: "Competitive" },
heightm: 0.8,
weightkg: 10.1,
color: "White",
eggGroups: ["Field"],
requiredItem: "Meowsticite",
battleOnly: "Meowstic-F",
gen: 9,
},
honedge: {
num: 679,
name: "Honedge",
@ -13751,6 +13950,23 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoType: "useItem",
evoItem: "Ice Stone",
eggGroups: ["Water 3"],
otherFormes: ["Crabominable-Mega"],
formeOrder: ["Crabominable", "Crabominable-Mega"],
},
crabominablemega: {
num: 740,
name: "Crabominable-Mega",
baseSpecies: "Crabominable",
forme: "Mega",
types: ["Fighting", "Ice"],
baseStats: { hp: 97, atk: 157, def: 122, spa: 62, spd: 107, spe: 33 },
abilities: { 0: "Hyper Cutter", 1: "Iron Fist", H: "Anger Point" },
heightm: 2.6,
weightkg: 252.8,
color: "White",
eggGroups: ["Water 3"],
requiredItem: "Crabominite",
gen: 9,
},
oricorio: {
num: 741,
@ -14284,6 +14500,23 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Wimpod",
evoLevel: 30,
eggGroups: ["Bug", "Water 3"],
otherFormes: ["Golisopod-Mega"],
formeOrder: ["Golisopod", "Golisopod-Mega"],
},
golisopodmega: {
num: 768,
name: "Golisopod-Mega",
baseSpecies: "Golisopod",
forme: "Mega",
types: ["Bug", "Steel"],
baseStats: { hp: 75, atk: 150, def: 175, spa: 70, spd: 120, spe: 40 },
abilities: { 0: "Emergency Exit" },
heightm: 2.3,
weightkg: 148,
color: "Gray",
eggGroups: ["Bug", "Water 3"],
requiredItem: "Golisopite",
gen: 9,
},
sandygast: {
num: 769,
@ -15192,8 +15425,8 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
color: "Gray",
eggGroups: ["Undiscovered"],
tags: ["Mythical"],
otherFormes: ["Magearna-Original"],
formeOrder: ["Magearna", "Magearna-Original"],
otherFormes: ["Magearna-Original", "Magearna-Mega", "Magearna-Original-Mega"],
formeOrder: ["Magearna", "Magearna-Original", "Magearna-Mega", "Magearna-Original-Mega"],
},
magearnaoriginal: {
num: 801,
@ -15209,6 +15442,39 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
color: "Red",
eggGroups: ["Undiscovered"],
},
magearnamega: {
num: 801,
name: "Magearna-Mega",
baseSpecies: "Magearna",
forme: "Mega",
types: ["Steel", "Fairy"],
gender: "N",
baseStats: { hp: 80, atk: 125, def: 115, spa: 170, spd: 115, spe: 95 },
abilities: { 0: "Soul-Heart" },
heightm: 1.3,
weightkg: 248.1,
color: "Gray",
eggGroups: ["Undiscovered"],
requiredItem: "Magearnite",
gen: 9,
},
magearnaoriginalmega: {
num: 801,
name: "Magearna-Original-Mega",
baseSpecies: "Magearna",
forme: "Original-Mega",
types: ["Steel", "Fairy"],
gender: "N",
baseStats: { hp: 80, atk: 125, def: 115, spa: 170, spd: 115, spe: 95 },
abilities: { 0: "Soul-Heart" },
heightm: 1.3,
weightkg: 248.1,
color: "Red",
eggGroups: ["Undiscovered"],
requiredItem: "Magearnite",
battleOnly: "Magearna-Original",
gen: 9,
},
marshadow: {
num: 802,
name: "Marshadow",
@ -15290,6 +15556,25 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
color: "Yellow",
tags: ["Mythical"],
eggGroups: ["Undiscovered"],
otherFormes: ["Zeraora-Mega"],
formeOrder: ["Zeraora", "Zeraora-Mega"],
},
zeraoramega: {
num: 807,
name: "Zeraora-Mega",
baseSpecies: "Zeraora",
forme: "Mega",
types: ["Electric"],
gender: "N",
baseStats: { hp: 88, atk: 157, def: 75, spa: 147, spd: 80, spe: 153 },
abilities: { 0: "Volt Absorb" },
heightm: 1.5,
weightkg: 44.5,
color: "Yellow",
tags: ["Mythical"],
eggGroups: ["Undiscovered"],
requiredItem: "Zeraorite",
gen: 9,
},
meltan: {
num: 808,
@ -17986,6 +18271,22 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
evoType: "useItem",
evoItem: "Fire Stone",
eggGroups: ["Grass"],
otherFormes: ["Scovillain-Mega"],
formeOrder: ["Scovillain", "Scovillain-Mega"],
},
scovillainmega: {
num: 952,
name: "Scovillain-Mega",
baseSpecies: "Scovillain",
forme: "Mega",
types: ["Grass", "Fire"],
baseStats: { hp: 65, atk: 138, def: 85, spa: 138, spd: 85, spe: 75 },
abilities: { 0: "Chlorophyll", 1: "Insomnia", H: "Moody" },
heightm: 1.2,
weightkg: 22,
color: "Green",
eggGroups: ["Grass"],
requiredItem: "Scovillainite",
},
rellor: {
num: 953,
@ -18230,6 +18531,22 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Glimmet",
evoLevel: 35,
eggGroups: ["Mineral"],
otherFormes: ["Glimmora-Mega"],
formeOrder: ["Glimmora", "Glimmora-Mega"],
},
glimmoramega: {
num: 970,
name: "Glimmora-Mega",
baseSpecies: "Glimmora",
forme: "Mega",
types: ["Rock", "Poison"],
baseStats: { hp: 83, atk: 90, def: 105, spa: 150, spd: 96, spe: 101 },
abilities: { 0: "Toxic Debris", H: "Corrosion" },
heightm: 2.8,
weightkg: 77,
color: "Blue",
eggGroups: ["Mineral"],
requiredItem: "Glimmoranite",
},
greavard: {
num: 971,
@ -18326,23 +18643,80 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
heightm: 0.3,
weightkg: 8,
color: "Red",
cosmeticFormes: ["Tatsugiri-Droopy", "Tatsugiri-Stretchy"],
formeOrder: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy"],
eggGroups: ["Water 2"],
otherFormes: ["Tatsugiri-Droopy", "Tatsugiri-Stretchy", "Tatsugiri-Curly-Mega", "Tatsugiri-Droopy-Mega", "Tatsugiri-Stretchy-Mega"],
formeOrder: ["Tatsugiri", "Tatsugiri-Droopy", "Tatsugiri-Stretchy", "Tatsugiri-Curly-Mega", "Tatsugiri-Droopy-Mega", "Tatsugiri-Stretchy-Mega"],
},
tatsugiridroopy: {
isCosmeticForme: true,
num: 978,
name: "Tatsugiri-Droopy",
baseSpecies: "Tatsugiri",
forme: "Droopy",
types: ["Dragon", "Water"],
baseStats: { hp: 68, atk: 50, def: 60, spa: 120, spd: 95, spe: 82 },
abilities: { 0: "Commander", H: "Storm Drain" },
heightm: 0.3,
weightkg: 8,
color: "Pink",
eggGroups: ["Water 2"],
},
tatsugiristretchy: {
isCosmeticForme: true,
num: 978,
name: "Tatsugiri-Stretchy",
baseSpecies: "Tatsugiri",
forme: "Stretchy",
types: ["Dragon", "Water"],
baseStats: { hp: 68, atk: 50, def: 60, spa: 120, spd: 95, spe: 82 },
abilities: { 0: "Commander", H: "Storm Drain" },
heightm: 0.3,
weightkg: 8,
color: "Yellow",
eggGroups: ["Water 2"],
},
tatsugiricurlymega: {
num: 978,
name: "Tatsugiri-Curly-Mega",
baseSpecies: "Tatsugiri",
forme: "Curly-Mega",
types: ["Dragon", "Water"],
baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 },
abilities: { 0: "Commander", H: "Storm Drain" },
heightm: 0.3,
weightkg: 8,
color: "Red",
eggGroups: ["Water 2"],
requiredItem: "Tatsugirinite",
battleOnly: "Tatsugiri",
},
tatsugiridroopymega: {
num: 978,
name: "Tatsugiri-Droopy-Mega",
baseSpecies: "Tatsugiri",
forme: "Droopy-Mega",
types: ["Dragon", "Water"],
baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 },
abilities: { 0: "Commander", H: "Storm Drain" },
heightm: 0.3,
weightkg: 8,
color: "Pink",
eggGroups: ["Water 2"],
requiredItem: "Tatsugirinite",
battleOnly: "Tatsugiri-Droopy",
},
tatsugiristretchymega: {
num: 978,
name: "Tatsugiri-Stretchy-Mega",
baseSpecies: "Tatsugiri",
forme: "Stretchy-Mega",
types: ["Dragon", "Water"],
baseStats: { hp: 68, atk: 65, def: 90, spa: 135, spd: 125, spe: 92 },
abilities: { 0: "Commander", H: "Storm Drain" },
heightm: 0.3,
weightkg: 8,
color: "Yellow",
eggGroups: ["Water 2"],
requiredItem: "Tatsugirinite",
battleOnly: "Tatsugiri-Stretchy",
},
annihilape: {
num: 979,
@ -18626,6 +19000,22 @@ export const Pokedex: import('../sim/dex-species').SpeciesDataTable = {
prevo: "Arctibax",
evoLevel: 54,
eggGroups: ["Dragon", "Mineral"],
otherFormes: ["Baxcalibur-Mega"],
formeOrder: ["Baxcalibur", "Baxcalibur-Mega"],
},
baxcaliburmega: {
num: 998,
name: "Baxcalibur-Mega",
baseSpecies: "Baxcalibur",
forme: "Mega",
types: ["Dragon", "Ice"],
baseStats: { hp: 115, atk: 175, def: 117, spa: 105, spd: 101, spe: 87 },
abilities: { 0: "Thermal Exchange", H: "Ice Body" },
heightm: 2.1,
weightkg: 315,
color: "Blue",
eggGroups: ["Dragon", "Mineral"],
requiredItem: "Baxcalibrite",
},
gimmighoul: {
num: 999,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1074,5 +1074,93 @@
"teraTypes": ["Poison"]
}
]
},
"feraligatr": {
"level": 84,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Dragon Dance", "Thunder Fang", "Crunch", "Liquidation"],
"abilities": ["Sheer Force"],
"teraTypes": ["Dark"]
}
]
},
"feraligatrmega": {
"level": 84,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Dragon Dance", "Thunder Fang", "Poison Fang", "Crunch", "Fire Fang"],
"abilities": ["Sheer Force"],
"teraTypes": ["Normal"]
}
]
},
"salazzle": {
"level": 84,
"sets": [
{
"role": "Wallbreaker",
"movepool": ["Magma Storm", "Malignant Chain", "Venoshock", "Psychic Noise", "Baneful Bunker"],
"abilities": ["Corrosive Soul"],
"teraTypes": ["Flying"]
}
]
},
"kyogre": {
"level": 80,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Origin Pulse", "Thunder", "Ice Beam", "Hurricane", "Tidal Surge"],
"abilities": ["Oceanic Blessing"],
"teraTypes": ["Water"]
}
]
},
"azelf": {
"level": 84,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Rapid Spin", "Metronome", "Loot Box", "Acupressure"],
"abilities": ["Auto Spin"],
"teraTypes": ["Stellar"]
}
]
},
"decidueye": {
"level": 84,
"sets": [
{
"role": "Fast Support",
"movepool": ["Sinister Arrows", "Leaf Blade", "Defog", "Roost", "Spirit Shackle", "U-turn"],
"abilities": ["Overgrow", "Sniper"],
"teraTypes": ["Steel", "Dark", "Ghost"]
}
]
},
"ogerponcornerstone": {
"level": 84,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Sappy Seed", "Ivy Cudgel", "Synthesis", "Spiky Shield", "Thousand Waves"],
"abilities": ["Solid Rock"],
"teraTypes": ["Rock"]
}
]
},
"glimmora": {
"level": 84,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Mortal Spin", "Meteor Beam", "Power Gem", "Ice Beam", "Malignant Chain"],
"abilities": ["Corrosion"],
"teraTypes": ["Grass"]
}
]
}
}

View File

@ -232,7 +232,10 @@ export class RandomChatBatsTeams extends RandomTeams {
if (species.id === 'ogerponhearthflame') this.incompatibleMoves(moves, movePool, 'crabhammer', 'stoneedge');
if (species.id === 'hitmontop') this.incompatibleMoves(moves, movePool, 'bulkup', 'rapidspin');
if (species.id === 'mesprit') this.incompatibleMoves(moves, movePool, 'psychic', 'storedpower');
if (species.id === 'mesprit') this.incompatibleMoves(moves, movePool, 'knockoff', 'earthquake');
if (species.id === 'primeape') this.incompatibleMoves(moves, movePool, 'knockoff', 'earthquake');
if (species.id === 'feraligatrmega') this.incompatibleMoves(moves, movePool, 'thunderfang', 'poisonfang');
if (species.id === 'salazzle') this.incompatibleMoves(moves, movePool, 'malignantchain', 'venoshock');
if (species.id === 'glimmora') this.incompatibleMoves(moves, movePool, 'powergem', 'meteorbeam');
}
override randomMoveset(
@ -713,6 +716,14 @@ export class RandomChatBatsTeams extends RandomTeams {
if (species.id === 'primeape') return 'Eviolite';
if (species.id === 'rillaboom') return 'Heavy-Duty Boots';
if (species.id === 'mandibuzz') return 'Thick Club';
if (species.id === 'feraligatr') return 'Life Orb';
if (species.id === 'salazzle') return 'Heavy-Duty Boots';
if (species.id === 'kyogre') return 'Waterium Z';
if (species.id === 'azelf') return 'Focus Band';
if (species.id === 'decidueye') return this.sample(['Life Orb', 'Heavy-Duty Boots', "Leftovers"]);
if (species.id === 'ogerponcornerstone') return 'Cornerstone Mask';
if (species.id === 'glimmora' && moves.has('meteorbeam')) return 'Power Herb';
if (species.id === 'glimmora') return 'Air Balloon';
}
override randomSet(
@ -997,7 +1008,7 @@ export class RandomChatBatsTeams extends RandomTeams {
// if (potd?.exists && (pokemon.length === 1 || this.maxTeamSize === 1)) species = potd;
// testing code
// if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Mew');
// if (pokemon.length === 0 || this.maxTeamSize === 1) species = this.dex.species.get('Feraligatr-Mega');
let set: RandomTeamsTypes.RandomSet;

View File

@ -1,14 +1,14 @@
{
"bulbasaur": {
"level": 89,
"level": 91,
"moves": ["bodyslam", "razorleaf", "sleeppowder", "swordsdance"]
},
"ivysaur": {
"level": 80,
"level": 82,
"moves": ["bodyslam", "razorleaf", "sleeppowder", "swordsdance"]
},
"venusaur": {
"level": 74,
"level": 73,
"moves": ["bodyslam", "razorleaf", "sleeppowder"],
"exclusiveMoves": ["hyperbeam", "swordsdance", "swordsdance"]
},
@ -58,7 +58,7 @@
"exclusiveMoves": ["agility", "agility", "megadrain"]
},
"pidgey": {
"level": 93,
"level": 95,
"moves": ["agility", "agility", "quickattack", "quickattack", "skyattack"],
"essentialMoves": ["doubleedge"],
"exclusiveMoves": ["mirrormove", "sandattack", "substitute"],
@ -164,7 +164,7 @@
"exclusiveMoves": ["blizzard", "counter", "hyperbeam", "hyperbeam", "psychic", "sing", "sing"]
},
"vulpix": {
"level": 88,
"level": 89,
"moves": ["bodyslam", "confuseray", "fireblast"],
"exclusiveMoves": ["flamethrower", "flamethrower", "quickattack", "reflect", "substitute", "substitute"]
},
@ -199,7 +199,7 @@
"exclusiveMoves": ["stunspore", "stunspore", "swordsdance"]
},
"gloom": {
"level": 82,
"level": 83,
"moves": ["doubleedge", "megadrain", "sleeppowder"],
"exclusiveMoves": ["stunspore", "stunspore", "swordsdance"]
},
@ -245,7 +245,7 @@
"persian": {
"level": 73,
"moves": ["bodyslam", "bubblebeam", "slash"],
"exclusiveMoves": ["hyperbeam", "thunderbolt"]
"exclusiveMoves": ["hyperbeam", "thunderbolt", "thunderbolt", "thunderbolt"]
},
"psyduck": {
"level": 89,
@ -269,7 +269,7 @@
"exclusiveMoves": ["counter", "lowkick", "hyperbeam", "hyperbeam"]
},
"growlithe": {
"level": 89,
"level": 91,
"moves": ["agility", "bodyslam", "fireblast"],
"exclusiveMoves": ["flamethrower", "reflect"]
},
@ -308,12 +308,12 @@
"exclusiveMoves": ["counter", "reflect", "reflect", "seismictoss", "seismictoss"]
},
"machop": {
"level": 89,
"level": 92,
"moves": ["bodyslam", "earthquake", "submission"],
"exclusiveMoves": ["counter", "rockslide", "rockslide"]
},
"machoke": {
"level": 81,
"level": 84,
"moves": ["bodyslam", "earthquake", "submission"],
"exclusiveMoves": ["counter", "rockslide", "rockslide"]
},
@ -369,13 +369,13 @@
"moves": ["agility", "bodyslam", "fireblast", "hyperbeam"]
},
"slowpoke": {
"level": 84,
"level": 83,
"moves": ["blizzard", "psychic", "surf"],
"essentialMoves": ["amnesia", "thunderwave"],
"comboMoves": ["amnesia", "rest", "surf", "thunderwave"]
},
"slowbro": {
"level": 68,
"level": 69,
"moves": ["blizzard", "psychic", "surf"],
"essentialMoves": ["amnesia", "thunderwave"],
"comboMoves": ["amnesia", "rest", "surf", "thunderwave"]
@ -523,7 +523,7 @@
"moves": ["bodyslam", "earthquake", "rockslide", "substitute"]
},
"rhydon": {
"level": 68,
"level": 71,
"moves": ["bodyslam", "earthquake", "rockslide", "substitute"]
},
"chansey": {
@ -693,7 +693,7 @@
"exclusiveMoves": ["doubleedge", "doubleedge", "doubleedge", "reflect"]
},
"dratini": {
"level": 89,
"level": 91,
"moves": ["bodyslam", "hyperbeam", "thunderbolt", "thunderbolt"],
"essentialMoves": ["blizzard", "thunderwave"]
},

View File

@ -220,6 +220,8 @@ export class RandomGen1Teams extends RandomGen2Teams {
* Random set generation for Gen 1 Random Battles.
*/
override randomSet(species: string | Species): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
if (!species.exists) species = this.dex.species.get('pikachu'); // Because Gen 1.
@ -275,7 +277,7 @@ export class RandomGen1Teams extends RandomGen2Teams {
if (move.damageCallback || move.damage) return true;
return move.category !== 'Physical';
});
if (noAttackStatMoves && !moves.has('mimic') && !moves.has('transform')) {
if (noAttackStatMoves && !moves.has('mimic') && !moves.has('transform') && !ruleTable.has('forceofthefallenmod')) {
evs.atk = 0;
// We don't want to lower the HP DV/IV
ivs.atk = 2;

View File

@ -103,6 +103,7 @@
]
},
"pikachu": {
"level": 73,
"sets": [
{
"role": "Fast Attacker",

View File

@ -342,7 +342,7 @@
]
},
"arcanine": {
"level": 79,
"level": 78,
"sets": [
{
"role": "Bulky Support",
@ -510,7 +510,7 @@
]
},
"dodrio": {
"level": 77,
"level": 78,
"sets": [
{
"role": "Wallbreaker",
@ -806,7 +806,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["calmmind", "hiddenpowerfire", "icebeam", "lovelykiss", "psychic", "substitute"],
"movepool": ["calmmind", "icebeam", "lovelykiss", "psychic", "substitute"],
"abilities": ["Oblivious"]
}
]
@ -1176,7 +1176,7 @@
]
},
"noctowl": {
"level": 92,
"level": 93,
"sets": [
{
"role": "Staller",
@ -1753,7 +1753,7 @@
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["calmmind", "icebeam", "recover", "surf", "toxic"],
"movepool": ["calmmind", "explosion", "icebeam", "recover", "surf", "toxic"],
"abilities": ["Natural Cure"]
}
]
@ -2613,7 +2613,7 @@
]
},
"cacturne": {
"level": 95,
"level": 96,
"sets": [
{
"role": "Staller",
@ -2690,7 +2690,7 @@
},
{
"role": "Wallbreaker",
"movepool": ["earthquake", "explosion", "overheat", "rockslide", "shadowball"],
"movepool": ["earthquake", "explosion", "rockslide", "shadowball"],
"abilities": ["Levitate"],
"preferredTypes": ["Ground"]
}
@ -2781,7 +2781,7 @@
]
},
"kecleon": {
"level": 91,
"level": 92,
"sets": [
{
"role": "Wallbreaker",
@ -3024,7 +3024,7 @@
]
},
"latios": {
"level": 67,
"level": 66,
"sets": [
{
"role": "Bulky Setup",

View File

@ -524,6 +524,8 @@ export class RandomGen3Teams extends RandomGen4Teams {
teamDetails: RandomTeamsTypes.TeamDetails = {},
isLead = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
@ -597,7 +599,7 @@ export class RandomGen3Teams extends RandomGen4Teams {
}
// Minimize confusion damage
if (!counter.get('Physical') && !moves.has('transform')) {
if (!counter.get('Physical') && !moves.has('transform') && !ruleTable.has('forceofthefallenmod')) {
evs.atk = 0;
ivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;
}

View File

@ -137,7 +137,7 @@
]
},
"sandslash": {
"level": 89,
"level": 88,
"sets": [
{
"role": "Spinner",
@ -173,7 +173,7 @@
]
},
"clefable": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Bulky Support",
@ -234,7 +234,7 @@
]
},
"parasect": {
"level": 98,
"level": 99,
"sets": [
{
"role": "Bulky Support",
@ -382,7 +382,8 @@
{
"role": "Bulky Support",
"movepool": ["haze", "hydropump", "icebeam", "rapidspin", "sludgebomb", "surf", "toxicspikes"],
"abilities": ["Clear Body", "Liquid Ooze"]
"abilities": ["Clear Body", "Liquid Ooze"],
"preferredTypes": ["Poison"]
}
]
},
@ -487,6 +488,11 @@
"role": "Bulky Support",
"movepool": ["explosion", "iceshard", "rapidspin", "rockblast", "spikes", "surf", "toxicspikes"],
"abilities": ["Shell Armor", "Skill Link"]
},
{
"role": "Bulky Support",
"movepool": ["explosion", "icebeam", "iceshard", "rapidspin", "spikes", "surf", "toxicspikes"],
"abilities": ["Shell Armor"]
}
]
},
@ -596,7 +602,7 @@
},
{
"role": "Bulky Attacker",
"movepool": ["bulkup", "closecombat", "drainpunch", "icepunch", "machpunch", "stoneedge"],
"movepool": ["bulkup", "closecombat", "icepunch", "machpunch", "stoneedge"],
"abilities": ["Iron Fist"]
}
]
@ -812,10 +818,9 @@
"abilities": ["Swift Swim"]
},
{
"role": "Bulky Support",
"movepool": ["earthpower", "icebeam", "spikes", "stealthrock", "surf", "toxicspikes"],
"abilities": ["Shell Armor", "Swift Swim"],
"preferredTypes": ["Ice"]
"role": "Bulky Attacker",
"movepool": ["icebeam", "spikes", "stealthrock", "surf", "toxicspikes"],
"abilities": ["Shell Armor", "Swift Swim"]
}
]
},
@ -851,7 +856,7 @@
]
},
"snorlax": {
"level": 77,
"level": 78,
"sets": [
{
"role": "Bulky Attacker",
@ -872,7 +877,7 @@
]
},
"articuno": {
"level": 81,
"level": 82,
"sets": [
{
"role": "Staller",
@ -897,7 +902,7 @@
]
},
"moltres": {
"level": 81,
"level": 82,
"sets": [
{
"role": "Bulky Attacker",
@ -927,7 +932,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["aurasphere", "calmmind", "fireblast", "psychic", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psychic", "recover", "signalbeam"],
"abilities": ["Pressure"]
}
]
@ -1159,6 +1164,11 @@
"role": "Wallbreaker",
"movepool": ["earthpower", "hiddenpowerfire", "hiddenpowerice", "hiddenpowerrock", "leafstorm", "sludgebomb"],
"abilities": ["Chlorophyll"]
},
{
"role": "Setup Sweeper",
"movepool": ["earthpower", "hiddenpowerfire", "solarbeam", "sunnyday"],
"abilities": ["Chlorophyll"]
}
]
},
@ -1171,7 +1181,6 @@
"abilities": ["Water Absorb"]
},
{
"role": "Bulky Attacker",
"movepool": ["earthquake", "recover", "toxic", "waterfall"],
"abilities": ["Water Absorb"]
@ -1236,7 +1245,7 @@
]
},
"wobbuffet": {
"level": 86,
"level": 87,
"sets": [
{
"role": "Bulky Support",
@ -1299,9 +1308,14 @@
"granbull": {
"level": 88,
"sets": [
{
"role": "Bulky Support",
"movepool": ["earthquake", "healbell", "return", "thunderwave"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Attacker",
"movepool": ["closecombat", "crunch", "healbell", "return", "thunderwave"],
"movepool": ["closecombat", "crunch", "return", "thunderwave"],
"abilities": ["Intimidate"]
}
]
@ -1342,7 +1356,7 @@
]
},
"heracross": {
"level": 80,
"level": 79,
"sets": [
{
"role": "Wallbreaker",
@ -1352,7 +1366,8 @@
{
"role": "Fast Attacker",
"movepool": ["closecombat", "earthquake", "megahorn", "nightslash", "stoneedge", "swordsdance"],
"abilities": ["Guts"]
"abilities": ["Guts"],
"preferredTypes": ["Rock"]
}
]
},
@ -1475,16 +1490,10 @@
"level": 84,
"sets": [
{
"role": "Spinner",
"role": "Bulky Support",
"movepool": ["earthquake", "iceshard", "rapidspin", "stealthrock", "stoneedge", "toxic"],
"abilities": ["Sturdy"],
"preferredTypes": ["Rock"]
},
{
"role": "Bulky Attacker",
"movepool": ["earthquake", "gunkshot", "iceshard", "stealthrock", "stoneedge"],
"abilities": ["Sturdy"],
"preferredTypes": ["Rock"]
}
]
},
@ -1631,7 +1640,7 @@
]
},
"hooh": {
"level": 72,
"level": 73,
"sets": [
{
"role": "Bulky Attacker",
@ -1680,13 +1689,13 @@
"level": 84,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["agility", "fireblast", "stoneedge", "superpower", "thunderpunch", "vacuumwave"],
"role": "Wallbreaker",
"movepool": ["agility", "earthquake", "fireblast", "stoneedge", "superpower", "vacuumwave"],
"abilities": ["Blaze"]
},
{
"role": "Wallbreaker",
"movepool": ["flareblitz", "stoneedge", "superpower", "swordsdance", "thunderpunch"],
"role": "Fast Attacker",
"movepool": ["earthquake", "flareblitz", "stoneedge", "superpower", "swordsdance"],
"abilities": ["Blaze"]
}
]
@ -2136,7 +2145,7 @@
]
},
"torkoal": {
"level": 88,
"level": 87,
"sets": [
{
"role": "Bulky Support",
@ -2355,7 +2364,7 @@
]
},
"kecleon": {
"level": 91,
"level": 92,
"sets": [
{
"role": "Bulky Support",
@ -2370,7 +2379,7 @@
{
"role": "Wallbreaker",
"movepool": ["hiddenpowerfighting", "shadowclaw", "shadowsneak", "thunderwave", "willowisp"],
"abilities": ["Frisk", "Insomnia"]
"abilities": ["Insomnia"]
}
]
},
@ -2525,7 +2534,7 @@
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["earthquake", "explosion", "rest", "stealthrock", "stoneedge", "thunderwave", "toxic"],
"movepool": ["earthquake", "explosion", "stealthrock", "stoneedge", "thunderwave", "toxic"],
"abilities": ["Clear Body"]
},
{
@ -2654,7 +2663,7 @@
]
},
"jirachi": {
"level": 75,
"level": 74,
"sets": [
{
"role": "Bulky Support",
@ -2685,7 +2694,7 @@
]
},
"deoxysattack": {
"level": 72,
"level": 71,
"sets": [
{
"role": "Wallbreaker",
@ -2710,7 +2719,7 @@
]
},
"deoxysspeed": {
"level": 79,
"level": 80,
"sets": [
{
"role": "Fast Support",
@ -2930,7 +2939,7 @@
]
},
"floatzel": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Fast Attacker",
@ -2946,7 +2955,7 @@
]
},
"cherrim": {
"level": 96,
"level": 95,
"sets": [
{
"role": "Staller",
@ -3127,7 +3136,7 @@
]
},
"hippowdon": {
"level": 80,
"level": 79,
"sets": [
{
"role": "Bulky Support",
@ -3496,7 +3505,7 @@
]
},
"rotomfan": {
"level": 79,
"level": 78,
"sets": [
{
"role": "Bulky Attacker",
@ -3616,7 +3625,7 @@
]
},
"regigigas": {
"level": 82,
"level": 83,
"sets": [
{
"role": "Staller",
@ -3686,7 +3695,7 @@
]
},
"darkrai": {
"level": 69,
"level": 68,
"sets": [
{
"role": "Setup Sweeper",

View File

@ -215,17 +215,6 @@ export class RandomGen4Teams extends RandomGen5Teams {
this.incompatibleMoves(moves, movePool, statusInflictingMoves, statusInflictingMoves);
}
// Cull filler moves for otherwise fixed set Stealth Rock users
if (!teamDetails.stealthRock) {
if (species.id === 'registeel' && role === 'Staller') {
if (movePool.includes('thunderwave')) this.fastPop(movePool, movePool.indexOf('thunderwave'));
if (moves.size + movePool.length <= this.maxMoveCount) return;
}
if (species.id === 'wormadamtrash' && role === 'Staller') {
if (movePool.includes('suckerpunch')) this.fastPop(movePool, movePool.indexOf('suckerpunch'));
if (moves.size + movePool.length <= this.maxMoveCount) return;
}
}
if (species.id === 'bastiodon') {
// Enforces Toxic too, for good measure.
this.incompatibleMoves(moves, movePool, ['metalburst', 'protect', 'roar'], ['metalburst', 'protect']);
@ -662,6 +651,8 @@ export class RandomGen4Teams extends RandomGen5Teams {
teamDetails: RandomTeamsTypes.TeamDetails = {},
isLead = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
@ -758,7 +749,7 @@ export class RandomGen4Teams extends RandomGen5Teams {
}
// Minimize confusion damage
if (!counter.get('Physical') && !moves.has('transform')) {
if (!counter.get('Physical') && !moves.has('transform') && !ruleTable.has('forceofthefallenmod')) {
evs.atk = 0;
ivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;
}

View File

@ -1,6 +1,6 @@
{
"venusaur": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Staller",
@ -321,9 +321,15 @@
"golduck": {
"level": 88,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["calmmind", "encore", "focusblast", "icebeam", "scald", "substitute"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
},
{
"role": "Fast Attacker",
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam", "scald"],
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
}
@ -418,7 +424,8 @@
{
"role": "Bulky Support",
"movepool": ["haze", "icebeam", "rapidspin", "scald", "sludgebomb", "toxicspikes"],
"abilities": ["Clear Body", "Liquid Ooze"]
"abilities": ["Clear Body", "Liquid Ooze"],
"preferredTypes": ["Poison"]
}
]
},
@ -515,7 +522,7 @@
]
},
"cloyster": {
"level": 78,
"level": 79,
"sets": [
{
"role": "Setup Sweeper",
@ -529,7 +536,7 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["focusblast", "painsplit", "shadowball", "sludgewave", "substitute", "trick", "willowisp"],
"movepool": ["destinybond", "focusblast", "painsplit", "shadowball", "sludgewave", "substitute", "trick", "willowisp"],
"abilities": ["Levitate"],
"preferredTypes": ["Fighting"]
}
@ -644,7 +651,7 @@
]
},
"rhydon": {
"level": 83,
"level": 82,
"sets": [
{
"role": "Bulky Attacker",
@ -913,7 +920,7 @@
]
},
"articuno": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Staller",
@ -983,7 +990,7 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"],
"abilities": ["Unnerve"]
}
]
@ -1189,7 +1196,7 @@
]
},
"jumpluff": {
"level": 82,
"level": 81,
"sets": [
{
"role": "Fast Support",
@ -1310,7 +1317,7 @@
]
},
"forretress": {
"level": 78,
"level": 79,
"sets": [
{
"role": "Bulky Support",
@ -1373,9 +1380,14 @@
"granbull": {
"level": 90,
"sets": [
{
"role": "Bulky Support",
"movepool": ["earthquake", "healbell", "return", "thunderwave"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Attacker",
"movepool": ["closecombat", "crunch", "healbell", "return", "thunderwave"],
"movepool": ["closecombat", "crunch", "return", "thunderwave"],
"abilities": ["Intimidate"]
}
]
@ -1432,7 +1444,7 @@
]
},
"ursaring": {
"level": 85,
"level": 84,
"sets": [
{
"role": "Wallbreaker",
@ -1467,7 +1479,7 @@
]
},
"octillery": {
"level": 91,
"level": 92,
"sets": [
{
"role": "Bulky Attacker",
@ -1545,16 +1557,10 @@
"level": 82,
"sets": [
{
"role": "Spinner",
"role": "Bulky Support",
"movepool": ["earthquake", "iceshard", "rapidspin", "stealthrock", "stoneedge", "toxic"],
"abilities": ["Sturdy"],
"preferredTypes": ["Rock"]
},
{
"role": "Bulky Attacker",
"movepool": ["earthquake", "gunkshot", "iceshard", "stealthrock", "stoneedge"],
"abilities": ["Sturdy"],
"preferredTypes": ["Rock"]
}
]
},
@ -1711,7 +1717,7 @@
]
},
"celebi": {
"level": 81,
"level": 80,
"sets": [
{
"role": "Fast Attacker",
@ -2187,7 +2193,7 @@
]
},
"grumpig": {
"level": 92,
"level": 91,
"sets": [
{
"role": "Bulky Attacker",
@ -2388,7 +2394,7 @@
]
},
"castform": {
"level": 97,
"level": 98,
"sets": [
{
"role": "Bulky Attacker",
@ -2398,7 +2404,7 @@
]
},
"kecleon": {
"level": 94,
"level": 95,
"sets": [
{
"role": "Bulky Support",
@ -2413,7 +2419,7 @@
{
"role": "Wallbreaker",
"movepool": ["hiddenpowerfighting", "shadowclaw", "shadowsneak", "thunderwave", "willowisp"],
"abilities": ["Cursed Body", "Frisk", "Insomnia"]
"abilities": ["Insomnia"]
}
]
},
@ -2542,7 +2548,7 @@
]
},
"salamence": {
"level": 75,
"level": 74,
"sets": [
{
"role": "Setup Sweeper",
@ -2702,7 +2708,7 @@
]
},
"jirachi": {
"level": 75,
"level": 74,
"sets": [
{
"role": "Bulky Support",
@ -2777,7 +2783,7 @@
]
},
"infernape": {
"level": 79,
"level": 78,
"sets": [
{
"role": "Wallbreaker",
@ -2848,7 +2854,7 @@
]
},
"luxray": {
"level": 89,
"level": 88,
"sets": [
{
"role": "Wallbreaker",
@ -2934,7 +2940,7 @@
]
},
"wormadamtrash": {
"level": 88,
"level": 87,
"sets": [
{
"role": "Staller",
@ -3426,12 +3432,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["earthquake", "iceshard", "iciclecrash", "stealthrock"],
"abilities": ["Thick Fat"]
},
{
"role": "Fast Attacker",
"movepool": ["earthquake", "iceshard", "iciclecrash", "stoneedge", "superpower"],
"movepool": ["earthquake", "iceshard", "iciclecrash", "stealthrock", "stoneedge", "superpower"],
"abilities": ["Thick Fat"]
}
]
@ -3513,7 +3514,7 @@
]
},
"rotomwash": {
"level": 79,
"level": 80,
"sets": [
{
"role": "Bulky Attacker",
@ -3563,7 +3564,7 @@
]
},
"mesprit": {
"level": 82,
"level": 83,
"sets": [
{
"role": "Fast Attacker",
@ -3662,7 +3663,7 @@
]
},
"giratinaorigin": {
"level": 73,
"level": 72,
"sets": [
{
"role": "Fast Attacker",
@ -3976,7 +3977,7 @@
]
},
"serperior": {
"level": 85,
"level": 86,
"sets": [
{
"role": "Fast Attacker",
@ -4274,7 +4275,7 @@
},
{
"role": "Staller",
"movepool": ["hurricane", "leechseed", "protect", "substitute"],
"movepool": ["encore", "hurricane", "leechseed", "substitute"],
"abilities": ["Prankster"]
}
]
@ -4353,12 +4354,12 @@
"level": 82,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["crunch", "dragondance", "highjumpkick", "stoneedge", "zenheadbutt"],
"abilities": ["Intimidate", "Moxie"]
"role": "Bulky Setup",
"movepool": ["crunch", "dragondance", "drainpunch", "stoneedge", "zenheadbutt"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Setup",
"role": "Bulky Attacker",
"movepool": ["bulkup", "crunch", "drainpunch", "rest"],
"abilities": ["Shed Skin"]
}
@ -4422,7 +4423,7 @@
]
},
"garbodor": {
"level": 89,
"level": 90,
"sets": [
{
"role": "Bulky Attacker",
@ -4466,7 +4467,7 @@
"sets": [
{
"role": "Bulky Setup",
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover", "signalbeam"],
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover"],
"abilities": ["Magic Guard"]
}
]
@ -4568,9 +4569,13 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["bugbuzz", "gigadrain", "hiddenpowerice", "thunder", "voltswitch"],
"abilities": ["Compound Eyes"],
"preferredTypes": ["Bug"]
"movepool": ["bugbuzz", "hiddenpowerice", "thunder", "voltswitch"],
"abilities": ["Compound Eyes"]
},
{
"role": "Wallbreaker",
"movepool": ["bugbuzz", "energyball", "thunder", "voltswitch"],
"abilities": ["Compound Eyes"]
}
]
},
@ -4616,7 +4621,7 @@
]
},
"beheeyem": {
"level": 90,
"level": 89,
"sets": [
{
"role": "Wallbreaker",
@ -4626,7 +4631,7 @@
]
},
"chandelure": {
"level": 80,
"level": 79,
"sets": [
{
"role": "Fast Attacker",
@ -4930,7 +4935,7 @@
]
},
"zekrom": {
"level": 75,
"level": 74,
"sets": [
{
"role": "Bulky Attacker",
@ -4945,7 +4950,7 @@
]
},
"landorus": {
"level": 75,
"level": 74,
"sets": [
{
"role": "Wallbreaker",
@ -4956,7 +4961,8 @@
{
"role": "Setup Sweeper",
"movepool": ["calmmind", "earthpower", "focusblast", "psychic", "rockpolish", "sludgewave"],
"abilities": ["Sheer Force"]
"abilities": ["Sheer Force"],
"preferredTypes": ["Poison"]
}
]
},

View File

@ -236,15 +236,8 @@ export class RandomGen5Teams extends RandomGen6Teams {
if (abilities.includes('Guts')) this.incompatibleMoves(moves, movePool, 'protect', 'swordsdance');
// Cull filler moves for otherwise fixed set Stealth Rock users
if (!teamDetails.stealthRock) {
if (species.id === 'registeel' && role === 'Staller') {
if (movePool.includes('thunderwave')) this.fastPop(movePool, movePool.indexOf('thunderwave'));
if (moves.size + movePool.length <= this.maxMoveCount) return;
}
if (species.baseSpecies === 'Wormadam' && role === 'Staller') {
if (movePool.includes('suckerpunch')) this.fastPop(movePool, movePool.indexOf('suckerpunch'));
if (moves.size + movePool.length <= this.maxMoveCount) return;
}
if (species.id === 'mamoswine') {
this.incompatibleMoves(moves, movePool, ['stealthrock', 'stoneedge'], ['stoneedge', 'superpower']);
}
}
@ -711,6 +704,8 @@ export class RandomGen5Teams extends RandomGen6Teams {
teamDetails: RandomTeamsTypes.TeamDetails = {},
isLead = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
@ -817,7 +812,7 @@ export class RandomGen5Teams extends RandomGen6Teams {
// Minimize confusion damage, including if Foul Play is its only physical attack
if (
(!counter.get('Physical') || (counter.get('Physical') <= 1 && (moves.has('foulplay') || moves.has('rapidspin')))) &&
!moves.has('transform')
!moves.has('transform') && !ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = hasHiddenPower ? (ivs.atk || 31) - 28 : 0;

View File

@ -15,7 +15,7 @@
]
},
"venusaurmega": {
"level": 78,
"level": 77,
"sets": [
{
"role": "Bulky Attacker",
@ -105,7 +105,7 @@
]
},
"beedrillmega": {
"level": 78,
"level": 77,
"sets": [
{
"role": "Fast Attacker",
@ -212,7 +212,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["earthpower", "fireblast", "icebeam", "sludgewave", "stealthrock", "toxicspikes"],
"movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "stealthrock", "toxicspikes"],
"abilities": ["Sheer Force"],
"preferredTypes": ["Ice"]
}
@ -223,7 +223,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["earthpower", "fireblast", "icebeam", "sludgewave", "substitute", "superpower"],
"movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "substitute"],
"abilities": ["Sheer Force"],
"preferredTypes": ["Ice"]
}
@ -339,9 +339,15 @@
"golduck": {
"level": 90,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["calmmind", "encore", "focusblast", "icebeam", "scald", "substitute"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
},
{
"role": "Fast Attacker",
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam", "scald"],
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
}
@ -822,7 +828,7 @@
]
},
"pinsir": {
"level": 84,
"level": 85,
"sets": [
{
"role": "Fast Attacker",
@ -859,7 +865,7 @@
]
},
"gyarados": {
"level": 77,
"level": 78,
"sets": [
{
"role": "Setup Sweeper",
@ -1056,7 +1062,7 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"],
"abilities": ["Unnerve"]
}
]
@ -1076,7 +1082,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"],
"abilities": ["Unnerve"]
}
]
@ -1176,7 +1182,7 @@
]
},
"crobat": {
"level": 81,
"level": 80,
"sets": [
{
"role": "Bulky Attacker",
@ -1388,7 +1394,7 @@
]
},
"wobbuffet": {
"level": 92,
"level": 93,
"sets": [
{
"role": "Bulky Support",
@ -1500,7 +1506,7 @@
]
},
"scizor": {
"level": 79,
"level": 78,
"sets": [
{
"role": "Setup Sweeper",
@ -1661,7 +1667,7 @@
]
},
"houndoom": {
"level": 85,
"level": 84,
"sets": [
{
"role": "Fast Attacker",
@ -1848,7 +1854,7 @@
]
},
"lugia": {
"level": 72,
"level": 71,
"sets": [
{
"role": "Staller",
@ -2506,6 +2512,11 @@
"role": "Bulky Setup",
"movepool": ["dragondance", "earthquake", "outrage", "roost"],
"abilities": ["Natural Cure"]
},
{
"role": "Bulky Support",
"movepool": ["dracometeor", "earthquake", "fireblast", "healbell", "roost", "toxic"],
"abilities": ["Natural Cure"]
}
]
},
@ -2516,11 +2527,6 @@
"role": "Setup Sweeper",
"movepool": ["dragondance", "earthquake", "return", "roost"],
"abilities": ["Natural Cure"]
},
{
"role": "Bulky Support",
"movepool": ["earthquake", "fireblast", "healbell", "return", "roost"],
"abilities": ["Natural Cure"]
}
]
},
@ -3806,7 +3812,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"],
"movepool": ["doubleedge", "knockoff", "leafblade", "substitute", "swordsdance", "synthesis"],
"abilities": ["Chlorophyll"],
"preferredTypes": ["Dark"]
}
@ -4079,9 +4085,13 @@
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["drainpunch", "knockoff", "return", "substitute", "thunderwave"],
"abilities": ["Slow Start"],
"preferredTypes": ["Dark"]
"movepool": ["drainpunch", "knockoff", "return", "thunderwave"],
"abilities": ["Slow Start"]
},
{
"role": "Bulky Support",
"movepool": ["knockoff", "return", "substitute", "thunderwave"],
"abilities": ["Slow Start"]
}
]
},
@ -4718,7 +4728,7 @@
]
},
"scolipede": {
"level": 80,
"level": 79,
"sets": [
{
"role": "Fast Support",
@ -4773,7 +4783,7 @@
]
},
"krookodile": {
"level": 79,
"level": 78,
"sets": [
{
"role": "Fast Attacker",
@ -4822,9 +4832,9 @@
"level": 83,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["dragondance", "highjumpkick", "ironhead", "knockoff"],
"abilities": ["Intimidate", "Moxie"]
"role": "Bulky Attacker",
"movepool": ["dragondance", "drainpunch", "ironhead", "knockoff"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Setup",
@ -4937,7 +4947,7 @@
"sets": [
{
"role": "Bulky Setup",
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover", "signalbeam"],
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover"],
"abilities": ["Magic Guard"]
}
]
@ -5045,7 +5055,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["bugbuzz", "gigadrain", "stickyweb", "thunder", "voltswitch"],
"movepool": ["bugbuzz", "energyball", "stickyweb", "thunder", "voltswitch"],
"abilities": ["Compound Eyes"],
"preferredTypes": ["Bug"]
}
@ -5186,7 +5196,7 @@
]
},
"druddigon": {
"level": 85,
"level": 86,
"sets": [
{
"role": "Wallbreaker",
@ -5293,7 +5303,7 @@
},
{
"role": "Bulky Attacker",
"movepool": ["darkpulse", "dracometeor", "fireblast", "roost", "uturn"],
"movepool": ["darkpulse", "dracometeor", "fireblast", "roost", "toxic", "uturn"],
"abilities": ["Levitate"]
},
{
@ -5685,7 +5695,7 @@
]
},
"pangoro": {
"level": 85,
"level": 84,
"sets": [
{
"role": "Wallbreaker",
@ -6001,7 +6011,7 @@
]
},
"gourgeistsuper": {
"level": 88,
"level": 87,
"sets": [
{
"role": "Bulky Support",

View File

@ -227,7 +227,7 @@ export class RandomGen6Teams extends RandomGen7Teams {
['hornleech', 'woodhammer'],
[['gigadrain', 'leafstorm'], ['leafstorm', 'petaldance', 'powerwhip']],
['wildcharge', 'thunderbolt'],
['gunkshot', 'poisonjab'],
[['gunkshot', 'sludgewave'], 'poisonjab'],
[['drainpunch', 'focusblast'], ['closecombat', 'highjumpkick', 'superpower']],
['stoneedge', 'headsmash'],
['dracometeor', 'dragonpulse'],
@ -769,6 +769,8 @@ export class RandomGen6Teams extends RandomGen7Teams {
teamDetails: RandomTeamsTypes.TeamDetails = {},
isLead = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
@ -816,7 +818,8 @@ export class RandomGen6Teams extends RandomGen7Teams {
// Minimize confusion damage, including if Foul Play is its only physical attack
if (
(!counter.get('Physical') || (counter.get('Physical') <= 1 && (moves.has('foulplay') || moves.has('rapidspin')))) &&
!moves.has('copycat') && !moves.has('transform')
!moves.has('copycat') && !moves.has('transform') &&
!ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = 0;
@ -1130,7 +1133,6 @@ export class RandomGen6Teams extends RandomGen7Teams {
if (teamData.weaknesses[type] >= 3) return this.randomFactoryTeam(side, ++depth);
}
}
return pokemon;
}
}

View File

@ -283,7 +283,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["earthpower", "fireblast", "icebeam", "sludgewave", "stealthrock", "toxicspikes"],
"movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "stealthrock", "toxicspikes"],
"abilities": ["Sheer Force"],
"preferredTypes": ["Ice"]
}
@ -294,7 +294,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["earthpower", "fireblast", "icebeam", "sludgewave", "substitute", "superpower"],
"movepool": ["earthpower", "fireblast", "icebeam", "poisonjab", "sludgewave", "substitute", "throatchop"],
"abilities": ["Sheer Force"],
"preferredTypes": ["Ice"]
}
@ -453,10 +453,16 @@
"level": 93,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam", "scald"],
"role": "Bulky Setup",
"movepool": ["calmmind", "encore", "focusblast", "icebeam", "scald", "substitute"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
},
{
"role": "Fast Attacker",
"movepool": ["calmmind", "encore", "focusblast", "hydropump", "icebeam"],
"abilities": ["Cloud Nine", "Swift Swim"],
"preferredTypes": ["Ice"]
}
]
},
@ -882,7 +888,7 @@
]
},
"rhydon": {
"level": 86,
"level": 85,
"sets": [
{
"role": "Bulky Attacker",
@ -933,7 +939,7 @@
]
},
"seaking": {
"level": 94,
"level": 95,
"sets": [
{
"role": "Fast Attacker",
@ -1269,7 +1275,7 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"],
"abilities": ["Unnerve"]
}
]
@ -1289,7 +1295,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "shadowball"],
"movepool": ["aurasphere", "calmmind", "fireblast", "psystrike", "recover", "signalbeam"],
"abilities": ["Unnerve"]
}
]
@ -1437,7 +1443,7 @@
]
},
"ampharosmega": {
"level": 84,
"level": 85,
"sets": [
{
"role": "Bulky Attacker",
@ -1549,7 +1555,7 @@
]
},
"espeon": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Fast Attacker",
@ -1686,7 +1692,7 @@
]
},
"steelixmega": {
"level": 81,
"level": 80,
"sets": [
{
"role": "Bulky Support",
@ -1863,7 +1869,7 @@
]
},
"skarmory": {
"level": 76,
"level": 75,
"sets": [
{
"role": "Bulky Support",
@ -1888,7 +1894,7 @@
]
},
"houndoommega": {
"level": 81,
"level": 80,
"sets": [
{
"role": "Setup Sweeper",
@ -2454,7 +2460,7 @@
]
},
"sableyemega": {
"level": 87,
"level": 86,
"sets": [
{
"role": "Bulky Setup",
@ -2562,7 +2568,7 @@
]
},
"minun": {
"level": 94,
"level": 95,
"sets": [
{
"role": "Bulky Setup",
@ -2731,7 +2737,7 @@
]
},
"cacturne": {
"level": 92,
"level": 93,
"sets": [
{
"role": "Wallbreaker",
@ -2748,6 +2754,11 @@
"altaria": {
"level": 92,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["dragondance", "earthquake", "outrage", "roost"],
"abilities": ["Natural Cure"]
},
{
"role": "Bulky Support",
"movepool": ["defog", "dracometeor", "earthquake", "fireblast", "healbell", "roost", "toxic"],
@ -3042,7 +3053,7 @@
]
},
"gorebyss": {
"level": 84,
"level": 85,
"sets": [
{
"role": "Setup Sweeper",
@ -3368,7 +3379,7 @@
]
},
"deoxysattack": {
"level": 73,
"level": 72,
"sets": [
{
"role": "Wallbreaker",
@ -3749,7 +3760,7 @@
]
},
"honchkrow": {
"level": 84,
"level": 83,
"sets": [
{
"role": "Wallbreaker",
@ -4115,7 +4126,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["doubleedge", "knockoff", "leafblade", "swordsdance", "synthesis", "xscissor"],
"movepool": ["doubleedge", "knockoff", "leafblade", "substitute", "swordsdance", "synthesis"],
"abilities": ["Chlorophyll"],
"preferredTypes": ["Dark"]
}
@ -4406,9 +4417,13 @@
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["drainpunch", "knockoff", "return", "substitute", "thunderwave"],
"abilities": ["Slow Start"],
"preferredTypes": ["Dark"]
"movepool": ["drainpunch", "knockoff", "return", "thunderwave"],
"abilities": ["Slow Start"]
},
{
"role": "Bulky Support",
"movepool": ["knockoff", "return", "substitute", "thunderwave"],
"abilities": ["Slow Start"]
}
]
},
@ -4970,7 +4985,7 @@
]
},
"swoobat": {
"level": 87,
"level": 88,
"sets": [
{
"role": "Bulky Attacker",
@ -5200,9 +5215,9 @@
"level": 84,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["dragondance", "highjumpkick", "ironhead", "knockoff"],
"abilities": ["Intimidate", "Moxie"]
"role": "Bulky Attacker",
"movepool": ["dragondance", "drainpunch", "ironhead", "knockoff"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Setup",
@ -5315,7 +5330,7 @@
"sets": [
{
"role": "Bulky Setup",
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover", "signalbeam"],
"movepool": ["calmmind", "focusblast", "psychic", "psyshock", "recover"],
"abilities": ["Magic Guard"]
}
]
@ -5429,7 +5444,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["bugbuzz", "gigadrain", "stickyweb", "thunder", "voltswitch"],
"movepool": ["bugbuzz", "energyball", "stickyweb", "thunder", "voltswitch"],
"abilities": ["Compound Eyes"],
"preferredTypes": ["Bug"]
}
@ -5551,7 +5566,7 @@
]
},
"stunfisk": {
"level": 89,
"level": 88,
"sets": [
{
"role": "Bulky Attacker",
@ -5694,7 +5709,7 @@
},
{
"role": "Bulky Attacker",
"movepool": ["darkpulse", "defog", "dracometeor", "fireblast", "roost", "uturn"],
"movepool": ["darkpulse", "defog", "dracometeor", "fireblast", "roost", "toxic", "uturn"],
"abilities": ["Levitate"]
},
{
@ -5802,7 +5817,7 @@
]
},
"thundurus": {
"level": 82,
"level": 81,
"sets": [
{
"role": "Setup Sweeper",
@ -5933,7 +5948,7 @@
]
},
"kyuremwhite": {
"level": 76,
"level": 75,
"sets": [
{
"role": "Fast Attacker",
@ -6051,7 +6066,7 @@
]
},
"diggersby": {
"level": 83,
"level": 82,
"sets": [
{
"role": "Setup Sweeper",
@ -6436,7 +6451,7 @@
]
},
"gourgeistsmall": {
"level": 90,
"level": 91,
"sets": [
{
"role": "Bulky Support",
@ -6446,7 +6461,7 @@
]
},
"gourgeistlarge": {
"level": 90,
"level": 91,
"sets": [
{
"role": "Bulky Support",
@ -6944,7 +6959,7 @@
]
},
"comfey": {
"level": 88,
"level": 87,
"sets": [
{
"role": "Bulky Support",
@ -7459,7 +7474,7 @@
]
},
"nihilego": {
"level": 80,
"level": 79,
"sets": [
{
"role": "Fast Support",
@ -7548,7 +7563,7 @@
]
},
"guzzlord": {
"level": 87,
"level": 86,
"sets": [
{
"role": "AV Pivot",
@ -7615,9 +7630,10 @@
"level": 77,
"sets": [
{
"role": "Bulky Attacker",
"role": "Z-Move user",
"movepool": ["calmmind", "flashcannon", "fleurcannon", "shiftgear"],
"abilities": ["Soul-Heart"]
"abilities": ["Soul-Heart"],
"preferredTypes": ["Fairy"]
},
{
"role": "Bulky Support",
@ -7625,10 +7641,9 @@
"abilities": ["Soul-Heart"]
},
{
"role": "Z-Move user",
"role": "Bulky Setup",
"movepool": ["aurasphere", "fleurcannon", "ironhead", "shiftgear"],
"abilities": ["Soul-Heart"],
"preferredTypes": ["Fairy", "Steel"]
"abilities": ["Soul-Heart"]
}
]
},

View File

@ -345,7 +345,7 @@ export class RandomGen7Teams extends RandomGen8Teams {
['hornleech', 'woodhammer'],
[['gigadrain', 'leafstorm'], ['energyball', 'leafstorm', 'petaldance', 'powerwhip']],
['wildcharge', 'thunderbolt'],
['gunkshot', 'poisonjab'],
[['gunkshot', 'sludgewave'], 'poisonjab'],
[['drainpunch', 'focusblast'], ['closecombat', 'highjumpkick', 'superpower']],
['dracometeor', 'dragonpulse'],
['dragonclaw', 'outrage'],
@ -933,7 +933,7 @@ export class RandomGen7Teams extends RandomGen8Teams {
if (ability === 'Sturdy' && moves.has('explosion') && !counter.get('speedsetup')) return 'Custap Berry';
if (types.includes('Normal') && moves.has('fakeout') && !!counter.get('Normal')) return 'Silk Scarf';
if (species.id === 'latias' || species.id === 'latios') return 'Soul Dew';
if (role === 'Bulky Setup' && !!counter.get('speedsetup') && !moves.has('swordsdance')) {
if (role === 'Bulky Setup' && (!!counter.get('speedsetup') || moves.has('shiftgear')) && !moves.has('swordsdance')) {
return 'Weakness Policy';
}
if (species.id === 'palkia') return 'Lustrous Orb';
@ -1025,6 +1025,8 @@ export class RandomGen7Teams extends RandomGen8Teams {
teamDetails: RandomTeamsTypes.TeamDetails = {},
isLead = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const sets = this.randomSets[species.id]["sets"];
@ -1083,7 +1085,8 @@ export class RandomGen7Teams extends RandomGen8Teams {
// Minimize confusion damage, including if Foul Play is its only physical attack
if (
(!counter.get('Physical') || (counter.get('Physical') <= 1 && (moves.has('foulplay') || moves.has('rapidspin')))) &&
!moves.has('copycat') && !moves.has('transform')
!moves.has('copycat') && !moves.has('transform') &&
!ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = 0;
@ -1385,7 +1388,6 @@ export class RandomGen7Teams extends RandomGen8Teams {
if (pokemon.length < this.maxTeamSize && pokemon.length < 12) {
throw new Error(`Could not build a random team for ${this.format} (seed=${seed})`);
}
return pokemon;
}
@ -1605,7 +1607,8 @@ export class RandomGen7Teams extends RandomGen8Teams {
if (isMonotype) {
// Prevents Mega Evolutions from breaking the type limits
if (itemData.megaStone) {
const megaSpecies = this.dex.species.get(itemData.megaStone);
const megaSpecies = this.dex.species.get(Array.isArray(itemData.megaStone) ?
itemData.megaStone[0] : itemData.megaStone);
if (types.length > megaSpecies.types.length) types = [species.types[0]];
// Only check the second type because a Mega Evolution should always share the first type with its base forme.
if (megaSpecies.types[1] && types[1] && megaSpecies.types[1] !== types[1]) {

View File

@ -118,7 +118,7 @@
"doublesMoves": ["dazzlinggleam", "healpulse", "helpinghand", "hypervoice", "thunderwave"]
},
"vileplume": {
"level": 84,
"level": 83,
"moves": ["aromatherapy", "gigadrain", "sleeppowder", "sludgebomb", "strengthsap"],
"doublesLevel": 88,
"doublesMoves": ["aromatherapy", "energyball", "pollenpuff", "sleeppowder", "sludgebomb", "strengthsap"]
@ -178,7 +178,7 @@
"doublesMoves": ["bulletpunch", "closecombat", "facade", "knockoff", "protect"]
},
"tentacruel": {
"level": 82,
"level": 81,
"moves": ["haze", "knockoff", "rapidspin", "scald", "sludgebomb", "toxicspikes"],
"doublesLevel": 87,
"doublesMoves": ["acidspray", "icywind", "knockoff", "muddywater", "rapidspin", "sludgebomb"]
@ -190,7 +190,7 @@
"doublesMoves": ["flareblitz", "highhorsepower", "morningsun", "protect", "swordsdance", "wildcharge"]
},
"rapidashgalar": {
"level": 83,
"level": 84,
"moves": ["highhorsepower", "morningsun", "playrough", "swordsdance", "zenheadbutt"],
"doublesLevel": 88,
"doublesMoves": ["highhorsepower", "playrough", "protect", "swordsdance", "zenheadbutt"]
@ -323,7 +323,7 @@
"moves": ["focusblast", "freezedry", "nastyplot", "psychic", "rapidspin"]
},
"scyther": {
"level": 82,
"level": 81,
"moves": ["brickbreak", "dualwingbeat", "knockoff", "roost", "swordsdance", "uturn"],
"doublesLevel": 84,
"doublesMoves": ["brickbreak", "bugbite", "dualwingbeat", "uturn"]
@ -424,7 +424,7 @@
"noDynamaxMoves": ["calmmind", "freezingglare", "hurricane", "recover"]
},
"zapdos": {
"level": 78,
"level": 79,
"moves": ["defog", "discharge", "heatwave", "hurricane", "roost", "uturn"],
"doublesLevel": 79,
"doublesMoves": ["heatwave", "hurricane", "roost", "tailwind", "thunderbolt", "voltswitch"]
@ -457,7 +457,7 @@
"noDynamaxMoves": ["dragondance", "dualwingbeat", "earthquake", "outrage", "roost"]
},
"mewtwo": {
"level": 70,
"level": 71,
"moves": ["fireblast", "nastyplot", "psystrike", "recover", "shadowball"],
"doublesLevel": 74,
"doublesMoves": ["aurasphere", "icebeam", "nastyplot", "psystrike", "recover"]
@ -495,7 +495,7 @@
"doublesMoves": ["airslash", "heatwave", "lightscreen", "psychic", "reflect", "roost", "tailwind"]
},
"bellossom": {
"level": 82,
"level": 83,
"moves": ["gigadrain", "moonblast", "quiverdance", "sleeppowder", "strengthsap"],
"doublesLevel": 86,
"doublesMoves": ["energyball", "moonblast", "quiverdance", "sleeppowder", "strengthsap"]
@ -507,7 +507,7 @@
"doublesMoves": ["aquajet", "knockoff", "liquidation", "playrough", "protect"]
},
"sudowoodo": {
"level": 89,
"level": 90,
"moves": ["earthquake", "headsmash", "stealthrock", "suckerpunch", "woodhammer"],
"doublesLevel": 90,
"doublesMoves": ["bodypress", "firepunch", "headsmash", "protect", "suckerpunch", "woodhammer"]
@ -569,7 +569,7 @@
"noDynamaxMoves": ["curse", "earthquake", "headsmash", "heavyslam", "stealthrock", "toxic"]
},
"qwilfish": {
"level": 87,
"level": 86,
"moves": ["destinybond", "spikes", "taunt", "thunderwave", "toxicspikes", "waterfall"],
"doublesLevel": 88,
"doublesMoves": ["liquidation", "poisonjab", "protect", "taunt", "thunderwave", "toxicspikes"]
@ -641,7 +641,7 @@
"doublesMoves": ["icebeam", "recover", "thunderbolt", "toxic", "triattack", "trickroom"]
},
"hitmontop": {
"level": 86,
"level": 87,
"moves": ["closecombat", "earthquake", "rapidspin", "suckerpunch", "toxic", "tripleaxel"],
"doublesLevel": 88,
"doublesMoves": ["closecombat", "coaching", "fakeout", "helpinghand", "rapidspin", "suckerpunch", "tripleaxel"]
@ -708,7 +708,7 @@
"doublesMoves": ["breakingswipe", "energyball", "focusblast", "leafstorm"]
},
"blaziken": {
"level": 74,
"level": 75,
"moves": ["closecombat", "flareblitz", "knockoff", "stoneedge", "swordsdance"],
"doublesLevel": 78,
"doublesMoves": ["closecombat", "flareblitz", "knockoff", "protect", "swordsdance"]
@ -800,7 +800,7 @@
"doublesMoves": ["closecombat", "crunch", "flipturn", "icebeam", "protect", "waterfall"]
},
"wailord": {
"level": 91,
"level": 92,
"moves": ["hydropump", "hypervoice", "icebeam", "waterspout"],
"doublesLevel": 88,
"doublesMoves": ["hydropump", "heavyslam", "icebeam", "waterspout"]
@ -1065,7 +1065,7 @@
"doublesMoves": ["auroraveil", "blizzard", "iceshard", "protect", "woodhammer"]
},
"weavile": {
"level": 79,
"level": 78,
"moves": ["iceshard", "knockoff", "lowkick", "swordsdance", "tripleaxel"],
"doublesLevel": 84,
"doublesMoves": ["fakeout", "iceshard", "knockoff", "lowkick", "tripleaxel"]
@ -1119,7 +1119,7 @@
"doublesMoves": ["doubleedge", "knockoff", "leafblade", "protect", "swordsdance"]
},
"glaceon": {
"level": 91,
"level": 90,
"moves": ["freezedry", "protect", "toxic", "wish"],
"doublesLevel": 88,
"doublesMoves": ["blizzard", "freezedry", "helpinghand", "protect", "shadowball", "wish"]
@ -1186,7 +1186,7 @@
"doublesMoves": ["airslash", "nastyplot", "protect", "thunderbolt"]
},
"rotommow": {
"level": 84,
"level": 85,
"moves": ["leafstorm", "nastyplot", "thunderbolt", "trick", "voltswitch", "willowisp"],
"doublesLevel": 88,
"doublesMoves": ["electroweb", "leafstorm", "protect", "thunderbolt", "voltswitch", "willowisp"]
@ -1259,7 +1259,7 @@
"doublesMoves": ["boltstrike", "glaciate", "protect", "uturn", "vcreate", "zenheadbutt"]
},
"stoutland": {
"level": 87,
"level": 88,
"moves": ["crunch", "facade", "playrough", "superpower", "wildcharge"],
"doublesLevel": 90,
"doublesMoves": ["facade", "helpinghand", "superpower", "thunderwave"]
@ -1366,7 +1366,7 @@
"doublesMoves": ["closecombat", "highhorsepower", "knockoff", "protect", "rockslide", "taunt"]
},
"darmanitan": {
"level": 79,
"level": 78,
"moves": ["earthquake", "flareblitz", "rockslide", "superpower", "uturn"],
"doublesLevel": 82,
"doublesMoves": ["earthquake", "flareblitz", "protect", "rockslide", "superpower", "uturn"]
@ -1502,7 +1502,7 @@
"doublesMoves": ["geargrind", "protect", "shiftgear", "wildcharge"]
},
"beheeyem": {
"level": 89,
"level": 90,
"moves": ["darkpulse", "psychic", "thunderbolt", "trick", "trickroom"],
"doublesLevel": 88,
"doublesMoves": ["protect", "psychic", "shadowball", "thunderbolt", "trickroom"]
@ -1532,7 +1532,7 @@
"doublesMoves": ["freezedry", "haze", "icebeam", "icywind", "rapidspin", "recover", "toxic"]
},
"accelgor": {
"level": 91,
"level": 90,
"moves": ["bugbuzz", "energyball", "focusblast", "sludgebomb", "spikes", "toxicspikes", "yawn"],
"doublesLevel": 88,
"doublesMoves": ["acidspray", "bugbuzz", "encore", "energyball", "focusblast"],
@ -1599,7 +1599,7 @@
"doublesMoves": ["firelash", "gigadrain", "incinerate", "protect", "suckerpunch", "superpower"]
},
"durant": {
"level": 78,
"level": 77,
"moves": ["firstimpression", "honeclaws", "ironhead", "rockslide", "superpower"],
"doublesLevel": 82,
"doublesMoves": ["firstimpression", "ironhead", "protect", "stompingtantrum", "superpower", "xscissor"]
@ -1636,7 +1636,7 @@
"noDynamaxMoves": ["closecombat", "leafblade", "stoneedge", "swordsdance"]
},
"tornadus": {
"level": 81,
"level": 80,
"moves": ["defog", "grassknot", "heatwave", "hurricane", "nastyplot"],
"doublesLevel": 80,
"doublesMoves": ["heatwave", "hurricane", "nastyplot", "superpower", "tailwind", "taunt"]
@ -1725,7 +1725,7 @@
"doublesMoves": ["bodyslam", "highhorsepower", "knockoff", "quickattack", "swordsdance", "uturn"]
},
"talonflame": {
"level": 81,
"level": 80,
"moves": ["bravebird", "defog", "flareblitz", "roost", "swordsdance", "uturn"],
"doublesLevel": 86,
"doublesMoves": ["bravebird", "defog", "incinerate", "overheat", "tailwind", "uturn", "willowisp"]
@ -1771,7 +1771,7 @@
"doublesMoves": ["healpulse", "moonblast", "protect", "trickroom", "wish"]
},
"slurpuff": {
"level": 79,
"level": 80,
"moves": ["bellydrum", "drainpunch", "facade", "playrough"],
"doublesLevel": 86,
"doublesMoves": ["faketears", "flamethrower", "helpinghand", "playrough", "stickyweb"]
@ -1903,7 +1903,7 @@
"doublesMoves": ["dazzlinggleam", "focusblast", "geomancy", "moonblast", "thunderbolt"]
},
"yveltal": {
"level": 68,
"level": 67,
"moves": ["defog", "heatwave", "knockoff", "oblivionwing", "roost", "suckerpunch", "taunt"],
"doublesLevel": 71,
"doublesMoves": ["darkpulse", "heatwave", "knockoff", "oblivionwing", "roost", "suckerpunch", "tailwind"]
@ -2214,13 +2214,13 @@
"doublesMoves": ["anchorshot", "knockoff", "powerwhip", "protect"]
},
"kommoo": {
"level": 81,
"level": 80,
"moves": ["clangingscales", "clangoroussoul", "closecombat", "poisonjab", "stealthrock"],
"doublesLevel": 80,
"doublesMoves": ["bodypress", "dracometeor", "irondefense", "protect"]
},
"tapukoko": {
"level": 76,
"level": 77,
"moves": ["calmmind", "dazzlinggleam", "grassknot", "substitute", "thunderbolt", "voltswitch"],
"doublesLevel": 80,
"doublesMoves": ["bravebird", "dazzlinggleam", "grassknot", "taunt", "thunderbolt", "uturn"]
@ -2269,13 +2269,13 @@
"noDynamaxMoves": ["bulkup", "closecombat", "darkestlariat", "leechlife", "poisonjab", "roost", "stoneedge"]
},
"pheromosa": {
"level": 74,
"level": 73,
"moves": ["closecombat", "icebeam", "poisonjab", "throatchop", "uturn"],
"doublesLevel": 78,
"doublesMoves": ["closecombat", "icebeam", "poisonjab", "protect", "throatchop", "uturn"]
},
"xurkitree": {
"level": 76,
"level": 77,
"moves": ["dazzlinggleam", "energyball", "hypnosis", "thunderbolt", "voltswitch"],
"doublesLevel": 79,
"doublesMoves": ["dazzlinggleam", "energyball", "thunderbolt", "voltswitch"]
@ -2288,7 +2288,7 @@
"noDynamaxMoves": ["airslash", "earthquake", "fireblast", "heavyslam", "leechseed", "protect"]
},
"kartana": {
"level": 72,
"level": 73,
"moves": ["knockoff", "leafblade", "sacredsword", "smartstrike", "swordsdance"],
"doublesLevel": 78,
"doublesMoves": ["knockoff", "leafblade", "sacredsword", "smartstrike", "swordsdance"]
@ -2456,17 +2456,17 @@
"doublesMoves": ["acrobatics", "dragondance", "dragonrush", "gravapple", "protect"]
},
"appletun": {
"level": 91,
"level": 92,
"moves": ["appleacid", "dragonpulse", "leechseed", "recover"],
"doublesLevel": 90,
"doublesMoves": ["appleacid", "dragonpulse", "leechseed", "protect", "recover"]
},
"appletungmax": {
"level": 91,
"level": 92,
"moves": ["appleacid", "dracometeor", "leechseed", "recover"]
},
"sandaconda": {
"level": 83,
"level": 84,
"moves": ["coil", "earthquake", "glare", "rest", "stealthrock", "stoneedge"]
},
"sandacondagmax": {
@ -2565,7 +2565,7 @@
"noDynamaxMoves": ["bravebird", "closecombat", "firstimpression", "knockoff", "poisonjab", "swordsdance"]
},
"mrrime": {
"level": 87,
"level": 88,
"moves": ["focusblast", "freezedry", "psychic", "rapidspin", "slackoff", "trick"],
"doublesLevel": 88,
"doublesMoves": ["fakeout", "focusblast", "freezedry", "icywind", "protect", "psychic", "rapidspin"]
@ -2613,7 +2613,7 @@
"doublesMoves": ["bellydrum", "iciclecrash", "liquidation", "protect"]
},
"indeedee": {
"level": 85,
"level": 84,
"moves": ["calmmind", "expandingforce", "hypervoice", "mysticalfire", "trick"],
"doublesLevel": 80,
"doublesMoves": ["encore", "expandingforce", "hypervoice", "mysticalfire", "protect", "trick"]
@ -2625,7 +2625,7 @@
"doublesMoves": ["expandingforce", "followme", "healpulse", "helpinghand", "protect"]
},
"morpeko": {
"level": 86,
"level": 85,
"moves": ["aurawheel", "foulplay", "partingshot", "protect", "psychicfangs", "rapidspin"],
"doublesLevel": 88,
"doublesMoves": ["aurawheel", "fakeout", "partingshot", "protect", "rapidspin", "superfang"]
@ -2690,7 +2690,7 @@
"doublesMoves": ["behemothblade", "closecombat", "playrough", "protect", "psychicfangs", "swordsdance"]
},
"zamazenta": {
"level": 70,
"level": 69,
"moves": ["closecombat", "crunch", "psychicfangs", "wildcharge"],
"doublesLevel": 74,
"doublesMoves": ["closecombat", "crunch", "playrough", "protect", "psychicfangs"]

View File

@ -1526,7 +1526,7 @@ export class RandomGen8Teams {
case 'Cloud Nine':
return (!isNoDynamax || species.id !== 'golduck');
case 'Competitive':
return (counter.get('Special') < 2 || (moves.has('rest') && moves.has('sleeptalk')));
return (!counter.get('Special') || moves.has('rest') && moves.has('sleeptalk'));
case 'Compound Eyes': case 'No Guard':
return !counter.get('inaccurate');
case 'Cursed Body':
@ -2156,10 +2156,11 @@ export class RandomGen8Teams {
if (species.name.endsWith('-Gmax')) return species.name.slice(0, -5);
// Consolidate mostly-cosmetic formes, at least for the purposes of Random Battles
if (['Magearna', 'Polteageist', 'Zarude'].includes(species.baseSpecies)) {
if (['Polteageist', 'Zarude'].includes(species.baseSpecies)) {
return this.sample([species.name].concat(species.otherFormes!));
}
if (species.baseSpecies === 'Basculin') return 'Basculin' + this.sample(['', '-Blue-Striped']);
if (species.baseSpecies === 'Magearna') return 'Magearna' + this.sample(['', '-Original']);
if (species.baseSpecies === 'Keldeo' && this.gen <= 7) return 'Keldeo' + this.sample(['', '-Resolute']);
if (species.baseSpecies === 'Pikachu' && this.dex.currentMod === 'gen8') {
return 'Pikachu' + this.sample(
@ -2176,6 +2177,8 @@ export class RandomGen8Teams {
isDoubles = false,
isNoDynamax = false
): RandomTeamsTypes.RandomSet {
const ruleTable = this.dex.formats.getRuleTable(this.format);
species = this.dex.species.get(species);
const forme = this.getForme(species);
const gmax = species.name.endsWith('-Gmax');
@ -2413,7 +2416,10 @@ export class RandomGen8Teams {
if (move.damageCallback || move.damage) return true;
return move.category !== 'Physical' || move.id === 'bodypress';
});
if (noAttackStatMoves && !moves.has('transform') && (!moves.has('shellsidearm') || !counter.get('Status'))) {
if (
noAttackStatMoves && !moves.has('transform') && (!moves.has('shellsidearm') || !counter.get('Status')) &&
!ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = 0;
}

File diff suppressed because it is too large Load Diff

View File

@ -408,7 +408,7 @@
]
},
"slowbrogalar": {
"level": 86,
"level": 87,
"sets": [
{
"role": "Doubles Wallbreaker",
@ -586,7 +586,7 @@
]
},
"weezing": {
"level": 90,
"level": 91,
"sets": [
{
"role": "Doubles Support",
@ -1041,7 +1041,7 @@
"role": "Offensive Protect",
"movepool": ["Hurricane", "Hyper Voice", "Protect", "Tailwind"],
"abilities": ["Tinted Lens"],
"teraTypes": ["Flying"]
"teraTypes": ["Normal", "Steel"]
}
]
},
@ -1096,7 +1096,7 @@
]
},
"azumarill": {
"level": 82,
"level": 83,
"sets": [
{
"role": "Doubles Wallbreaker",
@ -1414,7 +1414,7 @@
]
},
"donphan": {
"level": 86,
"level": 87,
"sets": [
{
"role": "Doubles Support",
@ -1480,7 +1480,7 @@
"sets": [
{
"role": "Doubles Support",
"movepool": ["Heal Pulse", "Helping Hand", "Hyper Voice", "Protect", "Seismic Toss", "Soft-Boiled", "Thunder Wave"],
"movepool": ["Helping Hand", "Hyper Voice", "Life Dew", "Soft-Boiled", "Thunder Wave"],
"abilities": ["Healer"],
"teraTypes": ["Fairy", "Ghost", "Poison"]
}
@ -1538,13 +1538,13 @@
"role": "Doubles Bulky Setup",
"movepool": ["Dragon Dance", "High Horsepower", "Knock Off", "Protect", "Rock Slide", "Stone Edge"],
"abilities": ["Sand Stream"],
"teraTypes": ["Ghost", "Rock", "Steel"]
"teraTypes": ["Ghost", "Rock"]
},
{
"role": "Doubles Bulky Attacker",
"movepool": ["Fire Blast", "High Horsepower", "Icy Wind", "Knock Off", "Rock Slide", "Stone Edge"],
"abilities": ["Sand Stream"],
"teraTypes": ["Flying", "Ghost", "Steel"]
"teraTypes": ["Flying", "Ghost"]
}
]
},
@ -1682,7 +1682,7 @@
},
{
"role": "Doubles Wallbreaker",
"movepool": ["Dazzling Gleam", "Moonblast", "Mystical Fire", "Psychic", "Trick"],
"movepool": ["Dazzling Gleam", "Moonblast", "Mystical Fire", "Psychic"],
"abilities": ["Trace"],
"teraTypes": ["Fairy", "Fire", "Steel"]
}
@ -1847,7 +1847,7 @@
"role": "Doubles Support",
"movepool": ["Encore", "Struggle Bug", "Tailwind", "Thunder Wave"],
"abilities": ["Prankster"],
"teraTypes": ["Steel", "Water"]
"teraTypes": ["Steel", "Water"]
}
]
},
@ -2023,14 +2023,14 @@
"sets": [
{
"role": "Doubles Support",
"movepool": ["Energy Ball", "Helping Hand", "Hurricane", "Protect", "Tailwind", "Wide Guard"],
"movepool": ["Energy Ball", "Hurricane", "Protect", "Tailwind", "Wide Guard"],
"abilities": ["Harvest"],
"teraTypes": ["Steel"]
}
]
},
"chimecho": {
"level": 95,
"level": 94,
"sets": [
{
"role": "Doubles Support",
@ -2091,7 +2091,7 @@
]
},
"regirock": {
"level": 83,
"level": 82,
"sets": [
{
"role": "Doubles Bulky Setup",
@ -2575,7 +2575,7 @@
"sets": [
{
"role": "Doubles Support",
"movepool": ["Encore", "Helping Hand", "Hydro Pump", "Icy Wind", "Tailwind", "Tickle"],
"movepool": ["Encore", "Helping Hand", "Hydro Pump", "Icy Wind", "Tailwind"],
"abilities": ["Storm Drain"],
"teraTypes": ["Fire", "Ground"]
}
@ -2901,7 +2901,7 @@
]
},
"uxie": {
"level": 86,
"level": 85,
"sets": [
{
"role": "Doubles Support",
@ -3086,7 +3086,7 @@
"role": "Bulky Protect",
"movepool": ["Ice Beam", "Protect", "Scald", "Tail Glow"],
"abilities": ["Hydration"],
"teraTypes": ["Grass", "Steel", "Water"]
"teraTypes": ["Grass", "Steel"]
},
{
"role": "Doubles Bulky Setup",
@ -3486,13 +3486,7 @@
"sets": [
{
"role": "Doubles Bulky Attacker",
"movepool": ["Encore", "Moonblast", "Tailwind", "Taunt"],
"abilities": ["Prankster"],
"teraTypes": ["Fire", "Ghost", "Steel"]
},
{
"role": "Doubles Support",
"movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind"],
"movepool": ["Encore", "Helping Hand", "Moonblast", "Tailwind", "Taunt"],
"abilities": ["Prankster"],
"teraTypes": ["Fire", "Ghost", "Steel"]
}
@ -4298,7 +4292,7 @@
"sets": [
{
"role": "Choice Item user",
"movepool": ["Aura Sphere", "Dark Pulse", "Dragon Pulse", "Muddy Water", "U-turn"],
"movepool": ["Aura Sphere", "Dark Pulse", "Dragon Pulse", "Muddy Water"],
"abilities": ["Mega Launcher"],
"teraTypes": ["Dark", "Dragon", "Fighting"]
},
@ -4372,7 +4366,7 @@
]
},
"goodrahisui": {
"level": 82,
"level": 81,
"sets": [
{
"role": "Doubles Bulky Attacker",
@ -4411,7 +4405,7 @@
]
},
"avalugg": {
"level": 91,
"level": 92,
"sets": [
{
"role": "Bulky Protect",
@ -4615,7 +4609,7 @@
"teraTypes": ["Ground"]
},
{
"role": "Doubles Setup Sweeper",
"role": "Doubles Bulky Setup",
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
"abilities": ["Dancer"],
"teraTypes": ["Ground"]
@ -4632,7 +4626,7 @@
"teraTypes": ["Ground"]
},
{
"role": "Doubles Setup Sweeper",
"role": "Doubles Bulky Setup",
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
"abilities": ["Dancer"],
"teraTypes": ["Ground"]
@ -4649,7 +4643,7 @@
"teraTypes": ["Fighting", "Ground"]
},
{
"role": "Doubles Setup Sweeper",
"role": "Doubles Bulky Setup",
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
"abilities": ["Dancer"],
"teraTypes": ["Fighting", "Ground"]
@ -4666,7 +4660,7 @@
"teraTypes": ["Fighting", "Ground"]
},
{
"role": "Doubles Setup Sweeper",
"role": "Doubles Bulky Setup",
"movepool": ["Air Slash", "Protect", "Quiver Dance", "Revelation Dance"],
"abilities": ["Dancer"],
"teraTypes": ["Fighting", "Ground"]
@ -5183,8 +5177,8 @@
"teraTypes": ["Dragon", "Steel"]
},
{
"role": "Doubles Support",
"movepool": ["Glare", "High Horsepower", "Rest", "Stealth Rock", "Stone Edge"],
"role": "Doubles Bulky Attacker",
"movepool": ["Glare", "High Horsepower", "Rest", "Stone Edge"],
"abilities": ["Shed Skin"],
"teraTypes": ["Dragon", "Steel"]
}
@ -5206,7 +5200,7 @@
"sets": [
{
"role": "Doubles Wallbreaker",
"movepool": ["Close Combat", "Poison Jab", "Protect", "Psychic Fangs", "Waterfall"],
"movepool": ["Close Combat", "Flip Turn", "Poison Jab", "Protect", "Waterfall"],
"abilities": ["Propeller Tail"],
"teraTypes": ["Fighting"]
}
@ -5316,6 +5310,12 @@
"movepool": ["Alluring Voice", "Dazzling Gleam", "Decorate", "Encore", "Protect"],
"abilities": ["Aroma Veil"],
"teraTypes": ["Steel"]
},
{
"role": "Doubles Bulky Attacker",
"movepool": ["Alluring Voice", "Dazzling Gleam", "Decorate", "Helping Hand", "Protect"],
"abilities": ["Aroma Veil"],
"teraTypes": ["Steel"]
}
]
},
@ -5335,9 +5335,9 @@
"sets": [
{
"role": "Doubles Support",
"movepool": ["Electroweb", "Recover", "Thunderbolt", "Toxic Spikes"],
"movepool": ["Electroweb", "Recover", "Scald", "Thunderbolt"],
"abilities": ["Electric Surge"],
"teraTypes": ["Grass"]
"teraTypes": ["Grass", "Water"]
}
]
},
@ -5410,7 +5410,7 @@
]
},
"indeedeef": {
"level": 90,
"level": 91,
"sets": [
{
"role": "Doubles Support",
@ -5515,7 +5515,7 @@
"sets": [
{
"role": "Doubles Wallbreaker",
"movepool": ["Close Combat", "Coaching", "Crunch", "Howl", "Iron Head", "Psychic Fangs", "Stone Edge"],
"movepool": ["Close Combat", "Coaching", "Crunch", "Howl", "Stone Edge"],
"abilities": ["Dauntless Shield"],
"teraTypes": ["Dark", "Fighting", "Steel"]
},
@ -5673,7 +5673,7 @@
]
},
"calyrexshadow": {
"level": 62,
"level": 63,
"sets": [
{
"role": "Offensive Protect",
@ -5712,7 +5712,7 @@
]
},
"ursaluna": {
"level": 78,
"level": 77,
"sets": [
{
"role": "Doubles Wallbreaker",
@ -6121,7 +6121,7 @@
"role": "Doubles Support",
"movepool": ["Energy Ball", "Fire Blast", "Protect", "Rage Powder", "Will-O-Wisp"],
"abilities": ["Chlorophyll"],
"teraTypes": ["Fire", "Grass", "Steel"]
"teraTypes": ["Fire", "Steel"]
}
]
},
@ -6360,7 +6360,13 @@
"sets": [
{
"role": "Doubles Wallbreaker",
"movepool": ["Hyper Voice", "Nasty Plot", "Protect", "Psychic", "Trick Room"],
"movepool": ["Hyper Voice", "Protect", "Psychic", "Trick Room"],
"abilities": ["Armor Tail"],
"teraTypes": ["Fairy"]
},
{
"role": "Doubles Bulky Attacker",
"movepool": ["Hyper Voice", "Nasty Plot", "Psychic", "Trick Room"],
"abilities": ["Armor Tail"],
"teraTypes": ["Fairy"]
}
@ -6422,9 +6428,15 @@
"sets": [
{
"role": "Doubles Bulky Attacker",
"movepool": ["Close Combat", "Crunch", "Protect", "Rage Powder", "Seed Bomb", "Spore", "Sucker Punch"],
"movepool": ["Close Combat", "Crunch", "Protect", "Seed Bomb", "Spore", "Sucker Punch"],
"abilities": ["Protosynthesis"],
"teraTypes": ["Dark", "Poison"]
},
{
"role": "Doubles Support",
"movepool": ["Rage Powder", "Seed Bomb", "Spore", "Sucker Punch"],
"abilities": ["Protosynthesis"],
"teraTypes": ["Ghost", "Poison"]
}
]
},
@ -6669,7 +6681,13 @@
"sets": [
{
"role": "Bulky Protect",
"movepool": ["Knock Off", "Leech Seed", "Pollen Puff", "Protect", "Ruination"],
"movepool": ["Knock Off", "Leech Seed", "Pollen Puff", "Protect"],
"abilities": ["Tablets of Ruin"],
"teraTypes": ["Poison"]
},
{
"role": "Bulky Protect",
"movepool": ["Knock Off", "Leech Seed", "Protect", "Ruination"],
"abilities": ["Tablets of Ruin"],
"teraTypes": ["Poison"]
}
@ -6727,7 +6745,7 @@
]
},
"walkingwake": {
"level": 77,
"level": 78,
"sets": [
{
"role": "Doubles Wallbreaker",

View File

@ -757,7 +757,7 @@
"item": ["Choice Specs"],
"ability": ["Infiltrator"],
"evs": {"spa": 252, "spd": 4, "spe": 252},
"nature": ["Timid", "Modest"],
"nature": ["Timid"],
"teraType": ["Dragon", "Ghost"],
"moves": [["Draco Meteor"], ["Shadow Ball"], ["Flamethrower"], ["U-turn"]]
}, {

View File

@ -60,13 +60,13 @@
"teraTypes": ["Dark", "Ground"]
},
{
"role": "Setup Sweeper",
"role": "Bulky Setup",
"movepool": ["Coil", "Earthquake", "Gunk Shot", "Trailblaze"],
"abilities": ["Intimidate"],
"teraTypes": ["Grass", "Ground"]
},
{
"role": "Fast Bulky Setup",
"role": "Bulky Attacker",
"movepool": ["Coil", "Earthquake", "Gunk Shot", "Sucker Punch"],
"abilities": ["Intimidate"],
"teraTypes": ["Dark", "Ground"]
@ -296,7 +296,7 @@
"level": 90,
"sets": [
{
"role": "Fast Bulky Setup",
"role": "Bulky Setup",
"movepool": ["Encore", "Grass Knot", "Hydro Pump", "Ice Beam", "Nasty Plot"],
"abilities": ["Cloud Nine", "Swift Swim"],
"teraTypes": ["Water"]
@ -694,7 +694,7 @@
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Close Combat", "Drain Punch", "Ice Punch", "Knock Off", "Mach Punch", "Rapid Spin", "Swords Dance"],
"movepool": ["Drain Punch", "Ice Punch", "Knock Off", "Mach Punch", "Rapid Spin", "Swords Dance"],
"abilities": ["Inner Focus", "Iron Fist"],
"teraTypes": ["Dark", "Fighting"]
},
@ -1417,6 +1417,12 @@
"movepool": ["Body Press", "Iron Head", "Rapid Spin", "Spikes", "Stealth Rock"],
"abilities": ["Sturdy"],
"teraTypes": ["Fighting", "Water"]
},
{
"role": "Bulky Support",
"movepool": ["Iron Head", "Rapid Spin", "Spikes", "Stealth Rock", "Thunder Wave"],
"abilities": ["Sturdy"],
"teraTypes": ["Water"]
}
]
},
@ -2259,7 +2265,7 @@
"teraTypes": ["Dark", "Fire", "Grass", "Ground", "Poison"]
},
{
"role": "Setup Sweeper",
"role": "Bulky Setup",
"movepool": ["Earthquake", "Gunk Shot", "Swords Dance", "Trailblaze"],
"abilities": ["Infiltrator"],
"teraTypes": ["Grass", "Ground"]
@ -3044,7 +3050,7 @@
{
"role": "Fast Attacker",
"movepool": ["Body Press", "Flash Cannon", "Thunderbolt", "Volt Switch"],
"abilities": ["Magnet Pull"],
"abilities": ["Analytic", "Magnet Pull"],
"teraTypes": ["Electric", "Fighting", "Flying", "Water"]
},
{
@ -3179,7 +3185,7 @@
"sets": [
{
"role": "Wallbreaker",
"movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock"],
"movepool": ["Earthquake", "Ice Shard", "Icicle Crash", "Knock Off", "Stealth Rock", "Trailblaze"],
"abilities": ["Thick Fat"],
"teraTypes": ["Ground", "Ice"]
}
@ -3220,7 +3226,7 @@
]
},
"probopass": {
"level": 92,
"level": 91,
"sets": [
{
"role": "Bulky Setup",
@ -3241,7 +3247,7 @@
},
{
"role": "Bulky Support",
"movepool": ["Earthquake", "Pain Split", "Poltergeist", "Shadow Sneak", "Will-O-Wisp"],
"movepool": ["Earthquake", "Pain Split", "Poltergeist", "Will-O-Wisp"],
"abilities": ["Frisk"],
"teraTypes": ["Dark", "Fairy"]
},
@ -3748,7 +3754,7 @@
]
},
"arceusgrass": {
"level": 72,
"level": 73,
"sets": [
{
"role": "Setup Sweeper",
@ -3788,7 +3794,7 @@
]
},
"arceusice": {
"level": 72,
"level": 73,
"sets": [
{
"role": "Bulky Setup",
@ -3904,7 +3910,7 @@
"teraTypes": ["Fire"]
},
{
"role": "Setup Sweeper",
"role": "Bulky Setup",
"movepool": ["Bulk Up", "Drain Punch", "Flare Blitz", "Trailblaze"],
"abilities": ["Reckless"],
"teraTypes": ["Fighting", "Grass"]
@ -4011,15 +4017,9 @@
"sets": [
{
"role": "Fast Support",
"movepool": ["Encore", "Giga Drain", "Moonblast", "Stun Spore", "U-turn"],
"movepool": ["Encore", "Giga Drain", "Leech Seed", "Moonblast", "Stun Spore", "Substitute", "U-turn"],
"abilities": ["Prankster"],
"teraTypes": ["Poison", "Steel"]
},
{
"role": "Bulky Support",
"movepool": ["Encore", "Leech Seed", "Moonblast", "Substitute"],
"abilities": ["Prankster"],
"teraTypes": ["Steel"]
}
]
},
@ -4095,9 +4095,15 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Bulk Up", "Earthquake", "Gunk Shot", "Knock Off", "Stealth Rock", "Stone Edge"],
"movepool": ["Earthquake", "Gunk Shot", "Knock Off", "Stealth Rock", "Stone Edge"],
"abilities": ["Intimidate"],
"teraTypes": ["Ground", "Poison"]
},
{
"role": "Bulky Setup",
"movepool": ["Bulk Up", "Earthquake", "Gunk Shot", "Knock Off"],
"abilities": ["Intimidate"],
"teraTypes": ["Poison"]
}
]
},
@ -4110,12 +4116,6 @@
"abilities": ["Shed Skin"],
"teraTypes": ["Poison"]
},
{
"role": "Setup Sweeper",
"movepool": ["Close Combat", "Dragon Dance", "Knock Off", "Poison Jab"],
"abilities": ["Intimidate"],
"teraTypes": ["Poison"]
},
{
"role": "Bulky Attacker",
"movepool": ["Dragon Dance", "Drain Punch", "Knock Off", "Poison Jab"],
@ -4202,7 +4202,7 @@
"sets": [
{
"role": "Bulky Support",
"movepool": ["Brave Bird", "Defog", "Hydro Pump", "Knock Off", "Roost"],
"movepool": ["Brave Bird", "Defog", "Flip Turn", "Hydro Pump", "Knock Off", "Roost"],
"abilities": ["Hydration"],
"teraTypes": ["Ground"]
}
@ -4264,7 +4264,7 @@
"sets": [
{
"role": "Fast Support",
"movepool": ["Bug Buzz", "Giga Drain", "Sticky Web", "Thunder", "Volt Switch"],
"movepool": ["Bug Buzz", "Energy Ball", "Sticky Web", "Thunder", "Volt Switch"],
"abilities": ["Compound Eyes"],
"teraTypes": ["Electric"]
}
@ -4490,7 +4490,7 @@
},
{
"role": "Bulky Support",
"movepool": ["Body Press", "Iron Defense", "Iron Head", "Stealth Rock", "Stone Edge", "Thunder Wave", "Volt Switch"],
"movepool": ["Body Press", "Iron Defense", "Iron Head", "Stealth Rock", "Thunder Wave", "Volt Switch"],
"abilities": ["Justified"],
"teraTypes": ["Ghost", "Water"]
}
@ -5325,7 +5325,7 @@
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Close Combat", "Knock Off", "Stealth Rock", "Stone Edge", "Sucker Punch", "Swords Dance"],
"movepool": ["Close Combat", "Knock Off", "Play Rough", "Stealth Rock", "Stone Edge", "Sucker Punch", "Swords Dance"],
"abilities": ["No Guard"],
"teraTypes": ["Fighting"]
}
@ -5502,12 +5502,6 @@
"komala": {
"level": 89,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Double-Edge", "Earthquake", "Knock Off", "Superpower", "U-turn", "Wood Hammer"],
"abilities": ["Comatose"],
"teraTypes": ["Fighting", "Grass", "Ground"]
},
{
"role": "Bulky Support",
"movepool": ["Body Slam", "Earthquake", "Knock Off", "Rapid Spin", "U-turn"],
@ -5604,6 +5598,12 @@
"abilities": ["Prism Armor"],
"teraTypes": ["Dark", "Ground", "Steel"]
},
{
"role": "Bulky Setup",
"movepool": ["Dragon Dance", "Earthquake", "Knock Off", "Photon Geyser"],
"abilities": ["Prism Armor"],
"teraTypes": ["Dark", "Ground", "Steel"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Earth Power", "Heat Wave", "Moonlight", "Photon Geyser"],
@ -5622,7 +5622,7 @@
"teraTypes": ["Ground", "Steel", "Water"]
},
{
"role": "Setup Sweeper",
"role": "Bulky Setup",
"movepool": ["Dragon Dance", "Earthquake", "Photon Geyser", "Sunsteel Strike"],
"abilities": ["Prism Armor"],
"teraTypes": ["Ground", "Steel", "Water"]
@ -5659,7 +5659,7 @@
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Flash Cannon", "Fleur Cannon", "Shift Gear"],
"abilities": ["Soul-Heart"],
"teraTypes": ["Fairy", "Flying", "Steel", "Water"]
"teraTypes": ["Fairy", "Flying", "Water"]
},
{
"role": "Tera Blast user",
@ -6449,16 +6449,22 @@
"level": 79,
"sets": [
{
"role": "Fast Support",
"movepool": ["Aqua Step", "Close Combat", "Knock Off", "Rapid Spin", "Roost", "Triple Axel", "U-turn"],
"role": "Wallbreaker",
"movepool": ["Aqua Step", "Close Combat", "Knock Off", "Triple Axel", "U-turn"],
"abilities": ["Moxie"],
"teraTypes": ["Fighting", "Water"]
},
{
"role": "Setup Sweeper",
"movepool": ["Aqua Step", "Close Combat", "Encore", "Knock Off", "Roost", "Swords Dance", "Triple Axel"],
"movepool": ["Aqua Step", "Close Combat", "Encore", "Knock Off", "Swords Dance", "Triple Axel"],
"abilities": ["Moxie"],
"teraTypes": ["Fighting", "Water"]
"teraTypes": ["Fighting", "Steel", "Water"]
},
{
"role": "Bulky Attacker",
"movepool": ["Aqua Step", "Close Combat", "Rapid Spin", "Roost", "Swords Dance"],
"abilities": ["Moxie"],
"teraTypes": ["Steel"]
}
]
},
@ -6831,7 +6837,7 @@
"teraTypes": ["Water"]
},
{
"role": "Setup Sweeper",
"role": "Bulky Setup",
"movepool": ["Gigaton Hammer", "Knock Off", "Play Rough", "Protect", "Swords Dance"],
"abilities": ["Mold Breaker"],
"teraTypes": ["Steel"]
@ -7280,7 +7286,7 @@
]
},
"ironjugulis": {
"level": 78,
"level": 77,
"sets": [
{
"role": "Wallbreaker",
@ -7314,7 +7320,7 @@
]
},
"ironbundle": {
"level": 77,
"level": 78,
"sets": [
{
"role": "Fast Attacker",

View File

@ -37,6 +37,7 @@ interface BattleFactorySet {
evs?: Partial<StatsTable>;
ivs?: Partial<StatsTable>;
shiny?: boolean;
level?: number;
}
interface BSSFactorySet {
species: string;
@ -815,6 +816,12 @@ export class RandomTeams {
}
}
// Enforce Encore on Whimsicott
if (movePool.includes('encore') && species.id === 'whimsicott') {
counter = this.addMove('encore', moves, types, abilities, teamDetails, species, isLead, isDoubles,
movePool, teraType, role);
}
// Enforce moves in doubles
if (isDoubles) {
const doublesEnforcedMoves = ['mortalspin', 'spore'];
@ -1175,7 +1182,7 @@ export class RandomTeams {
if (moves.has('clangoroussoul') || (species.id === 'toxtricity' && moves.has('shiftgear'))) return 'Throat Spray';
if (
(species.baseSpecies === 'Magearna' && role === 'Tera Blast user') ||
species.id === 'necrozmaduskmane' || (species.id === 'calyrexice' && isDoubles)
((species.id === 'calyrexice' || species.id === 'necrozmaduskmane') && isDoubles)
) return 'Weakness Policy';
if (['dragonenergy', 'lastrespects', 'waterspout'].some(m => moves.has(m))) return 'Choice Scarf';
if (
@ -1329,17 +1336,17 @@ export class RandomTeams {
teraType: string,
role: RandomTeamsTypes.Role,
): string {
const lifeOrbReqs = ['flamecharge', 'nuzzle', 'rapidspin', 'trailblaze'].every(m => !moves.has(m));
const lifeOrbReqs = ['flamecharge', 'nuzzle', 'rapidspin'].every(m => !moves.has(m));
if (
species.id !== 'jirachi' && (counter.get('Physical') >= moves.size) &&
['dragontail', 'fakeout', 'firstimpression', 'flamecharge', 'rapidspin'].every(m => !moves.has(m))
['dragontail', 'fakeout', 'firstimpression', 'flamecharge', 'rapidspin', 'trailblaze'].every(m => !moves.has(m))
) {
const scarfReqs = (
role !== 'Wallbreaker' &&
(species.baseStats.atk >= 100 || ability === 'Huge Power' || ability === 'Pure Power') &&
species.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&
ability !== 'Speed Boost' && !counter.get('priority') && !moves.has('aquastep')
ability !== 'Speed Boost' && !counter.get('priority')
);
return (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Band';
}
@ -1355,7 +1362,7 @@ export class RandomTeams {
);
return (scarfReqs && this.randomChance(1, 2)) ? 'Choice Scarf' : 'Choice Specs';
}
if (counter.get('speedsetup') && role === 'Bulky Setup') return 'Weakness Policy';
if (counter.get('speedsetup') && !counter.get('physicalsetup') && role === 'Bulky Setup') return 'Weakness Policy';
if (
!counter.get('Status') &&
!['Fast Attacker', 'Wallbreaker', 'Tera Blast user'].includes(role)
@ -1378,6 +1385,7 @@ export class RandomTeams {
) return 'Heavy-Duty Boots';
// Low Priority
if (moves.has('dragondance') && role === 'Bulky Setup') return 'Weakness Policy';
if (
ability === 'Rough Skin' || (
ability === 'Regenerator' && (role === 'Bulky Support' || role === 'Bulky Attacker') &&
@ -1445,10 +1453,11 @@ export class RandomTeams {
if (species.cosmeticFormes) return this.sample([species.name].concat(species.cosmeticFormes));
// Consolidate mostly-cosmetic formes, at least for the purposes of Random Battles
if (['Dudunsparce', 'Magearna', 'Maushold', 'Polteageist', 'Sinistcha', 'Zarude'].includes(species.baseSpecies)) {
if (['Dudunsparce', 'Maushold', 'Polteageist', 'Sinistcha', 'Zarude'].includes(species.baseSpecies)) {
return this.sample([species.name].concat(species.otherFormes!));
}
if (species.baseSpecies === 'Basculin') return 'Basculin' + this.sample(['', '-Blue-Striped']);
if (species.baseSpecies === 'Magearna') return 'Magearna' + this.sample(['', '-Original']);
if (species.baseSpecies === 'Pikachu') {
return 'Pikachu' + this.sample(
['', '-Original', '-Hoenn', '-Sinnoh', '-Unova', '-Kalos', '-Alola', '-Partner', '-World']
@ -1564,7 +1573,10 @@ export class RandomTeams {
) return false;
return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay';
});
if (noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime') {
if (
noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime' &&
!ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = 0;
}
@ -3000,6 +3012,260 @@ export class RandomTeams {
};
});
}
random1v1FactorySets: { [species: string]: BattleFactorySpecies } = require('./1v1-factory-sets.json');
random1v1FactorySet(
species: Species, teamData: RandomTeamsTypes.FactoryTeamDetails
): RandomTeamsTypes.RandomFactorySet | null {
const setList = this.random1v1FactorySets[species.name].sets;
const itemsLimited = ['choicespecs', 'choiceband', 'choicescarf'];
const movesLimited: { [k: string]: string } = {};
const abilitiesLimited: { [k: string]: string } = {};
// Build a pool of eligible sets, given the team partners
// Also keep track of moves and items limited to one per team
const effectivePool: {
set: BattleFactorySet, moves?: string[], item?: string,
}[] = [];
for (const set of setList) {
let reject = false;
// reject disallowed items, specifically a second of any given choice item
const allowedItems: string[] = [];
let ogItem = set.item;
if (!Array.isArray(ogItem)) ogItem = [ogItem];
for (const itemString of ogItem) {
const itemId = toID(itemString);
if (itemsLimited.includes(itemId) && teamData.has[itemId]) continue;
allowedItems.push(itemString);
}
if (!allowedItems.length) continue;
const item = this.sample(allowedItems);
const abilityId = toID(this.sample(set.ability));
if (abilitiesLimited[abilityId] && teamData.has[abilitiesLimited[abilityId]]) continue;
const moves: string[] = [];
for (const move of set.moves) {
const allowedMoves: string[] = [];
for (const m of move) {
const moveId = toID(m);
if (movesLimited[moveId] && teamData.has[movesLimited[moveId]]) continue;
allowedMoves.push(m);
}
if (!allowedMoves.length) {
reject = true;
break;
}
moves.push(this.sample(allowedMoves));
}
if (reject) continue;
effectivePool.push({ set, moves, item });
}
if (!effectivePool.length) {
if (!teamData.forceResult) return null;
for (const set of setList) {
effectivePool.push({ set });
}
}
// Sets have individual weight, choose one with weighted random selection
let setData = this.sample(effectivePool); // Init with unweighted random set as fallback
const total = effectivePool.reduce((a, b) => a + b.set.weight, 0);
const setRand = this.random(total);
let cur = 0;
for (const set of effectivePool) {
cur += set.set.weight;
if (cur > setRand) {
setData = set; // Bingo!
break;
}
}
const moves = [];
for (const [i, moveSlot] of setData.set.moves.entries()) {
moves.push(setData.moves ? setData.moves[i] : this.sample(moveSlot));
}
const item = setData.item || this.sampleIfArray(setData.set.item);
return {
name: species.baseSpecies,
species: (typeof species.battleOnly === 'string') ? species.battleOnly : species.name,
gender: setData.set.gender || species.gender || this.sample(['M', 'F']),
item,
ability: this.sampleIfArray(setData.set.ability),
shiny: setData.set.shiny || this.randomChance(1, 1024),
level: this.adjustLevel || setData.set.level || 100,
happiness: 255,
evs: { hp: 0, atk: 0, def: 0, spa: 0, spd: 0, spe: 0, ...setData.set.evs },
ivs: { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31, ...setData.set.ivs },
nature: this.sampleIfArray(setData.set.nature) || "Serious",
moves,
};
}
random1v1FactoryTeam(side: PlayerOptions, depth = 0): RandomTeamsTypes.RandomFactorySet[] {
this.enforceNoDirectCustomBanlistChanges();
const forceResult = depth >= 12;
const pokemon = [];
const pokemonPool = Object.keys(this.random1v1FactorySets);
const teamData: TeamData = {
typeCount: {},
typeComboCount: {},
baseFormes: {},
has: {},
forceResult,
weaknesses: {},
resistances: {},
};
const resistanceAbilities: { [k: string]: string[] } = {
dryskin: ['Water'], waterabsorb: ['Water'], stormdrain: ['Water'],
flashfire: ['Fire'], heatproof: ['Fire'], waterbubble: ['Fire'], wellbakedbody: ['Fire'],
lightningrod: ['Electric'], motordrive: ['Electric'], voltabsorb: ['Electric'],
sapsipper: ['Grass'],
thickfat: ['Ice', 'Fire'],
eartheater: ['Ground'], levitate: ['Ground'],
};
const movesLimited: { [k: string]: string } = {};
const abilitiesLimited: { [k: string]: string } = {};
const limitFactor = Math.ceil(this.maxTeamSize / 3);
/**
* Weighted random shuffle
* Uses the fact that for two uniform variables x1 and x2, x1^(1/w1) is larger than x2^(1/w2)
* with probability equal to w1/(w1+w2), which is what we want. See e.g. here https://arxiv.org/pdf/1012.0256.pdf,
* original paper is behind a paywall.
*/
const shuffledSpecies = [];
for (const speciesName of pokemonPool) {
const sortObject = {
speciesName,
score: this.prng.random() ** (1 / this.random1v1FactorySets[speciesName].weight),
};
shuffledSpecies.push(sortObject);
}
shuffledSpecies.sort((a, b) => a.score - b.score);
while (shuffledSpecies.length && pokemon.length < this.maxTeamSize) {
// repeated popping from weighted shuffle is equivalent to repeated weighted sampling without replacement
const species = this.dex.species.get(shuffledSpecies.pop()!.speciesName);
if (!species.exists) continue;
if (this.forceMonotype && !species.types.includes(this.forceMonotype)) continue;
// Limit to one of each species (Species Clause)
if (teamData.baseFormes[species.baseSpecies]) continue;
// Limit 1 of any type (most of the time)
const types = species.types;
let skip = false;
if (!this.forceMonotype) {
for (const type of types) {
if (teamData.typeCount[type] >= limitFactor && this.randomChance(4, 5)) {
skip = true;
break;
}
}
}
if (skip) continue;
if (!teamData.forceResult && !this.forceMonotype) {
// Limit 2 of any weakness
for (const typeName of this.dex.types.names()) {
// it's weak to the type
if (this.dex.getEffectiveness(typeName, species) > 0 && this.dex.getImmunity(typeName, types)) {
if (teamData.weaknesses[typeName] >= 2 * limitFactor) {
skip = true;
break;
}
}
}
}
if (skip) continue;
const set = this.random1v1FactorySet(species, teamData);
if (!set) continue;
// Limit 1 of any type combination
let typeCombo = types.slice().sort().join();
if (set.ability === "Drought" || set.ability === "Drizzle") {
// Drought and Drizzle don't count towards the type combo limit
typeCombo = set.ability;
}
if (!this.forceMonotype && teamData.typeComboCount[typeCombo] >= limitFactor) continue;
// Okay, the set passes, add it to our team
pokemon.push(set);
// Now that our Pokemon has passed all checks, we can update team data:
for (const type of types) {
if (type in teamData.typeCount) {
teamData.typeCount[type]++;
} else {
teamData.typeCount[type] = 1;
}
}
if (typeCombo in teamData.typeComboCount) {
teamData.typeComboCount[typeCombo]++;
} else {
teamData.typeComboCount[typeCombo] = 1;
}
teamData.baseFormes[species.baseSpecies] = 1;
teamData.has[toID(set.item)] = 1;
for (const move of set.moves) {
const moveId = toID(move);
if (movesLimited[moveId]) {
teamData.has[movesLimited[moveId]] = 1;
}
}
const ability = this.dex.abilities.get(set.ability);
if (abilitiesLimited[ability.id]) {
teamData.has[abilitiesLimited[ability.id]] = 1;
}
for (const typeName of this.dex.types.names()) {
const typeMod = this.dex.getEffectiveness(typeName, types);
// Track resistances because we will require it for triple weaknesses
if (
typeMod < 0 ||
resistanceAbilities[ability.id]?.includes(typeName) ||
!this.dex.getImmunity(typeName, types)
) {
// We don't care about the number of resistances, so just set to 1
teamData.resistances[typeName] = 1;
// Track weaknesses
} else if (typeMod > 0) {
teamData.weaknesses[typeName] = (teamData.weaknesses[typeName] || 0) + 1;
}
}
}
if (!teamData.forceResult && pokemon.length < this.maxTeamSize) return this.random1v1FactoryTeam(side, ++depth);
// Quality control we cannot afford for monotype
if (!teamData.forceResult && !this.forceMonotype) {
for (const type in teamData.weaknesses) {
// We reject if our team is triple weak to any type without having a resist
if (teamData.resistances[type]) continue;
if (teamData.weaknesses[type] >= 2 * limitFactor) return this.random1v1FactoryTeam(side, ++depth);
}
}
return pokemon;
}
}
export default RandomTeams;

View File

@ -634,7 +634,7 @@ export class RandomBabyTeams extends RandomTeams {
return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay';
});
if (noAttackStatMoves) {
if (noAttackStatMoves && !ruleTable.has('forceofthefallenmod')) {
evs.atk = 0;
ivs.atk = 0;
}

View File

@ -569,7 +569,7 @@
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Encore", "Moonblast", "Recover", "Scald", "Thunder Wave"],
"movepool": ["Moonblast", "Recover", "Scald", "Thunder Wave"],
"abilities": ["Multiscale", "Rough Skin"],
"teraTypes": ["Poison", "Steel"]
}

View File

@ -148,7 +148,10 @@ export class RandomCAPTeams extends RandomTeams {
) return false;
return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay';
});
if (noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime') {
if (
noAttackStatMoves && !moves.has('transform') && this.format.mod !== 'partnersincrime' &&
!ruleTable.has('forceofthefallenmod')
) {
evs.atk = 0;
ivs.atk = 0;
}

View File

@ -4782,7 +4782,7 @@
"teraTypes": ["Fairy"]
},
{
"role": "Fast Attacker",
"role": "Wallbreaker",
"movepool": ["Alluring Voice", "Dark Pulse", "Protect", "Psychic", "Thunderbolt"],
"abilities": ["Competitive"],
"teraTypes": ["Dark", "Electric", "Fairy"]

View File

@ -864,7 +864,7 @@ export class RandomFFATeams extends RandomTeams {
return move.category !== 'Physical' || move.id === 'bodypress' || move.id === 'foulplay';
});
if (noAttackStatMoves) {
if (noAttackStatMoves && !ruleTable.has('forceofthefallenmod')) {
evs.atk = 0;
ivs.atk = 0;
}

View File

@ -0,0 +1,856 @@
{
"albatrygon": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Sticky Web", "Taunt", "Encore", "Brave Bird", "Memento", "Parting Shot"],
"abilities": ["Prankster"]
},
{
"role": "Setup Sweeper",
"movepool": ["Tidy Up", "Brave Bird", "Drill Peck", "Feral Rush", "Feral Bite", "Sacred Sword"],
"abilities": ["Prankster"]
}
]
},
"aurorowl": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Frost Breath", "Air Cutter", "Focus Blast", "Nasty Plot"],
"abilities": ["Technician"]
}
]
},
"arbrella": {
"level": 100,
"sets": [
{
"role": "Wallbreaker",
"movepool": ["Earthquake", "Wood Hammer", "Swords Dance", "Synthesis", "Stone Edge", "Superpower"],
"abilities": ["Tough Claws"]
},
{
"role": "Choice Scarf",
"movepool": ["Earthquake", "Wood Hammer", "Stone Edge", "Superpower"],
"abilities": ["Tough Claws"]
}
]
},
"avastar": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Thunder Wave", "Heavy Slam", "Psychic", "Recover", "Teleport"],
"abilities": ["Shell Bunker"]
},
{
"role": "Setup Sweeper",
"movepool": ["Calm Mind", "Psychic", "Flash Cannon", "Recover", "Thunderbolt"],
"abilities": ["Shell Bunker"]
}
]
},
"axolacred": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Dragon Tail", "Roost", "Core Enforcer", "Scald", "Defog", "Shed Tail"],
"abilities": ["Magic Guard"]
},
{
"role": "Bulky Attacker",
"movepool": ["Feral Rush", "Core Enforcer", "Flip Turn", "Recover"],
"abilities": ["Magic Guard"]
}
]
},
"barracoth": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Sheer Cold", "Flip Turn", "Triple Axel", "Slack Off"],
"abilities": ["Multiscale", "Filter"]
}
]
},
"blunderbusk": {
"level": 100,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Hydro Pump", "Aura Sphere", "Ice Beam", "Dark Pulse", "Dragon Pulse"],
"abilities": ["Mega Launcher"]
}
]
},
"brawnkey": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Drain Punch", "Iron Head", "Chilly Reception", "Spikes"],
"abilities": ["Levitate"]
},
{
"role": "Setup Sweeper",
"movepool": ["Iron Defense", "Body Press", "Iron Head", "Stealth Rock"],
"abilities": ["Levitate"]
},
{
"role": "Setup Sweeper",
"movepool": ["Bulk Up", "Drain Punch", "Iron Head", "Stealth Rock"],
"abilities": ["Levitate"]
}
]
},
"carapex": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Tailwind", "Acrobatics", "Earthquake", "Stone Edge"],
"abilities": ["Wind Rider"]
},
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Roost", "Body Press", "Knock Off", "Crystal Bash", "U-Turn"],
"abilities": ["Wind Rider"]
}
]
},
"celespirit": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Sheer Cold", "Moonlight", "Hex", "Ice Beam", "Moonblast"],
"abilities": ["Levitate"]
},
{
"role": "Setup Sweeper",
"movepool": ["Calm Mind", "Crystal Burst", "Shadow Ball", "Moonlight"],
"abilities": ["Levitate"]
}
]
},
"cellsius": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Calm Mind", "Hydro Pump", "Moonblast", "Ice Beam", "Psychic"],
"abilities": ["Beast Boost"]
},
{
"role": "Fast Attacker",
"movepool": ["Hydro Pump", "Moonblast", "Ice Beam", "Flip Turn", "Psychic"],
"abilities": ["Beast Boost"]
}
]
},
"cindoe": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Overheat", "Fiery Wrath", "Parting Shot", "Morning Sun"],
"abilities": ["Natural Cure"]
},
{
"role": "Setup Sweeper",
"movepool": ["Nasty Plot", "Fiery Wrath", "Fire Blast", "Morning Sun"],
"abilities": ["Natural Cure"]
},
{
"role": "Setup Sweeper",
"movepool": ["Nasty Plot", "Fiery Wrath", "Crystal Burst", "Morning Sun"],
"abilities": ["Natural Cure"]
}
]
},
"cinnastar": {
"level": 100,
"sets": [
{
"role": "AV Pivot",
"movepool": ["Sludge Bomb", "Earth Power", "Focus Blast", "Mortal Spin"],
"abilities": ["Regenerator"]
},
{
"role": "Bulky Support",
"movepool": ["Earth Power", "Mortal Spin", "Recover", "Stealth Rock", "Power Gem"],
"abilities": ["Regenerator"]
}
]
},
"cobracotta": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Poison Fang", "Leech Seed", "Knock Off", "Synthesis", "Stealth Rock", "Power Whip"],
"abilities": ["Heatproof"]
}
]
},
"corundell": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Meteor Beam", "Power Gem", "Overheat", "Earth Power", "Volt Switch", "Energy Ball"],
"abilities": ["Lightning Rod"]
}
]
},
"crossont": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Spikes", "Recover", "Knock Off", "Circle Throw"],
"abilities": ["Mold Breaker", "Sniper"]
},
{
"role": "Bulky Attacker",
"movepool": ["Crystal Cutter", "Close Combat", "Bulk Up", "Substitute"],
"abilities": ["Sniper"]
}
]
},
"cyllindrake": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Body Press", "Rapid Spin", "Morning Sun", "Stealth Rock", "Boomburst"],
"abilities": ["Scrappy"]
},
{
"role": "Fast Support",
"movepool": ["Stealth Rock", "Rapid Spin", "Steel Beam", "Fire Blast"],
"abilities": ["Scrappy"]
},
{
"role": "Fast Attacker",
"movepool": ["Feral Shriek", "Flash Cannon", "Earth Power", "Feral Spray", "Rapid Spin"],
"abilities": ["Punk Rock"]
}
]
},
"dojodo": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Bulk Up", "Drain Punch", "Jet Punch", "Knock Off", "Substitute"],
"abilities": ["Supreme Overlord"]
},
{
"role": "Setup Sweeper",
"movepool": ["Bulk Up", "Drain Punch", "Crystal Bash", "Jet Punch", "Crystal Healing"],
"abilities": ["Supreme Overlord"]
}
]
},
"dolphena": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"],
"abilities": ["Mythical Presence"]
},
{
"role": "Setup Sweeper",
"movepool": ["Dragon Dance", "Scale Shot", "Liquidation", "Iron Head", "Substitute"],
"abilities": ["Mythical Presence"]
},
{
"role": "Setup Sweeper",
"movepool": ["Coil", "Scale Shot", "Iron Tail", "Liquidation"],
"abilities": ["Mythical Presence"]
},
{
"role": "Bulky Support",
"movepool": ["Defog", "Flip Turn", "Moonlight", "Dragon Tail"],
"abilities": ["Mythical Presence"]
}
]
},
"dracoil": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Defog", "Roost", "U-Turn", "Hurricane", "Fire Blast", "Glare", "Draco Meteor", "Earthquake"],
"abilities": ["Mythical Presence"]
},
{
"role": "Setup Sweeper",
"movepool": ["Dragon Dance", "Acrobatics", "Substitute", "Earthquake"],
"abilities": ["Gluttony"]
},
{
"role": "Setup Sweeper",
"movepool": ["Dragon Dance", "Dragon Rush", "Coil", "Earthquake", "Dual Wingbeat"],
"abilities": ["Mythical Presence"]
},
{
"role": "Bulky Support",
"movepool": ["Feral Bite", "Dragon Tail", "Roost", "Glare", "Defog"],
"abilities": ["Mythical Presence"]
}
]
},
"efflor": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Giga Drain", "Leech Seed", "Rapid Spin", "Stealth Rock", "Chilly Reception"],
"abilities": ["Seed Sower"]
},
{
"role": "Bulky Setup",
"movepool": ["Curse", "Stone Edge", "Body Press", "Synthesis"],
"abilities": ["Unaware"]
}
]
},
"electangle": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Gyro Ball", "Stealth Rock", "Body Press", "Volt Switch", "Discharge"],
"abilities": ["Filter"]
}
]
},
"elemadillo": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Flash Cannon", "Thunderbolt", "Volt Switch", "Energy Ball"],
"abilities": ["Motor Drive", "Weak Armor"]
},
{
"role": "Fast Attacker",
"movepool": ["Feral Power", "Flash Cannon", "Earth Power", "Feral Resilience"],
"abilities": ["Motor Drive", "Weak Armor"]
}
]
},
"embuck": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Blaze Kick", "Will-o-Wisp", "Morning Sun", "U-Turn", "Close Combat"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Support",
"movepool": ["Blaze Kick", "Crystal Bash", "Will-o-Wisp", "Morning Sun", "U-Turn"],
"abilities": ["Intimidate"]
},
{
"role": "Fast Attacker",
"movepool": ["Flare Blitz", "Wild Charge", "U-Turn", "Close Combat"],
"abilities": ["Intimidate"]
}
]
},
"faerenheit": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Lava Plume", "Moonblast", "Morning Sun"],
"abilities": ["Beast Boost"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Lava Plume", "Crystal Cage", "Morning Sun"],
"abilities": ["Beast Boost"]
}
]
},
"fenreil": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Double Edge", "Knock Off", "Superpower", "U-Turn"],
"abilities": ["Natural Cure"]
},
{
"role": "Fast Attacker",
"movepool": ["Feral Bite", "Knock Off", "Iron Head", "Feral Shred"],
"abilities": ["Natural Cure"]
}
]
},
"flocura": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Stealth Rock", "Thunder Wave", "U-Turn", "Leaf Storm"],
"abilities": ["Power Construct"]
},
{
"role": "Setup Sweeper",
"movepool": ["Nasty Plot", "Giga Drain", "Psychic", "Earth Power"],
"abilities": ["Levitate"]
},
{
"role": "Setup Sweeper",
"movepool": ["Nasty Plot", "Giga Drain", "Feral Power", "Earth Power"],
"abilities": ["Levitate"]
},
{
"role": "Fast Attacker",
"movepool": ["Leaf Storm", "U-Turn", "Psychic", "Earth Power"],
"abilities": ["Levitate"]
},
{
"role": "Bulky Support",
"movepool": ["Leech Seed", "U-Turn", "Thunder Wave", "Psychic", "Giga Drain", "Stealth Rock"],
"abilities": ["Power Construct"]
}
]
},
"harzodia": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Light Screen", "Reflect", "Teleport", "Thunder Wave", "Psychic"],
"abilities": ["Prankster"]
},
{
"role": "Setup Sweeper",
"movepool": ["Meteor Beam", "Psychic", "Shadow Ball", "Calm Mind", "Focus Blast"],
"abilities": ["Unburden"]
}
]
},
"jaegorm": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["First Impression", "U-Turn", "Photon Ray", "Knock Off", "Superpower", "Earthquake"],
"abilities": ["Schooling"]
}
]
},
"jamborai": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Mortal Spin", "Recover", "Pyschic", "Scald", "Teleport"],
"abilities": ["Water Absorb"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Recover", "Pyschic", "Scald", "Sludge Bomb", "Stored Power"],
"abilities": ["Water Absorb"]
},
{
"role": "Bulky Support",
"movepool": ["Mortal Spin", "Recover", "Crystal Cage", "Crystal Healing", "Teleport"],
"abilities": ["Gooey"]
},
{
"role": "Bulky Setup",
"movepool": ["Crystal Fortification", "Recover", "Stored Power", "Crystal Beam"],
"abilities": ["Gooey"]
}
]
},
"kodokai": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Crystal Cage", "Hex", "Will-o-Wisp", "Moonlight"],
"abilities": ["Aroma Veil"]
},
{
"role": "Bulky Support",
"movepool": ["Wish", "Hex", "Will-o-Wisp", "Moonlight"],
"abilities": ["Aroma Veil"]
}
]
},
"krachiten": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["First Impression", "U-Turn", "Liquidation", "Rapid Spin"],
"abilities": ["Torrent"]
},
{
"role": "Fast Attacker",
"movepool": ["Crystal Cutter", "U-Turn", "Aqua Cutter", "Superpower", "Rapid Spin"],
"abilities": ["Sniper"]
}
]
},
"lumoth": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Quiver Dance", "Hex", "Sleep Powder", "Bug Buzz"],
"abilities": ["Levitate"]
}
]
},
"minillow": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Nasty Plot", "Agility", "Hydro Pump", "Moonblast", "Substitute"],
"abilities": ["Adaptability"]
}
]
},
"muabboa": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Earthquake", "U-Turn", "Close Combat", "Knock Off"],
"abilities": ["Inner Focus"]
},
{
"role": "Setup Sweeper",
"movepool": ["Swords Dance", "Earthquake", "Feral Rush", "Close Combat"],
"abilities": ["Inner Focus"]
}
]
},
"noxtrice": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Poison Jab", "Flare Blitz", "Roost", "U-Turn"],
"abilities": ["Poison Touch"]
},
{
"role": "Setup Sweeper",
"movepool": ["Gunk Shot", "Flare Blitz", "Earthquake", "Dragon Dance"],
"abilities": ["Poison Touch"]
},
{
"role": "Setup Sweeper",
"movepool": ["Gunk Shot", "Feral Rush", "Earthquake", "Dragon Dance"],
"abilities": ["Flash Fire"]
}
]
},
"nunopod": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Earthquake", "Body Press", "Triple Axel", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"],
"abilities": ["Opportunist"]
},
{
"role": "Bulky Support",
"movepool": ["Crystal Bash", "Body Press", "Earthquake", "Flip Turn", "Stealth Rock", "Rapid Spin", "Recover"],
"abilities": ["Opportunist"]
}
]
},
"orchile": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Moonblast", "Earth Power", "Will-o-Wisp", "Strength Sap", "Spikes"],
"abilities": ["Flower Veil"]
},
{
"role": "Bulky Setup",
"movepool": ["Moonblast", "Earth Power", "Calm Mind", "Strength Sap"],
"abilities": ["Flower Veil"]
}
]
},
"platypad": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Revival Blessing", "Wave Crash", "Flip Turn", "Synthesis"],
"abilities": ["Flower Veil"]
},
{
"role": "Bulky Setup",
"movepool": ["Feral Resilience", "Feral Breath", "Giga Drain", "Synthesis"],
"abilities": ["Triage"]
}
]
},
"pythos": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Coil", "Knock Off", "Iron Tail", "Sucker Punch", "Superpower", "Facade"],
"abilities": ["Guts"]
}
]
},
"quadringo": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Defog", "Roost", "Dragon Tail", "Earthquake", "Moonblast"],
"abilities": ["Pastel Veil"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Moonblast", "Mystical Fire", "Roost"],
"abilities": ["Pastel Veil"]
},
{
"role": "Fast Attacker",
"movepool": ["Moonblast", "Draco Meteor", "Mystical Fire", "Earthquake"],
"abilities": ["Pastel Veil"]
},
{
"role": "Fast Attacker",
"movepool": ["Feral Rush", "Earthquake", "Feral Shred", "Roost"],
"abilities": ["Pastel Veil"]
}
]
},
"rantler": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Double Edge", "Ice Spinner", "Superpower", "Earthquake"],
"abilities": ["Slush Rush"]
},
{
"role": "Setup Sweeper",
"movepool": ["Swords Dance", "Double Edge", "Ice Spinner", "Superpower", "Earthquake", "Quick Attack"],
"abilities": ["Slush Rush"]
},
{
"role": "Fast Attacker",
"movepool": ["Double Edge", "Ice Spinner", "Superpower", "Quick Attack", "Fake Out"],
"abilities": ["Tough Claws"]
}
]
},
"roscenti": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["First Impression", "U-Turn", "Superpower", "Rock Blast", "Bullet Seed"],
"abilities": ["Skill Link"]
},
{
"role": "Fast Attacker",
"movepool": ["First Impression", "U-Turn", "Feral Rush", "Drill Run", "Iron Tail"],
"abilities": ["Sheer Force"]
},
{
"role": "Fast Attacker",
"movepool": ["First Impression", "U-Turn", "Crystal Tail", "Superpower", "Rock Slide"],
"abilities": ["Sheer Force"]
}
]
},
"salamalix": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Spikes", "Stone Edge", "Close Combat", "Iron Head"],
"abilities": ["Intimidate"]
},
{
"role": "Bulky Setup",
"movepool": ["Swords Dance", "Iron Head", "Close Combat", "Accelerock"],
"abilities": ["Intimidate"]
}
]
},
"salaos": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Toxic", "Recover", "Fiery Wrath", "Scald", "Flamethrower", "Toxic Spikes"],
"abilities": ["Good as Gold"]
},
{
"role": "Bulky Support",
"movepool": ["Toxic", "Recover", "Crystal Cage", "Flamethrower", "Toxic Spikes"],
"abilities": ["Good as Gold"]
}
]
},
"saphor": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Earthquake", "Body Slam", "Slack Off", "Roar", "Heal Bell"],
"abilities": ["Thick Fat"]
},
{
"role": "Bulky Support",
"movepool": ["Stealth Rock", "Crystal Tail", "Crystal Shard", "Slack Off", "Roar", "Crystal Healing"],
"abilities": ["Thick Fat"]
},
{
"role": "Bulky Setup",
"movepool": ["Bulk Up", "Crystal Cutter", "Slack Off", "Body Press"],
"abilities": ["Thick Fat"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Crystal Cage", "Slack Off", "Focus Blast"],
"abilities": ["Thick Fat"]
},
{
"role": "Fast Attacker",
"movepool": ["Headlong Rush", "Double Edge", "Heavy Slam", "Superpower", "Stone Edge"],
"abilities": ["Thick Fat"]
}
]
},
"scalaron": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Flamethrower", "Hurricane", "Roost", "U-Turn", "Defog", "Toxic", "Will-o-Wisp"],
"abilities": ["Filter"]
},
{
"role": "Bulky Support",
"movepool": ["Flamethrower", "Crystal Cage", "Roost", "U-Turn", "Defog", "Will-o-Wisp", "Crystal Shard"],
"abilities": ["Filter"]
}
]
},
"soleron": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Thunderbolt", "Hurricane", "Heat Wave", "U-Turn", "Air Slash", "Volt Switch", "Roost"],
"abilities": ["Battle Bond"]
},
{
"role": "Fast Attacker",
"movepool": ["Thunderbolt", "Feral Power", "Feral Spray", "Volt Switch", "Roost"],
"abilities": ["Battle Bond"]
},
{
"role": "Fast Attacker",
"movepool": ["Thunderbolt", "Crystal Burst", "Heat Wave", "Volt Switch", "Hurricane"],
"abilities": ["Battle Bond"]
}
]
},
"torgeist": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Toxic Thread", "Hex", "Hurricane", "Heat Wave", "Pain Split", "Taunt"],
"abilities": ["Merciless"]
},
{
"role": "Fast Attacker",
"movepool": ["Toxic Thread", "Hex", "Feral Power", "Pain Split", "Taunt", "Nasty Plot"],
"abilities": ["Merciless"]
},
{
"role": "Setup Sweeper",
"movepool": ["Will-o-Wisp", "Hex", "Feral Power", "Nasty Plot"],
"abilities": ["Cursed Body"]
}
]
},
"woolora": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Cotton Guard", "Stored Power", "Draining Kiss"],
"abilities": ["Fluffy", "Pastel Veil"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Moonlight", "Stored Power", "Moonblast"],
"abilities": ["Fluffy"]
}
]
},
"zeploom": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Energy Siphon", "Synthesis", "Stealth Rock", "U-Turn", "Defog", "Toxic", "Earth Power"],
"abilities": ["Wind Rider"]
}
]
}
}

View File

@ -22,13 +22,14 @@ const SETUP = [
'acidarmor', 'agility', 'autotomize', 'bellydrum', 'bulkup', 'calmmind', 'clangoroussoul', 'coil', 'cosmicpower', 'curse', 'dragondance',
'filletaway', 'flamecharge', 'growth', 'honeclaws', 'howl', 'irondefense', 'meditate', 'nastyplot', 'noretreat', 'poweruppunch', 'quiverdance',
'rockpolish', 'shellsmash', 'shiftgear', 'swordsdance', 'tailglow', 'takeheart', 'tidyup', 'trailblaze', 'trickroom', 'workup', 'victorydance',
'feralresilience', 'feralspray', 'crystalfortification',
];
const SPEED_CONTROL = [
'electroweb', 'glare', 'icywind', 'lowsweep', 'quash', 'stringshot', 'tailwind', 'thunderwave', 'trickroom',
];
// Hazard-setting moves
const HAZARDS = [
'spikes', 'stealthrock', 'stickyweb', 'toxicspikes',
'spikes', 'stealthrock', 'stickyweb', 'toxicspikes', 'crystalshard',
];
// Protect and its variants
const PROTECT_MOVES = [
@ -68,7 +69,7 @@ const NO_LEAD_POKEMON = [
const DOUBLES_NO_LEAD_POKEMON = [
'Basculegion', 'Houndstone', 'Iron Bundle', 'Roaring Moon', 'Zacian', 'Zamazenta',
];
export class RandomSPMTeams extends RandomTeams {
export class RandomSCTeams extends RandomTeams {
override cullMovePool(
types: string[],
moves: Set<string>,
@ -264,6 +265,7 @@ export class RandomSPMTeams extends RandomTeams {
role: RandomTeamsTypes.Role,
): Set<string> {
const moves = new Set<string>();
if (this.getSuperType(moves)) types[1] = this.getSuperType(moves);
let counter = this.queryMoves(moves, species, teraType, abilities);
this.cullMovePool(types, moves, abilities, counter, movePool, teamDetails, species, isLead, isDoubles, teraType, role);
@ -605,6 +607,7 @@ export class RandomSPMTeams extends RandomTeams {
teraType: string,
role: RandomTeamsTypes.Role,
) {
if (this.getSuperType(moves)) return this.getSuperType(moves) + " Orb";
if (!isDoubles) {
if (role === 'Fast Bulky Setup' && (ability === 'Quark Drive' || ability === 'Protosynthesis')) {
return 'Booster Energy';
@ -621,12 +624,33 @@ export class RandomSPMTeams extends RandomTeams {
return this.sample(species.requiredItems);
}
if (role === 'AV Pivot') return 'Assault Vest';
if (moves.has('substitute')) return 'Spellbook Magazine';
if (moves.has('protect') && ability !== 'Speed Boost') return 'Spellbook Magazine';
// Super Type hardcodes
if (species.id === 'cyllindrake' && moves.has('shiftgear')) return 'Throat Spray';
if (species.id === 'albatrygon' && moves.has('acrobatics')) return 'Sitrus Berry';
if (species.id === 'yiankutku' && moves.has('facade') || species.id === 'bluekutku' && moves.has('facade')) {
return 'Frost Orb';
}
if (species.id === 'xenojiiva' && ability === 'Quark Drive') return 'Booster Energy';
if (species.id === 'odogaron' && moves.has('closecombat')) return 'White Herb';
if (species.id === 'odogaron' && !moves.has('closecombat')) return 'Sitrus Berry';
if (
ability === 'Magic Guard' || ability === 'Fervent Scales' ||
(ability === 'Sheer Force' && counter.get('sheerforce'))
) {
return 'Life Orb';
}
if (moves.has('devour') && ability === 'Unburden') return 'Liechi Berry';
if (moves.has('virulentvolley')) return 'Loaded Dice';
if (moves.has('magnalance') && ability === 'Reactive Core') return 'Flame Orb';
if (moves.has('dragondance') && ability === 'Reactive Core') return 'Frost Orb';
// other
if (moves.has('substitute')) return 'Leftovers';
if (moves.has('protect') && ability !== 'Speed Boost') return 'Leftovers';
if (counter.get('skilllink') && ability !== 'Skill Link' && species.id !== 'breloom') return 'Loaded Dice';
if (moves.has('shellsmash') && ability !== 'Weak Armor') return 'White Herb';
if ((ability === 'Guts' || moves.has('facade')) && !moves.has('sleeptalk')) {
return (types.includes('Fire') || ability === 'Toxic Boost' || ability === 'Poison Heal') ? 'Toxic Orb' : 'Flame Orb';
}
if (ability === 'Magic Guard' || (ability === 'Sheer Force' && counter.get('sheerforce'))) return 'Life Orb';
if (['healingwish', 'switcheroo', 'trick'].some(m => moves.has(m))) {
if (
species.baseStats.spe >= 60 && species.baseStats.spe <= 108 &&
@ -659,12 +683,20 @@ export class RandomSPMTeams extends RandomTeams {
}
if (this.dex.getEffectiveness('Rock', species) >= 2) return 'Heavy-Duty Boots';
if (species.nfe) return 'Eviolite';
if (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Spellbook Magazine';
if (['Bulky Attacker', 'Bulky Support', 'Bulky Setup'].some(m => role === (m))) return 'Leftovers';
if (role === 'Fast Support' || role === 'Fast Bulky Setup') {
return (counter.get('Physical') + counter.get('Special') >= 3) ? 'Life Orb' : 'Spellbook Magazine';
return (counter.get('Physical') + counter.get('Special') >= 3) ? 'Life Orb' : 'Leftovers';
}
}
getSuperType(moves: Set<string> | string[]): string {
for (const move of moves) {
if (move.includes('crystal')) return "Crystal";
if (move.includes('feral')) return "Feral";
}
return "";
}
override randomSet(
s: string | Species,
teamDetails: RandomTeamsTypes.TeamDetails = {},
@ -676,7 +708,7 @@ export class RandomSPMTeams extends RandomTeams {
const sets = this.randomSets[species.id]["sets"];
const possibleSets: RandomTeamsTypes.RandomSetData[] = [];
const ruleTable = this.dex.formats.getRuleTable(this.format);
// const ruleTable = this.dex.formats.getRuleTable(this.format);
for (const set of sets) {
// Prevent Fast Bulky Setup on lead Paradox Pokemon, since it generates Booster Energy.
@ -686,7 +718,8 @@ export class RandomSPMTeams extends RandomTeams {
set.role === 'Fast Bulky Setup'
) continue;
// Prevent Tera Blast user if the team already has one, or if Terastallizion is prevented.
if ((teamDetails.teraBlast || ruleTable.has('terastalclause')) && set.role === 'Tera Blast user') {
// used here to limit team to 1 Super Types user
if (teamDetails.teraBlast && set.role === 'Tera Blast user') {
continue;
}
possibleSets.push(set);
@ -706,13 +739,17 @@ export class RandomSPMTeams extends RandomTeams {
const evs = { hp: 85, atk: 85, def: 85, spa: 85, spd: 85, spe: 85 };
const ivs = { hp: 31, atk: 31, def: 31, spa: 31, spd: 31, spe: 31 };
const types = species.types;
const types = [];
types[0] = species.types[0];
if (species.types[1]) types[1] = species.types[1];
const abilities = set.abilities!;
// Get moves
const moves = this.randomMoveset(types, abilities, teamDetails, species, isLead, isDoubles, movePool, teraType, role);
const counter = this.queryMoves(moves, species, teraType, abilities);
if (this.getSuperType(moves)) types[1] = this.getSuperType(moves);
// Get ability
ability = this.getAbility(types, moves, abilities, counter, teamDetails, species, isLead, isDoubles, teraType, role);
@ -798,7 +835,7 @@ export class RandomSPMTeams extends RandomTeams {
override randomSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./random-sets.json');
randomSPMTeam() {
randomSCTeam() {
this.enforceNoDirectCustomBanlistChanges();
const seed = this.prng.getSeed();
@ -817,6 +854,7 @@ export class RandomSPMTeams extends RandomTeams {
const baseFormes: { [k: string]: number } = {};
// const superTypeCount = 0;
const typeCount: { [k: string]: number } = {};
const typeComboCount: { [k: string]: number } = {};
const typeWeaknesses: { [k: string]: number } = {};
@ -869,14 +907,17 @@ export class RandomSPMTeams extends RandomTeams {
) {
if (pokemon.length + leadsRemaining === this.maxTeamSize) continue;
set = this.randomSet(species, teamDetails, false, isDoubles);
if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue;
pokemon.push(set);
} else {
set = this.randomSet(species, teamDetails, true, isDoubles);
if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue;
pokemon.unshift(set);
leadsRemaining--;
}
} else {
set = this.randomSet(species, teamDetails, false, isDoubles);
if (teamDetails.teraBlast && this.getSuperType(set.moves)) continue;
pokemon.push(set);
}
@ -900,6 +941,11 @@ export class RandomSPMTeams extends RandomTeams {
typeComboCount[typeCombo] = 1;
}
// Increment item counter
if (set.item === "Crystal Orb" || set.item === "Feral Orb") {
teamDetails.teraBlast = 1;
}
// Increment weakness counter
for (const typeName of this.dex.types.names()) {
// it's weak to the type
@ -952,4 +998,4 @@ export class RandomSPMTeams extends RandomTeams {
}
}
export default RandomSPMTeams;
export default RandomSCTeams;

View File

@ -1,511 +0,0 @@
{
"aegislash": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Bitter Malice", "Toxic", "Confuse Ray", "Protect", "Gyro Ball", "Night Slash", "Defog"],
"abilities": ["Bulletproof"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Attacker",
"movepool": ["Shadow Claw", "Shadow Sneak", "King's Shield", "Iron Head", "Close Combat", "Swords Dance"],
"abilities": ["Stance Change"],
"teraTypes": ["Ghost"]
}
]
},
"banettemega": {
"level": 100,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Shadow Claw", "Shadow Sneak", "Sucker Punch", "Pursuit", "Swords Dance", "Dark Pulse", "Grudge"],
"abilities": ["Tough Claws"],
"teraTypes": ["Ghost"]
}
]
},
"ceruledge": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Bitter Blade", "Spirit Shackle", "Close Combat", "Swords Dance"],
"abilities": ["Triage"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Attacker",
"movepool": ["Bitter Blade", "Poltergeist", "Close Combat", "Swords Dance", "Shadow Sneak", "Taunt"],
"abilities": ["Sharpness"],
"teraTypes": ["Ghost"]
}
]
},
"dofagrigus": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Hex", "Will-O-Wisp", "Strength Sap", "Knock Off", "Haze", "Body Press"],
"abilities": ["Dummy"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Shadow Ball", "Calm Mind", "Strength Sap", "Dark Pulse"],
"abilities": ["Dummy"],
"teraTypes": ["Ghost"]
}
]
},
"eddyazbear": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Spirit Shackle", "Close Combat", "Sucker Punch", "Bite", "Shadow Sneak", "Pursuit", "Grudge"],
"abilities": ["Strong Jaw"],
"teraTypes": ["Ghost"]
}
]
},
"fluttermane": {
"level": 90,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Astral Barrage", "Shadow Ball", "Moonblast", "Dark Pulse", "Mystical Fire", "Energy Ball", "Thunderbolt"],
"abilities": ["Protosynthesis", "Levitate"],
"teraTypes": ["Ghost"]
}
]
},
"fluttermane2": {
"level": 90,
"sets": [
{
"role": "Fast Support",
"movepool": ["Wish", "Protect", "Moonblast", "Ominous Wind", "Night Shade", "Defog"],
"abilities": ["Levitate"],
"teraTypes": ["Ghost"]
}
]
},
"gourgeist": {
"level": 90,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Moongeist Beam", "Moonlight", "Solar Beam", "Flamethrower"],
"abilities": ["Desolate Land"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Shadow Ball", "Moonblast", "Growth", "Solar Beam", "Flamethrower"],
"abilities": ["Desolate Land"],
"teraTypes": ["Ghost"]
}
]
},
"gourgeistgigantic": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Bitter Malice", "Flamethrower", "Infernal Parade", "Confuse Ray", "Moonblast", "Strength Sap", "Spit Up"],
"abilities": ["Pulp Up"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Bitter Malice", "Flamethrower", "Infernal Parade", "Moonblast", "Strength Sap", "Spit Up", "Nasty Plot"],
"abilities": ["Pulp Up"],
"teraTypes": ["Ghost"]
}
]
},
"gourgeistlarge": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Bitter Malice", "Flamethrower", "Infernal Parade", "Moonblast", "Strength Sap"],
"abilities": ["Spoky"],
"teraTypes": ["Ghost"]
}
]
},
"gourgeisttiny": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Shadow Bone", "Shadow Punch", "Power Whip", "Flare Blitz", "Play Rough", "Strength Sap", "Pain Split"],
"abilities": ["Dazzling"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Support",
"movepool": ["Trick-or-Treat", "Shadow Punch", "Power Whip", "Flare Blitz", "Play Rough", "Strength Sap", "Pain Split"],
"abilities": ["Dazzling"],
"teraTypes": ["Ghost"]
}
]
},
"houndstone": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Spirit Shackle", "Body Press", "Rapid Spin", "Cotton Guard", "Recover", "Will-O-Wisp"],
"abilities": ["Undead"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Support",
"movepool": ["Shadow Bone", "Crunch", "Roar", "Teleport", "Recover", "Will-O-Wisp"],
"abilities": ["Fluffy"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Attacker",
"movepool": ["Last Respects", "Play Rough", "Crunch", "Sucker Punch", "Trick", "Shadow Sneak"],
"abilities": ["Undead"],
"teraTypes": ["Ghost"]
}
]
},
"indeedee": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Shadow Ball", "Expanding Force", "Healing Wish", "Dazzling Gleam", "Encore", "Trick"],
"abilities": ["Psychic Surge"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Support",
"movepool": ["Shadow Ball", "Psychic", "Healing Wish", "Dazzling Gleam", "Encore", "Rapid Spin"],
"abilities": ["Scrappy"],
"teraTypes": ["Ghost"]
}
]
},
"jableye": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Bitter Malice", "Rage Fist", "Confuse Ray", "Dark Pulse", "Recover", "Strength Sap", "Thunder Wave", "Toxic", "Will-O-Wisp"],
"abilities": ["Jankster"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Support",
"movepool": ["Hex", "Nightmare", "Recover", "Will-O-Wisp"],
"abilities": ["Jankster"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Bitter Malice", "Calm Mind", "Dark Pulse", "Recover", "Strength Sap", "Thunder Wave", "Toxic", "Will-O-Wisp"],
"abilities": ["Jankster"],
"teraTypes": ["Ghost"]
}
]
},
"jobapplication": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Spirit Shackle", "Lash Out", "Shadow Sneak", "Superpower", "Tidy Up", "Return", "Slack Off"],
"abilities": ["No Ability"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Attacker",
"movepool": ["Lash Out", "Shadow Sneak", "Astonish", "Parting Shot"],
"abilities": ["No Ability"],
"teraTypes": ["Ghost"]
}
]
},
"kilotic": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Shadow Ball", "Scald", "Recover", "Flip Turn", "Ominous Wind", "Confuse Ray", "Haze"],
"abilities": ["Intimidate", "Cursed Body"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Shadow Ball", "Scald", "Recover", "Nasty Plot", "Alluring Voice"],
"abilities": ["Flare Boost", "Intimidate", "Cursed Body"],
"teraTypes": ["Ghost"]
}
]
},
"lanturnevil": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Spite", "Confuse Ray", "Destiny Bond", "Confuse Ray", "Plasma Fists", "Shadow Sneak", "Volt Switch", "Liquidation"],
"abilities": ["Abyssal Light"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Swords Dance", "Phantom Force", "Destiny Bond", "Plasma Fists", "Shadow Sneak", "Volt Switch", "Liquidation"],
"abilities": ["Abyssal Light"],
"teraTypes": ["Ghost"]
}
]
},
"merasmus": {
"level": 100,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["BOMBINOMICON!", "Substitute", "Expanding Force", "Spirit Break", "Protect"],
"abilities": ["Magician"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Feint Attack", "Substitute", "Curse", "Protect"],
"abilities": ["Magician"],
"teraTypes": ["Ghost"]
}
]
},
"nursola": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Ominous Wind", "Infernal Parade", "Giga Drain", "Stealth Rock", "Haze", "Wish", "Spiky Shield", "Will-O-Wisp"],
"abilities": ["Purifying Salt", "Solid Rock"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Support",
"movepool": ["Hex", "Giga Drain", "Strength Sap", "Will-O-Wisp"],
"abilities": ["Purifying Salt", "Solid Rock"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Shadow Ball", "Giga Drain", "Calm Mind", "Strength Sap", "Will-O-Wisp"],
"abilities": ["Purifying Salt", "Solid Rock"],
"teraTypes": ["Ghost"]
}
]
},
"okestarspirit": {
"level": 100,
"sets": [
{
"role": "Bulky Attacker",
"movepool": ["Lack Off", "Runch", "Ual Chop", "Words Dance"],
"abilities": ["Onder Guard"],
"teraTypes": ["Ghost"]
}
]
},
"ppiritomb": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Ominous Wind", "Stone Axe", "Salt Cure", "Will-O-Wisp", "Protect"],
"abilities": ["PPressure", "Pinfiltrator"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Curse", "Salt Cure", "Rest", "Sleep Talk"],
"abilities": ["PPressure", "Pinfiltrator"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Setup",
"movepool": ["Calm Mind", "Power Gem", "Rest", "Sleep Talk", "Will-O-Wisp"],
"abilities": ["PPressure", "Pinfiltrator"],
"teraTypes": ["Ghost"]
}
]
},
"quagsiredead": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Scald", "Earthquake", "Spirit Shackle", "Spikes", "Recover"],
"abilities": ["Cursed Body", "Unaware"],
"teraTypes": ["Ghost"]
}
]
},
"rotom": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Flamethrower", "Energy Ball", "Thunderbolt", "Volt Switch", "Ice Beam", "Shadow Ball", "Hurricane", "Surf", "Trick"],
"abilities": ["Shapeshift", "Levitate"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Flamethrower", "Energy Ball", "Thunderbolt", "Volt Switch", "Ice Beam", "Shadow Ball", "Hurricane", "Surf", "Nasty Plot"],
"abilities": ["Shapeshift"],
"teraTypes": ["Ghost"]
}
]
},
"shedinja": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Shadow Force", "Nightmare", "Toxic", "Protect"],
"abilities": ["Wonder Guard"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Shadow Sneak", "Shadow Claw", "Sucker Punch", "Night Slash", "Swords Dance", "Protect"],
"abilities": ["Wonder Guard"],
"teraTypes": ["Ghost"]
}
]
},
"trevenant": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Spirit Shackle", "Shadow Sneak", "Wood Hammer", "High Jump Kick", "Sucker Punch", "Swords Dance", "Destiny Bond"],
"abilities": ["Triage"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Spirit Shackle", "Shadow Sneak", "Horn Leech", "Drain Punch", "Sucker Punch", "Swords Dance"],
"abilities": ["Triage"],
"teraTypes": ["Ghost"]
}
]
},
"ursalunabloodmoon": {
"level": 100,
"sets": [
{
"role": "Bulky Setup",
"movepool": ["Blood Moon", "Moongeist Beam", "Moonlight", "Calm Mind"],
"abilities": ["Mind's Eye"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Attacker",
"movepool": ["Blood Moon", "Spirit Shackle", "Moonlight", "Earth Power", "Calm Mind"],
"abilities": ["Undead"],
"teraTypes": ["Ghost"]
}
]
},
"vampharos": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Volt Switch", "Thunderbolt", "Ominous Wind", "Moongeist Beam", "Spectral Thief", "Core Enforcer", "Moonlight"],
"abilities": ["Vamp"],
"teraTypes": ["Ghost"]
},
{
"role": "Wallbreaker",
"movepool": ["Volt Switch", "Thunderbolt", "Shadow Ball", "Infernal Parade", "Core Enforcer", "Moonblast"],
"abilities": ["Vamp"],
"teraTypes": ["Ghost"]
}
]
},
"wunala": {
"level": 100,
"sets": [
{
"role": "Setup Sweeper",
"movepool": ["Shadow Ball", "Night Daze", "Moonblast", "Calm Mind"],
"abilities": ["Wand Rush"],
"teraTypes": ["Ghost"]
},
{
"role": "Fast Attacker",
"movepool": ["Spectral Thief", "Moonblast", "Roost", "Will-O-Wisp", "Night Daze"],
"abilities": ["Wand Rush"],
"teraTypes": ["Ghost"]
}
]
},
"xorygonz": {
"level": 100,
"sets": [
{
"role": "Fast Attacker",
"movepool": ["Shadow Ball", "Bitter Malice", "Night Shade", "Recover", "Ice Beam", "Thunderbolt", "Sludge Bomb"],
"abilities": ["Mutual Exclusion"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Shadow Ball", "Bitter Malice", "Nasty Plot", "Recover", "Ice Beam", "Thunderbolt", "Sludge Bomb"],
"abilities": ["Mutual Exclusion"],
"teraTypes": ["Ghost"]
}
]
},
"yveltal": {
"level": 100,
"sets": [
{
"role": "Bulky Support",
"movepool": ["Dragon Tail", "Oblivion Wing", "Shadow Ball", "Roost", "Defog", "U-Turn"],
"abilities": ["Intimidate"],
"teraTypes": ["Ghost"]
},
{
"role": "Bulky Attacker",
"movepool": ["Draco Meteor", "Oblivion Wing", "Shadow Ball", "Roost", "Dark Pulse", "U-Turn"],
"abilities": ["Dark Aura"],
"teraTypes": ["Ghost"]
}
]
},
"zoroarkhisui": {
"level": 100,
"sets": [
{
"role": "Fast Support",
"movepool": ["Blizzard", "Shadow Ball", "Aurora Veil", "U-Turn", "Flamethrower", "Taunt", "Will-O-Wisp"],
"abilities": ["Snow Warning"],
"teraTypes": ["Ghost"]
},
{
"role": "Setup Sweeper",
"movepool": ["Ice Beam", "Shadow Ball", "Nasty Plot", "Flamethrower", "Taunt", "Sludge Bomb"],
"abilities": ["Cursed Body", "Illusion"],
"teraTypes": ["Ghost"]
}
]
}
}

View File

@ -1507,9 +1507,17 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
typeTable = typeTable.filter(type => species.types.includes(type));
}
const item = this.dex.items.get(set.item);
if (item.megaStone && species.baseSpecies === item.megaEvolves) {
species = this.dex.species.get(item.megaStone);
typeTable = typeTable.filter(type => species.types.includes(type));
if (item.megaStone) {
if (Array.isArray(item.megaStone)) {
const index = (item.megaEvolves as string[]).indexOf(species.name);
if (index >= 0) {
species = this.dex.species.get(item.megaStone[index]);
typeTable = typeTable.filter(type => species.types.includes(type));
}
} else {
species = this.dex.species.get(item.megaStone);
typeTable = typeTable.filter(type => species.types.includes(type));
}
}
if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") {
species = this.dex.species.get("Necrozma-Ultra");
@ -1548,9 +1556,17 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
}
color = species.color;
const item = this.dex.items.get(set.item);
if (item.megaStone && species.baseSpecies === item.megaEvolves) {
species = this.dex.species.get(item.megaStone);
color = species.color;
if (item.megaStone) {
if (Array.isArray(item.megaStone)) {
const index = (item.megaEvolves as string[]).indexOf(species.name);
if (index >= 0) {
species = this.dex.species.get(item.megaStone[index]);
color = species.color;
}
} else {
species = this.dex.species.get(item.megaStone);
color = species.color;
}
}
if (item.id === "ultranecroziumz" && species.baseSpecies === "Necrozma") {
species = this.dex.species.get("Necrozma-Ultra");
@ -2652,8 +2668,10 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
}
if (set.item && this.dex.items.get(set.item).megaStone) {
const item = this.dex.items.get(set.item);
if (item.megaEvolves === species.baseSpecies) {
species = this.dex.species.get(item.megaStone);
if (item.megaEvolves?.includes(species.name)) {
species = this.dex.species.get(Array.isArray(item.megaEvolves) ?
(item.megaStone as string[])[item.megaEvolves.indexOf(species.name)] :
item.megaStone as string);
}
}
if (this.ruleTable.isRestrictedSpecies(species) ||
@ -2675,7 +2693,11 @@ export const Rulesets: import('../sim/dex-formats').FormatDataTable = {
}
if (set.item) {
const item = this.dex.items.get(set.item);
if (item.megaEvolves === set.species) godSpecies = this.dex.species.get(item.megaStone);
if (item.megaEvolves?.includes(set.species)) {
godSpecies = this.dex.species.get(Array.isArray(item.megaEvolves) ?
(item.megaStone as string[])[item.megaEvolves.indexOf(set.species)] :
item.megaStone as string);
}
if (["Zacian", "Zamazenta"].includes(godSpecies.baseSpecies) && item.id.startsWith('rusted')) {
godSpecies = this.dex.species.get(set.species + "-Crowned");
}

View File

@ -55,10 +55,10 @@ export function crashlogger(
}
}
console.error(`\nCRASH: ${stack}\n`);
console.error(`\n[${Date.now()}] CRASH: ${stack}\n`);
const out = fs.createWriteStream(logPath, { flags: 'a' });
out.on('open', () => {
out.write(`\n${stack}\n`);
out.write(`\n[${Date.now()}] ${stack}\n`);
out.end();
}).on('error', (err: Error) => {
console.error(`\nSUBCRASH: ${err.stack}\n`);

View File

@ -125,7 +125,7 @@ export class QueryProcessWrapper<T, U> implements ProcessWrapper {
this.process.on('message', (message: string) => {
if (message.startsWith('THROW\n')) {
const error = new Error();
error.stack = message.slice(6);
error.stack = `[${this.process.pid}] ${message.slice(6)}`;
throw error;
}
@ -239,7 +239,7 @@ export class StreamProcessWrapper implements ProcessWrapper {
this.process.on('message', (message: string) => {
if (message.startsWith('THROW\n')) {
const error = new Error();
error.stack = message.slice(6);
error.stack = `[${this.process.pid}] ${message.slice(6)}`;
throw error;
}

View File

@ -169,6 +169,7 @@ export class SQLDatabaseManager extends QueryProcessManager<DatabaseQuery, any>
if (!this.isParentProcess) this.setupDatabase();
}
private onError(err: Error, query: DatabaseQuery) {
err.message += ` [process ${process.pid}]`;
if (this.options.onError) {
const result = this.options.onError(err, query, false);
if (result) return result;

Some files were not shown because too many files have changed in this diff Show More