move gSwapDamagecategory to battle struct, use GetSplitBasedOnStats for photon geyser check

This commit is contained in:
ghoulslash 2022-07-19 18:24:53 -04:00
parent f2ee9f3ba0
commit 2b5bb9f6e4
8 changed files with 13 additions and 30 deletions

View File

@ -1928,8 +1928,8 @@
.4byte \ptr .4byte \ptr
.endm .endm
.macro photongeysercheck .macro photongeysercheck battler:req
various BS_ATTACKER, VARIOUS_PHOTON_GEYSER_CHECK various \battler, VARIOUS_PHOTON_GEYSER_CHECK
.endm .endm
.macro shellsidearmcheck .macro shellsidearmcheck

View File

@ -722,7 +722,7 @@ BattleScript_EffectPhotonGeyser:
critcalc critcalc
damagecalc damagecalc
adjustdamage adjustdamage
photongeysercheck photongeysercheck BS_ATTACKER
attackanimation attackanimation
waitanimation waitanimation
effectivenesssound effectivenesssound

View File

@ -615,6 +615,7 @@ struct BattleStruct
u8 quickClawBattlerId; u8 quickClawBattlerId;
struct StolenItem itemStolen[PARTY_SIZE]; // Player's team that had items stolen (two bytes per party member) struct StolenItem itemStolen[PARTY_SIZE]; // Player's team that had items stolen (two bytes per party member)
u8 blunderPolicy:1; // should blunder policy activate u8 blunderPolicy:1; // should blunder policy activate
u8 swapDamageCategory:1;
u8 ballSpriteIds[2]; // item gfx, window gfx u8 ballSpriteIds[2]; // item gfx, window gfx
u8 stickyWebUser; u8 stickyWebUser;
u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change
@ -938,7 +939,6 @@ extern u8 gBattleControllerData[MAX_BATTLERS_COUNT];
extern bool8 gHasFetchedBall; extern bool8 gHasFetchedBall;
extern u8 gLastUsedBall; extern u8 gLastUsedBall;
extern u16 gLastThrownBall; extern u16 gLastThrownBall;
extern bool8 gSwapDamageCategory; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
extern u8 gPartyCriticalHits[PARTY_SIZE]; extern u8 gPartyCriticalHits[PARTY_SIZE];
#endif // GUARD_BATTLE_H #endif // GUARD_BATTLE_H

View File

@ -35,4 +35,4 @@
#define Z_EFFECT_EVSN_UP_3 28 #define Z_EFFECT_EVSN_UP_3 28
#endif // GUARD_Z_MOVE_EFFECTS_H #endif // GUARD_Z_MOVE_EFFECTS_H

View File

@ -7867,7 +7867,7 @@ void AnimTask_PrimalReversion(u8 taskId)
void AnimTask_ShellSideArm(u8 taskId) void AnimTask_ShellSideArm(u8 taskId)
{ {
if (gSwapDamageCategory) if (gBattleStruct->swapDamageCategory)
gBattleAnimArgs[0] = TRUE; gBattleAnimArgs[0] = TRUE;
else else
gBattleAnimArgs[0] = FALSE; gBattleAnimArgs[0] = FALSE;

View File

@ -239,7 +239,6 @@ EWRAM_DATA struct TotemBoost gTotemBoosts[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA bool8 gHasFetchedBall = FALSE; EWRAM_DATA bool8 gHasFetchedBall = FALSE;
EWRAM_DATA u8 gLastUsedBall = 0; EWRAM_DATA u8 gLastUsedBall = 0;
EWRAM_DATA u16 gLastThrownBall = 0; EWRAM_DATA u16 gLastThrownBall = 0;
EWRAM_DATA bool8 gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
EWRAM_DATA u8 gPartyCriticalHits[PARTY_SIZE] = {0}; EWRAM_DATA u8 gPartyCriticalHits[PARTY_SIZE] = {0};
EWRAM_DATA static u8 sTriedEvolving = 0; EWRAM_DATA static u8 sTriedEvolving = 0;
@ -3007,7 +3006,7 @@ static void BattleStartClearSetData(void)
gPartyCriticalHits[i] = 0; gPartyCriticalHits[i] = 0;
} }
gSwapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky gBattleStruct->swapDamageCategory = FALSE; // Photon Geyser, Shell Side Arm, Light That Burns the Sky
} }
void SwitchInClearSetData(void) void SwitchInClearSetData(void)

View File

@ -9404,24 +9404,8 @@ static void Cmd_various(void)
gBattlescriptCurrInstr += 9; gBattlescriptCurrInstr += 9;
return; return;
case VARIOUS_PHOTON_GEYSER_CHECK: case VARIOUS_PHOTON_GEYSER_CHECK:
{ gBattleStruct->swapDamageCategory = (GetSplitBasedOnStats(gActiveBattler) == SPLIT_SPECIAL);
u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack;
u8 attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK];
u32 attackerSpAtkStat = gBattleMons[gBattlerAttacker].spAttack;
gSwapDamageCategory = FALSE;
attackerAtkStat *= gStatStageRatios[attackerAtkStage][0];
attackerAtkStat /= gStatStageRatios[attackerAtkStage][1];
attackerAtkStage = gBattleMons[gBattlerAttacker].statStages[STAT_SPATK];
attackerSpAtkStat *= gStatStageRatios[attackerAtkStage][0];
attackerSpAtkStat /= gStatStageRatios[attackerAtkStage][1];
if (attackerAtkStat > attackerSpAtkStat)
gSwapDamageCategory = TRUE;
break; 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 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 attackerAtkStat = gBattleMons[gBattlerAttacker].attack; u32 attackerAtkStat = gBattleMons[gBattlerAttacker].attack;
@ -9432,7 +9416,7 @@ static void Cmd_various(void)
u32 physical; u32 physical;
u32 special; u32 special;
gSwapDamageCategory = FALSE; gBattleStruct->swapDamageCategory = FALSE;
statStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK]; statStage = gBattleMons[gBattlerAttacker].statStages[STAT_ATK];
attackerAtkStat *= gStatStageRatios[statStage][0]; attackerAtkStat *= gStatStageRatios[statStage][0];
@ -9455,7 +9439,7 @@ static void Cmd_various(void)
special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerSpAtkStat) / targetSpDefStat) / 50); special = ((((2 * gBattleMons[gBattlerAttacker].level / 5 + 2) * gBattleMoves[gCurrentMove].power * attackerSpAtkStat) / targetSpDefStat) / 50);
if (((physical > special) || (physical == special && (Random() % 2) == 0))) if (((physical > special) || (physical == special && (Random() % 2) == 0)))
gSwapDamageCategory = TRUE; gBattleStruct->swapDamageCategory = TRUE;
break; break;
} }
case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED: case VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED:

View File

@ -7740,7 +7740,7 @@ bool32 IsMoveMakingContact(u16 move, u8 battlerAtk)
{ {
if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT)) if (!(gBattleMoves[move].flags & FLAG_MAKES_CONTACT))
{ {
if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory) if (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->swapDamageCategory)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
@ -7773,7 +7773,7 @@ bool32 IsBattlerProtected(u8 battlerId, u16 move)
// Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here. // Protective Pads doesn't stop Unseen Fist from bypassing Protect effects, so IsMoveMakingContact() isn't used here.
// This means extra logic is needed to handle Shell Side Arm. // This means extra logic is needed to handle Shell Side Arm.
if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST if (GetBattlerAbility(gBattlerAttacker) == ABILITY_UNSEEN_FIST
&& (gBattleMoves[move].flags & FLAG_MAKES_CONTACT || (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gSwapDamageCategory))) && (gBattleMoves[move].flags & FLAG_MAKES_CONTACT || (gBattleMoves[move].effect == EFFECT_SHELL_SIDE_ARM && gBattleStruct->swapDamageCategory)))
return FALSE; return FALSE;
else if (!(gBattleMoves[move].flags & FLAG_PROTECT_AFFECTED)) else if (!(gBattleMoves[move].flags & FLAG_PROTECT_AFFECTED))
return FALSE; return FALSE;
@ -9685,7 +9685,7 @@ u8 GetBattleMoveSplit(u32 moveId)
{ {
if (gBattleStruct != NULL && gBattleStruct->zmove.active && !IS_MOVE_STATUS(moveId)) if (gBattleStruct != NULL && gBattleStruct->zmove.active && !IS_MOVE_STATUS(moveId))
return gBattleStruct->zmove.activeSplit; return gBattleStruct->zmove.activeSplit;
if (gSwapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky if (gBattleStruct != NULL && gBattleStruct->swapDamageCategory) // Photon Geyser, Shell Side Arm, Light That Burns the Sky
return SPLIT_PHYSICAL; return SPLIT_PHYSICAL;
else 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; return gBattleMoves[moveId].split;