Merge branch 'master' into patch-4

This commit is contained in:
André Bastos Dias 2025-12-20 12:05:43 +00:00 committed by GitHub
commit 2cc6e92239
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
115 changed files with 40769 additions and 17011 deletions

View File

@ -232,21 +232,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets', 'Limit One Restricted'],
restricted: ['Restricted Legendary'],
},
{
name: "[Gen 9] VGC 2025 Reg H",
mod: 'gen9',
gameType: 'doubles',
bestOfDefault: true,
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Open Team Sheets'],
banlist: ['Sub-Legendary', 'Paradox', 'Gouging Fire', 'Iron Boulder', 'Iron Crown', 'Raging Bolt'],
},
{
name: "[Gen 9] VGC 2025 Reg H (Bo3)",
mod: 'gen9',
gameType: 'doubles',
ruleset: ['Flat Rules', '!! Adjust Level = 50', 'Min Source Gen = 9', 'VGC Timer', 'Force Open Team Sheets', 'Best of = 3'],
banlist: ['Sub-Legendary', 'Paradox', 'Gouging Fire', 'Iron Boulder', 'Iron Crown', 'Raging Bolt'],
},
{
name: "[Gen 9] VGC 2025 Reg I",
mod: 'gen9',
@ -354,7 +339,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
'Koraidon', 'Kyogre', 'Kyurem-Black', 'Landorus-Therian', 'Lunala', 'Necrozma-Dusk-Mane', 'Rayquaza', 'Regieleki', 'Ribombee', 'Skeledirge', 'Terapagos',
'Ting-Lu', 'Zacian-Crowned',
// Ubers UUBL + Lunala, Arceus-Ghost, Arceus-Water
'Arceus-Dragon', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Steel', 'Necrozma-Dawn-Wings', 'Shaymin-Sky', 'Spectrier', 'Zacian', 'Zekrom',
'Arceus-Dragon', 'Arceus-Electric', 'Arceus-Fire', 'Arceus-Flying', 'Arceus-Steel', 'Necrozma-Dawn-Wings', 'Shaymin-Sky', 'Spectrier', 'Zacian', 'Zekrom',
],
},
{
@ -387,8 +372,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['[Gen 9] LC'],
banlist: [
'Chinchou', 'Diglett-Alola', 'Elekid', 'Foongus', 'Glimmet', 'Gothita', 'Grookey', 'Growlithe-Hisui', 'Larvesta', 'Mareanie', 'Mienfoo',
'Mudbray', 'Munchlax', 'Pawniard', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Shroodle', 'Snover', 'Stunky', 'Timburr', 'Tinkatink',
'Toedscool', 'Trapinch', 'Vullaby', 'Wingull', 'Zorua-Hisui',
'Mudbray', 'Pawniard', 'Sandshrew-Alola', 'Shellder', 'Shellos', 'Shroodle', 'Snover', 'Stunky', 'Timburr', 'Tinkatink', 'Toedscool',
'Trapinch', 'Vullaby', 'Wingull', 'Zorua-Hisui',
// LC UUBL
'Deerling', 'Minccino',
],
@ -521,202 +506,34 @@ export const Formats: import('../sim/dex-formats').FormatList = [
column: 2,
},
{
name: "[Gen 9] Fortemons",
desc: `Put an attacking move in the item slot to have all of a Pokémon's attacks inherit its properties.`,
name: "[Gen 9] Convergence",
desc: `Allows all Pokémon that have identical types to share moves and abilities.`,
mod: 'gen9',
// searchShow: false,
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
ruleset: ['Standard OMs', 'Ability Clause = 1', 'Sleep Moves Clause', 'Convergence Legality', 'Terastal Clause', '!Obtainable Abilities'],
banlist: [
'Annihilape', 'Arceus', 'Archaludon', 'Azumarill', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Cloyster', 'Comfey', 'Deoxys-Normal', 'Deoxys-Attack',
'Dialga-Base', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina-Altered', 'Great Tusk', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Iron Treads', 'Koraidon', 'Kyogre',
'Kyurem-Black', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Meowscarada', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin',
'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Samurott-Hisui', 'Shaymin-Sky', 'Skeledirge', 'Smeargle', 'Solgaleo', 'Spectrier', 'Sneasler', 'Terapagos',
'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Serene Grace', 'Shadow Tag',
'Damp Rock', 'Heat Rock', 'Light Clay', 'Baton Pass', 'Beat Up', 'Fake Out', 'Last Respects', 'move:Metronome', 'Shed Tail',
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Comfey', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed',
'Dialga', 'Dialga-Origin', 'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Haxorus', 'Ho-oh', 'Inteleon',
'Iron Bundle', 'Iron Hands', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lugia', 'Lunala',
'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin',
'Porygon-Z', 'Primarina', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Solgaleo', 'Slaking', 'Smeargle', 'Sneasler',
'Spectrier', 'Umbreon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Drizzle', 'Drought', 'Imposter', 'Moody', 'Pure Power', 'Shadow Tag', 'Speed Boost', 'Unburden',
'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Belly Drum', 'Boomburst', 'Extreme Speed', 'Final Gambit', 'Last Respects', 'Population Bomb',
'Quiver Dance', 'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform',
],
restricted: [
'Doom Desire', 'Dynamic Punch', 'Electro Ball', 'Explosion', 'Gyro Ball', 'Final Gambit', 'Flail', 'Flip Turn', 'Fury Cutter', 'Future Sight', 'Grass Knot',
'Grassy Glide', 'Hard Press', 'Heavy Slam', 'Heat Crash', 'Inferno', 'Low Kick', 'Misty Explosion', 'Nuzzle', 'Power Trip', 'Reversal', 'Self-Destruct',
'Spit Up', 'Stored Power', 'Tera Blast', 'U-turn', 'Weather Ball', 'Zap Cannon',
],
onValidateTeam(team) {
const itemTable = new Set<string>();
for (const set of team) {
const forte = this.toID(set.item);
if (!forte) continue;
const move = this.dex.moves.get(forte);
if (move.exists && move.id !== 'metronome') {
if (itemTable.has(forte)) {
return [
`You are limited to one of each move in the item slot per team.`,
`(You have more than one ${move.name}.)`,
];
}
itemTable.add(forte);
}
}
},
validateSet(set, teamHas) {
const item = set.item;
const species = this.dex.species.get(set.species);
const move = this.dex.moves.get(item);
if (!move.exists || move.id === 'metronome' || move.category === 'Status') {
return this.validateSet(set, teamHas);
}
set.item = '';
const problems = this.validateSet(set, teamHas) || [];
set.item = item;
if (this.checkCanLearn(move, species, this.allSources(species), set)) {
problems.push(`${species.name} can't learn ${move.name}.`);
}
if (set.moves.map(this.toID).includes(move.id)) {
problems.push(`Moves in the item slot can't be in the moveslots as well.`);
}
if (this.ruleTable.has(`-move:${move.id}`)) {
problems.push(`The move ${move.name} is fully banned.`);
}
const accuracyLoweringMove =
move.secondaries?.some(secondary => secondary.boosts?.accuracy && secondary.boosts?.accuracy < 0);
const flinchMove = move.secondaries?.some(secondary => secondary.volatileStatus === 'flinch');
const freezeMove = move.secondaries?.some(secondary => secondary.status === 'frz') || move.id === 'triattack';
if (
this.ruleTable.isRestricted(`move:${move.id}`) ||
((accuracyLoweringMove || move.ohko || move.multihit || move.id === 'beatup' || move.flags['charge'] ||
move.priority > 0 || move.damageCallback || flinchMove || freezeMove) &&
!this.ruleTable.has(`+move:${move.id}`))
) {
problems.push(`The move ${move.name} can't be used as an item.`);
}
return problems.length ? problems : null;
},
onBegin() {
for (const pokemon of this.getAllPokemon()) {
const move = this.dex.getActiveMove(pokemon.set.item);
if (move.exists && move.category !== 'Status') {
pokemon.m.forte = move;
pokemon.item = 'mail' as ID;
}
}
},
onModifyMovePriority: 1,
onModifyMove(move, pokemon, target) {
const forte: ActiveMove = pokemon.m.forte;
if (move.category !== 'Status' && forte) {
move.flags = { ...move.flags, ...forte.flags };
if (forte.self) {
if (forte.self.onHit && move.self?.onHit) {
for (const i in forte.self) {
if (i.startsWith('onHit')) continue;
(move.self as any)[i] = (forte.self as any)[i];
}
} else {
move.self = { ...move.self, ...forte.self };
}
}
if (forte.selfBoost?.boosts) {
if (!move.selfBoost?.boosts) move.selfBoost = { boosts: {} };
let boostid: BoostID;
for (boostid in forte.selfBoost.boosts) {
if (!move.selfBoost.boosts![boostid]) move.selfBoost.boosts![boostid] = 0;
move.selfBoost.boosts![boostid]! += forte.selfBoost.boosts[boostid]!;
}
}
if (forte.secondaries) {
move.secondaries = [...(move.secondaries || []), ...forte.secondaries];
}
move.critRatio = (move.critRatio || 1) + (forte.critRatio || 1) - 1;
const VALID_PROPERTIES = [
'alwaysHit', 'basePowerCallback', 'breaksProtect', 'drain', 'forceSTAB', 'forceSwitch', 'hasCrashDamage', 'hasSheerForce',
'ignoreAbility', 'ignoreAccuracy', 'ignoreDefensive', 'ignoreEvasion', 'ignoreImmunity', 'mindBlownRecoil', 'noDamageVariance',
'ohko', 'overrideDefensivePokemon', 'overrideDefensiveStat', 'overrideOffensivePokemon', 'overrideOffensiveStat', 'pseudoWeather',
'recoil', 'selfdestruct', 'selfSwitch', 'sleepUsable', 'smartTarget', 'stealsBoosts', 'thawsTarget', 'volatileStatus', 'willCrit',
] as const;
for (const property of VALID_PROPERTIES) {
if (forte[property]) {
move[property] = forte[property] as any;
}
}
// Added here because onEffectiveness doesn't have an easy way to reference the source
if (forte.onEffectiveness) {
move.onEffectiveness = function (typeMod, t, type, m) {
return forte.onEffectiveness!.call(this, typeMod, t, type, m);
};
}
forte.onModifyMove?.call(this, move, pokemon, target);
}
},
onModifyPriority(priority, source, target, move) {
const forte = source?.m.forte;
if (move.category !== 'Status' && forte) {
if (source.hasAbility('Triage') && forte.flags['heal']) {
return priority + (move.flags['heal'] ? 0 : 3);
}
return priority + forte.priority;
}
},
onModifyTypePriority: 1,
onModifyType(move, pokemon, target) {
const forte = pokemon.m.forte;
if (move.category !== 'Status' && forte) {
this.singleEvent('ModifyType', forte, null, pokemon, target, move, move);
}
},
onHitPriority: 1,
onHit(target, source, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('Hit', forte, {}, target, source, move);
if (forte.self) this.singleEvent('Hit', forte.self, {}, source, source, move);
this.singleEvent('AfterHit', forte, {}, target, source, move);
}
},
onAfterSubDamage(damage, target, source, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('AfterSubDamage', forte, null, target, source, move, damage);
}
},
onModifySecondaries(secondaries, target, source, move) {
if (secondaries.some(s => !!s.self)) move.selfDropped = false;
},
onAfterMoveSecondaryPriority: 1,
onAfterMoveSecondarySelf(source, target, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('AfterMoveSecondarySelf', forte, null, source, target, move);
}
},
onBasePowerPriority: 1,
onBasePower(basePower, source, target, move) {
const forte = source.m.forte;
if (move.category !== 'Status' && forte?.onBasePower) {
forte.onBasePower.call(this, basePower, source, target, move);
}
},
pokemon: {
getItem() {
const move = this.battle.dex.moves.get(this.m.forte);
if (!move.exists) return Object.getPrototypeOf(this).getItem.call(this);
return {
...this.battle.dex.items.get('mail'),
name: move.name, id: move.id, ignoreKlutz: true, onTakeItem: false,
};
},
},
},
{
name: "[Gen 9] Camomons",
desc: `Pok&eacute;mon have their types set to match their first two moves.`,
name: "[Gen 9] VoltTurn Mayhem",
desc: `Every move that targets a foe causes the user to switch out after use.`,
mod: 'gen9',
// searchShow: false,
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Terastal Clause', 'Camomons Mod'],
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'VoltTurn Mayhem Mod'],
banlist: [
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragonite', 'Drednaw',
'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre',
'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Ursaluna-Bloodmoon',
'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Booster Energy', 'King\'s Rock', 'Light Clay', 'Razor Fang',
'Baton Pass', 'Last Respects', 'Shed Tail',
'Arceus', 'Chi-Yu', 'Chien-Pao', 'Calyrex-Ice', 'Calyrex-Shadow', 'Darkrai', 'Deoxys-Attack', 'Deoxys-Normal', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin', 'Dragonite',
'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White',
'Lunala', 'Magearna', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Palafin', 'Palkia', 'Palkia-Origin', 'Raging Bolt', 'Rayquaza', 'Regieleki',
'Reshiram', 'Shaymin-Sky', 'Solgaleo', 'Terapagos', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned', 'Zekrom', 'King\'s Rock', 'Razor Fang', 'Fake Out',
'Last Respects', 'Revival Blessing',
],
},
@ -784,7 +601,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Standard OMs', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Sleep Moves Clause', 'Terastal Clause'],
banlist: [
'Calyrex-Shadow', 'Koraidon', 'Kyogre', 'Miraidon', 'Moody', 'Shadow Tag', 'Beedrillite', 'Blazikenite', 'Gengarite',
'Kangaskhanite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass', 'Shed Tail',
'Kangaskhanite', 'Lucarionite Z', 'Malamarite', 'Mawilite', 'Medichamite', 'Pidgeotite', 'Red Orb', 'Baton Pass',
'Shed Tail',
],
restricted: [
'Arceus', 'Basculegion-M', 'Calyrex-Ice', 'Ceruledge', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Eternatus', 'Flutter Mane',
@ -832,8 +650,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
// Place volatiles on the Pokémon to show its mega-evolved condition and details
this.add('-start', pokemon, originalSpecies.requiredItems?.[0] || originalSpecies.requiredItem || originalSpecies.requiredMove, '[silent]');
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
if (oSpecies.types.length !== pokemon.species.types.length || oSpecies.types[1] !== pokemon.species.types[1] ||
oSpecies.types[0] !== pokemon.species.types[0]) {
if (oSpecies.types.join('/') !== pokemon.species.types.join('/')) {
this.add('-start', pokemon, 'typechange', pokemon.species.types.join('/'), '[silent]');
}
}
@ -1038,6 +855,21 @@ export const Formats: import('../sim/dex-formats').FormatList = [
side.sideConditions[sideCondition.id].duration = 0;
},
},
{
name: "[Gen 9] Camomons",
desc: `Pok&eacute;mon have their types set to match their first two moves.`,
mod: 'gen9',
searchShow: false,
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Evasion Items Clause', 'Evasion Abilities Clause', 'Terastal Clause', 'Camomons Mod'],
banlist: [
'Arceus', 'Baxcalibur', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Dragonite', 'Drednaw',
'Enamorus-Incarnate', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Kommo-o', 'Koraidon', 'Kyogre',
'Kyurem', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
'Palafin', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler', 'Solgaleo', 'Spectrier', 'Tornadus-Therian', 'Ursaluna-Bloodmoon',
'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Booster Energy', 'King\'s Rock', 'Light Clay', 'Razor Fang',
'Baton Pass', 'Last Respects', 'Shed Tail',
],
},
{
name: "[Gen 9] Category Swap",
desc: `All Special moves become Physical, and all Physical moves become Special.`,
@ -1052,23 +884,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
'Razor Fang', 'Baton Pass', 'Draco Meteor', 'Last Respects', 'Overheat', 'Shed Tail',
],
},
{
name: "[Gen 9] Convergence",
desc: `Allows all Pok&eacute;mon that have identical types to share moves and abilities.`,
mod: 'gen9',
searchShow: false,
ruleset: ['Standard OMs', 'Sleep Clause Mod', 'Convergence Legality', 'Terastal Clause', '!Obtainable Abilities'],
banlist: [
'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Darkrai', 'Deoxys-Normal', 'Deoxys-Attack', 'Deoxys-Speed', 'Dialga', 'Dialga-Origin',
'Dondozo', 'Eternatus', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-oh', 'Inteleon', 'Iron Bundle', 'Iron Hands', 'Koraidon', 'Kyogre',
'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lilligant-Hisui', 'Lugia', 'Lunala', 'Magearna', 'Manaphy', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings',
'Necrozma-Dusk-Mane', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Primarina', 'Rayquaza', 'Regieleki', 'Regigigas', 'Reshiram', 'Shaymin-Sky',
'Solgaleo', 'Slaking', 'Smeargle', 'Spectrier', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Walking Wake', 'Zacian', 'Zacian-Crowned', 'Zamazenta',
'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Comatose', 'Contrary', 'Drizzle', 'Imposter', 'Moody', 'Pure Power', 'Shadow Tag', 'Speed Boost', 'Unburden',
'Heat Rock', 'King\'s Rock', 'Light Clay', 'Razor Fang', 'Baton Pass', 'Boomburst', 'Extreme Speed', 'Last Respects', 'Population Bomb', 'Quiver Dance',
'Rage Fist', 'Shed Tail', 'Shell Smash', 'Spore', 'Transform',
],
},
{
name: "[Gen 9] Cross Evolution",
desc: `Give a Pok&eacute;mon a Pok&eacute;mon name of the next evolution stage as a nickname to inherit stat changes, typing, abilities, and moves from the next stage Pok&eacute;mon.`,
@ -1278,6 +1093,190 @@ export const Formats: import('../sim/dex-formats').FormatList = [
}
},
},
{
name: "[Gen 9] Fortemons",
desc: `Put an attacking move in the item slot to have all of a Pok&eacute;mon's attacks inherit its properties.`,
mod: 'gen9',
searchShow: false,
ruleset: ['Standard OMs', 'Sleep Moves Clause', 'Terastal Clause'],
banlist: [
'Annihilape', 'Arceus', 'Archaludon', 'Azumarill', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Cloyster', 'Comfey', 'Deoxys-Normal', 'Deoxys-Attack',
'Dialga-Base', 'Espathra', 'Eternatus', 'Flutter Mane', 'Giratina-Altered', 'Great Tusk', 'Groudon', 'Ho-Oh', 'Iron Bundle', 'Iron Treads', 'Koraidon', 'Kyogre',
'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Meowscarada', 'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane',
'Palafin', 'Palkia', 'Palkia-Origin', 'Quaquaval', 'Raging Bolt', 'Rayquaza', 'Reshiram', 'Samurott-Hisui', 'Shaymin-Sky', 'Skeledirge', 'Smeargle', 'Solgaleo',
'Spectrier', 'Sneasler', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom', 'Arena Trap',
'Moody', 'Serene Grace', 'Shadow Tag', 'Damp Rock', 'Heat Rock', 'Light Clay', 'Baton Pass', 'Beat Up', 'Fake Out', 'Last Respects', 'move:Metronome', 'Shed Tail',
],
restricted: [
'Doom Desire', 'Dynamic Punch', 'Electro Ball', 'Explosion', 'Gyro Ball', 'Final Gambit', 'Flail', 'Flip Turn', 'Fury Cutter', 'Future Sight', 'Grass Knot',
'Grassy Glide', 'Hard Press', 'Heavy Slam', 'Heat Crash', 'Inferno', 'Low Kick', 'Misty Explosion', 'Nuzzle', 'Power Trip', 'Reversal', 'Self-Destruct',
'Spit Up', 'Stored Power', 'Tera Blast', 'U-turn', 'Weather Ball', 'Zap Cannon',
],
onValidateTeam(team) {
const itemTable = new Set<string>();
for (const set of team) {
const forte = this.toID(set.item);
if (!forte) continue;
const move = this.dex.moves.get(forte);
if (move.exists && move.id !== 'metronome') {
if (itemTable.has(forte)) {
return [
`You are limited to one of each move in the item slot per team.`,
`(You have more than one ${move.name}.)`,
];
}
itemTable.add(forte);
}
}
},
validateSet(set, teamHas) {
const item = set.item;
const species = this.dex.species.get(set.species);
const move = this.dex.moves.get(item);
if (!move.exists || move.id === 'metronome' || move.category === 'Status') {
return this.validateSet(set, teamHas);
}
set.item = '';
const problems = this.validateSet(set, teamHas) || [];
set.item = item;
if (this.checkCanLearn(move, species, this.allSources(species), set)) {
problems.push(`${species.name} can't learn ${move.name}.`);
}
if (set.moves.map(this.toID).includes(move.id)) {
problems.push(`Moves in the item slot can't be in the moveslots as well.`);
}
if (this.ruleTable.has(`-move:${move.id}`)) {
problems.push(`The move ${move.name} is fully banned.`);
}
const accuracyLoweringMove =
move.secondaries?.some(secondary => secondary.boosts?.accuracy && secondary.boosts?.accuracy < 0);
const flinchMove = move.secondaries?.some(secondary => secondary.volatileStatus === 'flinch');
const freezeMove = move.secondaries?.some(secondary => secondary.status === 'frz') || move.id === 'triattack';
if (
this.ruleTable.isRestricted(`move:${move.id}`) ||
((accuracyLoweringMove || move.ohko || move.multihit || move.id === 'beatup' || move.flags['charge'] ||
move.priority > 0 || move.damageCallback || flinchMove || freezeMove) &&
!this.ruleTable.has(`+move:${move.id}`))
) {
problems.push(`The move ${move.name} can't be used as an item.`);
}
return problems.length ? problems : null;
},
onBegin() {
for (const pokemon of this.getAllPokemon()) {
const move = this.dex.getActiveMove(pokemon.set.item);
if (move.exists && move.category !== 'Status') {
pokemon.m.forte = move;
pokemon.item = 'mail' as ID;
}
}
},
onModifyMovePriority: 1,
onModifyMove(move, pokemon, target) {
const forte: ActiveMove = pokemon.m.forte;
if (move.category !== 'Status' && forte) {
move.flags = { ...move.flags, ...forte.flags };
if (forte.self) {
if (forte.self.onHit && move.self?.onHit) {
for (const i in forte.self) {
if (i.startsWith('onHit')) continue;
(move.self as any)[i] = (forte.self as any)[i];
}
} else {
move.self = { ...move.self, ...forte.self };
}
}
if (forte.selfBoost?.boosts) {
if (!move.selfBoost?.boosts) move.selfBoost = { boosts: {} };
let boostid: BoostID;
for (boostid in forte.selfBoost.boosts) {
if (!move.selfBoost.boosts![boostid]) move.selfBoost.boosts![boostid] = 0;
move.selfBoost.boosts![boostid]! += forte.selfBoost.boosts[boostid]!;
}
}
if (forte.secondaries) {
move.secondaries = [...(move.secondaries || []), ...forte.secondaries];
}
move.critRatio = (move.critRatio || 1) + (forte.critRatio || 1) - 1;
const VALID_PROPERTIES = [
'alwaysHit', 'basePowerCallback', 'breaksProtect', 'drain', 'forceSTAB', 'forceSwitch', 'hasCrashDamage', 'hasSheerForce',
'ignoreAbility', 'ignoreAccuracy', 'ignoreDefensive', 'ignoreEvasion', 'ignoreImmunity', 'mindBlownRecoil', 'noDamageVariance',
'ohko', 'overrideDefensivePokemon', 'overrideDefensiveStat', 'overrideOffensivePokemon', 'overrideOffensiveStat', 'pseudoWeather',
'recoil', 'selfdestruct', 'selfSwitch', 'sleepUsable', 'smartTarget', 'stealsBoosts', 'thawsTarget', 'volatileStatus', 'willCrit',
] as const;
for (const property of VALID_PROPERTIES) {
if (forte[property]) {
move[property] = forte[property] as any;
}
}
// Added here because onEffectiveness doesn't have an easy way to reference the source
if (forte.onEffectiveness) {
move.onEffectiveness = function (typeMod, t, type, m) {
return forte.onEffectiveness!.call(this, typeMod, t, type, m);
};
}
forte.onModifyMove?.call(this, move, pokemon, target);
}
},
onModifyPriority(priority, source, target, move) {
const forte = source?.m.forte;
if (move.category !== 'Status' && forte) {
if (source.hasAbility('Triage') && forte.flags['heal']) {
return priority + (move.flags['heal'] ? 0 : 3);
}
return priority + forte.priority;
}
},
onModifyTypePriority: 1,
onModifyType(move, pokemon, target) {
const forte = pokemon.m.forte;
if (move.category !== 'Status' && forte) {
this.singleEvent('ModifyType', forte, null, pokemon, target, move, move);
}
},
onHitPriority: 1,
onHit(target, source, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('Hit', forte, {}, target, source, move);
if (forte.self) this.singleEvent('Hit', forte.self, {}, source, source, move);
this.singleEvent('AfterHit', forte, {}, target, source, move);
}
},
onAfterSubDamage(damage, target, source, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('AfterSubDamage', forte, null, target, source, move, damage);
}
},
onModifySecondaries(secondaries, target, source, move) {
if (secondaries.some(s => !!s.self)) move.selfDropped = false;
},
onAfterMoveSecondaryPriority: 1,
onAfterMoveSecondarySelf(source, target, move) {
const forte = source.m.forte;
if (move?.category !== 'Status' && forte) {
this.singleEvent('AfterMoveSecondarySelf', forte, null, source, target, move);
}
},
onBasePowerPriority: 1,
onBasePower(basePower, source, target, move) {
const forte = source.m.forte;
if (move.category !== 'Status' && forte?.onBasePower) {
forte.onBasePower.call(this, basePower, source, target, move);
}
},
pokemon: {
getItem() {
const move = this.battle.dex.moves.get(this.m.forte);
if (!move.exists) return Object.getPrototypeOf(this).getItem.call(this);
return {
...this.battle.dex.items.get('mail'),
name: move.name, id: move.id, ignoreKlutz: true, onTakeItem: false,
};
},
},
},
{
name: "[Gen 9] Frantic Fusions",
desc: `Pok&eacute;mon nicknamed after another Pok&eacute;mon get their stats buffed by 1/4 of that Pok&eacute;mon's stats, barring HP, and access to one of their abilities.`,
@ -1655,7 +1654,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
banlist: [
'Arceus', 'Annihilape', 'Archaludon', 'Basculegion', 'Basculegion-F', 'Baxcalibur', 'Braviary-Hisui', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao', 'Conkeldurr',
'Deoxys-Normal', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Excadrill', 'Flutter Mane', 'Giratina', 'Giratina-Origin', 'Gouging Fire', 'Groudon',
'Ho-Oh', 'Iron Bundle', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Miraidon', 'Mewtwo', 'Necrozma-Dusk-Mane',
'Ho-Oh', 'Iron Bundle', 'Kingambit', 'Koraidon', 'Kyogre', 'Kyurem-Black', 'Kyurem-White', 'Landorus-Incarnate', 'Lugia', 'Lunala', 'Magearna', 'Miraidon', 'Mewtwo', 'Necrozma-Dusk-Mane',
'Necrozma-Dawn-Wings', 'Ogerpon-Hearthflame', 'Palafin', 'Palkia', 'Palkia-Origin', 'Porygon-Z', 'Rayquaza', 'Regieleki', 'Reshiram', 'Roaring Moon', 'Shaymin-Sky', 'Sneasler',
'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Urshifu-Rapid-Strike', 'Volcarona', 'Zacian', 'Zacian-Crowned', 'Zamazenta-Crowned',
'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'Bright Powder', 'Damp Rock', 'Icy Rock', 'King\'s Rock', 'Razor Fang', 'Smooth Rock', 'Baton Pass', 'Shed Tail', 'Last Respects',
@ -2625,7 +2624,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
searchShow: false,
ruleset: [
'Standard NatDex',
'!Species Clause', 'Forme Clause', 'Terastal Clause', 'DryPass Clause', 'Z-Move Clause', 'Mega Rayquaza Clause',
'!Species Clause', 'Forme Clause', 'Terastal Clause', 'DryPass Clause', 'Mega Rayquaza Clause',
],
banlist: [
'ND Uber', 'ND AG', 'ND OU', 'ND UUBL', 'ND UU', 'ND RUBL', 'ND RU', 'ND NFE', 'ND LC',
@ -2633,9 +2632,10 @@ export const Formats: import('../sim/dex-formats').FormatList = [
'Last Respects', 'Shed Tail', 'Baton Pass + Contrary', 'Baton Pass + Rapid Spin',
],
unbanlist: [
'Altaria-Base', 'Ampharos-Base', 'Arbok', 'Armaldo', 'Calyrex-Base', 'Castform-Base', 'Dewgong', 'Drifblim', 'Emolga', 'Fearow', 'Furret', 'Glalie-Base',
'Gumshoos-Base', 'Heliolisk', 'Jumpluff', 'Kecleon', 'Ludicolo', 'Lunatone', 'Luxray', 'Lycanroc-Midnight', 'Meowstic-M', 'Primeape', 'Pupitar',
'Pyroar-Base', 'Rampardos', 'Scovillain', 'Silvally-Fairy', 'Simisage', 'Sneasel-Hisui', 'Spidops', 'Swalot', 'Thievul', 'Tinkaton', 'Whiscash', 'Zangoose',
'Beedrill-Base', 'Blastoise-Base', 'Bombirdier', 'Braviary-Hisui', 'Centiskorch', 'Cherrim', 'Cyclizar', 'Delcatty', 'Drampa-Base', 'Falinks-Base',
'Galvantula', 'Glastrier', 'Goodra-Base', 'Gothitelle', 'Hypno', 'Klinklang', 'Lurantis-Base', 'Mamoswine', 'Mandibuzz', 'Mismagius', 'Mothim',
'Oricorio-Baile', 'Perrserker', 'Revavroom', 'Scrafty-Base', 'Serperior', 'Sinistcha', 'Skarmory-Base', 'Squawkabilly-Green', 'Swoobat', 'Uxie',
'Vanilluxe', 'Walrein', 'Wishiwashi', 'Wyrdeer', 'Ultranecrozium Z', 'Solganium Z', 'Lunalium Z', 'Mewnium Z', 'Marshadium Z',
],
// Stupid hardcode
onValidateSet(set, format, setHas, teamHas) {
@ -2644,6 +2644,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [
if (item.megaEvolves && !(this.ruleTable.has(`+item:${item.id}`) || this.ruleTable.has(`+pokemontag:mega`))) {
return [`Mega Evolution is banned.`];
}
if (item.zMove && !(this.ruleTable.has(`+item:${item.id}`))) {
return [`${item.name} is banned.`];
}
}
const species = this.dex.species.get(set.species);
if (set.moves.map(x => this.toID(this.dex.moves.get(x).realMove) || x).includes('hiddenpower') &&
@ -2669,7 +2672,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
mod: 'gen9',
searchShow: false,
ruleset: ['[Gen 9] National Dex UU'],
banlist: ['ND UU', 'ND RUBL', 'Slowbro-Base + Slowbronite'],
banlist: ['ND UU', 'ND RUBL', 'Slowbronite'],
},
{
name: "[Gen 9] National Dex LC",
@ -2705,18 +2708,18 @@ export const Formats: import('../sim/dex-formats').FormatList = [
gameType: 'doubles',
ruleset: ['Standard Doubles', 'NatDex Mod', 'Evasion Abilities Clause'],
banlist: [
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Eternatus', 'Genesect', 'Gengar-Mega', 'Giratina',
'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Melmetal', 'Metagross-Mega', 'Mewtwo',
'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shedinja', 'Solgaleo',
'Stakataka', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned', 'Zekrom',
'Zygarde-50%', 'Zygarde-Complete', 'Commander', 'Power Construct', 'Shadow Tag', 'Eevium Z', 'Assist', 'Coaching', 'Dark Void', 'Swagger',
'Annihilape', 'Arceus', 'Calyrex-Ice', 'Calyrex-Shadow', 'Deoxys-Attack', 'Dialga', 'Dialga-Origin', 'Espathra', 'Eternatus', 'Genesect', 'Gengar-Mega',
'Giratina', 'Giratina-Origin', 'Groudon', 'Ho-Oh', 'Koraidon', 'Kyogre', 'Kyurem-White', 'Lugia', 'Lunala', 'Magearna', 'Melmetal', 'Metagross-Mega',
'Mewtwo', 'Miraidon', 'Necrozma-Dawn-Wings', 'Necrozma-Dusk-Mane', 'Necrozma-Ultra', 'Palkia', 'Palkia-Origin', 'Rayquaza', 'Reshiram', 'Shedinja',
'Solgaleo', 'Stakataka', 'Terapagos', 'Urshifu', 'Urshifu-Rapid-Strike', 'Xerneas', 'Yveltal', 'Zacian', 'Zacian-Crowned', 'Zamazenta', 'Zamazenta-Crowned',
'Zekrom', 'Zygarde-50%', 'Zygarde-Complete', 'Commander', 'Power Construct', 'Shadow Tag', 'Eevium Z', 'Assist', 'Coaching', 'Dark Void', 'Swagger',
],
},
{
name: "[Gen 9] National Dex Doubles Ubers",
mod: 'gen9',
gameType: 'doubles',
searchShow: false,
// searchShow: false,
ruleset: ['Standard Doubles', 'NatDex Mod', '!Gravity Sleep Clause'],
banlist: ['Shedinja', 'Assist'],
},
@ -2827,7 +2830,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
{
name: "[Gen 9] National Dex STABmons",
mod: 'gen9',
// searchShow: false,
searchShow: false,
ruleset: ['Standard NatDex', 'STABmons Move Legality', '!Sleep Clause Mod', 'Sleep Moves Clause', 'Terastal Clause'],
banlist: [
'Araquanid', 'Arceus', 'Azumarill', 'Baxcalibur', 'Blastoise-Mega', 'Blaziken-Mega', 'Basculegion', 'Basculegion-F', 'Calyrex-Ice', 'Calyrex-Shadow', 'Chi-Yu', 'Chien-Pao',
@ -2901,13 +2904,24 @@ export const Formats: import('../sim/dex-formats').FormatList = [
section: "Pet Mods",
},
{
name: "[Gen 9] spookymod Random Battle",
desc: `A Gen 9 Halloween-themed solomod comprised of entirely Ghost-types, some with more than 2 types.`,
mod: 'spookymod',
team: 'randomSPM',
ruleset: ['Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod', 'Terastal Clause', 'Data Preview', 'Sprite Viewer', 'Spokymod'],
name: "[Gen 9] Monster Hunter Random Battle",
desc: `A Gen 9 solomod where each Pokemon is based on a monster from the Monster Hunter franchise.`,
mod: 'monsterhunter',
team: 'randomMHS',
ruleset: [
'Species Clause', 'HP Percentage Mod', 'Cancel Mod', 'Sleep Clause Mod', 'Illusion Level Mod',
'Terastal Clause', 'Data Preview', 'Sprite Viewer', 'Mega Data Mod', 'Status Mod',
],
onBegin() {
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new moves, abilities, and wacky stuff?<br />Then make sure to check out the <a href="https://docs.google.com/spreadsheets/d/1gE9pr0ghm1_Y8kPk0c-jXP93X57xlEr1OzzyXUVH90w/edit#gid=0" target="_blank">spookymod Spreadsheet</a> or use /dt!</b></div>`);
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new moves, abilities, and wacky stuff?<br />Then make sure to check out the <a href="https://tinyurl.com/MonHunShow" target="_blank">MHS Wikia</a> or use /dt!</b></div>`);
this.add('-message', `Welcome to Monster Hunter Showdown!`);
this.add('-message', `Coded by KnivesMK, it reimagines the Monsters from Monster Hunter as Competitive Pokemon!`);
this.add('-message', `Community Discord can be found here:`);
this.add('-message', `https://discord.gg/JjjRGVrEvc`);
this.add('-message', `Format Wikia can be found here:`);
this.add('-message', `https://tinyurl.com/MonHunShow`);
this.add('-message', `Special thanks to EggEggEgg for most of the Sprites, and Kestis for the Icons!`);
this.add('-message', `(Monster Hunter Showdown is in no way officially affiliated with the Monster Hunter games or CAPCOM and is purely a fan project.)`);
},
onSwitchInPriority: 100,
onSwitchIn(pokemon) {
@ -2919,20 +2933,55 @@ export const Formats: import('../sim/dex-formats').FormatList = [
},
},
{
name: "[Gen 9] spookymod", // roomtours
desc: `A Gen 9 Halloween-themed solomod comprised of entirely Ghost-types, some with more than 2 types.`,
mod: 'spookymod',
name: "[Gen 9] Monster Hunter Showdown OU", // Roomtours
desc: `A Gen 9 solomod where each Pokemon is based on a monster from the Monster Hunter franchise.`,
mod: 'monsterhunter',
searchShow: false,
ruleset: ['Standard NatDex', 'Terastal Clause', 'Z-Move Clause', 'Data Preview', 'Sprite Viewer', 'Spokymod'],
banlist: ['All Pokemon'],
ruleset: ['Standard NatDex', 'Data Preview', 'Mega Data Mod', 'Status Mod', 'Terastal Clause', 'Sprite Viewer'],
banlist: [
'All Pokemon', 'Normalium Z', 'Fairium Z', 'Fightinium Z', 'Firium Z', 'Flyinium Z', 'Darkinium Z', 'Dragonium Z',
'Buginium Z', 'Waterium Z', 'Electrium Z', 'Ghostium Z', 'Grassium Z', 'Groundium Z', 'Icium Z', 'Poisonium Z',
'Psychium Z', 'Rockium Z', 'Steelium Z', 'Shed Tail', 'Baton Pass',
],
unbanlist: [
'Aegislash', 'Banette-Mega', 'Ceruledge', 'Dofagrigus', 'Eddy Azbear', 'Flutter Mane', 'Flutter Mane 2',
'Gourgeist-Tiny', 'Gourgeist', 'Gourgeist-Large', 'Gourgeist-Gigantic', 'Houndstone', 'Indeedee', 'Jableye',
'JOB APPLICATION', 'Kilotic', 'Lanturn-Evil', 'MERASMUS', 'Nursola', 'Okestar Spirit', 'PPiritomb', 'Quagsire-Dead',
'Rotom', 'Shedinja', 'Trevenant', 'Ursaluna-Bloodmoon', 'Vampharos', 'Wunala', 'XORygon-Z', 'Yveltal', 'Zoroark-Hisui',
'Acidinus', 'Agnaktor-EX', 'Ahtal-Ka', 'Alatreon', 'Amatsu', 'Arbitrellian',
'Arkveld', 'Ash-Shan Lung', 'Auroracanth', 'Blackveil Hazak', 'Blue Kutku', 'Brachydios', 'Ceadeus',
'Chameleos', 'Chaotic Gore', 'Dah\'ren Mohran', 'Dalamadur', 'Deviljho-Starving', 'Diablos', 'Dire Miralis',
'Doomtrellian', 'Duremudira', 'Eruzerion', 'Espinas', 'Estrellian', 'Fatalis', 'Flaminas', 'Gaismagorm',
'Gammoth', 'Glavenus', 'Glowstrax', 'Gogmazios', 'Goldeus', 'Goldthian', 'Goss Harag', 'Greencuga', 'Gureadomosu',
'Hallowed Mohran', 'Harudomerugu', 'Inagami', 'Inferonis', 'Jhen Mohran', 'Jin Dahaad', 'Jyuratodus', 'Kirin',
'Kulve Taroth', 'Kushala Daora', 'Landgiacrus', 'Lao-Shan Lung', 'Lucacuga', 'Magmadron', 'Magnamalo', 'Malzeno',
'Nakarkos', 'Namielle', 'Nargacuga', 'Narwa', 'Nef-Garmat', 'Nergigante', 'Odibatorasu', 'Oltura', 'Oltura-Larval',
'Oroshirin', 'Palepinas', 'Primozeno', 'Rajang', 'Rathian', 'Rey Dau', 'Rushala Daora', 'Safi\'jiiva', 'Sandrioth',
'Seregios', 'Shagaru Magala', 'Shahmadur', 'Shantien', 'Shara Ishvalda', 'Shen Gaoren', 'Silvalos', 'Tartaronis',
'Teostra', 'Tigrex', 'Ukanlos', 'Unknown', 'Uth Duna', 'Valstrax', 'Velkhana', 'Vizutsune', 'Xeno\'jiiva', 'Xu Wu',
'Yama Kurai', 'Yama Tsukami', 'Zoh Shia', 'Zorah Magdaros', 'Agnaktor', 'Ajarakan', 'Akantor', 'Akura Vashimu',
'Almudron', 'Anjanath', 'Astalos', 'Azurelos', 'Balahara', 'Barioth', 'Basarios-Sandstone', 'Bazelgeuse', 'Bishaten',
'Blackblos', 'Blackvios', 'Coral-Pukei', 'Daimyo Hermitaur', 'Deviljho', 'Disufiroa', 'Disufiroa-Sol', 'Doshaguma',
'Duramboros', 'Ebogaron', 'Fuljanath', 'Garangolm', 'Glanaktor', 'Gore Magala', 'Gravios', 'Great Izuchi', 'Greensioth',
'Gypceros', 'Ibushi', 'Ivogiacrus', 'Kulu-Ya-Ku', 'Lagiacrus', 'Lala Barina', 'Legiana', 'Lunagaron', 'Lunastra',
'Malfestio', 'Mizutsune', 'Molgrex', 'Monoblos', 'Najarala', 'Nightlumu', 'Nu Udra', 'Odogaron', 'Orangaten', 'Paolumu',
'Pinkthian', 'Plesioth', 'Pukei-Pukei', 'Pyre-Kadaki', 'Radobaan', 'Rakna-Kadaki', 'Rathalos', 'Rompopolo',
'Rustramboros', 'Seltas Queen', 'Shogun Ceanataur', 'Stygiogre', 'Terrataur', 'Tetranadon', 'Tzitzi-Ya-Ku',
'Uragaan', 'Vaal Hazak', 'Whiteblos', 'Yian Garuga', 'Yian Kutku', 'Zamtrios', 'Zinogre', 'Zinogre-Howling', 'Aknosom',
'Arzuros', 'Balenox', 'Banbaro', 'Barroth', 'Basarios', 'Beotodus', 'Blangonga', 'Bulldrome', 'Cephadrome',
'Chatacabra', 'Congalala', 'Crysarios', 'Dodogama', 'Emgalala', 'Gendrome', 'Giadrome', 'Gigginox', 'Gobul',
'Great Baggi', 'Great Girros', 'Great Jaggi', 'Great Jagras', 'Great Maccao', 'Great Wroggi', 'Hirabami',
'Hypnocatrice', 'Iodrome', 'Kecha Wacha', 'Khezu', 'King Shakalaka', 'Lagombi', 'Lavasioth', 'Nerscylla',
'Nibelsnarf', 'Palamute', 'Palico', 'Pokaradon', 'Purple Ludroth', 'Quematrice', 'Qurupeco', 'Redzu', 'Royal Ludroth',
'Seltas', 'Shroudcylla', 'Somnacanth', 'Spiribird', 'Spiribird-Orange', 'Spiribird-Red', 'Spiribird-Yellow',
'Tetsucabra', 'Tobi-Kadachi', 'Velocidrome', 'Vespoid Queen', 'Volvidon',
],
onBegin() {
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new moves, abilities, and wacky stuff?<br />Then make sure to check out the <a href="https://docs.google.com/spreadsheets/d/1gE9pr0ghm1_Y8kPk0c-jXP93X57xlEr1OzzyXUVH90w/edit#gid=0" target="_blank">spookymod Spreadsheet</a> or use /dt!</b></div>`);
this.add(`raw|<div class='broadcast-green'><b>Need help with all of the new moves, abilities, and wacky stuff?<br />Then make sure to check out the <a href="https://tinyurl.com/MonHunShow" target="_blank">MHS Wikia</a> or use /dt!</b></div>`);
this.add('-message', `Welcome to Monster Hunter Showdown!`);
this.add('-message', `Coded by KnivesMK, it reimagines the Monsters from Monster Hunter as Competitive Pokemon!`);
this.add('-message', `Community Discord can be found here:`);
this.add('-message', `https://discord.gg/JjjRGVrEvc`);
this.add('-message', `Format Wikia can be found here:`);
this.add('-message', `https://tinyurl.com/MonHunShow`);
this.add('-message', `Special thanks to EggEggEgg for most of the Sprites, and Kestis for the Icons!`);
this.add('-message', `(Monster Hunter Showdown is in no way officially affiliated with the Monster Hunter games or CAPCOM and is purely a fan project.)`);
},
onSwitchInPriority: 100,
onSwitchIn(pokemon) {
@ -2970,7 +3019,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
],
mod: 'gen9legendsou',
ruleset: ['Standard', 'Sleep Moves Clause', '!Sleep Clause Mod', 'Min Source Gen = 3', 'Terastal Clause'],
banlist: ['Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Quick Claw', 'Baton Pass'],
banlist: ['Uber', 'Arena Trap', 'Moody', 'Power Construct', 'Shadow Tag', 'King\'s Rock', 'Light Clay', 'Quick Claw', 'Razor Fang', 'Baton Pass', 'Last Respects', 'Shed Tail'],
},
// Randomized Format Spotlight
@ -2987,6 +3036,9 @@ export const Formats: import('../sim/dex-formats').FormatList = [
team: 'random',
ruleset: ['Force of the Fallen Mod'],
bestOfDefault: true,
onBegin() {
this.add(`raw|<div class="broadcast-blue">The Ladder Achievements Project for Force of the Fallen Random Roulette has officially started! Check <a href="https://www.smogon.com/forums/threads/3773734">this thread</a> to see what the project is all about and the challenges for this cycle!</div>`);
},
},
// Randomized Metas
@ -3383,7 +3435,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
'Poison Heal', 'Power Construct', 'Pressure', 'Pure Power', 'Rain Dish', 'Rough Skin', 'Sand Spit', 'Sand Stream', 'Seed Sower', 'Stamina', 'Toxic Chain',
'Volt Absorb', 'Water Absorb', 'Wonder Guard', 'Harvest + Jaboca Berry', 'Harvest + Rowap Berry', 'Aguav Berry', 'Assault Vest', 'Berry', 'Berry Juice',
'Berserk Gene', 'Black Sludge', 'Enigma Berry', 'Figy Berry', 'Gold Berry', 'Iapapa Berry', 'Kangaskhanite', 'Leftovers', 'Mago Berry', 'Medichamite',
'Steel Memory', 'Oran Berry', 'Rocky Helmet', 'Shell Bell', 'Sitrus Berry', 'Wiki Berry',
'Steel Memory', 'Oran Berry', 'Rocky Helmet', 'Shell Bell', 'Sitrus Berry', 'Tatsugirinite', 'Wiki Berry',
],
onValidateSet(set) {
const species = this.dex.species.get(set.species);
@ -3398,8 +3450,8 @@ export const Formats: import('../sim/dex-formats').FormatList = [
}
const item = this.dex.items.get(set.item);
if (set.item && item.megaStone) {
const megaSpecies = this.dex.species.get(item.megaStone);
if (species.baseSpecies === item.megaEvolves && megaSpecies.bst > 625) {
const megaSpecies = this.dex.species.get(Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone);
if (item.megaEvolves?.includes(species.baseSpecies) && megaSpecies.bst > 625) {
return [
`${set.name || set.species}'s item ${item.name} is banned.`, `(Pok\u00e9mon with a BST higher than 625 are banned)`,
];
@ -3643,19 +3695,26 @@ export const Formats: import('../sim/dex-formats').FormatList = [
column: 4,
},
{
name: "[Gen 8] UU",
mod: 'gen8',
name: "[Gen 1] Ubers",
mod: 'gen1',
// searchShow: false,
ruleset: ['[Gen 8] OU'],
banlist: ['OU', 'UUBL', 'Light Clay'],
ruleset: ['Standard'],
},
{
name: "[Gen 8] CAP",
desc: "The Create-A-Pok&eacute;mon project is a community dedicated to exploring and understanding the competitive Pok&eacute;mon metagame by designing, creating, and playtesting new Pok&eacute;mon concepts.",
mod: 'gen8',
name: "[Gen 3] Orre Colosseum",
mod: 'gen3colosseum',
// searchShow: false,
ruleset: ['[Gen 8] OU', '+CAP'],
banlist: ['Crucibellite'],
gameType: 'doubles',
ruleset: [
'Obtainable', 'Team Preview', 'Species Clause', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Max Team Size = 6', 'VGC Timer',
'Nickname Clause', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 4', 'Exact HP Mod', 'Item Clause = 1', 'Open Team Sheets',
],
banlist: ['Soul Dew', 'Deoxys-Defense', 'Deoxys-Attack', 'Deoxys-Speed', 'Restricted Legendary', 'Mythical'],
unbanlist: ['Latios', 'Latias', 'Wobbuffet', 'Wynaut'],
bestOfDefault: true,
onBegin() {
this.add('rule', 'Self-KO Clause: If your last Pok\u00e9mon faints to a self-KO move or effect, you will lose the battle');
},
},
{
name: "[Gen 6] VGC 2014",
@ -3791,6 +3850,13 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Standard', 'Dynamax Clause'],
banlist: ['AG', 'Shadow Tag', 'Baton Pass'],
},
{
name: "[Gen 8] UU",
mod: 'gen8',
searchShow: false,
ruleset: ['[Gen 8] OU'],
banlist: ['OU', 'UUBL', 'Light Clay'],
},
{
name: "[Gen 8] RU",
mod: 'gen8',
@ -3867,6 +3933,14 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['[Gen 8] PU'],
banlist: ['PU', 'ZUBL', 'Damp Rock', 'Grassy Seed'],
},
{
name: "[Gen 8] CAP",
desc: "The Create-A-Pok&eacute;mon project is a community dedicated to exploring and understanding the competitive Pok&eacute;mon metagame by designing, creating, and playtesting new Pok&eacute;mon concepts.",
mod: 'gen8',
searchShow: false,
ruleset: ['[Gen 8] OU', '+CAP'],
banlist: ['Crucibellite'],
},
{
name: "[Gen 8] Battle Stadium Singles",
mod: 'gen8',
@ -4754,7 +4828,7 @@ export const Formats: import('../sim/dex-formats').FormatList = [
name: "[Gen 3] NU",
mod: 'gen3',
searchShow: false,
ruleset: ['Standard'],
ruleset: ['Standard', 'One Boost Passer Clause'],
banlist: ['Uber', 'OU', 'UUBL', 'UU', 'RUBL', 'RU', 'NUBL', 'Smeargle + Ingrain'],
},
{
@ -4811,22 +4885,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
ruleset: ['Standard', 'One Boost Passer Clause'],
banlist: ['Uber', 'Swagger'],
},
{
name: "[Gen 3] Orre Colosseum",
mod: 'gen3colosseum',
searchShow: false,
gameType: 'doubles',
ruleset: [
'Obtainable', 'Team Preview', 'Species Clause', 'Stadium Sleep Clause', 'Freeze Clause Mod', 'Max Team Size = 6', 'VGC Timer',
'Nickname Clause', 'Endless Battle Clause', 'Cancel Mod', 'Picked Team Size = 4', 'Exact HP Mod', 'Item Clause = 1', 'Open Team Sheets',
],
banlist: ['Soul Dew', 'Deoxys-Defense', 'Deoxys-Attack', 'Deoxys-Speed', 'Restricted Legendary', 'Mythical'],
unbanlist: ['Latios', 'Latias', 'Wobbuffet', 'Wynaut'],
bestOfDefault: true,
onBegin() {
this.add('rule', 'Self-KO Clause: If your last Pok\u00e9mon faints to a self-KO move or effect, you will lose the battle');
},
},
{
name: "[Gen 3] Custom Game",
mod: 'gen3',
@ -4921,12 +4979,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
battle: { trunc: Math.trunc },
ruleset: ['HP Percentage Mod', 'Cancel Mod', 'Max Team Size = 24', 'Max Move Count = 24', 'Max Level = 9999', 'Default Level = 100'],
},
{
name: "[Gen 1] Ubers",
mod: 'gen1',
searchShow: false,
ruleset: ['Standard'],
},
{
name: "[Gen 1] UU",
mod: 'gen1',

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",
},
@ -610,7 +618,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
slowbromega: {
isNonstandard: "Past",
tier: "Illegal",
natDexTier: "UU",
natDexTier: "RUBL",
},
slowbrogalar: {
tier: "NU",
@ -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",
},
@ -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",
@ -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,6 +2756,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "Uber",
},
lucariomegaz: {
isNonstandard: "Future",
tier: "Illegal",
},
hippopotas: {
tier: "LC",
},
@ -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",
},
@ -3574,6 +3610,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
golurkmega: {
isNonstandard: "Future",
tier: "Illegal",
},
pawniard: {
tier: "LC",
},
@ -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",
@ -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)",
@ -4410,6 +4462,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "RU",
},
golisopodmega: {
isNonstandard: "Future",
tier: "Illegal",
},
sandygast: {
tier: "LC",
},
@ -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",
@ -4715,6 +4779,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
natDexTier: "UU",
},
zeraoramega: {
isNonstandard: "Future",
tier: "Illegal",
},
meltan: {
isNonstandard: "Past",
tier: "Illegal",
@ -5040,7 +5108,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "LC",
},
frosmoth: {
tier: "PU",
tier: "PUBL",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -5172,7 +5240,7 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
tier: "Illegal",
},
zarude: {
tier: "UU",
tier: "UUBL",
doublesTier: "(DUU)",
natDexTier: "RU",
},
@ -5352,6 +5420,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "(DUU)",
natDexTier: "RU",
},
scovillainmega: {
isNonstandard: "Future",
tier: "Illegal",
},
tadbulb: {
tier: "LC",
},
@ -5400,11 +5472,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)",
@ -5468,6 +5556,10 @@ export const FormatsData: import('../sim/dex-species').SpeciesFormatsDataTable =
doublesTier: "DOU",
natDexTier: "UU",
},
glimmoramega: {
isNonstandard: "Future",
tier: "Illegal",
},
shroodle: {
tier: "LC",
},
@ -5554,7 +5646,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,
@ -947,6 +975,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,
@ -1213,6 +1255,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,
@ -1298,6 +1354,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,
@ -2415,6 +2485,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,
@ -2499,6 +2583,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,
@ -2508,6 +2606,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,
@ -2790,6 +2916,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,
@ -3472,6 +3612,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,
@ -3615,6 +3769,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,
@ -3872,6 +4040,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,
@ -4976,6 +5158,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,
@ -5493,6 +5705,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,
@ -5900,6 +6126,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,
@ -6183,6 +6423,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,
@ -7719,6 +7973,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,
@ -7742,7 +8010,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

@ -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

@ -1,3 +0,0 @@
export const Scripts: ModdedBattleScriptsData = {
gen: 9,
};

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

@ -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

@ -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: "OU",
},
raichumegay: {
tier: "OU",
},
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: "OU",
},
zubat: {
tier: "LC",
},
golbat: {
tier: "NFE",
},
crobat: {
tier: "OU",
},
meowth: {
tier: "LC",
},
meowthalola: {
tier: "LC",
},
meowthgalar: {
tier: "LC",
},
persian: {
tier: "OU",
},
persianalola: {
tier: "OU",
},
perrserker: {
tier: "OU",
},
mankey: {
tier: "LC",
},
primeape: {
tier: "NFE",
},
annihilape: {
tier: "OU",
},
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: "OU",
},
farfetchdgalar: {
tier: "LC",
},
sirfetchd: {
tier: "OU",
},
gastly: {
tier: "LC",
},
@ -149,6 +209,15 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
onix: {
tier: "LC",
},
cubone: {
tier: "LC",
},
marowak: {
tier: "OU",
},
marowakalola: {
tier: "OU",
},
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: "OU",
},
mrmimegalar: {
tier: "NFE",
},
mrrime: {
tier: "OU",
},
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: "OU",
},
magikarp: {
tier: "LC",
},
@ -276,7 +366,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
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: "OU",
},
qwilfishhisui: {
tier: "LC",
},
overqwil: {
tier: "OU",
},
scizor: {
tier: "OU",
},
@ -329,6 +428,42 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tyranitarmega: {
tier: "(OU)",
},
treecko: {
tier: "LC",
},
grovyle: {
tier: "NFE",
},
sceptile: {
tier: "OU",
},
sceptilemega: {
tier: "OU",
},
torchic: {
tier: "LC",
},
combusken: {
tier: "NFE",
},
blaziken: {
tier: "OU",
},
blazikenmega: {
tier: "Uber",
},
mudkip: {
tier: "LC",
},
marshtomp: {
tier: "NFE",
},
swampert: {
tier: "OU",
},
swampertmega: {
tier: "OU",
},
ralts: {
tier: "LC",
},
@ -386,6 +521,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
roselia: {
tier: "NFE",
},
gulpin: {
tier: "LC",
},
swalot: {
tier: "OU",
},
carvanha: {
tier: "LC",
},
@ -404,6 +545,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
cameruptmega: {
tier: "UU",
},
spoink: {
tier: "LC",
},
grumpig: {
tier: "OU",
},
swablu: {
tier: "LC",
},
@ -413,6 +560,21 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
altariamega: {
tier: "UU",
},
zangoose: {
tier: "OU",
},
seviper: {
tier: "OU",
},
feebas: {
tier: "LC",
},
milotic: {
tier: "OU",
},
kecleon: {
tier: "OU",
},
shuppet: {
tier: "LC",
},
@ -422,12 +584,24 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
banettemega: {
tier: "UU",
},
chingling: {
tier: "LC",
},
chimecho: {
tier: "OU",
},
chimechomega: {
tier: "OU",
},
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: "OU",
},
latiasmega: {
tier: "OU",
},
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: "OU",
},
staraptormega: {
tier: "OU",
},
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: "OU",
},
rotomheat: {
tier: "OU",
},
rotomwash: {
tier: "OU",
},
rotomfrost: {
tier: "OU",
},
rotomfan: {
tier: "OU",
},
rotommow: {
tier: "OU",
},
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: "OU",
},
pansage: {
tier: "LC",
},
@ -566,6 +824,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
simipour: {
tier: "UU",
},
munna: {
tier: "LC",
},
musharna: {
tier: "OU",
},
drilbur: {
tier: "LC",
},
@ -581,6 +845,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
audinomega: {
tier: "UU",
},
throh: {
tier: "OU",
},
sawk: {
tier: "OU",
},
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: "OU",
},
runerigus: {
tier: "OU",
},
trubbish: {
tier: "LC",
},
@ -629,6 +911,12 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
emolga: {
tier: "UU",
},
foongus: {
tier: "LC",
},
amoonguss: {
tier: "OU",
},
tynamo: {
tier: "LC",
},
@ -639,7 +927,7 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "UU",
},
eelektrossmega: {
tier: "UU",
tier: "OU",
},
litwick: {
tier: "LC",
@ -653,12 +941,54 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
chandeluremega: {
tier: "UU",
},
cryogonal: {
tier: "OU",
},
stunfisk: {
tier: "UU",
},
stunfiskgalar: {
tier: "UU",
},
golett: {
tier: "LC",
},
golurk: {
tier: "OU",
},
golurkmega: {
tier: "OU",
},
cobalion: {
tier: "OU",
},
terrakion: {
tier: "OU",
},
virizion: {
tier: "OU",
},
keldeo: {
tier: "OU",
},
keldeoresolute: {
},
meloetta: {
tier: "OU",
},
meloettapirouette: {
},
genesect: {
tier: "OU",
},
genesectdouse: {
},
genesectshock: {
},
genesectburn: {
},
genesectchill: {
},
chespin: {
tier: "LC",
},
@ -774,7 +1104,13 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
tier: "OU",
},
meowsticf: {
tier: "(OU)",
tier: "OU",
},
meowsticmmega: {
tier: "OU",
},
meowsticfmega: {
tier: "OU",
},
honedge: {
tier: "LC",
@ -961,16 +1297,239 @@ export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormat
volcanion: {
tier: "OU",
},
crabrawler: {
tier: "LC",
},
crabominable: {
tier: "OU",
},
crabominablemega: {
tier: "OU",
},
wimpod: {
tier: "LC",
},
golisopod: {
tier: "OU",
},
golisopodmega: {
tier: "OU",
},
sandygast: {
tier: "LC",
},
palossand: {
tier: "OU",
},
drampa: {
tier: "UU",
},
drampamega: {
tier: "UU",
},
mimikyu: {
tier: "OU",
},
magearna: {
tier: "OU",
},
magearnaoriginal: {
tier: "OU",
},
magearnamega: {
tier: "Uber",
},
magearnaoriginalmega: {
tier: "Uber",
},
marshadow: {
tier: "Uber",
},
zeraora: {
tier: "OU",
},
zeraoramega: {
tier: "OU",
},
meltan: {
tier: "OU",
},
melmetal: {
tier: "OU",
},
rookidee: {
tier: "LC",
},
corvisquire: {
tier: "NFE",
},
corviknight: {
tier: "OU",
},
nickit: {
tier: "LC",
},
thievul: {
tier: "OU",
},
toxel: {
tier: "LC",
},
toxtricity: {
tier: "OU",
},
toxtricitylowkey: {
},
clobbopus: {
tier: "LC",
},
grapploct: {
tier: "OU",
},
falinks: {
tier: "UU",
},
falinksmega: {
tier: "UU",
},
indeedee: {
tier: "OU",
},
indeedeef: {
tier: "OU",
},
morpeko: {
tier: "OU",
},
morpekohangry: {
},
kleavor: {
tier: "OU",
},
fidough: {
tier: "LC",
},
dachsbun: {
tier: "OU",
},
squawkabilly: {
tier: "OU",
},
squawkabillyblue: {
},
squawkabillywhite: {
},
squawkabillyyellow: {
},
nacli: {
tier: "LC",
},
naclstack: {
tier: "NFE",
},
garganacl: {
tier: "OU",
},
charcadet: {
tier: "LC",
},
armarouge: {
tier: "OU",
},
ceruledge: {
tier: "OU",
},
maschiff: {
tier: "LC",
},
mabosstiff: {
tier: "OU",
},
shroodle: {
tier: "LC",
},
grafaiai: {
tier: "OU",
},
capsakid: {
tier: "LC",
},
scovillain: {
tier: "OU",
},
scovillainmega: {
tier: "OU",
},
tinkatink: {
tier: "LC",
},
tinkatuff: {
tier: "NFE",
},
tinkaton: {
tier: "OU",
},
cyclizar: {
tier: "OU",
},
glimmet: {
tier: "LC",
},
glimmora: {
tier: "OU",
},
glimmoramega: {
tier: "OU",
},
greavard: {
tier: "LC",
},
houndstone: {
tier: "OU",
},
flamigo: {
tier: "OU",
},
dondozo: {
tier: "OU",
},
tatsugiri: {
tier: "OU",
},
tatsugiridroopy: {
tier: "OU",
},
tatsugiristretchy: {
tier: "OU",
},
tatsugiricurlymega: {
tier: "OU",
},
tatsugiridroopymega: {
tier: "OU",
},
tatsugiristretchymega: {
tier: "OU",
},
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

@ -5,7 +5,15 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
},
victreebelmega: {
inherit: true,
abilities: { 0: "Corrosion" },
abilities: { 0: "Triage" },
},
raichumegax: {
inherit: true,
abilities: { 0: "Levitate" },
},
raichumegay: {
inherit: true,
abilities: { 0: "Transistor" },
},
starmiemega: {
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,6 +68,22 @@ 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: "Earth Eater" },
},
darkraimega: {
inherit: true,
abilities: { 0: "Dark Aura" },
},
emboarmega: {
inherit: true,
abilities: { 0: "Supreme Overlord" },
@ -56,6 +92,10 @@ export const Pokedex: import('../../../sim/dex-species').ModdedSpeciesDataTable
inherit: true,
abilities: { 0: "Mold Breaker" },
},
golurkmega: {
inherit: true,
abilities: { 0: "Adaptability" },
},
audinomega: {
inherit: true,
abilities: { 0: "Regenerator" },
@ -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: "Bulletproof" },
},
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: "Regenerator" },
},
drampamega: {
inherit: true,
abilities: { 0: "Drizzle" },
},
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: "Rocky Payload" },
},
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;
},

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,370 @@
export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDataTable = {
frz: {
onStart(target, source, sourceEffect) {
this.add('-message', `${target.name} was Frostbitten! Special Attack halved! (Stat Change not visible)`);
if (sourceEffect && sourceEffect.id === 'frostorb') {
this.add('-status', target, 'frz', '[from] item: Frost Orb');
} else if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'frz', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
} else {
this.add('-status', target, 'frz');
}
},
onResidualOrder: 10,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 16);
},
onModifySpA(spa, pokemon) {
return this.chainModify(0.5);
},
},
slp: {
name: 'slp',
effectType: 'Status',
onStart(target, source, sourceEffect) {
this.add('-message', `${target.name} is Drowsy! Damage taken is 1.2x; can't use same attack twice! Multi-Hits strike once!`);
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');
}
if (target.removeVolatile('nightmare')) {
this.add('-end', target, 'Nightmare', '[silent]');
}
},
onSourceModifyDamage(damage, source, target, move) {
return this.chainModify(1.2);
},
onModifyMove(move, pokemon) {
if (move.multihit) delete move.multihit;
},
onDisableMove(pokemon) {
if (pokemon.lastMove && pokemon.lastMove.id !== 'struggle') {
pokemon.disableMove(pokemon.lastMove.id);
}
},
},
par: {
inherit: true,
onStart(target, source, sourceEffect) {
this.add('-message', `${target.name} is Paralyzed! Speed halved; will be fully paralyzed every 3 turns!`);
if (sourceEffect && sourceEffect.effectType === 'Ability') {
this.add('-status', target, 'par', '[from] ability: ' + sourceEffect.name, `[of] ${source}`);
} else {
this.add('-status', target, 'par');
}
},
onResidual(pokemon) {
if (this.effectState.static === undefined) this.effectState.static = 0;
this.effectState.static++;
if (this.effectState.static >= 3) {
this.add('-message', `${pokemon.name} has too much static!`);
} else {
this.add('-message', `${pokemon.name} is building static!`);
}
},
onSwitchOut(pokemon) {
this.effectState.static = 0;
},
onSwitchIn(pokemon) {
this.effectState.static = 0;
},
onBeforeMove(pokemon) {
if (this.effectState.static >= 3) {
this.add('cant', pokemon, 'par');
this.effectState.static = 0;
return false;
}
},
},
warmed: {
name: 'Warmed',
onStart(pokemon) {
this.add('-start', pokemon, 'Warmed');
},
onModifySpAPriority: 5,
onModifySpA(spa, pokemon) {
return this.chainModify([5461, 4096]);
},
onModifyAtkPriority: 5,
onModifyAtk(atk, pokemon) {
return this.chainModify([5461, 4096]);
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Warmed');
},
},
cooled: {
name: 'Cooled',
onStart(pokemon) {
this.add('-start', pokemon, 'Cooled');
},
onModifyDefPriority: 5,
onModifyDef(def, pokemon) {
return this.chainModify([5325, 4096]);
},
onModifySpDPriority: 5,
onModifySpD(spd, pokemon) {
return this.chainModify([5325, 4096]);
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Cooled');
},
},
blastblight: {
name: 'Blastblight',
onStart(pokemon) {
this.add('-start', pokemon, 'Blasted');
this.add('-message', `${pokemon.name} has Blastblight! Next hit will incur chip damage!`);
},
onDamagingHit(damage, target, source, move) {
this.damage(target.baseMaxhp / 6, target, source);
target.removeVolatile('blastblight');
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Blasted');
},
},
bubbleblight: {
name: 'Bubbleblight',
duration: 4,
onStart(pokemon) {
this.add('-start', pokemon, 'Bubbled');
this.add('-message', `${pokemon.name} has Bubbleblight! +1 Speed, -1 Accuracy!`);
this.boost({ spe: 1, accuracy: -1 }, pokemon);
},
onEnd(pokemon) {
this.boost({ spe: -1, accuracy: 1 }, pokemon);
this.add('-end', pokemon, 'Bubbled');
},
},
defensedown: {
name: 'Defense Down',
duration: 4,
onStart(pokemon) {
this.add('-start', pokemon, 'Defense Down');
this.add('-message', `${pokemon.name} is afflicted with Defense Down! Defenses reduced by half for 3 turns!`);
},
onModifyDef(def, pokemon) {
return this.chainModify(0.5);
},
onModifySpD(spd, pokemon) {
return this.chainModify(0.5);
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Defense Down');
},
},
stench: {
name: 'Stench',
duration: 4,
onStart(pokemon) {
this.add('-start', pokemon, 'Stench');
this.add('-message', `${pokemon.name} is afflicted with Stench! Held item disabled!`);
this.singleEvent('End', pokemon.getItem(), pokemon.itemState, pokemon);
// Item suppression implemented in Pokemon.ignoringItem() within sim/pokemon.js
},
onDisableMove(pokemon) {
for (const moveSlot of pokemon.moveSlots) {
const move = this.dex.moves.get(moveSlot.id);
if (move.category === 'Status' && move.id !== 'mefirst') {
pokemon.disableMove(moveSlot.id);
}
}
},
onBeforeMovePriority: 5,
onBeforeMove(attacker, defender, move) {
if (!move.isZ && !move.isMax && move.category === 'Status' && move.id !== 'mefirst') {
this.add('cant', attacker, 'move: Taunt', move);
return false;
}
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Stench');
},
},
fatigue: {
name: 'Fatigue',
duration: 5,
onStart(pokemon, source) {
this.add('-start', pokemon, 'Fatigue');
this.add('-message', `${pokemon.name} is Fatigued! Moves use more PP!`);
},
onDeductPP(pokemon) {
return 1;
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Fatigue');
},
},
bleeding: {
name: 'Bleeding',
onStart(pokemon) {
this.add('-start', pokemon, 'Bleeding');
this.add('-message', `${pokemon.name} is afflicted with Bleeding! Will take damage when attacking!`);
},
onAfterMoveSecondarySelf(source, target, move) {
if (source && source !== target && move && move.category !== 'Status' && !source.forceSwitchFlag) {
this.damage(source.baseMaxhp / 10, source, source);
}
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Bleeding');
},
},
snowman: {
name: 'Snowman',
onStart(pokemon) {
this.add('-start', pokemon, 'Snowman');
this.add('-message', `${pokemon.name} is a Snowman! Unable to move.`);
},
onBeforeMovePriority: 10,
onBeforeMove(pokemon, target, move) {
if (move.flags['defrost']) return;
if (this.randomChance(1, 5)) {
pokemon.cureStatus();
return;
}
this.add('cant', pokemon, 'snowman');
return false;
},
onModifyMove(move, pokemon) {
if (move.flags['defrost']) {
this.add('-curestatus', pokemon, 'snowman', `[from] move: ${move}`);
pokemon.clearStatus();
}
},
onAfterMoveSecondary(target, source, move) {
if (move.thawsTarget) {
target.cureStatus();
}
},
onDamagingHit(damage, target, source, move) {
if (move.type === 'Fire' && move.category !== 'Status') {
target.cureStatus();
}
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Snowman');
},
},
rusted: {
name: 'Rusted',
duration: 4,
onStart(pokemon) {
if (pokemon.hasType('Steel')) {
this.add('-start', pokemon, 'Rusted');
this.add('-message', `${pokemon.name}'s steel defenses have rusted away!`);
} else {
pokemon.removeVolatile('rusted');
}
},
onEffectiveness(typeMod, target, type, move) {
if (!target) return;
if (target.hasType('Steel') && target.volatiles['rusted']) {
if (typeMod < 0) {
return 0;
}
if (typeMod === 0 && this.dex.getImmunity(type, target)) {
return 1;
}
}
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Rusted');
this.add('-message', `${pokemon.name}'s steel defenses are restored!`);
},
},
dragonblight: {
name: 'Dragonblight',
effectType: 'Status',
onStart(pokemon) {
if (pokemon.hasType('Fairy')) {
this.add('-immune', pokemon, '[from] status: Dragonblight');
return false;
}
this.add('-start', pokemon, 'Dragonblight');
this.add('-message', `${pokemon.name} is afflicted with Dragonblight! STAB disabled!`);
},
onResidualOrder: 10,
onResidual(pokemon) {
this.damage(pokemon.baseMaxhp / 16);
},
onModifySTAB(stab, source, target, move) {
return 1;
},
onEnd(pokemon) {
this.add('-end', pokemon, 'Dragonblight');
this.add('-message', `${pokemon.name} overcame Dragonblight!`);
},
},
/* Weather */
dustdevil: {
name: 'Dust Devil',
effectType: 'Weather',
duration: 0,
// This should be applied directly to the stat before any of the other modifiers are chained
// So we give it increased priority.
onModifySpDPriority: 10,
onModifySpD(spd, pokemon) {
if (pokemon.hasType('Rock') && this.field.isWeather('dustdevil')) {
return this.modify(spd, 1.5);
}
},
onModifyMove(move, attacker) {
if (move.type === 'Rock') {
move.accuracy = true;
}
},
onFieldStart(field, source, effect) {
this.add('-weather', 'Dust Devil', '[from] ability: ' + effect.name, `[of] ${source}`);
},
onFieldResidualOrder: 1,
onFieldResidual() {
this.add('-weather', 'Dust Devil', '[upkeep]');
this.eachEvent('Weather');
},
onWeather(target) {
if (this.field.weatherState.source !== target) this.damage(target.baseMaxhp / 16);
},
onFieldEnd() {
this.add('-weather', 'none');
},
},
absolutezero: {
name: 'Absolute Zero',
effectType: 'Weather',
duration: 0,
onModifyDefPriority: 10,
onModifyDef(def, pokemon) {
if (pokemon.hasType('Ice') && this.field.isWeather('absolutezero')) {
return this.modify(def, 1.5);
}
},
onModifySpe(spe, pokemon) {
if (this.field.weatherState.source !== pokemon) return this.chainModify(0.75);
},
onFieldStart(field, source, effect) {
this.add('-weather', 'Absolute Zero', '[from] ability: ' + effect.name, `[of] ${source}`);
},
onFieldResidualOrder: 1,
onFieldResidual() {
this.add('-weather', 'Absolute Zero', '[upkeep]');
this.eachEvent('Weather');
},
onWeather(target) {
if (this.field.weatherState.source !== target) this.damage(target.baseMaxhp / 16);
},
onFieldEnd() {
this.add('-weather', 'none');
},
},
snow: {
inherit: true,
onImmunity(type) {
if (type === 'brn') return false;
},
},
};

View File

@ -0,0 +1,785 @@
export const FormatsData: import('../../../sim/dex-species').ModdedSpeciesFormatsDataTable = {
agnaktor: {
tier: "UU",
},
agnaktorex: {
tier: "OU",
},
ahtalka: {
tier: "OU",
},
akantor: {
tier: "UU",
},
aknosom: {
tier: "RU",
},
alatreon: {
tier: "OU",
},
almudron: {
tier: "UU",
},
magmadron: {
tier: "OU",
},
amatsu: {
tier: "OU",
},
anjanath: {
tier: "UU",
},
fuljanath: {
tier: "UU",
},
arzuros: {
tier: "RU",
},
astalos: {
tier: "UU",
},
banbaro: {
tier: "RU",
},
barioth: {
tier: "UU",
},
barroth: {
tier: "RU",
},
basarios: {
tier: "RU",
},
bazelgeuse: {
tier: "UU",
},
beotodus: {
tier: "RU",
},
bishaten: {
tier: "UU",
},
orangaten: {
tier: "UU",
},
blangonga: {
tier: "RU",
},
brachydios: {
tier: "OU",
},
bulldrome: {
tier: "RU",
},
ceadeus: {
tier: "OU",
},
cephadrome: {
tier: "RU",
},
chameleos: {
tier: "OU",
},
congalala: {
tier: "RU",
},
dahrenmohran: {
tier: "OU",
},
daimyohermitaur: {
tier: "UU",
},
dalamadur: {
tier: "OU",
},
deviljho: {
tier: "UU",
},
diablos: {
tier: "OU",
},
diremiralis: {
tier: "OU",
},
dodogama: {
tier: "RU",
},
duramboros: {
tier: "UU",
},
eruzerion: {
tier: "OU",
},
espinas: {
tier: "OU",
},
flaminas: {
tier: "OU",
},
fatalis: {
tier: "OU",
},
gaismagorm: {
tier: "OU",
},
gammoth: {
tier: "OU",
},
garangolm: {
tier: "UU",
},
gendrome: {
tier: "RU",
},
giadrome: {
tier: "RU",
},
gigginox: {
tier: "RU",
},
glavenus: {
tier: "OU",
},
gobul: {
tier: "RU",
},
gogmazios: {
tier: "OU",
},
goremagala: {
tier: "UU",
},
chaoticgore: {
tier: "OU",
},
gossharag: {
tier: "OU",
},
gravios: {
tier: "UU",
},
greatbaggi: {
tier: "RU",
},
greatgirros: {
tier: "RU",
},
greatizuchi: {
tier: "UU",
},
greatjaggi: {
tier: "RU",
},
greatjagras: {
tier: "RU",
},
greatmaccao: {
tier: "RU",
},
greatwroggi: {
tier: "RU",
},
gureadomosu: {
tier: "OU",
},
gypceros: {
tier: "UU",
},
harudomerugu: {
tier: "OU",
},
hypnocatrice: {
tier: "RU",
},
ibushi: {
tier: "UU",
},
iodrome: {
tier: "RU",
},
jhenmohran: {
tier: "OU",
},
jyuratodus: {
tier: "OU",
},
kechawacha: {
tier: "RU",
},
khezu: {
tier: "RU",
},
kingshakalaka: {
tier: "RU",
},
kirin: {
tier: "OU",
},
kuluyaku: {
tier: "UU",
},
kulvetaroth: {
tier: "OU",
},
kushaladaora: {
tier: "OU",
},
rushaladaora: {
tier: "OU",
},
lagiacrus: {
tier: "UU",
},
ivogiacrus: {
tier: "UU",
},
lagombi: {
tier: "RU",
},
laoshanlung: {
tier: "OU",
},
lavasioth: {
tier: "RU",
},
legiana: {
tier: "UU",
},
lunagaron: {
tier: "UU",
},
lunastra: {
tier: "UU",
},
magnamalo: {
tier: "OU",
},
malfestio: {
tier: "UU",
},
malzeno: {
tier: "OU",
},
mizutsune: {
tier: "UU",
},
vizutsune: {
tier: "OU",
},
monoblos: {
tier: "UU",
},
najarala: {
tier: "UU",
},
nakarkos: {
tier: "OU",
},
namielle: {
tier: "OU",
},
nargacuga: {
tier: "OU",
},
lucacuga: {
tier: "OU",
},
narwa: {
tier: "OU",
},
nergigante: {
tier: "OU",
},
nefgarmat: {
tier: "OU",
},
nerscylla: {
tier: "RU",
},
nibelsnarf: {
tier: "RU",
},
odogaron: {
tier: "UU",
},
paolumu: {
tier: "UU",
},
plesioth: {
tier: "UU",
},
pukeipukei: {
tier: "UU",
},
qurupeco: {
tier: "RU",
},
radobaan: {
tier: "UU",
},
rajang: {
tier: "OU",
},
raknakadaki: {
tier: "UU",
},
pyrekadaki: {
tier: "UU",
},
rathalos: {
tier: "UU",
},
rathian: {
tier: "OU",
},
royalludroth: {
tier: "RU",
},
safijiiva: {
tier: "OU",
},
seltas: {
tier: "RU",
},
seltasqueen: {
tier: "UU",
},
seregios: {
tier: "OU",
},
shagarumagala: {
tier: "OU",
},
shantien: {
tier: "OU",
},
sharaishvalda: {
tier: "OU",
},
shengaoren: {
tier: "OU",
},
shogunceanataur: {
tier: "UU",
},
somnacanth: {
tier: "RU",
},
auroracanth: {
tier: "OU",
},
spiribird: {
tier: "RU",
},
spiribirdred: {
tier: "RU",
},
spiribirdyellow: {
tier: "RU",
},
spiribirdorange: {
tier: "RU",
},
teostra: {
tier: "OU",
},
tetranadon: {
tier: "UU",
},
tetsucabra: {
tier: "RU",
},
tigrex: {
tier: "OU",
},
tobikadachi: {
tier: "RU",
},
tzitziyaku: {
tier: "UU",
},
ukanlos: {
tier: "OU",
},
uragaan: {
tier: "UU",
},
vaalhazak: {
tier: "UU",
},
valstrax: {
tier: "OU",
},
glowstrax: {
tier: "OU",
},
velkhana: {
tier: "OU",
},
velocidrome: {
tier: "RU",
},
vespoidqueen: {
tier: "RU",
},
volvidon: {
tier: "RU",
},
xenojiiva: {
tier: "OU",
},
yamatsukami: {
tier: "OU",
},
yiangaruga: {
tier: "UU",
},
yiankutku: {
tier: "UU",
},
bluekutku: {
tier: "OU",
},
zamtrios: {
tier: "UU",
},
zamtriosiced: {
tier: "UU",
},
zamtriospuffed: {
tier: "UU",
},
zinogre: {
tier: "UU",
},
zorahmagdaros: {
tier: "OU",
},
lalabarina: {
tier: "UU",
},
balahara: {
tier: "UU",
},
doshaguma: {
tier: "UU",
},
rompopolo: {
tier: "UU",
},
palico: {
tier: "RU",
},
palamute: {
tier: "RU",
},
disufiroa: {
tier: "UU",
},
disufiroasol: {
tier: "UU",
},
reydau: {
tier: "OU",
},
hirabami: {
tier: "RU",
},
nuudra: {
tier: "UU",
},
nightlumu: {
tier: "UU",
},
acidinus: {
tier: "OU",
},
molgrex: {
tier: "UU",
},
blackblos: {
tier: "UU",
},
sandrioth: {
tier: "OU",
},
uthduna: {
tier: "OU",
},
blackveilhazak: {
tier: "OU",
},
silvalos: {
tier: "OU",
},
goldthian: {
tier: "OU",
},
pinkthian: {
tier: "UU",
},
goldeus: {
tier: "OU",
},
azurelos: {
tier: "UU",
},
stygiogre: {
tier: "UU",
},
jindahaad: {
tier: "OU",
},
zohshia: {
tier: "OU",
},
zohshiaencased: {
tier: "OU",
},
greencuga: {
tier: "OU",
},
allmothernarwa: {
tier: "OU",
},
nightcloakmalfestio: {
tier: "OU",
},
boltreaverastalos: {
tier: "OU",
},
massacrediablos: {
tier: "OU",
},
primozeno: {
tier: "OU",
},
arkveld: {
tier: "OU",
},
chatacabra: {
tier: "RU",
},
quematrice: {
tier: "RU",
},
pokaradon: {
tier: "RU",
},
inagami: {
tier: "OU",
},
shroudcylla: {
tier: "RU",
},
estrellian: {
tier: "OU",
},
estrellianarmored: {
tier: "OU",
},
estrellianwinged: {
tier: "OU",
},
doomtrellian: {
tier: "OU",
},
doomtrelliancharged: {
tier: "OU",
},
arbitrellian: {
tier: "OU",
},
arbitrelliancharged: {
tier: "OU",
},
olturalarval: {
tier: "OU",
},
oltura: {
tier: "OU",
},
duremudira: {
tier: "OU",
},
akuravashimu: {
tier: "UU",
},
ebogaron: {
tier: "UU",
},
purpleludroth: {
tier: "RU",
},
ahtalneset: {
tier: "OU",
},
xuwu: {
tier: "OU",
},
oroshirin: {
tier: "OU",
},
terrataur: {
tier: "UU",
},
coralpukei: {
tier: "UU",
},
rustramboros: {
tier: "UU",
},
ajarakan: {
tier: "UU",
},
emgalala: {
tier: "RU",
},
tartaronis: {
tier: "OU",
},
inferonis: {
tier: "OU",
},
hallowedmohran: {
tier: "OU",
},
unknown: {
tier: "OU",
},
yamakurai: {
tier: "OU",
},
balenox: {
tier: "RU",
},
odibatorasu: {
tier: "OU",
},
landgiacrus: {
tier: "OU",
},
ashshanlung: {
tier: "OU",
},
blackvios: {
tier: "UU",
},
crysarios: {
tier: "RU",
},
glanaktor: {
tier: "UU",
},
greensioth: {
tier: "UU",
},
zinogrehowling: {
tier: "UU",
},
palepinas: {
tier: "OU",
},
redzu: {
tier: "RU",
},
basariossandstone: {
tier: "UU",
},
shahmadur: {
tier: "OU",
},
deviljhostarving: {
tier: "OU",
},
whiteblos: {
tier: "UU",
},
hellbladeglavenus: {
tier: "OU",
},
crystalbearduragaan: {
tier: "OU",
},
stonefistdaimyo: {
tier: "OU",
},
emperorkirin: {
tier: "OU",
},
frostfangbarioth: {
tier: "OU",
},
redhelmarzuros: {
tier: "OU",
},
harudomeruguz: {
tier: "OU",
},
scornedmagnamalo: {
tier: "OU",
},
seethingbazelgeuse: {
tier: "OU",
},
snowbaronlagombi: {
tier: "OU",
},
soulseermizutsune: {
tier: "OU",
},
furiousrajang: {
tier: "OU",
},
dreadqueenrathian: {
tier: "OU",
},
dreadkingrathalos: {
tier: "OU",
},
thunderlordzinogre: {
tier: "OU",
},
ragingbrachydios: {
tier: "OU",
},
abyssallagiacrus: {
tier: "OU",
},
crimsonfatalis: {
tier: "OU",
},
whitefatalis: {
tier: "OU",
},
savagedeviljho: {
tier: "OU",
},
plesiothz: {
tier: "OU",
},
risenchameleos: {
tier: "OU",
},
risenteostra: {
tier: "OU",
},
risenkushala: {
tier: "OU",
},
risenshagaru: {
tier: "OU",
},
inagamiz: {
tier: "OU",
},
deadeyegaruga: {
tier: "OU",
},
elderfrostgammoth: {
tier: "OU",
},
grimclawtigrex: {
tier: "OU",
},
};

View File

@ -0,0 +1,483 @@
export const Items: import('../../../sim/dex-items').ModdedItemDataTable = {
boosterenergy: {
inherit: true,
desc: "Activates abilities with Protosynthesis or Quark Drive effects. Single use.",
onUpdate(pokemon) {
if (!this.effectState.started || pokemon.transformed || this.queue.peek(true)?.choice === 'runSwitch') return;
if (!this.field.isWeather('sunnyday')) {
for (const proto of ['protopyre', 'protoneuron', 'prototoxin', 'protolithos', 'protoavian',
'protorefraction', 'protosynthesis']) {
if (pokemon.hasAbility(proto)) {
if (!pokemon.volatiles[proto] /* && !this.field.isWeather('sunnyday') */ && pokemon.useItem()) {
pokemon.addVolatile(proto);
}
return;
}
}
}
if (!this.field.isTerrain('electricterrain')) {
for (const quark of ['quarkdrive', 'jellyfilleddrive', 'winddrive', 'heavydrive', 'jadedrive', 'airdrive',
'magicdrive', 'phantomdrive', 'toxicdrive']) {
if (pokemon.hasAbility(quark)) {
if (!pokemon.volatiles[quark] && pokemon.useItem()) {
pokemon.addVolatile(quark);
}
return;
}
}
}
},
},
frostorb: {
name: "Frost Orb",
gen: 9,
num: 1000,
desc: "At the end of each turn, tries to freeze the holder.",
shortDesc: "At the end of each turn, tries to freeze the holder.",
fling: {
basePower: 30,
status: 'frz',
},
onResidualOrder: 26,
onResidualSubOrder: 2,
onResidual(pokemon) {
pokemon.trySetStatus('frz', pokemon);
},
},
arzurite: {
name: "Arzurite",
gen: 9,
shortDesc: "If held by Arzuros, allows it to transform into Redhelm. (Mega-Evolution)",
megaStone: "Redhelm Arzuros",
megaEvolves: "Arzuros",
itemUser: ["Arzuros", "Redhelm Arzuros"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 585,
},
astalite: {
name: "Astalite",
gen: 9,
shortDesc: "If held by Asatalos, allows it to transform into Boltreaver. (Mega-Evolution)",
megaStone: "Boltreaver Astalos",
megaEvolves: "Astalos",
itemUser: ["Astalos", "Boltreaver Astalos"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 613,
},
bazelnite: {
name: "Bazelnite",
gen: 9,
shortDesc: "If held by Bazelgeuse, allows it to transform into Seething. (Mega-Evolution)",
megaStone: "Seething Bazelgeuse",
megaEvolves: "Bazelgeuse",
itemUser: ["Bazelgeuse", "Seething Bazelgeuse"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 591,
},
bariothite: {
name: "Bariothite",
gen: 9,
shortDesc: "If held by Barioth, allows it to transform into Frostfang. (Mega-Evolution)",
megaStone: "Frostfang Barioth",
megaEvolves: "Barioth",
itemUser: ["Barioth", "Frostfang Barioth"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 685,
},
brachylite: {
name: "Brachylite",
gen: 9,
shortDesc: "If held by Brachydios, allows it to transform into Raging. (Mega-Evolution)",
megaStone: "Raging Brachydios",
megaEvolves: "Brachydios",
itemUser: ["Brachydios", "Raging Brachydios"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 613,
},
devilite: {
name: "Devilite",
gen: 9,
shortDesc: "If held by Deviljho, allows it to transform into Savage. (Mega-Evolution)",
megaStone: "Savage Deviljho",
megaEvolves: "Deviljho",
itemUser: ["Deviljho", "Savage Deviljho"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 584,
},
diablite: {
name: "Diablite",
gen: 9,
shortDesc: "If held by Diablos, allows it to transform into Massacre. (Mega-Evolution)",
megaStone: "Massacre Diablos",
megaEvolves: "Diablos",
itemUser: ["Diablos", "Massacre Diablos"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 589,
},
gammothite: {
name: "Gammothite",
gen: 9,
shortDesc: "If held by Gammoth, allows her to transform into Elderfrost. (Mega-Evolution)",
megaStone: "Elderfrost Gammoth",
megaEvolves: "Gammoth",
itemUser: ["Gammoth", "Elderfrost Gammoth"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 623,
},
garugite: {
name: "Garugite",
gen: 9,
shortDesc: "If held by Yian Garuga, allows it to transform into Deadeye. (Mega-Evolution)",
megaStone: "Deadeye Garuga",
megaEvolves: "Yian Garuga",
itemUser: ["Yian Garuga", "Deadeye Garuga"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 577,
},
harudomerite: {
name: "Harudomerite",
gen: 9,
shortDesc: "If held by Harudomerugu, allows it to enter it's Zenith Form. (Mega-Evolution)",
megaStone: "Harudomerugu-Z",
megaEvolves: "Harudomerugu",
itemUser: ["Harudomerugu", "Harudomerugu-Z"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 578,
},
inagamite: {
name: "Inagamite",
gen: 9,
shortDesc: "If held by Inagami, allows it to enter it's Zenith Form. (Mega-Evolution)",
megaStone: "Inagami-Z",
megaEvolves: "Inagami",
itemUser: ["Inagami", "Inagami-Z"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 613,
},
lagialite: {
name: "Lagialite",
gen: 9,
shortDesc: "If held by Lagiacrus, allows it to transform into Abyssal. (Mega-Evolution)",
megaStone: "Abyssal Lagiacrus",
megaEvolves: "Lagiacrus",
itemUser: ["Lagiacrus", "Abyssal Lagiacrus"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 585,
},
lagombite: {
name: "Lagombite",
gen: 9,
shortDesc: "If held by Lagombi, allows it to transform into Snowbaron. (Mega-Evolution)",
megaStone: "Snowbaron Lagombi",
megaEvolves: "Lagombi",
itemUser: ["Lagombi", "Snowbaron Lagombi"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 583,
},
magnamalite: {
name: "Magnamalite",
gen: 9,
shortDesc: "If held by Magnamalo, allows it to transform into Scorned. (Mega-Evolution)",
megaStone: "Scorned Magnamalo",
megaEvolves: "Magnamalo",
itemUser: ["Magnamalo", "Scorned Magnamalo"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 614,
},
malfestite: {
name: "Malfestite",
gen: 9,
shortDesc: "If held by Malfestio, allows it to transform into Nightcloak. (Mega-Evolution)",
megaStone: "Nightcloak Malfestio",
megaEvolves: "Malfestio",
itemUser: ["Malfestio", "Nightcloak Malfestio"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 577,
},
mizutsunite: {
name: "Mizutsunite",
gen: 9,
shortDesc: "If held by Mizutsune, allows it to transform into Soulseer. (Mega-Evolution)",
megaStone: "Soulseer Mizutsune",
megaEvolves: "Mizutsune",
itemUser: ["Mizutsune", "Soulseer Mizutsune"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 624,
},
narwanite: {
name: "Narwanite",
gen: 9,
shortDesc: "If held by Narwa, allows it to transform into Allmother. (Mega-Evolution)",
megaStone: "Allmother Narwa",
megaEvolves: "Narwa",
itemUser: ["Narwa", "Allmother Narwa"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 596,
},
plesite: {
name: "Plesite",
gen: 9,
shortDesc: "If held by Plesioth, allows it to enter it's Zenith Form. (Mega-Evolution)",
megaStone: "Plesioth-Z",
megaEvolves: "Plesioth",
itemUser: ["Plesioth", "Plesioth-Z"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 621,
},
rajanite: {
name: "Rajanite",
gen: 9,
shortDesc: "If held by Rajang, allows it to transform into Furious. (Mega-Evolution)",
megaStone: "Furious Rajang",
megaEvolves: "Rajang",
itemUser: ["Rajang", "Furious Rajang"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 602,
},
rathalosite: {
name: "Rathalosite",
gen: 9,
shortDesc: "If held by Rathalos, allows it to transform into Dreadking. (Mega-Evolution)",
megaStone: "Dreadking Rathalos",
megaEvolves: "Rathalos",
itemUser: ["Rathalos", "Dreadking Rathalos"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 586,
},
rathianite: {
name: "Rathianite",
gen: 9,
shortDesc: "If held by Rathian, allows it to transform into Dreadqueen. (Mega-Evolution)",
megaStone: "Dreadqueen Rathian",
megaEvolves: "Rathian",
itemUser: ["Rathian", "Dreadqueen Rathian"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 607,
},
risenitec: {
name: "Risenite-C",
gen: 9,
shortDesc: "If held by Chameleos, allows it to enter it's Risen Form. (Mega-Evolution)",
megaStone: "Risen Chameleos",
megaEvolves: "Chameleos",
itemUser: ["Chameleos", "Risen Chameleos"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 590,
},
risenitek: {
name: "Risenite-K",
gen: 9,
shortDesc: "If held by Kushala, allows it to enter it's Risen Form. (Mega-Evolution)",
megaStone: "Risen Kushala",
megaEvolves: "Kushala Daora",
itemUser: ["Kushala Daora", "Risen Kushala"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 590,
},
risenitet: {
name: "Risenite-T",
gen: 9,
shortDesc: "If held by Teostra, allows it to enter it's Risen Form. (Mega-Evolution)",
megaStone: "Risen Teostra",
megaEvolves: "Teostra",
itemUser: ["Teostra", "Risen Teostra"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 590,
},
risenites: {
name: "Risenite-S",
gen: 9,
shortDesc: "If held by Shagaru Magala, allows it to enter it's Risen Form. (Mega-Evolution)",
megaStone: "Risen Shagaru",
megaEvolves: "Shagaru Magala",
itemUser: ["Shagaru Magala", "Risen Shagaru"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 590,
},
tigrexite: {
name: "Tigrexite",
gen: 9,
shortDesc: "If held by Tigrex, allows it to transform into Grimclaw. (Mega-Evolution)",
megaStone: "Grimclaw Tigrex",
megaEvolves: "Tigrex",
itemUser: ["Tigrex", "Grimclaw Tigrex"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 619,
},
zinogrite: {
name: "Zinogrite",
gen: 9,
shortDesc: "If held by Zinogre, allows it to transform into Thunderlord. (Mega-Evolution)",
megaStone: "Thunderlord Zinogre",
megaEvolves: "Zinogre",
itemUser: ["Zinogre", "Thunderlord Zinogre"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 590,
},
kirinite: {
name: "Kirinite",
gen: 9,
shortDesc: "If held by Kirin, allows it to transform into Emperor. (Mega-Evolution)",
megaStone: "Emperor Kirin",
megaEvolves: "Kirin",
itemUser: ["Kirin", "Emperor Kirin"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 602,
},
uragaanite: {
name: "Uragaanite",
gen: 9,
shortDesc: "If held by Uragaan, allows it to transform into Crystalbeard. (Mega-Evolution)",
megaStone: "Crystalbeard Uragaan",
megaEvolves: "Uragaan",
itemUser: ["Uragaan", "Crystalbeard Uragaan"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 663,
},
daimyite: {
name: "Daimyite",
gen: 9,
shortDesc: "If held by Daimyo Hermitaur, allows it to transform into Stonefist. (Mega-Evolution)",
megaStone: "Stonefist Daimyo",
megaEvolves: "Daimyo Hermitaur",
itemUser: ["Daimyo Hermitaur", "Stonefist Daimyo"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 612,
},
glavenite: {
name: "Glavenite",
gen: 9,
shortDesc: "If held by Glavenus, allows it to transform into Hellblade. (Mega-Evolution)",
megaStone: "Hellblade Glavenus",
megaEvolves: "Glavenus",
itemUser: ["Glavenus", "Hellblade Glavenus"],
onTakeItem(item, source) {
if (item.megaEvolves === source.baseSpecies.baseSpecies) return false;
return true;
},
spritenum: 586,
},
/*
Fatalis Orbs
*/
crimsongem: {
name: "Crimson Gem",
gen: 9,
shortDesc: "If held by Fatalis, triggers its Crimson Form in battle. (Primal Reversion)",
itemUser: ["Fatalis", "Crimson-Fatalis"],
onSwitchIn(pokemon) {
if (pokemon.isActive && pokemon.baseSpecies.name === 'Fatalis' && !pokemon.transformed) {
pokemon.formeChange('Crimson-Fatalis', this.effect, true);
}
},
onTakeItem(item, source) {
if (source.baseSpecies.baseSpecies === 'Fatalis') return false;
return true;
},
},
whitegem: {
name: "White Gem",
gen: 9,
shortDesc: "If held by Fatalis, triggers its Crimson Form in battle. (Primal Reversion)",
itemUser: ["Fatalis", "White-Fatalis"],
onSwitchIn(pokemon) {
if (pokemon.isActive && pokemon.baseSpecies.name === 'Fatalis' && !pokemon.transformed) {
pokemon.formeChange('White-Fatalis', this.effect, true);
}
},
onTakeItem(item, source) {
if (source.baseSpecies.baseSpecies === 'Fatalis') return false;
return true;
},
},
};

File diff suppressed because it is too large Load Diff

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,69 @@
export const Rulesets: import('../../../sim/dex-formats').ModdedFormatDataTable = {
statusmod: {
effectType: 'Rule',
name: 'Status Mod',
desc: "Displays Dragonblight as a volatile",
onSwitchIn(pokemon) {
if (pokemon.status === 'dragonblight') {
this.add('-start', pokemon, 'dragonblight', '[silent]');
}
},
onSetStatus(status, target, source, effect) {
if (target.status === 'dragonblight') {
this.add('-start', target, 'dragonblight', '[silent]');
}
},
/* onCureStatus(pokemon, source, effect) {
const cured = effect?.status || pokemon.statusState?.prevStatus;
if (cured === 'dragonblight') {
this.add('-end', pokemon, 'dragonblight', '[silent]');
}
}, */
},
megadatamod: {
effectType: 'Rule',
name: 'Mega Data Mod',
desc: 'Gives data on stats, Ability and types when a Pokémon Mega Evolves or undergoes Ultra Burst.',
onSwitchIn(pokemon) {
if (pokemon.species.forme.startsWith('Mega') || pokemon.species.forme.startsWith('Ultra')) {
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
}
},
onAfterMega(pokemon) {
this.add('-start', pokemon, 'typechange', pokemon.getTypes(true).join('/'), '[silent]');
const species = pokemon.species;
let buf = `<span class="col pokemonnamecol" style="white-space: nowrap">${species.name}</span> `;
buf += `<span class="col typecol">`;
buf += `<img src="https://${Config.routes.client}/sprites/types/${species.types[0]}.png" alt="${species.types[0]}" height="14" width="32">`;
if (species.types[1]) {
buf += `<img src="https://${Config.routes.client}/sprites/types/${species.types[1]}.png" alt="${species.types[1]}" height="14" width="32">`;
}
buf += `</span> `;
buf += `<span style="float: left ; min-height: 26px"><span class="col abilitycol">${species.abilities[0]}</span><span class="col abilitycol"></span></span>`;
const stats = [];
let stat: StatID;
for (stat in species.baseStats) {
const statNames: { [k in StatID]: string } = { hp: "HP", atk: "Atk", def: "Def", spa: "SpA", spd: "SpD", spe: "Spe" };
stats.push(`<span class="col statcol"><em>${statNames[stat]}</em><br>${species.baseStats[stat]}</span>`);
}
buf += `<span style="float: left ; min-height: 26px">${stats.join(' ')}</span>`;
buf += `</span>`;
this.add(`raw|<ul class="utilichart"><li class="result">${buf}</li><li style="clear: both"></li></ul>`);
},
},
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/monsterhunter/sprites/front/${pokemon.species.id}.png" height="96" width="96">`);
this.effectState[pokemon.species.id] = true;
}
},
},
};

View File

@ -0,0 +1,14 @@
export const Scripts: ModdedBattleScriptsData = {
gen: 9,
pokemon: {
ignoringItem() {
return !!(
this.itemState.knockedOff || // Gen 3-4
(this.battle.gen >= 5 && !this.isActive) ||
(!this.getItem().ignoreKlutz && this.hasAbility('klutz')) ||
this.volatiles['embargo'] || this.battle.field.pseudoWeather['magicroom'] ||
this.volatiles['stench']
);
},
},
};

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

@ -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

@ -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

@ -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

@ -662,6 +662,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 +760,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

@ -711,6 +711,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 +819,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

@ -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

@ -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

@ -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;
}

View File

@ -1445,10 +1445,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 +1565,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;
}

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

@ -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;
}

File diff suppressed because it is too large Load Diff

View File

@ -68,7 +68,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 RandomMHSTeams extends RandomTeams {
override cullMovePool(
types: string[],
moves: Set<string>,
@ -621,12 +621,31 @@ 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';
// MHS hardcodes
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,9 +678,9 @@ 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';
}
}
@ -798,7 +817,7 @@ export class RandomSPMTeams extends RandomTeams {
override randomSets: { [species: string]: RandomTeamsTypes.RandomSpeciesData } = require('./random-sets.json');
randomSPMTeam() {
randomMHSTeam() {
this.enforceNoDirectCustomBanlistChanges();
const seed = this.prng.getSeed();
@ -952,4 +971,4 @@ export class RandomSPMTeams extends RandomTeams {
}
}
export default RandomSPMTeams;
export default RandomMHSTeams;

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;

View File

@ -49,7 +49,7 @@ export class Limiter {
function isCommon(message: string) {
message = message.toLowerCase().replace(/\?!\., ;:/g, '');
return ['gg', 'wp', 'ggwp', 'gl', 'hf', 'glhf', 'hello'].includes(message);
return ['gg', 'wp', 'ggwp', 'gl', 'hf', 'glhf', 'hello', 'hi'].includes(message);
}
let throttleTime: number | null = null;
@ -92,7 +92,7 @@ export const PM = new ProcessManager.QueryProcessManager<string, Record<string,
} catch (e: any) {
// eslint-disable-next-line require-atomic-updates
throttleTime = Date.now();
if (e.message.startsWith('Request timeout') || e.statusCode === 429) {
if (e.message.startsWith('Request timeout') || e.statusCode === 429 || e.code === 'ETIMEDOUT') {
// request timeout: just ignore this. error on their end not ours.
// 429: too many requests, we already freeze for 10s above so. not much more we can do
return null;

View File

@ -1586,7 +1586,7 @@ export const commands: Chat.ChatCommands = {
`/statcalc [level] [base stat] [IVs] [nature] [EVs] [modifier] (only base stat is required) - Calculates what the actual stat of a Pokémon is with the given parameters. For example, '/statcalc lv50 100 30iv positive 252ev scarf' calculates the speed of a base 100 scarfer with HP Ice in Battle Spot, and '/statcalc uninvested 90 neutral' calculates the attack of an uninvested Crobat.`,
`!statcalc [level] [base stat] [IVs] [nature] [EVs] [modifier] (only base stat is required) - Shows this information to everyone.`,
`Inputting 'hp' as an argument makes it use the formula for HP. Instead of giving nature, '+' and '-' can be appended to the EV amount (e.g. 252+ev) to signify a boosting or inhibiting nature.`,
`An actual stat can be given in place of a base stat or EVs. In this case, the minumum base stat or EVs necessary to have that real stat with the given parameters will be determined. For example, '/statcalc 502real 252+ +1' calculates the minimum base speed necessary for a positive natured fully invested scarfer to outspeed`,
`An actual stat can be given in place of a base stat or EVs. In this case, the minimum base stat or EVs necessary to have that real stat with the given parameters will be determined. For example, '/statcalc 502real 252+ +1' calculates the minimum base speed necessary for a positive natured fully invested scarfer to outspeed`,
],
/*********************************************************
@ -1720,7 +1720,7 @@ export const commands: Chat.ChatCommands = {
staff(target, room, user) {
if (!this.runBroadcast()) return;
this.sendReplyBox(`<a href="https://www.smogon.com/sim/staff_list">Pok&eacute;mon Showdown Staff List</a>`);
this.sendReplyBox(`<a href="https://www.smogon.com/forums/posts/10715136/">Pok&eacute;mon Showdown Staff List</a>`);
},
staffhelp: [`/staff - View the staff list.`],

View File

@ -2,7 +2,7 @@
* Chat parser
* Pokemon Showdown - http://pokemonshowdown.com/
*
* Parses formate.
* Parses format.
*
* @license MIT
*/
@ -312,7 +312,7 @@ class TextFormatter {
}
return true;
case '[':
// Link span. Several possiblilities:
// Link span. Several possibilities:
// [[text <uri>]] - a link with custom text
// [[search term]] - Google search
// [[wiki: search term]] - Wikipedia search

View File

@ -544,7 +544,7 @@ export const statusfilter: Chat.StatusFilter = (status, user) => {
// Remove false positives.
lcStatus = lcStatus.replace('herapist', '').replace('grape', '').replace('scrape', '');
// Check for blatant staff impersonation attempts. Ideally this could be completely generated from Config.grouplist
// for better support for side servers, but not all ranks are staff ranks or should necessarily be filted.
// for better support for side servers, but not all ranks are staff ranks or should necessarily be filtered.
const impersonationRegex = /\b(?:global|room|upper|senior)?\s*(?:staff|admin|administrator|leader|owner|founder|mod|moderator|driver|voice|operator|sysop|creator)\b/gi;
if (!user.can('lock') && impersonationRegex.test(lcStatus)) return '';

View File

@ -144,7 +144,7 @@ export const commands: Chat.ChatCommands = {
`You can search for info in a specific mod by using <code>mod=[mod name]</code>; e.g. <code>/nds mod=gen9ssb, wonder guard</code>. All valid mod names are: <code>${dexesHelpMods}</code><br/>` +
`You can search for info in a specific rule defined metagame by using <code>rule=[rule name]</code>; e.g. <code>/nds rule=alphabetcupmovelegality, v-create</code>. All supported rule names are: <code>${dexsearchHelpRules}</code><br/>` +
`By default, <code>/dexsearch</code> will search only Pok\u00e9mon obtainable in the current generation. Add the parameter <code>unreleased</code> to include unreleased Pok\u00e9mon. Add the parameter <code>natdex</code> (or use the command <code>/nds</code>) to include all past Pok\u00e9mon.<br/>` +
`Searching for a Pok\u00e9mon with both egg group and type parameters can be differentiated by adding the suffix <code>group</code> onto the egg group parameter; e.g., seaching for <code>grass, grass group</code> will show all Grass types in the Grass egg group.<br/>` +
`Searching for a Pok\u00e9mon with both egg group and type parameters can be differentiated by adding the suffix <code>group</code> onto the egg group parameter; e.g., searching for <code>grass, grass group</code> will show all Grass types in the Grass egg group.<br/>` +
`The parameter <code>monotype</code> will only show Pok\u00e9mon that are single-typed.<br/>` +
`The order of the parameters does not matter.<br/>`
);
@ -860,7 +860,7 @@ function runDexsearch(target: string, cmd: string, message: string, isTest: bool
if (isNotSearch) return { error: "You cannot use the negation symbol '!' with inequality tier searches." };
target = target.substr(4).trim();
if (!target.startsWith('>') && !target.startsWith('<')) {
return { error: "You must use an inequality operator '>' or '<' with performing tier inequality searchs." };
return { error: "You must use an inequality operator '>' or '<' with performing tier inequality searches." };
}
isTierInequalityParam = true;
tierInequalitySearch = true;

View File

@ -223,7 +223,7 @@ export class HelpTicket extends Rooms.SimpleRoomGame {
this.ticket.claimed = user.name;
if (!this.firstClaimTime) {
this.firstClaimTime = Date.now();
// I'd use the player list for this, but it dosen't track DCs so were checking the userlist
// I'd use the player list for this, but it doesn't track DCs so were checking the userlist
// Non-staff users in the room currently (+ the ticket creator even if they are staff)
const users = Object.entries(this.room.users).filter(
u => !((u[1].isStaff && u[1].id !== this.ticket.userid) || !u[1].named)
@ -458,7 +458,7 @@ export class HelpTicket extends Rooms.SimpleRoomGame {
this.room.destroy();
}
// Modified version of RoomGame.destory
// Modified version of RoomGame.destroy
override destroy() {
if (tickets[this.ticket.userid] && this.ticket.open) {
// Ticket was not deleted - deleted tickets already have this done to them - and was not closed.

View File

@ -3489,7 +3489,7 @@ export const commands: Chat.ChatCommands = {
`/mafia sub in - Request to sub into the game, or cancel a request to sub out.`,
`/mafia sub out - Request to sub out of the game, or cancel a request to sub in.`,
`/mafia sub next, [player] - Forcibly sub [player] out of the game. Requires host % @ # ~`,
`/mafia sub remove, [user] - Remove [user] from the sublist. Requres host % @ # ~`,
`/mafia sub remove, [user] - Remove [user] from the sublist. Requires host % @ # ~`,
`/mafia sub unrequest, [player] - Remove's a player's request to sub out of the game. Requires host % @ # ~`,
`/mafia sub [player], [user] - Forcibly sub [player] for [user]. Requires host % @ # ~`,
],
@ -4353,16 +4353,16 @@ export const commands: Chat.ChatCommands = {
}
},
listdatahelp: [
`/mafia roles [parameter, paramater, ...] - Views all Mafia roles. Parameters: theme that must include role, text included in role data.`,
`/mafia themes [parameter, paramater, ...] - Views all Mafia themes. Parameters: roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia alignments [parameter, paramater, ...] - Views all Mafia alignments. Parameters: text included in alignment data.`,
`/mafia ideas [parameter, paramater, ...] - Views all Mafia IDEAs. Parameters: roles in IDEA, text included in IDEA data.`,
`/mafia terms [parameter, paramater, ...] - Views all Mafia terms. Parameters: text included in term data.`,
`/mafia randomrole [parameter, paramater, ...] - View a random Mafia role. Parameters: number of roles to be randomly generated, theme that must include role, text included in role data.`,
`/mafia randomtheme [parameter, paramater, ...] - View a random Mafia theme. Parameters: number of themes to be randomly generated, roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia randomalignment [parameter, paramater, ...] - View a random Mafia alignment. Parameters: number of alignments to be randomly generated, text included in alignment data.`,
`/mafia randomidea [parameter, paramater, ...] - View a random Mafia IDEA. Parameters: number of IDEAs to be randomly generated, roles in IDEA, text included in IDEA data.`,
`/mafia randomterm [parameter, paramater, ...] - View a random Mafia term. Parameters: number of terms to be randomly generated, text included in term data.`,
`/mafia roles [parameter, parameter, ...] - Views all Mafia roles. Parameters: theme that must include role, text included in role data.`,
`/mafia themes [parameter, parameter, ...] - Views all Mafia themes. Parameters: roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia alignments [parameter, parameter, ...] - Views all Mafia alignments. Parameters: text included in alignment data.`,
`/mafia ideas [parameter, parameter, ...] - Views all Mafia IDEAs. Parameters: roles in IDEA, text included in IDEA data.`,
`/mafia terms [parameter, parameter, ...] - Views all Mafia terms. Parameters: text included in term data.`,
`/mafia randomrole [parameter, parameter, ...] - View a random Mafia role. Parameters: number of roles to be randomly generated, theme that must include role, text included in role data.`,
`/mafia randomtheme [parameter, parameter, ...] - View a random Mafia theme. Parameters: number of themes to be randomly generated, roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia randomalignment [parameter, parameter, ...] - View a random Mafia alignment. Parameters: number of alignments to be randomly generated, text included in alignment data.`,
`/mafia randomidea [parameter, parameter, ...] - View a random Mafia IDEA. Parameters: number of IDEAs to be randomly generated, roles in IDEA, text included in IDEA data.`,
`/mafia randomterm [parameter, parameter, ...] - View a random Mafia term. Parameters: number of terms to be randomly generated, text included in term data.`,
],
disable(target, room, user) {
@ -4500,16 +4500,16 @@ export const commands: Chat.ChatCommands = {
buf += [
`<br/><strong>Commands to search Mafia data</strong>:<br/>`,
`/mafia dt [data] - Views Mafia data.`,
`/mafia roles [parameter, paramater, ...] - Views all Mafia roles. Parameters: theme that must include role, text included in role data.`,
`/mafia themes [parameter, paramater, ...] - Views all Mafia themes. Parameters: roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia alignments [parameter, paramater, ...] - Views all Mafia alignments. Parameters: text included in alignment data.`,
`/mafia ideas [parameter, paramater, ...] - Views all Mafia IDEAs. Parameters: roles in IDEA, text included in IDEA data.`,
`/mafia terms [parameter, paramater, ...] - Views all Mafia terms. Parameters: text included in term data.`,
`/mafia randomrole [parameter, paramater, ...] - View a random Mafia role. Parameters: number of roles to be randomly generated, theme that must include role, text included in role data.`,
`/mafia randomtheme [parameter, paramater, ...] - View a random Mafia theme. Parameters: number of themes to be randomly generated, roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia randomalignment [parameter, paramater, ...] - View a random Mafia alignment. Parameters: number of alignments to be randomly generated, text included in alignment data.`,
`/mafia randomidea [parameter, paramater, ...] - View a random Mafia IDEA. Parameters: number of IDEAs to be randomly generated, roles in IDEA, text included in IDEA data.`,
`/mafia randomterm [parameter, paramater, ...] - View a random Mafia term. Parameters: number of terms to be randomly generated, text included in term data.`,
`/mafia roles [parameter, parameter, ...] - Views all Mafia roles. Parameters: theme that must include role, text included in role data.`,
`/mafia themes [parameter, parameter, ...] - Views all Mafia themes. Parameters: roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia alignments [parameter, parameter, ...] - Views all Mafia alignments. Parameters: text included in alignment data.`,
`/mafia ideas [parameter, parameter, ...] - Views all Mafia IDEAs. Parameters: roles in IDEA, text included in IDEA data.`,
`/mafia terms [parameter, parameter, ...] - Views all Mafia terms. Parameters: text included in term data.`,
`/mafia randomrole [parameter, parameter, ...] - View a random Mafia role. Parameters: number of roles to be randomly generated, theme that must include role, text included in role data.`,
`/mafia randomtheme [parameter, parameter, ...] - View a random Mafia theme. Parameters: number of themes to be randomly generated, roles in theme, players(< | <= | = | => | >)[x] for playercounts, text included in theme data.`,
`/mafia randomalignment [parameter, parameter, ...] - View a random Mafia alignment. Parameters: number of alignments to be randomly generated, text included in alignment data.`,
`/mafia randomidea [parameter, parameter, ...] - View a random Mafia IDEA. Parameters: number of IDEAs to be randomly generated, roles in IDEA, text included in IDEA data.`,
`/mafia randomterm [parameter, parameter, ...] - View a random Mafia term. Parameters: number of terms to be randomly generated, text included in term data.`,
].join('<br/>');
buf += `</details>`;

View File

@ -13,6 +13,7 @@ interface StoneDeltas {
weighthg: number;
heightm: number;
type?: string;
primaryTypeChange?: boolean;
}
type TierShiftTiers = 'UU' | 'RUBL' | 'RU' | 'NUBL' | 'NU' | 'PUBL' | 'PU' | 'ZUBL' | 'ZU' | 'NFE' | 'LC';
@ -130,8 +131,8 @@ export const commands: Chat.ChatCommands = {
megaSpecies = dex.species.get(forcedForme);
baseSpecies = dex.species.get(forcedForme.split('-')[0]);
} else {
megaSpecies = dex.species.get(stone.megaStone);
baseSpecies = dex.species.get(stone.megaEvolves);
megaSpecies = dex.species.get(Array.isArray(stone.megaStone) ? stone.megaStone[0] : stone.megaStone);
baseSpecies = dex.species.get(Array.isArray(stone.megaEvolves) ? stone.megaEvolves[0] : stone.megaEvolves);
}
break;
}
@ -153,10 +154,13 @@ export const commands: Chat.ChatCommands = {
deltas.type = dex.gen === 8 ? 'mono' : baseSpecies.types[0];
} else if (megaSpecies.types[1] !== baseSpecies.types[1]) {
deltas.type = megaSpecies.types[1];
} else if (megaSpecies.types[0] !== baseSpecies.types[0]) {
deltas.type = megaSpecies.types[0];
deltas.primaryTypeChange = true;
}
const mixedSpecies = Utils.deepClone(species);
mixedSpecies.abilities = Utils.deepClone(megaSpecies.abilities);
if (['Arceus', 'Silvally'].includes(baseSpecies.name)) {
if (['Arceus', 'Silvally'].includes(baseSpecies.name) || deltas.primaryTypeChange) {
const secondType = mixedSpecies.types[1];
mixedSpecies.types = [deltas.type];
if (secondType && secondType !== deltas.type) mixedSpecies.types.push(secondType);
@ -230,21 +234,21 @@ export const commands: Chat.ChatCommands = {
const stones = [];
if (!stone) {
const formeIdRegex = new RegExp(
`(?:mega[xy]?|primal|origin|crowned|epilogue|cornerstone|wellspring|hearthflame|douse|shock|chill|burn|${dex.types.all().map(x => x.id).filter(x => x !== 'normal').join('|')})$`
`(?:mega[xyz]?|primal|origin|crowned|epilogue|cornerstone|wellspring|hearthflame|douse|shock|chill|burn|${dex.types.all().map(x => x.id).filter(x => x !== 'normal').join('|')})$`
);
const species = dex.species.get(targetid.replace(formeIdRegex, ''));
if (!species.exists) throw new Chat.ErrorMessage(`Error: Mega Stone not found.`);
if (!species.otherFormes) throw new Chat.ErrorMessage(`Error: Mega Evolution not found.`);
for (const poke of species.otherFormes) {
const formeRegex = new RegExp(
`(?:-Douse|-Shock|-Chill|-Burn|-Cornerstone|-Wellspring|-Hearthflame|-Crowned|-Epilogue|-Origin|-Primal|-Mega(?:-[XY])?|${dex.types.names().filter(x => x !== 'Normal').map(x => '-' + x).join('|')})$`
`(?:-Douse|-Shock|-Chill|-Burn|-Cornerstone|-Wellspring|-Hearthflame|-Crowned|-Epilogue|-Origin|-Primal|-Mega(?:-[XYZ])?|${dex.types.names().filter(x => x !== 'Normal').map(x => '-' + x).join('|')})$`
);
if (!formeRegex.test(poke)) {
continue;
}
const megaPoke = dex.species.get(poke);
const flag = megaPoke.requiredMove === 'Dragon Ascent' ? megaPoke.requiredMove : megaPoke.requiredItem;
if (/mega[xy]$/.test(targetid) && toID(megaPoke.name) !== toID(dex.species.get(targetid))) continue;
if (/mega[xyz]$/.test(targetid) && toID(megaPoke.name) !== toID(dex.species.get(targetid))) continue;
if (!flag) continue;
stones.push(getMegaStone(flag, sep[1]));
}
@ -278,8 +282,8 @@ export const commands: Chat.ChatCommands = {
megaSpecies = dex.species.get(forcedForme);
baseSpecies = dex.species.get(forcedForme.split('-')[0]);
} else {
megaSpecies = dex.species.get(aStone.megaStone);
baseSpecies = dex.species.get(aStone.megaEvolves);
megaSpecies = dex.species.get(Array.isArray(aStone.megaStone) ? aStone.megaStone[0] : aStone.megaStone);
baseSpecies = dex.species.get(Array.isArray(aStone.megaEvolves) ? aStone.megaEvolves[0] : aStone.megaEvolves);
}
break;
}
@ -301,6 +305,8 @@ export const commands: Chat.ChatCommands = {
deltas.type = dex.gen === 8 ? 'mono' : megaSpecies.types[0];
} else if (megaSpecies.types[1] !== baseSpecies.types[1]) {
deltas.type = megaSpecies.types[1];
} else if (megaSpecies.types[0] !== baseSpecies.types[0]) {
deltas.type = megaSpecies.types[0];
}
const details = {
Gen: aStone.gen,

View File

@ -690,7 +690,7 @@ export const pages: Chat.PageTable = {
return buf;
}
for (const [i, poll] of queue.entries()) {
const number = i + 1; // for translation convienence
const number = i + 1; // for translation convenience
const button = (
`<strong>${this.tr`#${number} in queue`} </strong>` +
`<button class="button" name="send" value="/msgroom ${room.roomid},/poll deletequeue ${i + 1}">` +

View File

@ -372,8 +372,9 @@ class SSBSetsHTML extends Chat.JSX.Component<{ target: string }> {
<SSBAbilityHTML set={set} dex={dex} baseDex={baseDex} />
<SSBInnateHTML name={setName} dex={dex} baseDex={baseDex} />
<SSBPokemonHTML species={set.species} dex={dex} baseDex={baseDex} />
{(!Array.isArray(set.item) && item.megaStone) &&
<SSBPokemonHTML species={item.megaStone} dex={dex} baseDex={baseDex} />}
{(!Array.isArray(set.item) && item.megaStone) && <SSBPokemonHTML
species={Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone} dex={dex} baseDex={baseDex}
/>}
{/* keys and Kennedy have an itemless forme change */}
{['Rayquaza'].includes(set.species) && <SSBPokemonHTML species={`${set.species}-Mega`} dex={dex} baseDex={baseDex} />}
{['Cinderace'].includes(set.species) && <SSBPokemonHTML species={`${set.species}-Gmax`} dex={dex} baseDex={baseDex} />}

View File

@ -134,7 +134,7 @@ export function getSpeciesName(set: PokemonSet, format: Format) {
} else if (species === "Groudon" && item.name === "Red Orb") {
return "Groudon-Primal";
} else if (item.megaStone) {
return item.megaStone;
return Array.isArray(item.megaStone) ? item.megaStone[0] : item.megaStone;
} else if (species === "Rayquaza" && moves.includes('Dragon Ascent') && !item.zMove && megaRayquazaPossible) {
return "Rayquaza-Mega";
} else if (species === "Poltchageist-Artisan") { // Babymons from here on out

View File

@ -69,7 +69,7 @@ export const commands: Chat.ChatCommands = {
target = target.trim();
const input = this.filter(target);
if (target !== input) throw new Chat.ErrorMessage("You are not allowed to use fitered words in roomfaq entries.");
if (target !== input) throw new Chat.ErrorMessage("You are not allowed to use filtered words in roomfaq entries.");
let [topic, ...rest] = input.split(',');
topic = toID(topic);

View File

@ -1520,7 +1520,7 @@ const ScavengerCommands: Chat.ChatCommands = {
const minutes = (toID(target) === 'off' ? 0 : parseFloat(target));
if (isNaN(minutes) || minutes < 0 || (minutes * 60 * 1000) > Chat.MAX_TIMEOUT_DURATION) {
throw new Chat.ErrorMessage(`You must specify a timer length that is a postive number.`);
throw new Chat.ErrorMessage(`You must specify a timer length that is a positive number.`);
}
const result = game.setTimer(minutes);
@ -2057,7 +2057,7 @@ const ScavengerCommands: Chat.ChatCommands = {
if (!RATED_TYPES.includes(gameType)) throw new Chat.ErrorMessage(`You cannot set blitz points for ${gameType} hunts.`);
if (isNaN(blitzPoints) || blitzPoints < 0 || blitzPoints > 1000) {
throw new Chat.ErrorMessage("The points value awarded for blitz must be an integer bewteen 0 and 1000.");
throw new Chat.ErrorMessage("The points value awarded for blitz must be an integer between 0 and 1000.");
}
if (!room.settings.scavSettings.blitzPoints) room.settings.scavSettings.blitzPoints = {};
room.settings.scavSettings.blitzPoints[gameType] = blitzPoints;
@ -2092,7 +2092,7 @@ const ScavengerCommands: Chat.ChatCommands = {
return this.sendReply(`The points rewarded for hosting a regular hunt is ${pointSetting}.`);
}
this.checkCan('declare', null, room); // perms for editting
this.checkCan('declare', null, room); // perms for editing
const points = parseInt(target);
if (isNaN(points)) throw new Chat.ErrorMessage(`${target} is not a valid number of points.`);
@ -2133,7 +2133,7 @@ const ScavengerCommands: Chat.ChatCommands = {
return this.sendReplyBox(`The points rewarded for winning hunts is:<br />${points.join('<br />')}`);
}
this.checkCan('declare', null, room); // perms for editting
this.checkCan('declare', null, room); // perms for editing
let [type, ...pointsSet] = target.split(',');
type = toID(type) as GameTypes;

View File

@ -2,6 +2,8 @@ import { FS, Utils } from '../../lib';
import { YouTube } from './youtube';
const MINUTE = 60 * 1000;
const DAY = 24 * 60 * MINUTE;
const WEEK = DAY * 7;
const PRENOM_BUMP_TIME = 2 * 60 * MINUTE;
const PRENOMS_FILE = 'config/chat-plugins/otd-prenoms.json';
@ -63,6 +65,7 @@ class OtdHandler {
removedNominations: Map<string, AnyObject>;
voting: boolean;
timer: NodeJS.Timeout | null;
autoStartTimer: NodeJS.Timeout | null;
keys: string[];
keyLabels: string[];
timeLabel: string;
@ -81,6 +84,7 @@ class OtdHandler {
this.voting = false;
this.timer = null;
this.autoStartTimer = null;
this.keys = settings.keys;
this.keyLabels = settings.keyLabels;
@ -105,6 +109,7 @@ class OtdHandler {
needsSave = true;
}
}
if (room.settings.autoStartOtd) handler.toggleAutoStartTimer(true);
if (needsSave) handler.save();
return handler;
}
@ -142,6 +147,22 @@ class OtdHandler {
}
}
toggleAutoStartTimer(on: boolean) {
if (on && !this.autoStartTimer) {
this.autoStartTimer = setInterval(() => {
if (this.voting) {
// in case the 20 min auto-end timer didnt end the nomm process due to 0 nomms
this.rollWinner();
}
this.startVote();
this.room.modlog({ action: `${this.id.toUpperCase()} START` });
}, this.timeLabel === 'week' ? WEEK : DAY);
} else if (!on && this.autoStartTimer) {
clearInterval(this.autoStartTimer);
this.autoStartTimer = null;
}
}
startVote() {
this.voting = true;
this.timer = setTimeout(() => this.rollWinner(), 20 * MINUTE);
@ -740,6 +761,35 @@ export const otdCommands: Chat.ChatCommands = {
`Requires: % @ # ~`,
],
toggleautostart(target, room, user) {
const otd = selectHandler(this.message);
room = this.requireRoom(otd.room.roomid);
this.checkCan('declare', null, room);
let logMessage = '';
const handler = selectHandler(this.message);
if (this.meansYes(target)) {
if (room.settings.autoStartOtd) {
throw new Chat.ErrorMessage(`This -OTD is already set to automatically start.`);
}
room.settings.autoStartOtd = true;
handler.toggleAutoStartTimer(true);
logMessage = 'start automatically';
} else {
if (!room.settings.autoStartOtd) {
throw new Chat.ErrorMessage(`This -OTD is not set to automatically start.`);
}
room.settings.autoStartOtd = false;
logMessage = 'not start automatically';
handler.toggleAutoStartTimer(false);
}
this.privateModAction(`${user.name} set the ${otd.name} nomination to ${logMessage}`);
this.modlog(`OTD TOGGLEAUTOSTART`, null, logMessage);
room.saveSettings();
},
toggleupdate(target, room, user) {
const otd = selectHandler(this.message);
room = this.requireRoom(otd.room.roomid);
@ -908,6 +958,7 @@ const otdHelp = [
`- /-otd set property: value[, property: value] - Set the winner, quote, song, link or image for the current Thing of the Day. Requires: % @ # ~`,
`- /-otd winners - Displays a list of previous things of the day.`,
`- /-otd toggleupdate [on|off] - Changes the Thing of the Day to display on nomination ([on] to update, [off] to turn off updates). Requires: # ~`,
`- /-otd toggleautostart [on|off] - Enables or disables automatic start for Thing of the Day ([on] enables autostart, [off] disables it). Requires: # ~`,
];
for (const otd in otdData) {
@ -929,6 +980,15 @@ for (const [k, v] of otds) {
commands[`${k}help`] = otdHelp;
}
const getKeyByRoomId = (id: string): string | undefined => {
for (const [key, handler] of otds.entries()) {
if (handler.room.roomid === id) {
return key;
}
}
return undefined;
};
export const handlers: Chat.Handlers = {
onRenameRoom(oldID, newID, room) {
for (const otd in otdData) {
@ -950,3 +1010,14 @@ export const punishmentfilter: Chat.PunishmentFilter = (user, punishment) => {
handler.removeNomination(user);
}
};
export const roomSettings: Chat.SettingsHandler[] = [
(room, user) => ({
label: `Autostart -OTD`,
permission: "editroom",
options: getKeyByRoomId(room.roomid) ? [
['off', !room.settings.autoStartOtd || `${getKeyByRoomId(room.roomid)} toggleautostart off`],
['on', room.settings.autoStartOtd || `${getKeyByRoomId(room.roomid)} toggleautostart on`],
] : [['disabled', true]],
}),
];

View File

@ -871,7 +871,7 @@ export const commands: Chat.ChatCommands = {
game.suppressMessages = state;
this.addModAction(`${user.name} has turned ${state ? 'on' : 'off'} suppression of UNO game messages.`);
this.modlog('UNO SUPRESS', null, (state ? 'ON' : 'OFF'));
this.modlog('UNO SUPPRESS', null, (state ? 'ON' : 'OFF'));
},
spectate(target, room, user) {

View File

@ -220,7 +220,7 @@ export const pages: Chat.PageTable = {
const sorted: { [k: string]: number } = {};
for (const curUser of Users.users.values()) {
for (const term of nameList) {
if (curUser.id.includes(term)) {
if (curUser.id.includes(term) && !curUser.id.startsWith('guest')) {
if (!(term in sorted)) sorted[term] = 0;
sorted[term]++;
}

View File

@ -164,7 +164,7 @@ export const readyPromise = cleanupStale().then(() => {
process.on('unhandledRejection', err => {
// TODO:
// - Compability with https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
// - Compatibility with https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
// - Crashlogger API for reporting rejections vs exceptions
Monitor.crashlog(err as any, 'A main process Promise');
});

View File

@ -125,6 +125,8 @@ export interface RoomSettings {
minorActivityQueue?: MinorActivityData[];
repeats?: RepeatedPhrase[];
topics?: string[];
// auto start thing of the day
autoStartOtd?: boolean;
autoModchat?: {
rank: GroupSymbol,
time: number,
@ -1248,7 +1250,7 @@ export class GlobalRoomState {
if (settings.isPrivate === true) settings.isPrivate = 'hidden';
}
// We're okay with assinging type `ID` to `RoomID` here
// We're okay with assigning type `ID` to `RoomID` here
// because the hyphens in chatrooms don't have any special
// meaning, unlike in helptickets, groupchats, battles etc
// where they are used for shared modlogs and the like
@ -1814,7 +1816,7 @@ export class GlobalRoomState {
} else {
this.notifyRooms(
notifyPlaces,
`|html|<div class="broadcsat-red"><b>Automatic server lockdown kill canceled.</b><br /><br />In the last final seconds, the automatic lockdown was manually disabled.</div>`
`|html|<div class="broadcast-red"><b>Automatic server lockdown kill canceled.</b><br /><br />In the last final seconds, the automatic lockdown was manually disabled.</div>`
);
}
}, 10 * 1000);
@ -2074,7 +2076,7 @@ export class GameRoom extends BasicRoom {
battle.replaySaved = true;
}
// If we have a direct connetion to a Replays database, just upload the replay
// If we have a direct connection to a Replays database, just upload the replay
// directly.
if (Replays.db) {
@ -2085,7 +2087,7 @@ export class GameRoom extends BasicRoom {
log,
players: battle.players.map(p => p.name),
format: format.name,
rating: rating || null,
rating: Math.round(rating || 0) || null,
private: hidden,
password,
inputlog: battle.inputLog?.join('\n') || null,

View File

@ -610,7 +610,7 @@ export class User extends Chat.MessageContext {
* Permission check for using the dev console
*
* The `console` permission is incredibly powerful because it allows the
* execution of abitrary shell commands on the local computer As such, it
* execution of arbitrary shell commands on the local computer As such, it
* can only be used from a specified whitelist of IPs and userids. A
* special permission check function is required to carry out this check
* because we need to know which socket the client is connected from in

View File

@ -1873,10 +1873,16 @@ export class BattleActions {
}
// Temporary hardcode until generation shift
if ((species.baseSpecies === "Floette" || species.baseSpecies === "Zygarde") && item.megaEvolves === species.name) {
return item.megaStone;
return item.megaStone as string;
}
// 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) {
if (Array.isArray(item.megaStone)) {
// FIXME: Change to species.name when champions comes
const index = (item.megaEvolves as string[]).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 && item.megaStone !== species.name) {
return item.megaStone;
}
return null;

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