diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 21e546b61..786ab34fa 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -133,25 +133,25 @@ .byte \battler .endm - .macro jumpifstatus battler:req, status1:req, ptr:req + .macro jumpifstatus battler:req, flags:req, jumpInstr:req .byte 0x1c .byte \battler - .4byte \status1 - .4byte \ptr + .4byte \flags + .4byte \jumpInstr .endm - .macro jumpifstatus2 battler:req, status2:req, ptr:req + .macro jumpifstatus2 battler:req, flags:req, jumpInstr:req .byte 0x1d .byte \battler - .4byte \status2 - .4byte \ptr + .4byte \flags + .4byte \jumpInstr .endm - .macro jumpifability param0:req, ability:req, ptr:req + .macro jumpifability battler:req, ability:req, jumpInstr:req .byte 0x1e - .byte \param0 + .byte \battler .2byte \ability - .4byte \ptr + .4byte \jumpInstr .endm .macro jumpifsideaffecting battler:req, sidestatus:req, ptr:req diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 125da7e63..93eaa4d8a 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -73,7 +73,7 @@ #define BS_FAINTED_LINK_MULTIPLE_2 6 // for openpartyscreen #define BS_BATTLER_0 7 #define BS_ATTACKER_SIDE 8 // for Cmd_jumpifability -#define BS_NOT_ATTACKER_SIDE 9 // for Cmd_jumpifability +#define BS_TARGET_SIDE 9 // for Cmd_jumpifability #define BS_SCRIPTING 10 #define BS_PLAYER1 11 #define BS_OPPONENT1 12 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 660378421..d375e2135 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -396,9 +396,9 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_tryfaintmon, //0x19 // done Cmd_dofaintanimation, //0x1A // done Cmd_cleareffectsonfaint, //0x1B // done - Cmd_jumpifstatus, //0x1C - Cmd_jumpifstatus2, //0x1D - Cmd_jumpifability, //0x1E + Cmd_jumpifstatus, //0x1C // done + Cmd_jumpifstatus2, //0x1D // done + Cmd_jumpifability, //0x1E // done Cmd_jumpifsideaffecting, //0x1F Cmd_jumpifstat, //0x20 Cmd_jumpifstatus3condition, //0x21 @@ -4126,75 +4126,75 @@ static void Cmd_cleareffectsonfaint(void) static void Cmd_jumpifstatus(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); + CMD_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); - if (gBattleMons[battlerId].status1 & flags && gBattleMons[battlerId].hp != 0) { - gBattlescriptCurrInstr = jumpPtr; - } - else { - gBattlescriptCurrInstr += 10; - } + u8 battler = GetBattlerForBattleScript(cmd->battler); + u32 flags = cmd->flags; + const u8 *jumpInstr = cmd->jumpInstr; + + if (gBattleMons[battler].status1 & flags && gBattleMons[battler].hp != 0) + gBattlescriptCurrInstr = jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_jumpifstatus2(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - u32 flags = T2_READ_32(gBattlescriptCurrInstr + 2); - const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 6); + CMD_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); - if (gBattleMons[battlerId].status2 & flags && gBattleMons[battlerId].hp != 0) - gBattlescriptCurrInstr = jumpPtr; + u8 battler = GetBattlerForBattleScript(cmd->battler); + u32 flags = cmd->flags; + const u8 *jumpInstr = cmd->jumpInstr; + + if (gBattleMons[battler].status2 & flags && gBattleMons[battler].hp != 0) + gBattlescriptCurrInstr = jumpInstr; else - gBattlescriptCurrInstr += 10; + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_jumpifability(void) { CMD_ARGS(u8 battler, u16 ability, const u8 *jumpInstr); - u32 battlerId; + + u32 battler; bool32 hasAbility = FALSE; u32 ability = cmd->ability; - if (cmd->battler == BS_ATTACKER_SIDE) + switch (cmd->battler) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0); - if (battlerId) + default: + battler = GetBattlerForBattleScript(cmd->battler); + if (GetBattlerAbility(battler) == ability) + hasAbility = TRUE; + break; + case BS_ATTACKER_SIDE: + battler = IsAbilityOnSide(gBattlerAttacker, ability); + if (battler) { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = cmd->jumpInstr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; + battler--; + hasAbility = TRUE; } - else - gBattlescriptCurrInstr = cmd->nextInstr; + break; + case BS_TARGET_SIDE: + battler = IsAbilityOnOpposingSide(gBattlerAttacker, ability); + if (battler) + { + battler--; + hasAbility = TRUE; + } + break; } - else if (cmd->battler == BS_NOT_ATTACKER_SIDE) + + if (hasAbility) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0); - if (battlerId) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = cmd->jumpInstr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; - } - else - gBattlescriptCurrInstr = cmd->nextInstr; + gLastUsedAbility = ability; + gBattlescriptCurrInstr = cmd->jumpInstr; + RecordAbilityBattle(battler, gLastUsedAbility); + gBattlerAbility = battler; } else { - battlerId = GetBattlerForBattleScript(cmd->battler); - if (gBattleMons[battlerId].ability == ability) - { - gLastUsedAbility = ability; - gBattlescriptCurrInstr = cmd->jumpInstr; - RecordAbilityBattle(battlerId, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId; - } - else - gBattlescriptCurrInstr = cmd->nextInstr; + gBattlescriptCurrInstr = cmd->nextInstr; } } diff --git a/src/battle_util.c b/src/battle_util.c index 8aca7699b..b54eb7460 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -93,7 +93,7 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_ATTACKER_WITH_PARTNER: case BS_FAINTED_LINK_MULTIPLE_2: case BS_ATTACKER_SIDE: - case BS_NOT_ATTACKER_SIDE: + case BS_TARGET_SIDE: break; case BS_ABILITY_BATTLER: ret = gBattlerAbility;