From 2c58b396cb6eb7e1df54468047ef26b9a6bdd626 Mon Sep 17 00:00:00 2001 From: Kris Johnson <11083252+KrisXV@users.noreply.github.com> Date: Mon, 15 Dec 2025 19:53:21 -0700 Subject: [PATCH] Mix and Mega: Release Z-A stones --- config/formats.ts | 3 +-- data/mods/mixandmega/scripts.ts | 17 +++++++++++------ server/chat-plugins/othermetas.ts | 10 ++++++++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/config/formats.ts b/config/formats.ts index 83baf46c3f..7e978ae7ce 100644 --- a/config/formats.ts +++ b/config/formats.ts @@ -649,8 +649,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]'); } } diff --git a/data/mods/mixandmega/scripts.ts b/data/mods/mixandmega/scripts.ts index 33a6a9d994..dcaf1cdfdb 100644 --- a/data/mods/mixandmega/scripts.ts +++ b/data/mods/mixandmega/scripts.ts @@ -5,7 +5,7 @@ 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.isNonstandard === "Past" || item.isNonstandard === "Future") this.modData('Items', i).isNonstandard = null; /* if (item.megaStone) { this.modData('FormatsData', this.toID(item.megaStone)).isNonstandard = 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]'); } // } @@ -476,6 +476,7 @@ export const Scripts: ModdedBattleScriptsData = { requiredItem: string | undefined, type?: string, formeType?: string, + isMega?: boolean, } = { ability: formeChangeSpecies.abilities['0'], baseStats: {}, @@ -491,15 +492,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 +518,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 +537,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; }, diff --git a/server/chat-plugins/othermetas.ts b/server/chat-plugins/othermetas.ts index 9a52bd6301..fd356b3cd5 100644 --- a/server/chat-plugins/othermetas.ts +++ b/server/chat-plugins/othermetas.ts @@ -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'; @@ -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,7 +234,7 @@ 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.`); @@ -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,