diff --git a/README.md b/README.md index 7ca65234..319b05ce 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd As of May 4, 2025, this is our current score: -    Decomp progress: 83.68% +    Decomp progress: 84.43%     Documentation progress: 53.79% @@ -121,16 +121,16 @@ As of May 4, 2025, this is our current score: ``` ======================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------- 83.68% Complete (85.23% NON_MATCHING) --------- - # Decompiled functions: 1875 - # GLOBAL_ASM remaining: 76 + -------- 84.43% Complete (85.98% NON_MATCHING) --------- + # Decompiled functions: 1877 + # GLOBAL_ASM remaining: 74 # NON_MATCHING functions: 8 # NON_EQUIVALENT WIP functions: 27 --------------------- Game Status ---------------------- Balloons: 39/47, Keys: 4/4, Trophies: 4/5 T.T. Amulets: 4/4, Wizpig Amulets: 4/4 -------------------------------------------------------- - We are racing the wizard pig boss Wizpig. (Lap 1/3) + We are racing the wizard pig boss Wizpig. (Lap 3/3) ======================================================== ADVENTURE TWO (Cleanup & Documentation) ------------------- 53.79% Complete -------------------- diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 95bd2916..24bbea94 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -885,6 +885,11 @@ typedef struct LevelObjectEntry_Unknown127 { LevelObjectEntryCommon common; } LevelObjectEntry_Unknown127; +typedef struct LevelObjectEntry_Hud { + LevelObjectEntryCommon common; + s32 unk8; +} LevelObjectEntry_Hud; + typedef struct LevelObjectEntry { union { LevelObjectEntry_Racer racer; @@ -978,6 +983,7 @@ typedef struct LevelObjectEntry { LevelObjectEntry800BF524 unk800BF524; LevelObjectEntry_WavePower wavePower; LevelObjectEntry_CharacterSelect characterSelect; + LevelObjectEntry_Hud hud; }; } LevelObjectEntry; diff --git a/src/game_ui.c b/src/game_ui.c index fc241886..b0e85c62 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -21,20 +21,6 @@ #include "joypad.h" #include "PRinternal/viint.h" -/************ .rodata ************/ - -const char D_800E8640[] = "CAN'T"; -const char D_800E8648[] = "SAVE"; -const char D_800E8650[] = "GHOST"; -const char D_800E8658[] = " CONTROLLER"; -const char D_800E8664[] = "PAK"; -const char D_800E8668[] = "FULL"; -const char D_800E8670[] = " CONTROLLER"; -const char D_800E867C[] = "PAK"; -const char D_800E8680[] = "DAMAGED"; - -/*********************************/ - /************ .data ************/ // Unused? @@ -103,7 +89,7 @@ HudElement gHudElementBase[HUD_ELEMENT_COUNT] = { { 0, 0, 0, HUD_SPRITE_PLACE_ST, 1.0f, 160.0f, 5.0f, 0.0f, 0, 0, 0, 0, 0 }, }; -u16 D_800E25C4[96] = { +s16 D_800E25C4[96] = { 0x0000, 0x0035, 0x0010, 0x0001, 0x0036, 0x0012, 0x0004, 0x00CB, 0x0013, 0x0005, 0x00D3, 0x0013, 0x0006, 0x00DC, 0x0013, 0x0002, 0xFF88, 0xFFE1, 0x001B, 0x0021, 0x0016, 0x0008, 0x00D3, 0x0013, 0x0009, 0x00DC, 0x0013, 0x000B, 0x00A7, 0x0013, 0x000E, 0x0000, 0x000A, 0x0010, 0x003B, 0x0023, 0x0011, 0x003B, 0x0023, 0x0007, 0x0021, 0x0016, @@ -318,7 +304,7 @@ void hud_init(UNUSED s32 viewportCount) { gPlayerHud[PLAYER_TWO] = (HudData *) ((u8 *) gPlayerHud[PLAYER_ONE] + sizeof(HudData)); gPlayerHud[PLAYER_THREE] = (HudData *) ((u8 *) gPlayerHud[PLAYER_TWO] + sizeof(HudData)); gPlayerHud[PLAYER_FOUR] = (HudData *) ((u8 *) gPlayerHud[PLAYER_THREE] + sizeof(HudData)); - func_8009F034(); + hud_init_element(); D_80126D64 = 0; gWrongWayNagTimer = 0; D_80126D48 = 0; @@ -347,8 +333,247 @@ void hud_init(UNUSED s32 viewportCount) { } } -// hud_init_element -#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/func_8009F034.s") +void hud_init_element(void) { + s32 i; + s32 j; + s32 activePlayers; + HudElement *hudElement; + s16 *temp800E2684; + s16 *temp800E25C4; + s32 k; + s32 var_v0; + + var_v0 = get_current_level_race_type(); + if ((var_v0 == 1) || (var_v0 == 5)) { + gHudOffsetX = 0; + gHudRaceStart = 1; + } else { + if (gHUDNumPlayers < 2) { + gHudOffsetX = 0x140; + gHudBounceMag = 2.0f; + } else { + gHudOffsetX = 0xC8; + gHudBounceMag = 2.0f; + } + gHudRaceStart = 0; + } + gHudBounceTimer = 0; + gRaceStartShowHudStep = 0; + gHideRaceTimer = 0; + gWrongWayNagPrefix = 0; + gHudSlide = 0; + gMinimapOpacity = 0; + gMinimapOpacityTarget = osTvType == OS_TV_TYPE_PAL ? 0x3C : 0x32; + gMinimapFade = 0; + gShowHUD = 0; + D_80126CD5 = 0; + D_80127189 = 0; + D_80126D4C = -0x64; + D_80126D50 = get_random_number_from_range(0x78, 0x168); + D_8012718A = func_8000E158(); + gStopwatchErrorX = 0x37; + gStopwatchErrorY = 0xB3; + if (osTvType == OS_TV_TYPE_PAL) { + gStopwatchErrorY += 0x1E; + gStopwatchErrorX -= 4; + } + gHudTimeTrialGhost = timetrial_ghost_staff() == NULL ? 0 : 1; + activePlayers = gNumActivePlayers != 3 ? gNumActivePlayers : 4; + for (j = 0; j < activePlayers; j++) { + gCurrentHud = gPlayerHud[j]; + for (k = 0; k < ARRAY_COUNT(gHudElementBase); k++) { + gCurrentHud->entry[k].pos.f[0] = gHudElementBase[k].pos.f[0]; + gCurrentHud->entry[k].pos.f[1] = gHudElementBase[k].pos.f[1]; + gCurrentHud->entry[k].pos.f[2] = gHudElementBase[k].pos.f[2]; + gCurrentHud->entry[k].scale = gHudElementBase[k].scale; + gCurrentHud->entry[k].rotation.s[2] = gHudElementBase[k].rotation.s[2]; + gCurrentHud->entry[k].rotation.s[1] = gHudElementBase[k].rotation.s[1]; + gCurrentHud->entry[k].rotation.s[0] = gHudElementBase[k].rotation.s[0]; + gCurrentHud->entry[k].spriteID = gHudElementBase[k].spriteID; + gCurrentHud->entry[k].spriteOffset = gHudElementBase[k].spriteOffset; + gCurrentHud->entry[k].timer.minutes = gHudElementBase[k].timer.minutes; + gCurrentHud->entry[k].timer.seconds = gHudElementBase[k].timer.seconds; + gCurrentHud->entry[k].timer.hundredths = gHudElementBase[k].timer.hundredths; + gCurrentHud->entry[k].timer.unk1D = gHudElementBase[k].timer.unk1D; + } + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.offsetY = 5; + if (gHUDNumPlayers == 1) { + for (temp800E25C4 = D_800E25C4; temp800E25C4[0] != -1; temp800E25C4 += 3) { + gCurrentHud->entry[temp800E25C4[0]].pos.f[0] = temp800E25C4[1]; + if ((gAssetHudElementIds[gCurrentHud->entry[temp800E25C4[0]].spriteID] & ASSET_MASK_TEXTURE) == + ASSET_MASK_TEXTURE) { + if (j == 0) { + gCurrentHud->entry[temp800E25C4[0]].pos.f[1] = temp800E25C4[2]; + } else { + gCurrentHud->entry[temp800E25C4[0]].pos.f[1] = temp800E25C4[2] + 0x6C; + } + } else if (j == 0) { + gCurrentHud->entry[temp800E25C4[0]].pos.f[1] = temp800E25C4[2] + 0x3C; + } else { + gCurrentHud->entry[temp800E25C4[0]].pos.f[1] = temp800E25C4[2] - 0x30; + } + } + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.f[0] = 263.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.f[1] = 17.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.f[0] = 247.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.f[1] = 45.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.f[0] = 259.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.f[1] = 49.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.f[0] = 103.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.f[1] = 49.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.f[0] = 264.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.f[1] = 50.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.f[0] = 265.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.f[1] = 51.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.f[0] = 274.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.f[1] = 51.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.f[1] = 17.0f; + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.offsetY = 3; + } else if ((gHUDNumPlayers == 2) || (gHUDNumPlayers == 3)) { + for (temp800E2684 = D_800E2684; temp800E2684[0] != -1; temp800E2684 += 4) { + if ((gAssetHudElementIds[gCurrentHud->entry[temp800E2684[0]].spriteID] & ASSET_MASK_TEXTURE) == + ASSET_MASK_TEXTURE) { + if ((j == 0) || (j == 2)) { + gCurrentHud->entry[temp800E2684[0]].pos.f[0] = temp800E2684[1]; + } else { + gCurrentHud->entry[temp800E2684[0]].pos.f[0] = temp800E2684[3] + 0xA0; + } + if ((j == 0) || (j == 1)) { + gCurrentHud->entry[temp800E2684[0]].pos.f[1] = temp800E2684[2]; + } else { + gCurrentHud->entry[temp800E2684[0]].pos.f[1] = temp800E2684[2] + 0x6C; + } + } else { + if ((j == 0) || (j == 2)) { + gCurrentHud->entry[temp800E2684[0]].pos.f[0] = temp800E2684[1] - 0x50; + } else { + gCurrentHud->entry[temp800E2684[0]].pos.f[0] = temp800E2684[3] + 0x50; + } + if ((j == 0) || (j == 1)) { + gCurrentHud->entry[temp800E2684[0]].pos.f[1] = temp800E2684[2] + 0x3C; + } else { + gCurrentHud->entry[temp800E2684[0]].pos.f[1] = temp800E2684[2] - 0x30; + } + } + } + } + if (gHUDNumPlayers != 0) { + for (i = 0; i < HUD_ELEMENT_COUNT; i++) { + if (gCurrentHud->entry[i].spriteID == 9) { + gCurrentHud->entry[i].spriteID = 0xA; + } else if (gCurrentHud->entry[i].spriteID == 4) { + gCurrentHud->entry[i].spriteID = 0xF; + } else if (gCurrentHud->entry[i].spriteID == 0xB) { + gCurrentHud->entry[i].spriteID = 0xC; + } else if (gCurrentHud->entry[i].spriteID == 0x12) { + gCurrentHud->entry[i].spriteID = 0x1C; + } else if (gCurrentHud->entry[i].spriteID == 0x36) { + gCurrentHud->entry[i].scale *= 0.6; + } else if ((i != 0) && (i != 1) && (i != 2) && (i != 37) && (i != 47) && (i != 48) && (i != 3) && + (i != 50) && (i != 51) && ((i < 52) || (i >= 56) || (i == 28) || (i == 9))) { + gCurrentHud->entry[i].scale *= 0.75; + } + } + } + if (gHUDNumPlayers >= 2) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].scale = 1.0f; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].scale = 1.0f; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].scale = 1.0f; + gCurrentHud->entry[HUD_RACE_START_GO].scale = 1.0f; + gCurrentHud->entry[HUD_RACE_START_READY].scale = 1.0f; + gCurrentHud->entry[HUD_WRONGWAY_1].scale = 1.0f; + gCurrentHud->entry[HUD_WRONGWAY_2].scale = 1.0f; + gCurrentHud->entry[HUD_RACE_END_FINISH].scale = 1.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].spriteID = 0x26; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].spriteID = 0x2B; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].spriteID = 0x29; + gCurrentHud->entry[HUD_RACE_START_GO].spriteID = 0x25; + gCurrentHud->entry[HUD_RACE_START_READY].spriteID = 0x27; + gCurrentHud->entry[HUD_WRONGWAY_1].spriteID = 0x2D; + gCurrentHud->entry[HUD_WRONGWAY_2].spriteID = 0x2C; + gCurrentHud->entry[HUD_RACE_END_FINISH].spriteID = 0x2A; + } else { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.prevLevel = 1; + // while weaponDisplay is not correct union "type" we need the value to be set to be a s8 instead of u8 + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].weaponDisplay.prevLevel = 1; + } + if (is_in_time_trial() != 0) { + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.f[0] += -25.0f; + gCurrentHud->entry[HUD_LAP_COUNT_CURRENT].pos.f[0] += -58.0f; + gCurrentHud->entry[HUD_LAP_COUNT_SEPERATOR].pos.f[0] += -58.0f; + gCurrentHud->entry[HUD_LAP_COUNT_TOTAL].pos.f[0] += -58.0f; + gCurrentHud->entry[HUD_LAP_COUNT_LABEL].pos.f[0] += -58.0f; + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].pos.f[0] += -58.0f; + } + switch (get_current_level_race_type()) { + case 0x8: + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.f[0] += -120.0f; + gCurrentHud->entry[HUD_LAP_COUNT_LABEL].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_CURRENT].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_SEPERATOR].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_TOTAL].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].pos.f[0] += 28.0f; + break; + case 0x41: + if (osTvType == OS_TV_TYPE_PAL) { + gCurrentHud->entry[HUD_TREASURE_METRE].pos.f[1] -= 4.0f; + } + if (gNumActivePlayers >= 3) { + var_v0 = (j == 0) || (j == 2) ? 0xF : -0xA; + } else { + var_v0 = gNumActivePlayers == 1 ? -0xA : 0; + } + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.f[0] += var_v0; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.f[0] += var_v0; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.f[0] += var_v0; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.f[0] += var_v0; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.f[0] += var_v0; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.f[0] += var_v0; + break; + } + if (is_taj_challenge() != 0) { + gCurrentHud->entry[HUD_LAP_COUNT_LABEL].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_CURRENT].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_SEPERATOR].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_TOTAL].pos.f[0] += 28.0f; + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].pos.f[0] += 28.0f; + } + if (osTvType == OS_TV_TYPE_PAL) { + for (k = 0; (k < HUD_ELEMENT_COUNT) ^ 0; k++) { + i = k; + gCurrentHud->entry[k].pos.f[1] *= 1.2; + gCurrentHud->entry[k].pos.f[0] -= 4.0f; + if ((gAssetHudElementIds[gCurrentHud->entry[k].spriteID] & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { + gCurrentHud->entry[i].pos.f[1] -= 10.0f; + } + } + + for (k = HUD_SPEEDOMETRE_0; k < HUD_SILVER_COIN_TALLY; k++) { + gCurrentHud->entry[k].pos.f[1] += 10.0f; + } + } + gCurrentHud->entry[HUD_BALLOON_COUNT_ICON].scale = 1.0f; + gCurrentHud->entry[HUD_BALLOON_COUNT_X].spriteID = 0x12; + gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1].spriteID = 9; + gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_2].spriteID = 9; + } + if (get_current_level_race_type() & 0x40) { + gPrevToggleSetting = gHudToggleSettings[1]; + gHudToggleSettings[1] = 0; + return; + } + gHudToggleSettings[1] = gPrevToggleSetting; +} /** * Frees all elements in the hud, and the player hud, and flushes particles @@ -1397,26 +1622,51 @@ void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { if (get_contpak_error() > 0) { // has to be defined here to match char *SWMessage[3]; + +#if REGION == REGION_JP switch (get_contpak_error()) { // Print "CAN'T SAVE GOST" case CONTPAK_ERROR_UNKNOWN: - SWMessage[2] = D_800E8640; - SWMessage[1] = D_800E8648; - SWMessage[0] = D_800E8650; + SWMessage[2] = D_800E42DC_E4EDC; + SWMessage[1] = D_800E42D4_E4ED4; + SWMessage[0] = D_800E42C8_E4EC8; break; // Print "CONTROLLER PAK FULL" case CONTPAK_ERROR_FULL: - SWMessage[2] = D_800E8658; - SWMessage[1] = D_800E8664; - SWMessage[0] = D_800E8668; + SWMessage[2] = D_800E42E8_E4EE8; + SWMessage[1] = D_800E42EC_E4EEC; + SWMessage[0] = D_800E42F4_E4EF4; break; // Print "CONTROLLER PAK DAMAGED" case CONTPAK_ERROR_DAMAGED: - SWMessage[2] = D_800E8670; - SWMessage[1] = D_800E867C; - SWMessage[0] = D_800E8680; + SWMessage[2] = D_800E42FC_E4EFC; + SWMessage[1] = D_800E4300_E4F00; + SWMessage[0] = D_800E4308_E4F08; break; } +#else + switch (get_contpak_error()) { + // Print "CAN'T SAVE GOST" + case CONTPAK_ERROR_UNKNOWN: + SWMessage[2] = "CAN'T"; + SWMessage[1] = "SAVE"; + SWMessage[0] = "GHOST"; + break; + // Print "CONTROLLER PAK FULL" + case CONTPAK_ERROR_FULL: + SWMessage[2] = " CONTROLLER"; + SWMessage[1] = "PAK"; + SWMessage[0] = "FULL"; + break; + // Print "CONTROLLER PAK DAMAGED" + case CONTPAK_ERROR_DAMAGED: + SWMessage[2] = " CONTROLLER"; + SWMessage[1] = "PAK"; + SWMessage[0] = "DAMAGED"; + break; + } +#endif + set_kerning(1); set_text_font(ASSET_FONTS_FUNFONT); // Draw text shadow. @@ -3481,8 +3731,187 @@ void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspec ((scaledX * angleSin) - (scaledY * angleCos)) + gMinimapDotOffsetY; } -// hud_draw_element -#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/hud_element_render.s") +void hud_element_render(Gfx **arg0, MatrixS **arg1, Vertex **arg2, HudElement *arg3) { + TextureHeader **textureHeader3; + TextureHeader *textureHeader2; + TextureHeader *textureHeader; + ObjectSegment *objSegment; + LevelObjectEntry_Hud sp9C; + UNUSED s32 pad1; + Object *tempObject; + HudDrawTexture sp88; + UNUSED s32 pad2[3]; + HudDrawTexture sp70; + s32 var_v1; + u32 var_v0; + s32 spriteID; + HudDrawTexture sp58; + UNUSED s32 pad3; + HudDrawTexture sp48; + Sprite *sprite; + UNUSED s32 pad4[2]; + s32 spriteElementId; + + spriteID = arg3->spriteID; + spriteElementId = gAssetHudElementIds[spriteID]; + if ((spriteElementId & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { + sp9C.unk8 = -gMinimapOpacity; + } else { + sp9C.unk8 = gMinimapOpacity; + } + + if (gAssetHudElements->entry[spriteID] == NULL) { + if ((spriteElementId & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { + gAssetHudElements->entry[arg3->spriteID] = load_texture(spriteElementId & 0x3FFF); + } else if (spriteElementId & ASSET_MASK_SPRITE) { + gAssetHudElements->entry[arg3->spriteID] = func_8007C12C(spriteElementId & 0x3FFF, 1); + } else if (spriteElementId & ASSET_MASK_OBJECT) { + sp9C.common.objectID = spriteElementId & 0xFF; + sp9C.common.size = ((gAssetHudElementIds[arg3->spriteID] & 0x100) >> 1) | 8; + sp9C.common.x = 0; + sp9C.common.y = 0; + sp9C.common.z = 0; + gAssetHudElements->entry[arg3->spriteID] = spawn_object((LevelObjectEntryCommon *) &sp9C, 0); + } else { + gAssetHudElements->entry[arg3->spriteID] = object_model_init(spriteElementId, 0); + } + + spriteID = arg3->spriteID; + if (gAssetHudElements->entry[spriteID] == NULL) { + return; + } + } + + gAssetHudElementStaleCounter[spriteID] = 0; + + gHudDL = *arg0; + gHudMtx = *arg1; + gHudVtx = *arg2; + spriteID = arg3->spriteID; + if (spriteID != 0x28) { + if ((spriteID != 0xE) && (spriteID != 0x1B) && ((spriteID < 0x2F) || (spriteID >= 0x36)) && + (spriteID != 0x2E) && (gMinimapXlu & 1)) { + arg3->pos.f[1] += sp9C.unk8; + } + arg3->pos.f[0] += gHudOffsetX + gHudBounceX; + } + spriteID = arg3->spriteID; + if ((gAssetHudElementIds[spriteID] & ASSET_MASK_TEXTURE) == ASSET_MASK_TEXTURE) { + if ((spriteID >= 0x2F) && (spriteID < 0x36)) { + if (osTvType == OS_TV_TYPE_PAL) { + arg3->pos.f[1] -= 8.0f; + } + + if (gMinimapXlu & 2) { + var_v1 = (255.0f - ((gMinimapOpacity * 255.0f) / gMinimapOpacityTarget)); + } else { + var_v1 = 0xFF; + } + spriteID = arg3->spriteID; + textureHeader = gAssetHudElements->entry[spriteID]; + textureHeader = + (TextureHeader *) (((u8 *) textureHeader) + arg3->spriteOffset * textureHeader->textureSize); + sp88.drawTexture.texture = textureHeader; + sp88.drawTexture.xOffset = arg3->pos.f[0]; + sp88.drawTexture.yOffset = arg3->pos.f[1]; + sp88.unk8 = 0; + if (osTvType == OS_TV_TYPE_PAL) { + if (arg3->spriteID == 0x35) { + if (var_v1 == 0xFF) { + var_v0 = -2; + } else { + var_v0 = var_v1 | ~0xFF; + } + sp88.drawTexture.xOffset = 0; + sp88.drawTexture.yOffset = 0; + texrect_draw_scaled(&gHudDL, &sp88.drawTexture, arg3->pos.f[0], arg3->pos.f[1], 1.0f, 1.1f, var_v0, + 1); + } else { + texrect_draw(&gHudDL, &sp88.drawTexture, 0, 0, 0xFF, 0xFF, 0xFF, var_v1); + } + } else { + texrect_draw(&gHudDL, &sp88.drawTexture, 0, 0, 0xFF, 0xFF, 0xFF, var_v1); + } + if (osTvType == OS_TV_TYPE_PAL) { + arg3->pos.f[1] += 8.0f; + } + } else if ((D_80126CD5 != 0) && (osTvType == OS_TV_TYPE_PAL)) { + textureHeader = gAssetHudElements->entry[spriteID]; + textureHeader = + (TextureHeader *) (((u8 *) textureHeader) + arg3->spriteOffset * textureHeader->textureSize); + sp70.drawTexture.texture = textureHeader; + sp70.drawTexture.xOffset = 0; + sp70.drawTexture.yOffset = 0; + sp70.unk8 = 0; + texrect_draw_scaled(&gHudDL, &sp70.drawTexture, arg3->pos.f[0], arg3->pos.f[1], arg3->scale, + arg3->scale * 1.1, gHudColour, 1); + } else if (arg3->scale == 1.0) { + textureHeader2 = gAssetHudElements->entry[spriteID]; + textureHeader2 = + (TextureHeader *) (((u8 *) textureHeader2) + arg3->spriteOffset * textureHeader2->textureSize); + if (gHudColour == -2) { + gHudSprites[D_80127180].texture = textureHeader2; + gHudSprites[D_80127180].xOffset = arg3->pos.f[0]; + gHudSprites[D_80127180].yOffset = arg3->pos.f[1]; + D_80127180++; + } else { + sp58.drawTexture.texture = textureHeader2; + sp58.drawTexture.xOffset = arg3->pos.f[0]; + sp58.drawTexture.yOffset = arg3->pos.f[1]; + sp58.unk8 = 0; + texrect_draw(&gHudDL, &sp58.drawTexture, 0, 0, (gHudColour >> 0x18) & 0xFF, (gHudColour >> 0x10) & 0xFF, + (gHudColour >> 8) & 0xFF, gHudColour & 0xFF); + rendermode_reset(&gHudDL); + } + } else { + textureHeader = gAssetHudElements->entry[spriteID]; + textureHeader = + (TextureHeader *) (((u8 *) textureHeader) + arg3->spriteOffset * textureHeader->textureSize); + sp48.drawTexture.texture = textureHeader; + sp48.drawTexture.xOffset = 0; + sp48.drawTexture.yOffset = 0; + sp48.unk8 = 0; + texrect_draw_scaled(&gHudDL, &sp48.drawTexture, arg3->pos.f[0], arg3->pos.f[1], arg3->scale, arg3->scale, + gHudColour, 1); + rendermode_reset(&gHudDL); + } + } else if (gAssetHudElementIds[spriteID] & ASSET_MASK_SPRITE) { + objSegment = get_active_camera_segment(); + sprite = gAssetHudElements->entry[arg3->spriteID]; + arg3->rotation.s[2] -= objSegment->trans.rotation.s[2]; + render_ortho_triangle_image(&gHudDL, &gHudMtx, &gHudVtx, (ObjectSegment *) arg3, sprite, 0); + arg3->rotation.s[2] += objSegment->trans.rotation.s[2]; + } else if (gAssetHudElementIds[spriteID] & ASSET_MASK_OBJECT) { + tempObject = gAssetHudElements->entry[spriteID]; + tempObject->segment.trans.rotation.x = arg3->rotation.s[0]; + tempObject->segment.trans.rotation.y = arg3->rotation.s[1]; + tempObject->segment.trans.rotation.z = arg3->rotation.s[2]; + tempObject->segment.trans.x_position = arg3->pos.f[0]; + tempObject->segment.trans.y_position = arg3->pos.f[1]; + tempObject->segment.trans.z_position = arg3->pos.f[2]; + tempObject->segment.trans.scale = arg3->scale; + tempObject->segment.object.modelIndex = 0; + tempObject->segment.object.opacity = 0xFF; + render_object(&gHudDL, &gHudMtx, &gHudVtx, tempObject); + } else { + camera_push_model_mtx(&gHudDL, &gHudMtx, (ObjectTransform *) arg3, 1.0f, 0.0f); + if (0) {} + textureHeader3 = gAssetHudElements->entry[arg3->spriteID]; + hud_draw_model((ObjectModel *) *textureHeader3); + apply_matrix_from_stack(&gHudDL); + } + spriteID = arg3->spriteID; + if (spriteID != 0x28) { + if ((spriteID != 0xE) && (spriteID != 0x1B) && ((spriteID < 0x2F) || (spriteID >= 0x36)) && + (spriteID != 0x2E) && (gMinimapXlu & 1)) { + arg3->pos.f[1] -= sp9C.unk8; + } + arg3->pos.f[0] -= gHudOffsetX + gHudBounceX; + } + *arg0 = gHudDL; + *arg1 = gHudMtx; + *arg2 = gHudVtx; +} /** * Renders a 3D model onscreen. diff --git a/src/game_ui.h b/src/game_ui.h index 3cc60120..a166b7ba 100644 --- a/src/game_ui.h +++ b/src/game_ui.h @@ -336,12 +336,12 @@ typedef struct HudElement_RaceTimeLabel { } HudElement_RaceTimeLabel; typedef struct HudElement { - Vec3s rotation; - s16 spriteID; - f32 scale; - Vec3f pos; - s16 spriteOffset; - union { + /* 0x00 */ Vec3s rotation; + /* 0x06 */ s16 spriteID; + /* 0x08 */ f32 scale; + /* 0x0C */ Vec3f pos; + /* 0x14 */ s16 spriteOffset; + /* 0x16 */ union { u8 filler[4]; // Ensures this union is 6 bytes, since Rare never actually use more than four. HudElement_ChallengeEggs challengeEggs; HudElement_RaceStartGo raceStartGo; @@ -382,6 +382,11 @@ typedef struct HudElements { void *entry[HUD_ELEMENT_COUNT]; } HudElements; +typedef struct HudDrawTexture { + DrawTexture drawTexture; + s32 unk8; // Field is always set to 0 and never read/written outside of hud_element_render +} HudDrawTexture; + extern u8 gGfxTaskYieldData[OS_YIELD_DATA_SIZE]; u8 race_starting(void); @@ -430,12 +435,10 @@ void hud_treasure(Object_Racer *racer); void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspectRatio); void hud_timer_render(s32 x, s32 y, s32 minutes, s32 seconds, s32 hundredths, s32 smallFont); void hud_draw_model(ObjectModel *objModel); - -// Non Matching void hud_element_render(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement *arg3); void hud_main_time_trial(s32, Object*, s32); void hud_race_finish_multiplayer(Object_Racer *racer, s32 updateRate); void func_800A1E48(Object*, s32 updateRate); -void func_8009F034(void); +void hud_init_element(void); #endif diff --git a/src/objects.c b/src/objects.c index 11b3d8a1..b08cef08 100644 --- a/src/objects.c +++ b/src/objects.c @@ -2396,7 +2396,8 @@ void obj_update(s32 updateRate) { func_800179D0(); // @fake - do { } while (0); + do { + } while (0); if (D_8011AF00 == 1) { if ((gEventCountdown == 0x50) && (gCutsceneID == 0)) { sp54 = 0; @@ -5483,7 +5484,7 @@ s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { temp = spD4[sp36C]; spD4[sp36C] = spD4[sp36C - 1]; spD4[sp36C - 1] = temp; - temp = sp54[sp36C] ; + temp = sp54[sp36C]; sp54[sp36C] = sp54[sp36C - 1] & 0xFF & 0xFF & 0xFF; sp54[sp36C - 1] = temp & 0xFF; sp36C--; @@ -6342,7 +6343,7 @@ void mode_init_taj_race(void) { D_8011ADC0 = 1; levelHeader->laps = 3; levelHeader->race_type = RACETYPE_DEFAULT; - func_8009F034(); + hud_init_element(); // clang-format off for (i = 0; i < ARRAY_COUNT(racer->lap_times); i++) { racer->lap_times[i] = 0; } // Must be a single line. // clang-format on diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 9c5656e9..3ee14017 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -1537,7 +1537,7 @@ is_drumstick_unlocked = 0x8009F294; // game_ui.c .text hud_init = 0x8009F2B0; -func_8009F034 = 0x8009F5F4; +hud_init_element = 0x8009F5F4; hud_free = 0x800A05FC; race_starting = 0x800A0750; hud_render_player = 0x800A0760; @@ -3397,17 +3397,17 @@ D_800E8520 = 0x800EA030; jpt_800E8574 = 0x800EA084; // game_ui .rodata -D_800E86A8 = 0x800EA160; // type:f64 function_owner:func_8009F034 -D_800E86B0 = 0x800EA168; // type:f64 function_owner:func_8009F034 -D_800E86B8 = 0x800EA170; // type:f32 function_owner:func_8009F034 -D_800E86BC = 0x800EA174; // type:f32 function_owner:func_8009F034 -D_800E86C0 = 0x800EA178; // type:f32 function_owner:func_8009F034 -D_800E86C8 = 0x800EA180; // type:f64 function_owner:func_8009F034 -D_800E86D0 = 0x800EA188; // type:f64 function_owner:func_8009F034 -D_800E86D8 = 0x800EA190; // type:f64 function_owner:func_8009F034 -D_800E86E0 = 0x800EA198; // type:f64 function_owner:func_8009F034 -D_800E86E8 = 0x800EA1A0; // type:f64 function_owner:func_8009F034 -D_800E86F0 = 0x800EA1A8; // type:f64 function_owner:func_8009F034 +D_800E86A8 = 0x800EA160; // type:f64 function_owner:hud_init_element +D_800E86B0 = 0x800EA168; // type:f64 function_owner:hud_init_element +D_800E86B8 = 0x800EA170; // type:f32 function_owner:hud_init_element +D_800E86BC = 0x800EA174; // type:f32 function_owner:hud_init_element +D_800E86C0 = 0x800EA178; // type:f32 function_owner:hud_init_element +D_800E86C8 = 0x800EA180; // type:f64 function_owner:hud_init_element +D_800E86D0 = 0x800EA188; // type:f64 function_owner:hud_init_element +D_800E86D8 = 0x800EA190; // type:f64 function_owner:hud_init_element +D_800E86E0 = 0x800EA198; // type:f64 function_owner:hud_init_element +D_800E86E8 = 0x800EA1A0; // type:f64 function_owner:hud_init_element +D_800E86F0 = 0x800EA1A8; // type:f64 function_owner:hud_init_element D_800E8718 = 0x800EA1D0; D_800E8720 = 0x800EA1D8; D_800E8728 = 0x800EA1E0; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 53704630..9bfba410 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -1530,7 +1530,7 @@ is_in_two_player_adventure = 0x8009ED14; is_tt_unlocked = 0x8009ED4C; is_drumstick_unlocked = 0x8009ED64; hud_init = 0x8009ED80; -func_8009F034 = 0x8009F0C4; +hud_init_element = 0x8009F0C4; hud_free = 0x800A00CC; race_starting = 0x800A0220; hud_render_player = 0x800A0230; @@ -3158,17 +3158,17 @@ D_800E8680 = 0x800E8710; // type:asciz defined:True D_800E8688 = 0x800E8718; D_800E8690 = 0x800E8720; D_800E8694 = 0x800E8724; -D_800E86A8 = 0x800E8738; // type:f64 function_owner:func_8009F034 -D_800E86B0 = 0x800E8740; // type:f64 function_owner:func_8009F034 -D_800E86B8 = 0x800E8748; // type:f32 function_owner:func_8009F034 -D_800E86BC = 0x800E874C; // type:f32 function_owner:func_8009F034 -D_800E86C0 = 0x800E8750; // type:f32 function_owner:func_8009F034 -D_800E86C8 = 0x800E8758; // type:f64 function_owner:func_8009F034 -D_800E86D0 = 0x800E8760; // type:f64 function_owner:func_8009F034 -D_800E86D8 = 0x800E8768; // type:f64 function_owner:func_8009F034 -D_800E86E0 = 0x800E8770; // type:f64 function_owner:func_8009F034 -D_800E86E8 = 0x800E8778; // type:f64 function_owner:func_8009F034 -D_800E86F0 = 0x800E8780; // type:f64 function_owner:func_8009F034 +D_800E86A8 = 0x800E8738; // type:f64 function_owner:hud_init_element +D_800E86B0 = 0x800E8740; // type:f64 function_owner:hud_init_element +D_800E86B8 = 0x800E8748; // type:f32 function_owner:hud_init_element +D_800E86BC = 0x800E874C; // type:f32 function_owner:hud_init_element +D_800E86C0 = 0x800E8750; // type:f32 function_owner:hud_init_element +D_800E86C8 = 0x800E8758; // type:f64 function_owner:hud_init_element +D_800E86D0 = 0x800E8760; // type:f64 function_owner:hud_init_element +D_800E86D8 = 0x800E8768; // type:f64 function_owner:hud_init_element +D_800E86E0 = 0x800E8770; // type:f64 function_owner:hud_init_element +D_800E86E8 = 0x800E8778; // type:f64 function_owner:hud_init_element +D_800E86F0 = 0x800E8780; // type:f64 function_owner:hud_init_element D_800E8718 = 0x800E87A8; D_800E871C = 0x800E87AC; // type:s32 padding D_800E8720 = 0x800E87B0; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 55ae6595..1cb07061 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -1451,7 +1451,7 @@ is_drumstick_unlocked = 0x8009F2A8; hud_init = 0x8009F2C0; -func_8009F034 = 0x8009F604; +hud_init_element = 0x8009F604; hud_free = 0x800A060C; race_starting = 0x800A0760; hud_render_player = 0x800A0770; @@ -3088,17 +3088,17 @@ D_800E867C = 0x800E8C9C; // type:asciz defined:True D_800E8680 = 0x800E8CA0; // type:asciz defined:True D_800E8688 = 0x800E8CA8; D_800E8690 = 0x800E8CB0; -D_800E86A8 = 0x800E8CB8; // type:f64 function_owner:func_8009F034 -D_800E86B0 = 0x800E8CC0; // type:f64 function_owner:func_8009F034 -D_800E86B8 = 0x800E8CC8; // type:f32 function_owner:func_8009F034 -D_800E86BC = 0x800E8CCC; // type:f32 function_owner:func_8009F034 -D_800E86C0 = 0x800E8CD0; // type:f32 function_owner:func_8009F034 -D_800E86C8 = 0x800E8CD8; // type:f64 function_owner:func_8009F034 -D_800E86D0 = 0x800E8CE0; // type:f64 function_owner:func_8009F034 -D_800E86D8 = 0x800E8CE8; // type:f64 function_owner:func_8009F034 -D_800E86E0 = 0x800E8CF0; // type:f64 function_owner:func_8009F034 -D_800E86E8 = 0x800E8CF8; // type:f64 function_owner:func_8009F034 -D_800E86F0 = 0x800E8D00; // type:f64 function_owner:func_8009F034 +D_800E86A8 = 0x800E8CB8; // type:f64 function_owner:hud_init_element +D_800E86B0 = 0x800E8CC0; // type:f64 function_owner:hud_init_element +D_800E86B8 = 0x800E8CC8; // type:f32 function_owner:hud_init_element +D_800E86BC = 0x800E8CCC; // type:f32 function_owner:hud_init_element +D_800E86C0 = 0x800E8CD0; // type:f32 function_owner:hud_init_element +D_800E86C8 = 0x800E8CD8; // type:f64 function_owner:hud_init_element +D_800E86D0 = 0x800E8CE0; // type:f64 function_owner:hud_init_element +D_800E86D8 = 0x800E8CE8; // type:f64 function_owner:hud_init_element +D_800E86E0 = 0x800E8CF0; // type:f64 function_owner:hud_init_element +D_800E86E8 = 0x800E8CF8; // type:f64 function_owner:hud_init_element +D_800E86F0 = 0x800E8D00; // type:f64 function_owner:hud_init_element D_800E8718 = 0x800E8D28; D_800E871C = 0x800E8D2C; // type:s32 padding D_800E8720 = 0x800E8D30; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 05f6fa16..e5bd80b4 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -1532,7 +1532,7 @@ is_drumstick_unlocked = 0x8009ECD0; // game_ui.c .text hud_init = 0x8009ECF0; -func_8009F034 = 0x8009F034; +hud_init_element = 0x8009F034; hud_free = 0x800A003C; race_starting = 0x800A0190; hud_render_player = 0x800A01A0; @@ -3503,17 +3503,17 @@ D_800E8680 = 0x800E8680; // type:asciz defined:True D_800E8688 = 0x800E8688; D_800E8690 = 0x800E8690; D_800E8694 = 0x800E8694; -D_800E86A8 = 0x800E86A8; // type:f64 function_owner:func_8009F034 -D_800E86B0 = 0x800E86B0; // type:f64 function_owner:func_8009F034 -D_800E86B8 = 0x800E86B8; // type:f32 function_owner:func_8009F034 -D_800E86BC = 0x800E86BC; // type:f32 function_owner:func_8009F034 -D_800E86C0 = 0x800E86C0; // type:f32 function_owner:func_8009F034 -D_800E86C8 = 0x800E86C8; // type:f64 function_owner:func_8009F034 -D_800E86D0 = 0x800E86D0; // type:f64 function_owner:func_8009F034 -D_800E86D8 = 0x800E86D8; // type:f64 function_owner:func_8009F034 -D_800E86E0 = 0x800E86E0; // type:f64 function_owner:func_8009F034 -D_800E86E8 = 0x800E86E8; // type:f64 function_owner:func_8009F034 -D_800E86F0 = 0x800E86F0; // type:f64 function_owner:func_8009F034 +D_800E86A8 = 0x800E86A8; // type:f64 function_owner:hud_init_element +D_800E86B0 = 0x800E86B0; // type:f64 function_owner:hud_init_element +D_800E86B8 = 0x800E86B8; // type:f32 function_owner:hud_init_element +D_800E86BC = 0x800E86BC; // type:f32 function_owner:hud_init_element +D_800E86C0 = 0x800E86C0; // type:f32 function_owner:hud_init_element +D_800E86C8 = 0x800E86C8; // type:f64 function_owner:hud_init_element +D_800E86D0 = 0x800E86D0; // type:f64 function_owner:hud_init_element +D_800E86D8 = 0x800E86D8; // type:f64 function_owner:hud_init_element +D_800E86E0 = 0x800E86E0; // type:f64 function_owner:hud_init_element +D_800E86E8 = 0x800E86E8; // type:f64 function_owner:hud_init_element +D_800E86F0 = 0x800E86F0; // type:f64 function_owner:hud_init_element D_800E8718 = 0x800E8718; D_800E871C = 0x800E871C; // type:s32 padding D_800E8720 = 0x800E8720; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index a6fc03d4..0f2d00bf 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -1450,7 +1450,7 @@ is_tt_unlocked = 0x8009F1FC; is_drumstick_unlocked = 0x8009F214; hud_init = 0x8009F230; -func_8009F034 = 0x8009F574; +hud_init_element = 0x8009F574; hud_free = 0x800A057C; race_starting = 0x800A06D0; hud_render_player = 0x800A06E0; @@ -3084,17 +3084,17 @@ D_800E867C = 0x800E8C0C; // type:asciz defined:True D_800E8680 = 0x800E8C10; // type:asciz defined:True D_800E8688 = 0x800E8C18; D_800E8690 = 0x800E8C20; -D_800E86A8 = 0x800E8C28; // type:f64 function_owner:func_8009F034 -D_800E86B0 = 0x800E8C30; // type:f64 function_owner:func_8009F034 -D_800E86B8 = 0x800E8C38; // type:f32 function_owner:func_8009F034 -D_800E86BC = 0x800E8C3C; // type:f32 function_owner:func_8009F034 -D_800E86C0 = 0x800E8C40; // type:f32 function_owner:func_8009F034 -D_800E86C8 = 0x800E8C48; // type:f64 function_owner:func_8009F034 -D_800E86D0 = 0x800E8C50; // type:f64 function_owner:func_8009F034 -D_800E86D8 = 0x800E8C58; // type:f64 function_owner:func_8009F034 -D_800E86E0 = 0x800E8C60; // type:f64 function_owner:func_8009F034 -D_800E86E8 = 0x800E8C68; // type:f64 function_owner:func_8009F034 -D_800E86F0 = 0x800E8C70; // type:f64 function_owner:func_8009F034 +D_800E86A8 = 0x800E8C28; // type:f64 function_owner:hud_init_element +D_800E86B0 = 0x800E8C30; // type:f64 function_owner:hud_init_element +D_800E86B8 = 0x800E8C38; // type:f32 function_owner:hud_init_element +D_800E86BC = 0x800E8C3C; // type:f32 function_owner:hud_init_element +D_800E86C0 = 0x800E8C40; // type:f32 function_owner:hud_init_element +D_800E86C8 = 0x800E8C48; // type:f64 function_owner:hud_init_element +D_800E86D0 = 0x800E8C50; // type:f64 function_owner:hud_init_element +D_800E86D8 = 0x800E8C58; // type:f64 function_owner:hud_init_element +D_800E86E0 = 0x800E8C60; // type:f64 function_owner:hud_init_element +D_800E86E8 = 0x800E8C68; // type:f64 function_owner:hud_init_element +D_800E86F0 = 0x800E8C70; // type:f64 function_owner:hud_init_element D_800E8718 = 0x800E8C98; D_800E871C = 0x800E8C9C; // type:s32 padding D_800E8720 = 0x800E8CA0;