diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 979d12fb77..ba7b4e090b 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1713,6 +1713,12 @@ various \battler, VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED .4byte \ptr .endm + + .macro trypoisontype attacker:req, target:req, ptr:req + various \attacker, VARIOUS_HANDLE_TYPE_IMMUNITY + .byte \target + .4byte \ptr + .endm .macro trysetfairylock ptr:req various BS_ATTACKER, VARIOUS_TRY_FAIRY_LOCK diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7ca850a01d..c80e98d994 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -2650,8 +2650,7 @@ BattleScript_EffectToxic:: jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON | STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed - jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected - jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected + trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected attackanimation @@ -2971,8 +2970,7 @@ BattleScript_EffectPoison:: jumpifsubstituteblocks BattleScript_ButItFailed jumpifstatus BS_TARGET, STATUS1_POISON, BattleScript_AlreadyPoisoned jumpifstatus BS_TARGET, STATUS1_TOXIC_POISON, BattleScript_AlreadyPoisoned - jumpiftype BS_TARGET, TYPE_POISON, BattleScript_NotAffected - jumpiftype BS_TARGET, TYPE_STEEL, BattleScript_NotAffected + trypoisontype BS_ATTACKER, BS_TARGET, BattleScript_NotAffected jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed accuracycheck BattleScript_ButItFailed, ACC_CURR_MOVE jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, BattleScript_SafeguardProtected diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index f0fc7b8c19..2376c5a865 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -17,6 +17,7 @@ void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battlerId); bool32 DoesSubstituteBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); bool32 DoesDisguiseBlockMove(u8 battlerAtk, u8 battlerDef, u32 move); +bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget); bool32 CanUseLastResort(u8 battlerId); u32 IsFlowerVeilProtected(u32 battler); u32 IsLeafGuardProtected(u32 battler); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 9dd97ac464..8e1f8478d7 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -1,6 +1,7 @@ #ifndef GUARD_BATTLE_SCRIPTS_H #define GUARD_BATTLE_SCRIPTS_H +extern const u8 BattleScript_NotAffected[]; extern const u8 BattleScript_HitFromCritCalc[]; extern const u8 BattleScript_MoveEnd[]; extern const u8 BattleScript_MakeMoveMissed[]; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 6686446fde..608044b612 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -156,6 +156,7 @@ #define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93 #define VARIOUS_TRY_FAIRY_LOCK 94 #define VARIOUS_JUMP_IF_NO_ALLY 95 +#define VARIOUS_HANDLE_TYPE_IMMUNITY 96 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2bafa78292..986ea1b965 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2254,7 +2254,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } RESET_RETURN } - if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { @@ -2264,9 +2264,7 @@ void SetMoveEffect(bool32 primary, u32 certain) gBattleCommunication[MULTISTRING_CHOOSER] = 2; RESET_RETURN } - if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON)) - break; - if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler)) break; if (gBattleMons[gEffectBattler].status1) break; @@ -2401,7 +2399,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } RESET_RETURN } - if ((IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) || IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (!CanPoisonType(gBattleScripting.battler, gEffectBattler) && (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { @@ -2413,7 +2411,7 @@ void SetMoveEffect(bool32 primary, u32 certain) } if (gBattleMons[gEffectBattler].status1) break; - if (!IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON) && !IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_STEEL)) + if (CanPoisonType(gBattleScripting.battler, gEffectBattler)) { if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY || GetBattlerAbility(gEffectBattler) == ABILITY_COMATOSE @@ -6672,6 +6670,13 @@ static void HandleTerrainMove(u32 moveEffect) } } +bool32 CanPoisonType(u8 battlerAttacker, u8 battlerTarget) +{ + return (GetBattlerAbility(battlerAttacker) == ABILITY_CORROSION + || !(IS_BATTLER_OF_TYPE(battlerTarget, TYPE_POISON) + || IS_BATTLER_OF_TYPE(battlerTarget, TYPE_STEEL))); +} + bool32 CanUseLastResort(u8 battlerId) { u32 i; @@ -6885,6 +6890,12 @@ static void Cmd_various(void) gBattleStruct->friskedBattler = 0; gBattleStruct->friskedAbility = FALSE; break; + case VARIOUS_HANDLE_TYPE_IMMUNITY: + if (!CanPoisonType(gActiveBattler, GetBattlerForBattleScript(gBattlescriptCurrInstr[3]))) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4); + else + gBattlescriptCurrInstr += 8; + return; case VARIOUS_TRACE_ABILITY: gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); diff --git a/src/battle_util.c b/src/battle_util.c index 4c21e097e2..866114a994 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4865,7 +4865,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { case HOLD_EFFECT_TOXIC_ORB: if (!gBattleMons[battlerId].status1 - && !IS_BATTLER_OF_TYPE(battlerId, TYPE_POISON) && !IS_BATTLER_OF_TYPE(battlerId, TYPE_STEEL) + && CanPoisonType(battlerId, battlerId) && GetBattlerAbility(battlerId) != ABILITY_IMMUNITY) { effect = ITEM_STATUS_CHANGE;