Mix and Mega: Release Z-A stones
Some checks are pending
Node.js CI / build (18.x) (push) Waiting to run

This commit is contained in:
Kris Johnson 2025-12-15 19:53:21 -07:00
parent 5a02f59339
commit 2c58b396cb
3 changed files with 20 additions and 10 deletions

View File

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

View File

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

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