diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 5f92d592d2..d30d084a66 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -829,7 +829,7 @@ .4byte \failInstr .endm - .macro damagetohalftargethp + .macro unused_0x94 .byte 0x94 .endm @@ -877,11 +877,11 @@ .byte 0x9e .endm - .macro dmgtolevel + .macro unused_0x9f .byte 0x9f .endm - .macro psywavedamageeffect + .macro unused_0xA0 .byte 0xa0 .endm @@ -2030,10 +2030,6 @@ .4byte \jumpInstr .endm - .macro setargtobattledamage - various BS_ATTACKER, VARIOUS_SET_ARG_TO_BATTLE_DAMAGE - .endm - .macro tryautotomize battler:req, failInstr:req various \battler, VARIOUS_TRY_AUTOTOMIZE .4byte \failInstr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index d4ab0e8e61..f5f1d948a2 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3418,16 +3418,6 @@ BattleScript_KOFail:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectSuperFang:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - damagetohalftargethp - goto BattleScript_HitFromAtkAnimation - BattleScript_RecoilIfMiss:: printstring STRINGID_PKMNCRASHED waitmessage B_WAIT_TIME_LONG @@ -3873,28 +3863,6 @@ BattleScript_EffectDisable:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectLevelDamage:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - dmgtolevel - adjustdamage - goto BattleScript_HitFromAtkAnimation - -BattleScript_EffectPsywave:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - psywavedamageeffect - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectCounter:: attackcanceler counterdamagecalculator BattleScript_FailedFromAtkString @@ -4380,17 +4348,6 @@ BattleScript_EffectBatonPass:: switchineffects BS_ATTACKER goto BattleScript_MoveEnd -BattleScript_EffectFixedDamageArg:: - attackcanceler - accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE - attackstring - ppreduce - typecalc - clearmoveresultflags MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE - setargtobattledamage - adjustdamage - goto BattleScript_HitFromAtkAnimation - BattleScript_EffectMorningSun:: BattleScript_EffectSynthesis:: BattleScript_EffectMoonlight:: diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 027b69ef1f..d67fa47be4 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -592,8 +592,6 @@ extern const u8 BattleScript_EffectToxic[]; extern const u8 BattleScript_EffectLightScreen[]; extern const u8 BattleScript_EffectRest[]; extern const u8 BattleScript_EffectOHKO[]; -extern const u8 BattleScript_EffectSuperFang[]; -extern const u8 BattleScript_EffectFixedDamageArg[]; extern const u8 BattleScript_EffectHealBlock[]; extern const u8 BattleScript_RecoilIfMiss[]; extern const u8 BattleScript_EffectMist[]; @@ -628,8 +626,6 @@ extern const u8 BattleScript_EffectHoldHands[]; extern const u8 BattleScript_EffectCelebrate[]; extern const u8 BattleScript_EffectHappyHour[]; extern const u8 BattleScript_EffectDisable[]; -extern const u8 BattleScript_EffectLevelDamage[]; -extern const u8 BattleScript_EffectPsywave[]; extern const u8 BattleScript_EffectCounter[]; extern const u8 BattleScript_EffectEncore[]; extern const u8 BattleScript_EffectPainSplit[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index b0cccc2626..c59b0ee170 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -134,7 +134,6 @@ enum CmdVarious VARIOUS_TRY_ELECTRIFY, VARIOUS_TRY_SOAK, VARIOUS_TRY_LAST_RESORT, - VARIOUS_SET_ARG_TO_BATTLE_DAMAGE, VARIOUS_TRY_AUTOTOMIZE, VARIOUS_ABILITY_POPUP, VARIOUS_JUMP_IF_TARGET_ALLY, diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 93e572a28a..d9a1713e32 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -174,6 +174,7 @@ void RecordKnownMove(u32 battlerId, u32 move) s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { + if (BATTLE_HISTORY->usedMoves[battlerId][i] == move) break; if (BATTLE_HISTORY->usedMoves[battlerId][i] == MOVE_NONE) @@ -577,15 +578,6 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal switch (effect) { - case EFFECT_LEVEL_DAMAGE: - median = maximum = minimum = gBattleMons[damageCalcData->battlerAtk].level; - break; - case EFFECT_PSYWAVE: - median = maximum = minimum = gBattleMons[damageCalcData->battlerAtk].level; - break; - case EFFECT_FIXED_DAMAGE_ARG: - median = maximum = minimum = GetMoveFixedDamage(move); - break; case EFFECT_MULTI_HIT: if (move == MOVE_WATER_SHURIKEN && gBattleMons[damageCalcData->battlerAtk].species == SPECIES_GRENINJA_ASH) { @@ -617,9 +609,6 @@ static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCal // If target has less HP than user, Endeavor does no damage median = maximum = minimum = max(0, gBattleMons[damageCalcData->battlerDef].hp - gBattleMons[damageCalcData->battlerAtk].hp); break; - case EFFECT_SUPER_FANG: - median = maximum = minimum = max(1, gBattleMons[damageCalcData->battlerDef].hp / 2); - break; case EFFECT_FINAL_GAMBIT: median = maximum = minimum = gBattleMons[damageCalcData->battlerAtk].hp; break; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d5c64a57ed..dca87252e0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -494,7 +494,7 @@ static void Cmd_tryconversiontypechange(void); static void Cmd_givepaydaymoney(void); static void Cmd_setlightscreen(void); static void Cmd_tryKO(void); -static void Cmd_damagetohalftargethp(void); +static void Cmd_unused_0x94(void); static void Cmd_copybidedmg(void); static void Cmd_unused_96(void); static void Cmd_tryinfatuating(void); @@ -505,8 +505,8 @@ static void Cmd_transformdataexecution(void); static void Cmd_setsubstitute(void); static void Cmd_mimicattackcopy(void); static void Cmd_metronome(void); -static void Cmd_dmgtolevel(void); -static void Cmd_psywavedamageeffect(void); +static void Cmd_unused_0x9f(void); +static void Cmd_unused_0xA0(void); static void Cmd_counterdamagecalculator(void); static void Cmd_mirrorcoatdamagecalculator(void); static void Cmd_disablelastusedattack(void); @@ -753,7 +753,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_givepaydaymoney, //0x91 Cmd_setlightscreen, //0x92 Cmd_tryKO, //0x93 - Cmd_damagetohalftargethp, //0x94 + Cmd_unused_0x94, //0x94 Cmd_copybidedmg, //0x95 Cmd_unused_96, //0x96 Cmd_tryinfatuating, //0x97 @@ -764,8 +764,8 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_setsubstitute, //0x9C Cmd_mimicattackcopy, //0x9D Cmd_metronome, //0x9E - Cmd_dmgtolevel, //0x9F - Cmd_psywavedamageeffect, //0xA0 + Cmd_unused_0x9f, //0x9F + Cmd_unused_0xA0, //0xA0 Cmd_counterdamagecalculator, //0xA1 Cmd_mirrorcoatdamagecalculator, //0xA2 Cmd_disablelastusedattack, //0xA3 @@ -11021,12 +11021,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->failInstr; return; } - case VARIOUS_SET_ARG_TO_BATTLE_DAMAGE: - { - VARIOUS_ARGS(); - gBattleStruct->moveDamage[gBattlerTarget] = GetMoveFixedDamage(gCurrentMove); - break; - } case VARIOUS_TRY_AUTOTOMIZE: { VARIOUS_ARGS(const u8 *failInstr); @@ -13195,16 +13189,8 @@ static void Cmd_tryKO(void) #undef FOCUS_BANDED #undef AFFECTION_ENDURED -// Super Fang -static void Cmd_damagetohalftargethp(void) +static void Cmd_unused_0x94(void) { - CMD_ARGS(); - - gBattleStruct->moveDamage[gBattlerTarget] = GetNonDynamaxHP(gBattlerTarget) / 2; - if (gBattleStruct->moveDamage[gBattlerTarget] == 0) - gBattleStruct->moveDamage[gBattlerTarget] = 1; - - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_copybidedmg(void) @@ -13515,21 +13501,12 @@ static void Cmd_metronome(void) ResetValuesForCalledMove(); } -static void Cmd_dmgtolevel(void) +static void Cmd_unused_0x9f(void) { - CMD_ARGS(); - - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerAttacker].level; - gBattlescriptCurrInstr = cmd->nextInstr; } -static void Cmd_psywavedamageeffect(void) +static void Cmd_unused_0xA0(void) { - CMD_ARGS(); - - s32 randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); - gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerAttacker].level * (randDamage + 50) / 100; - gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_counterdamagecalculator(void) diff --git a/src/battle_util.c b/src/battle_util.c index 91e7a7c2d0..8c60271c43 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10499,6 +10499,37 @@ s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalc return dmg; } +static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalcData) +{ + s32 dmg = 0; + + switch (GetMoveEffect(damageCalcData->move)) + { + case EFFECT_LEVEL_DAMAGE: + dmg = gBattleMons[damageCalcData->battlerAtk].level; + break; + case EFFECT_PSYWAVE: + s32 randDamage = B_PSYWAVE_DMG >= GEN_6 ? (Random() % 101) : ((Random() % 11) * 10); + dmg = gBattleMons[damageCalcData->battlerAtk].level * (randDamage + 50) / 100; + break; + case EFFECT_FIXED_DAMAGE_ARG: + dmg = GetMoveFixedDamage(damageCalcData->move); + break; + case EFFECT_SUPER_FANG: + dmg = GetNonDynamaxHP(gBattlerTarget) / 2; + break; + default: + return INT32_MAX; + } + + gBattleStruct->moveResultFlags[damageCalcData->battlerDef] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE); + + if (dmg == 0) + dmg = 1; + + return dmg; +} + static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather) { u32 holdEffectAtk, holdEffectDef, abilityAtk, abilityDef; @@ -10506,6 +10537,10 @@ static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, if (typeEffectivenessModifier == UQ_4_12(0.0)) return 0; + s32 dmg = DoFixedDamageMoveCalc(damageCalcData); + if (dmg != INT32_MAX) + return dmg; + holdEffectAtk = GetBattlerHoldEffect(damageCalcData->battlerAtk, TRUE); holdEffectDef = GetBattlerHoldEffect(damageCalcData->battlerDef, TRUE); abilityAtk = GetBattlerAbility(damageCalcData->battlerAtk); @@ -10614,6 +10649,10 @@ s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedB s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather, u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef) { + s32 dmg = DoFixedDamageMoveCalc(damageCalcData); + if (dmg != INT32_MAX) + return dmg; + return DoMoveDamageCalcVars(damageCalcData, fixedBasePower, typeEffectivenessModifier, weather, holdEffectAtk, holdEffectDef, abilityAtk, abilityDef); } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index dc0413af2d..38928c4f4c 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -218,14 +218,14 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_SUPER_FANG] = { - .battleScript = BattleScript_EffectSuperFang, + .battleScript = BattleScript_EffectHit, .battleTvScore = 5, .encourageEncore = TRUE, }, [EFFECT_FIXED_DAMAGE_ARG] = { - .battleScript = BattleScript_EffectFixedDamageArg, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, @@ -454,13 +454,13 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_LEVEL_DAMAGE] = { - .battleScript = BattleScript_EffectLevelDamage, + .battleScript = BattleScript_EffectHit, .battleTvScore = 2, }, [EFFECT_PSYWAVE] = { - .battleScript = BattleScript_EffectPsywave, + .battleScript = BattleScript_EffectHit, .battleTvScore = 1, }, diff --git a/test/battle/move_effect/level_damage.c b/test/battle/move_effect/level_damage.c new file mode 100644 index 0000000000..2ccf1ae964 --- /dev/null +++ b/test/battle/move_effect/level_damage.c @@ -0,0 +1,23 @@ +#include "global.h" +#include "test/battle.h" + +ASSUMPTIONS +{ + ASSUME(GetMoveEffect(MOVE_SEISMIC_TOSS) == EFFECT_LEVEL_DAMAGE); +} + +SINGLE_BATTLE_TEST("Level Damage: Seismic Toss deals damage based on user's level") +{ + s16 dmg; + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Level(50); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SEISMIC_TOSS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SEISMIC_TOSS, player); + HP_BAR(opponent, captureDamage: &dmg); + } THEN { + EXPECT(dmg == 50); + } +}