mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-24 23:09:10 -05:00
147 lines
6.1 KiB
JavaScript
147 lines
6.1 KiB
JavaScript
// Other Metas plugin by Spandan
|
|
'use strict';
|
|
|
|
exports.commands = {
|
|
mnm: 'mixandmega',
|
|
mixandmega: function (target, room, user) {
|
|
if (!this.runBroadcast()) return;
|
|
if (!toId(target) || !target.includes('@')) return this.parse('/help mixandmega');
|
|
let sep = target.split('@');
|
|
let stone = toId(sep[1]);
|
|
let template = toId(sep[0]);
|
|
if (!Dex.data.Items[stone] || (Dex.data.Items[stone] && !Dex.data.Items[stone].megaEvolves && !Dex.data.Items[stone].onPrimal)) {
|
|
return this.errorReply(`Error: Mega Stone not found`);
|
|
}
|
|
if (!Dex.data.Pokedex[toId(template)]) {
|
|
return this.errorReply(`Error: Pokemon not found`);
|
|
}
|
|
template = Object.assign({}, Dex.getTemplate(template));
|
|
stone = Object.assign({}, Dex.getItem(stone));
|
|
if (template.isMega || (template.evos && Object.keys(template.evos).length > 0)) { // Mega Pokemon cannot be mega evolved
|
|
return this.errorReply(`You cannot mega evolve ${template.name} in Mix and Mega.`);
|
|
}
|
|
let bannedStones = {'beedrillite':1, 'blazikenite':1, 'gengarite':1, 'kangaskhanite':1, 'mawilite':1, 'medichamite':1};
|
|
if (stone.id in bannedStones && template.name !== stone.megaEvolves) {
|
|
return this.errorReply(`You cannot use ${stone.name} on anything besides ${stone.megaEvolves} in Mix and Mega.`);
|
|
}
|
|
if (Dex.mod("mixandmega").getTemplate(sep[0]).tier === "Uber") { // Separate messages because there's a difference between being already mega evolved / NFE and being banned from mega evolving
|
|
return this.errorReply(`${template.name} is banned from mega evolving in Mix and Mega.`);
|
|
}
|
|
let baseTemplate = Dex.getTemplate(stone.megaEvolves);
|
|
let megaTemplate = Dex.getTemplate(stone.megaStone);
|
|
if (stone.id === 'redorb') { // Orbs do not have 'Item.megaStone' or 'Item.megaEvolves' properties.
|
|
megaTemplate = Dex.getTemplate("Groudon-Primal");
|
|
baseTemplate = Dex.getTemplate("Groudon");
|
|
} else if (stone.id === 'blueorb') {
|
|
megaTemplate = Dex.getTemplate("Kyogre-Primal");
|
|
baseTemplate = Dex.getTemplate("Kyogre");
|
|
}
|
|
let deltas = {
|
|
baseStats: {},
|
|
weightkg: megaTemplate.weightkg - baseTemplate.weightkg,
|
|
};
|
|
for (let statId in megaTemplate.baseStats) {
|
|
deltas.baseStats[statId] = megaTemplate.baseStats[statId] - baseTemplate.baseStats[statId];
|
|
}
|
|
if (megaTemplate.types.length > baseTemplate.types.length) {
|
|
deltas.type = megaTemplate.types[1];
|
|
} else if (megaTemplate.types.length < baseTemplate.types.length) {
|
|
deltas.type = baseTemplate.types[0];
|
|
} else if (megaTemplate.types[1] !== baseTemplate.types[1]) {
|
|
deltas.type = megaTemplate.types[1];
|
|
}
|
|
//////////////////////////////////////////
|
|
let mixedTemplate = Object.assign({}, template);
|
|
mixedTemplate.abilities = Object.assign({}, megaTemplate.abilities);
|
|
if (mixedTemplate.types[0] === deltas.type) { // Add any type gains
|
|
mixedTemplate.types = [deltas.type];
|
|
} else if (deltas.type) {
|
|
mixedTemplate.types = [mixedTemplate.types[0], deltas.type];
|
|
}
|
|
mixedTemplate.baseStats = {};
|
|
for (let statName in template.baseStats) { // Add the changed stats and weight
|
|
mixedTemplate.baseStats[statName] = Dex.clampIntRange(Dex.data.Pokedex[template.id].baseStats[statName] + deltas.baseStats[statName], 1, 255);
|
|
}
|
|
mixedTemplate.weightkg = Math.round(Math.max(0.1, template.weightkg + deltas.weightkg) * 100) / 100;
|
|
mixedTemplate.tier = "MnM";
|
|
let details;
|
|
let weighthit = 20;
|
|
if (mixedTemplate.weightkg >= 200) {
|
|
weighthit = 120;
|
|
} else if (mixedTemplate.weightkg >= 100) {
|
|
weighthit = 100;
|
|
} else if (mixedTemplate.weightkg >= 50) {
|
|
weighthit = 80;
|
|
} else if (mixedTemplate.weightkg >= 25) {
|
|
weighthit = 60;
|
|
} else if (mixedTemplate.weightkg >= 10) {
|
|
weighthit = 40;
|
|
}
|
|
details = {
|
|
"Dex#": mixedTemplate.num,
|
|
"Gen": mixedTemplate.gen,
|
|
"Height": mixedTemplate.heightm + " m",
|
|
"Weight": mixedTemplate.weightkg + " kg <em>(" + weighthit + " BP)</em>",
|
|
"Dex Colour": mixedTemplate.color,
|
|
};
|
|
if (mixedTemplate.eggGroups) details["Egg Group(s)"] = mixedTemplate.eggGroups.join(", ");
|
|
details['<font color="#686868">Does Not Evolve</font>'] = "";
|
|
this.sendReply(`|raw|${Chat.getDataPokemonHTML(mixedTemplate)}`);
|
|
this.sendReply('|raw|<font size="1">' + Object.keys(details).map(detail => {
|
|
if (details[detail] === '') return detail;
|
|
return '<font color="#686868">' + detail + ':</font> ' + details[detail];
|
|
}).join(" |  ") + '</font>');
|
|
},
|
|
mixandmegahelp: ["/mnm <pokemon> @ <mega stone> - Shows the Mix and Mega evolved Pokemon's type and stats."],
|
|
|
|
'350': '350cup',
|
|
'350cup': function (target, room, user) {
|
|
if (!this.runBroadcast()) return;
|
|
if (!Dex.data.Pokedex[toId(target)]) {
|
|
return this.errorReply("Error: Pokemon not found.");
|
|
}
|
|
let bst = 0;
|
|
let pokeobj = Object.assign({}, Dex.getTemplate(target));
|
|
for (let i in pokeobj.baseStats) {
|
|
bst += pokeobj.baseStats[i];
|
|
}
|
|
let newStats = {};
|
|
for (let i in pokeobj.baseStats) {
|
|
newStats[i] = pokeobj.baseStats[i] * (bst <= 350 ? 2 : 1);
|
|
}
|
|
pokeobj.baseStats = Object.assign({}, newStats);
|
|
this.sendReply(`|html|${Chat.getDataPokemonHTML(pokeobj)}`);
|
|
},
|
|
'350cuphelp': ["/350 OR /350cup <pokemon> - Shows the base stats that a Pokemon would have in 350 Cup."],
|
|
|
|
ts: 'tiershift',
|
|
tiershift: function (target, room, user) {
|
|
if (!this.runBroadcast()) return;
|
|
if (!Dex.data.Pokedex[toId(target)]) {
|
|
return this.errorReply("Error: Pokemon not found.");
|
|
}
|
|
let boosts = {
|
|
'UU': 10,
|
|
'BL2': 10,
|
|
'RU': 20,
|
|
'BL3': 20,
|
|
'NU': 30,
|
|
'BL4': 30,
|
|
'PU': 40,
|
|
'NFE': 40,
|
|
'LC Uber': 40,
|
|
'LC': 40,
|
|
};
|
|
let template = Object.assign({}, Dex.getTemplate(target));
|
|
if (!(template.tier in boosts)) return this.sendReplyBox(`${template.species} in Tier Shift: <br /> ${Object.values(template.baseStats).join('/')}`);
|
|
let boost = boosts[template.tier];
|
|
let newStats = Object.assign({}, template.baseStats);
|
|
for (let statName in template.baseStats) {
|
|
newStats[statName] = Dex.clampIntRange(newStats[statName] + boost, 1, 255);
|
|
}
|
|
template.baseStats = Object.assign({}, newStats);
|
|
this.sendReply(`|raw|${Chat.getDataPokemonHTML(template)}`);
|
|
},
|
|
'tiershifthelp': ["/ts OR /tiershift <pokemon> - Shows the base stats that a Pokemon would have in Tier Shift."],
|
|
};
|