Add October 2025 OMotM and fix Flower Veil

This commit is contained in:
Kris Johnson 2025-10-02 13:31:43 -06:00
parent 45e4f2e882
commit 05aa26d108
6 changed files with 93 additions and 99 deletions

View File

@ -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.`,

View File

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

View File

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

View File

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

View File

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

View File

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