From 53fb56391bfd56494ab0c9b51178e76bb7df58b1 Mon Sep 17 00:00:00 2001 From: N1ghtz567 Date: Fri, 22 Dec 2023 18:08:37 -0400 Subject: [PATCH] Implement 2 abilities --- src/battle-phases.ts | 12 ++++---- src/data/ability.ts | 22 ++++++++++++-- src/data/move.ts | 70 ++++++++++++++++++++++++-------------------- 3 files changed, 66 insertions(+), 38 deletions(-) diff --git a/src/battle-phases.ts b/src/battle-phases.ts index deea42f14cd..a7380eba520 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -25,7 +25,7 @@ import { Gender } from "./data/gender"; import { Weather, WeatherType, getRandomWeatherType, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagType, ArenaTrapTag, TrickRoomTag } from "./data/arena-tag"; -import { Abilities, CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, PostAttackAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreWeatherEffectAbAttrs } from "./data/ability"; +import { Abilities, CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, PostAttackAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreWeatherEffectAbAttrs } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./arena"; import { BattleType, BattlerIndex, TurnCommand } from "./battle"; @@ -1769,8 +1769,9 @@ export class MoveEffectPhase extends PokemonPhase { if (--user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) this.scene.unshiftPhase(this.getNewHitPhase()); else { - if (user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0) > 1) - this.scene.queueMessage(`Hit ${user.turnData.hitCount} time(s)!`); + const hitsTotal = user.turnData.hitCount - Math.max(user.turnData.hitsLeft, 0); + if (hitsTotal > 1) + this.scene.queueMessage(`Hit ${hitsTotal} time(s)!`); this.scene.applyModifiers(HitHealModifier, this.player, user); } } @@ -3070,9 +3071,10 @@ export class AttemptRunPhase extends PokemonPhase { const enemySpeed = enemyField.reduce((total: integer, enemyPokemon: Pokemon) => total + enemyPokemon.getStat(Stat.SPD), 0) / enemyField.length; - const escapeChance = (((playerPokemon.getStat(Stat.SPD) * 128) / enemySpeed) + (30 * this.scene.currentBattle.escapeAttempts++)) % 256; + const escapeChance = new Utils.IntegerHolder((((playerPokemon.getStat(Stat.SPD) * 128) / enemySpeed) + (30 * this.scene.currentBattle.escapeAttempts++)) % 256); + applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, escapeChance); - if (Utils.randInt(256) < escapeChance) { + if (Utils.randInt(256) < escapeChance.value) { this.scene.playSound('flee'); this.scene.queueMessage('You got away safely!', null, true, 500); diff --git a/src/data/ability.ts b/src/data/ability.ts index 423460c448a..db7cdc8bc1d 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -890,6 +890,14 @@ export class DoubleBerryEffectAbAttr extends AbAttr { } } +export class RunSuccessAbAttr extends AbAttr { + apply(pokemon: Pokemon, cancelled: Utils.BooleanHolder, args: any[]): boolean { + (args[0] as Utils.IntegerHolder).value = 256; + + return true; + } +} + export class CheckTrappedAbAttr extends AbAttr { applyCheckTrapped(pokemon: Pokemon, trapped: Utils.BooleanHolder, args: any[]): boolean { return false; @@ -907,6 +915,14 @@ export class ArenaTrapAbAttr extends CheckTrappedAbAttr { } } +export class MaxMultiHitAbAttr extends AbAttr { + apply(pokemon: Pokemon, cancelled: Utils.BooleanHolder, args: any[]): boolean { + (args[0] as Utils.IntegerHolder).value = 0; + + return true; + } +} + export class WeightMultiplierAbAttr extends AbAttr { private multiplier: integer; @@ -1667,7 +1683,8 @@ export function initAbilities() { new Ability(Abilities.EARLY_BIRD, "Early Bird (N)", "The Pokémon awakens from sleep twice as fast as other Pokémon.", 3), new Ability(Abilities.FLAME_BODY, "Flame Body", "Contact with the Pokémon may burn the attacker.", 3) .attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.BURN), - new Ability(Abilities.RUN_AWAY, "Run Away (N)", "Enables a sure getaway from wild Pokémon.", 3), + new Ability(Abilities.RUN_AWAY, "Run Away", "Enables a sure getaway from wild Pokémon.", 3) + .attr(RunSuccessAbAttr), new Ability(Abilities.KEEN_EYE, "Keen Eye", "Keen eyes prevent other Pokémon from lowering this Pokémon's accuracy.", 3) .attr(ProtectStatAbAttr, BattleStat.ACC), new Ability(Abilities.HYPER_CUTTER, "Hyper Cutter", "The Pokémon's proud of its powerful pincers. They prevent other Pokémon from lowering its Attack stat.", 3) @@ -1740,7 +1757,8 @@ export function initAbilities() { new Ability(Abilities.POISON_HEAL, "Poison Heal (N)", "Restores HP if the Pokémon is poisoned instead of losing HP.", 4), new Ability(Abilities.ADAPTABILITY, "Adaptability", "Powers up moves of the same type as the Pokémon.", 4) .attr(StabBoostAbAttr), - new Ability(Abilities.SKILL_LINK, "Skill Link (N)", "Maximizes the number of times multistrike moves hit.", 4), + new Ability(Abilities.SKILL_LINK, "Skill Link", "Maximizes the number of times multistrike moves hit.", 4) + .attr(MaxMultiHitAbAttr), new Ability(Abilities.HYDRATION, "Hydration (N)", "Heals status conditions if it's raining.", 4), new Ability(Abilities.SOLAR_POWER, "Solar Power", "Boosts the Sp. Atk stat in harsh sunlight, but HP decreases every turn.", 4) .attr(PostWeatherLapseDamageAbAttr, 2, WeatherType.SUNNY, WeatherType.HARSH_SUN) diff --git a/src/data/move.ts b/src/data/move.ts index 18fb7d1b6c1..abaa92010ea 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -9,7 +9,7 @@ import { Type } from "./type"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagType, ArenaTrapTag } from "./arena-tag"; -import { Abilities, BlockRecoilDamageAttr, IgnoreContactAbAttr, applyAbAttrs } from "./ability"; +import { Abilities, BlockRecoilDamageAttr, IgnoreContactAbAttr, MaxMultiHitAbAttr, applyAbAttrs } from "./ability"; import { PokemonHeldItemModifier } from "../modifier/modifier"; import { BattlerIndex } from "../battle"; import { Stat } from "./pokemon-stat"; @@ -1583,15 +1583,19 @@ export class MultiHitAttr extends MoveAttr { let hitTimes: integer; switch (this.multiHitType) { case MultiHitType._2_TO_5: - const rand = Utils.randInt(16); - if (rand >= 10) - hitTimes = 2; - else if (rand >= 4) - hitTimes = 3; - else if (rand >= 2) - hitTimes = 4; - else - hitTimes = 5; + { + const rand = Utils.randInt(16); + const hitValue = new Utils.IntegerHolder(rand); + applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); + if (hitValue.value >= 10) + hitTimes = 2; + else if (hitValue.value >= 4) + hitTimes = 3; + else if (hitValue.value >= 2) + hitTimes = 4; + else + hitTimes = 5; + } break; case MultiHitType._2: hitTimes = 2; @@ -1604,27 +1608,31 @@ export class MultiHitAttr extends MoveAttr { // TODO: Add power increase for every hit break; case MultiHitType._1_TO_10: - const rand10 = Utils.randInt(90); - if (rand10 >= 81) - hitTimes = 1; - else if (rand10 >= 73) - hitTimes = 2; - else if (rand10 >= 66) - hitTimes = 3; - else if (rand10 >= 60) - hitTimes = 4; - else if (rand10 >= 54) - hitTimes = 5; - else if (rand10 >= 49) - hitTimes = 6; - else if (rand10 >= 44) - hitTimes = 7; - else if (rand10 >= 40) - hitTimes = 8; - else if (rand10 >= 36) - hitTimes = 9; - else - hitTimes = 10; + { + const rand = Utils.randInt(90); + const hitValue = new Utils.IntegerHolder(rand); + applyAbAttrs(MaxMultiHitAbAttr, user, null, hitValue); + if (hitValue.value >= 81) + hitTimes = 1; + else if (hitValue.value >= 73) + hitTimes = 2; + else if (hitValue.value>= 66) + hitTimes = 3; + else if (hitValue.value >= 60) + hitTimes = 4; + else if (hitValue.value >= 54) + hitTimes = 5; + else if (hitValue.value >= 49) + hitTimes = 6; + else if (hitValue.value >= 44) + hitTimes = 7; + else if (hitValue.value >= 40) + hitTimes = 8; + else if (hitValue.value >= 36) + hitTimes = 9; + else + hitTimes = 10; + } break; } (args[0] as Utils.IntegerHolder).value = hitTimes;