Skip to content

Instantly share code, notes, and snippets.

@Spandamn
Last active February 24, 2017 13:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Spandamn/46fd21f9b6ebbbf0cbf9c5eeabb04a20 to your computer and use it in GitHub Desktop.
Save Spandamn/46fd21f9b6ebbbf0cbf9c5eeabb04a20 to your computer and use it in GitHub Desktop.
Full Potential Scripts.js by Spandan
'use strict';
exports.BattleScripts = {
getDamage : function(pokemon, target, move, suppressMessages) {
if (typeof move === 'string') move = this.getMove(move);
if (typeof move === 'number') {
move = {
basePower: move,
type: '???',
category: 'Physical',
willCrit: false,
flags: {},
};
}
if (!move.ignoreImmunity || (move.ignoreImmunity !== true && !move.ignoreImmunity[move.type])) {
if (!target.runImmunity(move.type, !suppressMessages)) {
return false;
}
}
if (move.ohko) return target.maxhp;
if (move.damageCallback) return move.damageCallback.call(this, pokemon, target);
if (move.damage === 'level') return pokemon.level;
if (move.damage) return move.damage;
if (!move) move = {};
if (!move.type) move.type = '???';
let type = move.type;
let category = this.getCategory(move);
let defensiveCategory = move.defensiveCategory || category;
let basePower = move.basePower;
if (move.basePowerCallback) basePower = move.basePowerCallback.call(this, pokemon, target, move);
if (!basePower) {
if (basePower === 0) return;
return basePower;
}
basePower = this.clampIntRange(basePower, 1);
let critMult;
let critRatio = this.runEvent('ModifyCritRatio', pokemon, target, move, move.critRatio || 0);
critRatio = this.clampIntRange(critRatio, 0, 4);
critMult = [0, 16, 8, 2, 1];
move.crit = move.willCrit || false;
if (move.willCrit === undefined && critRatio) move.crit = (this.random(critMult[critRatio]) === 0);
if (move.crit) move.crit = this.runEvent('CriticalHit', target, null, move);
basePower = this.runEvent('BasePower', pokemon, target, move, basePower, true);
if (!basePower) return 0;
basePower = this.clampIntRange(basePower, 1);
let level = pokemon.level;
let attacker = pokemon;
let defender = target;
let statTable = {atk:'Atk', def:'Def', spa:'SpA', spd:'SpD', spe:'Spe'};
let attackStat, highestStat = 0;
let defenseStat = defensiveCategory === 'Physical' ? 'def' : 'spd';
for(let i in statTable) {
let stat = attacker.calculateStat(i, attacker.boosts[i]);
stat = this.runEvent('Modify' + statTable[i], attacker, defender, move, stat);
if(stat > highestStat) {
attackStat = i;
highestStat = stat;
}
}
let attack;
let defense;
let atkBoosts = move.useTargetOffensive ? defender.boosts[attackStat] : attacker.boosts[attackStat];
let defBoosts = move.useSourceDefensive ? attacker.boosts[defenseStat] : defender.boosts[defenseStat];
let ignoreNegativeOffensive = !!move.ignoreNegativeOffensive;
let ignorePositiveDefensive = !!move.ignorePositiveDefensive;
if (move.crit) {
ignoreNegativeOffensive = true;
ignorePositiveDefensive = true;
}
let ignoreOffensive = !!(move.ignoreOffensive || (ignoreNegativeOffensive && atkBoosts < 0));
let ignoreDefensive = !!(move.ignoreDefensive || (ignorePositiveDefensive && defBoosts > 0));
if (ignoreOffensive) atkBoosts = 0;
if (ignoreDefensive) defBoosts = 0;
if (move.useTargetOffensive) {
attack = defender.calculateStat(attackStat, atkBoosts);
} else {
attack = attacker.calculateStat(attackStat, atkBoosts);
}
if (move.useSourceDefensive) {
defense = attacker.calculateStat(defenseStat, defBoosts);
} else {
defense = defender.calculateStat(defenseStat, defBoosts);
}
attack = this.runEvent('Modify' + statTable[attackStat], attacker, defender, move, attack);
defense = this.runEvent('Modify' + statTable[defenseStat], defender, attacker, move, defense);
let baseDamage = Math.floor(Math.floor(Math.floor(2 * level / 5 + 2) * basePower * attack / defense) / 50) + 2;
baseDamage = this.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);
if (move.crit) baseDamage = this.modify(baseDamage, move.critModifier || (this.gen >= 6 ? 1.5 : 2));
baseDamage = this.randomizer(baseDamage);
if (move.hasSTAB || pokemon.hasType(type)) baseDamage = this.modify(baseDamage, move.stab || 1.5);
move.typeMod = target.runEffectiveness(move);
move.typeMod = this.clampIntRange(move.typeMod, -6, 6);
if (move.typeMod > 0) {
if (!suppressMessages) this.add('-supereffective', target);
for (let i = 0; i < move.typeMod; i++) {
baseDamage *= 2;
}
}
if (move.typeMod < 0) {
if (!suppressMessages) this.add('-resisted', target);
for (let i = 0; i > move.typeMod; i--) {
baseDamage = Math.floor(baseDamage / 2);
}
}
if (move.crit && !suppressMessages) this.add('-crit', target);
if (pokemon.status === 'brn' && basePower && move.category === 'Physical' && move.id !== 'facade' && !pokemon.hasAbility('guts')) {
baseDamage = this.modify(baseDamage, 0.5);
}
baseDamage = this.runEvent('ModifyDamage', pokemon, target, move, baseDamage);
if (basePower && !Math.floor(baseDamage)) return 1;
return Math.floor(baseDamage);
},
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment