From 79654e9e59193e3871854ae97cb927be73dd9031 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Sat, 29 Mar 2025 18:05:09 +0000 Subject: [PATCH] game_ui.c rework (#493) * got overzealous with the alignments * small knowledge improvement on models * true * add enum size entries for easy ref * bgload names I forgot to merge in * transition memes * absinthe * brug * anguish * hell * getting there * misery * Update README.md * Update include/structs.h Co-authored-by: Ryan Myers * format moment * Delete object_animate.s * Update obj_animate.s * remembered to rename this --------- Co-authored-by: Ryan Myers --- Makefile | 1 - README.md | 30 +- include/asset_enums.h | 84 +- include/enums.h | 3 +- include/save_layout.h | 6 +- include/structs.h | 37 +- src/audio_spatial.c | 6 +- src/audio_spatial.h | 2 +- src/borders.c | 2 +- src/camera.c | 108 +- src/camera.h | 22 +- src/fade_transition.c | 155 +- src/fade_transition.h | 35 +- src/font.c | 76 +- src/font.h | 10 +- src/game.c | 2 +- src/game_ui.c | 2138 +++++++++-------- src/game_ui.h | 363 ++- src/hasm/{object_animate.s => obj_animate.s} | 4 +- .../{unknown_0251F0.s => obj_shade_fast.s} | 4 +- src/menu.c | 69 +- src/menu.h | 4 +- src/object_functions.c | 12 +- src/object_models.c | 150 +- src/object_models.h | 11 +- src/objects.c | 199 +- src/objects.h | 31 +- src/printf.c | 14 +- src/racer.c | 26 +- src/rcp_dkr.c | 57 +- src/rcp_dkr.h | 8 +- src/screen_asset.c | 10 +- src/set_rsp_segment.c | 4 +- src/set_rsp_segment.h | 2 +- src/textures_sprites.c | 128 +- src/textures_sprites.h | 14 +- ...ad30_track_loading.c => thread30_bgload.c} | 20 +- src/thread30_bgload.h | 14 + src/thread30_track_loading.h | 14 - src/thread3_main.c | 38 +- src/tracks.c | 10 +- .../prebuild/makeIncludes/assetEnums.cpp | 8 + ver/splat/dkr.jpn.v79.yaml | 10 +- ver/splat/dkr.pal.v77.yaml | 10 +- ver/splat/dkr.pal.v80.yaml | 10 +- ver/splat/dkr.us.v77.yaml | 10 +- ver/splat/dkr.us.v80.yaml | 10 +- ver/symbols/symbol_addrs.jpn.v79.txt | 168 +- ver/symbols/symbol_addrs.pal.v77.txt | 162 +- ver/symbols/symbol_addrs.pal.v80.txt | 158 +- ver/symbols/symbol_addrs.us.v77.txt | 168 +- ver/symbols/symbol_addrs.us.v80.txt | 158 +- 52 files changed, 2532 insertions(+), 2263 deletions(-) rename src/hasm/{object_animate.s => obj_animate.s} (99%) rename src/hasm/{unknown_0251F0.s => obj_shade_fast.s} (99%) rename src/{thread30_track_loading.c => thread30_bgload.c} (80%) create mode 100644 src/thread30_bgload.h delete mode 100644 src/thread30_track_loading.h diff --git a/Makefile b/Makefile index 3256d4ba..55095c0f 100755 --- a/Makefile +++ b/Makefile @@ -275,7 +275,6 @@ $(GCC_SAFE_FILES): CFLAGS := -DNDEBUG -DAVOID_UB -DNON_MATCHING -O2 $(INCLUDE_CF -fno-zero-initialized-in-bss \ -fsingle-precision-constant \ -funsigned-char \ - -mips3 \ -fwrapv \ -falign-functions=16 \ -G 0 diff --git a/README.md b/README.md index 3123bd56..0542091f 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of March 20, 2025, this is our current score: +As of March 28, 2025, this is our current score: -    Decomp progress: 75.88% +    Decomp progress: 76.84% -    Documentation progress: 50.30% +    Documentation progress: 49.86% --- @@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) { ``` -As of March 20, 2025, this is our current score: +As of March 28, 2025, this is our current score: ``` ======================================================================= ADVENTURE ONE (ASM -> C Decompilation) - ---------------- 75.88% Complete (78.10% NON_MATCHING) ---------------- - # Decompiled functions: 1831 - # GLOBAL_ASM remaining: 110 - # NON_MATCHING functions: 13 - # NON_EQUIVALENT WIP functions: 36 + ---------------- 76.84% Complete (79.45% NON_MATCHING) ---------------- + # Decompiled functions: 1837 + # GLOBAL_ASM remaining: 114 + # NON_MATCHING functions: 14 + # NON_EQUIVALENT WIP functions: 35 ----------------------------- Game Status ----------------------------- Balloons: 36/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 ----------------------------------------------------------------------- - We are collecting silver coins in Greenwood Village. (0/8 silver coins) + We are collecting silver coins in Greenwood Village. (6/8 silver coins) ======================================================================= ADVENTURE TWO (Cleanup & Documentation) - --------------------------- 50.30% Complete --------------------------- - # Documented functions: 1092 - # Undocumented remaining: 555 + --------------------------- 49.86% Complete --------------------------- + # Documented functions: 1088 + # Undocumented remaining: 566 ----------------------------- Game Status ----------------------------- - Balloons: 25/47, Keys: 3/4, Trophies: 2/5 + Balloons: 24/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 ----------------------------------------------------------------------- - We are racing in Treasure Caves. (Lap 1/3) + We are racing in Pirate Lagoon. (Lap 3/3) ======================================================================= ``` diff --git a/include/asset_enums.h b/include/asset_enums.h index bda237d6..0ee4cb34 100644 --- a/include/asset_enums.h +++ b/include/asset_enums.h @@ -55,7 +55,9 @@ typedef enum AssetSectionsEnum { ASSET_BINARY_46, ASSET_BINARY_47, ASSET_TTGHOSTS_TABLE, - ASSET_TTGHOSTS + ASSET_TTGHOSTS, + + ASSET_SECTIONS_COUNT } AssetSectionsEnum; /********** ASSET_AI_BEHAVIOUR **********/ @@ -70,7 +72,9 @@ typedef enum AssetAiBehaviourEnum { ASSET_AI_BEHAVIOUR_6, ASSET_AI_BEHAVIOUR_7, ASSET_AI_BEHAVIOUR_8, - ASSET_AI_BEHAVIOUR_9 + ASSET_AI_BEHAVIOUR_9, + + ASSET_AI_BEHAVIOUR_COUNT } AssetAiBehaviourEnum; /********** ASSET_TEXTURES_3D **********/ @@ -1476,7 +1480,9 @@ typedef enum AssetTextures3dEnum { ASSET_TEX3D_COMMON_SAND6, ASSET_TEX3D_TROPICAL_PALMTREESHADOWLONG, ASSET_TEX3D_COMMON_DEBUGBLACKWHITE, - ASSET_TEX3D_SPACE_RAREWARESIGNNONBLINKING + ASSET_TEX3D_SPACE_RAREWARESIGNNONBLINKING, + + ASSET_TEXTURES_3D_COUNT } AssetTextures3dEnum; /********** ASSET_TEXTURES_2D **********/ @@ -2387,7 +2393,9 @@ typedef enum AssetTextures2dEnum { ASSET_TEX2D_MENU_ICONTTAMULET3_0, ASSET_TEX2D_MENU_ICONTTAMULET3_1, ASSET_TEX2D_MENU_ICONTTAMULET4_0, - ASSET_TEX2D_MENU_ICONTTAMULET4_1 + ASSET_TEX2D_MENU_ICONTTAMULET4_1, + + ASSET_TEXTURES_2D_COUNT } AssetTextures2dEnum; /********** ASSET_GAME_TEXT **********/ @@ -2647,7 +2655,9 @@ typedef enum AssetGameTextEnum { ASSET_GAME_TEXT_251, ASSET_GAME_TEXT_252, ASSET_GAME_TEXT_253, - ASSET_GAME_TEXT_254 + ASSET_GAME_TEXT_254, + + ASSET_GAME_TEXT_COUNT } AssetGameTextEnum; /********** ASSET_MENU_TEXT **********/ @@ -2845,7 +2855,9 @@ typedef enum AssetMenuTextIdsEnum { ASSET_MENU_TEXT_SUBTITLESON, ASSET_MENU_TEXT_SUBTITLESOFF, ASSET_MENU_TEXT_CORRUPTDATA_0, - ASSET_MENU_TEXT_CORRUPTDATA_1 + ASSET_MENU_TEXT_CORRUPTDATA_1, + + ASSET_MENU_TEXT_COUNT } AssetMenuTextIdsEnum; /********** ASSET_SPRITES **********/ @@ -3043,7 +3055,9 @@ typedef enum AssetSpritesEnum { ASSET_SPRITE_MENU_ICONTROPHY, ASSET_SPRITE_MENU_ICONKEY, ASSET_SPRITE_MENU_ICONWIZPIGAMULET, - ASSET_SPRITE_MENU_ICONTTAMULET + ASSET_SPRITE_MENU_ICONTTAMULET, + + ASSET_SPRITES_COUNT } AssetSpritesEnum; /********** ASSET_MISC **********/ @@ -3118,7 +3132,9 @@ typedef enum AssetMiscEnum { ASSET_MISC_TITLE_SCREEN_DEMO_IDS, ASSET_MISC_67, ASSET_MISC_68, - ASSET_MISC_69 + ASSET_MISC_69, + + ASSET_MISC_COUNT } AssetMiscEnum; /********** ASSET_LEVEL_OBJECT_MAPS **********/ @@ -3261,7 +3277,9 @@ typedef enum AssetLevelObjectMapsEnum { ASSET_LEVEL_OBJECT_MAPS_134, ASSET_LEVEL_OBJECT_MAPS_135, ASSET_LEVEL_OBJECT_MAPS_136, - ASSET_LEVEL_OBJECT_MAPS_137 + ASSET_LEVEL_OBJECT_MAPS_137, + + ASSET_LEVEL_OBJECT_MAPS_COUNT } AssetLevelObjectMapsEnum; /********** ASSET_LEVEL_HEADERS **********/ @@ -3331,7 +3349,9 @@ typedef enum AssetLevelHeadersEnum { ASSET_LEVEL_BUBBLERANIM, ASSET_LEVEL_WIZPIG2ANIM, ASSET_LEVEL_LASTBIT, - ASSET_LEVEL_LASTBITB + ASSET_LEVEL_LASTBITB, + + ASSET_LEVEL_HEADERS_COUNT } AssetLevelHeadersEnum; /********** ASSET_LEVEL_NAMES **********/ @@ -3401,7 +3421,9 @@ typedef enum AssetLevelNamesEnum { ASSET_LEVEL_BUBBLERANIM_NAME, ASSET_LEVEL_WIZPIG2ANIM_NAME, ASSET_LEVEL_LASTBIT_NAME, - ASSET_LEVEL_LASTBITB_NAME + ASSET_LEVEL_LASTBITB_NAME, + + ASSET_LEVEL_NAMES_COUNT } AssetLevelNamesEnum; /********** ASSET_LEVEL_MODELS **********/ @@ -3461,7 +3483,9 @@ typedef enum AssetLevelModelsEnum { ASSET_LEVELMODEL_WIZPIG2ANIMATION, ASSET_LEVELMODEL_WIZPIG2, ASSET_LEVELMODEL_ENDINGPART1, - ASSET_LEVELMODEL_ENDINGPART2 + ASSET_LEVELMODEL_ENDINGPART2, + + ASSET_LEVEL_MODELS_COUNT } AssetLevelModelsEnum; /********** ASSET_OBJECT_MODELS **********/ @@ -3856,7 +3880,9 @@ typedef enum AssetObjectModelsEnum { ASSET_OBJECTMODEL_TTDOOR_2, ASSET_OBJECTMODEL_PIGLOG, ASSET_OBJECTMODEL_KEITHPIGDOOR, - ASSET_OBJECTMODEL_MAGNETFX + ASSET_OBJECTMODEL_MAGNETFX, + + ASSET_OBJECT_MODELS_COUNT } AssetObjectModelsEnum; /********** ASSET_OBJECT_ANIMATIONS **********/ @@ -4331,7 +4357,9 @@ typedef enum AssetObjectAnimationsEnum { ASSET_OBJECT_ANIMATIONS_466, ASSET_OBJECT_ANIMATIONS_467, ASSET_OBJECT_ANIMATIONS_468, - ASSET_OBJECT_ANIMATIONS_469 + ASSET_OBJECT_ANIMATIONS_469, + + ASSET_OBJECT_ANIMATIONS_COUNT } AssetObjectAnimationsEnum; /********** ASSET_OBJECTS **********/ @@ -4640,7 +4668,9 @@ typedef enum AssetObjectsEnum { ASSET_OBJECT_LIGHTNING, ASSET_OBJECT_MIDIFADEPOINT, ASSET_OBJECT_LEVELNAME, - ASSET_OBJECT_MIDICHSET + ASSET_OBJECT_MIDICHSET, + + ASSET_OBJECTS_COUNT } AssetObjectsEnum; /********** ASSET_LEVEL_OBJECT_TRANSLATION_TABLE **********/ @@ -4950,7 +4980,9 @@ typedef enum AssetLevelObjectTranslationTableEnum { NULL_OBJECT_301_ID, ASSET_OBJECT_ID_LIGHTHOUSE2, ASSET_OBJECT_ID_CHICKENCHARACTE, - ASSET_OBJECT_ID_INFOPOINT + ASSET_OBJECT_ID_INFOPOINT, + + ASSET_LEVEL_OBJECT_TRANSLATION_TABLE_COUNT } AssetLevelObjectTranslationTableEnum; /********** ASSET_AUDIO **********/ @@ -4968,7 +5000,9 @@ typedef enum AssetAudioEnum { ASSET_AUDIO_9, ASSET_AUDIO_10, ASSET_AUDIO_11, - ASSET_AUDIO_12 + ASSET_AUDIO_12, + + ASSET_AUDIO_COUNT } AssetAudioEnum; /********** ASSET_PARTICLES **********/ @@ -5043,7 +5077,9 @@ typedef enum AssetParticlesEnum { ASSET_PARTICLES_66, ASSET_PARTICLES_67, ASSET_PARTICLES_68, - ASSET_PARTICLES_69 + ASSET_PARTICLES_69, + + ASSET_PARTICLES_COUNT } AssetParticlesEnum; /********** ASSET_PARTICLE_BEHAVIORS **********/ @@ -5123,7 +5159,9 @@ typedef enum AssetParticleBehaviorsEnum { ASSET_PARTICLE_BEHAVIORS_71, ASSET_PARTICLE_BEHAVIORS_72, ASSET_PARTICLE_BEHAVIORS_73, - ASSET_PARTICLE_BEHAVIORS_74 + ASSET_PARTICLE_BEHAVIORS_74, + + ASSET_PARTICLE_BEHAVIORS_COUNT } AssetParticleBehaviorsEnum; /********** ASSET_FONTS **********/ @@ -5132,7 +5170,9 @@ typedef enum AssetFontsEnum { ASSET_FONTS_FUNFONT, ASSET_FONTS_SMALLFONT, ASSET_FONTS_BIGFONT, - ASSET_FONTS_SUBTITLEFONT + ASSET_FONTS_SUBTITLEFONT, + + ASSET_FONTS_COUNT } AssetFontsEnum; /********** ASSET_TTGHOSTS **********/ @@ -5157,7 +5197,9 @@ typedef enum AssetTtghostsEnum { ASSET_TTGHOSTS_TREASURECAVES, ASSET_TTGHOSTS_HAUNTEDWOODS, ASSET_TTGHOSTS_DARKMOONCAVERNS, - ASSET_TTGHOSTS_STARCITY + ASSET_TTGHOSTS_STARCITY, + + ASSET_TTGHOSTS_COUNT } AssetTtghostsEnum; #endif diff --git a/include/enums.h b/include/enums.h index b0dea8bd..1ed6cbce 100644 --- a/include/enums.h +++ b/include/enums.h @@ -37,7 +37,8 @@ typedef enum Vehicle { VEHICLE_PLANE, VEHICLE_FLYING_CAR, VEHICLE_LOOPDELOOP, - VEHICLE_TRICKY, + VEHICLE_BOSSES, + VEHICLE_TRICKY = VEHICLE_BOSSES, VEHICLE_BLUEY, VEHICLE_SMOKEY, VEHICLE_PTERODACTYL, diff --git a/include/save_layout.h b/include/save_layout.h index 0faa12e1..ed478829 100644 --- a/include/save_layout.h +++ b/include/save_layout.h @@ -134,7 +134,7 @@ typedef struct SaveConfig { unsigned subtitles : 1; unsigned unk0 : 31; // unsigned checksum : 8; // For some reason, the struct becomes 12 bytes if this is there. -} SaveConfig ALIGNED8; +} SaveConfig; typedef struct SaveFile { unsigned checksum : 16; @@ -207,13 +207,13 @@ typedef struct SaveFile { unsigned sceneWorld5Key : 1; // Unused unsigned name : 15; -} SaveFile ALIGNED8; +} SaveFile; typedef struct CourseRecords { u16 checksum; u16 padding; u32 courseTime[COURSE_RECORD_TOTAL]; -} CourseRecords ALIGNED8; +} CourseRecords; typedef struct SaveBuffer { SaveFile gameSave[NUMBER_OF_SAVE_FILES]; diff --git a/include/structs.h b/include/structs.h index f92a3349..9f5bc0f1 100644 --- a/include/structs.h +++ b/include/structs.h @@ -24,6 +24,16 @@ typedef struct Vec3f { }; } Vec3f; +typedef struct Vec2f { + union { + struct { + f32 x; + f32 y; + }; + f32 f[2]; + }; +} Vec2f; + typedef struct Vec3s { union { struct { @@ -40,6 +50,20 @@ typedef struct Vec3s { }; } Vec3s; +typedef struct Vec2s { + union { + struct { + s16 y_rotation; + s16 x_rotation; + }; + struct { + s16 x; + s16 y; + }; + s16 s[2]; + }; +} Vec2s; + typedef struct Vec3i { union { struct { @@ -628,6 +652,7 @@ typedef struct ObjectModel { /* 0x4C */ s32 *unk4C; /* 0x50 */ s16 unk50; /* 0x52 */ s16 unk52; + /* 0x54 */ u8 pad[0x2C]; } ObjectModel; /* Size: 0x44 bytes */ @@ -1367,7 +1392,7 @@ typedef struct Object_Racer { /* 0x291 */ s8 indicator_timer; /* 0x1FA */ s8 drifting; /* 0x1FB */ s8 unk1FB; - /* 0x1FC */ u8 unk1FC; + /* 0x1FC */ u8 wrongWayCounter; /* 0x1FD */ s8 cameraIndex; /* 0x1FE */ u8 unk1FE; /* 0x1FF */ u8 unk1FF; @@ -1669,7 +1694,7 @@ typedef struct Object_68 { ObjectModel *objModel; TextureHeader *texHeader; }; - /* 0x04 */ Vertex *unk4[2]; + /* 0x04 */ Vertex *vertices[2]; /* 0x0C */ s32 *unkC; /* 0x10 */ s16 animationID; /* 0x12 */ s16 animationFrame; @@ -1677,10 +1702,10 @@ typedef struct Object_68 { /* 0x16 */ s16 offsetX; /* 0x18 */ s16 offsetY; /* 0x1A */ s16 offsetZ; - /* 0x1C */ s16 unk1C; - /* 0x1E */ s8 unk1E; + /* 0x1C */ s16 headTilt; + /* 0x1E */ s8 modelType; /* 0x1F */ s8 animationTaskNum; - /* 0x20 */ s8 unk20; + /* 0x20 */ s8 animUpdateTimer; /* 0x21 */ s8 unk21; /* 0x22 */ s16 unk22; /* 0x24 */ s32 unk24; @@ -1882,7 +1907,7 @@ typedef struct Object_LightData { /* Size: 0x0630 bytes */ typedef struct Object { /* 0x0000 */ ObjectSegment segment; - /* 0x0044 */ Vertex *unk44; + /* 0x0044 */ Vertex *curVertData; /* 0x0048 */ s16 behaviorId; /* 0x004A */ s16 objectID; // First 9 bits are object ID, last 7 bits are header size /* 0x004C */ ObjectInteraction *interactObj; //player + 0x318 diff --git a/src/audio_spatial.c b/src/audio_spatial.c index ecbf8030..efac3a07 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -483,7 +483,7 @@ void func_8000A2E8(s32 arg0) { * Generates and renders a coloured line visible from anywhere. * Allows use of a colour, that interpolates from bright to dark from the beginning to the end of the line. */ -void debug_render_line(Gfx **dlist, Vertex **verts, Triangle **tris, floatXYZVals *coords, u8 red, u8 green, u8 blue) { +void debug_render_line(Gfx **dList, Vertex **verts, Triangle **tris, floatXYZVals *coords, u8 red, u8 green, u8 blue) { Gfx *temp_dlist; Vertex *temp_verts; Triangle *temp_tris; @@ -500,7 +500,7 @@ void debug_render_line(Gfx **dlist, Vertex **verts, Triangle **tris, floatXYZVal x2 = coords->x2; y2 = coords->y2; z2 = coords->z2; - temp_dlist = *dlist; + temp_dlist = *dList; temp_verts = *verts; temp_tris = *tris; @@ -559,7 +559,7 @@ void debug_render_line(Gfx **dlist, Vertex **verts, Triangle **tris, floatXYZVal temp_tris[1].uv2.v = 0; temp_tris += 2; - *dlist = temp_dlist; + *dList = temp_dlist; *verts = temp_verts; *tris = temp_tris; } diff --git a/src/audio_spatial.h b/src/audio_spatial.h index e885214b..23d54701 100644 --- a/src/audio_spatial.h +++ b/src/audio_spatial.h @@ -62,7 +62,7 @@ void func_800095E8(u16 soundId, f32 x, f32 y, f32 z, u8 arg4, u8 arg5, f32 pitch void audioline_ambient_create(u8 arg0, u16 soundId, f32 x, f32 y, f32 z, u8 arg5, u8 arg6, u8 arg7, u8 arg8, u16 arg9, u8 argA, u8 lineID, u8 argC); s32 func_800099EC(u8 arg0); -void debug_render_line(Gfx **dlist, Vertex **verts, Triangle **tris, floatXYZVals *coords, u8 red, u8 green, u8 blue); +void debug_render_line(Gfx **dList, Vertex **verts, Triangle **tris, floatXYZVals *coords, u8 red, u8 green, u8 blue); void func_80006BFC(Object *obj, ObjectSegment *segment, Object *obj2, s32 updateRate); void update_spatial_audio_position(SoundMask *arg0, f32 x, f32 y, f32 z); s32 func_80009AB4(u8 arg0); diff --git a/src/borders.c b/src/borders.c index deac9ae0..730dc5a1 100644 --- a/src/borders.c +++ b/src/borders.c @@ -36,7 +36,7 @@ void divider_draw(Gfx **dList) { case VIEWPORTS_COUNT_3_PLAYERS: levelHeader = get_current_level_header(); // Draw black square in the bottom-right corner. - if (get_hud_setting() || (levelHeader->race_type & RACETYPE_CHALLENGE)) { + if (hud_setting() || (levelHeader->race_type & RACETYPE_CHALLENGE)) { gDPFillRectangle((*dList)++, width >> 1, height >> 1, width, height); } // There is no break statement here. This is intentional. diff --git a/src/camera.c b/src/camera.c index 3efb8a69..e0a74c1d 100644 --- a/src/camera.c +++ b/src/camera.c @@ -609,7 +609,7 @@ UNUSED void copy_framebuffer_size_to_coords(s32 *x1, s32 *y1, s32 *x2, s32 *y2) #define SCISSOR_INTERLACE G_SC_NON_INTERLACE // viewport_main -void func_80066CDC(Gfx **dlist, MatrixS **mats) { +void func_80066CDC(Gfx **dList, MatrixS **mats) { u32 y; u32 x; u32 pad0; @@ -639,13 +639,13 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { if (gScreenViewports[savedCameraID].flags & VIEWPORT_EXTRA_BG) { tempCameraID = gActiveCameraID; gActiveCameraID = savedCameraID; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, gScreenViewports[gActiveCameraID].scissorX1, + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, gScreenViewports[gActiveCameraID].scissorX1, gScreenViewports[gActiveCameraID].scissorY1, gScreenViewports[gActiveCameraID].scissorX2, gScreenViewports[gActiveCameraID].scissorY2); - viewport_rsp_set(dlist, 0, 0, 0, 0); + viewport_rsp_set(dList, 0, 0, 0, 0); gActiveCameraID = tempCameraID; if (mats != NULL) { - func_80067D3C(dlist, mats); + func_80067D3C(dList, mats); } gActiveCameraID = originalCameraID; return; @@ -674,7 +674,7 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { // Fake match if (!gScreenViewports[gActiveCameraID].scissorX2) {} } - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, videoWidth, videoHeight); + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, 0, 0, videoWidth, videoHeight); posX = x; break; case VIEWPORTS_COUNT_2_PLAYERS: @@ -685,12 +685,12 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { if (osTvType == OS_TV_TYPE_PAL) { posY -= 12; } - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, videoWidth, y - (videoHeight >> 7)); + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, 0, 0, videoWidth, y - (videoHeight >> 7)); } else { // second player has bottom half posY = sp58_height; posY += videoHeight >> 2; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, y + (videoHeight >> 7), videoWidth, + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, 0, y + (videoHeight >> 7), videoWidth, videoHeight - (videoHeight >> 7)); } posX = x; @@ -703,10 +703,10 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { // bottom right has map of race track if (gActiveCameraID == 0) { posX = videoWidth >> 2; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, 0, x - (videoWidth >> 8), videoHeight); + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, 0, 0, x - (videoWidth >> 8), videoHeight); } else { posX = x + (videoWidth >> 2); - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), 0, videoWidth - (videoWidth >> 8), + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), 0, videoWidth - (videoWidth >> 8), videoHeight); } break; @@ -719,12 +719,12 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { case 0: // Using posX and posY here is not smart since IDO can't optimize out the zero now. // Why here of all places did they do this instead of just setting zero like everywhere else? - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, posX, posY, x - (videoWidth >> 8), + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, posX, posY, x - (videoWidth >> 8), y - (videoHeight >> 7)); break; case 1: posX = x; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), 0, (x + x) - (videoWidth >> 8), + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), 0, (x + x) - (videoWidth >> 8), y - (videoHeight >> 7)); // Fake @@ -736,13 +736,13 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { break; case 2: posY = y; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, 0, y + (videoHeight >> 7), x - (videoWidth >> 8), + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, 0, y + (videoHeight >> 7), x - (videoWidth >> 8), (y + y) - (videoHeight >> 7)); break; case 3: posX = x; posY = y; - gDPSetScissor((*dlist)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), y + (videoHeight >> 7), + gDPSetScissor((*dList)++, SCISSOR_INTERLACE, x + (videoWidth >> 8), y + (videoHeight >> 7), (x + x) - (videoWidth >> 8), (y + y) - (videoHeight >> 7)); break; } @@ -766,9 +766,9 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { if (osTvType == OS_TV_TYPE_PAL) { posX -= 4; } - viewport_rsp_set(dlist, sp54_width, sp58_height, posX, posY); + viewport_rsp_set(dList, sp54_width, sp58_height, posX, posY); if (mats != NULL) { - func_80067D3C(dlist, mats); + func_80067D3C(dList, mats); } gActiveCameraID = originalCameraID; } @@ -780,7 +780,7 @@ void func_80066CDC(Gfx **dlist, MatrixS **mats) { * Takes the size of the screen as depicted by the active menu viewport, then sets the RDP scissor to match it. * Official Name: camSetScissor */ -void viewport_scissor(Gfx **dlist) { +void viewport_scissor(Gfx **dList) { s32 size; s32 lrx; s32 lry; @@ -863,17 +863,17 @@ void viewport_scissor(Gfx **dlist) { // clang-format on break; } - gDPSetScissor((*dlist)++, 0, ulx, uly, lrx, lry); + gDPSetScissor((*dList)++, 0, ulx, uly, lrx, lry); return; } - gDPSetScissor((*dlist)++, 0, 0, 0, width, height); + gDPSetScissor((*dList)++, 0, 0, 0, width, height); } // Official Name: camGetPlayerProjMtx / camSetProjMtx - ?? -void func_80067D3C(Gfx **dlist, UNUSED MatrixS **mats) { +void func_80067D3C(Gfx **dList, UNUSED MatrixS **mats) { s32 temp; - gSPPerspNormalize((*dlist)++, perspNorm); + gSPPerspNormalize((*dList)++, perspNorm); temp = gActiveCameraID; if (gCutsceneCameraActive) { @@ -927,7 +927,7 @@ void set_ortho_matrix_height(f32 value) { * Used for drawing triangles on screen as HUD. * Official Name: camStandardOrtho */ -void set_ortho_matrix_view(Gfx **dlist, MatrixS **mtx) { +void set_ortho_matrix_view(Gfx **dList, MatrixS **mtx) { u32 widthAndHeight; s32 width, height; s32 i, j; @@ -941,8 +941,8 @@ void set_ortho_matrix_view(Gfx **dlist, MatrixS **mtx) { gViewportStack[gActiveCameraID + 5].vp.vscale[1] = width * 2; gViewportStack[gActiveCameraID + 5].vp.vtrans[0] = width * 2; gViewportStack[gActiveCameraID + 5].vp.vtrans[1] = height * 2; - gSPViewport((*dlist)++, OS_K0_TO_PHYSICAL(&gViewportStack[gActiveCameraID + 5])); - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); + gSPViewport((*dList)++, OS_K0_TO_PHYSICAL(&gViewportStack[gActiveCameraID + 5])); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); gModelMatrixStackPos = 0; gMatrixType = G_MTX_DKR_INDEX_0; @@ -957,13 +957,13 @@ void set_ortho_matrix_view(Gfx **dlist, MatrixS **mtx) { } // Official Name: camStandardPersp? -void func_8006807C(Gfx **dlist, MatrixS **mtx) { +void func_8006807C(Gfx **dList, MatrixS **mtx) { object_transform_to_matrix_2(gCurrentModelMatrixF, &D_800DD288); f32_matrix_mult(&gCurrentModelMatrixF, &gPerspectiveMatrixF, &gViewMatrixF); object_transform_to_matrix_2((float(*)[4]) gModelMatrixF[0], &D_800DD2A0); f32_matrix_mult(gModelMatrixF[0], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); gModelMatrixStackPos = 0; gMatrixType = G_MTX_DKR_INDEX_0; } @@ -973,7 +973,7 @@ void func_8006807C(Gfx **dlist, MatrixS **mtx) { * Viewports have a centre position and a scale factor, rather than a standard four corners. * Official Name: camSetViewport */ -void viewport_rsp_set(Gfx **dlist, s32 width, s32 height, s32 posX, s32 posY) { +void viewport_rsp_set(Gfx **dList, s32 width, s32 height, s32 posX, s32 posY) { s32 tempWidth = (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) ? -width : width; #ifdef ANTI_TAMPER // Antipiracy measure. Flips the screen upside down. @@ -987,9 +987,9 @@ void viewport_rsp_set(Gfx **dlist, s32 width, s32 height, s32 posX, s32 posY) { gViewportStack[gActiveCameraID].vp.vtrans[1] = posY * 4; gViewportStack[gActiveCameraID].vp.vscale[0] = tempWidth * 4; gViewportStack[gActiveCameraID].vp.vscale[1] = height * 4; - gSPViewport((*dlist)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID])); + gSPViewport((*dList)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID])); } else { - gSPViewport((*dlist)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID + 10 + (gViewportWithBG * 5)])); + gSPViewport((*dList)++, OS_PHYSICAL_TO_K0(&gViewportStack[gActiveCameraID + 10 + (gViewportWithBG * 5)])); } } @@ -998,18 +998,18 @@ void viewport_rsp_set(Gfx **dlist, s32 width, s32 height, s32 posX, s32 posY) { * If in the track menu, or post-race, set it to a small screen view instead. * Official Name: camResetView? */ -void viewport_reset(Gfx **dlist) { +void viewport_reset(Gfx **dList) { u32 widthAndHeight, width, height; gActiveCameraID = 4; widthAndHeight = fb_size(); height = GET_VIDEO_HEIGHT(widthAndHeight); width = GET_VIDEO_WIDTH(widthAndHeight); if (!(gScreenViewports[gActiveCameraID].flags & VIEWPORT_EXTRA_BG)) { - gDPSetScissor((*dlist)++, G_SC_NON_INTERLACE, 0, 0, width - 1, height - 1); - viewport_rsp_set(dlist, width >> 1, height >> 1, width >> 1, height >> 1); + gDPSetScissor((*dList)++, G_SC_NON_INTERLACE, 0, 0, width - 1, height - 1); + viewport_rsp_set(dList, width >> 1, height >> 1, width >> 1, height >> 1); } else { - viewport_scissor(dlist); - viewport_rsp_set(dlist, 0, 0, 0, 0); + viewport_scissor(dList); + viewport_rsp_set(dList, 0, 0, 0, 0); } gActiveCameraID = 0; } @@ -1021,12 +1021,12 @@ UNUSED const char D_800E6F44[] = "cameraPushSprMtx: model stack overflow!!\n"; * Used when the next thing rendered relies on there not being any matrix offset. * Official Name: camOffsetZero? */ -void matrix_world_origin(Gfx **dlist, MatrixS **mtx) { +void matrix_world_origin(Gfx **dList, MatrixS **mtx) { f32_matrix_from_position(gModelMatrixF[gModelMatrixStackPos], 0.0f, 0.0f, 0.0f); f32_matrix_mult(gModelMatrixF[gModelMatrixStackPos], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), gMatrixType << 6); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), gMatrixType << 6); } /** @@ -1040,7 +1040,7 @@ void sprite_anim_off(s32 setting) { /** * Calculates angle from object to camera, then renders the sprite as a billboard, facing the camera. */ -s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, +s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, s32 flags) { f32 diffX; f32 diffY; @@ -1107,8 +1107,8 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj f32_matrix_mult(gModelMatrixF[gModelMatrixStackPos], &gViewMatrixF, &gCurrentModelMatrixF); f32_matrix_to_s16_matrix(&gCurrentModelMatrixF, *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); - gSPVertexDKR((*dlist)++, OS_K0_TO_PHYSICAL(&gVehiclePartVertex), 1, 0); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gSPVertexDKR((*dList)++, OS_K0_TO_PHYSICAL(&gVehiclePartVertex), 1, 0); } else { v = *vertexList; v->x = obj->segment.trans.x_position; @@ -1118,7 +1118,7 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj v->g = 255; v->b = 255; v->a = 255; - gSPVertexDKR((*dlist)++, OS_PHYSICAL_TO_K0(*vertexList), 1, 0); + gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(*vertexList), 1, 0); (*vertexList)++; if (gCutsceneCameraActive == 0) { angleDiff = @@ -1133,8 +1133,8 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj obj->segment.trans.scale, gVideoAspectRatio); f32_matrix_to_s16_matrix(gModelMatrixF[gModelMatrixStackPos], *mtx); gModelMatrixS[gModelMatrixStackPos] = *mtx; - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); - gDkrEnableBillboard((*dlist)++); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gDkrEnableBillboard((*dList)++); } if (gSpriteAnimOff == FALSE) { textureFrame = ((textureFrame & 0xFF) * arg4->textureCount) >> 8; @@ -1143,20 +1143,20 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj if (flags & RENDER_SEMI_TRANSPARENT) { flags |= RENDER_ANTI_ALIASING; } - func_8007BF34(dlist, arg4->unk6 | (flags & (RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE | + func_8007BF34(dList, arg4->unk6 | (flags & (RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE | RENDER_ANTI_ALIASING))); if (!(flags & RENDER_Z_UPDATE)) { - gDPSetPrimColor((*dlist)++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor((*dList)++, 0, 0, 255, 255, 255, 255); } - gSPDisplayList((*dlist)++, arg4->unk8[textureFrame + 1]); + gSPDisplayList((*dList)++, arg4->unk8[textureFrame + 1]); gModelMatrixStackPos--; if (gModelMatrixStackPos == 0) { textureFrame = 0; } else { textureFrame = 1; } - gDkrInsertMatrix((*dlist)++, 0, textureFrame << 6); - gDkrDisableBillboard((*dlist)++); + gDkrInsertMatrix((*dList)++, 0, textureFrame << 6); + gDkrDisableBillboard((*dList)++); return result; } @@ -1393,7 +1393,7 @@ void camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f /** * Calculate the rotation matrix for an actors head, then run it. */ -void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s16 headAngle) { +void apply_head_turning_matrix(Gfx **dList, MatrixS **mtx, Object_68 *objGfx, s16 headAngle) { f32 coss_headAngle; f32 sins_headAngle; f32 offsetX; @@ -1407,8 +1407,8 @@ void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s1 offsetX = (f32) objGfx->offsetX; offsetY = (f32) objGfx->offsetY; offsetZ = (f32) objGfx->offsetZ; - coss_unk1C = coss_f(objGfx->unk1C); - sins_unk1C = sins_f(objGfx->unk1C); + coss_unk1C = coss_f(objGfx->headTilt); + sins_unk1C = sins_f(objGfx->headTilt); coss_headAngle = coss_f(headAngle); sins_headAngle = sins_f(headAngle); headMtxF[0][0] = (coss_headAngle * coss_unk1C); @@ -1431,8 +1431,8 @@ void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s1 headMtxF[3][3] = 1.0f; f32_matrix_mult(&headMtxF, &gCurrentModelMatrixS, &rotationMtxF); f32_matrix_to_s16_matrix(&rotationMtxF, *mtx); - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); - gDkrInsertMatrix((*dlist)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_1); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); + gDkrInsertMatrix((*dList)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_1); } /** @@ -1448,7 +1448,7 @@ UNUSED void get_modelmatrix_vector(f32 *x, f32 *y, f32 *z) { * Run a matrix from the top of the stack and pop it. * If the stack pos is less than zero, add a matrix instead. */ -void apply_matrix_from_stack(Gfx **dlist) { +void apply_matrix_from_stack(Gfx **dList) { gCameraMatrixPos--; gModelMatrixStackPos--; @@ -1463,9 +1463,9 @@ void apply_matrix_from_stack(Gfx **dlist) { } // Fakematch if (gModelMatrixStackPos > 0) { - gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0(gModelMatrixS[gModelMatrixStackPos]), G_MTX_DKR_INDEX_1); + gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0(gModelMatrixS[gModelMatrixStackPos]), G_MTX_DKR_INDEX_1); } else { - gDkrInsertMatrix((*dlist)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_0); + gDkrInsertMatrix((*dList)++, G_MWO_MATRIX_XX_XY_I, G_MTX_DKR_INDEX_0); } } diff --git a/src/camera.h b/src/camera.h index 48d9b0f7..a6fb77c9 100644 --- a/src/camera.h +++ b/src/camera.h @@ -105,11 +105,11 @@ s32 copy_viewport_background_size_to_coords(s32 viewPortIndex, s32 *x1, s32 *y1, void copy_viewport_frame_size_to_coords(s32 viewPortIndex, s32 *x1, s32 *y1, s32 *x2, s32 *y2); void copy_framebuffer_size_to_coords(s32 *x1, s32 *y1, s32 *x2, s32 *y2); void set_ortho_matrix_height(f32 value); -void set_ortho_matrix_view(Gfx **dlist, MatrixS **mtx); -void func_8006807C(Gfx **dlist, MatrixS **mtx); -void viewport_rsp_set(Gfx **dlist, s32 width, s32 height, s32 posX, s32 posY); -void viewport_reset(Gfx **dlist); -void matrix_world_origin(Gfx **dlist, MatrixS **mtx); +void set_ortho_matrix_view(Gfx **dList, MatrixS **mtx); +void func_8006807C(Gfx **dList, MatrixS **mtx); +void viewport_rsp_set(Gfx **dList, s32 width, s32 height, s32 posX, s32 posY); +void viewport_reset(Gfx **dList); +void matrix_world_origin(Gfx **dList, MatrixS **mtx); void sprite_anim_off(s32 setting); ObjectSegment *get_active_camera_segment_no_cutscenes(void); ObjectSegment *get_active_camera_segment(void); @@ -120,18 +120,18 @@ Matrix *get_camera_matrix(void); f32 get_distance_to_camera(f32 x, f32 y, f32 z); void set_camera_shake_by_distance(f32 x, f32 y, f32 z, f32 dist, f32 magnitude); void set_camera_shake(f32 magnitude); -void func_80067D3C(Gfx **dlist, MatrixS **mats); +void func_80067D3C(Gfx **dList, MatrixS **mats); void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, ObjectSegment *segment, Sprite *sprite, s32 flags); -s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, s32 flags); +s32 render_sprite_billboard(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, s32 flags); void camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f32 scale, f32 scaleY); -void viewport_scissor(Gfx **dlist); -void apply_matrix_from_stack(Gfx **dlist); +void viewport_scissor(Gfx **dList); +void apply_matrix_from_stack(Gfx **dList); void copy_viewports_to_stack(void); -void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s16 headAngle); +void apply_head_turning_matrix(Gfx **dList, MatrixS **mtx, Object_68 *objGfx, s16 headAngle); void apply_object_shear_matrix(Gfx **dList, MatrixS **mtx, Object *arg2, Object *arg3, f32 shear); // Non Matching void camera_init(void); -void func_80066CDC(Gfx **dlist, MatrixS **mats); +void func_80066CDC(Gfx **dList, MatrixS **mats); #endif diff --git a/src/fade_transition.c b/src/fade_transition.c index e7180f03..5bedbef0 100644 --- a/src/fade_transition.c +++ b/src/fade_transition.c @@ -38,22 +38,22 @@ Gfx dTransitionFadeSettings[] = { gsSPEndDisplayList(), }; -s16 gTransitionBarnHorizontalData[28] = { - 0xFE20, 0x0078, 0xFEC0, 0x0078, 0xFF60, 0x0078, 0x0000, 0x0078, 0x00A0, 0x0078, 0x0140, 0x0078, 0x01E0, 0x0078, - 0xFE20, 0xFF88, 0xFEC0, 0xFF88, 0xFF60, 0xFF88, 0x0000, 0xFF88, 0x00A0, 0xFF88, 0x0140, 0xFF88, 0x01E0, 0xFF88, +Vec2s gTransitionBarnHorizontalCoords[14] = { + { -480, 120 }, { -320, 120 }, { -160, 120 }, { 0, 120 }, { 160, 120 }, { 320, 120 }, { 480, 120 }, + { -480, -120 }, { -320, -120 }, { -160, -120 }, { 0, -120 }, { 160, -120 }, { 320, -120 }, { 480, -120 }, }; -s16 gTransitionBarnVerticalData[28] = { - 0xFF60, 0x0168, 0xFF60, 0x00F0, 0xFF60, 0x0078, 0xFF60, 0x0000, 0xFF60, 0xFF88, 0xFF60, 0xFF10, 0xFF60, 0xFF10, - 0x00A0, 0x0168, 0x00A0, 0x00F0, 0x00A0, 0x0078, 0x00A0, 0x0000, 0x00A0, 0xFF88, 0x00A0, 0xFF10, 0x00A0, 0xFF10, +Vec2s gTransitionBarnVerticalCoords[14] = { + { -160, 360 }, { -160, 240 }, { -160, 120 }, { -160, 0 }, { -160, -120 }, { -160, -240 }, { -160, -240 }, + { 160, 360 }, { 160, 240 }, { 160, 120 }, { 160, 0 }, { 160, -120 }, { 160, -240 }, { 160, -240 }, }; -u8 D_800E32A0[12] = { - 0x00, 0x02, 0x04, 0x0E, 0x10, 0x12, 0x08, 0x0A, 0x0C, 0x16, 0x18, 0x1A, +TriangleList D_800E32A0[12] = { + 0, 2, 4, 14, 16, 18, 8, 10, 12, 22, 24, 26, }; -u8 D_800E32AC[12] = { - 0x04, 0x06, 0x08, 0x12, 0x14, 0x16, 0x04, 0x06, 0x08, 0x12, 0x14, 0x16, +TriangleList D_800E32AC[12] = { + 4, 6, 8, 18, 20, 22, 4, 6, 8, 18, 20, 22, }; TriangleList gTransitionBarnDoorTris[24] = { @@ -64,16 +64,16 @@ u8 gTransitionBarnDoorAlpha[12] = { 255, 255, 0, 255, 255, 0, 0, 255, 255, 0, 255, 255, }; -s16 gTransitionBarnDiagData[24] = { - 0xFCE0, 0x0078, 0xFE20, 0x0078, 0xFF60, 0x0078, 0x00A0, 0x0078, 0x01E0, 0x0078, 0x0320, 0x0078, - 0xFCE0, 0xFF88, 0xFE20, 0xFF88, 0xFF60, 0xFF88, 0x00A0, 0xFF88, 0x01E0, 0xFF88, 0x0320, 0xFF88, +Vec2s gTransitionBarnDiagCoords[12] = { + { -800, 120 }, { -480, 120 }, { -160, 120 }, { 160, 120 }, { 480, 120 }, { 800, 120 }, + { -800, -120 }, { -480, -120 }, { -160, -120 }, { 160, -120 }, { 480, -120 }, { 800, -120 }, }; -u8 D_800E330C[12] = { +TriangleList D_800E330C[12] = { 0, 2, 4, 12, 14, 8, 10, 18, 20, 22, 0, 0, }; -u8 D_800E3318[12] = { +TriangleList D_800E3318[12] = { 4, 6, 8, 16, 18, 4, 6, 14, 16, 18, 0, 0, }; @@ -85,32 +85,30 @@ u8 gTransitionBarnDoorDiagAlpha[12] = { 255, 255, 0, 255, 0, 0, 255, 0, 255, 255, 0, 0, }; -s16 gTransitionWaveData[126] = { - 0xFF60, 0x00A0, 0xFF70, 0x00A0, 0xFF80, 0x00A0, 0xFF90, 0x00A0, 0xFFA0, 0x00A0, 0xFFB0, 0x00A0, 0xFFC0, 0x00A0, - 0xFFD0, 0x00A0, 0xFFE0, 0x00A0, 0xFFF0, 0x00A0, 0x0000, 0x00A0, 0x0010, 0x00A0, 0x0020, 0x00A0, 0x0030, 0x00A0, - 0x0040, 0x00A0, 0x0050, 0x00A0, 0x0060, 0x00A0, 0x0070, 0x00A0, 0x0080, 0x00A0, 0x0090, 0x00A0, 0x00A0, 0x00A0, - 0xFF60, 0xFF38, 0xFF70, 0xFF60, 0xFF80, 0xFF74, 0xFF90, 0xFF7E, 0xFFA0, 0xFF74, 0xFFB0, 0xFF38, 0xFFC0, 0xFF10, - 0xFFD0, 0xFEFC, 0xFFE0, 0xFEF2, 0xFFF0, 0xFEFC, 0x0000, 0xFF24, 0x0010, 0xFF2E, 0x0020, 0xFF38, 0x0030, 0xFF2E, - 0x0040, 0xFF24, 0x0050, 0xFEFC, 0x0060, 0xFEF2, 0x0070, 0xFEFC, 0x0080, 0xFF24, 0x0090, 0xFF60, 0x00A0, 0xFF74, - 0xFF60, 0xFEE8, 0xFF70, 0xFEE8, 0xFF80, 0xFEE8, 0xFF90, 0xFEE8, 0xFFA0, 0xFEE8, 0xFFB0, 0xFEE8, 0xFFC0, 0xFEE8, - 0xFFD0, 0xFEE8, 0xFFE0, 0xFEE8, 0xFFF0, 0xFEE8, 0x0000, 0xFEE8, 0x0010, 0xFEE8, 0x0020, 0xFEE8, 0x0030, 0xFEE8, - 0x0040, 0xFEE8, 0x0050, 0xFEE8, 0x0060, 0xFEE8, 0x0070, 0xFEE8, 0x0080, 0xFEE8, 0x0090, 0xFEE8, 0x00A0, 0xFEE8, +Vec2s gTransitionWaveCoords[63] = { + { -160, 160 }, { -144, 160 }, { -128, 160 }, { -112, 160 }, { -96, 160 }, { -80, 160 }, { -64, 160 }, + { -48, 160 }, { -32, 160 }, { -16, 160 }, { 0, 160 }, { 16, 160 }, { 32, 160 }, { 48, 160 }, + { 64, 160 }, { 80, 160 }, { 96, 160 }, { 112, 160 }, { 128, 160 }, { 144, 160 }, { 160, 160 }, + { -160, -200 }, { -144, -160 }, { -128, -140 }, { -112, -130 }, { -96, -140 }, { -80, -200 }, { -64, -240 }, + { -48, -260 }, { -32, -270 }, { -16, -260 }, { 0, -220 }, { 16, -210 }, { 32, -200 }, { 48, -210 }, + { 64, -220 }, { 80, -260 }, { 96, -270 }, { 112, -260 }, { 128, -220 }, { 144, -160 }, { 160, -140 }, + { -160, -280 }, { -144, -280 }, { -128, -280 }, { -112, -280 }, { -96, -280 }, { -80, -280 }, { -64, -280 }, + { -48, -280 }, { -32, -280 }, { -16, -280 }, { 0, -280 }, { 16, -280 }, { 32, -280 }, { 48, -280 }, + { 64, -280 }, { 80, -280 }, { 96, -280 }, { 112, -280 }, { 128, -280 }, { 144, -280 }, { 160, -280 } }; u8 D_800E3440[92] = { - 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x0E, 0x10, 0x12, - 0x14, 0x16, 0x18, 0x1A, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, - 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x54, 0x56, 0x58, - 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, - 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, + 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 14, 16, 18, 20, 22, 24, 26, + 14, 16, 18, 20, 22, 24, 26, 26, 28, 30, 32, 34, 36, 38, 40, 26, 28, 30, 32, 34, 36, 38, 40, + 0, 2, 4, 6, 8, 10, 12, 14, 84, 86, 88, 90, 92, 94, 96, 98, 14, 16, 18, 20, 22, 24, 26, + 98, 100, 102, 104, 106, 108, 110, 26, 28, 30, 32, 34, 36, 38, 40, 110, 112, 114, 116, 118, 120, 122, 124, }; u8 D_800E349C[92] = { - 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36, 0x38, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x38, 0x3A, 0x3C, - 0x3E, 0x40, 0x42, 0x44, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, - 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x54, 0x56, 0x58, 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x54, 0x56, 0x58, - 0x5A, 0x5C, 0x5E, 0x60, 0x62, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, - 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x6E, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, + 42, 44, 46, 48, 50, 52, 54, 56, 84, 86, 88, 90, 92, 94, 96, 98, 56, 58, 60, 62, 64, 66, 68, + 98, 100, 102, 104, 106, 108, 110, 68, 70, 72, 74, 76, 78, 80, 82, 110, 112, 114, 116, 118, 120, 122, 124, + 84, 86, 88, 90, 92, 94, 96, 98, 84, 86, 88, 90, 92, 94, 96, 98, 98, 100, 102, 104, 106, 108, 110, + 98, 100, 102, 104, 106, 108, 110, 110, 112, 114, 116, 118, 120, 122, 124, 110, 112, 114, 116, 118, 120, 122, 124, }; u8 gTransitionWaveAlpha[92] = { @@ -234,27 +232,28 @@ s32 transition_begin(FadeTransition *transition) { transition_fullscreen_start(transition); break; case FADE_BARNDOOR_HORIZONTAL: - init_transition_shape(transition, 12, 8, gTransitionBarnHorizontalData, D_800E32A0, D_800E32AC, - gTransitionBarnDoorAlpha, gTransitionBarnDoorAlpha, gTransitionBarnDoorTris); + transition_init_shape(transition, 12, 8, (s16 *) gTransitionBarnHorizontalCoords, D_800E32A0, + D_800E32AC, gTransitionBarnDoorAlpha, gTransitionBarnDoorAlpha, + gTransitionBarnDoorTris); break; case FADE_BARNDOOR_VERTICAL: - init_transition_shape(transition, 12, 8, gTransitionBarnVerticalData, D_800E32A0, D_800E32AC, + transition_init_shape(transition, 12, 8, (s16 *) gTransitionBarnVerticalCoords, D_800E32A0, D_800E32AC, gTransitionBarnDoorAlpha, gTransitionBarnDoorAlpha, gTransitionBarnDoorTris); break; case FADE_CIRCLE: - func_800C15D4(transition); + transition_init_circle(transition); break; case FADE_WAVES: - init_transition_shape(transition, 92, 80, gTransitionWaveData, D_800E349C, D_800E3440, + transition_init_shape(transition, 92, 80, (s16 *) gTransitionWaveCoords, D_800E349C, D_800E3440, gTransitionWaveAlpha, gTransitionWaveAlpha, gTransitionWaveTris); break; case FADE_BARNDOOR_DIAGONAL: - init_transition_shape(transition, 10, 6, gTransitionBarnDiagData, D_800E330C, D_800E3318, + transition_init_shape(transition, 10, 6, (s16 *) gTransitionBarnDiagCoords, D_800E330C, D_800E3318, gTransitionBarnDoorDiagAlpha, gTransitionBarnDoorDiagAlpha, gTransitionBarnDoorDiagTris); break; case FADE_DISABLED: - init_transition_blank(transition); + transition_init_blank(transition); break; } } @@ -266,7 +265,7 @@ s32 transition_begin(FadeTransition *transition) { * Afterwards, it will return the transition status. The condition where this function is called wants a nonzero * return, which will then call the bit that renders the transitions. */ -s32 handle_transitions(s32 updateRate) { +s32 transition_update(s32 updateRate) { if (sLevelTransitionDelayTimer) { sLevelTransitionDelayTimer--; updateRate = LOGIC_NULL; @@ -287,19 +286,19 @@ s32 handle_transitions(s32 updateRate) { } switch (gCurFadeTransition) { case FADE_FULLSCREEN: - process_transition_fullscreen(updateRate); + transition_update_fullscreen(updateRate); break; case FADE_BARNDOOR_HORIZONTAL: case FADE_BARNDOOR_VERTICAL: case FADE_WAVES: case FADE_BARNDOOR_DIAGONAL: - process_transition_shape(updateRate); + transition_update_shape(updateRate); break; case FADE_CIRCLE: - func_800C1EE8(updateRate); + transition_update_circle(updateRate); break; case FADE_DISABLED: - process_transition_disabled(updateRate); + transition_update_blank(updateRate); break; } } @@ -311,40 +310,40 @@ s32 handle_transitions(s32 updateRate) { * The rendering portion of transitions. * First establishes an orthogonal matrix, then renders a transition effect onscreen. */ -void render_fade_transition(Gfx **dList, MatrixS **mats, Vertex **verts) { +void transition_render(Gfx **dList, MatrixS **mtx, Vertex **vtx) { if (sTransitionStatus != TRANSITION_NONE) { if (osTvType == OS_TV_TYPE_PAL) { set_ortho_matrix_height(1.4f); } else { set_ortho_matrix_height(1.2f); } - set_ortho_matrix_view(dList, mats); + set_ortho_matrix_view(dList, mtx); set_ortho_matrix_height(1.0f); switch (gCurFadeTransition) { case FADE_FULLSCREEN: - render_fade_fullscreen(dList, mats, verts); + transition_render_fullscreen(dList, mtx, vtx); break; case FADE_BARNDOOR_HORIZONTAL: - render_fade_barndoor_horizontal(dList, mats, verts); + transition_render_barndoor_hor(dList, mtx, vtx); break; case FADE_BARNDOOR_VERTICAL: - render_fade_barndoor_vertical(dList, mats, verts); + transition_render_barndoor_vert(dList, mtx, vtx); break; case FADE_CIRCLE: - render_fade_circle(dList, mats, verts); + transition_render_circle(dList, mtx, vtx); break; case FADE_WAVES: - render_fade_waves(dList, mats, verts); + transition_render_waves(dList, mtx, vtx); break; case FADE_BARNDOOR_DIAGONAL: - render_fade_barndoor_diagonal(dList, mats, verts); + transition_render_barndoor_diag(dList, mtx, vtx); break; case FADE_DISABLED: - render_fade_disabled(dList, mats, verts); + transition_render_blank(dList, mtx, vtx); break; } - func_80066CDC(dList, mats); + func_80066CDC(dList, mtx); } } @@ -381,7 +380,7 @@ void transition_fullscreen_start(FadeTransition *transition) { /** * Slowly dade in or out by increasing or decreasing opacity. */ -void process_transition_fullscreen(s32 updateRate) { +void transition_update_fullscreen(s32 updateRate) { s32 var_v0; do { var_v0 = TRUE; @@ -425,7 +424,7 @@ void process_transition_fullscreen(s32 updateRate) { /** * Draws a simple fillrect covering the whole screen that fades in or out. */ -void render_fade_fullscreen(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_fullscreen(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { s32 screenSize = fb_size(); gSPDisplayList((*dList)++, dTransitionFadeSettings); gDPSetPrimColor((*dList)++, 0, 0, gCurFadeRed, gCurFadeGreen, gCurFadeBlue, gCurFadeAlpha); @@ -438,7 +437,7 @@ void render_fade_fullscreen(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex ** * Allocate space for the new transitions vertices and triangles, then build the geometry based on the vertex and * triangle shapes given. */ -void init_transition_shape(FadeTransition *transition, s32 numVerts, s32 numTris, s16 *coords, u8 *nextPos, +void transition_init_shape(FadeTransition *transition, s32 numVerts, s32 numTris, s16 *coords, u8 *nextPos, u8 *targetPos, u8 *nextAlpha, u8 *targetAlpha, u8 *vertIndices) { UNUSED s32 pad; u8 *swap; @@ -494,7 +493,7 @@ void init_transition_shape(FadeTransition *transition, s32 numVerts, s32 numTris for (i = 0; i < 2; i++) { for (j = 0; j < numTris; j++) { - sTransitionTris[i][j].flags = 0x40; + sTransitionTris[i][j].flags = BACKFACE_DRAW; sTransitionTris[i][j].vi0 = vertIndices[(j * 3) + 0]; sTransitionTris[i][j].uv0.u = 0; sTransitionTris[i][j].uv0.v = 0; @@ -515,7 +514,7 @@ void init_transition_shape(FadeTransition *transition, s32 numVerts, s32 numTris * Slowly update the vertices of the transition based on what the next frames target is. * That target is set based on a velocity. */ -void process_transition_shape(s32 updateRate) { +void transition_update_shape(s32 updateRate) { s32 i; f32 updateRateF; @@ -553,7 +552,7 @@ void process_transition_shape(s32 updateRate) { /** * Renders a transition effect on screen that will close in from both sides horizonally. */ -void render_fade_barndoor_horizontal(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_barndoor_hor(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { reset_render_settings(dList); gSPDisplayList((*dList)++, dTransitionShapeSettings); gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(sTransitionVtx[sTransitionTaskNum]), 12, 0); @@ -565,7 +564,7 @@ void render_fade_barndoor_horizontal(Gfx **dList, UNUSED MatrixS **mats, UNUSED * Renders a transition effect on screen that will close in from both sides vertically. * Codewise, exactly the same as above, but uses a different vertex layout to make the difference. */ -void render_fade_barndoor_vertical(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_barndoor_vert(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { reset_render_settings(dList); gSPDisplayList((*dList)++, dTransitionShapeSettings); gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(sTransitionVtx[sTransitionTaskNum]), 12, 0); @@ -573,7 +572,7 @@ void render_fade_barndoor_vertical(Gfx **dList, UNUSED MatrixS **mats, UNUSED Ve reset_render_settings(dList); } -void func_800C15D4(FadeTransition *transition) { +void transition_init_circle(FadeTransition *transition) { s32 i; s32 j; s32 k; @@ -677,7 +676,7 @@ void func_800C15D4(FadeTransition *transition) { sTransitionStatus = TRANSITION_ACTIVE; } -void func_800C1EE8(s32 updateRate) { +void transition_update_circle(s32 updateRate) { f32 temp_f20; f32 temp_f2; f32 temp_f16; @@ -733,7 +732,7 @@ void func_800C1EE8(s32 updateRate) { /** * Render a circle shape transition onscreen using previously allocated geometry. */ -void render_fade_circle(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_circle(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { Vertex *vertsToRender; Triangle *trisToRender; Gfx *gfx; @@ -760,13 +759,13 @@ void render_fade_circle(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **vert /** * Render the wavy transition onscreen using the vertex data allocated earlier. */ -void render_fade_waves(Gfx **dlist, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_waves(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { Gfx *gfx; s32 i; Vertex *v; Triangle *t; - reset_render_settings(dlist); - gfx = *dlist; + reset_render_settings(dList); + gfx = *dList; v = (Vertex *) sTransitionVtx[sTransitionTaskNum]; t = (Triangle *) sTransitionTris[sTransitionTaskNum]; gSPDisplayList(gfx++, dTransitionShapeSettings); @@ -791,14 +790,14 @@ void render_fade_waves(Gfx **dlist, UNUSED MatrixS **mats, UNUSED Vertex **verts t += 14; } } - *dlist = gfx; - reset_render_settings(dlist); + *dList = gfx; + reset_render_settings(dList); } /** * Renders a transition effect on screen that will close in from the opposite corners of the screen. */ -void render_fade_barndoor_diagonal(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_barndoor_diag(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { reset_render_settings(dList); gSPDisplayList((*dList)++, dTransitionShapeSettings); gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(sTransitionVtx[sTransitionTaskNum]), 10, 0); @@ -809,7 +808,7 @@ void render_fade_barndoor_diagonal(Gfx **dList, UNUSED MatrixS **mats, UNUSED Ve /** * Set the transition colour target, then set the velocity for the colour to fade to. */ -void init_transition_blank(UNUSED FadeTransition *transition) { +void transition_init_blank(UNUSED FadeTransition *transition) { gLastFadeRed <<= 16; gLastFadeGreen <<= 16; gLastFadeBlue <<= 16; @@ -825,8 +824,8 @@ void init_transition_blank(UNUSED FadeTransition *transition) { /** * Shifts the colours of the transition over time while the timer ticks down. */ -void process_transition_disabled(s32 updateRate) { - s32 var_v0; +void transition_update_blank(s32 updateRate) { + s32 var_v0 = FALSE; do { var_v0 = TRUE; if (sTransitionFadeTimer > 0) { @@ -856,11 +855,11 @@ void process_transition_disabled(s32 updateRate) { /** * Fill the whole screen with a solid colour. */ -void render_fade_disabled(Gfx **dList, UNUSED MatrixS **mats, UNUSED Vertex **verts) { +void transition_render_blank(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { s32 screenSize = fb_size(); gSPDisplayList((*dList)++, dTransitionFadeSettings); gDPSetPrimColor((*dList)++, 0, 0, (gLastFadeRed >> 16), (gLastFadeGreen >> 16), (gLastFadeBlue >> 16), 255); gDPSetCombineMode((*dList)++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPFillRectangle((*dList)++, 0, 0, screenSize & 0x3FF, (screenSize >> 16) & 0x3FF); + gDPFillRectangle((*dList)++, 0, 0, GET_VIDEO_WIDTH(screenSize), GET_VIDEO_HEIGHT(screenSize) & 0x3FF); reset_render_settings(dList); } diff --git a/src/fade_transition.h b/src/fade_transition.h index 402933e8..5e13883a 100644 --- a/src/fade_transition.h +++ b/src/fade_transition.h @@ -22,6 +22,8 @@ #define FADE_COLOR_BLACK FADE_COLOR(0, 0, 0) #define FADE_COLOR_WHITE FADE_COLOR(255, 255, 255) +#define FADE_STAY 0xFFFF // Transition will stay until manually removed. + /** * type: Transition type * flags: Transition flags @@ -51,25 +53,24 @@ void enable_new_screen_transitions(void); void disable_new_screen_transitions(void); u32 check_fadeout_transition(void); void transition_end(void); -s32 handle_transitions(s32 updateRate); -void render_fade_transition(Gfx **dList, MatrixS **mats, Vertex **verts); -void render_fade_fullscreen(Gfx **dList, MatrixS **mats, Vertex **verts); -void render_fade_barndoor_horizontal(Gfx **dList, MatrixS **mats, Vertex **verts); -void render_fade_barndoor_vertical(Gfx **dList, MatrixS **mats, Vertex **verts); -void render_fade_barndoor_diagonal(Gfx **dList, MatrixS **mats, Vertex **verts); -void render_fade_disabled(Gfx **dList, MatrixS **mats, Vertex **verts); +s32 transition_update(s32 updateRate); +void transition_render(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_render_fullscreen(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_render_barndoor_hor(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_render_barndoor_vert(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_render_barndoor_diag(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_render_blank(Gfx **dList, MatrixS **mtx, Vertex **vtx); void transition_fullscreen_start(FadeTransition *transition); -void init_transition_blank(FadeTransition *transition); -void process_transition_fullscreen(s32 updateRate); -void process_transition_disabled(s32 updateRate); +void transition_init_blank(FadeTransition *transition); +void transition_update_fullscreen(s32 updateRate); +void transition_update_blank(s32 updateRate); s32 transition_begin(FadeTransition *transition); -void render_fade_circle(Gfx **dList, MatrixS **mats, Vertex **verts); -void process_transition_shape(s32 updateRate); -void init_transition_shape(FadeTransition *transition, s32 numVerts, s32 numTris, s16 *coords, u8 *nextPos, +void transition_render_circle(Gfx **dList, MatrixS **mtx, Vertex **vtx); +void transition_update_shape(s32 updateRate); +void transition_init_shape(FadeTransition *transition, s32 numVerts, s32 numTris, s16 *coords, u8 *nextPos, u8 *targetPos, u8 *nextAlpha, u8 *targetAlpha, u8 *vertIndices); -void func_800C1EE8(s32 updateRate); -void render_fade_waves(Gfx **dlist, UNUSED MatrixS **mats, UNUSED Vertex **verts); - -void func_800C15D4(FadeTransition *transition); //Non Matching +void transition_update_circle(s32 updateRate); +void transition_render_waves(Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx); +void transition_init_circle(FadeTransition *transition); #endif diff --git a/src/font.c b/src/font.c index ba2810b6..e20f5931 100644 --- a/src/font.c +++ b/src/font.c @@ -110,7 +110,7 @@ typedef struct Unk8012C2D4_JP { char unk0; char unk1; u16 unk2; - Gfx *dlist; + Gfx *dList; } Unk8012C2D4_JP; FontData_JP *D_8012C2A4_EE5E4; @@ -1120,7 +1120,7 @@ void clear_dialogue_box_open_flag(s32 dialogueBoxID) { * when the player exits out of one. * Official Name: fontWindowsDraw */ -void render_dialogue_boxes(Gfx **dlist, MatrixS **mat, Vertex **verts) { +void render_dialogue_boxes(Gfx **dList, MatrixS **mat, Vertex **verts) { s32 i; if (sDialogueBoxIsOpen) { @@ -1134,9 +1134,9 @@ void render_dialogue_boxes(Gfx **dlist, MatrixS **mat, Vertex **verts) { for (i = 1; i < DIALOGUEBOXBACKGROUND_COUNT; i++) { if (gDialogueBoxBackground[i].flags & DIALOGUE_BOX_OPEN) { if (gDialogueBoxBackground[i].flags & DIALOGUE_BOX_VERTS) { - render_dialogue_box(dlist, mat, verts, i); + render_dialogue_box(dList, mat, verts, i); } else { - render_dialogue_box(dlist, NULL, NULL, i); + render_dialogue_box(dList, NULL, NULL, i); } } } @@ -1190,7 +1190,7 @@ void s32_to_string(char **outString, s32 number) { * ulx, uly = upper-left position * lrx, lry = lower-right position */ -void render_fill_rectangle(Gfx **dlist, s32 ulx, s32 uly, s32 lrx, s32 lry) { +void render_fill_rectangle(Gfx **dList, s32 ulx, s32 uly, s32 lrx, s32 lry) { u32 widthAndHeight = fb_size(); u32 width = GET_VIDEO_WIDTH(widthAndHeight); u32 height = GET_VIDEO_HEIGHT(widthAndHeight); @@ -1202,7 +1202,7 @@ void render_fill_rectangle(Gfx **dlist, s32 ulx, s32 uly, s32 lrx, s32 lry) { if (uly < 0) { uly = 0; } - gDPFillRectangle((*dlist)++, ulx, uly, lrx, lry); + gDPFillRectangle((*dList)++, ulx, uly, lrx, lry); } } @@ -1210,7 +1210,7 @@ void render_fill_rectangle(Gfx **dlist, s32 ulx, s32 uly, s32 lrx, s32 lry) { * Render the selected dialogue box. Background first, then text. * Official Name: fontWindowDraw */ -void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogueBoxID) { +void render_dialogue_box(Gfx **dList, MatrixS **mat, Vertex **verts, s32 dialogueBoxID) { DialogueBoxBackground *dialogueBox; DialogueBox *dialogueTextBox; s32 i; @@ -1222,24 +1222,24 @@ void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogu // Render dialogue box background. if (dialogueBox->backgroundColourA != 0) { - gSPDisplayList((*dlist)++, dDialogueBoxBegin); - gDkrDmaDisplayList((*dlist)++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[1]), 2); - gDPSetEnvColor((*dlist)++, 0, 0, 0, 0); + gSPDisplayList((*dList)++, dDialogueBoxBegin); + gDkrDmaDisplayList((*dList)++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[1]), 2); + gDPSetEnvColor((*dList)++, 0, 0, 0, 0); if (dialogueBox->x2 - dialogueBox->x1 < 10 || dialogueBox->y2 - dialogueBox->y1 < 10) { - render_fill_rectangle(dlist, dialogueBox->x1 - 2, dialogueBox->y1 - 2, dialogueBox->x2 + 2, + render_fill_rectangle(dList, dialogueBox->x1 - 2, dialogueBox->y1 - 2, dialogueBox->x2 + 2, dialogueBox->y2 + 2); } else { - render_fill_rectangle(dlist, dialogueBox->x1 - 2, dialogueBox->y1 + 2, dialogueBox->x1 + 2, + render_fill_rectangle(dList, dialogueBox->x1 - 2, dialogueBox->y1 + 2, dialogueBox->x1 + 2, dialogueBox->y2 - 2); - render_fill_rectangle(dlist, dialogueBox->x1 - 2, dialogueBox->y1 - 2, dialogueBox->x2 + 2, + render_fill_rectangle(dList, dialogueBox->x1 - 2, dialogueBox->y1 - 2, dialogueBox->x2 + 2, dialogueBox->y1 + 2); - render_fill_rectangle(dlist, dialogueBox->x2 - 2, dialogueBox->y1 + 2, dialogueBox->x2 + 2, + render_fill_rectangle(dList, dialogueBox->x2 - 2, dialogueBox->y1 + 2, dialogueBox->x2 + 2, dialogueBox->y2 - 2); - render_fill_rectangle(dlist, dialogueBox->x1 - 2, dialogueBox->y2 - 2, dialogueBox->x2 + 2, + render_fill_rectangle(dList, dialogueBox->x1 - 2, dialogueBox->y2 - 2, dialogueBox->x2 + 2, dialogueBox->y2 + 2); } - gDPPipeSync((*dlist)++); - gDPSetEnvColor((*dlist)++, dialogueBox->backgroundColourR, dialogueBox->backgroundColourG, + gDPPipeSync((*dList)++); + gDPSetEnvColor((*dList)++, dialogueBox->backgroundColourR, dialogueBox->backgroundColourG, dialogueBox->backgroundColourB, dialogueBox->backgroundColourA); // Loops through sDialogueBoxDimensions, rendering fillrects until it forms a rounded rectangle. // The array determines the width and height of each entry before drawing it. @@ -1250,9 +1250,9 @@ void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogu x2 = dialogueBox->x2 - sDialogueBoxDimensions[i]; y2 = (sDialogueBoxDimensions[i + 3]) ? sDialogueBoxDimensions[i + 4] + dialogueBox->y2 : sDialogueBoxDimensions[i + 4] + dialogueBox->y1; - render_fill_rectangle(dlist, x1, y1, x2, y2); + render_fill_rectangle(dList, x1, y1, x2, y2); } - gDPPipeSync((*dlist)++); + gDPPipeSync((*dList)++); } if (mat != NULL && verts != NULL) { if (sDialogueBoxIsOpen == FALSE) { @@ -1260,7 +1260,7 @@ void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogu sDialogueBoxIsOpen = TRUE; } sDialogueBoxCloseTimer = 2; - dialogue_ortho(dialogueBox, dlist, mat, verts); + dialogue_ortho(dialogueBox, dList, mat, verts); } // Set and render the text portions of the dialogue box. dialogueTextBox = dialogueBox->textBox; @@ -1278,7 +1278,7 @@ void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogu dialogueBox->opacity = dialogueTextBox->opacity; dialogueBox->font = dialogueTextBox->font; parse_string_with_number(dialogueTextBox->text, text, dialogueTextBox->textNum); - render_text_string(dlist, dialogueBox, text, 0, 1.0f); + render_text_string(dList, dialogueBox, text, 0, 1.0f); dialogueTextBox = dialogueTextBox->nextBox; } } @@ -1339,7 +1339,7 @@ void func_800C6464_C7064(void) { D_8012C2CC_EE60C = mempool_alloc_safe(0x9000, COLOUR_TAG_RED); for (i = 0, charIndex = 0; i < 128; i++) { D_8012C2C8_EE608[i].unk0 = 0; - D_8012C2C8_EE608[i].dlist = &D_8012C2C4_EE604[charIndex]; + D_8012C2C8_EE608[i].dList = &D_8012C2C4_EE604[charIndex]; if (i & 1) { charIndex += 10; } else { @@ -1384,7 +1384,7 @@ void func_800C663C_C723C(void) { var_v0 = 0; for (i = 0; i < 0x80; i++) { D_8012C2D4_EE614[i].unk0 = 0; - D_8012C2D4_EE614[i].dlist = &D_8012C2D0_EE610[var_v0]; + D_8012C2D4_EE614[i].dList = &D_8012C2D0_EE610[var_v0]; if (i & 1) { var_v0 += 10; } else { @@ -1480,7 +1480,7 @@ s32 func_800C68CC_C74CC(u16 arg0) { D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].offsetToData + (D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].bytesPerCharacter * arg0), D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].bytesPerCharacter); - func_800C6DD4_C79D4((*D_8012C2BC_EE5FC)[curIndex].dlist, asset, D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].x, + func_800C6DD4_C79D4((*D_8012C2BC_EE5FC)[curIndex].dList, asset, D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].x, D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].y); } @@ -1488,7 +1488,7 @@ s32 func_800C68CC_C74CC(u16 arg0) { } } -void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { +void func_800C6DD4_C79D4(Gfx *dList, Asset46 *asset, s32 width, s32 height) { if (asset->unk0 != -1) { asset->unk0 = (s32) asset + asset->unk0; } else { @@ -1501,7 +1501,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { } if (asset->unk4 != NULL) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1510,7 +1510,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD, // shifts G_TX_NOLOD); // shiftt - gDPLoadMultiBlock_4bS(dlist++, OS_PHYSICAL_TO_K0(asset->unk4), 0x100, 1, G_IM_FMT_I, width, height, + gDPLoadMultiBlock_4bS(dList++, OS_PHYSICAL_TO_K0(asset->unk4), 0x100, 1, G_IM_FMT_I, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1519,12 +1519,12 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD, // shifts G_TX_NOLOD); // shiftt - gDkrDmaDisplayList(dlist++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[2]), + gDkrDmaDisplayList(dList++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[2]), numberOfGfxCommands(dDialogueBoxDrawModes[1])); } else { switch (asset->unk8) { case 0: // RGBA32 - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms @@ -1535,7 +1535,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; case 1: // RGBA16 - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms @@ -1546,7 +1546,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; case 5: // IA8 - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1556,7 +1556,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; case 6: // IA4 - gDPLoadTextureBlock_4bS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_IA, width, height, + gDPLoadTextureBlock_4bS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_IA, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1566,7 +1566,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; case 3: // I4 - gDPLoadTextureBlock_4bS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_I, width, height, + gDPLoadTextureBlock_4bS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_I, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1576,7 +1576,7 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; case 2: // I8 - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_I, G_IM_SIZ_8b, width, height, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(asset->unk0), G_IM_FMT_I, G_IM_SIZ_8b, width, height, 0, // palette G_TX_NOMIRROR | G_TX_WRAP, // cms G_TX_NOMIRROR | G_TX_WRAP, // cmt @@ -1586,19 +1586,19 @@ void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height) { G_TX_NOLOD); // shiftt break; } - gDkrDmaDisplayList(dlist++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[0]), + gDkrDmaDisplayList(dList++, OS_K0_TO_PHYSICAL(&dDialogueBoxDrawModes[0]), numberOfGfxCommands(dDialogueBoxDrawModes[1])); } - gSPEndDisplayList(dlist++); + gSPEndDisplayList(dList++); } -s32 func_800C7744_C8344(Gfx **dlist, u16 charIndex, s32 *outLeft, s32 *outTop, s32 *outRight, s32 *outBottom) { +s32 func_800C7744_C8344(Gfx **dList, u16 charIndex, s32 *outLeft, s32 *outTop, s32 *outRight, s32 *outBottom) { s32 index; JpCharHeader *jpChar; index = func_800C68CC_C74CC(charIndex); if (index >= 0) { - gSPDisplayList((*dlist)++, (*D_8012C2BC_EE5FC)[index].dlist); + gSPDisplayList((*dList)++, (*D_8012C2BC_EE5FC)[index].dList); jpChar = D_8012C2C0_EE600[index]; *outLeft = jpChar->left; *outTop = jpChar->top; diff --git a/src/font.h b/src/font.h index b687014a..772b5e55 100644 --- a/src/font.h +++ b/src/font.h @@ -175,9 +175,9 @@ void dialogue_clear(s32 dialogueBoxID); void open_dialogue_box(s32 dialogueBoxID); void dialogue_close(s32 dialogueBoxID); void clear_dialogue_box_open_flag(s32 dialogueBoxID); -void render_dialogue_boxes(Gfx **dlist, MatrixS **mat, Vertex **verts); -void render_fill_rectangle(Gfx **dlist, s32 ulx, s32 uly, s32 lrx, s32 lry); -void render_dialogue_box(Gfx **dlist, MatrixS **mat, Vertex **verts, s32 dialogueBoxID); +void render_dialogue_boxes(Gfx **dList, MatrixS **mat, Vertex **verts); +void render_fill_rectangle(Gfx **dList, s32 ulx, s32 uly, s32 lrx, s32 lry); +void render_dialogue_box(Gfx **dList, MatrixS **mat, Vertex **verts, s32 dialogueBoxID); void parse_string_with_number(char *input, char *output, s32 number); void s32_to_string(char **outString, s32 number); void load_font(s32 fontID); @@ -193,8 +193,8 @@ void func_800C663C_C723C(void); void func_800C6870_C7470(void); void func_800C67F4_C73F4(void); s32 func_800C68CC_C74CC(u16 arg0); -void func_800C6DD4_C79D4(Gfx *dlist, Asset46 *asset, s32 width, s32 height); -s32 func_800C7744_C8344(Gfx **dlist, u16 charIndex, s32 *outLeft, s32 *outTop, s32 *outRight, s32 *outBottom); +void func_800C6DD4_C79D4(Gfx *dList, Asset46 *asset, s32 width, s32 height); +s32 func_800C7744_C8344(Gfx **dList, u16 charIndex, s32 *outLeft, s32 *outTop, s32 *outRight, s32 *outBottom); void func_800C7804_C8404(s32 arg0); void func_800C7864_C8464(char *inString, char *outString); void func_800C78E0_C84E0(void); diff --git a/src/game.c b/src/game.c index 0c41b21f..5d5edda5 100644 --- a/src/game.c +++ b/src/game.c @@ -16,7 +16,7 @@ #include "gzip.h" #include "printf.h" #include "thread0_epc.h" -#include "thread30_track_loading.h" +#include "thread30_bgload.h" #include "weather.h" #include "audio.h" #include "objects.h" diff --git a/src/game_ui.c b/src/game_ui.c index 9cdccf9f..dab1bfc9 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -28,65 +28,65 @@ UNUSED s32 D_800E1E60 = 0; // Base positions of all onscreen hud elements HudElement gHudElementBase[HUD_ELEMENT_COUNT] = { - { 0, 0, 0, HUD_ASSET_0, 1.0f, 53.0f, 16.0f, 0.0f, 0, 0, 127, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_3, 1.0f, 54.0f, 18.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_WEAPONS, 0.4f, -120.0f, -68.0f, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_6, 1.0f, 104.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 93.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_4, 1.0f, 104.0f, 32.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 114.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_BANANA_ANIM, 0.5f, -3.0f, 73.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 182.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 192.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_13, 1.0f, 239.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 206.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_GO_BIG, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_GET_READY, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_FINISH, 1.0f, -200.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_MAP_DOT, 1.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_CHEQUER_FLAG, 1.0f, -50.0f, 87.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_RETICLE, 2.0f, -50.0f, 87.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_18, 1.0f, 167.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_GOLD_BALLOON, 1.0f, -127.0f, 88.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_18, 1.0f, 52.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 67.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 77.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_9, 1.0f, 221.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_6, 1.0f, 188.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_10, 1.0f, 206.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_20, 0.4f, -105.0f, -98.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_BANANA_STATIC, 0.5f, -3.0f, 73.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_23, 1.0f, -8.0f, 97.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_LAP_FINAL, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_LAP_LAP, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_LAP_2, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_2, 1.0f, 25.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_INDICATOR_TURN_90, 1.0f, -120.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_34, 0.4f, -105.0f, -98.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_WRONG, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_WAY, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_PRO_AM, 1.0f, 80.0f, -60.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, // Unused - { 0, 0, 0x6490, HUD_SPRITE_SPEEDOMETRE_ARROW, 0.5f, 122.0f, -71.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_47, 0.75f, 247.0f, 212.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_48, 1.0f, 234.0f, 196.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_49, 1.0f, 232.0f, 177.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_50, 1.0f, 240.0f, 159.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_51, 1.0f, 256.0f, 146.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_52, 1.0f, 275.0f, 143.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_53, 1.0f, 246.0f, 156.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_54, 0.7272f, 27.0f, 142.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_0, 1.0f, -200.0f, 70.0f, 0.0f, 0, 0, 129, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_3, 1.0f, -175.0f, 72.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_WEAPON_NUMBER, 1.0f, -99.0f, -89.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_PORTRAIT, 0.76f, 43.0f, 20.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_66, 1.0f, 40.0f, 54.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_BANANA_ANIM, 0.375f, -117.0f, 46.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_28, 1.0f, 51.0f, 56.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_10, 1.0f, 60.0f, 57.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_ASSET_10, 1.0f, 69.0f, 57.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_PLACE_1, 1.0f, -160.0f, 5.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_PORTRAIT, 1.0f, 260.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, HUD_SPRITE_PLACE_ST, 1.0f, 160.0f, 5.0f, 0.0f, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_0, 1.0f, 53.0f, 16.0f, 0.0f, 0, 0, 127, 0, 0 }, + { 0, 0, 0, HUD_ASSET_3, 1.0f, 54.0f, 18.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_WEAPONS, 0.4f, -120.0f, -68.0f, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_6, 1.0f, 104.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 93.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_4, 1.0f, 104.0f, 32.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 114.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_BANANA_ANIM, 0.5f, -3.0f, 73.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 182.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 192.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_13, 1.0f, 239.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 206.0f, 31.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_GO_BIG, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_GET_READY, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_FINISH, 1.0f, -200.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_MAP_DOT, 1.0f, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_CHEQUER_FLAG, 1.0f, -50.0f, 87.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_RETICLE, 2.0f, -50.0f, 87.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_18, 1.0f, 167.0f, 22.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_GOLD_BALLOON, 1.0f, -127.0f, 88.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_18, 1.0f, 52.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 67.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 77.0f, 27.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS, 1.0f, 221.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_6, 1.0f, 188.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS_SMALL, 1.0f, 206.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_20, 0.4f, -105.0f, -98.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_BANANA_STATIC, 0.5f, -3.0f, 73.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_23, 1.0f, -8.0f, 97.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_LAP_FINAL, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_LAP_LAP, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_LAP_2, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_2, 1.0f, 25.0f, 48.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_INDICATOR_TURN_90, 1.0f, -120.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_34, 0.4f, -105.0f, -98.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_WRONG, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_WAY, 1.0f, 0.0f, 30.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_PRO_AM, 1.0f, 80.0f, -60.0f, 0.0f, 0, 0, 0, 0, 0 }, // Unused + { 0, 0, 0x6490, HUD_SPRITE_SPEEDOMETRE_ARROW, 0.5f, 122.0f, -71.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_47, 0.75f, 247.0f, 212.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_48, 1.0f, 234.0f, 196.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_49, 1.0f, 232.0f, 177.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_50, 1.0f, 240.0f, 159.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_51, 1.0f, 256.0f, 146.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_52, 1.0f, 275.0f, 143.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_53, 1.0f, 246.0f, 156.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_54, 0.7272f, 27.0f, 142.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_0, 1.0f, -200.0f, 70.0f, 0.0f, 0, 0, 129, 0, 0 }, + { 0, 0, 0, HUD_ASSET_3, 1.0f, -175.0f, 72.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_WEAPON_NUMBER, 1.0f, -99.0f, -89.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_PORTRAIT, 0.76f, 43.0f, 20.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_66, 1.0f, 40.0f, 54.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_BANANA_ANIM, 0.375f, -117.0f, 46.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_28, 1.0f, 51.0f, 56.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS_SMALL, 1.0f, 60.0f, 57.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_ASSET_NUMBERS_SMALL, 1.0f, 69.0f, 57.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_PLACE_1, 1.0f, -160.0f, 5.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_PORTRAIT, 1.0f, 260.0f, 16.0f, 0.0f, 0, 0, 0, 0, 0 }, + { 0, 0, 0, HUD_SPRITE_PLACE_ST, 1.0f, 160.0f, 5.0f, 0.0f, 0, 0, 0, 0, 0 }, }; u16 D_800E25C4[96] = { @@ -99,7 +99,7 @@ u16 D_800E25C4[96] = { 0x0020, 0x00F7, 0x002D, 0x0033, 0x0103, 0x0031, 0x002E, 0x0022, 0x0047, 0xFFFF, 0xFFFF, 0xFFFF, }; -u16 D_800E2684[118] = { +s16 D_800E2684[118] = { 0x0000, 0x002D, 0x0010, 0x0087, 0x0004, 0x005E, 0x0013, 0x004E, 0x0005, 0x0066, 0x0013, 0x0056, 0x0006, 0x006F, 0x0013, 0x005F, 0x0002, 0xFFD1, 0xFFDC, 0x0024, 0x001B, 0x0000, 0x0016, 0xFFE3, 0x0007, 0x0000, 0x0016, 0xFFE3, 0x0008, 0x0061, 0x0013, 0x0044, 0x0009, 0x006A, 0x0013, 0x004D, 0x000B, 0x0037, 0x0013, 0x001A, 0x000C, 0x0000, @@ -205,12 +205,12 @@ HudData *gPlayerHud[MAXCONTROLLERS]; // One per active player s16 *gAssetHudElementIds; HudElements *gAssetHudElements; s32 gAssetHudElementIdsCount; -Gfx *gHUDCurrDisplayList; -MatrixS *gHUDCurrMatrix; -Vertex *gHUDCurrVertex; +Gfx *gHudDL; +MatrixS *gHudMtx; +Vertex *gHudVtx; s32 gHudCurrentViewport; s32 gHUDNumPlayers; -s32 D_80126D10; +s32 gHudController; s32 D_80126D14; s32 D_80126D18; s32 gMinimapDotOffsetX; @@ -220,13 +220,13 @@ s32 gHudBounceX; // Offset value to do the bounce when the hud slides in. u16 gHudBounceTimer; f32 gHudBounceMag; u8 gHudRaceStart; -u8 D_80126D35; +u8 gHudSlide; u8 gHideRaceTimer; u8 gNumActivePlayers; u8 gWrongWayNagPrefix; SoundMask *gRaceStartSoundMask; s32 gHUDVoiceSoundMask; -s32 D_80126D44; +SoundMask *gHudBalloonSoundMask; s16 D_80126D48; s32 D_80126D4C; s32 D_80126D50; @@ -266,7 +266,7 @@ UNUSED s32 D_80127198[4]; * Load basic hud assets and allocate HUD data for each player. * Set up the global hud elements and reset global vars. */ -void init_hud(UNUSED s32 viewportCount) { +void hud_init(UNUSED s32 viewportCount) { s32 i; s32 playerCount; @@ -317,7 +317,7 @@ void init_hud(UNUSED s32 viewportCount) { gHudVoiceID = 0; gHudVoiceTimer = 0; gRaceStartSoundMask = NULL; - D_80126D44 = 0; + gHudBalloonSoundMask = NULL; gMinimapXlu = 0; D_80127194 = (LevelHeader_70 *) get_misc_asset(ASSET_MISC_58); func_8007F1E8(D_80127194); @@ -339,7 +339,7 @@ void init_hud(UNUSED s32 viewportCount) { /** * Frees all elements in the hud, and the player hud, and flushes particles */ -void free_hud(void) { +void hud_free(void) { s32 i; for (i = 0; i < gAssetHudElementIdsCount; i++) { if (gAssetHudElements->entry[i] != NULL) { @@ -370,10 +370,10 @@ u8 race_starting(void) { } /** - * The root function for all of the heads up display during an active event. - * Branches off to its own function for each race type, but overridden completely in time trial. + * Root function for the HUD updating and rendering for individual players. + * The player can toggle specific overrides and settings for displays based on their current game modes. */ -void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s32 updateRate) { +void hud_render_player(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s32 updateRate) { s32 countdown; Object_Racer *racer; @@ -389,9 +389,9 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 } if (obj != NULL && !(gHudLevelHeader->unkBC & 2)) { if (get_game_mode() != GAMEMODE_MENU) { - gHUDCurrDisplayList = *dList; - gHUDCurrMatrix = *mtx; - gHUDCurrVertex = *vertexList; + gHudDL = *dList; + gHudMtx = *mtx; + gHudVtx = *vertexList; D_80127180 = 0; if (gMinimapFade) { gMinimapOpacity += updateRate; @@ -407,14 +407,14 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 if (gShowHUD == FALSE) { racer = (Object_Racer *) obj->unk64; if (D_8012718A) { - D_80126D10 = 1 - racer->playerIndex; + gHudController = 1 - racer->playerIndex; } else { - D_80126D10 = racer->playerIndex; + gHudController = racer->playerIndex; } gCurrentHud = gPlayerHud[gHudCurrentViewport]; if (cutscene_id() != 10) { if (gHUDNumPlayers == ONE_PLAYER) { - if (input_pressed(D_80126D10) & D_CBUTTONS && racer->raceFinished == FALSE && + if (input_pressed(gHudController) & D_CBUTTONS && racer->raceFinished == FALSE && ((gHudLevelHeader->race_type == RACETYPE_DEFAULT) || gHudLevelHeader->race_type == RACETYPE_HORSESHOE_GULCH) && gHudRaceStart) { @@ -426,16 +426,16 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 gHudIndicatorTimer = 0; } } - } else if (input_pressed(D_80126D10) & D_CBUTTONS && racer->raceFinished == FALSE && + } else if (input_pressed(gHudController) & D_CBUTTONS && racer->raceFinished == FALSE && !(gHudLevelHeader->race_type & RACETYPE_CHALLENGE) && gHudRaceStart) { - if (D_800E2794[gHUDNumPlayers][racer->playerIndex] < PLAYER_FOUR) { + if (D_800E2794[gHUDNumPlayers][racer->playerIndex] < 3) { D_800E2794[gHUDNumPlayers][racer->playerIndex]++; } else { - D_800E2794[gHUDNumPlayers][racer->playerIndex] = PLAYER_ONE; + D_800E2794[gHUDNumPlayers][racer->playerIndex] = 0; } sound_play((SOUND_TING_HIGHEST - (D_800E2794[gHUDNumPlayers][racer->playerIndex] == 0)), NULL); } - if (input_pressed(D_80126D10) & R_CBUTTONS && racer->raceFinished == FALSE && gHudRaceStart && + if (input_pressed(gHudController) & R_CBUTTONS && racer->raceFinished == FALSE && gHudRaceStart && gMinimapOpacity == 0) { gHudToggleSettings[gHUDNumPlayers] = 1 - gHudToggleSettings[gHUDNumPlayers]; if (gHudToggleSettings[gHUDNumPlayers] == 0) { @@ -461,15 +461,15 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 } gRaceStartShowHudStep += 1; } - gDPPipeSync(gHUDCurrDisplayList++); - rsp_init(&gHUDCurrDisplayList); - rdp_init(&gHUDCurrDisplayList); + gDPPipeSync(gHudDL++); + rsp_init(&gHudDL); + rdp_init(&gHudDL); tex_enable_modes(RENDER_ALL); tex_disable_modes(RENDER_Z_COMPARE); sprite_opaque(FALSE); if (check_if_showing_cutscene_camera() == FALSE && gHudRaceStart == FALSE && racer->playerIndex == PLAYER_ONE) { - if (D_80126D35 != 0) { + if (gHudSlide) { gHudBounceX = sins_f(gHudBounceTimer) * gHudBounceMag * 8.0f; gHudBounceTimer += updateRate << 0xB; if (gHudBounceTimer >= 0x8000) { @@ -490,48 +490,48 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 gHudOffsetX = 0; } if (gHudOffsetX == 0) { - D_80126D35 = 1; + gHudSlide = TRUE; sound_play(SOUND_EXPLOSION2, NULL); gHudBounceX = 0; } } } - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - render_magnet_reticle(obj); - set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); - gDPSetEnvColor(gHUDCurrDisplayList++, 255, 255, 255, 0); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); + hud_magnet_reticle(obj); + set_ortho_matrix_view(&gHudDL, &gHudMtx); + gDPSetEnvColor(gHudDL++, 255, 255, 255, 0); countdown = get_race_countdown() >> 1; if (is_in_time_trial()) { - func_800A277C(countdown, obj, updateRate); + hud_main_time_trial(countdown, obj, updateRate); } else { if (cutscene_id() == 10) { sprite_anim_off(TRUE); - render_balloon_count(racer); + hud_balloons(racer); sprite_anim_off(FALSE); } else { switch (get_current_level_race_type()) { case RACETYPE_DEFAULT: case RACETYPE_HORSESHOE_GULCH: if (is_taj_challenge()) { - render_hud_taj_race(countdown, obj, updateRate); + hud_main_taj(countdown, obj, updateRate); } else { - render_hud_race(countdown, obj, updateRate); + hud_main_race(countdown, obj, updateRate); } break; case RACETYPE_BOSS: - render_hud_race_boss(countdown, obj, updateRate); + hud_main_boss(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_BANANAS: - render_hud_banana_challenge(countdown, obj, updateRate); + hud_main_treasure(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_BATTLE: - render_hud_battle(countdown, obj, updateRate); + hud_main_battle(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_EGGS: - render_hud_challenge_eggs(countdown, obj, updateRate); + hud_main_eggs(countdown, obj, updateRate); break; default: - render_hud_hubworld(obj, updateRate); + hud_main_hub(obj, updateRate); break; } } @@ -539,7 +539,7 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 if (racer->raceFinished == TRUE) { sprite_anim_off(TRUE); if (is_in_time_trial()) { - render_time_trial_finish(racer, updateRate); + hud_time_trial_finish(racer, updateRate); } else if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER && racer->finishPosition == 1) { if (is_in_two_player_adventure()) { if (get_current_level_race_type() == RACETYPE_BOSS) { @@ -548,10 +548,10 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 goto block_95; } showFinishRace: - render_race_finish_position(racer, updateRate); + hud_race_finish_1player(racer, updateRate); } else { block_95: - func_800A6254(racer, updateRate); + hud_race_finish_multiplayer(racer, updateRate); } sprite_anim_off(FALSE); } @@ -559,11 +559,11 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s3 sprite_opaque(TRUE); if (D_80127180) { gHudSprites[D_80127180].texture = NULL; - texrect_draw(&gHUDCurrDisplayList, gHudSprites, 0, 0, 255, 255, 255, 255); + texrect_draw(&gHudDL, gHudSprites, 0, 0, 255, 255, 255, 255); } - *dList = gHUDCurrDisplayList; - *mtx = gHUDCurrMatrix; - *vertexList = gHUDCurrVertex; + *dList = gHudDL; + *mtx = gHudMtx; + *vertexList = gHudVtx; tex_enable_modes(RENDER_ALL); } } @@ -647,35 +647,35 @@ void hud_audio_update(s32 updateRate) { /** * In a race, render all of the race related HUD. */ -void render_hud_race(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_race(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = &obj->unk64->racer; sprite_anim_off(TRUE); - render_course_indicator_arrows(racer, updateRate); - render_wrong_way_text(racer, updateRate); - render_race_start(countdown, updateRate); + hud_course_arrows(racer, updateRate); + hud_wrong_way(racer, updateRate); + hud_race_start(countdown, updateRate); if (gHudLevelHeader->race_type == RACETYPE_DEFAULT) { - render_lap_count(racer, updateRate); + hud_lap_count(racer, updateRate); } - render_racer_bananas(racer, updateRate); - render_race_time(racer, updateRate); - render_race_position(racer, updateRate); - render_speedometer(obj, updateRate); + hud_bananas(racer, updateRate); + hud_race_time(racer, updateRate); + hud_race_position(racer, updateRate); + hud_speedometre(obj, updateRate); if (gHudSilverCoinRace && racer->raceFinished == FALSE) { - render_silver_coin_counter(racer, updateRate); + hud_silver_coins(racer, updateRate); } - render_weapon_hud(obj, updateRate); + hud_weapon(obj, updateRate); sprite_anim_off(FALSE); } /** * Render the onscreen course arrows that show the player where to go. */ -void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { +void hud_course_arrows(Object_Racer *racer, s32 updateRate) { s32 timer; s32 type; HudElement *indicator; @@ -686,59 +686,59 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { type = racer->indicator_type; racer->indicator_timer = timer - updateRate; if (type) { - indicator = (HudElement *) &gCurrentHud->courseArrows; + indicator = (HudElement *) &gCurrentHud->entry[HUD_COURSE_ARROWS]; switch (type) { case INDICATOR_LEFT: indicator->spriteID = HUD_SPRITE_INDICATOR_TURN_45; - indicator->y_rotation = 0; + indicator->rotation.y_rotation = 0; break; case INDICATOR_LEFT_SHARP: indicator->spriteID = HUD_SPRITE_INDICATOR_TURN_90; - indicator->y_rotation = 0; + indicator->rotation.y_rotation = 0; break; case INDICATOR_LEFT_UTURN: indicator->spriteID = HUD_SPRITE_INDICATOR_U; - indicator->y_rotation = 0; + indicator->rotation.y_rotation = 0; break; case INDICATOR_RIGHT: indicator->spriteID = HUD_SPRITE_INDICATOR_TURN_45; - indicator->y_rotation = -0x8000; + indicator->rotation.y_rotation = -0x8000; break; case INDICATOR_RIGHT_SHARP: indicator->spriteID = HUD_SPRITE_INDICATOR_TURN_90; - indicator->y_rotation = -0x8000; + indicator->rotation.y_rotation = -0x8000; break; case INDICATOR_RIGHT_UTURN: indicator->spriteID = HUD_SPRITE_INDICATOR_U; - indicator->y_rotation = -0x8000; + indicator->rotation.y_rotation = -0x8000; break; case INDICATOR_UP: indicator->spriteID = HUD_SPRITE_INDICATOR_DOWN; - indicator->y_rotation = -0x8000; - indicator->x_rotation = -0x8000; + indicator->rotation.y_rotation = -0x8000; + indicator->rotation.x_rotation = -0x8000; break; case INDICATOR_DOWN: indicator->spriteID = HUD_SPRITE_INDICATOR_DOWN; - indicator->y_rotation = 0; + indicator->rotation.y_rotation = 0; break; default: // INDICATOR_EXCLAMATION indicator->spriteID = HUD_SPRITE_INDICATOR_EXCLAMATION; - indicator->y_rotation = 0; + indicator->rotation.y_rotation = 0; break; } // Flip the arrow direction on adventure 2. if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS && racer->indicator_type < 30) { - indicator->y_rotation = (s16) (0x8000 - indicator->y_rotation); + indicator->rotation.y_rotation = (s16) (0x8000 - indicator->rotation.y_rotation); } if (gHUDNumPlayers == ONE_PLAYER && racer->raceFinished == FALSE && racer->indicator_type && gHudIndicatorTimer == 0) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = -indicator->x; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = -indicator->x; - indicator->x_rotation = 0; - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, indicator); + indicator->pos.x = -indicator->pos.x; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, indicator); + indicator->pos.x = -indicator->pos.x; + indicator->rotation.x_rotation = 0; + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } } else { @@ -746,19 +746,19 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { } if (gHudIndicatorTimer) { if (gHudIndicatorTimer & 0x20) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - indicator = &gCurrentHud->courseArrows; - indicator->y_rotation = 0; - indicator->x_rotation = 0; + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + indicator = &gCurrentHud->entry[HUD_COURSE_ARROWS]; + indicator->rotation.y_rotation = 0; + indicator->rotation.x_rotation = 0; indicator->spriteID = HUD_SPRITE_INDICATOR_EXCLAMATION; if ((get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) && ((s32) racer->indicator_type < 30)) { - indicator->y_rotation = (s16) (0x8000 - indicator->y_rotation); + indicator->rotation.y_rotation = (s16) (0x8000 - indicator->rotation.y_rotation); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = -indicator->x; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = -indicator->x; - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, indicator); + indicator->pos.x = -indicator->pos.x; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, indicator); + indicator->pos.x = -indicator->pos.x; + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } if (updateRate < gHudIndicatorTimer) { gHudIndicatorTimer -= updateRate; @@ -773,7 +773,7 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { * Renders the HUD for the Smokey Castle challenge. * Shows each players portrait and their aquired treasure. */ -void render_hud_banana_challenge(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_treasure(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer; Object **racers; s32 numRacers; @@ -782,48 +782,49 @@ void render_hud_banana_challenge(s32 countdown, Object *obj, s32 updateRate) { racer = &obj->unk64->racer; racers = get_racer_objects(&numRacers); sprite_anim_off(TRUE); - render_race_start(countdown, updateRate); + hud_race_start(countdown, updateRate); switch (gNumActivePlayers) { case 1: for (i = 0; i < numRacers; i++) { racer = &racers[i]->unk64->racer; - render_treasure_hud(racer); + hud_treasure(racer); if (i == 1) { - gCurrentHud->challengePortrait.x += 55.0f; - gCurrentHud->treasureMetre.x += 55.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += 55.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x += 55.0f; } - gCurrentHud->challengePortrait.x += 55.0f; - gCurrentHud->treasureMetre.x += 55.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += 55.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x += 55.0f; } if (1) {} // Fakematch - gCurrentHud->challengePortrait.x -= 275.0f; - gCurrentHud->treasureMetre.x -= 275.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x -= 275.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x -= 275.0f; break; case 3: case 4: - render_treasure_hud(racer); + hud_treasure(racer); break; } racer = &obj->unk64->racer; - reset_render_settings(&gHUDCurrDisplayList); - render_racer_bananas(racer, updateRate); - render_weapon_hud(obj, updateRate); + reset_render_settings(&gHudDL); + hud_bananas(racer, updateRate); + hud_weapon(obj, updateRate); sprite_anim_off(FALSE); } /** * The Egg Collector challenge mode displays the icons of each player and their score. */ -void render_hud_challenge_eggs(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_eggs(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = &obj->unk64->racer; if (racer->raceFinished == FALSE) { sprite_anim_off(TRUE); - render_race_start(countdown, updateRate); - render_weapon_hud(obj, updateRate); - if ((127 - (updateRate * 2)) >= gCurrentHud->eggChallengeIcon.unk1A) { - gCurrentHud->eggChallengeIcon.unk1A += updateRate * 2; + hud_race_start(countdown, updateRate); + hud_weapon(obj, updateRate); + if ((127 - (updateRate * 2)) >= gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer) { + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer += updateRate * 2; } else { - gCurrentHud->eggChallengeIcon.unk1A = (gCurrentHud->eggChallengeIcon.unk1A + (updateRate * 2)) - 255; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer = + (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer + (updateRate * 2)) - 255; } // Skip rendering the portraits if in 2 player, it's done elsewhere. if (gNumActivePlayers != 2) { @@ -868,10 +869,10 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { } if (numRacers == 4) { sprite_anim_off(TRUE); - portraitX = gCurrentHud->challengePortrait.x; - portraitY = gCurrentHud->challengePortrait.y; - diffX = (gCurrentHud->eggChallengeIcon.x - portraitX); - diffY = (gCurrentHud->eggChallengeIcon.y - portraitY); + portraitX = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + portraitY = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; + diffX = (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x - portraitX); + diffY = (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y - portraitY); for (i = 0; i < 4; i++) { curRacer = &racers[i]->unk64->racer; if (gNumActivePlayers < 3 || racer->playerIndex == curRacer->playerIndex) { @@ -879,23 +880,23 @@ void hud_draw_eggs(Object *racerObj, s32 updateRate) { } gHudColour = COLOUR_RGBA32(255, 255, 255, 254); if (gNumActivePlayers == 1) { - gCurrentHud->challengePortrait.x += 68.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += 68.0f; } else if (gNumActivePlayers == 2) { - gCurrentHud->challengePortrait.x = portraitX; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = portraitX; if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.y += 66.0; - gCurrentHud->eggChallengeIcon.y += 66.0; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 66.0; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y += 66.0; } else { - gCurrentHud->challengePortrait.y += 55.0f; - gCurrentHud->eggChallengeIcon.y += 55.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 55.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y += 55.0f; } } - gCurrentHud->eggChallengeIcon.x = gCurrentHud->challengePortrait.x + diffX; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x + diffX; } - gCurrentHud->challengePortrait.x = portraitX; - gCurrentHud->eggChallengeIcon.x = portraitX + diffX; - gCurrentHud->challengePortrait.y = portraitY; - gCurrentHud->eggChallengeIcon.y = portraitY + diffY; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = portraitX; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x = portraitX + diffX; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = portraitY; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y = portraitY + diffY; sprite_anim_off(FALSE); } } @@ -911,32 +912,32 @@ void hud_eggs_portrait(Object_Racer *racer, UNUSED s32 updateRate) { s32 prevY; s32 i2; - prevY = gCurrentHud->eggChallengeIcon.x; - gCurrentHud->challengePortrait.spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; + prevY = gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; D_80126CD5 = TRUE; if (gNumActivePlayers < 3 || (gNumActivePlayers == 3 && racer->playerIndex == PLAYER_COMPUTER)) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengePortrait); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT]); } - if (gCurrentHud->eggChallengeIcon.unk1A < 0) { - alpha = (gCurrentHud->eggChallengeIcon.unk1A * 2) + 256; + if (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer < 0) { + alpha = (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer * 2) + 256; } else { - alpha = 255 - (gCurrentHud->eggChallengeIcon.unk1A * 2); + alpha = 255 - (gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].challengeEggs.alphaTimer * 2); } if (alpha > 254) { alpha = 254; } for (i = 0; i < racer->lap && i < HUD_EGG_TOTAL; i++) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->eggChallengeIcon); - gCurrentHud->eggChallengeIcon.x += 12.0f; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON]); + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x += 12.0f; } gHudColour = alpha | COLOUR_RGBA32(255, 255, 255, 0); i2 = i; for (i = 0; i < racer->eggHudCounter && i2 < HUD_EGG_TOTAL; i++) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->eggChallengeIcon); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON]); i2++; - gCurrentHud->eggChallengeIcon.x += 12.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x += 12.0f; } - gCurrentHud->eggChallengeIcon.x = prevY; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x = prevY; D_80126CD5 = FALSE; } @@ -944,7 +945,7 @@ void hud_eggs_portrait(Object_Racer *racer, UNUSED s32 updateRate) { * Render the HUD for the battle mode challenge. * Shows each players portrait and their remaining health. */ -void render_hud_battle(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_battle(s32 countdown, Object *obj, s32 updateRate) { Object **racerObjs; Object_Racer *racer; s32 numRacers; @@ -954,8 +955,8 @@ void render_hud_battle(s32 countdown, Object *obj, s32 updateRate) { racer = (Object_Racer *) obj->unk64; if (gNumActivePlayers != 1 || racer->raceFinished == FALSE) { sprite_anim_off(TRUE); - render_race_start(countdown, updateRate); - render_weapon_hud(obj, updateRate); + hud_race_start(countdown, updateRate); + hud_weapon(obj, updateRate); racerObjs = get_racer_objects(&numRacers); switch (gNumActivePlayers) { case 1: @@ -974,7 +975,7 @@ void render_hud_battle(s32 countdown, Object *obj, s32 updateRate) { } break; default: - render_racer_bananas(racer, updateRate); + hud_bananas(racer, updateRate); break; } sprite_anim_off(FALSE); @@ -982,7 +983,7 @@ void render_hud_battle(s32 countdown, Object *obj, s32 updateRate) { } #ifdef NON_MATCHING -// hud_render_lives +// hud_lives void func_800A1E48(Object *racerObj, s32 updateRate) { f32 temp; s32 i; @@ -1007,28 +1008,28 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { sprite_anim_off(TRUE); if (numRacers == 4) { offset = 0; - prevCurrHudUnk64C = gCurrentHud->challengePortrait.x; - prevCurrHudUnk650 = gCurrentHud->challengePortrait.y; + prevCurrHudUnk64C = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + prevCurrHudUnk650 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; for (i = 0; i < 4; i++) { curRacer = &racers[i]->unk64->racer; temp = prevCurrHudUnk64C ^ 0; - temp3 = temp - gCurrentHud->challengePortrait.x; + temp3 = temp - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; temp = temp3; temp2 = offset + prevCurrHudUnk650; - temp4 = temp2 - gCurrentHud->challengePortrait.y; + temp4 = temp2 - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; temp2 = temp4; - gCurrentHud->challengePortrait.x += temp; - gCurrentHud->challengePortrait.y += temp2; - gCurrentHud->battleBananaIcon.x += temp; - gCurrentHud->battleBananaIcon.y -= temp2; - gCurrentHud->battleBananaX.x += temp; - gCurrentHud->battleBananaX.y += temp2; - gCurrentHud->battleBananaCount1.x += temp; - gCurrentHud->battleBananaCount1.y += temp2; - gCurrentHud->battleBananaCount2.x += temp; - gCurrentHud->battleBananaCount2.y += temp2; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += temp; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.y -= temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.y += temp2; if (gNumActivePlayers < 3 || racer->playerIndex == curRacer->playerIndex) { - hud_draw_lives(curRacer, updateRate); + hud_lives_render(curRacer, updateRate); } if (gNumActivePlayers == 1) { prevCurrHudUnk64C += 68; @@ -1042,21 +1043,21 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { } temp = prevCurrHudUnk64C; - temp3 = temp - gCurrentHud->challengePortrait.x; + temp3 = temp - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; temp = temp3; temp2 = prevCurrHudUnk650; - temp4 = temp2 - gCurrentHud->challengePortrait.y; + temp4 = temp2 - gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; temp2 = temp4; - gCurrentHud->challengePortrait.x += temp; - gCurrentHud->challengePortrait.y += temp2; - gCurrentHud->battleBananaIcon.x += temp; - gCurrentHud->battleBananaIcon.y -= temp2; - gCurrentHud->battleBananaX.x += temp; - gCurrentHud->battleBananaX.y += temp2; - gCurrentHud->battleBananaCount1.x += temp; - gCurrentHud->battleBananaCount1.y += temp2; - gCurrentHud->battleBananaCount2.x += temp; - gCurrentHud->battleBananaCount2.y += temp2; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x += temp; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_ICON].pos.y -= temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_X].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.y += temp2; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.x += temp; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].pos.y += temp2; } sprite_anim_off(FALSE); } @@ -1068,34 +1069,34 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { * Render the portrait and life counter in the battle mode. * In 3/4 player, skips the portrait for all human players. Player 4 has a portrait if it's AI. */ -void hud_draw_lives(Object_Racer *racer, UNUSED s32 updateRate) { - gCurrentHud->challengePortrait.spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; +void hud_lives_render(Object_Racer *racer, UNUSED s32 updateRate) { + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; if (gNumActivePlayers < 3 || (gNumActivePlayers == 3 && racer->playerIndex == PLAYER_COMPUTER)) { D_80126CD5 = TRUE; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengePortrait); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT]); D_80126CD5 = FALSE; - rdp_init(&gHUDCurrDisplayList); - reset_render_settings(&gHUDCurrDisplayList); + rdp_init(&gHudDL); + reset_render_settings(&gHudDL); } if (racer->bananas < 10) { - gCurrentHud->battleBananaCount1.spriteOffset = racer->bananas; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].spriteOffset = racer->bananas; if (gNumActivePlayers == 2) { - gCurrentHud->battleBananaCount1.x += 6.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.x += 6.0f; } } else { - gCurrentHud->battleBananaCount1.spriteOffset = racer->bananas / 10; - gCurrentHud->battleBananaCount2.spriteOffset = racer->bananas % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->battleBananaCount2); + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].spriteOffset = racer->bananas / 10; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2].spriteOffset = racer->bananas % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_2]); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->battleBananaCount1); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1]); if (gNumActivePlayers == 2 && racer->bananas < 10) { - gCurrentHud->battleBananaCount1.x -= 6.0f; + gCurrentHud->entry[HUD_BATTLE_BANANA_COUNT_1].pos.x -= 6.0f; } if (gNumActivePlayers != 2) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->battleBananaX); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BATTLE_BANANA_X]); sprite_opaque(TRUE); D_80126CD5 = TRUE; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->battleBananaIcon); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BATTLE_BANANA_ICON]); D_80126CD5 = FALSE; sprite_opaque(FALSE); } @@ -1104,39 +1105,39 @@ void hud_draw_lives(Object_Racer *racer, UNUSED s32 updateRate) { /** * When racing the boss, render the essentials, but skip the bananas. */ -void render_hud_race_boss(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_boss(s32 countdown, Object *obj, s32 updateRate) { LevelHeader *level; Object_Racer *racer = (Object_Racer *) obj->unk64; sprite_anim_off(TRUE); - render_wrong_way_text(racer, updateRate); - render_race_start(countdown, updateRate); - render_race_time(racer, updateRate); - render_weapon_hud(obj, updateRate); + hud_wrong_way(racer, updateRate); + hud_race_start(countdown, updateRate); + hud_race_time(racer, updateRate); + hud_weapon(obj, updateRate); level = get_current_level_header(); if (level->laps > 1) { - render_lap_count(racer, updateRate); + hud_lap_count(racer, updateRate); } - render_speedometer(obj, updateRate); - render_race_position(racer, updateRate); + hud_speedometre(obj, updateRate); + hud_race_position(racer, updateRate); sprite_anim_off(FALSE); } /** * When racing Taj in the overworld, render most of the basic race hud. */ -void render_hud_taj_race(s32 countdown, Object *obj, s32 updateRate) { +void hud_main_taj(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = (Object_Racer *) obj->unk64; sprite_anim_off(TRUE); - render_wrong_way_text(racer, updateRate); - render_lap_count(racer, updateRate); - render_race_position(racer, updateRate); - render_race_time(racer, updateRate); - render_race_start(countdown, updateRate); - render_speedometer(obj, updateRate); + hud_wrong_way(racer, updateRate); + hud_lap_count(racer, updateRate); + hud_race_position(racer, updateRate); + hud_race_time(racer, updateRate); + hud_race_start(countdown, updateRate); + hud_speedometre(obj, updateRate); sprite_anim_off(FALSE); } @@ -1144,29 +1145,28 @@ void render_hud_taj_race(s32 countdown, Object *obj, s32 updateRate) { * The hub world displays the player's balloon count. * In two player adventure, the icon of the character of the player sitting out is displayed. */ -void render_hud_hubworld(Object *obj, s32 updateRate) { +void hud_main_hub(Object *obj, s32 updateRate) { Object_Racer *racer; HudElement *portrait; - if (get_viewport_count() == 0) { + if (get_viewport_count() == PLAYER_ONE) { racer = (Object_Racer *) obj->unk64; sprite_anim_off(TRUE); - render_balloon_count(racer); - render_speedometer(obj, updateRate); + hud_balloons(racer); + hud_speedometre(obj, updateRate); if (is_in_two_player_adventure()) { - portrait = (HudElement *) &gCurrentHud->twoPlayerAdvPortrait; + portrait = (HudElement *) &gCurrentHud->entry[HUD_TWO_PLAYER_ADV_PORTRAIT]; portrait->spriteID = (get_settings()->racers[1].character + HUD_SPRITE_PORTRAIT); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, portrait); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, portrait); } sprite_anim_off(FALSE); } } #ifdef NON_MATCHING -// render_hud_time_trial // https://decomp.me/scratch/BWqz9 // Draws Time Trial HUD. Also handles music/audio? -void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { +void hud_main_time_trial(s32 arg0, Object *playerRacerObj, s32 updateRate) { s32 i; s32 spB8; s32 spB4; @@ -1199,7 +1199,7 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { ttSWBody.y = 0; ttSWBody.z = 0; gAssetHudElements->entry[20] = spawn_object(&ttSWBody, 0); - gCurrentHud->stopwatchHands.y_rotation = -0x8000; + gCurrentHud->entry[HUD_STOPWATCH_HANDS].rotation.y_rotation = -0x8000; if (gAssetHudElements->entry[20] != NULL) { ((Object *) gAssetHudElements->entry[20])->segment.animFrame = 0; } @@ -1211,7 +1211,7 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { ttSWArms.y = 0; ttSWArms.z = 0; gAssetHudElements->entry[34] = spawn_object(&ttSWArms, 0); - gCurrentHud->stopwatch.y_rotation = -0x8000; + gCurrentHud->entry[HUD_STOPWATCH].rotation.y_rotation = -0x8000; } ttSWBodyObject = gAssetHudElements->entry[20]; if (ttSWBodyObject != NULL) { @@ -1249,16 +1249,16 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { ttSWBodyObject->segment.animFrame = temp_lo - 1; } else { ttSWBodyObject->segment.animFrame = 0; - if (curRacer->unk1FC == 0 && curRacer->raceFinished == 0) { - set_stopwatch_face(4, 0, 4, 1, 1); + if (curRacer->wrongWayCounter == 0 && curRacer->raceFinished == 0) { + hud_stopwatch_face(4, 0, 4, 1, 1); } } } } } - object_animate(ttSWBodyObject); + obj_animate(ttSWBodyObject); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->stopwatchHands); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_STOPWATCH_HANDS]); for (i = 0; curRacer->lap >= i && i < 5; i++) { stopwatchTimer += curRacer->lap_times[i]; @@ -1270,42 +1270,42 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { if (normalise_time(36000) < stopwatchTimer) { stopwatchTimer = normalise_time(36000); } - gCurrentHud->stopwatch.z_rotation = ((stopwatchTimer * 0x444) + 0x7FF8); + gCurrentHud->entry[HUD_STOPWATCH].rotation.z_rotation = ((stopwatchTimer * 0x444) + 0x7FF8); if (get_contpak_error() <= 0) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->stopwatch); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_STOPWATCH]); } - gCurrentHud->stopwatch.z_rotation = ((((stopwatchTimer / 60) + 30) % 60) * 0x444); - gCurrentHud->stopwatch.y = gCurrentHud->stopwatchHands.y + 28.0f; + gCurrentHud->entry[HUD_STOPWATCH].rotation.z_rotation = ((((stopwatchTimer / 60) + 30) % 60) * 0x444); + gCurrentHud->entry[HUD_STOPWATCH].pos.y = gCurrentHud->entry[HUD_STOPWATCH_HANDS].pos.y + 28.0f; if (get_contpak_error() <= 0) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->stopwatch); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_STOPWATCH]); } - obj68->unk20 = 0; + obj68->animUpdateTimer = 0; sprite_anim_off(TRUE); - render_course_indicator_arrows(curRacer, updateRate); + hud_course_arrows(curRacer, updateRate); if (!curRacer->raceFinished) { - spB8 = gCurrentHud->lapTimeText.y; + spB8 = gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y; for (i = 0; i < curRacer->countLap && i < gHudLevelHeader->laps; i++) { // FAKEMATCH get_timestamp_from_frames(curRacer->lap_times[i] & 0xFFFFFFFFFFFFFFFF, &spB4, &spB0, &spAC); gHudColour = gHudLapColours[i]; - render_timer(gCurrentHud->lapTimeText.x, spB8, spB4, spB0, spAC, 1); + hud_timer_render(gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x, spB8, spB4, spB0, spAC, 1); gHudColour = COLOUR_RGBA32(255, 255, 255, 254); spB8 += 12; - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - gCurrentHud->timeTrialLapNumber.spriteOffset = i + 1; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - (HudElement *) &gCurrentHud->timeTrialLapNumber); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - (HudElement *) &gCurrentHud->timeTrialLapText); - gCurrentHud->timeTrialLapNumber.y += 12.0f; - gCurrentHud->timeTrialLapText.y += 12.0f; + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); + gCurrentHud->entry[HUD_TIME_TRIAL_LAP_NUMBER].spriteOffset = i + 1; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, + (HudElement *) &gCurrentHud->entry[HUD_TIME_TRIAL_LAP_NUMBER]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, + (HudElement *) &gCurrentHud->entry[HUD_TIME_TRIAL_LAP_TEXT]); + gCurrentHud->entry[HUD_TIME_TRIAL_LAP_NUMBER].pos.y += 12.0f; + gCurrentHud->entry[HUD_TIME_TRIAL_LAP_TEXT].pos.y += 12.0f; } if (1) {} // FAKEMATCH posX = ((i * 4) - i) * 4; - gCurrentHud->timeTrialLapNumber.y -= posX; - gCurrentHud->timeTrialLapText.y -= posX; + gCurrentHud->entry[HUD_TIME_TRIAL_LAP_NUMBER].pos.y -= posX; + gCurrentHud->entry[HUD_TIME_TRIAL_LAP_TEXT].pos.y -= posX; if ((curRacer->boost_sound & BOOST_SOUND_UNK4) && (D_80126D4C <= 0)) { - set_stopwatch_face(7, 3, 0, 4, 0); + hud_stopwatch_face(7, 3, 0, 4, 0); D_80126D4C = 60; curRacer->boost_sound &= ~BOOST_SOUND_UNK4; } @@ -1370,18 +1370,18 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { } } if ((curRacer->lap_times[curRacer->lap] < 30) && (curRacer->lap != 0)) { - set_stopwatch_face(5, 1, 2, 2, 0); + hud_stopwatch_face(5, 1, 2, 2, 0); } else if (curRacer->boostTimer > 0) { - set_stopwatch_face(6, 2, 3, 2, 0); - } else if (curRacer->unk1FC > 120) { - set_stopwatch_face(6, 3, 1, 4, 0); + hud_stopwatch_face(6, 2, 3, 2, 0); + } else if (curRacer->wrongWayCounter > 120) { + hud_stopwatch_face(6, 3, 1, 4, 0); } - render_lap_count(curRacer, updateRate); - render_race_time(curRacer, updateRate); - render_racer_bananas(curRacer, updateRate); - render_wrong_way_text(curRacer, updateRate); - render_race_start(arg0, updateRate); - render_speedometer(playerRacerObj, updateRate); + hud_lap_count(curRacer, updateRate); + hud_race_time(curRacer, updateRate); + hud_bananas(curRacer, updateRate); + hud_wrong_way(curRacer, updateRate); + hud_race_start(arg0, updateRate); + hud_speedometre(playerRacerObj, updateRate); if (get_contpak_error() > 0) { switch (get_contpak_error()) { case CONTPAK_ERROR_UNKNOWN: @@ -1404,20 +1404,20 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { set_text_font(ASSET_FONTS_FUNFONT); // Draw text shadow. set_text_colour(0, 0, 0, 255, 255); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 1, - SWMessage[0], ALIGN_MIDDLE_CENTER); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 15, - SWMessage[1], ALIGN_MIDDLE_CENTER); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 29, - SWMessage[2], ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 1, SWMessage[0], + ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 15, SWMessage[1], + ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX + 1, gStopwatchErrorY + 29, SWMessage[2], + ALIGN_MIDDLE_CENTER); // Draw actual text. set_text_colour(D_80127194->red, D_80127194->green, D_80127194->blue, 128, D_80127194->alpha); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY, - SWMessage[0], ALIGN_MIDDLE_CENTER); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY + 14, - SWMessage[1], ALIGN_MIDDLE_CENTER); - draw_text(&gHUDCurrDisplayList, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY + 28, - SWMessage[2], ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY, SWMessage[0], + ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY + 14, SWMessage[1], + ALIGN_MIDDLE_CENTER); + draw_text(&gHudDL, gStopwatchErrorX + gHudOffsetX + gHudBounceX, gStopwatchErrorY + 28, SWMessage[2], + ALIGN_MIDDLE_CENTER); update_colour_cycle(D_80127194, updateRate); set_kerning(0); } @@ -1425,10 +1425,10 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { } } #else -#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/func_800A277C.s") +#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/hud_main_time_trial.s") #endif -void set_stopwatch_face(u8 arg0, u8 arg1, u8 faceID, u8 arg3, u8 arg4) { +void hud_stopwatch_face(u8 arg0, u8 arg1, u8 faceID, u8 arg3, u8 arg4) { s32 var_a3; s32 i; UNUSED u8 *temp_v0_2; @@ -1470,14 +1470,14 @@ void set_stopwatch_face(u8 arg0, u8 arg1, u8 faceID, u8 arg3, u8 arg4) { * Reset the angle of the speedometre's needle to the starting position. */ void hud_speedometre_reset(void) { - gCurrentHud->speedometreArrow.z_rotation = 0x6490; + gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation = 0x6490; } /** * When enabled, displays speed of the player in the bottom right corner, replacing the minimap. * Speed is calculated by normalising racer velocity. then scaling the angle of the needle with that number. */ -void render_speedometer(Object *obj, UNUSED s32 updateRate) { +void hud_speedometre(Object *obj, UNUSED s32 updateRate) { f32 vel; Object_Racer *racer; s32 opacity; @@ -1498,9 +1498,9 @@ void render_speedometer(Object *obj, UNUSED s32 updateRate) { sRecordVel = vel; } vel *= 4.0f; + //!@Bug: Planes and hovercraft use drift_direction for something else, applying this unintentionally. if (racer->drift_direction != 0) { - vel += 7.0f; //!@Bug: Planes and hovercraft use drift_direction for something else, applying this - //! unintentionally. + vel += 7.0f; } if (vel > 100.0f) { vel = 100.0f; @@ -1514,12 +1514,12 @@ void render_speedometer(Object *obj, UNUSED s32 updateRate) { vel = 25744.0f; } if (!is_game_paused()) { - if (vel < gCurrentHud->speedometreArrow.z_rotation) { - gCurrentHud->speedometreArrow.z_rotation += - ((vel - gCurrentHud->speedometreArrow.z_rotation) / 2); + if (vel < gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation) { + gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation += + ((vel - gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation) / 2); } else { - gCurrentHud->speedometreArrow.z_rotation += - ((vel - gCurrentHud->speedometreArrow.z_rotation) / 8); + gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation += + ((vel - gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW].rotation.z_rotation) / 8); } } if (gHudToggleSettings[gHUDNumPlayers] == 0) { @@ -1528,25 +1528,18 @@ void render_speedometer(Object *obj, UNUSED s32 updateRate) { } else { opacity = 255; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->speedometreBG); - reset_render_settings(&gHUDCurrDisplayList); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_BG]); + reset_render_settings(&gHudDL); sprite_opaque(TRUE); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, opacity); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreArrow); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, opacity); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_ARROW]); sprite_opaque(FALSE); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber0); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber30); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber60); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber90); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber120); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->speedometreNumber150); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_0]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_30]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_60]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_90]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_120]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SPEEDOMETRE_150]); } } } @@ -1557,7 +1550,7 @@ void render_speedometer(Object *obj, UNUSED s32 updateRate) { * Call the functions that render the "Get Ready" and "GO!" as well as their countdowns to control fade. * This function will also call to begin the background music for 1 and 2 player. 3 and 4 are treated with silence. */ -void render_race_start(s32 countdown, s32 updateRate) { +void hud_race_start(s32 countdown, s32 updateRate) { if (!is_game_paused()) { if (countdown == 0 && gHudAudioData[0].playerIndex == PLAYER_COMPUTER) { @@ -1569,9 +1562,9 @@ void render_race_start(s32 countdown, s32 updateRate) { } if (countdown > 0) { if (gHudRaceStart) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, (countdown * 255) / 40); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceStartReady); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, (countdown * 255) / 40); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_START_READY]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); if (gRaceStartShowHudStep == 2) { sound_play(SOUND_VOICE_TT_GET_READY, &gHUDVoiceSoundMask); gRaceStartShowHudStep++; @@ -1598,13 +1591,12 @@ void render_race_start(s32 countdown, s32 updateRate) { } } } - } else if (gCurrentHud->raceStartGo.x > -200.0f) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - (HudElement *) &gCurrentHud->raceStartGo); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - gCurrentHud->raceStartGo.unk1A[gHudCurrentViewport] += updateRate; - if (gCurrentHud->raceStartGo.unk1A[gHudCurrentViewport] >= 60) { + } else if (gCurrentHud->entry[HUD_RACE_START_GO].pos.x > -200.0f) { + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &gCurrentHud->entry[HUD_RACE_START_GO]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); + gCurrentHud->entry[HUD_RACE_START_GO].raceStartGo.musicStartTimer[gHudCurrentViewport] += updateRate; + if (gCurrentHud->entry[HUD_RACE_START_GO].raceStartGo.musicStartTimer[gHudCurrentViewport] >= 60) { if (gRaceStartShowHudStep == 4) { // Mute background music in 3/4 player. if (get_viewport_count() > TWO_PLAYERS) { @@ -1615,7 +1607,7 @@ void render_race_start(s32 countdown, s32 updateRate) { sound_play(SOUND_WHOOSH1, NULL); gRaceStartShowHudStep++; } - gCurrentHud->raceStartGo.x -= (updateRate * 8); + gCurrentHud->entry[HUD_RACE_START_GO].pos.x -= (updateRate * 8); } if (gRaceStartShowHudStep == 3) { sound_play(SOUND_VOICE_TT_GO, &gHUDVoiceSoundMask); @@ -1635,81 +1627,81 @@ void render_race_start(s32 countdown, s32 updateRate) { * Renders the banana counter on screen. * When a banana is collected, render sparkles and animate the banana. for a brief moment. */ -void render_racer_bananas(Object_Racer *racer, s32 updateRate) { +void hud_bananas(Object_Racer *racer, s32 updateRate) { s32 bananas; UNUSED s16 pad; s32 temp_lo; - u8 var_v1; + u8 prevSprite; if (racer->playerIndex == PLAYER_COMPUTER || - (((gHUDNumPlayers < TWO_PLAYERS || D_800E2794[gHUDNumPlayers][racer->playerIndex] == PLAYER_THREE || + (((gHUDNumPlayers < TWO_PLAYERS || D_800E2794[gHUDNumPlayers][racer->playerIndex] == 2 || gHudLevelHeader->race_type == RACETYPE_CHALLENGE_BANANAS || gHudLevelHeader->race_type == RACETYPE_CHALLENGE_BATTLE) && racer->raceFinished == FALSE) && (gHUDNumPlayers < TWO_PLAYERS || racer->lap < 1 || racer->lap_times[racer->lap] >= 180 || gHudLevelHeader->race_type & RACETYPE_CHALLENGE))) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountX); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_X]); bananas = racer->bananas; - var_v1 = gCurrentHud->bananaCountIconSpin.spriteOffset; - if ((gCurrentHud->bananaCountIconSpin.unk1A == 0) && - (gCurrentHud->bananaCountIconSpin.unk1B != racer->bananas)) { - gCurrentHud->bananaCountIconSpin.unk1A = 2; - gCurrentHud->bananaCountIconSpin.unk1B = racer->bananas; - } else if (gCurrentHud->bananaCountIconSpin.unk1A) { - gCurrentHud->bananaCountSparkle.scale = 2.0f; - var_v1 += updateRate * 13; - if (var_v1 < (gCurrentHud->bananaCountIconSpin.spriteOffset & 0xFF)) { - gCurrentHud->bananaCountIconSpin.unk1A--; - if (gCurrentHud->bananaCountIconSpin.unk1A == 0) { - gCurrentHud->bananaCountSparkle.unk1B = 1; - gCurrentHud->bananaCountSparkle.unk1A = 6; - var_v1 = 0; - gCurrentHud->bananaCountSparkle.spriteOffset = 1; + prevSprite = gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset; + if (gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.spinCounter == 0 && + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.visualCounter != racer->bananas) { + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.spinCounter = 2; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.visualCounter = racer->bananas; + } else if (gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.spinCounter) { + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].scale = 2.0f; + prevSprite += updateRate * 13; + if (prevSprite < (gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset & 0xFF)) { + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.spinCounter--; + if (gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.spinCounter == 0) { + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleCounter = 1; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleTimer = 6; + prevSprite = 0; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].spriteOffset = 1; } } } - if (var_v1 == 0) { + if (prevSprite == 0) { sprite_opaque(TRUE); set_viewport_tv_type(OS_TV_TYPE_NTSC); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountIconStatic); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC]); set_viewport_tv_type(OS_TV_TYPE_PAL); sprite_opaque(FALSE); - gCurrentHud->bananaCountIconSpin.spriteOffset = var_v1; - if (gCurrentHud->bananaCountSparkle.unk1B) { - gCurrentHud->bananaCountSparkle.unk1A -= updateRate; - if (gCurrentHud->bananaCountSparkle.unk1A < 0) { - gCurrentHud->bananaCountSparkle.unk1A = 6; - if (gCurrentHud->bananaCountSparkle.spriteOffset == 6) { - gCurrentHud->bananaCountSparkle.spriteOffset = 0; - gCurrentHud->bananaCountSparkle.unk1B--; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset = prevSprite; + if (gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleCounter) { + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleTimer -= updateRate; + if (gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleTimer < 0) { + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleTimer = 6; + if (gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].spriteOffset == 6) { + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].spriteOffset = 0; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].bananaCountSparkle.sparkleCounter--; } else { - gCurrentHud->bananaCountSparkle.spriteOffset++; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].spriteOffset++; } } set_viewport_tv_type(OS_TV_TYPE_NTSC); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountSparkle); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE]); set_viewport_tv_type(OS_TV_TYPE_PAL); } } else { - gCurrentHud->bananaCountIconSpin.spriteOffset = var_v1 + 128; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset = prevSprite + 128; sprite_anim_off(FALSE); sprite_opaque(TRUE); set_viewport_tv_type(OS_TV_TYPE_NTSC); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountIconSpin); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN]); sprite_opaque(FALSE); set_viewport_tv_type(OS_TV_TYPE_PAL); sprite_anim_off(TRUE); - gCurrentHud->bananaCountIconSpin.spriteOffset -= 128; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].spriteOffset -= 128; } temp_lo = bananas / 10; if (temp_lo) { - gCurrentHud->bananaCountNumber1.spriteOffset = temp_lo; - gCurrentHud->bananaCountNumber2.spriteOffset = bananas % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountNumber2); + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].spriteOffset = temp_lo; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].spriteOffset = bananas % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2]); } else { - gCurrentHud->bananaCountNumber1.spriteOffset = bananas % 10; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].spriteOffset = bananas % 10; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountNumber1); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } @@ -1717,15 +1709,15 @@ void render_racer_bananas(Object_Racer *racer, s32 updateRate) { * Renders the icons and secured treasure in Smokey's castle. * In 4 player, all icons are skipped and in 3 player, player 4's icon is shown on their quadrant. */ -void render_treasure_hud(Object_Racer *racer) { +void hud_treasure(Object_Racer *racer) { s32 i; s32 prevY; - prevY = gCurrentHud->treasureMetre.y; + prevY = gCurrentHud->entry[HUD_TREASURE_METRE].pos.y; if (gNumActivePlayers < 3 || (gNumActivePlayers == 3 && racer->playerIndex == PLAYER_COMPUTER)) { - gCurrentHud->challengePortrait.spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; D_80126CD5 = TRUE; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengePortrait); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT]); D_80126CD5 = FALSE; } for (i = 0; i < 10; i++) { @@ -1733,64 +1725,65 @@ void render_treasure_hud(Object_Racer *racer) { gHudColour = COLOUR_RGBA32(128, 128, 128, 128); } D_80126CD5 = TRUE; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->treasureMetre); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_TREASURE_METRE]); D_80126CD5 = FALSE; - gCurrentHud->treasureMetre.y -= 3.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y -= 3.0f; } - gCurrentHud->treasureMetre.y = prevY; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y = prevY; gHudColour = COLOUR_RGBA32(255, 255, 255, 254); D_80126CD5 = FALSE; } /** * Render the silver coin counter on the side of the screen. - * When the 8th coin is collected, wait a second then play an encouraging voice clip from T.T. + * When the 8th coin is collected, wait half a second then play an encouraging voice clip from T.T. */ -void render_silver_coin_counter(Object_Racer *racer, s32 updateRate) { +void hud_silver_coins(Object_Racer *racer, s32 updateRate) { s32 i; s32 prevY; - gCurrentHud->silverCoinTally.y = (s32) gCurrentHud->silverCoinTally.y; // Rounds float down to it's int value. - prevY = gCurrentHud->silverCoinTally.y; + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].pos.y = + (s32) gCurrentHud->entry[HUD_SILVER_COIN_TALLY].pos.y; // Rounds float down to it's int value. + prevY = gCurrentHud->entry[HUD_SILVER_COIN_TALLY].pos.y; for (i = 0; i < 8; i++) { if (i >= racer->silverCoinCount) { gHudColour = COLOUR_RGBA32(128, 128, 128, 128); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->silverCoinTally); - gCurrentHud->silverCoinTally.y -= gCurrentHud->silverCoinTally.unk1C; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_SILVER_COIN_TALLY]); + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].pos.y -= + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.offsetY; } if (racer->silverCoinCount == 8) { - if (gCurrentHud->silverCoinTally.unk1B < 30) { - gCurrentHud->silverCoinTally.unk1B += updateRate; + if (gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.soundTimer < 30) { + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.soundTimer += updateRate; } - if (gCurrentHud->silverCoinTally.unk1A == 0) { - if (gCurrentHud->silverCoinTally.unk1B >= 30) { - gCurrentHud->silverCoinTally.unk1A = 1; + if (gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.soundPlayed == FALSE) { + if (gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.soundTimer >= 30) { + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].silverCoinTally.soundPlayed = TRUE; if (gHUDVoiceSoundMask == NULL) { sound_play(SOUND_VOICE_TT_GO_FOR_IT, &gHUDVoiceSoundMask); } } } } - gCurrentHud->silverCoinTally.y = prevY; + gCurrentHud->entry[HUD_SILVER_COIN_TALLY].pos.y = prevY; gHudColour = COLOUR_RGBA32(255, 255, 255, 254); } /** - * Plays the race finish fanfare and displays what position you finished - * in the middle of the screen. + * Plays the race finish fanfare and displays what position you finished in the middle of the screen. * Uses a 3 step process to play the sounds, display the position, then slide it offscreen. */ -void render_race_finish_position(Object_Racer *racer, s32 updateRate) { +void hud_race_finish_1player(Object_Racer *racer, s32 updateRate) { HudElement *position1; HudElement *position2; s8 drawPosition; - position1 = &gCurrentHud->raceFinishPosition1; - position2 = &gCurrentHud->raceFinishPosition2; + position1 = &gCurrentHud->entry[HUD_RACE_FINISH_POS_1]; + position2 = &gCurrentHud->entry[HUD_RACE_FINISH_POS_2]; drawPosition = FALSE; - switch (position1->unk1A) { - case 0: + switch (position1->raceFinishPos.status) { + case HUD_RACEFINISH_MUTE: music_voicelimit_set(24); music_play(SEQUENCE_FIRST_PLACE); sound_play(SOUND_WHOOSH1, NULL); @@ -1798,26 +1791,26 @@ void render_race_finish_position(Object_Racer *racer, s32 updateRate) { gHudAudioData[0].volume = 127; gHudAudioData[0].volumeRamp = 0; gHudAudioData[0].playerIndex = racer->playerIndex; - position1->unk1A = 1; + position1->raceFinishPos.status = HUD_RACEFINISH_TEXT_IN; break; - case 1: - position1->x += updateRate * 13; - if (position1->x > -23.0f) { - position1->x = -23.0f; + case HUD_RACEFINISH_TEXT_IN: + position1->pos.x += updateRate * 13; + if (position1->pos.x > -23.0f) { + position1->pos.x = -23.0f; } - position2->x -= updateRate * 13; - if (position2->x < 22.0f) { - position2->x = 22.0f; + position2->pos.x -= updateRate * 13; + if (position2->pos.x < 22.0f) { + position2->pos.x = 22.0f; } drawPosition = TRUE; - if (position2->x == 22.0f) { - position1->unk1B += updateRate; - if (position1->unk1B >= 120) { - position1->unk1B = -120; - position1->unk1C = position1->unk1C + 1; + if (position2->pos.x == 22.0f) { + position1->raceFinishPos.textOutTimer += updateRate; + if (position1->raceFinishPos.textOutTimer >= 120) { + position1->raceFinishPos.textOutTimer = -120; + position1->raceFinishPos.textOutTicks++; } - if (position1->unk1C == 2) { - position1->unk1A = 2; + if (position1->raceFinishPos.textOutTicks == 2) { + position1->raceFinishPos.status = HUD_RACEFINISH_TEXT_OUT; sound_play(SOUND_WHOOSH1, NULL); if (gHudAudioData[0].playerIndex == racer->playerIndex) { gHudAudioData[0].volumeRamp = -1; @@ -1825,23 +1818,23 @@ void render_race_finish_position(Object_Racer *racer, s32 updateRate) { } } break; - case 2: - position1->x += updateRate * 13; - position2->x += updateRate * 13; + case HUD_RACEFINISH_TEXT_OUT: + position1->pos.x += updateRate * 13; + position2->pos.x += updateRate * 13; drawPosition = TRUE; - if (position1->x > 200.0f) { - position1->unk1A = 3; + if (position1->pos.x > 200.0f) { + position1->raceFinishPos.status = HUD_RACEFINISH_IDLE; } break; - case 3: - position1->unk1A = 3; + case HUD_RACEFINISH_IDLE: + position1->raceFinishPos.status = HUD_RACEFINISH_IDLE; break; } if (drawPosition) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 210); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, position1); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, position2); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 210); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, position1); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, position2); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } @@ -1852,9 +1845,9 @@ UNUSED void func_800A4C34(UNUSED s32 countdown, UNUSED Object_Racer *racer, UNUS * Render the current race position of the racer. * Scales up and down when the position changes. */ -void render_race_position(Object_Racer *racer, s32 updateRate) { +void hud_race_position(Object_Racer *racer, s32 updateRate) { s32 place; - f32 prevCurrHudUnkC; + f32 prevPos; f32 scale; s32 placeIndex; Settings *settings; @@ -1868,46 +1861,51 @@ void render_race_position(Object_Racer *racer, s32 updateRate) { place = 2; } else { settings = get_settings(); - place = settings->racers[D_80126D10].starting_position; - gCurrentHud->racePostion.spriteOffset = place; + place = settings->racers[gHudController].starting_position; + gCurrentHud->entry[HUD_RACE_POSITION].spriteOffset = place; place++; } } if (gHUDNumPlayers < 2) { + // P1 and P2 have different endings to P3 onward, so offset the sprite ID based on current position. if (place < 4) { - gCurrentHud->racePositionEnd.spriteOffset = place - 1; + gCurrentHud->entry[HUD_RACE_POSITION_END].spriteOffset = place - 1; } else { - gCurrentHud->racePositionEnd.spriteOffset = 3; + gCurrentHud->entry[HUD_RACE_POSITION_END].spriteOffset = 3; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->racePositionEnd); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_POSITION_END]); } - scale = (gCurrentHud->racePostion.unk1B + 129); + scale = (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter + 129); scale *= 128.0f; scale = sins_f(scale); placeIndex = place - 1; - gCurrentHud->racePostion.scale = (gCurrentHud->racePostion.unk1C / 127.0f) + (1.0 + (0.5 * scale)); - prevCurrHudUnkC = gCurrentHud->racePostion.x; - gCurrentHud->racePostion.x -= (24.0f * gCurrentHud->racePostion.scale); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->racePostion); - gCurrentHud->racePostion.x = prevCurrHudUnkC; - if (gCurrentHud->racePostion.unk1A) { - if (gCurrentHud->racePostion.unk1B < 127 - (updateRate * 16)) { - gCurrentHud->racePostion.unk1B += (updateRate * 16); + gCurrentHud->entry[HUD_RACE_POSITION].scale = + (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.baseScale / 127.0f) + (1.0 + (0.5 * scale)); + prevPos = gCurrentHud->entry[HUD_RACE_POSITION].pos.x; + gCurrentHud->entry[HUD_RACE_POSITION].pos.x -= (24.0f * gCurrentHud->entry[HUD_RACE_POSITION].scale); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_POSITION]); + gCurrentHud->entry[HUD_RACE_POSITION].pos.x = prevPos; + if (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.active) { + if (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter < 127 - (updateRate * 16)) { + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter += (updateRate * 16); } else { - gCurrentHud->racePostion.unk1B = 127; + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter = 127; } } - if (placeIndex != gCurrentHud->racePostion.spriteOffset) { - if (gCurrentHud->racePostion.unk1A && gCurrentHud->racePostion.unk1B > 0) { - gCurrentHud->racePostion.unk1B = -gCurrentHud->racePostion.unk1B; + if (placeIndex != gCurrentHud->entry[HUD_RACE_POSITION].spriteOffset) { + if (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.active && + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter > 0) { + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter = + -gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter; } else { - gCurrentHud->racePostion.unk1B = -127; - gCurrentHud->racePostion.unk1A = 1; + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter = -127; + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.active = TRUE; } } - gCurrentHud->racePostion.spriteOffset = placeIndex; - if (gCurrentHud->racePostion.unk1A && gCurrentHud->racePostion.unk1B == 127) { - gCurrentHud->racePostion.unk1A = 0; + gCurrentHud->entry[HUD_RACE_POSITION].spriteOffset = placeIndex; + if (gCurrentHud->entry[HUD_RACE_POSITION].racePosition.active && + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.scaleCounter == 127) { + gCurrentHud->entry[HUD_RACE_POSITION].racePosition.active = FALSE; } } @@ -1916,175 +1914,189 @@ void render_race_position(Object_Racer *racer, s32 updateRate) { * Also displays the "Lap 2" and "Final Lap" messages when the line is crossed. * In multiplayer, shows a cut down display, if the display setting is set to show laps. */ -void render_lap_count(Object_Racer *racer, s32 updateRate) { +void hud_lap_count(Object_Racer *racer, s32 updateRate) { if (racer->raceFinished == FALSE && (gHUDNumPlayers <= ONE_PLAYER || racer->lap <= 0 || racer->lap_times[racer->lap] >= 180) && (gHUDNumPlayers <= ONE_PLAYER || D_800E2794[gHUDNumPlayers][racer->playerIndex] == 3)) { if (gHudLevelHeader->laps == (0, racer->countLap + 1) && gHUDNumPlayers < THREE_PLAYERS) { - gCurrentHud->lapCountFlag.unk1A += updateRate; - if (gCurrentHud->lapCountFlag.unk1A > 6) { - gCurrentHud->lapCountFlag.spriteOffset++; - gCurrentHud->lapCountFlag.unk1A -= 6; - if (gCurrentHud->lapCountFlag.spriteOffset > 4) { - gCurrentHud->lapCountFlag.spriteOffset = 0; + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].lapCountFlag.visualCounter += updateRate; + if (gCurrentHud->entry[HUD_LAP_COUNT_FLAG].lapCountFlag.visualCounter > 6) { + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].spriteOffset++; + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].lapCountFlag.visualCounter -= 6; + if (gCurrentHud->entry[HUD_LAP_COUNT_FLAG].spriteOffset > 4) { + gCurrentHud->entry[HUD_LAP_COUNT_FLAG].spriteOffset = 0; } } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapCountFlag); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_COUNT_FLAG]); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapCountLabel); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_COUNT_LABEL]); if (racer->countLap >= gHudLevelHeader->laps - 1) { - gCurrentHud->lapCountCurrent.spriteOffset = gHudLevelHeader->laps; + gCurrentHud->entry[HUD_LAP_COUNT_CURRENT].spriteOffset = gHudLevelHeader->laps; } else { - gCurrentHud->lapCountCurrent.spriteOffset = racer->countLap + 1; + gCurrentHud->entry[HUD_LAP_COUNT_CURRENT].spriteOffset = racer->countLap + 1; } - gCurrentHud->lapCountTotal.spriteOffset = gHudLevelHeader->laps; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapCountCurrent); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapCountSeperator); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapCountTotal); + gCurrentHud->entry[HUD_LAP_COUNT_TOTAL].spriteOffset = gHudLevelHeader->laps; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_COUNT_CURRENT]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_COUNT_SEPERATOR]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_COUNT_TOTAL]); } if (gHUDNumPlayers == TWO_PLAYERS) { sprite_opaque(TRUE); } if (is_game_paused() == FALSE) { - if (racer->lap_times[racer->lap] < 30 && gCurrentHud->lapTextLap.unk1A == 0 && racer->raceFinished == FALSE) { - if ((racer->lap == 1) && gHudLevelHeader->laps >= 3) { - gCurrentHud->lapTextLap.unk1A = 2; - gCurrentHud->lapTextLap.unk1B = 1; - gCurrentHud->lapTextLap.unk1D = 0; + if (racer->lap_times[racer->lap] < 30 && gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status == LAPTEXT_IDLE && + racer->raceFinished == FALSE) { + if (racer->lap == 1 && gHudLevelHeader->laps >= 3) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status = LAPTEXT_UNK2; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction = LAPTEXT_OUT; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed = FALSE; sound_play(SOUND_WHOOSH1, NULL); switch (gHUDNumPlayers) { case ONE_PLAYER: - gCurrentHud->lapTextLap.unk1C = -21; - gCurrentHud->lapTextTwo.unk1C = 32; - gCurrentHud->lapTextLap.x = -200.0f; - gCurrentHud->lapTextTwo.x = 211.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = -21; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos = 32; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = -200.0f; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x = 211.0f; break; case TWO_PLAYERS: - gCurrentHud->lapTextLap.unk1C = -16; - gCurrentHud->lapTextTwo.unk1C = 27; - gCurrentHud->lapTextLap.x = -200.0f; - gCurrentHud->lapTextTwo.x = 211.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = -16; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos = 27; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = -200.0f; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x = 211.0f; break; default: if (racer->playerIndex != PLAYER_ONE && racer->playerIndex != PLAYER_THREE) { - gCurrentHud->lapTextLap.unk1C = 60; - gCurrentHud->lapTextTwo.unk1C = 91; - gCurrentHud->lapTextLap.x = -70.0f; - gCurrentHud->lapTextTwo.x = 221.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = 60; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos = 91; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = -70.0f; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x = 221.0f; } else { - gCurrentHud->lapTextLap.unk1C = -90; - gCurrentHud->lapTextTwo.unk1C = -59; - gCurrentHud->lapTextLap.x = -220.0f; - gCurrentHud->lapTextTwo.x = 71.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = -90; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos = -59; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = -220.0f; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x = 71.0f; } break; } } else if (gHudLevelHeader->laps == (0, racer->lap + 1) && racer->lap != 0) { - gCurrentHud->lapTextLap.unk1A = 3; - gCurrentHud->lapTextLap.unk1B = -1; - gCurrentHud->lapTextLap.unk1D = 0; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status = LAPTEXT_UNK3; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction = LAPTEXT_IN; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed = FALSE; sound_play(SOUND_WHOOSH1, NULL); switch (gHUDNumPlayers) { case ONE_PLAYER: - gCurrentHud->lapTextLap.unk1C = 51; - gCurrentHud->lapTextFinal.unk1C = -41; - gCurrentHud->lapTextLap.x = 210.0f; - gCurrentHud->lapTextFinal.x = -200.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = 51; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos = -41; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = 210.0f; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x = -200.0f; break; case TWO_PLAYERS: - gCurrentHud->lapTextLap.unk1C = 41; - gCurrentHud->lapTextFinal.unk1C = -31; - gCurrentHud->lapTextLap.x = 210.0f; - gCurrentHud->lapTextFinal.x = -200.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = 41; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos = -31; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = 210.0f; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x = -200.0f; break; default: if (racer->playerIndex != PLAYER_ONE && racer->playerIndex != PLAYER_THREE) { - gCurrentHud->lapTextLap.unk1C = 100; - gCurrentHud->lapTextFinal.unk1C = 50; - gCurrentHud->lapTextLap.x = 100.0f; - gCurrentHud->lapTextFinal.x = -50.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = 100; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos = 50; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = 100.0f; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x = -50.0f; } else { - gCurrentHud->lapTextLap.unk1C = -50; - gCurrentHud->lapTextFinal.unk1C = -100; - gCurrentHud->lapTextLap.x = 50.0f; - gCurrentHud->lapTextFinal.x = -200.0f; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos = -50; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos = -100; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = 50.0f; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x = -200.0f; } break; } } } - if (gCurrentHud->lapTextLap.unk1A != 0) { - if (gCurrentHud->lapTextLap.unk1A == 2) { - if (gCurrentHud->lapTextLap.unk1B == 1) { - if (gCurrentHud->lapTextLap.x < gCurrentHud->lapTextLap.unk1C - (updateRate * 13)) { - gCurrentHud->lapTextLap.x = gCurrentHud->lapTextLap.x + (updateRate * 13); + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status != LAPTEXT_IDLE) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status == LAPTEXT_UNK2) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction == LAPTEXT_OUT) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x < + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos - (updateRate * 13)) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x += updateRate * 13; } else { - gCurrentHud->lapTextLap.x = gCurrentHud->lapTextLap.unk1C; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos; } - if (gCurrentHud->lapTextTwo.x > gCurrentHud->lapTextTwo.unk1C + (updateRate * 13)) { - gCurrentHud->lapTextTwo.x = gCurrentHud->lapTextTwo.x - (updateRate * 13); + if (gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x > + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos + (updateRate * 13)) { + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x -= updateRate * 13; } else { - gCurrentHud->lapTextTwo.x = gCurrentHud->lapTextTwo.unk1C; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x = + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos; } if (racer->lap_times[racer->lap] >= 60) { - gCurrentHud->lapTextLap.unk1B = -1; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction = LAPTEXT_IN; sound_play(SOUND_WHOOSH1, NULL); } - if (gCurrentHud->lapTextLap.x == ((0, gCurrentHud))->lapTextLap.unk1C && - gCurrentHud->lapTextTwo.x == ((0, gCurrentHud))->lapTextTwo.unk1C && - gCurrentHud->lapTextLap.unk1D == 0) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x == + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos && + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x == + gCurrentHud->entry[HUD_LAP_TEXT_TWO].lapText.targetPos && + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed == FALSE) { if (gHUDVoiceSoundMask == NULL) { sound_play(SOUND_VOICE_TT_LAP2, &gHUDVoiceSoundMask); } - gCurrentHud->lapTextLap.unk1D = 1; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed = TRUE; } - } else if (gCurrentHud->lapTextLap.unk1B == -1) { - gCurrentHud->lapTextLap.x -= updateRate * 13; - gCurrentHud->lapTextTwo.x += updateRate * 13; - if (gCurrentHud->lapTextLap.x < -200.0f) { - gCurrentHud->lapTextLap.unk1A = 0; + } else if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction == LAPTEXT_IN) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x -= updateRate * 13; + gCurrentHud->entry[HUD_LAP_TEXT_TWO].pos.x += updateRate * 13; + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x < -200.0f) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status = LAPTEXT_IDLE; } } - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapTextTwo); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapTextLap); // lap - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - } else if (gCurrentHud->lapTextLap.unk1A == 3) { - if (gCurrentHud->lapTextLap.unk1B == -1) { - if (gCurrentHud->lapTextLap.x > gCurrentHud->lapTextLap.unk1C + (updateRate * 13)) { - gCurrentHud->lapTextLap.x = gCurrentHud->lapTextLap.x - (updateRate * 13); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_TEXT_TWO]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, + &gCurrentHud->entry[HUD_LAP_TEXT_LAP]); // lap + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); + } else if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status == LAPTEXT_UNK3) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction == LAPTEXT_IN) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x > + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos + (updateRate * 13)) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x -= updateRate * 13; } else { - gCurrentHud->lapTextLap.x = gCurrentHud->lapTextLap.unk1C; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x = + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos; } - if (gCurrentHud->lapTextFinal.x < gCurrentHud->lapTextFinal.unk1C - (updateRate * 13)) { - gCurrentHud->lapTextFinal.x += (updateRate * 13); + if (gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x < + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos - (updateRate * 13)) { + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x += updateRate * 13; } else { - gCurrentHud->lapTextFinal.x = gCurrentHud->lapTextFinal.unk1C; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x = + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos; } if (racer->lap_times[racer->lap] >= 60) { - gCurrentHud->lapTextLap.unk1B = 1; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction = LAPTEXT_OUT; sound_play(SOUND_WHOOSH1, NULL); } - if (gCurrentHud->lapTextLap.x == ((0, gCurrentHud))->lapTextLap.unk1C && - gCurrentHud->lapTextFinal.x == ((0, gCurrentHud))->lapTextFinal.unk1C && - gCurrentHud->lapTextLap.unk1D == 0) { + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x == + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.targetPos && + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x == + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].lapText.targetPos && + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed == FALSE) { if (gHUDVoiceSoundMask == NULL) { sound_play(SOUND_VOICE_TT_FINAL_LAP, &gHUDVoiceSoundMask); } - gCurrentHud->lapTextLap.unk1D = 1; + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.soundPlayed = TRUE; } - } else if (gCurrentHud->lapTextLap.unk1B == 1) { - gCurrentHud->lapTextLap.x = gCurrentHud->lapTextLap.x + (updateRate * 13); - gCurrentHud->lapTextFinal.x -= updateRate * 13; - if (gCurrentHud->lapTextLap.x > 200.0f) { - gCurrentHud->lapTextLap.unk1A = 0; + } else if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.direction == LAPTEXT_OUT) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x += updateRate * 13; + gCurrentHud->entry[HUD_LAP_TEXT_FINAL].pos.x -= updateRate * 13; + if (gCurrentHud->entry[HUD_LAP_TEXT_LAP].pos.x > 200.0f) { + gCurrentHud->entry[HUD_LAP_TEXT_LAP].lapText.status = LAPTEXT_IDLE; } } - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapTextFinal); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->lapTextLap); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_TEXT_FINAL]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_LAP_TEXT_LAP]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } } @@ -2095,14 +2107,16 @@ void render_lap_count(Object_Racer *racer, s32 updateRate) { * Players going the wrong way will be nagged by T.T to turn around. * This function plays the audio, and makes the text fly in. */ -void render_wrong_way_text(Object_Racer *obj, s32 updateRate) { +void hud_wrong_way(Object_Racer *obj, s32 updateRate) { f32 textMoveSpeed; f32 textPosTarget; if (gHUDNumPlayers == TWO_PLAYERS) { sprite_opaque(TRUE); } - if (obj->unk1FC > 120 && (gHUDNumPlayers || gCurrentHud->wrongWay1.unk1C == gCurrentHud->wrongWay1.x) && + if (obj->wrongWayCounter > 120 && + (gHUDNumPlayers || + gCurrentHud->entry[HUD_WRONGWAY_1].pos.x == gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos) && !is_game_paused()) { if ((gWrongWayNagPrefix || gWrongWayNagTimer == 0) && gHUDVoiceSoundMask == NULL) { // 20% chance that T.T decides not to precede his nagging with "No no no!" @@ -2120,59 +2134,59 @@ void render_wrong_way_text(Object_Racer *obj, s32 updateRate) { gWrongWayNagTimer = 0; } } - if (gCurrentHud->wrongWay1.unk1A) { - if (gCurrentHud->wrongWay1.unk1A == 1) { - if (gCurrentHud->wrongWay1.unk1B == 1) { + if (gCurrentHud->entry[HUD_WRONGWAY_1].lapText.status != WRONGWAY_HIDE) { + if (gCurrentHud->entry[HUD_WRONGWAY_1].lapText.status == WRONGWAY_SHOW) { + if (gCurrentHud->entry[HUD_WRONGWAY_1].lapText.direction == WRONGWAY_IN) { textMoveSpeed = updateRate * 13; - gCurrentHud->wrongWay1.x += textMoveSpeed; - textPosTarget = gCurrentHud->wrongWay1.unk1C; - if (gCurrentHud->wrongWay1.x > textPosTarget) { - gCurrentHud->wrongWay1.x = textPosTarget; + gCurrentHud->entry[HUD_WRONGWAY_1].pos.x += textMoveSpeed; + textPosTarget = gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos; + if (gCurrentHud->entry[HUD_WRONGWAY_1].pos.x > textPosTarget) { + gCurrentHud->entry[HUD_WRONGWAY_1].pos.x = textPosTarget; } - gCurrentHud->wrongWay2.x -= textMoveSpeed; - textPosTarget = gCurrentHud->wrongWay2.unk1C; - if (gCurrentHud->wrongWay2.x < textPosTarget) { - gCurrentHud->wrongWay2.x = textPosTarget; + gCurrentHud->entry[HUD_WRONGWAY_2].pos.x -= textMoveSpeed; + textPosTarget = gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos; + if (gCurrentHud->entry[HUD_WRONGWAY_2].pos.x < textPosTarget) { + gCurrentHud->entry[HUD_WRONGWAY_2].pos.x = textPosTarget; } - if (obj->unk1FC <= 90) { - gCurrentHud->wrongWay1.unk1B = -1; + if (obj->wrongWayCounter <= 90) { + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.direction = WRONGWAY_OUT; sound_play(SOUND_WHOOSH1, NULL); } - } else if (gCurrentHud->wrongWay1.unk1B == -1) { + } else if (gCurrentHud->entry[HUD_WRONGWAY_1].lapText.direction == WRONGWAY_OUT) { textMoveSpeed = updateRate * 13; - gCurrentHud->wrongWay1.x -= textMoveSpeed; - gCurrentHud->wrongWay2.x += textMoveSpeed; - if (gCurrentHud->wrongWay1.x < -200.0f) { - gCurrentHud->wrongWay1.unk1A = 0; + gCurrentHud->entry[HUD_WRONGWAY_1].pos.x -= textMoveSpeed; + gCurrentHud->entry[HUD_WRONGWAY_2].pos.x += textMoveSpeed; + if (gCurrentHud->entry[HUD_WRONGWAY_1].pos.x < -200.0f) { + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.status = WRONGWAY_HIDE; } } if (!is_game_paused()) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->wrongWay1); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->wrongWay2); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_WRONGWAY_1]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_WRONGWAY_2]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } - } else if (obj->unk1FC > 120) { - gCurrentHud->wrongWay1.unk1A = 1; - gCurrentHud->wrongWay1.unk1B = 1; - gCurrentHud->wrongWay1.unk1C = -31; - gCurrentHud->wrongWay2.unk1C = 52; - gCurrentHud->wrongWay1.unk1D = 0; + } else if (obj->wrongWayCounter > 120) { + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.status = WRONGWAY_SHOW; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.direction = WRONGWAY_IN; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos = -31; + gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos = 52; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.soundPlayed = FALSE; if (gHUDNumPlayers == TWO_PLAYERS) { - gCurrentHud->wrongWay1.unk1C = -21; - gCurrentHud->wrongWay2.unk1C = 42; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos = -21; + gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos = 42; } else if (gHUDNumPlayers > TWO_PLAYERS) { if (obj->playerIndex == PLAYER_ONE || obj->playerIndex == PLAYER_THREE) { - gCurrentHud->wrongWay1.unk1C = -100; - gCurrentHud->wrongWay2.unk1C = -55; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos = -100; + gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos = -55; } else { - gCurrentHud->wrongWay1.unk1C = 59; - gCurrentHud->wrongWay2.unk1C = 104; + gCurrentHud->entry[HUD_WRONGWAY_1].lapText.targetPos = 59; + gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos = 104; } } - gCurrentHud->wrongWay2.x = gCurrentHud->wrongWay2.unk1C + 200; - gCurrentHud->wrongWay1.x = gCurrentHud->wrongWay2.unk1C - 200; + gCurrentHud->entry[HUD_WRONGWAY_2].pos.x = gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos + 200; + gCurrentHud->entry[HUD_WRONGWAY_1].pos.x = gCurrentHud->entry[HUD_WRONGWAY_2].lapText.targetPos - 200; sound_play(SOUND_WHOOSH1, NULL); } sprite_opaque(FALSE); @@ -2182,7 +2196,7 @@ void render_wrong_way_text(Object_Racer *obj, s32 updateRate) { * Render race result for multiplayer races or battles after that player has finished. * Displays the finish position, and in races, will display the race time. */ -void hud_draw_finish_misc(Object_Racer *racer) { +void hud_finish_position(Object_Racer *racer) { s32 racerCount; #if VERSION == VERSION_80 static char sDidNotFinish[] = "DID NOT FINISH"; @@ -2201,28 +2215,32 @@ void hud_draw_finish_misc(Object_Racer *racer) { #define FINISH_TIME_OFFSET 0 #endif - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengeFinishPosition1); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengeFinishPosition2); - if (!(get_current_level_race_type() & RACETYPE_CHALLENGE_BATTLE) && (!is_in_two_player_adventure())) { + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1]); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2]); + if (!(get_current_level_race_type() & RACETYPE_CHALLENGE_BATTLE) && is_in_two_player_adventure() == FALSE) { get_racer_objects(&racerCount); if (gNumActivePlayers >= 2 && (is_in_two_player_adventure() == FALSE || is_postrace_viewport_active() == FALSE)) { set_text_font(FONT_COLOURFUL); if (racerCount != racer->finishPosition) { set_text_colour(255, 255, 255, 0, 255); - draw_text(&gHUDCurrDisplayList, gCurrentHud->raceTimeNumber.x - FINISH_TEXT_OFFSET, - gCurrentHud->raceTimeNumber.y, "RACE", ALIGN_TOP_LEFT); - render_timer(gCurrentHud->raceTimeNumber.x + FINISH_TIME_OFFSET, gCurrentHud->raceTimeNumber.y, - gCurrentHud->raceTimeNumber.unk1A, gCurrentHud->raceTimeNumber.unk1B, - gCurrentHud->raceTimeNumber.unk1C, 1); - draw_text(&gHUDCurrDisplayList, gCurrentHud->lapTimeText.x - FINISH_TEXT_OFFSET, - gCurrentHud->lapTimeText.y, "LAP", ALIGN_TOP_LEFT); - render_timer(gCurrentHud->lapTimeText.x + FINISH_TIME_OFFSET, gCurrentHud->lapTimeText.y, - gCurrentHud->lapTimeText.unk1A, gCurrentHud->lapTimeText.unk1B, - gCurrentHud->lapTimeText.unk1C, 1); + draw_text(&gHudDL, gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x - FINISH_TEXT_OFFSET, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y, "RACE", ALIGN_TOP_LEFT); + hud_timer_render(gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x + FINISH_TIME_OFFSET, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.minutes, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.seconds, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.hundredths, 1); + draw_text(&gHudDL, gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x - FINISH_TEXT_OFFSET, + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y, "LAP", ALIGN_TOP_LEFT); + hud_timer_render(gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x + FINISH_TIME_OFFSET, + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y, + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.minutes, + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.seconds, + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.hundredths, 1); } else { - draw_text(&gHUDCurrDisplayList, gCurrentHud->raceTimeNumber.x - 35, gCurrentHud->raceTimeNumber.y, - DID_NOT_FINISH, ALIGN_TOP_LEFT); + draw_text(&gHudDL, gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x - 35, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y, DID_NOT_FINISH, ALIGN_TOP_LEFT); } } } @@ -2230,7 +2248,7 @@ void hud_draw_finish_misc(Object_Racer *racer) { #ifdef NON_MATCHING // hud_render_finish -void func_800A6254(Object_Racer *racer, s32 updateRate) { +void hud_race_finish_multiplayer(Object_Racer *racer, s32 updateRate) { UNUSED s32 *var_a0; UNUSED s32 var_t0; s32 var_a2; @@ -2251,20 +2269,20 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { raceType = get_current_level_race_type(); if (is_in_two_player_adventure() && is_postrace_viewport_active() && D_80127189 == 0) { if (func_8000E184()) { - gCurrentHud->challengeFinishPosition1.y -= 108.0f; - gCurrentHud->challengeFinishPosition2.y -= 108.0f; - gCurrentHud->raceTimeNumber.y -= 108.0f; - gCurrentHud->lapTimeText.y -= 108.0f; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.y -= 108.0f; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].pos.y -= 108.0f; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y -= 108.0f; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y -= 108.0f; } - gCurrentHud->challengeFinishPosition1.y += 35.0f; - gCurrentHud->challengeFinishPosition2.y += 35.0f; - gCurrentHud->raceTimeNumber.y += 35.0f; - gCurrentHud->lapTimeText.y += 35.0f; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.y += 35.0f; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].pos.y += 35.0f; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y += 35.0f; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y += 35.0f; gHudAudioData[0].playerIndex = racer->playerIndex; D_80127189 = 1; } - switch (gCurrentHud->challengeFinishPosition1.unk1A) { + switch (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status) { case 0: if (!(raceType & RACETYPE_CHALLENGE_BATTLE)) { gHudAudioData[0].volume = 127; @@ -2275,34 +2293,34 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { switch (gHUDNumPlayers) { case 0: case 1: - gCurrentHud->challengeFinishPosition1.unk1D = -20; - gCurrentHud->raceTimeNumber.unk1D = -15; - gCurrentHud->lapTimeText.unk1D = -15; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos = -20; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D = -15; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D = -15; break; default: if (racer->playerIndex == PLAYER_ONE || racer->playerIndex == PLAYER_THREE) { - gCurrentHud->challengeFinishPosition1.unk1D = -90; - gCurrentHud->raceTimeNumber.unk1D = -85; - gCurrentHud->lapTimeText.unk1D = -85; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos = -90; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D = -85; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D = -85; } else { - gCurrentHud->challengeFinishPosition1.unk1D = 55; - gCurrentHud->raceTimeNumber.unk1D = 60; - gCurrentHud->lapTimeText.unk1D = 60; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos = 55; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D = 60; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D = 60; } break; } if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengeFinishPosition1.unk1D -= 4; - gCurrentHud->raceTimeNumber.unk1D -= 4; - gCurrentHud->lapTimeText.unk1D -= 4; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos -= 4; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D -= 4; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D -= 4; } if (racer->finishPosition < 4) { - gCurrentHud->challengeFinishPosition2.spriteOffset = racer->finishPosition - 1; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].spriteOffset = racer->finishPosition - 1; } else { - gCurrentHud->challengeFinishPosition2.spriteOffset = 3; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].spriteOffset = 3; } - gCurrentHud->challengeFinishPosition1.spriteOffset = racer->finishPosition - 1; - gCurrentHud->challengeFinishPosition1.unk1A = 1; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].spriteOffset = racer->finishPosition - 1; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 1; switch (gNumActivePlayers) { case 2: var_f12 = 360.0f; @@ -2326,10 +2344,10 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { var_f2 -= 9.0f; } } - gCurrentHud->raceTimeNumber.x = var_f12; - gCurrentHud->raceTimeNumber.y = var_f0; - gCurrentHud->lapTimeText.x = var_f14; - gCurrentHud->lapTimeText.y = var_f2; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x = var_f12; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y = var_f0; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x = var_f14; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y = var_f2; break; case 3: case 4: @@ -2359,10 +2377,10 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { var_f2 -= 9.0f; } } - gCurrentHud->raceTimeNumber.x = var_f12; - gCurrentHud->raceTimeNumber.y = var_f0; - gCurrentHud->lapTimeText.x = var_f14; - gCurrentHud->lapTimeText.y = var_f2; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x = var_f12; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y = var_f0; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x = var_f14; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.y = var_f2; break; } if (gNumActivePlayers != 1) { @@ -2376,45 +2394,51 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { } } get_timestamp_from_frames(fastestLapTime, &minutes, &seconds, &hundredths); - gCurrentHud->lapTimeText.unk1A = minutes; - gCurrentHud->lapTimeText.unk1B = seconds; - gCurrentHud->lapTimeText.unk1C = hundredths; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.minutes = minutes; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.seconds = seconds; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.hundredths = hundredths; get_timestamp_from_frames(totalRaceTime, &minutes, &seconds, &hundredths); - gCurrentHud->raceTimeNumber.unk1A = minutes; - gCurrentHud->raceTimeNumber.unk1B = seconds; - gCurrentHud->raceTimeNumber.unk1C = hundredths; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.minutes = minutes; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.seconds = seconds; + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.hundredths = hundredths; } break; case 1: var_a2 = TRUE; - if (gCurrentHud->challengeFinishPosition1.x < - (gCurrentHud->challengeFinishPosition1.unk1D - (updateRate * 13)) + 160) { + if (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.x < + (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos - (updateRate * 13)) + 160) { var_v1 = (updateRate * 13); var_a2 = FALSE; } else { - var_v1 = (gCurrentHud->challengeFinishPosition1.unk1D + 160) - gCurrentHud->challengeFinishPosition1.x; + var_v1 = (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.targetPos + 160) - + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.x; } - gCurrentHud->challengeFinishPosition1.x += var_v1; - gCurrentHud->challengeFinishPosition2.x += var_v1; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.x += var_v1; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].pos.x += var_v1; if (gNumActivePlayers != 1) { - if ((gCurrentHud->raceTimeNumber.unk1D + (updateRate * 13) + 160) < gCurrentHud->raceTimeNumber.x) { + if ((gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D + (updateRate * 13) + 160) < + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x) { var_a2 = FALSE; } else { - var_v1 = gCurrentHud->raceTimeNumber.x - (gCurrentHud->raceTimeNumber.unk1D + 160); + var_v1 = gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x - + (gCurrentHud->entry[HUD_RACE_TIME_NUMBER].timer.unk1D + 160); } - gCurrentHud->raceTimeNumber.x -= var_v1; - if (gCurrentHud->lapTimeText.x < (gCurrentHud->lapTimeText.unk1D - var_v1) + 160) { + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x -= var_v1; + if (gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x < + (gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D - var_v1) + 160) { var_a2 = FALSE; } else { - var_v1 = (gCurrentHud->lapTimeText.unk1D + 160) - gCurrentHud->lapTimeText.x; + var_v1 = (gCurrentHud->entry[HUD_LAP_TIME_TEXT].timer.unk1D + 160) - + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x; } - gCurrentHud->lapTimeText.x += var_v1; + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x += var_v1; } temp_v0_4 = 2; // fakematch? if (var_a2) { - gCurrentHud->challengeFinishPosition1.unk1A = temp_v0_4; // fakematch? Why not just set directly to 2? - gCurrentHud->challengeFinishPosition1.unk1B = -120; - gCurrentHud->challengeFinishPosition1.unk1C = 0; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = + temp_v0_4; // fakematch? Why not just set directly to 2? + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTimer = -120; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTicks = 0; if (gHUDVoiceSoundMask == NULL) { if (raceType == RACETYPE_CHALLENGE_BATTLE) { switch (racer->finishPosition) { @@ -2430,65 +2454,65 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { break; } } else if (timetrial_ghost_staff() == NULL) { - play_time_trial_end_message(&racer->playerIndex); + hud_time_trial_message(&racer->playerIndex); } } } - hud_draw_finish_misc(racer); + hud_finish_position(racer); break; case 2: - gCurrentHud->challengeFinishPosition1.unk1B += updateRate; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTimer += updateRate; - if (gCurrentHud->challengeFinishPosition1.unk1B >= 120) { - gCurrentHud->challengeFinishPosition1.unk1B = -120; - gCurrentHud->challengeFinishPosition1.unk1C++; + if (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTimer >= 120) { + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTimer = -120; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTicks++; } - if (gCurrentHud->challengeFinishPosition1.unk1C == 2) { + if (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTicks == 2) { if (gNumActivePlayers == 1 || is_in_two_player_adventure()) { - gCurrentHud->challengeFinishPosition1.unk1A = 3; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 3; sound_play(SOUND_WHOOSH1, NULL); } else { - gCurrentHud->challengeFinishPosition1.unk1A = 4; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 4; } } - hud_draw_finish_misc(racer); + hud_finish_position(racer); break; case 3: if (raceType == RACETYPE_CHALLENGE_BATTLE) { - gCurrentHud->challengeFinishPosition1.unk1A = 4; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 4; } else { - gCurrentHud->challengeFinishPosition1.x -= (updateRate * 13); - gCurrentHud->challengeFinishPosition2.x -= (updateRate * 13); - if (gCurrentHud->challengeFinishPosition1.x < -200.0f) { - gCurrentHud->challengeFinishPosition1.unk1A = 4; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.x -= (updateRate * 13); + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_2].pos.x -= (updateRate * 13); + if (gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].pos.x < -200.0f) { + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 4; } - gCurrentHud->raceTimeNumber.x += (updateRate * 13); - gCurrentHud->lapTimeText.x += (updateRate * 13); + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x += (updateRate * 13); + gCurrentHud->entry[HUD_LAP_TIME_TEXT].pos.x += (updateRate * 13); } - hud_draw_finish_misc(racer); + hud_finish_position(racer); break; case 4: if (racer->playerIndex == gHudAudioData[0].playerIndex) { gHudAudioData[0].volumeRamp = -1; } - gCurrentHud->challengeFinishPosition1.unk1A = 5; - gCurrentHud->challengeFinishPosition1.unk1B = 0; - hud_draw_finish_misc(racer); + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.status = 5; + gCurrentHud->entry[HUD_CHALLENGE_FINISH_POS_1].raceFinishPos.textOutTimer = 0; + hud_finish_position(racer); break; default: - hud_draw_finish_misc(racer); + hud_finish_position(racer); break; } } #else -#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/func_800A6254.s") +#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/hud_race_finish_multiplayer.s") #endif /** * Play the normal race finish message, unless you beat your time record, * then T.T will say "Race Record" instead. */ -void play_time_trial_end_message(s16 *playerID) { +void hud_time_trial_message(s16 *playerID) { Settings *settings = get_settings(); if (playerID != NULL) { @@ -2507,82 +2531,87 @@ void play_time_trial_end_message(s16 *playerID) { /** * Render the finishing overlay after a time trial. + * Has measures for multiplayer, depsite time trial being a single player exclusive mode. */ -void render_time_trial_finish(Object_Racer *racer, s32 updateRate) { - s32 temp; +void hud_time_trial_finish(Object_Racer *racer, s32 updateRate) { + UNUSED s32 temp; - switch (gCurrentHud->raceEndFinish.unk1A) { - case 0: + switch (gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status) { + case TIMETRIAL_FINISH_INIT: gHudAudioData[0].volume = 127; gHudAudioData[0].volumeRamp = 0; gHudAudioData[0].playerIndex = racer->playerIndex; sound_play(SOUND_WHOOSH1, NULL); if (gHUDNumPlayers == 0 || gHUDNumPlayers == 1) { - gCurrentHud->raceEndFinish.x = -200.0f; - gCurrentHud->raceEndFinish.unk1D = 0; + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x = -200.0f; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = 0; } else { if (racer->playerIndex == PLAYER_ONE || racer->playerIndex == PLAYER_THREE) { - gCurrentHud->raceEndFinish.unk1D = -80; - gCurrentHud->raceEndFinish.x = -200.0f; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = -80; + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x = -200.0f; } else { - gCurrentHud->raceEndFinish.unk1D = 80; - gCurrentHud->raceEndFinish.x = -40.0f; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = 80; + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x = -40.0f; } } - gCurrentHud->raceEndFinish.unk1A = 1; - return; - case 1: - temp = (updateRate * 13); - if (gCurrentHud->raceEndFinish.x < gCurrentHud->raceEndFinish.unk1D - temp) { - gCurrentHud->raceEndFinish.x += temp; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status = TIMETRIAL_FINISH_IN; + break; + case TIMETRIAL_FINISH_IN: + temp = (updateRate * 13); // Fakematch + if (gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x < + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos - (updateRate * 13)) { + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x += updateRate * 13; } else { - gCurrentHud->raceEndFinish.x = gCurrentHud->raceEndFinish.unk1D; - gCurrentHud->raceEndFinish.unk1A = 2; - gCurrentHud->raceEndFinish.unk1B = -120; + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x = + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status = TIMETRIAL_FINISH_SHOW; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.fadeTimer = -120; if (gHUDVoiceSoundMask == NULL && gHudTimeTrialGhost == FALSE) { - play_time_trial_end_message(&racer->playerIndex); + hud_time_trial_message(&racer->playerIndex); } } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceEndFinish); - return; - case 2: - gCurrentHud->raceEndFinish.unk1B += updateRate; - if (gCurrentHud->raceEndFinish.unk1B >= 120) { - gCurrentHud->raceEndFinish.unk1A = 3; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_END_FINISH]); + break; + case TIMETRIAL_FINISH_SHOW: + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.fadeTimer += updateRate; + if (gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.fadeTimer >= 120) { + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status = TIMETRIAL_FINISH_OUT; if (gHUDNumPlayers == PLAYER_ONE || gHUDNumPlayers == PLAYER_TWO) { - gCurrentHud->raceEndFinish.unk1D = 56; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = 56; } else { if (racer->playerIndex == PLAYER_ONE || racer->playerIndex == PLAYER_THREE) { - gCurrentHud->raceEndFinish.unk1D = 56; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = 56; } else { - gCurrentHud->raceEndFinish.unk1D = -40; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos = -40; } } sound_play(SOUND_WHOOSH1, NULL); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceEndFinish); - return; - case 3: - gCurrentHud->raceEndFinish.x -= updateRate * 13; - if (gCurrentHud->raceEndFinish.x < gCurrentHud->raceEndFinish.unk1D) { - gCurrentHud->raceEndFinish.unk1A = 4; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_END_FINISH]); + break; + case TIMETRIAL_FINISH_OUT: + gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x -= updateRate * 13; + if (gCurrentHud->entry[HUD_RACE_END_FINISH].pos.x < + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.targetPos) { + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status = TIMETRIAL_FINISH_IDLE; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceEndFinish); - return; - case 4: + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_END_FINISH]); + break; + case TIMETRIAL_FINISH_IDLE: gHudAudioData[0].volumeRamp = -1; - gCurrentHud->raceEndFinish.unk1A = 5; - gCurrentHud->raceEndFinish.unk1B = 0; - return; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.status = TIMETRIAL_FINISH_IDLE_2; + gCurrentHud->entry[HUD_RACE_END_FINISH].finishText.fadeTimer = 0; + break; default: - return; + break; } } /** * Render the icon, and the number of collectable balloons onscreen. + * Has a case for when in the balloon cutscene, where it will visually increase the count by one. */ -void render_balloon_count(UNUSED Object_Racer *racer) { +void hud_balloons(UNUSED Object_Racer *racer) { s32 balloonCount; s32 div; UNUSED s32 pad; @@ -2596,15 +2625,16 @@ void render_balloon_count(UNUSED Object_Racer *racer) { balloonTickTimer = 840; } if (settings->cutsceneFlags & CUTSCENE_ADVENTURE_TWO) { - gCurrentHud->balloonCountIcon.spriteID = HUD_SPRITE_BALLOON_DIAMOND; // Use the adventure two balloon sprite. + gCurrentHud->entry[HUD_BALLOON_COUNT_ICON].spriteID = + HUD_SPRITE_BALLOON_DIAMOND; // Use the adventure two balloon sprite. } if (cutscene_id() == 10 && get_balloon_cutscene_timer() < balloonTickTimer) { balloonCount = *settings->balloonsPtr - 1; } else { balloonCount = *settings->balloonsPtr; if (cutscene_id() == 10) { - if (get_balloon_cutscene_timer() < balloonTickTimer + 8 && D_80126D44 == NULL) { - sound_play(SOUND_HUD_LAP_TICK, &D_80126D44); + if (get_balloon_cutscene_timer() < balloonTickTimer + 8 && gHudBalloonSoundMask == NULL) { + sound_play(SOUND_HUD_LAP_TICK, (s32 *) &gHudBalloonSoundMask); } } } @@ -2613,22 +2643,21 @@ void render_balloon_count(UNUSED Object_Racer *racer) { } div = balloonCount / 10; if (div != 0) { - gCurrentHud->balloonCountNumber1.spriteOffset = div; - gCurrentHud->balloonCountNumber2.spriteOffset = balloonCount % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountNumber2); + gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1].spriteOffset = div; + gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_2].spriteOffset = balloonCount % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_2]); } else { - gCurrentHud->balloonCountNumber1.spriteOffset = balloonCount % 10; + gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1].spriteOffset = balloonCount % 10; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountNumber1); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_NUMBER_1]); set_viewport_tv_type(OS_TV_TYPE_NTSC); if (osTvType == OS_TV_TYPE_PAL) { sprite_opaque(TRUE); } - // gCurrentHud->balloonCountIcon.scale += 0.001f; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountIcon); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_ICON]); sprite_opaque(FALSE); set_viewport_tv_type(OS_TV_TYPE_PAL); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->balloonCountX); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_BALLOON_COUNT_X]); } /** @@ -2665,7 +2694,7 @@ void hud_sound_stop(u16 soundID, s32 playerIndex) { * Renders the icon in the bottom left of the current weapon. * The icon will spin and grow as it appears, then spins and shrinks as it disappears. */ -void render_weapon_hud(Object *obj, s32 updateRate) { +void hud_weapon(Object *obj, s32 updateRate) { Object_Racer *racer; s32 temp_a0; @@ -2673,73 +2702,79 @@ void render_weapon_hud(Object *obj, s32 updateRate) { if (racer->raceFinished == FALSE) { set_viewport_tv_type(OS_TV_TYPE_NTSC); temp_a0 = (racer->balloon_type * 3) + (racer->balloon_level); - if (gCurrentHud->weaponDisplay.unk1D != racer->balloon_level) { + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.prevLevel != racer->balloon_level) { if (racer->balloon_level == 0) { - gCurrentHud->weaponDisplay.unk1C = 120; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale = 120; } else if (gNumActivePlayers == 1) { - gCurrentHud->weaponDisplay.unk1C = 0; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale = 0; } else { - gCurrentHud->weaponDisplay.unk1C = 120; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale = 120; } - gCurrentHud->weaponDisplay.unk1D = racer->balloon_level; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.prevLevel = racer->balloon_level; } if (racer->balloon_quantity > 0) { - if (gCurrentHud->weaponDisplay.unk1B < 16 && racer->unk170 == 0) { - gCurrentHud->weaponDisplay.z_rotation = gCurrentHud->weaponDisplay.unk1B << 12; - gCurrentHud->weaponDisplay.scale = (gCurrentHud->weaponDisplay.unk1B * 0.04687) + 0.25; + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation < 16 && racer->unk170 == 0) { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].rotation.z_rotation = + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation * 0x1000; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale = + (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation * 0.04687) + 0.25; } else { - gCurrentHud->weaponDisplay.z_rotation = 0; - gCurrentHud->weaponDisplay.scale = 1.0f; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].rotation.z_rotation = 0; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale = 1.0f; } - gCurrentHud->weaponDisplay.spriteOffset = temp_a0; - gCurrentHud->weaponDisplay.unk1B += updateRate; - if (gCurrentHud->weaponDisplay.unk1B > 16) { - gCurrentHud->weaponDisplay.unk1B = 16; - gCurrentHud->weaponDisplay.unk1C += updateRate; - if (gCurrentHud->weaponDisplay.unk1C > 120) { - gCurrentHud->weaponDisplay.unk1C = 120; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].spriteOffset = temp_a0; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation += updateRate; + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation > 16) { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation = 16; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale += updateRate; + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale > 120) { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale = 120; } else if (gHUDNumPlayers == ONE_PLAYER) { - gCurrentHud->weaponDisplay.scale += - 0.18 * sins_f(((f32) gCurrentHud->weaponDisplay.unk1C * 682.6583 * 4.0)); + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale += + 0.18 * + sins_f(((f32) gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.scale * 682.6583 * 4.0)); } } if (gHUDNumPlayers > ONE_PLAYER) { - gCurrentHud->weaponDisplay.scale *= 0.75; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale *= 0.75; } - if (gCurrentHud->weaponDisplay.scale != 1.0) { + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale != 1.0) { sprite_opaque(TRUE); } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->weaponDisplay); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_WEAPON_DISPLAY]); sprite_opaque(FALSE); if (racer->balloon_quantity > 3) { - gCurrentHud->weaponQuantity.unk1A = -128; + gCurrentHud->entry[HUD_WEAPON_QUANTITY].weaponDisplay.hideTimer = -128; } if (racer->balloon_quantity < 3) { - gCurrentHud->weaponQuantity.unk1A -= updateRate; + gCurrentHud->entry[HUD_WEAPON_QUANTITY].weaponDisplay.hideTimer -= updateRate; } if (racer->balloon_quantity >= 3 || - ((((gCurrentHud->weaponQuantity.unk1A + 128) % 32) < 20) && racer->balloon_quantity != 1)) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); - gCurrentHud->weaponQuantity.spriteOffset = racer->balloon_quantity - 1; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->weaponQuantity); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + ((((gCurrentHud->entry[HUD_WEAPON_QUANTITY].weaponDisplay.hideTimer + 128) % 32) < 20) && + racer->balloon_quantity != 1)) { + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 160); + gCurrentHud->entry[HUD_WEAPON_QUANTITY].spriteOffset = racer->balloon_quantity - 1; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_WEAPON_QUANTITY]); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } else { - if (gCurrentHud->weaponDisplay.unk1B > 0) { - gCurrentHud->weaponDisplay.z_rotation = gCurrentHud->weaponDisplay.unk1B << 12; - gCurrentHud->weaponDisplay.scale = (gCurrentHud->weaponDisplay.unk1B * 0.04687) + 0.25; - gCurrentHud->weaponDisplay.unk1B -= updateRate; - gCurrentHud->weaponDisplay.spriteOffset = temp_a0; - if (gCurrentHud->weaponDisplay.unk1B < 0) { - gCurrentHud->weaponDisplay.unk1B = 0; + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation > 0) { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].rotation.z_rotation = + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation * 0x1000; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale = + (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation * 0.04687) + 0.25; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation -= updateRate; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].spriteOffset = temp_a0; + if (gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation < 0) { + gCurrentHud->entry[HUD_WEAPON_DISPLAY].weaponDisplay.rotation = 0; } if (gHUDNumPlayers != ONE_PLAYER) { - gCurrentHud->weaponDisplay.scale /= 2; + gCurrentHud->entry[HUD_WEAPON_DISPLAY].scale /= 2; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->weaponDisplay); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_WEAPON_DISPLAY]); } } - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); set_viewport_tv_type(OS_TV_TYPE_PAL); } } @@ -2747,7 +2782,7 @@ void render_weapon_hud(Object *obj, s32 updateRate) { /** * If currently using a magnet, render a reticle over the racer that's being targeted. */ -void render_magnet_reticle(Object *racerObj) { +void hud_magnet_reticle(Object *racerObj) { unk80068514_arg4 *entry; HudElement *hud; Object_Racer *racer; @@ -2755,19 +2790,18 @@ void render_magnet_reticle(Object *racerObj) { if (entry) {} // Fakematch racer = &racerObj->unk64->racer; if (racer->magnetTargetObj != NULL && get_current_viewport() == racer->playerIndex) { - hud = &gCurrentHud->magnetReticle; - hud->x = racer->magnetTargetObj->segment.trans.x_position; - hud->y = racer->magnetTargetObj->segment.trans.y_position; - hud->z = racer->magnetTargetObj->segment.trans.z_position; + hud = &gCurrentHud->entry[HUD_MAGNET_RETICLE]; + hud->pos.x = racer->magnetTargetObj->segment.trans.x_position; + hud->pos.y = racer->magnetTargetObj->segment.trans.y_position; + hud->pos.z = racer->magnetTargetObj->segment.trans.z_position; entry = gAssetHudElements->entry[hud->spriteID]; if (entry == NULL) { return; } gAssetHudElementStaleCounter[hud->spriteID] = 0; - func_80066CDC(&gHUDCurrDisplayList, &gHUDCurrMatrix); - matrix_world_origin(&gHUDCurrDisplayList, &gHUDCurrMatrix); - render_sprite_billboard(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (Object *) hud, entry, - RENDER_Z_UPDATE); + func_80066CDC(&gHudDL, &gHudMtx); + matrix_world_origin(&gHudDL, &gHudMtx); + render_sprite_billboard(&gHudDL, &gHudMtx, &gHudVtx, (Object *) hud, entry, RENDER_Z_UPDATE); } } @@ -2775,7 +2809,7 @@ void render_magnet_reticle(Object *racerObj) { * Render the lap time on the top right. * When the player begins a new lap, start flashing the previous lap time below instead. */ -void render_race_time(Object_Racer *racer, s32 updateRate) { +void hud_race_time(Object_Racer *racer, s32 updateRate) { s32 i; s32 stopwatchTimer; s32 minutes; @@ -2787,7 +2821,7 @@ void render_race_time(Object_Racer *racer, s32 updateRate) { if (!(gHUDNumPlayers != ONE_PLAYER && D_800E2794[gHUDNumPlayers][racer->playerIndex] != 1) || (gHUDNumPlayers > ONE_PLAYER && racer->lap > 0 && racer->lap_times[racer->lap] < 180)) { if (racer->raceFinished == FALSE) { - timerHideCounter = gCurrentHud->raceTimeLabel.unk1A + 127; + timerHideCounter = gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hideTimer + 127; if (racer->lap > 0 && racer->lap_times[racer->lap] < 180 && racer->lap < gHudLevelHeader->laps) { stopwatchTimer = racer->lap_times[racer->lap - 1]; countingDown = TRUE; @@ -2800,11 +2834,11 @@ void render_race_time(Object_Racer *racer, s32 updateRate) { stopwatchTimer += racer->lap_times[i]; } countingDown = stopwatchTimer == 0 || racer->raceFinished || is_game_paused(); - gCurrentHud->raceTimeLabel.unk1A = -127; + gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hideTimer = -127; timerHideCounter = 0; } if (gHUDNumPlayers == ONE_PLAYER) { - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceTimeLabel); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_RACE_TIME_LABEL]); } if (normalise_time(36000) < stopwatchTimer) { stopwatchTimer = normalise_time(36000); @@ -2816,7 +2850,7 @@ void render_race_time(Object_Racer *racer, s32 updateRate) { } else { timerHideCounter = 0; } - gCurrentHud->raceTimeLabel.unk1A = timerHideCounter - 127; + gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hideTimer = timerHideCounter - 127; if ((timerHideCounter % 30) > 20) { gHideRaceTimer = TRUE; return; @@ -2829,92 +2863,95 @@ void render_race_time(Object_Racer *racer, s32 updateRate) { } } } else { - hundredths = gCurrentHud->raceTimeLabel.unk1B + ((hundredths / 10) * 10); - gCurrentHud->raceTimeLabel.unk1B = gCurrentHud->raceTimeLabel.unk1B + 1; - if (gCurrentHud->raceTimeLabel.unk1B >= 10) { - gCurrentHud->raceTimeLabel.unk1B = 0; + // This section seems to do nothing of consequense. + hundredths = + gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hundredths + ((hundredths / 10) * 10); + gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hundredths++; + if (gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hundredths >= 10) { + gCurrentHud->entry[HUD_RACE_TIME_LABEL].raceTimeLabel.hundredths = 0; } } if (gNumActivePlayers == 1) { - render_timer(gCurrentHud->raceTimeNumber.x, gCurrentHud->raceTimeNumber.y, minutes, seconds, hundredths, - FALSE); + hud_timer_render(gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y, minutes, seconds, hundredths, FALSE); } else { - render_timer(gCurrentHud->raceTimeNumber.x, gCurrentHud->raceTimeNumber.y, minutes, seconds, hundredths, - TRUE); + hud_timer_render(gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.x, + gCurrentHud->entry[HUD_RACE_TIME_NUMBER].pos.y, minutes, seconds, hundredths, TRUE); } - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, 255); } } } /** * Render a time in minutes, seconds and hundredths of a second. + * Supports a smaller font for multiplayer. */ -void render_timer(s32 x, s32 y, s32 minutes, s32 seconds, s32 hundredths, s32 smallFont) { +void hud_timer_render(s32 x, s32 y, s32 minutes, s32 seconds, s32 hundredths, s32 smallFont) { UNUSED s32 pad; - HudElementBase entry2; - s32 unk14; - s32 unk10; - s32 unkC; - s32 unk8; - s32 var_s4; - s32 unk0; + HudElementBase entry; + s32 offset1; + s32 offset2; + s32 offset3; + s32 offsetY; + s32 numbers; + s32 seperator; - entry2.x = x; - entry2.y = y; - entry2.z_rotation = 0; - entry2.x_rotation = 0; - entry2.y_rotation = 0; - entry2.scale = 1.0f; - entry2.z = 0.0f; - if (!smallFont) { - unk14 = 11; - unk10 = 10; - unkC = 10; - unk8 = 2; - var_s4 = HUD_ASSET_9; - unk0 = HUD_ASSET_11; + entry.x = x; + entry.y = y; + entry.z_rotation = 0; + entry.x_rotation = 0; + entry.y_rotation = 0; + entry.scale = 1.0f; + entry.z = 0.0f; + if (!smallFont) { // The below offsets are applied after drawing their respective elements. + offset1 = 11; // Offset for the first number + offset2 = 10; // Offset for the second number + offset3 = 10; // Offset for the seperator + offsetY = 2; // Offset used for the seperator. + numbers = HUD_ASSET_NUMBERS; + seperator = HUD_ASSET_SEPERATOR; // : } else { - unk14 = 10; - unk10 = 8; - unkC = 7; - unk8 = 0; - var_s4 = HUD_ASSET_10; - unk0 = HUD_ASSET_12; + offset1 = 10; + offset2 = 8; + offset3 = 7; + offsetY = 0; // Small font is the same height + numbers = HUD_ASSET_NUMBERS_SMALL; + seperator = HUD_ASSET_SEPERATOR_SMALL; // : } - entry2.spriteID = var_s4; - entry2.spriteOffset = minutes / 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.x += unk14; - entry2.spriteOffset = minutes % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.spriteOffset = 0; - entry2.x += unk10; - entry2.y += unk8; - entry2.spriteID = unk0; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.spriteID = var_s4; - entry2.x += unkC; - entry2.y -= unk8; - entry2.spriteOffset = seconds / 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.x += unk14; - entry2.spriteOffset = seconds % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.spriteOffset = 0; - entry2.x += unk10; - entry2.y += unk8; - entry2.spriteID = unk0; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.spriteID = var_s4; - entry2.x += unkC; - entry2.y -= unk8; - entry2.spriteOffset = hundredths / 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); - entry2.x += unk14; - entry2.spriteOffset = hundredths % 10; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) &entry2); + entry.spriteID = numbers; + entry.spriteOffset = minutes / 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.x += offset1; + entry.spriteOffset = minutes % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.spriteOffset = 0; + entry.x += offset2; + entry.y += offsetY; + entry.spriteID = seperator; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.spriteID = numbers; + entry.x += offset3; + entry.y -= offsetY; + entry.spriteOffset = seconds / 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.x += offset1; + entry.spriteOffset = seconds % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.spriteOffset = 0; + entry.x += offset2; + entry.y += offsetY; + entry.spriteID = seperator; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.spriteID = numbers; + entry.x += offset3; + entry.y -= offsetY; + entry.spriteOffset = hundredths / 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); + entry.x += offset1; + entry.spriteOffset = hundredths % 10; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, (HudElement *) &entry); } /** @@ -2937,15 +2974,15 @@ void minimap_init(LevelModel *model) { * For 3 players, it's for toggling between the minimap and a spectator cam in viewport 4. * For 4 players, it's for toggling the minimap. */ -s8 get_hud_setting(void) { +s8 hud_setting(void) { return gHudToggleSettings[gHUDNumPlayers]; } /** - * Renders the minimap in all modes as well as a few other random pieces of HUD. - * This function also handles the HUD in 3 or 4 player, instead of the normal dedicated functions it has. + * Renders HUD elements concerning all players. + * This includes the minimap and score counters for challenge modes. */ -void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate) { +void hud_render_general(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate) { Object_Racer *curRacerObj; LevelModel *lvlMdl; Sprite *minimap; @@ -2961,7 +2998,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u u8 sp113; s32 mapOpacity; s32 opacity; - UNUSED s32 pad[2]; + UNUSED s32 pad0[2]; s32 temp_s1_2; s32 var_a0_5; s32 spF4; @@ -2970,7 +3007,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u s32 temp_s1_3; s32 spE4; s32 spE0; - UNUSED s32 pad9; + UNUSED s32 pad1; Object *temp_v0_8; s32 tempVar2; s32 sp144; @@ -3022,13 +3059,13 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gHudLevelHeader = get_current_level_header(); objectGroup = get_racer_objects_by_port(&objectCount); - gHUDCurrDisplayList = *dList; - gHUDCurrMatrix = *mtx; - gHUDCurrVertex = *vtx; + gHudDL = *dList; + gHudMtx = *mtx; + gHudVtx = *vtx; if (gHudLevelHeader->race_type == RACETYPE_CHALLENGE_EGGS) { if (gNumActivePlayers == 2 && gHudToggleSettings[gHUDNumPlayers] == 0) { hud_draw_eggs(NULL, updateRate); - reset_render_settings(&gHUDCurrDisplayList); + reset_render_settings(&gHudDL); } else { // Render player 4's egg challenge portrait if they are AI controlled. if (gNumActivePlayers == 3) { @@ -3039,26 +3076,26 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } } if (tempVar4 != NULL) { - position2 = gCurrentHud->challengePortrait.x; - temp_s1 = gCurrentHud->challengePortrait.y; - spF4 = gCurrentHud->eggChallengeIcon.x; - spF0 = gCurrentHud->eggChallengeIcon.y; - gCurrentHud->challengePortrait.x = 225.0f; - gCurrentHud->eggChallengeIcon.x = 221.0f; - gCurrentHud->eggChallengeIcon.y = 197.0f; - gCurrentHud->challengePortrait.y = 165.0f; + position2 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + temp_s1 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; + spF4 = gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x; + spF0 = gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = 225.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x = 221.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y = 197.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = 165.0f; if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.x -= 4.0f; - gCurrentHud->eggChallengeIcon.x -= 4.0f; - gCurrentHud->challengePortrait.y *= 1.1; - gCurrentHud->eggChallengeIcon.y *= 1.1; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x -= 4.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x -= 4.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y *= 1.1; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y *= 1.1; } hud_eggs_portrait(tempVar4, updateRate); gHudColour = COLOUR_RGBA32(255, 255, 255, 254); - gCurrentHud->challengePortrait.x = position2; - gCurrentHud->challengePortrait.y = temp_s1; - gCurrentHud->eggChallengeIcon.x = spF4; - gCurrentHud->eggChallengeIcon.y = spF0; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = position2; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = temp_s1; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x = spF4; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.y = spF0; } } } @@ -3067,10 +3104,10 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u if (gNumActivePlayers == 2 && gHudToggleSettings[gHUDNumPlayers] == 0) { sprite_anim_off(TRUE); sprite_opaque(FALSE); - set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); + set_ortho_matrix_view(&gHudDL, &gHudMtx); func_800A1E48(0, updateRate); sprite_anim_off(FALSE); - reset_render_settings(&gHUDCurrDisplayList); + reset_render_settings(&gHudDL); sprite_opaque(TRUE); } else { // In 3/4 player, just show the life counter. @@ -3083,91 +3120,93 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } if (curRacerObj != NULL) { gCurrentHud = gPlayerHud[PLAYER_FOUR]; - spE4 = gCurrentHud->challengePortrait.x; - spE0 = gCurrentHud->challengePortrait.y; + spE4 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + spE0 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; sprite_opaque(FALSE); - set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); + set_ortho_matrix_view(&gHudDL, &gHudMtx); sprite_anim_off(TRUE); - gCurrentHud->challengePortrait.x = 225.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = 225.0f; if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.y = 181.5f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = 181.5f; } else { - gCurrentHud->challengePortrait.y = 165.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = 165.0f; } if (osTvType == OS_TV_TYPE_PAL) { - var_a0_5 = (66.0f - gCurrentHud->bananaCountIconStatic.x) - 4.0f; - temp = -114.0f - gCurrentHud->bananaCountIconStatic.y; + var_a0_5 = (66.0f - gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.x) - 4.0f; + temp = -114.0f - gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.y; } else { - var_a0_5 = 66.0f - gCurrentHud->bananaCountIconStatic.x; - temp = -100.0f - gCurrentHud->bananaCountIconStatic.y; + var_a0_5 = 66.0f - gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.x; + temp = -100.0f - gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.y; } - gCurrentHud->bananaCountIconStatic.x += var_a0_5; - gCurrentHud->bananaCountIconStatic.y += temp; - gCurrentHud->bananaCountIconSpin.x += var_a0_5; - gCurrentHud->bananaCountIconSpin.y += temp; - gCurrentHud->bananaCountSparkle.x += var_a0_5; - gCurrentHud->bananaCountSparkle.y += temp; - gCurrentHud->bananaCountNumber1.x += var_a0_5; - gCurrentHud->bananaCountNumber1.y -= temp + 1; - gCurrentHud->bananaCountNumber2.x += var_a0_5; - gCurrentHud->bananaCountNumber2.y -= temp + 1; - gCurrentHud->bananaCountX.x += var_a0_5; - gCurrentHud->bananaCountX.y -= temp; - gCurrentHud->challengePortrait.spriteID = curRacerObj->characterId + HUD_SPRITE_PORTRAIT; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.y += temp; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.y += temp; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.y += temp; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.y -= temp + 1; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.y -= temp + 1; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.x += var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.y -= temp; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].spriteID = + curRacerObj->characterId + HUD_SPRITE_PORTRAIT; if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.x -= 4.0f; - gCurrentHud->eggChallengeIcon.x -= 4.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x -= 4.0f; + gCurrentHud->entry[HUD_EGG_CHALLENGE_ICON].pos.x -= 4.0f; } D_80126CD5 = TRUE; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->challengePortrait); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT]); D_80126CD5 = FALSE; - if (gCurrentHud->bananaCountIconSpin.unk1B == 0 && curRacerObj->bananas == 10) { - gCurrentHud->bananaCountIconSpin.unk1B = curRacerObj->bananas; + if (gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.visualCounter == 0 && + curRacerObj->bananas == 10) { + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].bananaCountIconSpin.visualCounter = + curRacerObj->bananas; } - render_racer_bananas(curRacerObj, updateRate); - gCurrentHud->bananaCountIconStatic.x -= var_a0_5; - gCurrentHud->bananaCountIconStatic.y -= temp; - gCurrentHud->bananaCountIconSpin.x -= var_a0_5; - gCurrentHud->bananaCountIconSpin.y -= temp; - gCurrentHud->bananaCountSparkle.x -= var_a0_5; - gCurrentHud->bananaCountSparkle.y -= temp; - gCurrentHud->bananaCountNumber1.x -= var_a0_5; - gCurrentHud->bananaCountNumber1.y += temp + 1; - gCurrentHud->bananaCountNumber2.x -= var_a0_5; - gCurrentHud->bananaCountNumber2.y += temp + 1; - gCurrentHud->bananaCountX.x -= var_a0_5; - gCurrentHud->bananaCountX.y += temp; - gCurrentHud->challengePortrait.x = spE4; - gCurrentHud->challengePortrait.y = spE0; + hud_bananas(curRacerObj, updateRate); + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_STATIC].pos.y -= temp; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_ICON_SPIN].pos.y -= temp; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_SPARKLE].pos.y -= temp; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_1].pos.y += temp + 1; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_NUMBER_2].pos.y += temp + 1; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.x -= var_a0_5; + gCurrentHud->entry[HUD_BANANA_COUNT_X].pos.y += temp; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = spE4; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = spE0; sprite_opaque(TRUE); - reset_render_settings(&gHUDCurrDisplayList); + reset_render_settings(&gHudDL); sprite_anim_off(FALSE); } } } } else if (gHudLevelHeader->race_type == RACETYPE_CHALLENGE_BANANAS) { if (gNumActivePlayers == 2 && gHudToggleSettings[gHUDNumPlayers] == 0) { - temp_s0_2 = gCurrentHud->challengePortrait.x; - temp_s1_2 = gCurrentHud->challengePortrait.y; - temp_s3 = gCurrentHud->treasureMetre.x; - spBC = gCurrentHud->treasureMetre.y; + temp_s0_2 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + temp_s1_2 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; + temp_s3 = gCurrentHud->entry[HUD_TREASURE_METRE].pos.x; + spBC = gCurrentHud->entry[HUD_TREASURE_METRE].pos.y; racerGroup = get_racer_objects(&racerCount); for (sp144 = 0; sp144 < racerCount; sp144++) { someRacer = (Object_Racer *) racerGroup[sp144]->unk64; - render_treasure_hud(someRacer); + hud_treasure(someRacer); if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.y += 66.0; - gCurrentHud->treasureMetre.y += 66.0; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 66.0; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y += 66.0; } else { - gCurrentHud->challengePortrait.y += 55.0f; - gCurrentHud->treasureMetre.y += 55.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y += 55.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y += 55.0f; } } - gCurrentHud->challengePortrait.x = temp_s0_2; - gCurrentHud->challengePortrait.y = temp_s1_2; - gCurrentHud->treasureMetre.x = temp_s3; - gCurrentHud->treasureMetre.y = spBC; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = temp_s0_2; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = temp_s1_2; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x = temp_s3; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y = spBC; } else if (gNumActivePlayers == 3) { tempVar4 = NULL; for (tempVar2 = 0; tempVar2 < objectCount; tempVar2++) { @@ -3176,37 +3215,38 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } } if (tempVar4 != NULL) { - temp_s0_3 = gCurrentHud->challengePortrait.x; - temp_s1_3 = gCurrentHud->challengePortrait.y; - temp_f16 = gCurrentHud->treasureMetre.x; - temp_f6 = gCurrentHud->treasureMetre.y; - gCurrentHud->challengePortrait.x = 225.0f; - gCurrentHud->challengePortrait.y = 165.0f; - gCurrentHud->treasureMetre.x = 209.0f; - gCurrentHud->treasureMetre.y = 193.0f; + temp_s0_3 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x; + temp_s1_3 = gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; + temp_f16 = gCurrentHud->entry[HUD_TREASURE_METRE].pos.x; + temp_f6 = gCurrentHud->entry[HUD_TREASURE_METRE].pos.y; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = 225.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = 165.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x = 209.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y = 193.0f; if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->challengePortrait.x -= 4.0f; - gCurrentHud->treasureMetre.x -= 4.0f; - gCurrentHud->challengePortrait.y *= 1.1; - gCurrentHud->treasureMetre.y *= 1.1; - gCurrentHud->challengePortrait.y = (s32) gCurrentHud->challengePortrait.y; - gCurrentHud->treasureMetre.y = (s32) gCurrentHud->treasureMetre.y; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x -= 4.0f; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x -= 4.0f; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y *= 1.1; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y *= 1.1; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = + (s32) gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y = (s32) gCurrentHud->entry[HUD_TREASURE_METRE].pos.y; } - render_treasure_hud(tempVar4); - gCurrentHud->challengePortrait.x = temp_s0_3; - gCurrentHud->challengePortrait.y = temp_s1_3; - gCurrentHud->treasureMetre.x = temp_f16; - gCurrentHud->treasureMetre.y = temp_f6; + hud_treasure(tempVar4); + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.x = temp_s0_3; + gCurrentHud->entry[HUD_CHALLENGE_PORTRAIT].pos.y = temp_s1_3; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.x = temp_f16; + gCurrentHud->entry[HUD_TREASURE_METRE].pos.y = temp_f6; } } } if (D_80127180 != 0) { gHudSprites[D_80127180].texture = NULL; - texrect_draw(&gHUDCurrDisplayList, gHudSprites, 0, 0, 255, 255, 255, 255); + texrect_draw(&gHudDL, gHudSprites, 0, 0, 255, 255, 255, 255); } - *dList = gHUDCurrDisplayList; - *mtx = gHUDCurrMatrix; - *vtx = gHUDCurrVertex; + *dList = gHudDL; + *mtx = gHudMtx; + *vtx = gHudVtx; if (!(gHudLevelHeader->unkBC & 1)) { sp113 = TRUE; for (i = 0; i < objectCount; i++) { @@ -3222,8 +3262,8 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u test: return; } else { - reset_render_settings(&gHUDCurrDisplayList); - set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); + reset_render_settings(&gHudDL); + set_ortho_matrix_view(&gHudDL, &gHudMtx); lvlMdl = get_current_level_model(); if (lvlMdl == NULL) { return; @@ -3260,33 +3300,32 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gMinimapScreenY *= 1.2; } sprite_opaque(FALSE); - hudElem.x = gMinimapScreenX + gHudOffsetX + gHudBounceX; - hudElem.y = gMinimapScreenY; + hudElem.pos.x = gMinimapScreenX + gHudOffsetX + gHudBounceX; + hudElem.pos.y = gMinimapScreenY; if (osTvType == OS_TV_TYPE_PAL) { - hudElem.x -= 4.0f; + hudElem.pos.x -= 4.0f; } - hudElem.z_rotation = -someObjSeg->trans.rotation.z_rotation; - hudElem.x_rotation = 0; + hudElem.rotation.z_rotation = -someObjSeg->trans.rotation.z_rotation; + hudElem.rotation.x_rotation = 0; if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { - hudElem.y_rotation = -0x8000; - hudElem.x -= gMinimapDotOffsetX; + hudElem.rotation.y_rotation = -0x8000; + hudElem.pos.x -= gMinimapDotOffsetX; } else { - hudElem.y_rotation = 0; + hudElem.rotation.y_rotation = 0; } hudElem.spriteOffset = 0; - hudElem.z = 0.0f; + hudElem.pos.z = 0.0f; hudElem.scale = 1.0f; opacity = mapOpacity; if (mapOpacity > 160) { mapOpacity = 160; } if (gNumActivePlayers == 3) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, mapOpacity); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 255, 255, mapOpacity); } else { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, gMinimapRed, gMinimapGreen, gMinimapBlue, mapOpacity); + gDPSetPrimColor(gHudDL++, 0, 0, gMinimapRed, gMinimapGreen, gMinimapBlue, mapOpacity); } - render_ortho_triangle_image(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - (ObjectSegment *) &hudElem, minimap, 0); + render_ortho_triangle_image(&gHudDL, &gHudMtx, &gHudVtx, (ObjectSegment *) &hudElem, minimap, 0); sp11C = (lvlMdl->upperXBounds - lvlMdl->lowerXBounds) / (f32) (lvlMdl->upperZBounds - lvlMdl->lowerZBounds); sp118 = coss_f((lvlMdl->minimapRotation * 0xFFFF) / 360); sp114 = sins_f((lvlMdl->minimapRotation * 0xFFFF) / 360); @@ -3295,37 +3334,37 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u if (temp_v0_8 != NULL) { minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, sp11C); - gCurrentHud->minimapMarker.spriteID = HUD_SPRITE_MAP_DOT; - gCurrentHud->minimapMarker.z_rotation = 0; - gCurrentHud->minimapMarker.scale = 1.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; tempVar1 = (opacity * (f32) temp_v0_8->segment.object.opacity) * (1.0 / 128.0); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 60, 60, 60, tempVar1); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->minimapMarker); + gDPSetPrimColor(gHudDL++, 0, 0, 60, 60, 60, tempVar1); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_MINIMAP_MARKER]); } } temp_v0_8 = timetrial_ghost_staff(); if (temp_v0_8 != NULL) { minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, sp11C); - gCurrentHud->minimapMarker.z_rotation = 0; + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; tempVar1 = (opacity * (f32) temp_v0_8->segment.object.opacity) * (1.0 / 128.0); - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, gHudMinimapColours[8].red, gHudMinimapColours[8].green, + gDPSetPrimColor(gHudDL++, 0, 0, gHudMinimapColours[8].red, gHudMinimapColours[8].green, gHudMinimapColours[8].blue, tempVar1); - gCurrentHud->minimapMarker.scale = 1.0f; - gCurrentHud->minimapMarker.spriteID = HUD_SPRITE_MAP_DOT; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->minimapMarker); + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_MINIMAP_MARKER]); } // Draw Taj's minimap icon. if (gHudLevelHeader->race_type == RACETYPE_HUBWORLD) { temp_v0_8 = find_taj_object(); if (temp_v0_8 != NULL) { - gCurrentHud->minimapMarker.spriteID = HUD_SPRITE_MAP_DOT; + gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; minimap_marker_pos(temp_v0_8->segment.trans.x_position, temp_v0_8->segment.trans.z_position, sp114, sp118, sp11C); - gCurrentHud->minimapMarker.z_rotation = 0; - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 0, 255, opacity); - gCurrentHud->minimapMarker.scale = 1.0f; - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->minimapMarker); + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; + gDPSetPrimColor(gHudDL++, 0, 0, 255, 0, 255, opacity); + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_MINIMAP_MARKER]); } } // Draw racer minimap icons. @@ -3337,59 +3376,60 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u minimap_marker_pos(objectGroup[i]->segment.trans.x_position, objectGroup[i]->segment.trans.z_position, sp114, sp118, sp11C); if (someRacer->playerIndex != PLAYER_COMPUTER) { - gCurrentHud->minimapMarker.y -= 1.0f; - gCurrentHud->minimapMarker.spriteID = HUD_SPRITE_MAP_ARROW; - gCurrentHud->minimapMarker.z_rotation = (objectGroup[i]->segment.trans.rotation.y_rotation - - ((lvlMdl->minimapRotation * 0xFFFF) / 360)) & - 0xFFFF; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.y -= 1.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_ARROW; + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = + (objectGroup[i]->segment.trans.rotation.y_rotation - + ((lvlMdl->minimapRotation * 0xFFFF) / 360)) & + 0xFFFF; if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { - gCurrentHud->minimapMarker.z_rotation = 0xFFFF - gCurrentHud->minimapMarker.z_rotation; + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = + 0xFFFF - gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation; } sprite_opaque(TRUE); } else { - gCurrentHud->minimapMarker.z_rotation = 0; - gCurrentHud->minimapMarker.spriteID = HUD_SPRITE_MAP_DOT; + gCurrentHud->entry[HUD_MINIMAP_MARKER].rotation.z_rotation = 0; + gCurrentHud->entry[HUD_MINIMAP_MARKER].spriteID = HUD_SPRITE_MAP_DOT; } if (is_taj_challenge() && someRacer->vehicleID == VEHICLE_CARPET) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 0, 255, opacity); + gDPSetPrimColor(gHudDL++, 0, 0, 255, 0, 255, opacity); } else { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, gHudMinimapColours[someRacer->characterId].red, + gDPSetPrimColor(gHudDL++, 0, 0, gHudMinimapColours[someRacer->characterId].red, gHudMinimapColours[someRacer->characterId].green, gHudMinimapColours[someRacer->characterId].blue, opacity); } if (!(get_current_level_race_type() & RACETYPE_CHALLENGE) || (!someRacer->raceFinished)) { if (osTvType == OS_TV_TYPE_PAL) { - gCurrentHud->minimapMarker.x -= 4.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.x -= 4.0f; } if (get_current_level_race_type() == RACETYPE_CHALLENGE_BATTLE) { switch (someRacer->elevation) { case ELEVATION_LOW: - gCurrentHud->minimapMarker.scale = 0.8f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 0.8f; break; case ELEVATION_NORMAL: - gCurrentHud->minimapMarker.scale = 1.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; break; case ELEVATION_HIGH: case ELEVATION_HIGHEST: - gCurrentHud->minimapMarker.scale = 1.2f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.2f; break; } } else { - gCurrentHud->minimapMarker.scale = 1.0f; + gCurrentHud->entry[HUD_MINIMAP_MARKER].scale = 1.0f; } - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - &gCurrentHud->minimapMarker); + hud_element_render(&gHudDL, &gHudMtx, &gHudVtx, &gCurrentHud->entry[HUD_MINIMAP_MARKER]); } sprite_opaque(FALSE); } } - gDPPipeSync(gHUDCurrDisplayList++); + gDPPipeSync(gHudDL++); sprite_anim_off(FALSE); sprite_opaque(TRUE); - *dList = gHUDCurrDisplayList; - *mtx = gHUDCurrMatrix; - *vtx = gHUDCurrVertex; + *dList = gHudDL; + *mtx = gHudMtx; + *vtx = gHudVtx; } } } @@ -3414,22 +3454,24 @@ void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspec scaledY = (lvlMdl->minimapYScale * -60.0f * (z - lvlMdl->lowerZBounds)) / b; if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { // Is adventure 2? - gCurrentHud->minimapMarker.x = (gMinimapScreenX - ((scaledX * angleCos) + (scaledY * angleSin))) + - lvlMdl->minimapOffsetXAdv2 - gMinimapDotOffsetX; - gCurrentHud->minimapMarker.y = (lvlMdl->minimapOffsetYAdv2 + gMinimapScreenY) - - ((scaledX * angleSin) - (scaledY * angleCos)) + gMinimapDotOffsetY; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.x = + (gMinimapScreenX - ((scaledX * angleCos) + (scaledY * angleSin))) + lvlMdl->minimapOffsetXAdv2 - + gMinimapDotOffsetX; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.y = (lvlMdl->minimapOffsetYAdv2 + gMinimapScreenY) - + ((scaledX * angleSin) - (scaledY * angleCos)) + + gMinimapDotOffsetY; return; } // Final x position on minimap - gCurrentHud->minimapMarker.x = gMinimapScreenX + ((scaledX * angleCos) + (scaledY * angleSin)) + - (f32) lvlMdl->minimapOffsetXAdv1 - gMinimapDotOffsetX; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.x = gMinimapScreenX + ((scaledX * angleCos) + (scaledY * angleSin)) + + (f32) lvlMdl->minimapOffsetXAdv1 - gMinimapDotOffsetX; // Final y position on minimap - gCurrentHud->minimapMarker.y = (lvlMdl->minimapOffsetYAdv1 + gMinimapScreenY) - - ((scaledX * angleSin) - (scaledY * angleCos)) + gMinimapDotOffsetY; + gCurrentHud->entry[HUD_MINIMAP_MARKER].pos.y = (lvlMdl->minimapOffsetYAdv1 + gMinimapScreenY) - + ((scaledX * angleSin) - (scaledY * angleCos)) + gMinimapDotOffsetY; } // hud_draw_element -#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/func_800AA600.s") +#pragma GLOBAL_ASM("asm/nonmatchings/game_ui/hud_element_render.s") /** * Renders a 3D model onscreen. @@ -3468,12 +3510,12 @@ void hud_draw_model(ObjectModel *objModel) { } else { texPtr = objModel->textures[texIndex].texture; } - load_and_set_texture_no_offset(&gHUDCurrDisplayList, texPtr, flags & ~RENDER_Z_COMPARE); - gSPVertexDKR(gHUDCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); + load_and_set_texture_no_offset(&gHudDL, texPtr, flags & ~RENDER_Z_COMPARE); + gSPVertexDKR(gHudDL++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); if (texPtr == NULL) { textureEnabled = TRIN_DISABLE_TEXTURE; } - gSPPolygon(gHUDCurrDisplayList++, OS_PHYSICAL_TO_K0(tris), numTris, textureEnabled); + gSPPolygon(gHudDL++, OS_PHYSICAL_TO_K0(tris), numTris, textureEnabled); numBatches = objModel->numberOfBatches; } } diff --git a/src/game_ui.h b/src/game_ui.h index e6a79c42..b9df6cd3 100644 --- a/src/game_ui.h +++ b/src/game_ui.h @@ -10,10 +10,49 @@ #define HUD_ELEMENT_SPRITE 0x8000 #define HUD_ELEMENT_TEXTURE 0xC000 -#define HUD_ELEMENT_COUNT (sizeof(struct HudData) / sizeof(struct HudElement)) - #define HUD_EGG_TOTAL 3 +typedef enum RaceFinishStages { + HUD_RACEFINISH_MUTE, + HUD_RACEFINISH_TEXT_IN, + HUD_RACEFINISH_TEXT_OUT, + HUD_RACEFINISH_IDLE +} RaceFinishStages; + +typedef enum TimeTrialFinishStages { + TIMETRIAL_FINISH_INIT, // Init necessary vars, then advance. + TIMETRIAL_FINISH_IN, // Slide in the text. + TIMETRIAL_FINISH_SHOW, // Keep the text onscreen for a few seconds. + TIMETRIAL_FINISH_OUT, // Slide out the text. + TIMETRIAL_FINISH_IDLE, // Text is offscreen, reset a few vars then advance. + TIMETRIAL_FINISH_IDLE_2 // Do nothing. +} TimeTrialFinishStages; + +typedef enum WrongWayStages { + WRONGWAY_HIDE, + WRONGWAY_SHOW +} WrongWayStages; + +typedef enum LapTextStages { + LAPTEXT_IDLE, + LAPTEXT_UNK1, + LAPTEXT_UNK2, + LAPTEXT_UNK3 +} LapTextStages; + +typedef enum LapTextDirection { + LAPTEXT_IN = -1, + LAPTEXT_OUT = 1 +} LapTextDirection; + +// Consistently inconsistent, courtesy of Rare. +typedef enum WrongWayDirection { + WRONGWAY_OUT = -1, + WRONGWAY_IN = 1 +} WrongWayDirection; + + + enum CourseIndicatorArrows { INDICATOR_NONE, INDICATOR_LEFT, @@ -70,6 +109,70 @@ enum HudElementNames { HUD_ELEMENT_UNK_27 }; +enum HudTypes { + HUD_RACE_POSITION, + HUD_RACE_POSITION_END, + HUD_WEAPON_DISPLAY, + HUD_LAP_COUNT_LABEL, + HUD_LAP_COUNT_CURRENT, + HUD_LAP_COUNT_SEPERATOR, + HUD_LAP_COUNT_TOTAL, + HUD_BANANA_COUNT_ICON_SPIN, + HUD_BANANA_COUNT_NUMBER_1, + HUD_BANANA_COUNT_NUMBER_2, + HUD_RACE_TIME_LABEL, + HUD_RACE_TIME_NUMBER, + HUD_RACE_START_GO, + HUD_RACE_START_READY, + HUD_RACE_END_FINISH, + HUD_MINIMAP_MARKER, + HUD_LAP_COUNT_FLAG, + HUD_MAGNET_RETICLE, + HUD_BANANA_COUNT_X, + HUD_BALLOON_COUNT_ICON, + HUD_BALLOON_COUNT_X, + HUD_BALLOON_COUNT_NUMBER_1, + HUD_BALLOON_COUNT_NUMBER_2, + HUD_LAP_TIME_TEXT, + HUD_TIME_TRIAL_LAP_TEXT, + HUD_TIME_TRIAL_LAP_NUMBER, + HUD_STOPWATCH_HANDS, + HUD_BANANA_COUNT_ICON_STATIC, + HUD_BANANA_COUNT_SPARKLE, + HUD_LAP_TEXT_FINAL, + HUD_LAP_TEXT_LAP, + HUD_LAP_TEXT_TWO, + HUD_TREASURE_METRE, + HUD_COURSE_ARROWS, + HUD_STOPWATCH, + HUD_WRONGWAY_1, + HUD_WRONGWAY_2, + HUD_PRO_AM_LOGO, + HUD_SPEEDOMETRE_ARROW, + HUD_SPEEDOMETRE_0, + HUD_SPEEDOMETRE_30, + HUD_SPEEDOMETRE_60, + HUD_SPEEDOMETRE_90, + HUD_SPEEDOMETRE_120, + HUD_SPEEDOMETRE_150, + HUD_SPEEDOMETRE_BG, + HUD_SILVER_COIN_TALLY, + HUD_CHALLENGE_FINISH_POS_1, + HUD_CHALLENGE_FINISH_POS_2, + HUD_WEAPON_QUANTITY, + HUD_CHALLENGE_PORTRAIT, + HUD_EGG_CHALLENGE_ICON, + HUD_BATTLE_BANANA_ICON, + HUD_BATTLE_BANANA_X, + HUD_BATTLE_BANANA_COUNT_1, + HUD_BATTLE_BANANA_COUNT_2, + HUD_RACE_FINISH_POS_1, + HUD_TWO_PLAYER_ADV_PORTRAIT, + HUD_RACE_FINISH_POS_2, + + HUD_ELEMENT_COUNT +}; + enum HudAssets { HUD_ASSET_0, HUD_SPRITE_WEAPONS, @@ -80,10 +183,10 @@ enum HudAssets { HUD_ASSET_6, HUD_SPRITE_GO_BIG, HUD_SPRITE_BANANA_ANIM, - HUD_ASSET_9, - HUD_ASSET_10, - HUD_ASSET_11, - HUD_ASSET_12, + HUD_ASSET_NUMBERS, + HUD_ASSET_NUMBERS_SMALL, + HUD_ASSET_SEPERATOR, + HUD_ASSET_SEPERATOR_SMALL, HUD_ASSET_13, HUD_SPRITE_MAP_DOT, HUD_ASSET_15, @@ -155,98 +258,108 @@ typedef struct HudElementBase { s16 spriteOffset; } HudElementBase; -typedef struct HudElement { - s16 y_rotation; - s16 x_rotation; - s16 z_rotation; - s16 spriteID; - f32 scale; - f32 x; - f32 y; - f32 z; - s16 spriteOffset; - s8 unk1A; - s8 unk1B; - s8 unk1C; - s8 unk1D; - s8 unk1E; - s8 unk1F; -} HudElement; +typedef struct HudElement_ChallengeEggs { + s8 alphaTimer; // Counts up, wrapping between s8 bounds, used for setting the alpha. +} HudElement_ChallengeEggs; -typedef struct HudElementArray { - s16 y_rotation; - s16 x_rotation; - s16 z_rotation; +typedef struct HudElement_RaceStartGo { + s8 musicStartTimer[4]; // Counts up to 60 frames (1 second) before starting the music +} HudElement_RaceStartGo; + +typedef struct HudElement_BananaCountIconSpin { + s8 spinCounter; // Number of remaining times the icon will spin + s8 visualCounter; // Previously known banana value. +} HudElement_BananaCountIconSpin; + +typedef struct HudElement_BananaCountSparkle { + s8 sparkleTimer; // Delay timer before starting a new sparkle + s8 sparkleCounter; // Number of remaining times the icon will sparkle +} HudElement_BananaCountSparkle; + +typedef struct HudElement_SilverCoinTally { + s8 soundPlayed; // Whether the sound has been played + s8 soundTimer; // Delay timer before playing the sound + s8 offsetY; // Offset for the hud, utilised for two players. +} HudElement_SilverCoinTally; + +typedef struct HudElement_RaceFinishPos { + s8 status; // Which behaviour to do + s8 textOutTimer; // Delay timer in frames, increases ticks at 120 before getting set to -120 + s8 textOutTicks; // Number of times delay timer has reached 120. This is because the timer is only 8 bits. + s8 targetPos; // Target X offset for the element; +} HudElement_RaceFinishPos; + +typedef struct HudElement_RacePosition { + s8 active; // Whether the scale effect is active. + s8 scaleCounter; // Ranges from -128 to 127, plus 129 then multiplied to 127 to get a 16 bit range for the trig func. + s8 baseScale; // The initial scale value used. Lets you have smaller baseline scales. +} HudElement_RacePosition; + +typedef struct HudElement_LapCountFlag { + s8 visualCounter; // Counter that sets the sprite offset when above 6. +} HudElement_LapCountFlag; + +typedef struct HudElement_LapText { + s8 status; // Which behaviour to do + s8 direction; // Direction to slide the text + s8 targetPos; // Target X offset for the element + s8 soundPlayed; // Whether the sound has been played +} HudElement_LapText; + +typedef struct HudElement_Timer { + s8 minutes; // Minutes elapsed + s8 seconds; // Seconds elapsed + s8 hundredths; // Hundredths of a second elapsed + s8 unk1D; +} HudElement_Timer; + +typedef struct HudElement_FinishText { + s8 status; // Which behaviour to do + s8 fadeTimer; // Timer that signals sliding the text offscreen when it hits 120 + s8 unk1C; // Unused + s8 targetPos; // Target X offset for the element +} HudElement_FinishText; + +typedef struct HudElement_WeaponDisplay { + s8 hideTimer; // Value that counts down when having fewer than 3 quantity. + s8 rotation; // s8 rotation representation. Wraps from 0-16, then multiplied by 0x1000 + s8 scale; // s8 scale representation. A new weapon grows larger until reaching full size. Ranges from 0 - 120 + s8 prevLevel; // Previous known weapon level, for starting the visual effects upon collecting another. +} HudElement_WeaponDisplay; + +typedef struct HudElement_RaceTimeLabel { + s8 hideTimer; // Counter that's used for having the text flicker. + s8 hundredths; // Rounds hundredths to the next tenth, but functionally unused. +} HudElement_RaceTimeLabel; + +typedef struct HudElement { + Vec3s rotation; s16 spriteID; f32 scale; - f32 x; - f32 y; - f32 z; + Vec3f pos; s16 spriteOffset; - s8 unk1A[6]; -} HudElementArray; + union { + u8 filler[4]; // Ensures this union is 6 bytes, since Rare never actually use more than four. + HudElement_ChallengeEggs challengeEggs; + HudElement_RaceStartGo raceStartGo; + HudElement_BananaCountIconSpin bananaCountIconSpin; + HudElement_BananaCountSparkle bananaCountSparkle; + HudElement_SilverCoinTally silverCoinTally; + HudElement_RaceFinishPos raceFinishPos; + HudElement_RacePosition racePosition; + HudElement_LapCountFlag lapCountFlag; + HudElement_LapText lapText; + HudElement_Timer timer; + HudElement_FinishText finishText; + HudElement_WeaponDisplay weaponDisplay; + HudElement_RaceTimeLabel raceTimeLabel; + }; + +} HudElement; // Size: 0x760 typedef struct HudData { - /* 0x0000 */ HudElement racePostion; - /* 0x0020 */ HudElement racePositionEnd; - /* 0x0040 */ HudElement weaponDisplay; - /* 0x0060 */ HudElement lapCountLabel; - /* 0x0080 */ HudElement lapCountCurrent; - /* 0x00A0 */ HudElement lapCountSeperator; - /* 0x00C0 */ HudElement lapCountTotal; - /* 0x00E0 */ HudElement bananaCountIconSpin; - /* 0x0100 */ HudElement bananaCountNumber1; - /* 0x0120 */ HudElement bananaCountNumber2; - /* 0x0140 */ HudElement raceTimeLabel; - /* 0x0160 */ HudElement raceTimeNumber; - /* 0x0180 */ HudElementArray raceStartGo; - /* 0x01A0 */ HudElement raceStartReady; - /* 0x01C0 */ HudElement raceEndFinish; - /* 0x01E0 */ HudElement minimapMarker; - /* 0x0200 */ HudElement lapCountFlag; - /* 0x0200 */ HudElement magnetReticle; - /* 0x0240 */ HudElement bananaCountX; - /* 0x0260 */ HudElement balloonCountIcon; - /* 0x0280 */ HudElement balloonCountX; - /* 0x02A0 */ HudElement balloonCountNumber1; - /* 0x02C0 */ HudElement balloonCountNumber2; - /* 0x02E0 */ HudElement lapTimeText; - /* 0x0300 */ HudElement timeTrialLapText; - /* 0x0320 */ HudElement timeTrialLapNumber; - /* 0x0340 */ HudElement stopwatchHands; - /* 0x0360 */ HudElement bananaCountIconStatic; - /* 0x0380 */ HudElement bananaCountSparkle; - /* 0x03A0 */ HudElement lapTextFinal; - /* 0x03C0 */ HudElement lapTextLap; - /* 0x03E0 */ HudElement lapTextTwo; - /* 0x03E0 */ HudElement treasureMetre; - /* 0x0440 */ HudElement courseArrows; - /* 0x0440 */ HudElement stopwatch; - /* 0x0460 */ HudElement wrongWay1; - /* 0x0480 */ HudElement wrongWay2; - /* 0x04A0 */ HudElement unk4A0; - /* 0x04C0 */ HudElement speedometreArrow; - /* 0x04E0 */ HudElement speedometreNumber0; - /* 0x0500 */ HudElement speedometreNumber30; - /* 0x0520 */ HudElement speedometreNumber60; - /* 0x0540 */ HudElement speedometreNumber90; - /* 0x0560 */ HudElement speedometreNumber120; - /* 0x0580 */ HudElement speedometreNumber150; - /* 0x05A0 */ HudElement speedometreBG; - /* 0x05C0 */ HudElement silverCoinTally; - /* 0x05E0 */ HudElement challengeFinishPosition1; - /* 0x0600 */ HudElement challengeFinishPosition2; - /* 0x0620 */ HudElement weaponQuantity; - /* 0x0640 */ HudElement challengePortrait; - /* 0x0660 */ HudElement eggChallengeIcon; - /* 0x0680 */ HudElement battleBananaIcon; - /* 0x06A0 */ HudElement battleBananaX; - /* 0x06C0 */ HudElement battleBananaCount1; - /* 0x06E0 */ HudElement battleBananaCount2; - /* 0x0700 */ HudElement raceFinishPosition1; - /* 0x0720 */ HudElement twoPlayerAdvPortrait; - /* 0x0740 */ HudElement raceFinishPosition2; + /* 0x0000 */ HudElement entry[HUD_ELEMENT_COUNT]; } HudData; /* Size: 0x10 bytes */ @@ -270,55 +383,55 @@ extern u8 gGfxTaskYieldData[OS_YIELD_DATA_SIZE]; u8 race_starting(void); void hud_audio_init(void); -void render_hud_race(s32 countdown, Object *obj, s32 updateRate); -void render_hud_challenge_eggs(s32 countdown, Object *obj, s32 updateRate); -void render_hud_race_boss(s32 countdown, Object *obj, s32 updateRate); -void render_hud_taj_race(s32 countdown, Object *obj, s32 updateRate); +void hud_main_race(s32 countdown, Object *obj, s32 updateRate); +void hud_main_eggs(s32 countdown, Object *obj, s32 updateRate); +void hud_main_boss(s32 countdown, Object *obj, s32 updateRate); +void hud_main_taj(s32 countdown, Object *obj, s32 updateRate); void hud_speedometre_reset(void); -void play_time_trial_end_message(s16 *playerID); +void hud_time_trial_message(s16 *playerID); void hud_sound_play_delayed(u16 soundID, f32 delay, s32 playerIndex); void hud_sound_stop(u16 soundID, s32 playerIndex); void minimap_init(LevelModel *model); -s8 get_hud_setting(void); +s8 hud_setting(void); void minimap_fade(s32 setting); void minimap_opacity_set(s32 setting); void func_800AB1C8(void); void hud_visibility(u8 setting); -void render_race_time(Object_Racer *racer, s32 updateRate); -void render_wrong_way_text(Object_Racer *obj, s32 updateRate); -void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate); -void render_hud_hubworld(Object *obj, s32 updateRate); -void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s32 updateRate); -void render_weapon_hud(Object *obj, s32 updateRate); -void render_race_start(s32 countdown, s32 updateRate); -void render_racer_bananas(Object_Racer *racer, s32 updateRate); -void render_race_finish_position(Object_Racer *racer, s32 updateRate); -void render_speedometer(Object *obj, s32 updateRate); -void render_lap_count(Object_Racer *racer, s32 updateRate); -void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate); -void init_hud(s32 viewportCount); -void render_hud_battle(s32 countdown, Object *obj, s32 updateRate); -void hud_draw_lives(Object_Racer *racer, s32 updateRate); -void free_hud(void); -void set_stopwatch_face(u8, u8, u8, u8, u8); +void hud_race_time(Object_Racer *racer, s32 updateRate); +void hud_wrong_way(Object_Racer *obj, s32 updateRate); +void hud_course_arrows(Object_Racer *racer, s32 updateRate); +void hud_main_hub(Object *obj, s32 updateRate); +void hud_render_player(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s32 updateRate); +void hud_weapon(Object *obj, s32 updateRate); +void hud_race_start(s32 countdown, s32 updateRate); +void hud_bananas(Object_Racer *racer, s32 updateRate); +void hud_race_finish_1player(Object_Racer *racer, s32 updateRate); +void hud_speedometre(Object *obj, s32 updateRate); +void hud_lap_count(Object_Racer *racer, s32 updateRate); +void hud_render_general(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 updateRate); +void hud_init(s32 viewportCount); +void hud_main_battle(s32 countdown, Object *obj, s32 updateRate); +void hud_lives_render(Object_Racer *racer, s32 updateRate); +void hud_free(void); +void hud_stopwatch_face(u8, u8, u8, u8, u8); void hud_audio_update(s32 updateRate); -void render_silver_coin_counter(Object_Racer *racer, s32 updateRate); -void render_magnet_reticle(Object *racerObj); -void render_time_trial_finish(Object_Racer *racer, s32 updateRate); +void hud_silver_coins(Object_Racer *racer, s32 updateRate); +void hud_magnet_reticle(Object *racerObj); +void hud_time_trial_finish(Object_Racer *racer, s32 updateRate); void hud_eggs_portrait(Object_Racer *racer, s32 updateRate); void hud_draw_eggs(Object *racerObj, s32 updateRate); -void render_race_position(Object_Racer *racer, s32 updateRate); -void render_hud_banana_challenge(s32 countdown, Object *obj, s32 updateRate); -void render_balloon_count(Object_Racer *racer); -void render_treasure_hud(Object_Racer *racer); +void hud_race_position(Object_Racer *racer, s32 updateRate); +void hud_main_treasure(s32 countdown, Object *obj, s32 updateRate); +void hud_balloons(Object_Racer *racer); +void hud_treasure(Object_Racer *racer); void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspectRatio); -void render_timer(s32 x, s32 y, s32 minutes, s32 seconds, s32 hundredths, s32 smallFont); +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 func_800AA600(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement *arg3); -void func_800A277C(s32, Object*, s32); -void func_800A6254(Object_Racer *racer, s32 updateRate); +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); diff --git a/src/hasm/object_animate.s b/src/hasm/obj_animate.s similarity index 99% rename from src/hasm/object_animate.s rename to src/hasm/obj_animate.s index 04d8846c..b84937f2 100644 --- a/src/hasm/object_animate.s +++ b/src/hasm/obj_animate.s @@ -9,7 +9,7 @@ /* Generated by spimdisasm 1.30.0 */ -leaf object_animate +leaf obj_animate /* 62930 80061D30 27BDFFF8 */ addiu $sp, $sp, -0x8 /* 62934 80061D34 AFB10004 */ sw $s1, 0x4($sp) /* 62938 80061D38 AFB00000 */ sw $s0, 0x0($sp) @@ -380,4 +380,4 @@ leaf object_animate /* 62E80 80062280 8FB10004 */ lw $s1, 0x4($sp) /* 62E84 80062284 03E00008 */ jr $ra /* 62E88 80062288 27BD0008 */ addiu $sp, $sp, 0x8 -.end object_animate +.end obj_animate \ No newline at end of file diff --git a/src/hasm/unknown_0251F0.s b/src/hasm/obj_shade_fast.s similarity index 99% rename from src/hasm/unknown_0251F0.s rename to src/hasm/obj_shade_fast.s index bbf319f7..584f6c38 100644 --- a/src/hasm/unknown_0251F0.s +++ b/src/hasm/obj_shade_fast.s @@ -9,7 +9,7 @@ /* Generated by spimdisasm 1.30.0 */ -leaf func_800245F0 +leaf obj_shade_fast /* 251F0 800245F0 8CA70054 */ lw $a3, 0x54($a1) /* 251F4 800245F4 10E00051 */ beqz $a3, .L8002473C /* 251F8 800245F8 00000000 */ nop @@ -102,7 +102,7 @@ leaf func_800245F0 .L8002473C: /* 2533C 8002473C 03E00008 */ jr $ra /* 25340 80024740 00000000 */ nop -.end func_800245F0 +.end obj_shade_fast leaf calc_dynamic_lighting_for_object_2 /* 25344 80024744 27BDFF80 */ addiu $sp, $sp, -0x80 diff --git a/src/menu.c b/src/menu.c index 9aa39f34..b2b5332c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -16,7 +16,7 @@ #include "object_models.h" #include "printf.h" #include "textures_sprites.h" -#include "thread30_track_loading.h" +#include "thread30_bgload.h" #include "objects.h" #include "game.h" #include "rcp_dkr.h" @@ -628,11 +628,13 @@ s32 sMenuMusicVolume = 0x7F; s32 sMenuGuiOpacity = 0xFF; s32 unused_800DF768 = 1; -FadeTransition sMenuTransitionFadeInFast = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 10, -1); -FadeTransition sMenuTransitionFadeIn = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 18, -1); +FadeTransition sMenuTransitionFadeInFast = + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 10, FADE_STAY); +FadeTransition sMenuTransitionFadeIn = + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 18, FADE_STAY); FadeTransition sMenuTransitionFadeOut = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_BLACK, 18, 0); UNUSED FadeTransition sMenuTransitionFadeInWhite = - FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 18, -1); + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 18, FADE_STAY); UNUSED FadeTransition sMenuTransitionFadeOutWhite = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_WHITE, 18, 0); @@ -1926,12 +1928,13 @@ s32 gWoodPanelTexScaleV = 32; s16 D_800E1DC8[16] = { 1, 1, -1, 1, -1, 1, -1, -1, 1, -1, -1, -1, 1, 1, 1, -1 }; // Fade transition from the logo screen to the title screen. -FadeTransition gFadeLogoToTitleScreen = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 120, -1); +FadeTransition gFadeLogoToTitleScreen = + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 120, FADE_STAY); char gRareCopyrightString[24] = "(C) COPYRIGHT RARE 1997"; // Fade transition between levels in the title screen demo. -FadeTransition gFadeTitleScreenDemo = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 52, -1); +FadeTransition gFadeTitleScreenDemo = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 52, FADE_STAY); // Used in savemenu_render_element(). Used for controller pak adventure saves. // So the first save in the pak would be (ADV.A), second save (ADV.B), etc. @@ -2209,7 +2212,7 @@ UNUSED void menu_button_uvs(f32 u, f32 v) { gWoodPanelTexScaleV = v * 32.0f; } -void func_80080580(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, +void func_80080580(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour, TextureHeader *tex) { s32 uVals[4]; s32 vVals[4]; @@ -2284,21 +2287,21 @@ void func_80080580(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s vertices++; } } - if (dlist != NULL) { + if (dList != NULL) { gMenuGeometry[gWoodPanelCount].unk18[gMenuTrisFlip] = 1; - gSPDisplayList((*dlist)++, &dMenuHudSettings); + gSPDisplayList((*dList)++, &dMenuHudSettings); if (tex != NULL) { - gDkrDmaDisplayList((*dlist)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[1]), 2); - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(tex->cmd), tex->numberOfCommands); + gDkrDmaDisplayList((*dList)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[1]), 2); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(tex->cmd), tex->numberOfCommands); i = TRUE; // texEnabled } else { - gDkrDmaDisplayList((*dlist)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[0]), 2); + gDkrDmaDisplayList((*dList)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[0]), 2); i = FALSE; // texEnabled } - gDPPipeSync((*dlist)++); - gSPVertexDKR((*dlist)++, OS_PHYSICAL_TO_K0(gMenuGeometry[gWoodPanelCount].vertices[gMenuTrisFlip]), 20, 0); - gSPPolygon((*dlist)++, OS_PHYSICAL_TO_K0(gMenuGeometry[gWoodPanelCount].triangles[gMenuTrisFlip]), 10, i); - reset_render_settings(dlist); + gDPPipeSync((*dList)++); + gSPVertexDKR((*dList)++, OS_PHYSICAL_TO_K0(gMenuGeometry[gWoodPanelCount].vertices[gMenuTrisFlip]), 20, 0); + gSPPolygon((*dList)++, OS_PHYSICAL_TO_K0(gMenuGeometry[gWoodPanelCount].triangles[gMenuTrisFlip]), 10, i); + reset_render_settings(dList); } else { gMenuGeometry[gWoodPanelCount].unk18[gMenuTrisFlip] = 0; } @@ -2350,7 +2353,7 @@ void menu_geometry_end(void) { gMenuTrisFlip = 1 - gMenuTrisFlip; } -void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, +void func_80080E90(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour0, s32 colour1, s32 colour2, s32 colour3) { s32 temp_ra; s32 temp_t3; @@ -2369,8 +2372,8 @@ void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s s32 j; s32 index; - gSPDisplayList((*dlist)++, &dMenuHudSettings); - gDkrDmaDisplayList((*dlist)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[2]), 2); + gSPDisplayList((*dList)++, &dMenuHudSettings); + gDkrDmaDisplayList((*dList)++, OS_K0_TO_PHYSICAL(&dMenuHudDrawModes[2]), 2); // Must be a while loop to match. i = 0; @@ -2415,7 +2418,7 @@ void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s break; } - gDPSetPrimColor((*dlist)++, 0, 0, primColour >> 24, primColour >> 16, primColour >> 8, primColour); + gDPSetPrimColor((*dList)++, 0, 0, primColour >> 24, primColour >> 16, primColour >> 8, primColour); for (j = 0; j < borderLineCount; j++) { if (recLrx >= 0 && recLry >= 0) { @@ -2429,7 +2432,7 @@ void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s } else { recUly = uly; } - gDPFillRectangle((*dlist)++, recUlx, recUly, recLrx, recLry); + gDPFillRectangle((*dList)++, recUlx, recUly, recLrx, recLry); } ulx += temp_t3; uly += temp_t4; @@ -2439,9 +2442,9 @@ void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s i++; } - gDPPipeSync((*dlist)++); - gDPSetPrimColor((*dlist)++, 0, 0, 255, 255, 255, 255); - reset_render_settings(dlist); + gDPPipeSync((*dList)++); + gDPSetPrimColor((*dList)++, 0, 0, 255, 255, 255, 255); + reset_render_settings(dList); } void init_save_data(void) { @@ -8421,7 +8424,7 @@ s32 menu_track_select_loop(s32 updateRate) { settings = get_settings(); gOptionBlinkTimer = (gOptionBlinkTimer + updateRate) & 0x3F; - if (!get_thread30_need_to_load_level() && gMenuDelay != 0) { + if (bgload_active() == FALSE && gMenuDelay != 0) { if (gMenuDelay < 0) { gMenuDelay -= updateRate; } else { @@ -8882,17 +8885,17 @@ void trackmenu_track_view(s32 updateRate) { s32 y2; s32 i; - tick_thread30(); + bgload_tick(); for (i = 0; i < updateRate; i++) { gTrackSelectX += (gTrackSelectTargetX - gTrackSelectX) * 0.1; gTrackSelectY += (gTrackSelectTargetY - gTrackSelectY) * 0.1; } - if (gOpacityDecayTimer == 32 && !get_thread30_need_to_load_level()) { + if (gOpacityDecayTimer == 32 && bgload_active() == FALSE) { if (gTrackIdForPreview == gTrackmenuLoadedLevel) { gSelectedTrackX = gTrackSelectCursorX; gSelectedTrackY = gTrackSelectCursorY; } else if (gTrackIdForPreview != gTrackmenuLoadedLevel && gTrackIdForPreview != -1 && - set_level_to_load_in_background(gTrackIdForPreview, 1)) { + bgload_start(gTrackIdForPreview, 1)) { gTrackmenuLoadedLevel = gTrackIdForPreview; gSelectedTrackX = gTrackSelectCursorX; gSelectedTrackY = gTrackSelectCursorY; @@ -8951,7 +8954,7 @@ void trackmenu_input(s32 updateRate) { gMenuImages[5].scale = (f32) (sMenuImageProperties[5].scale * (1.0f + ((f32) scaleOffset / 20.0f))); } camEnableUserView(0, FALSE); - if (!get_thread30_need_to_load_level()) { + if (bgload_active() == FALSE) { if (gMenuDelay < 0) { sMenuMusicVolume -= updateRate * 4; } @@ -13025,7 +13028,7 @@ s32 menu_credits_loop(s32 updateRate) { isCreditsEnd = FALSE; mainTrackIds = (s8 *) get_misc_asset(ASSET_MISC_MAIN_TRACKS_IDS); creditsBackgroundLevelData = (CreditsBackgroundLevelData *) get_misc_asset(ASSET_MISC_69); - tick_thread30(); + bgload_tick(); if (gMenuDelay == 0) { disable_new_screen_transitions(); transition_begin(NULL); @@ -13229,12 +13232,12 @@ s32 menu_credits_loop(s32 updateRate) { switch (gMenuStage) { case 0: tempBackgroundLevelData = &creditsBackgroundLevelData[D_80126BCC]; - set_level_to_load_in_background(tempBackgroundLevelData->levelId, tempBackgroundLevelData->cutsceneId); + bgload_start(tempBackgroundLevelData->levelId, tempBackgroundLevelData->cutsceneId); gMenuStage = 1; gOpacityDecayTimer = 40; break; case 1: - if (!get_thread30_need_to_load_level()) { + if (bgload_active() == FALSE) { gMenuStage = 2; gOptionBlinkTimer = 40; D_80126BD8 = FALSE; @@ -13285,7 +13288,7 @@ s32 menu_credits_loop(s32 updateRate) { } if (gMenuDelay > 0) { gMenuDelay += updateRate; - if (!get_thread30_need_to_load_level() && gMenuDelay > 30) { + if (bgload_active() == FALSE && gMenuDelay > 30) { music_change_on(); credits_free(); load_level_for_menu(ASSET_LEVEL_FRONTEND, ZERO_PLAYERS, CUTSCENE_NONE); diff --git a/src/menu.h b/src/menu.h index 072ce17b..fc2c8213 100644 --- a/src/menu.h +++ b/src/menu.h @@ -683,13 +683,13 @@ s32 menu_credits_loop(s32 updateRate); void func_8007FFEC(s32 arg0); void set_gIntDisFlag(s8 setting); void init_save_data(void); -void func_80080580(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, +void func_80080580(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour, TextureHeader *tex); void fileselect_input_copy(s32 updateRate); s32 func_8008F618(Gfx **dList, MatrixS **mtx); void func_80080BC8(Gfx **); -void func_80080E90(Gfx **dlist, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, +void func_80080E90(Gfx **dList, s32 startX, s32 startY, s32 width, s32 height, s32 borderWidth, s32 borderHeight, s32 colour0, s32 colour1, s32 colour2, s32 colour3); void func_80084854(s32 updateRate); void func_80098774(s32); diff --git a/src/object_functions.c b/src/object_functions.c index 41b315db..c2e11d94 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -36,7 +36,7 @@ // Unsure about the signed/unsigned with these arrays. FadeTransition gTajTransformTransitionEnd = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_INVERT, FADE_COLOR_WHITE, 7, 3); -FadeTransition gTajTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, -1); +FadeTransition gTajTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, FADE_STAY); Vertex gCharacterFlagVertices[4] = { { -256, 256, 0, 255, 255, 255, 255 }, @@ -1922,10 +1922,10 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { for (i = 0; i < wizShipObj->unk60->unk0; i++) { index = wizShipObj->unk60->unk2C[i]; if ((index >= 0) && (index < wizShipModel->unk18)) { - if (wizShipObj->unk44 != NULL) { - posX = wizShipObj->unk44[wizShipModel->unk14[index]].x; - posY = wizShipObj->unk44[wizShipModel->unk14[index]].y; - posZ = wizShipObj->unk44[wizShipModel->unk14[index]].z; + if (wizShipObj->curVertData != NULL) { + posX = wizShipObj->curVertData[wizShipModel->unk14[index]].x; + posY = wizShipObj->curVertData[wizShipModel->unk14[index]].y; + posZ = wizShipObj->curVertData[wizShipModel->unk14[index]].z; guMtxXFMF(shipMtx, posX, posY, posZ, &posX, &posY, &posZ); newObject.x = posX; newObject.y = posY; @@ -4704,7 +4704,7 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { whatObjInteracted = interactObj->obj; if (whatObjInteracted != NULL && whatObjInteracted->segment.header->behaviorId == BHV_RACER) { racer = &whatObjInteracted->unk64->racer; - if (racer->vehicleID < VEHICLE_TRICKY || racer->playerIndex != PLAYER_COMPUTER) { + if (racer->vehicleID < VEHICLE_BOSSES || racer->playerIndex != PLAYER_COMPUTER) { prevBalloonType = racer->balloon_type; racer->balloon_type = weaponBalloonObj->properties.weaponBalloon.balloonID; if (prevBalloonType == racer->balloon_type && racer->balloon_quantity != 0) { diff --git a/src/object_models.c b/src/object_models.c index 35d61ad9..0e977b1a 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -8,6 +8,9 @@ #include "textures_sprites.h" #include "racer.h" #include "save_data.h" +#include "objects.h" + +#define MODEL_LOADED_MAX 70 /************ .data ************/ @@ -30,9 +33,9 @@ UNUSED const char D_800E6BE0[] = "MOD Error: Tryed to deallocate non-existent mo /************ .bss ************/ s32 *gObjectModelTable; -s32 *D_8011D624; +s32 *gModelCache; // A table of two entries. The first half is the model ID, while the second half is the model data. s32 *D_8011D628; -s32 D_8011D62C; +s32 gModelCacheCount; s32 gNumModelIDs; s32 D_8011D634; s16 *gAnimationTable; @@ -49,9 +52,9 @@ void allocate_object_model_pools(void) { s32 i; s32 checksum; - D_8011D624 = mempool_alloc_safe(0x230, COLOUR_TAG_GREEN); - D_8011D628 = mempool_alloc_safe(0x190, COLOUR_TAG_GREEN); - D_8011D62C = 0; + gModelCache = mempool_alloc_safe(MODEL_LOADED_MAX * ((sizeof(uintptr_t)) * 2), COLOUR_TAG_GREEN); + D_8011D628 = mempool_alloc_safe(100 * sizeof(uintptr_t), COLOUR_TAG_GREEN); + gModelCacheCount = 0; D_8011D634 = 0; gObjectModelTable = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_MODELS_TABLE); gNumModelIDs = 0; @@ -79,10 +82,11 @@ void allocate_object_model_pools(void) { /** * Load the associated model ID and assign it to the objects gfx data. * Also loads textures and animations. + * v79 and newer have a bugfix that revert the cache count if allocation fails. */ Object_68 *object_model_init(s32 modelID, s32 flags) { s32 i; - s32 sp50; + s32 cacheIndex; ObjectModel *objMdl; s32 sp48; s32 temp_s0; @@ -90,10 +94,10 @@ Object_68 *object_model_init(s32 modelID, s32 flags) { s8 sp3F; #if VERSION >= VERSION_79 s8 var_a2; - s8 var_a3; + s8 cacheChanged; #endif u32 compressedData; - s32 sp34; + s32 modelSize; if (modelID >= gNumModelIDs) { stubbed_printf(D_800E6B20); @@ -101,10 +105,10 @@ Object_68 *object_model_init(s32 modelID, s32 flags) { } // Check if the model already exists in the cache. - for (i = 0; i < D_8011D62C; i++) { - if (modelID == D_8011D624[(i << 1)]) { - objMdl = (ObjectModel *) D_8011D624[(i << 1) + 1]; - ret = func_8005FCD0(objMdl, flags); + for (i = 0; i < gModelCacheCount; i++) { + if (modelID == gModelCache[MODELCACHE_ID(i)]) { + objMdl = (ObjectModel *) gModelCache[MODELCACHE_DATA(i)]; + ret = model_init_type(objMdl, flags); if (ret != NULL) { objMdl->references++; } @@ -114,38 +118,38 @@ Object_68 *object_model_init(s32 modelID, s32 flags) { #if VERSION >= VERSION_79 var_a2 = FALSE; - var_a3 = FALSE; + cacheChanged = FALSE; #endif if (D_8011D634 > 0) { D_8011D634--; #if VERSION >= VERSION_79 var_a2 = TRUE; #endif - sp50 = D_8011D628[D_8011D634]; + cacheIndex = D_8011D628[D_8011D634]; } else { - sp50 = D_8011D62C; + cacheIndex = gModelCacheCount; #if VERSION >= VERSION_79 - var_a3 = TRUE; + cacheChanged = TRUE; #endif - D_8011D62C++; + gModelCacheCount++; } temp_s0 = gObjectModelTable[modelID]; sp48 = gObjectModelTable[modelID + 1] - temp_s0; - sp34 = get_asset_uncompressed_size(ASSET_OBJECT_MODELS, temp_s0) + 0x80; - objMdl = (ObjectModel *) mempool_alloc(sp34, COLOUR_TAG_RED); + modelSize = get_asset_uncompressed_size(ASSET_OBJECT_MODELS, temp_s0) + sizeof(ObjectModel); + objMdl = (ObjectModel *) mempool_alloc(modelSize, COLOUR_TAG_RED); if (objMdl == NULL) { #if VERSION >= VERSION_79 if (var_a2) { D_8011D634++; } - if (var_a3) { - D_8011D62C--; + if (cacheChanged) { + gModelCacheCount--; } #endif return NULL; } - compressedData = (u32) ((u8 *) objMdl + sp34) - sp48; + compressedData = (u32) ((u8 *) objMdl + modelSize) - sp48; load_asset_to_address(ASSET_OBJECT_MODELS, compressedData, temp_s0, sp48); gzip_inflate((u8 *) compressedData, (u8 *) objMdl); objMdl->textures = (TextureInfo *) ((s32) objMdl->textures + (u8 *) objMdl); @@ -179,21 +183,23 @@ Object_68 *object_model_init(s32 modelID, s32 flags) { } } if ((func_80060EA8(objMdl) == 0) && (func_80061A00(objMdl, modelID) == 0)) { - ret = func_8005FCD0(objMdl, flags); + ret = model_init_type(objMdl, flags); if (ret != NULL) { - D_8011D624[(sp50 << 1)] = modelID; - D_8011D624[(sp50 << 1) + 1] = (s32) objMdl; - if (D_8011D62C < 70) { - ret->unk20 = 0; + gModelCache[MODELCACHE_ID(cacheIndex)] = modelID; + gModelCache[MODELCACHE_DATA(cacheIndex)] = (s32) objMdl; + if (gModelCacheCount < MODEL_LOADED_MAX) { + ret->animUpdateTimer = 0; return ret; + } else { + stubbed_printf(D_800E6B64); } } } } block_30: #if VERSION >= VERSION_79 - if (var_a3) { - D_8011D62C--; + if (cacheChanged) { + gModelCacheCount--; } if (var_a2) { D_8011D634++; @@ -203,43 +209,43 @@ block_30: return NULL; } -Object_68 *func_8005FCD0(ObjectModel *model, s32 arg1) { +Object_68 *model_init_type(ObjectModel *model, s32 flags) { s32 temp; Object_68 *result; Vertex *var_v1; Vertex *vertex; Vertex *mdlVertex; - if ((model->numberOfAnimations != 0) && (arg1 & 8)) { - temp = ((model->numberOfVertices << 1) * 10) + 36; + if ((model->numberOfAnimations != 0) && (flags & OBJECT_SPAWN_ANIMATION)) { + temp = ((model->numberOfVertices * 2) * sizeof(Vertex)) + 36; result = (Object_68 *) mempool_alloc((model->unk4A * 6) + temp, COLOUR_TAG_BLUE); if (result == NULL) { return NULL; } - result->unk4[0] = (Vertex *) ((u8 *) result + 36); - result->unk4[1] = (Vertex *) ((u8 *) result + (model->numberOfVertices * 10) + 36); - result->unk4[2] = (Vertex *) ((u8 *) result + temp); - result->unk1E = 2; - } else if ((model->unk40 != NULL) && (arg1 & 1)) { - temp = (model->numberOfVertices * 10); - result = (Object_68 *) mempool_alloc(temp + 36, COLOUR_TAG_BLUE); + result->vertices[0] = (Vertex *) ((u8 *) result + 36); + result->vertices[1] = (Vertex *) ((u8 *) result + (model->numberOfVertices * sizeof(Vertex)) + 36); + result->vertices[2] = (Vertex *) ((u8 *) result + temp); + result->modelType = MODELTYPE_ANIMATED; + } else if ((model->unk40 != NULL) && (flags & OBJECT_SPAWN_UNK01)) { + temp = (model->numberOfVertices * sizeof(Vertex)) + 36; + result = (Object_68 *) mempool_alloc(temp, COLOUR_TAG_BLUE); if (result == NULL) { return NULL; } var_v1 = (Vertex *) ((u8 *) result + 36); - result->unk4[0] = var_v1; - result->unk4[1] = var_v1; - result->unk4[2] = NULL; - result->unk1E = 1; + result->vertices[0] = var_v1; + result->vertices[1] = var_v1; + result->vertices[2] = NULL; + result->modelType = MODELTYPE_SHADE; } else { result = (Object_68 *) mempool_alloc(36, COLOUR_TAG_BLUE); if (result == NULL) { return NULL; } - result->unk4[0] = model->vertices; - result->unk4[1] = model->vertices; - result->unk4[2] = NULL; - result->unk1E = 0; + result->vertices[0] = model->vertices; + result->vertices[1] = model->vertices; + result->vertices[2] = NULL; + result->modelType = MODELTYPE_BASIC; } result->offsetX = 0; result->offsetY = 0; @@ -248,9 +254,10 @@ Object_68 *func_8005FCD0(ObjectModel *model, s32 arg1) { result->animationID = -1; result->animationFrame = -1; result->animationTaskNum = 0; - if (result->unk1E != 0) { + // Shaded models need to be double buffered, so duplicate them. + if (result->modelType != MODELTYPE_BASIC) { temp = 0; - vertex = result->unk4[0]; + vertex = result->vertices[0]; mdlVertex = &model->vertices[0]; do { vertex->x = mdlVertex->x; @@ -266,7 +273,7 @@ Object_68 *func_8005FCD0(ObjectModel *model, s32 arg1) { } while (temp < model->numberOfVertices); temp = 0; - vertex = result->unk4[1]; + vertex = result->vertices[1]; mdlVertex = &model->vertices[0]; do { vertex->x = mdlVertex->x; @@ -293,30 +300,33 @@ void free_3d_model(ObjectModel **modelPtr) { ObjectModel *model; s32 i; - if (modelPtr != 0) { - model = *modelPtr; - model->references--; - if (model->references > 0) { // Model is still used, so free the reference and return. - mempool_free(modelPtr); - return; - } + if (modelPtr == 0) { + stubbed_printf(D_800E6BC0); + return; + } - modelIndex = -1; - for (i = 0; i < D_8011D62C; i++) { - if ((s32) model == D_8011D624[(i << 1) + 1]) { - modelIndex = i; - } - } + model = *modelPtr; + model->references--; + if (model->references > 0) { // Model is still used, so free the reference and return. + mempool_free(modelPtr); + return; + } - if (modelIndex != -1) { - free_model_data(model); - D_8011D628[D_8011D634] = modelIndex; - D_8011D634++; - D_8011D624[modelIndex << 1] = -1; - D_8011D624[(modelIndex << 1) + 1] = -1; - mempool_free(modelPtr); + modelIndex = -1; + for (i = 0; i < gModelCacheCount; i++) { + if (model == (ObjectModel *) gModelCache[MODELCACHE_DATA(i)]) { + modelIndex = i; } } + + if (modelIndex != -1) { + free_model_data(model); + D_8011D628[D_8011D634] = modelIndex; + D_8011D634++; + gModelCache[MODELCACHE_ID(modelIndex)] = -1; + gModelCache[MODELCACHE_DATA(modelIndex)] = -1; + mempool_free(modelPtr); + } } /** diff --git a/src/object_models.h b/src/object_models.h index 3212aed6..2492e59d 100644 --- a/src/object_models.h +++ b/src/object_models.h @@ -5,6 +5,15 @@ #include "PR/gbi.h" #include "structs.h" +#define MODELCACHE_ID(x) ((x << 1) + 0) +#define MODELCACHE_DATA(x) ((x << 1) + 1) + +typedef enum AnimType { + MODELTYPE_BASIC, // No shading nor animation + MODELTYPE_SHADE, // Model is intended to be shaded. + MODELTYPE_ANIMATED // Model has animation and shading. +} AnimType ; + /* 8 Bytes */ typedef struct unk8011D624 { s32 unk0; @@ -20,7 +29,7 @@ void func_80061C0C(Object* obj); void free_3d_model(ObjectModel **modelPtr); s32 func_80061A00(ObjectModel *model, s32 animTableIndex); s32 check_nearby_vertices(Vertex *vertices, s32 arg1, s32 arg2, s32 arg3, s32 arg4); -Object_68 *func_8005FCD0(ObjectModel *model, s32 arg1); +Object_68 *model_init_type(ObjectModel *model, s32 flags); Object_68 *object_model_init(s32 modelID, s32 flags); void free_model_data(ObjectModel *mdl); // Non Matching diff --git a/src/objects.c b/src/objects.c index 5f939c16..f0bec331 100644 --- a/src/objects.c +++ b/src/objects.c @@ -33,7 +33,6 @@ #define OBJECT_POOL_SIZE 0x15800 #define OBJECT_SPAWN_HEAP_SIZE 0x800 #define OBJECT_SLOT_COUNT 512 -#define ASSET_OBJECT_HEADER_TABLE_LENGTH 304 // This isn't important, but it's the number of object headers #define AINODE_COUNT 128 #define CAMCONTROL_COUNT 20 @@ -165,7 +164,7 @@ u32 gMagnetColours[3] = { COLOUR_RGBA32(16, 64, 255, 0), // Level 2 COLOUR_RGBA32(16, 255, 64, 0), // Level 3 }; -FadeTransition gRaceEndFade = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 40, -1); +FadeTransition gRaceEndFade = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 40, FADE_STAY); FadeTransition gRaceEndTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_BLACK, 40, 0); /*******************************/ @@ -250,8 +249,8 @@ s8 D_8011AE01; // A boolean? I've seen it either as 0 or 1 s8 gIsNonCarRacers; s8 gIsSilverCoinRace; Object *D_8011AE08[16]; -ObjectHeader *(*gLoadedObjectHeaders)[ASSET_OBJECT_HEADER_TABLE_LENGTH]; -u8 (*gObjectHeaderReferences)[ASSET_OBJECT_HEADER_TABLE_LENGTH]; +ObjectHeader *(*gLoadedObjectHeaders)[ASSET_OBJECTS_COUNT]; +u8 (*gObjectHeaderReferences)[ASSET_OBJECTS_COUNT]; TextureHeader *D_8011AE50; TextureHeader *D_8011AE54; Object **gObjPtrList; // Not sure about the number of elements @@ -1132,7 +1131,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { spawnObjFlags |= 0x10; } } - if (vehicle >= VEHICLE_TRICKY) { + if (vehicle >= VEHICLE_BOSSES) { spawnObjFlags = 1; func_800619F4(0); } @@ -1175,7 +1174,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { curRacer->bananas = 10; } } - if ((gameMode != GAMEMODE_MENU || D_8011AD3C == 2) && vehicle < VEHICLE_TRICKY) { + if ((gameMode != GAMEMODE_MENU || D_8011AD3C == 2) && vehicle < VEHICLE_BOSSES) { curRacer->vehicleSound = func_80004B40(curRacer->characterId, curRacer->vehicleID); } else { curRacer->vehicleSound = NULL; @@ -1270,8 +1269,8 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { var_s4 = (var_s4 + 1) & 1; for (i2 = 0; i2 < curRacerObj->segment.header->numberOfModelIds; i2++) { if (curRacerObj->unk68[i2] != NULL) { - if (curRacerObj->unk68[i2]->unk20 != 0) { - curRacerObj->unk68[i2]->unk20 = (var_s4 * 2); + if (curRacerObj->unk68[i2]->animUpdateTimer != 0) { + curRacerObj->unk68[i2]->animUpdateTimer = (var_s4 * 2); } } } @@ -1279,8 +1278,8 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { // curRacer is a human racer. for (i2 = 0; i2 < curRacerObj->segment.header->numberOfModelIds; i2++) { if (curRacerObj->unk68[i2] != NULL) { - if (curRacerObj->unk68[i2]->unk20 != 0) { - curRacerObj->unk68[i2]->unk20 = 0; + if (curRacerObj->unk68[i2]->animUpdateTimer != 0) { + curRacerObj->unk68[i2]->animUpdateTimer = 0; } } } @@ -1469,7 +1468,7 @@ void transform_player_vehicle(void) { settings = get_settings(); spawnObj.unkE = 0; spawnObj.common.size = 16; - if (gOverworldVehicle < VEHICLE_TRICKY) { + if (gOverworldVehicle < VEHICLE_BOSSES) { objectID = ((s16 *) D_800DC7A8)[settings->racers[PLAYER_ONE].character + gOverworldVehicle * 10]; } else { objectID = D_800DC7B8[gOverworldVehicle + 37]; @@ -1614,21 +1613,21 @@ Object **objGetObjList(s32 *arg0, s32 *cnt) { /** * Return the number of objects currently existing. */ -UNUSED s32 get_object_count(void) { +UNUSED s32 obj_count(void) { return gObjectCount; } /** * Return the number of particles currently existing. */ -UNUSED s32 get_particle_count(void) { +UNUSED s32 particle_count(void) { return gParticleCount; } -void func_8000E9D0(Object *arg0) { - arg0->segment.trans.flags |= OBJ_FLAGS_DEACTIVATED; - func_800245B4(arg0->segment.object.unk2C | (OBJ_FLAGS_DEACTIVATED | OBJ_FLAGS_INVISIBLE)); - gObjPtrList[gObjectCount++] = arg0; +void func_8000E9D0(Object *obj) { + obj->segment.trans.flags |= OBJ_FLAGS_DEACTIVATED; + func_800245B4(obj->segment.object.unk2C | (OBJ_FLAGS_DEACTIVATED | OBJ_FLAGS_INVISIBLE)); + gObjPtrList[gObjectCount++] = obj; if (1) {} // Fakematch gParticleCount++; } @@ -2293,7 +2292,7 @@ void func_80010994(s32 updateRate) { racer->prev_z_position = (f32) (*gRacers)[i]->segment.trans.z_position; } i = 1; // FAKEMATCH - func_800142B8(); + obj_tick_anims(); process_object_interactions(); func_8001E89C(); for (i = 0; i < D_8011AE70; i++) { @@ -2896,37 +2895,38 @@ void render_3d_model(Object *obj) { } else { racerObj = NULL; } - if (obj68->unk20 <= 0) { - obj->unk44 = (Vertex *) obj68->unk4[obj68->animationTaskNum]; - if (obj68->unk1E == 2) { - object_animate(obj); + if (obj68->animUpdateTimer <= 0) { + obj->curVertData = (Vertex *) obj68->vertices[obj68->animationTaskNum]; + if (obj68->modelType == MODELTYPE_ANIMATED) { + obj_animate(obj); } - if (obj68->unk1E && objModel->unk40 != NULL) { + if (obj68->modelType != MODELTYPE_BASIC && objModel->unk40 != NULL) { flags = TRUE; - if (racerObj != NULL && racerObj->vehicleID < VEHICLE_TRICKY && + if (racerObj != NULL && racerObj->vehicleID < VEHICLE_BOSSES && racerObj->playerIndex == PLAYER_COMPUTER) { flags = FALSE; } if (get_viewport_count() != VIEWPORTS_COUNT_1_PLAYER) { flags = FALSE; } - obj->unk44 = (Vertex *) obj68->unk4[obj68->animationTaskNum]; + obj->curVertData = (Vertex *) obj68->vertices[obj68->animationTaskNum]; if (obj->behaviorId == BHV_UNK_3F) { // 63 = stopwatchicon, stopwatchhand - calc_dyn_light_and_env_map_for_object(objModel, obj, 0, gCurrentLightIntensity); + obj_shade_fancy(objModel, obj, 0, gCurrentLightIntensity); } else if (flags) { - calc_dyn_light_and_env_map_for_object(objModel, obj, -1, gCurrentLightIntensity); + obj_shade_fancy(objModel, obj, -1, gCurrentLightIntensity); } else { - func_800245F0(objModel, obj, gCurrentLightIntensity); + obj_shade_fast(objModel, obj, gCurrentLightIntensity); } } + // Set the animation ticker for non player racers to 2, making them animate at half the framerate. if ((racerObj != NULL) && (racerObj->playerIndex == PLAYER_COMPUTER) && - (racerObj->vehicleID < VEHICLE_TRICKY)) { - obj68->unk20 = 2; + (racerObj->vehicleID < VEHICLE_BOSSES)) { + obj68->animUpdateTimer = 2; } else { - obj68->unk20 = 1; + obj68->animUpdateTimer = 1; } } - obj->unk44 = (Vertex *) obj68->unk4[obj68->animationTaskNum]; + obj->curVertData = (Vertex *) obj68->vertices[obj68->animationTaskNum]; if (obj->behaviorId == BHV_DOOR) { func_80011264(objModel, obj); } @@ -2938,7 +2938,7 @@ void render_3d_model(Object *obj) { spB0 = FALSE; if (racerObj != NULL) { object_undo_player_tumble(obj); - if (obj->segment.object.animationID == 0 || racerObj->vehicleID >= VEHICLE_TRICKY) { + if (obj->segment.object.animationID == 0 || racerObj->vehicleID >= VEHICLE_BOSSES) { apply_head_turning_matrix(&gObjectCurrDisplayList, &gObjectCurrMatrix, obj68, racerObj->headAngle); spB0 = TRUE; } else { @@ -2995,9 +2995,9 @@ void render_3d_model(Object *obj) { index = obj->unk60->unk2C[i]; if (index >= 0 && index < objModel->unk18) { something = loopObj->unk68[loopObj->segment.object.modelIndex]; - vtxX = obj->unk44[objModel->unk14[index]].x; - vtxY = obj->unk44[objModel->unk14[index]].y; - vtxZ = obj->unk44[objModel->unk14[index]].z; + vtxX = obj->curVertData[objModel->unk14[index]].x; + vtxY = obj->curVertData[objModel->unk14[index]].y; + vtxZ = obj->curVertData[objModel->unk14[index]].z; loopObj->segment.trans.x_position += vtxX; loopObj->segment.trans.y_position += vtxY; loopObj->segment.trans.z_position += vtxZ; @@ -3051,9 +3051,9 @@ void render_3d_model(Object *obj) { if (index >= 0 && index < objModel->unk18) { flags = (RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_Z_UPDATE); something = loopObj->unk68[loopObj->segment.object.modelIndex]; - vtxX = obj->unk44[objModel->unk14[index]].x; - vtxY = obj->unk44[objModel->unk14[index]].y; - vtxZ = obj->unk44[objModel->unk14[index]].z; + vtxX = obj->curVertData[objModel->unk14[index]].x; + vtxY = obj->curVertData[objModel->unk14[index]].y; + vtxZ = obj->curVertData[objModel->unk14[index]].z; loopObj->segment.trans.x_position += (vtxX - loopObj->segment.trans.x_position) * 0.25; loopObj->segment.trans.y_position += (vtxY - loopObj->segment.trans.y_position) * 0.25; loopObj->segment.trans.z_position += (vtxZ - loopObj->segment.trans.z_position) * 0.25; @@ -3089,24 +3089,24 @@ void func_80012C30(void) { D_8011ADA4 = 0; } -void func_80012C3C(Gfx **dlist) { +void func_80012C3C(Gfx **dList) { s32 i; for (i = 0; i < D_8011ADA4; i++) { - gSPDisplayList((*dlist)++, D_8011AD78[i]); + gSPDisplayList((*dList)++, D_8011AD78[i]); } } -void func_80012C98(Gfx **dlist) { +void func_80012C98(Gfx **dList) { if (D_8011ADA4 < 9) { - gSPNoOp((*dlist)++); // Placeholder instruction? - D_8011AD78[D_8011ADA4] = *dlist; + gSPNoOp((*dList)++); // Placeholder instruction? + D_8011AD78[D_8011ADA4] = *dList; } } -void func_80012CE8(Gfx **dlist) { +void func_80012CE8(Gfx **dList) { if (D_8011ADA4 < 9) { - gSPEndDisplayList((*dlist)++); - gSPBranchList(D_8011AD78[D_8011ADA4] - 1, *dlist); + gSPEndDisplayList((*dList)++); + gSPBranchList(D_8011AD78[D_8011ADA4] - 1, *dList); D_8011ADA4++; } } @@ -3151,7 +3151,7 @@ void object_do_player_tumble(Object *this) { this->segment.trans.rotation.x_rotation += sp_20->x_rotation_offset; this->segment.trans.rotation.z_rotation += sp_20->z_rotation_offset; offsetY = 0.0f; - if (sp_20->vehicleIDPrev < VEHICLE_TRICKY) { + if (sp_20->vehicleIDPrev < VEHICLE_BOSSES) { offsetY = coss_f(sp_20->z_rotation_offset); tmp_f2 = offsetY; @@ -3224,9 +3224,9 @@ void func_80012F94(Object *obj) { batchNum = 0; } else { // Loads vehicles between VEHICLE_TRICKY and VEHICLE_SMOKEY. So all boss vehicles except wizpig. - var_t0 = objRacer->vehicleID + VEHICLE_TRICKY; + var_t0 = objRacer->vehicleID + VEHICLE_BOSSES; if (objRacer->vehicleID >= NUMBER_OF_PLAYER_VEHICLES) { - var_t0 = VEHICLE_TRICKY; + var_t0 = VEHICLE_BOSSES; } batchNum = 0; bossAsset = (u8 *) get_misc_asset(var_t0); // 40 bytes of data u8[8][5]? @@ -3452,7 +3452,7 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o shear *= scale; gfxData = gShieldEffectObject->unk68[shieldType]; mdl = gfxData->objModel; - gShieldEffectObject->unk44 = (Vertex *) gfxData->unk4[gfxData->animationTaskNum]; + gShieldEffectObject->curVertData = (Vertex *) gfxData->vertices[gfxData->animationTaskNum]; gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); if (racer->shieldTimer < 64) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, racer->shieldTimer * 4); @@ -3516,7 +3516,7 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o gMagnetEffectObject->segment.trans.rotation.z_rotation = 0; gfxData = *gMagnetEffectObject->unk68; mdl = gfxData->objModel; - gMagnetEffectObject->unk44 = (Vertex *) gfxData->unk4[gfxData->animationTaskNum]; + gMagnetEffectObject->curVertData = (Vertex *) gfxData->vertices[gfxData->animationTaskNum]; opacity = ((D_8011B078[var_t0].g * 8) & 0x7F) + 0x80; func_8007F594(&gObjectCurrDisplayList, 2, COLOUR_RGBA32(255, 255, 255, opacity), gMagnetColours[racer->magnetModelID]); @@ -3536,7 +3536,12 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o #pragma GLOBAL_ASM("asm/nonmatchings/objects/func_80014090.s") -void func_800142B8(void) { +/** + * Loop through every object. + * Check which ones have 3D models and count down the update timer. + * The object will update its animation at 0. + */ +void obj_tick_anims(void) { s32 i = gObjectListStart; s32 j; Object *currObj; @@ -3548,9 +3553,9 @@ void func_800142B8(void) { currObj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (j = 0; j < currObj->segment.header->numberOfModelIds; j++) { curr_68 = currObj->unk68[j]; - if (curr_68 != NULL && curr_68->unk20 > 0) { - curr_68->unk20 &= 0x03; - curr_68->unk20--; + if (curr_68 != NULL && curr_68->animUpdateTimer > 0) { + curr_68->animUpdateTimer &= 3; + curr_68->animUpdateTimer--; } } } @@ -3575,9 +3580,9 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s s32 texToSetFlags; Triangle *tris; s32 vertOffset; - Gfx *dlist; + Gfx *dList; - dlist = gObjectCurrDisplayList; + dList = gObjectCurrDisplayList; i = startIndex; endLoop = FALSE; while (i < objModel->numberOfBatches && !endLoop) { @@ -3592,7 +3597,7 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s offsetStartVertex = (someBool) ? objModel->batches[i].unk1 : numVertices; numTris = objModel->batches[i + 1].facesOffset - triOffset; tris = &objModel->triangles[triOffset]; - vtx = &obj->unk44[vertOffset]; + vtx = &obj->curVertData[vertOffset]; textureIndex = objModel->batches[i].textureIndex; // textureIndex of 0xFF is no texture if (textureIndex == 0xFF) { @@ -3610,27 +3615,27 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s texToSetFlags |= RENDER_SEMI_TRANSPARENT; } if (gObjectTexAnim == FALSE) { - load_and_set_texture(&dlist, texToSet, texToSetFlags, texOffset); + load_and_set_texture(&dList, texToSet, texToSetFlags, texOffset); } else { texToSet = set_animated_texture_header(texToSet, texOffset); gDkrDmaDisplayList(gObjectCurrDisplayList++, OS_K0_TO_PHYSICAL(texToSet->cmd), texToSet->numberOfCommands); } if (offsetStartVertex == numVertices) { - gSPVertexDKR(dlist++, OS_K0_TO_PHYSICAL(vtx), numVertices, 0); + gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(vtx), numVertices, 0); } else { if (offsetStartVertex > 0) { - gSPVertexDKR(dlist++, OS_K0_TO_PHYSICAL(vtx), offsetStartVertex, 0); - gDkrInsertMatrix(dlist++, 0, G_MTX_DKR_INDEX_2); - gSPVertexDKR(dlist++, OS_K0_TO_PHYSICAL(&vtx[offsetStartVertex]), + gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(vtx), offsetStartVertex, 0); + gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_2); + gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(&vtx[offsetStartVertex]), (numVertices - offsetStartVertex), 1); } else { - gDkrInsertMatrix(dlist++, 0, G_MTX_DKR_INDEX_2); - gSPVertexDKR(dlist++, OS_K0_TO_PHYSICAL(vtx), numVertices, 0); + gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_2); + gSPVertexDKR(dList++, OS_K0_TO_PHYSICAL(vtx), numVertices, 0); } - gDkrInsertMatrix(dlist++, 0, G_MTX_DKR_INDEX_1); + gDkrInsertMatrix(dList++, 0, G_MTX_DKR_INDEX_1); } - gSPPolygon(dlist++, OS_K0_TO_PHYSICAL(tris), numTris, texEnabled); + gSPPolygon(dList++, OS_K0_TO_PHYSICAL(tris), numTris, texEnabled); } i++; } else { @@ -3640,7 +3645,7 @@ s32 render_mesh(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s if (i >= objModel->numberOfBatches) { i = -1; } - gObjectCurrDisplayList = dlist; + gObjectCurrDisplayList = dList; return i; } @@ -4051,7 +4056,7 @@ void func_80016748(Object *obj0, Object *obj1) { f32 radius; Object_68 *obj68; - if (obj1->unk44 != NULL) { + if (obj1->curVertData != NULL) { obj68 = (*obj1->unk68); objModel = obj68->objModel; xDiff = obj0->segment.trans.x_position - obj1->segment.trans.x_position; @@ -4062,9 +4067,9 @@ void func_80016748(Object *obj0, Object *obj1) { obj1Interact = obj1->interactObj; object_transform_to_matrix((float(*)[4]) obj1TransformMtx, &obj1->segment.trans); for (i = 0; i < objModel->unk20; i += 2) { - xDiff = obj1->unk44[objModel->unk1C[i]].x; - yDiff = obj1->unk44[objModel->unk1C[i]].y; - zDiff = obj1->unk44[objModel->unk1C[i]].z; + xDiff = obj1->curVertData[objModel->unk1C[i]].x; + yDiff = obj1->curVertData[objModel->unk1C[i]].y; + zDiff = obj1->curVertData[objModel->unk1C[i]].z; guMtxXFMF((float(*)[4]) obj1TransformMtx, xDiff, yDiff, zDiff, &xDiff, &yDiff, &zDiff); temp = (((f32) objModel->unk1C[i + 1] / 64) * obj1->segment.trans.scale) * 50.0; xDiff -= obj0->segment.trans.x_position; @@ -4673,10 +4678,10 @@ void race_finish_time_trial(void) { if (gTimeTrialStaffGhost) { tt_ghost_beaten(get_current_map_id(), &bestRacer->playerIndex); } else { - play_time_trial_end_message(&bestRacer->playerIndex); + hud_time_trial_message(&bestRacer->playerIndex); } } else { - play_time_trial_end_message(&bestRacer->playerIndex); + hud_time_trial_message(&bestRacer->playerIndex); } } } @@ -4781,7 +4786,7 @@ void tt_ghost_beaten(s32 arg0, s16 *playerId) { gBeatStaffGhost = FALSE; return; } - play_time_trial_end_message(playerId); + hud_time_trial_message(playerId); } /** @@ -5035,18 +5040,18 @@ Object *get_racer_object_by_port(s32 index) { * Unused function that would've iterated through all active checkpoints to render their visual nodes. * The function it calls is completely stubbed out. */ -UNUSED void debug_render_checkpoints(Gfx **dlist, MatrixS **mtx, Vertex **vtx) { +UNUSED void debug_render_checkpoints(Gfx **dList, MatrixS **mtx, Vertex **vtx) { s32 i; - load_and_set_texture_no_offset(dlist, NULL, RENDER_Z_COMPARE); + load_and_set_texture_no_offset(dList, NULL, RENDER_Z_COMPARE); if (gNumberOfCheckpoints > 3) { for (i = 0; i < gNumberOfCheckpoints; i++) { // Ground path - debug_render_checkpoint_node(i, 0, dlist, mtx, vtx); + debug_render_checkpoint_node(i, 0, dList, mtx, vtx); } for (i = 0; i < gNumberOfCheckpoints; i++) { // Air path - debug_render_checkpoint_node(i, 1, dlist, mtx, vtx); + debug_render_checkpoint_node(i, 1, dList, mtx, vtx); } } } @@ -5652,7 +5657,7 @@ void update_envmap_position(f32 x, f32 y, f32 z) { * If the triangle batch allows for it, compute envmap normals for the mesh. * Some objects will prefer some extra additions on top before calculating, like light intensity. */ -void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 intensity) { +void obj_shade_fancy(ObjectModel *model, Object *object, s32 arg2, f32 intensity) { s16 environmentMappingEnabled; s32 dynamicLightingEnabled; s16 i; @@ -6325,7 +6330,7 @@ void mode_init_taj_race(void) { gIsTajChallenge = racer->vehicleID + 1; checkpointNode = func_800230D0(racerObj, racer); racer->cameraYaw = 0x8000 - racer->steerVisualRotation; - racer->unk1FC = 0; + racer->wrongWayCounter = 0; racer->startInput = 0; racer->courseCheckpoint = 0; racer->checkpoint = 0; @@ -6473,7 +6478,7 @@ void mode_end_taj_race(s32 reason) { set_next_taj_challenge_menu(4); } obj->properties.common.unk0 = 31; - set_taj_status(2); + set_taj_status(TAJ_TELEPORT); } else { music_change_on(); music_stop(); @@ -7052,7 +7057,7 @@ s32 obj_init_property_flags(s32 behaviorId) { s32 flags = OBJECT_SPAWN_NONE; switch (behaviorId) { case BHV_RACER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_UNK08 | + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_SCENERY: @@ -7062,7 +7067,7 @@ s32 obj_init_property_flags(s32 behaviorId) { flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK04 | OBJECT_SPAWN_INTERACTIVE; break; case BHV_DINO_WHALE: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_DOOR: case BHV_TT_DOOR: @@ -7076,20 +7081,20 @@ s32 obj_init_property_flags(s32 behaviorId) { case BHV_HIT_TESTER_2: case BHV_SNOWBALL: case BHV_SNOWBALL_2: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE | + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_SNOWBALL_3: case BHV_SNOWBALL_4: case BHV_HIT_TESTER_3: case BHV_HIT_TESTER_4: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_UNK_18: flags = OBJECT_SPAWN_UNK04; break; case BHV_STOPWATCH_MAN: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_BANANA: case BHV_WORLD_KEY: @@ -7101,22 +7106,22 @@ s32 obj_init_property_flags(s32 behaviorId) { flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_BRIDGE_WHALE_RAMP: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_UNK20; break; case BHV_RAMP_SWITCH: flags = OBJECT_SPAWN_INTERACTIVE | OBJECT_SPAWN_SHADOW; break; case BHV_SEA_MONSTER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_COLLECT_EGG: flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_INTERACTIVE; break; case BHV_UNK_30: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_UNK_3F: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_ANIMATION; break; case BHV_ANIMATED_OBJECT: case BHV_VEHICLE_ANIMATION: @@ -7124,10 +7129,10 @@ s32 obj_init_property_flags(s32 behaviorId) { case BHV_WIZPIG_SHIP: case BHV_ANIMATED_OBJECT_4: case BHV_PIG_ROCKETEER: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_CHARACTER_SELECT: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_TROPHY_CABINET: case BHV_DYNAMIC_LIGHT_OBJECT_2: @@ -7139,7 +7144,7 @@ s32 obj_init_property_flags(s32 behaviorId) { flags = OBJECT_SPAWN_UNK01; break; case BHV_ANIMATED_OBJECT_2: - flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_EXIT: case BHV_CHECKPOINT: @@ -7169,10 +7174,10 @@ s32 obj_init_property_flags(s32 behaviorId) { flags = OBJECT_SPAWN_SHADOW; break; case BHV_PARK_WARDEN: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08 | OBJECT_SPAWN_INTERACTIVE; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION | OBJECT_SPAWN_INTERACTIVE; break; case BHV_FROG: - flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_UNK08; + flags = OBJECT_SPAWN_UNK01 | OBJECT_SPAWN_SHADOW | OBJECT_SPAWN_ANIMATION; break; case BHV_UNK_72: flags = OBJECT_SPAWN_UNK01; diff --git a/src/objects.h b/src/objects.h index c6fadd96..0a7ac902 100644 --- a/src/objects.h +++ b/src/objects.h @@ -176,7 +176,7 @@ enum ObjectSpawnFlags { OBJECT_SPAWN_UNK01 = (1 << 0), OBJECT_SPAWN_SHADOW = (1 << 1), OBJECT_SPAWN_UNK04 = (1 << 2), - OBJECT_SPAWN_UNK08 = (1 << 3), + OBJECT_SPAWN_ANIMATION = (1 << 3), OBJECT_SPAWN_INTERACTIVE = (1 << 4), OBJECT_SPAWN_UNK20 = (1 << 5) }; @@ -359,9 +359,9 @@ u8 is_time_trial_enabled(void); u8 is_in_time_trial(void); Object *get_object(s32 index); Object **objGetObjList(s32 *arg0, s32 *cnt); -s32 get_object_count(void); -s32 get_particle_count(void); -void func_8000E9D0(Object *arg0); +s32 obj_count(void); +s32 particle_count(void); +void func_8000E9D0(Object *obj); void free_object(Object *); s32 obj_table_ids(void); s32 obj_id_valid(s32 arg0); @@ -370,14 +370,14 @@ s32 get_race_countdown(void); s32 get_race_start_timer(void); void ignore_bounds_check(void); void func_80012C30(void); -void func_80012C3C(Gfx **dlist); -void func_80012C98(Gfx **dlist); -void func_80012CE8(Gfx **dlist); +void func_80012C3C(Gfx **dList); +void func_80012C98(Gfx **dList); +void func_80012CE8(Gfx **dList); void render_object(Gfx **dList, MatrixS **mtx, Vertex **verts, Object *obj); void object_undo_player_tumble(Object *obj); void render_object_parts(Object *obj); void unset_temp_model_transforms(Object *obj); -void func_800142B8(void); +void obj_tick_anims(void); u32 func_800179D0(void); void set_taj_challenge_type(s32 vehicleID); s16 get_taj_challenge_type(void); @@ -409,7 +409,7 @@ Object *ainode_tail(s32 *nodeID); Object *ainode_get(s32 nodeID); void set_world_shading(f32 brightness, f32 ambient, s16 angleX, s16 angleY, s16 angleZ); void set_shading_properties(ShadeProperties *arg0, f32 brightness, f32 ambient, s16 angleX, s16 angleY, s16 angleZ); -void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 intensity); +void obj_shade_fancy(ObjectModel *model, Object *object, s32 arg2, f32 intensity); s32 *get_misc_asset(s32 index); s32 func_8001E2EC(s32 arg0); void func_8001E344(s32 arg0); @@ -503,6 +503,17 @@ void func_8001E4C4(void); void func_8000B020(s32 numberOfVertices, s32 numberOfTriangles); s32 func_80014B50(s32 arg0, s32 arg1, f32 arg2, u32 arg3); +/** + * Faster variant of the shading function for objects. + * Unlike the fancy option, does not calculate envmaps. +*/ +void obj_shade_fast(ObjectModel *model, Object * obj, f32 intensity); + +/** + * Animation function for objects. Does per-vertex transformation. +*/ +s32 obj_animate(Object *obj); + //Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); void calc_dynamic_lighting_for_object_2(Object *, ObjectModel *, s16, f32); @@ -531,8 +542,6 @@ CheckpointNode *func_800230D0(Object*, Object_Racer*); void func_80010994(s32 updateRate); void func_800159C8(Object *, Object *); void func_80011264(ObjectModel *, Object *); -void func_800245F0(ObjectModel *, Object *, f32); //asm func in unknown_0251F0 -s32 object_animate(Object *obj); s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3); // NON MATCHING #endif diff --git a/src/printf.c b/src/printf.c index 45a9a740..0a565afd 100644 --- a/src/printf.c +++ b/src/printf.c @@ -353,7 +353,7 @@ UNUSED s32 debug_text_width(const char *format, ...) { } #ifdef NON_EQUIVALENT -s32 func_800B653C(Gfx **dlist, char *buffer) { +s32 func_800B653C(Gfx **dList, char *buffer) { char *bufferSave; s32 var_a1; s32 xOffset; @@ -382,7 +382,7 @@ s32 func_800B653C(Gfx **dlist, char *buffer) { blue = *nextBuffer++; alpha = *nextBuffer++; if (gDebugTextOn) { - gDPSetEnvColor((*dlist)++, red, green, blue, alpha); + gDPSetEnvColor((*dList)++, red, green, blue, alpha); } break; case 0x85: @@ -391,12 +391,12 @@ s32 func_800B653C(Gfx **dlist, char *buffer) { blue = *nextBuffer++; alpha = *nextBuffer++; if (!gDebugTextOn) { - gDPSetPrimColor((*dlist)++, 0, 0, red, green, blue, alpha); + gDPSetPrimColor((*dList)++, 0, 0, red, green, blue, alpha); } break; case 0x82: if (!gDebugTextOn) { - debug_text_background(dlist, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); } gDebugTextX = *nextBuffer++; gDebugTextX |= *nextBuffer++ << 8; @@ -409,14 +409,14 @@ s32 func_800B653C(Gfx **dlist, char *buffer) { } else { xOffset = 6; if (*buffer != 0x20) { - xOffset = debug_text_character(dlist, *buffer); + xOffset = debug_text_character(dList, *buffer); } } } else { switch (*buffer) { case 10: if (!gDebugTextOn) { - debug_text_background(dlist, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); } debug_text_newline(); D_80127CB0 = gDebugTextX; @@ -438,7 +438,7 @@ s32 func_800B653C(Gfx **dlist, char *buffer) { gDebugTextX += xOffset; if (var_a1 < gDebugTextX) { if (!gDebugTextOn) { - debug_text_background(dlist, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); } debug_text_newline(); D_80127CB0 = gDebugTextX; diff --git a/src/racer.c b/src/racer.c index be5064bc..909708cf 100644 --- a/src/racer.c +++ b/src/racer.c @@ -105,7 +105,7 @@ s8 D_800DCDB0[16][2] = { // Checksum count for obj_loop_goldenballoon s32 gObjLoopGoldenBalloonChecksum = ObjLoopGoldenBalloonChecksum; -FadeTransition gDoorFadeTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 50, -1); +FadeTransition gDoorFadeTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 50, FADE_STAY); /*******************************/ @@ -1705,7 +1705,7 @@ void racer_attack_handler_plane(Object *obj, Object_Racer *racer) { if (racer->unk1C9 == 8) { racer->unk1C9 = 0; } - if (racer->vehicleID < VEHICLE_TRICKY) { + if (racer->vehicleID < VEHICLE_BOSSES) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 129); switch (racer->attackType) { case ATTACK_EXPLOSION: @@ -3015,7 +3015,7 @@ void func_8004F7F4(s32 updateRate, f32 updateRateF, Object *racerObj, Object_Rac } } } - if (racer->vehicleID < VEHICLE_TRICKY) { + if (racer->vehicleID < VEHICLE_BOSSES) { func_800AF714(racerObj, updateRate); } second_racer_camera_update(racerObj, racer, 0, updateRateF); @@ -3567,7 +3567,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (gDialogueCameraAngle != 0) { traction = 0.0f; } - if (racer->brake < 0.9 && racer->vehicleIDPrev < VEHICLE_TRICKY && gRaceStartTimer == 0) { + if (racer->brake < 0.9 && racer->vehicleIDPrev < VEHICLE_BOSSES && gRaceStartTimer == 0) { velocityDiff = racer->pitch; if (velocityDiff < 0.0) { velocityDiff = -velocityDiff; @@ -4285,7 +4285,7 @@ void racer_attack_handler_car(Object *obj, Object_Racer *racer, s32 updateRate) if (racer->unk1C9 == 8) { racer->unk1C9 = 0; } - if (racer->vehicleID < VEHICLE_TRICKY) { + if (racer->vehicleID < VEHICLE_BOSSES) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 129); switch (racer->attackType) { // Getting hit by a rocket, or running into a landmine. @@ -4445,7 +4445,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, } if (!racer->unk201) { obj->particleEmitFlags = OBJ_EMIT_OFF; - } else if (racer->vehicleID < VEHICLE_TRICKY) { + } else if (racer->vehicleID < VEHICLE_BOSSES) { func_800AF714(obj, updateRate); } func_80053750(obj, racer, updateRateF); @@ -4692,7 +4692,7 @@ void func_80054FD0(Object *racerObj, Object_Racer *racer, s32 updateRate) { D_8011D548 = 0; D_8011D54C = 0; flags = 0; - if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_TRICKY) { + if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_BOSSES) { flags = func_80017248(racerObj, 4, &sp190, &racer->unkD8, sp134, spE0, sp58); } if (flags & 0x80) { @@ -4890,7 +4890,7 @@ void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 upda D_8011D54C = 0.0f; hasCollision = FALSE; flags = 0; - if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_TRICKY) { + if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_BOSSES) { flags = func_80017248(obj, 1, &hasCollision, &racer->unkD8, &tempPos.x, &radius, &surface); } if (flags & 0x80) { @@ -4991,8 +4991,8 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) if (obj->unk68[obj->segment.object.modelIndex] != NULL) { model = obj->unk68[obj->segment.object.modelIndex]->objModel; if (obj->segment.header->unk58 > -1 && obj->segment.header->unk58 < model->unk18) { - if (obj->unk44 != NULL) { - heldObjData = obj->unk44; + if (obj->curVertData != NULL) { + heldObjData = obj->curVertData; heldObjData += model->unk14[obj->segment.header->unk58]; scaleY = heldObjData->y; scaleY *= obj->segment.trans.scale; @@ -6272,11 +6272,11 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { angle = arctan2_f(diffX, diffZ) - (racer->steerVisualRotation & 0xFFFF) - 0x8000; WRAP(angle, -0x8000, 0x8000); if (angle > 0x4000 || angle < -0x4000) { - if (racer->unk1FC < 200 && racer->velocity <= -1.0) { - racer->unk1FC += updateRate; + if (racer->wrongWayCounter < 200 && racer->velocity <= -1.0) { + racer->wrongWayCounter += updateRate; } } else { - racer->unk1FC = 0; + racer->wrongWayCounter = 0; } diffY = diffX; diffX = diffZ; diff --git a/src/rcp_dkr.c b/src/rcp_dkr.c index fc0840a9..af969061 100644 --- a/src/rcp_dkr.c +++ b/src/rcp_dkr.c @@ -5,6 +5,7 @@ #include "video.h" #include "camera.h" #include "set_rsp_segment.h" +#include "racer.h" /************ .data ************/ @@ -192,8 +193,8 @@ s32 gfxtask_run_xbus(Gfx *dlBegin, Gfx *dlEnd, UNUSED s32 recvMesg) { dkrtask->task.output_buff_size = NULL; dkrtask->next = NULL; dkrtask->frameBuffer = gVideoCurrFramebuffer; - dkrtask->unused60 = 0xFF; - dkrtask->unused64 = 0xFF; + dkrtask->unused60 = COLOUR_TAG_BLACK; + dkrtask->unused64 = COLOUR_TAG_BLACK; osWritebackDCacheAll(); osSendMesg(osScInterruptQ, dkrtask, OS_MESG_BLOCK); return 0; @@ -235,8 +236,8 @@ UNUSED void gfxtask_run_xbus2(Gfx *dlBegin, Gfx *dlEnd, s32 recvMesg) { dkrtask->frameBuffer = gVideoCurrFramebuffer; dkrtask->unused58 = COLOUR_TAG_RED; dkrtask->unused5C = COLOUR_TAG_RED; - dkrtask->unused60 = 0xFF; - dkrtask->unused64 = 0xFF; + dkrtask->unused60 = COLOUR_TAG_BLACK; + dkrtask->unused64 = COLOUR_TAG_BLACK; dkrtask->unk68 = FALSE; if (recvMesg) { @@ -406,7 +407,7 @@ void bgdraw_fillcolour(s32 red, s32 green, s32 blue) { * over clearing the colour buffer. * Official Name: rcpClearScreen */ -void bgdraw_render(Gfx **dList, Matrix *mtx, s32 drawBG) { +void bgdraw_render(Gfx **dList, MatrixS **mtx, s32 drawBG) { s32 widthAndHeight; s32 w; s32 h; @@ -429,13 +430,13 @@ void bgdraw_render(Gfx **dList, Matrix *mtx, s32 drawBG) { gDPPipeSync((*dList)++); gDPSetColorImage((*dList)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, w, SEGMENT_FRAMEBUFFER << 24); if (drawBG) { - if (check_viewport_background_flag(0)) { + if (check_viewport_background_flag(PLAYER_ONE)) { if (gChequerBGEnabled) { bgdraw_chequer(dList); // Unused } else if (gTexBGTex1) { func_80078190(dList); } else if (gBGDrawFunc.ptr != NULL) { - gBGDrawFunc.function((Gfx *) dList, mtx); + gBGDrawFunc.function(dList, mtx); } else { gDPSetFillColor((*dList)++, sBackgroundFillColour); gDPFillRectangle((*dList)++, 0, 0, w - 1, h - 1); @@ -455,7 +456,7 @@ void bgdraw_render(Gfx **dList, Matrix *mtx, s32 drawBG) { } else if (gTexBGTex1) { func_80078190(dList); } else if (gBGDrawFunc.ptr != NULL) { - gBGDrawFunc.function((Gfx *) dList, mtx); + gBGDrawFunc.function(dList, mtx); } else { gDPSetFillColor((*dList)++, (GPACK_RGBA5551(sBGPrimColourrR, sBGPrimColourrG, sBGPrimColourrB, 1) << 16) | @@ -514,7 +515,7 @@ void bgdraw_texture_init(TextureHeader *tex1, TextureHeader *tex2, u32 shiftX) { * https://i.imgur.com/MHbUD2a.png is an example. The left is correct, and the right is incorrect rendering. * Official Name: rcpMosaicClear */ -void func_80078190(Gfx **dlist) { +void func_80078190(Gfx **dList) { s32 texture1And2UpperHeight; s32 videoHeight; s32 videoWidth; @@ -536,10 +537,10 @@ void func_80078190(Gfx **dlist) { widthAndHeight = fb_size(); videoWidth = GET_VIDEO_WIDTH(widthAndHeight); videoHeight = GET_VIDEO_HEIGHT(widthAndHeight); - gSPDisplayList((*dlist)++, dRaceFinishBackgroundSettings); + gSPDisplayList((*dList)++, dRaceFinishBackgroundSettings); if (gTexBGTex2 == NULL) { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(gTexBGTex1->cmd), gTexBGTex1->numberOfCommands); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(gTexBGTex1->cmd), gTexBGTex1->numberOfCommands); upperVideoWidth = videoWidth << 2; upperVideoHeight = videoHeight << 2; texture1UpperWidth = gTexBGTex1->width << 2; @@ -555,16 +556,16 @@ void func_80078190(Gfx **dlist) { t = 0; if (ulx < 0) { s = -(ulx << 3); - gSPTextureRectangle((*dlist)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } else { - gSPTextureRectangle((*dlist)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } ulx = lrx; } var_s3 = (var_s3 + gTexBGShiftX) & (texture1UpperWidth - 1); } } else { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(gTexBGTex1->cmd), gTexBGTex1->numberOfCommands); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(gTexBGTex1->cmd), gTexBGTex1->numberOfCommands); upperVideoWidth = videoWidth << 2; upperVideoHeight = videoHeight << 2; texture1UpperWidth = gTexBGTex1->width << 2; @@ -582,15 +583,15 @@ void func_80078190(Gfx **dlist) { t = 0; if (ulx < 0) { s = -(ulx << 3); - gSPTextureRectangle((*dlist)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } else { - gSPTextureRectangle((*dlist)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } ulx = lrx; } var_s3 = (var_s3 + gTexBGShiftX) & (texture1UpperWidth - 1); } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(gTexBGTex2->cmd), gTexBGTex2->numberOfCommands); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(gTexBGTex2->cmd), gTexBGTex2->numberOfCommands); upperVideoWidth <<= 2; upperVideoHeight <<= 2; var_s3 = 0; @@ -604,16 +605,16 @@ void func_80078190(Gfx **dlist) { t = 0; if (ulx < 0) { s = -(ulx << 3); - gSPTextureRectangle((*dlist)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, 0, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } else { - gSPTextureRectangle((*dlist)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); + gSPTextureRectangle((*dList)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, 1024, 1024); } ulx = lrx; } var_s3 = (var_s3 + gTexBGShiftX) & (texture1UpperWidth - 1); } } - gDPPipeSync((*dlist)++); + gDPPipeSync((*dList)++); } #else #pragma GLOBAL_ASM("asm/nonmatchings/rcp_dkr/func_80078190.s") @@ -736,7 +737,7 @@ void texrect_draw(Gfx **dList, DrawTexture *element, s32 xPos, s32 yPos, u8 red, * Typically, you do these shifts in the draw call itself, but Rare decided to do it beforehand. * Also applies texel shifting in order to apply scaling. */ -void texrect_draw_scaled(Gfx **dlist, DrawTexture *element, f32 xPos, f32 yPos, f32 xScale, f32 yScale, u32 colour, +void texrect_draw_scaled(Gfx **dList, DrawTexture *element, f32 xPos, f32 yPos, f32 xScale, f32 yScale, u32 colour, s32 flags) { TextureHeader *tex; Gfx *dmaDlist; @@ -767,9 +768,9 @@ void texrect_draw_scaled(Gfx **dlist, DrawTexture *element, f32 xPos, f32 yPos, dmaDlist = dTextureRectangleScaledXlu[(u8) flags & 0xFF]; } - gSPDisplayList((*dlist)++, dScaledRectangleBaseModes); - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dmaDlist), numberOfGfxCommands(dTextureRectangleScaledOpa[0])); - gDPSetPrimColorRGBA((*dlist)++, colour); + gSPDisplayList((*dList)++, dScaledRectangleBaseModes); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dmaDlist), numberOfGfxCommands(dTextureRectangleScaledOpa[0])); + gDPSetPrimColorRGBA((*dList)++, colour); bFlipX = flags & TEXRECT_FLIP_X; bFlipY = flags & TEXRECT_FLIP_Y; @@ -822,12 +823,12 @@ void texrect_draw_scaled(Gfx **dlist, DrawTexture *element, f32 xPos, f32 yPos, uly = 0; } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(tex->cmd), tex->numberOfCommands); - gSPTextureRectangle((*dlist)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(tex->cmd), tex->numberOfCommands); + gSPTextureRectangle((*dList)++, ulx, uly, lrx, lry, G_TX_RENDERTILE, s, t, dsdx, dtdy); } } } - gDPPipeSync((*dlist)++); - gDPSetPrimColor((*dlist)++, 0, 0, 255, 255, 255, 255); + gDPPipeSync((*dList)++); + gDPSetPrimColor((*dList)++, 0, 0, 255, 255, 255, 255); } diff --git a/src/rcp_dkr.h b/src/rcp_dkr.h index a06cb7fc..00b2db03 100644 --- a/src/rcp_dkr.h +++ b/src/rcp_dkr.h @@ -21,7 +21,7 @@ enum TextureRectangleFlags { }; typedef union { - void (*function)(Gfx*, Matrix *); + void (*function)(Gfx **, MatrixS **); void *ptr; } BackgroundFunction; @@ -76,11 +76,11 @@ void gfxtask_run_fifo(Gfx* dlBegin, Gfx* dlEnd, s32 recvMesg); void texrect_draw(Gfx **dList, DrawTexture *element, s32 xPos, s32 yPos, u8 red, u8 green, u8 blue, u8 alpha); void bgdraw_chequer(Gfx** dList); -void bgdraw_render(Gfx **dList, Matrix *mtx, s32 drawBG); +void bgdraw_render(Gfx **dList, MatrixS **mtx, s32 drawBG); void bgdraw_set_func(void *func); -void texrect_draw_scaled(Gfx **dlist, DrawTexture *element, f32 xPos, f32 yPos, f32 xScale, f32 yScale, u32 colour, s32 flags); +void texrect_draw_scaled(Gfx **dList, DrawTexture *element, f32 xPos, f32 yPos, f32 xScale, f32 yScale, u32 colour, s32 flags); //Non Matching -void func_80078190(Gfx **dlist); +void func_80078190(Gfx **dList); #endif diff --git a/src/screen_asset.c b/src/screen_asset.c index 81fb98d6..e6346878 100644 --- a/src/screen_asset.c +++ b/src/screen_asset.c @@ -12,7 +12,7 @@ Gfx gRdpSetModeScreenAsset[] = { * Returns the address of the screen asset, or 0x80100000 if no screen assets were found. * Unused. */ -UNUSED u32 load_screen(s32 screenIndex) { +UNUSED u32 screenimage_load(s32 screenIndex) { u32 someAddr; s32 screenTableCount, start, size; u32 *screenTable; @@ -52,10 +52,10 @@ UNUSED u32 load_screen(s32 screenIndex) { * Renders a 320x240 RGBA16 screen asset. * Unused. */ -UNUSED void render_screen(Gfx **dlist, u8 *screenAddress) { +UNUSED void screenimage_draw(Gfx **dList, u8 *screenAddress) { s32 y_pos; - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(&gRdpSetModeScreenAsset), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(&gRdpSetModeScreenAsset), numberOfGfxCommands(gRdpSetModeScreenAsset)); // Screen header is 16 bytes. @@ -65,11 +65,11 @@ UNUSED void render_screen(Gfx **dlist, u8 *screenAddress) { y_pos = 0; while (y_pos != SCREEN_HEIGHT) { // Load the texture. - gDPLoadTextureBlockS((*dlist)++, OS_PHYSICAL_TO_K0(screenAddress), G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, + gDPLoadTextureBlockS((*dList)++, OS_PHYSICAL_TO_K0(screenAddress), G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, SCREEN_HEIGHT_PART, 0, G_TX_CLAMP, G_TX_CLAMP, 0, 0, 0, 0); // Draw the texture. - gSPTextureRectangle((*dlist)++, 0, (y_pos << 2), SCREEN_WIDTH << 2, ((y_pos + SCREEN_HEIGHT_PART) << 2), + gSPTextureRectangle((*dList)++, 0, y_pos << 2, SCREEN_WIDTH << 2, (y_pos + SCREEN_HEIGHT_PART) << 2, G_TX_RENDERTILE, 0, 0, 1 << 12, 1 << 10); // Advance to the next slice. diff --git a/src/set_rsp_segment.c b/src/set_rsp_segment.c index 114345fe..4ebda58a 100644 --- a/src/set_rsp_segment.c +++ b/src/set_rsp_segment.c @@ -8,6 +8,6 @@ * This is used for the colour and depth buffers. * Official name: segSetBase */ -void rsp_segment(Gfx **dlist, s32 segment, s32 base) { - gSPSegment((*dlist)++, segment, base + K0BASE) +void rsp_segment(Gfx **dList, s32 segment, s32 base) { + gSPSegment((*dList)++, segment, base + K0BASE) } diff --git a/src/set_rsp_segment.h b/src/set_rsp_segment.h index 8523d4a6..a4f8e4b0 100644 --- a/src/set_rsp_segment.h +++ b/src/set_rsp_segment.h @@ -18,6 +18,6 @@ enum RSPSegments { SEGMENT_COUNT, }; -void rsp_segment(Gfx **dlist, s32 segment, s32 base); +void rsp_segment(Gfx **dList, s32 segment, s32 base); #endif diff --git a/src/textures_sprites.c b/src/textures_sprites.c index b325bde7..ab88742a 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -574,15 +574,15 @@ UNUSED s32 func_8007B380(s32 arg0) { * The next draw call will be forced to apply all settings instead of skipping unecessary steps. * Official Name: texDPInit */ -void reset_render_settings(Gfx **dlist) { +void reset_render_settings(Gfx **dList) { gCurrentTextureHeader = NULL; gCurrentRenderFlags = RENDER_NONE; gUsingTexture = FALSE; gForceFlags = TRUE; gBlockedRenderFlags = RENDER_NONE; gUsePrimColour = FALSE; - gDPPipeSync((*dlist)++); - gSPSetGeometryMode((*dlist)++, G_SHADING_SMOOTH | G_SHADE | G_ZBUFFER); + gDPPipeSync((*dList)++); + gSPSetGeometryMode((*dList)++, G_SHADING_SMOOTH | G_SHADE | G_ZBUFFER); } /** @@ -619,8 +619,8 @@ TextureHeader *set_animated_texture_header(TextureHeader *texHead, s32 offset) { /** * A version of the function below that chooses not to pass along an offset. */ -void load_and_set_texture_no_offset(Gfx **dlist, TextureHeader *texhead, u32 flags) { - load_and_set_texture(dlist, texhead, flags, 0); +void load_and_set_texture_no_offset(Gfx **dList, TextureHeader *texhead, u32 flags) { + load_and_set_texture(dList, texhead, flags, 0); } /** @@ -630,7 +630,7 @@ void load_and_set_texture_no_offset(Gfx **dlist, TextureHeader *texhead, u32 fla * A number can be attached that adds a texture address offset. An example of this being used is * the numbered doors in the hub, to change what number is written on it. */ -void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 texOffset) { +void load_and_set_texture(Gfx **dList, TextureHeader *texhead, s32 flags, s32 texOffset) { s32 forceFlags; s32 doPipeSync; s32 dlIndex; @@ -645,7 +645,7 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te flags |= texhead->flags; if (texhead != gCurrentTextureHeader) { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(texhead->cmd), texhead->numberOfCommands); + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(texhead->cmd), texhead->numberOfCommands); gCurrentTextureHeader = texhead; doPipeSync = FALSE; } @@ -668,22 +668,22 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (flags != gCurrentRenderFlags || forceFlags) { if (doPipeSync) { - gDPPipeSync((*dlist)++); + gDPPipeSync((*dList)++); } if (((flags & RENDER_VTX_ALPHA) != (gCurrentRenderFlags & RENDER_VTX_ALPHA)) || gForceFlags) { if (flags & RENDER_VTX_ALPHA || gUsePrimColour) { - gSPClearGeometryMode((*dlist)++, G_FOG); + gSPClearGeometryMode((*dList)++, G_FOG); } else { - gSPSetGeometryMode((*dlist)++, G_FOG); + gSPSetGeometryMode((*dList)++, G_FOG); } } if (((flags & RENDER_Z_COMPARE) != (gCurrentRenderFlags & RENDER_Z_COMPARE)) || gForceFlags) { if (flags & RENDER_Z_COMPARE) { - gSPSetGeometryMode((*dlist)++, G_ZBUFFER); + gSPSetGeometryMode((*dList)++, G_ZBUFFER); } else { - gSPClearGeometryMode((*dlist)++, G_ZBUFFER); + gSPClearGeometryMode((*dList)++, G_ZBUFFER); } } @@ -692,14 +692,14 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (!gUsingTexture) { if (flags & RENDER_VTX_ALPHA) { gDkrDmaDisplayList( - (*dlist)++, + (*dList)++, OS_PHYSICAL_TO_K0( dRenderSettingsSolidColourVtxAlpha[flags & (RENDER_ANTI_ALIASING | RENDER_Z_COMPARE)]), numberOfGfxCommands(dRenderSettingsSolidColourVtxAlpha[0])); return; } gDkrDmaDisplayList( - (*dlist)++, + (*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsSolidColour[flags & (RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE | RENDER_ANTI_ALIASING)]), numberOfGfxCommands(dRenderSettingsSolidColour[0])); @@ -718,14 +718,14 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (flags & RENDER_COLOUR_INDEX) { dlIndex |= 4; // Colour Index } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsPrimOverlay[dlIndex]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsPrimOverlay[dlIndex]), numberOfGfxCommands(dRenderSettingsPrimOverlay[0])); return; } if (flags & RENDER_COLOUR_INDEX) { flags = (flags ^ RENDER_COLOUR_INDEX) | RENDER_FOG_ACTIVE; } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsPrimCol[flags]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsPrimCol[flags]), numberOfGfxCommands(dRenderSettingsPrimCol[0])); return; } @@ -744,7 +744,7 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (flags & RENDER_COLOUR_INDEX) { dlIndex |= 8; // Colour Index } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsDecal[dlIndex]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsDecal[dlIndex]), numberOfGfxCommands(dRenderSettingsDecal[0])); return; } @@ -754,7 +754,7 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (flags & RENDER_FOG_ACTIVE) { dlIndex |= 8; // Fog } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsCutout[dlIndex]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsCutout[dlIndex]), numberOfGfxCommands(dRenderSettingsCutout[0])); return; } @@ -765,15 +765,15 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te if (flags & RENDER_Z_UPDATE) { dlIndex |= 4; // Z write } else { - gSPSetGeometryMode((*dlist)++, G_ZBUFFER); + gSPSetGeometryMode((*dList)++, G_ZBUFFER); gCurrentRenderFlags |= RENDER_Z_COMPARE; } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsVtxAlpha[dlIndex]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsVtxAlpha[dlIndex]), numberOfGfxCommands(dRenderSettingsVtxAlpha[0])); return; } - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[flags]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[flags]), numberOfGfxCommands(dRenderSettingsCommon[0])); return; } @@ -782,7 +782,7 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 te /** * Loads the texture and render settings for the blinking lights seen in Spaceport Alpha. */ -void load_blinking_lights_texture(Gfx **dlist, TextureHeader *texture_list, u32 flags, s32 texture_index) { +void load_blinking_lights_texture(Gfx **dList, TextureHeader *texture_list, u32 flags, s32 texture_index) { u16 *mblock; u16 *tblock; if ((texture_index != 0) && (texture_index < (texture_list->numOfTextures * 256))) { @@ -791,30 +791,30 @@ void load_blinking_lights_texture(Gfx **dlist, TextureHeader *texture_list, u32 mblock = (u16 *) (texture_list + 1); tblock = mblock + 0x400; if (texture_list->width == 64) { - gDPLoadMultiBlock((*dlist)++, OS_K0_TO_PHYSICAL(mblock), 256, 1, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 16, 0, 0, 0, + gDPLoadMultiBlock((*dList)++, OS_K0_TO_PHYSICAL(mblock), 256, 1, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 16, 0, 0, 0, 6, 4, 0, 0); - gDPLoadTextureBlock((*dlist)++, OS_K0_TO_PHYSICAL(tblock), G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 16, 0, 0, 0, 6, 4, + gDPLoadTextureBlock((*dList)++, OS_K0_TO_PHYSICAL(tblock), G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 16, 0, 0, 0, 6, 4, 0, 0); } else { - gDPLoadMultiBlock((*dlist)++, OS_K0_TO_PHYSICAL(mblock), 256, 1, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, 0, 0, + gDPLoadMultiBlock((*dList)++, OS_K0_TO_PHYSICAL(mblock), 256, 1, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, 0, 0, 5, 5, 0, 0); - gDPLoadTextureBlock((*dlist)++, OS_K0_TO_PHYSICAL(tblock), G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, 0, 0, 5, 5, + gDPLoadTextureBlock((*dList)++, OS_K0_TO_PHYSICAL(tblock), G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, 0, 0, 5, 5, 0, 0); } - gDPPipeSync((*dlist)++); + gDPPipeSync((*dList)++); gCurrentTextureHeader = 0; flags &= (RENDER_ANTI_ALIASING | RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_FOG_ACTIVE | RENDER_CUTOUT); - gSPSetGeometryMode((*dlist)++, G_FOG); + gSPSetGeometryMode((*dList)++, G_FOG); if (flags & RENDER_Z_COMPARE) { - gSPSetGeometryMode((*dlist)++, G_ZBUFFER); + gSPSetGeometryMode((*dList)++, G_ZBUFFER); } else { - gSPClearGeometryMode((*dlist)++, G_ZBUFFER); + gSPClearGeometryMode((*dList)++, G_ZBUFFER); } gForceFlags = TRUE; gCurrentRenderFlags = RENDER_NONE; - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsBlinkingLights[flags]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsBlinkingLights[flags]), numberOfGfxCommands(dRenderSettingsBlinkingLights[0])); } @@ -826,19 +826,19 @@ void sprite_opaque(s32 setting) { gForceFlags = TRUE; } -void func_8007BF34(Gfx **dlist, s32 flags) { +void func_8007BF34(Gfx **dList, s32 flags) { if ((flags != gCurrentRenderFlags) || gForceFlags) { - gDPPipeSync((*dlist)++); + gDPPipeSync((*dList)++); if ((gCurrentRenderFlags & RENDER_VTX_ALPHA) || gForceFlags) { - gSPSetGeometryMode((*dlist)++, G_FOG); + gSPSetGeometryMode((*dList)++, G_FOG); } flags &= ~RENDER_VTX_ALPHA; flags &= ~gBlockedRenderFlags; if (((flags & RENDER_Z_COMPARE) != (gCurrentRenderFlags & RENDER_Z_COMPARE)) || gForceFlags) { if (flags & RENDER_Z_COMPARE) { - gSPSetGeometryMode((*dlist)++, G_ZBUFFER); + gSPSetGeometryMode((*dList)++, G_ZBUFFER); } else { - gSPClearGeometryMode((*dlist)++, G_ZBUFFER); + gSPClearGeometryMode((*dList)++, G_ZBUFFER); } } gForceFlags = FALSE; @@ -846,15 +846,15 @@ void func_8007BF34(Gfx **dlist, s32 flags) { flags &= ~RENDER_DECAL; if (gSpriteOpaque == FALSE) { if ((gCurrentRenderFlags & RENDER_PRESERVE_COVERAGE)) { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteCld[(flags >> 1) & 1]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteCld[(flags >> 1) & 1]), numberOfGfxCommands(dRenderSettingsSpriteCld[0])); } else { // fake ^ 0 required for some reason - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteXlu[(flags - 16) ^ 0]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsSpriteXlu[(flags - 16) ^ 0]), numberOfGfxCommands(dRenderSettingsSpriteXlu[0])); } } else { - gDkrDmaDisplayList((*dlist)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[flags]), + gDkrDmaDisplayList((*dList)++, OS_PHYSICAL_TO_K0(dRenderSettingsCommon[flags]), numberOfGfxCommands(dRenderSettingsCommon[0])); } gCurrentTextureHeader = NULL; @@ -1149,7 +1149,7 @@ void func_8007CDC0(Sprite *sprite1, Sprite *sprite2, s32 arg2) { #ifdef NON_EQUIVALENT // HEAVILY WIP // Alternative attempt: https://decomp.me/scratch/TbR8j -void build_tex_display_list(TextureHeader *tex, Gfx *dlist) { +void build_tex_display_list(TextureHeader *tex, Gfx *dList) { s32 texFlags; s32 cms; s32 cmt; @@ -1164,7 +1164,7 @@ void build_tex_display_list(TextureHeader *tex, Gfx *dlist) { u8 width; s32 var_v0; - tex->cmd = (s32 *) dlist; + tex->cmd = (s32 *) dList; texFormat = tex->format & 0xF; texFlags = (tex->format >> 4) & 0xF; height = tex->height; @@ -1203,24 +1203,24 @@ void build_tex_display_list(TextureHeader *tex, Gfx *dlist) { } if (!(tex->flags & 0x400)) { if (texFormat == 0) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); if ((texFlags == 0) || (texFlags == 2)) { tex->flags |= 4; } } if (texFormat == 1) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); if ((texFlags == 0) || (texFlags == 2)) { tex->flags |= 4; } } if (texFormat == 7) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_CI, G_IM_SIZ_16b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_CI, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); temp_v0_4 = func_8007EF64(tex->ciPaletteOffset); - gDPLoadTLUT_pal16(dlist++, 0, temp_v0_4); + gDPLoadTLUT_pal16(dList++, 0, temp_v0_4); tex->flags |= 0x20; if ((texFlags == 0) || (texFlags == 2)) { @@ -1228,50 +1228,50 @@ void build_tex_display_list(TextureHeader *tex, Gfx *dlist) { } } if (texFormat == 4) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_16b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 5) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 6) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_4b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_4b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 2) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_8b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_8b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); } if (texFormat == 3) { - gDPLoadTextureBlock(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_4b, width, height, 0, cms, + gDPLoadTextureBlock(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_4b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); } - tex->numberOfCommands = ((s32) ((s32) dlist - (s32) tex->cmd) >> 3); + tex->numberOfCommands = ((s32) ((s32) dList - (s32) tex->cmd) >> 3); } else { if (texFormat == 0) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); if ((texFlags == 0) || (texFlags == 2)) { tex->flags |= 4; } } if (texFormat == 1) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_RGBA, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); if ((texFlags == 0) || (texFlags == 2)) { tex->flags |= 4; } } if (texFormat == 7) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_CI, G_IM_SIZ_16b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_CI, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); temp_v0_4 = func_8007EF64(tex->ciPaletteOffset); - gDPLoadTLUT_pal16(dlist++, 0, temp_v0_4); + gDPLoadTLUT_pal16(dList++, 0, temp_v0_4); tex->flags |= 0x20; if ((texFlags == 0) || (texFlags == 2)) { @@ -1279,29 +1279,29 @@ void build_tex_display_list(TextureHeader *tex, Gfx *dlist) { } } if (texFormat == 4) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_16b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_16b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 5) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 6) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_4b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_IA, G_IM_SIZ_4b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); tex->flags |= 4; } if (texFormat == 2) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_8b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_8b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); } if (texFormat == 3) { - gDPLoadTextureBlockS(dlist++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_4b, width, height, 0, cms, + gDPLoadTextureBlockS(dList++, OS_PHYSICAL_TO_K0(tex + 1), G_IM_FMT_I, G_IM_SIZ_4b, width, height, 0, cms, cmt, masks, maskt, G_TX_NOLOD, G_TX_NOLOD); } - tex->numberOfCommands = ((s32) ((s32) dlist - (s32) tex->cmd) >> 3); + tex->numberOfCommands = ((s32) ((s32) dList - (s32) tex->cmd) >> 3); } } #else @@ -1497,7 +1497,7 @@ void update_pulsating_light_data(PulsatingLightData *data, s32 timeDelta) { } } -void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentColor) { +void func_8007F594(Gfx **dList, u32 index, u32 primitiveColor, u32 environmentColor) { Gfx *gfxTemp; Gfx *tempDlist; u32 tempIndex; @@ -1510,10 +1510,10 @@ void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentCo tempDlist = D_800DF3D8; } - gfxTemp = *dlist; + gfxTemp = *dList; gSPDisplayList(gfxTemp++, tempDlist); gDkrDmaDisplayList(gfxTemp++, OS_PHYSICAL_TO_K0(D_800DF410[tempIndex]), numberOfGfxCommands(D_800DF410[0])); gDPSetPrimColorRGBA(gfxTemp++, primitiveColor); gDPSetEnvColorRGBA(gfxTemp++, environmentColor); - *dlist = gfxTemp; + *dList = gfxTemp; } diff --git a/src/textures_sprites.h b/src/textures_sprites.h index 386cb78d..159b0cd7 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -115,16 +115,16 @@ s32 get_loaded_2D_textures(void); s32 get_loaded_3D_textures(void); s32 func_8007AE64(void); void set_texture_colour_tag(s32 tagID); -void reset_render_settings(Gfx **dlist); +void reset_render_settings(Gfx **dList); void enable_primitive_colour(void); void disable_primitive_colour(void); -void load_and_set_texture_no_offset(Gfx **dlist, TextureHeader *texhead, u32 flags); +void load_and_set_texture_no_offset(Gfx **dList, TextureHeader *texhead, u32 flags); void sprite_opaque(s32 setting); s32 func_8007EF64(s16 arg0); -void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 texOffset); +void load_and_set_texture(Gfx **dList, TextureHeader *texhead, s32 flags, s32 texOffset); void free_sprite(Sprite *sprite); void free_texture(TextureHeader *tex); -void func_8007BF34(Gfx **dlist, s32 flags); +void func_8007BF34(Gfx **dList, s32 flags); // There might be a file boundary here. void tex_animate_texture(TextureHeader *texture, u32 *triangleBatchInfoFlags, s32 *arg2, s32 updateRate); @@ -137,13 +137,13 @@ s32 get_texture_size_from_id(s32 id); // Non Matching s32 func_8007C860(s32 spriteIndex); // Non Matching s32 load_sprite_info(s32 spriteIndex, s32 *numOfInstancesOut, s32 *unkOut, s32 *numFramesOut, s32 *formatOut, s32 *sizeOut); // Non Matching -void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentColor); // Non Matching +void func_8007F594(Gfx **dList, u32 index, u32 primitiveColor, u32 environmentColor); // Non Matching void func_8007CA68(s32 spriteID, s32 arg1, s32 *arg2, s32 *arg3, s32 *arg4); // Non Matching MemoryPoolSlot *func_8007C12C(s32 spriteID, s32 arg1); // Non Matching void tex_init_textures(void); // Non Matching -void load_blinking_lights_texture(Gfx **dlist, TextureHeader *texture_list, u32 flags, +void load_blinking_lights_texture(Gfx **dList, TextureHeader *texture_list, u32 flags, s32 texture_index); // Non Matching -void build_tex_display_list(TextureHeader *tex, Gfx *dlist); // Non Matching +void build_tex_display_list(TextureHeader *tex, Gfx *dList); // Non Matching void func_8007CDC0(Sprite *sprite1, Sprite *sprite2, s32 arg2); // Non Matching #endif diff --git a/src/thread30_track_loading.c b/src/thread30_bgload.c similarity index 80% rename from src/thread30_track_loading.c rename to src/thread30_bgload.c index fe5b3272..9a497117 100644 --- a/src/thread30_track_loading.c +++ b/src/thread30_bgload.c @@ -1,4 +1,4 @@ -#include "thread30_track_loading.h" +#include "thread30_bgload.h" #include "macros.h" #include #include "game.h" @@ -25,9 +25,9 @@ u64 gThread30Stack[STACKSIZE(STACK_BGLOAD)]; /** * Initalizes and starts thread30() */ -void create_and_start_thread30(void) { - osCreateMesgQueue(&gThread30MesgQueue, &gThread30Message[0], ARRAY_COUNT(gThread30Message)); - osCreateThread(&gThread30, 30, &thread30_track_loading, NULL, &gThread30Stack[STACKSIZE(STACK_BGLOAD)], 8); +void bgload_init(void) { + osCreateMesgQueue(&gThread30MesgQueue, gThread30Message, ARRAY_COUNT(gThread30Message)); + osCreateThread(&gThread30, 30, &thread30_bgload, NULL, &gThread30Stack[STACKSIZE(STACK_BGLOAD)], 8); osStartThread(&gThread30); } @@ -35,14 +35,14 @@ void create_and_start_thread30(void) { * Stop thread30() * Official Name: amStop */ -void stop_thread30(void) { +void bgload_kill(void) { osStopThread(&gThread30); } /** * Returns the value in gThread30NeedToLoadLevel. */ -s32 get_thread30_need_to_load_level(void) { +s32 bgload_active(void) { return gThread30NeedToLoadLevel; } @@ -50,7 +50,7 @@ s32 get_thread30_need_to_load_level(void) { * If gThread30NeedToLoadLevel is set, then decrement gThread30LoadDelay. If gThread30LoadDelay is 0, * then signal thread30 to load a level. */ -void tick_thread30(void) { +void bgload_tick(void) { if (gThread30NeedToLoadLevel && gThread30LoadDelay > 0) { gThread30LoadDelay--; if (gThread30LoadDelay == 0) { @@ -63,7 +63,7 @@ void tick_thread30(void) { /** * Returns the value in gThread30LoadDelay. */ -UNUSED s32 get_thread30_load_delay(void) { +UNUSED s32 bgload_timer(void) { return gThread30LoadDelay; } @@ -71,7 +71,7 @@ UNUSED s32 get_thread30_load_delay(void) { * Sets a level id and cutscene id to be loaded. Used in the tracks menu & credits menu. * Returns 1 if successful, or 0 if gThread30NeedToLoadLevel was already set. */ -s32 set_level_to_load_in_background(s32 levelId, s32 cutsceneId) { +s32 bgload_start(s32 levelId, s32 cutsceneId) { if (!gThread30NeedToLoadLevel) { gThread30LoadDelay = 4; gThread30LevelIdToLoad = levelId; @@ -85,7 +85,7 @@ s32 set_level_to_load_in_background(s32 levelId, s32 cutsceneId) { /** * Waits for a signal from the main thread to load a level asynchronously. */ -void thread30_track_loading(UNUSED void *arg) { +void thread30_bgload(UNUSED void *arg) { OSMesg mesg = 0; while (TRUE) { // Wait for a signal from the main thread diff --git a/src/thread30_bgload.h b/src/thread30_bgload.h new file mode 100644 index 00000000..77b0c55b --- /dev/null +++ b/src/thread30_bgload.h @@ -0,0 +1,14 @@ +#ifndef _THREAD30_H_ +#define _THREAD30_H_ + +#include "types.h" + +void bgload_init(void); +void bgload_kill(void); +s32 bgload_active(void); +void bgload_tick(void); +s32 bgload_timer(void); +s32 bgload_start(s32 levelId, s32 cutsceneId); +void thread30_bgload(void *arg); + +#endif diff --git a/src/thread30_track_loading.h b/src/thread30_track_loading.h deleted file mode 100644 index e086141d..00000000 --- a/src/thread30_track_loading.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef _THREAD30_H_ -#define _THREAD30_H_ - -#include "types.h" - -void create_and_start_thread30(void); -void stop_thread30(void); -s32 get_thread30_need_to_load_level(void); -void tick_thread30(void); -s32 get_thread30_load_delay(void); -s32 set_level_to_load_in_background(s32 levelId, s32 cutsceneId); -void thread30_track_loading(void *arg); - -#endif diff --git a/src/thread3_main.c b/src/thread3_main.c index 7b31ac65..1982f16b 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -17,7 +17,7 @@ #include "gzip.h" #include "printf.h" #include "thread0_epc.h" -#include "thread30_track_loading.h" +#include "thread30_bgload.h" #include "weather.h" #include "audio.h" #include "objects.h" @@ -87,12 +87,14 @@ s32 gNumHudMatPerPlayer[MAXCONTROLLERS] = { 300, 400, 550, 600 }; s32 gNumHudTrisPerPlayer[MAXCONTROLLERS] = { 20, 30, 40, 50 }; s8 gDrawFrameTimer = 0; FadeTransition D_800DD3F4 = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_BLACK, 20, 0); -UNUSED FadeTransition D_800DD3FC = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 20, -1); +UNUSED FadeTransition D_800DD3FC = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 20, FADE_STAY); s32 sLogicUpdateRate = LOGIC_5FPS; -FadeTransition gDrumstickSceneTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 30, -1); +FadeTransition gDrumstickSceneTransition = + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_WHITE, 30, FADE_STAY); UNUSED char *D_800DD410[3] = { "CAR", "HOV", "PLN" }; -FadeTransition gLevelFadeOutTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, -1); -FadeTransition D_800DD424 = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 260, -1); +FadeTransition gLevelFadeOutTransition = + FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, FADE_STAY); +FadeTransition D_800DD424 = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 260, FADE_STAY); /*******************************/ @@ -157,7 +159,7 @@ void thread3_main(UNUSED void *unused) { if (is_reset_pressed()) { rumble_kill(); audioStopThread(); - stop_thread30(); + bgload_kill(); __osSpSetStatus(SP_SET_HALT | SP_CLR_INTR_BREAK | SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | SP_CLR_RSPSIGNAL | SP_CLR_CPUSIGNAL | SP_CLR_SIG5 | SP_CLR_SIG6 | SP_CLR_SIG7); osDpSetStatus(DPC_SET_XBUS_DMEM_DMA | DPC_CLR_FREEZE | DPC_CLR_FLUSH | DPC_CLR_TMEM_CTR | DPC_CLR_PIPE_CTR | @@ -224,7 +226,7 @@ void init_game(void) { load_fonts(); init_controller_paks(); init_save_data(); - create_and_start_thread30(); + bgload_init(); osCreateMesgQueue(&gNMIMesgQueue, &gNMIOSMesg, 1); osScAddClient(&gMainSched, (OSScClient *) gNMISched, &gNMIMesgQueue, OS_SC_ID_PRENMI); gNMIMesgBuf = 0; @@ -277,7 +279,7 @@ void main_game_loop(void) { rsp_segment(&gCurrDisplayList, SEGMENT_FRAMEBUFFER_OFFSET, (s32) gVideoLastFramebuffer - VI_OFFSET); // Unused rsp_init(&gCurrDisplayList); rdp_init(&gCurrDisplayList); - bgdraw_render(&gCurrDisplayList, (Matrix *) &gGameCurrMatrix, TRUE); + bgdraw_render(&gCurrDisplayList, &gGameCurrMatrix, TRUE); gSaveDataFlags = input_update(gSaveDataFlags, sLogicUpdateRate); if (get_lockup_status()) { render_epc_lock_up_display(); @@ -316,9 +318,9 @@ void main_game_loop(void) { render_dialogue_boxes(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList); dialogue_close(4); dialogue_clear(4); - // handle_transitions will perform the logic of transitions and return the transition ID. - if (handle_transitions(sLogicUpdateRate)) { - render_fade_transition(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList); + // transition_update will perform the logic of transitions and return the transition ID. + if (transition_update(sLogicUpdateRate)) { + transition_render(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList); } if (sBootDelayTimer >= 8 && is_controller_missing()) { menu_missing_controller(&gCurrDisplayList, sLogicUpdateRate); @@ -386,7 +388,7 @@ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v camera_init(); load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, gGameCurrentCutscene); - init_hud(get_viewport_count()); + hud_init(get_viewport_count()); func_800AE728(8, 0x10, 0x96, 0x64, 0x32, 0); ainode_update(); osSetTime(0); @@ -410,7 +412,7 @@ void unload_level_game(void) { clear_audio_and_track(); transition_begin(&D_800DD3F4); func_800AE270(); - free_hud(); + hud_free(); free_game_text_table(); gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); @@ -568,7 +570,7 @@ void mode_game(s32 updateRate) { } rdp_init(&gCurrDisplayList); divider_draw(&gCurrDisplayList); - render_minimap_and_misc_hud(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList, updateRate); + hud_render_general(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList, updateRate); divider_clear_coverage(&gCurrDisplayList); if (gFutureFunLandLevelTarget) { if (func_800214C4() != 0) { @@ -877,7 +879,7 @@ void load_level_menu(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v camera_init(); load_game_text_table(); load_level(levelId, numberOfPlayers, entranceId, vehicleId, cutsceneId); - init_hud(get_viewport_count()); + hud_init(get_viewport_count()); func_800AE728(4, 4, 0x6E, 0x30, 0x20, 0); ainode_update(); osSetTime(0); @@ -895,7 +897,7 @@ void unload_level_menu(void) { clear_audio_and_track(); transition_begin(&D_800DD3F4); func_800AE270(); - free_hud(); + hud_free(); free_game_text_table(); mempool_free_timer(2); } @@ -907,7 +909,7 @@ void unload_level_menu(void) { * In the tracks menu, this only runs if there's a track actively loaded. */ void update_menu_scene(s32 updateRate) { - if (!get_thread30_need_to_load_level()) { + if (bgload_active() == FALSE) { func_80010994(updateRate); gParticlePtrList_flush(); ainode_update(); @@ -1049,7 +1051,7 @@ void mode_menu(s32 updateRate) { void load_level_for_menu(s32 levelId, s32 numberOfPlayers, s32 cutsceneId) { if (!gIsLoading) { unload_level_menu(); - if (!get_thread30_need_to_load_level()) { + if (bgload_active() == FALSE) { gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); gSPEndDisplayList(gCurrDisplayList++); diff --git a/src/tracks.c b/src/tracks.c index 04c21105..8427ffb4 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -31,8 +31,8 @@ s32 D_800DC870 = 0; // Currently unknown, might be a different type. //!@bug These two transition effects are marked to not clear when done, meaning they stay active the whole time. -FadeTransition gFullFadeToBlack = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_BLACK, 40, -1); -FadeTransition gCircleFadeToBlack = FADE_TRANSITION(FADE_CIRCLE, FADE_FLAG_OUT, FADE_COLOR_BLACK, 70, -1); +FadeTransition gFullFadeToBlack = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_OUT, FADE_COLOR_BLACK, 40, FADE_STAY); +FadeTransition gCircleFadeToBlack = FADE_TRANSITION(FADE_CIRCLE, FADE_FLAG_OUT, FADE_COLOR_BLACK, 70, FADE_STAY); f32 D_800DC884[10] = { 0.0f, 0.125f, 0.25f, 0.375f, 0.5f, 0.625f, 0.75f, 0.875f }; @@ -399,14 +399,14 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 } lensflare_override(get_active_camera_segment()); lensflare_render(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, get_active_camera_segment()); - render_hud(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, - get_racer_object_by_port(gSceneCurrentPlayerID), updateRate); + hud_render_player(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, + get_racer_object_by_port(gSceneCurrentPlayerID), updateRate); } // Show TT Cam toggle for the fourth viewport when playing 3 player. if (numViewports == 3 && get_current_level_race_type() != RACETYPE_CHALLENGE_EGGS && get_current_level_race_type() != RACETYPE_CHALLENGE_BATTLE && get_current_level_race_type() != RACETYPE_CHALLENGE_BANANAS) { - if (get_hud_setting() == 0) { + if (hud_setting() == 0) { if (flip) { gSPSetGeometryMode(gSceneCurrDisplayList++, G_CULL_FRONT); } diff --git a/tools/dkr_assets_tool_src/prebuild/makeIncludes/assetEnums.cpp b/tools/dkr_assets_tool_src/prebuild/makeIncludes/assetEnums.cpp index c23b9e46..3535897f 100644 --- a/tools/dkr_assets_tool_src/prebuild/makeIncludes/assetEnums.cpp +++ b/tools/dkr_assets_tool_src/prebuild/makeIncludes/assetEnums.cpp @@ -67,6 +67,7 @@ void AssetEnums::_write_main_asset_enum(std::vector &mainOrder) { for(std::string §ionId : mainOrder) { mainEnum.add_symbol(sectionId); } + mainEnum.add_symbol("\n ASSET_SECTIONS_COUNT"); _cHeader.write_raw_text(mainEnum.to_string()); } @@ -122,6 +123,7 @@ void AssetEnums::_write_single_asset_section_enums(const std::string §ionId, } } + sectionEnum.add_symbol("\n " + sectionId + "_COUNT"); _cHeader.write_raw_text(sectionEnum.to_string()); } @@ -136,6 +138,10 @@ void AssetEnums::_write_asset_section_enums(const std::string §ionId, JsonFi sectionEnum.add_symbol(assetBuildId); } + + if(sectionId != "ASSET_MENU_TEXT") { + sectionEnum.add_symbol("\n " + sectionId + "_COUNT"); + } _cHeader.write_raw_text(sectionEnum.to_string()); if(sectionId == "ASSET_MENU_TEXT") { @@ -148,6 +154,7 @@ void AssetEnums::_write_asset_section_enums(const std::string §ionId, JsonFi menuTextIdsEnum.add_symbol(textId); } + menuTextIdsEnum.add_symbol("\n " + sectionId + "_COUNT"); _cHeader.write_newline(); _cHeader.write_raw_text(menuTextIdsEnum.to_string()); } @@ -178,5 +185,6 @@ void AssetEnums::_write_deferred_asset_section_enums(const std::string §ionI sectionEnum.add_symbol(assetBuildId + idPostfix); } + sectionEnum.add_symbol("\n " + sectionId + "_COUNT"); _cHeader.write_raw_text(sectionEnum.to_string()); } diff --git a/ver/splat/dkr.jpn.v79.yaml b/ver/splat/dkr.jpn.v79.yaml index adbd4727..ab39c87d 100644 --- a/ver/splat/dkr.jpn.v79.yaml +++ b/ver/splat/dkr.jpn.v79.yaml @@ -43,7 +43,7 @@ segments: - [0x8C40, c, audio_spatial] - [0xB310, c, ../libultra/src/audio/mips1/seqplayer] - [0xBC20, c, objects] - - [0x251F0, hasm, hasm/unknown_0251F0] + - [0x251F0, hasm, hasm/obj_shade_fast] - [0x255E0, c, tracks] - [0x31D30, hasm, hasm/collision] - [0x32760, c, lights] @@ -56,7 +56,7 @@ segments: - [0x5F6C0, c, vehicle_wizpig] - [0x5FF40, c, vehicle_rocket] - [0x60480, c, object_models] - - [0x62A00, hasm, hasm/object_animate] + - [0x62A00, hasm, hasm/obj_animate] - [0x62F60, c, ../libultra/src/audio/mips1/csplayer] - [0x64760, c, ../libultra/src/audio/mips1/unknown_064690] - [0x647C0, c, ../libultra/src/audio/mips1/seqchannel] @@ -104,7 +104,7 @@ segments: - [0xC8700, c, gzip] - [0xC8E50, hasm, hasm/gzip_asm] - [0xC98D0, c, ../libultra/src/io/leointerrupt] - - [0xC98E0, c, thread30_track_loading] + - [0xC98E0, c, thread30_bgload] - [0xC9AF0, c, ../libultra/src/audio/heapinit] - [0xC9B30, c, ../libultra/src/audio/bnkf] - [0xC9D80, c, ../libultra/src/audio/heapalloc] @@ -303,7 +303,7 @@ segments: - [0xE5D80, .data, font] - [0xE5EA0, .data, ../libultra/src/io/pimgr] - [0xE5EC0, .data, gzip] - - [0xE5ED0, .data, thread30_track_loading] + - [0xE5ED0, .data, thread30_bgload] - [0xE5EE0, .data, ../libultra/src/audio/sl] - [0xE5EF0, .data, ../libultra/src/io/aisetnextbuf] - [0xE5F00, .data, ../libultra/src/audio/env] @@ -427,7 +427,7 @@ segments: - { start: auto, type: .bss, vram: 0x8012C2E0, name: ../libultra/src/io/pimgr } - { start: auto, type: .bss, vram: 0x8012C5B0, name: gzip } - { start: auto, type: .bss, vram: 0x8012C5C0, name: ../libultra/src/io/leointerrupt } - - { start: auto, type: .bss, vram: 0x8012C5D0, name: thread30_track_loading } + - { start: auto, type: .bss, vram: 0x8012C5D0, name: thread30_bgload } - { start: auto, type: .bss, vram: 0x8012E7A0, name: ../libultra/src/os/initialize } - { start: auto, type: .bss, vram: 0x8012E7B0, name: ../libultra/src/os/seteventmesg } - { start: auto, type: .bss, vram: 0x8012E830, name: ../libultra/src/io/controller } diff --git a/ver/splat/dkr.pal.v77.yaml b/ver/splat/dkr.pal.v77.yaml index 3d5ff232..040f1da5 100644 --- a/ver/splat/dkr.pal.v77.yaml +++ b/ver/splat/dkr.pal.v77.yaml @@ -43,7 +43,7 @@ segments: - [0x8C40, c, audio_spatial] - [0xB310, c, ../libultra/src/audio/mips1/seqplayer] - [0xBC20, c, objects] - - [0x251F0, hasm, hasm/unknown_0251F0] + - [0x251F0, hasm, hasm/obj_shade_fast] - [0x255E0, c, tracks] - [0x31D30, hasm, hasm/collision] - [0x32760, c, lights] @@ -56,7 +56,7 @@ segments: - [0x5F690, c, vehicle_wizpig] - [0x5FF10, c, vehicle_rocket] - [0x60450, c, object_models] - - [0x62930, hasm, hasm/object_animate] + - [0x62930, hasm, hasm/obj_animate] - [0x62E90, c, ../libultra/src/audio/mips1/csplayer] - [0x64690, c, ../libultra/src/audio/mips1/unknown_064690] - [0x646F0, c, ../libultra/src/audio/mips1/seqchannel] @@ -104,7 +104,7 @@ segments: - [0xC6E00, c, gzip] - [0xC7550, hasm, hasm/gzip_asm] - [0xC7FD0, c, ../libultra/src/io/leointerrupt] - - [0xC7FE0, c, thread30_track_loading] + - [0xC7FE0, c, thread30_bgload] - [0xC81F0, c, ../libultra/src/audio/heapinit] - [0xC8230, c, ../libultra/src/audio/bnkf] - [0xC8480, c, ../libultra/src/audio/heapalloc] @@ -303,7 +303,7 @@ segments: - [0xE4320, .data, font] - [0xE43D0, .data, ../libultra/src/io/pimgr] - [0xE43F0, .data, gzip] - - [0xE4400, .data, thread30_track_loading] + - [0xE4400, .data, thread30_bgload] - [0xE4410, .data, ../libultra/src/audio/sl] - [0xE4420, .data, ../libultra/src/io/aisetnextbuf] - [0xE4430, .data, ../libultra/src/audio/env] @@ -427,7 +427,7 @@ segments: - { start: auto, type: .bss, vram: 0x8012A890, name: ../libultra/src/io/pimgr } - { start: auto, type: .bss, vram: 0x8012AB60, name: gzip } - { start: auto, type: .bss, vram: 0x8012AB70, name: ../libultra/src/io/leointerrupt } - - { start: auto, type: .bss, vram: 0x8012AB80, name: thread30_track_loading } + - { start: auto, type: .bss, vram: 0x8012AB80, name: thread30_bgload } - { start: auto, type: .bss, vram: 0x8012CD50, name: ../libultra/src/os/initialize } - { start: auto, type: .bss, vram: 0x8012CD60, name: ../libultra/src/os/seteventmesg } - { start: auto, type: .bss, vram: 0x8012CDE0, name: ../libultra/src/io/controller } diff --git a/ver/splat/dkr.pal.v80.yaml b/ver/splat/dkr.pal.v80.yaml index 795e6929..b486253d 100644 --- a/ver/splat/dkr.pal.v80.yaml +++ b/ver/splat/dkr.pal.v80.yaml @@ -43,7 +43,7 @@ segments: - [0x8C40, c, audio_spatial] - [0xB310, c, ../libultra/src/audio/mips1/seqplayer] - [0xBC20, c, objects] - - [0x25230, hasm, hasm/unknown_0251F0] + - [0x25230, hasm, hasm/obj_shade_fast] - [0x25620, c, tracks] - [0x31D70, hasm, hasm/collision] - [0x327A0, c, lights] @@ -56,7 +56,7 @@ segments: - [0x5F830, c, vehicle_wizpig] - [0x600B0, c, vehicle_rocket] - [0x605F0, c, object_models] - - [0x62B70, hasm, hasm/object_animate] + - [0x62B70, hasm, hasm/obj_animate] - [0x630D0, c, ../libultra/src/audio/mips1/csplayer] - [0x648D0, c, ../libultra/src/audio/mips1/unknown_064690] - [0x64930, c, ../libultra/src/audio/mips1/seqchannel] @@ -104,7 +104,7 @@ segments: - [0xC7360, c, gzip] - [0xC7AB0, hasm, hasm/gzip_asm] - [0xC8530, c, ../libultra/src/io/leointerrupt] - - [0xC8540, c, thread30_track_loading] + - [0xC8540, c, thread30_bgload] - [0xC8750, c, ../libultra/src/audio/heapinit] - [0xC8790, c, ../libultra/src/audio/bnkf] - [0xC89E0, c, ../libultra/src/audio/heapalloc] @@ -303,7 +303,7 @@ segments: - [0xE48B0, .data, font] - [0xE4960, .data, ../libultra/src/io/pimgr] - [0xE4980, .data, gzip] - - [0xE4990, .data, thread30_track_loading] + - [0xE4990, .data, thread30_bgload] - [0xE49A0, .data, ../libultra/src/audio/sl] - [0xE49B0, .data, ../libultra/src/io/aisetnextbuf] - [0xE49C0, .data, ../libultra/src/audio/env] @@ -427,7 +427,7 @@ segments: - { start: auto, type: .bss, vram: 0x8012AE50, name: ../libultra/src/io/pimgr } - { start: auto, type: .bss, vram: 0x8012B120, name: gzip } - { start: auto, type: .bss, vram: 0x8012B130, name: ../libultra/src/io/leointerrupt } - - { start: auto, type: .bss, vram: 0x8012B140, name: thread30_track_loading } + - { start: auto, type: .bss, vram: 0x8012B140, name: thread30_bgload } - { start: auto, type: .bss, vram: 0x8012D310, name: ../libultra/src/os/initialize } - { start: auto, type: .bss, vram: 0x8012D320, name: ../libultra/src/os/seteventmesg } - { start: auto, type: .bss, vram: 0x8012D3A0, name: ../libultra/src/io/controller } diff --git a/ver/splat/dkr.us.v77.yaml b/ver/splat/dkr.us.v77.yaml index bb04caa8..e04a12cc 100644 --- a/ver/splat/dkr.us.v77.yaml +++ b/ver/splat/dkr.us.v77.yaml @@ -43,7 +43,7 @@ segments: - [0x8C40, c, audio_spatial] - [0xB310, c, ../libultra/src/audio/mips1/seqplayer] - [0xBC20, c, objects] - - [0x251F0, hasm, hasm/unknown_0251F0] + - [0x251F0, hasm, hasm/obj_shade_fast] - [0x255E0, c, tracks] - [0x31D30, hasm, hasm/collision] - [0x32760, c, lights] @@ -56,7 +56,7 @@ segments: - [0x5F690, c, vehicle_wizpig] - [0x5FF10, c, vehicle_rocket] - [0x60450, c, object_models] - - [0x62930, hasm, hasm/object_animate] + - [0x62930, hasm, hasm/obj_animate] - [0x62E90, c, ../libultra/src/audio/mips1/csplayer] - [0x64690, c, ../libultra/src/audio/mips1/unknown_064690] - [0x646F0, c, ../libultra/src/audio/mips1/seqchannel] @@ -104,7 +104,7 @@ segments: - [0xC6D70, c, gzip] - [0xC74C0, hasm, hasm/gzip_asm] - [0xC7F40, c, ../libultra/src/io/leointerrupt] - - [0xC7F50, c, thread30_track_loading] + - [0xC7F50, c, thread30_bgload] - [0xC8160, c, ../libultra/src/audio/heapinit] - [0xC81A0, c, ../libultra/src/audio/bnkf] - [0xC83F0, c, ../libultra/src/audio/heapalloc] @@ -303,7 +303,7 @@ segments: - [0xE4290, .data, font] - [0xE4340, .data, ../libultra/src/io/pimgr] - [0xE4360, .data, gzip] - - [0xE4370, .data, thread30_track_loading] + - [0xE4370, .data, thread30_bgload] - [0xE4380, .data, ../libultra/src/audio/sl] - [0xE4390, .data, ../libultra/src/io/aisetnextbuf] - [0xE43A0, .data, ../libultra/src/audio/env] @@ -427,7 +427,7 @@ segments: - { start: auto, type: .bss, vram: 0x8012A800, name: ../libultra/src/io/pimgr } - { start: auto, type: .bss, vram: 0x8012AAD0, name: gzip } - { start: auto, type: .bss, vram: 0x8012AAE0, name: ../libultra/src/io/leointerrupt } - - { start: auto, type: .bss, vram: 0x8012AAF0, name: thread30_track_loading } + - { start: auto, type: .bss, vram: 0x8012AAF0, name: thread30_bgload } - { start: auto, type: .bss, vram: 0x8012CCC0, name: ../libultra/src/os/initialize } - { start: auto, type: .bss, vram: 0x8012CCD0, name: ../libultra/src/os/seteventmesg } - { start: auto, type: .bss, vram: 0x8012CD50, name: ../libultra/src/io/controller } diff --git a/ver/splat/dkr.us.v80.yaml b/ver/splat/dkr.us.v80.yaml index 43809f67..1a4e8f13 100644 --- a/ver/splat/dkr.us.v80.yaml +++ b/ver/splat/dkr.us.v80.yaml @@ -43,7 +43,7 @@ segments: - [0x8C40, c, audio_spatial] - [0xB310, c, ../libultra/src/audio/mips1/seqplayer] - [0xBC20, c, objects] - - [0x25230, hasm, hasm/unknown_0251F0] + - [0x25230, hasm, hasm/obj_shade_fast] - [0x25620, c, tracks] - [0x31D70, hasm, hasm/collision] - [0x327A0, c, lights] @@ -56,7 +56,7 @@ segments: - [0x5F830, c, vehicle_wizpig] - [0x600B0, c, vehicle_rocket] - [0x605F0, c, object_models] - - [0x62B70, hasm, hasm/object_animate] + - [0x62B70, hasm, hasm/obj_animate] - [0x630D0, c, ../libultra/src/audio/mips1/csplayer] - [0x648D0, c, ../libultra/src/audio/mips1/unknown_064690] - [0x64930, c, ../libultra/src/audio/mips1/seqchannel] @@ -104,7 +104,7 @@ segments: - [0xC72D0, c, gzip] - [0xC7A20, hasm, hasm/gzip_asm] - [0xC84A0, c, ../libultra/src/io/leointerrupt] - - [0xC84B0, c, thread30_track_loading] + - [0xC84B0, c, thread30_bgload] - [0xC86C0, c, ../libultra/src/audio/heapinit] - [0xC8700, c, ../libultra/src/audio/bnkf] - [0xC8950, c, ../libultra/src/audio/heapalloc] @@ -303,7 +303,7 @@ segments: - [0xE4820, .data, font] - [0xE48D0, .data, ../libultra/src/io/pimgr] - [0xE48F0, .data, gzip] - - [0xE4900, .data, thread30_track_loading] + - [0xE4900, .data, thread30_bgload] - [0xE4910, .data, ../libultra/src/audio/sl] - [0xE4920, .data, ../libultra/src/io/aisetnextbuf] - [0xE4930, .data, ../libultra/src/audio/env] @@ -427,7 +427,7 @@ segments: - { start: auto, type: .bss, vram: 0x8012ADC0, name: ../libultra/src/io/pimgr } - { start: auto, type: .bss, vram: 0x8012B090, name: gzip } - { start: auto, type: .bss, vram: 0x8012B0A0, name: ../libultra/src/io/leointerrupt } - - { start: auto, type: .bss, vram: 0x8012B0B0, name: thread30_track_loading } + - { start: auto, type: .bss, vram: 0x8012B0B0, name: thread30_bgload } - { start: auto, type: .bss, vram: 0x8012D280, name: ../libultra/src/os/initialize } - { start: auto, type: .bss, vram: 0x8012D290, name: ../libultra/src/os/seteventmesg } - { start: auto, type: .bss, vram: 0x8012D310, name: ../libultra/src/io/controller } diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 7f39c2a8..bcb4bbb0 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -214,8 +214,8 @@ func_8000E79C = 0x8000E79C; func_8000E898 = 0x8000E898; get_object = 0x8000E948; objGetObjList = 0x8000E988; -get_object_count = 0x8000E9B0; -get_particle_count = 0x8000E9C0; +obj_count = 0x8000E9B0; +particle_count = 0x8000E9C0; func_8000E9D0 = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; @@ -264,7 +264,7 @@ render_bubble_trap = 0x800138A8; render_racer_shield = 0x80013A0C; render_racer_magnet = 0x80013DCC; func_80014090 = 0x80014090; -func_800142B8 = 0x800142B8; +obj_tick_anims = 0x800142B8; render_mesh = 0x800143A8; func_80014814 = 0x80014814; func_800149C0 = 0x800149C0; @@ -341,7 +341,7 @@ set_world_shading = 0x8001D258; add_shading_properties = 0x8001D2A0; set_shading_properties = 0x8001D4B4; update_envmap_position = 0x8001D5E0; -calc_dyn_light_and_env_map_for_object = 0x8001D6E4; +obj_shade_fancy = 0x8001D6E4; calc_dynamic_lighting_for_object_1 = 0x8001D80C; calc_env_mapping_for_object = 0x8001DD54; set_racer_position_and_angle = 0x8001E13C; @@ -396,8 +396,8 @@ func_8002458C = 0x8002458C; func_80024594 = 0x80024594; func_800245B4 = 0x800245B4; -// unknown_0251F0.c .text -func_800245F0 = 0x800245F0; +// obj_shade_fast.c .text +obj_shade_fast = 0x800245F0; calc_dynamic_lighting_for_object_2 = 0x80024744; // tracks.c .text @@ -784,7 +784,7 @@ update_rocket = 0x8005F340; // object_models.c .text allocate_object_model_pools = 0x8005F880; object_model_init = 0x8005F9CC; -func_8005FCD0 = 0x8005FDA0; +model_init_type = 0x8005FDA0; free_3d_model = 0x80060010; free_model_data = 0x80060128; func_8006017C = 0x8006024C; @@ -796,8 +796,8 @@ func_800619F4 = 0x80061AC4; func_80061A00 = 0x80061AD0; func_80061C0C = 0x80061CDC; -// object_animate.c .text -object_animate = 0x80061E00; +// obj_animate.c .text +obj_animate = 0x80061E00; // csplayer.c .text alCSPNew = 0x80062360; @@ -1303,8 +1303,8 @@ update_pulsating_light_data = 0x8007F770; func_8007F594 = 0x8007F8A4; // screen_asset.c .text -load_screen = 0x8007F950; -render_screen = 0x8007FA24; +screenimage_load = 0x8007F950; +screenimage_draw = 0x8007FA24; //menu.c .text load_menu_text = 0x8007FC10; @@ -1536,55 +1536,55 @@ is_tt_unlocked = 0x8009F27C; is_drumstick_unlocked = 0x8009F294; // game_ui.c .text -init_hud = 0x8009F2B0; +hud_init = 0x8009F2B0; func_8009F034 = 0x8009F5F4; -free_hud = 0x800A05FC; +hud_free = 0x800A05FC; race_starting = 0x800A0750; -render_hud = 0x800A0760; +hud_render_player = 0x800A0760; hud_audio_init = 0x800A1134; hud_audio_update = 0x800A1194; -render_hud_race = 0x800A1380; -render_course_indicator_arrows = 0x800A1474; -render_hud_banana_challenge = 0x800A1808; -render_hud_challenge_eggs = 0x800A19E8; +hud_main_race = 0x800A1380; +hud_course_arrows = 0x800A1474; +hud_main_treasure = 0x800A1808; +hud_main_eggs = 0x800A19E8; hud_draw_eggs = 0x800A1AB0; hud_eggs_portrait = 0x800A1F64; -render_hud_battle = 0x800A21C4; +hud_main_battle = 0x800A21C4; func_800A1E48 = 0x800A2408; -hud_draw_lives = 0x800A28B4; -render_hud_race_boss = 0x800A2B4C; -render_hud_taj_race = 0x800A2BFC; -render_hud_hubworld = 0x800A2C88; -func_800A277C = 0x800A2D3C; -set_stopwatch_face = 0x800A3C94; +hud_lives_render = 0x800A28B4; +hud_main_boss = 0x800A2B4C; +hud_main_taj = 0x800A2BFC; +hud_main_hub = 0x800A2C88; +hud_main_time_trial = 0x800A2D3C; +hud_stopwatch_face = 0x800A3C94; hud_speedometre_reset = 0x800A3E38; -render_speedometer = 0x800A3E4C; -render_race_start = 0x800A42AC; -render_racer_bananas = 0x800A471C; -render_treasure_hud = 0x800A4BB8; -render_silver_coin_counter = 0x800A4D68; -render_race_finish_position = 0x800A4F44; +hud_speedometre = 0x800A3E4C; +hud_race_start = 0x800A42AC; +hud_bananas = 0x800A471C; +hud_treasure = 0x800A4BB8; +hud_silver_coins = 0x800A4D68; +hud_race_finish_1player = 0x800A4F44; func_800A4C34 = 0x800A51FC; -render_race_position = 0x800A520C; -render_lap_count = 0x800A5518; -render_wrong_way_text = 0x800A602C; -hud_draw_finish_misc = 0x800A64E0; -func_800A6254 = 0x800A6844; -play_time_trial_end_message = 0x800A73A4; -render_time_trial_finish = 0x800A7434; -render_balloon_count = 0x800A7790; +hud_race_position = 0x800A520C; +hud_lap_count = 0x800A5518; +hud_wrong_way = 0x800A602C; +hud_finish_position = 0x800A64E0; +hud_race_finish_multiplayer = 0x800A6844; +hud_time_trial_message = 0x800A73A4; +hud_time_trial_finish = 0x800A7434; +hud_balloons = 0x800A7790; hud_sound_play = 0x800A7A44; hud_sound_play_delayed = 0x800A7A88; hud_sound_stop = 0x800A7AF0; -render_weapon_hud = 0x800A7B24; -render_magnet_reticle = 0x800A8064; -render_race_time = 0x800A816C; -render_timer = 0x800A85C0; +hud_weapon = 0x800A7B24; +hud_magnet_reticle = 0x800A8064; +hud_race_time = 0x800A816C; +hud_timer_render = 0x800A85C0; minimap_init = 0x800A89B8; -get_hud_setting = 0x800A8A5C; -render_minimap_and_misc_hud = 0x800A8A78; +hud_setting = 0x800A8A5C; +hud_render_general = 0x800A8A78; minimap_marker_pos = 0x800AA9F0; -func_800AA600 = 0x800AAC04; +hud_element_render = 0x800AAC04; hud_draw_model = 0x800AB5D4; minimap_fade = 0x800AB798; minimap_opacity_set = 0x800AB7B0; @@ -1758,24 +1758,24 @@ enable_new_screen_transitions = 0x800C0770; disable_new_screen_transitions = 0x800C0780; check_fadeout_transition = 0x800C078C; transition_begin = 0x800C07D8; -handle_transitions = 0x800C0A94; -render_fade_transition = 0x800C0BC8; +transition_update = 0x800C0A94; +transition_render = 0x800C0BC8; transition_end = 0x800C0D24; transition_fullscreen_start = 0x800C0D80; -process_transition_fullscreen = 0x800C0E34; -render_fade_fullscreen = 0x800C1008; -init_transition_shape = 0x800C1100; -process_transition_shape = 0x800C1730; -render_fade_barndoor_horizontal = 0x800C19E4; -render_fade_barndoor_vertical = 0x800C1ADC; -func_800C15D4 = 0x800C1BD4; -func_800C1EE8 = 0x800C24E8; -render_fade_circle = 0x800C2874; -render_fade_waves = 0x800C29F8; -render_fade_barndoor_diagonal = 0x800C2B48; -init_transition_blank = 0x800C2C40; -process_transition_disabled = 0x800C2DA0; -render_fade_disabled = 0x800C2EE8; +transition_update_fullscreen = 0x800C0E34; +transition_render_fullscreen = 0x800C1008; +transition_init_shape = 0x800C1100; +transition_update_shape = 0x800C1730; +transition_render_barndoor_hor = 0x800C19E4; +transition_render_barndoor_vert = 0x800C1ADC; +transition_init_circle = 0x800C1BD4; +transition_update_circle = 0x800C24E8; +transition_render_circle = 0x800C2874; +transition_render_waves = 0x800C29F8; +transition_render_barndoor_diag = 0x800C2B48; +transition_init_blank = 0x800C2C40; +transition_update_blank = 0x800C2DA0; +transition_render_blank = 0x800C2EE8; // game_text.c .text init_dialogue_text = 0x800C2FF0; @@ -1855,14 +1855,14 @@ gzip_inflate_codes = 0x800C89D0; __osLeoInterrupt = 0x800C8CD0; -// thread30_track_loading.c .text -create_and_start_thread30 = 0x800C8CE0; -stop_thread30 = 0x800C8D4C; -get_thread30_need_to_load_level = 0x800C8D70; -tick_thread30 = 0x800C8D80; -get_thread30_load_delay = 0x800C8DD8; -set_level_to_load_in_background = 0x800C8DE8; -thread30_track_loading = 0x800C8E30; // type:func +// thread30_bgload.c .text +bgload_init = 0x800C8CE0; +bgload_kill = 0x800C8D4C; +bgload_active = 0x800C8D70; +bgload_tick = 0x800C8D80; +bgload_timer = 0x800C8DD8; +bgload_start = 0x800C8DE8; +thread30_bgload = 0x800C8E30; // type:func // alHeapInit.c .text alHeapInit = 0x800C8EF0; @@ -2906,18 +2906,18 @@ sTransitionVtx = 0x800E4CB0; sTransitionTris = 0x800E4CB8; sTransitionTaskNum = 0x800E4CC0; dTransitionFadeSettings = 0x800E4CC8; -gTransitionBarnHorizontalData = 0x800E4D20; -gTransitionBarnVerticalData = 0x800E4D58; +gTransitionBarnHorizontalCoords = 0x800E4D20; +gTransitionBarnVerticalCoords = 0x800E4D58; D_800E32A0 = 0x800E4D90; D_800E32AC = 0x800E4D9C; gTransitionBarnDoorTris = 0x800E4DA8; gTransitionBarnDoorAlpha = 0x800E4DC0; -gTransitionBarnDiagData = 0x800E4DCC; +gTransitionBarnDiagCoords = 0x800E4DCC; D_800E330C = 0x800E4DFC; D_800E3318 = 0x800E4E08; gTransitionBarnDoorDiagTris = 0x800E4E14; gTransitionBarnDoorDiagAlpha = 0x800E4E28; -gTransitionWaveData = 0x800E4E34; +gTransitionWaveCoords = 0x800E4E34; D_800E3440 = 0x800E4F30; D_800E349C = 0x800E4F8C; gTransitionWaveAlpha = 0x800E4FE8; @@ -2946,7 +2946,7 @@ gPackedHeader = 0x800E52C4; gzip_inflate_input = 0x800E52C8; gzip_inflate_output = 0x800E52CC; -// thread30_track_loading.c .data +// thread30_bgload.c .data gThread30NeedToLoadLevel = 0x800E52D0; gThread30LevelIdToLoad = 0x800E52D4; gThread30CutsceneIdToLoad = 0x800E52D8; @@ -3915,9 +3915,9 @@ gRocketStartBoost = 0x8011F081; // object_models .bss gObjectModelTable = 0x8011F090; -D_8011D624 = 0x8011F094; +gModelCache = 0x8011F094; D_8011D628 = 0x8011F098; -D_8011D62C = 0x8011F09C; +gModelCacheCount = 0x8011F09C; gNumModelIDs = 0x8011F0A0; D_8011D634 = 0x8011F0A4; gAnimationTable = 0x8011F0A8; @@ -4370,12 +4370,12 @@ gPlayerHud = 0x80128790; // size:0x10 gAssetHudElementIds = 0x801287A0; gAssetHudElements = 0x801287A4; gAssetHudElementIdsCount = 0x801287A8; -gHUDCurrDisplayList = 0x801287AC; -gHUDCurrMatrix = 0x801287B0; -gHUDCurrVertex = 0x801287B4; +gHudDL = 0x801287AC; +gHudMtx = 0x801287B0; +gHudVtx = 0x801287B4; gHudCurrentViewport = 0x801287B8; gHUDNumPlayers = 0x801287BC; -D_80126D10 = 0x801287C0; +gHudController = 0x801287C0; D_80126D14 = 0x801287C4; D_80126D18 = 0x801287C8; gMinimapDotOffsetX = 0x801287CC; @@ -4385,13 +4385,13 @@ gHudBounceX = 0x801287D8; gHudBounceTimer = 0x801287DC; gHudBounceMag = 0x801287E0; gHudRaceStart = 0x801287E4; -D_80126D35 = 0x801287E5; +gHudSlide = 0x801287E5; gHideRaceTimer = 0x801287E6; gNumActivePlayers = 0x801287E7; gWrongWayNagPrefix = 0x801287E8; gRaceStartSoundMask = 0x801287EC; gHUDVoiceSoundMask = 0x801287F0; -D_80126D44 = 0x801287F4; +gHudBalloonSoundMask = 0x801287F4; D_80126D48 = 0x801287F8; D_80126D4C = 0x801287FC; D_80126D50 = 0x80128800; @@ -4621,7 +4621,7 @@ gzip_bit_buffer = 0x8012C5B0; gzip_num_bits = 0x8012C5B4; gHuftTablePos = 0x8012C5B8; -// thread30_track_loading .bss +// thread30_bgload .bss leoDiskStack = 0x8012C5C0; gThread30 = 0x8012C5D0; gThread30MesgQueue = 0x8012C780; // type:OSMesgQueue size:0x18 diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 21615efc..bf4a7e32 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -214,8 +214,8 @@ func_8000E79C = 0x8000E79C; func_8000E898 = 0x8000E898; get_object = 0x8000E948; objGetObjList = 0x8000E988; -get_object_count = 0x8000E9B0; -get_particle_count = 0x8000E9C0; +obj_count = 0x8000E9B0; +particle_count = 0x8000E9C0; func_8000E9D0 = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; @@ -264,7 +264,7 @@ render_bubble_trap = 0x800138A8; render_racer_shield = 0x80013A0C; render_racer_magnet = 0x80013DCC; func_80014090 = 0x80014090; -func_800142B8 = 0x800142B8; +obj_tick_anims = 0x800142B8; render_mesh = 0x800143A8; func_80014814 = 0x80014814; func_800149C0 = 0x800149C0; @@ -341,7 +341,7 @@ set_world_shading = 0x8001D258; add_shading_properties = 0x8001D2A0; set_shading_properties = 0x8001D4B4; update_envmap_position = 0x8001D5E0; -calc_dyn_light_and_env_map_for_object = 0x8001D6E4; +obj_shade_fancy = 0x8001D6E4; calc_dynamic_lighting_for_object_1 = 0x8001D80C; calc_env_mapping_for_object = 0x8001DD54; set_racer_position_and_angle = 0x8001E13C; @@ -396,8 +396,8 @@ func_8002458C = 0x8002458C; func_80024594 = 0x80024594; func_800245B4 = 0x800245B4; -// unknown_0251F0.c .text -func_800245F0 = 0x800245F0; +// obj_shade_fast.c .text +obj_shade_fast = 0x800245F0; calc_dynamic_lighting_for_object_2 = 0x80024744; // tracks.c .text @@ -782,7 +782,7 @@ update_rocket = 0x8005F310; // object_models.c .text allocate_object_model_pools = 0x8005F850; object_model_init = 0x8005F99C; -func_8005FCD0 = 0x8005FCD0; +model_init_type = 0x8005FCD0; free_3d_model = 0x8005FF40; free_model_data = 0x80060058; func_8006017C = 0x8006017C; @@ -794,8 +794,8 @@ func_800619F4 = 0x800619F4; func_80061A00 = 0x80061A00; func_80061C0C = 0x80061C0C; -// object_animate.c .text -object_animate = 0x80061D30; +// obj_animate.c .text +obj_animate = 0x80061D30; // csplayer.c .text alCSPNew = 0x80062290; @@ -1299,8 +1299,8 @@ update_pulsating_light_data = 0x8007F460; func_8007F594 = 0x8007F594; // screen_asset.c .text -load_screen = 0x8007F640; -render_screen = 0x8007F714; +screenimage_load = 0x8007F640; +screenimage_draw = 0x8007F714; //menu.c .text load_menu_text = 0x8007F900; @@ -1529,55 +1529,55 @@ is_in_adventure_two = 0x8009ED04; is_in_two_player_adventure = 0x8009ED14; is_tt_unlocked = 0x8009ED4C; is_drumstick_unlocked = 0x8009ED64; -init_hud = 0x8009ED80; +hud_init = 0x8009ED80; func_8009F034 = 0x8009F0C4; -free_hud = 0x800A00CC; +hud_free = 0x800A00CC; race_starting = 0x800A0220; -render_hud = 0x800A0230; +hud_render_player = 0x800A0230; hud_audio_init = 0x800A0C04; hud_audio_update = 0x800A0C64; -render_hud_race = 0x800A0E50; -render_course_indicator_arrows = 0x800A0F44; -render_hud_banana_challenge = 0x800A12D8; -render_hud_challenge_eggs = 0x800A14B8; +hud_main_race = 0x800A0E50; +hud_course_arrows = 0x800A0F44; +hud_main_treasure = 0x800A12D8; +hud_main_eggs = 0x800A14B8; hud_draw_eggs = 0x800A1580; hud_eggs_portrait = 0x800A1A34; -render_hud_battle = 0x800A1C94; +hud_main_battle = 0x800A1C94; func_800A1E48 = 0x800A1ED8; -hud_draw_lives = 0x800A2384; -render_hud_race_boss = 0x800A261C; -render_hud_taj_race = 0x800A26CC; -render_hud_hubworld = 0x800A2758; -func_800A277C = 0x800A280C; -set_stopwatch_face = 0x800A375C; +hud_lives_render = 0x800A2384; +hud_main_boss = 0x800A261C; +hud_main_taj = 0x800A26CC; +hud_main_hub = 0x800A2758; +hud_main_time_trial = 0x800A280C; +hud_stopwatch_face = 0x800A375C; hud_speedometre_reset = 0x800A3900; -render_speedometer = 0x800A3914; -render_race_start = 0x800A3D74; -render_racer_bananas = 0x800A41E4; -render_treasure_hud = 0x800A4680; -render_silver_coin_counter = 0x800A4830; -render_race_finish_position = 0x800A4A0C; +hud_speedometre = 0x800A3914; +hud_race_start = 0x800A3D74; +hud_bananas = 0x800A41E4; +hud_treasure = 0x800A4680; +hud_silver_coins = 0x800A4830; +hud_race_finish_1player = 0x800A4A0C; func_800A4C34 = 0x800A4CC4; -render_race_position = 0x800A4CD4; -render_lap_count = 0x800A4FE0; -render_wrong_way_text = 0x800A5AF4; -hud_draw_finish_misc = 0x800A5FA8; -func_800A6254 = 0x800A62E4; -play_time_trial_end_message = 0x800A6E44; -render_time_trial_finish = 0x800A6EC0; -render_balloon_count = 0x800A721C; +hud_race_position = 0x800A4CD4; +hud_lap_count = 0x800A4FE0; +hud_wrong_way = 0x800A5AF4; +hud_finish_position = 0x800A5FA8; +hud_race_finish_multiplayer = 0x800A62E4; +hud_time_trial_message = 0x800A6E44; +hud_time_trial_finish = 0x800A6EC0; +hud_balloons = 0x800A721C; hud_sound_play = 0x800A74D0; hud_sound_play_delayed = 0x800A7514; hud_sound_stop = 0x800A757C; -render_weapon_hud = 0x800A75B0; -render_magnet_reticle = 0x800A7AF0; -render_race_time = 0x800A7BF8; -render_timer = 0x800A804C; +hud_weapon = 0x800A75B0; +hud_magnet_reticle = 0x800A7AF0; +hud_race_time = 0x800A7BF8; +hud_timer_render = 0x800A804C; minimap_init = 0x800A8444; -get_hud_setting = 0x800A84E8; -render_minimap_and_misc_hud = 0x800A8504; +hud_setting = 0x800A84E8; +hud_render_general = 0x800A8504; minimap_marker_pos = 0x800AA47C; -func_800AA600 = 0x800AA690; +hud_element_render = 0x800AA690; hud_draw_model = 0x800AB060; minimap_fade = 0x800AB224; minimap_opacity_set = 0x800AB23C; @@ -1732,24 +1732,24 @@ enable_new_screen_transitions = 0x800C0200; disable_new_screen_transitions = 0x800C0210; check_fadeout_transition = 0x800C021C; transition_begin = 0x800C0268; -handle_transitions = 0x800C0524; -render_fade_transition = 0x800C0658; +transition_update = 0x800C0524; +transition_render = 0x800C0658; transition_end = 0x800C07B4; transition_fullscreen_start = 0x800C0810; -process_transition_fullscreen = 0x800C08C4; -render_fade_fullscreen = 0x800C0A98; -init_transition_shape = 0x800C0B90; -process_transition_shape = 0x800C11C0; -render_fade_barndoor_horizontal = 0x800C1474; -render_fade_barndoor_vertical = 0x800C156C; -func_800C15D4 = 0x800C1664; -func_800C1EE8 = 0x800C1F78; -render_fade_circle = 0x800C2304; -render_fade_waves = 0x800C2488; -render_fade_barndoor_diagonal = 0x800C25D8; -init_transition_blank = 0x800C26D0; -process_transition_disabled = 0x800C2830; -render_fade_disabled = 0x800C2978; +transition_update_fullscreen = 0x800C08C4; +transition_render_fullscreen = 0x800C0A98; +transition_init_shape = 0x800C0B90; +transition_update_shape = 0x800C11C0; +transition_render_barndoor_hor = 0x800C1474; +transition_render_barndoor_vert = 0x800C156C; +transition_init_circle = 0x800C1664; +transition_update_circle = 0x800C1F78; +transition_render_circle = 0x800C2304; +transition_render_waves = 0x800C2488; +transition_render_barndoor_diag = 0x800C25D8; +transition_init_blank = 0x800C26D0; +transition_update_blank = 0x800C2830; +transition_render_blank = 0x800C2978; init_dialogue_text = 0x800C2A80; free_message_box = 0x800C2B44; set_subtitles = 0x800C2B84; @@ -1815,13 +1815,13 @@ gzip_inflate_fixed = 0x800C6E6C; gzip_inflate_stored = 0x800C6FC4; gzip_inflate_codes = 0x800C70D0; __osLeoInterrupt = 0x800C73D0; -create_and_start_thread30 = 0x800C73E0; -stop_thread30 = 0x800C744C; -get_thread30_need_to_load_level = 0x800C7470; -tick_thread30 = 0x800C7480; -get_thread30_load_delay = 0x800C74D8; -set_level_to_load_in_background = 0x800C74E8; -thread30_track_loading = 0x800C7530; // type:func +bgload_init = 0x800C73E0; +bgload_kill = 0x800C744C; +bgload_active = 0x800C7470; +bgload_tick = 0x800C7480; +bgload_timer = 0x800C74D8; +bgload_start = 0x800C74E8; +thread30_bgload = 0x800C7530; // type:func alHeapInit = 0x800C75F0; alBnkfNew = 0x800C7734; alSeqFileNew = 0x800C7838; @@ -2738,18 +2738,18 @@ sTransitionVtx = 0x800E3250; sTransitionTris = 0x800E3258; sTransitionTaskNum = 0x800E3260; dTransitionFadeSettings = 0x800E3268; -gTransitionBarnHorizontalData = 0x800E32C0; -gTransitionBarnVerticalData = 0x800E32F8; +gTransitionBarnHorizontalCoords = 0x800E32C0; +gTransitionBarnVerticalCoords = 0x800E32F8; D_800E32A0 = 0x800E3330; D_800E32AC = 0x800E333C; gTransitionBarnDoorTris = 0x800E3348; gTransitionBarnDoorAlpha = 0x800E3360; -gTransitionBarnDiagData = 0x800E336C; +gTransitionBarnDiagCoords = 0x800E336C; D_800E330C = 0x800E339C; D_800E3318 = 0x800E33A8; gTransitionBarnDoorDiagTris = 0x800E33B4; gTransitionBarnDoorDiagAlpha = 0x800E33C8; -gTransitionWaveData = 0x800E33D4; +gTransitionWaveCoords = 0x800E33D4; D_800E3440 = 0x800E34D0; D_800E349C = 0x800E352C; gTransitionWaveAlpha = 0x800E3588; @@ -3640,9 +3640,9 @@ gWizpigStartBoost = 0x8011D691; gRocketCutsceneTimer = 0x8011D6A0; gRocketStartBoost = 0x8011D6A1; gObjectModelTable = 0x8011D6B0; -D_8011D624 = 0x8011D6B4; +gModelCache = 0x8011D6B4; D_8011D628 = 0x8011D6B8; -D_8011D62C = 0x8011D6BC; +gModelCacheCount = 0x8011D6BC; gNumModelIDs = 0x8011D6C0; D_8011D634 = 0x8011D6C4; gAnimationTable = 0x8011D6C8; @@ -4068,12 +4068,12 @@ gPlayerHud = 0x80126D70; // size:0x10 gAssetHudElementIds = 0x80126D80; gAssetHudElements = 0x80126D84; gAssetHudElementIdsCount = 0x80126D88; -gHUDCurrDisplayList = 0x80126D8C; -gHUDCurrMatrix = 0x80126D90; -gHUDCurrVertex = 0x80126D94; +gHudDL = 0x80126D8C; +gHudMtx = 0x80126D90; +gHudVtx = 0x80126D94; gHudCurrentViewport = 0x80126D98; gHUDNumPlayers = 0x80126D9C; -D_80126D10 = 0x80126DA0; +gHudController = 0x80126DA0; D_80126D14 = 0x80126DA4; D_80126D18 = 0x80126DA8; gMinimapDotOffsetX = 0x80126DAC; @@ -4083,13 +4083,13 @@ gHudBounceX = 0x80126DB8; gHudBounceTimer = 0x80126DBC; gHudBounceMag = 0x80126DC0; gHudRaceStart = 0x80126DC4; -D_80126D35 = 0x80126DC5; +gHudSlide = 0x80126DC5; gHideRaceTimer = 0x80126DC6; gNumActivePlayers = 0x80126DC7; gWrongWayNagPrefix = 0x80126DC8; gRaceStartSoundMask = 0x80126DCC; gHUDVoiceSoundMask = 0x80126DD0; -D_80126D44 = 0x80126DD4; +gHudBalloonSoundMask = 0x80126DD4; D_80126D48 = 0x80126DD8; D_80126D4C = 0x80126DDC; D_80126D50 = 0x80126DE0; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 598bd1ee..6574a516 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -214,8 +214,8 @@ func_8000E79C = 0x8000E79C; func_8000E898 = 0x8000E898; get_object = 0x8000E948; objGetObjList = 0x8000E988; -get_object_count = 0x8000E9B0; -get_particle_count = 0x8000E9C0; +obj_count = 0x8000E9B0; +particle_count = 0x8000E9C0; func_8000E9D0 = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; @@ -264,7 +264,7 @@ render_bubble_trap = 0x800138A8; render_racer_shield = 0x80013A0C; render_racer_magnet = 0x80013DCC; func_80014090 = 0x80014090; -func_800142B8 = 0x800142B8; +obj_tick_anims = 0x800142B8; render_mesh = 0x800143A8; func_80014814 = 0x80014814; func_800149C0 = 0x800149C0; @@ -341,7 +341,7 @@ set_world_shading = 0x8001D28C; add_shading_properties = 0x8001D2D4; set_shading_properties = 0x8001D4E8; update_envmap_position = 0x8001D614; -calc_dyn_light_and_env_map_for_object = 0x8001D718; +obj_shade_fancy = 0x8001D718; calc_dynamic_lighting_for_object_1 = 0x8001D840; calc_env_mapping_for_object = 0x8001DD88; set_racer_position_and_angle = 0x8001E170; @@ -395,7 +395,7 @@ run_object_loop_func = 0x80023F7C; func_8002458C = 0x800245C0; func_80024594 = 0x800245C8; func_800245B4 = 0x800245E8; -func_800245F0 = 0x80024630; +obj_shade_fast = 0x80024630; calc_dynamic_lighting_for_object_2 = 0x80024784; set_scene_viewport_num = 0x80024A20; init_track = 0x80024A30; @@ -756,7 +756,7 @@ update_wizpig = 0x8005EC30; update_rocket = 0x8005F4B0; allocate_object_model_pools = 0x8005F9F0; object_model_init = 0x8005FB3C; // has a diff from v1 -func_8005FCD0 = 0x8005FF10; +model_init_type = 0x8005FF10; free_3d_model = 0x80060180; free_model_data = 0x80060298; func_8006017C = 0x800603BC; @@ -767,7 +767,7 @@ func_80060EA8 = 0x800610E8; func_800619F4 = 0x80061C34; func_80061A00 = 0x80061C40; func_80061C0C = 0x80061E4C; -object_animate = 0x80061F70; +obj_animate = 0x80061F70; alCSPNew = 0x800624D0; __CSPVoiceHandler = 0x80062648; __CSPPostNextSeqEvent = 0x80062C0C; @@ -1220,8 +1220,8 @@ update_colour_cycle = 0x8007F69C; init_pulsating_light_data = 0x8007F864; update_pulsating_light_data = 0x8007F8B0; func_8007F594 = 0x8007F9E4; -load_screen = 0x8007FA90; -render_screen = 0x8007FB64; +screenimage_load = 0x8007FA90; +screenimage_draw = 0x8007FB64; load_menu_text = 0x8007FD50; menu_button_free = 0x800803D8; func_8007FFEC = 0x8008043C; @@ -1450,55 +1450,55 @@ is_tt_unlocked = 0x8009F290; is_drumstick_unlocked = 0x8009F2A8; -init_hud = 0x8009F2C0; +hud_init = 0x8009F2C0; func_8009F034 = 0x8009F604; -free_hud = 0x800A060C; +hud_free = 0x800A060C; race_starting = 0x800A0760; -render_hud = 0x800A0770; +hud_render_player = 0x800A0770; hud_audio_init = 0x800A1144; hud_audio_update = 0x800A11A4; -render_hud_race = 0x800A1390; -render_course_indicator_arrows = 0x800A1484; -render_hud_banana_challenge = 0x800A1818; -render_hud_challenge_eggs = 0x800A19F8; +hud_main_race = 0x800A1390; +hud_course_arrows = 0x800A1484; +hud_main_treasure = 0x800A1818; +hud_main_eggs = 0x800A19F8; hud_draw_eggs = 0x800A1AC0; hud_eggs_portrait = 0x800A1F74; -render_hud_battle = 0x800A21D4; +hud_main_battle = 0x800A21D4; func_800A1E48 = 0x800A2418; -hud_draw_lives = 0x800A28C4; -render_hud_race_boss = 0x800A2B5C; -render_hud_taj_race = 0x800A2C0C; -render_hud_hubworld = 0x800A2C98; -func_800A277C = 0x800A2D4C; // has a diff from v1 -set_stopwatch_face = 0x800A3CA4; +hud_lives_render = 0x800A28C4; +hud_main_boss = 0x800A2B5C; +hud_main_taj = 0x800A2C0C; +hud_main_hub = 0x800A2C98; +hud_main_time_trial = 0x800A2D4C; // has a diff from v1 +hud_stopwatch_face = 0x800A3CA4; hud_speedometre_reset = 0x800A3E48; -render_speedometer = 0x800A3E5C; -render_race_start = 0x800A42BC; -render_racer_bananas = 0x800A472C; -render_treasure_hud = 0x800A4BC8; -render_silver_coin_counter = 0x800A4D78; -render_race_finish_position = 0x800A4F54; +hud_speedometre = 0x800A3E5C; +hud_race_start = 0x800A42BC; +hud_bananas = 0x800A472C; +hud_treasure = 0x800A4BC8; +hud_silver_coins = 0x800A4D78; +hud_race_finish_1player = 0x800A4F54; func_800A4C34 = 0x800A520C; -render_race_position = 0x800A521C; -render_lap_count = 0x800A5528; -render_wrong_way_text = 0x800A603C; -hud_draw_finish_misc = 0x800A64F0; -func_800A6254 = 0x800A682C; -play_time_trial_end_message = 0x800A738C; // has a diff from v1 -render_time_trial_finish = 0x800A741C; -render_balloon_count = 0x800A7778; +hud_race_position = 0x800A521C; +hud_lap_count = 0x800A5528; +hud_wrong_way = 0x800A603C; +hud_finish_position = 0x800A64F0; +hud_race_finish_multiplayer = 0x800A682C; +hud_time_trial_message = 0x800A738C; // has a diff from v1 +hud_time_trial_finish = 0x800A741C; +hud_balloons = 0x800A7778; hud_sound_play = 0x800A7A2C; hud_sound_play_delayed = 0x800A7A70; hud_sound_stop = 0x800A7AD8; -render_weapon_hud = 0x800A7B0C; -render_magnet_reticle = 0x800A804C; -render_race_time = 0x800A8154; -render_timer = 0x800A85A8; +hud_weapon = 0x800A7B0C; +hud_magnet_reticle = 0x800A804C; +hud_race_time = 0x800A8154; +hud_timer_render = 0x800A85A8; minimap_init = 0x800A89A0; -get_hud_setting = 0x800A8A44; -render_minimap_and_misc_hud = 0x800A8A60; +hud_setting = 0x800A8A44; +hud_render_general = 0x800A8A60; minimap_marker_pos = 0x800AA9D8; -func_800AA600 = 0x800AABEC; +hud_element_render = 0x800AABEC; hud_draw_model = 0x800AB5BC; minimap_fade = 0x800AB780; minimap_opacity_set = 0x800AB798; @@ -1653,24 +1653,24 @@ enable_new_screen_transitions = 0x800C0720; disable_new_screen_transitions = 0x800C0730; check_fadeout_transition = 0x800C073C; transition_begin = 0x800C0788; -handle_transitions = 0x800C0A44; -render_fade_transition = 0x800C0B78; +transition_update = 0x800C0A44; +transition_render = 0x800C0B78; transition_end = 0x800C0CD4; transition_fullscreen_start = 0x800C0D30; -process_transition_fullscreen = 0x800C0DE4; -render_fade_fullscreen = 0x800C0FB8; -init_transition_shape = 0x800C10B0; -process_transition_shape = 0x800C16E0; -render_fade_barndoor_horizontal = 0x800C1994; -render_fade_barndoor_vertical = 0x800C1A8C; -func_800C15D4 = 0x800C1B84; -func_800C1EE8 = 0x800C2498; -render_fade_circle = 0x800C2824; -render_fade_waves = 0x800C29A8; -render_fade_barndoor_diagonal = 0x800C2AF8; -init_transition_blank = 0x800C2BF0; -process_transition_disabled = 0x800C2D50; -render_fade_disabled = 0x800C2E98; +transition_update_fullscreen = 0x800C0DE4; +transition_render_fullscreen = 0x800C0FB8; +transition_init_shape = 0x800C10B0; +transition_update_shape = 0x800C16E0; +transition_render_barndoor_hor = 0x800C1994; +transition_render_barndoor_vert = 0x800C1A8C; +transition_init_circle = 0x800C1B84; +transition_update_circle = 0x800C2498; +transition_render_circle = 0x800C2824; +transition_render_waves = 0x800C29A8; +transition_render_barndoor_diag = 0x800C2AF8; +transition_init_blank = 0x800C2BF0; +transition_update_blank = 0x800C2D50; +transition_render_blank = 0x800C2E98; init_dialogue_text = 0x800C2FA0; free_message_box = 0x800C3064; set_subtitles = 0x800C30A4; @@ -1736,13 +1736,13 @@ gzip_inflate_fixed = 0x800C73CC; gzip_inflate_stored = 0x800C7524; gzip_inflate_codes = 0x800C7630; __osLeoInterrupt = 0x800C7930; -create_and_start_thread30 = 0x800C7940; -stop_thread30 = 0x800C79AC; -get_thread30_need_to_load_level = 0x800C79D0; -tick_thread30 = 0x800C79E0; -get_thread30_load_delay = 0x800C7A38; -set_level_to_load_in_background = 0x800C7A48; -thread30_track_loading = 0x800C7A90; // type:func +bgload_init = 0x800C7940; +bgload_kill = 0x800C79AC; +bgload_active = 0x800C79D0; +bgload_tick = 0x800C79E0; +bgload_timer = 0x800C7A38; +bgload_start = 0x800C7A48; +thread30_bgload = 0x800C7A90; // type:func alHeapInit = 0x800C7B50; alBnkfNew = 0x800C7C94; alSeqFileNew = 0x800C7D98; @@ -2667,18 +2667,18 @@ sTransitionVtx = 0x800E37E0; sTransitionTris = 0x800E37E8; sTransitionTaskNum = 0x800E37F0; dTransitionFadeSettings = 0x800E37F8; -gTransitionBarnHorizontalData = 0x800E3850; -gTransitionBarnVerticalData = 0x800E3888; +gTransitionBarnHorizontalCoords = 0x800E3850; +gTransitionBarnVerticalCoords = 0x800E3888; D_800E32A0 = 0x800E38C0; D_800E32AC = 0x800E38CC; gTransitionBarnDoorTris = 0x800E38D8; gTransitionBarnDoorAlpha = 0x800E38F0; -gTransitionBarnDiagData = 0x800E38FC; +gTransitionBarnDiagCoords = 0x800E38FC; D_800E330C = 0x800E392C; D_800E3318 = 0x800E3938; gTransitionBarnDoorDiagTris = 0x800E3944; gTransitionBarnDoorDiagAlpha = 0x800E3958; -gTransitionWaveData = 0x800E3964; +gTransitionWaveCoords = 0x800E3964; D_800E3440 = 0x800E3A60; D_800E349C = 0x800E3ABC; gTransitionWaveAlpha = 0x800E3B18; @@ -3570,9 +3570,9 @@ gWizpigStartBoost = 0x8011DC11; gRocketCutsceneTimer = 0x8011DC20; gRocketStartBoost = 0x8011DC21; gObjectModelTable = 0x8011DC30; -D_8011D624 = 0x8011DC34; +gModelCache = 0x8011DC34; D_8011D628 = 0x8011DC38; -D_8011D62C = 0x8011DC3C; +gModelCacheCount = 0x8011DC3C; gNumModelIDs = 0x8011DC40; D_8011D634 = 0x8011DC44; gAnimationTable = 0x8011DC48; @@ -4003,12 +4003,12 @@ gPlayerHud = 0x80127330; // size:0x10 gAssetHudElementIds = 0x80127340; gAssetHudElements = 0x80127344; gAssetHudElementIdsCount = 0x80127348; -gHUDCurrDisplayList = 0x8012734C; -gHUDCurrMatrix = 0x80127350; -gHUDCurrVertex = 0x80127354; +gHudDL = 0x8012734C; +gHudMtx = 0x80127350; +gHudVtx = 0x80127354; gHudCurrentViewport = 0x80127358; gHUDNumPlayers = 0x8012735C; -D_80126D10 = 0x80127360; +gHudController = 0x80127360; D_80126D14 = 0x80127364; D_80126D18 = 0x80127368; gMinimapDotOffsetX = 0x8012736C; @@ -4018,13 +4018,13 @@ gHudBounceX = 0x80127378; gHudBounceTimer = 0x8012737C; gHudBounceMag = 0x80127380; gHudRaceStart = 0x80127384; -D_80126D35 = 0x80127385; +gHudSlide = 0x80127385; gHideRaceTimer = 0x80127386; gNumActivePlayers = 0x80127387; gWrongWayNagPrefix = 0x80127388; gRaceStartSoundMask = 0x8012738C; gHUDVoiceSoundMask = 0x80127390; -D_80126D44 = 0x80127394; +gHudBalloonSoundMask = 0x80127394; D_80126D48 = 0x80127398; D_80126D4C = 0x8012739C; D_80126D50 = 0x801273A0; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index f5520be5..bbbe2811 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -214,8 +214,8 @@ func_8000E79C = 0x8000E79C; func_8000E898 = 0x8000E898; get_object = 0x8000E948; objGetObjList = 0x8000E988; -get_object_count = 0x8000E9B0; -get_particle_count = 0x8000E9C0; +obj_count = 0x8000E9B0; +particle_count = 0x8000E9C0; func_8000E9D0 = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; @@ -264,7 +264,7 @@ render_bubble_trap = 0x800138A8; render_racer_shield = 0x80013A0C; render_racer_magnet = 0x80013DCC; func_80014090 = 0x80014090; -func_800142B8 = 0x800142B8; +obj_tick_anims = 0x800142B8; render_mesh = 0x800143A8; func_80014814 = 0x80014814; func_800149C0 = 0x800149C0; @@ -341,7 +341,7 @@ set_world_shading = 0x8001D258; add_shading_properties = 0x8001D2A0; set_shading_properties = 0x8001D4B4; update_envmap_position = 0x8001D5E0; -calc_dyn_light_and_env_map_for_object = 0x8001D6E4; +obj_shade_fancy = 0x8001D6E4; calc_dynamic_lighting_for_object_1 = 0x8001D80C; calc_env_mapping_for_object = 0x8001DD54; set_racer_position_and_angle = 0x8001E13C; @@ -396,8 +396,8 @@ func_8002458C = 0x8002458C; func_80024594 = 0x80024594; func_800245B4 = 0x800245B4; -// unknown_0251F0.c .text -func_800245F0 = 0x800245F0; +// obj_shade_fast.c .text +obj_shade_fast = 0x800245F0; calc_dynamic_lighting_for_object_2 = 0x80024744; // tracks.c .text @@ -782,7 +782,7 @@ update_rocket = 0x8005F310; // object_models.c .text allocate_object_model_pools = 0x8005F850; object_model_init = 0x8005F99C; -func_8005FCD0 = 0x8005FCD0; +model_init_type = 0x8005FCD0; free_3d_model = 0x8005FF40; free_model_data = 0x80060058; func_8006017C = 0x8006017C; @@ -794,8 +794,8 @@ func_800619F4 = 0x800619F4; func_80061A00 = 0x80061A00; func_80061C0C = 0x80061C0C; -// object_animate.c .text -object_animate = 0x80061D30; +// obj_animate.c .text +obj_animate = 0x80061D30; // csplayer.c .text alCSPNew = 0x80062290; @@ -1299,8 +1299,8 @@ update_pulsating_light_data = 0x8007F460; func_8007F594 = 0x8007F594; // screen_asset.c .text -load_screen = 0x8007F640; -render_screen = 0x8007F714; +screenimage_load = 0x8007F640; +screenimage_draw = 0x8007F714; // menu.c .text load_menu_text = 0x8007F900; @@ -1531,55 +1531,55 @@ is_tt_unlocked = 0x8009ECB8; is_drumstick_unlocked = 0x8009ECD0; // game_ui.c .text -init_hud = 0x8009ECF0; +hud_init = 0x8009ECF0; func_8009F034 = 0x8009F034; -free_hud = 0x800A003C; +hud_free = 0x800A003C; race_starting = 0x800A0190; -render_hud = 0x800A01A0; +hud_render_player = 0x800A01A0; hud_audio_init = 0x800A0B74; hud_audio_update = 0x800A0BD4; -render_hud_race = 0x800A0DC0; -render_course_indicator_arrows = 0x800A0EB4; -render_hud_banana_challenge = 0x800A1248; -render_hud_challenge_eggs = 0x800A1428; +hud_main_race = 0x800A0DC0; +hud_course_arrows = 0x800A0EB4; +hud_main_treasure = 0x800A1248; +hud_main_eggs = 0x800A1428; hud_draw_eggs = 0x800A14F0; hud_eggs_portrait = 0x800A19A4; -render_hud_battle = 0x800A1C04; +hud_main_battle = 0x800A1C04; func_800A1E48 = 0x800A1E48; -hud_draw_lives = 0x800A22F4; -render_hud_race_boss = 0x800A258C; -render_hud_taj_race = 0x800A263C; -render_hud_hubworld = 0x800A26C8; -func_800A277C = 0x800A277C; -set_stopwatch_face = 0x800A36CC; +hud_lives_render = 0x800A22F4; +hud_main_boss = 0x800A258C; +hud_main_taj = 0x800A263C; +hud_main_hub = 0x800A26C8; +hud_main_time_trial = 0x800A277C; +hud_stopwatch_face = 0x800A36CC; hud_speedometre_reset = 0x800A3870; -render_speedometer = 0x800A3884; -render_race_start = 0x800A3CE4; -render_racer_bananas = 0x800A4154; -render_treasure_hud = 0x800A45F0; -render_silver_coin_counter = 0x800A47A0; -render_race_finish_position = 0x800A497C; +hud_speedometre = 0x800A3884; +hud_race_start = 0x800A3CE4; +hud_bananas = 0x800A4154; +hud_treasure = 0x800A45F0; +hud_silver_coins = 0x800A47A0; +hud_race_finish_1player = 0x800A497C; func_800A4C34 = 0x800A4C34; -render_race_position = 0x800A4C44; -render_lap_count = 0x800A4F50; -render_wrong_way_text = 0x800A5A64; -hud_draw_finish_misc = 0x800A5F18; -func_800A6254 = 0x800A6254; -play_time_trial_end_message = 0x800A6DB4; -render_time_trial_finish = 0x800A6E30; -render_balloon_count = 0x800A718C; +hud_race_position = 0x800A4C44; +hud_lap_count = 0x800A4F50; +hud_wrong_way = 0x800A5A64; +hud_finish_position = 0x800A5F18; +hud_race_finish_multiplayer = 0x800A6254; +hud_time_trial_message = 0x800A6DB4; +hud_time_trial_finish = 0x800A6E30; +hud_balloons = 0x800A718C; hud_sound_play = 0x800A7440; hud_sound_play_delayed = 0x800A7484; hud_sound_stop = 0x800A74EC; -render_weapon_hud = 0x800A7520; -render_magnet_reticle = 0x800A7A60; -render_race_time = 0x800A7B68; -render_timer = 0x800A7FBC; +hud_weapon = 0x800A7520; +hud_magnet_reticle = 0x800A7A60; +hud_race_time = 0x800A7B68; +hud_timer_render = 0x800A7FBC; minimap_init = 0x800A83B4; -get_hud_setting = 0x800A8458; -render_minimap_and_misc_hud = 0x800A8474; +hud_setting = 0x800A8458; +hud_render_general = 0x800A8474; minimap_marker_pos = 0x800AA3EC; -func_800AA600 = 0x800AA600; +hud_element_render = 0x800AA600; hud_draw_model = 0x800AAFD0; minimap_fade = 0x800AB194; minimap_opacity_set = 0x800AB1AC; @@ -1752,24 +1752,24 @@ enable_new_screen_transitions = 0x800C0170; disable_new_screen_transitions = 0x800C0180; check_fadeout_transition = 0x800C018C; transition_begin = 0x800C01D8; -handle_transitions = 0x800C0494; -render_fade_transition = 0x800C05C8; +transition_update = 0x800C0494; +transition_render = 0x800C05C8; transition_end = 0x800C0724; transition_fullscreen_start = 0x800C0780; -process_transition_fullscreen = 0x800C0834; -render_fade_fullscreen = 0x800C0A08; -init_transition_shape = 0x800C0B00; -process_transition_shape = 0x800C1130; -render_fade_barndoor_horizontal = 0x800C13E4; -render_fade_barndoor_vertical = 0x800C14DC; -func_800C15D4 = 0x800C15D4; -func_800C1EE8 = 0x800C1EE8; -render_fade_circle = 0x800C2274; -render_fade_waves = 0x800C23F8; -render_fade_barndoor_diagonal = 0x800C2548; -init_transition_blank = 0x800C2640; -process_transition_disabled = 0x800C27A0; -render_fade_disabled = 0x800C28E8; +transition_update_fullscreen = 0x800C0834; +transition_render_fullscreen = 0x800C0A08; +transition_init_shape = 0x800C0B00; +transition_update_shape = 0x800C1130; +transition_render_barndoor_hor = 0x800C13E4; +transition_render_barndoor_vert = 0x800C14DC; +transition_init_circle = 0x800C15D4; +transition_update_circle = 0x800C1EE8; +transition_render_circle = 0x800C2274; +transition_render_waves = 0x800C23F8; +transition_render_barndoor_diag = 0x800C2548; +transition_init_blank = 0x800C2640; +transition_update_blank = 0x800C27A0; +transition_render_blank = 0x800C28E8; // game_text.c .text init_dialogue_text = 0x800C29F0; @@ -1848,14 +1848,14 @@ gzip_inflate_codes = 0x800C7040; // __osLeoInterrupt.c .text __osLeoInterrupt = 0x800C7340; -// thread30_track_loading.c .text -create_and_start_thread30 = 0x800C7350; -stop_thread30 = 0x800C73BC; -get_thread30_need_to_load_level = 0x800C73E0; -tick_thread30 = 0x800C73F0; -get_thread30_load_delay = 0x800C7448; -set_level_to_load_in_background = 0x800C7458; -thread30_track_loading = 0x800C74A0; // type:func +// thread30_bgload.c .text +bgload_init = 0x800C7350; +bgload_kill = 0x800C73BC; +bgload_active = 0x800C73E0; +bgload_tick = 0x800C73F0; +bgload_timer = 0x800C7448; +bgload_start = 0x800C7458; +thread30_bgload = 0x800C74A0; // type:func // alHeapInit.c .text alHeapInit = 0x800C7560; @@ -2897,18 +2897,18 @@ sTransitionVtx = 0x800E31C0; sTransitionTris = 0x800E31C8; sTransitionTaskNum = 0x800E31D0; dTransitionFadeSettings = 0x800E31D8; -gTransitionBarnHorizontalData = 0x800E3230; -gTransitionBarnVerticalData = 0x800E3268; +gTransitionBarnHorizontalCoords = 0x800E3230; +gTransitionBarnVerticalCoords = 0x800E3268; D_800E32A0 = 0x800E32A0; D_800E32AC = 0x800E32AC; gTransitionBarnDoorTris = 0x800E32B8; gTransitionBarnDoorAlpha = 0x800E32D0; -gTransitionBarnDiagData = 0x800E32DC; +gTransitionBarnDiagCoords = 0x800E32DC; D_800E330C = 0x800E330C; D_800E3318 = 0x800E3318; gTransitionBarnDoorDiagTris = 0x800E3324; gTransitionBarnDoorDiagAlpha = 0x800E3338; -gTransitionWaveData = 0x800E3344; +gTransitionWaveCoords = 0x800E3344; D_800E3440 = 0x800E3440; D_800E349C = 0x800E349C; gTransitionWaveAlpha = 0x800E34F8; @@ -2937,7 +2937,7 @@ gPackedHeader = 0x800E3764; gzip_inflate_input = 0x800E3768; gzip_inflate_output = 0x800E376C; -// thread30_track_loading.c .data +// thread30_bgload.c .data gThread30NeedToLoadLevel = 0x800E3770; gThread30LevelIdToLoad = 0x800E3774; gThread30CutsceneIdToLoad = 0x800E3778; @@ -4037,9 +4037,9 @@ gRocketStartBoost = 0x8011D611; // object_models .bss gObjectModelTable = 0x8011D620; -D_8011D624 = 0x8011D624; +gModelCache = 0x8011D624; D_8011D628 = 0x8011D628; -D_8011D62C = 0x8011D62C; +gModelCacheCount = 0x8011D62C; gNumModelIDs = 0x8011D630; D_8011D634 = 0x8011D634; gAnimationTable = 0x8011D638; @@ -4497,12 +4497,12 @@ gPlayerHud = 0x80126CE0; // size:0x10 gAssetHudElementIds = 0x80126CF0; gAssetHudElements = 0x80126CF4; gAssetHudElementIdsCount = 0x80126CF8; -gHUDCurrDisplayList = 0x80126CFC; -gHUDCurrMatrix = 0x80126D00; -gHUDCurrVertex = 0x80126D04; +gHudDL = 0x80126CFC; +gHudMtx = 0x80126D00; +gHudVtx = 0x80126D04; gHudCurrentViewport = 0x80126D08; gHUDNumPlayers = 0x80126D0C; -D_80126D10 = 0x80126D10; +gHudController = 0x80126D10; D_80126D14 = 0x80126D14; D_80126D18 = 0x80126D18; gMinimapDotOffsetX = 0x80126D1C; @@ -4512,13 +4512,13 @@ gHudBounceX = 0x80126D28; gHudBounceTimer = 0x80126D2C; gHudBounceMag = 0x80126D30; gHudRaceStart = 0x80126D34; -D_80126D35 = 0x80126D35; +gHudSlide = 0x80126D35; gHideRaceTimer = 0x80126D36; gNumActivePlayers = 0x80126D37; gWrongWayNagPrefix = 0x80126D38; gRaceStartSoundMask = 0x80126D3C; gHUDVoiceSoundMask = 0x80126D40; -D_80126D44 = 0x80126D44; +gHudBalloonSoundMask = 0x80126D44; D_80126D48 = 0x80126D48; D_80126D4C = 0x80126D4C; D_80126D50 = 0x80126D50; @@ -4736,7 +4736,7 @@ gzip_bit_buffer = 0x8012AAD0; gzip_num_bits = 0x8012AAD4; gHuftTablePos = 0x8012AAD8; -// thread30_track_loading .bss +// thread30_bgload .bss leoDiskStack = 0x8012AAE0; gThread30 = 0x8012AAF0; gThread30MesgQueue = 0x8012ACA0; // type:OSMesgQueue size:0x18 diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index c3d57c0d..f2aa4303 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -214,8 +214,8 @@ func_8000E79C = 0x8000E79C; func_8000E898 = 0x8000E898; get_object = 0x8000E948; objGetObjList = 0x8000E988; -get_object_count = 0x8000E9B0; -get_particle_count = 0x8000E9C0; +obj_count = 0x8000E9B0; +particle_count = 0x8000E9C0; func_8000E9D0 = 0x8000E9D0; spawn_object = 0x8000EA54; objFreeAssets = 0x8000F648; @@ -264,7 +264,7 @@ render_bubble_trap = 0x800138A8; render_racer_shield = 0x80013A0C; render_racer_magnet = 0x80013DCC; func_80014090 = 0x80014090; -func_800142B8 = 0x800142B8; +obj_tick_anims = 0x800142B8; render_mesh = 0x800143A8; func_80014814 = 0x80014814; func_800149C0 = 0x800149C0; @@ -341,7 +341,7 @@ set_world_shading = 0x8001D28C; add_shading_properties = 0x8001D2D4; set_shading_properties = 0x8001D4E8; update_envmap_position = 0x8001D614; -calc_dyn_light_and_env_map_for_object = 0x8001D718; +obj_shade_fancy = 0x8001D718; calc_dynamic_lighting_for_object_1 = 0x8001D840; calc_env_mapping_for_object = 0x8001DD88; set_racer_position_and_angle = 0x8001E170; @@ -395,7 +395,7 @@ run_object_loop_func = 0x80023F7C; func_8002458C = 0x800245C0; func_80024594 = 0x800245C8; func_800245B4 = 0x800245E8; -func_800245F0 = 0x80024630; +obj_shade_fast = 0x80024630; calc_dynamic_lighting_for_object_2 = 0x80024784; set_scene_viewport_num = 0x80024A20; init_track = 0x80024A30; @@ -756,7 +756,7 @@ update_wizpig = 0x8005EC30; update_rocket = 0x8005F4B0; allocate_object_model_pools = 0x8005F9F0; object_model_init = 0x8005FB3C; // has a diff from v1 -func_8005FCD0 = 0x8005FF10; +model_init_type = 0x8005FF10; free_3d_model = 0x80060180; free_model_data = 0x80060298; func_8006017C = 0x800603BC; @@ -767,7 +767,7 @@ func_80060EA8 = 0x800610E8; func_800619F4 = 0x80061C34; func_80061A00 = 0x80061C40; func_80061C0C = 0x80061E4C; -object_animate = 0x80061F70; +obj_animate = 0x80061F70; alCSPNew = 0x800624D0; __CSPVoiceHandler = 0x80062648; __CSPPostNextSeqEvent = 0x80062C0C; @@ -1220,8 +1220,8 @@ update_colour_cycle = 0x8007F69C; init_pulsating_light_data = 0x8007F864; update_pulsating_light_data = 0x8007F8B0; func_8007F594 = 0x8007F9E4; -load_screen = 0x8007FA90; -render_screen = 0x8007FB64; +screenimage_load = 0x8007FA90; +screenimage_draw = 0x8007FB64; load_menu_text = 0x8007FD50; menu_button_free = 0x800803D8; func_8007FFEC = 0x8008043C; @@ -1449,55 +1449,55 @@ is_in_two_player_adventure = 0x8009F1C4; is_tt_unlocked = 0x8009F1FC; is_drumstick_unlocked = 0x8009F214; -init_hud = 0x8009F230; +hud_init = 0x8009F230; func_8009F034 = 0x8009F574; -free_hud = 0x800A057C; +hud_free = 0x800A057C; race_starting = 0x800A06D0; -render_hud = 0x800A06E0; +hud_render_player = 0x800A06E0; hud_audio_init = 0x800A10B4; hud_audio_update = 0x800A1114; -render_hud_race = 0x800A1300; -render_course_indicator_arrows = 0x800A13F4; -render_hud_banana_challenge = 0x800A1788; -render_hud_challenge_eggs = 0x800A1968; +hud_main_race = 0x800A1300; +hud_course_arrows = 0x800A13F4; +hud_main_treasure = 0x800A1788; +hud_main_eggs = 0x800A1968; hud_draw_eggs = 0x800A1A30; hud_eggs_portrait = 0x800A1EE4; -render_hud_battle = 0x800A2144; +hud_main_battle = 0x800A2144; func_800A1E48 = 0x800A2388; -hud_draw_lives = 0x800A2834; -render_hud_race_boss = 0x800A2ACC; -render_hud_taj_race = 0x800A2B7C; -render_hud_hubworld = 0x800A2C08; -func_800A277C = 0x800A2CBC; // has a diff from v1 -set_stopwatch_face = 0x800A3C14; +hud_lives_render = 0x800A2834; +hud_main_boss = 0x800A2ACC; +hud_main_taj = 0x800A2B7C; +hud_main_hub = 0x800A2C08; +hud_main_time_trial = 0x800A2CBC; // has a diff from v1 +hud_stopwatch_face = 0x800A3C14; hud_speedometre_reset = 0x800A3DB8; -render_speedometer = 0x800A3DCC; -render_race_start = 0x800A422C; -render_racer_bananas = 0x800A469C; -render_treasure_hud = 0x800A4B38; -render_silver_coin_counter = 0x800A4CE8; -render_race_finish_position = 0x800A4EC4; +hud_speedometre = 0x800A3DCC; +hud_race_start = 0x800A422C; +hud_bananas = 0x800A469C; +hud_treasure = 0x800A4B38; +hud_silver_coins = 0x800A4CE8; +hud_race_finish_1player = 0x800A4EC4; func_800A4C34 = 0x800A517C; -render_race_position = 0x800A518C; -render_lap_count = 0x800A5498; -render_wrong_way_text = 0x800A5FAC; -hud_draw_finish_misc = 0x800A6460; -func_800A6254 = 0x800A679C; -play_time_trial_end_message = 0x800A72FC; // has a diff from v1 -render_time_trial_finish = 0x800A738C; -render_balloon_count = 0x800A76E8; +hud_race_position = 0x800A518C; +hud_lap_count = 0x800A5498; +hud_wrong_way = 0x800A5FAC; +hud_finish_position = 0x800A6460; +hud_race_finish_multiplayer = 0x800A679C; +hud_time_trial_message = 0x800A72FC; // has a diff from v1 +hud_time_trial_finish = 0x800A738C; +hud_balloons = 0x800A76E8; hud_sound_play = 0x800A799C; hud_sound_play_delayed = 0x800A79E0; hud_sound_stop = 0x800A7A48; -render_weapon_hud = 0x800A7A7C; -render_magnet_reticle = 0x800A7FBC; -render_race_time = 0x800A80C4; -render_timer = 0x800A8518; +hud_weapon = 0x800A7A7C; +hud_magnet_reticle = 0x800A7FBC; +hud_race_time = 0x800A80C4; +hud_timer_render = 0x800A8518; minimap_init = 0x800A8910; -get_hud_setting = 0x800A89B4; -render_minimap_and_misc_hud = 0x800A89D0; +hud_setting = 0x800A89B4; +hud_render_general = 0x800A89D0; minimap_marker_pos = 0x800AA948; -func_800AA600 = 0x800AAB5C; +hud_element_render = 0x800AAB5C; hud_draw_model = 0x800AB52C; minimap_fade = 0x800AB6F0; minimap_opacity_set = 0x800AB708; @@ -1652,24 +1652,24 @@ enable_new_screen_transitions = 0x800C0690; disable_new_screen_transitions = 0x800C06A0; check_fadeout_transition = 0x800C06AC; transition_begin = 0x800C06F8; -handle_transitions = 0x800C09B4; -render_fade_transition = 0x800C0AE8; +transition_update = 0x800C09B4; +transition_render = 0x800C0AE8; transition_end = 0x800C0C44; transition_fullscreen_start = 0x800C0CA0; -process_transition_fullscreen = 0x800C0D54; -render_fade_fullscreen = 0x800C0F28; -init_transition_shape = 0x800C1020; -process_transition_shape = 0x800C1650; -render_fade_barndoor_horizontal = 0x800C1904; -render_fade_barndoor_vertical = 0x800C19FC; -func_800C15D4 = 0x800C1AF4; -func_800C1EE8 = 0x800C2408; -render_fade_circle = 0x800C2794; -render_fade_waves = 0x800C2918; -render_fade_barndoor_diagonal = 0x800C2A68; -init_transition_blank = 0x800C2B60; -process_transition_disabled = 0x800C2CC0; -render_fade_disabled = 0x800C2E08; +transition_update_fullscreen = 0x800C0D54; +transition_render_fullscreen = 0x800C0F28; +transition_init_shape = 0x800C1020; +transition_update_shape = 0x800C1650; +transition_render_barndoor_hor = 0x800C1904; +transition_render_barndoor_vert = 0x800C19FC; +transition_init_circle = 0x800C1AF4; +transition_update_circle = 0x800C2408; +transition_render_circle = 0x800C2794; +transition_render_waves = 0x800C2918; +transition_render_barndoor_diag = 0x800C2A68; +transition_init_blank = 0x800C2B60; +transition_update_blank = 0x800C2CC0; +transition_render_blank = 0x800C2E08; init_dialogue_text = 0x800C2F10; free_message_box = 0x800C2FD4; set_subtitles = 0x800C3014; @@ -1735,13 +1735,13 @@ gzip_inflate_fixed = 0x800C733C; gzip_inflate_stored = 0x800C7494; gzip_inflate_codes = 0x800C75A0; __osLeoInterrupt = 0x800C78A0; -create_and_start_thread30 = 0x800C78B0; -stop_thread30 = 0x800C791C; -get_thread30_need_to_load_level = 0x800C7940; -tick_thread30 = 0x800C7950; -get_thread30_load_delay = 0x800C79A8; -set_level_to_load_in_background = 0x800C79B8; -thread30_track_loading = 0x800C7A00; // type:func +bgload_init = 0x800C78B0; +bgload_kill = 0x800C791C; +bgload_active = 0x800C7940; +bgload_tick = 0x800C7950; +bgload_timer = 0x800C79A8; +bgload_start = 0x800C79B8; +thread30_bgload = 0x800C7A00; // type:func alHeapInit = 0x800C7AC0; alBnkfNew = 0x800C7C04; alSeqFileNew = 0x800C7D08; @@ -2664,18 +2664,18 @@ sTransitionVtx = 0x800E3750; sTransitionTris = 0x800E3758; sTransitionTaskNum = 0x800E3760; dTransitionFadeSettings = 0x800E3768; -gTransitionBarnHorizontalData = 0x800E37C0; -gTransitionBarnVerticalData = 0x800E37F8; +gTransitionBarnHorizontalCoords = 0x800E37C0; +gTransitionBarnVerticalCoords = 0x800E37F8; D_800E32A0 = 0x800E3830; D_800E32AC = 0x800E383C; gTransitionBarnDoorTris = 0x800E3848; gTransitionBarnDoorAlpha = 0x800E3860; -gTransitionBarnDiagData = 0x800E386C; +gTransitionBarnDiagCoords = 0x800E386C; D_800E330C = 0x800E389C; D_800E3318 = 0x800E38A8; gTransitionBarnDoorDiagTris = 0x800E38B4; gTransitionBarnDoorDiagAlpha = 0x800E38C8; -gTransitionWaveData = 0x800E38D4; +gTransitionWaveCoords = 0x800E38D4; D_800E3440 = 0x800E39D0; D_800E349C = 0x800E3A2C; gTransitionWaveAlpha = 0x800E3A88; @@ -3566,9 +3566,9 @@ gWizpigStartBoost = 0x8011DB81; gRocketCutsceneTimer = 0x8011DB90; gRocketStartBoost = 0x8011DB91; gObjectModelTable = 0x8011DBA0; -D_8011D624 = 0x8011DBA4; +gModelCache = 0x8011DBA4; D_8011D628 = 0x8011DBA8; -D_8011D62C = 0x8011DBAC; +gModelCacheCount = 0x8011DBAC; gNumModelIDs = 0x8011DBB0; D_8011D634 = 0x8011DBB4; gAnimationTable = 0x8011DBB8; @@ -3998,12 +3998,12 @@ gPlayerHud = 0x801272A0; // size:0x10 gAssetHudElementIds = 0x801272B0; gAssetHudElements = 0x801272B4; gAssetHudElementIdsCount = 0x801272B8; -gHUDCurrDisplayList = 0x801272BC; -gHUDCurrMatrix = 0x801272C0; -gHUDCurrVertex = 0x801272C4; +gHudDL = 0x801272BC; +gHudMtx = 0x801272C0; +gHudVtx = 0x801272C4; gHudCurrentViewport = 0x801272C8; gHUDNumPlayers = 0x801272CC; -D_80126D10 = 0x801272D0; +gHudController = 0x801272D0; D_80126D14 = 0x801272D4; D_80126D18 = 0x801272D8; gMinimapDotOffsetX = 0x801272DC; @@ -4013,13 +4013,13 @@ gHudBounceX = 0x801272E8; gHudBounceTimer = 0x801272EC; gHudBounceMag = 0x801272F0; gHudRaceStart = 0x801272F4; -D_80126D35 = 0x801272F5; +gHudSlide = 0x801272F5; gHideRaceTimer = 0x801272F6; gNumActivePlayers = 0x801272F7; gWrongWayNagPrefix = 0x801272F8; gRaceStartSoundMask = 0x801272FC; gHUDVoiceSoundMask = 0x80127300; -D_80126D44 = 0x80127304; +gHudBalloonSoundMask = 0x80127304; D_80126D48 = 0x80127308; D_80126D4C = 0x8012730C; D_80126D50 = 0x80127310;