From b428b39fd1eb5891d3997d5a3e13bfab8f7b9f76 Mon Sep 17 00:00:00 2001 From: Evan Date: Wed, 15 Jul 2020 16:23:44 -0600 Subject: [PATCH 1/3] hide hp boxes during anims --- include/constants/battle_config.h | 2 + src/battle_interface.c | 88 ++++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index 2571972ba0..67c0b029f5 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -118,4 +118,6 @@ #define NEW_IMPACT_PALETTE TRUE //updates the basic 'hit' particle #define NEW_SURF_PARTICLE_PALETTE TRUE //updates the surf wave palette +#define HIDE_HEALTHBOXES_DURING_ANIMS TRUE //if TRUE, hides healthboxes during move animations + #endif // GUARD_CONSTANTS_BATTLE_CONFIG_H diff --git a/src/battle_interface.c b/src/battle_interface.c index 3c71f9ad84..c79b68045f 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -938,10 +938,52 @@ void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerO } +static void SetHealthboxVisibility(u8 priority) +{ + u32 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + switch (gSprites[i].template->tileTag) + { + case TAG_HEALTHBOX_PLAYER1_TILE: + case TAG_HEALTHBOX_PLAYER2_TILE: + case TAG_HEALTHBOX_OPPONENT1_TILE: + case TAG_HEALTHBOX_OPPONENT2_TILE: + case TAG_HEALTHBAR_PLAYER1_TILE: + case TAG_HEALTHBAR_OPPONENT1_TILE: + case TAG_HEALTHBAR_PLAYER2_TILE: + case TAG_HEALTHBAR_OPPONENT2_TILE: + switch (priority) + { + case 0: + if (!gSprites[i].invisible) + { + gSprites[i].data[7] = TRUE; + gSprites[i].invisible = TRUE; + } + else + { + gSprites[i].data[7] = FALSE; + } + break; + default: + if (gSprites[i].data[7]) + { + gSprites[i].invisible = FALSE; + gSprites[i].data[7] = FALSE; + } + break; + } + } + } +} + void UpdateOamPriorityInAllHealthboxes(u8 priority) { s32 i; - + bool8 hide; + for (i = 0; i < gBattlersCount; i++) { u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i]; @@ -955,6 +997,50 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) if (indicatorSpriteId != 0xFF) gSprites[indicatorSpriteId].oam.priority = priority; } + + #if HIDE_HEALTHBOXES_DURING_ANIMS + hide = TRUE; + #else + return; + #endif + + switch (gBattleResources->bufferA[gBattleAnimAttacker][0]) + { + case CONTROLLER_MOVEANIMATION: + { + if (gBattleResources->bufferA[gBattleAnimAttacker][1] == MOVE_TRANSFORM) + return; + + break; + } + case CONTROLLER_BALLTHROWANIM: + return; //throwing ball does not hide hp boxes + case CONTROLLER_BATTLEANIMATION: + //check special anims that hide health boxes + switch (gBattleResources->bufferA[gBattleAnimAttacker][1]) + { + case B_ANIM_TURN_TRAP: + case B_ANIM_LEECH_SEED_DRAIN: + case B_ANIM_MON_HIT: + case B_ANIM_SNATCH_MOVE: + case B_ANIM_FUTURE_SIGHT_HIT: + case B_ANIM_DOOM_DESIRE_HIT: + case B_ANIM_WISH_HEAL: + //new + case B_ANIM_MEGA_EVOLUTION: + case B_ANIM_TERRAIN_MISTY: + case B_ANIM_TERRAIN_GRASSY: + case B_ANIM_TERRAIN_ELECTRIC: + case B_ANIM_TERRAIN_PSYCHIC: + hide = TRUE; + break; + } + default: + return; + } + + if (hide) + SetHealthboxVisibility(priority); } void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y) From 739e5c7fb5206b8cbb8ca6927176705d64744081 Mon Sep 17 00:00:00 2001 From: Evan Date: Mon, 19 Oct 2020 13:35:59 -0600 Subject: [PATCH 2/3] redo hp box visibility toggle --- src/battle_interface.c | 115 ++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 71 deletions(-) diff --git a/src/battle_interface.c b/src/battle_interface.c index ea5dbb9c96..e173dfd358 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -939,83 +939,19 @@ void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerO } -static void SetHealthboxVisibility(u8 priority) +static void TryToggleHealboxVisibility(u8 priority, u8 healthboxLeftSpriteId, u8 healthboxRightSpriteId, u8 healthbarSpriteId, u8 indicatorSpriteId) { - u32 i; - - for (i = 0; i < MAX_SPRITES; i++) - { - switch (gSprites[i].template->tileTag) - { - case TAG_HEALTHBOX_PLAYER1_TILE: - case TAG_HEALTHBOX_PLAYER2_TILE: - case TAG_HEALTHBOX_OPPONENT1_TILE: - case TAG_HEALTHBOX_OPPONENT2_TILE: - case TAG_HEALTHBAR_PLAYER1_TILE: - case TAG_HEALTHBAR_OPPONENT1_TILE: - case TAG_HEALTHBAR_PLAYER2_TILE: - case TAG_HEALTHBAR_OPPONENT2_TILE: - switch (priority) - { - case 0: - if (!gSprites[i].invisible) - { - gSprites[i].data[7] = TRUE; - gSprites[i].invisible = TRUE; - } - else - { - gSprites[i].data[7] = FALSE; - } - break; - default: - if (gSprites[i].data[7]) - { - gSprites[i].invisible = FALSE; - gSprites[i].data[7] = FALSE; - } - break; - } - } - } -} - -void UpdateOamPriorityInAllHealthboxes(u8 priority) -{ - s32 i; - bool8 hide; - - for (i = 0; i < gBattlersCount; i++) - { - u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i]; - u8 healthboxRightSpriteId = gSprites[gHealthboxSpriteIds[i]].oam.affineParam; - u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; - u8 indicatorSpriteId = GetMegaIndicatorSpriteId(healthboxLeftSpriteId); - - gSprites[healthboxLeftSpriteId].oam.priority = priority; - gSprites[healthboxRightSpriteId].oam.priority = priority; - gSprites[healthbarSpriteId].oam.priority = priority; - if (indicatorSpriteId != 0xFF) - gSprites[indicatorSpriteId].oam.priority = priority; - } - - #if HIDE_HEALTHBOXES_DURING_ANIMS - hide = TRUE; - #else - return; - #endif + u8 spriteIds[4] = {healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId}; + int i; switch (gBattleResources->bufferA[gBattleAnimAttacker][0]) { case CONTROLLER_MOVEANIMATION: - { if (gBattleResources->bufferA[gBattleAnimAttacker][1] == MOVE_TRANSFORM) return; - break; - } case CONTROLLER_BALLTHROWANIM: - return; //throwing ball does not hide hp boxes + return; //throwing ball does not hide hp boxes case CONTROLLER_BATTLEANIMATION: //check special anims that hide health boxes switch (gBattleResources->bufferA[gBattleAnimAttacker][1]) @@ -1033,15 +969,52 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) case B_ANIM_TERRAIN_GRASSY: case B_ANIM_TERRAIN_ELECTRIC: case B_ANIM_TERRAIN_PSYCHIC: - hide = TRUE; break; } + return; //all other special anims dont hide default: return; } - if (hide) - SetHealthboxVisibility(priority); + // if we've reached here, we should hide hp boxes + for (i = 0; i < NELEMS(spriteIds); i++) + { + if (spriteIds[i] == 0xFF) + continue; + + switch (priority) + { + case 0: //start of anim -> make invisible + gSprites[spriteIds[i]].invisible = TRUE; + break; + case 1: //end of anim -> make visible + gSprites[spriteIds[i]].invisible = FALSE; + break; + } + } +} + +void UpdateOamPriorityInAllHealthboxes(u8 priority) +{ + s32 i; + + for (i = 0; i < gBattlersCount; i++) + { + u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i]; + u8 healthboxRightSpriteId = gSprites[gHealthboxSpriteIds[i]].oam.affineParam; + u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; + u8 indicatorSpriteId = GetMegaIndicatorSpriteId(healthboxLeftSpriteId); + + gSprites[healthboxLeftSpriteId].oam.priority = priority; + gSprites[healthboxRightSpriteId].oam.priority = priority; + gSprites[healthbarSpriteId].oam.priority = priority; + if (indicatorSpriteId != 0xFF) + gSprites[indicatorSpriteId].oam.priority = priority; + + #if HIDE_HEALTHBOXES_DURING_ANIMS + TryToggleHealboxVisibility(priority, healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId); + #endif + } } void GetBattlerHealthboxCoords(u8 battler, s16 *x, s16 *y) From aede11dae4bfefd24f97cde4ec922f7c6cc65f1d Mon Sep 17 00:00:00 2001 From: Evan Date: Tue, 20 Oct 2020 20:57:05 -0600 Subject: [PATCH 3/3] fix hp boxes reappearing for fainted mons --- src/battle_interface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_interface.c b/src/battle_interface.c index e173dfd358..060bc69b92 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1012,6 +1012,7 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) gSprites[indicatorSpriteId].oam.priority = priority; #if HIDE_HEALTHBOXES_DURING_ANIMS + if (IsBattlerAlive(i)) TryToggleHealboxVisibility(priority, healthboxLeftSpriteId, healthboxRightSpriteId, healthbarSpriteId, indicatorSpriteId); #endif }