Minecraft-STC-Modpack/showdown/data/mods/mixandmega/scripts.js
2023-08-14 21:45:09 -04:00

514 lines
19 KiB
JavaScript

"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var scripts_exports = {};
__export(scripts_exports, {
Scripts: () => Scripts
});
module.exports = __toCommonJS(scripts_exports);
const Scripts = {
gen: 9,
init() {
for (const i in this.data.Items) {
if (!this.data.Items[i].megaStone)
continue;
this.modData("Items", i).onTakeItem = false;
const id = this.toID(this.data.Items[i].megaStone);
this.modData("FormatsData", id).isNonstandard = null;
}
},
start() {
if (this.deserialized)
return;
if (!this.sides.every((side) => !!side))
throw new Error(`Missing sides: ${this.sides}`);
if (this.started)
throw new Error(`Battle already started`);
const format = this.format;
this.started = true;
if (this.gameType === "multi") {
this.sides[1].foe = this.sides[2];
this.sides[0].foe = this.sides[3];
this.sides[2].foe = this.sides[1];
this.sides[3].foe = this.sides[0];
this.sides[1].allySide = this.sides[3];
this.sides[0].allySide = this.sides[2];
this.sides[2].allySide = this.sides[0];
this.sides[3].allySide = this.sides[1];
this.sides[2].sideConditions = this.sides[0].sideConditions;
this.sides[3].sideConditions = this.sides[1].sideConditions;
} else {
this.sides[1].foe = this.sides[0];
this.sides[0].foe = this.sides[1];
if (this.sides.length > 2) {
this.sides[2].foe = this.sides[3];
this.sides[3].foe = this.sides[2];
}
}
for (const side of this.sides) {
this.add("teamsize", side.id, side.pokemon.length);
}
this.add("gen", this.gen);
this.add("tier", format.name);
if (this.rated) {
if (this.rated === "Rated battle")
this.rated = true;
this.add("rated", typeof this.rated === "string" ? this.rated : "");
}
if (format.onBegin)
format.onBegin.call(this);
for (const rule of this.ruleTable.keys()) {
if ("+*-!".includes(rule.charAt(0)))
continue;
const subFormat = this.dex.formats.get(rule);
if (subFormat.onBegin)
subFormat.onBegin.call(this);
}
for (const pokemon of this.getAllPokemon()) {
const item = pokemon.getItem();
if (["adamantcrystal", "griseouscore", "lustrousglobe", "vilevial"].includes(item.id) && item.forcedForme !== pokemon.species.name) {
const rawSpecies = this.actions.getMixedSpecies(pokemon.m.originalSpecies, item.forcedForme, pokemon);
const species = pokemon.setSpecies(rawSpecies);
if (!species)
continue;
pokemon.baseSpecies = rawSpecies;
pokemon.details = species.name + (pokemon.level === 100 ? "" : ", L" + pokemon.level) + (pokemon.gender === "" ? "" : ", " + pokemon.gender) + (pokemon.set.shiny ? ", shiny" : "");
pokemon.ability = this.toID(species.abilities["0"]);
pokemon.baseAbility = pokemon.ability;
}
}
if (this.sides.some((side) => !side.pokemon[0])) {
throw new Error("Battle not started: A player has an empty team.");
}
if (this.debugMode) {
this.checkEVBalance();
}
if (format.onTeamPreview)
format.onTeamPreview.call(this);
for (const rule of this.ruleTable.keys()) {
if ("+*-!".includes(rule.charAt(0)))
continue;
const subFormat = this.dex.formats.get(rule);
if (subFormat.onTeamPreview)
subFormat.onTeamPreview.call(this);
}
this.queue.addChoice({ choice: "start" });
this.midTurn = true;
if (!this.requestState)
this.go();
},
runAction(action) {
const pokemonOriginalHP = action.pokemon?.hp;
let residualPokemon = [];
switch (action.choice) {
case "start": {
for (const side of this.sides) {
if (side.pokemonLeft)
side.pokemonLeft = side.pokemon.length;
}
this.add("start");
for (const pokemon of this.getAllPokemon()) {
let rawSpecies = null;
const item = pokemon.getItem();
if (item.id === "rustedsword") {
rawSpecies = this.actions.getMixedSpecies(pokemon.m.originalSpecies, "Zacian-Crowned", pokemon);
} else if (item.id === "rustedshield") {
rawSpecies = this.actions.getMixedSpecies(pokemon.m.originalSpecies, "Zamazenta-Crowned", pokemon);
}
if (!rawSpecies)
continue;
const species = pokemon.setSpecies(rawSpecies);
if (!species)
continue;
pokemon.baseSpecies = rawSpecies;
pokemon.details = species.name + (pokemon.level === 100 ? "" : ", L" + pokemon.level) + (pokemon.gender === "" ? "" : ", " + pokemon.gender) + (pokemon.set.shiny ? ", shiny" : "");
pokemon.ability = this.toID(species.abilities["0"]);
pokemon.baseAbility = pokemon.ability;
const behemothMove = {
"Rusted Sword": "behemothblade",
"Rusted Shield": "behemothbash"
};
const ironHead = pokemon.baseMoves.indexOf("ironhead");
if (ironHead >= 0) {
const move = this.dex.moves.get(behemothMove[pokemon.getItem().name]);
pokemon.baseMoveSlots[ironHead] = {
move: move.name,
id: move.id,
pp: move.noPPBoosts || move.isZ ? move.pp : move.pp * 8 / 5,
maxpp: move.noPPBoosts || move.isZ ? move.pp : move.pp * 8 / 5,
target: move.target,
disabled: false,
disabledSource: "",
used: false
};
pokemon.moveSlots = pokemon.baseMoveSlots.slice();
}
}
if (this.format.onBattleStart)
this.format.onBattleStart.call(this);
for (const rule of this.ruleTable.keys()) {
if ("+*-!".includes(rule.charAt(0)))
continue;
const subFormat = this.dex.formats.get(rule);
if (subFormat.onBattleStart)
subFormat.onBattleStart.call(this);
}
for (const side of this.sides) {
for (let i = 0; i < side.active.length; i++) {
if (!side.pokemonLeft) {
side.active[i] = side.pokemon[i];
side.active[i].fainted = true;
side.active[i].hp = 0;
} else {
this.actions.switchIn(side.pokemon[i], i);
}
}
}
for (const pokemon of this.getAllPokemon()) {
this.singleEvent("Start", this.dex.conditions.getByID(pokemon.species.id), pokemon.speciesState, pokemon);
}
this.midTurn = true;
break;
}
case "move":
if (!action.pokemon.isActive)
return false;
if (action.pokemon.fainted)
return false;
this.actions.runMove(
action.move,
action.pokemon,
action.targetLoc,
action.sourceEffect,
action.zmove,
void 0,
action.maxMove,
action.originalTarget
);
break;
case "megaEvo":
this.actions.runMegaEvo(action.pokemon);
break;
case "runDynamax":
action.pokemon.addVolatile("dynamax");
action.pokemon.side.dynamaxUsed = true;
if (action.pokemon.side.allySide)
action.pokemon.side.allySide.dynamaxUsed = true;
break;
case "terastallize":
this.actions.terastallize(action.pokemon);
break;
case "beforeTurnMove":
if (!action.pokemon.isActive)
return false;
if (action.pokemon.fainted)
return false;
this.debug("before turn callback: " + action.move.id);
const target = this.getTarget(action.pokemon, action.move, action.targetLoc);
if (!target)
return false;
if (!action.move.beforeTurnCallback)
throw new Error(`beforeTurnMove has no beforeTurnCallback`);
action.move.beforeTurnCallback.call(this, action.pokemon, target);
break;
case "priorityChargeMove":
if (!action.pokemon.isActive)
return false;
if (action.pokemon.fainted)
return false;
this.debug("priority charge callback: " + action.move.id);
if (!action.move.priorityChargeCallback)
throw new Error(`priorityChargeMove has no priorityChargeCallback`);
action.move.priorityChargeCallback.call(this, action.pokemon);
break;
case "event":
this.runEvent(action.event, action.pokemon);
break;
case "team":
if (action.index === 0) {
action.pokemon.side.pokemon = [];
}
action.pokemon.side.pokemon.push(action.pokemon);
action.pokemon.position = action.index;
return;
case "pass":
return;
case "instaswitch":
case "switch":
if (action.choice === "switch" && action.pokemon.status) {
this.singleEvent("CheckShow", this.dex.abilities.getByID("naturalcure"), null, action.pokemon);
}
if (this.actions.switchIn(action.target, action.pokemon.position, action.sourceEffect) === "pursuitfaint") {
if (this.gen <= 4) {
this.hint("Previously chosen switches continue in Gen 2-4 after a Pursuit target faints.");
action.priority = -101;
this.queue.unshift(action);
break;
} else {
this.hint("A Pokemon can't switch between when it runs out of HP and when it faints");
break;
}
}
break;
case "revivalblessing":
action.pokemon.side.pokemonLeft++;
if (action.target.position < action.pokemon.side.active.length) {
this.queue.addChoice({
choice: "instaswitch",
pokemon: action.target,
target: action.target
});
}
action.target.fainted = false;
action.target.faintQueued = false;
action.target.subFainted = false;
action.target.status = "";
action.target.hp = 1;
action.target.sethp(action.target.maxhp / 2);
this.add("-heal", action.target, action.target.getHealth, "[from] move: Revival Blessing");
action.pokemon.side.removeSlotCondition(action.pokemon, "revivalblessing");
break;
case "runUnnerve":
this.singleEvent("PreStart", action.pokemon.getAbility(), action.pokemon.abilityState, action.pokemon);
break;
case "runSwitch":
this.actions.runSwitch(action.pokemon);
break;
case "runPrimal":
if (!action.pokemon.transformed) {
this.singleEvent("Primal", action.pokemon.getItem(), action.pokemon.itemState, action.pokemon);
}
break;
case "shift":
if (!action.pokemon.isActive)
return false;
if (action.pokemon.fainted)
return false;
this.swapPosition(action.pokemon, 1);
break;
case "beforeTurn":
this.eachEvent("BeforeTurn");
break;
case "residual":
this.add("");
this.clearActiveMove(true);
this.updateSpeed();
residualPokemon = this.getAllActive().map((pokemon) => [pokemon, pokemon.getUndynamaxedHP()]);
this.residualEvent("Residual");
this.add("upkeep");
break;
}
for (const side of this.sides) {
for (const pokemon of side.active) {
if (pokemon.forceSwitchFlag) {
if (pokemon.hp)
this.actions.dragIn(pokemon.side, pokemon.position);
pokemon.forceSwitchFlag = false;
}
}
}
this.clearActiveMove();
this.faintMessages();
if (this.ended)
return true;
if (!this.queue.peek() || this.gen <= 3 && ["move", "residual"].includes(this.queue.peek().choice)) {
this.checkFainted();
} else if (action.choice === "megaEvo" && this.gen === 7) {
this.eachEvent("Update");
for (const [i, queuedAction] of this.queue.list.entries()) {
if (queuedAction.pokemon === action.pokemon && queuedAction.choice === "move") {
this.queue.list.splice(i, 1);
queuedAction.mega = "done";
this.queue.insertChoice(queuedAction, true);
break;
}
}
return false;
} else if (this.queue.peek()?.choice === "instaswitch") {
return false;
}
if (this.gen >= 5) {
this.eachEvent("Update");
for (const [pokemon, originalHP] of residualPokemon) {
const maxhp = pokemon.getUndynamaxedHP(pokemon.maxhp);
if (pokemon.hp && pokemon.getUndynamaxedHP() <= maxhp / 2 && originalHP > maxhp / 2) {
this.runEvent("EmergencyExit", pokemon);
}
}
}
if (action.choice === "runSwitch") {
const pokemon = action.pokemon;
if (pokemon.hp && pokemon.hp <= pokemon.maxhp / 2 && pokemonOriginalHP > pokemon.maxhp / 2) {
this.runEvent("EmergencyExit", pokemon);
}
}
const switches = this.sides.map(
(side) => side.active.some((pokemon) => pokemon && !!pokemon.switchFlag)
);
for (let i = 0; i < this.sides.length; i++) {
let reviveSwitch = false;
if (switches[i] && !this.canSwitch(this.sides[i])) {
for (const pokemon of this.sides[i].active) {
if (this.sides[i].slotConditions[pokemon.position]["revivalblessing"]) {
reviveSwitch = true;
continue;
}
pokemon.switchFlag = false;
}
if (!reviveSwitch)
switches[i] = false;
} else if (switches[i]) {
for (const pokemon of this.sides[i].active) {
if (pokemon.switchFlag && pokemon.switchFlag !== "revivalblessing" && !pokemon.skipBeforeSwitchOutEventFlag) {
this.runEvent("BeforeSwitchOut", pokemon);
pokemon.skipBeforeSwitchOutEventFlag = true;
this.faintMessages();
if (this.ended)
return true;
if (pokemon.fainted) {
switches[i] = this.sides[i].active.some((sidePokemon) => sidePokemon && !!sidePokemon.switchFlag);
}
}
}
}
}
for (const playerSwitch of switches) {
if (playerSwitch) {
this.makeRequest("switch");
return true;
}
}
if (this.gen < 5)
this.eachEvent("Update");
if (this.gen >= 8 && (this.queue.peek()?.choice === "move" || this.queue.peek()?.choice === "runDynamax")) {
this.updateSpeed();
for (const queueAction of this.queue.list) {
if (queueAction.pokemon)
this.getActionSpeed(queueAction);
}
this.queue.sort();
}
return false;
},
actions: {
canMegaEvo(pokemon) {
if (pokemon.species.isMega)
return null;
const item = pokemon.getItem();
if (item.megaStone) {
if (item.megaStone === pokemon.baseSpecies.name)
return null;
return item.megaStone;
} else {
return null;
}
},
runMegaEvo(pokemon) {
if (pokemon.species.isMega)
return false;
const species = this.getMixedSpecies(pokemon.m.originalSpecies, pokemon.canMegaEvo, pokemon);
if (this.dex.species.get(pokemon.canMegaEvo).baseSpecies === pokemon.m.originalSpecies) {
pokemon.formeChange(species, pokemon.getItem(), true);
} else {
const oSpecies = this.dex.species.get(pokemon.m.originalSpecies);
const oMegaSpecies = this.dex.species.get(species.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]) {
this.battle.add("-start", pokemon, "typechange", pokemon.species.types.join("/"), "[silent]");
}
}
pokemon.canMegaEvo = null;
return true;
},
getMixedSpecies(originalForme, megaForme, pokemon) {
const originalSpecies = this.dex.species.get(originalForme);
const megaSpecies = this.dex.species.get(megaForme);
if (originalSpecies.baseSpecies === megaSpecies.baseSpecies)
return megaSpecies;
const deltas = this.getFormeChangeDeltas(megaSpecies, pokemon);
const species = this.mutateOriginalSpecies(originalSpecies, deltas);
return species;
},
getFormeChangeDeltas(formeChangeSpecies, pokemon) {
const baseSpecies = this.dex.species.get(formeChangeSpecies.baseSpecies);
const deltas = {
ability: formeChangeSpecies.abilities["0"],
baseStats: {},
weighthg: formeChangeSpecies.weighthg - baseSpecies.weighthg,
originalSpecies: formeChangeSpecies.name,
requiredItem: formeChangeSpecies.requiredItem
};
let statId;
for (statId in formeChangeSpecies.baseStats) {
deltas.baseStats[statId] = formeChangeSpecies.baseStats[statId] - baseSpecies.baseStats[statId];
}
if (formeChangeSpecies.types.length > baseSpecies.types.length) {
deltas.type = formeChangeSpecies.types[1];
} else if (formeChangeSpecies.types.length < baseSpecies.types.length) {
deltas.type = "mono";
} else if (formeChangeSpecies.types[1] !== baseSpecies.types[1]) {
deltas.type = formeChangeSpecies.types[1];
}
let formeType = null;
if (formeChangeSpecies.isMega)
formeType = "Mega";
if (formeChangeSpecies.isPrimal)
formeType = "Primal";
if (formeChangeSpecies.name.endsWith("Crowned"))
formeType = "Crowned";
if (formeType)
deltas.formeType = formeType;
if (!deltas.formeType && formeChangeSpecies.abilities["H"] && pokemon && pokemon.baseSpecies.abilities["H"] === pokemon.getAbility().name) {
deltas.ability = formeChangeSpecies.abilities["H"];
}
return deltas;
},
mutateOriginalSpecies(speciesOrForme, deltas) {
if (!deltas)
throw new TypeError("Must specify deltas!");
const species = this.dex.deepClone(this.dex.species.get(speciesOrForme));
species.abilities = { "0": deltas.ability };
if (species.types[0] === deltas.type) {
species.types = [deltas.type];
} else if (deltas.type === "mono") {
species.types = [species.types[0]];
} else if (deltas.type) {
species.types = [species.types[0], deltas.type];
}
const baseStats = species.baseStats;
for (const statName in baseStats) {
baseStats[statName] = this.battle.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255);
}
species.weighthg = Math.max(1, species.weighthg + deltas.weighthg);
species.originalSpecies = deltas.originalSpecies;
species.requiredItem = deltas.requiredItem;
switch (deltas.formeType) {
case "Mega":
species.isMega = true;
break;
case "Primal":
species.isPrimal = true;
break;
}
return species;
}
}
};
//# sourceMappingURL=scripts.js.map