pokemon-showdown/chat-plugins/othermetas.js
2017-06-22 23:56:52 -07:00

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("&nbsp;|&ThickSpace;") + '</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."],
};