Fixes Gen3 berry activation timing (#6993)

This commit is contained in:
Alex 2025-05-27 23:36:00 +02:00 committed by GitHub
parent a967f36091
commit c489d36fc6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 56 additions and 17 deletions

View File

@ -1012,7 +1012,7 @@
.4byte \jumpInstr
.endm
.macro tryhealingitem
.macro tryrestorehpberry
.byte 0xbb
.endm

View File

@ -5716,7 +5716,7 @@ BattleScript_MagicRoomEnds::
setbyte gBattlerTarget, 0
BattleScript_MagicRoomHealingItemsLoop:
copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1
tryhealingitem
tryrestorehpberry
addbyte gBattlerTarget, 1
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop
end2
@ -6993,7 +6993,7 @@ BattleScript_DoTurnDmg:
datahpupdate BS_ATTACKER
tryfaintmon BS_ATTACKER
checkteamslost BattleScript_DoTurnDmgEnd
tryhealingitem
tryrestorehpberry
BattleScript_DoTurnDmgEnd:
end2
@ -7241,7 +7241,7 @@ BattleScript_YawnEnd:
BattleScript_EmbargoEndTurn::
printstring STRINGID_EMBARGOENDS
waitmessage B_WAIT_TIME_LONG
tryhealingitem
tryrestorehpberry
end2
BattleScript_TelekinesisEndTurn::
@ -7533,7 +7533,7 @@ BattleScript_PickupActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_XFOUNDONEY
waitmessage B_WAIT_TIME_LONG
tryhealingitem
tryrestorehpberry
BattleScript_PickupActivatesEnd:
end3
@ -7543,7 +7543,7 @@ BattleScript_HarvestActivates::
call BattleScript_AbilityPopUp
printstring STRINGID_HARVESTBERRY
waitmessage B_WAIT_TIME_LONG
tryhealingitem
tryrestorehpberry
BattleScript_HarvestActivatesEnd:
end3

View File

@ -383,5 +383,6 @@ u32 RestoreWhiteHerbStats(u32 battler);
bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 HadMoreThanHalfHpNowDoesnt(u32 battler);
void UpdateStallMons(void);
bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId);
#endif // GUARD_BATTLE_UTIL_H

View File

@ -20,6 +20,7 @@ enum EndTurnResolutionOrder
ENDTURN_VARIOUS,
ENDTURN_WEATHER,
ENDTURN_WEATHER_DAMAGE,
ENDTURN_GEN_3_BERRY_ACTIVATION,
ENDTURN_EMERGENCY_EXIT_1,
ENDTURN_AFFECTION,
ENDTURN_FUTURE_SIGHT,
@ -283,6 +284,20 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler)
return effect;
}
static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler)
{
bool32 effect = FALSE;
if (B_HP_BERRIES >= GEN_4) // Skip handler for > Gen3
{
gBattleStruct->endTurnEventsCounter++;
return effect;
}
gBattleStruct->turnEffectsBattlerId++;
effect = TryRestoreHPBerries(battler, ITEMEFFECT_NORMAL);
return effect;
}
static bool32 HandleEndTurnEmergencyExit(u32 battler)
{
bool32 effect = FALSE;
@ -1514,6 +1529,7 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) =
[ENDTURN_VARIOUS] = HandleEndTurnVarious,
[ENDTURN_WEATHER] = HandleEndTurnWeather,
[ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage,
[ENDTURN_GEN_3_BERRY_ACTIVATION] = HandleEndTurnGenThreeBerryActivation,
[ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit,
[ENDTURN_AFFECTION] = HandleEndTurnAffection,
[ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight,

View File

@ -533,7 +533,7 @@ static void Cmd_presentdamagecalculation(void);
static void Cmd_setsafeguard(void);
static void Cmd_magnitudedamagecalculation(void);
static void Cmd_jumpifnopursuitswitchdmg(void);
static void Cmd_tryhealingitem(void);
static void Cmd_tryrestorehpberry(void);
static void Cmd_halvehp(void);
static void Cmd_copyfoestats(void);
static void Cmd_rapidspinfree(void);
@ -792,7 +792,7 @@ void (*const gBattleScriptingCommandsTable[])(void) =
Cmd_setsafeguard, //0xB8
Cmd_magnitudedamagecalculation, //0xB9
Cmd_jumpifnopursuitswitchdmg, //0xBA
Cmd_tryhealingitem, //0xBB
Cmd_tryrestorehpberry, //0xBB
Cmd_halvehp, //0xBC
Cmd_copyfoestats, //0xBD
Cmd_rapidspinfree, //0xBE
@ -14274,17 +14274,11 @@ static void Cmd_jumpifnopursuitswitchdmg(void)
}
}
static void Cmd_tryhealingitem(void)
static void Cmd_tryrestorehpberry(void)
{
CMD_ARGS();
if (gItemsInfo[gBattleMons[gBattlerAttacker].item].pocket == POCKET_BERRIES
|| GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice
{
if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerAttacker, FALSE))
return;
}
if (TryRestoreHPBerries(gBattlerAttacker, ITEMEFFECT_TRY_HEALING))
return;
gBattlescriptCurrInstr = cmd->nextInstr;
}

View File

@ -11442,3 +11442,14 @@ void UpdateStallMons(void)
}
// Handling for moves that target multiple opponents in doubles not handled currently
}
bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId)
{
if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES
|| GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice
{
if (ItemBattleEffects(caseId, battler, FALSE))
return TRUE;
}
return FALSE;
}

View File

@ -63,3 +63,20 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight);
}
}
#if B_HP_BERRIES <= GEN_3
SINGLE_BATTLE_TEST("Restore HP Berry triggers only during the end turn")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); }
} WHEN {
TURN { MOVE(player, MOVE_TACKLE); }
TURN {}
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent);
}
}
#endif