mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-24 15:00:11 -05:00
Add October 2025 OMotM and fix Flower Veil
This commit is contained in:
parent
45e4f2e882
commit
05aa26d108
|
|
@ -513,6 +513,73 @@ export const Formats: import('../sim/dex-formats').FormatList = [
|
|||
section: "OM of the Month",
|
||||
column: 2,
|
||||
},
|
||||
{
|
||||
name: "[Gen 9] Pokebilities",
|
||||
desc: `Pokémon have all of their released abilities simultaneously.`,
|
||||
mod: 'pokebilities',
|
||||
// searchShow: false,
|
||||
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
||||
banlist: [
|
||||
'Arceus', 'Annihilape', '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', 'Groudon',
|
||||
'Ho-Oh', 'Iron Bundle', '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',
|
||||
'Shaymin-Sky', 'Smeargle', 'Sneasler', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned',
|
||||
'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', 'Last Respects',
|
||||
],
|
||||
onValidateSet(set) {
|
||||
const species = this.dex.species.get(set.species);
|
||||
const unSeenAbilities = Object.keys(species.abilities)
|
||||
.filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
|
||||
.map(key => species.abilities[key as "0" | "1" | "H" | "S"])
|
||||
.filter(ability => ability !== set.ability);
|
||||
if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
|
||||
for (const abilityName of unSeenAbilities) {
|
||||
const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
|
||||
if (banReason) {
|
||||
return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onBegin() {
|
||||
for (const pokemon of this.getAllPokemon()) {
|
||||
if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
|
||||
continue;
|
||||
}
|
||||
pokemon.m.innates = Object.keys(pokemon.species.abilities)
|
||||
.filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
|
||||
.map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
|
||||
.filter(ability => ability !== pokemon.ability);
|
||||
}
|
||||
},
|
||||
onBeforeSwitchIn(pokemon) {
|
||||
if (pokemon.m.innates) {
|
||||
for (const innate of pokemon.m.innates) {
|
||||
if (pokemon.hasAbility(innate)) continue;
|
||||
const effect = 'ability:' + this.toID(innate);
|
||||
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
||||
}
|
||||
}
|
||||
},
|
||||
onSwitchOut(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
pokemon.removeVolatile(innate);
|
||||
}
|
||||
},
|
||||
onFaint(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
const innateEffect = this.dex.conditions.get(innate) as Effect;
|
||||
this.singleEvent('End', innateEffect, null, pokemon);
|
||||
}
|
||||
},
|
||||
onAfterMega(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
pokemon.removeVolatile(innate);
|
||||
}
|
||||
pokemon.m.innates = undefined;
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "[Gen 9] Tera Override",
|
||||
desc: `Any moves/items/abilities with mechanics relating to a specific type get that type replaced with the user's Tera type.`,
|
||||
|
|
@ -1651,73 +1718,6 @@ export const Formats: import('../sim/dex-formats').FormatList = [
|
|||
'Speed Boost', 'Heat Rock', 'King\'s Rock', 'Razor Fang', 'Quick Claw', 'Baton Pass', 'Last Respects', 'Shed Tail',
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "[Gen 9] Pokebilities",
|
||||
desc: `Pokémon have all of their released abilities simultaneously.`,
|
||||
mod: 'pokebilities',
|
||||
searchShow: false,
|
||||
ruleset: ['Standard OMs', 'Sleep Moves Clause'],
|
||||
banlist: [
|
||||
'Arceus', 'Annihilape', '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', 'Groudon',
|
||||
'Ho-Oh', 'Iron Bundle', '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',
|
||||
'Shaymin-Sky', 'Smeargle', 'Sneasler', 'Solgaleo', 'Spectrier', 'Terapagos', 'Ursaluna-Bloodmoon', 'Urshifu-Single-Strike', 'Zacian', 'Zacian-Crowned',
|
||||
'Zamazenta-Crowned', 'Zekrom', 'Arena Trap', 'Moody', 'Shadow Tag', 'King\'s Rock', 'Razor Fang', 'Baton Pass', 'Shed Tail', 'Last Respects',
|
||||
],
|
||||
onValidateSet(set) {
|
||||
const species = this.dex.species.get(set.species);
|
||||
const unSeenAbilities = Object.keys(species.abilities)
|
||||
.filter(key => key !== 'S' && (key !== 'H' || !species.unreleasedHidden))
|
||||
.map(key => species.abilities[key as "0" | "1" | "H" | "S"])
|
||||
.filter(ability => ability !== set.ability);
|
||||
if (unSeenAbilities.length && this.toID(set.ability) !== this.toID(species.abilities['S'])) {
|
||||
for (const abilityName of unSeenAbilities) {
|
||||
const banReason = this.ruleTable.check('ability:' + this.toID(abilityName));
|
||||
if (banReason) {
|
||||
return [`${set.name}'s ability ${abilityName} is ${banReason}.`];
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
onBegin() {
|
||||
for (const pokemon of this.getAllPokemon()) {
|
||||
if (pokemon.ability === this.toID(pokemon.species.abilities['S'])) {
|
||||
continue;
|
||||
}
|
||||
pokemon.m.innates = Object.keys(pokemon.species.abilities)
|
||||
.filter(key => key !== 'S' && (key !== 'H' || !pokemon.species.unreleasedHidden))
|
||||
.map(key => this.toID(pokemon.species.abilities[key as "0" | "1" | "H" | "S"]))
|
||||
.filter(ability => ability !== pokemon.ability);
|
||||
}
|
||||
},
|
||||
onBeforeSwitchIn(pokemon) {
|
||||
if (pokemon.m.innates) {
|
||||
for (const innate of pokemon.m.innates) {
|
||||
if (pokemon.hasAbility(innate)) continue;
|
||||
const effect = 'ability:' + this.toID(innate);
|
||||
pokemon.volatiles[effect] = this.initEffectState({ id: effect, target: pokemon });
|
||||
}
|
||||
}
|
||||
},
|
||||
onSwitchOut(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
pokemon.removeVolatile(innate);
|
||||
}
|
||||
},
|
||||
onFaint(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
const innateEffect = this.dex.conditions.get(innate) as Effect;
|
||||
this.singleEvent('End', innateEffect, null, pokemon);
|
||||
}
|
||||
},
|
||||
onAfterMega(pokemon) {
|
||||
for (const innate of Object.keys(pokemon.volatiles).filter(i => i.startsWith('ability:'))) {
|
||||
pokemon.removeVolatile(innate);
|
||||
}
|
||||
pokemon.m.innates = undefined;
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "[Gen 9] Pokemoves",
|
||||
desc: `Put a Pokémon's name in a moveslot to turn them into a move. The move has 8 PP, 100% accuracy, and a category and Base Power matching their highest attacking stat. Use /pokemove for more info.`,
|
||||
|
|
|
|||
|
|
@ -1361,7 +1361,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
},
|
||||
flowerveil: {
|
||||
onAllyTryBoost(boost, target, source, effect) {
|
||||
if ((source && target === source) || !target.hasType('Grass')) return;
|
||||
if (!target.hasType('Grass')) return;
|
||||
let showMsg = false;
|
||||
let i: BoostID;
|
||||
for (i in boost) {
|
||||
|
|
@ -1376,7 +1376,7 @@ export const Abilities: import('../sim/dex-abilities').AbilityDataTable = {
|
|||
}
|
||||
},
|
||||
onAllySetStatus(status, target, source, effect) {
|
||||
if (target.hasType('Grass') && source && target !== source && effect && effect.id !== 'yawn') {
|
||||
if (target.hasType('Grass') && effect?.id !== 'yawn') {
|
||||
this.debug('interrupting setStatus with Flower Veil');
|
||||
if (effect.name === 'Synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) {
|
||||
const effectHolder = this.effectState.target;
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ export const Aliases: import('../sim/dex').AliasesTable = {
|
|||
gen6ag: "[Gen 6] Anything Goes",
|
||||
crossevo: "[Gen 9] Cross Evolution",
|
||||
mayhem: "[Gen 9] Random Battle Mayhem",
|
||||
// omotm: "[Gen 9] Bad 'n Boosted",
|
||||
omotm: "[Gen 9] Pokebilities",
|
||||
lcotm: "[Gen 9] Tera Override",
|
||||
|
||||
// mega evos --- 1st ordered alphabetically by species, 2nd by alias
|
||||
|
|
|
|||
|
|
@ -124,23 +124,8 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa
|
|||
},
|
||||
flowerveil: {
|
||||
inherit: true,
|
||||
onAllyTryBoost(boost, target, source, effect) {
|
||||
if ((source && target === source) || !target.hasType(target.teraType)) return;
|
||||
let showMsg = false;
|
||||
let i: BoostID;
|
||||
for (i in boost) {
|
||||
if (boost[i]! < 0) {
|
||||
delete boost[i];
|
||||
showMsg = true;
|
||||
}
|
||||
}
|
||||
if (showMsg && !(effect as ActiveMove).secondaries) {
|
||||
const effectHolder = this.effectState.target;
|
||||
this.add('-block', target, 'ability: Flower Veil', `[of] ${effectHolder}`);
|
||||
}
|
||||
},
|
||||
onAllySetStatus(status, target, source, effect) {
|
||||
if (target.hasType(source.teraType) && source && target !== source && effect && effect.id !== 'yawn') {
|
||||
if (source && target.hasType(source.teraType) && effect && effect.id !== 'yawn') {
|
||||
this.debug('interrupting setStatus with Flower Veil');
|
||||
if (effect.name === 'Synchronize' || (effect.effectType === 'Move' && !effect.secondaries)) {
|
||||
const effectHolder = this.effectState.target;
|
||||
|
|
@ -150,7 +135,7 @@ export const Abilities: import('../../../sim/dex-abilities').ModdedAbilityDataTa
|
|||
}
|
||||
},
|
||||
onAllyTryAddVolatile(status, target, source) {
|
||||
if (target.hasType(source.teraType) && status.id === 'yawn') {
|
||||
if (source && target.hasType(source.teraType) && status.id === 'yawn') {
|
||||
this.debug('Flower Veil blocking yawn');
|
||||
const effectHolder = this.effectState.target;
|
||||
this.add('-block', target, 'ability: Flower Veil', `[of] ${effectHolder}`);
|
||||
|
|
|
|||
|
|
@ -54,11 +54,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa
|
|||
if (defender.hasItem('utilityumbrella')) return;
|
||||
if (move.type === this.effectState.source.teraType) {
|
||||
this.debug('rain water boost');
|
||||
return this.chainModify(1.5);
|
||||
}
|
||||
if (move.type === 'Fire') {
|
||||
this.debug('rain fire suppress');
|
||||
return this.chainModify(0.5);
|
||||
return this.chainModify(0.75);
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
@ -72,11 +68,7 @@ export const Conditions: import('../../../sim/dex-conditions').ModdedConditionDa
|
|||
if (defender.hasItem('utilityumbrella')) return;
|
||||
if (move.type === this.effectState.source.teraType) {
|
||||
this.debug('Sunny Day fire boost');
|
||||
return this.chainModify(1.5);
|
||||
}
|
||||
if (move.type === 'Water') {
|
||||
this.debug('Sunny Day water suppress');
|
||||
return this.chainModify(0.5);
|
||||
return this.chainModify(0.75);
|
||||
}
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -39,12 +39,12 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
}
|
||||
},
|
||||
onMoveAborted(pokemon, target, move) {
|
||||
if (move.type === pokemon.teraType && move.id !== 'charge') {
|
||||
if (move.type === pokemon.teraType && move.id !== 'tailwind' && move.id !== 'charge') {
|
||||
pokemon.removeVolatile('charge');
|
||||
}
|
||||
},
|
||||
onAfterMove(pokemon, target, move) {
|
||||
if (move.type === pokemon.teraType && move.id !== 'charge') {
|
||||
if (move.type === pokemon.teraType && move.id !== 'tailwind' && move.id !== 'charge') {
|
||||
pokemon.removeVolatile('charge');
|
||||
}
|
||||
},
|
||||
|
|
@ -702,6 +702,23 @@ export const Moves: import('../../../sim/dex-moves').ModdedMoveDataTable = {
|
|||
},
|
||||
},
|
||||
},
|
||||
stoneaxe: {
|
||||
inherit: true,
|
||||
onAfterHit(target, source, move) {
|
||||
if (!move.hasSheerForce && source.hp) {
|
||||
for (const side of source.side.foeSidesWithConditions()) {
|
||||
side.addSideCondition('stealthrock', source);
|
||||
}
|
||||
}
|
||||
},
|
||||
onAfterSubDamage(damage, target, source, move) {
|
||||
if (!move.hasSheerForce && source.hp) {
|
||||
for (const side of source.side.foeSidesWithConditions()) {
|
||||
side.addSideCondition('stealthrock', source);
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
terrainpulse: {
|
||||
inherit: true,
|
||||
onModifyType(move, pokemon) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user