diff --git a/asm/macros/btlcmd.inc b/asm/macros/btlcmd.inc index 52fb030007..c6a34d1f23 100644 --- a/asm/macros/btlcmd.inc +++ b/asm/macros/btlcmd.inc @@ -76,18 +76,18 @@ .long BTLCMD_BACKGROUNDSLIDEIN .endm - .macro HealthbarSlideIn battler - .long BTLCMD_HEALTHBARSLIDEIN + .macro HealthBoxSlideIn battler + .long BTLCMD_HEALTHBOXSLIDEIN .long \battler .endm - .macro HealthbarSlideInDelay battler - .long BTLCMD_HEALTHBARSLIDEINDELAY + .macro HealthBoxSlideInDelay battler + .long BTLCMD_HEALTHBOXSLIDEINDELAY .long \battler .endm - .macro HealthbarSlideOut battler - .long BTLCMD_HEALTHBARSLIDEOUT + .macro HealthBoxSlideOut battler + .long BTLCMD_HEALTHBOXSLIDEOUT .long \battler .endm @@ -433,8 +433,8 @@ .long \battler .endm - .macro SetHealthbarStatus battler, status - .long BTLCMD_SETHEALTHBARSTATUS + .macro SetHealthBoxStatusIcon battler, status + .long BTLCMD_SETHEALTHBOXSTATUSICON .long \battler .long \status .endm diff --git a/include/battle/battle_controller.h b/include/battle/battle_controller.h index 715cde0f8e..e1f9288b98 100644 --- a/include/battle/battle_controller.h +++ b/include/battle/battle_controller.h @@ -20,8 +20,8 @@ void BattleController_EmitSetTrainerEncounter(BattleSystem *battleSys, int battl void BattleController_EmitThrowTrainerBall(BattleSystem *battleSys, int battler, int ballTypeIn); void BattleController_EmitSlideTrainerOut(BattleSystem *battleSys, int battler); void BattleController_EmitSlideTrainerIn(BattleSystem *battleSys, int battler, int posIn); -void BattleController_EmitSlideHealthbarIn(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int delay); -void BattleController_EmitSlideHealthbarOut(BattleSystem *battleSys, int battler); +void BattleController_EmitSlideHealthBoxIn(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int delay); +void BattleController_EmitSlideHealthBoxOut(BattleSystem *battleSys, int battler); void BattleController_EmitSetCommandSelection(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int partySlot); void ov16_022656D4(BattleSystem *battleSys, int battler, int command); void BattleController_EmitShowMoveSelectMenu(BattleSystem *battleSys, BattleContext *battleCtx, int battler); diff --git a/include/battle/battle_display.h b/include/battle/battle_display.h index b1ecad6c49..cab6766e45 100644 --- a/include/battle/battle_display.h +++ b/include/battle/battle_display.h @@ -6,7 +6,7 @@ #include "struct_defs/move_animation.h" #include "battle/battle_message.h" -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/message_defs.h" #include "battle/struct_ov16_0226C378.h" @@ -24,21 +24,21 @@ void BattleDisplay_InitTaskSlideTrainerOut(BattleSystem *battleSys, BattlerData void BattleDisplay_InitTaskSlideTrainerIn(BattleSystem *battleSys, BattlerData *battlerData, TrainerSlideInMessage *message); /** - * @brief Slide the healthbar into the screen. + * @brief Slide the healthbox into the screen. * * @param battleSys * @param battlerData - * @param healthbarData + * @param healthboxData */ -void BattleDisplay_InitTaskSlideHealthbarIn(BattleSystem *battleSys, BattlerData *battlerData, HealthbarData *healthbarData); +void BattleDisplay_InitTaskSlideHealthBoxIn(BattleSystem *battleSys, BattlerData *battlerData, HealthBoxData *healthboxData); /** - * @brief Slide the healthbar out of the screen. + * @brief Slide the healthbox out of the screen. * * @param battleSys * @param battlerData */ -void BattleDisplay_InitTaskSlideHealthbarOut(BattleSystem *battleSys, BattlerData *battlerData); +void BattleDisplay_InitTaskSlideHealthBoxOut(BattleSystem *battleSys, BattlerData *battlerData); void BattleDisplay_InitTaskSetCommandSelection(BattleSystem *battleSys, BattlerData *battlerData, CommandSetMessage *message); void BattleDisplay_InitTaskShowMoveSelectMenu(BattleSystem *battleSys, BattlerData *battlerData, MoveSelectMenuMessage *message); void BattleDisplay_InitTaskShowTargetSelectMenu(BattleSystem *battleSys, BattlerData *battlerData, TargetSelectMenuMessage *message); @@ -124,7 +124,7 @@ void BattlerData_SetTaskFuncs(BattleSystem *battleSys, BattlerData *battlerData) u8 BattlerData_GetBattlerType(BattlerData *battlerData); u8 BattlerData_GetBootState(BattlerData *battlerData); PokemonSprite *BattlerData_GetPokemonSprite(BattlerData *battlerData); -Healthbar *BattlerData_GetHealthbar(BattlerData *battlerData); +HealthBox *BattlerData_GetHealthBox(BattlerData *battlerData); UnkStruct_ov16_0226C378 *ov16_02263B0C(BattlerData *battlerData); void ov16_02263B10(BattlerData *battlerData); void ov16_02263B20(BattlerData *battlerData, BOOL draw); diff --git a/include/battle/battle_system.h b/include/battle/battle_system.h index 7e56b01d24..1dce8ca450 100644 --- a/include/battle/battle_system.h +++ b/include/battle/battle_system.h @@ -243,7 +243,7 @@ void ov16_0223F32C(BattleSystem *battleSys, u8 *param1); void ov16_0223F338(BattleSystem *battleSys, u8 param1); void ov16_0223F344(BattleSystem *battleSys, u8 param1); void BattleSystem_SetCommandIsEndWait(BattleSystem *battleSys, u8 value); -void *BattleSystem_GetHealthbar(BattleSystem *battleSys, int battler); +void *BattleSystem_GetHealthBox(BattleSystem *battleSys, int battler); void ov16_0223F36C(BattleSystem *battleSys); void ov16_0223F3BC(BattleSystem *battleSys); void ov16_0223F3EC(BattleSystem *battleSys); diff --git a/include/battle/healthbar.h b/include/battle/healthbar.h deleted file mode 100644 index 48a4f86aec..0000000000 --- a/include/battle/healthbar.h +++ /dev/null @@ -1,181 +0,0 @@ -#ifndef POKEPLATINUM_HEALTHBAR_H -#define POKEPLATINUM_HEALTHBAR_H - -#include "struct_decls/battle_system.h" - -#include "bg_window.h" -#include "narc.h" -#include "palette.h" -#include "sprite.h" -#include "sprite_system.h" -#include "sys_task_manager.h" - -#define HEALTHBAR_INFO_NONE 0 -#define HEALTHBAR_INFO_HP_GAUGE (1 << 0) -#define HEALTHBAR_INFO_CURRENT_HP (1 << 1) -#define HEALTHBAR_INFO_MAX_HP (1 << 2) -#define HEALTHBAR_INFO_LEVEL (1 << 3) -#define HEALTHBAR_INFO_NAME (1 << 4) -#define HEALTHBAR_INFO_EXP_GAUGE (1 << 5) -#define HEALTHBAR_INFO_GENDER (1 << 6) -#define HEALTHBAR_INFO_LEVEL_TEXT (1 << 7) -#define HEALTHBAR_INFO_STATUS (1 << 8) -#define HEALTHBAR_INFO_CAUGHT_SPECIES (1 << 9) -#define HEALTHBAR_INFO_COUNT_SAFARI_BALLS (1 << 10) -#define HEALTHBAR_INFO_REMAINING_SAFARI_BALLS (1 << 11) -#define HEALTHBAR_INFO_COUNT_PARK_BALLS (1 << 12) -#define HEALTHBAR_INFO_REMAINING_PARK_BALLS (1 << 13) - -#define HEALTHBAR_INFO_ALL ~0 - -#define HEALTHBAR_INFO_ALL_SAFARI (HEALTHBAR_INFO_COUNT_SAFARI_BALLS | HEALTHBAR_INFO_REMAINING_SAFARI_BALLS) -#define HEALTHBAR_INFO_ALL_PARK (HEALTHBAR_INFO_COUNT_PARK_BALLS | HEALTHBAR_INFO_REMAINING_PARK_BALLS) -#define HEALTHBAR_INFO_NOT_ON_ENEMY (HEALTHBAR_INFO_CURRENT_HP | HEALTHBAR_INFO_MAX_HP | HEALTHBAR_INFO_EXP_GAUGE) - -enum HealthbarType { - HEALTHBAR_TYPE_PLAYER_SOLO = 0, - HEALTHBAR_TYPE_ENEMY_SOLO, - HEALTHBAR_TYPE_PLAYER_SLOT_1, - HEALTHBAR_TYPE_ENEMY_SLOT_1, - HEALTHBAR_TYPE_PLAYER_SLOT_2, - HEALTHBAR_TYPE_ENEMY_SLOT_2, - HEALTHBAR_TYPE_SAFARI_ZONE, - HEALTHBAR_TYPE_PAL_PARK, -}; - -enum HealthbarScrollDirection { - HEALTHBAR_SCROLL_IN = 0, - HEALTHBAR_SCROLL_OUT, -}; - -enum HealthbarGaugeType { - HEALTHBAR_GAUGE_HP = 0, - HEALTHBAR_GAUGE_EXP, -}; - -typedef struct Healthbar { - u8 state; - ManagedSprite *mainSprite; - ManagedSprite *arrowSprite; - BattleSystem *battleSys; - SysTask *task_10; - Window unused_14; - u8 battler; - u8 type; - u8 selectedPartySlot; - u8 numSafariBalls; - s32 curHP; - s32 maxHP; - s32 damage; - s32 hpTemp; - s32 curExp; - s32 maxExp; - s32 expReward; - s32 expTemp; - u8 level; - u8 gender; - u8 status; - u8 caughtSpecies; - u8 command; - u8 delay; - u8 unk_4E; - u8 scrollDirection : 1; - u8 doneScrolling : 1; - u8 unused_4F_2 : 1; - u8 numberMode : 1; - u8 padding : 4; - SysTask *task_50; - u16 degrees; -} Healthbar; - -/** - * @brief Load the resources required to display a healthbar. - * - * Though a NARC handle is required as a parameter, it is assumed to always be - * an open handle to pl_batt_obj.narc. - * - * @param renderer - * @param gfxHandler - * @param narc - * @param palette - * @param healthbarType - */ -void Healthbar_LoadResources(SpriteSystem *spriteSys, SpriteManager *spriteMan, NARC *narc, PaletteData *palette, enum HealthbarType healthbarType); -ManagedSprite *Healthbar_DrawSprite(SpriteSystem *spriteSys, SpriteManager *spriteMan, int type); - -/** - * @brief Draw the informational parts of the healthbar, according to a set - * of input flags which control exactly what components to draw. - * - * @param healthbar - * @param hp The battler's current HP - * @param flags The components to be drawn, as a bitmask. - */ -void Healthbar_DrawInfo(Healthbar *healthbar, u32 hp, u32 flags); -void ov16_02267220(Healthbar *healthbar); -void ov16_02267258(Healthbar *healthbar); -void ov16_022672C4(Healthbar *healthbar); -void ov16_02267360(Healthbar *healthbar); -void ov16_0226737C(Healthbar *healthbar); - -/** - * @brief Compute the battler's new HP after taking a given amount of - * damage or restoring a certain amount of health. Additionally, cache - * this difference, flooring it to the bounds of the battler's current - * and maximum HP. - * - * @param healthbar - * @param damage The amount of damage dealt to a battler. Negative - * values are damage, positive values are recovery. - */ -void Healthbar_CalcHP(Healthbar *healthbar, int damage); -s32 ov16_022674F8(Healthbar *healthbar); -void Healthbar_CalcExp(Healthbar *healthbar, int expReward); -s32 ov16_02267560(Healthbar *healthbar); -void ov16_0226757C(Healthbar *healthbar); -void ov16_022675AC(Healthbar *healthbar); -void ov16_022675D8(Healthbar *healthbar, int priority); - -/** - * @brief Enable (or disable) the healthbar. - * - * @param battleSys - * @param enable If TRUE, enable the healthbar; otherwise, disable it. - */ -void Healthbar_Enable(Healthbar *battleSys, BOOL enable); - -/** - * @brief Offset the healthbar's position by a given value along the X and Y axes. - * - * @param healthbar - * @param x X-axis offset for the healthbar from its current position. - * @param y Y-axis offset for the healthbar from its current position. - */ -void Healthbar_OffsetPositionXY(Healthbar *healthbar, int x, int y); - -/** - * @brief Scroll the healthbar in or out. - * - * @param healthbar - * @param direction The direction to scroll the healthbar. - */ -void Healthbar_Scroll(Healthbar *healthbar, enum HealthbarScrollDirection direction); - -/** - * @brief Determine the type of healthbar to be displayed for a given battler type - * (solo player, solo enemy, or any slot in doubles) and battle type. - * - * Pal Park and Safari Zone use a different healthbar type than normal battles. - * - * @param battlerType The type of battler which the healthbar represents. - * @param battleType The type of battle in which the healthbar will be used. - * @return The resulting healthbar type; see enum HealthbarType. - */ -u8 Healthbar_Type(int battlerType, u32 battleType); -void ov16_0226834C(Healthbar *healthbar, u8 *param1); -void ov16_02268468(Healthbar *healthbar); -void ov16_0226846C(Healthbar *healthbar); -void ov16_02268470(Healthbar *healthbar); -void ov16_02268498(Healthbar *healthbar); - -#endif // POKEPLATINUM_HEALTHBAR_H diff --git a/include/battle/healthbox.h b/include/battle/healthbox.h new file mode 100644 index 0000000000..9d13e22c71 --- /dev/null +++ b/include/battle/healthbox.h @@ -0,0 +1,181 @@ +#ifndef POKEPLATINUM_HEALTHBOX_H +#define POKEPLATINUM_HEALTHBOX_H + +#include "struct_decls/battle_system.h" + +#include "bg_window.h" +#include "narc.h" +#include "palette.h" +#include "sprite.h" +#include "sprite_system.h" +#include "sys_task_manager.h" + +#define HEALTHBOX_INFO_NONE 0 +#define HEALTHBOX_INFO_HP_GAUGE (1 << 0) +#define HEALTHBOX_INFO_CURRENT_HP (1 << 1) +#define HEALTHBOX_INFO_MAX_HP (1 << 2) +#define HEALTHBOX_INFO_LEVEL (1 << 3) +#define HEALTHBOX_INFO_NAME (1 << 4) +#define HEALTHBOX_INFO_EXP_GAUGE (1 << 5) +#define HEALTHBOX_INFO_GENDER (1 << 6) +#define HEALTHBOX_INFO_LEVEL_TEXT (1 << 7) +#define HEALTHBOX_INFO_STATUS (1 << 8) +#define HEALTHBOX_INFO_CAUGHT_SPECIES (1 << 9) +#define HEALTHBOX_INFO_COUNT_SAFARI_BALLS (1 << 10) +#define HEALTHBOX_INFO_REMAINING_SAFARI_BALLS (1 << 11) +#define HEALTHBOX_INFO_COUNT_PARK_BALLS (1 << 12) +#define HEALTHBOX_INFO_REMAINING_PARK_BALLS (1 << 13) + +#define HEALTHBOX_INFO_ALL ~0 + +#define HEALTHBOX_INFO_ALL_SAFARI (HEALTHBOX_INFO_COUNT_SAFARI_BALLS | HEALTHBOX_INFO_REMAINING_SAFARI_BALLS) +#define HEALTHBOX_INFO_ALL_PARK (HEALTHBOX_INFO_COUNT_PARK_BALLS | HEALTHBOX_INFO_REMAINING_PARK_BALLS) +#define HEALTHBOX_INFO_NOT_ON_ENEMY (HEALTHBOX_INFO_CURRENT_HP | HEALTHBOX_INFO_MAX_HP | HEALTHBOX_INFO_EXP_GAUGE) + +enum HealthBoxType { + HEALTHBOX_TYPE_PLAYER_SOLO = 0, + HEALTHBOX_TYPE_ENEMY_SOLO, + HEALTHBOX_TYPE_PLAYER_SLOT_1, + HEALTHBOX_TYPE_ENEMY_SLOT_1, + HEALTHBOX_TYPE_PLAYER_SLOT_2, + HEALTHBOX_TYPE_ENEMY_SLOT_2, + HEALTHBOX_TYPE_SAFARI_ZONE, + HEALTHBOX_TYPE_PAL_PARK, +}; + +enum HealthBoxScrollDirection { + HEALTHBOX_SCROLL_IN = 0, + HEALTHBOX_SCROLL_OUT, +}; + +enum HealthBoxGaugeType { + HEALTHBOX_GAUGE_HP = 0, + HEALTHBOX_GAUGE_EXP, +}; + +typedef struct HealthBox { + u8 state; + ManagedSprite *mainSprite; + ManagedSprite *arrowSprite; + BattleSystem *battleSys; + SysTask *task_10; + Window unused_14; + u8 battler; + u8 type; + u8 selectedPartySlot; + u8 numSafariBalls; + s32 curHP; + s32 maxHP; + s32 damage; + s32 hpTemp; + s32 curExp; + s32 maxExp; + s32 expReward; + s32 expTemp; + u8 level; + u8 gender; + u8 status; + u8 caughtSpecies; + u8 command; + u8 delay; + u8 unk_4E; + u8 scrollDirection : 1; + u8 doneScrolling : 1; + u8 unused_4F_2 : 1; + u8 numberMode : 1; + u8 padding : 4; + SysTask *task_50; + u16 degrees; +} HealthBox; + +/** + * @brief Load the resources required to display a healthbox. + * + * Though a NARC handle is required as a parameter, it is assumed to always be + * an open handle to pl_batt_obj.narc. + * + * @param renderer + * @param gfxHandler + * @param narc + * @param palette + * @param healthbox + */ +void HealthBox_LoadResources(SpriteSystem *spriteSys, SpriteManager *spriteMan, NARC *narc, PaletteData *palette, enum HealthBoxType healthbox); +ManagedSprite *HealthBox_DrawSprite(SpriteSystem *spriteSys, SpriteManager *spriteMan, int type); + +/** + * @brief Draw the informational parts of the healthbox, according to a set + * of input flags which control exactly what components to draw. + * + * @param healthbox + * @param hp The battler's current HP + * @param flags The components to be drawn, as a bitmask. + */ +void HealthBox_DrawInfo(HealthBox *healthbox, u32 hp, u32 flags); +void ov16_02267220(HealthBox *healthbox); +void ov16_02267258(HealthBox *healthbox); +void ov16_022672C4(HealthBox *healthbox); +void ov16_02267360(HealthBox *healthbox); +void ov16_0226737C(HealthBox *healthbox); + +/** + * @brief Compute the battler's new HP after taking a given amount of + * damage or restoring a certain amount of health. Additionally, cache + * this difference, flooring it to the bounds of the battler's current + * and maximum HP. + * + * @param healthbox + * @param damage The amount of damage dealt to a battler. Negative + * values are damage, positive values are recovery. + */ +void HealthBox_CalcHP(HealthBox *healthbox, int damage); +s32 ov16_022674F8(HealthBox *healthbox); +void HealthBox_CalcExp(HealthBox *healthbox, int expReward); +s32 ov16_02267560(HealthBox *healthbox); +void ov16_0226757C(HealthBox *healthbox); +void ov16_022675AC(HealthBox *healthbox); +void ov16_022675D8(HealthBox *healthbox, int priority); + +/** + * @brief Enable (or disable) the healthbox. + * + * @param healthbox + * @param enable If TRUE, enable the healthbox; otherwise, disable it. + */ +void HealthBox_Enable(HealthBox *healthbox, BOOL enable); + +/** + * @brief Offset the healthbox's position by a given value along the X and Y axes. + * + * @param healthbox + * @param x X-axis offset for the healthbox from its current position. + * @param y Y-axis offset for the healthbox from its current position. + */ +void HealthBox_OffsetPositionXY(HealthBox *healthbox, int x, int y); + +/** + * @brief Scroll the healthbox in or out. + * + * @param healthbox + * @param direction The direction to scroll the healthbox. + */ +void HealthBox_Scroll(HealthBox *healthbox, enum HealthBoxScrollDirection direction); + +/** + * @brief Determine the type of healthbox to be displayed for a given battler type + * (solo player, solo enemy, or any slot in doubles) and battle type. + * + * Pal Park and Safari Zone use a different healthbox type than normal battles. + * + * @param battlerType The type of battler which the healthbox represents. + * @param battleType The type of battle in which the healthbox will be used. + * @return The resulting healthbox type; see enum HealthBoxType. + */ +u8 HealthBox_Type(int battlerType, u32 battleType); +void ov16_0226834C(HealthBox *healthbox, u8 *param1); +void ov16_02268468(HealthBox *healthbox); +void ov16_0226846C(HealthBox *healthbox); +void ov16_02268470(HealthBox *healthbox); +void ov16_02268498(HealthBox *healthbox); + +#endif // POKEPLATINUM_HEALTHBOX_H diff --git a/include/battle/message_defs.h b/include/battle/message_defs.h index 2484fa1f2f..0d7960fe69 100644 --- a/include/battle/message_defs.h +++ b/include/battle/message_defs.h @@ -18,7 +18,7 @@ typedef struct PartyGaugeData { u8 status[MAX_PARTY_SIZE]; } PartyGaugeData; -typedef struct HealthbarData { +typedef struct HealthBoxData { u8 command; u8 level; s16 curHP; @@ -31,7 +31,7 @@ typedef struct HealthbarData { u32 expToNextLevel; int numSafariBalls; u8 delay; -} HealthbarData; +} HealthBoxData; typedef struct BattleMessageInfo { u8 recipient; diff --git a/include/constants/battle/battle_controller.h b/include/constants/battle/battle_controller.h index 460c02b5d5..9c66183bae 100644 --- a/include/constants/battle/battle_controller.h +++ b/include/constants/battle/battle_controller.h @@ -14,8 +14,8 @@ enum BattleCommand { BATTLE_COMMAND_THROW_TRAINER_BALL, BATTLE_COMMAND_SLIDE_TRAINER_OUT, // 10 BATTLE_COMMAND_SLIDE_TRAINER_IN, - BATTLE_COMMAND_SLIDE_HEALTHBAR_IN, - BATTLE_COMMAND_SLIDE_HEALTHBAR_OUT, + BATTLE_COMMAND_SLIDE_HEALTHBOX_IN, + BATTLE_COMMAND_SLIDE_HEALTHBOX_OUT, BATTLE_COMMAND_SET_COMMAND_SELECTION, BATTLE_COMMAND_SHOW_MOVE_SELECT_MENU, BATTLE_COMMAND_SHOW_TARGET_SELECT_MENU, diff --git a/include/data/scripts/btlcmd.h b/include/data/scripts/btlcmd.h index 8bcdd29a1b..2261316a31 100644 --- a/include/data/scripts/btlcmd.h +++ b/include/data/scripts/btlcmd.h @@ -16,9 +16,9 @@ ScriptCommand(BTLCMD_THROWPOKEBALL, BtlCmd_ThrowPokeball) ScriptCommand(BTLCMD_TRAINERSLIDEOUT, BtlCmd_TrainerSlideOut) ScriptCommand(BTLCMD_TRAINERSLIDEIN, BtlCmd_TrainerSlideIn) ScriptCommand(BTLCMD_BACKGROUNDSLIDEIN, BtlCmd_BackgroundSlideIn) -ScriptCommand(BTLCMD_HEALTHBARSLIDEIN, BtlCmd_HealthbarSlideIn) -ScriptCommand(BTLCMD_HEALTHBARSLIDEINDELAY, BtlCmd_HealthbarSlideInDelay) -ScriptCommand(BTLCMD_HEALTHBARSLIDEOUT, BtlCmd_HealthbarSlideOut) +ScriptCommand(BTLCMD_HEALTHBOXSLIDEIN, BtlCmd_HealthBoxSlideIn) +ScriptCommand(BTLCMD_HEALTHBOXSLIDEINDELAY, BtlCmd_HealthBoxSlideInDelay) +ScriptCommand(BTLCMD_HEALTHBOXSLIDEOUT, BtlCmd_HealthBoxSlideOut) ScriptCommand(BTLCMD_WAIT, BtlCmd_Wait) ScriptCommand(BTLCMD_CALCDAMAGE, BtlCmd_CalcDamage) ScriptCommand(BTLCMD_CALCMAXDAMAGE, BtlCmd_CalcMaxDamage) @@ -71,7 +71,7 @@ ScriptCommand(BTLCMD_SETMIRRORMOVE, BtlCmd_SetMirrorMove) ScriptCommand(BTLCMD_RESETALLSTATCHANGES, BtlCmd_ResetAllStatChanges) ScriptCommand(BTLCMD_LOCKMOVECHOICE, BtlCmd_LockMoveChoice) ScriptCommand(BTLCMD_UNLOCKMOVECHOICE, BtlCmd_UnlockMoveChoice) -ScriptCommand(BTLCMD_SETHEALTHBARSTATUS, BtlCmd_SetHealthbarStatus) +ScriptCommand(BTLCMD_SETHEALTHBOXSTATUSICON, BtlCmd_SetHealthBoxStatusIcon) ScriptCommand(BTLCMD_PRINTTRAINERMESSAGE, BtlCmd_PrintTrainerMessage) ScriptCommand(BTLCMD_PAYPRIZEMONEY, BtlCmd_PayPrizeMoney) ScriptCommand(BTLCMD_PLAYBATTLEANIMATION, BtlCmd_PlayBattleAnimation) diff --git a/include/struct_defs/battler_data.h b/include/struct_defs/battler_data.h index 38eafa5641..4db599b938 100644 --- a/include/struct_defs/battler_data.h +++ b/include/struct_defs/battler_data.h @@ -1,7 +1,7 @@ #ifndef POKEPLATINUM_STRUCT_BATTLER_DATA_H #define POKEPLATINUM_STRUCT_BATTLER_DATA_H -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/struct_ov16_0226C378.h" #include "battle_anim/struct_ball_rotation_decl.h" #include "battle_anim/struct_ov12_02223764.h" @@ -29,7 +29,7 @@ typedef struct BattlerData { PokemonSprite *monSpriteBackup; PokemonSprite *monSprite; Window *unused_24; - Healthbar healthbar; + HealthBox healthbox; UnkStruct_ov16_0226C378 unk_7B; BallRotation *ballRotation; UnkStruct_ov12_02223764 *unk_88; diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index fc00f8f1d7..1249342f47 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -693,7 +693,7 @@ Overlay battle Object main.nef.p/src_battle_battle_display.c.o Object main.nef.p/src_battle_ov16_02264798.c.o Object main.nef.p/src_battle_battle_controller.c.o - Object main.nef.p/src_battle_healthbar.c.o + Object main.nef.p/src_battle_healthbox.c.o Object main.nef.p/src_battle_ov16_02268520.c.o Object main.nef.p/src_battle_battle_cursor.c.o Object main.nef.p/src_battle_party_gauge.c.o diff --git a/res/battle/scripts/subscripts/subscript_ability_forbids_status.s b/res/battle/scripts/subscripts/subscript_ability_forbids_status.s index f2f1b75a79..043678046e 100644 --- a/res/battle/scripts/subscripts/subscript_ability_forbids_status.s +++ b/res/battle/scripts/subscripts/subscript_ability_forbids_status.s @@ -5,7 +5,7 @@ _000: // {0} cured its {2} status with its {1}! PrintMessage BattleStrings_Text_PokemonCuredItsStatusWithItsAbility_Ally, TAG_NICKNAME_ABILITY_STATUS, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 CompareVarToValue OPCODE_EQU, BTLVAR_MSG_TEMP, 0, _033 CompareVarToValue OPCODE_EQU, BTLVAR_MSG_TEMP, 5, _045 diff --git a/res/battle/scripts/subscripts/subscript_ability_restore_status.s b/res/battle/scripts/subscripts/subscript_ability_restore_status.s index 2a55cf8236..23822fb906 100644 --- a/res/battle/scripts/subscripts/subscript_ability_restore_status.s +++ b/res/battle/scripts/subscripts/subscript_ability_restore_status.s @@ -7,6 +7,6 @@ _000: // {0}’s {1} cured its {2} status! PrintMessage BattleStrings_Text_PokemonsAbilityCuredItsStatus_Ally, TAG_NICKNAME_ABILITY_STATUS, BTLSCR_MSG_TEMP, BTLSCR_MSG_BATTLER_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_attack_then_switch_out.s b/res/battle/scripts/subscripts/subscript_attack_then_switch_out.s index 23b41106a1..90255e0518 100644 --- a/res/battle/scripts/subscripts/subscript_attack_then_switch_out.s +++ b/res/battle/scripts/subscripts/subscript_attack_then_switch_out.s @@ -25,7 +25,7 @@ _014: Call BATTLE_SUBSCRIPT_UPDATE_HP PlayFaintAnimation Wait - HealthbarSlideOut BTLSCR_FAINTED_MON + HealthBoxSlideOut BTLSCR_FAINTED_MON // {0} fainted! PrintMessage BattleStrings_Text_PokemonFainted_Ally, TAG_NICKNAME, BTLSCR_FAINTED_MON Wait @@ -63,7 +63,7 @@ _141: Wait DeletePokemon BTLSCR_ATTACKER Wait - HealthbarSlideOut BTLSCR_ATTACKER + HealthBoxSlideOut BTLSCR_ATTACKER Wait UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS_2, SYSCTL_UTURN_ACTIVE UpdateVar OPCODE_FLAG_OFF, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS diff --git a/res/battle/scripts/subscripts/subscript_badly_poison.s b/res/battle/scripts/subscripts/subscript_badly_poison.s index 2edd70528b..0ebb7e014b 100644 --- a/res/battle/scripts/subscripts/subscript_badly_poison.s +++ b/res/battle/scripts/subscripts/subscript_badly_poison.s @@ -78,7 +78,7 @@ _222: _227: Wait - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_POISONED + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_POISONED WaitButtonABTime 30 CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS, _244 UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS diff --git a/res/battle/scripts/subscripts/subscript_baton_pass.s b/res/battle/scripts/subscripts/subscript_baton_pass.s index 8480d885fd..b2ea43b83e 100644 --- a/res/battle/scripts/subscripts/subscript_baton_pass.s +++ b/res/battle/scripts/subscripts/subscript_baton_pass.s @@ -10,7 +10,7 @@ _000: _013: DeletePokemon BTLSCR_ATTACKER Wait - HealthbarSlideOut BTLSCR_ATTACKER + HealthBoxSlideOut BTLSCR_ATTACKER Wait UpdateVarFromVar OPCODE_SET, BTLVAR_SWITCHED_MON, BTLVAR_ATTACKER UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_BATON_PASS diff --git a/res/battle/scripts/subscripts/subscript_battle_lost.s b/res/battle/scripts/subscripts/subscript_battle_lost.s index 80dea35af5..1f3fdedd95 100644 --- a/res/battle/scripts/subscripts/subscript_battle_lost.s +++ b/res/battle/scripts/subscripts/subscript_battle_lost.s @@ -53,7 +53,7 @@ _076: _089: Wait - HealthbarSlideOut BTLSCR_ENEMY + HealthBoxSlideOut BTLSCR_ENEMY Wait TrainerSlideIn BTLSCR_ENEMY_SLOT_1, BATTLER_TYPE_SOLO_ENEMY Wait diff --git a/res/battle/scripts/subscripts/subscript_burn.s b/res/battle/scripts/subscripts/subscript_burn.s index 4a06a012c4..afdf6bae23 100644 --- a/res/battle/scripts/subscripts/subscript_burn.s +++ b/res/battle/scripts/subscripts/subscript_burn.s @@ -74,7 +74,7 @@ _185: _190: Wait - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_BURNED + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_BURNED WaitButtonABTime 30 CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS, _207 UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS diff --git a/res/battle/scripts/subscripts/subscript_defrosted_by_move.s b/res/battle/scripts/subscripts/subscript_defrosted_by_move.s index 6a8d3cc9dc..94e1aeab5a 100644 --- a/res/battle/scripts/subscripts/subscript_defrosted_by_move.s +++ b/res/battle/scripts/subscripts/subscript_defrosted_by_move.s @@ -6,6 +6,6 @@ _000: // {0} was defrosted by {1}! PrintMessage BattleStrings_Text_PokemonWasDefrostedByMove_Ally, TAG_NICKNAME_MOVE, BTLSCR_ATTACKER, BTLSCR_ATTACKER Wait - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_faint_check_destiny_bond.s b/res/battle/scripts/subscripts/subscript_faint_check_destiny_bond.s index 67b817e01f..ff3c8c39ca 100644 --- a/res/battle/scripts/subscripts/subscript_faint_check_destiny_bond.s +++ b/res/battle/scripts/subscripts/subscript_faint_check_destiny_bond.s @@ -15,7 +15,7 @@ _000: Call BATTLE_SUBSCRIPT_UPDATE_HP PlayFaintAnimation Wait - HealthbarSlideOut BTLSCR_FAINTED_MON + HealthBoxSlideOut BTLSCR_FAINTED_MON // {0} fainted! PrintMessage BattleStrings_Text_PokemonFainted_Ally, TAG_NICKNAME, BTLSCR_FAINTED_MON Wait diff --git a/res/battle/scripts/subscripts/subscript_faint_mon.s b/res/battle/scripts/subscripts/subscript_faint_mon.s index 40fd0dd14a..05c4355255 100644 --- a/res/battle/scripts/subscripts/subscript_faint_mon.s +++ b/res/battle/scripts/subscripts/subscript_faint_mon.s @@ -6,7 +6,7 @@ _000: IncrementGameRecord BTLSCR_FAINTED_MON, BATTLER_TYPE_SOLO_PLAYER, RECORD_FAINTED_ENEMY_MON PlayFaintAnimation Wait - HealthbarSlideOut BTLSCR_FAINTED_MON + HealthBoxSlideOut BTLSCR_FAINTED_MON // {0} fainted! PrintMessage BattleStrings_Text_PokemonFainted_Ally, TAG_NICKNAME, BTLSCR_FAINTED_MON Wait diff --git a/res/battle/scripts/subscripts/subscript_fall_asleep.s b/res/battle/scripts/subscripts/subscript_fall_asleep.s index c5b9fa162e..aa08127cd2 100644 --- a/res/battle/scripts/subscripts/subscript_fall_asleep.s +++ b/res/battle/scripts/subscripts/subscript_fall_asleep.s @@ -70,7 +70,7 @@ _170: _176: Wait WaitButtonABTime 30 - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_ASLEEP + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_ASLEEP Wait CompareMonDataToValue OPCODE_FLAG_SET, BTLSCR_SIDE_EFFECT_MON, BATTLEMON_MOVE_EFFECTS_MASK, MOVE_EFFECT_SEMI_INVULNERABLE, _193 UnlockMoveChoice BTLSCR_SIDE_EFFECT_MON diff --git a/res/battle/scripts/subscripts/subscript_force_target_to_switch_or_flee.s b/res/battle/scripts/subscripts/subscript_force_target_to_switch_or_flee.s index c9dd7ecf3e..bde7f9932f 100644 --- a/res/battle/scripts/subscripts/subscript_force_target_to_switch_or_flee.s +++ b/res/battle/scripts/subscripts/subscript_force_target_to_switch_or_flee.s @@ -15,13 +15,13 @@ _032: DeletePokemon BTLSCR_DEFENDER Wait CompareVarToValue OPCODE_FLAG_NOT, BTLVAR_BATTLE_TYPE, BATTLE_TYPE_TRAINER, _067 - HealthbarSlideOut BTLSCR_DEFENDER + HealthBoxSlideOut BTLSCR_DEFENDER Wait SwitchAndUpdateMon BTLSCR_FORCED_OUT Wait PokemonSendOut BTLSCR_DEFENDER WaitTime 72 - HealthbarSlideIn BTLSCR_DEFENDER + HealthBoxSlideIn BTLSCR_DEFENDER Wait // {0} was dragged out! PrintMessage BattleStrings_Text_PokemonWasDraggedOut_Ally, TAG_NICKNAME, BTLSCR_DEFENDER diff --git a/res/battle/scripts/subscripts/subscript_freeze.s b/res/battle/scripts/subscripts/subscript_freeze.s index 45aa4b50fa..41fa976faf 100644 --- a/res/battle/scripts/subscripts/subscript_freeze.s +++ b/res/battle/scripts/subscripts/subscript_freeze.s @@ -35,7 +35,7 @@ _073: // {0} was frozen solid! PrintMessage BattleStrings_Text_PokemonWasFrozenSolid_Ally, TAG_NICKNAME, BTLSCR_SIDE_EFFECT_MON Wait - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_FROZEN + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_FROZEN WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_give_target_own_status.s b/res/battle/scripts/subscripts/subscript_give_target_own_status.s index 704f5536fe..e1a18766c9 100644 --- a/res/battle/scripts/subscripts/subscript_give_target_own_status.s +++ b/res/battle/scripts/subscripts/subscript_give_target_own_status.s @@ -26,7 +26,7 @@ _039: _041: CompareMonDataToValue OPCODE_FLAG_NOT, BTLSCR_DEFENDER, BATTLEMON_STATUS, MON_CONDITION_ANY, _055 - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE UpdateMonData OPCODE_SET, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_NONE _055: diff --git a/res/battle/scripts/subscripts/subscript_heal_bell.s b/res/battle/scripts/subscripts/subscript_heal_bell.s index 0594b3d4bb..38bbfea58b 100644 --- a/res/battle/scripts/subscripts/subscript_heal_bell.s +++ b/res/battle/scripts/subscripts/subscript_heal_bell.s @@ -31,11 +31,11 @@ _035: _049: CompareVarToValue OPCODE_FLAG_SET, BTLVAR_CALC_TEMP, 0x00000004, _057 - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE _057: CompareVarToValue OPCODE_FLAG_SET, BTLVAR_CALC_TEMP, 0x00000008, _065 - SetHealthbarStatus BTLSCR_ATTACKER_PARTNER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER_PARTNER, BATTLE_ANIMATION_NONE _065: End diff --git a/res/battle/scripts/subscripts/subscript_heal_target_paralysis.s b/res/battle/scripts/subscripts/subscript_heal_target_paralysis.s index b92f089d9a..a9f086ed87 100644 --- a/res/battle/scripts/subscripts/subscript_heal_target_paralysis.s +++ b/res/battle/scripts/subscripts/subscript_heal_target_paralysis.s @@ -7,7 +7,7 @@ _000: // {0} was healed of paralysis! PrintMessage BattleStrings_Text_PokemonWasHealedOfParalysis_Ally, TAG_NICKNAME, BTLSCR_DEFENDER Wait - SetHealthbarStatus BTLSCR_DEFENDER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_DEFENDER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 _020: diff --git a/res/battle/scripts/subscripts/subscript_heal_target_sleep.s b/res/battle/scripts/subscripts/subscript_heal_target_sleep.s index 94b3a2373c..909d5db4d4 100644 --- a/res/battle/scripts/subscripts/subscript_heal_target_sleep.s +++ b/res/battle/scripts/subscripts/subscript_heal_target_sleep.s @@ -7,7 +7,7 @@ _000: // {0} woke up! PrintMessage BattleStrings_Text_PokemonWokeUp_Ally, TAG_NICKNAME, BTLSCR_DEFENDER Wait - SetHealthbarStatus BTLSCR_DEFENDER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_DEFENDER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 _020: diff --git a/res/battle/scripts/subscripts/subscript_healing_wish.s b/res/battle/scripts/subscripts/subscript_healing_wish.s index 934a9f7ed0..99ec43a08c 100644 --- a/res/battle/scripts/subscripts/subscript_healing_wish.s +++ b/res/battle/scripts/subscripts/subscript_healing_wish.s @@ -21,7 +21,7 @@ _026: Wait PokemonSendOut BTLSCR_SWITCHED_MON WaitTime 72 - HealthbarSlideIn BTLSCR_SWITCHED_MON + HealthBoxSlideIn BTLSCR_SWITCHED_MON Wait Call BATTLE_SUBSCRIPT_HAZARDS_CHECK CompareVarToValue OPCODE_FLAG_NOT, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_MON_FAINTED, _065 @@ -33,7 +33,7 @@ _026: _065: UpdateMonData OPCODE_SET, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_NONE - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE UpdateMonDataFromVar OPCODE_GET, BTLSCR_ATTACKER, BATTLEMON_MAX_HP, BTLVAR_HP_CALC_TEMP UpdateVarFromVar OPCODE_SET, BTLVAR_MSG_BATTLER_TEMP, BTLVAR_ATTACKER // The healing wish came true! diff --git a/res/battle/scripts/subscripts/subscript_held_item_brn_restore.s b/res/battle/scripts/subscripts/subscript_held_item_brn_restore.s index bb6f821516..60df7c49ce 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_brn_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_brn_restore.s @@ -7,7 +7,7 @@ _000: // {0}’s {1} healed its burn! PrintMessage BattleStrings_Text_PokemonsItemCuredItsBurn_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE Call BATTLE_SUBSCRIPT_PLUCK_CHECK diff --git a/res/battle/scripts/subscripts/subscript_held_item_frz_restore.s b/res/battle/scripts/subscripts/subscript_held_item_frz_restore.s index f6be97eeae..5e7369974d 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_frz_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_frz_restore.s @@ -7,7 +7,7 @@ _000: // {0}’s {1} defrosted it! PrintMessage BattleStrings_Text_PokemonsItemDefrostedIt_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE Call BATTLE_SUBSCRIPT_PLUCK_CHECK diff --git a/res/battle/scripts/subscripts/subscript_held_item_multi_restore.s b/res/battle/scripts/subscripts/subscript_held_item_multi_restore.s index 208d87b69b..8a6ec1fd91 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_multi_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_multi_restore.s @@ -7,7 +7,7 @@ _000: // {0} normalized its status using its {1}! PrintMessage BattleStrings_Text_PokemonNormalizedItsStatusUsingItsItem_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE UpdateMonData OPCODE_FLAG_OFF, BTLSCR_MSG_TEMP, BATTLEMON_VOLATILE_STATUS, VOLATILE_CONDITION_NIGHTMARE diff --git a/res/battle/scripts/subscripts/subscript_held_item_prz_restore.s b/res/battle/scripts/subscripts/subscript_held_item_prz_restore.s index 0a1d603b01..40a992592c 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_prz_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_prz_restore.s @@ -7,7 +7,7 @@ _000: // {0}’s {1} cured its paralysis! PrintMessage BattleStrings_Text_PokemonsItemCuredItsParalysis_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE Call BATTLE_SUBSCRIPT_PLUCK_CHECK diff --git a/res/battle/scripts/subscripts/subscript_held_item_psn_restore.s b/res/battle/scripts/subscripts/subscript_held_item_psn_restore.s index f0c81beccd..205d456d2d 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_psn_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_psn_restore.s @@ -7,7 +7,7 @@ _000: // {0}’s {1} cured its poison! PrintMessage BattleStrings_Text_PokemonsItemCuredItsPoison_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE Call BATTLE_SUBSCRIPT_PLUCK_CHECK diff --git a/res/battle/scripts/subscripts/subscript_held_item_slp_restore.s b/res/battle/scripts/subscripts/subscript_held_item_slp_restore.s index 480a170c2b..f2ce118f3a 100644 --- a/res/battle/scripts/subscripts/subscript_held_item_slp_restore.s +++ b/res/battle/scripts/subscripts/subscript_held_item_slp_restore.s @@ -7,7 +7,7 @@ _000: // {0}’s {1} woke it up! PrintMessage BattleStrings_Text_PokemonsItemWokeItUp_Ally, TAG_NICKNAME_ITEM, BTLSCR_MSG_TEMP, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_NONE UpdateMonData OPCODE_FLAG_OFF, BTLSCR_MSG_TEMP, BATTLEMON_VOLATILE_STATUS, VOLATILE_CONDITION_NIGHTMARE diff --git a/res/battle/scripts/subscripts/subscript_lunar_dance.s b/res/battle/scripts/subscripts/subscript_lunar_dance.s index 2ad55afe8c..a31f7617e6 100644 --- a/res/battle/scripts/subscripts/subscript_lunar_dance.s +++ b/res/battle/scripts/subscripts/subscript_lunar_dance.s @@ -21,7 +21,7 @@ _026: Wait PokemonSendOut BTLSCR_SWITCHED_MON WaitTime 72 - HealthbarSlideIn BTLSCR_SWITCHED_MON + HealthBoxSlideIn BTLSCR_SWITCHED_MON Wait Call BATTLE_SUBSCRIPT_HAZARDS_CHECK CompareVarToValue OPCODE_FLAG_NOT, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_MON_FAINTED, _065 @@ -33,7 +33,7 @@ _026: _065: UpdateMonData OPCODE_SET, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_NONE - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE UpdateMonDataFromVar OPCODE_GET, BTLSCR_ATTACKER, BATTLEMON_MAX_PP_1, BTLVAR_CALC_TEMP UpdateMonDataFromVar OPCODE_SET, BTLSCR_ATTACKER, BATTLEMON_CUR_PP_1, BTLVAR_CALC_TEMP UpdateMonDataFromVar OPCODE_GET, BTLSCR_ATTACKER, BATTLEMON_MAX_PP_2, BTLVAR_CALC_TEMP diff --git a/res/battle/scripts/subscripts/subscript_paralyze.s b/res/battle/scripts/subscripts/subscript_paralyze.s index 281986848f..54c7178d47 100644 --- a/res/battle/scripts/subscripts/subscript_paralyze.s +++ b/res/battle/scripts/subscripts/subscript_paralyze.s @@ -45,7 +45,7 @@ _096: _102: Wait - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_PARALYZED + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_PARALYZED WaitButtonABTime 30 CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS, _118 UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS diff --git a/res/battle/scripts/subscripts/subscript_poison.s b/res/battle/scripts/subscripts/subscript_poison.s index c0842253e5..fe56e71bd9 100644 --- a/res/battle/scripts/subscripts/subscript_poison.s +++ b/res/battle/scripts/subscripts/subscript_poison.s @@ -58,7 +58,7 @@ _150: _156: Wait - SetHealthbarStatus BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_POISONED + SetHealthBoxStatusIcon BTLSCR_SIDE_EFFECT_MON, BATTLE_ANIMATION_POISONED WaitButtonABTime 30 CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS, _172 UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_TRY_SYNCHRONIZE_STATUS diff --git a/res/battle/scripts/subscripts/subscript_recover_psn_prz_brn.s b/res/battle/scripts/subscripts/subscript_recover_psn_prz_brn.s index c731f01dc2..138671232c 100644 --- a/res/battle/scripts/subscripts/subscript_recover_psn_prz_brn.s +++ b/res/battle/scripts/subscripts/subscript_recover_psn_prz_brn.s @@ -8,7 +8,7 @@ _000: // {0}’s status returned to normal! PrintMessage BattleStrings_Text_PokemonsStatusReturnedToNormal_Ally, TAG_NICKNAME, BTLSCR_ATTACKER Wait - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_replace_fainted.s b/res/battle/scripts/subscripts/subscript_replace_fainted.s index 1d7623c3e7..e13573d55d 100644 --- a/res/battle/scripts/subscripts/subscript_replace_fainted.s +++ b/res/battle/scripts/subscripts/subscript_replace_fainted.s @@ -57,7 +57,7 @@ _064: FreePartyGaugeGraphics PokemonSendOut BTLSCR_SWITCHED_MON WaitTime 72 - HealthbarSlideIn BTLSCR_SWITCHED_MON + HealthBoxSlideIn BTLSCR_SWITCHED_MON Wait Call BATTLE_SUBSCRIPT_HAZARDS_CHECK CompareVarToValue OPCODE_FLAG_NOT, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_MON_FAINTED, _091 diff --git a/res/battle/scripts/subscripts/subscript_rest.s b/res/battle/scripts/subscripts/subscript_rest.s index 0f1e0f44dd..2b2066d766 100644 --- a/res/battle/scripts/subscripts/subscript_rest.s +++ b/res/battle/scripts/subscripts/subscript_rest.s @@ -21,7 +21,7 @@ _027: GoTo _065 _053: - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE UpdateMonData OPCODE_FLAG_OFF, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_NOT_SLEEP // {0} slept and became healthy! PrintMessage BattleStrings_Text_PokemonSleptAndBecameHealthy_Ally, TAG_NICKNAME, BTLSCR_ATTACKER @@ -30,7 +30,7 @@ _065: Wait WaitButtonABTime 30 UpdateMonData OPCODE_FLAG_ON, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_SLEEP_0|MON_CONDITION_SLEEP_1 - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_ASLEEP + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_ASLEEP UpdateVarFromVar OPCODE_SET, BTLVAR_MSG_BATTLER_TEMP, BTLVAR_ATTACKER UpdateVar OPCODE_FLAG_ON, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_SKIP_SPRITE_BLINK Call BATTLE_SUBSCRIPT_UPDATE_HP diff --git a/res/battle/scripts/subscripts/subscript_show_party_list.s b/res/battle/scripts/subscripts/subscript_show_party_list.s index ab0b95a450..c45f9f5dac 100644 --- a/res/battle/scripts/subscripts/subscript_show_party_list.s +++ b/res/battle/scripts/subscripts/subscript_show_party_list.s @@ -17,7 +17,7 @@ _001: FreePartyGaugeGraphics PokemonSendOut BTLSCR_SWITCHED_MON WaitTime 72 - HealthbarSlideIn BTLSCR_SWITCHED_MON + HealthBoxSlideIn BTLSCR_SWITCHED_MON Wait Call BATTLE_SUBSCRIPT_HAZARDS_CHECK CompareVarToValue OPCODE_FLAG_NOT, BTLVAR_BATTLE_CTX_STATUS, SYSCTL_MON_FAINTED, _030 diff --git a/res/battle/scripts/subscripts/subscript_start_encounter.s b/res/battle/scripts/subscripts/subscript_start_encounter.s index 5bff3c4605..54846cdf36 100644 --- a/res/battle/scripts/subscripts/subscript_start_encounter.s +++ b/res/battle/scripts/subscripts/subscript_start_encounter.s @@ -9,7 +9,7 @@ _000: SetTrainerEncounter BTLSCR_PLAYER PlayEncounterAnimation WaitTime 122 - HealthbarSlideInDelay BTLSCR_ENEMY + HealthBoxSlideInDelay BTLSCR_ENEMY Wait CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_SYS_STATUS, BATTLE_STATUS_DISTORTION, _073 CompareVarToValue OPCODE_FLAG_SET, BTLVAR_BATTLE_SYS_STATUS, BATTLE_STATUS_LEGENDARY, _067 @@ -61,7 +61,7 @@ _100: ThrowPokeball BTLSCR_PLAYER, BTLSCR_THROW_POKE_BALL PokemonSlideIn BTLSCR_PLAYER WaitTime 96 - HealthbarSlideInDelay BTLSCR_PLAYER + HealthBoxSlideInDelay BTLSCR_PLAYER Wait OAMToSprite BTLSCR_ENEMY Wait @@ -83,14 +83,14 @@ _118: ThrowPokeball BTLSCR_ENEMY, BTLSCR_THROW_POKE_BALL PokemonSlideIn BTLSCR_ENEMY WaitTime 112 - HealthbarSlideInDelay BTLSCR_ENEMY + HealthBoxSlideInDelay BTLSCR_ENEMY Wait PrintFirstSendOutMessage BTLSCR_PLAYER HideBattleStartPartyGauge BTLSCR_PLAYER ThrowPokeball BTLSCR_PLAYER, BTLSCR_THROW_POKE_BALL PokemonSlideIn BTLSCR_PLAYER WaitTime 96 - HealthbarSlideInDelay BTLSCR_PLAYER + HealthBoxSlideInDelay BTLSCR_PLAYER Wait FreePartyGaugeGraphics GoTo _258 @@ -110,14 +110,14 @@ _169: ThrowPokeball BTLSCR_PLAYER, BTLSCR_THROW_POKE_BALL PokemonSlideIn BTLSCR_PLAYER WaitTime 96 - HealthbarSlideInDelay BTLSCR_PLAYER + HealthBoxSlideInDelay BTLSCR_PLAYER Wait PrintFirstSendOutMessage BTLSCR_ENEMY HideBattleStartPartyGauge BTLSCR_ENEMY ThrowPokeball BTLSCR_ENEMY, BTLSCR_THROW_POKE_BALL PokemonSlideIn BTLSCR_ENEMY WaitTime 112 - HealthbarSlideInDelay BTLSCR_ENEMY + HealthBoxSlideInDelay BTLSCR_ENEMY Wait FreePartyGaugeGraphics GoTo _258 @@ -127,12 +127,12 @@ _215: SetTrainerEncounter BTLSCR_PLAYER PlayEncounterAnimation WaitTime 122 - HealthbarSlideInDelay BTLSCR_ENEMY + HealthBoxSlideInDelay BTLSCR_ENEMY Wait // A wild {0} appeared! PrintGlobalMessage BattleStrings_Text_AWildPokemonAppeared, TAG_NICKNAME, BTLSCR_ENEMY Wait - HealthbarSlideIn BTLSCR_PLAYER + HealthBoxSlideIn BTLSCR_PLAYER WaitButtonABTime 7 Wait GoTo _258 @@ -142,12 +142,12 @@ _237: SetTrainerEncounter BTLSCR_PLAYER PlayEncounterAnimation WaitTime 122 - HealthbarSlideInDelay BTLSCR_ENEMY + HealthBoxSlideInDelay BTLSCR_ENEMY Wait // Wow! {0}’s {1} is drawing close! PrintGlobalMessage BattleStrings_Text_01219, TAG_TRNAME_NICKNAME, BTLSCR_ENEMY, BTLSCR_ENEMY Wait - HealthbarSlideIn BTLSCR_PLAYER + HealthBoxSlideIn BTLSCR_PLAYER WaitButtonABTime 7 Wait diff --git a/res/battle/scripts/subscripts/subscript_switch_pokemon.s b/res/battle/scripts/subscripts/subscript_switch_pokemon.s index bc71b03364..66405d262f 100644 --- a/res/battle/scripts/subscripts/subscript_switch_pokemon.s +++ b/res/battle/scripts/subscripts/subscript_switch_pokemon.s @@ -15,7 +15,7 @@ _007: _020: RecallPokemon BTLSCR_SWITCHED_MON Wait - HealthbarSlideOut BTLSCR_SWITCHED_MON + HealthBoxSlideOut BTLSCR_SWITCHED_MON Wait _026: @@ -38,7 +38,7 @@ _045: FreePartyGaugeGraphics PokemonSendOut BTLSCR_SWITCHED_MON WaitTime 72 - HealthbarSlideIn BTLSCR_SWITCHED_MON + HealthBoxSlideIn BTLSCR_SWITCHED_MON Wait Call BATTLE_SUBSCRIPT_HAZARDS_CHECK CompareVarToValue OPCODE_GT, BTLVAR_FAINTED_MON, BATTLER_ENEMY_2, _079 diff --git a/res/battle/scripts/subscripts/subscript_thaw_out.s b/res/battle/scripts/subscripts/subscript_thaw_out.s index 0e73d5b412..74f84cefd9 100644 --- a/res/battle/scripts/subscripts/subscript_thaw_out.s +++ b/res/battle/scripts/subscripts/subscript_thaw_out.s @@ -6,6 +6,6 @@ _000: // {0} thawed out! PrintMessage BattleStrings_Text_PokemonThawedOut_Ally, TAG_NICKNAME, BTLSCR_MSG_TEMP Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_use_full_restore.s b/res/battle/scripts/subscripts/subscript_use_full_restore.s index 966656b0b5..50e77d1335 100644 --- a/res/battle/scripts/subscripts/subscript_use_full_restore.s +++ b/res/battle/scripts/subscripts/subscript_use_full_restore.s @@ -2,7 +2,7 @@ _000: - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_SET, BTLSCR_ATTACKER, BATTLEMON_STATUS, MON_CONDITION_NONE UpdateMonData OPCODE_FLAG_OFF, BTLSCR_ATTACKER, BATTLEMON_VOLATILE_STATUS, VOLATILE_CONDITION_CONFUSION diff --git a/res/battle/scripts/subscripts/subscript_use_status_recovery.s b/res/battle/scripts/subscripts/subscript_use_status_recovery.s index b9538b08f0..d69c382757 100644 --- a/res/battle/scripts/subscripts/subscript_use_status_recovery.s +++ b/res/battle/scripts/subscripts/subscript_use_status_recovery.s @@ -55,6 +55,6 @@ _099: _104: Wait - SetHealthbarStatus BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_ATTACKER, BATTLE_ANIMATION_NONE WaitButtonABTime 30 End diff --git a/res/battle/scripts/subscripts/subscript_wake_up.s b/res/battle/scripts/subscripts/subscript_wake_up.s index 34927397a4..3aa1eb1c25 100644 --- a/res/battle/scripts/subscripts/subscript_wake_up.s +++ b/res/battle/scripts/subscripts/subscript_wake_up.s @@ -14,7 +14,7 @@ _015: _019: Wait - SetHealthbarStatus BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE + SetHealthBoxStatusIcon BTLSCR_MSG_TEMP, BATTLE_ANIMATION_NONE WaitButtonABTime 30 UpdateMonData OPCODE_FLAG_OFF, BTLSCR_MSG_TEMP, BATTLEMON_STATUS, MON_CONDITION_SLEEP UpdateMonData OPCODE_FLAG_OFF, BTLSCR_MSG_TEMP, BATTLEMON_VOLATILE_STATUS, VOLATILE_CONDITION_NIGHTMARE diff --git a/res/graphics/battle/healthbox/healthbar_parts.png b/res/graphics/battle/healthbox/healthbox_parts.png similarity index 100% rename from res/graphics/battle/healthbox/healthbar_parts.png rename to res/graphics/battle/healthbox/healthbox_parts.png diff --git a/res/graphics/battle/healthbox/meson.build b/res/graphics/battle/healthbox/meson.build index ca522ae56d..2a1ef3f016 100644 --- a/res/graphics/battle/healthbox/meson.build +++ b/res/graphics/battle/healthbox/meson.build @@ -90,14 +90,14 @@ battle_sprites += [ ) ] -healthbar_parts_embed = custom_target( - 'healthbar_parts.4bpp.h', +healthbox_parts_embed = custom_target( + 'healthbox_parts.4bpp.h', output: [ - 'healthbar_parts.4bpp', - 'healthbar_parts.4bpp.h', + 'healthbox_parts.4bpp', + 'healthbox_parts.4bpp.h', ], - input: files('healthbar_parts.png'), - command: [ nitrogfx_exe, '@INPUT@', '@OUTPUT0@', '-embed', 'sHealthbarPartsBitmap' ], + input: files('healthbox_parts.png'), + command: [ nitrogfx_exe, '@INPUT@', '@OUTPUT0@', '-embed', 'sHealthBoxPartsBitmap' ], ) -embed_headers += healthbar_parts_embed[1] +embed_headers += healthbox_parts_embed[1] diff --git a/res/text/battle_strings.json b/res/text/battle_strings.json index 05321648e8..5cda850b7c 100644 --- a/res/text/battle_strings.json +++ b/res/text/battle_strings.json @@ -6481,7 +6481,7 @@ "en_US": "{STRVAR_1 1, 0, 0}{COLOR 4}♀{COLOR 0}" }, { - "id": "BattleStrings_Text_HealthbarPokemonName", + "id": "BattleStrings_Text_HealthBoxPokemonName", "en_US": "{STRVAR_1 1, 0, 0}" }, { diff --git a/src/battle/battle_controller.c b/src/battle/battle_controller.c index 934c89e338..c5a01966da 100644 --- a/src/battle/battle_controller.c +++ b/src/battle/battle_controller.c @@ -518,53 +518,53 @@ void BattleController_EmitSlideTrainerIn(BattleSystem *battleSys, int battler, i } /** - * @brief Emits a message to slide the healthbar in for a given battler + * @brief Emits a message to slide the healthbox in for a given battler * * @param battleSys * @param battleCtx * @param battler * @param delay Optional frame-delay to wait until execution. */ -void BattleController_EmitSlideHealthbarIn(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int delay) +void BattleController_EmitSlideHealthBoxIn(BattleSystem *battleSys, BattleContext *battleCtx, int battler, int delay) { - HealthbarData healthbar; + HealthBoxData healthboxData; Pokemon *mon = BattleSystem_GetPartyPokemon(battleSys, battler, battleCtx->selectedPartySlot[battler]); int species = Pokemon_GetValue(mon, MON_DATA_SPECIES, NULL); int level = Pokemon_GetValue(mon, MON_DATA_LEVEL, NULL); - healthbar.command = BATTLE_COMMAND_SLIDE_HEALTHBAR_IN; - healthbar.level = battleCtx->battleMons[battler].level; - healthbar.curHP = battleCtx->battleMons[battler].curHP; - healthbar.maxHP = battleCtx->battleMons[battler].maxHP; - healthbar.selectedPartySlot = battleCtx->selectedPartySlot[battler]; - healthbar.status = Battler_StatusCondition(battleCtx, battler); + healthboxData.command = BATTLE_COMMAND_SLIDE_HEALTHBOX_IN; + healthboxData.level = battleCtx->battleMons[battler].level; + healthboxData.curHP = battleCtx->battleMons[battler].curHP; + healthboxData.maxHP = battleCtx->battleMons[battler].maxHP; + healthboxData.selectedPartySlot = battleCtx->selectedPartySlot[battler]; + healthboxData.status = Battler_StatusCondition(battleCtx, battler); if ((battleCtx->battleMons[battler].species == SPECIES_NIDORAN_F || battleCtx->battleMons[battler].species == SPECIES_NIDORAN_M) && battleCtx->battleMons[battler].hasNickname == FALSE) { - healthbar.gender = GENDER_NONE; // don't show the Gender marker for base-Nidoran forms + healthboxData.gender = GENDER_NONE; // don't show the Gender marker for base-Nidoran forms } else { - healthbar.gender = battleCtx->battleMons[battler].gender; + healthboxData.gender = battleCtx->battleMons[battler].gender; } - healthbar.expFromLastLevel = battleCtx->battleMons[battler].exp - Pokemon_GetSpeciesBaseExpAt(species, level); - healthbar.expToNextLevel = Pokemon_GetSpeciesBaseExpAt(species, level + 1) - Pokemon_GetSpeciesBaseExpAt(species, level); - healthbar.speciesCaught = BattleSystem_HasCaughtSpecies(battleSys, battleCtx->battleMons[battler].species); - healthbar.numSafariBalls = BattleSystem_GetNumSafariBalls(battleSys); - healthbar.delay = delay; + healthboxData.expFromLastLevel = battleCtx->battleMons[battler].exp - Pokemon_GetSpeciesBaseExpAt(species, level); + healthboxData.expToNextLevel = Pokemon_GetSpeciesBaseExpAt(species, level + 1) - Pokemon_GetSpeciesBaseExpAt(species, level); + healthboxData.speciesCaught = BattleSystem_HasCaughtSpecies(battleSys, battleCtx->battleMons[battler].species); + healthboxData.numSafariBalls = BattleSystem_GetNumSafariBalls(battleSys); + healthboxData.delay = delay; - SendMessage(battleSys, COMM_RECIPIENT_CLIENT, battler, &healthbar, sizeof(HealthbarData)); + SendMessage(battleSys, COMM_RECIPIENT_CLIENT, battler, &healthboxData, sizeof(HealthBoxData)); } /** - * @brief Emits a message to slide the healthbar out for a given battler + * @brief Emits a message to slide the healthbox out for a given battler * * @param battleSys * @param battler */ -void BattleController_EmitSlideHealthbarOut(BattleSystem *battleSys, int battler) +void BattleController_EmitSlideHealthBoxOut(BattleSystem *battleSys, int battler) { - int command = BATTLE_COMMAND_SLIDE_HEALTHBAR_OUT; + int command = BATTLE_COMMAND_SLIDE_HEALTHBOX_OUT; SendMessage(battleSys, COMM_RECIPIENT_CLIENT, battler, &command, sizeof(int)); } @@ -1232,7 +1232,7 @@ void BattleController_EmitToggleVanish(BattleSystem *battleSys, int battler, int } /** - * @brief Emits a message to set the status icon on the battler's Healthbar + * @brief Emits a message to set the status icon on the battler's HealthBox * * @param battleSys * @param battler diff --git a/src/battle/battle_display.c b/src/battle/battle_display.c index 0f1e421307..88e0d35f45 100644 --- a/src/battle/battle_display.c +++ b/src/battle/battle_display.c @@ -30,7 +30,7 @@ #include "battle/battle_message.h" #include "battle/battle_system.h" #include "battle/common.h" -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/message_defs.h" #include "battle/move_display_info.h" #include "battle/ov16_02264798.h" @@ -117,8 +117,8 @@ static void Task_SetTrainerEncounter(SysTask *task, void *data); static void Task_ThrowTrainerBall(SysTask *task, void *data); static void Task_SlideTrainerIn(SysTask *task, void *data); static void Task_SlideTrainerOut(SysTask *task, void *data); -static void Task_SlideHealthbarIn(SysTask *task, void *data); -static void Task_SlideHealthbarOut(SysTask *task, void *data); +static void Task_SlideHealthBoxIn(SysTask *task, void *data); +static void Task_SlideHealthBoxOut(SysTask *task, void *data); static void Task_PlayerSetCommandSelection(SysTask *task, void *data); static void Task_TrainerSetCommandSelection(SysTask *task, void *data); static void Task_LinkSetCommandSelection(SysTask *task, void *data); @@ -665,51 +665,51 @@ void BattleDisplay_InitTaskSlideTrainerIn(BattleSystem *battleSys, BattlerData * SysTask_Start(Task_SlideTrainerIn, slideTrainerInData, 0); } -void BattleDisplay_InitTaskSlideHealthbarIn(BattleSystem *battleSys, BattlerData *battlerData, HealthbarData *healthbarData) +void BattleDisplay_InitTaskSlideHealthBoxIn(BattleSystem *battleSys, BattlerData *battlerData, HealthBoxData *healthboxData) { - Healthbar *healthbar = &battlerData->healthbar; - MI_CpuClearFast(&healthbar->state, sizeof(u8)); + HealthBox *healthbox = &battlerData->healthbox; + MI_CpuClearFast(&healthbox->state, sizeof(u8)); - healthbar->battleSys = battleSys; - healthbar->battler = battlerData->battler; - healthbar->type = Healthbar_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); - healthbar->command = healthbarData->command; - healthbar->curHP = healthbarData->curHP; - healthbar->maxHP = healthbarData->maxHP; - healthbar->level = healthbarData->level; - healthbar->gender = healthbarData->gender; - healthbar->damage = 0; - healthbar->curExp = healthbarData->expFromLastLevel; - healthbar->maxExp = healthbarData->expToNextLevel; - healthbar->selectedPartySlot = healthbarData->selectedPartySlot; - healthbar->status = healthbarData->status; - healthbar->caughtSpecies = healthbarData->speciesCaught; - healthbar->delay = healthbarData->delay; - healthbar->numSafariBalls = healthbarData->numSafariBalls; + healthbox->battleSys = battleSys; + healthbox->battler = battlerData->battler; + healthbox->type = HealthBox_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); + healthbox->command = healthboxData->command; + healthbox->curHP = healthboxData->curHP; + healthbox->maxHP = healthboxData->maxHP; + healthbox->level = healthboxData->level; + healthbox->gender = healthboxData->gender; + healthbox->damage = 0; + healthbox->curExp = healthboxData->expFromLastLevel; + healthbox->maxExp = healthboxData->expToNextLevel; + healthbox->selectedPartySlot = healthboxData->selectedPartySlot; + healthbox->status = healthboxData->status; + healthbox->caughtSpecies = healthboxData->speciesCaught; + healthbox->delay = healthboxData->delay; + healthbox->numSafariBalls = healthboxData->numSafariBalls; - Healthbar_Enable(healthbar, FALSE); - Healthbar_DrawInfo(healthbar, healthbar->curHP, HEALTHBAR_INFO_ALL); + HealthBox_Enable(healthbox, FALSE); + HealthBox_DrawInfo(healthbox, healthbox->curHP, HEALTHBOX_INFO_ALL); - healthbar->task_10 = SysTask_Start(Task_SlideHealthbarIn, healthbar, 1000); + healthbox->task_10 = SysTask_Start(Task_SlideHealthBoxIn, healthbox, 1000); } -void BattleDisplay_InitTaskSlideHealthbarOut(BattleSystem *battleSys, BattlerData *battlerData) +void BattleDisplay_InitTaskSlideHealthBoxOut(BattleSystem *battleSys, BattlerData *battlerData) { - Healthbar *healthbar = &battlerData->healthbar; - MI_CpuClearFast(&healthbar->state, sizeof(u8)); + HealthBox *healthbox = &battlerData->healthbox; + MI_CpuClearFast(&healthbox->state, sizeof(u8)); - healthbar->battleSys = battleSys; - healthbar->battler = battlerData->battler; - healthbar->command = battlerData->data[0]; + healthbox->battleSys = battleSys; + healthbox->battler = battlerData->battler; + healthbox->command = battlerData->data[0]; - Healthbar_Scroll(healthbar, HEALTHBAR_SCROLL_OUT); + HealthBox_Scroll(healthbox, HEALTHBOX_SCROLL_OUT); - healthbar->task_10 = SysTask_Start(Task_SlideHealthbarOut, healthbar, 1000); + healthbox->task_10 = SysTask_Start(Task_SlideHealthBoxOut, healthbox, 1000); } typedef struct CommandSetData { BattleSystem *battleSys; - void *healthbar; + void *healthbox; u8 command; u8 battler; u8 state; @@ -742,7 +742,7 @@ void BattleDisplay_InitTaskSetCommandSelection(BattleSystem *battleSys, BattlerD commandSetData->command = message->command; commandSetData->battler = battlerData->battler; commandSetData->battlerType = battlerData->battlerType; - commandSetData->healthbar = &battlerData->healthbar; + commandSetData->healthbox = &battlerData->healthbox; commandSetData->partySlot = message->partySlot; commandSetData->curHP = message->curHP; commandSetData->maxHP = message->maxHP; @@ -774,7 +774,7 @@ void BattleDisplay_InitTaskSetCommandSelection(BattleSystem *battleSys, BattlerD typedef struct MoveSelectMenuData { BattleSystem *battleSys; - void *healthbar; + void *healthbox; int input; u16 moves[MAX_BATTLERS]; u8 ppCur[MAX_BATTLERS]; @@ -797,7 +797,7 @@ void BattleDisplay_InitTaskShowMoveSelectMenu(BattleSystem *battleSys, BattlerDa moveSelectMenuData->command = battlerData->data[0]; moveSelectMenuData->battler = battlerData->battler; moveSelectMenuData->battlerType = battlerData->battlerType; - moveSelectMenuData->healthbar = &battlerData->healthbar; + moveSelectMenuData->healthbox = &battlerData->healthbox; moveSelectMenuData->partySlot = message->partySlot; for (int i = 0; i < MAX_BATTLERS; i++) { @@ -815,7 +815,7 @@ void BattleDisplay_InitTaskShowMoveSelectMenu(BattleSystem *battleSys, BattlerDa typedef struct TargetSelectMenuData { BattleSystem *battleSys; - void *healthbar; + void *healthbox; int input; u8 command; u8 battler; @@ -840,7 +840,7 @@ void BattleDisplay_InitTaskShowTargetSelectMenu(BattleSystem *battleSys, Battler targetSelectMenuData->battler = battlerData->battler; targetSelectMenuData->battlerType = battlerData->battlerType; targetSelectMenuData->range = message->range; - targetSelectMenuData->healthbar = &battlerData->healthbar; + targetSelectMenuData->healthbox = &battlerData->healthbox; targetSelectMenuData->unk_32 = message->unk_01; BattleSystem_SetBattlerTypes(battleSys, &battlerTypes[0]); @@ -949,7 +949,7 @@ void BattleDisplay_InitTaskShowPartyMenu(BattleSystem *battleSys, BattlerData *b typedef struct YesNoMenuData { BattleSystem *battleSys; - void *healthbar; + void *healthbox; int input; u8 command; u8 battler; @@ -969,7 +969,7 @@ void BattleDisplay_InitTaskShowYesNoMenu(BattleSystem *battleSys, BattlerData *b yesNoMenuData->battleSys = battleSys; yesNoMenuData->command = message->command; yesNoMenuData->battler = battlerData->battler; - yesNoMenuData->healthbar = &battlerData->healthbar; + yesNoMenuData->healthbox = &battlerData->healthbox; yesNoMenuData->promptMsg = message->promptMsg; yesNoMenuData->yesNoType = message->yesNoType; yesNoMenuData->move = message->move; @@ -1082,52 +1082,52 @@ void BattleDisplay_InitTaskFlickerBattler(BattleSystem *battleSys, BattlerData * void BattleDisplay_InitTaskUpdateHPGauge(BattleSystem *battleSys, BattlerData *battlerData, HPGaugeUpdateMessage *message) { - Healthbar *healthbar; + HealthBox *healthbox; - GF_ASSERT(battlerData->healthbar.mainSprite != NULL); + GF_ASSERT(battlerData->healthbox.mainSprite != NULL); - healthbar = &battlerData->healthbar; - MI_CpuClear8(&healthbar->state, sizeof(u8)); + healthbox = &battlerData->healthbox; + MI_CpuClear8(&healthbox->state, sizeof(u8)); - healthbar->battleSys = battleSys; - healthbar->command = message->command; - healthbar->battler = battlerData->battler; - healthbar->type = Healthbar_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); - healthbar->curHP = message->curHP; - healthbar->maxHP = message->maxHP; - healthbar->damage = message->hpCalcTemp; - healthbar->level = message->level; + healthbox->battleSys = battleSys; + healthbox->command = message->command; + healthbox->battler = battlerData->battler; + healthbox->type = HealthBox_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); + healthbox->curHP = message->curHP; + healthbox->maxHP = message->maxHP; + healthbox->damage = message->hpCalcTemp; + healthbox->level = message->level; if (message->hpCalcTemp == HP_CALC_INSTANT_ZERO) { - healthbar->curHP = 0; - healthbar->damage = 0; + healthbox->curHP = 0; + healthbox->damage = 0; } - healthbar->task_10 = SysTask_Start(Task_UpdateHPGauge, healthbar, 1000); + healthbox->task_10 = SysTask_Start(Task_UpdateHPGauge, healthbox, 1000); } void BattleDisplay_InitTaskUpdateExpGauge(BattleSystem *battleSys, BattlerData *battlerData, ExpGaugeUpdateMessage *message) { - Healthbar *healthbar; + HealthBox *healthbox; - GF_ASSERT(battlerData->healthbar.mainSprite != NULL); + GF_ASSERT(battlerData->healthbox.mainSprite != NULL); - healthbar = &battlerData->healthbar; + healthbox = &battlerData->healthbox; - MI_CpuClear8(&healthbar->state, sizeof(u8)); + MI_CpuClear8(&healthbox->state, sizeof(u8)); - healthbar->battleSys = battleSys; - healthbar->command = message->command; - healthbar->battler = battlerData->battler; - healthbar->curExp = message->curExp; - healthbar->maxExp = message->expToNextLevel; - healthbar->expReward = message->gainedExp - healthbar->curExp; + healthbox->battleSys = battleSys; + healthbox->command = message->command; + healthbox->battler = battlerData->battler; + healthbox->curExp = message->curExp; + healthbox->maxExp = message->expToNextLevel; + healthbox->expReward = message->gainedExp - healthbox->curExp; if (battlerData->battlerType == BATTLER_TYPE_SOLO_PLAYER) { - healthbar->task_10 = SysTask_Start(Task_UpdateExpGauge, healthbar, 1000); + healthbox->task_10 = SysTask_Start(Task_UpdateExpGauge, healthbox, 1000); return; } else { - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); } } @@ -1252,11 +1252,11 @@ void BattleDisplay_InitTaskToggleVanish(BattleSystem *battleSys, BattlerData *ba void BattleDisplay_SetStatusIcon(BattleSystem *battleSys, BattlerData *battlerData, SetStatusIconMessage *message) { - GF_ASSERT(battlerData->healthbar.mainSprite != NULL); + GF_ASSERT(battlerData->healthbox.mainSprite != NULL); - battlerData->healthbar.status = message->status; + battlerData->healthbox.status = message->status; - Healthbar_DrawInfo(&battlerData->healthbar, battlerData->healthbar.curHP, HEALTHBAR_INFO_STATUS); + HealthBox_DrawInfo(&battlerData->healthbox, battlerData->healthbox.curHP, HEALTHBOX_INFO_STATUS); BattleController_EmitClearCommand(battleSys, battlerData->battler, message->command); } @@ -1352,7 +1352,7 @@ void BattleDisplay_PrintLeadMonMessage(BattleSystem *battleSys, BattlerData *bat typedef struct PlayLevelUpAnimationData { BattleSystem *battleSys; - void *healthbar; + void *healthbox; u8 command; u8 battler; u8 state; @@ -1367,7 +1367,7 @@ void BattleDisplay_InitTaskPlayLevelUpAnimation(BattleSystem *battleSys, Battler playLevelUpAnimationData->command = battlerData->data[0]; playLevelUpAnimationData->battler = battlerData->battler; playLevelUpAnimationData->state = 0; - playLevelUpAnimationData->healthbar = &battlerData->healthbar; + playLevelUpAnimationData->healthbox = &battlerData->healthbox; SysTask_Start(Task_PlayLevelUpAnimation, playLevelUpAnimationData, 0); } @@ -1412,28 +1412,28 @@ void BattleDisplay_SetAlertMessage(BattleSystem *battleSys, BattlerData *battler void BattleDisplay_RefreshHPGauge(BattleSystem *battleSys, BattlerData *battlerData, RefreshHPGaugeMessage *message) { - Healthbar *healthbar = &battlerData->healthbar; + HealthBox *healthbox = &battlerData->healthbox; - MI_CpuClearFast(&healthbar->state, sizeof(u8)); + MI_CpuClearFast(&healthbox->state, sizeof(u8)); - healthbar->battleSys = battleSys; - healthbar->battler = battlerData->battler; - healthbar->type = Healthbar_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); - healthbar->command = message->command; - healthbar->curHP = message->curHP; - healthbar->maxHP = message->maxHP; - healthbar->level = message->level; - healthbar->gender = message->gender; - healthbar->damage = 0; - healthbar->curExp = message->curExp; - healthbar->maxExp = message->maxExp; - healthbar->selectedPartySlot = message->partySlot; - healthbar->status = message->status; - healthbar->caughtSpecies = message->caughtSpecies; - healthbar->numSafariBalls = message->numSafariBalls; + healthbox->battleSys = battleSys; + healthbox->battler = battlerData->battler; + healthbox->type = HealthBox_Type(battlerData->battlerType, BattleSystem_GetBattleType(battleSys)); + healthbox->command = message->command; + healthbox->curHP = message->curHP; + healthbox->maxHP = message->maxHP; + healthbox->level = message->level; + healthbox->gender = message->gender; + healthbox->damage = 0; + healthbox->curExp = message->curExp; + healthbox->maxExp = message->maxExp; + healthbox->selectedPartySlot = message->partySlot; + healthbox->status = message->status; + healthbox->caughtSpecies = message->caughtSpecies; + healthbox->numSafariBalls = message->numSafariBalls; - Healthbar_DrawInfo(healthbar, healthbar->curHP, ~HEALTHBAR_INFO_EXP_GAUGE); - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); + HealthBox_DrawInfo(healthbox, healthbox->curHP, ~HEALTHBOX_INFO_EXP_GAUGE); + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); } typedef struct ForgetMoveData { @@ -3105,75 +3105,75 @@ static void Task_SlideTrainerIn(SysTask *task, void *data) } } -enum SlideHealthbarInState { - SLIDE_HEALTHBAR_IN_STATE_ENABLE = 0, - SLIDE_HEALTHBAR_IN_STATE_WAIT, - SLIDE_HEALTHBAR_IN_STATE_DONE, +enum SlideHealthBoxInState { + SLIDE_HEALTHBOX_IN_STATE_ENABLE = 0, + SLIDE_HEALTHBOX_IN_STATE_WAIT, + SLIDE_HEALTHBOX_IN_STATE_DONE, }; /** - * @brief Slide the healthbar in, then wait until it is done. + * @brief Slide the healthbox in, then wait until it is done. * * @param task * @param data */ -static void Task_SlideHealthbarIn(SysTask *task, void *data) +static void Task_SlideHealthBoxIn(SysTask *task, void *data) { - Healthbar *healthbar = data; + HealthBox *healthbox = data; - switch (healthbar->state) { - case SLIDE_HEALTHBAR_IN_STATE_ENABLE: - if (healthbar->delay > 0) { - healthbar->delay--; + switch (healthbox->state) { + case SLIDE_HEALTHBOX_IN_STATE_ENABLE: + if (healthbox->delay > 0) { + healthbox->delay--; break; } - Healthbar_Scroll(healthbar, HEALTHBAR_SCROLL_IN); - Healthbar_Enable(healthbar, TRUE); - healthbar->state++; + HealthBox_Scroll(healthbox, HEALTHBOX_SCROLL_IN); + HealthBox_Enable(healthbox, TRUE); + healthbox->state++; break; - case SLIDE_HEALTHBAR_IN_STATE_WAIT: - if (healthbar->doneScrolling == TRUE) { - healthbar->state++; + case SLIDE_HEALTHBOX_IN_STATE_WAIT: + if (healthbox->doneScrolling == TRUE) { + healthbox->state++; } break; default: - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); - healthbar->task_10 = NULL; + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); + healthbox->task_10 = NULL; SysTask_Done(task); break; } } -enum SlideHealthbarOutState { - SLIDE_HEALTHBAR_OUT_STATE_WAIT = 0, - SLIDE_HEALTHBAR_OUT_STATE_DONE, +enum SlideHealthBoxOutState { + SLIDE_HEALTHBOX_OUT_STATE_WAIT = 0, + SLIDE_HEALTHBOX_OUT_STATE_DONE, }; /** - * @brief Wait until the healthbar has slid out. + * @brief Wait until the healthbox has slid out. * * @param task * @param data */ -static void Task_SlideHealthbarOut(SysTask *task, void *data) +static void Task_SlideHealthBoxOut(SysTask *task, void *data) { - Healthbar *healthbar = data; + HealthBox *healthbox = data; - switch (healthbar->state) { - case SLIDE_HEALTHBAR_OUT_STATE_WAIT: - if (healthbar->doneScrolling == TRUE) { - healthbar->state++; + switch (healthbox->state) { + case SLIDE_HEALTHBOX_OUT_STATE_WAIT: + if (healthbox->doneScrolling == TRUE) { + healthbox->state++; } break; default: - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); - healthbar->task_10 = NULL; + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); + healthbox->task_10 = NULL; SysTask_Done(task); - Healthbar_Enable(healthbar, FALSE); + HealthBox_Enable(healthbox, FALSE); break; } } @@ -3186,12 +3186,12 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) BattlerData *battlerData = BattleSystem_GetBattlerData(commandSetData->battleSys, commandSetData->battler); u32 battleType = BattleSystem_GetBattleType(commandSetData->battleSys); int partner = BattleSystem_GetPartner(commandSetData->battleSys, commandSetData->battler); - Healthbar *healthbar; + HealthBox *healthbox; if (partner != commandSetData->battler) { - healthbar = BattleSystem_GetHealthbar(commandSetData->battleSys, partner); + healthbox = BattleSystem_GetHealthBox(commandSetData->battleSys, partner); } else { - healthbar = NULL; + healthbox = NULL; } switch (commandSetData->state) { @@ -3253,7 +3253,7 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) } break; case 3: - ov16_0226757C(commandSetData->healthbar); + ov16_0226757C(commandSetData->healthbox); ov16_02264798(battlerData, commandSetData->battleSys); commandSetData->state = 4; case 4: @@ -3312,8 +3312,8 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) NARC_dtor(bgNarc); NARC_dtor(objNarc); - if (healthbar != NULL) { - ov16_02268468(healthbar); + if (healthbox != NULL) { + ov16_02268468(healthbox); } commandSetData->state = 5; @@ -3324,7 +3324,7 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) for (int i = 0; i < BattleSystem_GetMaxBattlers(commandSetData->battleSys); i++) { battlerData = BattleSystem_GetBattlerData(commandSetData->battleSys, i); - ov16_0226737C(&battlerData->healthbar); + ov16_0226737C(&battlerData->healthbox); } } @@ -3350,8 +3350,8 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) ov16_02268C04(bgNarc, objNarc, v2, 0, 0, NULL); ov16_0226BCCC(v2, 0); - ov16_0226846C(healthbar); - ov16_022675AC(commandSetData->healthbar); + ov16_0226846C(healthbox); + ov16_022675AC(commandSetData->healthbox); ov16_022647D8(battlerData); NARC_dtor(bgNarc); NARC_dtor(objNarc); @@ -3362,8 +3362,8 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) ov16_02268C04(bgNarc, objNarc, v2, 0, 0, NULL); ov16_0226BCCC(v2, 0); - ov16_0226846C(healthbar); - ov16_022675AC(commandSetData->healthbar); + ov16_0226846C(healthbox); + ov16_022675AC(commandSetData->healthbox); ov16_022647D8(battlerData); NARC_dtor(bgNarc); NARC_dtor(objNarc); @@ -3373,7 +3373,7 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) NARC *objNarc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_BATTLE); if (ov16_0226D088(v2) == 1) { - ov16_0226846C(healthbar); + ov16_0226846C(healthbox); commandSetData->input = 0xFF; } @@ -3397,8 +3397,8 @@ static void Task_PlayerSetCommandSelection(SysTask *task, void *data) ov16_02268C04(bgNarc, objNarc, v2, 0, 0, NULL); ov16_0226BCCC(v2, 0); - ov16_0226846C(healthbar); - ov16_022675AC(commandSetData->healthbar); + ov16_0226846C(healthbox); + ov16_022675AC(commandSetData->healthbox); ov16_022647D8(battlerData); ov16_02269218(v2); @@ -3511,16 +3511,16 @@ static void Task_PlayerShowMoveSelectMenu(SysTask *task, void *data) { MoveSelectMenuData *moveSelectMenuData = data; BgConfig *bgConfig = BattleSystem_GetBgConfig(moveSelectMenuData->battleSys); - Healthbar *healthbar; + HealthBox *healthbox; UnkStruct_ov16_02268A14 *v2 = ov16_0223E02C(moveSelectMenuData->battleSys); BattlerData *battlerData = BattleSystem_GetBattlerData(moveSelectMenuData->battleSys, moveSelectMenuData->battler); int partner = BattleSystem_GetPartner(moveSelectMenuData->battleSys, moveSelectMenuData->battler); if (partner != moveSelectMenuData->battler) { - healthbar = BattleSystem_GetHealthbar(moveSelectMenuData->battleSys, partner); + healthbox = BattleSystem_GetHealthBox(moveSelectMenuData->battleSys, partner); } else { - healthbar = NULL; + healthbox = NULL; } switch (moveSelectMenuData->state) { @@ -3569,8 +3569,8 @@ static void Task_PlayerShowMoveSelectMenu(SysTask *task, void *data) if (moveSelectMenuData->input != 0xFF) { if ((BattleSystem_GetBattleType(moveSelectMenuData->battleSys) & BATTLE_TYPE_DOUBLES) == FALSE) { ov16_0226BCCC(v2, 0); - ov16_0226846C(healthbar); - ov16_022675AC(moveSelectMenuData->healthbar); + ov16_0226846C(healthbox); + ov16_022675AC(moveSelectMenuData->healthbox); ov16_022647D8(battlerData); } } @@ -3673,15 +3673,15 @@ static void Task_PlayerShowTargetSelectMenu(SysTask *task, void *data) { TargetSelectMenuData *targetSelectMenuData = data; BgConfig *bgConfig = BattleSystem_GetBgConfig(targetSelectMenuData->battleSys); - Healthbar *healthbar; + HealthBox *healthbox; BattlerData *battlerData = BattleSystem_GetBattlerData(targetSelectMenuData->battleSys, targetSelectMenuData->battler); UnkStruct_ov16_02268A14 *v2 = ov16_0223E02C(targetSelectMenuData->battleSys); int partner = BattleSystem_GetPartner(targetSelectMenuData->battleSys, targetSelectMenuData->battler); if (partner != targetSelectMenuData->battler) { - healthbar = BattleSystem_GetHealthbar(targetSelectMenuData->battleSys, partner); + healthbox = BattleSystem_GetHealthBox(targetSelectMenuData->battleSys, partner); } else { - healthbar = NULL; + healthbox = NULL; } switch (targetSelectMenuData->state) { @@ -3717,9 +3717,9 @@ static void Task_PlayerShowTargetSelectMenu(SysTask *task, void *data) break; case 2: if (targetSelectMenuData->input != 0xFF) { - ov16_022675AC(targetSelectMenuData->healthbar); + ov16_022675AC(targetSelectMenuData->healthbox); ov16_022647D8(battlerData); - ov16_0226846C(healthbar); + ov16_0226846C(healthbox); if (targetSelectMenuData->unk_32 == 1) { ov16_0226BCCC(v2, 0); @@ -4164,29 +4164,29 @@ static void Task_PlayerShowBagMenu(SysTask *task, void *data) int battler = bagMenuData->partyMenuData->battlePartyCtx->selectedPartyIndex * 2; int slots = bagMenuData->partyMenuData->battlePartyCtx->pokemonPartySlots[bagMenuData->partyMenuData->battlePartyCtx->selectedPartyIndex]; - Healthbar *healthbar = BattleSystem_GetHealthbar(bagMenuData->battleSys, battler); - MI_CpuClear8(&healthbar->state, sizeof(u8)); - healthbar->type = Healthbar_Type(BattleSystem_GetBattlerType(bagMenuData->battleSys, battler), BattleSystem_GetBattleType(bagMenuData->battleSys)); + HealthBox *healthbox = BattleSystem_GetHealthBox(bagMenuData->battleSys, battler); + MI_CpuClear8(&healthbox->state, sizeof(u8)); + healthbox->type = HealthBox_Type(BattleSystem_GetBattlerType(bagMenuData->battleSys, battler), BattleSystem_GetBattleType(bagMenuData->battleSys)); Pokemon *mon = BattleSystem_GetPartyPokemon(bagMenuData->battleSys, battler, slots); - healthbar->curHP = Pokemon_GetValue(mon, MON_DATA_HP, NULL) - bagMenuData->partyMenuData->battlePartyCtx->currentDamage; - healthbar->maxHP = Pokemon_GetValue(mon, MON_DATA_MAX_HP, NULL); - healthbar->damage = bagMenuData->partyMenuData->battlePartyCtx->currentDamage; + healthbox->curHP = Pokemon_GetValue(mon, MON_DATA_HP, NULL) - bagMenuData->partyMenuData->battlePartyCtx->currentDamage; + healthbox->maxHP = Pokemon_GetValue(mon, MON_DATA_MAX_HP, NULL); + healthbox->damage = bagMenuData->partyMenuData->battlePartyCtx->currentDamage; if (Pokemon_GetValue(mon, MON_DATA_STATUS, NULL) == 0) { - healthbar->status = 0; + healthbox->status = 0; } - Healthbar_CalcHP(healthbar, healthbar->damage); + HealthBox_CalcHP(healthbox, healthbox->damage); } bagMenuData->state++; break; case 22: { int battler = bagMenuData->partyMenuData->battlePartyCtx->selectedPartyIndex * 2; - Healthbar *healthbar = BattleSystem_GetHealthbar(bagMenuData->battleSys, battler); + HealthBox *healthbox = BattleSystem_GetHealthBox(bagMenuData->battleSys, battler); - if (ov16_022674F8(healthbar) == -1) { - Healthbar_DrawInfo(healthbar, NULL, HEALTHBAR_INFO_STATUS); + if (ov16_022674F8(healthbox) == -1) { + HealthBox_DrawInfo(healthbox, NULL, HEALTHBOX_INFO_STATUS); bagMenuData->state++; } } break; @@ -4218,15 +4218,15 @@ static void Task_PlayerShowBagMenu(SysTask *task, void *data) int effect = 0; int battler = bagMenuData->partyMenuData->battlePartyCtx->selectedPartyIndex * 2; - Healthbar *healthbar = BattleSystem_GetHealthbar(bagMenuData->battleSys, battler); + HealthBox *healthbox = BattleSystem_GetHealthBox(bagMenuData->battleSys, battler); int slot = bagMenuData->partyMenuData->battlePartyCtx->pokemonPartySlots[bagMenuData->partyMenuData->battlePartyCtx->selectedPartyIndex]; Pokemon *mon = BattleSystem_GetPartyPokemon(bagMenuData->battleSys, battler, slot); if (Pokemon_GetValue(mon, MON_DATA_STATUS, NULL) == 0) { - healthbar->status = 0; + healthbox->status = 0; } - Healthbar_DrawInfo(healthbar, healthbar->curHP, HEALTHBAR_INFO_STATUS); + HealthBox_DrawInfo(healthbox, healthbox->curHP, HEALTHBOX_INFO_STATUS); battleMsg.tags = TAG_NICKNAME; battleMsg.params[0] = battler | (bagMenuData->partyMenuData->partySlots[battler] << 8); @@ -4636,14 +4636,14 @@ static void Task_PlayerShowYesNoMenu(SysTask *task, void *data) BgConfig *bgConfig = BattleSystem_GetBgConfig(yesNoMenuData->battleSys); UnkStruct_ov16_02268A14 *v2 = ov16_0223E02C(yesNoMenuData->battleSys); int partner; - Healthbar *healthbar; + HealthBox *healthbox; BattlerData *battlerData = BattleSystem_GetBattlerData(yesNoMenuData->battleSys, yesNoMenuData->battler); partner = BattleSystem_GetPartner(yesNoMenuData->battleSys, yesNoMenuData->battler); if (partner != yesNoMenuData->battler) { - healthbar = BattleSystem_GetHealthbar(yesNoMenuData->battleSys, partner); + healthbox = BattleSystem_GetHealthBox(yesNoMenuData->battleSys, partner); } else { - healthbar = NULL; + healthbox = NULL; } switch (yesNoMenuData->state) { @@ -4720,9 +4720,9 @@ static void Task_PlayerShowYesNoMenu(SysTask *task, void *data) NARC *bgNarc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_BG, HEAP_ID_BATTLE); NARC *objNarc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_BATTLE); - ov16_022675AC(yesNoMenuData->healthbar); + ov16_022675AC(yesNoMenuData->healthbox); ov16_022647D8(battlerData); - ov16_0226846C(healthbar); + ov16_0226846C(healthbox); ov16_02269218(v2); ov16_02268C04(bgNarc, objNarc, v2, 0, 0, NULL); @@ -4909,23 +4909,23 @@ static void Task_FlickerBattler(SysTask *task, void *data) static void Task_UpdateHPGauge(SysTask *task, void *data) { - Healthbar *healthbar = data; + HealthBox *healthbox = data; int result; - switch (healthbar->state) { + switch (healthbox->state) { case 0: - Healthbar_CalcHP(healthbar, healthbar->damage); - healthbar->state++; + HealthBox_CalcHP(healthbox, healthbox->damage); + healthbox->state++; case 1: - result = ov16_022674F8(healthbar); + result = ov16_022674F8(healthbox); if (result == -1) { - healthbar->state++; + healthbox->state++; } break; default: - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); - healthbar->task_10 = NULL; + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); + healthbox->task_10 = NULL; SysTask_Done(task); return; } @@ -4933,42 +4933,42 @@ static void Task_UpdateHPGauge(SysTask *task, void *data) static void Task_UpdateExpGauge(SysTask *task, void *data) { - Healthbar *healthbar = data; + HealthBox *healthbox = data; int result; - switch (healthbar->state) { + switch (healthbox->state) { case 0: - healthbar->unk_4E = 0; + healthbox->unk_4E = 0; Sound_PlayEffect(SEQ_SE_DP_EXP); - Healthbar_CalcExp(healthbar, healthbar->expReward); - healthbar->state++; + HealthBox_CalcExp(healthbox, healthbox->expReward); + healthbox->state++; case 1: - if (healthbar->unk_4E < 8) { - healthbar->unk_4E++; + if (healthbox->unk_4E < 8) { + healthbox->unk_4E++; } - result = ov16_02267560(healthbar); + result = ov16_02267560(healthbox); if (result == -1) { - if (healthbar->unk_4E >= 8) { + if (healthbox->unk_4E >= 8) { Sound_StopEffect(SEQ_SE_DP_EXP, 0); - healthbar->state = 100; + healthbox->state = 100; } else { - healthbar->state++; + healthbox->state++; } } break; case 2: - healthbar->unk_4E++; + healthbox->unk_4E++; - if (healthbar->unk_4E >= 8) { + if (healthbox->unk_4E >= 8) { Sound_StopEffect(SEQ_SE_DP_EXP, 0); - healthbar->state = 100; + healthbox->state = 100; } break; default: - BattleController_EmitClearCommand(healthbar->battleSys, healthbar->battler, healthbar->command); - healthbar->task_10 = NULL; + BattleController_EmitClearCommand(healthbox->battleSys, healthbox->battler, healthbox->command); + healthbox->task_10 = NULL; SysTask_Done(task); break; } @@ -5190,7 +5190,7 @@ static void Task_PlayLevelUpAnimation(SysTask *task, void *data) switch (playLevelUpAnimationData->state) { case 0: - ov16_0226834C(playLevelUpAnimationData->healthbar, &playLevelUpAnimationData->unk_0B); + ov16_0226834C(playLevelUpAnimationData->healthbox, &playLevelUpAnimationData->unk_0B); Sound_PlayEffect(SEQ_SE_DP_EXPMAX); playLevelUpAnimationData->state++; break; @@ -5856,9 +5856,9 @@ PokemonSprite *BattlerData_GetPokemonSprite(BattlerData *battlerData) } } -Healthbar *BattlerData_GetHealthbar(BattlerData *battlerData) +HealthBox *BattlerData_GetHealthBox(BattlerData *battlerData) { - return &battlerData->healthbar; + return &battlerData->healthbox; } UnkStruct_ov16_0226C378 *ov16_02263B0C(BattlerData *battlerData) diff --git a/src/battle/battle_io_command.c b/src/battle/battle_io_command.c index 19af4a8d76..2aa88ebf30 100644 --- a/src/battle/battle_io_command.c +++ b/src/battle/battle_io_command.c @@ -16,7 +16,7 @@ #include "battle/battle_message.h" #include "battle/battle_system.h" #include "battle/common.h" -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/message_defs.h" #include "battle/ov16_02264798.h" #include "battle/party_gauge.h" @@ -54,8 +54,8 @@ static void BtlIOCmd_SetTrainerEncounter(BattleSystem *battleSys, BattlerData *b static void BtlIOCmd_ThrowTrainerBall(BattleSystem *battleSys, BattlerData *battlerData); static void BtlIOCmd_SlideTrainerOut(BattleSystem *battleSys, BattlerData *battlerData); static void BtlIOCmd_SlideTrainerIn(BattleSystem *battleSys, BattlerData *battlerData); -static void BtlIOCmd_SlideHealthbarIn(BattleSystem *battleSys, BattlerData *battlerData); -static void BtlIOCmd_SlideHealthbarOut(BattleSystem *battleSys, BattlerData *battlerData); +static void BtlIOCmd_SlideHealthBoxIn(BattleSystem *battleSys, BattlerData *battlerData); +static void BtlIOCmd_SlideHealthBoxOut(BattleSystem *battleSys, BattlerData *battlerData); static void BtlIOCmd_SetCommandSelection(BattleSystem *battleSys, BattlerData *battlerData); static void BtlIOCmd_ShowMoveSelectMenu(BattleSystem *battleSys, BattlerData *battlerData); static void BtlIOCmd_ShowTargetSelectMenu(BattleSystem *battleSys, BattlerData *battlerData); @@ -170,8 +170,8 @@ static const BattleCommandPtr sBattleCommands[] = { [BATTLE_COMMAND_THROW_TRAINER_BALL] = BtlIOCmd_ThrowTrainerBall, [BATTLE_COMMAND_SLIDE_TRAINER_OUT] = BtlIOCmd_SlideTrainerOut, [BATTLE_COMMAND_SLIDE_TRAINER_IN] = BtlIOCmd_SlideTrainerIn, - [BATTLE_COMMAND_SLIDE_HEALTHBAR_IN] = BtlIOCmd_SlideHealthbarIn, - [BATTLE_COMMAND_SLIDE_HEALTHBAR_OUT] = BtlIOCmd_SlideHealthbarOut, + [BATTLE_COMMAND_SLIDE_HEALTHBOX_IN] = BtlIOCmd_SlideHealthBoxIn, + [BATTLE_COMMAND_SLIDE_HEALTHBOX_OUT] = BtlIOCmd_SlideHealthBoxOut, [BATTLE_COMMAND_SET_COMMAND_SELECTION] = BtlIOCmd_SetCommandSelection, [BATTLE_COMMAND_SHOW_MOVE_SELECT_MENU] = BtlIOCmd_ShowMoveSelectMenu, [BATTLE_COMMAND_SHOW_TARGET_SELECT_MENU] = BtlIOCmd_ShowTargetSelectMenu, @@ -238,7 +238,7 @@ void BattleSystem_ExecuteBattlerCommand(BattleSystem *battleSys, BattlerData *ba void ov16_0225C104(BattleSystem *battleSys, BattlerData *battlerData, int param2) { if (param2 != 2) { - ov16_02267360(&battlerData->healthbar); + ov16_02267360(&battlerData->healthbox); } if (battlerData->managedSprite) { @@ -344,28 +344,28 @@ static void BtlIOCmd_SlideTrainerIn(BattleSystem *battleSys, BattlerData *battle } /** - * @brief Slide a healthbar in on the screen. + * @brief Slide a healthbox in on the screen. * * @param battleSys * @param battlerData */ -static void BtlIOCmd_SlideHealthbarIn(BattleSystem *battleSys, BattlerData *battlerData) +static void BtlIOCmd_SlideHealthBoxIn(BattleSystem *battleSys, BattlerData *battlerData) { - HealthbarData *healthbar = (HealthbarData *)&battlerData->data[0]; + HealthBoxData *healthboxData = (HealthBoxData *)&battlerData->data[0]; - BattleDisplay_InitTaskSlideHealthbarIn(battleSys, battlerData, healthbar); + BattleDisplay_InitTaskSlideHealthBoxIn(battleSys, battlerData, healthboxData); ZeroDataBuffer(battlerData); } /** - * @brief Slide a healthbar out of the screen. + * @brief Slide a healthbox out of the screen. * * @param battleSys * @param battlerData */ -static void BtlIOCmd_SlideHealthbarOut(BattleSystem *battleSys, BattlerData *battlerData) +static void BtlIOCmd_SlideHealthBoxOut(BattleSystem *battleSys, BattlerData *battlerData) { - BattleDisplay_InitTaskSlideHealthbarOut(battleSys, battlerData); + BattleDisplay_InitTaskSlideHealthBoxOut(battleSys, battlerData); ZeroDataBuffer(battlerData); } @@ -626,7 +626,7 @@ static void ov16_0225C558(BattleSystem *battleSys, BattlerData *battlerData) static void BtlIOCmd_StopGaugeAnimation(BattleSystem *battleSys, BattlerData *battlerData) { - ov16_022675AC(&battlerData->healthbar); + ov16_022675AC(&battlerData->healthbox); ov16_022647D8(battlerData); BattleController_EmitClearCommand(battleSys, battlerData->battler, battlerData->data[0]); ZeroDataBuffer(battlerData); @@ -721,7 +721,7 @@ static void BtlIOCmd_ClearTouchScreen(BattleSystem *battleSys, BattlerData *batt if (battlerData->bootState == BATTLER_BOOT_STATE_NORMAL) { UnkStruct_ov16_02268A14 *v0; int partner; - Healthbar *healthbar; + HealthBox *healthbox; NARC *v3 = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_BG, HEAP_ID_BATTLE); NARC *v4 = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_BATTLE); v0 = ov16_0223E02C(battleSys); @@ -735,11 +735,11 @@ static void BtlIOCmd_ClearTouchScreen(BattleSystem *battleSys, BattlerData *batt partner = BattleSystem_GetPartner(battleSys, battlerData->battler); if (partner != battlerData->battler) { - healthbar = BattleSystem_GetHealthbar(battleSys, partner); - ov16_0226846C(healthbar); + healthbox = BattleSystem_GetHealthBox(battleSys, partner); + ov16_0226846C(healthbox); } - ov16_022675AC(&battlerData->healthbar); + ov16_022675AC(&battlerData->healthbox); ov16_02269218(v0); ov16_022647D8(battlerData); } diff --git a/src/battle/battle_main.c b/src/battle/battle_main.c index b0786aec69..b9f1dccb10 100644 --- a/src/battle/battle_main.c +++ b/src/battle/battle_main.c @@ -25,7 +25,7 @@ #include "battle/battle_lib.h" #include "battle/battle_system.h" #include "battle/common.h" -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/ov16_02268520.h" #include "battle/ov16_0226E148.h" #include "battle_anim/battle_anim_system.h" @@ -1529,7 +1529,7 @@ static void SysTask_UpdateRedHPSound(SysTask *task, void *inBattleSys) { BattleSystem *battleSys = inBattleSys; BattlerData *battlerData; - Healthbar *healthbar; + HealthBox *healthbox; int maxBattlers = BattleSystem_GetMaxBattlers(battleSys); int flags = 0; @@ -1553,10 +1553,10 @@ static void SysTask_UpdateRedHPSound(SysTask *task, void *inBattleSys) if ((BattlerData_GetBootState(battlerData) == BATTLER_BOOT_STATE_NORMAL && (BattleSystem_GetBattleStatusMask(battleSys) & BATTLE_STATUS_RECORDING) == FALSE) || (BattleSystem_GetBattlerSide(battleSys, i) == BATTLER_US && BattleSystem_GetBattleStatusMask(battleSys) & BATTLE_STATUS_RECORDING)) { - healthbar = BattlerData_GetHealthbar(battlerData); + healthbox = BattlerData_GetHealthBox(battlerData); - if (healthbar != NULL) { - if (HealthBar_Color(healthbar->curHP, healthbar->maxHP, 8 * 6) == BARCOLOR_RED) { + if (healthbox != NULL) { + if (HealthBar_Color(healthbox->curHP, healthbox->maxHP, 8 * 6) == BARCOLOR_RED) { flags |= FlagIndex(i); } } diff --git a/src/battle/battle_script.c b/src/battle/battle_script.c index 60f02a368f..9482804a21 100644 --- a/src/battle/battle_script.c +++ b/src/battle/battle_script.c @@ -96,9 +96,9 @@ static BOOL BtlCmd_ThrowPokeball(BattleSystem *battleSys, BattleContext *battleC static BOOL BtlCmd_TrainerSlideOut(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_TrainerSlideIn(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_BackgroundSlideIn(BattleSystem *battleSys, BattleContext *battleCtx); -static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *battleCtx); -static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext *battleCtx); -static BOOL BtlCmd_HealthbarSlideOut(BattleSystem *battleSys, BattleContext *battleCtx); +static BOOL BtlCmd_HealthBoxSlideIn(BattleSystem *battleSys, BattleContext *battleCtx); +static BOOL BtlCmd_HealthBoxSlideInDelay(BattleSystem *battleSys, BattleContext *battleCtx); +static BOOL BtlCmd_HealthBoxSlideOut(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_Wait(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_CalcDamage(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_CalcMaxDamage(BattleSystem *battleSys, BattleContext *battleCtx); @@ -151,7 +151,7 @@ static BOOL BtlCmd_SetMirrorMove(BattleSystem *battleSys, BattleContext *battleC static BOOL BtlCmd_ResetAllStatChanges(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_LockMoveChoice(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_UnlockMoveChoice(BattleSystem *battleSys, BattleContext *battleCtx); -static BOOL BtlCmd_SetHealthbarStatus(BattleSystem *battleSys, BattleContext *battleCtx); +static BOOL BtlCmd_SetHealthBoxStatusIcon(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_PrintTrainerMessage(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_PayPrizeMoney(BattleSystem *battleSys, BattleContext *battleCtx); static BOOL BtlCmd_PlayBattleAnimation(BattleSystem *battleSys, BattleContext *battleCtx); @@ -1118,7 +1118,7 @@ static BOOL BtlCmd_BackgroundSlideIn(BattleSystem *battleSys, BattleContext *bat * @param battleCtx * @return FALSE */ -static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *battleCtx) +static BOOL BtlCmd_HealthBoxSlideIn(BattleSystem *battleSys, BattleContext *battleCtx) { int i; int maxBattlers = BattleSystem_GetMaxBattlers(battleSys); @@ -1131,7 +1131,7 @@ static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *batt switch (battlerIn) { case BTLSCR_ALL_BATTLERS: for (i = 0; i < maxBattlers; i++) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, 0); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, 0); } break; @@ -1140,7 +1140,7 @@ static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *batt battlerData = BattleSystem_GetBattlerData(battleSys, i); if ((battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) == FALSE) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, 0); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, 0); } } break; @@ -1150,14 +1150,14 @@ static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *batt battlerData = BattleSystem_GetBattlerData(battleSys, i); if (battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, 0); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, 0); } } break; default: i = BattleScript_Battler(battleSys, battleCtx, battlerIn); - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, 0); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, 0); break; } @@ -1175,7 +1175,7 @@ static BOOL BtlCmd_HealthbarSlideIn(BattleSystem *battleSys, BattleContext *batt * @param battleCtx * @return FALSE */ -static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext *battleCtx) +static BOOL BtlCmd_HealthBoxSlideInDelay(BattleSystem *battleSys, BattleContext *battleCtx) { int i; int maxBattlers = BattleSystem_GetMaxBattlers(battleSys); @@ -1189,7 +1189,7 @@ static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext switch (battlerIn) { case BTLSCR_ALL_BATTLERS: for (i = 0; i < maxBattlers; i++) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, 0); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, 0); } break; @@ -1198,7 +1198,7 @@ static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext battlerData = BattleSystem_GetBattlerData(battleSys, i); if ((battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) == FALSE) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, wait); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, wait); wait += 4; } } @@ -1209,7 +1209,7 @@ static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext battlerData = BattleSystem_GetBattlerData(battleSys, i); if (battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) { - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, wait); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, wait); wait += 4; } } @@ -1217,7 +1217,7 @@ static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext default: i = BattleScript_Battler(battleSys, battleCtx, battlerIn); - BattleController_EmitSlideHealthbarIn(battleSys, battleCtx, i, wait); + BattleController_EmitSlideHealthBoxIn(battleSys, battleCtx, i, wait); break; } @@ -1234,7 +1234,7 @@ static BOOL BtlCmd_HealthbarSlideInDelay(BattleSystem *battleSys, BattleContext * @param battleCtx * @return FALSE */ -static BOOL BtlCmd_HealthbarSlideOut(BattleSystem *battleSys, BattleContext *battleCtx) +static BOOL BtlCmd_HealthBoxSlideOut(BattleSystem *battleSys, BattleContext *battleCtx) { int i; int maxBattlers = BattleSystem_GetMaxBattlers(battleSys); @@ -1247,7 +1247,7 @@ static BOOL BtlCmd_HealthbarSlideOut(BattleSystem *battleSys, BattleContext *bat switch (battlerIn) { case BTLSCR_ALL_BATTLERS: for (i = 0; i < maxBattlers; i++) { - BattleController_EmitSlideHealthbarOut(battleSys, i); + BattleController_EmitSlideHealthBoxOut(battleSys, i); } break; @@ -1257,7 +1257,7 @@ static BOOL BtlCmd_HealthbarSlideOut(BattleSystem *battleSys, BattleContext *bat if ((battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) == FALSE && (battleCtx->battlersSwitchingMask & FlagIndex(i)) == FALSE) { - BattleController_EmitSlideHealthbarOut(battleSys, i); + BattleController_EmitSlideHealthBoxOut(battleSys, i); } } break; @@ -1267,14 +1267,14 @@ static BOOL BtlCmd_HealthbarSlideOut(BattleSystem *battleSys, BattleContext *bat battlerData = BattleSystem_GetBattlerData(battleSys, i); if (battlerData->battlerType & BATTLER_TYPE_SOLO_ENEMY) { - BattleController_EmitSlideHealthbarOut(battleSys, i); + BattleController_EmitSlideHealthBoxOut(battleSys, i); } } break; default: i = BattleScript_Battler(battleSys, battleCtx, battlerIn); - BattleController_EmitSlideHealthbarOut(battleSys, i); + BattleController_EmitSlideHealthBoxOut(battleSys, i); break; } @@ -3597,17 +3597,17 @@ static BOOL BtlCmd_UnlockMoveChoice(BattleSystem *battleSys, BattleContext *batt } /** - * @brief Set the status icon on a battler's HP gauge. + * @brief Set the status icon on a battler's healthbox. * * Inputs: - * 1. The battler whose HP gauge should be updated. - * 2. The status icon to apply to the HP gauge. + * 1. The battler whose healthbox should be updated. + * 2. The status icon to apply to the healthbox. * * @param battleSys * @param battleCtx * @return BOOL */ -static BOOL BtlCmd_SetHealthbarStatus(BattleSystem *battleSys, BattleContext *battleCtx) +static BOOL BtlCmd_SetHealthBoxStatusIcon(BattleSystem *battleSys, BattleContext *battleCtx) { BattleScript_Iter(battleCtx, 1); int inBattler = BattleScript_Read(battleCtx); diff --git a/src/battle/battle_system.c b/src/battle/battle_system.c index e3ecdaa6a2..b052853de1 100644 --- a/src/battle/battle_system.c +++ b/src/battle/battle_system.c @@ -27,7 +27,7 @@ #include "battle/battle_lib.h" #include "battle/battle_message.h" #include "battle/common.h" -#include "battle/healthbar.h" +#include "battle/healthbox.h" #include "battle/ov16_02268520.h" #include "battle/ov16_0226E148.h" #include "battle/pokemon_sprite_data.h" @@ -1218,37 +1218,37 @@ void BattleSystem_SetCommandIsEndWait(BattleSystem *battleSys, u8 value) battleSys->commandIsEndWait = value; } -void *BattleSystem_GetHealthbar(BattleSystem *battleSys, int battler) +void *BattleSystem_GetHealthBox(BattleSystem *battleSys, int battler) { - return BattlerData_GetHealthbar(battleSys->battlers[battler]); + return BattlerData_GetHealthBox(battleSys->battlers[battler]); } void ov16_0223F36C(BattleSystem *battleSys) { int i; - Healthbar *healthbar; + HealthBox *healthbox; for (i = 0; i < battleSys->maxBattlers; i++) { - healthbar = BattlerData_GetHealthbar(battleSys->battlers[i]); + healthbox = BattlerData_GetHealthBox(battleSys->battlers[i]); - healthbar->battleSys = battleSys; - healthbar->type = Healthbar_Type(BattlerData_GetBattlerType(battleSys->battlers[i]), BattleSystem_GetBattleType(battleSys)); + healthbox->battleSys = battleSys; + healthbox->type = HealthBox_Type(BattlerData_GetBattlerType(battleSys->battlers[i]), BattleSystem_GetBattleType(battleSys)); - ov16_022672C4(healthbar); - Healthbar_Enable(healthbar, FALSE); + ov16_022672C4(healthbox); + HealthBox_Enable(healthbox, FALSE); } } void ov16_0223F3BC(BattleSystem *battleSys) { int i; - Healthbar *healthbar; + HealthBox *healthbox; for (i = 0; i < battleSys->maxBattlers; i++) { - healthbar = BattlerData_GetHealthbar(battleSys->battlers[i]); + healthbox = BattlerData_GetHealthBox(battleSys->battlers[i]); - if (healthbar->curHP) { - Healthbar_Enable(healthbar, TRUE); + if (healthbox->curHP) { + HealthBox_Enable(healthbox, TRUE); } } } @@ -1256,22 +1256,22 @@ void ov16_0223F3BC(BattleSystem *battleSys) void ov16_0223F3EC(BattleSystem *battleSys) { int i; - Healthbar *healthbar; + HealthBox *healthbox; for (i = 0; i < battleSys->maxBattlers; i++) { - healthbar = BattlerData_GetHealthbar(battleSys->battlers[i]); - Healthbar_Enable(healthbar, FALSE); + healthbox = BattlerData_GetHealthBox(battleSys->battlers[i]); + HealthBox_Enable(healthbox, FALSE); } } void ov16_0223F414(BattleSystem *battleSys) { int i; - Healthbar *healthbar; + HealthBox *healthbox; for (i = 0; i < battleSys->maxBattlers; i++) { - healthbar = BattlerData_GetHealthbar(battleSys->battlers[i]); - ov16_02267360(healthbar); + healthbox = BattlerData_GetHealthBox(battleSys->battlers[i]); + ov16_02267360(healthbox); } } @@ -1518,11 +1518,11 @@ void ov16_0223F8AC(BattleSystem *battleSys, PokemonSprite **monSprites) void BattleSystem_SetGaugePriority(BattleSystem *battleSys, int param1) { int battler; - Healthbar *healthbar; + HealthBox *healthbox; for (battler = 0; battler < battleSys->maxBattlers; battler++) { - healthbar = BattlerData_GetHealthbar(battleSys->battlers[battler]); - ov16_022675D8(healthbar, param1); + healthbox = BattlerData_GetHealthBox(battleSys->battlers[battler]); + ov16_022675D8(healthbox, param1); } } diff --git a/src/battle/healthbar.c b/src/battle/healthbar.c deleted file mode 100644 index 65e658ab05..0000000000 --- a/src/battle/healthbar.c +++ /dev/null @@ -1,1842 +0,0 @@ -#include "battle/healthbar.h" - -#include -#include -#include - -#include "constants/graphics.h" -#include "constants/heap.h" -#include "constants/pokemon.h" -#include "generated/string_padding_mode.h" - -#include "battle/battle_system.h" -#include "graphics/battle/sprites.naix" - -#include "assert.h" -#include "bg_window.h" -#include "font_special_chars.h" -#include "heap.h" -#include "math_util.h" -#include "message.h" -#include "narc.h" -#include "palette.h" -#include "pokemon.h" -#include "sprite.h" -#include "sprite_resource.h" -#include "sprite_system.h" -#include "string_gf.h" -#include "string_template.h" -#include "sys_task.h" -#include "sys_task_manager.h" -#include "text.h" -#include "unk_0208C098.h" - -#include "res/text/bank/battle_strings.h" - -#define HEALTHBAR_SCROLL_SPEED 24 -#define HEALTHBAR_SCROLL_OUT_OFFSET 160 - -#define HEALTHBAR_X_OFFSET_SOLO_PLAYER 192 -#define HEALTHBAR_Y_OFFSET_SOLO_PLAYER 116 -#define HEALTHBAR_X_OFFSET_SOLO_ENEMY 58 -#define HEALTHBAR_Y_OFFSET_SOLO_ENEMY 36 -#define HEALTHBAR_X_OFFSET_PLAYER_SLOT_1 HEALTHBAR_X_OFFSET_SOLO_PLAYER -#define HEALTHBAR_Y_OFFSET_PLAYER_SLOT_1 HEALTHBAR_Y_OFFSET_SOLO_PLAYER - 13 -#define HEALTHBAR_X_OFFSET_PLAYER_SLOT_2 HEALTHBAR_X_OFFSET_SOLO_PLAYER + 6 -#define HEALTHBAR_Y_OFFSET_PLAYER_SLOT_2 HEALTHBAR_Y_OFFSET_SOLO_PLAYER + 16 -#define HEALTHBAR_X_OFFSET_ENEMY_SLOT_1 HEALTHBAR_X_OFFSET_SOLO_ENEMY + 6 -#define HEALTHBAR_Y_OFFSET_ENEMY_SLOT_1 HEALTHBAR_Y_OFFSET_SOLO_ENEMY - 20 -#define HEALTHBAR_X_OFFSET_ENEMY_SLOT_2 HEALTHBAR_X_OFFSET_SOLO_ENEMY -#define HEALTHBAR_Y_OFFSET_ENEMY_SLOT_2 HEALTHBAR_Y_OFFSET_SOLO_ENEMY + 9 - -#define HEALTHBAR_WINDOW_BLOCK_SIZE 32 - -#define HEALTHBAR_NAME_BLOCK_COUNT_X 8 -#define HEALTHBAR_NAME_BLOCK_COUNT_Y 2 -#define HEALTHBAR_NAME_WINDOW_OFFSET 0 -#define HEALTHBAR_NAME_BYTE_SIZE (HEALTHBAR_NAME_BLOCK_COUNT_X * HEALTHBAR_NAME_BLOCK_COUNT_Y * HEALTHBAR_WINDOW_BLOCK_SIZE) -#define HEALTHBAR_NAME_BACKGROUND_COLOR 0xF -#define HEALTHBAR_NAME_TEXT_COLOR TEXT_COLOR(14, 2, HEALTHBAR_NAME_BACKGROUND_COLOR) - -#define HEALTHBAR_HP_CELL_COUNT 6 -#define HEALTHBAR_EXP_CELL_COUNT 12 - -#define VRAM_TRANSFER_DST(vram, transferTable, index_0, index_1, imgProxy) ( \ - (void *)((u32)vram + transferTable[index_0][index_1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN])) - -#define S32_MIN -2147483648 - -typedef struct VRAMTransfer { - u16 pos; - u16 size; -} VRAMTransfer; - -typedef struct { - Healthbar *healthbar; - u8 *unk_04; - u8 state; - u8 unk_09; - s8 unk_0A; -} UnkStruct_ov16_0226834C; - -enum HealthbarPart { - HEALTHBAR_PART_HP_H = 0, - HEALTHBAR_PART_HP_P, - HEALTHBAR_PART_GREEN_FILL_0, - HEALTHBAR_PART_GREEN_FILL_1, - HEALTHBAR_PART_GREEN_FILL_2, - HEALTHBAR_PART_GREEN_FILL_3, - HEALTHBAR_PART_GREEN_FILL_4, - HEALTHBAR_PART_GREEN_FILL_5, - HEALTHBAR_PART_GREEN_FILL_6, - HEALTHBAR_PART_GREEN_FILL_7, - HEALTHBAR_PART_GREEN_FILL_8, - HEALTHBAR_PART_YELLOW_FILL_0, - HEALTHBAR_PART_YELLOW_FILL_1, - HEALTHBAR_PART_YELLOW_FILL_2, - HEALTHBAR_PART_YELLOW_FILL_3, - HEALTHBAR_PART_YELLOW_FILL_4, - HEALTHBAR_PART_YELLOW_FILL_5, - HEALTHBAR_PART_YELLOW_FILL_6, - HEALTHBAR_PART_YELLOW_FILL_7, - HEALTHBAR_PART_YELLOW_FILL_8, - HEALTHBAR_PART_RED_FILL_0, - HEALTHBAR_PART_RED_FILL_1, - HEALTHBAR_PART_RED_FILL_2, - HEALTHBAR_PART_RED_FILL_3, - HEALTHBAR_PART_RED_FILL_4, - HEALTHBAR_PART_RED_FILL_5, - HEALTHBAR_PART_RED_FILL_6, - HEALTHBAR_PART_RED_FILL_7, - HEALTHBAR_PART_RED_FILL_8, - HEALTHBAR_PART_EXP_FILL_0, - HEALTHBAR_PART_EXP_FILL_1, - HEALTHBAR_PART_EXP_FILL_2, - HEALTHBAR_PART_EXP_FILL_3, - HEALTHBAR_PART_EXP_FILL_4, - HEALTHBAR_PART_EXP_FILL_5, - HEALTHBAR_PART_EXP_FILL_6, - HEALTHBAR_PART_EXP_FILL_7, - HEALTHBAR_PART_EXP_FILL_8, - HEALTHBAR_PART_STATUS_HEALTHY_0, - HEALTHBAR_PART_STATUS_HEALTHY_1, - HEALTHBAR_PART_STATUS_HEALTHY_2, - HEALTHBAR_PART_STATUS_PARALYSIS_0, - HEALTHBAR_PART_STATUS_PARALYSIS_1, - HEALTHBAR_PART_STATUS_PARALYSIS_2, - HEALTHBAR_PART_STATUS_FREEZE_0, - HEALTHBAR_PART_STATUS_FREEZE_1, - HEALTHBAR_PART_STATUS_FREEZE_2, - HEALTHBAR_PART_STATUS_SLEEP_0, - HEALTHBAR_PART_STATUS_SLEEP_1, - HEALTHBAR_PART_STATUS_SLEEP_2, - HEALTHBAR_PART_STATUS_POISON_0, - HEALTHBAR_PART_STATUS_POISON_1, - HEALTHBAR_PART_STATUS_POISON_2, - HEALTHBAR_PART_STATUS_BURN_0, - HEALTHBAR_PART_STATUS_BURN_1, - HEALTHBAR_PART_STATUS_BURN_2, - HEALTHBAR_PART_EMPTY_0, - HEALTHBAR_PART_EMPTY_1, - HEALTHBAR_PART_EMPTY_2, - HEALTHBAR_PART_CAUGHT_INDICATOR, - HEALTHBAR_PART_LEVEL_FEMALE_TOP_0, - HEALTHBAR_PART_LEVEL_FEMALE_TOP_1, - HEALTHBAR_PART_LEVEL_MALE_TOP_0, - HEALTHBAR_PART_LEVEL_MALE_TOP_1, - HEALTHBAR_PART_LEVEL_GENDERLESS_TOP_0, - HEALTHBAR_PART_LEVEL_GENDERLESS_TOP_1, - HEALTHBAR_PART_HP_H_2, - HEALTHBAR_PART_HP_P_2, - HEALTHBAR_PART_BAR_END, - HEALTHBAR_PART_SLASH, - HEALTHBAR_PART_NUMBERS_LEFT, - HEALTHBAR_PART_NUMBERS_RIGHT, - HEALTHBAR_PART_LEVEL_FEMALE_BOTTOM_0, - HEALTHBAR_PART_LEVEL_FEMALE_BOTTOM_1, - HEALTHBAR_PART_LEVEL_MALE_BOTTOM_0, - HEALTHBAR_PART_LEVEL_MALE_BOTTOM_1, - HEALTHBAR_PART_LEVEL_GENDERLESS_BOTTOM_0, - HEALTHBAR_PART_LEVEL_GENDERLESS_BOTTOM_1, -}; - -static s32 Healthbar_DrawGauge(Healthbar *healthbar, enum HealthbarGaugeType gaugeType); -static s32 UpdateGauge(s32 max, s32 cur, s32 diff, s32 *temp, u8 size, u16 fillOffset); -static u8 FillCells(s32 max, s32 cur, s32 diff, s32 *temp, u8 *cells, u8 cellNum); -static u32 CalcGaugeFill(s32 curVal, s32 diff, s32 maxVal, u8 gaugeSize); -static const u8 *GetHealthbarPartsTile(enum HealthbarPart part); -static void DrawGauge(Healthbar *healthbar, u8 gaugeType); -static void Healthbar_DrawBattlerName(Healthbar *healthbar); -static void Healthbar_DrawLevelText(Healthbar *healthbar); -static void Healthbar_DrawLevelNumber(Healthbar *healthbar); -static void Healthbar_DrawCurrentHP(Healthbar *healthbar, u32 hp); -static void Healthbar_DrawMaxHP(Healthbar *healthbar); -static void Healthbar_DrawCaughtIcon(Healthbar *healthbar); -static void Healthbar_DrawStatusIcon(Healthbar *healthbar, enum HealthbarPart part); -static void Healthbar_DrawBallCount(Healthbar *healthbar, u32 flags); -static void Healthbar_DrawBallsLeftMessage(Healthbar *healthbar, u32 flags); -static void Healthbar_LoadMainPalette(SpriteSystem *spriteSys, SpriteManager *handler, NARC *narc, PaletteData *palette, int type); -static void ov16_02267244(Healthbar *healthbar); -static void ov16_0226728C(Healthbar *healthbar); -static const SpriteTemplate *Healthbar_SpriteTemplate(u8 type); -static const SpriteTemplate *ov16_02268314(u8 type); -static void ScrollHealthbarTask(SysTask *task, void *data); -static void ov16_02268380(SysTask *task, void *param1); -void ov16_02268470(Healthbar *healthbar); -void ov16_02268498(Healthbar *healthbar); -static void ov16_022684BC(SysTask *task, void *data); -static void Healthbar_EnableArrow(Healthbar *healthbar, BOOL enable); - -ALIGN_4 static const s8 sArrowOffsetX[] = { - [HEALTHBAR_TYPE_PLAYER_SOLO] = 72, - [HEALTHBAR_TYPE_ENEMY_SOLO] = 0, - [HEALTHBAR_TYPE_PLAYER_SLOT_1] = 72, - [HEALTHBAR_TYPE_ENEMY_SLOT_1] = 0, - [HEALTHBAR_TYPE_PLAYER_SLOT_2] = 72, - [HEALTHBAR_TYPE_ENEMY_SLOT_2] = 0, -}; - -static const VRAMTransfer sBattlerNameVRAMTransfer[][4] = { - [HEALTHBAR_TYPE_PLAYER_SOLO] = { - { 19 * HEALTHBAR_WINDOW_BLOCK_SIZE, 5 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 27 * HEALTHBAR_WINDOW_BLOCK_SIZE, 5 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 3 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 3 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, - [HEALTHBAR_TYPE_ENEMY_SOLO] = { - { 17 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 25 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, - [HEALTHBAR_TYPE_PLAYER_SLOT_1] = { - { 18 * HEALTHBAR_WINDOW_BLOCK_SIZE, 6 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 26 * HEALTHBAR_WINDOW_BLOCK_SIZE, 6 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 2 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 2 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, - [HEALTHBAR_TYPE_ENEMY_SLOT_1] = { - { 17 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 25 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, - [HEALTHBAR_TYPE_PLAYER_SLOT_2] = { - { 18 * HEALTHBAR_WINDOW_BLOCK_SIZE, 6 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 26 * HEALTHBAR_WINDOW_BLOCK_SIZE, 6 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 2 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 2 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, - [HEALTHBAR_TYPE_ENEMY_SLOT_2] = { - { 17 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 25 * HEALTHBAR_WINDOW_BLOCK_SIZE, 7 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 80 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 88 * HEALTHBAR_WINDOW_BLOCK_SIZE, 1 * HEALTHBAR_WINDOW_BLOCK_SIZE }, - }, -}; - -static const VRAMTransfer Unk_ov16_0226F47C[][2] = { - { - { 0xA60, 0x40 }, - { 0xB60, 0x40 }, - }, - { - { 0xA20, 0x40 }, - { 0xB20, 0x40 }, - }, - { - { 0xA40, 0x40 }, - { 0xB40, 0x40 }, - }, - { - { 0xA20, 0x40 }, - { 0xB20, 0x40 }, - }, - { - { 0xA40, 0x40 }, - { 0xB40, 0x40 }, - }, - { - { 0xA20, 0x40 }, - { 0xB20, 0x40 }, - }, -}; - -static const VRAMTransfer Unk_ov16_0226F3EC[][2] = { - { - { 0xAA0, 0x60 }, - { 0xBA0, 0x60 }, - }, - { - { 0xA60, 0x60 }, - { 0xB60, 0x60 }, - }, - { - { 0xA80, 0x60 }, - { 0xB80, 0x60 }, - }, - { - { 0xA60, 0x60 }, - { 0xB60, 0x60 }, - }, - { - { 0xA80, 0x60 }, - { 0xB80, 0x60 }, - }, - { - { 0xA60, 0x60 }, - { 0xB60, 0x60 }, - }, -}; - -static const VRAMTransfer Unk_ov16_0226F41C[][2] = { - { - { 0x0, 0x0 }, - { 0xD00, 0x60 }, - }, - { - { 0x620, 0x60 }, - { 0x0, 0x0 }, - }, - { - { 0x0, 0x0 }, - { 0xC00, 0x60 }, - }, - { - { 0x620, 0x60 }, - { 0x0, 0x0 }, - }, - { - { 0x0, 0x0 }, - { 0xC00, 0x60 }, - }, - { - { 0x620, 0x60 }, - { 0x0, 0x0 }, - }, -}; - -static const VRAMTransfer Unk_ov16_0226F3BC[] = { - { 0xD80, 0x60 }, - { 0x6A0, 0x60 }, - { 0xC80, 0x60 }, - { 0x6A0, 0x60 }, - { 0xC80, 0x60 }, - { 0x6A0, 0x60 }, -}; - -static const VRAMTransfer Unk_ov16_0226F44C[][2] = { - { - { 0x4E0, 0x0 }, - { 0xC20, 0xC0 }, - }, - { - { 0x4E0, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0xC00, 0xA0 }, - }, - { - { 0x4E0, 0x0 }, - { 0xC00, 0xC0 }, - }, - { - { 0x4E0, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0xC00, 0xA0 }, - }, - { - { 0x4E0, 0x0 }, - { 0xC00, 0xC0 }, - }, - { - { 0x4E0, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0xC00, 0xA0 }, - }, -}; - -static const VRAMTransfer Unk_ov16_0226F38C[] = { - { 0x460, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x420, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x440, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x420, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x440, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x420, HEALTHBAR_WINDOW_BLOCK_SIZE }, -}; - -static const VRAMTransfer Unk_ov16_0226F35C[] = { - { 0x480, 0x60 }, - { 0x440, 0x60 }, - { 0x460, 0x60 }, - { 0x440, 0x60 }, - { 0x460, 0x60 }, - { 0x440, 0x60 }, -}; - -static const VRAMTransfer Unk_ov16_0226F33C[4] = { - { 0x240, 0xC0 }, - { 0x340, 0xC0 }, - { 0xA00, 0xE0 }, - { 0xB00, 0xE0 }, -}; - -static const VRAMTransfer Unk_ov16_0226F34C[4] = { - { 0x440, 0xC0 }, - { 0x540, 0xC0 }, - { 0xC00, 0xE0 }, - { 0xD00, 0xE0 }, -}; - -static const VRAMTransfer Unk_ov16_0226F374[] = { - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0x4C0, 0x40 }, - { 0x0, 0x0 }, - { 0x4C0, 0x40 }, - { 0x0, 0x0 }, -}; - -static const VRAMTransfer Unk_ov16_0226F3A4[] = { - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xCC0, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x0, 0x0 }, - { 0xCC0, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x0, 0x0 }, -}; - -static const VRAMTransfer Unk_ov16_0226F3D4[] = { - { 0x0, 0x0 }, - { 0x0, 0x0 }, - { 0xC60, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x0, 0x0 }, - { 0xC60, HEALTHBAR_WINDOW_BLOCK_SIZE }, - { 0x0, 0x0 }, -}; - -#define HEALTHBAR_MAIN_PALETTE_RESID 20006 -#define HEALTHBAR_EFFECTS_PALETTE_RESID 20007 -#define HEALTHBAR_SAFARI_PALETTE_RESID 20008 - -static const SpriteTemplate sHealthbarTemplate_SoloPlayer = { - .x = HEALTHBAR_X_OFFSET_SOLO_PLAYER, - .y = HEALTHBAR_Y_OFFSET_SOLO_PLAYER, - .z = 0, - .animIdx = 0, - .priority = 23, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_player_singles_NCGR_lz, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_tall_cell_NCER_lz, - misc_single_frame_anim_NANR_lz_6, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_SoloEnemy = { - .x = HEALTHBAR_X_OFFSET_SOLO_ENEMY, - .y = HEALTHBAR_Y_OFFSET_SOLO_ENEMY, - .z = 0, - .animIdx = 0, - .priority = 24, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_enemy_NCGR_lz, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_short_cell_NCER_lz, - misc_single_frame_anim_NANR_lz_5, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_PlayerSlot1 = { - .x = HEALTHBAR_X_OFFSET_PLAYER_SLOT_1, - .y = HEALTHBAR_Y_OFFSET_PLAYER_SLOT_1, - .z = 0, - .animIdx = 0, - .priority = 28, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_player_doubles_NCGR_lz, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_short_cell_NCER_lz_3, - misc_single_frame_anim_NANR_lz_9, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_EnemySlot1 = { - .x = HEALTHBAR_X_OFFSET_ENEMY_SLOT_1, - .y = HEALTHBAR_Y_OFFSET_ENEMY_SLOT_1, - .z = 0, - .animIdx = 0, - .priority = 25, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_enemy_NCGR_lz_1, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_short_cell_NCER_lz_1, - misc_single_frame_anim_NANR_lz_7, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_PlayerSlot2 = { - .x = HEALTHBAR_X_OFFSET_PLAYER_SLOT_2, - .y = HEALTHBAR_Y_OFFSET_PLAYER_SLOT_2, - .z = 0, - .animIdx = 0, - .priority = 26, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_player_doubles_NCGR_lz_1, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_short_cell_NCER_lz_4, - misc_single_frame_anim_NANR_lz_10, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_EnemySlot2 = { - .x = HEALTHBAR_X_OFFSET_ENEMY_SLOT_2, - .y = HEALTHBAR_Y_OFFSET_ENEMY_SLOT_2, - .z = 0, - .animIdx = 0, - .priority = 27, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_enemy_NCGR_lz_2, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_short_cell_NCER_lz_2, - misc_single_frame_anim_NANR_lz_8, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -static const SpriteTemplate sHealthbarTemplate_Unk_ov16_0226F514 = { - .x = 0, - .y = 0, - .z = 0, - .animIdx = 0, - .priority = 17, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_arrows_wide_NCGR_lz, - HEALTHBAR_MAIN_PALETTE_RESID, - healthbox_arrows_wide_cell_NCER_lz, - healthbox_arrows_wide_anim_NANR_lz, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE -}; - -static const SpriteTemplate sHealthbarTemplate_NoPlayerMon = { - .x = HEALTHBAR_X_OFFSET_SOLO_PLAYER, - .y = HEALTHBAR_Y_OFFSET_SOLO_PLAYER, - .z = 0, - .animIdx = 0, - .priority = 23, - .plttIdx = 0, - .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, - .resources = { - healthbox_safari_NCGR_lz, - HEALTHBAR_SAFARI_PALETTE_RESID, - healthbox_safari_cell_NCER_lz, - misc_single_frame_anim_NANR_lz_15, - SPRITE_RESOURCE_NONE, - SPRITE_RESOURCE_NONE, - }, - .bgPriority = 0, - .vramTransfer = FALSE, -}; - -#include "res/graphics/battle/healthbox/healthbar_parts.4bpp.h" - -void Healthbar_LoadResources(SpriteSystem *spriteSys, SpriteManager *spriteMan, NARC *narc, PaletteData *palette, enum HealthbarType healthbarType) -{ - const SpriteTemplate *template = Healthbar_SpriteTemplate(healthbarType); - - SpriteSystem_LoadCharResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_CHAR], TRUE, NNS_G2D_VRAM_TYPE_2DMAIN, template->resources[SPRITE_RESOURCE_CHAR]); - SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBAR_MAIN_PALETTE_RESID); - SpriteSystem_LoadCellResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_CELL], TRUE, template->resources[SPRITE_RESOURCE_CELL]); - SpriteSystem_LoadAnimResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_ANIM], TRUE, template->resources[SPRITE_RESOURCE_ANIM]); - SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBAR_EFFECTS_PALETTE_RESID); - - if (healthbarType == HEALTHBAR_TYPE_SAFARI_ZONE || healthbarType == HEALTHBAR_TYPE_PAL_PARK) { - SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_safari_NCLR, 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBAR_SAFARI_PALETTE_RESID); - } -} - -static void Healthbar_LoadMainPalette(SpriteSystem *spriteSys, SpriteManager *handler, NARC *narc, PaletteData *palette, int type) -{ - const SpriteTemplate *template = ov16_02268314(type); - - if (template != NULL) { - SpriteSystem_LoadCharResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_CHAR], TRUE, NNS_G2D_VRAM_TYPE_2DMAIN, template->resources[SPRITE_RESOURCE_CHAR]); - SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, handler, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBAR_MAIN_PALETTE_RESID); - SpriteSystem_LoadCellResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_CELL], TRUE, template->resources[SPRITE_RESOURCE_CELL]); - SpriteSystem_LoadAnimResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_ANIM], TRUE, template->resources[SPRITE_RESOURCE_ANIM]); - } -} - -ManagedSprite *Healthbar_DrawSprite(SpriteSystem *spriteSys, SpriteManager *handler, int type) -{ - const SpriteTemplate *template = Healthbar_SpriteTemplate(type); - ManagedSprite *managedSprite = SpriteSystem_NewSprite(spriteSys, handler, template); - - Sprite_TickFrame(managedSprite->sprite); - return managedSprite; -} - -void Healthbar_DrawInfo(Healthbar *healthbar, u32 hp, u32 flags) -{ - BOOL caughtSpecies = FALSE; - - GF_ASSERT(healthbar->mainSprite != NULL); - - u32 flagsCopy = flags; - - if (healthbar->type == HEALTHBAR_TYPE_SAFARI_ZONE) { - flags &= HEALTHBAR_INFO_ALL_SAFARI; - } else if (healthbar->type == HEALTHBAR_TYPE_PAL_PARK) { - flags &= HEALTHBAR_INFO_ALL_PARK; - } else { - flags &= ~(HEALTHBAR_INFO_ALL_SAFARI | HEALTHBAR_INFO_ALL_PARK); - } - - switch (healthbar->type) { - case HEALTHBAR_TYPE_ENEMY_SOLO: - case HEALTHBAR_TYPE_ENEMY_SLOT_1: - case HEALTHBAR_TYPE_ENEMY_SLOT_2: - // Never display current HP, max HP, or the EXP bar on an enemy healthbar - flags &= ~HEALTHBAR_INFO_NOT_ON_ENEMY; - caughtSpecies = TRUE; - break; - - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - // Never display the EXP bar in doubles - flags &= ~(HEALTHBAR_INFO_EXP_GAUGE | HEALTHBAR_INFO_CAUGHT_SPECIES); - - // Allow toggling between showing the HP bar and raw current/max numbers - if (healthbar->numberMode == FALSE) { - flags &= ~(HEALTHBAR_INFO_CURRENT_HP | HEALTHBAR_INFO_MAX_HP); - } else { - flags &= ~HEALTHBAR_INFO_HP_GAUGE; - } - break; - - case HEALTHBAR_TYPE_PLAYER_SOLO: - // Never show the pokeball icon on a player's healthbar for a captured species - flags &= ~HEALTHBAR_INFO_CAUGHT_SPECIES; - break; - - case HEALTHBAR_TYPE_SAFARI_ZONE: - case HEALTHBAR_TYPE_PAL_PARK: - break; - } - - if (BattleSystem_GetBattleType(healthbar->battleSys) & BATTLE_TYPE_TRAINER) { - // Never show the pokeball icon on an enemy trainer's healthbar - flags &= ~HEALTHBAR_INFO_CAUGHT_SPECIES; - } - - if (flags & HEALTHBAR_INFO_HP_GAUGE) { - Healthbar_CalcHP(healthbar, 0); - Healthbar_DrawGauge(healthbar, HEALTHBAR_GAUGE_HP); - } - - if (flags & HEALTHBAR_INFO_CURRENT_HP) { - Healthbar_DrawCurrentHP(healthbar, hp); - } - - if (flags & HEALTHBAR_INFO_MAX_HP) { - Healthbar_DrawMaxHP(healthbar); - } - - if ((flags & HEALTHBAR_INFO_LEVEL_TEXT) || (flags & HEALTHBAR_INFO_GENDER)) { - Healthbar_DrawLevelText(healthbar); - } - - if (flags & HEALTHBAR_INFO_LEVEL) { - Healthbar_DrawLevelNumber(healthbar); - } - - if (flags & HEALTHBAR_INFO_NAME) { - Healthbar_DrawBattlerName(healthbar); - } - - if (flags & HEALTHBAR_INFO_EXP_GAUGE) { - Healthbar_CalcExp(healthbar, 0); - Healthbar_DrawGauge(healthbar, HEALTHBAR_GAUGE_EXP); - } - - if (flags & HEALTHBAR_INFO_CAUGHT_SPECIES) { - Healthbar_DrawCaughtIcon(healthbar); - } - - if (flags & HEALTHBAR_INFO_STATUS) { - switch (healthbar->status) { - default: - case BATTLE_ANIMATION_NONE: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_HEALTHY_0); - break; - case BATTLE_ANIMATION_ASLEEP: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_SLEEP_0); - break; - case BATTLE_ANIMATION_POISONED: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_POISON_0); - break; - case BATTLE_ANIMATION_BURNED: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_BURN_0); - break; - case BATTLE_ANIMATION_FROZEN: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_FREEZE_0); - break; - case BATTLE_ANIMATION_PARALYZED: - Healthbar_DrawStatusIcon(healthbar, HEALTHBAR_PART_STATUS_PARALYSIS_0); - break; - } - } - - if (flags & (HEALTHBAR_INFO_COUNT_SAFARI_BALLS | HEALTHBAR_INFO_COUNT_PARK_BALLS)) { - Healthbar_DrawBallCount(healthbar, flags); - } - - if (flags & (HEALTHBAR_INFO_REMAINING_SAFARI_BALLS | HEALTHBAR_INFO_REMAINING_PARK_BALLS)) { - Healthbar_DrawBallsLeftMessage(healthbar, flags); - } -} - -void ov16_02267220(Healthbar *healthbar) -{ - if (healthbar->task_50 != NULL) { - SysTask_Done(healthbar->task_50); - healthbar->task_50 = NULL; - } - - if (healthbar->mainSprite == NULL) { - return; - } - - Sprite_DeleteAndFreeResources(healthbar->mainSprite); - healthbar->mainSprite = NULL; -} - -static void ov16_02267244(Healthbar *healthbar) -{ - if (healthbar->arrowSprite == NULL) { - return; - } - - Sprite_DeleteAndFreeResources(healthbar->arrowSprite); - healthbar->arrowSprite = NULL; -} - -void ov16_02267258(Healthbar *healthbar) -{ - SpriteSystem *spriteSystem; - SpriteManager *spriteManager; - const SpriteTemplate *spriteTemplate = Healthbar_SpriteTemplate(healthbar->type); - spriteSystem = BattleSystem_GetSpriteSystem(healthbar->battleSys); - spriteManager = BattleSystem_GetSpriteManager(healthbar->battleSys); - - SpriteManager_UnloadCharObjById(spriteManager, spriteTemplate->resources[0]); - SpriteManager_UnloadCellObjById(spriteManager, spriteTemplate->resources[2]); - SpriteManager_UnloadAnimObjById(spriteManager, spriteTemplate->resources[3]); -} - -static void ov16_0226728C(Healthbar *healthbar) -{ - SpriteSystem *spriteSystem; - SpriteManager *spriteManager; - const SpriteTemplate *spriteTemplate = ov16_02268314(healthbar->type); - - if (spriteTemplate == NULL) { - return; - } - - spriteSystem = BattleSystem_GetSpriteSystem(healthbar->battleSys); - spriteManager = BattleSystem_GetSpriteManager(healthbar->battleSys); - - SpriteManager_UnloadCharObjById(spriteManager, spriteTemplate->resources[0]); - SpriteManager_UnloadCellObjById(spriteManager, spriteTemplate->resources[2]); - SpriteManager_UnloadAnimObjById(spriteManager, spriteTemplate->resources[3]); -} - -void ov16_022672C4(Healthbar *healthbar) -{ - NARC *narc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_BATTLE); - SpriteSystem *spriteSystem = BattleSystem_GetSpriteSystem(healthbar->battleSys); - SpriteManager *spriteManager = BattleSystem_GetSpriteManager(healthbar->battleSys); - PaletteData *paletteData = BattleSystem_GetPaletteData(healthbar->battleSys); - const SpriteTemplate *spriteTemplate = Healthbar_SpriteTemplate(healthbar->type); - - Healthbar_LoadResources(spriteSystem, spriteManager, narc, paletteData, healthbar->type); - healthbar->mainSprite = Healthbar_DrawSprite(spriteSystem, spriteManager, healthbar->type); - - Healthbar_LoadMainPalette(spriteSystem, spriteManager, narc, paletteData, healthbar->type); - - if (healthbar->arrowSprite != NULL) { - Sprite_SetPositionXY(healthbar->arrowSprite->sprite, spriteTemplate->x - sArrowOffsetX[healthbar->type], spriteTemplate->y + 0); - } - - NARC_dtor(narc); -} - -void ov16_02267360(Healthbar *healthbar) -{ - ov16_02267220(healthbar); - ov16_02267258(healthbar); - ov16_02267244(healthbar); - ov16_0226728C(healthbar); -} - -void ov16_0226737C(Healthbar *healthbar) -{ - const u8 *tileNum; - NNSG2dImageProxy *imgProxy; - void *v2; - - switch (healthbar->type) { - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - break; - default: - return; - } - - healthbar->numberMode ^= 1; - - v2 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - - if (healthbar->numberMode == 1) { - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_NUMBERS_LEFT); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F374[healthbar->type].pos + HEALTHBAR_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_NUMBERS_RIGHT); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbar->type].pos + HEALTHBAR_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_SLASH); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3D4[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3D4[healthbar->type].size); - - Healthbar_DrawInfo(healthbar, healthbar->curHP, HEALTHBAR_INFO_CURRENT_HP | HEALTHBAR_INFO_MAX_HP); - } else { - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_HP_H_2); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F374[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F374[healthbar->type].size); - - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_BAR_END); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3A4[healthbar->type].size); - - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_STATUS_HEALTHY_0); - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbar->type].pos + HEALTHBAR_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - - Healthbar_DrawInfo(healthbar, healthbar->curHP, HEALTHBAR_INFO_HP_GAUGE); - } -} - -void Healthbar_CalcHP(Healthbar *healthbar, int damage) -{ - healthbar->hpTemp = S32_MIN; - - // bound the damage input to [0, maxHP] - if (healthbar->curHP + damage < 0) { - damage -= healthbar->curHP + damage; - } - if (healthbar->curHP + damage > healthbar->maxHP) { - damage -= (healthbar->curHP + damage) - healthbar->maxHP; - } - - // update cached values - healthbar->damage = -damage; - - if (healthbar->curHP < 0) { - healthbar->curHP = 0; - } - - if (healthbar->curHP > healthbar->maxHP) { - healthbar->curHP = healthbar->maxHP; - } -} - -s32 ov16_022674F8(Healthbar *healthbar) -{ - s32 result = Healthbar_DrawGauge(healthbar, HEALTHBAR_GAUGE_HP); - - if (result == -1) { - healthbar->curHP -= healthbar->damage; - Healthbar_DrawInfo(healthbar, healthbar->curHP, HEALTHBAR_INFO_CURRENT_HP); - } else { - Healthbar_DrawInfo(healthbar, result, HEALTHBAR_INFO_CURRENT_HP); - } - - return result; -} - -void Healthbar_CalcExp(Healthbar *healthbar, int expReward) -{ - healthbar->expTemp = S32_MIN; - - if (healthbar->curExp + expReward < 0) { - expReward -= healthbar->curExp + expReward; - } - - if (healthbar->curExp + expReward > healthbar->maxExp) { - expReward -= (healthbar->curExp + expReward) - healthbar->maxExp; - } - - healthbar->expReward = -expReward; - - if (healthbar->curExp < 0) { - healthbar->curExp = 0; - } - - if (healthbar->curExp > healthbar->maxExp) { - healthbar->curExp = healthbar->maxExp; - } -} - -s32 ov16_02267560(Healthbar *healthbar) -{ - s32 result = Healthbar_DrawGauge(healthbar, HEALTHBAR_GAUGE_EXP); - - if (result == -1) { - healthbar->curExp -= healthbar->expReward; - } - - return result; -} - -void ov16_0226757C(Healthbar *healthbar) -{ - if (healthbar->arrowSprite != NULL) { - Sprite_SetAnimateFlag(healthbar->arrowSprite->sprite, TRUE); - Healthbar_EnableArrow(healthbar, TRUE); - } - - if ((BattleSystem_GetBattleType(healthbar->battleSys) & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_PAL_PARK)) == FALSE) { - ov16_02268470(healthbar); - } -} - -void ov16_022675AC(Healthbar *healthbar) -{ - if (healthbar->arrowSprite != NULL) { - Sprite_SetAnimateFlag(healthbar->arrowSprite->sprite, FALSE); - Sprite_SetAnimFrame(healthbar->arrowSprite->sprite, 0); - Healthbar_EnableArrow(healthbar, FALSE); - } - - ov16_02268498(healthbar); -} - -void ov16_022675D8(Healthbar *healthbar, int priority) -{ - if (healthbar->mainSprite == NULL) { - return; - } - - ManagedSprite_SetExplicitPriority(healthbar->mainSprite, priority); - - if (healthbar->arrowSprite != NULL) { - ManagedSprite_SetExplicitPriority(healthbar->arrowSprite, priority); - } -} - -/** - * @brief Enable the extended arrow-graphic used by the healthbar for Pokemon battlers. - * - * @param battleSys - * @param enable - */ -static void Healthbar_EnableArrow(Healthbar *battleSys, BOOL enable) -{ - if (battleSys->arrowSprite == NULL) { - return; - } - - // Safari battles don't get an arrow. - if ((BattleSystem_GetBattleType(battleSys->battleSys) & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_PAL_PARK)) - && enable == TRUE) { - return; - } - - ManagedSprite_SetDrawFlag(battleSys->arrowSprite, enable); -} - -void Healthbar_Enable(Healthbar *battleSys, BOOL enable) -{ - if (battleSys->mainSprite == NULL) { - return; - } - - ManagedSprite_SetDrawFlag(battleSys->mainSprite, enable); - Healthbar_EnableArrow(battleSys, enable); -} - -void Healthbar_OffsetPositionXY(Healthbar *healthbar, int x, int y) -{ - GF_ASSERT(healthbar->mainSprite != NULL); - const SpriteTemplate *template = Healthbar_SpriteTemplate(healthbar->type); - - Sprite_SetPositionXY(healthbar->mainSprite->sprite, template->x + x, template->y + y); - if (healthbar->arrowSprite != NULL) { - Sprite_SetPositionXY(healthbar->arrowSprite->sprite, - template->x + x - sArrowOffsetX[healthbar->type], - template->y + y + 0); - } -} - -void Healthbar_Scroll(Healthbar *healthbar, enum HealthbarScrollDirection direction) -{ - GF_ASSERT(healthbar != NULL); - GF_ASSERT(healthbar->mainSprite != NULL); - - healthbar->doneScrolling = 0; - healthbar->scrollDirection = direction; - - if (direction == HEALTHBAR_SCROLL_IN) { - switch (healthbar->type) { - case HEALTHBAR_TYPE_PLAYER_SOLO: - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - case HEALTHBAR_TYPE_SAFARI_ZONE: - case HEALTHBAR_TYPE_PAL_PARK: - // Player-side healthbar - Healthbar_OffsetPositionXY(healthbar, HEALTHBAR_SCROLL_OUT_OFFSET, 0); - break; - - default: - // Enemy-side healthbar - Healthbar_OffsetPositionXY(healthbar, -HEALTHBAR_SCROLL_OUT_OFFSET, 0); - break; - } - } else { - Healthbar_OffsetPositionXY(healthbar, 0, 0); - } - - SysTask_Start(ScrollHealthbarTask, healthbar, 990); -} - -/** - * @brief Scroll the healthbar in or out by the configured scroll-speed value. - * - * @param task - * @param data - */ -static void ScrollHealthbarTask(SysTask *task, void *data) -{ - Healthbar *healthbar = data; - int done = 0; - const SpriteTemplate *template = Healthbar_SpriteTemplate(healthbar->type); - - s16 x, y; - ManagedSprite_GetPositionXY(healthbar->mainSprite, &x, &y); - - // Determine new X and Y based on the type of healthbar - switch (healthbar->type) { - case HEALTHBAR_TYPE_PLAYER_SOLO: - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - case HEALTHBAR_TYPE_SAFARI_ZONE: - case HEALTHBAR_TYPE_PAL_PARK: - // Player-side healthbar - if (healthbar->scrollDirection == HEALTHBAR_SCROLL_IN) { - x -= HEALTHBAR_SCROLL_SPEED; - - if (x < template->x) { - x = template->x; - done++; - } - } else { - x += HEALTHBAR_SCROLL_SPEED; - - if (x > template->x + HEALTHBAR_SCROLL_OUT_OFFSET) { - x = template->x + HEALTHBAR_SCROLL_OUT_OFFSET; - done++; - } - } - break; - - default: - // Enemy-side healthbar - if (healthbar->scrollDirection == HEALTHBAR_SCROLL_IN) { - x += HEALTHBAR_SCROLL_SPEED; - - if (x > template->x) { - x = template->x; - done++; - } - } else { - x -= HEALTHBAR_SCROLL_SPEED; - - if (x < template->x - HEALTHBAR_SCROLL_SPEED) { - x = template->x - HEALTHBAR_SCROLL_SPEED; - done++; - } - } - break; - } - - // Update positions of the sprites on the screen - ManagedSprite_SetPositionXY(healthbar->mainSprite, x, y); - if (healthbar->arrowSprite != NULL) { - ManagedSprite_SetPositionXY(healthbar->arrowSprite, x - sArrowOffsetX[healthbar->type], y + 0); - } - - // If the sprites are now in position, we're done - if (done > 0) { - healthbar->doneScrolling = TRUE; - SysTask_Done(task); - } -} - -/** - * @brief Draw the battler's name onto the healthbar. - * - * @param healthbar - */ -static void Healthbar_DrawBattlerName(Healthbar *healthbar) -{ - BgConfig *bgl = BattleSystem_GetBgConfig(healthbar->battleSys); - u8 *buf; - NNSG2dImageProxy *imgProxy; - Window window; - MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbar->battleSys); - StringTemplate *strFormatter = BattleSystem_GetStringTemplate(healthbar->battleSys); - - String *nickname = String_Init(MON_NAME_LEN + 12, HEAP_ID_BATTLE); // TODO: not sure why there is a +12 here - String *template = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_HealthbarPokemonName); - - Pokemon *mon = BattleSystem_GetPartyPokemon(healthbar->battleSys, healthbar->battler, healthbar->selectedPartySlot); - BoxPokemon *boxMon = Pokemon_GetBoxPokemon(mon); - - StringTemplate_SetNickname(strFormatter, 0, boxMon); - StringTemplate_Format(strFormatter, nickname, template); - - Window_AddToTopLeftCorner(bgl, &window, HEALTHBAR_NAME_BLOCK_COUNT_X, HEALTHBAR_NAME_BLOCK_COUNT_Y, HEALTHBAR_NAME_WINDOW_OFFSET, HEALTHBAR_NAME_BACKGROUND_COLOR); - Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, nickname, 0, 0, TEXT_SPEED_NO_TRANSFER, HEALTHBAR_NAME_TEXT_COLOR, 0, 0, NULL); - buf = window.pixels; - - // copy the window's data into VRAM over the painted healthbar - void *vram = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - u8 *hiHalf = buf; - u8 *loHalf = &buf[HEALTHBAR_NAME_BLOCK_COUNT_X * HEALTHBAR_WINDOW_BLOCK_SIZE]; - - MI_CpuCopy16(hiHalf, - VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbar->type, 0, imgProxy), - sBattlerNameVRAMTransfer[healthbar->type][0].size); - MI_CpuCopy16(loHalf, - VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbar->type, 1, imgProxy), - sBattlerNameVRAMTransfer[healthbar->type][1].size); - MI_CpuCopy16(&hiHalf[sBattlerNameVRAMTransfer[healthbar->type][0].size], - VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbar->type, 2, imgProxy), - sBattlerNameVRAMTransfer[healthbar->type][2].size); - MI_CpuCopy16(&loHalf[sBattlerNameVRAMTransfer[healthbar->type][1].size], - VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbar->type, 3, imgProxy), - sBattlerNameVRAMTransfer[healthbar->type][3].size); - - Window_Remove(&window); - String_Free(nickname); - String_Free(template); -} - -static void Healthbar_DrawLevelText(Healthbar *healthbar) -{ - NNSG2dImageProxy *imgProxy; - const u8 *tileNum1; - const u8 *tileNum2; - int part1, part2; - - if (healthbar->gender == GENDER_MALE) { - part1 = HEALTHBAR_PART_LEVEL_MALE_BOTTOM_0; - part2 = HEALTHBAR_PART_LEVEL_MALE_TOP_0; - } else if (healthbar->gender == GENDER_FEMALE) { - part1 = HEALTHBAR_PART_LEVEL_FEMALE_BOTTOM_0; - part2 = HEALTHBAR_PART_LEVEL_FEMALE_TOP_0; - } else { - part1 = HEALTHBAR_PART_LEVEL_GENDERLESS_BOTTOM_0; - part2 = HEALTHBAR_PART_LEVEL_GENDERLESS_TOP_0; - } - - tileNum1 = GetHealthbarPartsTile(part1); - tileNum2 = GetHealthbarPartsTile(part2); - - void *v5 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - - MI_CpuCopy16(tileNum2, (void *)((u32)v5 + Unk_ov16_0226F47C[healthbar->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F47C[healthbar->type][0].size); - MI_CpuCopy16(tileNum1, (void *)((u32)v5 + Unk_ov16_0226F47C[healthbar->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F47C[healthbar->type][1].size); -} - -static void Healthbar_DrawLevelNumber(Healthbar *healthbar) -{ - NNSG2dImageProxy *imgProxy; - int v4, v5, v6; - - int size = 3 * HEALTHBAR_WINDOW_BLOCK_SIZE; - u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, size); - u8 *v1 = Heap_Alloc(HEAP_ID_BATTLE, size * 2); - - MI_CpuFill8(v0, 0xf | (0xf << 4), size); - FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsLevel(healthbar->battleSys), healthbar->level, 3, PADDING_MODE_NONE, v0); - - void *v7 = G2_GetOBJCharPtr(); - u8 *v8, *v9; - - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - - MI_CpuCopy16((void *)((u32)v7 + Unk_ov16_0226F3EC[healthbar->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), v1, Unk_ov16_0226F3EC[healthbar->type][0].size); - MI_CpuCopy16((void *)((u32)v7 + Unk_ov16_0226F3EC[healthbar->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), &v1[size], Unk_ov16_0226F3EC[healthbar->type][1].size); - - v6 = 0; - - for (v5 = 0; v5 < size; v5 += 32) { - for (v4 = 0; v4 < 16; v4++) { - v1[v5 + 16 + v4] = v0[v6]; - v1[v5 + v4 + size] = v0[v6 + 16]; - v6++; - } - - v6 += 16; - } - - v8 = v1; - v9 = &v1[size]; - - MI_CpuCopy16(v8, (void *)((u32)v7 + Unk_ov16_0226F3EC[healthbar->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3EC[healthbar->type][0].size); - MI_CpuCopy16(v9, (void *)((u32)v7 + Unk_ov16_0226F3EC[healthbar->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3EC[healthbar->type][1].size); - - Heap_Free(v0); - Heap_Free(v1); -} - -static void Healthbar_DrawCurrentHP(Healthbar *healthbar, u32 hp) -{ - u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, 3 * HEALTHBAR_WINDOW_BLOCK_SIZE); - NNSG2dImageProxy *imgProxy; - - MI_CpuFill8(v0, 0xf | (0xf << 4), 3 * HEALTHBAR_WINDOW_BLOCK_SIZE); - FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsHP(healthbar->battleSys), hp, 3, PADDING_MODE_SPACES, v0); - - void *v2 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - u8 *v3 = v0; - - MI_CpuCopy16(v3, (void *)((u32)v2 + Unk_ov16_0226F41C[healthbar->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F41C[healthbar->type][0].size); - MI_CpuCopy16(&v3[Unk_ov16_0226F41C[healthbar->type][0].size], (void *)((u32)v2 + Unk_ov16_0226F41C[healthbar->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F41C[healthbar->type][1].size); - - Heap_Free(v0); -} - -static void Healthbar_DrawMaxHP(Healthbar *healthbar) -{ - u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, 3 * HEALTHBAR_WINDOW_BLOCK_SIZE); - NNSG2dImageProxy *imgProxy; - - MI_CpuFill8(v0, 0xf | (0xf << 4), 3 * HEALTHBAR_WINDOW_BLOCK_SIZE); - FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsHP(healthbar->battleSys), healthbar->maxHP, 3, PADDING_MODE_NONE, v0); - - void *v2 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - u8 *v3 = v0; - - MI_CpuCopy16(v3, (void *)((u32)v2 + Unk_ov16_0226F3BC[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3BC[healthbar->type].size); - - Heap_Free(v0); -} - -static void Healthbar_DrawCaughtIcon(Healthbar *healthbar) -{ - NNSG2dImageProxy *imgProxy; - const u8 *tileNum; - - if (healthbar->caughtSpecies == TRUE) { - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_CAUGHT_INDICATOR); - } else { - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_STATUS_HEALTHY_0); - } - - void *v2 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F38C[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F38C[healthbar->type].size); -} - -static void Healthbar_DrawStatusIcon(Healthbar *healthbar, enum HealthbarPart part) -{ - NNSG2dImageProxy *imgProxy; - const u8 *tileNum = GetHealthbarPartsTile(part); - - void *v2 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - - MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F35C[healthbar->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F35C[healthbar->type].size); -} - -static void Healthbar_DrawBallCount(Healthbar *healthbar, u32 flags) -{ - BgConfig *bgConfig = BattleSystem_GetBgConfig(healthbar->battleSys); - u8 *v1; - NNSG2dImageProxy *imgProxy; - Window window; - MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbar->battleSys); - String *string; - - if (flags & (1 << 10)) { - string = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_SafariBalls); - } else { - string = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_ParkBalls); - } - - Window_AddToTopLeftCorner(bgConfig, &window, 13, 2, 0, 0xf); - Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, string, 0, 0, TEXT_SPEED_NO_TRANSFER, HEALTHBAR_NAME_TEXT_COLOR, 0, 0, NULL); - - v1 = window.pixels; - - void *v6 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - u8 *v7 = v1; - u8 *v8 = &v1[13 * HEALTHBAR_WINDOW_BLOCK_SIZE]; - - MI_CpuCopy16(v7, (void *)((u32)v6 + Unk_ov16_0226F33C[0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[0].size); - MI_CpuCopy16(v8, (void *)((u32)v6 + Unk_ov16_0226F33C[1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[1].size); - - MI_CpuCopy16(&v7[Unk_ov16_0226F33C[0].size], (void *)((u32)v6 + Unk_ov16_0226F33C[2].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[2].size); - MI_CpuCopy16(&v8[Unk_ov16_0226F33C[1].size], (void *)((u32)v6 + Unk_ov16_0226F33C[3].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[3].size); - - Window_Remove(&window); - String_Free(string); -} - -static void Healthbar_DrawBallsLeftMessage(Healthbar *healthbar, u32 flags) -{ - BgConfig *bgConfig = BattleSystem_GetBgConfig(healthbar->battleSys); - u8 *v1; - NNSG2dImageProxy *imgProxy; - Window window; - MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbar->battleSys); - String *templateString; - StringTemplate *strTemplate = BattleSystem_GetStringTemplate(healthbar->battleSys); - - String *string = String_Init(30, HEAP_ID_BATTLE); - - if (flags & (1 << 10)) { - templateString = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_SafariBallsLeft); - } else { - templateString = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_ParkBallsLeft); - } - - StringTemplate_SetNumber(strTemplate, 0, healthbar->numSafariBalls, 2, PADDING_MODE_SPACES, CHARSET_MODE_EN); - StringTemplate_Format(strTemplate, string, templateString); - Window_AddToTopLeftCorner(bgConfig, &window, 13, 2, 0, 0xf); - Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, string, 0, 0, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(14, 2, 15), 0, 0, NULL); - - v1 = window.pixels; - - void *v8 = G2_GetOBJCharPtr(); - imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - u8 *v9 = v1; - u8 *v10 = &v1[13 * HEALTHBAR_WINDOW_BLOCK_SIZE]; - - MI_CpuCopy16(v9, (void *)((u32)v8 + Unk_ov16_0226F34C[0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[0].size); - MI_CpuCopy16(v10, (void *)((u32)v8 + Unk_ov16_0226F34C[1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[1].size); - MI_CpuCopy16(&v9[Unk_ov16_0226F34C[0].size], (void *)((u32)v8 + Unk_ov16_0226F34C[2].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[2].size); - MI_CpuCopy16(&v10[Unk_ov16_0226F34C[1].size], (void *)((u32)v8 + Unk_ov16_0226F34C[3].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[3].size); - - Window_Remove(&window); - String_Free(string); - String_Free(templateString); -} - -static s32 Healthbar_DrawGauge(Healthbar *healthbar, enum HealthbarGaugeType gaugeType) -{ - s32 result; - s32 fillOffset; - - if (gaugeType == HEALTHBAR_GAUGE_HP) { - result = UpdateGauge(healthbar->maxHP, healthbar->curHP, healthbar->damage, &healthbar->hpTemp, HEALTHBAR_HP_CELL_COUNT, 1); - } else { - fillOffset = CalcGaugeFill(healthbar->curExp, healthbar->expReward, healthbar->maxExp, HEALTHBAR_EXP_CELL_COUNT); - - if (fillOffset == 0) { - fillOffset = 1; - } - - fillOffset = abs(healthbar->expReward / fillOffset); - result = UpdateGauge(healthbar->maxExp, healthbar->curExp, healthbar->expReward, &healthbar->expTemp, HEALTHBAR_EXP_CELL_COUNT, fillOffset); - } - - if (gaugeType != HEALTHBAR_GAUGE_HP || healthbar->numberMode != TRUE) { - DrawGauge(healthbar, gaugeType); - } - - if (result == -1) { - if (gaugeType == HEALTHBAR_GAUGE_HP) { - healthbar->hpTemp = 0; - } else { - healthbar->expTemp = 0; - } - } - - return result; -} - -static void DrawGauge(Healthbar *healthbar, u8 gaugeType) -{ - u8 i; - u8 cells[HEALTHBAR_EXP_CELL_COUNT]; - u8 part; - u8 pixels; - u8 level; - const u8 *tileNum; - void *v7 = G2_GetOBJCharPtr(); - NNSG2dImageProxy *imgProxy = Sprite_GetImageProxy(healthbar->mainSprite->sprite); - int numBlocks; - - switch (gaugeType) { - case HEALTHBAR_GAUGE_HP: - pixels = FillCells(healthbar->maxHP, healthbar->curHP, healthbar->damage, &healthbar->hpTemp, cells, HEALTHBAR_HP_CELL_COUNT); - - int barColor = App_BarColor(pixels, 8 * HEALTHBAR_HP_CELL_COUNT); - - switch (barColor) { - case BARCOLOR_GREEN: - part = HEALTHBAR_PART_GREEN_FILL_0; - break; - case BARCOLOR_YELLOW: - part = HEALTHBAR_PART_YELLOW_FILL_0; - break; - case BARCOLOR_RED: - default: - part = HEALTHBAR_PART_RED_FILL_0; - break; - } - - tileNum = GetHealthbarPartsTile(part); - numBlocks = Unk_ov16_0226F44C[healthbar->type][0].size / HEALTHBAR_WINDOW_BLOCK_SIZE; - - for (i = 0; i < HEALTHBAR_HP_CELL_COUNT; i++) { - if (i < numBlocks) { - MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + Unk_ov16_0226F44C[healthbar->type][0].pos + (i * HEALTHBAR_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - } else { - MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + Unk_ov16_0226F44C[healthbar->type][1].pos + ((i - numBlocks) * HEALTHBAR_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - } - } - break; - case HEALTHBAR_GAUGE_EXP: - FillCells(healthbar->maxExp, healthbar->curExp, healthbar->expReward, &healthbar->expTemp, cells, HEALTHBAR_EXP_CELL_COUNT); - level = healthbar->level; - - if (level == MAX_POKEMON_LEVEL) { - for (i = 0; i < HEALTHBAR_EXP_CELL_COUNT; i++) { - cells[i] = 0; - } - } - - tileNum = GetHealthbarPartsTile(HEALTHBAR_PART_EXP_FILL_0); - - for (i = 0; i < HEALTHBAR_EXP_CELL_COUNT; i++) { - if (i < 5) { - MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + 1632 + (i * HEALTHBAR_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - } else { - MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + 3584 + ((i - 5) * HEALTHBAR_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBAR_WINDOW_BLOCK_SIZE); - } - } - break; - } -} - -/** - * @brief Update the pixels of a gauge based on the calculated - * change in the current value of a gauge. - * - * @param cur Current value of the gauge - * @param diff Change to be applied to the current value - * @param max Max value of the gauge - * @param size Size of the gauge, in squares of fill - * @param temp Temporary value stored in the gauge - * @return Number of pixels to be filled - */ -static s32 UpdateGauge(s32 max, s32 cur, s32 diff, s32 *temp, u8 size, u16 fillOffset) -{ - s32 updated, final, ratio; - - u8 corrected = size * HEALTHBAR_NAME_BLOCK_COUNT_X; - - if (*temp == S32_MIN) { - if (max < corrected) { - *temp = cur << 8; - } else { - *temp = cur; - } - } - - updated = cur - diff; - - if (updated < 0) { - updated = 0; - } else if (updated > max) { - updated = max; - } - - if (max < corrected) { - if (updated == (*temp >> 8) && (*temp & 0xff) == 0) { - return -1; - } - } else { - if (updated == *temp) { - return -1; - } - } - - if (max < corrected) { - ratio = max * 0x100 / corrected; - - if (diff < 0) { - *temp += ratio; - final = *temp >> 8; - - if (final >= updated) { - *temp = updated << 8; - final = updated; - } - } else { - *temp -= ratio; - final = *temp >> 8; - - if ((*temp & 0xff) > 0) { - final++; - } - - if (final <= updated) { - *temp = updated << 8; - final = updated; - } - } - } else { - if (diff < 0) { - *temp += fillOffset; - - if (*temp > updated) { - *temp = updated; - } - } else { - *temp -= fillOffset; - - if (*temp < updated) { - *temp = updated; - } - } - - final = *temp; - } - - return final; -} - -static u8 FillCells(s32 max, s32 cur, s32 diff, s32 *temp, u8 *cells, u8 cellNum) -{ - int cell; - u32 offset, pixels, final; - s32 updated = cur - diff; - - if (updated < 0) { - updated = 0; - } else if (updated > max) { - updated = max; - } - - offset = 8 * cellNum; - - for (cell = 0; cell < cellNum; cell++) { - cells[cell] = 0; - } - - if (max < offset) { - pixels = (*temp * offset / max) >> 8; - } else { - pixels = *temp * offset / max; - } - - final = pixels; - - if (pixels == 0 && updated > 0) { - cells[0] = 1; - final = 1; - } else { - for (cell = 0; cell < cellNum; cell++) { - if (pixels >= 8) { - cells[cell] = 8; - pixels -= 8; - } else { - cells[cell] = pixels; - break; - } - } - } - - return final; -} - -/** - * @brief Calculate the number of pixels that will need to be filled to account - * for a change in the current value of a gauge. - * - * @param curVal Current value of the gauge - * @param diff Change to be applied to the current value - * @param maxVal Max value of the gauge - * @param gaugeSize Size of the gauge, in squares of fill - * @return Number of pixels to be filled - */ -static u32 CalcGaugeFill(s32 curVal, s32 diff, s32 maxVal, u8 gaugeSize) -{ - u8 gaugeSizePixels = gaugeSize * 8; // gauges have 8 pixels per "square" of fill - s32 newVal = curVal - diff; - - if (newVal < 0) { - newVal = 0; - } else if (newVal > maxVal) { - newVal = maxVal; - } - - s8 curPixels = curVal * gaugeSizePixels / maxVal; - s8 newPixels = newVal * gaugeSizePixels / maxVal; - - return abs(curPixels - newPixels); -} - -static const u8 *GetHealthbarPartsTile(enum HealthbarPart part) -{ - return &sHealthbarPartsBitmap[part * TILE_SIZE_4BPP]; -} - -u8 Healthbar_Type(int battlerType, u32 battleType) -{ - switch (battlerType) { - case BATTLER_TYPE_SOLO_PLAYER: - if (battleType & BATTLE_TYPE_PAL_PARK) { - return HEALTHBAR_TYPE_PAL_PARK; - } - - if (battleType & BATTLE_TYPE_SAFARI) { - return HEALTHBAR_TYPE_SAFARI_ZONE; - } - - return HEALTHBAR_TYPE_PLAYER_SOLO; - - case BATTLER_TYPE_SOLO_ENEMY: - return HEALTHBAR_TYPE_ENEMY_SOLO; - - case BATTLER_TYPE_PLAYER_SIDE_SLOT_1: - return HEALTHBAR_TYPE_PLAYER_SLOT_1; - - case BATTLER_TYPE_ENEMY_SIDE_SLOT_1: - return HEALTHBAR_TYPE_ENEMY_SLOT_1; - - case BATTLER_TYPE_PLAYER_SIDE_SLOT_2: - return HEALTHBAR_TYPE_PLAYER_SLOT_2; - - case BATTLER_TYPE_ENEMY_SIDE_SLOT_2: - return HEALTHBAR_TYPE_ENEMY_SLOT_2; - - default: - GF_ASSERT(FALSE); - return NULL; - } -} - -/** - * @brief Grab the sprite template that applies to a given healthbar type. - * - * @param type The healthbar type. See enum HealthbarType for accepted values. - * @return Address of the SpriteTemplate struct which applies to this - * healthbar type. - */ -static const SpriteTemplate *Healthbar_SpriteTemplate(u8 type) -{ - switch (type) { - case HEALTHBAR_TYPE_PLAYER_SOLO: - return &sHealthbarTemplate_SoloPlayer; - - case HEALTHBAR_TYPE_ENEMY_SOLO: - return &sHealthbarTemplate_SoloEnemy; - - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - return &sHealthbarTemplate_PlayerSlot1; - - case HEALTHBAR_TYPE_ENEMY_SLOT_1: - return &sHealthbarTemplate_EnemySlot1; - - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - return &sHealthbarTemplate_PlayerSlot2; - - case HEALTHBAR_TYPE_ENEMY_SLOT_2: - return &sHealthbarTemplate_EnemySlot2; - - case HEALTHBAR_TYPE_SAFARI_ZONE: - case HEALTHBAR_TYPE_PAL_PARK: - return &sHealthbarTemplate_NoPlayerMon; - - default: - GF_ASSERT(FALSE); - return NULL; - } -} - -static const SpriteTemplate *ov16_02268314(u8 type) -{ - const SpriteTemplate *spriteTemplate; - - switch (type) { - case HEALTHBAR_TYPE_PLAYER_SOLO: - case HEALTHBAR_TYPE_PLAYER_SLOT_1: - case HEALTHBAR_TYPE_PLAYER_SLOT_2: - case HEALTHBAR_TYPE_SAFARI_ZONE: - case HEALTHBAR_TYPE_PAL_PARK: - spriteTemplate = &sHealthbarTemplate_Unk_ov16_0226F514; - break; - case HEALTHBAR_TYPE_ENEMY_SOLO: - case HEALTHBAR_TYPE_ENEMY_SLOT_1: - case HEALTHBAR_TYPE_ENEMY_SLOT_2: - return NULL; - default: - GF_ASSERT(FALSE); - return NULL; - } - - return spriteTemplate; -} - -void ov16_0226834C(Healthbar *healthbar, u8 *param1) -{ - UnkStruct_ov16_0226834C *v0; - - *param1 = 0; - - v0 = Heap_Alloc(HEAP_ID_BATTLE, sizeof(UnkStruct_ov16_0226834C)); - MI_CpuClear8(v0, sizeof(UnkStruct_ov16_0226834C)); - - v0->healthbar = healthbar; - v0->unk_04 = param1; - - SysTask_Start(ov16_02268380, v0, 1000); -} - -static void ov16_02268380(SysTask *task, void *param1) -{ - UnkStruct_ov16_0226834C *v0 = param1; - SpriteManager *spriteManager = BattleSystem_GetSpriteManager(v0->healthbar->battleSys); - int v2; - PaletteData *paletteData = BattleSystem_GetPaletteData(v0->healthbar->battleSys); - - switch (v0->state) { - case 0: - v2 = SpriteManager_FindPlttResourceOffset(spriteManager, 20007, NNS_G2D_VRAM_TYPE_2DMAIN); - ManagedSprite_SetExplicitPalette(v0->healthbar->mainSprite, v2); - v0->unk_09 = v2; - v0->state++; - case 1: - v0->unk_0A += 2; - - if (v0->unk_0A >= 10) { - v0->unk_0A = 10; - v0->state++; - } - - PaletteData_Blend(paletteData, 2, v0->unk_09 * 16 + 0, 16, v0->unk_0A, 0x73a5); - break; - case 2: - v0->unk_0A -= 2; - - if (v0->unk_0A <= 0) { - v0->unk_0A = 0; - v0->state++; - } - - PaletteData_Blend(paletteData, 2, v0->unk_09 * 16 + 0, 16, v0->unk_0A, 0x73a5); - break; - default: - v2 = SpriteManager_FindPlttResourceOffset(spriteManager, HEALTHBAR_MAIN_PALETTE_RESID, NNS_G2D_VRAM_TYPE_2DMAIN); - ManagedSprite_SetExplicitPalette(v0->healthbar->mainSprite, v2); - - *(v0->unk_04) = 1; - - Heap_Free(param1); - SysTask_Done(task); - - return; - } -} - -void ov16_02268468(Healthbar *healthbar) -{ - return; -} - -void ov16_0226846C(Healthbar *healthbar) -{ - return; -} - -void ov16_02268470(Healthbar *healthbar) -{ - if (healthbar->task_50 != NULL) { - return; - } - - healthbar->degrees = 0; - healthbar->task_50 = SysTask_Start(ov16_022684BC, healthbar, 1010); -} - -void ov16_02268498(Healthbar *healthbar) -{ - if (healthbar->task_50 != NULL) { - SysTask_Done(healthbar->task_50); - healthbar->task_50 = NULL; - } - - healthbar->degrees = 0; - Healthbar_OffsetPositionXY(healthbar, 0, 0); -} - -static void ov16_022684BC(SysTask *task, void *data) -{ - Healthbar *healthbar = data; - int y; - - healthbar->degrees += 20; - - if (healthbar->degrees >= 360) { - healthbar->degrees -= 360; - } - - y = FX_Mul(CalcSineDegrees(healthbar->degrees), 0x1800) / FX32_ONE; - Healthbar_OffsetPositionXY(healthbar, 0, y); -} diff --git a/src/battle/healthbox.c b/src/battle/healthbox.c new file mode 100644 index 0000000000..e1e1e3fd2e --- /dev/null +++ b/src/battle/healthbox.c @@ -0,0 +1,1842 @@ +#include "battle/healthbox.h" + +#include +#include +#include + +#include "constants/graphics.h" +#include "constants/heap.h" +#include "constants/pokemon.h" +#include "generated/string_padding_mode.h" + +#include "battle/battle_system.h" +#include "graphics/battle/sprites.naix" + +#include "assert.h" +#include "bg_window.h" +#include "font_special_chars.h" +#include "heap.h" +#include "math_util.h" +#include "message.h" +#include "narc.h" +#include "palette.h" +#include "pokemon.h" +#include "sprite.h" +#include "sprite_resource.h" +#include "sprite_system.h" +#include "string_gf.h" +#include "string_template.h" +#include "sys_task.h" +#include "sys_task_manager.h" +#include "text.h" +#include "unk_0208C098.h" + +#include "res/text/bank/battle_strings.h" + +#define HEALTHBOX_SCROLL_SPEED 24 +#define HEALTHBOX_SCROLL_OUT_OFFSET 160 + +#define HEALTHBOX_X_OFFSET_SOLO_PLAYER 192 +#define HEALTHBOX_Y_OFFSET_SOLO_PLAYER 116 +#define HEALTHBOX_X_OFFSET_SOLO_ENEMY 58 +#define HEALTHBOX_Y_OFFSET_SOLO_ENEMY 36 +#define HEALTHBOX_X_OFFSET_PLAYER_SLOT_1 HEALTHBOX_X_OFFSET_SOLO_PLAYER +#define HEALTHBOX_Y_OFFSET_PLAYER_SLOT_1 HEALTHBOX_Y_OFFSET_SOLO_PLAYER - 13 +#define HEALTHBOX_X_OFFSET_PLAYER_SLOT_2 HEALTHBOX_X_OFFSET_SOLO_PLAYER + 6 +#define HEALTHBOX_Y_OFFSET_PLAYER_SLOT_2 HEALTHBOX_Y_OFFSET_SOLO_PLAYER + 16 +#define HEALTHBOX_X_OFFSET_ENEMY_SLOT_1 HEALTHBOX_X_OFFSET_SOLO_ENEMY + 6 +#define HEALTHBOX_Y_OFFSET_ENEMY_SLOT_1 HEALTHBOX_Y_OFFSET_SOLO_ENEMY - 20 +#define HEALTHBOX_X_OFFSET_ENEMY_SLOT_2 HEALTHBOX_X_OFFSET_SOLO_ENEMY +#define HEALTHBOX_Y_OFFSET_ENEMY_SLOT_2 HEALTHBOX_Y_OFFSET_SOLO_ENEMY + 9 + +#define HEALTHBOX_WINDOW_BLOCK_SIZE 32 + +#define HEALTHBOX_NAME_BLOCK_COUNT_X 8 +#define HEALTHBOX_NAME_BLOCK_COUNT_Y 2 +#define HEALTHBOX_NAME_WINDOW_OFFSET 0 +#define HEALTHBOX_NAME_BYTE_SIZE (HEALTHBOX_NAME_BLOCK_COUNT_X * HEALTHBOX_NAME_BLOCK_COUNT_Y * HEALTHBOX_WINDOW_BLOCK_SIZE) +#define HEALTHBOX_NAME_BACKGROUND_COLOR 0xF +#define HEALTHBOX_NAME_TEXT_COLOR TEXT_COLOR(14, 2, HEALTHBOX_NAME_BACKGROUND_COLOR) + +#define HEALTHBOX_HP_CELL_COUNT 6 +#define HEALTHBOX_EXP_CELL_COUNT 12 + +#define VRAM_TRANSFER_DST(vram, transferTable, index_0, index_1, imgProxy) ( \ + (void *)((u32)vram + transferTable[index_0][index_1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN])) + +#define S32_MIN -2147483648 + +typedef struct VRAMTransfer { + u16 pos; + u16 size; +} VRAMTransfer; + +typedef struct { + HealthBox *healthbox; + u8 *unk_04; + u8 state; + u8 unk_09; + s8 unk_0A; +} UnkStruct_ov16_0226834C; + +enum HealthBoxPart { + HEALTHBOX_PART_HP_H = 0, + HEALTHBOX_PART_HP_P, + HEALTHBOX_PART_HP_GREEN_FILL_0, + HEALTHBOX_PART_HP_GREEN_FILL_1, + HEALTHBOX_PART_HP_GREEN_FILL_2, + HEALTHBOX_PART_HP_GREEN_FILL_3, + HEALTHBOX_PART_HP_GREEN_FILL_4, + HEALTHBOX_PART_HP_GREEN_FILL_5, + HEALTHBOX_PART_HP_GREEN_FILL_6, + HEALTHBOX_PART_HP_GREEN_FILL_7, + HEALTHBOX_PART_HP_GREEN_FILL_8, + HEALTHBOX_PART_HP_YELLOW_FILL_0, + HEALTHBOX_PART_HP_YELLOW_FILL_1, + HEALTHBOX_PART_HP_YELLOW_FILL_2, + HEALTHBOX_PART_HP_YELLOW_FILL_3, + HEALTHBOX_PART_HP_YELLOW_FILL_4, + HEALTHBOX_PART_HP_YELLOW_FILL_5, + HEALTHBOX_PART_HP_YELLOW_FILL_6, + HEALTHBOX_PART_HP_YELLOW_FILL_7, + HEALTHBOX_PART_HP_YELLOW_FILL_8, + HEALTHBOX_PART_HP_RED_FILL_0, + HEALTHBOX_PART_HP_RED_FILL_1, + HEALTHBOX_PART_HP_RED_FILL_2, + HEALTHBOX_PART_HP_RED_FILL_3, + HEALTHBOX_PART_HP_RED_FILL_4, + HEALTHBOX_PART_HP_RED_FILL_5, + HEALTHBOX_PART_HP_RED_FILL_6, + HEALTHBOX_PART_HP_RED_FILL_7, + HEALTHBOX_PART_HP_RED_FILL_8, + HEALTHBOX_PART_EXP_FILL_0, + HEALTHBOX_PART_EXP_FILL_1, + HEALTHBOX_PART_EXP_FILL_2, + HEALTHBOX_PART_EXP_FILL_3, + HEALTHBOX_PART_EXP_FILL_4, + HEALTHBOX_PART_EXP_FILL_5, + HEALTHBOX_PART_EXP_FILL_6, + HEALTHBOX_PART_EXP_FILL_7, + HEALTHBOX_PART_EXP_FILL_8, + HEALTHBOX_PART_STATUS_HEALTHY_0, + HEALTHBOX_PART_STATUS_HEALTHY_1, + HEALTHBOX_PART_STATUS_HEALTHY_2, + HEALTHBOX_PART_STATUS_PARALYSIS_0, + HEALTHBOX_PART_STATUS_PARALYSIS_1, + HEALTHBOX_PART_STATUS_PARALYSIS_2, + HEALTHBOX_PART_STATUS_FREEZE_0, + HEALTHBOX_PART_STATUS_FREEZE_1, + HEALTHBOX_PART_STATUS_FREEZE_2, + HEALTHBOX_PART_STATUS_SLEEP_0, + HEALTHBOX_PART_STATUS_SLEEP_1, + HEALTHBOX_PART_STATUS_SLEEP_2, + HEALTHBOX_PART_STATUS_POISON_0, + HEALTHBOX_PART_STATUS_POISON_1, + HEALTHBOX_PART_STATUS_POISON_2, + HEALTHBOX_PART_STATUS_BURN_0, + HEALTHBOX_PART_STATUS_BURN_1, + HEALTHBOX_PART_STATUS_BURN_2, + HEALTHBOX_PART_EMPTY_0, + HEALTHBOX_PART_EMPTY_1, + HEALTHBOX_PART_EMPTY_2, + HEALTHBOX_PART_CAUGHT_INDICATOR, + HEALTHBOX_PART_LEVEL_FEMALE_TOP_0, + HEALTHBOX_PART_LEVEL_FEMALE_TOP_1, + HEALTHBOX_PART_LEVEL_MALE_TOP_0, + HEALTHBOX_PART_LEVEL_MALE_TOP_1, + HEALTHBOX_PART_LEVEL_GENDERLESS_TOP_0, + HEALTHBOX_PART_LEVEL_GENDERLESS_TOP_1, + HEALTHBOX_PART_HP_H_2, + HEALTHBOX_PART_HP_P_2, + HEALTHBOX_PART_BAR_END, + HEALTHBOX_PART_SLASH, + HEALTHBOX_PART_NUMBERS_LEFT, + HEALTHBOX_PART_NUMBERS_RIGHT, + HEALTHBOX_PART_LEVEL_FEMALE_BOTTOM_0, + HEALTHBOX_PART_LEVEL_FEMALE_BOTTOM_1, + HEALTHBOX_PART_LEVEL_MALE_BOTTOM_0, + HEALTHBOX_PART_LEVEL_MALE_BOTTOM_1, + HEALTHBOX_PART_LEVEL_GENDERLESS_BOTTOM_0, + HEALTHBOX_PART_LEVEL_GENDERLESS_BOTTOM_1, +}; + +static s32 HealthBox_DrawGauge(HealthBox *healthbox, enum HealthBoxGaugeType gaugeType); +static s32 UpdateGauge(s32 max, s32 cur, s32 diff, s32 *temp, u8 size, u16 fillOffset); +static u8 FillCells(s32 max, s32 cur, s32 diff, s32 *temp, u8 *cells, u8 cellNum); +static u32 CalcGaugeFill(s32 curVal, s32 diff, s32 maxVal, u8 gaugeSize); +static const u8 *GetHealthBoxPartsTile(enum HealthBoxPart part); +static void DrawGauge(HealthBox *healthbox, u8 gaugeType); +static void HealthBox_DrawBattlerName(HealthBox *healthbox); +static void HealthBox_DrawLevelText(HealthBox *healthbox); +static void HealthBox_DrawLevelNumber(HealthBox *healthbox); +static void HealthBox_DrawCurrentHP(HealthBox *healthbox, u32 hp); +static void HealthBox_DrawMaxHP(HealthBox *healthbox); +static void HealthBox_DrawCaughtIcon(HealthBox *healthbox); +static void HealthBox_DrawStatusIcon(HealthBox *healthbox, enum HealthBoxPart part); +static void HealthBox_DrawBallCount(HealthBox *healthbox, u32 flags); +static void HealthBox_DrawBallsLeftMessage(HealthBox *healthbox, u32 flags); +static void HealthBox_LoadMainPalette(SpriteSystem *spriteSys, SpriteManager *handler, NARC *narc, PaletteData *palette, int type); +static void ov16_02267244(HealthBox *healthbox); +static void ov16_0226728C(HealthBox *healthbox); +static const SpriteTemplate *HealthBox_SpriteTemplate(u8 type); +static const SpriteTemplate *ov16_02268314(u8 type); +static void ScrollHealthBoxTask(SysTask *task, void *data); +static void ov16_02268380(SysTask *task, void *param1); +void ov16_02268470(HealthBox *healthbox); +void ov16_02268498(HealthBox *healthbox); +static void ov16_022684BC(SysTask *task, void *data); +static void HealthBox_EnableArrow(HealthBox *healthbox, BOOL enable); + +ALIGN_4 static const s8 sArrowOffsetX[] = { + [HEALTHBOX_TYPE_PLAYER_SOLO] = 72, + [HEALTHBOX_TYPE_ENEMY_SOLO] = 0, + [HEALTHBOX_TYPE_PLAYER_SLOT_1] = 72, + [HEALTHBOX_TYPE_ENEMY_SLOT_1] = 0, + [HEALTHBOX_TYPE_PLAYER_SLOT_2] = 72, + [HEALTHBOX_TYPE_ENEMY_SLOT_2] = 0, +}; + +static const VRAMTransfer sBattlerNameVRAMTransfer[][4] = { + [HEALTHBOX_TYPE_PLAYER_SOLO] = { + { 19 * HEALTHBOX_WINDOW_BLOCK_SIZE, 5 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 27 * HEALTHBOX_WINDOW_BLOCK_SIZE, 5 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 3 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 3 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, + [HEALTHBOX_TYPE_ENEMY_SOLO] = { + { 17 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 25 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, + [HEALTHBOX_TYPE_PLAYER_SLOT_1] = { + { 18 * HEALTHBOX_WINDOW_BLOCK_SIZE, 6 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 26 * HEALTHBOX_WINDOW_BLOCK_SIZE, 6 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 2 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 2 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, + [HEALTHBOX_TYPE_ENEMY_SLOT_1] = { + { 17 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 25 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, + [HEALTHBOX_TYPE_PLAYER_SLOT_2] = { + { 18 * HEALTHBOX_WINDOW_BLOCK_SIZE, 6 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 26 * HEALTHBOX_WINDOW_BLOCK_SIZE, 6 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 2 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 2 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, + [HEALTHBOX_TYPE_ENEMY_SLOT_2] = { + { 17 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 25 * HEALTHBOX_WINDOW_BLOCK_SIZE, 7 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 80 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 88 * HEALTHBOX_WINDOW_BLOCK_SIZE, 1 * HEALTHBOX_WINDOW_BLOCK_SIZE }, + }, +}; + +static const VRAMTransfer Unk_ov16_0226F47C[][2] = { + { + { 0xA60, 0x40 }, + { 0xB60, 0x40 }, + }, + { + { 0xA20, 0x40 }, + { 0xB20, 0x40 }, + }, + { + { 0xA40, 0x40 }, + { 0xB40, 0x40 }, + }, + { + { 0xA20, 0x40 }, + { 0xB20, 0x40 }, + }, + { + { 0xA40, 0x40 }, + { 0xB40, 0x40 }, + }, + { + { 0xA20, 0x40 }, + { 0xB20, 0x40 }, + }, +}; + +static const VRAMTransfer Unk_ov16_0226F3EC[][2] = { + { + { 0xAA0, 0x60 }, + { 0xBA0, 0x60 }, + }, + { + { 0xA60, 0x60 }, + { 0xB60, 0x60 }, + }, + { + { 0xA80, 0x60 }, + { 0xB80, 0x60 }, + }, + { + { 0xA60, 0x60 }, + { 0xB60, 0x60 }, + }, + { + { 0xA80, 0x60 }, + { 0xB80, 0x60 }, + }, + { + { 0xA60, 0x60 }, + { 0xB60, 0x60 }, + }, +}; + +static const VRAMTransfer Unk_ov16_0226F41C[][2] = { + { + { 0x0, 0x0 }, + { 0xD00, 0x60 }, + }, + { + { 0x620, 0x60 }, + { 0x0, 0x0 }, + }, + { + { 0x0, 0x0 }, + { 0xC00, 0x60 }, + }, + { + { 0x620, 0x60 }, + { 0x0, 0x0 }, + }, + { + { 0x0, 0x0 }, + { 0xC00, 0x60 }, + }, + { + { 0x620, 0x60 }, + { 0x0, 0x0 }, + }, +}; + +static const VRAMTransfer Unk_ov16_0226F3BC[] = { + { 0xD80, 0x60 }, + { 0x6A0, 0x60 }, + { 0xC80, 0x60 }, + { 0x6A0, 0x60 }, + { 0xC80, 0x60 }, + { 0x6A0, 0x60 }, +}; + +static const VRAMTransfer Unk_ov16_0226F44C[][2] = { + { + { 0x4E0, 0x0 }, + { 0xC20, 0xC0 }, + }, + { + { 0x4E0, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0xC00, 0xA0 }, + }, + { + { 0x4E0, 0x0 }, + { 0xC00, 0xC0 }, + }, + { + { 0x4E0, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0xC00, 0xA0 }, + }, + { + { 0x4E0, 0x0 }, + { 0xC00, 0xC0 }, + }, + { + { 0x4E0, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0xC00, 0xA0 }, + }, +}; + +static const VRAMTransfer Unk_ov16_0226F38C[] = { + { 0x460, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x420, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x440, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x420, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x440, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x420, HEALTHBOX_WINDOW_BLOCK_SIZE }, +}; + +static const VRAMTransfer Unk_ov16_0226F35C[] = { + { 0x480, 0x60 }, + { 0x440, 0x60 }, + { 0x460, 0x60 }, + { 0x440, 0x60 }, + { 0x460, 0x60 }, + { 0x440, 0x60 }, +}; + +static const VRAMTransfer Unk_ov16_0226F33C[4] = { + { 0x240, 0xC0 }, + { 0x340, 0xC0 }, + { 0xA00, 0xE0 }, + { 0xB00, 0xE0 }, +}; + +static const VRAMTransfer Unk_ov16_0226F34C[4] = { + { 0x440, 0xC0 }, + { 0x540, 0xC0 }, + { 0xC00, 0xE0 }, + { 0xD00, 0xE0 }, +}; + +static const VRAMTransfer Unk_ov16_0226F374[] = { + { 0x0, 0x0 }, + { 0x0, 0x0 }, + { 0x4C0, 0x40 }, + { 0x0, 0x0 }, + { 0x4C0, 0x40 }, + { 0x0, 0x0 }, +}; + +static const VRAMTransfer Unk_ov16_0226F3A4[] = { + { 0x0, 0x0 }, + { 0x0, 0x0 }, + { 0xCC0, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x0, 0x0 }, + { 0xCC0, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x0, 0x0 }, +}; + +static const VRAMTransfer Unk_ov16_0226F3D4[] = { + { 0x0, 0x0 }, + { 0x0, 0x0 }, + { 0xC60, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x0, 0x0 }, + { 0xC60, HEALTHBOX_WINDOW_BLOCK_SIZE }, + { 0x0, 0x0 }, +}; + +#define HEALTHBOX_MAIN_PALETTE_RESID 20006 +#define HEALTHBOX_EFFECTS_PALETTE_RESID 20007 +#define HEALTHBOX_SAFARI_PALETTE_RESID 20008 + +static const SpriteTemplate sHealthBoxTemplate_SoloPlayer = { + .x = HEALTHBOX_X_OFFSET_SOLO_PLAYER, + .y = HEALTHBOX_Y_OFFSET_SOLO_PLAYER, + .z = 0, + .animIdx = 0, + .priority = 23, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_player_singles_NCGR_lz, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_tall_cell_NCER_lz, + misc_single_frame_anim_NANR_lz_6, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_SoloEnemy = { + .x = HEALTHBOX_X_OFFSET_SOLO_ENEMY, + .y = HEALTHBOX_Y_OFFSET_SOLO_ENEMY, + .z = 0, + .animIdx = 0, + .priority = 24, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_enemy_NCGR_lz, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_short_cell_NCER_lz, + misc_single_frame_anim_NANR_lz_5, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_PlayerSlot1 = { + .x = HEALTHBOX_X_OFFSET_PLAYER_SLOT_1, + .y = HEALTHBOX_Y_OFFSET_PLAYER_SLOT_1, + .z = 0, + .animIdx = 0, + .priority = 28, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_player_doubles_NCGR_lz, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_short_cell_NCER_lz_3, + misc_single_frame_anim_NANR_lz_9, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_EnemySlot1 = { + .x = HEALTHBOX_X_OFFSET_ENEMY_SLOT_1, + .y = HEALTHBOX_Y_OFFSET_ENEMY_SLOT_1, + .z = 0, + .animIdx = 0, + .priority = 25, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_enemy_NCGR_lz_1, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_short_cell_NCER_lz_1, + misc_single_frame_anim_NANR_lz_7, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_PlayerSlot2 = { + .x = HEALTHBOX_X_OFFSET_PLAYER_SLOT_2, + .y = HEALTHBOX_Y_OFFSET_PLAYER_SLOT_2, + .z = 0, + .animIdx = 0, + .priority = 26, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_player_doubles_NCGR_lz_1, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_short_cell_NCER_lz_4, + misc_single_frame_anim_NANR_lz_10, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_EnemySlot2 = { + .x = HEALTHBOX_X_OFFSET_ENEMY_SLOT_2, + .y = HEALTHBOX_Y_OFFSET_ENEMY_SLOT_2, + .z = 0, + .animIdx = 0, + .priority = 27, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_enemy_NCGR_lz_2, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_short_cell_NCER_lz_2, + misc_single_frame_anim_NANR_lz_8, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +static const SpriteTemplate sHealthBoxTemplate_Unk_ov16_0226F514 = { + .x = 0, + .y = 0, + .z = 0, + .animIdx = 0, + .priority = 17, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_arrows_wide_NCGR_lz, + HEALTHBOX_MAIN_PALETTE_RESID, + healthbox_arrows_wide_cell_NCER_lz, + healthbox_arrows_wide_anim_NANR_lz, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE +}; + +static const SpriteTemplate sHealthBoxTemplate_NoPlayerMon = { + .x = HEALTHBOX_X_OFFSET_SOLO_PLAYER, + .y = HEALTHBOX_Y_OFFSET_SOLO_PLAYER, + .z = 0, + .animIdx = 0, + .priority = 23, + .plttIdx = 0, + .vramType = NNS_G2D_VRAM_TYPE_2DMAIN, + .resources = { + healthbox_safari_NCGR_lz, + HEALTHBOX_SAFARI_PALETTE_RESID, + healthbox_safari_cell_NCER_lz, + misc_single_frame_anim_NANR_lz_15, + SPRITE_RESOURCE_NONE, + SPRITE_RESOURCE_NONE, + }, + .bgPriority = 0, + .vramTransfer = FALSE, +}; + +#include "res/graphics/battle/healthbox/healthbox_parts.4bpp.h" + +void HealthBox_LoadResources(SpriteSystem *spriteSys, SpriteManager *spriteMan, NARC *narc, PaletteData *palette, enum HealthBoxType healthboxType) +{ + const SpriteTemplate *template = HealthBox_SpriteTemplate(healthboxType); + + SpriteSystem_LoadCharResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_CHAR], TRUE, NNS_G2D_VRAM_TYPE_2DMAIN, template->resources[SPRITE_RESOURCE_CHAR]); + SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBOX_MAIN_PALETTE_RESID); + SpriteSystem_LoadCellResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_CELL], TRUE, template->resources[SPRITE_RESOURCE_CELL]); + SpriteSystem_LoadAnimResObjFromOpenNarc(spriteSys, spriteMan, narc, template->resources[SPRITE_RESOURCE_ANIM], TRUE, template->resources[SPRITE_RESOURCE_ANIM]); + SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBOX_EFFECTS_PALETTE_RESID); + + if (healthboxType == HEALTHBOX_TYPE_SAFARI_ZONE || healthboxType == HEALTHBOX_TYPE_PAL_PARK) { + SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, spriteMan, narc, healthbox_safari_NCLR, 0, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBOX_SAFARI_PALETTE_RESID); + } +} + +static void HealthBox_LoadMainPalette(SpriteSystem *spriteSys, SpriteManager *handler, NARC *narc, PaletteData *palette, int type) +{ + const SpriteTemplate *template = ov16_02268314(type); + + if (template != NULL) { + SpriteSystem_LoadCharResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_CHAR], TRUE, NNS_G2D_VRAM_TYPE_2DMAIN, template->resources[SPRITE_RESOURCE_CHAR]); + SpriteSystem_LoadPaletteBufferFromOpenNarc(palette, PLTTBUF_MAIN_OBJ, spriteSys, handler, narc, healthbox_primary_NCLR, FALSE, 1, NNS_G2D_VRAM_TYPE_2DMAIN, HEALTHBOX_MAIN_PALETTE_RESID); + SpriteSystem_LoadCellResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_CELL], TRUE, template->resources[SPRITE_RESOURCE_CELL]); + SpriteSystem_LoadAnimResObjFromOpenNarc(spriteSys, handler, narc, template->resources[SPRITE_RESOURCE_ANIM], TRUE, template->resources[SPRITE_RESOURCE_ANIM]); + } +} + +ManagedSprite *HealthBox_DrawSprite(SpriteSystem *spriteSys, SpriteManager *handler, int type) +{ + const SpriteTemplate *template = HealthBox_SpriteTemplate(type); + ManagedSprite *managedSprite = SpriteSystem_NewSprite(spriteSys, handler, template); + + Sprite_TickFrame(managedSprite->sprite); + return managedSprite; +} + +void HealthBox_DrawInfo(HealthBox *healthbox, u32 hp, u32 flags) +{ + BOOL caughtSpecies = FALSE; + + GF_ASSERT(healthbox->mainSprite != NULL); + + u32 flagsCopy = flags; + + if (healthbox->type == HEALTHBOX_TYPE_SAFARI_ZONE) { + flags &= HEALTHBOX_INFO_ALL_SAFARI; + } else if (healthbox->type == HEALTHBOX_TYPE_PAL_PARK) { + flags &= HEALTHBOX_INFO_ALL_PARK; + } else { + flags &= ~(HEALTHBOX_INFO_ALL_SAFARI | HEALTHBOX_INFO_ALL_PARK); + } + + switch (healthbox->type) { + case HEALTHBOX_TYPE_ENEMY_SOLO: + case HEALTHBOX_TYPE_ENEMY_SLOT_1: + case HEALTHBOX_TYPE_ENEMY_SLOT_2: + // Never display current HP, max HP, or the EXP bar on an enemy healthbox + flags &= ~HEALTHBOX_INFO_NOT_ON_ENEMY; + caughtSpecies = TRUE; + break; + + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + // Never display the EXP bar in doubles + flags &= ~(HEALTHBOX_INFO_EXP_GAUGE | HEALTHBOX_INFO_CAUGHT_SPECIES); + + // Allow toggling between showing the HP bar and raw current/max numbers + if (healthbox->numberMode == FALSE) { + flags &= ~(HEALTHBOX_INFO_CURRENT_HP | HEALTHBOX_INFO_MAX_HP); + } else { + flags &= ~HEALTHBOX_INFO_HP_GAUGE; + } + break; + + case HEALTHBOX_TYPE_PLAYER_SOLO: + // Never show the pokeball icon on a player's healthbox for a captured species + flags &= ~HEALTHBOX_INFO_CAUGHT_SPECIES; + break; + + case HEALTHBOX_TYPE_SAFARI_ZONE: + case HEALTHBOX_TYPE_PAL_PARK: + break; + } + + if (BattleSystem_GetBattleType(healthbox->battleSys) & BATTLE_TYPE_TRAINER) { + // Never show the pokeball icon on an enemy trainer's healthbox + flags &= ~HEALTHBOX_INFO_CAUGHT_SPECIES; + } + + if (flags & HEALTHBOX_INFO_HP_GAUGE) { + HealthBox_CalcHP(healthbox, 0); + HealthBox_DrawGauge(healthbox, HEALTHBOX_GAUGE_HP); + } + + if (flags & HEALTHBOX_INFO_CURRENT_HP) { + HealthBox_DrawCurrentHP(healthbox, hp); + } + + if (flags & HEALTHBOX_INFO_MAX_HP) { + HealthBox_DrawMaxHP(healthbox); + } + + if ((flags & HEALTHBOX_INFO_LEVEL_TEXT) || (flags & HEALTHBOX_INFO_GENDER)) { + HealthBox_DrawLevelText(healthbox); + } + + if (flags & HEALTHBOX_INFO_LEVEL) { + HealthBox_DrawLevelNumber(healthbox); + } + + if (flags & HEALTHBOX_INFO_NAME) { + HealthBox_DrawBattlerName(healthbox); + } + + if (flags & HEALTHBOX_INFO_EXP_GAUGE) { + HealthBox_CalcExp(healthbox, 0); + HealthBox_DrawGauge(healthbox, HEALTHBOX_GAUGE_EXP); + } + + if (flags & HEALTHBOX_INFO_CAUGHT_SPECIES) { + HealthBox_DrawCaughtIcon(healthbox); + } + + if (flags & HEALTHBOX_INFO_STATUS) { + switch (healthbox->status) { + default: + case BATTLE_ANIMATION_NONE: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_HEALTHY_0); + break; + case BATTLE_ANIMATION_ASLEEP: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_SLEEP_0); + break; + case BATTLE_ANIMATION_POISONED: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_POISON_0); + break; + case BATTLE_ANIMATION_BURNED: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_BURN_0); + break; + case BATTLE_ANIMATION_FROZEN: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_FREEZE_0); + break; + case BATTLE_ANIMATION_PARALYZED: + HealthBox_DrawStatusIcon(healthbox, HEALTHBOX_PART_STATUS_PARALYSIS_0); + break; + } + } + + if (flags & (HEALTHBOX_INFO_COUNT_SAFARI_BALLS | HEALTHBOX_INFO_COUNT_PARK_BALLS)) { + HealthBox_DrawBallCount(healthbox, flags); + } + + if (flags & (HEALTHBOX_INFO_REMAINING_SAFARI_BALLS | HEALTHBOX_INFO_REMAINING_PARK_BALLS)) { + HealthBox_DrawBallsLeftMessage(healthbox, flags); + } +} + +void ov16_02267220(HealthBox *healthbox) +{ + if (healthbox->task_50 != NULL) { + SysTask_Done(healthbox->task_50); + healthbox->task_50 = NULL; + } + + if (healthbox->mainSprite == NULL) { + return; + } + + Sprite_DeleteAndFreeResources(healthbox->mainSprite); + healthbox->mainSprite = NULL; +} + +static void ov16_02267244(HealthBox *healthbox) +{ + if (healthbox->arrowSprite == NULL) { + return; + } + + Sprite_DeleteAndFreeResources(healthbox->arrowSprite); + healthbox->arrowSprite = NULL; +} + +void ov16_02267258(HealthBox *healthbox) +{ + SpriteSystem *spriteSystem; + SpriteManager *spriteManager; + const SpriteTemplate *spriteTemplate = HealthBox_SpriteTemplate(healthbox->type); + spriteSystem = BattleSystem_GetSpriteSystem(healthbox->battleSys); + spriteManager = BattleSystem_GetSpriteManager(healthbox->battleSys); + + SpriteManager_UnloadCharObjById(spriteManager, spriteTemplate->resources[0]); + SpriteManager_UnloadCellObjById(spriteManager, spriteTemplate->resources[2]); + SpriteManager_UnloadAnimObjById(spriteManager, spriteTemplate->resources[3]); +} + +static void ov16_0226728C(HealthBox *healthbox) +{ + SpriteSystem *spriteSystem; + SpriteManager *spriteManager; + const SpriteTemplate *spriteTemplate = ov16_02268314(healthbox->type); + + if (spriteTemplate == NULL) { + return; + } + + spriteSystem = BattleSystem_GetSpriteSystem(healthbox->battleSys); + spriteManager = BattleSystem_GetSpriteManager(healthbox->battleSys); + + SpriteManager_UnloadCharObjById(spriteManager, spriteTemplate->resources[0]); + SpriteManager_UnloadCellObjById(spriteManager, spriteTemplate->resources[2]); + SpriteManager_UnloadAnimObjById(spriteManager, spriteTemplate->resources[3]); +} + +void ov16_022672C4(HealthBox *healthbox) +{ + NARC *narc = NARC_ctor(NARC_INDEX_BATTLE__GRAPHIC__PL_BATT_OBJ, HEAP_ID_BATTLE); + SpriteSystem *spriteSystem = BattleSystem_GetSpriteSystem(healthbox->battleSys); + SpriteManager *spriteManager = BattleSystem_GetSpriteManager(healthbox->battleSys); + PaletteData *paletteData = BattleSystem_GetPaletteData(healthbox->battleSys); + const SpriteTemplate *spriteTemplate = HealthBox_SpriteTemplate(healthbox->type); + + HealthBox_LoadResources(spriteSystem, spriteManager, narc, paletteData, healthbox->type); + healthbox->mainSprite = HealthBox_DrawSprite(spriteSystem, spriteManager, healthbox->type); + + HealthBox_LoadMainPalette(spriteSystem, spriteManager, narc, paletteData, healthbox->type); + + if (healthbox->arrowSprite != NULL) { + Sprite_SetPositionXY(healthbox->arrowSprite->sprite, spriteTemplate->x - sArrowOffsetX[healthbox->type], spriteTemplate->y + 0); + } + + NARC_dtor(narc); +} + +void ov16_02267360(HealthBox *healthbox) +{ + ov16_02267220(healthbox); + ov16_02267258(healthbox); + ov16_02267244(healthbox); + ov16_0226728C(healthbox); +} + +void ov16_0226737C(HealthBox *healthbox) +{ + const u8 *tileNum; + NNSG2dImageProxy *imgProxy; + void *v2; + + switch (healthbox->type) { + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + break; + default: + return; + } + + healthbox->numberMode ^= 1; + + v2 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + + if (healthbox->numberMode == 1) { + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_NUMBERS_LEFT); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F374[healthbox->type].pos + HEALTHBOX_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_NUMBERS_RIGHT); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbox->type].pos + HEALTHBOX_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_SLASH); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3D4[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3D4[healthbox->type].size); + + HealthBox_DrawInfo(healthbox, healthbox->curHP, HEALTHBOX_INFO_CURRENT_HP | HEALTHBOX_INFO_MAX_HP); + } else { + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_HP_H_2); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F374[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F374[healthbox->type].size); + + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_BAR_END); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3A4[healthbox->type].size); + + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_STATUS_HEALTHY_0); + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F3A4[healthbox->type].pos + HEALTHBOX_WINDOW_BLOCK_SIZE + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + + HealthBox_DrawInfo(healthbox, healthbox->curHP, HEALTHBOX_INFO_HP_GAUGE); + } +} + +void HealthBox_CalcHP(HealthBox *healthbox, int damage) // TODO: all calls pass in damage from healthbox, pls fix. +{ + healthbox->hpTemp = S32_MIN; + + // bound the damage input to [0, maxHP] + if (healthbox->curHP + damage < 0) { + damage -= healthbox->curHP + damage; + } + if (healthbox->curHP + damage > healthbox->maxHP) { + damage -= (healthbox->curHP + damage) - healthbox->maxHP; + } + + // update cached values + healthbox->damage = -damage; + + if (healthbox->curHP < 0) { + healthbox->curHP = 0; + } + + if (healthbox->curHP > healthbox->maxHP) { + healthbox->curHP = healthbox->maxHP; + } +} + +s32 ov16_022674F8(HealthBox *healthbox) +{ + s32 result = HealthBox_DrawGauge(healthbox, HEALTHBOX_GAUGE_HP); + + if (result == -1) { + healthbox->curHP -= healthbox->damage; + HealthBox_DrawInfo(healthbox, healthbox->curHP, HEALTHBOX_INFO_CURRENT_HP); + } else { + HealthBox_DrawInfo(healthbox, result, HEALTHBOX_INFO_CURRENT_HP); + } + + return result; +} + +void HealthBox_CalcExp(HealthBox *healthbox, int expReward) +{ + healthbox->expTemp = S32_MIN; + + if (healthbox->curExp + expReward < 0) { + expReward -= healthbox->curExp + expReward; + } + + if (healthbox->curExp + expReward > healthbox->maxExp) { + expReward -= (healthbox->curExp + expReward) - healthbox->maxExp; + } + + healthbox->expReward = -expReward; + + if (healthbox->curExp < 0) { + healthbox->curExp = 0; + } + + if (healthbox->curExp > healthbox->maxExp) { + healthbox->curExp = healthbox->maxExp; + } +} + +s32 ov16_02267560(HealthBox *healthbox) +{ + s32 result = HealthBox_DrawGauge(healthbox, HEALTHBOX_GAUGE_EXP); + + if (result == -1) { + healthbox->curExp -= healthbox->expReward; + } + + return result; +} + +void ov16_0226757C(HealthBox *healthbox) +{ + if (healthbox->arrowSprite != NULL) { + Sprite_SetAnimateFlag(healthbox->arrowSprite->sprite, TRUE); + HealthBox_EnableArrow(healthbox, TRUE); + } + + if ((BattleSystem_GetBattleType(healthbox->battleSys) & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_PAL_PARK)) == FALSE) { + ov16_02268470(healthbox); + } +} + +void ov16_022675AC(HealthBox *healthbox) +{ + if (healthbox->arrowSprite != NULL) { + Sprite_SetAnimateFlag(healthbox->arrowSprite->sprite, FALSE); + Sprite_SetAnimFrame(healthbox->arrowSprite->sprite, 0); + HealthBox_EnableArrow(healthbox, FALSE); + } + + ov16_02268498(healthbox); +} + +void ov16_022675D8(HealthBox *healthbox, int priority) +{ + if (healthbox->mainSprite == NULL) { + return; + } + + ManagedSprite_SetExplicitPriority(healthbox->mainSprite, priority); + + if (healthbox->arrowSprite != NULL) { + ManagedSprite_SetExplicitPriority(healthbox->arrowSprite, priority); + } +} + +/** + * @brief Enable the extended arrow-graphic used by the healthbox for Pokemon battlers. + * + * @param battleSys + * @param enable + */ +static void HealthBox_EnableArrow(HealthBox *battleSys, BOOL enable) +{ + if (battleSys->arrowSprite == NULL) { + return; + } + + // Safari battles don't get an arrow. + if ((BattleSystem_GetBattleType(battleSys->battleSys) & (BATTLE_TYPE_SAFARI | BATTLE_TYPE_PAL_PARK)) + && enable == TRUE) { + return; + } + + ManagedSprite_SetDrawFlag(battleSys->arrowSprite, enable); +} + +void HealthBox_Enable(HealthBox *battleSys, BOOL enable) +{ + if (battleSys->mainSprite == NULL) { + return; + } + + ManagedSprite_SetDrawFlag(battleSys->mainSprite, enable); + HealthBox_EnableArrow(battleSys, enable); +} + +void HealthBox_OffsetPositionXY(HealthBox *healthbox, int x, int y) +{ + GF_ASSERT(healthbox->mainSprite != NULL); + const SpriteTemplate *template = HealthBox_SpriteTemplate(healthbox->type); + + Sprite_SetPositionXY(healthbox->mainSprite->sprite, template->x + x, template->y + y); + if (healthbox->arrowSprite != NULL) { + Sprite_SetPositionXY(healthbox->arrowSprite->sprite, + template->x + x - sArrowOffsetX[healthbox->type], + template->y + y + 0); + } +} + +void HealthBox_Scroll(HealthBox *healthbox, enum HealthBoxScrollDirection direction) +{ + GF_ASSERT(healthbox != NULL); + GF_ASSERT(healthbox->mainSprite != NULL); + + healthbox->doneScrolling = 0; + healthbox->scrollDirection = direction; + + if (direction == HEALTHBOX_SCROLL_IN) { + switch (healthbox->type) { + case HEALTHBOX_TYPE_PLAYER_SOLO: + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + case HEALTHBOX_TYPE_SAFARI_ZONE: + case HEALTHBOX_TYPE_PAL_PARK: + // Player-side healthbox + HealthBox_OffsetPositionXY(healthbox, HEALTHBOX_SCROLL_OUT_OFFSET, 0); + break; + + default: + // Enemy-side healthbox + HealthBox_OffsetPositionXY(healthbox, -HEALTHBOX_SCROLL_OUT_OFFSET, 0); + break; + } + } else { + HealthBox_OffsetPositionXY(healthbox, 0, 0); + } + + SysTask_Start(ScrollHealthBoxTask, healthbox, 990); +} + +/** + * @brief Scroll the healthbox in or out by the configured scroll-speed value. + * + * @param task + * @param data + */ +static void ScrollHealthBoxTask(SysTask *task, void *data) +{ + HealthBox *healthbox = data; + int done = 0; + const SpriteTemplate *template = HealthBox_SpriteTemplate(healthbox->type); + + s16 x, y; + ManagedSprite_GetPositionXY(healthbox->mainSprite, &x, &y); + + // Determine new X and Y based on the type of healthbox + switch (healthbox->type) { + case HEALTHBOX_TYPE_PLAYER_SOLO: + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + case HEALTHBOX_TYPE_SAFARI_ZONE: + case HEALTHBOX_TYPE_PAL_PARK: + // Player-side healthbox + if (healthbox->scrollDirection == HEALTHBOX_SCROLL_IN) { + x -= HEALTHBOX_SCROLL_SPEED; + + if (x < template->x) { + x = template->x; + done++; + } + } else { + x += HEALTHBOX_SCROLL_SPEED; + + if (x > template->x + HEALTHBOX_SCROLL_OUT_OFFSET) { + x = template->x + HEALTHBOX_SCROLL_OUT_OFFSET; + done++; + } + } + break; + + default: + // Enemy-side healthbox + if (healthbox->scrollDirection == HEALTHBOX_SCROLL_IN) { + x += HEALTHBOX_SCROLL_SPEED; + + if (x > template->x) { + x = template->x; + done++; + } + } else { + x -= HEALTHBOX_SCROLL_SPEED; + + if (x < template->x - HEALTHBOX_SCROLL_SPEED) { + x = template->x - HEALTHBOX_SCROLL_SPEED; + done++; + } + } + break; + } + + // Update positions of the sprites on the screen + ManagedSprite_SetPositionXY(healthbox->mainSprite, x, y); + if (healthbox->arrowSprite != NULL) { + ManagedSprite_SetPositionXY(healthbox->arrowSprite, x - sArrowOffsetX[healthbox->type], y + 0); + } + + // If the sprites are now in position, we're done + if (done > 0) { + healthbox->doneScrolling = TRUE; + SysTask_Done(task); + } +} + +/** + * @brief Draw the battler's name onto the healthbox. + * + * @param healthbox + */ +static void HealthBox_DrawBattlerName(HealthBox *healthbox) +{ + BgConfig *bgl = BattleSystem_GetBgConfig(healthbox->battleSys); + u8 *buf; + NNSG2dImageProxy *imgProxy; + Window window; + MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbox->battleSys); + StringTemplate *strFormatter = BattleSystem_GetStringTemplate(healthbox->battleSys); + + String *nickname = String_Init(MON_NAME_LEN + 12, HEAP_ID_BATTLE); // TODO: not sure why there is a +12 here + String *template = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_HealthBoxPokemonName); + + Pokemon *mon = BattleSystem_GetPartyPokemon(healthbox->battleSys, healthbox->battler, healthbox->selectedPartySlot); + BoxPokemon *boxMon = Pokemon_GetBoxPokemon(mon); + + StringTemplate_SetNickname(strFormatter, 0, boxMon); + StringTemplate_Format(strFormatter, nickname, template); + + Window_AddToTopLeftCorner(bgl, &window, HEALTHBOX_NAME_BLOCK_COUNT_X, HEALTHBOX_NAME_BLOCK_COUNT_Y, HEALTHBOX_NAME_WINDOW_OFFSET, HEALTHBOX_NAME_BACKGROUND_COLOR); + Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, nickname, 0, 0, TEXT_SPEED_NO_TRANSFER, HEALTHBOX_NAME_TEXT_COLOR, 0, 0, NULL); + buf = window.pixels; + + // copy the window's data into VRAM over the painted healthbox + void *vram = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + u8 *hiHalf = buf; + u8 *loHalf = &buf[HEALTHBOX_NAME_BLOCK_COUNT_X * HEALTHBOX_WINDOW_BLOCK_SIZE]; + + MI_CpuCopy16(hiHalf, + VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbox->type, 0, imgProxy), + sBattlerNameVRAMTransfer[healthbox->type][0].size); + MI_CpuCopy16(loHalf, + VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbox->type, 1, imgProxy), + sBattlerNameVRAMTransfer[healthbox->type][1].size); + MI_CpuCopy16(&hiHalf[sBattlerNameVRAMTransfer[healthbox->type][0].size], + VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbox->type, 2, imgProxy), + sBattlerNameVRAMTransfer[healthbox->type][2].size); + MI_CpuCopy16(&loHalf[sBattlerNameVRAMTransfer[healthbox->type][1].size], + VRAM_TRANSFER_DST(vram, sBattlerNameVRAMTransfer, healthbox->type, 3, imgProxy), + sBattlerNameVRAMTransfer[healthbox->type][3].size); + + Window_Remove(&window); + String_Free(nickname); + String_Free(template); +} + +static void HealthBox_DrawLevelText(HealthBox *healthbox) +{ + NNSG2dImageProxy *imgProxy; + const u8 *tileNum1; + const u8 *tileNum2; + int part1, part2; + + if (healthbox->gender == GENDER_MALE) { + part1 = HEALTHBOX_PART_LEVEL_MALE_BOTTOM_0; + part2 = HEALTHBOX_PART_LEVEL_MALE_TOP_0; + } else if (healthbox->gender == GENDER_FEMALE) { + part1 = HEALTHBOX_PART_LEVEL_FEMALE_BOTTOM_0; + part2 = HEALTHBOX_PART_LEVEL_FEMALE_TOP_0; + } else { + part1 = HEALTHBOX_PART_LEVEL_GENDERLESS_BOTTOM_0; + part2 = HEALTHBOX_PART_LEVEL_GENDERLESS_TOP_0; + } + + tileNum1 = GetHealthBoxPartsTile(part1); + tileNum2 = GetHealthBoxPartsTile(part2); + + void *v5 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + + MI_CpuCopy16(tileNum2, (void *)((u32)v5 + Unk_ov16_0226F47C[healthbox->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F47C[healthbox->type][0].size); + MI_CpuCopy16(tileNum1, (void *)((u32)v5 + Unk_ov16_0226F47C[healthbox->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F47C[healthbox->type][1].size); +} + +static void HealthBox_DrawLevelNumber(HealthBox *healthbox) +{ + NNSG2dImageProxy *imgProxy; + int v4, v5, v6; + + int size = 3 * HEALTHBOX_WINDOW_BLOCK_SIZE; + u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, size); + u8 *v1 = Heap_Alloc(HEAP_ID_BATTLE, size * 2); + + MI_CpuFill8(v0, 0xf | (0xf << 4), size); + FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsLevel(healthbox->battleSys), healthbox->level, 3, PADDING_MODE_NONE, v0); + + void *v7 = G2_GetOBJCharPtr(); + u8 *v8, *v9; + + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + + MI_CpuCopy16((void *)((u32)v7 + Unk_ov16_0226F3EC[healthbox->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), v1, Unk_ov16_0226F3EC[healthbox->type][0].size); + MI_CpuCopy16((void *)((u32)v7 + Unk_ov16_0226F3EC[healthbox->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), &v1[size], Unk_ov16_0226F3EC[healthbox->type][1].size); + + v6 = 0; + + for (v5 = 0; v5 < size; v5 += 32) { + for (v4 = 0; v4 < 16; v4++) { + v1[v5 + 16 + v4] = v0[v6]; + v1[v5 + v4 + size] = v0[v6 + 16]; + v6++; + } + + v6 += 16; + } + + v8 = v1; + v9 = &v1[size]; + + MI_CpuCopy16(v8, (void *)((u32)v7 + Unk_ov16_0226F3EC[healthbox->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3EC[healthbox->type][0].size); + MI_CpuCopy16(v9, (void *)((u32)v7 + Unk_ov16_0226F3EC[healthbox->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3EC[healthbox->type][1].size); + + Heap_Free(v0); + Heap_Free(v1); +} + +static void HealthBox_DrawCurrentHP(HealthBox *healthbox, u32 hp) +{ + u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, 3 * HEALTHBOX_WINDOW_BLOCK_SIZE); + NNSG2dImageProxy *imgProxy; + + MI_CpuFill8(v0, 0xf | (0xf << 4), 3 * HEALTHBOX_WINDOW_BLOCK_SIZE); + FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsHP(healthbox->battleSys), hp, 3, PADDING_MODE_SPACES, v0); + + void *v2 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + u8 *v3 = v0; + + MI_CpuCopy16(v3, (void *)((u32)v2 + Unk_ov16_0226F41C[healthbox->type][0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F41C[healthbox->type][0].size); + MI_CpuCopy16(&v3[Unk_ov16_0226F41C[healthbox->type][0].size], (void *)((u32)v2 + Unk_ov16_0226F41C[healthbox->type][1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F41C[healthbox->type][1].size); + + Heap_Free(v0); +} + +static void HealthBox_DrawMaxHP(HealthBox *healthbox) +{ + u8 *v0 = Heap_Alloc(HEAP_ID_BATTLE, 3 * HEALTHBOX_WINDOW_BLOCK_SIZE); + NNSG2dImageProxy *imgProxy; + + MI_CpuFill8(v0, 0xf | (0xf << 4), 3 * HEALTHBOX_WINDOW_BLOCK_SIZE); + FontSpecialChars_DrawBattleScreenText(BattleSystem_GetSpecialCharsHP(healthbox->battleSys), healthbox->maxHP, 3, PADDING_MODE_NONE, v0); + + void *v2 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + u8 *v3 = v0; + + MI_CpuCopy16(v3, (void *)((u32)v2 + Unk_ov16_0226F3BC[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3BC[healthbox->type].size); + + Heap_Free(v0); +} + +static void HealthBox_DrawCaughtIcon(HealthBox *healthbox) +{ + NNSG2dImageProxy *imgProxy; + const u8 *tileNum; + + if (healthbox->caughtSpecies == TRUE) { + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_CAUGHT_INDICATOR); + } else { + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_STATUS_HEALTHY_0); + } + + void *v2 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F38C[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F38C[healthbox->type].size); +} + +static void HealthBox_DrawStatusIcon(HealthBox *healthbox, enum HealthBoxPart part) +{ + NNSG2dImageProxy *imgProxy; + const u8 *tileNum = GetHealthBoxPartsTile(part); + + void *v2 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + + MI_CpuCopy16(tileNum, (void *)((u32)v2 + Unk_ov16_0226F35C[healthbox->type].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F35C[healthbox->type].size); +} + +static void HealthBox_DrawBallCount(HealthBox *healthbox, u32 flags) +{ + BgConfig *bgConfig = BattleSystem_GetBgConfig(healthbox->battleSys); + u8 *v1; + NNSG2dImageProxy *imgProxy; + Window window; + MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbox->battleSys); + String *string; + + if (flags & (1 << 10)) { + string = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_SafariBalls); + } else { + string = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_ParkBalls); + } + + Window_AddToTopLeftCorner(bgConfig, &window, 13, 2, 0, 0xf); + Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, string, 0, 0, TEXT_SPEED_NO_TRANSFER, HEALTHBOX_NAME_TEXT_COLOR, 0, 0, NULL); + + v1 = window.pixels; + + void *v6 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + u8 *v7 = v1; + u8 *v8 = &v1[13 * HEALTHBOX_WINDOW_BLOCK_SIZE]; + + MI_CpuCopy16(v7, (void *)((u32)v6 + Unk_ov16_0226F33C[0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[0].size); + MI_CpuCopy16(v8, (void *)((u32)v6 + Unk_ov16_0226F33C[1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[1].size); + + MI_CpuCopy16(&v7[Unk_ov16_0226F33C[0].size], (void *)((u32)v6 + Unk_ov16_0226F33C[2].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[2].size); + MI_CpuCopy16(&v8[Unk_ov16_0226F33C[1].size], (void *)((u32)v6 + Unk_ov16_0226F33C[3].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F33C[3].size); + + Window_Remove(&window); + String_Free(string); +} + +static void HealthBox_DrawBallsLeftMessage(HealthBox *healthbox, u32 flags) +{ + BgConfig *bgConfig = BattleSystem_GetBgConfig(healthbox->battleSys); + u8 *v1; + NNSG2dImageProxy *imgProxy; + Window window; + MessageLoader *msgLoader = BattleSystem_GetMessageLoader(healthbox->battleSys); + String *templateString; + StringTemplate *strTemplate = BattleSystem_GetStringTemplate(healthbox->battleSys); + + String *string = String_Init(30, HEAP_ID_BATTLE); + + if (flags & (1 << 10)) { + templateString = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_SafariBallsLeft); + } else { + templateString = MessageLoader_GetNewString(msgLoader, BattleStrings_Text_ParkBallsLeft); + } + + StringTemplate_SetNumber(strTemplate, 0, healthbox->numSafariBalls, 2, PADDING_MODE_SPACES, CHARSET_MODE_EN); + StringTemplate_Format(strTemplate, string, templateString); + Window_AddToTopLeftCorner(bgConfig, &window, 13, 2, 0, 0xf); + Text_AddPrinterWithParamsColorAndSpacing(&window, FONT_SYSTEM, string, 0, 0, TEXT_SPEED_NO_TRANSFER, TEXT_COLOR(14, 2, 15), 0, 0, NULL); + + v1 = window.pixels; + + void *v8 = G2_GetOBJCharPtr(); + imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + u8 *v9 = v1; + u8 *v10 = &v1[13 * HEALTHBOX_WINDOW_BLOCK_SIZE]; + + MI_CpuCopy16(v9, (void *)((u32)v8 + Unk_ov16_0226F34C[0].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[0].size); + MI_CpuCopy16(v10, (void *)((u32)v8 + Unk_ov16_0226F34C[1].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[1].size); + MI_CpuCopy16(&v9[Unk_ov16_0226F34C[0].size], (void *)((u32)v8 + Unk_ov16_0226F34C[2].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[2].size); + MI_CpuCopy16(&v10[Unk_ov16_0226F34C[1].size], (void *)((u32)v8 + Unk_ov16_0226F34C[3].pos + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F34C[3].size); + + Window_Remove(&window); + String_Free(string); + String_Free(templateString); +} + +static s32 HealthBox_DrawGauge(HealthBox *healthbox, enum HealthBoxGaugeType gaugeType) +{ + s32 result; + s32 fillOffset; + + if (gaugeType == HEALTHBOX_GAUGE_HP) { + result = UpdateGauge(healthbox->maxHP, healthbox->curHP, healthbox->damage, &healthbox->hpTemp, HEALTHBOX_HP_CELL_COUNT, 1); + } else { + fillOffset = CalcGaugeFill(healthbox->curExp, healthbox->expReward, healthbox->maxExp, HEALTHBOX_EXP_CELL_COUNT); + + if (fillOffset == 0) { + fillOffset = 1; + } + + fillOffset = abs(healthbox->expReward / fillOffset); + result = UpdateGauge(healthbox->maxExp, healthbox->curExp, healthbox->expReward, &healthbox->expTemp, HEALTHBOX_EXP_CELL_COUNT, fillOffset); + } + + if (gaugeType != HEALTHBOX_GAUGE_HP || healthbox->numberMode != TRUE) { + DrawGauge(healthbox, gaugeType); + } + + if (result == -1) { + if (gaugeType == HEALTHBOX_GAUGE_HP) { + healthbox->hpTemp = 0; + } else { + healthbox->expTemp = 0; + } + } + + return result; +} + +static void DrawGauge(HealthBox *healthbox, u8 gaugeType) +{ + u8 i; + u8 cells[HEALTHBOX_EXP_CELL_COUNT]; + u8 part; + u8 pixels; + u8 level; + const u8 *tileNum; + void *v7 = G2_GetOBJCharPtr(); + NNSG2dImageProxy *imgProxy = Sprite_GetImageProxy(healthbox->mainSprite->sprite); + int numBlocks; + + switch (gaugeType) { + case HEALTHBOX_GAUGE_HP: + pixels = FillCells(healthbox->maxHP, healthbox->curHP, healthbox->damage, &healthbox->hpTemp, cells, HEALTHBOX_HP_CELL_COUNT); + + int barColor = App_BarColor(pixels, 8 * HEALTHBOX_HP_CELL_COUNT); + + switch (barColor) { + case BARCOLOR_GREEN: + part = HEALTHBOX_PART_HP_GREEN_FILL_0; + break; + case BARCOLOR_YELLOW: + part = HEALTHBOX_PART_HP_YELLOW_FILL_0; + break; + case BARCOLOR_RED: + default: + part = HEALTHBOX_PART_HP_RED_FILL_0; + break; + } + + tileNum = GetHealthBoxPartsTile(part); + numBlocks = Unk_ov16_0226F44C[healthbox->type][0].size / HEALTHBOX_WINDOW_BLOCK_SIZE; + + for (i = 0; i < HEALTHBOX_HP_CELL_COUNT; i++) { + if (i < numBlocks) { + MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + Unk_ov16_0226F44C[healthbox->type][0].pos + (i * HEALTHBOX_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + } else { + MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + Unk_ov16_0226F44C[healthbox->type][1].pos + ((i - numBlocks) * HEALTHBOX_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + } + } + break; + case HEALTHBOX_GAUGE_EXP: + FillCells(healthbox->maxExp, healthbox->curExp, healthbox->expReward, &healthbox->expTemp, cells, HEALTHBOX_EXP_CELL_COUNT); + level = healthbox->level; + + if (level == MAX_POKEMON_LEVEL) { + for (i = 0; i < HEALTHBOX_EXP_CELL_COUNT; i++) { + cells[i] = 0; + } + } + + tileNum = GetHealthBoxPartsTile(HEALTHBOX_PART_EXP_FILL_0); + + for (i = 0; i < HEALTHBOX_EXP_CELL_COUNT; i++) { + if (i < 5) { + MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + 1632 + (i * HEALTHBOX_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + } else { + MI_CpuCopy16(tileNum + (cells[i] << 5), (void *)((u32)v7 + 3584 + ((i - 5) * HEALTHBOX_WINDOW_BLOCK_SIZE) + imgProxy->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), HEALTHBOX_WINDOW_BLOCK_SIZE); + } + } + break; + } +} + +/** + * @brief Update the pixels of a gauge based on the calculated + * change in the current value of a gauge. + * + * @param cur Current value of the gauge + * @param diff Change to be applied to the current value + * @param max Max value of the gauge + * @param size Size of the gauge, in squares of fill + * @param temp Temporary value stored in the gauge + * @return Number of pixels to be filled + */ +static s32 UpdateGauge(s32 max, s32 cur, s32 diff, s32 *temp, u8 size, u16 fillOffset) +{ + s32 updated, final, ratio; + + u8 corrected = size * HEALTHBOX_NAME_BLOCK_COUNT_X; + + if (*temp == S32_MIN) { + if (max < corrected) { + *temp = cur << 8; + } else { + *temp = cur; + } + } + + updated = cur - diff; + + if (updated < 0) { + updated = 0; + } else if (updated > max) { + updated = max; + } + + if (max < corrected) { + if (updated == (*temp >> 8) && (*temp & 0xff) == 0) { + return -1; + } + } else { + if (updated == *temp) { + return -1; + } + } + + if (max < corrected) { + ratio = max * 0x100 / corrected; + + if (diff < 0) { + *temp += ratio; + final = *temp >> 8; + + if (final >= updated) { + *temp = updated << 8; + final = updated; + } + } else { + *temp -= ratio; + final = *temp >> 8; + + if ((*temp & 0xff) > 0) { + final++; + } + + if (final <= updated) { + *temp = updated << 8; + final = updated; + } + } + } else { + if (diff < 0) { + *temp += fillOffset; + + if (*temp > updated) { + *temp = updated; + } + } else { + *temp -= fillOffset; + + if (*temp < updated) { + *temp = updated; + } + } + + final = *temp; + } + + return final; +} + +static u8 FillCells(s32 max, s32 cur, s32 diff, s32 *temp, u8 *cells, u8 cellNum) +{ + int cell; + u32 offset, pixels, final; + s32 updated = cur - diff; + + if (updated < 0) { + updated = 0; + } else if (updated > max) { + updated = max; + } + + offset = 8 * cellNum; + + for (cell = 0; cell < cellNum; cell++) { + cells[cell] = 0; + } + + if (max < offset) { + pixels = (*temp * offset / max) >> 8; + } else { + pixels = *temp * offset / max; + } + + final = pixels; + + if (pixels == 0 && updated > 0) { + cells[0] = 1; + final = 1; + } else { + for (cell = 0; cell < cellNum; cell++) { + if (pixels >= 8) { + cells[cell] = 8; + pixels -= 8; + } else { + cells[cell] = pixels; + break; + } + } + } + + return final; +} + +/** + * @brief Calculate the number of pixels that will need to be filled to account + * for a change in the current value of a gauge. + * + * @param curVal Current value of the gauge + * @param diff Change to be applied to the current value + * @param maxVal Max value of the gauge + * @param gaugeSize Size of the gauge, in squares of fill + * @return Number of pixels to be filled + */ +static u32 CalcGaugeFill(s32 curVal, s32 diff, s32 maxVal, u8 gaugeSize) +{ + u8 gaugeSizePixels = gaugeSize * 8; // gauges have 8 pixels per "square" of fill + s32 newVal = curVal - diff; + + if (newVal < 0) { + newVal = 0; + } else if (newVal > maxVal) { + newVal = maxVal; + } + + s8 curPixels = curVal * gaugeSizePixels / maxVal; + s8 newPixels = newVal * gaugeSizePixels / maxVal; + + return abs(curPixels - newPixels); +} + +static const u8 *GetHealthBoxPartsTile(enum HealthBoxPart part) +{ + return &sHealthBoxPartsBitmap[part * TILE_SIZE_4BPP]; +} + +u8 HealthBox_Type(int battlerType, u32 battleType) +{ + switch (battlerType) { + case BATTLER_TYPE_SOLO_PLAYER: + if (battleType & BATTLE_TYPE_PAL_PARK) { + return HEALTHBOX_TYPE_PAL_PARK; + } + + if (battleType & BATTLE_TYPE_SAFARI) { + return HEALTHBOX_TYPE_SAFARI_ZONE; + } + + return HEALTHBOX_TYPE_PLAYER_SOLO; + + case BATTLER_TYPE_SOLO_ENEMY: + return HEALTHBOX_TYPE_ENEMY_SOLO; + + case BATTLER_TYPE_PLAYER_SIDE_SLOT_1: + return HEALTHBOX_TYPE_PLAYER_SLOT_1; + + case BATTLER_TYPE_ENEMY_SIDE_SLOT_1: + return HEALTHBOX_TYPE_ENEMY_SLOT_1; + + case BATTLER_TYPE_PLAYER_SIDE_SLOT_2: + return HEALTHBOX_TYPE_PLAYER_SLOT_2; + + case BATTLER_TYPE_ENEMY_SIDE_SLOT_2: + return HEALTHBOX_TYPE_ENEMY_SLOT_2; + + default: + GF_ASSERT(FALSE); + return NULL; + } +} + +/** + * @brief Grab the sprite template that applies to a given healthbox type. + * + * @param type The healthbox type. See enum HealthBoxType for accepted values. + * @return Address of the SpriteTemplate struct which applies to this + * healthbox type. + */ +static const SpriteTemplate *HealthBox_SpriteTemplate(u8 type) +{ + switch (type) { + case HEALTHBOX_TYPE_PLAYER_SOLO: + return &sHealthBoxTemplate_SoloPlayer; + + case HEALTHBOX_TYPE_ENEMY_SOLO: + return &sHealthBoxTemplate_SoloEnemy; + + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + return &sHealthBoxTemplate_PlayerSlot1; + + case HEALTHBOX_TYPE_ENEMY_SLOT_1: + return &sHealthBoxTemplate_EnemySlot1; + + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + return &sHealthBoxTemplate_PlayerSlot2; + + case HEALTHBOX_TYPE_ENEMY_SLOT_2: + return &sHealthBoxTemplate_EnemySlot2; + + case HEALTHBOX_TYPE_SAFARI_ZONE: + case HEALTHBOX_TYPE_PAL_PARK: + return &sHealthBoxTemplate_NoPlayerMon; + + default: + GF_ASSERT(FALSE); + return NULL; + } +} + +static const SpriteTemplate *ov16_02268314(u8 type) +{ + const SpriteTemplate *spriteTemplate; + + switch (type) { + case HEALTHBOX_TYPE_PLAYER_SOLO: + case HEALTHBOX_TYPE_PLAYER_SLOT_1: + case HEALTHBOX_TYPE_PLAYER_SLOT_2: + case HEALTHBOX_TYPE_SAFARI_ZONE: + case HEALTHBOX_TYPE_PAL_PARK: + spriteTemplate = &sHealthBoxTemplate_Unk_ov16_0226F514; + break; + case HEALTHBOX_TYPE_ENEMY_SOLO: + case HEALTHBOX_TYPE_ENEMY_SLOT_1: + case HEALTHBOX_TYPE_ENEMY_SLOT_2: + return NULL; + default: + GF_ASSERT(FALSE); + return NULL; + } + + return spriteTemplate; +} + +void ov16_0226834C(HealthBox *healthbox, u8 *param1) +{ + UnkStruct_ov16_0226834C *v0; + + *param1 = 0; + + v0 = Heap_Alloc(HEAP_ID_BATTLE, sizeof(UnkStruct_ov16_0226834C)); + MI_CpuClear8(v0, sizeof(UnkStruct_ov16_0226834C)); + + v0->healthbox = healthbox; + v0->unk_04 = param1; + + SysTask_Start(ov16_02268380, v0, 1000); +} + +static void ov16_02268380(SysTask *task, void *param1) +{ + UnkStruct_ov16_0226834C *v0 = param1; + SpriteManager *spriteManager = BattleSystem_GetSpriteManager(v0->healthbox->battleSys); + int v2; + PaletteData *paletteData = BattleSystem_GetPaletteData(v0->healthbox->battleSys); + + switch (v0->state) { + case 0: + v2 = SpriteManager_FindPlttResourceOffset(spriteManager, 20007, NNS_G2D_VRAM_TYPE_2DMAIN); + ManagedSprite_SetExplicitPalette(v0->healthbox->mainSprite, v2); + v0->unk_09 = v2; + v0->state++; + case 1: + v0->unk_0A += 2; + + if (v0->unk_0A >= 10) { + v0->unk_0A = 10; + v0->state++; + } + + PaletteData_Blend(paletteData, 2, v0->unk_09 * 16 + 0, 16, v0->unk_0A, 0x73a5); + break; + case 2: + v0->unk_0A -= 2; + + if (v0->unk_0A <= 0) { + v0->unk_0A = 0; + v0->state++; + } + + PaletteData_Blend(paletteData, 2, v0->unk_09 * 16 + 0, 16, v0->unk_0A, 0x73a5); + break; + default: + v2 = SpriteManager_FindPlttResourceOffset(spriteManager, HEALTHBOX_MAIN_PALETTE_RESID, NNS_G2D_VRAM_TYPE_2DMAIN); + ManagedSprite_SetExplicitPalette(v0->healthbox->mainSprite, v2); + + *(v0->unk_04) = 1; + + Heap_Free(param1); + SysTask_Done(task); + + return; + } +} + +void ov16_02268468(HealthBox *healthbox) +{ + return; +} + +void ov16_0226846C(HealthBox *healthbox) +{ + return; +} + +void ov16_02268470(HealthBox *healthbox) +{ + if (healthbox->task_50 != NULL) { + return; + } + + healthbox->degrees = 0; + healthbox->task_50 = SysTask_Start(ov16_022684BC, healthbox, 1010); +} + +void ov16_02268498(HealthBox *healthbox) +{ + if (healthbox->task_50 != NULL) { + SysTask_Done(healthbox->task_50); + healthbox->task_50 = NULL; + } + + healthbox->degrees = 0; + HealthBox_OffsetPositionXY(healthbox, 0, 0); +} + +static void ov16_022684BC(SysTask *task, void *data) +{ + HealthBox *healthbox = data; + int y; + + healthbox->degrees += 20; + + if (healthbox->degrees >= 360) { + healthbox->degrees -= 360; + } + + y = FX_Mul(CalcSineDegrees(healthbox->degrees), 0x1800) / FX32_ONE; + HealthBox_OffsetPositionXY(healthbox, 0, y); +} diff --git a/src/meson.build b/src/meson.build index abe24171f1..ae06314cdd 100644 --- a/src/meson.build +++ b/src/meson.build @@ -530,7 +530,7 @@ pokeplatinum_c = files( 'battle/battle_display.c', 'battle/ov16_02264798.c', 'battle/battle_controller.c', - 'battle/healthbar.c', + 'battle/healthbox.c', 'battle/ov16_02268520.c', 'battle/battle_cursor.c', 'battle/party_gauge.c',