From a13ffdbfbac77b2f09ff37bfad6f549d1b94b84c Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 19 Jan 2023 22:18:35 +0000 Subject: [PATCH 1/4] U-turn does not switch the user out if Emergency Exit activates --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 1 + include/battle.h | 1 + include/constants/battle_script_commands.h | 1 + src/battle_script_commands.c | 7 +++++++ src/battle_util.c | 4 +++- 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 940f301608..4d0b9a6140 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2237,3 +2237,8 @@ .endif waitmessage B_WAIT_TIME_LONG .endm + + .macro jumpifemergencyexited battler:req, ptr:req + various \battler, VARIOUS_JUMP_IF_EMERGENCY_EXITED + .4byte \ptr + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 42ee1b0e9c..9ff5838b11 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -3055,6 +3055,7 @@ BattleScript_EffectHitEscape: jumpifbyte CMP_NOT_EQUAL gBattleOutcome 0, BattleScript_HitEscapeEnd jumpifbattletype BATTLE_TYPE_ARENA, BattleScript_HitEscapeEnd jumpifcantswitch SWITCH_IGNORE_ESCAPE_PREVENTION | BS_ATTACKER, BattleScript_HitEscapeEnd + jumpifemergencyexited BS_TARGET, BattleScript_HitEscapeEnd openpartyscreen BS_ATTACKER, BattleScript_HitEscapeEnd switchoutabilities BS_ATTACKER waitstate diff --git a/include/battle.h b/include/battle.h index 94119f9b43..0b23033ec0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -195,6 +195,7 @@ struct SpecialStatus // End of byte u8 weatherAbilityDone:1; u8 terrainAbilityDone:1; + u8 emergencyExited:1; }; struct SideTimer diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index fdf703c1a1..123fb5d49f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -255,6 +255,7 @@ #define VARIOUS_ACTIVATE_WEATHER_CHANGE_ABILITIES 164 #define VARIOUS_ACTIVATE_TERRAIN_CHANGE_ABILITIES 165 #define VARIOUS_JUMP_IF_NO_VALID_TARGETS 166 +#define VARIOUS_JUMP_IF_EMERGENCY_EXITED 167 // Cmd_manipulatedamage #define DMG_CHANGE_SIGN 0 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ab516d01a7..f4d0d640d8 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5922,6 +5922,7 @@ static void Cmd_moveend(void) if (gBattleResources->flags->flags[i] & RESOURCE_FLAG_EMERGENCY_EXIT) { gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_EMERGENCY_EXIT; + gSpecialStatuses[i].emergencyExited = TRUE; gBattlerTarget = gBattlerAbility = i; BattleScriptPushCursor(); if (gBattleTypeFlags & BATTLE_TYPE_TRAINER || GetBattlerSide(i) == B_SIDE_PLAYER) @@ -10269,6 +10270,12 @@ static void Cmd_various(void) gBattlescriptCurrInstr += 7; } return; + case VARIOUS_JUMP_IF_EMERGENCY_EXITED: + if (gSpecialStatuses[gActiveBattler].emergencyExited) + gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); + else + gBattlescriptCurrInstr += 7; + return; } // End of switch (gBattlescriptCurrInstr[2]) gBattlescriptCurrInstr += 3; diff --git a/src/battle_util.c b/src/battle_util.c index a4c6dbedcd..eff2faf872 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -515,9 +515,11 @@ void HandleAction_UseMove(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA) BattleArena_AddMindPoints(gBattlerAttacker); - // Record HP of each battler for (i = 0; i < MAX_BATTLERS_COUNT; i++) + { gBattleStruct->hpBefore[i] = gBattleMons[i].hp; + gSpecialStatuses[i].emergencyExited = FALSE; + } gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } From 3647825a3087de3c1575d5793330c11907af3cb4 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 12 Jan 2023 21:22:59 +0000 Subject: [PATCH 2/4] Fix Poison Point MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It incorrectly activated only if the Pokémon with Poison Point could be poisoned by the attacker. --- 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 eff2faf872..b9ec515801 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5625,7 +5625,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move && gBattleMons[gBattlerAttacker].hp != 0 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && TARGET_TURN_DAMAGED - && CanBePoisoned(gBattlerAttacker, gBattlerTarget) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker) && IsMoveMakingContact(move, gBattlerAttacker) && (Random() % 3) == 0) { From 6a403ab45cf445f00ddd584c51c2b6b7b5f82bca Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 20 Jan 2023 17:05:27 +0000 Subject: [PATCH 3/4] Pastel Veil grants immunity to poison --- src/battle_pike.c | 2 +- src/battle_script_commands.c | 14 ++++++++------ src/battle_util.c | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/battle_pike.c b/src/battle_pike.c index 61e2892437..9751d565de 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -834,7 +834,7 @@ static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status) ret = TRUE; break; case STATUS1_TOXIC_POISON: - if (ability == ABILITY_IMMUNITY) + if (ability == ABILITY_IMMUNITY || ability == ABILITY_PASTEL_VEIL) ret = TRUE; break; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f4d0d640d8..1ee899444c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2880,11 +2880,11 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_POISON: - if (battlerAbility == ABILITY_IMMUNITY + if ((battlerAbility == ABILITY_IMMUNITY || battlerAbility == ABILITY_PASTEL_VEIL) && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); + gLastUsedAbility = battlerAbility; + RecordAbilityBattle(gEffectBattler, battlerAbility); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; @@ -3004,10 +3004,11 @@ void SetMoveEffect(bool32 primary, u32 certain) statusChanged = TRUE; break; case STATUS1_TOXIC_POISON: - if (battlerAbility == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) + if ((battlerAbility == ABILITY_IMMUNITY || battlerAbility == ABILITY_PASTEL_VEIL) + && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)) { - gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY); + gLastUsedAbility = battlerAbility; + RecordAbilityBattle(gEffectBattler, battlerAbility); BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; @@ -6765,6 +6766,7 @@ static void Cmd_switchineffects(void) if (!(gBattleMons[gActiveBattler].status1 & STATUS1_ANY) && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL) && GetBattlerAbility(gActiveBattler) != ABILITY_IMMUNITY + && !IsAbilityOnSide(gActiveBattler, ABILITY_PASTEL_VEIL) && !(gSideStatuses[GetBattlerSide(gActiveBattler)] & SIDE_STATUS_SAFEGUARD) && !(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) { diff --git a/src/battle_util.c b/src/battle_util.c index b9ec515801..3efbf21720 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5956,6 +5956,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move switch (GetBattlerAbility(battler)) { case ABILITY_IMMUNITY: + case ABILITY_PASTEL_VEIL: if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); From 4ad4d8e25c263c7758517e82b49ddc4475e642d8 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Fri, 27 Jan 2023 16:08:33 +0000 Subject: [PATCH 4/4] Encore fails if target has not moved --- src/battle_script_commands.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 1ee899444c..b0f9c404bf 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12122,7 +12122,9 @@ static void Cmd_trysetencore(void) break; } - if (gLastMoves[gBattlerTarget] == MOVE_STRUGGLE + if (gLastMoves[gBattlerTarget] == MOVE_NONE + || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_ENCORE || gLastMoves[gBattlerTarget] == MOVE_MIRROR_MOVE || gLastMoves[gBattlerTarget] == MOVE_SHELL_TRAP)