diff --git a/.gitignore b/.gitignore index 958ca91a..948a3804 100755 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ m2cfiles/ *.bat dkr_hot_reload.py lastRomPath.txt +gcc_safe_files.mk diff --git a/Makefile b/Makefile index 41951a96..2628d52a 100755 --- a/Makefile +++ b/Makefile @@ -333,6 +333,15 @@ else @echo "/build/lib directory has already been deleted." endif +clean_assets: +ifneq ($(wildcard ./build/.*),) + rm -r build +else + @echo "/build/ directory has already been deleted." +endif + rm -r assets + rm -f dkr.ld + # Helps fix an issue with parallel jobs. $(ALL_ASSETS_BUILT): | $(BUILD_DIR) diff --git a/README.md b/README.md index e7c7cd9f..429f7467 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ As of January 26, 2024, this is our current score:     Decomp progress: 66.48% -    Documentation progress: 35.49% +    Documentation progress: 36.75% --- @@ -126,31 +126,31 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 4, 2024, this is our current score: +As of April 29, 2024, this is our current score: ``` - ==================================================================== - ADVENTURE ONE (ASM -> C Decompilation) - -------------- 66.48% Complete (69.07% NON_MATCHING) --------------- - # Decompiled functions: 1681 - # GLOBAL_ASM remaining: 164 - # NON_MATCHING functions: 15 - # NON_EQUIVALENT WIP functions: 55 - --------------------------- Game Status ---------------------------- - Balloons: 31/47, Keys: 3/4, Trophies: 3/5 - T.T. Amulets: 3/4, Wizpig Amulets: 3/4 - -------------------------------------------------------------------- - We are racing in Windmill Plains. (Lap 3/3) - ==================================================================== - ADVENTURE TWO (Cleanup & Documentation) - ------------------------- 35.49% Complete -------------------------- - # Documented functions: 833 - # Undocumented remaining: 735 - --------------------------- Game Status ---------------------------- - Balloons: 17/47, Keys: 2/4, Trophies: 1/5 - T.T. Amulets: 2/4, Wizpig Amulets: 1/4 - -------------------------------------------------------------------- - We are collecting silver coins in Everfrost Peak. (3/8 silver coins) - ==================================================================== + ================================================================= + ADVENTURE ONE (ASM -> C Decompilation) + ------------- 66.48% Complete (69.07% NON_MATCHING) ------------- + # Decompiled functions: 1681 + # GLOBAL_ASM remaining: 164 + # NON_MATCHING functions: 15 + # NON_EQUIVALENT WIP functions: 55 + -------------------------- Game Status -------------------------- + Balloons: 31/47, Keys: 3/4, Trophies: 3/5 + T.T. Amulets: 3/4, Wizpig Amulets: 3/4 + ----------------------------------------------------------------- + We are racing in Windmill Plains. (Lap 3/3) + ================================================================= + ADVENTURE TWO (Cleanup & Documentation) + ------------------------ 36.75% Complete ------------------------ + # Documented functions: 863 + # Undocumented remaining: 705 + -------------------------- Game Status -------------------------- + Balloons: 18/47, Keys: 2/4, Trophies: 1/5 + T.T. Amulets: 2/4, Wizpig Amulets: 1/4 + ----------------------------------------------------------------- + We are collecting silver coins in Walrus Cove. (2/8 silver coins) + ================================================================= ``` diff --git a/asm/assets/assets.s b/asm/assets/assets.s index 0cdd7ec7..86c9db35 100755 --- a/asm/assets/assets.s +++ b/asm/assets/assets.s @@ -8516,8 +8516,8 @@ glabel ASSET_MISC_17 .incbin "./build/us_1.0/assets/misc/unlabeled/asset_misc_17.bin" glabel ASSET_MISC_18 .incbin "./build/us_1.0/assets/misc/unlabeled/asset_misc_18.bin" -glabel ASSET_MISC_19 -.incbin "./build/us_1.0/assets/misc/unlabeled/asset_misc_19.bin" +glabel ASSET_MISC_RUMBLE_DATA +.incbin "./build/us_1.0/assets/misc/unlabeled/rumble_data.bin" glabel ASSET_MISC_20 .incbin "./build/us_1.0/assets/misc/unlabeled/asset_misc_20.bin" glabel ASSET_MISC_SHIELD_DATA @@ -8643,7 +8643,7 @@ glabel ASSET_MISC_TABLE .word (ASSET_MISC_16 - ASSET_MISC) / 4 .word (ASSET_MISC_17 - ASSET_MISC) / 4 .word (ASSET_MISC_18 - ASSET_MISC) / 4 -.word (ASSET_MISC_19 - ASSET_MISC) / 4 +.word (ASSET_MISC_RUMBLE_DATA - ASSET_MISC) / 4 .word (ASSET_MISC_20 - ASSET_MISC) / 4 .word (ASSET_MISC_SHIELD_DATA - ASSET_MISC) / 4 .word (ASSET_MISC_MAGNET_DATA - ASSET_MISC) / 4 diff --git a/asm/non_matchings/camera/camera_init.s b/asm/non_matchings/camera/camera_init.s index fe7e76f1..e30a6854 100644 --- a/asm/non_matchings/camera/camera_init.s +++ b/asm/non_matchings/camera/camera_init.s @@ -59,8 +59,8 @@ glabel camera_init /* 066B6C 80065F6C AC200D20 */ sw $zero, %lo(gCameraMatrixPos)($at) /* 066B70 80065F70 3C018012 */ lui $at, %hi(gNumberOfViewports) # $at, 0x8012 /* 066B74 80065F74 AC200CE0 */ sw $zero, %lo(gNumberOfViewports)($at) -/* 066B78 80065F78 3C018012 */ lui $at, %hi(D_80120D0C) # $at, 0x8012 -/* 066B7C 80065F7C AC200D0C */ sw $zero, %lo(D_80120D0C)($at) +/* 066B78 80065F78 3C018012 */ lui $at, %hi(gSpriteAnimOff) # $at, 0x8012 +/* 066B7C 80065F7C AC200D0C */ sw $zero, %lo(gSpriteAnimOff)($at) /* 066B80 80065F80 3C018012 */ lui $at, %hi(D_80120D18) # $at, 0x8012 /* 066B84 80065F84 AC200D18 */ sw $zero, %lo(D_80120D18)($at) /* 066B88 80065F88 3C04800E */ lui $a0, %hi(gAntiPiracyViewport) # $a0, 0x800e diff --git a/asm/non_matchings/game_ui/func_8009F034.s b/asm/non_matchings/game_ui/func_8009F034.s index b917ec6f..bb2b977b 100644 --- a/asm/non_matchings/game_ui/func_8009F034.s +++ b/asm/non_matchings/game_ui/func_8009F034.s @@ -147,13 +147,13 @@ glabel func_8009F034 /* 09FDF0 8009F1F0 00000000 */ nop /* 09FDF4 8009F1F4 14400004 */ bnez $v0, .L8009F208 /* 09FDF8 8009F1F8 240C0001 */ li $t4, 1 -/* 09FDFC 8009F1FC 3C018012 */ lui $at, %hi(D_80126D71) # $at, 0x8012 +/* 09FDFC 8009F1FC 3C018012 */ lui $at, %hi(gHudTimeTrialGhost) # $at, 0x8012 /* 09FE00 8009F200 10000004 */ b .L8009F214 -/* 09FE04 8009F204 A0206D71 */ sb $zero, %lo(D_80126D71)($at) +/* 09FE04 8009F204 A0206D71 */ sb $zero, %lo(gHudTimeTrialGhost)($at) .L8009F208: /* 09FE08 8009F208 24190001 */ li $t9, 1 -/* 09FE0C 8009F20C 3C018012 */ lui $at, %hi(D_80126D71) # $at, 0x8012 -/* 09FE10 8009F210 A0396D71 */ sb $t9, %lo(D_80126D71)($at) +/* 09FE0C 8009F20C 3C018012 */ lui $at, %hi(gHudTimeTrialGhost) # $at, 0x8012 +/* 09FE10 8009F210 A0396D71 */ sb $t9, %lo(gHudTimeTrialGhost)($at) .L8009F214: /* 09FE14 8009F214 3C028012 */ lui $v0, %hi(gNumActivePlayers) # $v0, 0x8012 /* 09FE18 8009F218 90426D37 */ lbu $v0, %lo(gNumActivePlayers)($v0) @@ -208,9 +208,9 @@ glabel func_8009F034 /* 09FED4 8009F2D4 3408C000 */ li $t0, 49152 .L8009F2D8: /* 09FED8 8009F2D8 8FB9006C */ lw $t9, 0x6c($sp) -/* 09FEDC 8009F2DC 3C02800E */ lui $v0, %hi(D_800E1E64) # $v0, 0x800e +/* 09FEDC 8009F2DC 3C02800E */ lui $v0, %hi(gHudElementBase) # $v0, 0x800e /* 09FEE0 8009F2E0 8F2E0000 */ lw $t6, ($t9) -/* 09FEE4 8009F2E4 24421E64 */ addiu $v0, %lo(D_800E1E64) # addiu $v0, $v0, 0x1e64 +/* 09FEE4 8009F2E4 24421E64 */ addiu $v0, %lo(gHudElementBase) # addiu $v0, $v0, 0x1e64 /* 09FEE8 8009F2E8 00001825 */ move $v1, $zero /* 09FEEC 8009F2EC ACAE0000 */ sw $t6, ($a1) .L8009F2F0: @@ -1082,13 +1082,13 @@ glabel func_8009F034 /* 0A0BB8 8009FFB8 3C02800E */ lui $v0, %hi(gHudToggleSettings) # $v0, 0x800e /* 0A0BBC 8009FFBC 244227A4 */ addiu $v0, %lo(gHudToggleSettings) # addiu $v0, $v0, 0x27a4 /* 0A0BC0 8009FFC0 80580001 */ lb $t8, 1($v0) -/* 0A0BC4 8009FFC4 3C01800E */ lui $at, %hi(D_800E27A8) # $at, 0x800e -/* 0A0BC8 8009FFC8 A03827A8 */ sb $t8, %lo(D_800E27A8)($at) +/* 0A0BC4 8009FFC4 3C01800E */ lui $at, %hi(gPrevToggleSetting) # $at, 0x800e +/* 0A0BC8 8009FFC8 A03827A8 */ sb $t8, %lo(gPrevToggleSetting)($at) /* 0A0BCC 8009FFCC 10000005 */ b .L8009FFE4 /* 0A0BD0 8009FFD0 A0400001 */ sb $zero, 1($v0) .L8009FFD4: -/* 0A0BD4 8009FFD4 3C0E800E */ lui $t6, %hi(D_800E27A8) # $t6, 0x800e -/* 0A0BD8 8009FFD8 81CE27A8 */ lb $t6, %lo(D_800E27A8)($t6) +/* 0A0BD4 8009FFD4 3C0E800E */ lui $t6, %hi(gPrevToggleSetting) # $t6, 0x800e +/* 0A0BD8 8009FFD8 81CE27A8 */ lb $t6, %lo(gPrevToggleSetting)($t6) /* 0A0BDC 8009FFDC 244227A4 */ addiu $v0, %lo(gHudToggleSettings) # addiu $v0, $v0, 0x27a4 /* 0A0BE0 8009FFE0 A04E0001 */ sb $t6, 1($v0) .L8009FFE4: diff --git a/asm/non_matchings/game_ui/func_800A1E48.s b/asm/non_matchings/game_ui/func_800A1E48.s index 01c480de..6f58a392 100644 --- a/asm/non_matchings/game_ui/func_800A1E48.s +++ b/asm/non_matchings/game_ui/func_800A1E48.s @@ -33,7 +33,7 @@ glabel func_800A1E48 /* 0A2AAC 800A1EAC 00000000 */ nop /* 0A2AB0 800A1EB0 24040001 */ li $a0, 1 .L800A1EB4: -/* 0A2AB4 800A1EB4 0C01A142 */ jal func_80068508 +/* 0A2AB4 800A1EB4 0C01A142 */ jal sprite_anim_off /* 0A2AB8 800A1EB8 AFA7007C */ sw $a3, 0x7c($sp) /* 0A2ABC 800A1EBC 8FAF0078 */ lw $t7, 0x78($sp) /* 0A2AC0 800A1EC0 8FA7007C */ lw $a3, 0x7c($sp) @@ -170,7 +170,7 @@ glabel func_800A1E48 /* 0A2CC8 800A20C8 00000000 */ nop .L800A20CC: /* 0A2CCC 800A20CC AFA7007C */ sw $a3, 0x7c($sp) -/* 0A2CD0 800A20D0 0C0288BD */ jal func_800A22F4 +/* 0A2CD0 800A20D0 0C0288BD */ jal hud_draw_lives /* 0A2CD4 800A20D4 AFA8006C */ sw $t0, 0x6c($sp) /* 0A2CD8 800A20D8 8FA7007C */ lw $a3, 0x7c($sp) /* 0A2CDC 800A20DC 8FA8006C */ lw $t0, 0x6c($sp) @@ -296,7 +296,7 @@ glabel func_800A1E48 /* 0A2EAC 800A22AC 46022180 */ add.s $f6, $f4, $f2 /* 0A2EB0 800A22B0 E44606F0 */ swc1 $f6, 0x6f0($v0) .L800A22B4: -/* 0A2EB4 800A22B4 0C01A142 */ jal func_80068508 +/* 0A2EB4 800A22B4 0C01A142 */ jal sprite_anim_off /* 0A2EB8 800A22B8 00002025 */ move $a0, $zero /* 0A2EBC 800A22BC 8FBF0044 */ lw $ra, 0x44($sp) /* 0A2EC0 800A22C0 C7B50018 */ lwc1 $f21, 0x18($sp) diff --git a/asm/non_matchings/game_ui/func_800A277C.s b/asm/non_matchings/game_ui/func_800A277C.s index 6e58f37c..d2e12a2e 100644 --- a/asm/non_matchings/game_ui/func_800A277C.s +++ b/asm/non_matchings/game_ui/func_800A277C.s @@ -435,7 +435,7 @@ glabel func_800A277C /* 0A3974 800A2D74 8FAF0098 */ lw $t7, 0x98($sp) .L800A2D78: /* 0A3978 800A2D78 24040001 */ li $a0, 1 -/* 0A397C 800A2D7C 0C01A142 */ jal func_80068508 +/* 0A397C 800A2D7C 0C01A142 */ jal sprite_anim_off /* 0A3980 800A2D80 A1E00020 */ sb $zero, 0x20($t7) /* 0A3984 800A2D84 8FA400A0 */ lw $a0, 0xa0($sp) /* 0A3988 800A2D88 8FA500C8 */ lw $a1, 0xc8($sp) @@ -468,8 +468,8 @@ glabel func_800A277C /* 0A39F4 800A2DF4 81D8004B */ lb $t8, 0x4b($t6) /* 0A39F8 800A2DF8 01228021 */ addu $s0, $t1, $v0 /* 0A39FC 800A2DFC 1B000060 */ blez $t8, .L800A2F80 -/* 0A3A00 800A2E00 3C0F800E */ lui $t7, %hi(D_800E27AC) # $t7, 0x800e -/* 0A3A04 800A2E04 25EF27AC */ addiu $t7, %lo(D_800E27AC) # addiu $t7, $t7, 0x27ac +/* 0A3A00 800A2E00 3C0F800E */ lui $t7, %hi(gHudLapColours) # $t7, 0x800e +/* 0A3A04 800A2E04 25EF27AC */ addiu $t7, %lo(gHudLapColours) # addiu $t7, $t7, 0x27ac /* 0A3A08 800A2E08 004FC821 */ addu $t9, $v0, $t7 /* 0A3A0C 800A2E0C AFB9003C */ sw $t9, 0x3c($sp) .L800A2E10: @@ -1049,7 +1049,7 @@ glabel func_800A277C /* 0A42A4 800A36A4 0C031059 */ jal set_kerning /* 0A42A8 800A36A8 00002025 */ move $a0, $zero .L800A36AC: -/* 0A42AC 800A36AC 0C01A142 */ jal func_80068508 +/* 0A42AC 800A36AC 0C01A142 */ jal sprite_anim_off /* 0A42B0 800A36B0 00002025 */ move $a0, $zero .L800A36B4: /* 0A42B4 800A36B4 8FBF002C */ lw $ra, 0x2c($sp) diff --git a/asm/non_matchings/game_ui/func_800A6254.s b/asm/non_matchings/game_ui/func_800A6254.s index 09a56dd1..e2ded3e2 100644 --- a/asm/non_matchings/game_ui/func_800A6254.s +++ b/asm/non_matchings/game_ui/func_800A6254.s @@ -65,9 +65,9 @@ glabel func_800A6254 /* 0A6F28 800A6328 3C01420C */ li $at, 0x420C0000 # 35.000000 /* 0A6F2C 800A632C 44810000 */ mtc1 $at, $f0 /* 0A6F30 800A6330 C44405F0 */ lwc1 $f4, 0x5f0($v0) -/* 0A6F34 800A6334 3C03800E */ lui $v1, %hi(D_800E2770) # $v1, 0x800e +/* 0A6F34 800A6334 3C03800E */ lui $v1, %hi(gHudAudioData) # $v1, 0x800e /* 0A6F38 800A6338 46002180 */ add.s $f6, $f4, $f0 -/* 0A6F3C 800A633C 24632770 */ addiu $v1, %lo(D_800E2770) # addiu $v1, $v1, 0x2770 +/* 0A6F3C 800A633C 24632770 */ addiu $v1, %lo(gHudAudioData) # addiu $v1, $v1, 0x2770 /* 0A6F40 800A6340 E44605F0 */ swc1 $f6, 0x5f0($v0) /* 0A6F44 800A6344 8D220000 */ lw $v0, ($t1) /* 0A6F48 800A6348 3C018012 */ lui $at, %hi(D_80127189) # $at, 0x8012 @@ -95,9 +95,9 @@ glabel func_800A6254 /* 0A6F9C 800A639C 3C098012 */ lui $t1, %hi(gCurrentHud) # $t1, 0x8012 /* 0A6FA0 800A63A0 25296CDC */ addiu $t1, %lo(gCurrentHud) # addiu $t1, $t1, 0x6cdc /* 0A6FA4 800A63A4 8D220000 */ lw $v0, ($t1) -/* 0A6FA8 800A63A8 3C03800E */ lui $v1, %hi(D_800E2770) # $v1, 0x800e +/* 0A6FA8 800A63A8 3C03800E */ lui $v1, %hi(gHudAudioData) # $v1, 0x800e /* 0A6FAC 800A63AC 905905FA */ lbu $t9, 0x5fa($v0) -/* 0A6FB0 800A63B0 24632770 */ addiu $v1, %lo(D_800E2770) # addiu $v1, $v1, 0x2770 +/* 0A6FB0 800A63B0 24632770 */ addiu $v1, %lo(gHudAudioData) # addiu $v1, $v1, 0x2770 /* 0A6FB4 800A63B4 2F210005 */ sltiu $at, $t9, 5 /* 0A6FB8 800A63B8 10200278 */ beqz $at, .L800A6D9C /* 0A6FBC 800A63BC 0019C880 */ sll $t9, $t9, 2 @@ -651,7 +651,7 @@ glabel L800A691C /* 0A77B4 800A6BB4 8FA70070 */ lw $a3, 0x70($sp) /* 0A77B8 800A6BB8 00000000 */ nop .L800A6BBC: -/* 0A77BC 800A6BBC 0C0297C6 */ jal func_800A5F18 +/* 0A77BC 800A6BBC 0C0297C6 */ jal hud_draw_finish_misc /* 0A77C0 800A6BC0 00E02025 */ move $a0, $a3 /* 0A77C4 800A6BC4 10000078 */ b .L800A6DA8 /* 0A77C8 800A6BC8 8FBF0014 */ lw $ra, 0x14($sp) @@ -710,7 +710,7 @@ glabel L800A6BCC /* 0A788C 800A6C8C 240D0004 */ li $t5, 4 /* 0A7890 800A6C90 A1CD05FA */ sb $t5, 0x5fa($t6) .L800A6C94: -/* 0A7894 800A6C94 0C0297C6 */ jal func_800A5F18 +/* 0A7894 800A6C94 0C0297C6 */ jal hud_draw_finish_misc /* 0A7898 800A6C98 00E02025 */ move $a0, $a3 /* 0A789C 800A6C9C 10000042 */ b .L800A6DA8 /* 0A78A0 800A6CA0 8FBF0014 */ lw $ra, 0x14($sp) @@ -763,7 +763,7 @@ glabel L800A6CA4 /* 0A7950 800A6D50 46005100 */ add.s $f4, $f10, $f0 /* 0A7954 800A6D54 E44402EC */ swc1 $f4, 0x2ec($v0) .L800A6D58: -/* 0A7958 800A6D58 0C0297C6 */ jal func_800A5F18 +/* 0A7958 800A6D58 0C0297C6 */ jal hud_draw_finish_misc /* 0A795C 800A6D5C 00E02025 */ move $a0, $a3 /* 0A7960 800A6D60 10000011 */ b .L800A6DA8 /* 0A7964 800A6D64 8FBF0014 */ lw $ra, 0x14($sp) @@ -778,12 +778,12 @@ glabel L800A6D68 .L800A6D84: /* 0A7984 800A6D84 A04F05FA */ sb $t7, 0x5fa($v0) /* 0A7988 800A6D88 8D380000 */ lw $t8, ($t1) -/* 0A798C 800A6D8C 0C0297C6 */ jal func_800A5F18 +/* 0A798C 800A6D8C 0C0297C6 */ jal hud_draw_finish_misc /* 0A7990 800A6D90 A30005FB */ sb $zero, 0x5fb($t8) /* 0A7994 800A6D94 10000004 */ b .L800A6DA8 /* 0A7998 800A6D98 8FBF0014 */ lw $ra, 0x14($sp) .L800A6D9C: -/* 0A799C 800A6D9C 0C0297C6 */ jal func_800A5F18 +/* 0A799C 800A6D9C 0C0297C6 */ jal hud_draw_finish_misc /* 0A79A0 800A6DA0 00E02025 */ move $a0, $a3 .L800A6DA4: /* 0A79A4 800A6DA4 8FBF0014 */ lw $ra, 0x14($sp) diff --git a/asm/non_matchings/game_ui/func_800AA600.s b/asm/non_matchings/game_ui/func_800AA600.s index c42aefbb..d79321bd 100644 --- a/asm/non_matchings/game_ui/func_800AA600.s +++ b/asm/non_matchings/game_ui/func_800AA600.s @@ -605,7 +605,7 @@ glabel func_800AA600 /* 0ABAE0 800AAEE0 8D620000 */ lw $v0, ($t3) /* 0ABAE4 800AAEE4 00000000 */ nop /* 0ABAE8 800AAEE8 8C440000 */ lw $a0, ($v0) -/* 0ABAEC 800AAEEC 0C02ABF4 */ jal func_800AAFD0 +/* 0ABAEC 800AAEEC 0C02ABF4 */ jal hud_draw_model /* 0ABAF0 800AAEF0 00000000 */ nop /* 0ABAF4 800AAEF4 3C048012 */ lui $a0, %hi(gHUDCurrDisplayList) # $a0, 0x8012 /* 0ABAF8 800AAEF8 0C01A690 */ jal apply_matrix_from_stack diff --git a/asm/non_matchings/menu/func_8009E3D0.s b/asm/non_matchings/menu/func_8009E3D0.s index 6215e1e3..bbdad02d 100644 --- a/asm/non_matchings/menu/func_8009E3D0.s +++ b/asm/non_matchings/menu/func_8009E3D0.s @@ -21,7 +21,7 @@ glabel func_8009E3D0 /* 09F018 8009E418 0C01BAA4 */ jal get_settings /* 09F01C 8009E41C 00000000 */ nop /* 09F020 8009E420 AFA20048 */ sw $v0, 0x48($sp) -/* 09F024 8009E424 0C01A142 */ jal func_80068508 +/* 09F024 8009E424 0C01A142 */ jal sprite_anim_off /* 09F028 8009E428 02802025 */ move $a0, $s4 /* 09F02C 8009E42C 3C0F8000 */ lui $t7, %hi(osTvType) # $t7, 0x8000 /* 09F030 8009E430 8DEF0300 */ lw $t7, %lo(osTvType)($t7) @@ -267,7 +267,7 @@ glabel func_8009E3D0 /* 09F3A8 8009E7A8 24010004 */ li $at, 4 /* 09F3AC 8009E7AC 1601FFEC */ bne $s0, $at, .L8009E760 /* 09F3B0 8009E7B0 2631001E */ addiu $s1, $s1, 0x1e -/* 09F3B4 8009E7B4 0C01A142 */ jal func_80068508 +/* 09F3B4 8009E7B4 0C01A142 */ jal sprite_anim_off /* 09F3B8 8009E7B8 00002025 */ move $a0, $zero .L8009E7BC: /* 09F3BC 8009E7BC 8FBF0034 */ lw $ra, 0x34($sp) diff --git a/asm/non_matchings/objects/func_8000CC7C.s b/asm/non_matchings/objects/func_8000CC7C.s index eaef45e7..731988a7 100644 --- a/asm/non_matchings/objects/func_8000CC7C.s +++ b/asm/non_matchings/objects/func_8000CC7C.s @@ -1408,7 +1408,7 @@ glabel L8000D98C /* 00EC3C 8000E03C 00000000 */ nop /* 00EC40 8000E040 10400009 */ beqz $v0, .L8000E068 /* 00EC44 8000E044 00000000 */ nop -/* 00EC48 8000E048 0C01C8A6 */ jal func_80072298 +/* 00EC48 8000E048 0C01C8A6 */ jal rumble_init /* 00EC4C 8000E04C 00002025 */ move $a0, $zero /* 00EC50 8000E050 3C018012 */ lui $at, %hi(gEventCountdown) # $at, 0x8012 /* 00EC54 8000E054 AC20ADB0 */ sw $zero, %lo(gEventCountdown)($at) diff --git a/asm/non_matchings/objects/func_80010994.s b/asm/non_matchings/objects/func_80010994.s index 672f9c3e..ab748f92 100644 --- a/asm/non_matchings/objects/func_80010994.s +++ b/asm/non_matchings/objects/func_80010994.s @@ -511,7 +511,7 @@ glabel func_80010994 /* 011CE4 800110E4 00000000 */ nop /* 011CE8 800110E8 14400009 */ bnez $v0, .L80011110 /* 011CEC 800110EC 8FBF0034 */ lw $ra, 0x34($sp) -/* 011CF0 800110F0 0C01BC50 */ jal func_8006F140 +/* 011CF0 800110F0 0C01BC50 */ jal level_transition_begin /* 011CF4 800110F4 24040001 */ li $a0, 1 /* 011CF8 800110F8 10000005 */ b .L80011110 /* 011CFC 800110FC 8FBF0034 */ lw $ra, 0x34($sp) diff --git a/asm/non_matchings/printf/func_800B653C.s b/asm/non_matchings/printf/func_800B653C.s index 517dabe1..14109536 100644 --- a/asm/non_matchings/printf/func_800B653C.s +++ b/asm/non_matchings/printf/func_800B653C.s @@ -20,16 +20,16 @@ glabel func_800B653C /* 0B7170 800B6570 0080A825 */ move $s5, $a0 /* 0B7174 800B6574 122000EB */ beqz $s1, .L800B6924 /* 0B7178 800B6578 24B00001 */ addiu $s0, $a1, 1 -/* 0B717C 800B657C 3C1E8012 */ lui $fp, %hi(D_80127CB8) # $fp, 0x8012 +/* 0B717C 800B657C 3C1E8012 */ lui $fp, %hi(gDebugTextOn) # $fp, 0x8012 /* 0B7180 800B6580 3C178012 */ lui $s7, %hi(D_80127CB2) # $s7, 0x8012 /* 0B7184 800B6584 3C168012 */ lui $s6, %hi(D_80127CB0) # $s6, 0x8012 -/* 0B7188 800B6588 3C148012 */ lui $s4, %hi(D_80127CAE) # $s4, 0x8012 -/* 0B718C 800B658C 3C128012 */ lui $s2, %hi(D_80127CAC) # $s2, 0x8012 -/* 0B7190 800B6590 26527CAC */ addiu $s2, %lo(D_80127CAC) # addiu $s2, $s2, 0x7cac -/* 0B7194 800B6594 26947CAE */ addiu $s4, %lo(D_80127CAE) # addiu $s4, $s4, 0x7cae +/* 0B7188 800B6588 3C148012 */ lui $s4, %hi(gDebugTextY) # $s4, 0x8012 +/* 0B718C 800B658C 3C128012 */ lui $s2, %hi(gDebugTextX) # $s2, 0x8012 +/* 0B7190 800B6590 26527CAC */ addiu $s2, %lo(gDebugTextX) # addiu $s2, $s2, 0x7cac +/* 0B7194 800B6594 26947CAE */ addiu $s4, %lo(gDebugTextY) # addiu $s4, $s4, 0x7cae /* 0B7198 800B6598 26D67CB0 */ addiu $s6, %lo(D_80127CB0) # addiu $s6, $s6, 0x7cb0 /* 0B719C 800B659C 26F77CB2 */ addiu $s7, %lo(D_80127CB2) # addiu $s7, $s7, 0x7cb2 -/* 0B71A0 800B65A0 27DE7CB8 */ addiu $fp, %lo(D_80127CB8) # addiu $fp, $fp, 0x7cb8 +/* 0B71A0 800B65A0 27DE7CB8 */ addiu $fp, %lo(gDebugTextOn) # addiu $fp, $fp, 0x7cb8 /* 0B71A4 800B65A4 2A21000B */ slti $at, $s1, 0xb .L800B65A8: /* 0B71A8 800B65A8 14200012 */ bnez $at, .L800B65F4 @@ -63,8 +63,8 @@ glabel func_800B653C /* 0B7210 800B6610 02A02025 */ move $a0, $s5 glabel L800B6614 /* 0B7214 800B6614 3C018012 */ lui $at, %hi(D_80127CB4) # $at, 0x8012 -/* 0B7218 800B6618 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B721C 800B661C 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B7218 800B6618 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B721C 800B661C 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B7220 800B6620 AC207CB4 */ sw $zero, %lo(D_80127CB4)($at) /* 0B7224 800B6624 96440000 */ lhu $a0, ($s2) /* 0B7228 800B6628 00001825 */ move $v1, $zero @@ -73,8 +73,8 @@ glabel L800B6614 glabel L800B6634 /* 0B7234 800B6634 240F0001 */ li $t7, 1 /* 0B7238 800B6638 3C018012 */ lui $at, %hi(D_80127CB4) # $at, 0x8012 -/* 0B723C 800B663C 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B7240 800B6640 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B723C 800B663C 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B7240 800B6640 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B7244 800B6644 AC2F7CB4 */ sw $t7, %lo(D_80127CB4)($at) /* 0B7248 800B6648 96440000 */ lhu $a0, ($s2) /* 0B724C 800B664C 24030001 */ li $v1, 1 @@ -104,8 +104,8 @@ glabel L800B6658 /* 0B72A8 800B66A8 03194025 */ or $t0, $t8, $t9 /* 0B72AC 800B66AC AC680004 */ sw $t0, 4($v1) .L800B66B0: -/* 0B72B0 800B66B0 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B72B4 800B66B4 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B72B0 800B66B0 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B72B4 800B66B4 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B72B8 800B66B8 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 /* 0B72BC 800B66BC 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B72C0 800B66C0 96440000 */ lhu $a0, ($s2) @@ -135,8 +135,8 @@ glabel L800B66CC /* 0B731C 800B671C 012B5025 */ or $t2, $t1, $t3 /* 0B7320 800B6720 AC6A0004 */ sw $t2, 4($v1) .L800B6724: -/* 0B7324 800B6724 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B7328 800B6728 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B7324 800B6724 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B7328 800B6728 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B732C 800B672C 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 /* 0B7330 800B6730 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B7334 800B6734 96440000 */ lhu $a0, ($s2) @@ -152,11 +152,11 @@ glabel L800B6740 /* 0B7358 800B6758 96E60000 */ lhu $a2, ($s7) /* 0B735C 800B675C 96470000 */ lhu $a3, ($s2) /* 0B7360 800B6760 25AE000A */ addiu $t6, $t5, 0xa -/* 0B7364 800B6764 0C02DA57 */ jal func_800B695C +/* 0B7364 800B6764 0C02DA57 */ jal debug_text_background /* 0B7368 800B6768 AFAE0010 */ sw $t6, 0x10($sp) .L800B676C: /* 0B736C 800B676C 92190000 */ lbu $t9, ($s0) -/* 0B7370 800B6770 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 +/* 0B7370 800B6770 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 /* 0B7374 800B6774 A6590000 */ sh $t9, ($s2) /* 0B7378 800B6778 92180001 */ lbu $t8, 1($s0) /* 0B737C 800B677C 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 @@ -172,14 +172,14 @@ glabel L800B6740 /* 0B73A4 800B67A4 014D7825 */ or $t7, $t2, $t5 /* 0B73A8 800B67A8 A68F0000 */ sh $t7, ($s4) /* 0B73AC 800B67AC A6EF0000 */ sh $t7, ($s7) -/* 0B73B0 800B67B0 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B73B0 800B67B0 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B73B4 800B67B4 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B73B8 800B67B8 26100004 */ addiu $s0, $s0, 4 /* 0B73BC 800B67BC 10000039 */ b .L800B68A4 /* 0B73C0 800B67C0 24A5FFF0 */ addiu $a1, $a1, -0x10 .L800B67C4: -/* 0B73C4 800B67C4 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B73C8 800B67C8 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B73C4 800B67C4 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B73C8 800B67C8 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B73CC 800B67CC 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 /* 0B73D0 800B67D0 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B73D4 800B67D4 96440000 */ lhu $a0, ($s2) @@ -195,25 +195,25 @@ glabel L800B6740 /* 0B73F8 800B67F8 96E60000 */ lhu $a2, ($s7) /* 0B73FC 800B67FC 96470000 */ lhu $a3, ($s2) /* 0B7400 800B6800 2728000A */ addiu $t0, $t9, 0xa -/* 0B7404 800B6804 0C02DA57 */ jal func_800B695C +/* 0B7404 800B6804 0C02DA57 */ jal debug_text_background /* 0B7408 800B6808 AFA80010 */ sw $t0, 0x10($sp) .L800B680C: -/* 0B740C 800B680C 0C02DBC1 */ jal func_800B6F04 +/* 0B740C 800B680C 0C02DBC1 */ jal debug_text_newline /* 0B7410 800B6810 00000000 */ nop /* 0B7414 800B6814 96440000 */ lhu $a0, ($s2) /* 0B7418 800B6818 96890000 */ lhu $t1, ($s4) -/* 0B741C 800B681C 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 +/* 0B741C 800B681C 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 /* 0B7420 800B6820 A6C40000 */ sh $a0, ($s6) /* 0B7424 800B6824 A6E90000 */ sh $t1, ($s7) -/* 0B7428 800B6828 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B7428 800B6828 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B742C 800B682C 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 /* 0B7430 800B6830 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B7434 800B6834 1000001B */ b .L800B68A4 /* 0B7438 800B6838 24A5FFF0 */ addiu $a1, $a1, -0x10 .L800B683C: /* 0B743C 800B683C 96440000 */ lhu $a0, ($s2) -/* 0B7440 800B6840 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B7444 800B6844 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B7440 800B6840 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B7444 800B6844 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B7448 800B6848 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B744C 800B684C 04810004 */ bgez $a0, .L800B6860 /* 0B7450 800B6850 3082001F */ andi $v0, $a0, 0x1f @@ -232,10 +232,10 @@ glabel L800B6740 .L800B687C: /* 0B747C 800B687C 02A02025 */ move $a0, $s5 .L800B6880: -/* 0B7480 800B6880 0C02DA7F */ jal func_800B69FC +/* 0B7480 800B6880 0C02DA7F */ jal debug_text_character /* 0B7484 800B6884 02202825 */ move $a1, $s1 -/* 0B7488 800B6888 3C058012 */ lui $a1, %hi(D_80127CD0) # $a1, 0x8012 -/* 0B748C 800B688C 94A57CD0 */ lhu $a1, %lo(D_80127CD0)($a1) +/* 0B7488 800B6888 3C058012 */ lui $a1, %hi(gDebugScreenWidth) # $a1, 0x8012 +/* 0B748C 800B688C 94A57CD0 */ lhu $a1, %lo(gDebugScreenWidth)($a1) /* 0B7490 800B6890 3C038012 */ lui $v1, %hi(D_80127CB4) # $v1, 0x8012 /* 0B7494 800B6894 8C637CB4 */ lw $v1, %lo(D_80127CB4)($v1) /* 0B7498 800B6898 96440000 */ lhu $a0, ($s2) @@ -264,10 +264,10 @@ glabel L800B6740 /* 0B74E8 800B68E8 96C50000 */ lhu $a1, ($s6) /* 0B74EC 800B68EC 96E60000 */ lhu $a2, ($s7) /* 0B74F0 800B68F0 25AE000A */ addiu $t6, $t5, 0xa -/* 0B74F4 800B68F4 0C02DA57 */ jal func_800B695C +/* 0B74F4 800B68F4 0C02DA57 */ jal debug_text_background /* 0B74F8 800B68F8 AFAE0010 */ sw $t6, 0x10($sp) .L800B68FC: -/* 0B74FC 800B68FC 0C02DBC1 */ jal func_800B6F04 +/* 0B74FC 800B68FC 0C02DBC1 */ jal debug_text_newline /* 0B7500 800B6900 00000000 */ nop /* 0B7504 800B6904 964F0000 */ lhu $t7, ($s2) /* 0B7508 800B6908 96980000 */ lhu $t8, ($s4) diff --git a/asm/non_matchings/racer/func_80042D20.s b/asm/non_matchings/racer/func_80042D20.s index 0bcc428a..2f183ecc 100644 --- a/asm/non_matchings/racer/func_80042D20.s +++ b/asm/non_matchings/racer/func_80042D20.s @@ -197,7 +197,7 @@ glabel func_80042D20 /* 043B88 80042F88 A7AC0034 */ sh $t4, 0x34($sp) /* 043B8C 80042F8C AFAB0024 */ sw $t3, 0x24($sp) /* 043B90 80042F90 AFAA0060 */ sw $t2, 0x60($sp) -/* 043B94 80042F94 0C0172A1 */ jal func_8005CA84 +/* 043B94 80042F94 0C0172A1 */ jal racer_boss_sound_spatial /* 043B98 80042F98 A7A80076 */ sh $t0, 0x76($sp) /* 043B9C 80042F9C 87A80076 */ lh $t0, 0x76($sp) /* 043BA0 80042FA0 8FAA0060 */ lw $t2, 0x60($sp) @@ -277,7 +277,7 @@ glabel func_80042D20 /* 043CB8 800430B8 8C460014 */ lw $a2, 0x14($v0) /* 043CBC 800430BC A7AD0078 */ sh $t5, 0x78($sp) /* 043CC0 800430C0 A7AC0034 */ sh $t4, 0x34($sp) -/* 043CC4 800430C4 0C0172A1 */ jal func_8005CA84 +/* 043CC4 800430C4 0C0172A1 */ jal racer_boss_sound_spatial /* 043CC8 800430C8 A7A80076 */ sh $t0, 0x76($sp) /* 043CCC 800430CC 87A80076 */ lh $t0, 0x76($sp) /* 043CD0 800430D0 87AC0034 */ lh $t4, 0x34($sp) diff --git a/asm/non_matchings/racer/func_80046524.s b/asm/non_matchings/racer/func_80046524.s index cf403866..c4539535 100644 --- a/asm/non_matchings/racer/func_80046524.s +++ b/asm/non_matchings/racer/func_80046524.s @@ -358,7 +358,7 @@ glabel func_80046524 /* 04758C 8004698C 45000004 */ bc1f .L800469A0 /* 047590 80046990 00000000 */ nop /* 047594 80046994 86040000 */ lh $a0, ($s0) -/* 047598 80046998 0C01C8D2 */ jal func_80072348 +/* 047598 80046998 0C01C8D2 */ jal rumble_set /* 04759C 8004699C 24050005 */ li $a1, 5 .L800469A0: /* 0475A0 800469A0 C60200B8 */ lwc1 $f2, 0xb8($s0) @@ -486,7 +486,7 @@ glabel func_80046524 .L80046B68: /* 047768 80046B68 86040000 */ lh $a0, ($s0) /* 04776C 80046B6C A20001F5 */ sb $zero, 0x1f5($s0) -/* 047770 80046B70 0C01C8D2 */ jal func_80072348 +/* 047770 80046B70 0C01C8D2 */ jal rumble_set /* 047774 80046B74 24050008 */ li $a1, 8 /* 047778 80046B78 C60E002C */ lwc1 $f14, 0x2c($s0) /* 04777C 80046B7C 10000017 */ b .L80046BDC @@ -1283,7 +1283,7 @@ glabel func_80046524 /* 048310 80047710 0C015C2E */ jal play_random_character_voice /* 048314 80047714 24070082 */ li $a3, 130 /* 048318 80047718 86040000 */ lh $a0, ($s0) -/* 04831C 8004771C 0C01C8D2 */ jal func_80072348 +/* 04831C 8004771C 0C01C8D2 */ jal rumble_set /* 048320 80047720 24050008 */ li $a1, 8 /* 048324 80047724 C7B20104 */ lwc1 $f18, 0x104($sp) /* 048328 80047728 00000000 */ nop diff --git a/asm/non_matchings/racer/func_80049794.s b/asm/non_matchings/racer/func_80049794.s index a6a99a10..21157ee4 100644 --- a/asm/non_matchings/racer/func_80049794.s +++ b/asm/non_matchings/racer/func_80049794.s @@ -518,7 +518,7 @@ glabel func_80049794 /* 04AA54 80049E54 14200006 */ bnez $at, .L80049E70 /* 04AA58 80049E58 00000000 */ nop /* 04AA5C 80049E5C 86040000 */ lh $a0, ($s0) -/* 04AA60 80049E60 0C01C8D2 */ jal func_80072348 +/* 04AA60 80049E60 0C01C8D2 */ jal rumble_set /* 04AA64 80049E64 24050003 */ li $a1, 3 /* 04AA68 80049E68 44806000 */ mtc1 $zero, $f12 /* 04AA6C 80049E6C 00000000 */ nop @@ -894,7 +894,7 @@ glabel func_80049794 /* 04AFDC 8004A3DC 0C015C2E */ jal play_random_character_voice /* 04AFE0 8004A3E0 24070082 */ li $a3, 130 /* 04AFE4 8004A3E4 86040000 */ lh $a0, ($s0) -/* 04AFE8 8004A3E8 0C01C8D2 */ jal func_80072348 +/* 04AFE8 8004A3E8 0C01C8D2 */ jal rumble_set /* 04AFEC 8004A3EC 24050008 */ li $a1, 8 /* 04AFF0 8004A3F0 3C098012 */ lui $t1, %hi(gCurrentStickY) # $t1, 0x8012 /* 04AFF4 8004A3F4 C7A10048 */ lwc1 $f1, 0x48($sp) @@ -1173,7 +1173,7 @@ glabel func_80049794 .L8004A7E8: /* 04B3E8 8004A7E8 86040000 */ lh $a0, ($s0) /* 04B3EC 8004A7EC E7AE00DC */ swc1 $f14, 0xdc($sp) -/* 04B3F0 8004A7F0 0C01C8D2 */ jal func_80072348 +/* 04B3F0 8004A7F0 0C01C8D2 */ jal rumble_set /* 04B3F4 8004A7F4 24050008 */ li $a1, 8 /* 04B3F8 8004A7F8 C7AE00DC */ lwc1 $f14, 0xdc($sp) /* 04B3FC 8004A7FC 10000015 */ b .L8004A854 diff --git a/asm/non_matchings/racer/func_80050A28.s b/asm/non_matchings/racer/func_80050A28.s index 327fce50..3f50f3f7 100644 --- a/asm/non_matchings/racer/func_80050A28.s +++ b/asm/non_matchings/racer/func_80050A28.s @@ -204,7 +204,7 @@ glabel func_80050A28 /* 05187C 80050C7C 15800007 */ bnez $t4, .L80050C9C /* 051880 80050C80 00000000 */ nop /* 051884 80050C84 86040000 */ lh $a0, ($s0) -/* 051888 80050C88 0C01C8D2 */ jal func_80072348 +/* 051888 80050C88 0C01C8D2 */ jal rumble_set /* 05188C 80050C8C AFA70078 */ sw $a3, 0x78($sp) /* 051890 80050C90 3C088012 */ lui $t0, %hi(gCurrentRacerInput) # $t0, 0x8012 /* 051894 80050C94 8FA70078 */ lw $a3, 0x78($sp) @@ -531,7 +531,7 @@ glabel func_80050A28 /* 051D24 80051124 15C00006 */ bnez $t6, .L80051140 /* 051D28 80051128 00000000 */ nop /* 051D2C 8005112C 86040000 */ lh $a0, ($s0) -/* 051D30 80051130 0C01C8D2 */ jal func_80072348 +/* 051D30 80051130 0C01C8D2 */ jal rumble_set /* 051D34 80051134 00002825 */ move $a1, $zero /* 051D38 80051138 860301A2 */ lh $v1, 0x1a2($s0) /* 051D3C 8005113C 00000000 */ nop @@ -880,7 +880,7 @@ glabel func_80050A28 /* 052220 80051620 E7B00040 */ swc1 $f16, 0x40($sp) /* 052224 80051624 E7AE0044 */ swc1 $f14, 0x44($sp) /* 052228 80051628 AFA90064 */ sw $t1, 0x64($sp) -/* 05222C 8005162C 0C01C8D2 */ jal func_80072348 +/* 05222C 8005162C 0C01C8D2 */ jal rumble_set /* 052230 80051630 A3A80057 */ sb $t0, 0x57($sp) /* 052234 80051634 83A80057 */ lb $t0, 0x57($sp) /* 052238 80051638 8FA90064 */ lw $t1, 0x64($sp) @@ -1082,7 +1082,7 @@ glabel func_80050A28 /* 05252C 8005192C 24050008 */ li $a1, 8 /* 052530 80051930 86040000 */ lh $a0, ($s0) /* 052534 80051934 E7AE0044 */ swc1 $f14, 0x44($sp) -/* 052538 80051938 0C01C8D2 */ jal func_80072348 +/* 052538 80051938 0C01C8D2 */ jal rumble_set /* 05253C 8005193C AFA90064 */ sw $t1, 0x64($sp) /* 052540 80051940 8FA90064 */ lw $t1, 0x64($sp) /* 052544 80051944 C7AE0044 */ lwc1 $f14, 0x44($sp) diff --git a/asm/non_matchings/racer/func_80054FD0.s b/asm/non_matchings/racer/func_80054FD0.s index 29cb911f..9acf8358 100644 --- a/asm/non_matchings/racer/func_80054FD0.s +++ b/asm/non_matchings/racer/func_80054FD0.s @@ -306,7 +306,7 @@ glabel func_80054FD0 /* 056050 80055450 24050012 */ li $a1, 18 /* 056054 80055454 462042A0 */ cvt.s.d $f10, $f8 /* 056058 80055458 44065000 */ mfc1 $a2, $f10 -/* 05605C 8005545C 0C01C909 */ jal func_80072424 +/* 05605C 8005545C 0C01C909 */ jal rumble_set_fade /* 056060 80055460 00000000 */ nop /* 056064 80055464 C7A00178 */ lwc1 $f0, 0x178($sp) /* 056068 80055468 8FA9018C */ lw $t1, 0x18c($sp) diff --git a/asm/non_matchings/waves/func_800B82B4.s b/asm/non_matchings/waves/func_800B82B4.s index e26af254..896bb0a3 100644 --- a/asm/non_matchings/waves/func_800B82B4.s +++ b/asm/non_matchings/waves/func_800B82B4.s @@ -589,8 +589,8 @@ glabel func_800B82B4 .L800B8B34: /* B9734 800B8B34 3C01800E */ lui $at, %hi(D_800E3188) /* B9738 800B8B38 AC203188 */ sw $zero, %lo(D_800E3188)($at) -/* B973C 800B8B3C 3C018013 */ lui $at, %hi(D_8012A728) -/* B9740 800B8B40 AC20A728 */ sw $zero, %lo(D_8012A728)($at) +/* B973C 800B8B3C 3C018013 */ lui $at, %hi(gWavePowerDivisor) +/* B9740 800B8B40 AC20A728 */ sw $zero, %lo(gWavePowerDivisor)($at) /* B9744 800B8B44 3C01800E */ lui $at, %hi(gWaveGeneratorObj) /* B9748 800B8B48 8FBF0044 */ lw $ra, 0x44($sp) /* B974C 800B8B4C AC203198 */ sw $zero, %lo(gWaveGeneratorObj)($at) diff --git a/asm/non_matchings/waves/func_800B8C04.s b/asm/non_matchings/waves/func_800B8C04.s index 591ff33f..73121f09 100644 --- a/asm/non_matchings/waves/func_800B8C04.s +++ b/asm/non_matchings/waves/func_800B8C04.s @@ -18,7 +18,7 @@ glabel func_800B8C04 /* 0B9844 800B8C44 00808025 */ move $s0, $a0 /* 0B9848 800B8C48 AFB60030 */ sw $s6, 0x30($sp) /* 0B984C 800B8C4C AFA7005C */ sw $a3, 0x5c($sp) -/* 0B9850 800B8C50 3C048013 */ lui $a0, %hi(D_8012A720) # $a0, 0x8013 +/* 0B9850 800B8C50 3C048013 */ lui $a0, %hi(gWavePowerBase) # $a0, 0x8013 /* 0B9854 800B8C54 2419FFFF */ li $t9, -1 /* 0B9858 800B8C58 3C038013 */ lui $v1, %hi(D_8012A600) # $v1, 0x8013 /* 0B985C 800B8C5C AFBF003C */ sw $ra, 0x3c($sp) @@ -41,7 +41,7 @@ glabel func_800B8C04 .L800B8C9C: /* 0B989C 800B8C9C 00002812 */ mflo $a1 /* 0B98A0 800B8CA0 2463A600 */ addiu $v1, %lo(D_8012A600) # addiu $v1, $v1, -0x5a00 -/* 0B98A4 800B8CA4 2484A720 */ addiu $a0, %lo(D_8012A720) # addiu $a0, $a0, -0x58e0 +/* 0B98A4 800B8CA4 2484A720 */ addiu $a0, %lo(gWavePowerBase) # addiu $a0, $a0, -0x58e0 /* 0B98A8 800B8CA8 01E9001A */ div $zero, $t7, $t1 /* 0B98AC 800B8CAC 15200002 */ bnez $t1, .L800B8CB8 /* 0B98B0 800B8CB0 00000000 */ nop diff --git a/asm/non_matchings/waves/func_800B9C18.s b/asm/non_matchings/waves/func_800B9C18.s index be2613af..f847b74d 100644 --- a/asm/non_matchings/waves/func_800B9C18.s +++ b/asm/non_matchings/waves/func_800B9C18.s @@ -406,8 +406,8 @@ glabel func_800B9C18 /* 0BAE0C 800BA20C 3C0B8013 */ lui $t3, %hi(D_80129FC8) # $t3, 0x8013 /* 0BAE10 800BA210 256B9FC8 */ addiu $t3, %lo(D_80129FC8) # addiu $t3, $t3, -0x6038 .L800BA214: -/* 0BAE14 800BA214 3C038013 */ lui $v1, %hi(D_8012A728) # $v1, 0x8013 -/* 0BAE18 800BA218 2463A728 */ addiu $v1, %lo(D_8012A728) # addiu $v1, $v1, -0x58d8 +/* 0BAE14 800BA214 3C038013 */ lui $v1, %hi(gWavePowerDivisor) # $v1, 0x8013 +/* 0BAE18 800BA218 2463A728 */ addiu $v1, %lo(gWavePowerDivisor) # addiu $v1, $v1, -0x58d8 /* 0BAE1C 800BA21C 8C620000 */ lw $v0, ($v1) /* 0BAE20 800BA220 00000000 */ nop /* 0BAE24 800BA224 18400012 */ blez $v0, .L800BA270 @@ -415,9 +415,9 @@ glabel func_800B9C18 /* 0BAE2C 800BA22C 1020000C */ beqz $at, .L800BA260 /* 0BAE30 800BA230 00000000 */ nop /* 0BAE34 800BA234 44912000 */ mtc1 $s1, $f4 -/* 0BAE38 800BA238 3C018013 */ lui $at, %hi(D_8012A724) # $at, 0x8013 +/* 0BAE38 800BA238 3C018013 */ lui $at, %hi(gWaveMagnitude) # $at, 0x8013 /* 0BAE3C 800BA23C 468021A0 */ cvt.s.w $f6, $f4 -/* 0BAE40 800BA240 C428A724 */ lwc1 $f8, %lo(D_8012A724)($at) +/* 0BAE40 800BA240 C428A724 */ lwc1 $f8, %lo(gWaveMagnitude)($at) /* 0BAE44 800BA244 C5700040 */ lwc1 $f16, 0x40($t3) /* 0BAE48 800BA248 46083282 */ mul.s $f10, $f6, $f8 /* 0BAE4C 800BA24C 00517023 */ subu $t6, $v0, $s1 @@ -426,8 +426,8 @@ glabel func_800B9C18 /* 0BAE58 800BA258 10000005 */ b .L800BA270 /* 0BAE5C 800BA25C E5720040 */ swc1 $f18, 0x40($t3) .L800BA260: -/* 0BAE60 800BA260 3C018013 */ lui $at, %hi(D_8012A720) # $at, 0x8013 -/* 0BAE64 800BA264 C424A720 */ lwc1 $f4, %lo(D_8012A720)($at) +/* 0BAE60 800BA260 3C018013 */ lui $at, %hi(gWavePowerBase) # $at, 0x8013 +/* 0BAE64 800BA264 C424A720 */ lwc1 $f4, %lo(gWavePowerBase)($at) /* 0BAE68 800BA268 AC600000 */ sw $zero, ($v1) /* 0BAE6C 800BA26C E5640040 */ swc1 $f4, 0x40($t3) .L800BA270: diff --git a/extract-ver/us_1.0.config.json b/extract-ver/us_1.0.config.json index 4913edc9..62f41664 100644 --- a/extract-ver/us_1.0.config.json +++ b/extract-ver/us_1.0.config.json @@ -15403,6 +15403,11 @@ "misc-type": "RacerStat", "folder": "racer_stats" }, + { + "index": 19, + "filename": "rumble_data", + "build-id": "ASSET_MISC_RUMBLE_DATA" + }, { "index": 21, "filename": "shield_data", diff --git a/include/asset_enums.h b/include/asset_enums.h index 1c863d11..2851048f 100644 --- a/include/asset_enums.h +++ b/include/asset_enums.h @@ -3068,7 +3068,7 @@ typedef enum AssetMiscEnum { ASSET_MISC_16, ASSET_MISC_17, ASSET_MISC_18, - ASSET_MISC_19, + ASSET_MISC_RUMBLE_DATA, ASSET_MISC_20, ASSET_MISC_SHIELD_DATA, ASSET_MISC_MAGNET_DATA, diff --git a/include/enums.h b/include/enums.h index 31793ecb..b0dea8bd 100644 --- a/include/enums.h +++ b/include/enums.h @@ -93,6 +93,19 @@ typedef enum RaceType { RACETYPE_CHALLENGE = 0x40 // For masking } RaceType; +enum BossSetupTypes { + BOSS_RACE_TRICKY1, + BOSS_RACE_BLUEY1, + BOSS_RACE_SMOKEY1, + BOSS_RACE_TRICKY2, + BOSS_RACE_BLUEY2, + BOSS_RACE_BUBBLER1, + BOSS_RACE_BUBBLER2, + BOSS_RACE_SMOKEY2, + BOSS_RACE_WIZPIG1, + BOSS_RACE_WIZPIG2 +}; + typedef enum ObjectModelType { OBJECT_MODEL_TYPE_3D_MODEL, OBJECT_MODEL_TYPE_SPRITE_BILLBOARD, diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 5d192cb3..3817846d 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -723,8 +723,8 @@ typedef struct LevelObjectEntry800BF524 { typedef struct LevelObjectEntry_WavePower { LevelObjectEntryCommon common; u16 radius; - u16 unkA; - u16 unkC; + u16 power; + u16 divisor; } LevelObjectEntry_WavePower; typedef struct LevelObjectEntry_CharacterSelect { diff --git a/include/structs.h b/include/structs.h index 6b446267..6b2a637e 100644 --- a/include/structs.h +++ b/include/structs.h @@ -430,8 +430,8 @@ typedef struct LevelHeader { /* 0x5D */ u8 unk5D; /* 0x5E */ s16 unk5E; /* 0x60 */ s16 unk60; - /* 0x62 */ s16 unk62; - /* 0x64 */ s16 unk64; + /* 0x62 */ s16 wavePower; + /* 0x64 */ s16 unk64; // Some form of secondary power /* 0x66 */ s16 unk66; /* 0x68 */ s16 unk68; /* 0x6A */ u8 unk6A; @@ -479,7 +479,7 @@ typedef struct LevelHeader { /* 0xB5 */ u8 unkB5; /* 0xB6 */ u8 unkB6; /* 0xB7 */ u8 unkB7; - /* 0xB8 */ s8 unkB8; + /* 0xB8 */ s8 bossRaceID; /* 0xB9 */ u8 unkB9; /* 0xBA */ s16 unkBA; /* 0xBC */ u8 unkBC; @@ -1313,7 +1313,7 @@ typedef struct Object_Racer { /* 0x1A6 */ s16 z_rotation_vel; /* 0x1A8 */ s16 unk1A8; /* 0x1AA */ u16 unk1AA; - /* 0x1AC */ s16 unk1AC; + /* 0x1AC */ s16 finishPosition; /* 0x1AE */ s16 racePosition; /* 0x1B0 */ s16 unk1B0; /* 0x1B2 */ s16 unk1B2; @@ -1347,7 +1347,7 @@ typedef struct Object_Racer { /* 0x1DA */ u8 unk1DA; /* 0x1DB */ s8 spinout_timer; /* 0x1DC */ u8 wheel_surfaces[4]; - /* 0x1E0 */ s8 unk1E0; + /* 0x1E0 */ s8 trickType; // This depends on which vehicle you're using, but this name fits the most for now. /* 0x1E1 */ s8 steerAngle; /* 0x1E2 */ s8 groundedWheels; /* 0x1E3 */ s8 unk1E3; @@ -1358,8 +1358,8 @@ typedef struct Object_Racer { /* 0x1E8 */ s8 unk1E8; /* 0x1E9 */ s8 unk1E9; /* 0x1EA */ s8 unk1EA; - /* 0x1EB */ s8 unk1EB; - /* 0x1EC */ s8 unk1EC; + /* 0x1EB */ s8 tapTimerR; + /* 0x1EC */ s8 tappedR; /* 0x1ED */ s8 squish_timer; /* 0x1EE */ u8 unk1EE; /* 0x1EF */ u8 boost_sound; @@ -1686,9 +1686,9 @@ typedef struct Object_68 { /* 0x10 */ s16 animationID; /* 0x12 */ s16 animationFrame; /* 0x14 */ s16 animationFrameCount; - /* 0x16 */ s16 unk16; - /* 0x18 */ s16 unk18; - /* 0x1A */ s16 unk1A; + /* 0x16 */ s16 offsetX; + /* 0x18 */ s16 offsetY; + /* 0x1A */ s16 offsetZ; /* 0x1C */ s16 unk1C; /* 0x1E */ s8 unk1E; /* 0x1F */ s8 animationTaskNum; @@ -1898,7 +1898,7 @@ typedef struct Object { /* 0x0000 */ ObjectSegment segment; /* 0x0044 */ Vertex *unk44; /* 0x0048 */ s16 behaviorId; - /* 0x004A */ s16 unk4A; // Upper byte is object ID, lower byte is object size. + /* 0x004A */ s16 objectID; // First 9 bits are object ID, last 7 bits are header size /* 0x004C */ ObjectInteraction *interactObj; //player + 0x318 /* 0x0050 */ ShadowData *shadow; //player + 0x2F4 /* 0x0054 */ ShadeProperties *shading; //player + 0x2C0 diff --git a/lib/src/os/controller.c b/lib/src/os/controller.c index 43643f56..8f63ee80 100644 --- a/lib/src/os/controller.c +++ b/lib/src/os/controller.c @@ -12,14 +12,14 @@ #define HALF_A_SECOND HALF_MIL_CYLCES * osClockRate / ONE_MIL_CYLCES u32 __osContinitialized = 0; -OSPifRam __osContPifRam; +ALIGNED16 OSPifRam __osContPifRam; u8 __osContLastCmd; u8 __osMaxControllers; OSTimer __osEepromTimer; OSMesgQueue __osEepromTimerQ; OSMesg __osEepromTimerMsg; s32 D_8012CDD4[2]; //Padding? Maybe osClockRate should be declared here? -OSPifRam __osPfsPifRam; +ALIGNED16 OSPifRam __osPfsPifRam; extern OSTime osClockRate; s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *data) { diff --git a/src/audio_spatial.c b/src/audio_spatial.c index 013232de..110a6d05 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -227,8 +227,8 @@ void play_sound_at_position(u16 soundId, f32 x, f32 y, f32 z, u8 arg4, SoundMask D_80119C40[soundId].distance, 0, D_80119C40[soundId].pitch, D_80119C40[soundId].unk8, soundMask); } -void func_800095E8(u16 soundId, f32 x, f32 y, f32 z, u8 arg4, u8 arg5, f32 arg6, SoundMask **soundMask) { - func_8000974C(soundId, x, y, z, arg4, 100, arg5, 15000, 0, arg6, 0x3F, soundMask); +void func_800095E8(u16 soundId, f32 x, f32 y, f32 z, u8 arg4, u8 arg5, f32 pitch, SoundMask **soundMask) { + func_8000974C(soundId, x, y, z, arg4, 100, arg5, 15000, 0, pitch, 0x3F, soundMask); } // I think this function is used to update the world position of any sound associated with the given soundmask. diff --git a/src/camera.c b/src/camera.c index 4b4b5d7d..461ffee9 100644 --- a/src/camera.c +++ b/src/camera.c @@ -94,7 +94,7 @@ s32 gViewportCap; UNUSED s32 D_80120CEC; ObjectTransform gCameraTransform; s32 gMatrixType; -s32 D_80120D0C; +s32 gSpriteAnimOff; f32 gCurCamFOV; s8 gCutsceneCameraActive; s8 gAdjustViewportHeight; @@ -145,7 +145,7 @@ void camera_init(void) { gModelMatrixStackPos = 0; gCameraMatrixPos = 0; gNumberOfViewports = 0; - D_80120D0C = FALSE; + gSpriteAnimOff = FALSE; D_80120D18 = 0; gAdjustViewportHeight = 0; gAntiPiracyViewport = 0; @@ -1023,8 +1023,12 @@ void matrix_world_origin(Gfx **dlist, MatrixS **mtx) { gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), gMatrixType << 6); } -void func_80068508(s32 bool) { - D_80120D0C = bool; +/** + * If set to true, disables animated sprite frames. + * Used when the sprite frame is already established before calling to draw. + */ +void sprite_anim_off(s32 setting) { + gSpriteAnimOff = setting; } /** @@ -1119,7 +1123,7 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); gDkrEnableBillboard((*dlist)++); } - if (D_80120D0C == FALSE) { + if (gSpriteAnimOff == FALSE) { textureFrame = ((textureFrame & 0xFF) * arg4->textureCount) >> 8; } flags &= ~RENDER_VEHICLE_PART; @@ -1190,7 +1194,7 @@ void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, Objec gModelMatrixS[gModelMatrixStackPos] = *mtx; gSPMatrix((*dList)++, OS_PHYSICAL_TO_K0((*mtx)++), G_MTX_DKR_INDEX_2); gDkrEnableBillboard((*dList)++); - if (D_80120D0C == FALSE) { + if (gSpriteAnimOff == FALSE) { index = (((u8) index) * sprite->baseTextureId) >> 8; } func_8007BF34(dList, sprite->unk6 | flags); @@ -1375,17 +1379,17 @@ void camera_push_model_mtx(Gfx **dList, MatrixS **mtx, ObjectTransform *trans, f void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s16 headAngle) { f32 coss_headAngle; f32 sins_headAngle; - f32 f_unk16; - f32 f_unk18; - f32 f_unk1A; + f32 offsetX; + f32 offsetY; + f32 offsetZ; f32 coss_unk1C; f32 sins_unk1C; Matrix rotationMtxF; Matrix headMtxF; - f_unk16 = (f32) objGfx->unk16; - f_unk18 = (f32) objGfx->unk18; - f_unk1A = (f32) objGfx->unk1A; + 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_headAngle = coss_f(headAngle); @@ -1402,11 +1406,11 @@ void apply_head_turning_matrix(Gfx **dlist, MatrixS **mtx, Object_68 *objGfx, s1 headMtxF[2][1] = (sins_headAngle * sins_unk1C); headMtxF[2][2] = coss_headAngle; headMtxF[2][3] = 0.0f; - headMtxF[3][0] = (-f_unk16 * (coss_headAngle * coss_unk1C)) + (-f_unk18 * -sins_unk1C) + - (-f_unk1A * (sins_headAngle * coss_unk1C)) + f_unk16; - headMtxF[3][1] = (-f_unk16 * (coss_headAngle * sins_unk1C)) + (-f_unk18 * coss_unk1C) + - (-f_unk1A * (sins_headAngle * sins_unk1C)) + f_unk18; - headMtxF[3][2] = (-f_unk16 * -sins_headAngle) + (-f_unk1A * coss_headAngle) + f_unk1A; + headMtxF[3][0] = (-offsetX * (coss_headAngle * coss_unk1C)) + (-offsetY * -sins_unk1C) + + (-offsetZ * (sins_headAngle * coss_unk1C)) + offsetX; + headMtxF[3][1] = (-offsetX * (coss_headAngle * sins_unk1C)) + (-offsetY * coss_unk1C) + + (-offsetZ * (sins_headAngle * sins_unk1C)) + offsetY; + headMtxF[3][2] = (-offsetX * -sins_headAngle) + (-offsetZ * coss_headAngle) + offsetZ; headMtxF[3][3] = 1.0f; f32_matrix_mult(&headMtxF, &gCurrentModelMatrixS, &rotationMtxF); f32_matrix_to_s16_matrix(&rotationMtxF, *mtx); diff --git a/src/camera.h b/src/camera.h index 958ac40f..c61bd8c8 100644 --- a/src/camera.h +++ b/src/camera.h @@ -110,7 +110,7 @@ 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 func_80068508(s32 bool); +void sprite_anim_off(s32 setting); ObjectSegment *get_active_camera_segment_no_cutscenes(void); ObjectSegment *get_active_camera_segment(void); ObjectSegment *get_cutscene_camera_segment(void); diff --git a/src/controller.c b/src/controller.c index 82e67db4..7909451a 100644 --- a/src/controller.c +++ b/src/controller.c @@ -105,7 +105,7 @@ s32 handle_save_data_and_read_controller(s32 saveDataFlags, s32 updateRate) { // Reset all flags saveDataFlags = 0; } - rumble_controllers(updateRate); + rumble_update(updateRate); osContStartReadData(&sSIMesgQueue); } for (i = 0; i < MAXCONTROLLERS; i++) { diff --git a/src/game.c b/src/game.c index bea09460..676c9555 100644 --- a/src/game.c +++ b/src/game.c @@ -374,7 +374,7 @@ void load_level(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicl Settings *settings; s32 offset; - func_80072708(); + rumble_kill(); if (cutsceneId == -1) { cutsceneId = CUTSCENE_NONE; } diff --git a/src/game_ui.c b/src/game_ui.c index f69db989..c725007a 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -25,68 +25,69 @@ /************ .data ************/ // Unused? -s32 D_800E1E60 = 0; +UNUSED s32 D_800E1E60 = 0; -unk800E1E64 D_800E1E64[59] = { - { 0, 0, 1.0f, 53.0f, 16.0f, 0, 127, 0 }, - { 0, 3, 1.0f, 54.0f, 18.0f, 0, 0, 0 }, - { 0, 1, 0.4f, -120.0f, -68.0f, 0, 0, 0 }, - { 0, 6, 1.0f, 104.0f, 16.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 93.0f, 31.0f, 0, 0, 0 }, - { 0, 4, 1.0f, 104.0f, 32.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 114.0f, 31.0f, 0, 0, 0 }, - { 0, 8, 0.5f, -3.0f, 73.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 182.0f, 22.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 192.0f, 22.0f, 0, 0, 0 }, - { 0, 13, 1.0f, 239.0f, 16.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 206.0f, 31.0f, 0, 0, 0 }, - { 0, 7, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 22, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 5, 1.0f, -200.0f, 30.0f, 0, 0, 0 }, - { 0, 14, 1.0f, 0.0f, 0.0f, 0, 0, 0 }, - { 0, 16, 1.0f, -50.0f, 87.0f, 0, 0, 0 }, - { 0, 17, 2.0f, -50.0f, 87.0f, 0, 0, 0 }, - { 0, 18, 1.0f, 167.0f, 22.0f, 0, 0, 0 }, - { 0, 19, 1.0f, -127.0f, 88.0f, 0, 0, 0 }, - { 0, 18, 1.0f, 52.0f, 27.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 67.0f, 27.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 77.0f, 27.0f, 0, 0, 0 }, - { 0, 9, 1.0f, 221.0f, 48.0f, 0, 0, 0 }, - { 0, 6, 1.0f, 188.0f, 48.0f, 0, 0, 0 }, - { 0, 10, 1.0f, 206.0f, 48.0f, 0, 0, 0 }, - { 0, 20, 0.4f, -105.0f, -98.0f, 0, 0, 0 }, - { 0, 21, 0.5f, -3.0f, 73.0f, 0, 0, 0 }, - { 0, 23, 1.0f, -8.0f, 97.0f, 0, 0, 0 }, - { 0, 24, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 25, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 26, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 2, 1.0f, 25.0f, 48.0f, 0, 0, 0 }, - { 0, 32, 1.0f, -120.0f, 30.0f, 0, 0, 0 }, - { 0, 34, 0.4f, -105.0f, -98.0f, 0, 0, 0 }, - { 0, 35, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 36, 1.0f, 0.0f, 30.0f, 0, 0, 0 }, - { 0, 40, 1.0f, 80.0f, -60.0f, 0, 0, 0 }, - { 0, 1687158830, 0.5f, 122.0f, -71.0f, 0, 0, 0 }, - { 0, 47, 0.75f, 247.0f, 212.0f, 0, 0, 0 }, - { 0, 48, 1.0f, 234.0f, 196.0f, 0, 0, 0 }, - { 0, 49, 1.0f, 232.0f, 177.0f, 0, 0, 0 }, - { 0, 50, 1.0f, 240.0f, 159.0f, 0, 0, 0 }, - { 0, 51, 1.0f, 256.0f, 146.0f, 0, 0, 0 }, - { 0, 52, 1.0f, 275.0f, 143.0f, 0, 0, 0 }, - { 0, 53, 1.0f, 246.0f, 156.0f, 0, 0, 0 }, - { 0, 54, 0.7272f, 27.0f, 142.0f, 0, 0, 0 }, - { 0, 0, 1.0f, -200.0f, 70.0f, 0, 129, 0 }, - { 0, 3, 1.0f, -175.0f, 72.0f, 0, 0, 0 }, - { 0, 55, 1.0f, -99.0f, -89.0f, 0, 0, 0 }, - { 0, 56, 0.76f, 43.0f, 20.0f, 0, 0, 0 }, - { 0, 66, 1.0f, 40.0f, 54.0f, 0, 0, 0 }, - { 0, 8, 0.375f, -117.0f, 46.0f, 0, 0, 0 }, - { 0, 28, 1.0f, 51.0f, 56.0f, 0, 0, 0 }, - { 0, 10, 1.0f, 60.0f, 57.0f, 0, 0, 0 }, - { 0, 10, 1.0f, 69.0f, 57.0f, 0, 0, 0 }, - { 0, 67, 1.0f, -160.0f, 5.0f, 0, 0, 0 }, - { 0, 56, 1.0f, 260.0f, 16.0f, 0, 0, 0 }, - { 0, 68, 1.0f, 160.0f, 5.0f, 0, 0, 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 }, }; u16 D_800E25C4[96] = { @@ -111,9 +112,9 @@ u16 D_800E2684[118] = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x0000, }; -unk800E2770 D_800E2770[2] = { - { 0x00FD, 0, 0, NULL, 0, 0, 0, 0, 0 }, - { 0x00FF, 0, 0, NULL, 0, 0, 0, 0, 0 }, +HudAudio gHudAudioData[2] = { + { SOUND_CROWD, 0, 0, NULL, 0, 0, 0, 0, 0 }, + { SOUND_UNK_FF, 0, 0, NULL, 0, 0, 0, 0, 0 }, }; u8 gShowCourseDirections = TRUE; @@ -122,15 +123,15 @@ u8 D_800E2794[4][4] = { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 2, 2, 2, 2 }, { 2, 2, s8 gHudToggleSettings[4] = { 1, 1, 1, 1 }; -s8 D_800E27A8 = 1; +s8 gPrevToggleSetting = 1; -u32 D_800E27AC[3] = { +u32 gHudLapColours[3] = { COLOUR_RGBA32(255, 40, 40, 254), COLOUR_RGBA32(40, 255, 40, 254), COLOUR_RGBA32(40, 40, 255, 254), }; -u8 D_800E27B8 = 0; +u8 gHudIndicatorTimer = 0; ByteColour gHudMinimapColours[40] = { { 255, 160, 0 }, { 255, 255, 0 }, { 0, 128, 255 }, { 255, 255, 255 }, { 0, 175, 0 }, { 0, 255, 128 }, @@ -197,7 +198,7 @@ u8 D_80126D35; u8 gHideRaceTimer; u8 gNumActivePlayers; u8 gWrongWayNagPrefix; -SoundMask *D_80126D3C; +SoundMask *gRaceStartSoundMask; s32 gHUDVoiceSoundMask; s32 D_80126D44; s16 D_80126D48; @@ -216,11 +217,11 @@ u8 gStopwatchFaceID; u8 D_80126D68; s8 D_80126D69; s32 gWrongWayNagTimer; -u8 D_80126D70; -u8 D_80126D71; -s32 gTimeTrialVoiceDelay; -s32 D_80126D78; -u16 gTimeTrialVoiceID; +u8 gHudAudioReset; +u8 gHudTimeTrialGhost; +s32 gHudVoiceTimer; +s32 gHudVoicePlayerID; +u16 gHudVoiceID; DrawTexture gHudSprites[128]; s32 D_80127180; Settings *gHudSettings; @@ -289,10 +290,10 @@ void init_hud(UNUSED s32 viewportCount) { gStopwatchFaceID = 4; D_80126D69 = 1; D_80126D68 = 1; - D_80126D70 = 0; - gTimeTrialVoiceID = 0; - gTimeTrialVoiceDelay = 0; - D_80126D3C = NULL; + gHudAudioReset = FALSE; + gHudVoiceID = 0; + gHudVoiceTimer = 0; + gRaceStartSoundMask = NULL; D_80126D44 = 0; gMinimapXlu = 0; D_80127194 = (LevelHeader_70 *) get_misc_asset(ASSET_MISC_58); @@ -300,34 +301,35 @@ void init_hud(UNUSED s32 viewportCount) { set_sound_channel_volume(0, 32767); set_sound_channel_volume(2, 32767); for (i = 0; i < 2; i++) { - D_800E2770[i].volume = 0; - D_800E2770[i].unk3 = 0; - D_800E2770[i].playerIndex = PLAYER_COMPUTER; - if (D_800E2770[i].soundMask) { - func_8000488C(D_800E2770[i].soundMask); + gHudAudioData[i].volume = 0; + gHudAudioData[i].volumeRamp = 0; + gHudAudioData[i].playerIndex = PLAYER_COMPUTER; + if (gHudAudioData[i].soundMask) { + func_8000488C(gHudAudioData[i].soundMask); } } } +// hud_init_element GLOBAL_ASM("asm/non_matchings/game_ui/func_8009F034.s") /** - * Free's all elements in the hud, and the player hud, and flushes particles + * Frees all elements in the hud, and the player hud, and flushes particles */ void free_hud(void) { s32 i; for (i = 0; i < gAssetHudElementIdsCount; i++) { if (gAssetHudElements->entry[i] != NULL) { - if ((gAssetHudElementIds[i] & 0xC000) == 0xC000) { + if ((gAssetHudElementIds[i] & HUD_ELEMENT_TEXTURE) == HUD_ELEMENT_TEXTURE) { free_texture(gAssetHudElements->entry[i]); - } else if (gAssetHudElementIds[i] & 0x8000) { + } else if (gAssetHudElementIds[i] & HUD_ELEMENT_SPRITE) { free_sprite((Sprite *) gAssetHudElements->entry[i]); - } else if (gAssetHudElementIds[i] & 0x4000) { + } else if (gAssetHudElementIds[i] & HUD_ELEMENT_OBJECT) { free_object((Object *) gAssetHudElements->entry[i]); } else { free_3d_model((ObjectModel **) gAssetHudElements->entry[i]); } - gAssetHudElements->entry[i] = 0; + gAssetHudElements->entry[i] = NULL; } } free_from_memory_pool(*gPlayerHud); @@ -348,21 +350,21 @@ 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. */ -void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s32 updateRate) { - s32 sp2C; +void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *obj, s32 updateRate) { + s32 countdown; Object_Racer *racer; gHudCurrentViewport = get_current_viewport(); if (D_8012718A) { - arg3 = get_racer_object_by_port(1 - gHudCurrentViewport); + obj = get_racer_object_by_port(1 - gHudCurrentViewport); } gHudLevelHeader = get_current_level_header(); - if (arg3 == NULL) { + if (obj == NULL) { if (get_cutscene_id() == 10) { - arg3 = get_racer_object_by_port(PLAYER_ONE); + obj = get_racer_object_by_port(PLAYER_ONE); } } - if (arg3 != NULL && !(gHudLevelHeader->unkBC & 2)) { + if (obj != NULL && !(gHudLevelHeader->unkBC & 2)) { if (get_game_mode() != GAMEMODE_MENU) { gHUDCurrDisplayList = *dList; gHUDCurrMatrix = *mtx; @@ -380,7 +382,7 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s } } if (gShowHUD == 0) { - racer = (Object_Racer *) arg3->unk64; + racer = (Object_Racer *) obj->unk64; if (D_8012718A) { D_80126D10 = 1 - racer->playerIndex; } else { @@ -396,9 +398,9 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s gShowCourseDirections = 1 - gShowCourseDirections; sound_play((SOUND_TING_HIGHER + gShowCourseDirections), NULL); if (gShowCourseDirections) { - D_800E27B8 = 0x78; + gHudIndicatorTimer = 120; } else { - D_800E27B8 = 0; + gHudIndicatorTimer = 0; } } } else if (get_buttons_pressed_from_player(D_80126D10) & D_CBUTTONS && @@ -426,8 +428,8 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s gHudLevelHeader->race_type == RACETYPE_DEFAULT || gHudLevelHeader->race_type == RACETYPE_HORSESHOE_GULCH || gHudLevelHeader->race_type == RACETYPE_BOSS) { - D_800E2770[0].volume = 127; - D_800E2770[1].volume = 127; + gHudAudioData[0].volume = 127; + gHudAudioData[1].volume = 127; music_stop(); music_channel_reset_all(); music_play(SEQUENCE_RACE_START_FANFARE); @@ -473,63 +475,63 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s } } gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); - render_magnet_reticle(arg3); + render_magnet_reticle(obj); set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); gDPSetEnvColor(gHUDCurrDisplayList++, 255, 255, 255, 0); - sp2C = get_race_countdown() >> 1; + countdown = get_race_countdown() >> 1; if (is_in_time_trial()) { - func_800A277C(sp2C, arg3, updateRate); + func_800A277C(countdown, obj, updateRate); } else { if (get_cutscene_id() == 10) { - func_80068508(TRUE); + sprite_anim_off(TRUE); render_balloon_count(racer); - func_80068508(FALSE); + 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(sp2C, arg3, updateRate); + render_hud_taj_race(countdown, obj, updateRate); } else { - render_hud_race(sp2C, arg3, updateRate); + render_hud_race(countdown, obj, updateRate); } break; case RACETYPE_BOSS: - render_hud_race_boss(sp2C, arg3, updateRate); + render_hud_race_boss(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_BANANAS: - render_hud_banana_challenge(sp2C, arg3, updateRate); + render_hud_banana_challenge(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_BATTLE: - render_hud_battle(sp2C, arg3, updateRate); + render_hud_battle(countdown, obj, updateRate); break; case RACETYPE_CHALLENGE_EGGS: - render_hud_challenge_eggs(sp2C, arg3, updateRate); + render_hud_challenge_eggs(countdown, obj, updateRate); break; default: - render_hud_hubworld(arg3, updateRate); + render_hud_hubworld(obj, updateRate); break; } } } if (racer->raceFinished == TRUE) { - func_80068508(TRUE); + sprite_anim_off(TRUE); if (is_in_time_trial()) { render_time_trial_finish(racer, updateRate); - } else if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER && racer->unk1AC == 1) { + } 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) { - goto showFinish; + goto showFinishRace; } goto block_95; } - showFinish: + showFinishRace: render_race_finish_position(racer, updateRate); } else { block_95: func_800A6254(racer, updateRate); } - func_80068508(FALSE); + sprite_anim_off(FALSE); } gMinimapFade = FALSE; sprite_opaque(TRUE); @@ -546,62 +548,70 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s } } -void func_800A0B74(void) { +/** + * Clear any sounds associated with the HUD then set the data to null. + */ +void hud_audio_init(void) { s32 i; for (i = 0; i < 2; i++) { - if (D_800E2770[i].soundMask) { - func_8000488C(D_800E2770[i].soundMask); - D_800E2770[i].soundMask = NULL; - D_800E2770[i].volume = 0; + if (gHudAudioData[i].soundMask) { + func_8000488C(gHudAudioData[i].soundMask); + gHudAudioData[i].soundMask = NULL; + gHudAudioData[i].volume = 0; } } } -void func_800A0BD4(s32 updateRate) { +/** + * Play delayed voice clips if there's one waiting. + * Also play any background audio set by the HUD. + * This includes the sound of the crowd at the beginning and end of a race. + */ +void hud_audio_update(s32 updateRate) { s32 temp; s32 i; - if (gTimeTrialVoiceDelay > 0) { - gTimeTrialVoiceDelay -= updateRate; - if (gTimeTrialVoiceDelay <= 0) { - gTimeTrialVoiceDelay = 0; + if (gHudVoiceTimer > 0) { + gHudVoiceTimer -= updateRate; + if (gHudVoiceTimer <= 0) { + gHudVoiceTimer = 0; if (gHUDVoiceSoundMask == NULL) { - sound_play(gTimeTrialVoiceID, &gHUDVoiceSoundMask); + sound_play(gHudVoiceID, &gHUDVoiceSoundMask); } } } for (i = 0; i < 2; i++) { - if (D_800E2770[i].volume) { - if (D_800E2770[i].soundMask == NULL) { - sound_play(D_800E2770[i].soundID, (s32 *) &D_800E2770[i].soundMask); + if (gHudAudioData[i].volume) { + if (gHudAudioData[i].soundMask == NULL) { + sound_play(gHudAudioData[i].soundID, (s32 *) &gHudAudioData[i].soundMask); } - sound_volume_set_relative(D_800E2770[i].soundID, D_800E2770[i].soundMask, D_800E2770[i].volume); - if (D_800E2770[i].unk3 > 0) { - temp = D_800E2770[i].unk3 * updateRate; - if ((127 - temp) >= D_800E2770[i].volume) { - D_800E2770[i].volume += temp; + sound_volume_set_relative(gHudAudioData[i].soundID, gHudAudioData[i].soundMask, gHudAudioData[i].volume); + if (gHudAudioData[i].volumeRamp > 0) { + temp = gHudAudioData[i].volumeRamp * updateRate; + if ((127 - temp) >= gHudAudioData[i].volume) { + gHudAudioData[i].volume += temp; } else { - D_800E2770[i].unk3 = 0; - D_800E2770[i].volume = 0x7F; + gHudAudioData[i].volumeRamp = 0; + gHudAudioData[i].volume = 127; } - } else if (D_800E2770[i].unk3 < 0) { - temp = D_800E2770[i].unk3 * updateRate; - if (-temp < D_800E2770[i].volume) { - D_800E2770[i].volume += temp; + } else if (gHudAudioData[i].volumeRamp < 0) { + temp = gHudAudioData[i].volumeRamp * updateRate; + if (-temp < gHudAudioData[i].volume) { + gHudAudioData[i].volume += temp; } else { - D_800E2770[i].unk3 = 0; - D_800E2770[i].volume = 0; + gHudAudioData[i].volumeRamp = 0; + gHudAudioData[i].volume = 0; } } } else { - if (D_800E2770[i].soundMask) { - func_8000488C(D_800E2770[i].soundMask); - D_800E2770[i].soundMask = 0; + if (gHudAudioData[i].soundMask) { + func_8000488C(gHudAudioData[i].soundMask); + gHudAudioData[i].soundMask = 0; } } } - if ((D_80126D70 != 0) && (D_800E2770[0].volume == 0)) { - D_80126D70 = 0; + if (gHudAudioReset && gHudAudioData[0].volume == 0) { + gHudAudioReset = FALSE; if (gNumActivePlayers == 1) { set_sound_channel_count(8); } else if (gNumActivePlayers == 2) { @@ -615,13 +625,13 @@ void func_800A0BD4(s32 updateRate) { /** * In a race, render all of the race related HUD. */ -void render_hud_race(s32 arg0, Object *obj, s32 updateRate) { +void render_hud_race(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = &obj->unk64->racer; - func_80068508(TRUE); + sprite_anim_off(TRUE); render_course_indicator_arrows(racer, updateRate); render_wrong_way_text(racer, updateRate); - render_race_start(arg0, updateRate); + render_race_start(countdown, updateRate); if (gHudLevelHeader->race_type == RACETYPE_DEFAULT) { render_lap_count(racer, updateRate); @@ -637,7 +647,7 @@ void render_hud_race(s32 arg0, Object *obj, s32 updateRate) { } render_weapon_hud(obj, updateRate); - func_80068508(FALSE); + sprite_anim_off(FALSE); } /** @@ -699,7 +709,7 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { indicator->y_rotation = (s16) (0x8000 - indicator->y_rotation); } if (gHUDNumPlayers == ONE_PLAYER && racer->raceFinished == FALSE && racer->indicator_type && - D_800E27B8 == 0) { + gHudIndicatorTimer == 0) { gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); indicator->x = -indicator->x; @@ -712,8 +722,8 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { } else { racer->indicator_timer = 0; } - if (D_800E27B8) { - if (D_800E27B8 & 0x20) { + if (gHudIndicatorTimer) { + if (gHudIndicatorTimer & 0x20) { gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 160); indicator = &gCurrentHud->courseArrows; indicator->y_rotation = 0; @@ -723,16 +733,16 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { indicator->y_rotation = (s16) (0x8000 - indicator->y_rotation); } func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = (f32) -indicator->x; + indicator->x = -indicator->x; func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, indicator); - indicator->x = (f32) -indicator->x; + indicator->x = -indicator->x; gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); } - if (updateRate < D_800E27B8) { - D_800E27B8 -= updateRate; + if (updateRate < gHudIndicatorTimer) { + gHudIndicatorTimer -= updateRate; return; } - D_800E27B8 = 0; + gHudIndicatorTimer = 0; } } } @@ -741,7 +751,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 arg0, Object *obj, s32 updateRate) { +void render_hud_banana_challenge(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer; Object **racers; s32 numRacers; @@ -749,8 +759,8 @@ void render_hud_banana_challenge(s32 arg0, Object *obj, s32 updateRate) { racer = &obj->unk64->racer; racers = get_racer_objects(&numRacers); - func_80068508(TRUE); - render_race_start(arg0, updateRate); + sprite_anim_off(TRUE); + render_race_start(countdown, updateRate); switch (gNumActivePlayers) { case 1: for (i = 0; i < numRacers; i++) { @@ -776,52 +786,56 @@ void render_hud_banana_challenge(s32 arg0, Object *obj, s32 updateRate) { reset_render_settings(&gHUDCurrDisplayList); render_racer_bananas(racer, updateRate); render_weapon_hud(obj, updateRate); - func_80068508(FALSE); + sprite_anim_off(FALSE); } /** * The Egg Collector challenge mode displays the icons of each player and their score. */ -void render_hud_challenge_eggs(s32 arg0, Object *obj, s32 updateRate) { +void render_hud_challenge_eggs(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = &obj->unk64->racer; if (racer->raceFinished == FALSE) { - func_80068508(TRUE); - render_race_start(arg0, updateRate); + 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; } else { gCurrentHud->eggChallengeIcon.unk1A = (gCurrentHud->eggChallengeIcon.unk1A + (updateRate * 2)) - 255; } + // Skip rendering the portraits if in 2 player, it's done elsewhere. if (gNumActivePlayers != 2) { - func_800A14F0(obj, updateRate); + hud_draw_eggs(obj, updateRate); } - func_80068508(FALSE); + sprite_anim_off(FALSE); } } -void func_800A14F0(Object *racerObj, s32 updateRate) { +/** + * Position and render the portraits for the egg challenge HUD. + */ +void hud_draw_eggs(Object *racerObj, s32 updateRate) { Object **racers; s32 i; Object_Racer *racer; s32 numRacers; - s32 numOfFinishedPlayers; + s32 finishedPlayers; Object_Racer *curRacer; - s32 sp44; - s32 sp40; - s32 sp3C; - s32 sp38; + s32 portraitX; + s32 diffX; + s32 portraitY; + s32 diffY; racers = get_racer_objects(&numRacers); if (gNumActivePlayers == 2) { - numOfFinishedPlayers = 0; + finishedPlayers = 0; for (i = 0; i < numRacers; i++) { curRacer = &racers[i]->unk64->racer; - if (curRacer->playerIndex != -1 && curRacer->raceFinished) { - numOfFinishedPlayers++; + if (curRacer->playerIndex != PLAYER_COMPUTER && curRacer->raceFinished) { + finishedPlayers++; } } - if (numOfFinishedPlayers == 2) { + if (finishedPlayers == 2) { return; } } @@ -831,22 +845,22 @@ void func_800A14F0(Object *racerObj, s32 updateRate) { racer = &racers[0]->unk64->racer; } if (numRacers == 4) { - func_80068508(TRUE); - sp44 = gCurrentHud->challengePortrait.x; - sp3C = gCurrentHud->challengePortrait.y; - sp40 = (gCurrentHud->eggChallengeIcon.x - sp44); - sp38 = (gCurrentHud->eggChallengeIcon.y - sp3C); + sprite_anim_off(TRUE); + portraitX = gCurrentHud->challengePortrait.x; + portraitY = gCurrentHud->challengePortrait.y; + diffX = (gCurrentHud->eggChallengeIcon.x - portraitX); + diffY = (gCurrentHud->eggChallengeIcon.y - portraitY); for (i = 0; i < 4; i++) { curRacer = &racers[i]->unk64->racer; - if ((gNumActivePlayers < 3) || (racer->playerIndex == curRacer->playerIndex)) { - func_800A19A4(curRacer, updateRate); + if (gNumActivePlayers < 3 || racer->playerIndex == curRacer->playerIndex) { + hud_eggs_portrait(curRacer, updateRate); } - gHudColour = -2; + gHudColour = COLOUR_RGBA32(255, 255, 255, 254); if (gNumActivePlayers == 1) { gCurrentHud->challengePortrait.x += 68.0f; } else if (gNumActivePlayers == 2) { - gCurrentHud->challengePortrait.x = sp44; - if (osTvType == 0) { + gCurrentHud->challengePortrait.x = portraitX; + if (osTvType == TV_TYPE_PAL) { gCurrentHud->challengePortrait.y += 66.0; gCurrentHud->eggChallengeIcon.y += 66.0; } else { @@ -854,57 +868,61 @@ void func_800A14F0(Object *racerObj, s32 updateRate) { gCurrentHud->eggChallengeIcon.y += 55.0f; } } - gCurrentHud->eggChallengeIcon.x = gCurrentHud->challengePortrait.x + sp40; + gCurrentHud->eggChallengeIcon.x = gCurrentHud->challengePortrait.x + diffX; } - gCurrentHud->challengePortrait.x = sp44; - gCurrentHud->eggChallengeIcon.x = sp44 + sp40; - gCurrentHud->challengePortrait.y = sp3C; - gCurrentHud->eggChallengeIcon.y = sp3C + sp38; - func_80068508(FALSE); + gCurrentHud->challengePortrait.x = portraitX; + gCurrentHud->eggChallengeIcon.x = portraitX + diffX; + gCurrentHud->challengePortrait.y = portraitY; + gCurrentHud->eggChallengeIcon.y = portraitY + diffY; + sprite_anim_off(FALSE); } } -void func_800A19A4(Object_Racer *racer, UNUSED s32 updateRate) { +/** + * Render the character portrait and the number of eggs they have secured. + * Skip the portrait in 3/4 player, unless player 4 is AI controlled. + */ +void hud_eggs_portrait(Object_Racer *racer, UNUSED s32 updateRate) { s32 i; UNUSED s32 pad; - s32 sp44; + s32 alpha; s32 prevY; s32 i2; prevY = gCurrentHud->eggChallengeIcon.x; gCurrentHud->challengePortrait.spriteID = racer->characterId + HUD_SPRITE_PORTRAIT; - D_80126CD5 = 1; - if ((gNumActivePlayers < 3) || ((gNumActivePlayers == 3) && (racer->playerIndex == -1))) { + D_80126CD5 = TRUE; + if (gNumActivePlayers < 3 || (gNumActivePlayers == 3 && racer->playerIndex == PLAYER_COMPUTER)) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->challengePortrait); } if (gCurrentHud->eggChallengeIcon.unk1A < 0) { - sp44 = (gCurrentHud->eggChallengeIcon.unk1A * 2) + 256; + alpha = (gCurrentHud->eggChallengeIcon.unk1A * 2) + 256; } else { - sp44 = 255 - (gCurrentHud->eggChallengeIcon.unk1A * 2); + alpha = 255 - (gCurrentHud->eggChallengeIcon.unk1A * 2); } - if (sp44 > 254) { - sp44 = 254; + if (alpha > 254) { + alpha = 254; } - for (i = 0; (i < racer->lap) && (i < 3); i++) { + for (i = 0; i < racer->lap && i < HUD_EGG_TOTAL; i++) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->eggChallengeIcon); gCurrentHud->eggChallengeIcon.x += 12.0f; } - gHudColour = sp44 | ~0xFF; + gHudColour = alpha | COLOUR_RGBA32(255, 255, 255, 0); i2 = i; - for (i = 0; (i < racer->eggHudCounter) && (i2 < 3); i++) { + for (i = 0; i < racer->eggHudCounter && i2 < HUD_EGG_TOTAL; i++) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->eggChallengeIcon); i2++; gCurrentHud->eggChallengeIcon.x += 12.0f; } gCurrentHud->eggChallengeIcon.x = prevY; - D_80126CD5 = 0; + D_80126CD5 = FALSE; } /** * Render the HUD for the battle mode challenge. * Shows each players portrait and their remaining health. */ -void render_hud_battle(s32 arg0, Object *obj, s32 updateRate) { +void render_hud_battle(s32 countdown, Object *obj, s32 updateRate) { Object **racerObjs; Object_Racer *racer; s32 numRacers; @@ -913,8 +931,8 @@ void render_hud_battle(s32 arg0, Object *obj, s32 updateRate) { racer = (Object_Racer *) obj->unk64; if (gNumActivePlayers != 1 || racer->raceFinished == FALSE) { - func_80068508(TRUE); - render_race_start(arg0, updateRate); + sprite_anim_off(TRUE); + render_race_start(countdown, updateRate); render_weapon_hud(obj, updateRate); racerObjs = get_racer_objects(&numRacers); switch (gNumActivePlayers) { @@ -937,7 +955,7 @@ void render_hud_battle(s32 arg0, Object *obj, s32 updateRate) { render_racer_bananas(racer, updateRate); break; } - func_80068508(FALSE); + sprite_anim_off(FALSE); } } @@ -963,7 +981,7 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { racer = &racers[PLAYER_ONE]->unk64->racer; } - func_80068508(TRUE); + sprite_anim_off(TRUE); if (numRacers == 4) { offset = 0; prevCurrHudUnk64C = gCurrentHud->challengePortrait.x; @@ -987,7 +1005,7 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { gCurrentHud->battleBananaCount2.x += temp; gCurrentHud->battleBananaCount2.y += temp2; if (gNumActivePlayers < 3 || racer->playerIndex == curRacer->playerIndex) { - func_800A22F4(curRacer, updateRate); + hud_draw_lives(curRacer, updateRate); } if (gNumActivePlayers == 1) { prevCurrHudUnk64C += 68; @@ -1017,13 +1035,17 @@ void func_800A1E48(Object *racerObj, s32 updateRate) { gCurrentHud->battleBananaCount2.x += temp; gCurrentHud->battleBananaCount2.y += temp2; } - func_80068508(FALSE); + sprite_anim_off(FALSE); } #else GLOBAL_ASM("asm/non_matchings/game_ui/func_800A1E48.s") #endif -void func_800A22F4(Object_Racer *racer, UNUSED 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; if (gNumActivePlayers < 3 || (gNumActivePlayers == 3 && racer->playerIndex == PLAYER_COMPUTER)) { D_80126CD5 = TRUE; @@ -1059,13 +1081,13 @@ void func_800A22F4(Object_Racer *racer, UNUSED s32 updateRate) { /** * When racing the boss, render the essentials, but skip the bananas. */ -void render_hud_race_boss(s32 arg0, Object *obj, s32 updateRate) { +void render_hud_race_boss(s32 countdown, Object *obj, s32 updateRate) { LevelHeader *level; Object_Racer *racer = (Object_Racer *) obj->unk64; - func_80068508(TRUE); + sprite_anim_off(TRUE); render_wrong_way_text(racer, updateRate); - render_race_start(arg0, updateRate); + render_race_start(countdown, updateRate); render_race_time(racer, updateRate); render_weapon_hud(obj, updateRate); @@ -1076,23 +1098,23 @@ void render_hud_race_boss(s32 arg0, Object *obj, s32 updateRate) { render_speedometer(obj, updateRate); render_race_position(racer, updateRate); - func_80068508(FALSE); + sprite_anim_off(FALSE); } /** * When racing Taj in the overworld, render most of the basic race hud. */ -void render_hud_taj_race(s32 arg0, Object *obj, s32 updateRate) { +void render_hud_taj_race(s32 countdown, Object *obj, s32 updateRate) { Object_Racer *racer = (Object_Racer *) obj->unk64; - func_80068508(TRUE); + 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(arg0, updateRate); + render_race_start(countdown, updateRate); render_speedometer(obj, updateRate); - func_80068508(FALSE); + sprite_anim_off(FALSE); } /** @@ -1105,7 +1127,7 @@ void render_hud_hubworld(Object *obj, s32 updateRate) { if (get_viewport_count() == 0) { racer = (Object_Racer *) obj->unk64; - func_80068508(TRUE); + sprite_anim_off(TRUE); render_balloon_count(racer); render_speedometer(obj, updateRate); if (is_in_two_player_adventure()) { @@ -1113,7 +1135,7 @@ void render_hud_hubworld(Object *obj, s32 updateRate) { portrait->spriteID = (get_settings()->racers[1].character + HUD_SPRITE_PORTRAIT); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, portrait); } - func_80068508(FALSE); + sprite_anim_off(FALSE); } } @@ -1235,14 +1257,14 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->stopwatch); } obj68->unk20 = 0; - func_80068508(TRUE); + sprite_anim_off(TRUE); render_course_indicator_arrows(curRacer, updateRate); if (!curRacer->raceFinished) { spB8 = gCurrentHud->lapTimeText.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 = D_800E27AC[i]; + gHudColour = gHudLapColours[i]; render_timer(gCurrentHud->lapTimeText.x, spB8, spB4, spB0, spAC, 1); gHudColour = COLOUR_RGBA32(255, 255, 255, 254); spB8 += 12; @@ -1376,7 +1398,7 @@ void func_800A277C(s32 arg0, Object *playerRacerObj, s32 updateRate) { update_colour_cycle(D_80127194, updateRate); set_kerning(0); } - func_80068508(FALSE); + sprite_anim_off(FALSE); } } #else @@ -1391,7 +1413,7 @@ void set_stopwatch_face(u8 arg0, u8 arg1, u8 faceID, u8 arg3, u8 arg4) { Object *hud20; if (is_in_time_trial()) { - hud20 = gAssetHudElements->entry[20]; + hud20 = gAssetHudElements->entry[HUD_ELEMENT_UNK_14]; if (hud20 != NULL) { unk68 = (Object_68 **) hud20->unk68[0]; var_a3 = unk68[0]->unk28; @@ -1421,7 +1443,10 @@ void set_stopwatch_face(u8 arg0, u8 arg1, u8 faceID, u8 arg3, u8 arg4) { } } -void func_800A3870(void) { +/** + * Reset the angle of the speedometre's needle to the starting position. +*/ +void hud_speedometre_reset(void) { gCurrentHud->speedometreArrow.z_rotation = 0x6490; } @@ -1452,7 +1477,7 @@ void render_speedometer(Object *obj, UNUSED s32 updateRate) { vel *= 4.0f; if (racer->drift_direction != 0) { vel += 7.0f; //!@Bug: Planes and hovercraft use drift_direction for something else, applying this - //!unintentionally. + //! unintentionally. } if (vel > 100.0f) { vel = 100.0f; @@ -1509,19 +1534,19 @@ 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 arg0, s32 updateRate) { +void render_race_start(s32 countdown, s32 updateRate) { if (!is_game_paused()) { - if (arg0 == 0 && D_800E2770[0].playerIndex == PLAYER_COMPUTER) { - D_800E2770[0].unk3 = -1; - D_800E2770[1].unk3 = -1; + if (countdown == 0 && gHudAudioData[0].playerIndex == PLAYER_COMPUTER) { + gHudAudioData[0].volumeRamp = -1; + gHudAudioData[1].volumeRamp = -1; } if (gHUDNumPlayers == TWO_PLAYERS) { sprite_opaque(TRUE); } - if (arg0 > 0) { + if (countdown > 0) { if (gHudRaceStart) { - gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, (arg0 * 255) / 40); + 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); if (gRaceStartShowHudStep == 2) { @@ -1529,8 +1554,9 @@ void render_race_start(s32 arg0, s32 updateRate) { gRaceStartShowHudStep++; } } - if (D_80126D3C == NULL && func_80023568() == 0) { - f32 sp4C; + // Make engine revving sounds of random pitches while the race is waiting to begin. + if (gRaceStartSoundMask == NULL && func_80023568() == 0) { + f32 frequency; UNUSED s32 pad; Object **racerGroup; Object *randomRacer; @@ -1541,10 +1567,11 @@ void render_race_start(s32 arg0, s32 updateRate) { racer = (Object_Racer *) randomRacer->unk64; if (racer->vehicleID == VEHICLE_CAR) { if (get_random_number_from_range(0, 100) >= 96) { - sp4C = 1.25 - ((get_random_number_from_range(0, 7) * 0.5) / 7.0); + frequency = 1.25 - ((get_random_number_from_range(0, 7) * 0.5) / 7.0); func_800095E8(76, randomRacer->segment.trans.x_position, randomRacer->segment.trans.y_position, randomRacer->segment.trans.z_position, 4, - ((get_random_number_from_range(0, 7) * 63) / 7) + 24, sp4C * 100.0f, &D_80126D3C); + ((get_random_number_from_range(0, 7) * 63) / 7) + 24, frequency * 100.0f, + &gRaceStartSoundMask); } } } @@ -1570,10 +1597,10 @@ void render_race_start(s32 arg0, s32 updateRate) { if (gRaceStartShowHudStep == 3) { sound_play(SOUND_VOICE_TT_GO, &gHUDVoiceSoundMask); if (get_time_trial_ghost() && unbeaten_staff_time() == FALSE) { - set_time_trial_start_voice(SOUND_VOICE_TT_BEAT_MY_TIME, 1.7f, 0); + hud_sound_play_delayed(SOUND_VOICE_TT_BEAT_MY_TIME, 1.7f, PLAYER_ONE); set_delayed_text(ASSET_GAME_TEXT_82, 1.7f); // Now try and beat my time! } - D_80126D70 = 1; + gHudAudioReset = TRUE; gRaceStartShowHudStep++; } } @@ -1595,7 +1622,7 @@ void render_racer_bananas(Object_Racer *racer, s32 updateRate) { 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 || + (gHUDNumPlayers < TWO_PLAYERS || racer->lap < 1 || racer->lap_times[racer->lap] >= 180 || gHudLevelHeader->race_type & RACETYPE_CHALLENGE))) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountX); bananas = racer->bananas; @@ -1641,13 +1668,13 @@ void render_racer_bananas(Object_Racer *racer, s32 updateRate) { } } else { gCurrentHud->bananaCountIconSpin.spriteOffset = var_v1 + 128; - func_80068508(FALSE); + sprite_anim_off(FALSE); sprite_opaque(TRUE); set_viewport_tv_type(TV_TYPE_NTSC); func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->bananaCountIconSpin); sprite_opaque(FALSE); set_viewport_tv_type(TV_TYPE_PAL); - func_80068508(TRUE); + sprite_anim_off(TRUE); gCurrentHud->bananaCountIconSpin.spriteOffset -= 128; } temp_lo = bananas / 10; @@ -1732,71 +1759,70 @@ void render_silver_coin_counter(Object_Racer *racer, s32 updateRate) { * 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) { - unk800A497C *temp_a3; - unk800A497C *temp_s0; + HudElement *position1; + HudElement *position2; s8 drawPosition; - temp_a3 = (unk800A497C *) &gCurrentHud->raceFinishPosition1; - temp_s0 = (unk800A497C *) &gCurrentHud->raceFinishPosition2; - // temp_s0 = &gCurrentHud->unk740; + position1 = &gCurrentHud->raceFinishPosition1; + position2 = &gCurrentHud->raceFinishPosition2; drawPosition = FALSE; - switch (temp_a3->unk1A) { + switch (position1->unk1A) { case 0: music_voicelimit_set(24); music_play(SEQUENCE_FIRST_PLACE); sound_play(SOUND_WHOOSH1, NULL); sound_play(SOUND_VOICE_TT_FINISH, &gHUDVoiceSoundMask); - D_800E2770->volume = 127; - D_800E2770->unk3 = 0; - D_800E2770->playerIndex = racer->playerIndex; - temp_a3->unk1A = 1; + gHudAudioData[0].volume = 127; + gHudAudioData[0].volumeRamp = 0; + gHudAudioData[0].playerIndex = racer->playerIndex; + position1->unk1A = 1; break; case 1: - temp_a3->unkC += updateRate * 13; - if (temp_a3->unkC > -23.0f) { - temp_a3->unkC = -23.0f; + position1->x += updateRate * 13; + if (position1->x > -23.0f) { + position1->x = -23.0f; } - temp_s0->unkC -= updateRate * 13; - if (temp_s0->unkC < 22.0f) { - temp_s0->unkC = 22.0f; + position2->x -= updateRate * 13; + if (position2->x < 22.0f) { + position2->x = 22.0f; } drawPosition = TRUE; - if (temp_s0->unkC == 22.0f) { - temp_a3->unk1B += updateRate; - if (temp_a3->unk1B >= 120) { - temp_a3->unk1B = -120; - temp_a3->unk1C = temp_a3->unk1C + 1; + if (position2->x == 22.0f) { + position1->unk1B += updateRate; + if (position1->unk1B >= 120) { + position1->unk1B = -120; + position1->unk1C = position1->unk1C + 1; } - if (temp_a3->unk1C == 2) { - temp_a3->unk1A = 2; + if (position1->unk1C == 2) { + position1->unk1A = 2; sound_play(SOUND_WHOOSH1, NULL); - if (D_800E2770->playerIndex == racer->playerIndex) { - D_800E2770->unk3 = -1; + if (gHudAudioData[0].playerIndex == racer->playerIndex) { + gHudAudioData[0].volumeRamp = -1; } } } break; case 2: - temp_a3->unkC += updateRate * 13; - temp_s0->unkC += updateRate * 13; + position1->x += updateRate * 13; + position2->x += updateRate * 13; drawPosition = TRUE; - if (temp_a3->unkC > 200.0f) { - temp_a3->unk1A = 3; + if (position1->x > 200.0f) { + position1->unk1A = 3; } break; case 3: - temp_a3->unk1A = 3; + position1->unk1A = 3; break; } if (drawPosition) { gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 210); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) temp_a3); - func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (HudElement *) temp_s0); + func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, position1); + func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, position2); gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, 255, 255, 255, 255); } } -UNUSED void func_800A4C34(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2) { +UNUSED void func_800A4C34(UNUSED s32 countdown, UNUSED Object_Racer *racer, UNUSED s32 updateRate) { } /** @@ -2129,17 +2155,21 @@ void render_wrong_way_text(Object_Racer *obj, s32 updateRate) { sprite_opaque(FALSE); } -void func_800A5F18(Object_Racer *racer) { - s32 sp24; +/** + * 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) { + s32 racerCount; 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() == 0)) { - get_racer_objects(&sp24); + get_racer_objects(&racerCount); if (gNumActivePlayers >= 2 && (is_in_two_player_adventure() == FALSE || is_postrace_viewport_active() == FALSE)) { set_text_font(FONT_COLOURFUL); - if (sp24 != racer->unk1AC) { + if (racerCount != racer->finishPosition) { set_text_colour(255, 255, 255, 0, 255); draw_text(&gHUDCurrDisplayList, gCurrentHud->raceTimeNumber.x - 40.0f, gCurrentHud->raceTimeNumber.y, "RACE", ALIGN_TOP_LEFT); @@ -2189,16 +2219,16 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { gCurrentHud->challengeFinishPosition2.y += 35.0f; gCurrentHud->raceTimeNumber.y += 35.0f; gCurrentHud->lapTimeText.y += 35.0f; - D_800E2770[0].playerIndex = racer->playerIndex; + gHudAudioData[0].playerIndex = racer->playerIndex; D_80127189 = 1; } switch (gCurrentHud->challengeFinishPosition1.unk1A) { case 0: if (!(raceType & RACETYPE_CHALLENGE_BATTLE)) { - D_800E2770[0].volume = 127; - D_800E2770[0].unk3 = 0; - D_800E2770[0].playerIndex = racer->playerIndex; + gHudAudioData[0].volume = 127; + gHudAudioData[0].volumeRamp = 0; + gHudAudioData[0].playerIndex = racer->playerIndex; sound_play(SOUND_WHOOSH1, NULL); } switch (gHUDNumPlayers) { @@ -2225,12 +2255,12 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { gCurrentHud->raceTimeNumber.unk1D -= 4; gCurrentHud->lapTimeText.unk1D -= 4; } - if (racer->unk1AC < 4) { - gCurrentHud->challengeFinishPosition2.spriteOffset = racer->unk1AC - 1; + if (racer->finishPosition < 4) { + gCurrentHud->challengeFinishPosition2.spriteOffset = racer->finishPosition - 1; } else { gCurrentHud->challengeFinishPosition2.spriteOffset = 3; } - gCurrentHud->challengeFinishPosition1.spriteOffset = racer->unk1AC - 1; + gCurrentHud->challengeFinishPosition1.spriteOffset = racer->finishPosition - 1; gCurrentHud->challengeFinishPosition1.unk1A = 1; switch (gNumActivePlayers) { case 2: @@ -2346,7 +2376,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { gCurrentHud->challengeFinishPosition1.unk1C = 0; if (gHUDVoiceSoundMask == NULL) { if (raceType == RACETYPE_CHALLENGE_BATTLE) { - switch (racer->unk1AC) { + switch (racer->finishPosition) { case 1: case 2: sound_play(SOUND_UNK_146, &gHUDVoiceSoundMask); @@ -2363,7 +2393,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { } } } - func_800A5F18(racer); + hud_draw_finish_misc(racer); break; case 2: gCurrentHud->challengeFinishPosition1.unk1B += updateRate; @@ -2380,7 +2410,7 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { gCurrentHud->challengeFinishPosition1.unk1A = 4; } } - func_800A5F18(racer); + hud_draw_finish_misc(racer); break; case 3: if (raceType == RACETYPE_CHALLENGE_BATTLE) { @@ -2394,18 +2424,18 @@ void func_800A6254(Object_Racer *racer, s32 updateRate) { gCurrentHud->raceTimeNumber.x += (updateRate * 13); gCurrentHud->lapTimeText.x += (updateRate * 13); } - func_800A5F18(racer); + hud_draw_finish_misc(racer); break; case 4: - if (racer->playerIndex == D_800E2770[0].playerIndex) { - D_800E2770[0].unk3 = -1; + if (racer->playerIndex == gHudAudioData[0].playerIndex) { + gHudAudioData[0].volumeRamp = -1; } gCurrentHud->challengeFinishPosition1.unk1A = 5; gCurrentHud->challengeFinishPosition1.unk1B = 0; - func_800A5F18(racer); + hud_draw_finish_misc(racer); break; default: - func_800A5F18(racer); + hud_draw_finish_misc(racer); break; } } @@ -2437,15 +2467,15 @@ void render_time_trial_finish(Object_Racer *racer, s32 updateRate) { switch (gCurrentHud->raceEndFinish.unk1A) { case 0: - D_800E2770->volume = 127; - D_800E2770->unk3 = 0; - D_800E2770->playerIndex = (s8) racer->playerIndex; + 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; } else { - if ((racer->playerIndex == 0) || (racer->playerIndex == 2)) { + if (racer->playerIndex == PLAYER_ONE || racer->playerIndex == PLAYER_THREE) { gCurrentHud->raceEndFinish.unk1D = -80; gCurrentHud->raceEndFinish.x = -200.0f; } else { @@ -2463,7 +2493,7 @@ void render_time_trial_finish(Object_Racer *racer, s32 updateRate) { gCurrentHud->raceEndFinish.x = gCurrentHud->raceEndFinish.unk1D; gCurrentHud->raceEndFinish.unk1A = 2; gCurrentHud->raceEndFinish.unk1B = -120; - if (gHUDVoiceSoundMask == NULL && D_80126D71 == 0) { + if (gHUDVoiceSoundMask == NULL && gHudTimeTrialGhost == FALSE) { play_time_trial_end_message(&racer->playerIndex); } } @@ -2473,10 +2503,10 @@ void render_time_trial_finish(Object_Racer *racer, s32 updateRate) { gCurrentHud->raceEndFinish.unk1B += updateRate; if (gCurrentHud->raceEndFinish.unk1B >= 120) { gCurrentHud->raceEndFinish.unk1A = 3; - if ((gHUDNumPlayers == 0) || (gHUDNumPlayers == 1)) { + if (gHUDNumPlayers == PLAYER_ONE || gHUDNumPlayers == PLAYER_TWO) { gCurrentHud->raceEndFinish.unk1D = 56; } else { - if ((racer->playerIndex == 0) || (racer->playerIndex == 2)) { + if (racer->playerIndex == PLAYER_ONE || racer->playerIndex == PLAYER_THREE) { gCurrentHud->raceEndFinish.unk1D = 56; } else { gCurrentHud->raceEndFinish.unk1D = -40; @@ -2494,7 +2524,7 @@ void render_time_trial_finish(Object_Racer *racer, s32 updateRate) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &gCurrentHud->raceEndFinish); return; case 4: - D_800E2770->unk3 = -1; + gHudAudioData[0].volumeRamp = -1; gCurrentHud->raceEndFinish.unk1A = 5; gCurrentHud->raceEndFinish.unk1B = 0; return; @@ -2559,27 +2589,29 @@ void render_balloon_count(UNUSED Object_Racer *racer) { * Unused function that plays whichever T.T voice line is passed through. * Only if the game is currently running and no voice line is already playing. */ -UNUSED void play_hud_voice_line(u16 soundId) { +UNUSED void hud_sound_play(u16 soundId) { if (gHUDVoiceSoundMask == NULL && !(is_game_paused())) { sound_play(soundId, &gHUDVoiceSoundMask); } } /** - * Set the sound ID and delay (in seconds) of the voice clip that will be played - * after the time trial run starts. + * Set the sound ID and delay (in seconds) of the voice clip that will be played. */ -void set_time_trial_start_voice(u16 soundID, f32 delay, s32 arg2) { - if (gTimeTrialVoiceDelay == 0) { - gTimeTrialVoiceID = soundID; - gTimeTrialVoiceDelay = delay * 60.0f; - D_80126D78 = arg2; +void hud_sound_play_delayed(u16 soundID, f32 delay, s32 playerIndex) { + if (gHudVoiceTimer == 0) { + gHudVoiceID = soundID; + gHudVoiceTimer = delay * 60.0f; + gHudVoicePlayerID = playerIndex; } } -void func_800A74EC(u16 soundID, s32 arg1) { - if (soundID == gTimeTrialVoiceID && D_80126D78 == arg1) { - gTimeTrialVoiceDelay = 0; +/** + * Stop the queued voice clip from playing from the HUD. + */ +void hud_sound_stop(u16 soundID, s32 playerIndex) { + if (soundID == gHudVoiceID && gHudVoicePlayerID == playerIndex) { + gHudVoiceTimer = 0; } } @@ -2876,8 +2908,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u Object_Racer *someRacer; s32 i; s32 objectCount; - UNUSED s32 tempVar3; - ObjectTransform_800A8474 objTrans; + HudElement objTrans; f32 sp11C; f32 sp118; f32 sp114; @@ -2905,14 +2936,14 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u s32 temp_s0_2; s32 temp_s0_3; s32 temp_s1; - s32 temp_s0; + s32 position2; s32 temp_f16; s32 temp_f6; s32 temp_s3; s32 temp; UNUSED s32 pad3[4]; - func_800A0BD4(updateRate); + hud_audio_update(updateRate); gAssetHudElementStaleCounter[HUD_ELEMENT_UNK_01] = 0; gAssetHudElementStaleCounter[HUD_ELEMENT_UNK_17] = 0; @@ -2929,11 +2960,11 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u for (i = 0; i < gAssetHudElementIdsCount; i++) { if (gAssetHudElements->entry[i] && i != 40) { if (++gAssetHudElementStaleCounter[i] > 60) { - if ((gAssetHudElementIds[i] & (0x4000 | 0x8000)) == (0x4000 | 0x8000)) { + if ((gAssetHudElementIds[i] & HUD_ELEMENT_TEXTURE) == HUD_ELEMENT_TEXTURE) { free_texture((TextureHeader *) gAssetHudElements->entry[i]); - } else if (gAssetHudElementIds[i] & 0x8000) { + } else if (gAssetHudElementIds[i] & HUD_ELEMENT_SPRITE) { free_sprite((Sprite *) gAssetHudElements->entry[i]); - } else if (gAssetHudElementIds[i] & 0x4000) { + } else if (gAssetHudElementIds[i] & HUD_ELEMENT_OBJECT) { free_object((Object *) gAssetHudElements->entry[i]); } else { free_3d_model((ObjectModel **) gAssetHudElements->entry[i]); @@ -2950,9 +2981,10 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gHUDCurrVertex = *vtx; if (gHudLevelHeader->race_type == RACETYPE_CHALLENGE_EGGS) { if (gNumActivePlayers == 2 && gHudToggleSettings[gHUDNumPlayers] == 0) { - func_800A14F0(NULL, updateRate); + hud_draw_eggs(NULL, updateRate); reset_render_settings(&gHUDCurrDisplayList); } else { + // Render player 4's egg challenge portrait if they are AI controlled. if (gNumActivePlayers == 3) { tempVar4 = NULL; for (tempVar2 = 0; tempVar2 < objectCount; tempVar2++) { @@ -2961,7 +2993,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } } if (tempVar4 != NULL) { - temp_s0 = gCurrentHud->challengePortrait.x; + position2 = gCurrentHud->challengePortrait.x; temp_s1 = gCurrentHud->challengePortrait.y; spF4 = gCurrentHud->eggChallengeIcon.x; spF0 = gCurrentHud->eggChallengeIcon.y; @@ -2975,9 +3007,9 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gCurrentHud->challengePortrait.y *= 1.1; gCurrentHud->eggChallengeIcon.y *= 1.1; } - func_800A19A4(tempVar4, updateRate); + hud_eggs_portrait(tempVar4, updateRate); gHudColour = COLOUR_RGBA32(255, 255, 255, 254); - gCurrentHud->challengePortrait.x = temp_s0; + gCurrentHud->challengePortrait.x = position2; gCurrentHud->challengePortrait.y = temp_s1; gCurrentHud->eggChallengeIcon.x = spF4; gCurrentHud->eggChallengeIcon.y = spF0; @@ -2987,11 +3019,11 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } else if (gHudLevelHeader->race_type == RACETYPE_CHALLENGE_BATTLE) { // Show life counter and icons in 2 player. if (gNumActivePlayers == 2 && gHudToggleSettings[gHUDNumPlayers] == 0) { - func_80068508(TRUE); + sprite_anim_off(TRUE); sprite_opaque(FALSE); set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); func_800A1E48(0, updateRate); - func_80068508(FALSE); + sprite_anim_off(FALSE); reset_render_settings(&gHUDCurrDisplayList); sprite_opaque(TRUE); } else { @@ -3009,7 +3041,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u spE0 = gCurrentHud->challengePortrait.y; sprite_opaque(FALSE); set_ortho_matrix_view(&gHUDCurrDisplayList, &gHUDCurrMatrix); - func_80068508(TRUE); + sprite_anim_off(TRUE); gCurrentHud->challengePortrait.x = 225.0f; if (osTvType == TV_TYPE_PAL) { gCurrentHud->challengePortrait.y = 181.5f; @@ -3064,7 +3096,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gCurrentHud->challengePortrait.y = spE0; sprite_opaque(TRUE); reset_render_settings(&gHUDCurrDisplayList); - func_80068508(FALSE); + sprite_anim_off(FALSE); } } } @@ -3151,7 +3183,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u return; } someObjSeg = get_active_camera_segment(); - func_80068508(TRUE); + sprite_anim_off(TRUE); minimap = (Sprite *) lvlMdl->minimapSpriteIndex; switch (gHUDNumPlayers) { case TWO_PLAYERS: @@ -3182,22 +3214,22 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gMinimapScreenY *= 1.2; } sprite_opaque(FALSE); - objTrans.trans.x_position = gMinimapScreenX + gHudOffsetX + gHudBounceX; - objTrans.trans.y_position = gMinimapScreenY; + objTrans.x = gMinimapScreenX + gHudOffsetX + gHudBounceX; + objTrans.y = gMinimapScreenY; if (osTvType == TV_TYPE_PAL) { - objTrans.trans.x_position -= 4.0f; + objTrans.x -= 4.0f; } - objTrans.trans.z_rotation = -someObjSeg->trans.z_rotation; - objTrans.trans.x_rotation = 0; + objTrans.z_rotation = -someObjSeg->trans.z_rotation; + objTrans.x_rotation = 0; if (get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { - objTrans.trans.y_rotation = -0x8000; - objTrans.trans.x_position -= gMinimapDotOffsetX; + objTrans.y_rotation = -0x8000; + objTrans.x -= gMinimapDotOffsetX; } else { - objTrans.trans.y_rotation = 0; + objTrans.y_rotation = 0; } - objTrans.unk18 = 0; - objTrans.trans.z_position = 0.0f; - objTrans.trans.scale = 1.0f; + objTrans.spriteOffset = 0; + objTrans.z = 0.0f; + objTrans.scale = 1.0f; opacity = mapOpacity; if (mapOpacity > 160) { mapOpacity = 160; @@ -3208,7 +3240,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, gMinimapRed, gMinimapGreen, gMinimapBlue, mapOpacity); } render_ortho_triangle_image(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, - (ObjectSegment *) &objTrans.trans, minimap, 0); + (ObjectSegment *) &objTrans, 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); @@ -3307,7 +3339,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u } } gDPPipeSync(gHUDCurrDisplayList++); - func_80068508(FALSE); + sprite_anim_off(FALSE); sprite_opaque(TRUE); *dList = gHUDCurrDisplayList; *mtx = gHUDCurrMatrix; @@ -3354,9 +3386,14 @@ void minimap_marker_pos(f32 x, f32 z, f32 angleSin, f32 angleCos, f32 modelAspec (f32) gMinimapDotOffsetY; } +// hud_draw_element GLOBAL_ASM("asm/non_matchings/game_ui/func_800AA600.s") -void func_800AAFD0(ObjectModel *objModel) { +/** + * Renders a 3D model onscreen. + * Used in conjunction with the HUD. + */ +void hud_draw_model(ObjectModel *objModel) { UNUSED s32 pad; TextureHeader *texPtr; s32 triOffset; diff --git a/src/game_ui.h b/src/game_ui.h index e09da07d..8ac2590c 100644 --- a/src/game_ui.h +++ b/src/game_ui.h @@ -5,6 +5,15 @@ #include "structs.h" #include "libultra_internal.h" +#define HUD_ELEMENT_MODEL 0x0000 +#define HUD_ELEMENT_OBJECT 0x4000 +#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 + enum CourseIndicatorArrows { INDICATOR_NONE, INDICATOR_LEFT, @@ -240,61 +249,35 @@ typedef struct HudData { /* 0x0740 */ HudElement raceFinishPosition2; } HudData; -typedef struct unk800E1E64 { - s32 unk0; - s32 unk4; - f32 unk8; - f32 unkC; - f32 unk10; - s32 unk14; - s32 unk18; - s32 unk1C; -} unk800E1E64; - /* Size: 0x10 bytes */ -typedef struct unk800E2770 { +typedef struct HudAudio { u16 soundID; u8 volume; - s8 unk3; + s8 volumeRamp; SoundMask *soundMask; s32 unk8; s8 playerIndex; s8 unkD; s8 unkE; s8 unkF; -} unk800E2770; - -typedef struct unk800A497C { - u8 pad0[0xC]; - f32 unkC; - u8 pad10[0xA]; - s8 unk1A; - s8 unk1B; - s8 unk1C; - s8 unk1D; -} unk800A497C; - -typedef struct ObjectTransform_800A8474 { - ObjectTransform trans; - s16 unk18; -} ObjectTransform_800A8474; +} HudAudio; typedef struct HudElements { - void *entry[40]; + void *entry[HUD_ELEMENT_COUNT]; } HudElements; extern u8 gGfxTaskYieldData[OS_YIELD_DATA_SIZE]; u8 race_starting(void); -void func_800A0B74(void); -void render_hud_race(s32 arg0, Object *obj, s32 updateRate); -void render_hud_challenge_eggs(s32 arg0, Object *obj, s32 updateRate); -void render_hud_race_boss(s32 arg0, Object *obj, s32 updateRate); -void render_hud_taj_race(s32 arg0, Object *obj, s32 updateRate); -void func_800A3870(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_speedometre_reset(void); void play_time_trial_end_message(s16 *playerID); -void set_time_trial_start_voice(u16 soundID, f32 delay, s32 arg2); -void func_800A74EC(u16 soundID, s32 arg1); +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); void minimap_fade(s32 setting); @@ -305,31 +288,32 @@ 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 *arg3, 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 arg0, 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 arg0, Object *obj, s32 updateRate); -void func_800A22F4(Object_Racer *racer, s32 updateRate); +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 func_800A0BD4(s32 updateRate); +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 func_800A19A4(Object_Racer *racer, s32 updateRate); -void func_800A14F0(Object *racerObj, 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 arg0, Object *obj, 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 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_draw_model(ObjectModel *objModel); // Non Matching void func_800AA600(Gfx **dList, MatrixS **mtx, Vertex **vtxList, HudElement *arg3); diff --git a/src/menu.c b/src/menu.c index 09203510..33b2c4af 100644 --- a/src/menu.c +++ b/src/menu.c @@ -3155,7 +3155,7 @@ void show_timestamp(s32 frameCount, s32 xPos, s32 yPos, u8 red, u8 green, u8 blu xOffset3 = 5; } get_timestamp_from_frames(frameCount, &minutes, &seconds, &hundredths); - func_80068508(TRUE); + sprite_anim_off(TRUE); sprite_opaque(FALSE); gMenuImageStack[imageIndex].unk18 = minutes / 10; @@ -3195,7 +3195,7 @@ void show_timestamp(s32 frameCount, s32 xPos, s32 yPos, u8 red, u8 green, u8 blu gMenuImageStack[imageIndex].unkC = xPos; func_8009CA60(imageIndex); - func_80068508(FALSE); + sprite_anim_off(FALSE); sprite_opaque(TRUE); sMenuGuiColourR = (u8) 255; sMenuGuiColourG = (u8) 255; @@ -3246,7 +3246,7 @@ void func_80081C04(s32 number, s32 x, s32 y, s32 r, s32 g, s32 b, s32 a, UNUSED sMenuGuiColourB = b; sMenuGuiOpacity = a; sprite_opaque(0); - func_80068508(TRUE); + sprite_anim_off(TRUE); if (powerOfTen && number) {} // Fakematch gMenuImageStack[0].unk10 = y; for (i = 0; i < strLen; i++) { @@ -3256,7 +3256,7 @@ void func_80081C04(s32 number, s32 x, s32 y, s32 r, s32 g, s32 b, s32 a, UNUSED x += 12; } sprite_opaque(1); - func_80068508(FALSE); + sprite_anim_off(FALSE); sMenuGuiColourR = 255; sMenuGuiColourG = 255; sMenuGuiColourB = 255; @@ -3421,7 +3421,7 @@ void draw_menu_elements(s32 flags, MenuElement *elems, f32 scale) { shouldResetRenderSettings = FALSE; reset_render_settings(&sMenuCurrDisplayList); } - func_80068508(TRUE); + sprite_anim_off(TRUE); sprite_opaque(FALSE); gMenuImageStack[elems->unk14_a.value].unkC = xPos - 160; gMenuImageStack[elems->unk14_a.value].unk10 = (-yPos - gDrawElementsYOffset) + 120; @@ -3436,7 +3436,7 @@ void draw_menu_elements(s32 flags, MenuElement *elems, f32 scale) { sMenuGuiColourBlendFactor = elems->filterBlendFactor; sMenuGuiOpacity = elems->opacity; func_8009CA60(elems->unk14_a.value); - func_80068508(FALSE); + sprite_anim_off(FALSE); sprite_opaque(TRUE); break; case 6: @@ -3773,7 +3773,7 @@ void render_title_screen(UNUSED s32 updateRate, f32 updateRateF) { set_ortho_matrix_view(&sMenuCurrDisplayList, &sMenuCurrHudMat); scale = (f32) gTitleRevealTimer * 0.03125f; sMenuGuiOpacity = (gTitleRevealTimer * 8) - 1; - func_80068508(FALSE); + sprite_anim_off(FALSE); if (scale != 1.0f) { render_texture_rectangle_scaled(&sMenuCurrDisplayList, sGameTitleTileOffsets, SCREEN_WIDTH_FLOAT_HALF, 52.0f, scale, scale, 0xFFFFFFFE, TEXRECT_POINT); @@ -4496,7 +4496,7 @@ void func_800853D0(SaveFileData *arg0, s32 x, s32 y) { } else { i = 120; } - func_80068508(TRUE); + sprite_anim_off(TRUE); temp = (i - y); gMenuImageStack[2].unk10 = temp - 49; gMenuImageStack[sp70].unk10 = temp - 24; @@ -4510,7 +4510,7 @@ void func_800853D0(SaveFileData *arg0, s32 x, s32 y) { sprite_opaque(1); gMenuImageStack[sp70].unkC = x - 128; func_8009CA60(sp70); - func_80068508(FALSE); + sprite_anim_off(FALSE); } if (drawTexture != NULL) { render_textured_rectangle(&sMenuCurrDisplayList, drawTexture, x + 60, y + 6, 255, 255, 255, 255); @@ -7448,14 +7448,14 @@ void render_file_select_menu(UNUSED s32 updateRate) { } render_menu_image(var_s2, gFileSelectButtons[i].x + gFileSelectElementPos[2], gFileSelectButtons[i].y + gFileSelectElementPos[3], 0, 0, 0, 128); - func_80068508(TRUE); + sprite_anim_off(TRUE); gMenuImageStack->unk18 = gSavefileInfo[i].balloonCount / 10; render_menu_image(0, gFileSelectButtons[i].x + gFileSelectElementPos[6] - 6, gFileSelectButtons[i].y + gFileSelectElementPos[7], 0, 0, 0, 128); gMenuImageStack->unk18 = gSavefileInfo[i].balloonCount % 10; render_menu_image(0, gFileSelectButtons[i].x + gFileSelectElementPos[6] + 6, gFileSelectButtons[i].y + gFileSelectElementPos[7], 0, 0, 0, 128); - func_80068508(FALSE); + sprite_anim_off(FALSE); sMenuGuiColourG = 64; sMenuGuiColourB = 64; render_menu_image(10, gFileSelectButtons[i].x + gFileSelectElementPos[8], @@ -9084,7 +9084,7 @@ void render_track_select_setup_ui(UNUSED s32 updateRate) { (gTwoPlayerRacerCountMenu.textPos[0] + gTwoPlayerRacerCountMenu.x) - 1, (gTwoPlayerRacerCountMenu.textPos[1] + gTwoPlayerRacerCountMenu.y + regionOffset) - 1, gMenuText[ASSET_MENU_TEXT_NUMBEROFRACERS], ALIGN_MIDDLE_CENTER); - func_80068508(TRUE); + sprite_anim_off(TRUE); sprite_opaque(FALSE); for (temp2 = 0; temp2 < 3; temp2++) { @@ -9108,7 +9108,7 @@ void render_track_select_setup_ui(UNUSED s32 updateRate) { sMenuGuiColourB = 255; } sprite_opaque(TRUE); - func_80068508(FALSE); + sprite_anim_off(FALSE); } } } @@ -9496,7 +9496,7 @@ void func_80093A40(void) { s32 i; Settings *settings; - func_80072298(0); + rumble_init(FALSE); settings = get_settings(); gLastPlayerWhoPaused = -1; @@ -9745,7 +9745,7 @@ s32 render_pause_menu(UNUSED Gfx **dl, s32 updateRate) { } void n_alSynRemovePlayer(void) { - func_80072298(1); + rumble_init(TRUE); close_dialogue_box(7); assign_dialogue_box_id(7); gMenuOptionCap = 0; @@ -9775,7 +9775,7 @@ void func_80094688(s32 arg0, s32 arg1) { s16 *var_v1; LevelHeader *header; - func_80072298(0); + rumble_init(FALSE); header = get_current_level_header(); D_80126C28 = arg0; if (is_in_two_player_adventure()) { @@ -10587,7 +10587,7 @@ void func_80096978(UNUSED s32 updateRate, f32 opacity) { set_text_colour(255, 255, 192, 96, 255); draw_text(&sMenuCurrDisplayList, time - 34, y2 + sp98 + 2, gRacePlacementsArray[spA0], ALIGN_MIDDLE_CENTER); reset_render_settings(&sMenuCurrDisplayList); - func_80068508(TRUE); + sprite_anim_off(TRUE); sprite_opaque(FALSE); sMenuGuiColourR = 255; sMenuGuiColourG = 255 - 64 * spA0; @@ -10627,7 +10627,7 @@ void func_80096978(UNUSED s32 updateRate, f32 opacity) { func_8009CA60(0); } y2 = y2 + 17; - func_80068508(FALSE); + sprite_anim_off(FALSE); sprite_opaque(TRUE); sMenuGuiColourG = 255; sMenuGuiColourBlendFactor = 0; @@ -13362,7 +13362,7 @@ void func_8009E3D0(void) { return; } settings = get_settings(); - func_80068508(TRUE); + sprite_anim_off(TRUE); if (osTvType == TV_TYPE_PAL) { y = 10; } else { @@ -13440,7 +13440,7 @@ void func_8009E3D0(void) { } func_8009CA60(14); } - func_80068508(FALSE); + sprite_anim_off(FALSE); } /** diff --git a/src/object_functions.c b/src/object_functions.c index 02f78640..8ed29608 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -244,7 +244,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { } move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); - if (obj->unk4A == 298) { + if (obj->objectID == ASSET_OBJECT_ID_OCTOBOMB) { if (get_wave_properties(obj->segment.trans.y_position, &waveHeight, NULL)) { obj->segment.trans.y_position = waveHeight; } @@ -263,8 +263,8 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { racer->attackType = ATTACK_EXPLOSION; obj->properties.fireball.timer = 20; obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 1.0f, - 1); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, + 1.0f, 1); free_object(obj); } else if (obj->properties.fireball.timer > 0) { racer->bubbleTrapTimer = 60; @@ -281,10 +281,11 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { func_800AFC3C(obj, updateRate); obj->properties.fireball.timer -= updateRate; if (obj->properties.fireball.timer < 0) { - if (obj->unk4A == 298) { + if (obj->objectID == ASSET_OBJECT_ID_OCTOBOMB) { free_object(obj); obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 1.0f, 1); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, + 1); } obj->segment.trans.scale *= 0.9; //!@Delta if (obj->segment.trans.scale < 0.5) { @@ -379,7 +380,7 @@ void obj_loop_lasergun(Object *obj, s32 updateRate) { spawnObj.y = obj->segment.trans.y_position; spawnObj.z = obj->segment.trans.z_position; spawnObj.size = 8; - spawnObj.objectID = 0xC6; + spawnObj.objectID = ASSET_OBJECT_ID_LASERBOLT; play_sound_at_position(SOUND_LASER_GUN, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); laserBoltObj = spawn_object(&spawnObj, 1); @@ -459,7 +460,7 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { obj->segment.z_velocity * updateRateF); if (hasCollision) { obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_NONE, 0.2, 0); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_NONE, 0.2, 0); delete = TRUE; } @@ -483,7 +484,7 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { } delete = TRUE; obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 0.5, 0); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 0.5, 0); } } if (delete) { @@ -610,7 +611,7 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { if (header->race_type != RACETYPE_CUTSCENE_2 && header->race_type != RACETYPE_CUTSCENE_1) { obj->properties.trophyCabinet.trophy = TRUE; if ((settings->trophies >> (((settings->worldId - 1) ^ 0) * 2)) & 3) { // Fakematch - newObject.objectID = 0x80; + newObject.objectID = ASSET_OBJECT_ID_TROPHY; newObject.x = obj->segment.level_entry->animation.common.x; newObject.y = obj->segment.level_entry->animation.common.y; newObject.z = obj->segment.level_entry->animation.common.z; @@ -642,7 +643,7 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { if (worldBalloons) { obj->properties.trophyCabinet.action = 1; sound_play(SOUND_VOICE_TT_TROPHY_RACE, NULL); - func_800A3870(); + hud_speedometre_reset(); } else { // Text for "TROPHY RACE" "TO ENTER THE TROPHY RACE, YOU MUST COMPLETE ALL THE TASKS FROM THIS // WORLD. KEEP RACING!" @@ -830,7 +831,7 @@ void obj_loop_eggcreator(Object *obj, UNUSED s32 updateRate) { spawnObj.y = obj->segment.trans.y_position; spawnObj.z = obj->segment.trans.z_position; spawnObj.size = 8; - spawnObj.objectID = 0x34; + spawnObj.objectID = ASSET_OBJECT_ID_COLLECTEGG; eggObj = spawn_object(&spawnObj, 1); if (eggObj != NULL) { Object_EggCreator *eggSpawner = &eggObj->unk64->egg_creator; @@ -1030,7 +1031,7 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { racer->boostType |= BOOST_SMALL_FAST; } if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } } } @@ -1098,7 +1099,8 @@ void obj_loop_characterflag(Object *obj, UNUSED s32 updateRate) { flag = &obj->unk64->character_flag; racer = &racerObj->unk64->racer; obj->properties.characterFlag.characterID = racer->characterId; - if (obj->properties.characterFlag.characterID < 0 || obj->properties.characterFlag.characterID >= 10) { + if (obj->properties.characterFlag.characterID < 0 || + obj->properties.characterFlag.characterID >= NUMBER_OF_CHARACTERS) { obj->properties.characterFlag.characterID = 0; } flag->vertices = gCharacterFlagVertices; @@ -1269,12 +1271,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { if (distance > 10.0) { angleDiff = (arctan2_f(diffX / distance, diffZ / distance) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; - if (angleDiff > 0x8000) { - angleDiff -= 0xFFFF; - } - if (angleDiff < -0x8000) { - angleDiff += 0xFFFF; - } + WRAP(angleDiff, -0x8000, 0x8000); if (angleDiff > 0) { if (angleDiff < 0x10) { angleDiff = 0x10; @@ -1301,12 +1298,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { obj->segment.object.animationID = 0; tt->animFrameF += 3.0 * updateRateF; angleDiff = (racerObj->segment.trans.y_rotation - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; - if (angleDiff > 0x8000) { - angleDiff -= 0xFFFF; - } - if (angleDiff < -0x8000) { - angleDiff += 0xFFFF; - } + WRAP(angleDiff, -0x8000, 0x8000); if (angleDiff > 0) { if (angleDiff < 0x10) { angleDiff = 0x10; @@ -1913,7 +1905,7 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { newObject.y = posY; newObject.z = posZ; newObject.size = 8; - newObject.objectID = 0xC6; + newObject.objectID = ASSET_OBJECT_ID_LASERBOLT; newObj = spawn_object(&newObject, 1); if (newObj != NULL) { newObj->segment.level_entry = NULL; @@ -2272,7 +2264,7 @@ void obj_loop_bombexplosion(Object *obj, s32 updateRate) { if (obj->properties.bombExplosion.timer > 10 && temp_t8 != 0) { obj->properties.bombExplosion.unk4 ^= (temp_t8 << 8); obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, - BHV_LENS_FLARE_SWITCH, SOUND_NONE, 1.0f, temp_t8 - 1); + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_NONE, 1.0f, temp_t8 - 1); } if (obj->properties.bombExplosion.timer < 20) { obj->segment.trans.scale = ((obj->properties.bombExplosion.timer / 20.0f) * 10.0f) + 0.5f; @@ -3086,7 +3078,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } if (sp6B != 0) { obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, - BHV_DINO_WHALE, SOUND_NONE, 1.0f, 0); + ASSET_OBJECT_ID_WARDENSMOKE, SOUND_NONE, 1.0f, 0); } obj->segment.animFrame = taj->animFrameF * 1.0; func_80061C0C(obj); @@ -3202,7 +3194,7 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { dist = ((modeChange->directionX * racerObj->segment.trans.x_position) + (modeChange->directionZ * racerObj->segment.trans.z_position) + modeChange->rotationDiff); if (dist < 0.0f) { - racer->unk1E0 = 0; + racer->trickType = 0; if (modeChange->vehicleID == VEHICLE_CAR) { racer->vehicleID = racer->vehicleIDPrev; } else { @@ -3210,7 +3202,7 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { } if (modeChange->vehicleID == VEHICLE_LOOPDELOOP) { if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } radius_3 = func_8001C524(racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, @@ -3550,7 +3542,8 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { } } sp4C &= doorEntry->unk10; - if (doorEntry->common.objectID == 0x87 || doorEntry->common.objectID == 0xD7) { + if (doorEntry->common.objectID == ASSET_OBJECT_ID_BIGBOSSDOOR || + doorEntry->common.objectID == ASSET_OBJECT_ID_BOSSDOOR) { if (func_800235C0() != 0) { sp50 = 0; } @@ -3564,7 +3557,7 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { } temp2 = 0; if (door->unkF & 2) { - if (sp28 != 0 && doorEntry->common.objectID == 0x19) { + if (sp28 != 0 && doorEntry->common.objectID == ASSET_OBJECT_ID_LEVELDOOR) { if (settings->courseFlagsPtr[doorEntry->unk14] & 2) { if (settings->worldId == WORLD_FUTURE_FUN_LAND || settings->bosses & (1 << settings->worldId)) { door->unk10 = doorEntry->unk15; @@ -3593,7 +3586,7 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { } } } else { - if (doorEntry->common.objectID == 0xD7) { + if (doorEntry->common.objectID == ASSET_OBJECT_ID_BOSSDOOR) { doorObj->segment.object.modelIndex = 0; if (settings->bosses & (1 << settings->worldId)) { if (settings->balloonsPtr[settings->worldId] == 8) { @@ -3623,7 +3616,7 @@ void obj_loop_door(Object *doorObj, s32 updateRate) { if (temp < -0x200) { temp = -0x200; } - doorObj->segment.trans.y_rotation -= temp; + doorObj->segment.trans.y_rotation -= temp; //@!Delta if (temp != 0) { temp2 = 1; } @@ -4129,7 +4122,7 @@ void obj_loop_treasuresucker(Object *obj, s32 updateRate) { spawnObj.y = (s16) racerObj->segment.trans.y_position + 10; spawnObj.z = racerObj->segment.trans.z_position; spawnObj.size = 8; - spawnObj.objectID = BHV_SNOWBALL_2; + spawnObj.objectID = ASSET_OBJECT_ID_FLYCOIN; newObj = spawn_object(&spawnObj, 1); if (newObj != NULL) { newObj->segment.level_entry = NULL; @@ -4194,7 +4187,7 @@ void obj_loop_bananacreator(Object *obj, s32 updateRate) { newEntry.y = ((s32) ((s16) obj->segment.trans.y_position)) - 3; newEntry.z = (s32) obj->segment.trans.z_position; newEntry.size = 8; - newEntry.objectID = 83; + newEntry.objectID = ASSET_OBJECT_ID_COIN; newBananaObj = spawn_object(&newEntry, 1); obj->properties.bananaSpawner.spawn = TRUE; if (newBananaObj) { @@ -4202,7 +4195,7 @@ void obj_loop_bananacreator(Object *obj, s32 updateRate) { newBananaObj64 = &newBananaObj->unk64->banana; newBananaObj64->spawner = obj; obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position - 14.0f, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_SELECT, 0.25f, 0); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_SELECT, 0.25f, 0); obj->properties.bananaSpawner.spawn = FALSE; } obj->properties.bananaSpawner.timer = TIME_SECONDS(20); // Set delay to respawn banana to 20 seconds. @@ -4638,7 +4631,7 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { if (levelMask == racer->balloon_level) { if (racer->raceFinished == FALSE) { if (prevBalloonQuantity != racer->balloon_quantity) { - set_time_trial_start_voice(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); + hud_sound_play_delayed(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); prevBalloonQuantity = racer->balloon_level; if (prevBalloonQuantity > 2) { prevBalloonQuantity = 2; @@ -4653,7 +4646,7 @@ void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate) { } } else if (racer->raceFinished == FALSE) { if (racer->balloon_level > 0) { - set_time_trial_start_voice(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); + hud_sound_play_delayed(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); } sound_play(SOUND_COLLECT_ITEM + racer->balloon_level, NULL); } @@ -4839,11 +4832,11 @@ void handle_rocket_projectile(Object *obj, s32 updateRate) { weaponOwner->boost_sound |= BOOST_SOUND_UNK2; } if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 9); + rumble_set(racer->playerIndex, RUMBLE_TYPE_9); } } obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 1.0f, 1); + obj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); free_object(obj); return; } @@ -4863,7 +4856,7 @@ block_37: obj->properties.projectile.timer -= updateRate; if (obj->properties.projectile.timer < 0) { obj_spawn_effect(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, - BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 1.0f, 1); + ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); free_object(obj); return; } @@ -5189,7 +5182,7 @@ void func_8003F2E8(Object *weaponObj, s32 updateRate) { weaponHit->attackType = ATTACK_EXPLOSION; if (weapon->weaponID == WEAPON_TRIPMINE) { obj_spawn_effect(weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, + weaponObj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, SOUND_EXPLOSION, 1.0f, 1); } else if (weapon->weaponID == WEAPON_BUBBLE_TRAP) { if (weaponHit->shieldTimer > 0 && weaponHit->shieldType >= SHIELD_LEVEL3) { @@ -5214,7 +5207,7 @@ void func_8003F2E8(Object *weaponObj, s32 updateRate) { weaponProperties->unk4 = 2; } if (!weaponHit->raceFinished) { - func_80072348(weaponHit->playerIndex, 13); + rumble_set(weaponHit->playerIndex, RUMBLE_TYPE_13); } weaponOwner = &weapon->owner->unk64->racer; if (weaponHit->playerIndex != PLAYER_COMPUTER || weaponOwner->playerIndex != PLAYER_COMPUTER) { @@ -5240,8 +5233,8 @@ void func_8003F2E8(Object *weaponObj, s32 updateRate) { NULL); } else { obj_spawn_effect(weaponObj->segment.trans.x_position, weaponObj->segment.trans.y_position, - weaponObj->segment.trans.z_position, BHV_LENS_FLARE_SWITCH, SOUND_EXPLOSION, 1.0f, - 1); + weaponObj->segment.trans.z_position, ASSET_OBJECT_ID_BOMBEXPLOSION, + SOUND_EXPLOSION, 1.0f, 1); free_object(weaponObj); } } @@ -5382,7 +5375,7 @@ void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateSh */ void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { if (obj->unk64 != NULL) { - obj->segment.trans.y_position = get_wave_height((Object_Log *) obj->unk64, updateRate); + obj->segment.trans.y_position = log_wave_height((Object_Log *) obj->unk64, updateRate); } obj->segment.animFrame += updateRate * 8; } @@ -5423,7 +5416,7 @@ void obj_loop_log(Object *obj, s32 updateRate) { log = (Object_Log *) obj->unk64; if (log != NULL) { - obj->segment.trans.y_position = get_wave_height(log, updateRate); + obj->segment.trans.y_position = log_wave_height(log, updateRate); } else { obj->segment.trans.y_position = ((LevelObjectEntryCommon *) obj->segment.level_entry)->y; } @@ -5433,7 +5426,7 @@ void obj_loop_log(Object *obj, s32 updateRate) { if (racerObj->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if (racer->velocity < -4.0 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 18); + rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } } sine = sins_f(-obj->segment.trans.y_rotation); diff --git a/src/object_functions.h b/src/object_functions.h index fcdd33a7..a909c3a1 100644 --- a/src/object_functions.h +++ b/src/object_functions.h @@ -227,7 +227,7 @@ typedef struct unk80042CD0 { s16 unk18; } unk80042CD0; -//void func_80072348(s16 obj, u8 arg1); +//void rumble_set(s16 obj, u8 arg1); typedef struct unk80041A90_MidiFade { s16 unk0; // Y rotation diff --git a/src/object_models.c b/src/object_models.c index 186aac7c..d0e8a3b9 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -211,9 +211,9 @@ Object_68 *func_8005FCD0(ObjectModel *model, s32 arg1) { result->unk4[2] = NULL; result->unk1E = 0; } - result->unk16 = 0; - result->unk18 = 0; - result->unk1A = 0; + result->offsetX = 0; + result->offsetY = 0; + result->offsetZ = 0; result->objModel = model; result->animationID = -1; result->animationFrame = -1; diff --git a/src/objects.c b/src/objects.c index 4850769e..095bd472 100644 --- a/src/objects.c +++ b/src/objects.c @@ -73,70 +73,71 @@ UNUSED f32 D_800DC76C[15] = { -1.0f, -0.70711f, -0.70711f, -1.0f, 0.0f, -0.70711f, 0.70711f, }; -u16 D_800DC7A8[8] = { - BHV_RACER, - BHV_SCENERY, - BHV_FISH, - BHV_ANIMATOR, - BHV_ANIMATED_OBJECT_2, - BHV_WIZPIG_SHIP, - BHV_ANIMATED_OBJECT_3, - BHV_ANIMATED_OBJECT_4, +u16 D_800DC7A8[] = { + // Car + ASSET_OBJECT_ID_KREMCAR, ASSET_OBJECT_ID_BADGERCAR, ASSET_OBJECT_ID_TORTCAR, ASSET_OBJECT_ID_CONKACAR, + ASSET_OBJECT_ID_TIGERCAR, ASSET_OBJECT_ID_BANJOCAR, ASSET_OBJECT_ID_CHICKENCAR, ASSET_OBJECT_ID_MOUSECAR, }; -s16 D_800DC7B8[52] = { - 0x00ED, - 0x00FF, - BHV_TRIGGER, - BHV_VEHICLE_ANIMATION, - BHV_ZIPPER_WATER, - BHV_UNK_3A, - BHV_TAJ_TELEPOINT, - BHV_SILVER_COIN, - BHV_BOOST, - BHV_WARDEN_SMOKE, - 0x00F3, - 0x00FD, - BHV_TREASURE_SUCKER, - BHV_LOG, - BHV_LAVA_SPURT, - BHV_POS_ARROW, - BHV_UNK_5B, - BHV_UNK_5C, - BHV_ZIPPER_AIR, - BHV_UNK_5E, - 0x00F4, - 0x0101, - BHV_RACER, - BHV_SCENERY, - BHV_FISH, - BHV_ANIMATOR, - BHV_ANIMATED_OBJECT_2, - BHV_WIZPIG_SHIP, - BHV_ANIMATED_OBJECT_3, - BHV_ANIMATED_OBJECT_4, - 0x00ED, - 0x00FF, - BHV_RACER, - BHV_SCENERY, - BHV_FISH, - BHV_ANIMATOR, - BHV_ANIMATED_OBJECT_2, - BHV_WIZPIG_SHIP, - BHV_ANIMATED_OBJECT_3, - BHV_ANIMATED_OBJECT_4, - 0x00ED, - 0x00FF, - 0x00D9, - 0x00DF, - 0x00E0, - 0x0105, - 0x008A, - 0x00DA, - 0x00E8, - 0x0115, - 0x0118, - BHV_NONE, +s16 D_800DC7B8[] = { + // TODO: move these first two entries to the first var above. I'm thinking this is either all one big var, or the + // boss objects have their own table. + ASSET_OBJECT_ID_SWCAR, + ASSET_OBJECT_ID_DIDDYCAR, + // Hover + ASSET_OBJECT_ID_KREMLINHOVER, + ASSET_OBJECT_ID_BADGERHOVER, + ASSET_OBJECT_ID_TORTHOVER, + ASSET_OBJECT_ID_CONKAHOVER, + ASSET_OBJECT_ID_TIGERHOVER, + ASSET_OBJECT_ID_BANJOHOVER, + ASSET_OBJECT_ID_CHICKENHOVER, + ASSET_OBJECT_ID_MOUSEHOVER, + ASSET_OBJECT_ID_TICKTOCKHOVER, + ASSET_OBJECT_ID_DIDDYHOVER, + // Plane + ASSET_OBJECT_ID_KREMPLANE, + ASSET_OBJECT_ID_BADGERPLANE, + ASSET_OBJECT_ID_TORTPLANE, + ASSET_OBJECT_ID_CONKA, + ASSET_OBJECT_ID_TIGPLANE, + ASSET_OBJECT_ID_BANJOPLANE, + ASSET_OBJECT_ID_CHICKENPLANE, + ASSET_OBJECT_ID_MOUSEPLANE, + ASSET_OBJECT_ID_TICKTOCKPLANE, + ASSET_OBJECT_ID_DIDDYPLANE, + // Car + ASSET_OBJECT_ID_KREMCAR, + ASSET_OBJECT_ID_BADGERCAR, + ASSET_OBJECT_ID_TORTCAR, + ASSET_OBJECT_ID_CONKACAR, + ASSET_OBJECT_ID_TIGERCAR, + ASSET_OBJECT_ID_BANJOCAR, + ASSET_OBJECT_ID_CHICKENCAR, + ASSET_OBJECT_ID_MOUSECAR, + ASSET_OBJECT_ID_SWCAR, + ASSET_OBJECT_ID_DIDDYCAR, + // Car again? + ASSET_OBJECT_ID_KREMCAR, + ASSET_OBJECT_ID_BADGERCAR, + ASSET_OBJECT_ID_TORTCAR, + ASSET_OBJECT_ID_CONKACAR, + ASSET_OBJECT_ID_TIGERCAR, + ASSET_OBJECT_ID_BANJOCAR, + ASSET_OBJECT_ID_CHICKENCAR, + ASSET_OBJECT_ID_MOUSECAR, + ASSET_OBJECT_ID_SWCAR, + ASSET_OBJECT_ID_DIDDYCAR, + // Special + ASSET_OBJECT_ID_TRICKYTOPS, + ASSET_OBJECT_ID_WALRUS, + ASSET_OBJECT_ID_DRAGONBOSS, + ASSET_OBJECT_ID_TERRYBOSS, + ASSET_OBJECT_ID_SNOWBALLBOSS, + ASSET_OBJECT_ID_FLYINGCARPET, + ASSET_OBJECT_ID_OCTOPUS, + ASSET_OBJECT_ID_WIZPIG, + ASSET_OBJECT_ID_WIZPIGROCKET, }; // A table of which vehicles to use for boss races. @@ -218,7 +219,7 @@ s8 gNumRacersSaved; s8 D_8011AD52; s8 D_8011AD53; s32 D_8011AD54; -Object *(*gSpawnObjectHeap)[0x200]; +Object *(*gSpawnObjectHeap)[sizeof(Object)]; s32 D_8011AD5C; s32 D_8011AD60; s32 *gAssetsObjectHeadersTable; @@ -643,7 +644,7 @@ void free_all_objects(void) { free_tt_ghost_data(); D_800DC748 = 0; if (D_800DC71C) { - func_80072298(1); + rumble_init(TRUE); } D_800DC71C = 0; if (gSwapLeadPlayer && is_in_two_player_adventure()) { @@ -1012,7 +1013,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { } sp127 = -1; i2 = gNumRacers; - D_8011AD24[1] = levelHeader->unkB8; + D_8011AD24[1] = levelHeader->bossRaceID; for (i6 = 0; i6 < gNumRacers; i6++) { var_s4 = i6; if (raceType != RACETYPE_HUBWORLD && isChallengeMode == 0 && D_8011AD3C == 0) { @@ -1247,7 +1248,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { if (raceType == RACETYPE_DEFAULT && numPlayers == 1 && !is_in_adventure_two()) { if (is_two_player_adventure_race() == 0) { for (i2 = 0; i2 < 3; i2++) { - entry->common.objectID = BHV_ANIMATED_OBJECT; + entry->common.objectID = ASSET_OBJECT_ID_POSARROW; entry->common.size = 8; entry->common.x = 0; entry->common.y = 0; @@ -1290,7 +1291,7 @@ void func_8000CC7C(Vehicle vehicle, u32 arg1, s32 arg2) { cutsceneCameraSegment->object.animationID = cutsceneID; } if (func_8000E148() != 0) { - func_80072298(0); + rumble_init(FALSE); gEventCountdown = 0; start_level_music(1.0f); } @@ -1631,7 +1632,7 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { curObj->segment.trans.x_position, curObj->segment.trans.y_position, curObj->segment.trans.z_position); curObj->segment.object.unk2C = var_a0; curObj->segment.level_entry = (LevelObjectEntry *) entry; - curObj->unk4A = objType; + curObj->objectID = objType; func_800245B4(objType); curObj->segment.trans.scale = curObj->segment.header->scale; curObj->segment.camera.unk34 = curObj->segment.header->unk50 * curObj->segment.trans.scale; @@ -1690,8 +1691,8 @@ Object *spawn_object(LevelObjectEntryCommon *entry, s32 arg1) { break; } if (!(arg1 & 2)) { - if (curObj->unk4A != 0x19) { - if (curObj->unk4A == 0xCB) { + if (curObj->objectID != 0x19) { + if (curObj->objectID == 0xCB) { assetCount = 1; if (is_in_adventure_two()) { curObj->segment.header->modelIds[0] = curObj->segment.header->modelIds[1]; @@ -2106,7 +2107,7 @@ Object *func_8000FD54(s32 objectHeaderIndex) { object->segment.trans.flags = OBJ_FLAGS_UNK_0002; object->segment.header = objHeader; object->segment.object.unk2C = objectHeaderIndex; - object->unk4A = objectHeaderIndex; + object->objectID = objectHeaderIndex; object->segment.trans.scale = objHeader->scale; if (objHeader->flags & OBJ_FLAGS_UNK_0080) { object->segment.trans.flags |= OBJ_FLAGS_UNK_0080; @@ -2147,7 +2148,7 @@ Object *func_8000FD54(s32 objectHeaderIndex) { * Official Name: objFreeObject */ void free_object(Object *object) { - func_800245B4(object->unk4A | OBJ_FLAGS_DEACTIVATED); + func_800245B4(object->objectID | OBJ_FLAGS_DEACTIVATED); gParticlePtrList[gFreeListCount] = object; gFreeListCount++; } @@ -2347,7 +2348,7 @@ void func_80010994(s32 updateRate) { if (sp54 & A_BUTTON) { func_8001E45C(CUTSCENE_ID_UNK_64); } else if ((sp54 & B_BUTTON) && (get_trophy_race_world_id() == 0) && (is_in_tracks_mode() == 0)) { - func_8006F140(1); // FADE_BARNDOOR_HORIZONTAL? + level_transition_begin(1); // FADE_BARNDOOR_HORIZONTAL? } } } else if (D_8011AF00 == 0) { @@ -3047,7 +3048,7 @@ void render_object(Gfx **dList, MatrixS **mtx, Vertex **verts, Object *obj) { if (obj->segment.trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) { return; } - update_object_stack_trace(OBJECT_DRAW, obj->unk4A); + update_object_stack_trace(OBJECT_DRAW, obj->objectID); gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; gObjectCurrVertexList = *verts; @@ -3810,7 +3811,7 @@ void func_80016500(Object *obj, Object_Racer *racer) { } if (racer->unk1F6 == 0 && angle >= 56) { if (!racer->raceFinished) { - func_80072348(racer->playerIndex, 18); + rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } racer->unk1F3 |= 8; } @@ -3894,7 +3895,7 @@ void func_80016748(Object *obj0, Object *obj1) { if (obj0->behaviorId == BHV_RACER) { racer = &obj0->unk64->racer; if (!racer->raceFinished) { - func_80072348(racer->playerIndex, 18); + rumble_set(racer->playerIndex, RUMBLE_TYPE_18); } if (racer->vehicleID == VEHICLE_HOVERCRAFT) { if (radius > 0.1) { @@ -4246,7 +4247,7 @@ void func_8001A8F4(s32 updateRate) { for (i = 0; i < gNumRacers; i++) { racer = &(*gRacers)[i]->unk64->racer; racer->magnetTargetObj = NULL; - if (racer->playerIndex != PLAYER_COMPUTER && racer->unk1AC == 1) { + if (racer->playerIndex != PLAYER_COMPUTER && racer->finishPosition == 1) { sp30 = i; } if (racer->magnetSoundMask != NULL) { @@ -4260,7 +4261,7 @@ void func_8001A8F4(s32 updateRate) { (*gRacers)[0] = (*gRacers)[sp30]; (*gRacers)[sp30] = prevPort0Racer; racer_sound_free((*gRacers)[0]); - func_800A0B74(); + hud_audio_init(); reset_rocket_sound_timer(); sound_stop_all(); if (is_in_two_player_adventure()) { @@ -4341,7 +4342,7 @@ void func_8001A8F4(s32 updateRate) { if (i != 0) { transition_begin(&D_800DC6F8); } - func_8006F140(2); + level_transition_begin(2); D_8011AD50 = 5; settings->cutsceneFlags |= 0x40000; } @@ -6028,7 +6029,7 @@ void func_80022948(void) { newRacerEntry.angleX = 0; newRacerEntry.angleZ = 0; newRacerEntry.playerIndex = 4; - newRacerEntry.common.objectID = 0xDA; + newRacerEntry.common.objectID = ASSET_OBJECT_ID_FLYINGCARPET; func_800619F4(0); racerObj = spawn_object(&newRacerEntry.common, 1); (*gRacers)[1] = racerObj; @@ -6123,7 +6124,7 @@ void func_80022E18(s32 arg0) { racer->unk15C = NULL; } if (arg0 == 0) { - if (racer->unk1AC == 1) { + if (racer->finishPosition == 1) { settings = get_settings(); flags = racer->vehicleID; flags = 1 << (flags + 3); @@ -6152,7 +6153,7 @@ void func_80022E18(s32 arg0) { obj->properties.common.unk0 = 0x14; } music_change_on(); - func_800A0B74(); + hud_audio_init(); start_level_music(1.0f); gIsTajChallenge = 0; } @@ -6589,7 +6590,7 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { obj_init_wizpigship(obj, (LevelObjectEntry_WizpigShip *) entry); break; case BHV_BOOST: - obj_init_boost(obj, (LevelObjectEntry_Boost *) entry); + obj_init_boost(obj, (LevelObjectEntry_Boost2 *) entry); break; case BHV_SILVER_COIN: obj_init_silvercoin(obj, (LevelObjectEntry_SilverCoin *) entry); @@ -6768,7 +6769,7 @@ s32 obj_init_property_flags(s32 behaviorId) { * One big switch statement for whichever object. */ void run_object_loop_func(Object *obj, s32 updateRate) { - update_object_stack_trace(OBJECT_UPDATE, obj->unk4A); + update_object_stack_trace(OBJECT_UPDATE, obj->objectID); switch (obj->behaviorId) { case BHV_SCENERY: obj_loop_scenery(obj, updateRate); diff --git a/src/printf.c b/src/printf.c index 77ff099e..c1f56445 100644 --- a/src/printf.c +++ b/src/printf.c @@ -12,7 +12,7 @@ /************ .data ************/ -s32 D_800E2EF0 = 0; +s32 D_800E2EF0 = FALSE; // Char width is (v - u) + 1 TexFontCoords gDebugFontCoords[3][32] = { @@ -158,25 +158,28 @@ const char D_800E8C5C[] = "(nil)"; /************ .bss ************/ TextureHeader *gTexture[3]; -u16 D_80127CAC; -u16 D_80127CAE; +u16 gDebugTextX; +u16 gDebugTextY; u16 D_80127CB0; u16 D_80127CB2; s32 D_80127CB4; -s32 D_80127CB8; -s32 D_80127CBC; -s32 D_80127CC0; -s32 D_80127CC4; -s32 D_80127CC8; +s32 gDebugTextOn; +s32 gDebugBoundsX1; +s32 gDebugBoundsX2; +s32 gDebugBoundsY1; +s32 gDebugBoundsY2; s32 gDebugFontTexture; -u16 D_80127CD0; -u16 D_80127CD2; -s32 D_80127CD4; +u16 gDebugScreenWidth; +u16 gDebugScreenHeight; +UNUSED s32 D_80127CD4; char gDebugPrintBufferStart[0x900]; char *gDebugPrintBufferEnd; /******************************/ +/** + * Standard C Library function that converts integers to strings. + */ char *_itoa(u64 n, char *outBuffer, u32 radix, s32 useUpperCase) { char *alphabet; char *buffer; @@ -191,8 +194,8 @@ char *_itoa(u64 n, char *outBuffer, u32 radix, s32 useUpperCase) { } // Official Name: sprintfSetSpacingCodes -void func_800B4A08(s32 arg0) { - D_800E2EF0 = arg0; +void func_800B4A08(s32 setting) { + D_800E2EF0 = setting; } /* Official name: sprintf */ @@ -206,10 +209,14 @@ UNUSED int sprintf(char *s, const char *format, ...) { // Official Name: vsprintf GLOBAL_ASM("asm/non_matchings/printf/vsprintf.s") -void diPrintfInit(void) { - gTexture[0] = load_texture(0); - gTexture[1] = load_texture(1); - gTexture[2] = load_texture(2); +/** + * Load the font textures for the debug text, then set the buffer to the beginning. + * Official Name: diPrintfInit + */ +void debug_text_init(void) { + gTexture[0] = load_texture(ASSET_TEX2D_SMALLFONT_0); + gTexture[1] = load_texture(ASSET_TEX2D_SMALLFONT_1); + gTexture[2] = load_texture(ASSET_TEX2D_SMALLFONT_2); gDebugPrintBufferEnd = gDebugPrintBufferStart; } @@ -222,9 +229,9 @@ s32 render_printf(const char *format, ...) { stubbed_printf("*** diPrintf Error *** ---> Out of string space. (Print less text!)\n"); return -1; } - func_800B4A08(1); + func_800B4A08(TRUE); written = vsprintf(gDebugPrintBufferEnd, format, args); - func_800B4A08(0); + func_800B4A08(FALSE); if (written > 0) { gDebugPrintBufferEnd = &gDebugPrintBufferEnd[written] + 1; } @@ -236,42 +243,45 @@ s32 render_printf(const char *format, ...) { * Soft-clear the buffer afterwards by setting the endpoint to the start point. * Official Name: diPrintfAll */ -void print_debug_strings(Gfx **dList) { +void debug_text_print(Gfx **dList) { char *buffer; u32 widthAndHeight; init_rdp_and_framebuffer(dList); widthAndHeight = get_video_width_and_height_as_s32(); - D_80127CD2 = GET_VIDEO_HEIGHT(widthAndHeight); - D_80127CD0 = GET_VIDEO_WIDTH(widthAndHeight); - gDPSetScissor((*dList)++, 0, 0, 0, D_80127CD0, D_80127CD2); - func_800B6E50(); + gDebugScreenHeight = GET_VIDEO_HEIGHT(widthAndHeight); + gDebugScreenWidth = GET_VIDEO_WIDTH(widthAndHeight); + gDPSetScissor((*dList)++, 0, 0, 0, gDebugScreenWidth, gDebugScreenHeight); + debug_text_bounds(); gSPDisplayList((*dList)++, dDebugFontSettings); buffer = (char *) gDebugPrintBufferStart; - func_800B6EE0(); + debug_text_origin(); gDebugFontTexture = -1; D_80127CB4 = 0; - D_80127CB0 = D_80127CAC; - D_80127CB2 = D_80127CAE; + D_80127CB0 = gDebugTextX; + D_80127CB2 = gDebugTextY; while ((s32) buffer != (s32) gDebugPrintBufferEnd) { - D_80127CB8 = FALSE; + gDebugTextOn = FALSE; buffer += func_800B653C(dList, buffer); } - func_800B695C(dList, (u16) D_80127CB0, (u16) D_80127CB2, D_80127CAC, D_80127CAE + 10); + debug_text_background(dList, D_80127CB0, D_80127CB2, gDebugTextX, gDebugTextY + 10); buffer = (char *) gDebugPrintBufferStart; - func_800B6EE0(); + debug_text_origin(); gDebugFontTexture = -1; D_80127CB4 = 0; while ((s32) buffer != (s32) gDebugPrintBufferEnd) { - D_80127CB8 = TRUE; + gDebugTextOn = TRUE; buffer += func_800B653C(dList, buffer); } gDebugPrintBufferEnd = gDebugPrintBufferStart; } -UNUSED void func_800B61E0(void) { +/** + * Clears the text buffer, then sets the position back to the top left. + */ +UNUSED void debug_text_reset(void) { gDebugPrintBufferEnd = gDebugPrintBufferStart; - func_800B6EE0(); + debug_text_origin(); } /** @@ -300,7 +310,7 @@ void set_render_printf_position(u16 x, u16 y){ RENDER_PRINTF_CMD_SET_POSITION(x, * Definitely has some fakematch shenanigans. * This will return the length in pixels of a given string using the debug small font. */ -UNUSED s32 func_800B63F4(const char *format, ...) { +UNUSED s32 debug_text_width(const char *format, ...) { s32 pad; s32 fontCharU; s32 stringLength; @@ -310,9 +320,9 @@ UNUSED s32 func_800B63F4(const char *format, ...) { va_start(args, format); stringLength = 0; - func_800B4A08(1); + func_800B4A08(TRUE); vsprintf(s, format, args); - func_800B4A08(0); + func_800B4A08(FALSE); for (ch = (u8 *) &s[0]; *ch != '\0'; ch++) { pad = *ch; if (*ch != (0, '\n')) { @@ -320,18 +330,18 @@ UNUSED s32 func_800B63F4(const char *format, ...) { stringLength += 6; if (1) {} } else { - if (*ch < 0x40) { + if (*ch < '@') { // Character is a symbol or number and not a letter gDebugFontTexture = 0; - *ch -= 0x21; - } else if (*ch < 0x60) { + *ch -= '!'; + } else if (*ch < '`') { // Character is a upper case letter gDebugFontTexture = 1; - *ch -= 0x40; - } else if (*ch < 0x80) { + *ch -= '@'; + } else if (*ch <= 0x7F) { // Character is a lower case letter gDebugFontTexture = 2; - *ch -= 0x60; + *ch -= '`'; } fontCharU = gDebugFontCoords[gDebugFontTexture][*ch].u; stringLength = ((stringLength + gDebugFontCoords[gDebugFontTexture][*ch].v) - fontCharU) + (pad = 1); @@ -344,7 +354,10 @@ UNUSED s32 func_800B63F4(const char *format, ...) { GLOBAL_ASM("asm/non_matchings/printf/func_800B653C.s") -void func_800B695C(Gfx **dList, u32 ulx, u32 uly, u32 lrx, u32 lry) { +/** + * Render the background for the debug text. + */ +void debug_text_background(Gfx **dList, u32 ulx, u32 uly, u32 lrx, u32 lry) { if (!((ulx == lrx) | (uly == lry))) { if (ulx >= 2) { ulx -= 2; @@ -355,75 +368,88 @@ void func_800B695C(Gfx **dList, u32 ulx, u32 uly, u32 lrx, u32 lry) { } } -// Loads a font texture and returns the width of the character given. -s32 func_800B69FC(Gfx **dList, s32 asciiVal) { +/** + * Renders a character onscreen at the current debug text position. + * If necessary, load the correct font texture. + * Return the width of the char that was just printed. + */ +s32 debug_text_character(Gfx **dList, s32 asciiVal) { s32 fontCharWidth; s32 fontCharU; - if (asciiVal < 0x40) { + if (asciiVal < '@') { // Character is a symbol or number and not a letter if (gDebugFontTexture != 0) { - if (D_80127CB8) { + if (gDebugTextOn) { gDPLoadTextureBlock((*dList)++, OS_PHYSICAL_TO_K0(gTexture[0] + 1), G_IM_FMT_IA, G_IM_SIZ_8b, 192, 11, 0, 2, 2, 0, 0, 0, 0); } gDebugFontTexture = 0; } - asciiVal -= 0x21; - } else if (asciiVal < 0x60) { + asciiVal -= '!'; + } else if (asciiVal < '`') { // Character is a upper case letter if (gDebugFontTexture != 1) { - if (D_80127CB8) { + if (gDebugTextOn) { gDPLoadTextureBlock((*dList)++, OS_PHYSICAL_TO_K0(gTexture[1] + 1), G_IM_FMT_IA, G_IM_SIZ_8b, 248, 11, 0, 2, 2, 0, 0, 0, 0); } gDebugFontTexture = 1; } - asciiVal -= 0x40; - } else if (asciiVal < 0x80) { + asciiVal -= '@'; + } else if (asciiVal <= 0x7F) { // Character is a lower case letter if (gDebugFontTexture != 2) { - if (D_80127CB8) { + if (gDebugTextOn) { gDPLoadTextureBlock((*dList)++, OS_PHYSICAL_TO_K0(gTexture[2] + 1), G_IM_FMT_IA, G_IM_SIZ_8b, 192, 11, 0, 2, 2, 0, 0, 0, 0); } gDebugFontTexture = 2; } - asciiVal -= 0x60; + asciiVal -= '`'; } fontCharU = gDebugFontCoords[gDebugFontTexture][asciiVal].u; fontCharWidth = (gDebugFontCoords[gDebugFontTexture][asciiVal].v - fontCharU) + 1; - if (D_80127CB8) { + if (gDebugTextOn) { gDPSetCombineMode((*dList)++, DKR_CC_UNK12, DKR_CC_UNK12); - gSPTextureRectangle((*dList)++, (D_80127CAC << 2), (D_80127CAE << 2), ((D_80127CAC + fontCharWidth) << 2), - ((D_80127CAE + 10) << 2), 0, (fontCharU << 5), 0, 1024, 1024); + gSPTextureRectangle((*dList)++, (gDebugTextX << 2), (gDebugTextY << 2), ((gDebugTextX + fontCharWidth) << 2), + ((gDebugTextY + 10) << 2), 0, (fontCharU << 5), 0, 1024, 1024); } return fontCharWidth; } -void func_800B6E50(void) { - if (D_80127CD0 <= 320) { - D_80127CBC = 16; - D_80127CC0 = D_80127CD0 - 16; +/** + * Sets the upper and lower boundaries of the debug text. + */ +void debug_text_bounds(void) { + if (gDebugScreenWidth <= 320) { + gDebugBoundsX1 = 16; + gDebugBoundsX2 = gDebugScreenWidth - 16; } else { - D_80127CBC = 32; - D_80127CC0 = D_80127CD0 - 32; + gDebugBoundsX1 = 32; + gDebugBoundsX2 = gDebugScreenWidth - 32; } - if (D_80127CD2 <= 240) { - D_80127CC4 = 16; - D_80127CC8 = D_80127CD2 - 16; + if (gDebugScreenHeight <= 240) { + gDebugBoundsY1 = 16; + gDebugBoundsY2 = gDebugScreenHeight - 16; } else { - D_80127CC4 = 32; - D_80127CC8 = D_80127CD2 - 32; + gDebugBoundsY1 = 32; + gDebugBoundsY2 = gDebugScreenHeight - 32; } } -void func_800B6EE0(void) { - D_80127CAC = D_80127CBC; - D_80127CAE = D_80127CC4; +/** + * Sets the print position of the text back to top left. + */ +void debug_text_origin(void) { + gDebugTextX = gDebugBoundsX1; + gDebugTextY = gDebugBoundsY1; } -void func_800B6F04(void) { - D_80127CAC = D_80127CBC; - D_80127CAE += 11; +/** + * Moves the print position of the text down one line. + */ +void debug_text_newline(void) { + gDebugTextX = gDebugBoundsX1; + gDebugTextY += 11; } diff --git a/src/printf.h b/src/printf.h index 25a8ee90..e8592a6c 100644 --- a/src/printf.h +++ b/src/printf.h @@ -45,18 +45,18 @@ typedef struct TexFontCoords { char *_itoa(u64 n, char *outBuffer, u32 radix, s32 useUpperCase); -void func_800B4A08(s32 arg0); -void diPrintfInit(void); +void func_800B4A08(s32 setting); +void debug_text_init(void); void set_render_printf_colour(u8 red, u8 green, u8 blue, u8 alpha); void set_render_printf_background_colour(u8 red, u8 green, u8 blue, u8 alpha); -void func_800B695C(Gfx **dList, u32 ulx, u32 uly, u32 lrx, u32 lry); -s32 func_800B69FC(Gfx **dList, s32 asciiVal); -void print_debug_strings(Gfx **dList); +void debug_text_background(Gfx **dList, u32 ulx, u32 uly, u32 lrx, u32 lry); +s32 debug_text_character(Gfx **dList, s32 asciiVal); +void debug_text_print(Gfx **dList); void set_render_printf_position(u16 x, u16 y); s32 render_printf(const char *format, ...); -void func_800B6E50(void); -void func_800B6EE0(void); -void func_800B6F04(void); +void debug_text_bounds(void); +void debug_text_origin(void); +void debug_text_newline(void); s32 func_800B653C(Gfx**, char*); int vsprintf(char *s, const char *fmt, ...); diff --git a/src/racer.c b/src/racer.c index f64fe8ea..a31f9c3d 100644 --- a/src/racer.c +++ b/src/racer.c @@ -255,8 +255,8 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { if (temp_v0 == FALSE) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 3); } else { - func_8005CA84(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 5); + racer_boss_sound_spatial(obj->segment.trans.x_position, obj->segment.trans.y_position, + obj->segment.trans.z_position, 5); } play_random_character_voice(racerGroup[temp_v1_2], SOUND_VOICE_CHARACTER_POSITIVE, 8, 2); } @@ -268,8 +268,8 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { if (temp_v0 == FALSE) { play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 3); } else { - func_8005CA84(obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position, 3); + racer_boss_sound_spatial(obj->segment.trans.x_position, obj->segment.trans.y_position, + obj->segment.trans.z_position, 3); } } } @@ -802,7 +802,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->brake = 1.2f; } if (racer->velocity < (-2.0)) { - func_80072348(racer->playerIndex, 5); + rumble_set(racer->playerIndex, RUMBLE_TYPE_5); } } else { racer->brake -= updateRateF * 0.046; @@ -829,7 +829,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->magnetTimer = 0; racer->steerAngle = 0; racer->spinout_timer = 0; - racer->unk1E0 = 0; + racer->trickType = 0; var_v1 = racer->zipperObj->segment.trans.y_rotation - (racer->steerVisualRotation & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; @@ -850,7 +850,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->boostType |= BOOST_SMALL_FAST; } racer->zipperDirCorrection = 0; - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } else { obj->segment.x_velocity = (obj->segment.x_velocity * 1.0) * 0.75f; obj->segment.y_velocity = (obj->segment.y_velocity * 1.0) * 0.75f; @@ -987,10 +987,10 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->steerVisualRotation -= (s32) (var_f14 * gCurrentRacerHandlingStat); if ((racer->groundedWheels == 0) && (racer->buoyancy == 0.0)) { if (obj->segment.y_velocity < 0.0f) { - racer->unk1E0 += updateRate; + racer->trickType += updateRate; } - if (racer->unk1E0 > 25) { - racer->unk1E0 = 25; + if (racer->trickType > 25) { + racer->trickType = 25; } } for (i = 0; i < 4; i++) { @@ -1009,21 +1009,21 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gTajInteractStatus = 2; } if ((racer->groundedWheels) || (racer->buoyancy > 0.0f)) { - if (racer->unk1E0 != 0) { + if (racer->trickType != 0) { if (racer->groundedWheels) { - if (((gRaceStartTimer != 100) && (racer->playerIndex != PLAYER_COMPUTER)) && (racer->unk1E0 >= 6)) { + if (((gRaceStartTimer != 100) && (racer->playerIndex != PLAYER_COMPUTER)) && (racer->trickType >= 6)) { sound_play(SOUND_BOUNCE, &racer->unk21C); - sound_volume_set_relative(SOUND_BOUNCE, (void *) racer->unk21C, (racer->unk1E0 * 2) + 0x32); + sound_volume_set_relative(SOUND_BOUNCE, (void *) racer->unk21C, (racer->trickType * 2) + 0x32); } } else if (racer->approachTarget == 0) { racer_play_sound(obj, SOUND_UNK_AF); obj->unk74 |= 0x30; } - temp_f2 = racer->unk1E0 - 5.0f; + temp_f2 = racer->trickType - 5.0f; if ((temp_f2 > 0.0f) && (racer->approachTarget == 0)) { racer->stretch_height_cap = 1.0 - (temp_f2 * 0.02); } - racer->unk1E0 = 0; + racer->trickType = 0; } } var_f18 = var_f18 * (handle_racer_top_speed(obj, racer) * 1.7); @@ -1057,7 +1057,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } racer_play_sound(obj, SOUND_ZIP_PAD_BOOST); play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, SOUND_NUMBER_OF_RACERS, (0x80 | 0x2)); - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } temp_f0 = sqrtf((obj->segment.z_velocity * obj->segment.z_velocity) + (obj->segment.x_velocity * obj->segment.x_velocity)); @@ -1820,7 +1820,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { if (gDialogueCameraAngle) { racer->cameraYaw = 0x8000 - racer->steerVisualRotation; } - if (racer->unk1E0 == 2 || racer->unk1E0 == -2) { + if (racer->trickType == 2 || racer->trickType == -2) { angle = 0; } else { angle = obj->segment.trans.x_rotation; @@ -1901,10 +1901,10 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { gCameraObject->trans.x_position = (obj->segment.trans.x_position + xOffset) + yVel; temp_f16 = obj->segment.trans.y_position; yOffset = gCameraObject->trans.y_position - (temp_f16 + baseFloat1); - if (racer->unk1E0 == 1 || racer->unk1E0 == -1) { + if (racer->trickType == 1 || racer->trickType == -1) { racer->unk74 = 8.0; } - if (racer->unk1E0 == 2 || racer->unk1E0 == -2) { + if (racer->trickType == 2 || racer->trickType == -2) { racer->unk74 = 8.0; } if (racer->unk74 > 2.0) { @@ -1924,7 +1924,7 @@ void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer) { gCameraObject->trans.z_position = zOffset + obj->segment.trans.z_position + (-coss_f(racer->cameraYaw + 0x4000) * 3.0f * racer->lateral_velocity); gCameraObject->trans.y_rotation = racer->cameraYaw; - if (racer->unk1E0 || gDialogueCameraAngle) { + if (racer->trickType || gDialogueCameraAngle) { angle = -(u16) gCameraObject->trans.z_rotation; if (angle > 0x8000) { angle -= 0xFFFF; @@ -2032,7 +2032,7 @@ void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { * Updates the carpet vehicle that Taj uses during the overworld race challenges. */ void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer) { - s16 sp26; + s16 animFrame; if (racer->vehicleSound) { racer_sound_free(obj); @@ -2040,7 +2040,7 @@ void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (is_taj_challenge() && racer->vehicleID == VEHICLE_CARPET) { obj->interactObj->flags = INTERACT_FLAGS_NONE; } - sp26 = obj->segment.animFrame; + animFrame = obj->segment.animFrame; racer->vehicleID = VEHICLE_CARPET; func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; @@ -2055,7 +2055,7 @@ void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unk154->segment.trans.x_rotation = obj->segment.trans.x_rotation; racer->unk154->segment.trans.z_rotation = obj->segment.trans.z_rotation; obj->segment.object.animationID = 0; - obj->segment.animFrame = sp26 + updateRate; + obj->segment.animFrame = animFrame + updateRate; func_80061C0C(obj); } } @@ -2449,7 +2449,7 @@ void update_player_racer(Object *obj, s32 updateRate) { if (tempRacer->waterTimer > 0 && obj->segment.trans.y_position < waterHeight + 5.0f) { obj->interactObj->flags |= INTERACT_FLAGS_UNK_0010; } else { - obj->interactObj->flags &= 0xFFEF; + obj->interactObj->flags &= ~INTERACT_FLAGS_UNK_0010; } } func_8002ACC8(0); @@ -2550,7 +2550,7 @@ void update_player_racer(Object *obj, s32 updateRate) { newObject.x = 0; newObject.y = 0; newObject.z = 0; - newObject.objectID = 0x86; + newObject.objectID = ASSET_OBJECT_ID_CHECKARROW; newObject.size = 8; tempRacer->unk15C = spawn_object(&newObject, 1); if (tempRacer->unk15C) { @@ -2627,16 +2627,16 @@ void update_player_racer(Object *obj, s32 updateRate) { } else { tempRacer->headAngle += tempVar; } - if ((gCurrentButtonsPressed & R_TRIG) && tempRacer->unk1EB) { - tempRacer->unk1EC = 1; - tempRacer->unk1EB = 0; + if ((gCurrentButtonsPressed & R_TRIG) && tempRacer->tapTimerR) { + tempRacer->tappedR = TRUE; + tempRacer->tapTimerR = 0; } else if (gCurrentButtonsPressed & R_TRIG) { - tempRacer->unk1EB = 22; + tempRacer->tapTimerR = 22; } - if (tempRacer->unk1EB > 0) { - tempRacer->unk1EB -= updateRate; + if (tempRacer->tapTimerR > 0) { + tempRacer->tapTimerR -= updateRate; } else { - tempRacer->unk1EB = 0; + tempRacer->tapTimerR = 0; } if (tempRacer->shieldTimer > 0) { if (tempRacer->shieldTimer > 60) { @@ -2905,7 +2905,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR // If currently braking, do something idk if (racer->brake > 0.4) { if (racer->velocity < -2.0 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 1); + rumble_set(racer->playerIndex, RUMBLE_TYPE_1); } sp60 = TRUE; if (gCurrentPlayerIndex >= PLAYER_ONE) { @@ -3012,7 +3012,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->drifting == 0 && racer->unk1FB == 0)) { sp60 = 1; if (racer->unk1FB != 0 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 0); + rumble_set(racer->playerIndex, RUMBLE_TYPE_0); } if (racer->y_rotation_vel < 0) { obj->unk74 |= 0x1000 | 0x400; @@ -3126,7 +3126,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } // no clue :) if (surfaceType == SURFACE_SAND && racer->velocity < -2.0 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 0); + rumble_set(racer->playerIndex, RUMBLE_TYPE_0); } miscAsset = (f32 *) get_misc_asset(ASSET_MISC_8); // Degrade lateral velocity @@ -3171,7 +3171,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer_play_sound(obj, SOUND_ZIP_PAD_BOOST); play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 0x82); if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } } // Slow down gradually when not acellerating and almost at a standstill @@ -3303,12 +3303,12 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->forwardVel -= (racer->forwardVel + (racer->velocity * 0.05)) * 0.125; //!@Delta racer->unk1E8 = racer->steerAngle; racer->unk110 = gCurrentCarSteerVel; - if (racer->unk1E0 != 0) { + if (racer->trickType != 0) { if (gCurrentPlayerIndex != PLAYER_COMPUTER) { if (racer->wheel_surfaces[0] != SURFACE_NONE) { D_8011D550 = D_800DCCCC[racer->wheel_surfaces[0]]; - *((s16 *) &D_8011D552) = racer->unk1E0; // necessary because a different function expects a char. - racer->unk1E0 = 0; + *((s16 *) &D_8011D552) = racer->trickType; // necessary because a different function expects a char. + racer->trickType = 0; } } } @@ -3605,7 +3605,7 @@ void racer_spinout_car(Object *obj, Object_Racer *racer, s32 updateRate, f32 upd racer->velocity *= 0.97; //!@Delta: Reduces 3% of speed per frame, not accounting for game speed. racer->lateral_velocity = 0.0f; if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 0); + rumble_set(racer->playerIndex, RUMBLE_TYPE_0); } angleVel = racer->y_rotation_vel; if (gCurrentPlayerIndex > PLAYER_COMPUTER) { @@ -3776,7 +3776,7 @@ void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateR if (steerAngle > 127) { steerAngle = 127; } - racer->unk1E0 = steerAngle; + racer->trickType = steerAngle; } obj->unk74 = 0; } @@ -4433,7 +4433,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) } magnetTarget = NULL; if (gCurrentButtonsPressed & Z_TRIG) { - func_800A74EC(SOUND_VOICE_TT_POWERUP, racer->playerIndex); + hud_sound_stop(SOUND_VOICE_TT_POWERUP, racer->playerIndex); } if (racer->magnetLevel3) { if (racer->magnetTimer == 0) { @@ -4471,13 +4471,13 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) break; } } - objID = 29; + objID = ASSET_OBJECT_ID_MISSILE; if (gCurrentButtonsReleased & Z_TRIG) { velocity = 30.0f; switch (weaponID) { case WEAPON_ROCKET_HOMING: objDist = -10.0f; - objID = 229; + objID = ASSET_OBJECT_ID_HOMING; break; case WEAPON_ROCKET: objDist = -10.0f; @@ -4486,13 +4486,13 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) case WEAPON_UNK_11: objDist = 10.0f; velocity = -2.0f; - objID = 14; + objID = ASSET_OBJECT_ID_BOMB; break; case WEAPON_OIL_SLICK: if (racer->vehicleID != VEHICLE_PLANE) { - objID = 130; + objID = ASSET_OBJECT_ID_OILSLICK; } else { - objID = 235; + objID = ASSET_OBJECT_ID_SMOKECLOUD; } objDist = 10.0f; velocity = -2.0f; @@ -4500,7 +4500,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) case WEAPON_BUBBLE_TRAP: objDist = 10.0f; velocity = -2.0f; - objID = 46; + objID = ASSET_OBJECT_ID_BUBBLEWEAPON; intendedTarget = NULL; break; case WEAPON_NITRO_LEVEL_1: @@ -4537,10 +4537,10 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) racer->balloon_quantity -= 1; if (weaponID == WEAPON_NITRO_LEVEL_1) { if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 6); + rumble_set(racer->playerIndex, RUMBLE_TYPE_6); } } else if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 8); + rumble_set(racer->playerIndex, RUMBLE_TYPE_8); } return; case WEAPON_MAGNET_LEVEL_1: @@ -4552,7 +4552,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) racer->magnetModelID = (weaponID - WEAPON_MAGNET_LEVEL_1) >> 1; } if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 15); + rumble_set(racer->playerIndex, RUMBLE_TYPE_15); } } return; @@ -4567,7 +4567,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) magnetTarget->racer.magnetModelID = MAGNET_LEVEL3; } if (racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 15); + rumble_set(racer->playerIndex, RUMBLE_TYPE_15); } } return; @@ -4862,7 +4862,7 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { } } if (racer->boostTimer && !gRaceStartTimer && timer3 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 6); + rumble_set(racer->playerIndex, RUMBLE_TYPE_6); } if (gRaceStartTimer < 80 && gCurrentButtonsPressed & A_BUTTON) { racer->startInput = 1; @@ -4952,7 +4952,7 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { newObject.y = pos[1] + (s32) obj->segment.trans.y_position; newObject.z = pos[2] + (s32) obj->segment.trans.z_position; newObject.size = 8; - newObject.objectID = BHV_OVERRIDE_POS; + newObject.objectID = ASSET_OBJECT_ID_COIN; i = number; do { if (get_current_level_race_type() != RACETYPE_CHALLENGE) { diff --git a/src/save_data.c b/src/save_data.c index 94fdfc18..6cb8677f 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -21,7 +21,7 @@ u8 gN64FontCodes[] = "\0 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#' u8 sControllerPaksPresent = 0; // Bits 0, 1, 2, and 3 of the bit pattern correspond to Controllers 1, 2, 3, and 4. // 1 if a controller pak is present -s32 D_800DE48C = 0; +s32 gRumbleKillTimer = 0; /*******************************/ @@ -68,21 +68,24 @@ UNUSED const char D_800E7750[] = "warning: corrupt ghost\n"; /************ .bss ************/ OSMesgQueue *sControllerMesgQueue; -s32 D_80124014; +UNUSED s32 D_80124014; OSPfs pfs[MAXCONTROLLERS]; /* Size: 0xA bytes */ -typedef struct unk_801241B8 { - /* 0x00 */ s16 unk0; - /* 0x02 */ s16 unk2; - /* 0x04 */ s16 unk4; - /* 0x06 */ s16 unk6; - /* 0x08 */ s16 unk8; -} unk_801241B8; -unk_801241B8 D_801241B8[MAXCONTROLLERS]; +typedef struct RumbleData { + /* 0x00 */ s16 rumbleType; // Which rumble type was called + /* 0x02 */ s16 initialStrength; // What lingeringStrength gets set to when it hits zero. + /* 0x04 */ s16 timer; // Time left to spin the motor + /* 0x06 */ s16 lingeringStrength; // Timer that decides to continue spinning the motor + /* 0x08 */ s16 spinTime; // Time the motor has been spinning +} RumbleData; +RumbleData gRumble[MAXCONTROLLERS]; -s16 *sUnkMiscAsset19; // Misc Asset 19 +#define RUMBLE_DURATION (type * 2) + 1 // Accesses the second byte of the rumble table. +#define RUMBLE_STRENGTH (type * 2) // Accesses the first byte of the rumble table. + +s16 *sRumbleTable; // Misc Asset 19, first byte is strength, second byte is duration. /** * Values for Misc Asset 19 * 00 2D 00 12 @@ -105,11 +108,11 @@ s16 *sUnkMiscAsset19; // Misc Asset 19 * 00 28 00 0A * 00 64 00 0F **/ -u8 D_801241E4; -u8 sRumblePaksPresent; // Bits 0, 1, 2, and 3 of the bit pattern correspond to Controllers 1, 2, 3, and 4. - // 1 if a rumble pak is present -u8 D_801241E6; -u8 D_801241E7; +u8 gRumbleOn; +u8 gRumblePresent; // Bits 0, 1, 2, and 3 of the bit pattern correspond to Controllers 1, 2, 3, and 4. + // 1 if a rumble pak is present +u8 gRumbleIdle; // Bitfield showing which rumble paks are not spinning. +u8 gRumbleActive; // Bitfield showing which rumble paks are currently spinning. s32 gRumbleDetectionTimer; u8 *D_801241EC; u32 D_801241F0; @@ -117,191 +120,215 @@ u32 D_801241F4; /*******************************/ -// Guessing, but maybe this gets player id from controller index, -// but it might check for something like jointventure and will return -// the same value for controllers one and two? -u8 func_80072250(s32 arg0) { - if ((arg0 == 0 || arg0 == 1) && func_8000E158()) { - arg0 = 1 - arg0; +/** + * Returns the player ID of the controller. Flips them around in 2 player adventure if the players have been swapped. + */ +u8 input_get_id(s32 controllerIndex) { + if ((controllerIndex == 0 || controllerIndex == 1) && func_8000E158()) { + controllerIndex = 1 - controllerIndex; } - return get_player_id(arg0); + return get_player_id(controllerIndex); } -void func_80072298(u8 arg0) { - D_801241E4 = arg0; - if (arg0) { - gRumbleDetectionTimer = 0x79; - D_801241E6 = 0xF; +/** + * Reset the rumble state for all controllers and set whether or not to allow rumble. + */ +void rumble_init(u8 canRumble) { + gRumbleOn = canRumble; + if (canRumble) { + gRumbleDetectionTimer = 121; + gRumbleIdle = 0xF; return; } - func_80072708(); + rumble_kill(); } -UNUSED s32 func_800722E8(s16 controllerIndex) { - s32 temp; +/** + * Check if the controller has a rumble pak inserted. + */ +UNUSED s32 rumble_exists(s16 controllerIndex) { + s32 cont; if (controllerIndex < 0 || controllerIndex >= 4) { - return 0; + return FALSE; } - temp = ((1 << func_80072250(controllerIndex)) & 0xFF); - return sRumblePaksPresent & temp; + cont = ((1 << input_get_id(controllerIndex)) & 0xFF); + return gRumblePresent & cont; } -void func_80072348(s16 controllerIndex, u8 arg1) { +/** + * Enable rumble for the controller using a behaviour table set by type. + */ +void rumble_set(s16 controllerIndex, u8 type) { s32 index; - if (arg1 < 19 && controllerIndex >= 0 && controllerIndex < 4) { - index = (func_80072250(controllerIndex)) & 0xFFFF; - if (D_801241B8[index].unk0 == arg1) { - if (D_801241B8[index].unk8 < 0) { - D_801241B8[index].unk8 = -300; + if (type < 19 && controllerIndex >= 0 && controllerIndex < 4) { + index = (input_get_id(controllerIndex)) & 0xFFFF; + if (gRumble[index].rumbleType == type) { + if (gRumble[index].spinTime < 0) { + gRumble[index].spinTime = -300; } - D_801241B8[index].unk4 = sUnkMiscAsset19[(arg1 * 2) + 1]; + gRumble[index].timer = sRumbleTable[RUMBLE_DURATION]; } else { - D_801241B8[index].unk0 = arg1; - if (sUnkMiscAsset19[arg1 * 2] != 0) { - func_80072578(controllerIndex, sUnkMiscAsset19[arg1 * 2], sUnkMiscAsset19[(arg1 * 2) + 1]); + gRumble[index].rumbleType = type; + if (sRumbleTable[RUMBLE_STRENGTH] != 0) { + rumble_start(controllerIndex, sRumbleTable[RUMBLE_STRENGTH], sRumbleTable[RUMBLE_DURATION]); } } } } -void func_80072424(s16 controllerIndex, u8 arg1, f32 arg2) { +/** + * Enable rumble for the controller using a behaviour table set by type. + * Also control the strength arbitrarily. + */ +void rumble_set_fade(s16 controllerIndex, u8 type, f32 strength) { s32 index; - if (arg1 < 19 && controllerIndex >= 0 && controllerIndex < 4) { - index = func_80072250(controllerIndex) & 0xFFFF; - if (arg1 == D_801241B8[index].unk0) { - if (D_801241B8[index].unk8 < 0) { - D_801241B8[index].unk8 = -300; + if (type < 19 && controllerIndex >= 0 && controllerIndex < 4) { + index = input_get_id(controllerIndex) & 0xFFFF; + if (type == gRumble[index].rumbleType) { + if (gRumble[index].spinTime < 0) { + gRumble[index].spinTime = -300; } - D_801241B8[index].unk4 = sUnkMiscAsset19[(arg1 * 2) + 1]; + gRumble[index].timer = sRumbleTable[RUMBLE_DURATION]; } else { - if (arg2 < 0.0f) { - arg2 = 0.0f; + if (strength < 0.0f) { + strength = 0.0f; } - if (arg2 > 1.0f) { - arg2 = 1.0f; + if (strength > 1.0f) { + strength = 1.0f; } - D_801241B8[index].unk0 = arg1; - if (sUnkMiscAsset19[arg1 * 2] != 0) { - func_80072578(controllerIndex, (sUnkMiscAsset19[arg1 * 2] * arg2), sUnkMiscAsset19[(arg1 * 2) + 1]); + gRumble[index].rumbleType = type; + if (sRumbleTable[RUMBLE_STRENGTH] != 0) { + rumble_start(controllerIndex, (sRumbleTable[RUMBLE_STRENGTH] * strength), + sRumbleTable[RUMBLE_DURATION]); } } } } -void func_80072578(s16 controllerIndex, s16 arg1, s16 arg2) { +/** + * Check the controller should be able to rumble, then enable rumble for it. + */ +void rumble_start(s16 controllerIndex, s16 strength, s16 timer) { s16 index; - u8 new_var; + u8 contBit; - if (D_801241E4 && controllerIndex >= 0 && controllerIndex < 4) { - new_var = func_80072250(controllerIndex); + if (gRumbleOn && controllerIndex >= 0 && controllerIndex < 4) { + contBit = input_get_id(controllerIndex); index = 0xFFFF; - index &= new_var; - new_var = 1 << index; - D_801241E6 |= new_var; - D_801241E7 &= ~new_var; - D_801241B8[index].unk6 = ((arg1 * arg1) * 0.1); - D_801241B8[index].unk2 = ((arg1 * arg1) * 0.1); - D_801241B8[index].unk4 = arg2; + index &= contBit; + contBit = 1 << index; + gRumbleIdle |= contBit; + gRumbleActive &= ~contBit; + gRumble[index].lingeringStrength = ((strength * strength) * 0.1); + gRumble[index].initialStrength = ((strength * strength) * 0.1); + gRumble[index].timer = timer; } } -UNUSED void func_8007267C(s16 controllerIndex) { +/** + * Stop ongoing rumble for the given controller. + */ +UNUSED void rumble_stop(s16 controllerIndex) { s16 index; if (controllerIndex >= 0 && controllerIndex < 4) { - index = func_80072250(controllerIndex); - D_801241E7 |= 1 << index; - D_801241B8[index].unk4 = -1; - D_801241B8[index].unk0 = -1; - D_801241B8[index].unk8 = 0; + index = input_get_id(controllerIndex); + gRumbleActive |= 1 << index; + gRumble[index].timer = -1; + gRumble[index].rumbleType = -1; + gRumble[index].spinTime = 0; } } -/* Official Name: RumbleKill? */ -void func_80072708(void) { - D_800DE48C = 3; +/** + * Stop all rumble pak activity. + */ +void rumble_kill(void) { + gRumbleKillTimer = 3; } -/* Official Name: rumbleTick */ -void rumble_controllers(s32 updateRate) { - unk_801241B8 *temp; +/** + * Loop through and detect any newly connected or disconnected rumble paks. + * Start and stop any motors set by gRumble, or stop activity altogether if requested. + */ +void rumble_update(s32 updateRate) { + RumbleData *pak; s32 pfsStatus; u8 i; u8 controllerToCheck; u8 pfsBitPattern; - if ((D_801241E6 != 0) || ((D_800DE48C != 0))) { + if (gRumbleIdle != 0 || gRumbleKillTimer != 0) { gRumbleDetectionTimer += updateRate; - if (gRumbleDetectionTimer >= 121) { + if (gRumbleDetectionTimer > 120) { gRumbleDetectionTimer = 0; osPfsIsPlug(sControllerMesgQueue, &pfsBitPattern); for (i = 0, controllerToCheck = 1; i < MAXCONTROLLERS; i++, controllerToCheck <<= 1) { - if ((pfsBitPattern & controllerToCheck) && !(~D_801241E6 & sRumblePaksPresent & controllerToCheck)) { + if ((pfsBitPattern & controllerToCheck) && !(~gRumbleIdle & gRumblePresent & controllerToCheck)) { if (osMotorInit(sControllerMesgQueue, &pfs[i], i) != 0) { - D_801241E6 &= ~controllerToCheck; - D_801241E7 &= ~controllerToCheck; - sRumblePaksPresent &= ~controllerToCheck; + gRumbleIdle &= ~controllerToCheck; + gRumbleActive &= ~controllerToCheck; + gRumblePresent &= ~controllerToCheck; } else { - sRumblePaksPresent |= controllerToCheck; + gRumblePresent |= controllerToCheck; } } } } - if ((sRumblePaksPresent != 0) || (D_800DE48C != 0)) { + if (gRumblePresent != 0 || gRumbleKillTimer != 0) { pfsStatus = 0; - if (D_800DE48C != 0) { + if (gRumbleKillTimer != 0) { osPfsIsPlug(sControllerMesgQueue, &pfsBitPattern); } - for (i = 0, controllerToCheck = 1, temp = D_801241B8; i < MAXCONTROLLERS; - i++, controllerToCheck <<= 1, temp++) { - if (D_800DE48C != 0) { - temp->unk0 = temp->unk6 = temp->unk4 = -1; + for (i = 0, controllerToCheck = 1, pak = gRumble; i < MAXCONTROLLERS; i++, controllerToCheck <<= 1, pak++) { + if (gRumbleKillTimer != 0) { + pak->rumbleType = pak->lingeringStrength = pak->timer = -1; if (!(pfsBitPattern & controllerToCheck)) { continue; } else if (osMotorInit(sControllerMesgQueue, &pfs[i], i) == 0) { osMotorStop(&pfs[i]); } - } else if (D_801241E6 & sRumblePaksPresent & controllerToCheck) { - if (temp->unk4 <= 0) { - D_801241E6 &= ~controllerToCheck; - temp->unk0 = -1; - temp->unk8 = 0; + } else if (gRumbleIdle & gRumblePresent & controllerToCheck) { + if (pak->timer <= 0) { + gRumbleIdle &= ~controllerToCheck; + pak->rumbleType = -1; + pak->spinTime = 0; osMotorStop(&pfs[i]); } else { - temp->unk4 -= updateRate; - temp->unk8 += updateRate; - if (temp->unk8 < 0) { + pak->timer -= updateRate; + pak->spinTime += updateRate; + if (pak->spinTime < 0) { continue; - } else if (temp->unk8 >= 601) { - D_801241E6 &= ~controllerToCheck; - temp->unk0 = -1; - temp->unk8 = -300; + } else if (pak->spinTime > 600) { + gRumbleIdle &= ~controllerToCheck; + pak->rumbleType = -1; + pak->spinTime = -300; osMotorStop(&pfs[i]); } else { - if (temp->unk2 > 490.0) { - if (!(D_801241E7 & controllerToCheck)) { + if (pak->initialStrength > 490.0) { + if (!(gRumbleActive & controllerToCheck)) { pfsStatus |= osMotorStart(&pfs[i]); - D_801241E7 |= controllerToCheck; + gRumbleActive |= controllerToCheck; } - } else if (temp->unk2 < 3.6) { - if (D_801241E7 & controllerToCheck) { + } else if (pak->initialStrength < 3.6) { + if (gRumbleActive & controllerToCheck) { pfsStatus |= osMotorStop(&pfs[i]); - D_801241E7 &= ~controllerToCheck; + gRumbleActive &= ~controllerToCheck; } - } else if (temp->unk6 >= 256) { - if (!(D_801241E7 & controllerToCheck)) { + } else if (pak->lingeringStrength >= 256) { + if (!(gRumbleActive & controllerToCheck)) { pfsStatus |= osMotorStart(&pfs[i]); - D_801241E7 |= controllerToCheck; + gRumbleActive |= controllerToCheck; } - temp->unk6 -= 256; + pak->lingeringStrength -= 256; } else { - if (D_801241E7 & controllerToCheck) { + if (gRumbleActive & controllerToCheck) { pfsStatus |= osMotorStop(&pfs[i]); - D_801241E7 &= ~controllerToCheck; + gRumbleActive &= ~controllerToCheck; } - temp->unk6 += temp->unk2 + 4; + pak->lingeringStrength += pak->initialStrength + 4; } if (1) {} // fakematch } @@ -309,10 +336,10 @@ void rumble_controllers(s32 updateRate) { } } if (pfsStatus != 0) { - sRumblePaksPresent = 0; + gRumblePresent = 0; } - if (D_800DE48C != 0) { - D_800DE48C--; + if (gRumbleKillTimer != 0) { + gRumbleKillTimer--; } } } @@ -1693,12 +1720,12 @@ void init_controller_paks(void) { s8 maxControllers; sControllerMesgQueue = get_si_mesg_queue(); - sUnkMiscAsset19 = (s16 *) get_misc_asset(ASSET_MISC_19); - D_801241E6 = D_801241E7 = 0xF; - D_801241E4 = TRUE; + sRumbleTable = (s16 *) get_misc_asset(ASSET_MISC_RUMBLE_DATA); + gRumbleIdle = gRumbleActive = 0xF; + gRumbleOn = TRUE; gRumbleDetectionTimer = 0; - D_800DE48C = 1; - sControllerPaksPresent = sRumblePaksPresent = 0; + gRumbleKillTimer = 1; + sControllerPaksPresent = gRumblePresent = 0; // pakPattern will set the first 4 bits representing each controller // and it will be 1 if there's something attached. @@ -1706,10 +1733,10 @@ void init_controller_paks(void) { for (controllerIndex = 0, controllerBit = 1, maxControllers = MAXCONTROLLERS; (0, controllerIndex) != maxControllers; controllerIndex++, controllerBit <<= 1) { - D_801241B8[controllerIndex].unk2 = 0; - D_801241B8[controllerIndex].unk4 = -1; - D_801241B8[controllerIndex].unk0 = -1; - D_801241B8[controllerIndex].unk6 = D_801241B8[controllerIndex].unk2; + gRumble[controllerIndex].initialStrength = 0; + gRumble[controllerIndex].timer = -1; + gRumble[controllerIndex].rumbleType = -1; + gRumble[controllerIndex].lingeringStrength = gRumble[controllerIndex].initialStrength; // If something is plugged into the controller if (pakPattern & controllerBit) { @@ -1725,7 +1752,7 @@ void init_controller_paks(void) { ret = osMotorInit(sControllerMesgQueue, &pfs[controllerIndex], controllerIndex); if (ret == 0) { // If we found a rumble pak, set the bit that has one - sRumblePaksPresent |= controllerBit; + gRumblePresent |= controllerBit; } } } @@ -1742,7 +1769,7 @@ UNUSED SIDeviceStatus check_for_rumble_pak(s32 controllerIndex) { start_reading_controller_data(controllerIndex); if (ret == CONTROLLER_PAK_RUMBLE_PAK_FOUND) { - sRumblePaksPresent |= 1 << controllerIndex; + gRumblePresent |= 1 << controllerIndex; } return ret; diff --git a/src/save_data.h b/src/save_data.h index 38cce2d1..795966e7 100644 --- a/src/save_data.h +++ b/src/save_data.h @@ -55,17 +55,41 @@ typedef enum { SAVE_FILE_TYPE_UNKA //Game Pak Bonuses? } SaveFileType; +enum RumbleTypes { + RUMBLE_TYPE_0, + RUMBLE_TYPE_1, + RUMBLE_TYPE_2, + RUMBLE_TYPE_3, + RUMBLE_TYPE_4, + RUMBLE_TYPE_5, + RUMBLE_TYPE_6, + RUMBLE_TYPE_7, + RUMBLE_TYPE_8, + RUMBLE_TYPE_9, + RUMBLE_TYPE_10, + RUMBLE_TYPE_11, + RUMBLE_TYPE_12, + RUMBLE_TYPE_13, + RUMBLE_TYPE_14, + RUMBLE_TYPE_15, + RUMBLE_TYPE_16, + RUMBLE_TYPE_17, + RUMBLE_TYPE_18, + RUMBLE_TYPE_19, + RUMBLE_TYPE_20, +}; + extern s8 *D_800DE440; extern u8 gN64FontCodes[68]; -extern s32 D_800DE48C; +extern s32 gRumbleKillTimer; extern OSPfs pfs[MAXCONTROLLERS]; extern int bcmp(const void *, const void *, int); size_t strlen(const char *str); -u8 func_80072250(s32 arg0); -void func_80072298(u8 arg0); -s32 func_800722E8(s16 controllerIndex); -void func_80072708(void); +u8 input_get_id(s32 controllerIndex); +void rumble_init(u8 canRumble); +s32 rumble_exists(s16 controllerIndex); +void rumble_kill(void); s32 get_game_data_file_size(void); s32 get_time_data_file_size(void); s32 read_game_data_from_controller_pak(s32 controllerIndex, char *fileExt, Settings *settings); @@ -97,10 +121,10 @@ SIDeviceStatus write_controller_pak_file(s32 controllerIndex, s32 fileNumber, ch SIDeviceStatus get_file_size(s32 controllerIndex, s32 fileNum, s32 *fileSize); char *font_codes_to_string(char *inString, char *outString, s32 stringLength); SaveFileType get_file_type(s32 controllerIndex, s32 fileNum); -void func_80072578(s16 controllerIndex, s16 arg1, s16 arg2); -void func_80072348(s16 controllerIndex, u8 arg1); -void func_80072424(s16 controllerIndex, u8 arg1, f32 arg2); -void rumble_controllers(s32 updateRate); +void rumble_start(s16 controllerIndex, s16 strength, s16 timer); +void rumble_set(s16 controllerIndex, u8 type); +void rumble_set_fade(s16 controllerIndex, u8 type, f32 strength); +void rumble_update(s32 updateRate); void init_controller_paks(void); void func_80072E28(s32 arg0, u32 arg1); s32 func_80072C54(s32 arg0); diff --git a/src/thread3_main.c b/src/thread3_main.c index 0c0ba36b..18656240 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -146,7 +146,7 @@ void thread3_main(UNUSED void *unused) { gGameMode = GAMEMODE_INTRO; while (1) { if (is_reset_pressed()) { - func_80072708(); + rumble_kill(); audioStopThread(); stop_thread30(); __osSpSetStatus(SP_SET_HALT | SP_CLR_INTR_BREAK | SP_CLR_YIELD | SP_CLR_YIELDED | SP_CLR_TASKDONE | @@ -203,7 +203,7 @@ void init_game(void) { tex_init_textures(); allocate_object_model_pools(); allocate_object_pools(); - diPrintfInit(); + debug_text_init(); allocate_ghost_data(); init_particle_assets(); init_weather(); @@ -300,7 +300,7 @@ void main_game_loop(void) { // menus & gameplay. sound_update_queue(sLogicUpdateRate); - print_debug_strings(&gCurrDisplayList); + debug_text_print(&gCurrDisplayList); render_dialogue_boxes(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList); close_dialogue_box(4); assign_dialogue_box_id(4); @@ -376,7 +376,7 @@ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v func_8001BF20(); osSetTime(0); set_free_queue_state(2); - func_80072298(1); + rumble_init(TRUE); } /** @@ -1430,23 +1430,27 @@ void default_alloc_displaylist_heap(void) { gCurrNumHudVertsPerPlayer = gNumHudVertsPerPlayer[numberOfPlayers]; } -void func_8006F140(s32 arg0) { +/** + * Set a delayed level trigger and a transition. + * Once the timer hits zero, the level will change. + */ +void level_transition_begin(s32 type) { if (gLevelLoadTimer == 0) { gLevelLoadTimer = 40; gLevelLoadType = LEVEL_LOAD_NORMAL; D_80123526 = 0; - if (arg0 == 1) { // FADE_BARNDOOR_HORIZONTAL? + if (type == 1) { // FADE_BARNDOOR_HORIZONTAL? transition_begin(&gLevelFadeOutTransition); } - if (arg0 == 3) { // FADE_CIRCLE? + if (type == 3) { // FADE_CIRCLE? gLevelLoadTimer = 282; transition_begin(&D_800DD424); } - if (arg0 == 4) { // FADE_WAVES? + if (type == 4) { // FADE_WAVES? gLevelLoadTimer = 360; transition_begin(&D_800DD424); } - if (arg0 == 0) { // FADE_FULLSCREEN? + if (type == 0) { // FADE_FULLSCREEN? gLevelLoadTimer = 2; } } diff --git a/src/thread3_main.h b/src/thread3_main.h index 2260e9bc..449b34f9 100644 --- a/src/thread3_main.h +++ b/src/thread3_main.h @@ -157,7 +157,7 @@ void mark_save_file_to_erase(s32 saveFileIndex); void mark_read_eeprom_settings(void); void mark_write_eeprom_settings(void); s32 check_dmem_validity(void); -void func_8006F140(s32 arg0); +void level_transition_begin(s32 type); void func_8006F20C(void); void begin_trophy_race_teleport(void); void begin_lighthouse_rocket_cutscene(void); diff --git a/src/tracks.c b/src/tracks.c index 51b98061..6435177f 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -720,7 +720,7 @@ void spawn_skydome(s32 objectID) { gSkydomeSegment = spawn_object(&spawnObject, 2); if (gSkydomeSegment != NULL) { gSkydomeSegment->segment.level_entry = NULL; - gSkydomeSegment->unk4A = -1; + gSkydomeSegment->objectID = -1; } } diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index 208bc8af..f84553ea 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -203,7 +203,7 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra if (racer->raceFinished) { if (gBlueyCutsceneTimer == 0) { gBlueyCutsceneTimer = 1; - func_8005CB68(racer, &gBlueyCutsceneTimer); + racer_boss_finish(racer, &gBlueyCutsceneTimer); } } } diff --git a/src/vehicle_bubbler.c b/src/vehicle_bubbler.c index 7878d3bb..e117808a 100644 --- a/src/vehicle_bubbler.c +++ b/src/vehicle_bubbler.c @@ -135,9 +135,9 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * if (racer->playerIndex == PLAYER_COMPUTER) { temp2 = func_80023568(); if (temp2 != 0) { - objectID = 0x110; + objectID = ASSET_OBJECT_ID_OCTOBUBBLE; if (temp2 == 6) { - objectID = 0x12A; + objectID = ASSET_OBJECT_ID_OCTOBOMB; } spawn_boss_hazard(obj, racer, 0.0f, objectID, SOUND_VOICE_BUBBLER_HOHO2); } @@ -178,7 +178,7 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * if (racer->raceFinished) { if (gBubblerCutsceneTimer == 0) { gBubblerCutsceneTimer = 1; - func_8005CB68(racer, &gBubblerCutsceneTimer); + racer_boss_finish(racer, &gBubblerCutsceneTimer); } } } diff --git a/src/vehicle_misc.h b/src/vehicle_misc.h index a1a7e820..7d08a1b6 100644 --- a/src/vehicle_misc.h +++ b/src/vehicle_misc.h @@ -16,9 +16,9 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r void spawn_boss_hazard(Object *obj, Object_Racer *racer, f32 offset, s32 objectID, s32 soundID); void racer_special_init(Object *object, Object_Racer *racer); void set_boss_voice_clip_offset(u16 *soundID); -void func_8005CA84(f32 x, f32 y, f32 z, s32 offset); +void racer_boss_sound_spatial(f32 x, f32 y, f32 z, s32 offset); void play_random_boss_sound(s32 offset); void fade_when_near_camera(Object *object, Object_Racer *racer, s32 distance); -void func_8005CB68(Object_Racer *racer, s8 *arg1); +void racer_boss_finish(Object_Racer *racer, s8 *sceneTimer); #endif diff --git a/src/vehicle_rocket.c b/src/vehicle_rocket.c index b0004f44..91dcbdef 100644 --- a/src/vehicle_rocket.c +++ b/src/vehicle_rocket.c @@ -53,7 +53,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r ObjectModel *objModel; set_boss_voice_clip_offset((u16 *) gRocketVoiceTable); - racer->unk1EC = 0; + racer->tappedR = 0; animID = obj->segment.object.animationID; animFrame = obj->segment.animFrame; tempHeadAngle = racer->headAngle; @@ -156,7 +156,7 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (racer->raceFinished != 0) { if (gRocketCutsceneTimer == 0) { gRocketCutsceneTimer = 1; - func_8005CB68(racer, &gRocketCutsceneTimer); + racer_boss_finish(racer, &gRocketCutsceneTimer); } } } diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index 167654cd..33c971a3 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -235,7 +235,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } if (racer->vehicleIDPrev == VEHICLE_SMOKEY && racer->playerIndex == PLAYER_COMPUTER && func_80023568()) { - spawn_boss_hazard(obj, racer, 100.0f, 137, SOUND_VOICE_TRICKY_HM); + spawn_boss_hazard(obj, racer, 100.0f, ASSET_OBJECT_ID_FIREBALL, SOUND_VOICE_TRICKY_HM); } func_800AFC3C(obj, updateRate); fade_when_near_camera(obj, racer, 40); @@ -271,7 +271,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (racer->raceFinished != FALSE) { if (gSmokeyCutsceneTimer == 0) { gSmokeyCutsceneTimer = 1; - func_8005CB68(racer, &gSmokeyCutsceneTimer); + racer_boss_finish(racer, &gSmokeyCutsceneTimer); } } } diff --git a/src/vehicle_tricky.c b/src/vehicle_tricky.c index c6824c6e..4e014f4e 100644 --- a/src/vehicle_tricky.c +++ b/src/vehicle_tricky.c @@ -204,7 +204,7 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (check_fadeout_transition() == 0 && is_in_two_player_adventure()) { swap_lead_player(); } - func_8006F140(1); + level_transition_begin(1); } if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_TRICKY_RUN) { @@ -213,7 +213,7 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (racer->raceFinished != FALSE) { if (gTrickyCutsceneTimer == 0) { gTrickyCutsceneTimer = 1; - func_8005CB68(racer, &gTrickyCutsceneTimer); + racer_boss_finish(racer, &gTrickyCutsceneTimer); } } } @@ -225,7 +225,11 @@ void set_boss_voice_clip_offset(u16 *soundID) { gBossSoundIDOffset = soundID; } -void func_8005CA84(f32 x, f32 y, f32 z, s32 offset) { +/** + * Add a random amount to offset, then play a random voice clip within that range. + * Also has worldspace values. + */ +void racer_boss_sound_spatial(f32 x, f32 y, f32 z, s32 offset) { s8 randomOffset = get_random_number_from_range(0, 1); if (offset == 0) { randomOffset = 0; @@ -246,20 +250,23 @@ void play_random_boss_sound(s32 offset) { sound_play(gBossSoundIDOffset[offset], NULL); } -// boss_race_finish -void func_8005CB68(Object_Racer *racer, s8 *arg1) { +/** + * Trigger a post-race cutscene that depends on which boss was fought, which attempt it was and if the player won or + * not. Save the game afterwards, writing the victory, and the cutscene having been seen. + */ +void racer_boss_finish(Object_Racer *racer, s8 *sceneTimer) { Settings *settings; s8 arg1_ret; s8 *asset; s32 worldBit; - s32 racerUnk1AC; + s32 finishPos; UNUSED s32 pad; s32 miscAsset68Byte5; s32 miscAsset68Byte6; s32 miscAsset68Byte7; s32 i; - arg1_ret = *arg1; + arg1_ret = *sceneTimer; settings = get_settings(); worldBit = (1 << settings->worldId); /* @@ -281,20 +288,20 @@ void func_8005CB68(Object_Racer *racer, s8 *arg1) { asset = (s8 *) get_misc_asset(ASSET_MISC_67); // 20 bytes - course id's array with world id index? for (i = 0; settings->courseId != asset[i]; i += 2) {} i = asset[i + 1]; - racerUnk1AC = racer->unk1AC; + finishPos = racer->finishPosition; if (arg1_ret == 1) { - if (racerUnk1AC == 1) { + if (finishPos == 1) { music_play(SEQUENCE_BATTLE_VICTORY); } else { music_play(SEQUENCE_BATTLE_LOSE); } if (settings->worldId == WORLD_CENTRAL_AREA || settings->worldId == WORLD_FUTURE_FUN_LAND) { - if (racerUnk1AC == 1) { + if (finishPos == 1) { settings->bosses |= worldBit; settings->courseFlagsPtr[settings->courseId] |= 2; } if (settings->worldId == WORLD_CENTRAL_AREA) { - if (racerUnk1AC == 1) { + if (finishPos == 1) { push_level_property_stack(SPECIAL_MAP_ID_UNK_NEG2, 0, VEHICLE_CAR, 0); push_level_property_stack(miscAsset68Byte5, 0, -1, 0); push_level_property_stack(i, 0, -1, 1); @@ -302,7 +309,7 @@ void func_8005CB68(Object_Racer *racer, s8 *arg1) { push_level_property_stack(SPECIAL_MAP_ID_UNK_NEG10, 0, VEHICLE_CAR, 0); push_level_property_stack(i, 0, -1, 2); } - } else if (racerUnk1AC == 1) { + } else if (finishPos == 1) { set_eeprom_settings_value(1); // Set Adventure Two Unlocked push_level_property_stack(SPECIAL_MAP_ID_UNK_NEG2, 0, VEHICLE_CAR, 0); push_level_property_stack(miscAsset68Byte7, 0, -1, 0); @@ -312,30 +319,30 @@ void func_8005CB68(Object_Racer *racer, s8 *arg1) { push_level_property_stack(SPECIAL_MAP_ID_UNK_NEG10, 0, VEHICLE_CAR, 0); push_level_property_stack(i, 0, -1, 2); } - if (racerUnk1AC == 1) { - func_8006F140(4); + if (finishPos == 1) { + level_transition_begin(4); } else { - func_8006F140(3); + level_transition_begin(3); } arg1_ret++; - *arg1 = arg1_ret; + *sceneTimer = arg1_ret; return; } if (settings->courseFlagsPtr[settings->courseId] & 2) { - if (racerUnk1AC == 1) { - func_8006F140(4); + if (finishPos == 1) { + level_transition_begin(4); instShowBearBar(); } else { - func_8006F140(3); + level_transition_begin(3); if (is_in_two_player_adventure()) { swap_lead_player(); } } arg1_ret++; - *arg1 = arg1_ret; + *sceneTimer = arg1_ret; return; } - if (racerUnk1AC == 1) { + if (finishPos == 1) { settings->courseFlagsPtr[settings->courseId] |= 2; if (!(settings->bosses & worldBit)) { settings->bosses |= worldBit; @@ -368,17 +375,17 @@ void func_8005CB68(Object_Racer *racer, s8 *arg1) { push_level_property_stack(i, 4, -1, 4); } } - func_8006F140(4); + level_transition_begin(4); instShowBearBar(); } else { push_level_property_stack(SPECIAL_MAP_ID_UNK_NEG10, 0, VEHICLE_CAR, 0); push_level_property_stack(i, 5, -1, 5); - func_8006F140(3); + level_transition_begin(3); } arg1_ret++; safe_mark_write_save_file(get_save_file_index()); } - *arg1 = arg1_ret; + *sceneTimer = arg1_ret; } /** diff --git a/src/vehicle_wizpig.c b/src/vehicle_wizpig.c index beb99bc5..de801e9c 100644 --- a/src/vehicle_wizpig.c +++ b/src/vehicle_wizpig.c @@ -58,7 +58,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r Object_68 *gfxData; set_boss_voice_clip_offset((u16 *) gWizpigVoiceTable); - racer->unk1EC = 0; + racer->tappedR = 0; animID = obj->segment.object.animationID; animFrame = obj->segment.animFrame; tempHeadAngle = racer->headAngle; @@ -227,7 +227,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } if (racer->playerIndex == PLAYER_COMPUTER) { if (func_80023568() != 0) { - spawn_boss_hazard(obj, racer, 100.0f, 0x89, SOUND_VOICE_TRICKY_HM); + spawn_boss_hazard(obj, racer, 100.0f, ASSET_OBJECT_ID_FIREBALL, SOUND_VOICE_TRICKY_HM); } } func_800AFC3C(obj, updateRate); @@ -241,7 +241,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (racer->raceFinished) { if (gWizpigCutsceneTimer == 0) { gWizpigCutsceneTimer = 1; - func_8005CB68(racer, &gWizpigCutsceneTimer); + racer_boss_finish(racer, &gWizpigCutsceneTimer); } } } diff --git a/src/waves.c b/src/waves.c index 3e3078ed..f2f5b435 100644 --- a/src/waves.c +++ b/src/waves.c @@ -82,7 +82,7 @@ const char D_800E9260[] = "\nError :: can not add another wave swell, reached li s32 D_80129FC0; s32 D_80129FC4; -unk80129FC8 D_80129FC8[1]; +unk80129FC8 D_80129FC8; s32 D_8012A018; f32 D_8012A01C; f32 D_8012A020[2]; @@ -121,9 +121,9 @@ s32 D_8012A5F4; UNUSED s32 D_8012A5F8; UNUSED s32 D_8012A5FC; s32 D_8012A600[72]; -f32 D_8012A720; -f32 D_8012A724; -s32 D_8012A728; +f32 gWavePowerBase; +f32 gWaveMagnitude; +s32 gWavePowerDivisor; /*****************************/ @@ -160,6 +160,7 @@ void free_waves(void) { } #ifdef NON_EQUIVALENT +// wave_init void func_800B7EB4(void) { s32 *var_v1; s32 temp_lo; @@ -173,11 +174,11 @@ void func_800B7EB4(void) { s32 var_t1; free_waves(); - D_800E3040 = (s32 *) allocate_from_main_pool_safe(D_80129FC8->unk20 << 2, COLOUR_TAG_CYAN); - D_800E3044 = (s32 *) allocate_from_main_pool_safe((D_80129FC8->unk4 << 2) * D_80129FC8->unk4, COLOUR_TAG_CYAN); + D_800E3040 = (s32 *) allocate_from_main_pool_safe(D_80129FC8.unk20 << 2, COLOUR_TAG_CYAN); + D_800E3044 = (s32 *) allocate_from_main_pool_safe((D_80129FC8.unk4 << 2) * D_80129FC8.unk4, COLOUR_TAG_CYAN); D_800E3048 = - (s32 *) allocate_from_main_pool_safe(((D_80129FC8->unk0 + 1) << 2) * (D_80129FC8->unk0 + 1), COLOUR_TAG_CYAN); - temp_lo = ((D_80129FC8->unk0 + 1) << 2) * (D_80129FC8->unk0 + 1); + (s32 *) allocate_from_main_pool_safe(((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1), COLOUR_TAG_CYAN); + temp_lo = ((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1); D_800E304C = allocate_from_main_pool_safe(temp_lo * 9, COLOUR_TAG_CYAN); // for (var_a1 = 1; var_a1 < 4; var_a1++) { @@ -195,8 +196,8 @@ void func_800B7EB4(void) { var_a1 += 4; } while (var_a1 < 9); - // temp_lo = (D_80129FC8->unk0 + 1) * 250 * (D_80129FC8->unk0 + 1); - temp_lo = ((((D_80129FC8->unk0 + 1) << 5) - D_80129FC8->unk0) * 10) * (D_80129FC8->unk0 + 1); + // temp_lo = (D_80129FC8.unk0 + 1) * 250 * (D_80129FC8.unk0 + 1); + temp_lo = ((((D_80129FC8.unk0 + 1) << 5) - D_80129FC8.unk0) * 10) * (D_80129FC8.unk0 + 1); if (D_8012A078 != 2) { D_800E3070[0] = (s32 *) allocate_from_main_pool_safe(temp_lo << 1, COLOUR_TAG_CYAN); D_800E3070[1] = (s32 *) ((u32) D_800E3070[0] + temp_lo); @@ -206,7 +207,7 @@ void func_800B7EB4(void) { D_800E3070[2] = (s32 *) ((u32) D_800E3070[1] + temp_lo); D_800E3070[3] = (s32 *) ((u32) D_800E3070[2] + temp_lo); } - temp_lo = (D_80129FC8->unk0 << 5) * D_80129FC8->unk0; + temp_lo = (D_80129FC8.unk0 << 5) * D_80129FC8.unk0; if (D_8012A078 != 2) { D_800E3080[0] = allocate_from_main_pool_safe(temp_lo << 1, COLOUR_TAG_CYAN); D_800E3080[1] = (s32 *) ((u32) D_800E3080[0] + temp_lo); @@ -216,41 +217,41 @@ void func_800B7EB4(void) { D_800E3080[2] = (s32 *) ((u32) D_800E3080[1] + temp_lo); D_800E3080[3] = (s32 *) ((u32) D_800E3080[2] + temp_lo); } - D_800E30D0 = load_texture(D_80129FC8->unk2C); + D_800E30D0 = load_texture(D_80129FC8.unk2C); } #else GLOBAL_ASM("asm/non_matchings/waves/func_800B7EB4.s") #endif -void func_800B8134(LevelHeader *arg0) { +void func_800B8134(LevelHeader *header) { if (D_8012A078 != 2) { - D_80129FC8->unk0 = arg0->unk56; + D_80129FC8.unk0 = header->unk56; } else { - D_80129FC8->unk0 = 4; + D_80129FC8.unk0 = 4; } - D_80129FC8->unk4 = arg0->unk57; - D_80129FC8->unk8 = arg0->unk58; - D_80129FC8->unkC = arg0->unk5A / 256.0f; - D_80129FC8->unk10 = arg0->unk59 << 8; - D_80129FC8->unk14 = arg0->unk5C; - D_80129FC8->unk18 = arg0->unk5E / 256.0f; - D_80129FC8->unk1C = arg0->unk5D << 8; - D_80129FC8->unk20 = arg0->unk60 & ~1; + D_80129FC8.unk4 = header->unk57; + D_80129FC8.unk8 = header->unk58; + D_80129FC8.unkC = header->unk5A / 256.0f; + D_80129FC8.unk10 = header->unk59 << 8; + D_80129FC8.unk14 = header->unk5C; + D_80129FC8.unk18 = header->unk5E / 256.0f; + D_80129FC8.unk1C = header->unk5D << 8; + D_80129FC8.unk20 = header->unk60 & ~1; if (D_8012A078 != 2) { - D_80129FC8->unk24 = arg0->unk6E; + D_80129FC8.unk24 = header->unk6E; } else { - D_80129FC8->unk24 = 3; + D_80129FC8.unk24 = 3; } - D_80129FC8->unk28 = arg0->unk71; - D_80129FC8->unk2C = arg0->unk68 & 0xFFFF; - D_80129FC8->unk30 = arg0->unk6A; - D_80129FC8->unk34 = arg0->unk6B; - D_80129FC8->unk38 = arg0->unk6C; - D_80129FC8->unk3C = arg0->unk6D; - D_80129FC8->unk40 = arg0->unk62 / 256.0f; - D_80129FC8->unk44 = arg0->unk64 / 256.0f; - D_80129FC8->unk48 = arg0->unk66 / 256.0f; - D_80129FC8->unk4C = arg0->unk70_u8; + D_80129FC8.unk28 = header->unk71; + D_80129FC8.unk2C = header->unk68 & 0xFFFF; + D_80129FC8.unk30 = header->unk6A; + D_80129FC8.unk34 = header->unk6B; + D_80129FC8.unk38 = header->unk6C; + D_80129FC8.unk3C = header->unk6D; + D_80129FC8.magnitude = header->wavePower / 256.0f; + D_80129FC8.unk44 = header->unk64 / 256.0f; + D_80129FC8.unk48 = header->unk66 / 256.0f; + D_80129FC8.unk4C = header->unk70_u8; } GLOBAL_ASM("asm/non_matchings/waves/func_800B82B4.s") @@ -296,7 +297,7 @@ void func_800BA288(s32 arg0, s32 arg1) { arg1 <<= 3; for (i = 0; i < D_8012A0E0; i++) { if (D_8012A0E8[D_800E30D8[i].unkB] & (1 << D_800E30D8[i].unkA)) { - if (D_80129FC8->unk28 != 0) { + if (D_80129FC8.unk28 != 0) { for (j = 0; j < 4; j++) { s32 ti = j << 3; if (D_800E30D4[D_800E30D8[i].unkC] & (0xFF << ti)) { @@ -391,7 +392,10 @@ GLOBAL_ASM("asm/non_matchings/waves/func_800BCC70.s") GLOBAL_ASM("asm/non_matchings/waves/func_800BDC80.s") GLOBAL_ASM("asm/non_matchings/waves/func_800BE654.s") -f32 get_wave_height(Object_Log *log, s32 updateRate) { +/** + * Finds the wave height and returns it for the spinning log object. + */ +f32 log_wave_height(Object_Log *log, s32 updateRate) { s32 var_t0; f32 y; @@ -415,7 +419,7 @@ f32 get_wave_height(Object_Log *log, s32 updateRate) { var_t0 <<= log->unk2; } y = (((f32) var_t0 / 16.0) + (f32) log->unk0); - y *= D_80129FC8->unk40; + y *= D_80129FC8.magnitude; y += func_800BEFC4(log->unkC, log->unk8, log->unkA); return y; } @@ -444,9 +448,9 @@ f32 func_800BEFC4(s32 arg0, s32 arg1, s32 arg2) { return 0.0f; } var_f0 = D_8012A0B8; - var_v1 = D_80129FC8->unk0; + var_v1 = D_80129FC8.unk0; var_f2 = D_8012A0BC; - if (D_80129FC8->unk28 != 0) { + if (D_80129FC8.unk28 != 0) { var_f0 *= 0.5f; var_v1 *= 2; var_f2 *= 0.5f; @@ -570,7 +574,7 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, D_800E3194[i] = obj; D_800E3188++; var_f0 = D_8012A0B8; - if (D_80129FC8->unk28 != 0) { + if (D_80129FC8.unk28 != 0) { var_f0 /= 2.0f; } var_a0_2 = (((xPos - arg3) - D_8012A0D0) / var_f0); @@ -623,7 +627,7 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, return result; } -void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { +UNUSED void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { UNUSED s32 pad[4]; s32 sp1C; f32 var_f0; @@ -638,7 +642,7 @@ void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2) { if (arg0 != NULL) { var_f0 = D_8012A0B8; iteration = 0; - if (D_80129FC8->unk28 != 0) { + if (D_80129FC8.unk28 != 0) { var_f0 *= 0.5f; } temp_v1 = arg0->unk18; @@ -728,6 +732,10 @@ void func_800BFE98(s32 arg0) { } } +/** + * Wave Power loop func. + * Waits for racers to pass through, then sets itself as the current baseline for how strong the waves should be. + */ void obj_loop_wavepower(Object *obj) { LevelObjectEntry_WavePower *entry; s32 numRacers; @@ -758,9 +766,9 @@ void obj_loop_wavepower(Object *obj) { diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; if ((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ) < distance) { - D_8012A720 = entry->unkA / 256.0f; - D_8012A724 = (D_8012A720 - D_80129FC8->unk40) / (f32) entry->unkC; - D_8012A728 = entry->unkC; + gWavePowerBase = entry->power / 256.0f; + gWaveMagnitude = (gWavePowerBase - D_80129FC8.magnitude) / (f32) entry->divisor; + gWavePowerDivisor = entry->divisor; gWaveGeneratorObj = obj; } } diff --git a/src/waves.h b/src/waves.h index dc44b553..da223714 100644 --- a/src/waves.h +++ b/src/waves.h @@ -57,7 +57,7 @@ typedef struct unk80129FC8 { s32 unk34; s32 unk38; s32 unk3C; - f32 unk40; + f32 magnitude; // Global wave strength f32 unk44; f32 unk48; s32 unk4C; @@ -118,12 +118,12 @@ void func_800B8B8C(void); s32 func_800B9228(LevelModelSegment *arg0); void func_800BBDDC(LevelModel *level, LevelHeader *header); void func_800BFE98(s32 arg0); -void func_800B8134(LevelHeader *arg0); +void func_800B8134(LevelHeader *header); void func_800BBE08(LevelModel *level, unk800BBE08_arg1 *arg1); void obj_loop_wavepower(Object *obj); void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4); void func_800BF3E4(Object *obj); -f32 get_wave_height(Object_Log *log, s32 updateRate); +f32 log_wave_height(Object_Log *log, s32 updateRate); void func_800BA288(s32 arg0, s32 arg1); void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2); unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, f32 arg5, f32 arg6, f32 arg7, s32 arg8); diff --git a/tools/dkr_assets_tool_src/builder/buildTypes/buildLevelHeader.cpp b/tools/dkr_assets_tool_src/builder/buildTypes/buildLevelHeader.cpp index c95b5f0a..34a7e893 100644 --- a/tools/dkr_assets_tool_src/builder/buildTypes/buildLevelHeader.cpp +++ b/tools/dkr_assets_tool_src/builder/buildTypes/buildLevelHeader.cpp @@ -142,26 +142,26 @@ BuildLevelHeader::BuildLevelHeader(DkrAssetsSettings &settings, BuildInfo &info) header->unk53 = _info.srcFile->get_int("/unknown/unk53"); - header->unk56 = _info.srcFile->get_int("/unknown/unk56"); - header->unk57 = _info.srcFile->get_int("/unknown/unk57"); - header->unk58 = _info.srcFile->get_int("/unknown/unk58"); - header->unk59 = _info.srcFile->get_int("/unknown/unk59"); - header->unk5A = _info.srcFile->get_int("/unknown/unk5A"); - header->unk5C = _info.srcFile->get_int("/unknown/unk5C"); - header->unk5D = _info.srcFile->get_int("/unknown/unk5D"); - header->unk5E = _info.srcFile->get_int("/unknown/unk5E"); - header->unk60 = _info.srcFile->get_int("/unknown/unk60"); - header->unk62 = _info.srcFile->get_int("/unknown/unk62"); - header->unk64 = _info.srcFile->get_int("/unknown/unk64"); - header->unk66 = _info.srcFile->get_int("/unknown/unk66"); - header->unk68 = _info.srcFile->get_int("/unknown/unk68"); - header->unk6A = _info.srcFile->get_int("/unknown/unk6A"); - header->unk6B = _info.srcFile->get_int("/unknown/unk6B"); - header->unk6C = _info.srcFile->get_int("/unknown/unk6C"); - header->unk6D = _info.srcFile->get_int("/unknown/unk6D"); - header->unk6E = _info.srcFile->get_int("/unknown/unk6E"); - header->unk70 = _info.srcFile->get_int("/unknown/unk70"); - header->unk71 = _info.srcFile->get_int("/unknown/unk71"); + header->unk56 = _info.srcFile->get_int("/waves/unk56"); + header->unk57 = _info.srcFile->get_int("/waves/unk57"); + header->unk58 = _info.srcFile->get_int("/waves/unk58"); + header->unk59 = _info.srcFile->get_int("/waves/unk59"); + header->unk5A = _info.srcFile->get_int("/waves/unk5A"); + header->unk5C = _info.srcFile->get_int("/waves/unk5C"); + header->unk5D = _info.srcFile->get_int("/waves/unk5D"); + header->unk5E = _info.srcFile->get_int("/waves/unk5E"); + header->unk60 = _info.srcFile->get_int("/waves/unk60"); + header->wavePower = _info.srcFile->get_int("/waves/wave-power"); + header->unk64 = _info.srcFile->get_int("/waves/unk64"); + header->unk66 = _info.srcFile->get_int("/waves/unk66"); + header->unk68 = _info.srcFile->get_int("/waves/unk68"); + header->unk6A = _info.srcFile->get_int("/waves/unk6A"); + header->unk6B = _info.srcFile->get_int("/waves/unk6B"); + header->unk6C = _info.srcFile->get_int("/waves/unk6C"); + header->unk6D = _info.srcFile->get_int("/waves/unk6D"); + header->unk6E = _info.srcFile->get_int("/waves/unk6E"); + header->unk70 = _info.srcFile->get_int("/waves/unk70"); + header->unk71 = _info.srcFile->get_int("/waves/unk71"); header->unk72 = _info.srcFile->get_int("/unknown/unk72"); header->unk73 = _info.srcFile->get_int("/unknown/unk73"); @@ -179,7 +179,8 @@ BuildLevelHeader::BuildLevelHeader(DkrAssetsSettings &settings, BuildInfo &info) header->unkB5 = _info.srcFile->get_int("/unknown/unkB5"); header->unkB6 = _info.srcFile->get_int("/unknown/unkB6"); header->unkB7 = _info.srcFile->get_int("/unknown/unkB7"); - header->unkB8 = _info.srcFile->get_int("/unknown/unkB8"); + std::string bossRaceID = _info.srcFile->get_string("/boss-race-id"); + header->bossRaceID = _c_context.get_int_value_of_symbol(bossRaceID); header->unkB9 = _info.srcFile->get_int("/unknown/unkB9"); header->unkBC = _info.srcFile->get_int("/unknown/unkBC"); header->unkBD = _info.srcFile->get_int("/unknown/unkBD"); diff --git a/tools/dkr_assets_tool_src/extract/extractTypes/extractLevelHeader.cpp b/tools/dkr_assets_tool_src/extract/extractTypes/extractLevelHeader.cpp index b80010be..727e3cbe 100644 --- a/tools/dkr_assets_tool_src/extract/extractTypes/extractLevelHeader.cpp +++ b/tools/dkr_assets_tool_src/extract/extractTypes/extractLevelHeader.cpp @@ -140,26 +140,27 @@ ExtractLevelHeader::ExtractLevelHeader(DkrAssetsSettings &settings, ExtractInfo jsonFile.set_int("/unknown/unk53", header->unk53); - jsonFile.set_int("/unknown/unk56", header->unk56); - jsonFile.set_int("/unknown/unk57", header->unk57); - jsonFile.set_int("/unknown/unk58", header->unk58); - jsonFile.set_int("/unknown/unk59", header->unk59); - jsonFile.set_int("/unknown/unk5A", header->unk5A); - jsonFile.set_int("/unknown/unk5C", header->unk5C); - jsonFile.set_int("/unknown/unk5D", header->unk5D); - jsonFile.set_int("/unknown/unk5E", header->unk5E); - jsonFile.set_int("/unknown/unk60", header->unk60); - jsonFile.set_int("/unknown/unk62", header->unk62); - jsonFile.set_int("/unknown/unk64", header->unk64); - jsonFile.set_int("/unknown/unk66", header->unk66); - jsonFile.set_int("/unknown/unk68", header->unk68); - jsonFile.set_int("/unknown/unk6A", header->unk6A); - jsonFile.set_int("/unknown/unk6B", header->unk6B); - jsonFile.set_int("/unknown/unk6C", header->unk6C); - jsonFile.set_int("/unknown/unk6D", header->unk6D); - jsonFile.set_int("/unknown/unk6E", header->unk6E); - jsonFile.set_int("/unknown/unk70", header->unk70); - jsonFile.set_int("/unknown/unk71", header->unk71); + jsonFile.set_int("/waves/unk56", header->unk56); + jsonFile.set_int("/waves/unk57", header->unk57); + jsonFile.set_int("/waves/unk58", header->unk58); + jsonFile.set_int("/waves/unk59", header->unk59); + jsonFile.set_int("/waves/unk5A", header->unk5A); + jsonFile.set_int("/waves/unk5C", header->unk5C); + jsonFile.set_int("/waves/unk5D", header->unk5D); + jsonFile.set_int("/waves/unk5E", header->unk5E); + jsonFile.set_int("/waves/unk60", header->unk60); + jsonFile.set_int("/waves/wave-power", header->wavePower); + jsonFile.set_int("/waves/unk64", header->unk64); + jsonFile.set_int("/waves/unk66", header->unk66); + jsonFile.set_int("/waves/unk68", header->unk68); + jsonFile.set_int("/waves/unk6A", header->unk6A); + jsonFile.set_int("/waves/unk6B", header->unk6B); + jsonFile.set_int("/waves/unk6C", header->unk6C); + jsonFile.set_int("/waves/unk6D", header->unk6D); + jsonFile.set_int("/waves/unk6E", header->unk6E); + jsonFile.set_int("/waves/unk70", header->unk70); + jsonFile.set_int("/waves/unk71", header->unk71); + jsonFile.set_int("/unknown/unk72", header->unk72); jsonFile.set_int("/unknown/unk73", header->unk73); @@ -177,7 +178,8 @@ ExtractLevelHeader::ExtractLevelHeader(DkrAssetsSettings &settings, ExtractInfo jsonFile.set_int("/unknown/unkB5", header->unkB5); jsonFile.set_int("/unknown/unkB6", header->unkB6); jsonFile.set_int("/unknown/unkB7", header->unkB7); - jsonFile.set_int("/unknown/unkB8", header->unkB8); + std::string bossRaceID = _info.c_context->get_symbol_of_enum_int("BossSetupTypes", header->bossRaceID); + jsonFile.set_string("/boss-race-id", bossRaceID); jsonFile.set_int("/unknown/unkB9", header->unkB9); jsonFile.set_int("/unknown/unkBC", header->unkBC); jsonFile.set_int("/unknown/unkBD", header->unkBD); diff --git a/tools/dkr_assets_tool_src/fileTypes/levelHeader.hpp b/tools/dkr_assets_tool_src/fileTypes/levelHeader.hpp index 384dfdf4..3b21140b 100644 --- a/tools/dkr_assets_tool_src/fileTypes/levelHeader.hpp +++ b/tools/dkr_assets_tool_src/fileTypes/levelHeader.hpp @@ -70,7 +70,7 @@ struct LevelHeader { uint8_t unk5D; be_int16_t unk5E; be_int16_t unk60; - be_int16_t unk62; + be_int16_t wavePower; be_int16_t unk64; be_int16_t unk66; be_int16_t unk68; @@ -106,7 +106,7 @@ struct LevelHeader { uint8_t unkB5; uint8_t unkB6; uint8_t unkB7; - int8_t unkB8; + int8_t bossRaceID; uint8_t unkB9; be_int16_t objectMap2; uint8_t unkBC;