{ "version": 3, "sources": ["../../../../../data/mods/gen4/scripts.ts"], "sourcesContent": ["export const Scripts: ModdedBattleScriptsData = {\r\n\tinherit: 'gen5',\r\n\tgen: 4,\r\n\r\n\tactions: {\r\n\t\tinherit: true,\r\n\t\tmodifyDamage(baseDamage, pokemon, target, move, suppressMessages = false) {\r\n\t\t\t// DPP divides modifiers into several mathematically important stages\r\n\t\t\t// The modifiers run earlier than other generations are called with ModifyDamagePhase1 and ModifyDamagePhase2\r\n\r\n\t\t\tif (!move.type) move.type = '???';\r\n\t\t\tconst type = move.type;\r\n\r\n\t\t\t// Burn\r\n\t\t\tif (pokemon.status === 'brn' && baseDamage && move.category === 'Physical' && !pokemon.hasAbility('guts')) {\r\n\t\t\t\tbaseDamage = this.battle.modify(baseDamage, 0.5);\r\n\t\t\t}\r\n\r\n\t\t\t// Other modifiers (Reflect/Light Screen/etc)\r\n\t\t\tbaseDamage = this.battle.runEvent('ModifyDamagePhase1', pokemon, target, move, baseDamage);\r\n\r\n\t\t\t// Double battle multi-hit\r\n\t\t\tif (move.spreadHit) {\r\n\t\t\t\tconst spreadModifier = move.spreadModifier || (this.battle.gameType === 'freeforall' ? 0.5 : 0.75);\r\n\t\t\t\tthis.battle.debug('Spread modifier: ' + spreadModifier);\r\n\t\t\t\tbaseDamage = this.battle.modify(baseDamage, spreadModifier);\r\n\t\t\t}\r\n\r\n\t\t\t// Weather\r\n\t\t\tbaseDamage = this.battle.runEvent('WeatherModifyDamage', pokemon, target, move, baseDamage);\r\n\r\n\t\t\tif (this.battle.gen === 3 && move.category === 'Physical' && !Math.floor(baseDamage)) {\r\n\t\t\t\tbaseDamage = 1;\r\n\t\t\t}\r\n\r\n\t\t\tbaseDamage += 2;\r\n\r\n\t\t\tconst isCrit = target.getMoveHitData(move).crit;\r\n\t\t\tif (isCrit) {\r\n\t\t\t\tbaseDamage = this.battle.modify(baseDamage, move.critModifier || 2);\r\n\t\t\t}\r\n\r\n\t\t\t// Mod 2 (Damage is floored after all multipliers are in)\r\n\t\t\tbaseDamage = Math.floor(this.battle.runEvent('ModifyDamagePhase2', pokemon, target, move, baseDamage));\r\n\r\n\t\t\t// this is not a modifier\r\n\t\t\tbaseDamage = this.battle.randomizer(baseDamage);\r\n\r\n\t\t\t// STAB\r\n\t\t\tif (move.forceSTAB || type !== '???' && pokemon.hasType(type)) {\r\n\t\t\t\t// The \"???\" type never gets STAB\r\n\t\t\t\t// Not even if you Roost in Gen 4 and somehow manage to use\r\n\t\t\t\t// Struggle in the same turn.\r\n\t\t\t\t// (On second thought, it might be easier to get a MissingNo.)\r\n\t\t\t\tbaseDamage = this.battle.modify(baseDamage, move.stab || 1.5);\r\n\t\t\t}\r\n\t\t\t// types\r\n\t\t\tlet typeMod = target.runEffectiveness(move);\r\n\t\t\ttypeMod = this.battle.clampIntRange(typeMod, -6, 6);\r\n\t\t\ttarget.getMoveHitData(move).typeMod = typeMod;\r\n\t\t\tif (typeMod > 0) {\r\n\t\t\t\tif (!suppressMessages) this.battle.add('-supereffective', target);\r\n\r\n\t\t\t\tfor (let i = 0; i < typeMod; i++) {\r\n\t\t\t\t\tbaseDamage *= 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (typeMod < 0) {\r\n\t\t\t\tif (!suppressMessages) this.battle.add('-resisted', target);\r\n\r\n\t\t\t\tfor (let i = 0; i > typeMod; i--) {\r\n\t\t\t\t\tbaseDamage = Math.floor(baseDamage / 2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isCrit && !suppressMessages) this.battle.add('-crit', target);\r\n\r\n\t\t\t// Final modifier.\r\n\t\t\tbaseDamage = this.battle.runEvent('ModifyDamage', pokemon, target, move, baseDamage);\r\n\r\n\t\t\tif (!Math.floor(baseDamage)) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\r\n\t\t\treturn Math.floor(baseDamage);\r\n\t\t},\r\n\t\thitStepInvulnerabilityEvent(targets, pokemon, move) {\r\n\t\t\tconst hitResults = this.battle.runEvent('Invulnerability', targets, pokemon, move);\r\n\t\t\tfor (const [i, target] of targets.entries()) {\r\n\t\t\t\tif (hitResults[i] === false) {\r\n\t\t\t\t\tif (!move.spreadHit) this.battle.attrLastMove('[miss]');\r\n\t\t\t\t\tthis.battle.add('-miss', pokemon, target);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn hitResults;\r\n\t\t},\r\n\t\thitStepAccuracy(targets, pokemon, move) {\r\n\t\t\tconst hitResults = [];\r\n\t\t\tfor (const [i, target] of targets.entries()) {\r\n\t\t\t\tthis.battle.activeTarget = target;\r\n\t\t\t\t// calculate true accuracy\r\n\t\t\t\tlet accuracy = move.accuracy;\r\n\t\t\t\tif (move.ohko) { // bypasses accuracy modifiers\r\n\t\t\t\t\tif (!target.isSemiInvulnerable()) {\r\n\t\t\t\t\t\tif (pokemon.level < target.level) {\r\n\t\t\t\t\t\t\tthis.battle.add('-immune', target, '[ohko]');\r\n\t\t\t\t\t\t\thitResults[i] = false;\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\taccuracy = 30 + pokemon.level - target.level;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst boostTable = [1, 4 / 3, 5 / 3, 2, 7 / 3, 8 / 3, 3];\r\n\r\n\t\t\t\t\tlet boosts;\r\n\t\t\t\t\tlet boost!: number;\r\n\t\t\t\t\tif (accuracy !== true) {\r\n\t\t\t\t\t\tif (!move.ignoreAccuracy) {\r\n\t\t\t\t\t\t\tboosts = this.battle.runEvent('ModifyBoost', pokemon, null, null, {...pokemon.boosts});\r\n\t\t\t\t\t\t\tboost = this.battle.clampIntRange(boosts['accuracy'], -6, 6);\r\n\t\t\t\t\t\t\tif (boost > 0) {\r\n\t\t\t\t\t\t\t\taccuracy *= boostTable[boost];\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\taccuracy /= boostTable[-boost];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!move.ignoreEvasion) {\r\n\t\t\t\t\t\t\tboosts = this.battle.runEvent('ModifyBoost', target, null, null, {...target.boosts});\r\n\t\t\t\t\t\t\tboost = this.battle.clampIntRange(boosts['evasion'], -6, 6);\r\n\t\t\t\t\t\t\tif (boost > 0) {\r\n\t\t\t\t\t\t\t\taccuracy /= boostTable[boost];\r\n\t\t\t\t\t\t\t} else if (boost < 0) {\r\n\t\t\t\t\t\t\t\taccuracy *= boostTable[-boost];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\taccuracy = this.battle.runEvent('ModifyAccuracy', target, pokemon, move, accuracy);\r\n\t\t\t\t}\r\n\t\t\t\tif (move.alwaysHit) {\r\n\t\t\t\t\taccuracy = true; // bypasses ohko accuracy modifiers\r\n\t\t\t\t} else {\r\n\t\t\t\t\taccuracy = this.battle.runEvent('Accuracy', target, pokemon, move, accuracy);\r\n\t\t\t\t}\r\n\t\t\t\tif (accuracy !== true && !this.battle.randomChance(accuracy, 100)) {\r\n\t\t\t\t\tif (!move.spreadHit) this.battle.attrLastMove('[miss]');\r\n\t\t\t\t\tthis.battle.add('-miss', pokemon, target);\r\n\t\t\t\t\thitResults[i] = false;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\thitResults[i] = true;\r\n\t\t\t}\r\n\t\t\treturn hitResults;\r\n\t\t},\r\n\t\tcalcRecoilDamage(damageDealt, move) {\r\n\t\t\treturn this.battle.clampIntRange(Math.floor(damageDealt * move.recoil![0] / move.recoil![1]), 1);\r\n\t\t},\r\n\t},\r\n};\r\n"], "mappings": "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", "names": [] }