From f30a9542eebb2db4fb7245b324fea649787b8352 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Thu, 27 May 2021 22:21:55 -0700 Subject: [PATCH 01/15] Problem: Photon Geyser is calculating as Shell Side Arm?? Needs: Poison effect, contact move for Shell Side Arm --- asm/macros/battle_script.inc | 8 ++++ data/battle_scripts_1.s | 8 ++++ include/battle.h | 2 + include/constants/battle_move_effects.h | 4 +- include/constants/battle_script_commands.h | 2 + src/battle_main.c | 3 ++ src/battle_script_commands.c | 49 ++++++++++++++++++++++ src/battle_util.c | 7 +++- src/data/battle_moves.h | 10 ++--- 9 files changed, 85 insertions(+), 8 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 9fa3fe0c32..b5d21abc4c 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1726,6 +1726,14 @@ .4byte \ptr .endm + .macro photongeysercheck + various BS_ATTACKER, VARIOUS_PHOTON_GEYSER_CHECK + .endm + + .macro shellsidearmcheck + various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK + .endm + .macro trysetfairylock ptr:req various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK .4byte \ptr diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 77eddc8ab6..5445839619 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -367,6 +367,14 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 .4byte BattleScript_EffectFairyLock .4byte BattleScript_EffectAllySwitch .4byte BattleScript_EffectSleepHit + .4byte BattleScript_EffectPhotonGeyser + .4byte BattleScript_EffectShellSideArm + +BattleScript_EffectShellSideArm: + shellsidearmcheck + +BattleScript_EffectPhotonGeyser: + photongeysercheck BattleScript_EffectSleepHit: setmoveeffect MOVE_EFFECT_SLEEP diff --git a/include/battle.h b/include/battle.h index 82a9175388..2195e0a21c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -858,4 +858,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; +extern bool8 gSwapDamageCategory; // Photon Geyser, Shell Side Arm, Light That Burns the Sky + #endif // GUARD_BATTLE_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 74418d2c73..b9cf928542 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -351,7 +351,9 @@ #define EFFECT_FAIRY_LOCK 345 #define EFFECT_ALLY_SWITCH 346 #define EFFECT_SLEEP_HIT 347 // Relic Song +#define EFFECT_PHOTON_GEYSER 348 +#define EFFECT_SHELL_SIDE_ARM 349 -#define NUM_BATTLE_MOVE_EFFECTS 348 +#define NUM_BATTLE_MOVE_EFFECTS 350 #endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index faaf8f17e0..28ba1a5d48 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -173,6 +173,8 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 +#define VARIOUS_PHOTON_GEYSER_CHECK 105 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 106 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_main.c b/src/battle_main.c index 77470246f2..739d33a3ea 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -229,6 +229,7 @@ EWRAM_DATA u16 gPartnerSpriteId = 0; EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA u8 gLastUsedBall = 0; +EWRAM_DATA bool8 gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky // IWRAM common vars void (*gPreBattleCallback1)(void); @@ -2928,6 +2929,8 @@ static void BattleStartClearSetData(void) gBattleStruct->arenaLostOpponentMons = 0; gBattleStruct->mega.triggerSpriteId = 0xFF; + + gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky } void SwitchInClearSetData(void) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fc0eedcbc4..2a761e5c6c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7126,6 +7126,55 @@ static void Cmd_various(void) switch (gBattlescriptCurrInstr[2]) { + case VARIOUS_PHOTON_GEYSER_CHECK: + { + u32 attStat = gBattleMons[gActiveBattler].attack; + u8 atkStage = gBattleMons[gActiveBattler].statStages[STAT_ATK]; + u32 spaStat = gBattleMons[gActiveBattler].spAttack; + + attStat *= gStatStageRatios[atkStage][0]; + attStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gActiveBattler].statStages[STAT_SPATK]; + spaStat *= gStatStageRatios[atkStage][0]; + spaStat /= gStatStageRatios[atkStage][1]; + + if (attStat > spaStat) + gSwapDamageCategory = TRUE; + } + case VARIOUS_SHELL_SIDE_ARM_CHECK: // according to DaWoblefet, 0% chance GameFreak actually checks this way, but this is the only functional explanation at the moment + { + u32 attStat = gBattleMons[gBattlerAttacker].attack; + u8 atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; + u32 attStatDef = gBattleMons[gBattlerTarget].attack; + u32 physical; + + u32 spaStat = gBattleMons[gBattlerAttacker].spAttack; + u32 spaStatDef = gBattleMons[gBattlerTarget].spAttack; + u32 special; + + attStat *= gStatStageRatios[atkStage][0]; + attStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; + attStatDef *= gStatStageRatios[atkStage][0]; + attStatDef /= gStatStageRatios[atkStage][1]; + + physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * attStat) / attStatDef) / 50); + + atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; + spaStat *= gStatStageRatios[atkStage][0]; + spaStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; + spaStatDef *= gStatStageRatios[atkStage][0]; + spaStatDef /= gStatStageRatios[atkStage][1]; + + special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * spaStat) / spaStatDef) / 50); + + if (((physical > special) || (physical == special && (Random() % 2) == 0))) + gSwapDamageCategory = TRUE; + } // Roar will fail in a double wild battle when used by the player against one of the two alive wild mons. // Also when an opposing wild mon uses it againt its partner. case VARIOUS_JUMP_IF_ROAR_FAILS: diff --git a/src/battle_util.c b/src/battle_util.c index 07c1500666..e657a4e960 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8367,8 +8367,11 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) u8 GetBattleMoveSplit(u32 moveId) { if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) - return gBattleMoves[moveId].split; - else if (gBattleMoves[moveId].type < TYPE_MYSTERY) + if (gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky + return SPLIT_PHYSICAL; + else + return gBattleMoves[moveId].split; + else if (gBattleMoves[moveId].type < TYPE_MYSTERY || gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky return SPLIT_PHYSICAL; else return SPLIT_SPECIAL; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 61050e44fd..0e27bb5885 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10343,15 +10343,15 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_PHOTON_GEYSER] = { - .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect + .effect = EFFECT_PHOTON_GEYSER, .power = 100, .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, - .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, + .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TARGET_ABILITY_IGNORED, .split = SPLIT_SPECIAL, }, @@ -11178,12 +11178,12 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = [MOVE_SHELL_SIDE_ARM] = { - .effect = EFFECT_PLACEHOLDER, //TODO + .effect = EFFECT_SHELL_SIDE_ARM, .power = 90, .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 0, + .secondaryEffectChance = 100, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, From 0f09055cfea6a1faf43c7775f7ed7e19aada1536 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Fri, 28 May 2021 11:11:03 -0700 Subject: [PATCH 02/15] Fixes and added Poison chance to Shell Side Arm (needs contact on physical) --- data/battle_scripts_1.s | 3 ++ src/battle_script_commands.c | 100 ++++++++++++++++++----------------- src/battle_util.c | 9 ++-- src/data/battle_moves.h | 4 +- 4 files changed, 60 insertions(+), 56 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5445839619..795518380f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -372,9 +372,12 @@ gBattleScriptsForMoveEffects:: @ 82D86A8 BattleScript_EffectShellSideArm: shellsidearmcheck + setmoveeffect MOVE_EFFECT_POISON + goto BattleScript_EffectHit BattleScript_EffectPhotonGeyser: photongeysercheck + goto BattleScript_EffectHit BattleScript_EffectSleepHit: setmoveeffect MOVE_EFFECT_SLEEP diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2a761e5c6c..e387423bc4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7126,55 +7126,6 @@ static void Cmd_various(void) switch (gBattlescriptCurrInstr[2]) { - case VARIOUS_PHOTON_GEYSER_CHECK: - { - u32 attStat = gBattleMons[gActiveBattler].attack; - u8 atkStage = gBattleMons[gActiveBattler].statStages[STAT_ATK]; - u32 spaStat = gBattleMons[gActiveBattler].spAttack; - - attStat *= gStatStageRatios[atkStage][0]; - attStat /= gStatStageRatios[atkStage][1]; - - atkStage = gBattleMons[gActiveBattler].statStages[STAT_SPATK]; - spaStat *= gStatStageRatios[atkStage][0]; - spaStat /= gStatStageRatios[atkStage][1]; - - if (attStat > spaStat) - gSwapDamageCategory = TRUE; - } - case VARIOUS_SHELL_SIDE_ARM_CHECK: // according to DaWoblefet, 0% chance GameFreak actually checks this way, but this is the only functional explanation at the moment - { - u32 attStat = gBattleMons[gBattlerAttacker].attack; - u8 atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; - u32 attStatDef = gBattleMons[gBattlerTarget].attack; - u32 physical; - - u32 spaStat = gBattleMons[gBattlerAttacker].spAttack; - u32 spaStatDef = gBattleMons[gBattlerTarget].spAttack; - u32 special; - - attStat *= gStatStageRatios[atkStage][0]; - attStat /= gStatStageRatios[atkStage][1]; - - atkStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; - attStatDef *= gStatStageRatios[atkStage][0]; - attStatDef /= gStatStageRatios[atkStage][1]; - - physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * attStat) / attStatDef) / 50); - - atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; - spaStat *= gStatStageRatios[atkStage][0]; - spaStat /= gStatStageRatios[atkStage][1]; - - atkStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; - spaStatDef *= gStatStageRatios[atkStage][0]; - spaStatDef /= gStatStageRatios[atkStage][1]; - - special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * spaStat) / spaStatDef) / 50); - - if (((physical > special) || (physical == special && (Random() % 2) == 0))) - gSwapDamageCategory = TRUE; - } // Roar will fail in a double wild battle when used by the player against one of the two alive wild mons. // Also when an opposing wild mon uses it againt its partner. case VARIOUS_JUMP_IF_ROAR_FAILS: @@ -8429,6 +8380,57 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; // exit if loop failed (failsafe) } return; + case VARIOUS_PHOTON_GEYSER_CHECK: + { + u32 attStat = gBattleMons[gActiveBattler].attack; + u8 atkStage = gBattleMons[gActiveBattler].statStages[STAT_ATK]; + u32 spaStat = gBattleMons[gActiveBattler].spAttack; + + attStat *= gStatStageRatios[atkStage][0]; + attStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gActiveBattler].statStages[STAT_SPATK]; + spaStat *= gStatStageRatios[atkStage][0]; + spaStat /= gStatStageRatios[atkStage][1]; + + if (attStat > spaStat) + gSwapDamageCategory = TRUE; + break; + } + case VARIOUS_SHELL_SIDE_ARM_CHECK: // 0% chance GameFreak actually checks this way according to DaWobblefet, but this is the only functional explanation at the moment + { + u32 attStat = gBattleMons[gBattlerAttacker].attack; + u8 atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; + u32 attStatDef = gBattleMons[gBattlerTarget].attack; + u32 physical; + + u32 spaStat = gBattleMons[gBattlerAttacker].spAttack; + u32 spaStatDef = gBattleMons[gBattlerTarget].spAttack; + u32 special; + + attStat *= gStatStageRatios[atkStage][0]; + attStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; + attStatDef *= gStatStageRatios[atkStage][0]; + attStatDef /= gStatStageRatios[atkStage][1]; + + physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * attStat) / attStatDef) / 50); + + atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; + spaStat *= gStatStageRatios[atkStage][0]; + spaStat /= gStatStageRatios[atkStage][1]; + + atkStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; + spaStatDef *= gStatStageRatios[atkStage][0]; + spaStatDef /= gStatStageRatios[atkStage][1]; + + special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * 90 * spaStat) / spaStatDef) / 50); + + if (((physical > special) || (physical == special && (Random() % 2) == 0))) + gSwapDamageCategory = TRUE; + break; + } } gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index e657a4e960..5703770021 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8366,12 +8366,11 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) u8 GetBattleMoveSplit(u32 moveId) { + if (gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky + return SPLIT_PHYSICAL; if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) - if (gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky - return SPLIT_PHYSICAL; - else - return gBattleMoves[moveId].split; - else if (gBattleMoves[moveId].type < TYPE_MYSTERY || gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky + return gBattleMoves[moveId].split; + else if (gBattleMoves[moveId].type < TYPE_MYSTERY) return SPLIT_PHYSICAL; else return SPLIT_SPECIAL; diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h index 0e27bb5885..89b2e29aac 100644 --- a/src/data/battle_moves.h +++ b/src/data/battle_moves.h @@ -10348,7 +10348,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_PSYCHIC, .accuracy = 100, .pp = 5, - .secondaryEffectChance = 100, + .secondaryEffectChance = 0, .target = MOVE_TARGET_FOES_AND_ALLY, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED | FLAG_TARGET_ABILITY_IGNORED, @@ -11183,7 +11183,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] = .type = TYPE_POISON, .accuracy = 100, .pp = 10, - .secondaryEffectChance = 100, + .secondaryEffectChance = 20, .target = MOVE_TARGET_SELECTED, .priority = 0, .flags = FLAG_PROTECT_AFFECTED | FLAG_MIRROR_MOVE_AFFECTED | FLAG_KINGS_ROCK_AFFECTED, From c4b700a8e7e9298610bf439380dc86383f0b0f22 Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sat, 5 Jun 2021 13:47:05 -0700 Subject: [PATCH 03/15] Only thing left is making IsMoveMakingContact work when hitting King's Shield, etc. --- src/battle_script_commands.c | 2 +- src/battle_util.c | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e387423bc4..422738795c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4708,7 +4708,7 @@ static void Cmd_moveend(void) switch (gBattleScripting.moveendState) { case MOVEEND_PROTECT_LIKE_EFFECT: - if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) // needs to be IsMoveMakingContact, but this file does not reference include/battle_util.h or src/battle_util.c { if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { diff --git a/src/battle_util.c b/src/battle_util.c index 5703770021..fb41105913 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4556,7 +4556,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && IsBattlerAlive(gBattlerAttacker) && TARGET_TURN_DAMAGED - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) + && (IsMoveMakingContact(move, gBattlerAttacker))) { switch (gBattleMons[gBattlerAttacker].ability) { @@ -4745,7 +4745,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (IsMoveMakingContact(move, gBattlerAttacker)) && TARGET_TURN_DAMAGED && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_FIRE) && GetBattlerAbility(gBattlerAttacker) != ABILITY_WATER_VEIL @@ -4764,7 +4764,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (IsMoveMakingContact(move, gBattlerAttacker)) && TARGET_TURN_DAMAGED && gBattleMons[gBattlerTarget].hp != 0 && (Random() % 3) == 0 @@ -4832,7 +4832,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) - && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + && (IsMoveMakingContact(move, gBattlerAttacker)) && !(gStatuses3[gBattlerAttacker] & STATUS3_PERISH_SONG)) { if (!(gStatuses3[battler] & STATUS3_PERISH_SONG)) @@ -6665,7 +6665,10 @@ u32 GetBattlerHoldEffectParam(u8 battlerId) bool32 IsMoveMakingContact(u16 move, u8 battlerAtk) { if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) - return FALSE; + if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory == TRUE) + return TRUE; + else + return FALSE; else if (GetBattlerAbility(battlerAtk) == ABILITY_LONG_REACH) return FALSE; else if (GetBattlerHoldEffect(battlerAtk, TRUE) == HOLD_EFFECT_PROTECTIVE_PADS) @@ -7135,7 +7138,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe MulModifier(&modifier, UQ_4_12(1.3)); break; case ABILITY_TOUGH_CLAWS: - if (gBattleMoves[move].flags & FLAG_MAKES_CONTACT) + if (IsMoveMakingContact(move, battlerAtk)) MulModifier(&modifier, UQ_4_12(1.3)); break; case ABILITY_STRONG_JAW: From 517763bc9f31721813eb283b6fadce88e23bc825 Mon Sep 17 00:00:00 2001 From: MissingNoL <84547991+MissingNoL@users.noreply.github.com> Date: Sat, 5 Jun 2021 16:38:37 -0700 Subject: [PATCH 04/15] Update src/battle_util.c Changed an `if` to `else if` Co-authored-by: LOuroboros --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index fb41105913..0d4a7f18af 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8371,7 +8371,7 @@ u8 GetBattleMoveSplit(u32 moveId) { if (gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky return SPLIT_PHYSICAL; - if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) + else if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) return gBattleMoves[moveId].split; else if (gBattleMoves[moveId].type < TYPE_MYSTERY) return SPLIT_PHYSICAL; From 921b80de7c138a0c0320187ae2a383d22a390f13 Mon Sep 17 00:00:00 2001 From: MissingNoL <84547991+MissingNoL@users.noreply.github.com> Date: Sat, 5 Jun 2021 16:40:03 -0700 Subject: [PATCH 05/15] Update battle_script_commands.h Properly aligned the list of number IDs --- include/constants/battle_script_commands.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 28ba1a5d48..3976d4375a 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -173,8 +173,8 @@ #define VARIOUS_DESTROY_ABILITY_POPUP 102 #define VARIOUS_TOTEM_BOOST 103 #define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104 -#define VARIOUS_PHOTON_GEYSER_CHECK 105 -#define VARIOUS_SHELL_SIDE_ARM_CHECK 106 +#define VARIOUS_PHOTON_GEYSER_CHECK 105 +#define VARIOUS_SHELL_SIDE_ARM_CHECK 106 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 From d69cfcff7043a1a97d0835747dd727f1a3709d34 Mon Sep 17 00:00:00 2001 From: MissingNoL <84547991+MissingNoL@users.noreply.github.com> Date: Sat, 5 Jun 2021 16:43:19 -0700 Subject: [PATCH 06/15] Update battle_script_commands.c Included src/battle_util.c to call IsMoveMakingContact --- src/battle_script_commands.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 422738795c..bb81b2cbc6 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -53,6 +53,7 @@ #include "constants/rgb.h" #include "data.h" #include "constants/party_menu.h" +#include "src/battle_util.c" extern struct MusicPlayerInfo gMPlayInfo_BGM; @@ -4708,7 +4709,7 @@ static void Cmd_moveend(void) switch (gBattleScripting.moveendState) { case MOVEEND_PROTECT_LIKE_EFFECT: - if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) // needs to be IsMoveMakingContact, but this file does not reference include/battle_util.h or src/battle_util.c + if (IsMoveMakingContact(move, gBattlerAttacker)) { if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { From caf2548830d67dd9e6de97c8b29cc1ddbe777c2a Mon Sep 17 00:00:00 2001 From: MissingNoL Date: Sun, 6 Jun 2021 21:40:38 -0700 Subject: [PATCH 07/15] Included `battle_util.h`, fixed parameter `IsMoveMakingContact` --- src/battle_script_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1dadeadb1d..bc1b48cfca 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -54,7 +54,7 @@ #include "constants/rgb.h" #include "data.h" #include "constants/party_menu.h" -#include "src/battle_util.c" +#include "battle_util.h" extern struct MusicPlayerInfo gMPlayInfo_BGM; @@ -4781,7 +4781,7 @@ static void Cmd_moveend(void) switch (gBattleScripting.moveendState) { case MOVEEND_PROTECT_LIKE_EFFECT: - if (IsMoveMakingContact(move, gBattlerAttacker)) + if (IsMoveMakingContact(gCurrentMove, gBattlerAttacker)) { if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { From d5b5090d521522abe6d7d377b1475ebdee68dcc3 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 27 Oct 2021 09:36:00 -0300 Subject: [PATCH 08/15] Fixed BattleScript_EffectPhotonGeyser --- data/battle_scripts_1.s | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 447c329e0a..c6ae2e8487 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -399,7 +399,28 @@ BattleScript_EffectShellSideArm: goto BattleScript_EffectHit BattleScript_EffectPhotonGeyser: + attackcanceler + accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE + attackstring + ppreduce + critcalc + damagecalc + adjustdamage photongeysercheck + attackanimation + waitanimation + effectivenesssound + hitanimation BS_TARGET + waitstate + healthbarupdate BS_TARGET + datahpupdate BS_TARGET + critmessage + waitmessage B_WAIT_TIME_LONG + resultmessage + waitmessage B_WAIT_TIME_LONG + seteffectwithchance + tryfaintmon BS_TARGET, FALSE, NULL + goto BattleScript_MoveEnd BattleScript_EffectPlasmaFists: attackcanceler From ad95fa3d15abfe3080e00beab69225c2bc288bf7 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 27 Oct 2021 10:03:27 -0300 Subject: [PATCH 09/15] Updated Shell Side Arm's description --- src/data/text/move_descriptions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index e204fb1961..037261e321 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2839,7 +2839,7 @@ static const u8 sMETEOR_BEAMDescription[] = _( "Sp. Attack before attacking."); static const u8 sSHELL_SIDE_ARMDescription[] = _( - "Uses higher of physical and\n" + "Deals better of physical and\n" "special damage. May poison."); static const u8 sMISTY_EXPLOSIONDescription[] = _( From de157919b060e70cb430050b176ef487c28b0753 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 27 Oct 2021 11:05:01 -0300 Subject: [PATCH 10/15] Added animations for Shell Side Arm --- data/battle_anim_scripts.s | 45 +++++++++++++++++++++++++++++++++++++- src/battle_anim_new.c | 9 ++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 994bc5cc10..30a4ccc612 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -13995,7 +13995,50 @@ Move_METEOR_BEAM:: end @to do: Move_SHELL_SIDE_ARM:: - end @to do: + launchtask AnimTask_ShellSideArm 0x5 0x0 + jumpargeq 0x0, TRUE, Move_SHELL_SIDE_ARM_PHYSICAL + jumpargeq 0x0, FALSE, Move_SHELL_SIDE_ARM_SPECIAL +Move_SHELL_SIDE_ARM_PHYSICAL: @ Modified Body Slam, placeholder + loadspritegfx ANIM_TAG_IMPACT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT, 0, 6, 6, RGB_MAGENTA + monbg ANIM_DEF_PARTNER + setalpha 12, 8 + playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER + createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER + waitforvisualfinish + delay 11 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + delay 6 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 + loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 10, 2 + delay 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + waitforvisualfinish + createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 + waitforvisualfinish + delay 10 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 6 + delay 5 + createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 6 + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + blendoff + end +Move_SHELL_SIDE_ARM_SPECIAL: @ Modified Snipe Shot, placeholder + loadspritegfx ANIM_TAG_IMPACT_2 + loadspritegfx ANIM_TAG_LEER + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_IMPACT_2, 0, 6, 6, RGB_MAGENTA + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_LEER, 0, 6, 6, RGB_MAGENTA + launchtemplate gLeerSpriteTemplate 0x82, 2 0x18 -12 + playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER + waitforvisualfinish + delay 0x20 + playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_TARGET + launchtemplate gSnipeShotBallTemplate 0x82, 3, 0 0 24, + waitforvisualfinish + launchtask AnimTask_ShakeMon2 2 5 1 4 0 8, 1 + waitforvisualfinish + end Move_MISTY_EXPLOSION:: end @to do: diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index d04483e6b1..3bc45939fb 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -5064,3 +5064,12 @@ void AnimTask_PrimalReversion(u8 taskId) gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } + +void AnimTask_ShellSideArm(u8 taskId) +{ + if (gSwapDamageCategory) + gBattleAnimArgs[0] = TRUE; + else + gBattleAnimArgs[0] = FALSE; + DestroyAnimVisualTask(taskId); +} From 8c35a6806014cede7354f0e6c47eb075223ce507 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Wed, 27 Oct 2021 11:19:39 -0300 Subject: [PATCH 11/15] Quick syntax tweaks --- asm/macros/battle_script.inc | 16 ++++++++-------- include/battle.h | 1 - src/battle_util.c | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index b838cb6d28..4a8570a1a0 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1731,14 +1731,6 @@ .4byte \ptr .endm - .macro photongeysercheck - various BS_ATTACKER, VARIOUS_PHOTON_GEYSER_CHECK - .endm - - .macro shellsidearmcheck - various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK - .endm - .macro trysetfairylock ptr:req various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK .4byte \ptr @@ -1866,6 +1858,14 @@ various BS_ATTACKER, VARIOUS_APPLY_PLASMA_FISTS .endm + .macro photongeysercheck + various BS_ATTACKER, VARIOUS_PHOTON_GEYSER_CHECK + .endm + + .macro shellsidearmcheck + various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK + .endm + @ helpful macros .macro setstatchanger stat:req, stages:req, down:req setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7 diff --git a/include/battle.h b/include/battle.h index 00b2c2f25b..b5dabaded3 100644 --- a/include/battle.h +++ b/include/battle.h @@ -918,7 +918,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT]; extern bool8 gHasFetchedBall; extern u8 gLastUsedBall; extern u16 gLastThrownBall; - extern bool8 gSwapDamageCategory; // Photon Geyser, Shell Side Arm, Light That Burns the Sky #endif // GUARD_BATTLE_H diff --git a/src/battle_util.c b/src/battle_util.c index f79ce62b29..7797b47511 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -7271,7 +7271,7 @@ bool32 IsMoveMakingContact(u16 move, u8 battlerAtk) { if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) { - if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory == TRUE) + if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory) return TRUE; else return FALSE; @@ -9077,7 +9077,7 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) u8 GetBattleMoveSplit(u32 moveId) { - if (gSwapDamageCategory == TRUE) // Photon Geyser, Shell Side Arm, Light That Burns the Sky + if (gSwapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky return SPLIT_PHYSICAL; else if (IS_MOVE_STATUS(moveId) || B_PHYSICAL_SPECIAL_SPLIT >= GEN_4) return gBattleMoves[moveId].split; From 13029cd3b38049b880212e247234eb2ae2c2cfa5 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 5 Nov 2021 10:50:21 -0300 Subject: [PATCH 12/15] Tweaked VARIOUS_PHOTON_GEYSER_CHECK and VARIOUS_SHELL_SIDE_ARM_CHECK --- src/battle_script_commands.c | 56 ++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 73dcca97c4..a89487ce82 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8996,50 +8996,50 @@ static void Cmd_various(void) return; case VARIOUS_PHOTON_GEYSER_CHECK: { - u32 attStat = gBattleMons[gActiveBattler].attack; - u8 atkStage = gBattleMons[gActiveBattler].statStages[STAT_ATK]; - u32 spaStat = gBattleMons[gActiveBattler].spAttack; + u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack; + u8 attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; + u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack; - attStat *= gStatStageRatios[atkStage][0]; - attStat /= gStatStageRatios[atkStage][1]; + attackerAtkStat *= gStatStageRatios[attackerAtkStage][0]; + attackerAtkStat /= gStatStageRatios[attackerAtkStage][1]; - atkStage = gBattleMons[gActiveBattler].statStages[STAT_SPATK]; - spaStat *= gStatStageRatios[atkStage][0]; - spaStat /= gStatStageRatios[atkStage][1]; + attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; + attackerSpAtkStat *= gStatStageRatios[attackerAtkStage][0]; + attackerSpAtkStat /= gStatStageRatios[attackerAtkStage][1]; - if (attStat > spaStat) + if (attackerAtkStat > attackerSpAtkStat) gSwapDamageCategory = TRUE; break; } case VARIOUS_SHELL_SIDE_ARM_CHECK: // 0% chance GameFreak actually checks this way according to DaWobblefet, but this is the only functional explanation at the moment { - u32 attStat = gBattleMons[gBattlerAttacker].attack; - u8 atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; - u32 attStatDef = gBattleMons[gBattlerTarget].attack; + u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack; + u32 targetDefStat = gBattleMons[gBattlerTarget].defense; + u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack; + u32 targetSpDefStat = gBattleMons[gBattlerTarget].spDefense; + u8 statStage; u32 physical; - - u32 spaStat = gBattleMons[gBattlerAttacker].spAttack; - u32 spaStatDef = gBattleMons[gBattlerTarget].spAttack; u32 special; - attStat *= gStatStageRatios[atkStage][0]; - attStat /= gStatStageRatios[atkStage][1]; + statStage = = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; + attackerAtkStat *= gStatStageRatios[statStage][0]; + attackerAtkStat /= gStatStageRatios[statStage][1]; - atkStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; - attStatDef *= gStatStageRatios[atkStage][0]; - attStatDef /= gStatStageRatios[atkStage][1]; + statStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; + targetDefStat *= gStatStageRatios[statStage][0]; + targetDefStat /= gStatStageRatios[statStage][1]; - physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attStat) / attStatDef) / 50); + physical = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerAtkStat) / targetDefStat) / 50); - atkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; - spaStat *= gStatStageRatios[atkStage][0]; - spaStat /= gStatStageRatios[atkStage][1]; + statStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK]; + attackerSpAtkStat *= gStatStageRatios[statStage][0]; + attackerSpAtkStat /= gStatStageRatios[statStage][1]; - atkStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; - spaStatDef *= gStatStageRatios[atkStage][0]; - spaStatDef /= gStatStageRatios[atkStage][1]; + statStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; + targetSpDefStat *= gStatStageRatios[statStage][0]; + targetSpDefStat /= gStatStageRatios[statStage][1]; - special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * spaStat) / spaStatDef) / 50); + special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerSpAtkStat) / targetSpDefStat) / 50); if (((physical > special) || (physical == special && (Random() % 2) == 0))) gSwapDamageCategory = TRUE; From b23d5db5981b100f5d241a3cba3c0fee68b47a1d Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 5 Nov 2021 13:02:16 -0300 Subject: [PATCH 13/15] Oops --- src/battle_script_commands.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 97a7b034fc..ec7c6effa2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9032,7 +9032,7 @@ static void Cmd_various(void) u32 physical; u32 special; - statStage = = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; + statStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; attackerAtkStat *= gStatStageRatios[statStage][0]; attackerAtkStat /= gStatStageRatios[statStage][1]; From 4bdbef9a9d25d8e547c2bd97e962df3b43d95e05 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 5 Nov 2021 22:21:50 -0300 Subject: [PATCH 14/15] Use the right defensive target stats during Shell Side Arm calculation --- src/battle_script_commands.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ec7c6effa2..938c4bf54a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9036,7 +9036,7 @@ static void Cmd_various(void) attackerAtkStat *= gStatStageRatios[statStage][0]; attackerAtkStat /= gStatStageRatios[statStage][1]; - statStage = gBattleMons[gBattlerTarget].statStages[STAT_ATK]; + statStage = gBattleMons[gBattlerTarget].statStages[STAT_DEF]; targetDefStat *= gStatStageRatios[statStage][0]; targetDefStat /= gStatStageRatios[statStage][1]; @@ -9046,7 +9046,7 @@ static void Cmd_various(void) attackerSpAtkStat *= gStatStageRatios[statStage][0]; attackerSpAtkStat /= gStatStageRatios[statStage][1]; - statStage = gBattleMons[gBattlerTarget].statStages[STAT_SPATK]; + statStage = gBattleMons[gBattlerTarget].statStages[STAT_SPDEF]; targetSpDefStat *= gStatStageRatios[statStage][0]; targetSpDefStat /= gStatStageRatios[statStage][1]; From c2e8c1058fdd73c97a9b3e112bf03962e05d5aea Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 5 Nov 2021 23:07:26 -0300 Subject: [PATCH 15/15] Force set gSwapDamageCategory's initial value in Photon Geyser's and Shell Side Arm's calculations --- src/battle_script_commands.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 938c4bf54a..78872b638b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -9011,6 +9011,8 @@ static void Cmd_various(void) u8 attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack; + gSwapDamageCategory = FALSE; + attackerAtkStat *= gStatStageRatios[attackerAtkStage][0]; attackerAtkStat /= gStatStageRatios[attackerAtkStage][1]; @@ -9032,6 +9034,8 @@ static void Cmd_various(void) u32 physical; u32 special; + gSwapDamageCategory = FALSE; + statStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; attackerAtkStat *= gStatStageRatios[statStage][0]; attackerAtkStat /= gStatStageRatios[statStage][1];