Document Healthbar_DrawInfo

This commit is contained in:
Rachel 2024-02-10 21:52:22 -08:00
parent c3a72122b9
commit b7abc09f4d
4 changed files with 116 additions and 78 deletions

View File

@ -8,6 +8,28 @@
#include "struct_decls/cell_actor_data.h"
#include "overlay016/struct_ov16_022674C4.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,
@ -26,7 +48,16 @@ enum HealthbarScrollDirection {
void ov16_02266F1C(SpriteRenderer * param0, SpriteGfxHandler * param1, NARC * param2, PaletteData * param3, int param4);
CellActorData * ov16_02267060(SpriteRenderer * param0, SpriteGfxHandler * param1, int param2);
void Healthbar_Draw(Healthbar * param0, u32 param1, u32 param2);
/**
* @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
* @param flags The components to be drawn, as a bitmask.
*/
void Healthbar_DrawInfo(Healthbar *healthbar, u32 hp, u32 flags);
void ov16_02267220(Healthbar * param0);
void ov16_02267258(Healthbar * param0);
void ov16_022672C4(Healthbar * param0);

View File

@ -27,7 +27,7 @@ typedef struct {
s32 unk_44;
u8 unk_48;
u8 unk_49;
u8 unk_4A;
u8 status;
u8 unk_4B;
u8 unk_4C;
u8 unk_4D;
@ -35,7 +35,7 @@ typedef struct {
u8 scrollDirection : 1;
u8 doneScrolling : 1;
u8 unk_4F_2 : 1;
u8 unk_4F_3 : 1;
u8 numberMode : 1;
u8 : 4;
SysTask * unk_50;
u16 unk_54;

View File

@ -637,13 +637,13 @@ void BattleDisplay_SlideHealthbarIn(BattleSystem *battleSys, BattlerData *battle
healthbar->unk_38 = healthbarData->expFromLastLevel;
healthbar->unk_3C = healthbarData->expToNextLevel;
healthbar->unk_26 = healthbarData->selectedPartySlot;
healthbar->unk_4A = healthbarData->status;
healthbar->status = healthbarData->status;
healthbar->unk_4B = healthbarData->speciesCaught;
healthbar->unk_4D = healthbarData->delay;
healthbar->unk_27 = healthbarData->numSafariBalls;
Healthbar_Enable(healthbar, FALSE);
Healthbar_Draw(healthbar, healthbar->unk_28, 0xffffffff);
Healthbar_DrawInfo(healthbar, healthbar->unk_28, HEALTHBAR_INFO_ALL);
healthbar->unk_10 = SysTask_Start(SlideHealthbarInTask, healthbar, 1000);
}
@ -1075,9 +1075,9 @@ void ov16_0225DD44 (BattleSystem * param0, BattlerData * param1, UnkStruct_ov16_
{
GF_ASSERT(param1->healthbar.mainActor != NULL);
param1->healthbar.unk_4A = param2->unk_01;
param1->healthbar.status = param2->unk_01;
Healthbar_Draw(&param1->healthbar, param1->healthbar.unk_28, (1 << 8));
Healthbar_DrawInfo(&param1->healthbar, param1->healthbar.unk_28, HEALTHBAR_INFO_STATUS);
ClearCommand(param0, param1->battler, param2->unk_00);
}
@ -1236,11 +1236,11 @@ void ov16_0225E008 (BattleSystem * param0, BattlerData * param1, UnkStruct_ov16_
v0->unk_38 = param2->unk_08;
v0->unk_3C = param2->unk_0C;
v0->unk_26 = param2->unk_06;
v0->unk_4A = param2->unk_07_0;
v0->status = param2->unk_07_0;
v0->unk_4B = param2->unk_07_7;
v0->unk_27 = param2->unk_10;
Healthbar_Draw(v0, v0->unk_28, 0xffffffff ^ (1 << 5));
Healthbar_DrawInfo(v0, v0->unk_28, ~HEALTHBAR_INFO_EXP_GAUGE);
ClearCommand(v0->battleSys, v0->unk_24, v0->unk_4C);
}
@ -3974,7 +3974,7 @@ static void ov16_022611DC (SysTask * param0, void * param1)
v18->unk_30 = v0->unk_08->unk_04->unk_20;
if (Pokemon_GetValue(v19, MON_DATA_STATUS_CONDITION, NULL) == 0) {
v18->unk_4A = 0;
v18->status = 0;
}
ov16_022674C4(v18, v18->unk_30);
@ -3990,7 +3990,7 @@ static void ov16_022611DC (SysTask * param0, void * param1)
v22 = ov16_0223F35C(v0->unk_00, v23);
if (ov16_022674F8(v22) == -1) {
Healthbar_Draw(v22, NULL, (1 << 8));
Healthbar_DrawInfo(v22, NULL, HEALTHBAR_INFO_STATUS);
v0->unk_0E++;
}
}
@ -4038,10 +4038,10 @@ static void ov16_022611DC (SysTask * param0, void * param1)
v33 = BattleSystem_PartyPokemon(v0->unk_00, v28, v34);
if (Pokemon_GetValue(v33, MON_DATA_STATUS_CONDITION, NULL) == 0) {
v27->unk_4A = 0;
v27->status = 0;
}
Healthbar_Draw(v27, v27->unk_28, (1 << 8));
Healthbar_DrawInfo(v27, v27->unk_28, HEALTHBAR_INFO_STATUS);
v30.tags = 2;
v30.params[0] = v28 | (v0->unk_08->unk_0C[v28] << 8);

View File

@ -517,116 +517,123 @@ CellActorData * ov16_02267060 (SpriteRenderer * param0, SpriteGfxHandler * param
return v1;
}
void Healthbar_Draw (Healthbar * param0, u32 param1, u32 param2)
void Healthbar_DrawInfo(Healthbar *healthbar, u32 hp, u32 flags)
{
int v0 = 0;
u32 v1;
BOOL caughtSpecies = FALSE;
GF_ASSERT(param0->mainActor != NULL);
GF_ASSERT(healthbar->mainActor != NULL);
v1 = param2;
u32 flagsCopy = flags;
if (param0->type == 6) {
param2 &= ((1 << 10) | (1 << 11));
} else if (param0->type == 7) {
param2 &= ((1 << 12) | (1 << 13));
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 {
param2 &= 0xffffffff ^ (((1 << 10) | (1 << 11)) | ((1 << 12) | (1 << 13)));
flags &= ~(HEALTHBAR_INFO_ALL_SAFARI | HEALTHBAR_INFO_ALL_PARK);
}
switch (param0->type) {
case 1:
case 3:
case 5:
param2 &= 0xffffffff ^ ((1 << 1) | (1 << 2) | (1 << 5));
v0 = 1;
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 2:
case 4:
param2 &= 0xffffffff ^ ((1 << 5) | (1 << 9));
if (param0->unk_4F_3 == 0) {
param2 &= 0xffffffff ^ ((1 << 1) | (1 << 2));
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 {
param2 &= 0xffffffff ^ ((1 << 0));
flags &= ~HEALTHBAR_INFO_HP_GAUGE;
}
break;
case 0:
param2 &= 0xffffffff ^ ((1 << 9));
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 6:
case 7:
case HEALTHBAR_TYPE_SAFARI_ZONE:
case HEALTHBAR_TYPE_PAL_PARK:
break;
}
if (BattleSystem_BattleType(param0->battleSys) & 0x1) {
param2 &= 0xffffffff ^ ((1 << 9));
if (BattleSystem_BattleType(healthbar->battleSys) & BATTLE_TYPE_TRAINER) {
// Never show the pokeball icon on an enemy trainer's healthbar
flags &= ~HEALTHBAR_INFO_CAUGHT_SPECIES;
}
if (param2 & (1 << 0)) {
ov16_022674C4(param0, 0);
ov16_02267EDC(param0, 0);
if (flags & HEALTHBAR_INFO_HP_GAUGE) {
ov16_022674C4(healthbar, 0);
ov16_02267EDC(healthbar, 0);
}
if (param2 & (1 << 1)) {
ov16_02267B6C(param0, param1);
if (flags & HEALTHBAR_INFO_CURRENT_HP) {
ov16_02267B6C(healthbar, hp);
}
if (param2 & (1 << 2)) {
ov16_02267BF8(param0);
if (flags & HEALTHBAR_INFO_MAX_HP) {
ov16_02267BF8(healthbar);
}
if ((param2 & (1 << 7)) || (param2 & (1 << 6))) {
ov16_022679C8(param0);
if ((flags & HEALTHBAR_INFO_LEVEL_TEXT) || (flags & HEALTHBAR_INFO_GENDER)) {
ov16_022679C8(healthbar);
}
if (param2 & (1 << 3)) {
ov16_02267A4C(param0);
if (flags & HEALTHBAR_INFO_LEVEL) {
ov16_02267A4C(healthbar);
}
if (param2 & (1 << 4)) {
ov16_02267864(param0);
if (flags & HEALTHBAR_INFO_NAME) {
ov16_02267864(healthbar);
}
if (param2 & (1 << 5)) {
ov16_0226752C(param0, 0);
ov16_02267EDC(param0, 1);
if (flags & HEALTHBAR_INFO_EXP_GAUGE) {
ov16_0226752C(healthbar, 0);
ov16_02267EDC(healthbar, 1);
}
if (param2 & (1 << 9)) {
ov16_02267C58(param0);
if (flags & HEALTHBAR_INFO_CAUGHT_SPECIES) {
ov16_02267C58(healthbar);
}
if (param2 & (1 << 8)) {
switch (param0->unk_4A) {
if (flags & HEALTHBAR_INFO_STATUS) {
switch (healthbar->status) {
default:
case 0:
ov16_02267CA8(param0, 38);
ov16_02267CA8(healthbar, 38);
break;
case 1:
ov16_02267CA8(param0, 47);
ov16_02267CA8(healthbar, 47);
break;
case 2:
ov16_02267CA8(param0, 50);
ov16_02267CA8(healthbar, 50);
break;
case 3:
ov16_02267CA8(param0, 53);
ov16_02267CA8(healthbar, 53);
break;
case 4:
ov16_02267CA8(param0, 44);
ov16_02267CA8(healthbar, 44);
break;
case 5:
ov16_02267CA8(param0, 41);
ov16_02267CA8(healthbar, 41);
break;
}
}
if (param2 & ((1 << 10) | (1 << 12))) {
ov16_02267CE8(param0, param2);
if (flags & (HEALTHBAR_INFO_COUNT_SAFARI_BALLS | HEALTHBAR_INFO_COUNT_PARK_BALLS)) {
ov16_02267CE8(healthbar, flags);
}
if (param2 & ((1 << 11) | (1 << 13))) {
ov16_02267DC4(param0, param2);
if (flags & (HEALTHBAR_INFO_REMAINING_SAFARI_BALLS | HEALTHBAR_INFO_REMAINING_PARK_BALLS)) {
ov16_02267DC4(healthbar, flags);
}
}
@ -738,12 +745,12 @@ void ov16_0226737C (Healthbar * param0)
return;
}
param0->unk_4F_3 ^= 1;
param0->numberMode ^= 1;
v2 = G2_GetOBJCharPtr();
v1 = sub_02021F98(param0->mainActor->unk_00);
if (param0->unk_4F_3 == 1) {
if (param0->numberMode == 1) {
v0 = ov16_02268250(70);
MI_CpuCopy16(v0, (void *)((u32)v2 + Unk_ov16_0226F374[param0->type].unk_00 + 0x20 + v1->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20);
v0 = ov16_02268250(71);
@ -752,7 +759,7 @@ void ov16_0226737C (Healthbar * param0)
v0 = ov16_02268250(69);
MI_CpuCopy16(v0, (void *)((u32)v2 + Unk_ov16_0226F3D4[param0->type].unk_00 + v1->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F3D4[param0->type].unk_02);
Healthbar_Draw(param0, param0->unk_28, (1 << 1) | (1 << 2));
Healthbar_DrawInfo(param0, param0->unk_28, HEALTHBAR_INFO_CURRENT_HP | HEALTHBAR_INFO_MAX_HP);
} else {
v0 = ov16_02268250(66);
MI_CpuCopy16(v0, (void *)((u32)v2 + Unk_ov16_0226F374[param0->type].unk_00 + v1->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), Unk_ov16_0226F374[param0->type].unk_02);
@ -763,7 +770,7 @@ void ov16_0226737C (Healthbar * param0)
v0 = ov16_02268250(38);
MI_CpuCopy16(v0, (void *)((u32)v2 + Unk_ov16_0226F3A4[param0->type].unk_00 + 0x20 + v1->vramLocation.baseAddrOfVram[NNS_G2D_VRAM_TYPE_2DMAIN]), 0x20);
Healthbar_Draw(param0, param0->unk_28, (1 << 0));
Healthbar_DrawInfo(param0, param0->unk_28, HEALTHBAR_INFO_HP_GAUGE);
}
}
@ -798,9 +805,9 @@ s32 ov16_022674F8 (Healthbar * param0)
if (v0 == -1) {
param0->unk_28 -= param0->unk_30;
Healthbar_Draw(param0, param0->unk_28, (1 << 1));
Healthbar_DrawInfo(param0, param0->unk_28, HEALTHBAR_INFO_CURRENT_HP);
} else {
Healthbar_Draw(param0, v0, (1 << 1));
Healthbar_DrawInfo(param0, v0, HEALTHBAR_INFO_CURRENT_HP);
}
return v0;
@ -1348,7 +1355,7 @@ static s32 ov16_02267EDC (Healthbar * param0, int param1)
v0 = ov16_022680D8(param0->unk_3C, param0->unk_38, param0->unk_40, &param0->unk_44, 12, v1);
}
if ((param1 == 0) && (param0->unk_4F_3 == 1)) {
if ((param1 == 0) && (param0->numberMode == 1)) {
(void)0;
} else {
ov16_02267F70(param0, param1);