'use strict'; exports.BattleScripts = { init: function () { for (let id in this.data.Items) { if (!this.data.Items[id].megaStone) continue; this.modData('Items', id).onTakeItem = false; } }, canMegaEvo: function (pokemon) { if (pokemon.template.isMega || pokemon.template.isPrimal) return false; let item = pokemon.getItem(); if (item.megaStone) { if (item.megaStone === pokemon.species) return false; return item.megaStone; } else if (pokemon.set.moves.indexOf('dragonascent') >= 0) { return 'Rayquaza-Mega'; } else { return false; } }, runMegaEvo: function (pokemon) { if (pokemon.template.isMega || pokemon.template.isPrimal) return false; let template = this.getMixedTemplate(pokemon.originalSpecies, pokemon.canMegaEvo); let side = pokemon.side; // Pokémon affected by Sky Drop cannot Mega Evolve. Enforce it here for now. let foeActive = side.foe.active; for (let i = 0; i < foeActive.length; i++) { if (foeActive[i].volatiles['skydrop'] && foeActive[i].volatiles['skydrop'].source === pokemon) { return false; } } pokemon.formeChange(template); pokemon.baseTemplate = template; // Mega Evolution is permanent // Do we have a proper sprite for it? if (this.getTemplate(pokemon.canMegaEvo).baseSpecies === pokemon.originalSpecies) { pokemon.details = template.species + (pokemon.level === 100 ? '' : ', L' + pokemon.level) + (pokemon.gender === '' ? '' : ', ' + pokemon.gender) + (pokemon.set.shiny ? ', shiny' : ''); this.add('detailschange', pokemon, pokemon.details); this.add('-mega', pokemon, template.baseSpecies, template.requiredItem); } else { let oTemplate = this.getTemplate(pokemon.originalSpecies); let oMegaTemplate = this.getTemplate(template.originalMega); if (template.originalMega === 'Rayquaza-Mega') { this.add('message', "" + pokemon.side.name + "'s fervent wish has reached " + pokemon.species + "!"); } else { this.add('message', "" + pokemon.species + "'s " + pokemon.getItem().name + " is reacting to " + pokemon.side.name + "'s Mega Bracelet!"); } this.add('-formechange', pokemon, oTemplate.species, template.requiredItem); this.add('message', template.baseSpecies + " has Mega Evolved into Mega " + template.baseSpecies + "!"); this.add('-start', pokemon, oMegaTemplate.requiredItem || oMegaTemplate.requiredMove, '[silent]'); if (oTemplate.types.length !== pokemon.template.types.length || oTemplate.types[1] !== pokemon.template.types[1]) { this.add('-start', pokemon, 'typechange', pokemon.template.types.join('/'), '[silent]'); } } pokemon.setAbility(template.abilities['0']); pokemon.baseAbility = pokemon.ability; pokemon.canMegaEvo = false; return true; }, getMixedTemplate: function (originalSpecies, megaSpecies) { let originalTemplate = this.getTemplate(originalSpecies); let megaTemplate = this.getTemplate(megaSpecies); if (originalTemplate.baseSpecies === megaTemplate.baseSpecies) return megaTemplate; let deltas = this.getMegaDeltas(megaTemplate); let template = this.doGetMixedTemplate(originalTemplate, deltas); return template; }, getMegaDeltas: function (megaTemplate) { let baseTemplate = this.getTemplate(megaTemplate.baseSpecies); let deltas = { ability: megaTemplate.abilities['0'], baseStats: {}, weightkg: megaTemplate.weightkg - baseTemplate.weightkg, originalMega: megaTemplate.species, requiredItem: megaTemplate.requiredItem, }; 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]; } if (megaTemplate.isMega) deltas.isMega = true; if (megaTemplate.isPrimal) deltas.isPrimal = true; return deltas; }, doGetMixedTemplate: function (template, deltas) { if (!deltas) throw new TypeError("Must specify deltas!"); if (!template || typeof template === 'string') template = this.getTemplate(template); template = Object.assign({}, template); template.abilities = {'0': deltas.ability}; if (template.types[0] === deltas.type) { template.types = [deltas.type]; } else if (deltas.type) { template.types = [template.types[0], deltas.type]; } let baseStats = template.baseStats; template.baseStats = {}; for (let statName in baseStats) { template.baseStats[statName] = this.clampIntRange(baseStats[statName] + deltas.baseStats[statName], 1, 255); } template.weightkg = Math.max(0.1, template.weightkg + deltas.weightkg); template.originalMega = deltas.originalMega; template.requiredItem = deltas.requiredItem; if (deltas.isMega) template.isMega = true; if (deltas.isPrimal) template.isPrimal = true; return template; }, };