From 444afbb470d44c81b0e95531f30376229e4f7911 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 1 May 2023 14:32:25 +0100 Subject: [PATCH] I can't stop I can't stop I can't stop I can't stop (#389) * yo I finally went and figured out what the majority of unk6 is lmao * rename entry * man honestly game.c is a mess they really did just throw every old thing here * Name some initialiser funcs * more * destroyed another temp struct * potassium * tweak * pain * it never ends * a new pain arises * Update README.md * quick fixes * add colour macro --- README.md | 8 +- asm/non_matchings/game/func_8006DCF8.s | 810 +++++++++--------- asm/non_matchings/game_ui/func_8009ECF0.s | 4 +- asm/non_matchings/game_ui/func_800A0BD4.s | 4 +- .../object_models/func_8005F99C.s | 4 +- .../object_models/func_80061A00.s | 8 +- asm/non_matchings/objects/func_8000B020.s | 8 +- asm/non_matchings/objects/func_8000B750.s | 2 +- asm/non_matchings/objects/func_8000BADC.s | 4 +- asm/non_matchings/objects/func_8000CC7C.s | 2 +- asm/non_matchings/objects/func_8001C6C4.s | 2 - asm/non_matchings/racer/func_80049794.s | 16 +- .../unknown_0255E0/func_8002C0C4.s | 16 +- .../unknown_032760/func_8003F2E8.s | 2 +- .../unknown_032760/obj_init_fish.s | 2 +- .../unknown_032760/obj_loop_butterfly.s | 2 +- .../unknown_032760/obj_loop_fish.s | 2 +- include/level_object_entries.h | 18 +- include/macros.h | 3 + include/structs.h | 24 +- src/game.c | 205 +++-- src/game.h | 19 +- src/game_ui.c | 20 +- src/menu.c | 47 +- src/menu.h | 4 +- src/object_functions.c | 385 +++++---- src/object_functions.h | 4 +- src/object_models.c | 19 +- src/object_models.h | 2 +- src/objects.c | 386 ++++----- src/objects.h | 3 +- src/particles.c | 6 +- src/racer.c | 236 ++--- src/racer.h | 20 +- src/textures_sprites.h | 20 + src/unknown_005740.c | 1 - src/unknown_0255E0.c | 131 +-- src/unknown_0255E0.h | 7 +- src/vehicle_smokey.c | 4 +- 39 files changed, 1288 insertions(+), 1172 deletions(-) diff --git a/README.md b/README.md index efca1b09..f57de392 100644 --- a/README.md +++ b/README.md @@ -144,14 +144,14 @@ As of April 28, 2023, this is our current score: We are racing the octopus boss Bubbler. (Lap 1/3) ================================================= ADVENTURE TWO (Cleanup & Documentation) - ---------------- 25.19% Complete ---------------- - # Documented functions: 516 - # Undocumented remaining: 1048 + ---------------- 25.60% Complete ---------------- + # Documented functions: 541 + # Undocumented remaining: 1023 ------------------ Game Status ------------------ Balloons: 12/47, Keys: 1/4, Trophies: 1/5 T.T. Amulets: 1/4, Wizpig Amulets: 1/4 ------------------------------------------------- - We are racing Taj in the Car Challenge. (Lap 2/3) + We are racing Taj in the Car Challenge. (Lap 3/3) ================================================= ``` diff --git a/asm/non_matchings/game/func_8006DCF8.s b/asm/non_matchings/game/func_8006DCF8.s index 76a585e0..7a619c02 100644 --- a/asm/non_matchings/game/func_8006DCF8.s +++ b/asm/non_matchings/game/func_8006DCF8.s @@ -1,405 +1,405 @@ -.late_rodata -glabel jpt_800E71D8 -.word L8006DF70, L8006E00C, L8006E054, L8006E0E0, L8006DEE8, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006DF00 - -.text -glabel func_8006DCF8 -/* 06E8F8 8006DCF8 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 -/* 06E8FC 8006DCFC 3C0E8012 */ lui $t6, %hi(gIsLoading) # $t6, 0x8012 -/* 06E900 8006DD00 81CE3514 */ lb $t6, %lo(gIsLoading)($t6) -/* 06E904 8006DD04 27BDFFD0 */ addiu $sp, $sp, -0x30 -/* 06E908 8006DD08 A0203515 */ sb $zero, %lo(gIsPaused)($at) -/* 06E90C 8006DD0C 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 -/* 06E910 8006DD10 AFBF0024 */ sw $ra, 0x24($sp) -/* 06E914 8006DD14 AFB00020 */ sw $s0, 0x20($sp) -/* 06E918 8006DD18 AFA40030 */ sw $a0, 0x30($sp) -/* 06E91C 8006DD1C 15C00008 */ bnez $t6, .L8006DD40 -/* 06E920 8006DD20 A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) -/* 06E924 8006DD24 3C0F8012 */ lui $t7, %hi(D_801234F0) # $t7, 0x8012 -/* 06E928 8006DD28 8DEF34F0 */ lw $t7, %lo(D_801234F0)($t7) -/* 06E92C 8006DD2C 00000000 */ nop -/* 06E930 8006DD30 11E00004 */ beqz $t7, .L8006DD44 -/* 06E934 8006DD34 8FB80030 */ lw $t8, 0x30($sp) -/* 06E938 8006DD38 0C01B716 */ jal func_8006DC58 -/* 06E93C 8006DD3C 00000000 */ nop -.L8006DD40: -/* 06E940 8006DD40 8FB80030 */ lw $t8, 0x30($sp) -.L8006DD44: -/* 06E944 8006DD44 3C108012 */ lui $s0, %hi(gCurrDisplayList) # $s0, 0x8012 -/* 06E948 8006DD48 261011F8 */ addiu $s0, %lo(gCurrDisplayList) # addiu $s0, $s0, 0x11f8 -/* 06E94C 8006DD4C 3C058012 */ lui $a1, %hi(gGameCurrMatrix) # $a1, 0x8012 -/* 06E950 8006DD50 3C068012 */ lui $a2, %hi(gGameCurrVertexList) # $a2, 0x8012 -/* 06E954 8006DD54 3C078012 */ lui $a3, %hi(gGameCurrTriList) # $a3, 0x8012 -/* 06E958 8006DD58 24E71228 */ addiu $a3, %lo(gGameCurrTriList) # addiu $a3, $a3, 0x1228 -/* 06E95C 8006DD5C 24C61218 */ addiu $a2, %lo(gGameCurrVertexList) # addiu $a2, $a2, 0x1218 -/* 06E960 8006DD60 24A51208 */ addiu $a1, %lo(gGameCurrMatrix) # addiu $a1, $a1, 0x1208 -/* 06E964 8006DD64 02002025 */ move $a0, $s0 -/* 06E968 8006DD68 0C020569 */ jal menu_loop -/* 06E96C 8006DD6C AFB80010 */ sw $t8, 0x10($sp) -/* 06E970 8006DD70 24190001 */ li $t9, 1 -/* 06E974 8006DD74 3C018012 */ lui $at, %hi(D_801234F0) # $at, 0x8012 -/* 06E978 8006DD78 AC3934F0 */ sw $t9, %lo(D_801234F0)($at) -/* 06E97C 8006DD7C 2401FFFE */ li $at, -2 -/* 06E980 8006DD80 14410004 */ bne $v0, $at, .L8006DD94 -/* 06E984 8006DD84 AFA2002C */ sw $v0, 0x2c($sp) -/* 06E988 8006DD88 3C018012 */ lui $at, %hi(D_801234F0) # $at, 0x8012 -/* 06E98C 8006DD8C 10000152 */ b .L8006E2D8 -/* 06E990 8006DD90 AC2034F0 */ sw $zero, %lo(D_801234F0)($at) -.L8006DD94: -/* 06E994 8006DD94 2403FFFF */ li $v1, -1 -/* 06E998 8006DD98 1043003D */ beq $v0, $v1, .L8006DE90 -/* 06E99C 8006DD9C 304C0200 */ andi $t4, $v0, 0x200 -/* 06E9A0 8006DDA0 1180003B */ beqz $t4, .L8006DE90 -/* 06E9A4 8006DDA4 00000000 */ nop -/* 06E9A8 8006DDA8 0C01B6F9 */ jal func_8006DBE4 -/* 06E9AC 8006DDAC 00000000 */ nop -/* 06E9B0 8006DDB0 3C0D8012 */ lui $t5, %hi(gSPTaskNum) # $t5, 0x8012 -/* 06E9B4 8006DDB4 8DAD34E8 */ lw $t5, %lo(gSPTaskNum)($t5) -/* 06E9B8 8006DDB8 3C0F8012 */ lui $t7, %hi(gDisplayLists) # $t7, 0x8012 -/* 06E9BC 8006DDBC 000D7080 */ sll $t6, $t5, 2 -/* 06E9C0 8006DDC0 01EE7821 */ addu $t7, $t7, $t6 -/* 06E9C4 8006DDC4 8DEF11F0 */ lw $t7, %lo(gDisplayLists)($t7) -/* 06E9C8 8006DDC8 3C19E900 */ lui $t9, 0xe900 -/* 06E9CC 8006DDCC AE0F0000 */ sw $t7, ($s0) -/* 06E9D0 8006DDD0 25F80008 */ addiu $t8, $t7, 8 -/* 06E9D4 8006DDD4 AE180000 */ sw $t8, ($s0) -/* 06E9D8 8006DDD8 ADE00004 */ sw $zero, 4($t7) -/* 06E9DC 8006DDDC ADF90000 */ sw $t9, ($t7) -/* 06E9E0 8006DDE0 8E020000 */ lw $v0, ($s0) -/* 06E9E4 8006DDE4 3C0DB800 */ lui $t5, 0xb800 -/* 06E9E8 8006DDE8 244C0008 */ addiu $t4, $v0, 8 -/* 06E9EC 8006DDEC AE0C0000 */ sw $t4, ($s0) -/* 06E9F0 8006DDF0 AC400004 */ sw $zero, 4($v0) -/* 06E9F4 8006DDF4 AC4D0000 */ sw $t5, ($v0) -/* 06E9F8 8006DDF8 8FAE002C */ lw $t6, 0x2c($sp) -/* 06E9FC 8006DDFC 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EA00 8006DE00 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EA04 8006DE04 31C4007F */ andi $a0, $t6, 0x7f -/* 06EA08 8006DE08 0C01AC2B */ jal get_map_default_vehicle -/* 06EA0C 8006DE0C AD040000 */ sw $a0, ($t0) -/* 06EA10 8006DE10 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EA14 8006DE14 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EA18 8006DE18 3C0B8012 */ lui $t3, %hi(D_80123508) # $t3, 0x8012 -/* 06EA1C 8006DE1C 256B3508 */ addiu $t3, %lo(D_80123508) # addiu $t3, $t3, 0x3508 -/* 06EA20 8006DE20 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EA24 8006DE24 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EA28 8006DE28 24180064 */ li $t8, 100 -/* 06EA2C 8006DE2C AD420000 */ sw $v0, ($t2) -/* 06EA30 8006DE30 AD200000 */ sw $zero, ($t1) -/* 06EA34 8006DE34 AD780000 */ sw $t8, ($t3) -/* 06EA38 8006DE38 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EA3C 8006DE3C AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EA40 8006DE40 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 -/* 06EA44 8006DE44 A0203515 */ sb $zero, %lo(gIsPaused)($at) -/* 06EA48 8006DE48 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 -/* 06EA4C 8006DE4C A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) -/* 06EA50 8006DE50 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06EA54 8006DE54 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EA58 8006DE58 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EA5C 8006DE5C 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06EA60 8006DE60 8C650000 */ lw $a1, ($v1) -/* 06EA64 8006DE64 8D040000 */ lw $a0, ($t0) -/* 06EA68 8006DE68 8D470000 */ lw $a3, ($t2) -/* 06EA6C 8006DE6C 8D260000 */ lw $a2, ($t1) -/* 06EA70 8006DE70 0C01B2D6 */ jal load_level_game -/* 06EA74 8006DE74 00000000 */ nop -/* 06EA78 8006DE78 0C027068 */ jal get_save_file_index -/* 06EA7C 8006DE7C 00000000 */ nop -/* 06EA80 8006DE80 0C01BB12 */ jal safe_mark_write_save_file -/* 06EA84 8006DE84 00402025 */ move $a0, $v0 -/* 06EA88 8006DE88 10000114 */ b .L8006E2DC -/* 06EA8C 8006DE8C 8FBF0024 */ lw $ra, 0x24($sp) -.L8006DE90: -/* 06EA90 8006DE90 10430099 */ beq $v0, $v1, .L8006E0F8 -/* 06EA94 8006DE94 30590100 */ andi $t9, $v0, 0x100 -/* 06EA98 8006DE98 13200098 */ beqz $t9, .L8006E0FC -/* 06EA9C 8006DE9C 304C0080 */ andi $t4, $v0, 0x80 -/* 06EAA0 8006DEA0 0C01B305 */ jal func_8006CC14 -/* 06EAA4 8006DEA4 00000000 */ nop -/* 06EAA8 8006DEA8 8FAC002C */ lw $t4, 0x2c($sp) -/* 06EAAC 8006DEAC 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 -/* 06EAB0 8006DEB0 A0203515 */ sb $zero, %lo(gIsPaused)($at) -/* 06EAB4 8006DEB4 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 -/* 06EAB8 8006DEB8 318D007F */ andi $t5, $t4, 0x7f -/* 06EABC 8006DEBC A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) -/* 06EAC0 8006DEC0 25AEFFFF */ addiu $t6, $t5, -1 -/* 06EAC4 8006DEC4 2DC1000E */ sltiu $at, $t6, 0xe -/* 06EAC8 8006DEC8 10200085 */ beqz $at, .L8006E0E0 -/* 06EACC 8006DECC 000E7080 */ sll $t6, $t6, 2 -/* 06EAD0 8006DED0 3C01800E */ lui $at, %hi(jpt_800E71D8) # $at, 0x800e -/* 06EAD4 8006DED4 002E0821 */ addu $at, $at, $t6 -/* 06EAD8 8006DED8 8C2E71D8 */ lw $t6, %lo(jpt_800E71D8)($at) -/* 06EADC 8006DEDC 00000000 */ nop -/* 06EAE0 8006DEE0 01C00008 */ jr $t6 -/* 06EAE4 8006DEE4 00000000 */ nop -glabel L8006DEE8 -/* 06EAE8 8006DEE8 2404000F */ li $a0, 15 -/* 06EAEC 8006DEEC 2405FFFF */ li $a1, -1 -/* 06EAF0 8006DEF0 0C01B68A */ jal load_menu_with_level_background -/* 06EAF4 8006DEF4 24060001 */ li $a2, 1 -/* 06EAF8 8006DEF8 100000F8 */ b .L8006E2DC -/* 06EAFC 8006DEFC 8FBF0024 */ lw $ra, 0x24($sp) -glabel L8006DF00 -/* 06EB00 8006DF00 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EB04 8006DF04 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EB08 8006DF08 3C0B8012 */ lui $t3, %hi(D_80123508) # $t3, 0x8012 -/* 06EB0C 8006DF0C 256B3508 */ addiu $t3, %lo(D_80123508) # addiu $t3, $t3, 0x3508 -/* 06EB10 8006DF10 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EB14 8006DF14 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EB18 8006DF18 240F0064 */ li $t7, 100 -/* 06EB1C 8006DF1C AD000000 */ sw $zero, ($t0) -/* 06EB20 8006DF20 AD200000 */ sw $zero, ($t1) -/* 06EB24 8006DF24 AD6F0000 */ sw $t7, ($t3) -/* 06EB28 8006DF28 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EB2C 8006DF2C AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EB30 8006DF30 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06EB34 8006DF34 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EB38 8006DF38 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EB3C 8006DF3C 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06EB40 8006DF40 8C650000 */ lw $a1, ($v1) -/* 06EB44 8006DF44 8D470000 */ lw $a3, ($t2) -/* 06EB48 8006DF48 8D260000 */ lw $a2, ($t1) -/* 06EB4C 8006DF4C 8D040000 */ lw $a0, ($t0) -/* 06EB50 8006DF50 0C01B2D6 */ jal load_level_game -/* 06EB54 8006DF54 00000000 */ nop -/* 06EB58 8006DF58 0C027068 */ jal get_save_file_index -/* 06EB5C 8006DF5C 00000000 */ nop -/* 06EB60 8006DF60 0C01BB12 */ jal safe_mark_write_save_file -/* 06EB64 8006DF64 00402025 */ move $a0, $v0 -/* 06EB68 8006DF68 100000DC */ b .L8006E2DC -/* 06EB6C 8006DF6C 8FBF0024 */ lw $ra, 0x24($sp) -glabel L8006DF70 -/* 06EB70 8006DF70 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 -/* 06EB74 8006DF74 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 -/* 06EB78 8006DF78 80B80000 */ lb $t8, ($a1) -/* 06EB7C 8006DF7C 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EB80 8006DF80 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EB84 8006DF84 3C0B8012 */ lui $t3, %hi(D_80123508) # $t3, 0x8012 -/* 06EB88 8006DF88 256B3508 */ addiu $t3, %lo(D_80123508) # addiu $t3, $t3, 0x3508 -/* 06EB8C 8006DF8C 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EB90 8006DF90 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EB94 8006DF94 24190064 */ li $t9, 100 -/* 06EB98 8006DF98 AD200000 */ sw $zero, ($t1) -/* 06EB9C 8006DF9C AD790000 */ sw $t9, ($t3) -/* 06EBA0 8006DFA0 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EBA4 8006DFA4 AD180000 */ sw $t8, ($t0) -/* 06EBA8 8006DFA8 AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EBAC 8006DFAC 80A2000F */ lb $v0, 0xf($a1) -/* 06EBB0 8006DFB0 80A30001 */ lb $v1, 1($a1) -/* 06EBB4 8006DFB4 04400002 */ bltz $v0, .L8006DFC0 -/* 06EBB8 8006DFB8 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EBBC 8006DFBC AD220000 */ sw $v0, ($t1) -.L8006DFC0: -/* 06EBC0 8006DFC0 00A36021 */ addu $t4, $a1, $v1 -/* 06EBC4 8006DFC4 81820008 */ lb $v0, 8($t4) -/* 06EBC8 8006DFC8 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06EBCC 8006DFCC 04400002 */ bltz $v0, .L8006DFD8 -/* 06EBD0 8006DFD0 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06EBD4 8006DFD4 AD620000 */ sw $v0, ($t3) -.L8006DFD8: -/* 06EBD8 8006DFD8 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EBDC 8006DFDC 8D470000 */ lw $a3, ($t2) -/* 06EBE0 8006DFE0 8D040000 */ lw $a0, ($t0) -/* 06EBE4 8006DFE4 8C650000 */ lw $a1, ($v1) -/* 06EBE8 8006DFE8 8D260000 */ lw $a2, ($t1) -/* 06EBEC 8006DFEC 0C01B2D6 */ jal load_level_game -/* 06EBF0 8006DFF0 00000000 */ nop -/* 06EBF4 8006DFF4 0C027068 */ jal get_save_file_index -/* 06EBF8 8006DFF8 00000000 */ nop -/* 06EBFC 8006DFFC 0C01BB12 */ jal safe_mark_write_save_file -/* 06EC00 8006E000 00402025 */ move $a0, $v0 -/* 06EC04 8006E004 100000B5 */ b .L8006E2DC -/* 06EC08 8006E008 8FBF0024 */ lw $ra, 0x24($sp) -glabel L8006E00C -/* 06EC0C 8006E00C 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EC10 8006E010 AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EC14 8006E014 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06EC18 8006E018 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EC1C 8006E01C 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EC20 8006E020 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EC24 8006E024 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EC28 8006E028 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EC2C 8006E02C 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EC30 8006E030 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06EC34 8006E034 8C650000 */ lw $a1, ($v1) -/* 06EC38 8006E038 8D040000 */ lw $a0, ($t0) -/* 06EC3C 8006E03C 8D260000 */ lw $a2, ($t1) -/* 06EC40 8006E040 8D470000 */ lw $a3, ($t2) -/* 06EC44 8006E044 0C01B2D6 */ jal load_level_game -/* 06EC48 8006E048 00000000 */ nop -/* 06EC4C 8006E04C 100000A3 */ b .L8006E2DC -/* 06EC50 8006E050 8FBF0024 */ lw $ra, 0x24($sp) -glabel L8006E054 -/* 06EC54 8006E054 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 -/* 06EC58 8006E058 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EC5C 8006E05C 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 -/* 06EC60 8006E060 AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EC64 8006E064 80AF0001 */ lb $t7, 1($a1) -/* 06EC68 8006E068 80A40000 */ lb $a0, ($a1) -/* 06EC6C 8006E06C 00AFC021 */ addu $t8, $a1, $t7 -/* 06EC70 8006E070 80AE000F */ lb $t6, 0xf($a1) -/* 06EC74 8006E074 83190008 */ lb $t9, 8($t8) -/* 06EC78 8006E078 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EC7C 8006E07C 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EC80 8006E080 3C0B8012 */ lui $t3, %hi(D_80123508) # $t3, 0x8012 -/* 06EC84 8006E084 256B3508 */ addiu $t3, %lo(D_80123508) # addiu $t3, $t3, 0x3508 -/* 06EC88 8006E088 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EC8C 8006E08C 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EC90 8006E090 AD040000 */ sw $a0, ($t0) -/* 06EC94 8006E094 AD2E0000 */ sw $t6, ($t1) -/* 06EC98 8006E098 0C01AC2B */ jal get_map_default_vehicle -/* 06EC9C 8006E09C AD790000 */ sw $t9, ($t3) -/* 06ECA0 8006E0A0 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06ECA4 8006E0A4 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06ECA8 8006E0A8 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06ECAC 8006E0AC 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06ECB0 8006E0B0 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06ECB4 8006E0B4 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06ECB8 8006E0B8 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06ECBC 8006E0BC 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06ECC0 8006E0C0 8C650000 */ lw $a1, ($v1) -/* 06ECC4 8006E0C4 8D040000 */ lw $a0, ($t0) -/* 06ECC8 8006E0C8 8D260000 */ lw $a2, ($t1) -/* 06ECCC 8006E0CC AD420000 */ sw $v0, ($t2) -/* 06ECD0 8006E0D0 0C01B2D6 */ jal load_level_game -/* 06ECD4 8006E0D4 00403825 */ move $a3, $v0 -/* 06ECD8 8006E0D8 10000080 */ b .L8006E2DC -/* 06ECDC 8006E0DC 8FBF0024 */ lw $ra, 0x24($sp) -.L8006E0E0: -glabel L8006E0E0 -/* 06ECE0 8006E0E0 00002025 */ move $a0, $zero -/* 06ECE4 8006E0E4 2405FFFF */ li $a1, -1 -/* 06ECE8 8006E0E8 0C01B68A */ jal load_menu_with_level_background -/* 06ECEC 8006E0EC 00003025 */ move $a2, $zero -/* 06ECF0 8006E0F0 1000007A */ b .L8006E2DC -/* 06ECF4 8006E0F4 8FBF0024 */ lw $ra, 0x24($sp) -.L8006E0F8: -/* 06ECF8 8006E0F8 304C0080 */ andi $t4, $v0, 0x80 -.L8006E0FC: -/* 06ECFC 8006E0FC 11800047 */ beqz $t4, .L8006E21C -/* 06ED00 8006E100 00000000 */ nop -/* 06ED04 8006E104 10430045 */ beq $v0, $v1, .L8006E21C -/* 06ED08 8006E108 00000000 */ nop -/* 06ED0C 8006E10C 0C01B6F9 */ jal func_8006DBE4 -/* 06ED10 8006E110 00000000 */ nop -/* 06ED14 8006E114 3C0D8012 */ lui $t5, %hi(gSPTaskNum) # $t5, 0x8012 -/* 06ED18 8006E118 8DAD34E8 */ lw $t5, %lo(gSPTaskNum)($t5) -/* 06ED1C 8006E11C 3C0F8012 */ lui $t7, %hi(gDisplayLists) # $t7, 0x8012 -/* 06ED20 8006E120 000D7080 */ sll $t6, $t5, 2 -/* 06ED24 8006E124 01EE7821 */ addu $t7, $t7, $t6 -/* 06ED28 8006E128 8DEF11F0 */ lw $t7, %lo(gDisplayLists)($t7) -/* 06ED2C 8006E12C 8FAA002C */ lw $t2, 0x2c($sp) -/* 06ED30 8006E130 AE0F0000 */ sw $t7, ($s0) -/* 06ED34 8006E134 25F80008 */ addiu $t8, $t7, 8 -/* 06ED38 8006E138 AE180000 */ sw $t8, ($s0) -/* 06ED3C 8006E13C 3C19E900 */ lui $t9, 0xe900 -/* 06ED40 8006E140 ADF90000 */ sw $t9, ($t7) -/* 06ED44 8006E144 ADE00004 */ sw $zero, 4($t7) -/* 06ED48 8006E148 8E020000 */ lw $v0, ($s0) -/* 06ED4C 8006E14C 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 -/* 06ED50 8006E150 244C0008 */ addiu $t4, $v0, 8 -/* 06ED54 8006E154 AE0C0000 */ sw $t4, ($s0) -/* 06ED58 8006E158 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06ED5C 8006E15C 3C0DB800 */ lui $t5, 0xb800 -/* 06ED60 8006E160 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06ED64 8006E164 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 -/* 06ED68 8006E168 AC4D0000 */ sw $t5, ($v0) -/* 06ED6C 8006E16C AC400004 */ sw $zero, 4($v0) -/* 06ED70 8006E170 8D0F0000 */ lw $t7, ($t0) -/* 06ED74 8006E174 314E007F */ andi $t6, $t2, 0x7f -/* 06ED78 8006E178 A0AE0001 */ sb $t6, 1($a1) -/* 06ED7C 8006E17C 00AE1821 */ addu $v1, $a1, $t6 -/* 06ED80 8006E180 A0AF0000 */ sb $t7, ($a1) -/* 06ED84 8006E184 80780002 */ lb $t8, 2($v1) -/* 06ED88 8006E188 80790004 */ lb $t9, 4($v1) -/* 06ED8C 8006E18C 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06ED90 8006E190 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06ED94 8006E194 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06ED98 8006E198 AD180000 */ sw $t8, ($t0) -/* 06ED9C 8006E19C AD390000 */ sw $t9, ($t1) -/* 06EDA0 8006E1A0 AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EDA4 8006E1A4 806C000C */ lb $t4, 0xc($v1) -/* 06EDA8 8006E1A8 3C0B8012 */ lui $t3, %hi(D_80123508) # $t3, 0x8012 -/* 06EDAC 8006E1AC 256B3508 */ addiu $t3, %lo(D_80123508) # addiu $t3, $t3, 0x3508 -/* 06EDB0 8006E1B0 00002025 */ move $a0, $zero -/* 06EDB4 8006E1B4 0C027094 */ jal get_player_selected_vehicle -/* 06EDB8 8006E1B8 AD6C0000 */ sw $t4, ($t3) -/* 06EDBC 8006E1BC 3C108012 */ lui $s0, %hi(gSettingsPtr) # $s0, 0x8012 -/* 06EDC0 8006E1C0 26103510 */ addiu $s0, %lo(gSettingsPtr) # addiu $s0, $s0, 0x3510 -/* 06EDC4 8006E1C4 8E0D0000 */ lw $t5, ($s0) -/* 06EDC8 8006E1C8 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 -/* 06EDCC 8006E1CC 91AE004A */ lbu $t6, 0x4a($t5) -/* 06EDD0 8006E1D0 3C098012 */ lui $t1, %hi(D_80123504) # $t1, 0x8012 -/* 06EDD4 8006E1D4 25293504 */ addiu $t1, %lo(D_80123504) # addiu $t1, $t1, 0x3504 -/* 06EDD8 8006E1D8 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 -/* 06EDDC 8006E1DC 3C038012 */ lui $v1, %hi(D_80123500) # $v1, 0x8012 -/* 06EDE0 8006E1E0 24633500 */ addiu $v1, %lo(D_80123500) # addiu $v1, $v1, 0x3500 -/* 06EDE4 8006E1E4 8D040000 */ lw $a0, ($t0) -/* 06EDE8 8006E1E8 8D260000 */ lw $a2, ($t1) -/* 06EDEC 8006E1EC 25C5FFFF */ addiu $a1, $t6, -1 -/* 06EDF0 8006E1F0 AC650000 */ sw $a1, ($v1) -/* 06EDF4 8006E1F4 0C01B2D6 */ jal load_level_game -/* 06EDF8 8006E1F8 00403825 */ move $a3, $v0 -/* 06EDFC 8006E1FC 3C188012 */ lui $t8, %hi(D_8012351C) # $t8, 0x8012 -/* 06EE00 8006E200 8F18351C */ lw $t8, %lo(D_8012351C)($t8) -/* 06EE04 8006E204 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EE08 8006E208 3C018012 */ lui $at, %hi(D_801234FC) # $at, 0x8012 -/* 06EE0C 8006E20C 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EE10 8006E210 AC2034FC */ sw $zero, %lo(D_801234FC)($at) -/* 06EE14 8006E214 10000030 */ b .L8006E2D8 -/* 06EE18 8006E218 AD580000 */ sw $t8, ($t2) -.L8006E21C: -/* 06EE1C 8006E21C 1840002F */ blez $v0, .L8006E2DC -/* 06EE20 8006E220 8FBF0024 */ lw $ra, 0x24($sp) -/* 06EE24 8006E224 0C01B6F9 */ jal func_8006DBE4 -/* 06EE28 8006E228 00000000 */ nop -/* 06EE2C 8006E22C 3C198012 */ lui $t9, %hi(gSPTaskNum) # $t9, 0x8012 -/* 06EE30 8006E230 8F3934E8 */ lw $t9, %lo(gSPTaskNum)($t9) -/* 06EE34 8006E234 3C0D8012 */ lui $t5, %hi(gDisplayLists) # $t5, 0x8012 -/* 06EE38 8006E238 00196080 */ sll $t4, $t9, 2 -/* 06EE3C 8006E23C 01AC6821 */ addu $t5, $t5, $t4 -/* 06EE40 8006E240 8DAD11F0 */ lw $t5, %lo(gDisplayLists)($t5) -/* 06EE44 8006E244 3C0FE900 */ lui $t7, 0xe900 -/* 06EE48 8006E248 AE0D0000 */ sw $t5, ($s0) -/* 06EE4C 8006E24C 25AE0008 */ addiu $t6, $t5, 8 -/* 06EE50 8006E250 AE0E0000 */ sw $t6, ($s0) -/* 06EE54 8006E254 ADA00004 */ sw $zero, 4($t5) -/* 06EE58 8006E258 ADAF0000 */ sw $t7, ($t5) -/* 06EE5C 8006E25C 8E020000 */ lw $v0, ($s0) -/* 06EE60 8006E260 3C19B800 */ lui $t9, 0xb800 -/* 06EE64 8006E264 24580008 */ addiu $t8, $v0, 8 -/* 06EE68 8006E268 AE180000 */ sw $t8, ($s0) -/* 06EE6C 8006E26C AC400004 */ sw $zero, 4($v0) -/* 06EE70 8006E270 AC590000 */ sw $t9, ($v0) -/* 06EE74 8006E274 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 -/* 06EE78 8006E278 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 -/* 06EE7C 8006E27C 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 -/* 06EE80 8006E280 AC2034EC */ sw $zero, %lo(sRenderContext)($at) -/* 06EE84 8006E284 8D460000 */ lw $a2, ($t2) -/* 06EE88 8006E288 8FA4002C */ lw $a0, 0x2c($sp) -/* 06EE8C 8006E28C 0C01B2B9 */ jal func_8006CAE4 -/* 06EE90 8006E290 2405FFFF */ li $a1, -1 -/* 06EE94 8006E294 3C108012 */ lui $s0, %hi(gSettingsPtr) # $s0, 0x8012 -/* 06EE98 8006E298 26103510 */ addiu $s0, %lo(gSettingsPtr) # addiu $s0, $s0, 0x3510 -/* 06EE9C 8006E29C 8E0C0000 */ lw $t4, ($s0) -/* 06EEA0 8006E2A0 00000000 */ nop -/* 06EEA4 8006E2A4 918D004B */ lbu $t5, 0x4b($t4) -/* 06EEA8 8006E2A8 00000000 */ nop -/* 06EEAC 8006E2AC 11A0000B */ beqz $t5, .L8006E2DC -/* 06EEB0 8006E2B0 8FBF0024 */ lw $ra, 0x24($sp) -/* 06EEB4 8006E2B4 0C0270B4 */ jal is_in_tracks_mode -/* 06EEB8 8006E2B8 00000000 */ nop -/* 06EEBC 8006E2BC 14400007 */ bnez $v0, .L8006E2DC -/* 06EEC0 8006E2C0 8FBF0024 */ lw $ra, 0x24($sp) -/* 06EEC4 8006E2C4 0C0002CA */ jal func_80000B28 -/* 06EEC8 8006E2C8 00000000 */ nop -/* 06EECC 8006E2CC 8E0E0000 */ lw $t6, ($s0) -/* 06EED0 8006E2D0 00000000 */ nop -/* 06EED4 8006E2D4 A1C0004B */ sb $zero, 0x4b($t6) -.L8006E2D8: -/* 06EED8 8006E2D8 8FBF0024 */ lw $ra, 0x24($sp) -.L8006E2DC: -/* 06EEDC 8006E2DC 8FB00020 */ lw $s0, 0x20($sp) -/* 06EEE0 8006E2E0 03E00008 */ jr $ra -/* 06EEE4 8006E2E4 27BD0030 */ addiu $sp, $sp, 0x30 - +.late_rodata +glabel jpt_800E71D8 +.word L8006DF70, L8006E00C, L8006E054, L8006E0E0, L8006DEE8, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006E0E0, L8006DF00 + +.text +glabel func_8006DCF8 +/* 06E8F8 8006DCF8 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 +/* 06E8FC 8006DCFC 3C0E8012 */ lui $t6, %hi(gIsLoading) # $t6, 0x8012 +/* 06E900 8006DD00 81CE3514 */ lb $t6, %lo(gIsLoading)($t6) +/* 06E904 8006DD04 27BDFFD0 */ addiu $sp, $sp, -0x30 +/* 06E908 8006DD08 A0203515 */ sb $zero, %lo(gIsPaused)($at) +/* 06E90C 8006DD0C 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 +/* 06E910 8006DD10 AFBF0024 */ sw $ra, 0x24($sp) +/* 06E914 8006DD14 AFB00020 */ sw $s0, 0x20($sp) +/* 06E918 8006DD18 AFA40030 */ sw $a0, 0x30($sp) +/* 06E91C 8006DD1C 15C00008 */ bnez $t6, .L8006DD40 +/* 06E920 8006DD20 A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) +/* 06E924 8006DD24 3C0F8012 */ lui $t7, %hi(gRenderMenu) # $t7, 0x8012 +/* 06E928 8006DD28 8DEF34F0 */ lw $t7, %lo(gRenderMenu)($t7) +/* 06E92C 8006DD2C 00000000 */ nop +/* 06E930 8006DD30 11E00004 */ beqz $t7, .L8006DD44 +/* 06E934 8006DD34 8FB80030 */ lw $t8, 0x30($sp) +/* 06E938 8006DD38 0C01B716 */ jal update_menu_scene +/* 06E93C 8006DD3C 00000000 */ nop +.L8006DD40: +/* 06E940 8006DD40 8FB80030 */ lw $t8, 0x30($sp) +.L8006DD44: +/* 06E944 8006DD44 3C108012 */ lui $s0, %hi(gCurrDisplayList) # $s0, 0x8012 +/* 06E948 8006DD48 261011F8 */ addiu $s0, %lo(gCurrDisplayList) # addiu $s0, $s0, 0x11f8 +/* 06E94C 8006DD4C 3C058012 */ lui $a1, %hi(gGameCurrMatrix) # $a1, 0x8012 +/* 06E950 8006DD50 3C068012 */ lui $a2, %hi(gGameCurrVertexList) # $a2, 0x8012 +/* 06E954 8006DD54 3C078012 */ lui $a3, %hi(gGameCurrTriList) # $a3, 0x8012 +/* 06E958 8006DD58 24E71228 */ addiu $a3, %lo(gGameCurrTriList) # addiu $a3, $a3, 0x1228 +/* 06E95C 8006DD5C 24C61218 */ addiu $a2, %lo(gGameCurrVertexList) # addiu $a2, $a2, 0x1218 +/* 06E960 8006DD60 24A51208 */ addiu $a1, %lo(gGameCurrMatrix) # addiu $a1, $a1, 0x1208 +/* 06E964 8006DD64 02002025 */ move $a0, $s0 +/* 06E968 8006DD68 0C020569 */ jal menu_loop +/* 06E96C 8006DD6C AFB80010 */ sw $t8, 0x10($sp) +/* 06E970 8006DD70 24190001 */ li $t9, 1 +/* 06E974 8006DD74 3C018012 */ lui $at, %hi(gRenderMenu) # $at, 0x8012 +/* 06E978 8006DD78 AC3934F0 */ sw $t9, %lo(gRenderMenu)($at) +/* 06E97C 8006DD7C 2401FFFE */ li $at, -2 +/* 06E980 8006DD80 14410004 */ bne $v0, $at, .L8006DD94 +/* 06E984 8006DD84 AFA2002C */ sw $v0, 0x2c($sp) +/* 06E988 8006DD88 3C018012 */ lui $at, %hi(gRenderMenu) # $at, 0x8012 +/* 06E98C 8006DD8C 10000152 */ b .L8006E2D8 +/* 06E990 8006DD90 AC2034F0 */ sw $zero, %lo(gRenderMenu)($at) +.L8006DD94: +/* 06E994 8006DD94 2403FFFF */ li $v1, -1 +/* 06E998 8006DD98 1043003D */ beq $v0, $v1, .L8006DE90 +/* 06E99C 8006DD9C 304C0200 */ andi $t4, $v0, 0x200 +/* 06E9A0 8006DDA0 1180003B */ beqz $t4, .L8006DE90 +/* 06E9A4 8006DDA4 00000000 */ nop +/* 06E9A8 8006DDA8 0C01B6F9 */ jal unload_level_menu +/* 06E9AC 8006DDAC 00000000 */ nop +/* 06E9B0 8006DDB0 3C0D8012 */ lui $t5, %hi(gSPTaskNum) # $t5, 0x8012 +/* 06E9B4 8006DDB4 8DAD34E8 */ lw $t5, %lo(gSPTaskNum)($t5) +/* 06E9B8 8006DDB8 3C0F8012 */ lui $t7, %hi(gDisplayLists) # $t7, 0x8012 +/* 06E9BC 8006DDBC 000D7080 */ sll $t6, $t5, 2 +/* 06E9C0 8006DDC0 01EE7821 */ addu $t7, $t7, $t6 +/* 06E9C4 8006DDC4 8DEF11F0 */ lw $t7, %lo(gDisplayLists)($t7) +/* 06E9C8 8006DDC8 3C19E900 */ lui $t9, 0xe900 +/* 06E9CC 8006DDCC AE0F0000 */ sw $t7, ($s0) +/* 06E9D0 8006DDD0 25F80008 */ addiu $t8, $t7, 8 +/* 06E9D4 8006DDD4 AE180000 */ sw $t8, ($s0) +/* 06E9D8 8006DDD8 ADE00004 */ sw $zero, 4($t7) +/* 06E9DC 8006DDDC ADF90000 */ sw $t9, ($t7) +/* 06E9E0 8006DDE0 8E020000 */ lw $v0, ($s0) +/* 06E9E4 8006DDE4 3C0DB800 */ lui $t5, 0xb800 +/* 06E9E8 8006DDE8 244C0008 */ addiu $t4, $v0, 8 +/* 06E9EC 8006DDEC AE0C0000 */ sw $t4, ($s0) +/* 06E9F0 8006DDF0 AC400004 */ sw $zero, 4($v0) +/* 06E9F4 8006DDF4 AC4D0000 */ sw $t5, ($v0) +/* 06E9F8 8006DDF8 8FAE002C */ lw $t6, 0x2c($sp) +/* 06E9FC 8006DDFC 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EA00 8006DE00 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EA04 8006DE04 31C4007F */ andi $a0, $t6, 0x7f +/* 06EA08 8006DE08 0C01AC2B */ jal get_map_default_vehicle +/* 06EA0C 8006DE0C AD040000 */ sw $a0, ($t0) +/* 06EA10 8006DE10 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EA14 8006DE14 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EA18 8006DE18 3C0B8012 */ lui $t3, %hi(gGameCurrentCutscene) # $t3, 0x8012 +/* 06EA1C 8006DE1C 256B3508 */ addiu $t3, %lo(gGameCurrentCutscene) # addiu $t3, $t3, 0x3508 +/* 06EA20 8006DE20 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EA24 8006DE24 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EA28 8006DE28 24180064 */ li $t8, 100 +/* 06EA2C 8006DE2C AD420000 */ sw $v0, ($t2) +/* 06EA30 8006DE30 AD200000 */ sw $zero, ($t1) +/* 06EA34 8006DE34 AD780000 */ sw $t8, ($t3) +/* 06EA38 8006DE38 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EA3C 8006DE3C AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EA40 8006DE40 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 +/* 06EA44 8006DE44 A0203515 */ sb $zero, %lo(gIsPaused)($at) +/* 06EA48 8006DE48 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 +/* 06EA4C 8006DE4C A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) +/* 06EA50 8006DE50 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06EA54 8006DE54 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EA58 8006DE58 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EA5C 8006DE5C 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06EA60 8006DE60 8C650000 */ lw $a1, ($v1) +/* 06EA64 8006DE64 8D040000 */ lw $a0, ($t0) +/* 06EA68 8006DE68 8D470000 */ lw $a3, ($t2) +/* 06EA6C 8006DE6C 8D260000 */ lw $a2, ($t1) +/* 06EA70 8006DE70 0C01B2D6 */ jal load_level_game +/* 06EA74 8006DE74 00000000 */ nop +/* 06EA78 8006DE78 0C027068 */ jal get_save_file_index +/* 06EA7C 8006DE7C 00000000 */ nop +/* 06EA80 8006DE80 0C01BB12 */ jal safe_mark_write_save_file +/* 06EA84 8006DE84 00402025 */ move $a0, $v0 +/* 06EA88 8006DE88 10000114 */ b .L8006E2DC +/* 06EA8C 8006DE8C 8FBF0024 */ lw $ra, 0x24($sp) +.L8006DE90: +/* 06EA90 8006DE90 10430099 */ beq $v0, $v1, .L8006E0F8 +/* 06EA94 8006DE94 30590100 */ andi $t9, $v0, 0x100 +/* 06EA98 8006DE98 13200098 */ beqz $t9, .L8006E0FC +/* 06EA9C 8006DE9C 304C0080 */ andi $t4, $v0, 0x80 +/* 06EAA0 8006DEA0 0C01B305 */ jal unload_level_game +/* 06EAA4 8006DEA4 00000000 */ nop +/* 06EAA8 8006DEA8 8FAC002C */ lw $t4, 0x2c($sp) +/* 06EAAC 8006DEAC 3C018012 */ lui $at, %hi(gIsPaused) # $at, 0x8012 +/* 06EAB0 8006DEB0 A0203515 */ sb $zero, %lo(gIsPaused)($at) +/* 06EAB4 8006DEB4 3C018012 */ lui $at, %hi(gPostRaceViewPort) # $at, 0x8012 +/* 06EAB8 8006DEB8 318D007F */ andi $t5, $t4, 0x7f +/* 06EABC 8006DEBC A0203516 */ sb $zero, %lo(gPostRaceViewPort)($at) +/* 06EAC0 8006DEC0 25AEFFFF */ addiu $t6, $t5, -1 +/* 06EAC4 8006DEC4 2DC1000E */ sltiu $at, $t6, 0xe +/* 06EAC8 8006DEC8 10200085 */ beqz $at, .L8006E0E0 +/* 06EACC 8006DECC 000E7080 */ sll $t6, $t6, 2 +/* 06EAD0 8006DED0 3C01800E */ lui $at, %hi(jpt_800E71D8) # $at, 0x800e +/* 06EAD4 8006DED4 002E0821 */ addu $at, $at, $t6 +/* 06EAD8 8006DED8 8C2E71D8 */ lw $t6, %lo(jpt_800E71D8)($at) +/* 06EADC 8006DEDC 00000000 */ nop +/* 06EAE0 8006DEE0 01C00008 */ jr $t6 +/* 06EAE4 8006DEE4 00000000 */ nop +glabel L8006DEE8 +/* 06EAE8 8006DEE8 2404000F */ li $a0, 15 +/* 06EAEC 8006DEEC 2405FFFF */ li $a1, -1 +/* 06EAF0 8006DEF0 0C01B68A */ jal load_menu_with_level_background +/* 06EAF4 8006DEF4 24060001 */ li $a2, 1 +/* 06EAF8 8006DEF8 100000F8 */ b .L8006E2DC +/* 06EAFC 8006DEFC 8FBF0024 */ lw $ra, 0x24($sp) +glabel L8006DF00 +/* 06EB00 8006DF00 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EB04 8006DF04 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EB08 8006DF08 3C0B8012 */ lui $t3, %hi(gGameCurrentCutscene) # $t3, 0x8012 +/* 06EB0C 8006DF0C 256B3508 */ addiu $t3, %lo(gGameCurrentCutscene) # addiu $t3, $t3, 0x3508 +/* 06EB10 8006DF10 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EB14 8006DF14 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EB18 8006DF18 240F0064 */ li $t7, 100 +/* 06EB1C 8006DF1C AD000000 */ sw $zero, ($t0) +/* 06EB20 8006DF20 AD200000 */ sw $zero, ($t1) +/* 06EB24 8006DF24 AD6F0000 */ sw $t7, ($t3) +/* 06EB28 8006DF28 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EB2C 8006DF2C AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EB30 8006DF30 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06EB34 8006DF34 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EB38 8006DF38 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EB3C 8006DF3C 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06EB40 8006DF40 8C650000 */ lw $a1, ($v1) +/* 06EB44 8006DF44 8D470000 */ lw $a3, ($t2) +/* 06EB48 8006DF48 8D260000 */ lw $a2, ($t1) +/* 06EB4C 8006DF4C 8D040000 */ lw $a0, ($t0) +/* 06EB50 8006DF50 0C01B2D6 */ jal load_level_game +/* 06EB54 8006DF54 00000000 */ nop +/* 06EB58 8006DF58 0C027068 */ jal get_save_file_index +/* 06EB5C 8006DF5C 00000000 */ nop +/* 06EB60 8006DF60 0C01BB12 */ jal safe_mark_write_save_file +/* 06EB64 8006DF64 00402025 */ move $a0, $v0 +/* 06EB68 8006DF68 100000DC */ b .L8006E2DC +/* 06EB6C 8006DF6C 8FBF0024 */ lw $ra, 0x24($sp) +glabel L8006DF70 +/* 06EB70 8006DF70 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 +/* 06EB74 8006DF74 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 +/* 06EB78 8006DF78 80B80000 */ lb $t8, ($a1) +/* 06EB7C 8006DF7C 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EB80 8006DF80 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EB84 8006DF84 3C0B8012 */ lui $t3, %hi(gGameCurrentCutscene) # $t3, 0x8012 +/* 06EB88 8006DF88 256B3508 */ addiu $t3, %lo(gGameCurrentCutscene) # addiu $t3, $t3, 0x3508 +/* 06EB8C 8006DF8C 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EB90 8006DF90 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EB94 8006DF94 24190064 */ li $t9, 100 +/* 06EB98 8006DF98 AD200000 */ sw $zero, ($t1) +/* 06EB9C 8006DF9C AD790000 */ sw $t9, ($t3) +/* 06EBA0 8006DFA0 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EBA4 8006DFA4 AD180000 */ sw $t8, ($t0) +/* 06EBA8 8006DFA8 AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EBAC 8006DFAC 80A2000F */ lb $v0, 0xf($a1) +/* 06EBB0 8006DFB0 80A30001 */ lb $v1, 1($a1) +/* 06EBB4 8006DFB4 04400002 */ bltz $v0, .L8006DFC0 +/* 06EBB8 8006DFB8 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EBBC 8006DFBC AD220000 */ sw $v0, ($t1) +.L8006DFC0: +/* 06EBC0 8006DFC0 00A36021 */ addu $t4, $a1, $v1 +/* 06EBC4 8006DFC4 81820008 */ lb $v0, 8($t4) +/* 06EBC8 8006DFC8 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06EBCC 8006DFCC 04400002 */ bltz $v0, .L8006DFD8 +/* 06EBD0 8006DFD0 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06EBD4 8006DFD4 AD620000 */ sw $v0, ($t3) +.L8006DFD8: +/* 06EBD8 8006DFD8 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EBDC 8006DFDC 8D470000 */ lw $a3, ($t2) +/* 06EBE0 8006DFE0 8D040000 */ lw $a0, ($t0) +/* 06EBE4 8006DFE4 8C650000 */ lw $a1, ($v1) +/* 06EBE8 8006DFE8 8D260000 */ lw $a2, ($t1) +/* 06EBEC 8006DFEC 0C01B2D6 */ jal load_level_game +/* 06EBF0 8006DFF0 00000000 */ nop +/* 06EBF4 8006DFF4 0C027068 */ jal get_save_file_index +/* 06EBF8 8006DFF8 00000000 */ nop +/* 06EBFC 8006DFFC 0C01BB12 */ jal safe_mark_write_save_file +/* 06EC00 8006E000 00402025 */ move $a0, $v0 +/* 06EC04 8006E004 100000B5 */ b .L8006E2DC +/* 06EC08 8006E008 8FBF0024 */ lw $ra, 0x24($sp) +glabel L8006E00C +/* 06EC0C 8006E00C 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EC10 8006E010 AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EC14 8006E014 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06EC18 8006E018 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EC1C 8006E01C 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EC20 8006E020 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EC24 8006E024 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EC28 8006E028 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EC2C 8006E02C 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EC30 8006E030 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06EC34 8006E034 8C650000 */ lw $a1, ($v1) +/* 06EC38 8006E038 8D040000 */ lw $a0, ($t0) +/* 06EC3C 8006E03C 8D260000 */ lw $a2, ($t1) +/* 06EC40 8006E040 8D470000 */ lw $a3, ($t2) +/* 06EC44 8006E044 0C01B2D6 */ jal load_level_game +/* 06EC48 8006E048 00000000 */ nop +/* 06EC4C 8006E04C 100000A3 */ b .L8006E2DC +/* 06EC50 8006E050 8FBF0024 */ lw $ra, 0x24($sp) +glabel L8006E054 +/* 06EC54 8006E054 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 +/* 06EC58 8006E058 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EC5C 8006E05C 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 +/* 06EC60 8006E060 AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EC64 8006E064 80AF0001 */ lb $t7, 1($a1) +/* 06EC68 8006E068 80A40000 */ lb $a0, ($a1) +/* 06EC6C 8006E06C 00AFC021 */ addu $t8, $a1, $t7 +/* 06EC70 8006E070 80AE000F */ lb $t6, 0xf($a1) +/* 06EC74 8006E074 83190008 */ lb $t9, 8($t8) +/* 06EC78 8006E078 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EC7C 8006E07C 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EC80 8006E080 3C0B8012 */ lui $t3, %hi(gGameCurrentCutscene) # $t3, 0x8012 +/* 06EC84 8006E084 256B3508 */ addiu $t3, %lo(gGameCurrentCutscene) # addiu $t3, $t3, 0x3508 +/* 06EC88 8006E088 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EC8C 8006E08C 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EC90 8006E090 AD040000 */ sw $a0, ($t0) +/* 06EC94 8006E094 AD2E0000 */ sw $t6, ($t1) +/* 06EC98 8006E098 0C01AC2B */ jal get_map_default_vehicle +/* 06EC9C 8006E09C AD790000 */ sw $t9, ($t3) +/* 06ECA0 8006E0A0 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06ECA4 8006E0A4 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06ECA8 8006E0A8 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06ECAC 8006E0AC 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06ECB0 8006E0B0 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06ECB4 8006E0B4 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06ECB8 8006E0B8 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06ECBC 8006E0BC 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06ECC0 8006E0C0 8C650000 */ lw $a1, ($v1) +/* 06ECC4 8006E0C4 8D040000 */ lw $a0, ($t0) +/* 06ECC8 8006E0C8 8D260000 */ lw $a2, ($t1) +/* 06ECCC 8006E0CC AD420000 */ sw $v0, ($t2) +/* 06ECD0 8006E0D0 0C01B2D6 */ jal load_level_game +/* 06ECD4 8006E0D4 00403825 */ move $a3, $v0 +/* 06ECD8 8006E0D8 10000080 */ b .L8006E2DC +/* 06ECDC 8006E0DC 8FBF0024 */ lw $ra, 0x24($sp) +.L8006E0E0: +glabel L8006E0E0 +/* 06ECE0 8006E0E0 00002025 */ move $a0, $zero +/* 06ECE4 8006E0E4 2405FFFF */ li $a1, -1 +/* 06ECE8 8006E0E8 0C01B68A */ jal load_menu_with_level_background +/* 06ECEC 8006E0EC 00003025 */ move $a2, $zero +/* 06ECF0 8006E0F0 1000007A */ b .L8006E2DC +/* 06ECF4 8006E0F4 8FBF0024 */ lw $ra, 0x24($sp) +.L8006E0F8: +/* 06ECF8 8006E0F8 304C0080 */ andi $t4, $v0, 0x80 +.L8006E0FC: +/* 06ECFC 8006E0FC 11800047 */ beqz $t4, .L8006E21C +/* 06ED00 8006E100 00000000 */ nop +/* 06ED04 8006E104 10430045 */ beq $v0, $v1, .L8006E21C +/* 06ED08 8006E108 00000000 */ nop +/* 06ED0C 8006E10C 0C01B6F9 */ jal unload_level_menu +/* 06ED10 8006E110 00000000 */ nop +/* 06ED14 8006E114 3C0D8012 */ lui $t5, %hi(gSPTaskNum) # $t5, 0x8012 +/* 06ED18 8006E118 8DAD34E8 */ lw $t5, %lo(gSPTaskNum)($t5) +/* 06ED1C 8006E11C 3C0F8012 */ lui $t7, %hi(gDisplayLists) # $t7, 0x8012 +/* 06ED20 8006E120 000D7080 */ sll $t6, $t5, 2 +/* 06ED24 8006E124 01EE7821 */ addu $t7, $t7, $t6 +/* 06ED28 8006E128 8DEF11F0 */ lw $t7, %lo(gDisplayLists)($t7) +/* 06ED2C 8006E12C 8FAA002C */ lw $t2, 0x2c($sp) +/* 06ED30 8006E130 AE0F0000 */ sw $t7, ($s0) +/* 06ED34 8006E134 25F80008 */ addiu $t8, $t7, 8 +/* 06ED38 8006E138 AE180000 */ sw $t8, ($s0) +/* 06ED3C 8006E13C 3C19E900 */ lui $t9, 0xe900 +/* 06ED40 8006E140 ADF90000 */ sw $t9, ($t7) +/* 06ED44 8006E144 ADE00004 */ sw $zero, 4($t7) +/* 06ED48 8006E148 8E020000 */ lw $v0, ($s0) +/* 06ED4C 8006E14C 3C058012 */ lui $a1, %hi(D_80121250) # $a1, 0x8012 +/* 06ED50 8006E150 244C0008 */ addiu $t4, $v0, 8 +/* 06ED54 8006E154 AE0C0000 */ sw $t4, ($s0) +/* 06ED58 8006E158 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06ED5C 8006E15C 3C0DB800 */ lui $t5, 0xb800 +/* 06ED60 8006E160 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06ED64 8006E164 24A51250 */ addiu $a1, %lo(D_80121250) # addiu $a1, $a1, 0x1250 +/* 06ED68 8006E168 AC4D0000 */ sw $t5, ($v0) +/* 06ED6C 8006E16C AC400004 */ sw $zero, 4($v0) +/* 06ED70 8006E170 8D0F0000 */ lw $t7, ($t0) +/* 06ED74 8006E174 314E007F */ andi $t6, $t2, 0x7f +/* 06ED78 8006E178 A0AE0001 */ sb $t6, 1($a1) +/* 06ED7C 8006E17C 00AE1821 */ addu $v1, $a1, $t6 +/* 06ED80 8006E180 A0AF0000 */ sb $t7, ($a1) +/* 06ED84 8006E184 80780002 */ lb $t8, 2($v1) +/* 06ED88 8006E188 80790004 */ lb $t9, 4($v1) +/* 06ED8C 8006E18C 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06ED90 8006E190 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06ED94 8006E194 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06ED98 8006E198 AD180000 */ sw $t8, ($t0) +/* 06ED9C 8006E19C AD390000 */ sw $t9, ($t1) +/* 06EDA0 8006E1A0 AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EDA4 8006E1A4 806C000C */ lb $t4, 0xc($v1) +/* 06EDA8 8006E1A8 3C0B8012 */ lui $t3, %hi(gGameCurrentCutscene) # $t3, 0x8012 +/* 06EDAC 8006E1AC 256B3508 */ addiu $t3, %lo(gGameCurrentCutscene) # addiu $t3, $t3, 0x3508 +/* 06EDB0 8006E1B0 00002025 */ move $a0, $zero +/* 06EDB4 8006E1B4 0C027094 */ jal get_player_selected_vehicle +/* 06EDB8 8006E1B8 AD6C0000 */ sw $t4, ($t3) +/* 06EDBC 8006E1BC 3C108012 */ lui $s0, %hi(gSettingsPtr) # $s0, 0x8012 +/* 06EDC0 8006E1C0 26103510 */ addiu $s0, %lo(gSettingsPtr) # addiu $s0, $s0, 0x3510 +/* 06EDC4 8006E1C4 8E0D0000 */ lw $t5, ($s0) +/* 06EDC8 8006E1C8 3C088012 */ lui $t0, %hi(gPlayableMapId) # $t0, 0x8012 +/* 06EDCC 8006E1CC 91AE004A */ lbu $t6, 0x4a($t5) +/* 06EDD0 8006E1D0 3C098012 */ lui $t1, %hi(gGameCurrentEntrance) # $t1, 0x8012 +/* 06EDD4 8006E1D4 25293504 */ addiu $t1, %lo(gGameCurrentEntrance) # addiu $t1, $t1, 0x3504 +/* 06EDD8 8006E1D8 250834F4 */ addiu $t0, %lo(gPlayableMapId) # addiu $t0, $t0, 0x34f4 +/* 06EDDC 8006E1DC 3C038012 */ lui $v1, %hi(gGameNumPlayers) # $v1, 0x8012 +/* 06EDE0 8006E1E0 24633500 */ addiu $v1, %lo(gGameNumPlayers) # addiu $v1, $v1, 0x3500 +/* 06EDE4 8006E1E4 8D040000 */ lw $a0, ($t0) +/* 06EDE8 8006E1E8 8D260000 */ lw $a2, ($t1) +/* 06EDEC 8006E1EC 25C5FFFF */ addiu $a1, $t6, -1 +/* 06EDF0 8006E1F0 AC650000 */ sw $a1, ($v1) +/* 06EDF4 8006E1F4 0C01B2D6 */ jal load_level_game +/* 06EDF8 8006E1F8 00403825 */ move $a3, $v0 +/* 06EDFC 8006E1FC 3C188012 */ lui $t8, %hi(D_8012351C) # $t8, 0x8012 +/* 06EE00 8006E200 8F18351C */ lw $t8, %lo(D_8012351C)($t8) +/* 06EE04 8006E204 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EE08 8006E208 3C018012 */ lui $at, %hi(D_801234FC) # $at, 0x8012 +/* 06EE0C 8006E20C 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EE10 8006E210 AC2034FC */ sw $zero, %lo(D_801234FC)($at) +/* 06EE14 8006E214 10000030 */ b .L8006E2D8 +/* 06EE18 8006E218 AD580000 */ sw $t8, ($t2) +.L8006E21C: +/* 06EE1C 8006E21C 1840002F */ blez $v0, .L8006E2DC +/* 06EE20 8006E220 8FBF0024 */ lw $ra, 0x24($sp) +/* 06EE24 8006E224 0C01B6F9 */ jal unload_level_menu +/* 06EE28 8006E228 00000000 */ nop +/* 06EE2C 8006E22C 3C198012 */ lui $t9, %hi(gSPTaskNum) # $t9, 0x8012 +/* 06EE30 8006E230 8F3934E8 */ lw $t9, %lo(gSPTaskNum)($t9) +/* 06EE34 8006E234 3C0D8012 */ lui $t5, %hi(gDisplayLists) # $t5, 0x8012 +/* 06EE38 8006E238 00196080 */ sll $t4, $t9, 2 +/* 06EE3C 8006E23C 01AC6821 */ addu $t5, $t5, $t4 +/* 06EE40 8006E240 8DAD11F0 */ lw $t5, %lo(gDisplayLists)($t5) +/* 06EE44 8006E244 3C0FE900 */ lui $t7, 0xe900 +/* 06EE48 8006E248 AE0D0000 */ sw $t5, ($s0) +/* 06EE4C 8006E24C 25AE0008 */ addiu $t6, $t5, 8 +/* 06EE50 8006E250 AE0E0000 */ sw $t6, ($s0) +/* 06EE54 8006E254 ADA00004 */ sw $zero, 4($t5) +/* 06EE58 8006E258 ADAF0000 */ sw $t7, ($t5) +/* 06EE5C 8006E25C 8E020000 */ lw $v0, ($s0) +/* 06EE60 8006E260 3C19B800 */ lui $t9, 0xb800 +/* 06EE64 8006E264 24580008 */ addiu $t8, $v0, 8 +/* 06EE68 8006E268 AE180000 */ sw $t8, ($s0) +/* 06EE6C 8006E26C AC400004 */ sw $zero, 4($v0) +/* 06EE70 8006E270 AC590000 */ sw $t9, ($v0) +/* 06EE74 8006E274 3C0A8012 */ lui $t2, %hi(gLevelDefaultVehicleID) # $t2, 0x8012 +/* 06EE78 8006E278 3C018012 */ lui $at, %hi(sRenderContext) # $at, 0x8012 +/* 06EE7C 8006E27C 254A3518 */ addiu $t2, %lo(gLevelDefaultVehicleID) # addiu $t2, $t2, 0x3518 +/* 06EE80 8006E280 AC2034EC */ sw $zero, %lo(sRenderContext)($at) +/* 06EE84 8006E284 8D460000 */ lw $a2, ($t2) +/* 06EE88 8006E288 8FA4002C */ lw $a0, 0x2c($sp) +/* 06EE8C 8006E28C 0C01B2B9 */ jal func_8006CAE4 +/* 06EE90 8006E290 2405FFFF */ li $a1, -1 +/* 06EE94 8006E294 3C108012 */ lui $s0, %hi(gSettingsPtr) # $s0, 0x8012 +/* 06EE98 8006E298 26103510 */ addiu $s0, %lo(gSettingsPtr) # addiu $s0, $s0, 0x3510 +/* 06EE9C 8006E29C 8E0C0000 */ lw $t4, ($s0) +/* 06EEA0 8006E2A0 00000000 */ nop +/* 06EEA4 8006E2A4 918D004B */ lbu $t5, 0x4b($t4) +/* 06EEA8 8006E2A8 00000000 */ nop +/* 06EEAC 8006E2AC 11A0000B */ beqz $t5, .L8006E2DC +/* 06EEB0 8006E2B0 8FBF0024 */ lw $ra, 0x24($sp) +/* 06EEB4 8006E2B4 0C0270B4 */ jal is_in_tracks_mode +/* 06EEB8 8006E2B8 00000000 */ nop +/* 06EEBC 8006E2BC 14400007 */ bnez $v0, .L8006E2DC +/* 06EEC0 8006E2C0 8FBF0024 */ lw $ra, 0x24($sp) +/* 06EEC4 8006E2C4 0C0002CA */ jal func_80000B28 +/* 06EEC8 8006E2C8 00000000 */ nop +/* 06EECC 8006E2CC 8E0E0000 */ lw $t6, ($s0) +/* 06EED0 8006E2D0 00000000 */ nop +/* 06EED4 8006E2D4 A1C0004B */ sb $zero, 0x4b($t6) +.L8006E2D8: +/* 06EED8 8006E2D8 8FBF0024 */ lw $ra, 0x24($sp) +.L8006E2DC: +/* 06EEDC 8006E2DC 8FB00020 */ lw $s0, 0x20($sp) +/* 06EEE0 8006E2E0 03E00008 */ jr $ra +/* 06EEE4 8006E2E4 27BD0030 */ addiu $sp, $sp, 0x30 + diff --git a/asm/non_matchings/game_ui/func_8009ECF0.s b/asm/non_matchings/game_ui/func_8009ECF0.s index 2b8634d9..2b660002 100644 --- a/asm/non_matchings/game_ui/func_8009ECF0.s +++ b/asm/non_matchings/game_ui/func_8009ECF0.s @@ -195,8 +195,8 @@ glabel func_8009ECF0 /* 09FBDC 8009EFDC 0C001298 */ jal set_sound_channel_volume /* 09FBE0 8009EFE0 24057FFF */ li $a1, 32767 /* 09FBE4 8009EFE4 3C10800E */ lui $s0, %hi(D_800E2770) # $s0, 0x800e -/* 09FBE8 8009EFE8 3C11800E */ lui $s1, %hi(D_800E2790) # $s1, 0x800e -/* 09FBEC 8009EFEC 26312790 */ addiu $s1, %lo(D_800E2790) # addiu $s1, $s1, 0x2790 +/* 09FBE8 8009EFE8 3C11800E */ lui $s1, %hi(gShowCourseDirections) # $s1, 0x800e +/* 09FBEC 8009EFEC 26312790 */ addiu $s1, %lo(gShowCourseDirections) # addiu $s1, $s1, 0x2790 /* 09FBF0 8009EFF0 26102770 */ addiu $s0, %lo(D_800E2770) # addiu $s0, $s0, 0x2770 .L8009EFF4: /* 09FBF4 8009EFF4 8E040004 */ lw $a0, 4($s0) diff --git a/asm/non_matchings/game_ui/func_800A0BD4.s b/asm/non_matchings/game_ui/func_800A0BD4.s index 81ceafaf..c483b6b1 100644 --- a/asm/non_matchings/game_ui/func_800A0BD4.s +++ b/asm/non_matchings/game_ui/func_800A0BD4.s @@ -25,8 +25,8 @@ glabel func_800A0BD4 /* 0A1830 800A0C30 00000000 */ nop .L800A0C34: /* 0A1834 800A0C34 3C10800E */ lui $s0, %hi(D_800E2770) # $s0, 0x800e -/* 0A1838 800A0C38 3C13800E */ lui $s3, %hi(D_800E2790) # $s3, 0x800e -/* 0A183C 800A0C3C 26732790 */ addiu $s3, %lo(D_800E2790) # addiu $s3, $s3, 0x2790 +/* 0A1838 800A0C38 3C13800E */ lui $s3, %hi(gShowCourseDirections) # $s3, 0x800e +/* 0A183C 800A0C3C 26732790 */ addiu $s3, %lo(gShowCourseDirections) # addiu $s3, $s3, 0x2790 /* 0A1840 800A0C40 26102770 */ addiu $s0, %lo(D_800E2770) # addiu $s0, $s0, 0x2770 /* 0A1844 800A0C44 2414007F */ li $s4, 127 /* 0A1848 800A0C48 2412007F */ li $s2, 127 diff --git a/asm/non_matchings/object_models/func_8005F99C.s b/asm/non_matchings/object_models/func_8005F99C.s index d0677110..567955d6 100644 --- a/asm/non_matchings/object_models/func_8005F99C.s +++ b/asm/non_matchings/object_models/func_8005F99C.s @@ -63,8 +63,8 @@ glabel func_8005F99C /* 060678 8005FA78 AFA40050 */ sw $a0, 0x50($sp) /* 06067C 8005FA7C ACD80000 */ sw $t8, ($a2) .L8005FA80: -/* 060680 8005FA80 3C198012 */ lui $t9, %hi(D_8011D620) # $t9, 0x8012 -/* 060684 8005FA84 8F39D620 */ lw $t9, %lo(D_8011D620)($t9) +/* 060680 8005FA80 3C198012 */ lui $t9, %hi(gObjectModelTable) # $t9, 0x8012 +/* 060684 8005FA84 8F39D620 */ lw $t9, %lo(gObjectModelTable)($t9) /* 060688 8005FA88 00134080 */ sll $t0, $s3, 2 /* 06068C 8005FA8C 03281021 */ addu $v0, $t9, $t0 /* 060690 8005FA90 8C500000 */ lw $s0, ($v0) diff --git a/asm/non_matchings/object_models/func_80061A00.s b/asm/non_matchings/object_models/func_80061A00.s index 29dc1014..6b146db2 100644 --- a/asm/non_matchings/object_models/func_80061A00.s +++ b/asm/non_matchings/object_models/func_80061A00.s @@ -1,7 +1,7 @@ glabel func_80061A00 /* 062600 80061A00 27BDFFB8 */ addiu $sp, $sp, -0x48 -/* 062604 80061A04 3C0E8012 */ lui $t6, %hi(D_8011D638) # $t6, 0x8012 -/* 062608 80061A08 8DCED638 */ lw $t6, %lo(D_8011D638)($t6) +/* 062604 80061A04 3C0E8012 */ lui $t6, %hi(gAnimationTable) # $t6, 0x8012 +/* 062608 80061A08 8DCED638 */ lw $t6, %lo(gAnimationTable)($t6) /* 06260C 80061A0C 00057840 */ sll $t7, $a1, 1 /* 062610 80061A10 AFBF003C */ sw $ra, 0x3c($sp) /* 062614 80061A14 AFBE0038 */ sw $fp, 0x38($sp) @@ -50,8 +50,8 @@ glabel func_80061A00 /* 0626B0 80061AB0 0010A080 */ sll $s4, $s0, 2 /* 0626B4 80061AB4 00008825 */ move $s1, $zero .L80061AB8: -/* 0626B8 80061AB8 3C088012 */ lui $t0, %hi(D_8011D63C) # $t0, 0x8012 -/* 0626BC 80061ABC 8D08D63C */ lw $t0, %lo(D_8011D63C)($t0) +/* 0626B8 80061AB8 3C088012 */ lui $t0, %hi(gObjectAnimationTable) # $t0, 0x8012 +/* 0626BC 80061ABC 8D08D63C */ lw $t0, %lo(gObjectAnimationTable)($t0) /* 0626C0 80061AC0 24040020 */ li $a0, 32 /* 0626C4 80061AC4 01141021 */ addu $v0, $t0, $s4 /* 0626C8 80061AC8 8C520000 */ lw $s2, ($v0) diff --git a/asm/non_matchings/objects/func_8000B020.s b/asm/non_matchings/objects/func_8000B020.s index 058e5b36..8ed527cd 100644 --- a/asm/non_matchings/objects/func_8000B020.s +++ b/asm/non_matchings/objects/func_8000B020.s @@ -114,10 +114,10 @@ glabel func_8000B020 /* 00BDD8 8000B1D8 02E02025 */ move $a0, $s7 /* 00BDDC 8000B1DC 0C003A95 */ jal spawn_object /* 00BDE0 8000B1E0 00002825 */ move $a1, $zero -/* 00BDE4 8000B1E4 3C01800E */ lui $at, %hi(D_800DC75C) # $at, 0x800e +/* 00BDE4 8000B1E4 3C01800E */ lui $at, %hi(gShieldEffectObject) # $at, 0x800e /* 00BDE8 8000B1E8 3C108012 */ lui $s0, %hi(D_8011B078) # $s0, 0x8012 /* 00BDEC 8000B1EC 3C118012 */ lui $s1, %hi(gSceneCurrDisplayList) # $s1, 0x8012 -/* 00BDF0 8000B1F0 AC22C75C */ sw $v0, %lo(D_800DC75C)($at) +/* 00BDF0 8000B1F0 AC22C75C */ sw $v0, %lo(gShieldEffectObject)($at) /* 00BDF4 8000B1F4 2631B0A0 */ addiu $s1, %lo(gSceneCurrDisplayList) # addiu $s1, $s1, -0x4f60 /* 00BDF8 8000B1F8 2610B078 */ addiu $s0, %lo(D_8011B078) # addiu $s0, $s0, -0x4f88 .L8000B1FC: @@ -144,7 +144,7 @@ glabel func_8000B020 /* 00BE4C 8000B24C 0C003A95 */ jal spawn_object /* 00BE50 8000B250 00002825 */ move $a1, $zero /* 00BE54 8000B254 8FBF003C */ lw $ra, 0x3c($sp) -/* 00BE58 8000B258 3C01800E */ lui $at, %hi(D_800DC764) # $at, 0x800e +/* 00BE58 8000B258 3C01800E */ lui $at, %hi(gMagnetEffectObject) # $at, 0x800e /* 00BE5C 8000B25C C7B50010 */ lwc1 $f21, 0x10($sp) /* 00BE60 8000B260 C7B40014 */ lwc1 $f20, 0x14($sp) /* 00BE64 8000B264 8FB0001C */ lw $s0, 0x1c($sp) @@ -155,7 +155,7 @@ glabel func_8000B020 /* 00BE78 8000B278 8FB50030 */ lw $s5, 0x30($sp) /* 00BE7C 8000B27C 8FB60034 */ lw $s6, 0x34($sp) /* 00BE80 8000B280 8FB70038 */ lw $s7, 0x38($sp) -/* 00BE84 8000B284 AC22C764 */ sw $v0, %lo(D_800DC764)($at) +/* 00BE84 8000B284 AC22C764 */ sw $v0, %lo(gMagnetEffectObject)($at) /* 00BE88 8000B288 03E00008 */ jr $ra /* 00BE8C 8000B28C 27BD0068 */ addiu $sp, $sp, 0x68 diff --git a/asm/non_matchings/objects/func_8000B750.s b/asm/non_matchings/objects/func_8000B750.s index 99b2e0d4..e9193a34 100644 --- a/asm/non_matchings/objects/func_8000B750.s +++ b/asm/non_matchings/objects/func_8000B750.s @@ -214,7 +214,7 @@ glabel func_8000B750 /* 00C660 8000BA60 AFAA0038 */ sw $t2, 0x38($sp) /* 00C664 8000BA64 0C01C0C8 */ jal f32_vec3_apply_object_rotation /* 00C668 8000BA68 E7A8007C */ swc1 $f8, 0x7c($sp) -/* 00C66C 8000BA6C 0C004558 */ jal func_80011560 +/* 00C66C 8000BA6C 0C004558 */ jal ignore_bounds_check /* 00C670 8000BA70 00000000 */ nop /* 00C674 8000BA74 8FA20080 */ lw $v0, 0x80($sp) /* 00C678 8000BA78 C7AA0074 */ lwc1 $f10, 0x74($sp) diff --git a/asm/non_matchings/objects/func_8000BADC.s b/asm/non_matchings/objects/func_8000BADC.s index 0b3c85b9..c4f61af4 100644 --- a/asm/non_matchings/objects/func_8000BADC.s +++ b/asm/non_matchings/objects/func_8000BADC.s @@ -300,8 +300,8 @@ glabel func_8000BADC /* 00CB04 8000BF04 1420FF2F */ bnez $at, .L8000BBC4 /* 00CB08 8000BF08 26520004 */ addiu $s2, $s2, 4 .L8000BF0C: -/* 00CB0C 8000BF0C 3C04800E */ lui $a0, %hi(D_800DC764) # $a0, 0x800e -/* 00CB10 8000BF10 8C84C764 */ lw $a0, %lo(D_800DC764)($a0) +/* 00CB0C 8000BF0C 3C04800E */ lui $a0, %hi(gMagnetEffectObject) # $a0, 0x800e +/* 00CB10 8000BF10 8C84C764 */ lw $a0, %lo(gMagnetEffectObject)($a0) /* 00CB14 8000BF14 00000000 */ nop /* 00CB18 8000BF18 10800004 */ beqz $a0, .L8000BF2C /* 00CB1C 8000BF1C 8FBF002C */ lw $ra, 0x2c($sp) diff --git a/asm/non_matchings/objects/func_8000CC7C.s b/asm/non_matchings/objects/func_8000CC7C.s index 9ffa9a21..9f7ffe2f 100644 --- a/asm/non_matchings/objects/func_8000CC7C.s +++ b/asm/non_matchings/objects/func_8000CC7C.s @@ -1376,7 +1376,7 @@ glabel L8000D98C .L8000DFCC: /* 00EBCC 8000DFCC 12400012 */ beqz $s2, .L8000E018 /* 00EBD0 8000DFD0 8FAE0130 */ lw $t6, 0x130($sp) -/* 00EBD4 8000DFD4 0C00E4C8 */ jal func_80039320 +/* 00EBD4 8000DFD4 0C00E4C8 */ jal set_taj_voice_line /* 00EBD8 8000DFD8 24040250 */ li $a0, 592 /* 00EBDC 8000DFDC 96F80014 */ lhu $t8, 0x14($s7) /* 00EBE0 8000DFE0 264E001F */ addiu $t6, $s2, 0x1f diff --git a/asm/non_matchings/objects/func_8001C6C4.s b/asm/non_matchings/objects/func_8001C6C4.s index b0d2de75..8509cfb7 100644 --- a/asm/non_matchings/objects/func_8001C6C4.s +++ b/asm/non_matchings/objects/func_8001C6C4.s @@ -1,6 +1,4 @@ .late_rodata -glabel D_800E5644 -.float 50000.0 glabel D_800E5648 .double 1.2 glabel D_800E5650 diff --git a/asm/non_matchings/racer/func_80049794.s b/asm/non_matchings/racer/func_80049794.s index b64b628d..8373d242 100644 --- a/asm/non_matchings/racer/func_80049794.s +++ b/asm/non_matchings/racer/func_80049794.s @@ -104,15 +104,15 @@ glabel func_80049794 /* 04A450 80049850 820C01D7 */ lb $t4, 0x1d7($s0) /* 04A454 80049854 2401000C */ li $at, 12 /* 04A458 80049858 118100A0 */ beq $t4, $at, .L80049ADC -/* 04A45C 8004985C 3C028012 */ lui $v0, %hi(D_8011D5AE) # $v0, 0x8012 -/* 04A460 80049860 8042D5AE */ lb $v0, %lo(D_8011D5AE)($v0) -/* 04A464 80049864 3C198012 */ lui $t9, %hi(D_8011D5B0) # $t9, 0x8012 +/* 04A45C 8004985C 3C028012 */ lui $v0, %hi(gRacerWaveCount) # $v0, 0x8012 +/* 04A460 80049860 8042D5AE */ lb $v0, %lo(gRacerWaveCount)($v0) +/* 04A464 80049864 3C198012 */ lui $t9, %hi(gRacerCurrentWave) # $t9, 0x8012 /* 04A468 80049868 1040009C */ beqz $v0, .L80049ADC /* 04A46C 8004986C 2443FFFF */ addiu $v1, $v0, -1 /* 04A470 80049870 0460001A */ bltz $v1, .L800498DC /* 04A474 80049874 00602025 */ move $a0, $v1 -/* 04A478 80049878 3C0D8012 */ lui $t5, %hi(D_8011D5B0) # $t5, 0x8012 -/* 04A47C 8004987C 8DADD5B0 */ lw $t5, %lo(D_8011D5B0)($t5) +/* 04A478 80049878 3C0D8012 */ lui $t5, %hi(gRacerCurrentWave) # $t5, 0x8012 +/* 04A47C 8004987C 8DADD5B0 */ lw $t5, %lo(gRacerCurrentWave)($t5) /* 04A480 80049880 00047080 */ sll $t6, $a0, 2 /* 04A484 80049884 3C0140A0 */ li $at, 0x40A00000 # 5.000000 /* 04A488 80049888 01AE1021 */ addu $v0, $t5, $t6 @@ -138,7 +138,7 @@ glabel func_80049794 /* 04A4D4 800498D4 4501FFF6 */ bc1t .L800498B0 /* 04A4D8 800498D8 00000000 */ nop .L800498DC: -/* 04A4DC 800498DC 8F39D5B0 */ lw $t9, %lo(D_8011D5B0)($t9) +/* 04A4DC 800498DC 8F39D5B0 */ lw $t9, %lo(gRacerCurrentWave)($t9) /* 04A4E0 800498E0 00042880 */ sll $a1, $a0, 2 /* 04A4E4 800498E4 C62C0010 */ lwc1 $f12, 0x10($s1) /* 04A4E8 800498E8 14830003 */ bne $a0, $v1, .L800498F8 @@ -207,8 +207,8 @@ glabel func_80049794 /* 04A5D0 800499D0 1041000F */ beq $v0, $at, .L80049A10 /* 04A5D4 800499D4 00000000 */ nop /* 04A5D8 800499D8 1122000D */ beq $t1, $v0, .L80049A10 -/* 04A5DC 800499DC 3C0E8012 */ lui $t6, %hi(D_8011D5B0) # $t6, 0x8012 -/* 04A5E0 800499E0 8DCED5B0 */ lw $t6, %lo(D_8011D5B0)($t6) +/* 04A5DC 800499DC 3C0E8012 */ lui $t6, %hi(gRacerCurrentWave) # $t6, 0x8012 +/* 04A5E0 800499E0 8DCED5B0 */ lw $t6, %lo(gRacerCurrentWave)($t6) /* 04A5E4 800499E4 3C01800E */ lui $at, %hi(D_800E64B0 + 4) # $at, 0x800e /* 04A5E8 800499E8 01C57821 */ addu $t7, $t6, $a1 /* 04A5EC 800499EC 8DF80004 */ lw $t8, 4($t7) diff --git a/asm/non_matchings/unknown_0255E0/func_8002C0C4.s b/asm/non_matchings/unknown_0255E0/func_8002C0C4.s index cd6fc609..b8333eaa 100644 --- a/asm/non_matchings/unknown_0255E0/func_8002C0C4.s +++ b/asm/non_matchings/unknown_0255E0/func_8002C0C4.s @@ -23,10 +23,10 @@ glabel func_8002C0C4 /* 02CD00 8002C100 34A500FF */ ori $a1, (0xFFFF00FF & 0xFFFF) # ori $a1, $a1, 0xff /* 02CD04 8002C104 0C01C327 */ jal allocate_from_main_pool_safe /* 02CD08 8002C108 02A02025 */ move $a0, $s5 -/* 02CD0C 8002C10C 3C038012 */ lui $v1, %hi(D_8011D30C) # $v1, 0x8012 +/* 02CD0C 8002C10C 3C038012 */ lui $v1, %hi(gTrackModelHeap) # $v1, 0x8012 /* 02CD10 8002C110 3C11800E */ lui $s1, %hi(gCurrentLevelModel) # $s1, 0x800e /* 02CD14 8002C114 2631C918 */ addiu $s1, %lo(gCurrentLevelModel) # addiu $s1, $s1, -0x36e8 -/* 02CD18 8002C118 2463D30C */ addiu $v1, %lo(D_8011D30C) # addiu $v1, $v1, -0x2cf4 +/* 02CD18 8002C118 2463D30C */ addiu $v1, %lo(gTrackModelHeap) # addiu $v1, $v1, -0x2cf4 /* 02CD1C 8002C11C 3C05FFFF */ lui $a1, (0xFFFF00FF >> 16) # lui $a1, 0xffff /* 02CD20 8002C120 AC620000 */ sw $v0, ($v1) /* 02CD24 8002C124 AE220000 */ sw $v0, ($s1) @@ -45,8 +45,8 @@ glabel func_8002C0C4 /* 02CD58 8002C158 AC20D378 */ sw $zero, %lo(D_8011D378)($at) /* 02CD5C 8002C15C 0C01DB16 */ jal load_asset_section_from_rom /* 02CD60 8002C160 2404001A */ li $a0, 26 -/* 02CD64 8002C164 3C148012 */ lui $s4, %hi(D_8011D310) # $s4, 0x8012 -/* 02CD68 8002C168 2694D310 */ addiu $s4, %lo(D_8011D310) # addiu $s4, $s4, -0x2cf0 +/* 02CD64 8002C164 3C148012 */ lui $s4, %hi(gLevelModelTable) # $s4, 0x8012 +/* 02CD68 8002C168 2694D310 */ addiu $s4, %lo(gLevelModelTable) # addiu $s4, $s4, -0x2cf0 /* 02CD6C 8002C16C AE820000 */ sw $v0, ($s4) /* 02CD70 8002C170 8C4F0000 */ lw $t7, ($v0) /* 02CD74 8002C174 2403FFFF */ li $v1, -1 @@ -293,12 +293,12 @@ glabel func_8002C0C4 .L8002C510: /* 02D110 8002C510 0C01C42C */ jal set_free_queue_state /* 02D114 8002C514 00002025 */ move $a0, $zero -/* 02D118 8002C518 3C048012 */ lui $a0, %hi(D_8011D30C) # $a0, 0x8012 -/* 02D11C 8002C51C 8C84D30C */ lw $a0, %lo(D_8011D30C)($a0) +/* 02D118 8002C518 3C048012 */ lui $a0, %hi(gTrackModelHeap) # $a0, 0x8012 +/* 02D11C 8002C51C 8C84D30C */ lw $a0, %lo(gTrackModelHeap)($a0) /* 02D120 8002C520 0C01C450 */ jal free_from_memory_pool /* 02D124 8002C524 00000000 */ nop -/* 02D128 8002C528 3C058012 */ lui $a1, %hi(D_8011D30C) # $a1, 0x8012 -/* 02D12C 8002C52C 8CA5D30C */ lw $a1, %lo(D_8011D30C)($a1) +/* 02D128 8002C528 3C058012 */ lui $a1, %hi(gTrackModelHeap) # $a1, 0x8012 +/* 02D12C 8002C52C 8CA5D30C */ lw $a1, %lo(gTrackModelHeap)($a1) /* 02D130 8002C530 3C06FFFF */ lui $a2, (0xFFFF00FF >> 16) # lui $a2, 0xffff /* 02D134 8002C534 34C600FF */ ori $a2, (0xFFFF00FF & 0xFFFF) # ori $a2, $a2, 0xff /* 02D138 8002C538 0C01C3BE */ jal allocate_at_address_in_main_pool diff --git a/asm/non_matchings/unknown_032760/func_8003F2E8.s b/asm/non_matchings/unknown_032760/func_8003F2E8.s index 17ca9950..54871714 100644 --- a/asm/non_matchings/unknown_032760/func_8003F2E8.s +++ b/asm/non_matchings/unknown_032760/func_8003F2E8.s @@ -259,7 +259,7 @@ glabel func_8003F2E8 /* 04028C 8003F68C E600000C */ swc1 $f0, 0xc($s0) /* 040290 8003F690 E6000010 */ swc1 $f0, 0x10($s0) /* 040294 8003F694 E6000014 */ swc1 $f0, 0x14($s0) -/* 040298 8003F698 0C004558 */ jal func_80011560 +/* 040298 8003F698 0C004558 */ jal ignore_bounds_check /* 04029C 8003F69C AFA80038 */ sw $t0, 0x38($sp) /* 0402A0 8003F6A0 8FB80040 */ lw $t8, 0x40($sp) /* 0402A4 8003F6A4 02002025 */ move $a0, $s0 diff --git a/asm/non_matchings/unknown_032760/obj_init_fish.s b/asm/non_matchings/unknown_032760/obj_init_fish.s index 5cabb823..22693f96 100644 --- a/asm/non_matchings/unknown_032760/obj_init_fish.s +++ b/asm/non_matchings/unknown_032760/obj_init_fish.s @@ -117,7 +117,7 @@ glabel obj_init_fish /* 0379D8 80036DD8 E6280014 */ swc1 $f8, 0x14($s1) /* 0379DC 80036DDC E7AE0030 */ swc1 $f14, 0x30($sp) /* 0379E0 80036DE0 46045401 */ sub.s $f16, $f10, $f4 -/* 0379E4 80036DE4 0C004558 */ jal func_80011560 +/* 0379E4 80036DE4 0C004558 */ jal ignore_bounds_check /* 0379E8 80036DE8 E7B0002C */ swc1 $f16, 0x2c($sp) /* 0379EC 80036DEC 8FA50030 */ lw $a1, 0x30($sp) /* 0379F0 80036DF0 8FA7002C */ lw $a3, 0x2c($sp) diff --git a/asm/non_matchings/unknown_032760/obj_loop_butterfly.s b/asm/non_matchings/unknown_032760/obj_loop_butterfly.s index 5d901a95..44f487be 100644 --- a/asm/non_matchings/unknown_032760/obj_loop_butterfly.s +++ b/asm/non_matchings/unknown_032760/obj_loop_butterfly.s @@ -366,7 +366,7 @@ glabel L80040E54 /* 041D68 80041168 45000015 */ bc1f .L800411C0 /* 041D6C 8004116C 00000000 */ nop /* 041D70 80041170 AFA8003C */ sw $t0, 0x3c($sp) -/* 041D74 80041174 0C004558 */ jal func_80011560 +/* 041D74 80041174 0C004558 */ jal ignore_bounds_check /* 041D78 80041178 E7A20090 */ swc1 $f2, 0x90($sp) /* 041D7C 8004117C C7A20090 */ lwc1 $f2, 0x90($sp) /* 041D80 80041180 C7A80094 */ lwc1 $f8, 0x94($sp) diff --git a/asm/non_matchings/unknown_032760/obj_loop_fish.s b/asm/non_matchings/unknown_032760/obj_loop_fish.s index 7786438b..1658ef61 100644 --- a/asm/non_matchings/unknown_032760/obj_loop_fish.s +++ b/asm/non_matchings/unknown_032760/obj_loop_fish.s @@ -170,7 +170,7 @@ glabel obj_loop_fish /* 037F4C 8003734C E6320010 */ swc1 $f18, 0x10($s1) /* 037F50 80037350 E6320014 */ swc1 $f18, 0x14($s1) /* 037F54 80037354 E7AC006C */ swc1 $f12, 0x6c($sp) -/* 037F58 80037358 0C004558 */ jal func_80011560 +/* 037F58 80037358 0C004558 */ jal ignore_bounds_check /* 037F5C 8003735C E7A20064 */ swc1 $f2, 0x64($sp) /* 037F60 80037360 C7A20064 */ lwc1 $f2, 0x64($sp) /* 037F64 80037364 C7AC006C */ lwc1 $f12, 0x6c($sp) diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 6f6a1fb2..86cae3ee 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -10,6 +10,10 @@ typedef struct LevelObjectEntryCommon { typedef struct LevelObjectEntry_Racer { /* 0x00 */ LevelObjectEntryCommon common; + /* 0x08 */ s16 angleZ; + /* 0x0A */ s16 angleX; + /* 0x0C */ s16 angleY; + /* 0x0E */ s16 playerIndex; } LevelObjectEntry_Racer; typedef struct LevelObjectEntry_Scenery { @@ -110,7 +114,7 @@ typedef struct LevelObjectEntry_SetupPoint { /* 0x00 */ LevelObjectEntryCommon common; /* 0x08 */ u8 unk8; /* 0x09 */ u8 unk9; - /* 0x0A */ u8 unkA; + /* 0x0A */ u8 angleY; } LevelObjectEntry_SetupPoint; typedef struct LevelObjectEntry_Dino_Whale { @@ -308,10 +312,10 @@ typedef struct LevelObjectEntry_EggCreator { typedef struct LevelObjectEntry_CharacterFlag { /* 0x00 */ LevelObjectEntryCommon common; - /* 0x08 */ s16 unk8; - /* 0x0A */ s16 unkA; - /* 0x0C */ s16 unkC; - /* 0x0E */ s16 unkE; + /* 0x08 */ s16 angleZ; + /* 0x0A */ s16 radius; + /* 0x0C */ s16 angleY; + /* 0x0E */ s16 playerIndex; } LevelObjectEntry_CharacterFlag; /* @@ -571,11 +575,11 @@ typedef struct LevelObjectEntry_SilverCoinAdv2 { typedef struct LevelObjectEntry_TTDoor { /* 0x00 */ LevelObjectEntryCommon common; - /* 0x08 */ u8 unk8; + /* 0x08 */ u8 angleY; /* 0x09 */ u8 unk9; /* 0x0A */ u8 unkA; /* 0x0B */ u8 unkB; - /* 0x0C */ u8 unkC; + /* 0x0C */ u8 radius; /* 0x0D */ u8 padD; /* 0x0E */ s8 doorID; } LevelObjectEntry_TTDoor; diff --git a/include/macros.h b/include/macros.h index 191cb8ce..896c281b 100644 --- a/include/macros.h +++ b/include/macros.h @@ -65,4 +65,7 @@ // Used to suppress warnings in the ./generate_ctx.sh script. #define INCONSISTENT +// Used to make a u32 colour value look clearer. Transforms 0xFF0000FF to 255, 0, 0, 255 +#define COLOUR_RGBA32(r, g, b, a) (((r << 24) | (g << 16) | (b << 8) | a)) + #endif diff --git a/include/structs.h b/include/structs.h index 71b16b1d..e175a2ae 100644 --- a/include/structs.h +++ b/include/structs.h @@ -362,7 +362,7 @@ typedef struct LevelHeader { /* 0x44 */ u8 unk44[0x5]; - /* 0x49 */ s8 unk49; + /* 0x49 */ s8 skyDome; /* 0x4A */ s8 playerIndex; /* 0x4B */ s8 laps; /* 0x4C */ s8 race_type; @@ -1127,8 +1127,8 @@ typedef struct Object_Racer { /* 0x176 */ s16 unk176; /* 0x178 */ void *magnetSoundMask; /* 0x17C */ s32 shieldSoundMask; - /* 0x180 */ s32 unk180; // Soundmask for banana pickup, whether that's the only use I do not yet know. - /* 0x184 */ s8 unk184; + /* 0x180 */ s32 bananaSoundMask; + /* 0x184 */ s8 magnetModelID; /* 0x185 */ s8 bananas; /* 0x186 */ u8 unk186; /* 0x187 */ s8 attackType; @@ -1140,8 +1140,8 @@ typedef struct Object_Racer { /* 0x190 */ s16 courseCheckpoint; /* 0x192 */ s8 checkpoint; /* 0x193 */ s8 lap; - /* 0x194 */ s8 unk194; - /* 0x195 */ s8 unk195; + /* 0x194 */ s8 countLap; + /* 0x195 */ s8 magnetLevel3; /* 0x196 */ s16 unk196; /* 0x198 */ s16 unk198; /* 0x19A */ s16 unk19A; @@ -1189,10 +1189,10 @@ typedef struct Object_Racer { /* 0x1DC */ u8 wheel_surfaces[4]; /* 0x1E0 */ s8 unk1E0; /* 0x1E1 */ s8 steerAngle; - /* 0x1E2 */ s8 unk1E2; + /* 0x1E2 */ s8 groundedWheels; /* 0x1E3 */ s8 unk1E3; /* 0x1E4 */ s8 unk1E4; - /* 0x1E5 */ s8 unk1E5; + /* 0x1E5 */ s8 waterTimer; // Set to a value, then counts down when leaving water. /* 0x1E6 */ s8 drift_direction; /* 0x1E7 */ s8 miscAnimCounter; /* 0x1E8 */ s8 unk1E8; @@ -1231,8 +1231,8 @@ typedef struct Object_Racer { /* 0x20B */ u8 unk20B; /* 0x20C */ u8 throttleReleased; /* 0x20D */ u8 unk20D; - /* 0x20E */ u16 unk20E; - /* 0x210 */ u8 unk210; + /* 0x20E */ u16 delaySoundID; + /* 0x210 */ u8 delaySoundTimer; /* 0x211 */ s8 unk211; /* 0x212 */ s8 unk212; /* 0x213 */ s8 unk213; @@ -1240,7 +1240,7 @@ typedef struct Object_Racer { /* 0x215 */ s8 unk215; /* 0x216 */ u8 unk216; /* 0x217 */ u8 unk217; - /* 0x218 */ void *unk218; + /* 0x218 */ s32 weaponSoundMask; /* 0x21C */ s32 unk21C; /* 0x220 */ s32 unk220; } Object_Racer; @@ -1264,7 +1264,7 @@ typedef struct Object_ModeChange { } Object_ModeChange; typedef struct Object_Door { - /* 0x00 */ f32 unk0; + /* 0x00 */ f32 homeY; /* 0x04 */ u8 pad4[0x4]; /* 0x08 */ s32 unk8; /* 0x0A */ s16 padA; @@ -1605,7 +1605,7 @@ typedef struct ObjectTransform { /* 0x0000 */ s16 y_rotation; /* 0x0002 */ s16 x_rotation; /* 0x0004 */ s16 z_rotation; - /* 0x0006 */ s16 unk6; // Flags? + /* 0x0006 */ s16 flags; /* 0x0008 */ f32 scale; /* 0x000C */ f32 x_position; /* 0x0010 */ f32 y_position; diff --git a/src/game.c b/src/game.c index 7e5a762a..f8dd78e5 100644 --- a/src/game.c +++ b/src/game.c @@ -97,7 +97,7 @@ s8 gSkipGfxTask = FALSE; s8 D_800DD390 = 0; s16 gLevelLoadTimer = 0; s8 D_800DD398 = 0; -s8 D_800DD39C = 0; +s8 gFutureFunLandLevelTarget = FALSE; s8 gDmemInvalid = FALSE; UNUSED s32 D_800DD3A4 = 0; UNUSED s32 D_800DD3A8 = 0; @@ -149,14 +149,14 @@ OSSched gMainSched; // 0x288 / 648 bytes u64 gSchedStack[0x400]; s32 gSPTaskNum; s32 sRenderContext; -s32 D_801234F0; // I don't think this is ever not 1 +s32 gRenderMenu; // I don't think this is ever not 1 // Similar to gMapId, but is 0 if not currently playing a level (e.g. start menu). s32 gPlayableMapId; s32 D_801234F8; s32 D_801234FC; -s32 D_80123500; -s32 D_80123504; -s32 D_80123508; +s32 gGameNumPlayers; +s32 gGameCurrentEntrance; +s32 gGameCurrentCutscene; s32 gPrevPlayerCount; Settings *gSettingsPtr; s8 gIsLoading; @@ -165,7 +165,7 @@ s8 gPostRaceViewPort; Vehicle gLevelDefaultVehicleID; Vehicle D_8012351C; // Looks to be the current level's vehicle ID. s32 sBootDelayTimer; -s8 D_80123524; +s8 gLevelLoadType; s8 gNextMap; UNUSED s8 D_80123526; // Set to 0 then never used. s32 gCurrNumF3dCmdsPerPlayer; @@ -679,7 +679,7 @@ void load_level(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicl func_800AB4A8(gCurrentLevelHeader->weatherType, gCurrentLevelHeader->weatherEnable, gCurrentLevelHeader->weatherVelX << 8, gCurrentLevelHeader->weatherVelY << 8, gCurrentLevelHeader->weatherVelZ << 8, gCurrentLevelHeader->weatherIntensity * 257, gCurrentLevelHeader->weatherOpacity * 257); set_weather_limits(-1, -0x200); } - if (gCurrentLevelHeader->unk49 == -1) { + if (gCurrentLevelHeader->skyDome == -1) { gCurrentLevelHeader->unkA4 = load_texture((s32) gCurrentLevelHeader->unkA4); gCurrentLevelHeader->unkA8 = 0; gCurrentLevelHeader->unkAA = 0; @@ -768,7 +768,10 @@ char *get_level_name(s32 levelId) { return levelName; } -void func_8006BEFC(void) { +/** + * Call multiple functions to stop and free audio, then free track, weather and wave data. +*/ +void clear_audio_and_track(void) { frontCleanupMultiSelect(); set_background_prim_colour(0, 0, 0); free_from_memory_pool(gCurrentLevelHeader); @@ -777,14 +780,14 @@ void func_8006BEFC(void) { func_800018E0(); func_800012E8(); func_80031B60(); - func_8002C7D4(); + free_track(); func_80008174(); adjust_audio_volume(VOLUME_NORMAL); if (gCurrentLevelHeader->weatherEnable > 0) { free_weather_memory(); } - //! @bug this will never be true because unk49 is signed. - if (gCurrentLevelHeader->unk49 == 0xFF) { + //! @bug this will never be true because skyDome is signed. + if (gCurrentLevelHeader->skyDome == 0xFF) { free_texture(gCurrentLevelHeader->unkA4); } } @@ -960,6 +963,7 @@ void init_game(void) { } osCreateScheduler(&gMainSched, &gSchedStack[0x400], /*priority*/ 13, viMode, 1); + // Antipiracy measure. gDmemInvalid = FALSE; if (check_dmem_validity() == FALSE) { gDmemInvalid = TRUE; @@ -968,26 +972,26 @@ void init_game(void) { init_PI_mesg_queue(); setup_gfx_mesg_queues(&gMainSched); audio_init(&gMainSched); - func_80008040(); // Should be very similar to func_8005F850 + func_80008040(); // Should be very similar to allocate_object_model_pools sControllerStatus = init_controllers(); tex_init_textures(); - func_8005F850(); // Matched + allocate_object_model_pools(); allocate_object_pools(); diPrintfInit(); - func_800598D0(); + allocate_ghost_data(); init_particle_assets(); init_weather(); calc_and_alloc_heap_for_settings(); default_alloc_displaylist_heap(); load_fonts(); init_controller_paks(); - func_80081218(); + func_80081218(); // init_save_data create_and_start_thread30(); osCreateMesgQueue(&gNMIMesgQueue, &gNMIOSMesg, 1); osScAddClient(&gMainSched, (OSScClient*) gNMISched, &gNMIMesgQueue, OS_SC_ID_PRENMI); gNMIMesgBuf = 0; - D_80123504 = 0; - D_80123508 = 0; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0; gSPTaskNum = 0; gCurrDisplayList = gDisplayLists[gSPTaskNum]; @@ -1118,18 +1122,18 @@ void main_game_loop(void) { } void func_8006CAE4(s32 numPlayers, s32 trackID, Vehicle vehicle) { - D_80123500 = numPlayers - 1; + gGameNumPlayers = numPlayers - 1; if (trackID == -1) { gPlayableMapId = get_track_id_to_load(); } else { gPlayableMapId = trackID; // Unused, because arg1 is always -1. } - load_level_game(gPlayableMapId, D_80123500, D_80123504, vehicle); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, vehicle); } /** * Calls load_level() with the same arguments except for the cutsceneId, - * which is the value at D_80123508. Also does some other stuff. + * which is the value at gGameCurrentCutscene. Also does some other stuff. * Used when ingame. */ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId) { @@ -1137,7 +1141,7 @@ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v set_free_queue_state(0); func_80065EA0(); func_800C3048(); - load_level(levelId, numberOfPlayers, entranceId, vehicleId, D_80123508); + load_level(levelId, numberOfPlayers, entranceId, vehicleId, gGameCurrentCutscene); func_8009ECF0(get_viewport_count()); func_800AE728(8, 0x10, 0x96, 0x64, 0x32, 0); func_8001BF20(); @@ -1146,8 +1150,12 @@ void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v func_80072298(1); } -// Guessing this is the "unload everything ready for level swap" function. -void func_8006CC14(void) { +/** + * Call numerous functions to clear data in RAM. + * Then call to free particles, HUD and text. + * Waits for a GFX task before unloading. +*/ +void unload_level_game(void) { set_free_queue_state(0); if (gSkipGfxTask == FALSE) { if (gDrawFrameTimer != 1) { @@ -1155,7 +1163,7 @@ void func_8006CC14(void) { } gSkipGfxTask = TRUE; } - func_8006BEFC(); + clear_audio_and_track(); transition_begin(&D_800DD3F4); func_800AE270(); func_800A003C(); @@ -1322,12 +1330,12 @@ void ingame_logic_loop(s32 updateRate) { render_borders_for_multiplayer(&gCurrDisplayList); render_minimap_and_misc_hud(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList, updateRate); render_second_multiplayer_borders(&gCurrDisplayList); - if (D_800DD39C != 0) { + if (gFutureFunLandLevelTarget) { if (func_800214C4() != 0) { gPlayableMapId = ASSET_LEVEL_FUTUREFUNLANDHUB; D_801234F8 = 1; - D_80123504 = 0; - D_800DD39C = 0; + gGameCurrentEntrance = 0; + gFutureFunLandLevelTarget = FALSE; } } sp3C = FALSE; @@ -1335,8 +1343,8 @@ void ingame_logic_loop(s32 updateRate) { D_800DD390 -= updateRate; if (D_800DD390 <= 0) { D_800DD390 = 0; - push_level_property_stack(ASSET_LEVEL_CENTRALAREAHUB, 0, VEHICLE_CAR, 0); - push_level_property_stack(ASSET_LEVEL_WIZPIGAMULETSEQUENCE, 0, -1, 0xA); + push_level_property_stack(ASSET_LEVEL_CENTRALAREAHUB, 0, VEHICLE_CAR, CUTSCENE_ID_NONE); + push_level_property_stack(ASSET_LEVEL_WIZPIGAMULETSEQUENCE, 0, -1, CUTSCENE_ID_UNK_A); sp3C = TRUE; } } @@ -1345,33 +1353,33 @@ void ingame_logic_loop(s32 updateRate) { if (gLevelLoadTimer <= 0) { buttonHeldInputs = L_TRIG; sp3C = TRUE; - switch (D_80123524) { - case 1: + switch (gLevelLoadType) { + case LEVEL_LOAD_UNK1: buttonHeldInputs = (L_TRIG | Z_TRIG); break; - case 2: + case LEVEL_LOAD_TROPHY_RACE: sp40 = 3; func_80098208(); D_801234FC = 2; break; - case 3: - D_800DD39C = 1; + case LEVEL_LOAD_LIGHTHOUSE_CUTSCENE: + gFutureFunLandLevelTarget = TRUE; // fall-through - case 4: + case LEVEL_LOAD_FUTURE_FUN_LAND: D_801234F8 = 1; gPlayableMapId = gNextMap; - D_80123504 = 0; - D_80123508 = 0; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0; buttonHeldInputs = 0; break; } - D_80123524 = 0; + gLevelLoadType = LEVEL_LOAD_NORMAL; gLevelLoadTimer = 0; } } if (sp3C) { if (get_level_property_stack_pos() != 0) { - pop_level_property_stack(&gPlayableMapId, &D_80123504, &i, &D_80123508); + pop_level_property_stack(&gPlayableMapId, &gGameCurrentEntrance, &i, &gGameCurrentCutscene); set_frame_blackout_timer(); if (gPlayableMapId < 0) { if (gPlayableMapId == (s32)SPECIAL_MAP_ID_NO_LEVEL || gPlayableMapId == (s32)SPECIAL_MAP_ID_UNK_NEG10) { @@ -1401,7 +1409,7 @@ void ingame_logic_loop(s32 updateRate) { func_80000B28(); } set_frame_blackout_timer(); - pop_level_property_stack(&gPlayableMapId, &D_80123504, &i, &D_80123508); + pop_level_property_stack(&gPlayableMapId, &gGameCurrentEntrance, &i, &gGameCurrentCutscene); if (gPlayableMapId < 0) { if (gPlayableMapId == -1 || gPlayableMapId == -10) { if (gPlayableMapId == -10 && is_in_two_player_adventure()) { @@ -1425,7 +1433,7 @@ void ingame_logic_loop(s32 updateRate) { gIsPaused = FALSE; gLevelLoadTimer = 0; gPostRaceViewPort = NULL; - func_8006CC14(); + unload_level_game(); safe_mark_write_save_file(get_save_file_index()); if (sp40 != 0) { gIsLoading = FALSE; @@ -1478,14 +1486,14 @@ void ingame_logic_loop(s32 updateRate) { } else if (!(buttonHeldInputs & R_TRIG)) { if (!(buttonHeldInputs & Z_TRIG)) { gPlayableMapId = D_80121250[0]; - D_80123504 = D_80121250[15]; - D_80123508 = D_80121250[D_80121250[1] + 8]; + gGameCurrentEntrance = D_80121250[15]; + gGameCurrentCutscene = D_80121250[D_80121250[1] + 8]; gLevelDefaultVehicleID = get_map_default_vehicle(gPlayableMapId); - if (D_80123508 < 0) { - D_80123508 = 0x64; + if (gGameCurrentCutscene < 0) { + gGameCurrentCutscene = 0x64; } } - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); } else { safe_mark_write_save_file(get_save_file_index()); load_menu_with_level_background(MENU_TITLE, -1, 0); @@ -1494,8 +1502,8 @@ void ingame_logic_loop(s32 updateRate) { } if (D_801234F8 != 0) { gPostRaceViewPort = NULL; - func_8006CC14(); - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + unload_level_game(); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); safe_mark_write_save_file(get_save_file_index()); D_801234F8 = 0; } @@ -1516,14 +1524,14 @@ void func_8006D8F0(UNUSED s32 arg0) { s32 temp; if (sRenderContext != DRAW_UNK_04) { gPlayableMapId = D_80121250[0]; - D_80123504 = 0; - D_80123508 = 0x64; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0x64; temp = D_80121250[1]; if (D_80121250[15] >= 0) { - D_80123504 = D_80121250[15]; + gGameCurrentEntrance = D_80121250[15]; } if (D_80121250[temp + 8] >= 0) { - D_80123508 = D_80121250[temp + 8]; + gGameCurrentCutscene = D_80121250[temp + 8]; } D_801234F8 = 1; } @@ -1567,9 +1575,9 @@ UNUSED void set_render_context(s32 changeTo) { * Used for every kind of menu that's not ingame. */ void load_menu_with_level_background(s32 menuId, s32 levelId, s32 cutsceneId) { - alloc_displaylist_heap(0); + alloc_displaylist_heap(PLAYER_ONE); sRenderContext = DRAW_MENU; - D_801234F0 = TRUE; + gRenderMenu = TRUE; set_sound_channel_volume(0, 32767); set_sound_channel_volume(1, 32767); set_sound_channel_volume(2, 32767); @@ -1584,10 +1592,10 @@ void load_menu_with_level_background(s32 menuId, s32 levelId, s32 cutsceneId) { } } if (menuId == MENU_UNUSED_2 || menuId == MENU_LOGOS || menuId == MENU_TITLE) { - func_800813C0(); + reset_title_logo_scale(); } menu_init(menuId); - D_80123504 = 0; + gGameCurrentEntrance = 0; } /** @@ -1624,11 +1632,15 @@ void load_level_menu(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle v set_free_queue_state(2); } -void func_8006DBE4(void) { +/** + * Call numerous functions to clear data in RAM. + * Then call to free particles, HUD and text. +*/ +void unload_level_menu(void) { if (!gIsLoading) { gIsLoading = TRUE; set_free_queue_state(0); - func_8006BEFC(); + clear_audio_and_track(); transition_begin(&D_800DD3F4); func_800AE270(); func_800A003C(); @@ -1638,7 +1650,11 @@ void func_8006DBE4(void) { gIsLoading = FALSE; } -void func_8006DC58(s32 updateRate) { +/** + * Used in menus, update objects and draw the game. + * In the tracks menu, this only runs if there's a track actively loaded. +*/ +void update_menu_scene(s32 updateRate) { if (get_thread30_level_id_to_load() == 0) { func_80010994(updateRate); gParticlePtrList_flush(); @@ -1658,33 +1674,33 @@ void func_8006DCF8(s32 updateRate) { gIsPaused = FALSE; gPostRaceViewPort = NULL; - if (!gIsLoading && D_801234F0) { - func_8006DC58(updateRate); + if (!gIsLoading && gRenderMenu) { + update_menu_scene(updateRate); } menuLoopResult = menu_loop(&gCurrDisplayList, &gGameCurrMatrix, &gGameCurrVertexList, &gGameCurrTriList, updateRate); - D_801234F0 = TRUE; + gRenderMenu = TRUE; if (menuLoopResult == -2) { - D_801234F0 = FALSE; + gRenderMenu = FALSE; return; } if ((menuLoopResult != -1) && (menuLoopResult & 0x200)) { - func_8006DBE4(); + unload_level_menu(); gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); gSPEndDisplayList(gCurrDisplayList++); gPlayableMapId = menuLoopResult & 0x7F; gLevelDefaultVehicleID = get_map_default_vehicle(gPlayableMapId); - D_80123504 = 0; - D_80123508 = 0x64; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0x64; sRenderContext = DRAW_GAME; gIsPaused = FALSE; gPostRaceViewPort = NULL; - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); safe_mark_write_save_file(get_save_file_index()); return; } if ((menuLoopResult != -1) && (menuLoopResult & 0x100)) { - func_8006CC14(); + unload_level_game(); gIsPaused = FALSE; gPostRaceViewPort = NULL; switch (menuLoopResult & 0x7F) { @@ -1693,40 +1709,40 @@ void func_8006DCF8(s32 updateRate) { break; case 14: gPlayableMapId = ASSET_LEVEL_CENTRALAREAHUB; - D_80123504 = 0; - D_80123508 = 0x64; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0x64; sRenderContext = DRAW_GAME; - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); safe_mark_write_save_file(get_save_file_index()); break; case 1: - D_80123504 = 0; - D_80123508 = 0x64; + gGameCurrentEntrance = 0; + gGameCurrentCutscene = 0x64; gPlayableMapId = D_80121250[0]; sRenderContext = DRAW_GAME; // Minor issue with these 2 if statements temp2 = D_80121250[D_80121250[1] + 8]; temp = D_80121250[15]; if (temp >= 0) { - D_80123504 = temp; + gGameCurrentEntrance = temp; } if (temp2 >= 0) { - D_80123508 = temp2; + gGameCurrentCutscene = temp2; } - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); safe_mark_write_save_file(get_save_file_index()); break; case 2: sRenderContext = DRAW_GAME; - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); break; case 3: sRenderContext = DRAW_GAME; gPlayableMapId = D_80121250[0]; - D_80123504 = D_80121250[15]; - D_80123508 = D_80121250[D_80121250[1] + 8]; + gGameCurrentEntrance = D_80121250[15]; + gGameCurrentCutscene = D_80121250[D_80121250[1] + 8]; gLevelDefaultVehicleID = get_map_default_vehicle(gPlayableMapId); - load_level_game(gPlayableMapId, D_80123500, D_80123504, gLevelDefaultVehicleID); + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, gLevelDefaultVehicleID); break; default: load_menu_with_level_background(MENU_TITLE, -1, 0); @@ -1735,7 +1751,7 @@ void func_8006DCF8(s32 updateRate) { return; } if ((menuLoopResult & 0x80) && (menuLoopResult != -1)) { - func_8006DBE4(); + unload_level_menu(); // Minor issue here. gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); @@ -1744,18 +1760,18 @@ void func_8006DCF8(s32 updateRate) { D_80121250[1] = temp; D_80121250[0] = gPlayableMapId; gPlayableMapId = D_80121250[temp + 2]; - D_80123504 = D_80121250[temp + 4]; + gGameCurrentEntrance = D_80121250[temp + 4]; sRenderContext = DRAW_GAME; - D_80123508 = D_80121250[temp + 12]; + gGameCurrentCutscene = D_80121250[temp + 12]; temp = get_player_selected_vehicle(0); - D_80123500 = gSettingsPtr->gNumRacers - 1; - load_level_game(gPlayableMapId, D_80123500, D_80123504, temp); + gGameNumPlayers = gSettingsPtr->gNumRacers - 1; + load_level_game(gPlayableMapId, gGameNumPlayers, gGameCurrentEntrance, temp); D_801234FC = 0; gLevelDefaultVehicleID = D_8012351C; return; } if (menuLoopResult > 0) { - func_8006DBE4(); + unload_level_menu(); gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); gSPEndDisplayList(gCurrDisplayList++); @@ -1774,7 +1790,7 @@ GLOBAL_ASM("asm/non_matchings/game/func_8006DCF8.s") void load_level_for_menu(s32 levelId, s32 numberOfPlayers, s32 cutsceneId) { if (!gIsLoading) { - func_8006DBE4(); + unload_level_menu(); if (get_thread30_level_id_to_load() == 0) { gCurrDisplayList = gDisplayLists[gSPTaskNum]; gDPFullSync(gCurrDisplayList++); @@ -2163,7 +2179,7 @@ void default_alloc_displaylist_heap(void) { void func_8006F140(s32 arg0) { if (gLevelLoadTimer == 0) { gLevelLoadTimer = 40; - D_80123524 = 0; + gLevelLoadType = LEVEL_LOAD_NORMAL; D_80123526 = 0; if (arg0 == 1) { //FADE_BARNDOOR_HORIZONTAL? transition_begin(&gLevelFadeOutTransition); @@ -2186,15 +2202,18 @@ UNUSED void func_8006F20C(void) { if (gLevelLoadTimer == 0) { transition_begin(&gLevelFadeOutTransition); gLevelLoadTimer = 40; - D_80123524 = 1; + gLevelLoadType = LEVEL_LOAD_UNK1; } } -void func_8006F254(void) { +/** + * Begins a fade transition, then signals to the level loading that it wants to be a trophy race. +*/ +void begin_trophy_race_teleport(void) { if (gLevelLoadTimer == 0) { transition_begin(&gLevelFadeOutTransition); gLevelLoadTimer = 40; - D_80123524 = 2; + gLevelLoadType = LEVEL_LOAD_TROPHY_RACE; } } @@ -2208,7 +2227,7 @@ void begin_lighthouse_rocket_cutscene(void) { transition_begin(&gLevelFadeOutTransition); gLevelLoadTimer = 40; gNextMap = ASSET_LEVEL_ROCKETSEQUENCE; - D_80123524 = 3; + gLevelLoadType = LEVEL_LOAD_LIGHTHOUSE_CUTSCENE; } } } @@ -2222,7 +2241,7 @@ void begin_level_teleport(s32 levelID) { gNextMap = levelID; transition_begin(&gLevelFadeOutTransition); gLevelLoadTimer = 40; - D_80123524 = 4; + gLevelLoadType = LEVEL_LOAD_FUTURE_FUN_LAND; } } diff --git a/src/game.h b/src/game.h index 1db10aca..5685cba7 100644 --- a/src/game.h +++ b/src/game.h @@ -40,9 +40,18 @@ enum CutsceneIDs { CUTSCENE_ID_UNK_3 = 3, CUTSCENE_ID_UNK_5 = 5, CUTSCENE_ID_UNK_7 = 7, + CUTSCENE_ID_UNK_A = 0x0A, CUTSCENE_ID_UNK_64 = 0x64 }; +enum LevelLoadType { + LEVEL_LOAD_NORMAL, + LEVEL_LOAD_UNK1, + LEVEL_LOAD_TROPHY_RACE, + LEVEL_LOAD_LIGHTHOUSE_CUTSCENE, + LEVEL_LOAD_FUTURE_FUN_LAND, +}; + /** * Bit 00: Read Eeprom Data flap times * Bit 01: Read Eeprom Data course times @@ -91,7 +100,7 @@ u8 get_current_level_race_type(void); LevelHeader *get_current_level_header(void); u8 get_total_level_header_count(void); char *get_level_name(s32 levelId); -void func_8006BEFC(void); +void clear_audio_and_track(void); void func_8006BFC8(s8 *arg0); void frontCleanupMultiSelect(void); TempStruct5 *func_8006C18C(void); @@ -106,7 +115,7 @@ void init_game(void); void main_game_loop(void); void func_8006CAE4(s32 numPlayers, s32 trackID, Vehicle vehicle); void load_level_game(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId); -void func_8006CC14(void); +void unload_level_game(void); void func_8006D8A4(void); void func_8006D8E0(s32 arg0); void func_8006D8F0(s32 arg0); @@ -118,8 +127,8 @@ void set_level_default_vehicle(Vehicle arg0); void func_8006DB20(Vehicle vehicleId); Vehicle get_level_default_vehicle(void); void load_level_menu(s32 levelId, s32 numberOfPlayers, s32 entranceId, Vehicle vehicleId, s32 cutsceneId); -void func_8006DBE4(void); -void func_8006DC58(s32 arg0); +void unload_level_menu(void); +void update_menu_scene(s32 arg0); void load_level_for_menu(s32 levelId, s32 numberOfPlayers, s32 cutsceneId); void calc_and_alloc_heap_for_settings(void); void func_8006E5BC(void); @@ -147,7 +156,7 @@ void mark_write_eeprom_settings(void); s32 check_dmem_validity(void); void func_8006F140(s32 arg0); void func_8006F20C(void); -void func_8006F254(void); +void begin_trophy_race_teleport(void); void begin_lighthouse_rocket_cutscene(void); void begin_level_teleport(s32 arg0); void func_8006F388(u8 arg0); diff --git a/src/game_ui.c b/src/game_ui.c index f8efb035..5f0bd6bb 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -22,8 +22,6 @@ #include "unknown_008C40.h" #include "controller.h" -extern u32 osTvType; - /************ .data ************/ // Unused? @@ -130,7 +128,7 @@ unk800E2770 D_800E2770[2] = { { 0, 0xFF, 0, 0, 0, 0, 0 }, }; -u8 D_800E2790 = 1; +u8 gShowCourseDirections = TRUE; u8 D_800E2794[4][4] = { {1, 1, 1, 1}, @@ -349,9 +347,9 @@ void render_hud(Gfx **dList, MatrixS **mtx, Vertex **vertexList, Object *arg3, s if (func_8001E440() != 10) { if (gHUDNumPlayers == ONE_PLAYER) { if (get_buttons_pressed_from_player(D_80126D10) & D_CBUTTONS && racer->racer.raceFinished == FALSE && ((gHudLevelHeader->race_type == RACETYPE_DEFAULT) || gHudLevelHeader->race_type == RACETYPE_HORSESHOE_GULCH) && D_80126D34) { - D_800E2790 = 1 - D_800E2790; - play_sound_global((SOUND_TING_HIGHER + D_800E2790), NULL); - if (D_800E2790) { + gShowCourseDirections = 1 - gShowCourseDirections; + play_sound_global((SOUND_TING_HIGHER + gShowCourseDirections), NULL); + if (gShowCourseDirections) { D_800E27B8 = 0x78; } else { D_800E27B8 = 0; @@ -541,7 +539,7 @@ void render_course_indicator_arrows(Object_Racer *racer, s32 updateRate) { s32 type; IndicatorArrow *indicator; - if (D_800E2790) { + if (gShowCourseDirections) { timer = racer->indicator_timer; if (timer > 0) { type = racer->indicator_type; @@ -1054,7 +1052,7 @@ GLOBAL_ASM("asm/non_matchings/game_ui/func_800A4C44.s") void render_lap_count(Object_Racer *racer, s32 updateRate) { if (racer->raceFinished == FALSE && (gHUDNumPlayers <= ONE_PLAYER || racer->lap <= 0 || racer->lap_times[racer->lap] >= 180) && (gHUDNumPlayers <= ONE_PLAYER || D_800E2794[gHUDNumPlayers][racer->playerIndex] == 3)) { - if (gHudLevelHeader->laps == (0, racer->unk194 + 1) && gHUDNumPlayers < THREE_PLAYERS) { + if (gHudLevelHeader->laps == (0, racer->countLap + 1) && gHUDNumPlayers < THREE_PLAYERS) { D_80126CDC->unk21A += updateRate; if (D_80126CDC->unk21A > 6) { D_80126CDC->unk218++; @@ -1066,10 +1064,10 @@ void render_lap_count(Object_Racer *racer, s32 updateRate) { func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &D_80126CDC->unk200); } func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &D_80126CDC->unk60); - if (racer->unk194 >= gHudLevelHeader->laps - 1) { + if (racer->countLap >= gHudLevelHeader->laps - 1) { D_80126CDC->unk98 = gHudLevelHeader->laps; } else { - D_80126CDC->unk98 = racer->unk194 + 1; + D_80126CDC->unk98 = racer->countLap + 1; } D_80126CDC->unkD8 = gHudLevelHeader->laps; func_800AA600(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, &D_80126CDC->unk80); @@ -1460,7 +1458,7 @@ void render_race_time(Object_Racer *racer, s32 updateRate) { } } else { stopwatchTimer = 0; - for (i = 0; racer->unk194 >= i && i < gHudLevelHeader->laps; i++) { + for (i = 0; i <= racer->countLap && i < gHudLevelHeader->laps; i++) { stopwatchTimer += racer->lap_times[i]; } countingDown = stopwatchTimer == 0 || racer->raceFinished || is_game_paused(); diff --git a/src/menu.c b/src/menu.c index 32dac086..ad71259c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -177,7 +177,7 @@ s32 D_8012685C; s32 D_80126860; s32 D_80126864; s16 gTitleDemoTimer; -s32 D_8012686C; +s32 gTitleRevealTimer; f32 D_80126870; s8 *sTitleScreenDemoIds; //Misc Asset 66 - title_screen_demo_ids.bin - 12 or 13 values. s32 D_80126878[24]; @@ -291,7 +291,7 @@ s32 D_80126CC0; s8 D_800DF450 = 0; f32 D_800DF454 = 1.0f; -s32 D_800DF458 = 1; +s32 gResetTitleScale = 1; s32 gTitleScreenCurrentOption = 0; // 0 = "Start", 1 = "Options" s32 D_800DF460 = 0; // Currently selected menu index? Reused in different menus. s32 D_800DF464 = 4; // Currently unknown, might be a different type. @@ -1722,6 +1722,7 @@ void func_80080E6C(void) { GLOBAL_ASM("asm/non_matchings/menu/func_80080E90.s") +// init_save_data #ifdef NON_EQUIVALENT // Should be functionally equivalent. void func_80081218(void) { @@ -1759,8 +1760,11 @@ void func_80081218(void) { GLOBAL_ASM("asm/non_matchings/menu/func_80081218.s") #endif -void func_800813C0(void) { - D_800DF458 = 1; +/** + * Sets the title reveal timer to zero when the menu boots, meaning it may not automatically appear. +*/ +void reset_title_logo_scale(void) { + gResetTitleScale = TRUE; } /** @@ -1779,7 +1783,6 @@ void menu_init(u32 menuId) { //Needs to be one line for (i = 0; i < 4; i++) { D_80126808[i] = 0; } - func_80001844(); switch (gCurrentMenuId) { case MENU_LOGOS: @@ -2419,11 +2422,11 @@ void menu_title_screen_init(void) { initialise_player_ids(); play_music(SEQUENCE_NONE2); sMenuMusicVolume = musicGetRelativeVolume(); - if (D_800DF458) { - D_8012686C = 0; - D_800DF458 = 0; + if (gResetTitleScale) { + gTitleRevealTimer = 0; + gResetTitleScale = FALSE; } else { - D_8012686C = 1; + gTitleRevealTimer = 1; } D_80126870 = 0; D_801263E0 = 0; @@ -2461,10 +2464,10 @@ void func_8008377C(UNUSED s32 updateRate, f32 arg1) { s32 i; s32 posY; - if (D_8012686C != 0) { + if (gTitleRevealTimer) { set_ortho_matrix_view(&sMenuCurrDisplayList, &sMenuCurrHudMat); - scale = (f32) D_8012686C * 0.03125f; - sMenuGuiOpacity = (D_8012686C * 8) - 1; + scale = (f32) gTitleRevealTimer * 0.03125f; + sMenuGuiOpacity = (gTitleRevealTimer * 8) - 1; func_80068508(0); if (scale != 1.0f) { render_texture_rectangle_scaled(&sMenuCurrDisplayList, sGameTitleTileOffsets, SCREEN_WIDTH_FLOAT_HALF, 52.0f, scale, scale, 0xFFFFFFFE, 1); @@ -2546,8 +2549,8 @@ s32 menu_title_screen_loop(s32 updateRate) { D_80126864 = 0; demo = &sTitleScreenDemoIds[D_80126864]; } - if (D_8012686C == 0) { - D_8012686C = 1; + if (gTitleRevealTimer == 0) { + gTitleRevealTimer = 1; } var_a1 = demo[1]; gTitleDemoTimer = 0; @@ -2564,14 +2567,14 @@ s32 menu_title_screen_loop(s32 updateRate) { gOpacityDecayTimer = 0; } } - if (D_8012686C != 0) { - if (D_8012686C < 32) { - if (D_8012686C == 1) { + if (gTitleRevealTimer) { + if (gTitleRevealTimer < 32) { + if (gTitleRevealTimer == 1) { play_sound_global(SOUND_WHOOSH1, 0); } - D_8012686C += updateRate; - if (D_8012686C >= 32) { - D_8012686C = 32; + gTitleRevealTimer += updateRate; + if (gTitleRevealTimer >= 32) { + gTitleRevealTimer = 32; sp18->unk30 = 8.0f; play_sound_global(SOUND_EXPLOSION, 0); } @@ -2599,9 +2602,9 @@ s32 menu_title_screen_loop(s32 updateRate) { set_relative_volume_for_music(*((s8*)&sMenuMusicVolume + 3)); } } - if (D_8012686C == 0) { + if (gTitleRevealTimer == 0) { if (D_801267D8[4] & (A_BUTTON | START_BUTTON)) { - D_8012686C = 1; + gTitleRevealTimer = 1; } } else if ((gMenuDelay == 0) && !is_controller_missing()) { s32 temp0 = gTitleScreenCurrentOption; diff --git a/src/menu.h b/src/menu.h index f0230fc7..64caa825 100644 --- a/src/menu.h +++ b/src/menu.h @@ -285,7 +285,7 @@ typedef struct TrackRenderDetails { extern s8 D_800DF450; extern f32 D_800DF454; -extern s32 D_800DF458; +extern s32 gResetTitleScale; extern s32 gTitleScreenCurrentOption; extern s32 D_800DF460; extern s32 D_800DF464; @@ -725,7 +725,7 @@ s32 get_random_number_from_range(s32, s32); // No file to pull from yet. void func_8007FF88(void); void func_80080E6C(void); -void func_800813C0(void); +void reset_title_logo_scale(void); void menu_init(u32 menuId); s32 menu_loop(Gfx **currDisplayList, MatrixS **currHudMat, Vertex **currHudVerts, TriangleList **currHudTris, s32 updateRate); void show_timestamp(s32 frameCount, s32 xPos, s32 yPos, u8 red, u8 green, u8 blue, u8 fontID); diff --git a/src/object_functions.c b/src/object_functions.c index adc28925..e18d8fef 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -121,12 +121,12 @@ VertexPosition D_800DCB28[6] = { /************ .bss ************/ -f32 D_8011D4D0; +f32 gNPCPosY; s32 gTajSoundMask; s32 gTTSoundMask; s32 D_8011D4DC; s8 D_8011D4E0; -s16 D_8011D4E2; // Taj Voice clips +s16 gTajSoundID; // Taj Voice clips /******************************/ @@ -137,7 +137,7 @@ s16 D_8011D4E2; // Taj Voice clips */ void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry) { f32 radius; - obj->segment.trans.unk6 |= 2; + obj->segment.trans.flags |= OBJ_FLAGS_UNK_0002; radius = entry->radius & 0xFF; if (radius < 10) { radius = 10; @@ -234,7 +234,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { obj->segment.trans.x_position = 0.0f; obj->segment.trans.y_position = 0.0f; obj->segment.trans.z_position = 0.0f; - func_80011560(); + ignore_bounds_check(); move_object(obj, someObj->segment.trans.x_position, someObj->segment.trans.y_position, someObj->segment.trans.z_position); } else { diff = (someObj->segment.trans.x_position - obj->segment.trans.x_position) * 0.1; @@ -693,7 +693,7 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { obj->action = 0; func_8009CF68(4); if (dialogueID == 1) { - func_8006F254(); + begin_trophy_race_teleport(); obj->action = 2; } else { set_hud_visibility(1); @@ -743,7 +743,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { func_80036040(obj, (Object_64 *) egg); break; case EGG_MOVING: - obj->segment.trans.unk6 &= 0xBFFF; + obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); dir[0] = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); dir[1] = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); dir[2] = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); @@ -942,11 +942,11 @@ void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 updateRate) { s32 i; if (find_non_car_racers() == FALSE) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.unk6 &= 0xBFFF; + obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); } - if (obj->interactObj->distance < 100 && !(obj->segment.trans.unk6 & 0x4000)) { + if (obj->interactObj->distance < 100 && !(obj->segment.trans.flags & OBJ_FLAGS_INVISIBLE)) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { curRacerObj = racerObjs[i]; @@ -1008,7 +1008,7 @@ void obj_init_groundzipper(Object *obj, LevelObjectEntry_GroundZipper *entry) { * If a racer passes over it, initiate a boost, which can be empowered by releasing the A button. */ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { - Object *curRacerObj; + Object *racerObj; Object_Racer *racer; f32 diffX; f32 diffY; @@ -1017,21 +1017,21 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { Object** racerObjs; s32 i; - obj->segment.trans.unk6 &= 0xBFFF; - obj->segment.trans.unk6 |= 0x1000; - get_racer_object(0); // Unused. I guess the developers forgot to remove this? - if ((s32) obj->interactObj->distance < obj->unk78) { + obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); + obj->segment.trans.flags |= OBJ_FLAGS_SHADOW_ONLY; + get_racer_object(PLAYER_ONE); // Unused. I guess the developers forgot to remove this? + if (obj->interactObj->distance < obj->unk78) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { - curRacerObj = racerObjs[i]; - racer = &curRacerObj->unk64->racer; - if ((racer->boostTimer < 15) && (racer->unk1E2 != 0)) { - diffX = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - diffY = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + racerObj = racerObjs[i]; + racer = &racerObj->unk64->racer; + if (racer->boostTimer < 15 && racer->groundedWheels) { + diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; + diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < obj->unk78) { if (racer->playerIndex != PLAYER_COMPUTER) { - play_sound_spatial(SOUND_ZIP_PAD_BOOST, curRacerObj->segment.trans.x_position, curRacerObj->segment.trans.y_position, curRacerObj->segment.trans.z_position, NULL); + play_sound_spatial(SOUND_ZIP_PAD_BOOST, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, NULL); } racer->boostTimer = normalise_time(45); racer->boostType = BOOST_LARGE; @@ -1067,7 +1067,7 @@ void obj_loop_unknown58(Object *obj, s32 updateRate) { } set_ghost_position_and_rotation(obj); func_800AFC3C(obj, updateRate); - someOtherObj = get_racer_object(0); + someOtherObj = get_racer_object(PLAYER_ONE); someOtherObj64 = &someOtherObj->unk64->unkid58; obj60 = obj->unk60; if (obj60->unk0 == 1) { @@ -1082,62 +1082,66 @@ void obj_loop_unknown58(Object *obj, s32 updateRate) { } void obj_init_characterflag(Object *obj, LevelObjectEntry_CharacterFlag *entry) { - f32 phi_f0; - obj->unk78 = (s32)entry->unkE; + f32 radius; + obj->unk78 = entry->playerIndex; obj->unk7C.word = -1; - obj->segment.trans.y_rotation = entry->unkC << 6 << 4; // Not sure about the values here. - phi_f0 = (f32)(entry->unkA & 0xFF); - if (phi_f0 < 10.0f) { - phi_f0 = 10.0f; + obj->segment.trans.y_rotation = entry->angleY << 6 << 4; // Not sure about the values here. + radius = entry->radius & 0xFF; + if (radius < 10.0f) { + radius = 10.0f; } - phi_f0 /= 64; - obj->segment.trans.scale = (f32)(obj->segment.header->scale * phi_f0); + radius /= 64; + obj->segment.trans.scale = obj->segment.header->scale * radius; } void obj_loop_characterflag(Object *obj, UNUSED s32 updateRate) { s32 temp_t4; s32 temp_t5; - Object *someObj; - Object_CharacterFlag *obj64; - Object_Racer *someObj64; + Object *racerObj; + Object_CharacterFlag *flag; + Object_Racer *racer; if (obj->unk7C.word < 0) { - someObj = get_racer_object(obj->unk78); - if (someObj != NULL) { - obj64 = &obj->unk64->character_flag; - someObj64 = &someObj->unk64->racer; - obj->unk7C.word = someObj64->characterId; + racerObj = get_racer_object(obj->unk78); + if (racerObj != NULL) { + flag = &obj->unk64->character_flag; + racer = &racerObj->unk64->racer; + obj->unk7C.word = racer->characterId; if (obj->unk7C.word < 0 || obj->unk7C.word >= 10) { obj->unk7C.word = 0; } - obj64->vertices = gCharacterFlagVertices; - obj64->texture = (TextureHeader *) &obj->unk68[obj->unk7C.word]->texHeader; - temp_t4 = (obj64->texture->width - 1) << 21; - temp_t5 = (obj64->texture->height - 1) << 5; + flag->vertices = gCharacterFlagVertices; + flag->texture = (TextureHeader *) &obj->unk68[obj->unk7C.word]->texHeader; + temp_t4 = (flag->texture->width - 1) << 21; + temp_t5 = (flag->texture->height - 1) << 5; //0x40 = Draw backface - obj64->triangles[0].vertices = (0x40 << 24) | (0 << 16) | (1 << 8) | 3; - obj64->triangles[0].uv0.texCoords = 0; - obj64->triangles[0].uv1.texCoords = temp_t4; - obj64->triangles[0].uv2.texCoords = temp_t5; - obj64->triangles[1].vertices = (0x40 << 24) | (1 << 16) | (2 << 8) | 3; - obj64->triangles[1].uv0.texCoords = temp_t4; - obj64->triangles[1].uv1.texCoords = (temp_t4 | temp_t5); - obj64->triangles[1].uv2.texCoords = temp_t5; + flag->triangles[0].vertices = (0x40 << 24) | (0 << 16) | (1 << 8) | 3; + flag->triangles[0].uv0.texCoords = 0; + flag->triangles[0].uv1.texCoords = temp_t4; + flag->triangles[0].uv2.texCoords = temp_t5; + flag->triangles[1].vertices = (0x40 << 24) | (1 << 16) | (2 << 8) | 3; + flag->triangles[1].uv0.texCoords = temp_t4; + flag->triangles[1].uv1.texCoords = (temp_t4 | temp_t5); + flag->triangles[1].uv2.texCoords = temp_t5; } } } GLOBAL_ASM("asm/non_matchings/unknown_032760/func_80036040.s") +/** + * Hub world T.T init behaviour. + * Sets hitbox data to make him solid. +*/ void obj_init_stopwatchman(Object *obj, UNUSED LevelObjectEntry_StopWatchMan *entry) { - Object_TT *temp; + Object_TT *tt; obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; obj->interactObj->pushForce = 0; - temp = &obj->unk64->tt; - temp->unkD = 0xFF; - temp->unk0 = 0.0f; + tt = &obj->unk64->tt; + tt->unkD = 0xFF; + tt->unk0 = 0.0f; gTTSoundMask = NULL; } @@ -1154,13 +1158,13 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { f32 tempPosY; Object_NPC *tt; Object *racerObj; - UNUSED s32 temp_sp60; + UNUSED s32 pad; s32 angleDiff; s32 index; - UNUSED s32 test; + UNUSED s32 pad2; Object_Racer *racer; LevelHeader *header; - struct TempStruct8 **sp48; + struct WaterProperties **water; tempPosY = obj->segment.trans.y_position; updateRateF = updateRate; @@ -1334,12 +1338,12 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { break; } obj->segment.trans.y_position = tempPosY; - index = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &sp48); + index = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &water); if(index != 0) { index--; while(index >= 0) { - if ((sp48[index]->unk10 != 11) && (sp48[index]->unk10 != 14) && (sp48[index]->unk8 > 0.0)) { - obj->segment.trans.y_position = sp48[index]->unk0; + if ((water[index]->type != WATER_CALM) && (water[index]->type != WATER_WAVY) && (water[index]->rotY > 0.0)) { + obj->segment.trans.y_position = water[index]->waveHeight; } index--; } @@ -1347,7 +1351,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { obj->segment.trans.x_rotation = 0; obj->segment.trans.z_rotation = 0; if (obj->action != TT_MODE_ROAM) { - D_8011D4D0 = obj->segment.trans.y_position; + gNPCPosY = obj->segment.trans.y_position; } obj->segment.animFrame = 1.0 * tt->animFrameF; func_80061C0C(obj); @@ -1393,9 +1397,9 @@ void obj_init_lavaspurt(Object *obj, LevelObjectEntry_LavaSpurt *entry) { void obj_loop_lavaspurt(Object *obj, s32 updateRate) { if (obj->unk78 > 0) { obj->unk78 -= updateRate; - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.unk6 &= ~0x4000; + obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; obj->segment.animFrame += updateRate * 4; if (obj->segment.animFrame > 255) { obj->segment.animFrame = 0; @@ -1405,23 +1409,23 @@ void obj_loop_lavaspurt(Object *obj, s32 updateRate) { } void obj_init_posarrow(Object *obj, UNUSED LevelObjectEntry_PosArrow *entry) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } void obj_loop_posarrow(Object *obj, UNUSED s32 updateRate) { - Object_PosArrow *someObj64; + Object_PosArrow *posArrow; Object **someObjList; Object *someObj; s32 numberOfObjects; - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; someObjList = get_racer_objects_by_position(&numberOfObjects); if (obj->unk78 < numberOfObjects) { someObj = someObjList[obj->unk78]; - someObj64 = &someObj->unk64->pos_arrow; - if (someObj64->unk0 == -1) { - obj->segment.trans.unk6 &= ~0x4000; - someObj64->unk150 = obj; + posArrow = &someObj->unk64->pos_arrow; + if (posArrow->unk0 == -1) { + obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; + posArrow->unk150 = obj; } obj->segment.animFrame = obj->unk78 * 127; } @@ -1627,7 +1631,7 @@ void obj_loop_dooropener(Object *obj, s32 updateRate) { void obj_init_overridepos(UNUSED Object *obj, UNUSED LevelObjectEntry_OverridePos *entry) { } -UNUSED void func_80037D60(UNUSED s32 arg0, UNUSED s32 arg1) { +UNUSED void obj_loop_overridepos(UNUSED Object *obj, UNUSED s32 arg1) { } /** @@ -1734,6 +1738,10 @@ void obj_loop_hittester(Object *obj, s32 updateRate) { func_8001F460(obj, updateRate, obj); } +/** + * Dynamically Lit Prop init behaviour. + * Sets hitbox to add solidity. + */ void obj_init_dynamic_lighting_object(Object *obj, UNUSED LevelObjectEntry_DynamicLightingObject *entry) { obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; @@ -1748,6 +1756,10 @@ void obj_init_unknown96(Object *obj, UNUSED LevelObjectEntry_Unknown96 *entry) { obj->interactObj->pushForce = 0; } +/** + * Rolling snowball init behaviour. + * Sets hitbox to add solidity. + */ void obj_init_snowball(Object *obj, UNUSED LevelObjectEntry_Snowball *entry) { obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 2; @@ -1772,7 +1784,11 @@ void obj_loop_snowball(Object *obj, s32 updateRate) { func_8001F460(obj, updateRate, obj); } -UNUSED void func_80038330(UNUSED s32 arg0, UNUSED s32 arg1) { +/** + * Character select init behaviour. + * Does nothing. Not even called. + */ +UNUSED void obj_init_char_select(UNUSED s32 arg0, UNUSED s32 arg1) { } GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_char_select.s") @@ -1783,7 +1799,7 @@ void obj_loop_animcamera(Object *obj, s32 updateRate) { Object_AnimCamera *obj64; temp_v0 = func_8001F460(obj, updateRate, obj); - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; obj64 = &obj->unk64->anim_camera; if (temp_v0 == 0) { if (get_viewport_count() == VIEWPORTS_COUNT_1_PLAYER) { @@ -1797,7 +1813,11 @@ void obj_loop_animcamera(Object *obj, s32 updateRate) { } } -UNUSED void func_800387C0(UNUSED s32 arg0, UNUSED s32 arg1) { +/** + * Racer cutscene target init behaviour. + * Does nothing. Not even called. + */ +UNUSED void obj_init_animcar(UNUSED Object *obj, UNUSED s32 arg1) { } /** @@ -1813,7 +1833,7 @@ void obj_loop_animcar(Object *obj, s32 updateRate) { racerObj = get_racer_object(racerID - 1); } obj->unk7C.word = func_8001F460(obj, updateRate, obj); - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; if (obj->unk7C.word == 0 && racerObj != NULL) { Object_Racer *racer = &racerObj->unk64->racer; racer->approachTarget = obj; @@ -1840,9 +1860,9 @@ void obj_loop_infopoint(Object *obj, UNUSED s32 updateRate) { Object *playerObj; if (obj->unk7C.word == 0) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } else { - obj->segment.trans.unk6 &= ~0x4000; + obj->segment.trans.flags &= ~OBJ_FLAGS_INVISIBLE; } interactObj = obj->interactObj; @@ -1946,8 +1966,11 @@ void obj_loop_bombexplosion(Object *obj, s32 updateRate) { } } - - +/** + * Future Fun Land Teleport init behaviour. + * Sets hitbox data based off spawn info. + * If the player has seen the lighthouse cutscene, enable the object. +*/ void obj_init_teleport(Object *obj, UNUSED LevelObjectEntry_Teleport *entry) { obj->interactObj->flags = INTERACT_FLAGS_TANGIBLE; obj->interactObj->unk11 = 0; @@ -1958,6 +1981,10 @@ void obj_init_teleport(Object *obj, UNUSED LevelObjectEntry_Teleport *entry) { } } +/** + * Future Fun Land Teleport loop behaviour. + * Triggers a warp to the space hub world when entered, if active. +*/ void obj_loop_teleport(Object *obj, UNUSED s32 updateRate) { if (obj->action != 0) { LevelObjectEntry_Teleport *level_entry = &obj->segment.unk3C_a.level_entry->teleport; @@ -1970,6 +1997,11 @@ void obj_loop_teleport(Object *obj, UNUSED s32 updateRate) { } } +/** + * Exit init behaviour. + * Sets scale, rotation and hitbox from spawn info. + * Also applies a face direction used to account for node rotation relative to the angle difference of the racer. +*/ void obj_init_exit(Object *obj, LevelObjectEntry_Exit *entry) { f32 radius; Object_Exit *exit; @@ -1993,6 +2025,10 @@ void obj_init_exit(Object *obj, LevelObjectEntry_Exit *entry) { obj->interactObj->pushForce = 0; } +/** + * Exit loop behaviour. + * Waits for a racer to interact with it, then sets the exit ID for the racer, triggering a level transition on their end. +*/ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { Object *racerObj; Object_Racer *racer; @@ -2002,27 +2038,27 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { f32 diffZ; f32 dist; f32 diffY; - Object_Exit *obj64; + Object_Exit *exit; s32 enableWarp; Object** racerObjects; s32 i; f32 rotDiff; - obj64 = &obj->unk64->exit; + exit = &obj->unk64->exit; enableWarp = TRUE; settings = get_settings(); // Disable the warp if it's for the first boss encounter, having collected every balloon. - if ((obj64->bossFlag == WARP_BOSS_FIRST) && (settings->balloonsPtr[settings->worldId] == 8)) { + if ((exit->bossFlag == WARP_BOSS_FIRST) && (settings->balloonsPtr[settings->worldId] == 8)) { enableWarp = FALSE; } // Disable the warp if it's for the second boss encounter, having not collected every balloon. - if ((obj64->bossFlag == WARP_BOSS_REMATCH) && (settings->balloonsPtr[settings->worldId] < 8)) { + if ((exit->bossFlag == WARP_BOSS_REMATCH) && (settings->balloonsPtr[settings->worldId] < 8)) { enableWarp = FALSE; } // The above ensures only one of the boss warps is active so they don't overlap. This could also probably have been done in the initialiser. if (enableWarp) { - if (obj->interactObj->distance < obj64->radius) { - dist = obj64->radius; + if (obj->interactObj->distance < exit->radius) { + dist = exit->radius; racerObjects = get_racer_objects(&numberOfRacers); for (i = 0; i < numberOfRacers; i++) { racerObj = racerObjects[i]; @@ -2032,7 +2068,7 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; if ((sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist)) { - rotDiff = (obj64->directionX * racerObj->segment.trans.x_position) + (obj64->directionZ * racerObj->segment.trans.z_position) + obj64->rotationDiff; + rotDiff = (exit->directionX * racerObj->segment.trans.x_position) + (exit->directionZ * racerObj->segment.trans.z_position) + exit->rotationDiff; if (rotDiff < 0.0f) { racer->exitObj = obj; racer->transitionTimer = -120; @@ -2056,12 +2092,16 @@ void obj_loop_cameracontrol(UNUSED Object *obj, UNUSED s32 updateRate) { void obj_init_setuppoint(Object *obj, LevelObjectEntry_SetupPoint *entry) { obj->action = entry->unk8; obj->unk7C.word = entry->unk9; - obj->segment.trans.y_rotation = entry->unkA << 6 << 4; // Not sure about the values here. + obj->segment.trans.y_rotation = entry->angleY << 6 << 4; // Not sure about the values here. } void obj_loop_setuppoint(UNUSED Object *obj, UNUSED s32 updateRate) { } +/** + * Dinosaur init behaviour. + * Walks around, playing footstep sounds and roaring when nearby. +*/ void obj_init_dino_whale(Object *obj, UNUSED LevelObjectEntry_Dino_Whale *entry) { obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 3; @@ -2069,8 +2109,12 @@ void obj_init_dino_whale(Object *obj, UNUSED LevelObjectEntry_Dino_Whale *entry) obj->interactObj->pushForce = 0; } +/** + * Dinosaur loop behaviour. + * Walks around, playing footstep sounds and roaring when nearby. +*/ void obj_loop_dino_whale(Object *obj, s32 updateRate) { - s32 sp2C; + s32 animFrame; if (obj->unk78 > 0) { obj->unk78 -= updateRate; @@ -2078,38 +2122,46 @@ void obj_loop_dino_whale(Object *obj, s32 updateRate) { } else { obj->unk78 = 0; } - sp2C = obj->segment.animFrame; + animFrame = obj->segment.animFrame; func_8001F460(obj, updateRate, obj); - func_800113CC(obj, 0, sp2C, 0xAC, 0xAD); - if (obj->interactObj->distance < 0xFF) { + func_800113CC(obj, 0, animFrame, SOUND_STOMP2, SOUND_STOMP3); + if (obj->interactObj->distance < 255) { if (obj->unk78 == 0) { - obj->unk78 = 0x3C; + obj->unk78 = 60; play_sound_at_position(SOUND_VOICE_BRONTO_ROAR, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); } } } +/** + * Hub world Taj init behaviour. + * Sets hitbox data to give him solidity. +*/ void obj_init_parkwarden(Object *obj, UNUSED LevelObjectEntry_Parkwarden *entry) { - Object_NPC *temp; + Object_NPC *taj; obj->interactObj->flags = INTERACT_FLAGS_SOLID; obj->interactObj->unk11 = 0; obj->interactObj->hitboxRadius = 30; obj->interactObj->pushForce = 0; - temp = &obj->unk64->npc; - temp->unkD = 0xFF; - temp->unk0 = 0.0f; - temp->unk28 = 0; - temp->unk2C = 0; - temp->unk34 = 0; - temp->unk36 = 0; - gTajSoundMask = 0; - D_8011D4E2 = SOUND_VOICE_TAJ_HELLO; + taj = &obj->unk64->npc; + taj->unkD = 0xFF; + taj->unk0 = 0.0f; + taj->unk28 = 0; + taj->unk2C = 0; + taj->unk34 = 0; + taj->unk36 = 0; + gTajSoundMask = NULL; + gTajSoundID = SOUND_VOICE_TAJ_HELLO; } -void func_80039320(s16 voiceClip) { +/** + * Sets the sound ID of Taj's next voice line when spoken to. +*/ +void set_taj_voice_line(s16 soundID) { //Set to SOUND_VOICE_TAJ_CHALLENGE_RACE in func_800CC7C - D_8011D4E2 = voiceClip; + gTajSoundID = soundID; } + /** * Hub world Taj loop behaviour. * Handles all the behaviour for the Taj NPC found in the overworld. @@ -2121,8 +2173,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { f32 updateRateF2; f32 zPosDiff; f32 distance; - f32 sp98_yPos; - struct TempStruct8 **sp94; + f32 tempPosY; + struct WaterProperties **water; Object *racerObj; s32 sp3C; Object *temp_v0_12; @@ -2141,7 +2193,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { s32 temp; sp6B = 0; - sp98_yPos = obj->segment.trans.y_position; + tempPosY = obj->segment.trans.y_position; updateRateF2 = updateRate; updateRateF = updateRateF2; @@ -2304,8 +2356,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (arctan < 0x400 && arctan > -0x400 && distance < 2.0) { obj->action = TAJ_MODE_GREET_PLAYER; taj->animFrameF = 0; - play_taj_voice_clip(D_8011D4E2, 1); - D_8011D4E2 = SOUND_VOICE_TAJ_HELLO; + play_taj_voice_clip(gTajSoundID, TRUE); + gTajSoundID = SOUND_VOICE_TAJ_HELLO; } obj->segment.x_velocity = xPosDiff * 0.125; obj->segment.y_velocity = 0; @@ -2343,7 +2395,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj->animFrameF = 0.1f; obj->segment.unk38.byte.unk3B = 2; taj->unk1C = 0; - play_taj_voice_clip(SOUND_VOICE_TAJ_BYE, 1); + play_taj_voice_clip(SOUND_VOICE_TAJ_BYE, TRUE); func_80030DE0(PLAYER_ONE, taj->fogR, taj->fogG, taj->fogB, taj->fogNear, taj->fogFar, 180); set_music_player_voice_limit(levelHeader->voiceLimit); play_music(levelHeader->music); @@ -2356,7 +2408,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->action = TAJ_MODE_TRANSFORM_BEGIN; taj->animFrameF = 0; // Voice clips: Abrakadabra, Alakazam, Alakazoom? - play_taj_voice_clip((racer64->racer.vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), 1); + play_taj_voice_clip((racer64->racer.vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), TRUE); } else { set_menu_id_if_option_equal(0x62, 2); } @@ -2368,12 +2420,12 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->action = TAJ_MODE_TRANSFORM_BEGIN; taj->animFrameF = 0.0f; // Voice clips: Abrakadabra, Alakazam, Alakazoom? - play_taj_voice_clip((racer64->racer.vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), 1); + play_taj_voice_clip((racer64->racer.vehicleID + SOUND_VOICE_TAJ_ABRAKADABRA), TRUE); } else { obj->action = TAJ_MODE_SET_CHALLENGE; transition_begin(&D_800DC978); sp6B = 1; - play_taj_voice_clip(SOUND_WHOOSH4, 1); + play_taj_voice_clip(SOUND_WHOOSH4, TRUE); taj->animFrameF = 0.0f; } } @@ -2602,12 +2654,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->segment.trans.y_rotation += ((var_a2 * updateRate) >> 4); xPosDiff = sins_f(obj->segment.trans.y_rotation + 0x8000); zPosDiff = coss_f(obj->segment.trans.y_rotation + 0x8000); - move_object( - obj, - (updateRateF2 * xPosDiff) * 1.1, - 0.0f, - (updateRateF2 * zPosDiff) * 1.1 - ); + move_object(obj, (updateRateF2 * xPosDiff) * 1.1, 0.0f, (updateRateF2 * zPosDiff) * 1.1); taj->animFrameF += updateRate * 2.2; } } @@ -2689,13 +2736,13 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj->unk28 = musicGetChanMask() & 0xBFFF; break; } - obj->segment.trans.y_position = sp98_yPos; - var_a2 = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &sp94); + obj->segment.trans.y_position = tempPosY; + var_a2 = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &water); if(var_a2 != 0) { var_a2--; while(var_a2 >= 0) { - if ((sp94[var_a2]->unk10 != 11) && (sp94[var_a2]->unk10 != 14) && (sp94[var_a2]->unk8 > 0.0)) { - obj->segment.trans.y_position = sp94[var_a2]->unk0; + if ((water[var_a2]->type != WATER_CALM) && (water[var_a2]->type != WATER_WAVY) && (water[var_a2]->rotY > 0.0)) { + obj->segment.trans.y_position = water[var_a2]->waveHeight; } var_a2--; } @@ -2703,7 +2750,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->segment.trans.x_rotation = 0; obj->segment.trans.z_rotation = 0; if (obj->action != TAJ_MODE_ROAM) { - D_8011D4D0 = obj->segment.trans.y_position; + gNPCPosY = obj->segment.trans.y_position; } if (sp6B != 0) { func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 0xC, SOUND_NONE, 1.0f, 0); @@ -2730,8 +2777,11 @@ void play_taj_voice_clip(u16 soundID, s32 interrupt) { void obj_loop_gbparkwarden(UNUSED Object *obj, UNUSED s32 updateRate) { } -f32 func_8003ACAC(void) { - return D_8011D4D0; +/** + * Return the Y pos of an NPC when they're in dialogue. +*/ +f32 get_npc_pos_y(void) { + return gNPCPosY; } /** @@ -2894,10 +2944,10 @@ void obj_loop_bonus(Object *obj, UNUSED s32 updateRate) { if ((diffY < halfDist) && (-halfDist < diffY)) { diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist)) { + if (sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist) { f32 temp = (obj64->directionX * racerObj->segment.trans.x_position) + (obj64->directionZ * racerObj->segment.trans.z_position) + obj64->rotationDiff; if (temp < 0.0f) { - if ((s32) racer->bananas < 10) { + if (racer->bananas < 10) { racer->bananas = 10; play_sound_at_position(SOUND_SELECT, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, 4, NULL); play_sound_spatial(racer->characterId + SOUND_UNK_7B, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, NULL); @@ -2979,9 +3029,9 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { gParticlePtrList_addObject(obj); } } else { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; if (obj->action == 0) { - obj->segment.trans.unk6 &= 0xBFFF; + obj->segment.trans.flags &= (0xFFFF - OBJ_FLAGS_INVISIBLE); doubleSpeed = updateRate * 2; if (obj->segment.unk38.byte.unk39 < (255 - doubleSpeed)) { obj->segment.unk38.byte.unk39 += doubleSpeed; @@ -3004,7 +3054,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { play_sound_spatial(SOUND_COLLECT_BALLOON, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); obj->unk7C.word = 16; obj->unk74 = 2; - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; func_800AFC3C(obj, updateRate); } } @@ -3030,7 +3080,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { void obj_init_door(Object *obj, LevelObjectEntry_Door *entry) { Object_Door *obj64; - f32 phi_f0; + f32 radius; obj64 = &obj->unk64->door; if (entry->unkC == -1) { @@ -3048,16 +3098,16 @@ void obj_init_door(Object *obj, LevelObjectEntry_Door *entry) { } obj->segment.unk38.byte.unk3A = entry->modelIndex; obj->segment.trans.y_rotation = entry->closedRotation << 6 << 4; - obj64->unk0 = obj->segment.trans.y_position; + obj64->homeY = obj->segment.trans.y_position; obj64->unk8 = 0; obj->unk78 = obj->segment.trans.y_rotation; obj->unk7C.word = (s32) ((entry->openRotation & 0x3F) << 10); - phi_f0 = entry->scale & 0xFF; - if (phi_f0 < 10.0f) { - phi_f0 = 10.0f; + radius = entry->scale & 0xFF; + if (radius < 10.0f) { + radius = 10.0f; } - phi_f0 /= 64; - obj->segment.trans.scale = obj->segment.header->scale * phi_f0; + radius /= 64; + obj->segment.trans.scale = obj->segment.header->scale * radius; obj64->unk13 = (u8) entry->unkF; obj64->unk14 = (s8) entry->unk11; obj->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0020; @@ -3073,11 +3123,11 @@ GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_door.s") void obj_init_ttdoor(Object *obj, LevelObjectEntry_TTDoor *entry) { Object_TTDoor *obj64; - f32 phi_f0; + f32 radius; obj->segment.unk38.byte.unk3A = 0; obj64 = &obj->unk64->tt_door; - obj->segment.trans.y_rotation = entry->unk8 << 6 << 4; + obj->segment.trans.y_rotation = entry->angleY << 6 << 4; obj64->doorID = entry->doorID; obj64->unk13 = entry->unkB; obj64->unk0 = obj->segment.trans.y_position; @@ -3085,12 +3135,12 @@ void obj_init_ttdoor(Object *obj, LevelObjectEntry_TTDoor *entry) { obj64->unk12 = entry->unkA; obj->action = obj->segment.trans.y_rotation; obj->unk7C.word = (entry->unk9 & 0x3F) << 0xA; - phi_f0 = entry->unkC & 0xFF; - if (phi_f0 < 10) { - phi_f0 = 10; + radius = entry->radius & 0xFF; + if (radius < 10) { + radius = 10; } - phi_f0 /= 64; - obj->segment.trans.scale = obj->segment.header->scale * phi_f0; + radius /= 64; + obj->segment.trans.scale = obj->segment.header->scale * radius; obj->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0020; obj->interactObj->unk11 = 2; obj->interactObj->hitboxRadius = 20; @@ -3188,7 +3238,7 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry) { - f32 phi_f0; + f32 radius; Object_Trigger *obj64; if (entry->unk9 == -1) { @@ -3199,13 +3249,13 @@ void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry) { if (entry->unk9 == -1) { rmonPrintf("Illegal door no!!!\n"); } - phi_f0 = (s32)entry->scale & 0xFF; - if (phi_f0 < 5.0f) { - phi_f0 = 5.0f; + radius = (s32)entry->scale & 0xFF; + if (radius < 5.0f) { + radius = 5.0f; } obj64 = &obj->unk64->trigger; - phi_f0 /= 128; - obj->segment.trans.scale = phi_f0; + radius /= 128; + obj->segment.trans.scale = radius; obj->segment.trans.y_rotation = entry->rotation << 6 << 4; obj64->unk0 = sins_f(obj->segment.trans.y_rotation); obj64->unk4 = 0.0f; @@ -3626,7 +3676,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { s8 sp43; Object_Banana *banana; Object_78_Banana *obj78; - s32 racerPrevUnk180; + s32 prevSoundMask; updateRateF = updateRate; if (osTvType == TV_TYPE_PAL) { @@ -3636,7 +3686,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { obj->segment.animFrame += updateRate * 8; obj78 = (Object_78_Banana *) &obj->unk78; if (obj->unk78 == -1) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; obj78->unk6 -= updateRate; obj->unk74 = 1; func_800AFC3C(obj, updateRate); @@ -3700,7 +3750,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { } else { obj78->unk4 = 0; } - if (obj->interactObj->distance < 0x78) { + if (obj->interactObj->distance < 120) { if (get_current_level_race_type() == RACETYPE_CHALLENGE_BANANAS) { racerObj = obj->interactObj->obj; if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { @@ -3716,14 +3766,13 @@ void obj_loop_banana(Object *obj, s32 updateRate) { if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if ((get_current_level_race_type() != RACETYPE_CHALLENGE_BANANAS) || racer->bananas < 2) { - racerPrevUnk180 = racer->unk180; - play_sound_at_position( SOUND_SELECT, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, 4, &racer->unk180); - if (racerPrevUnk180 != 0) { - func_800096F8(racerPrevUnk180); + prevSoundMask = racer->bananaSoundMask; + play_sound_at_position(SOUND_SELECT, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, 4, &racer->bananaSoundMask); + if (prevSoundMask) { + func_800096F8(prevSoundMask); } - if ((racer->playerIndex != PLAYER_COMPUTER) && racer->bananas == 9) { - play_sound_spatial(racer->characterId + SOUND_UNK_7B, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, NULL - ); + if (racer->playerIndex != PLAYER_COMPUTER && racer->bananas == 9) { + play_sound_spatial(racer->characterId + SOUND_UNK_7B, racerObj->segment.trans.x_position, racerObj->segment.trans.y_position, racerObj->segment.trans.z_position, NULL); } racer->bananas++; if (banana->spawner != NULL) { @@ -3763,7 +3812,7 @@ void obj_init_silvercoin_adv2(Object *obj, UNUSED LevelObjectEntry_SilverCoinAdv } } if (obj->action == SILVER_COIN_INACTIVE) { - obj->segment.trans.unk6 |= 0x600; + obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 | OBJ_FLAGS_INVIS_PLAYER2; gParticlePtrList_addObject(obj); } } @@ -3787,7 +3836,7 @@ void obj_init_silvercoin(Object *obj, UNUSED LevelObjectEntry_SilverCoin *entry) } } if (obj->action == SILVER_COIN_INACTIVE) { - obj->segment.trans.unk6 |= 0x600; + obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER2 | OBJ_FLAGS_INVIS_PLAYER1; gParticlePtrList_addObject(obj); } } @@ -3815,7 +3864,7 @@ void obj_loop_silvercoin(Object *obj, s32 updateRate) { if (racer->raceFinished == FALSE && !(obj->action & (SILVER_COIN_COLLECTED << racer->playerIndex))) { obj->action |= SILVER_COIN_COLLECTED << racer->playerIndex; obj->unk7C.word = 0x10; - obj->segment.trans.unk6 |= 0x200 << racer->playerIndex; + obj->segment.trans.flags |= OBJ_FLAGS_INVIS_PLAYER1 << racer->playerIndex; play_sequence(SEQUENCE_SILVER_COIN_1 + racer->silverCoinCount); racer->silverCoinCount++; } @@ -3957,9 +4006,9 @@ void obj_loop_weaponballoon(Object *obj, s32 updateRate) { obj->segment.trans.scale = 0.001f; } if (obj->segment.trans.scale < 0.1) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= 0x4000; } else { - obj->segment.trans.unk6 &= 0xBFFF; + obj->segment.trans.flags &= 0xBFFF; } if (obj->unk7C.word > 0) { obj->unk74 = 1; @@ -5008,11 +5057,11 @@ void obj_loop_frog(Object *obj, s32 updateRate) { obj->segment.trans.z_position = frog->hopStartZ; obj->segment.x_velocity = frog->hopTargetX * cosine; obj->segment.z_velocity = frog->hopTargetZ * cosine; - func_80011560(); + ignore_bounds_check(); move_object(obj, obj->segment.x_velocity, 0.0f, obj->segment.z_velocity); if (func_8002BAB0(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &sp6C) != 0) { obj->segment.trans.y_position = 0.0f; - func_80011560(); + ignore_bounds_check(); move_object(obj, 0.0f, sp6C, 0.0f); } if (frog->squishCooldown <= 0 && (frog->hopFrame < 6 || frog->hopFrame >= 27)) { diff --git a/src/object_functions.h b/src/object_functions.h index 0c127fbe..fdf8b3b2 100644 --- a/src/object_functions.h +++ b/src/object_functions.h @@ -336,10 +336,10 @@ void obj_loop_setuppoint(Object *obj, s32 updateRate); void obj_init_dino_whale(Object *obj, LevelObjectEntry_Dino_Whale *entry); void obj_loop_dino_whale(Object *obj, s32 updateRate); void obj_init_parkwarden(Object *obj, LevelObjectEntry_Parkwarden *entry); -void func_80039320(s16 voiceClip); +void set_taj_voice_line(s16 voiceClip); void play_taj_voice_clip(u16 soundID, s32 interrupt); void obj_loop_gbparkwarden(Object *obj, s32 updateRate); -f32 func_8003ACAC(void); +f32 get_npc_pos_y(void); void obj_init_checkpoint(Object *obj, LevelObjectEntry_Checkpoint *entry, s32 arg2); void obj_loop_checkpoint(Object *obj, s32 updateRate); void obj_init_modechange(Object *obj, LevelObjectEntry_ModeChange *entry); diff --git a/src/object_models.c b/src/object_models.c index 20d80e3e..9ede2bdc 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -30,21 +30,24 @@ UNUSED const char D_800E6BE0[] = "MOD Error: Tryed to deallocate non-existent mo /************ .bss ************/ -s32 *D_8011D620; +s32 *gObjectModelTable; unk8011D624 *D_8011D624; // Array of unk8011D624 s32 *D_8011D628; s32 D_8011D62C; s32 D_8011D630; s32 D_8011D634; -s16 *D_8011D638; -s32 *D_8011D63C; +s16 *gAnimationTable; +s32 *gObjectAnimationTable; s32 D_8011D640; s32 D_8011D644; UNUSED s32 D_8011D648[66]; // Appears to have no effect when removed entirely? /******************************/ -void func_8005F850(void) { +/** + * Allocate memory for object model ID's and animation tables. +*/ +void allocate_object_model_pools(void) { s32 i; s32 checksum; @@ -52,14 +55,14 @@ void func_8005F850(void) { D_8011D628 = allocate_from_main_pool_safe(0x190, COLOUR_TAG_GREEN); D_8011D62C = 0; D_8011D634 = 0; - D_8011D620 = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_MODELS_TABLE); + gObjectModelTable = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_MODELS_TABLE); D_8011D630 = 0; - while (D_8011D620[D_8011D630] != -1) { + while (gObjectModelTable[D_8011D630] != -1) { D_8011D630++; } D_8011D630--; - D_8011D638 = (s16 *) load_asset_section_from_rom(ASSET_ANIMATION_IDS); - D_8011D63C = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_ANIMATIONS_TABLE); + gAnimationTable = (s16 *) load_asset_section_from_rom(ASSET_ANIMATION_IDS); + gObjectAnimationTable = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_ANIMATIONS_TABLE); D_8011D644 = (s32) allocate_from_main_pool_safe(0xC00, COLOUR_TAG_GREEN); D_8011D640 = 0; diff --git a/src/object_models.h b/src/object_models.h index 6741299f..ff39dc42 100644 --- a/src/object_models.h +++ b/src/object_models.h @@ -14,7 +14,7 @@ typedef struct unk8011D624 { extern s32 gTractionTableChecksum; extern s32 gFunc80024D54Length; -void func_8005F850(void); +void allocate_object_model_pools(void); void func_800619F4(s32 arg0); void func_80061C0C(Object* obj); diff --git a/src/objects.c b/src/objects.c index d6b3228e..ccf09562 100644 --- a/src/objects.c +++ b/src/objects.c @@ -57,9 +57,9 @@ s8 D_800DC744 = 0; s8 D_800DC748 = 0; s32 D_800DC74C[2] = {0, 0}; // Have a feeling these are both the same array. s32 D_800DC754[2] = {0, 0}; -Object *D_800DC75C = NULL; // Currently unknown, might be a different type. +Object *gShieldEffectObject = NULL; s32 D_800DC760 = 9; // Currently unknown, might be a different type. -Object *D_800DC764 = NULL; // Currently unknown, might be a different type. +Object *gMagnetEffectObject = NULL; s32 D_800DC768 = 0; // Currently unknown, might be a different type. f32 D_800DC76C[15] = { @@ -70,24 +70,24 @@ f32 D_800DC76C[15] = { }; u16 D_800DC7A8[8] = { - 0x0001, 0x0002, 0x0003, 0x0004, - 0x0051, 0x0054, 0x0055, 0x0056, + BHV_RACER, BHV_SCENERY, BHV_FISH, BHV_ANIMATOR, + BHV_ANIMATED_OBJECT_2, BHV_WIZPIG_SHIP, BHV_ANIMATED_OBJECT_3, BHV_ANIMATED_OBJECT_4, }; s16 D_800DC7B8[52] = { - 0x00ED, 0x00FF, 0x0037, 0x0038, - 0x0039, 0x003A, 0x0057, 0x0058, - 0x0059, 0x005A, 0x00F3, 0x00FD, - 0x0042, 0x0043, 0x0044, 0x0045, - 0x005B, 0x005C, 0x005D, 0x005E, - 0x00F4, 0x0101, 0x0001, 0x0002, - 0x0003, 0x0004, 0x0051, 0x0054, - 0x0055, 0x0056, 0x00ED, 0x00FF, - 0x0001, 0x0002, 0x0003, 0x0004, - 0x0051, 0x0054, 0x0055, 0x0056, + 0x00ED, 0x00FF, BHV_TRIGGER, BHV_VEHICLE_ANIMATION, + BHV_ZIPPER_WATER, BHV_UNK_3A, BHV_UNK_57, 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, 0x0000, + 0x00E8, 0x0115, 0x0118, BHV_NONE, }; // A table of which vehicles to use for boss races. @@ -109,11 +109,11 @@ s8 D_800DC820[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; s8 D_800DC840[8] = { 9, 1, 2, 3, 4, 5, 7, 0 }; -s8 D_800DC848 = 0; -u32 D_800DC84C[3] = { - 0xFF401000, - 0x1040FF00, - 0x10FF4000, +s8 gNoBoundsCheck = FALSE; +u32 gMagnetColours[3] = { + COLOUR_RGBA32(255, 64, 16, 0), // Level 1 + COLOUR_RGBA32(16, 64, 255, 0), // Level 2 + COLOUR_RGBA32(16, 255, 64, 0), // Level 3 }; s32 D_800DC858 = 0; // Currently unknown, might be a different type. s32 D_800DC85C = 0x0028FFFF; // Currently unknown, might be a different type. @@ -140,15 +140,12 @@ UNUSED const char sDuplicateCheckpointString[] = "Error: Multiple checkpoint no: UNUSED const char sErrorChannelString[] = "ERROR Channel %d\n"; UNUSED const char sReadOutErrorString[] = "RO error %d!!\n"; UNUSED const char sPureAnguishString[] = "ARGHHHHHHHHH\n"; -extern f32 D_800E5644; /*********************************/ /************ .bss ************/ -// Currently defined in unknown_005740. Might need to be defined here. -extern s16 D_8011AC20[128]; - +s16 D_8011AC20[128]; s8 D_8011AD20; s8 D_8011AD21; s8 D_8011AD22[2]; @@ -313,7 +310,7 @@ void func_8000B290(void) { D_800DC74C[0] = 0; D_800DC74C[1] = 0; } - var_s0 = (struct TempStruct9 *) get_misc_asset(0x14); + var_s0 = (struct TempStruct9 *) get_misc_asset(MISC_ASSET_UNK14); for (i = 0; i < 10; i++) { temp_a0_2 = var_s0[i].unk78; if (temp_a0_2 != 0) { @@ -326,13 +323,13 @@ void func_8000B290(void) { var_s0[i].unk7C = 0; } } - if (D_800DC75C) - gParticlePtrList_addObject(D_800DC75C); - D_800DC75C = NULL; + if (gShieldEffectObject) + gParticlePtrList_addObject(gShieldEffectObject); + gShieldEffectObject = NULL; - if (D_800DC764) - gParticlePtrList_addObject(D_800DC764); - D_800DC764 = NULL; + if (gMagnetEffectObject) + gParticlePtrList_addObject(gMagnetEffectObject); + gMagnetEffectObject = NULL; gParticlePtrList_flush(); } @@ -647,7 +644,7 @@ void func_8000E1EC(Object *obj, s32 vehicleID) { void func_8000E2B4(void) { Object *player; - LevelObjectEntry8000E2B4 sp2C; + LevelObjectEntry8000E2B4 spawnObj; Settings *settings; Object_Racer *player_64; s16 object_id; @@ -660,24 +657,24 @@ void func_8000E2B4(void) { return; } settings = get_settings(); - sp2C.unkE = 0; - sp2C.common.size = 0x10; + spawnObj.unkE = 0; + spawnObj.common.size = 16; if (gOverworldVehicle < 5) { object_id = ((s16 *) D_800DC7A8)[settings->racers[0].character + gOverworldVehicle * 10]; } else { object_id = D_800DC7B8[gOverworldVehicle + 37]; } set_level_default_vehicle(gOverworldVehicle); - sp2C.common.size = sp2C.common.size | ((s32) (object_id & 0x100) >> 1); - sp2C.unkA = 0; - sp2C.unk8 = 0; - sp2C.common.objectID = object_id; - sp2C.common.x = D_8011AD46; - sp2C.common.y = D_8011AD48; - sp2C.common.z = D_8011AD4A; - sp2C.unkC = D_8011AD4C; + spawnObj.common.size = spawnObj.common.size | ((s32) (object_id & 0x100) >> 1); + spawnObj.unkA = 0; + spawnObj.unk8 = 0; + spawnObj.common.objectID = object_id; + spawnObj.common.x = D_8011AD46; + spawnObj.common.y = D_8011AD48; + spawnObj.common.z = D_8011AD4A; + spawnObj.unkC = D_8011AD4C; func_800521B8(1); - player = spawn_object(&sp2C, 0x11); + player = spawn_object(&spawnObj, 0x11); gNumRacers = 1; (*gRacers)[0] = player; gRacersByPort[0] = player; @@ -790,7 +787,7 @@ UNUSED s32 func_8000E9C0(void) { } void func_8000E9D0(Object *arg0) { - arg0->segment.trans.unk6 |= 0x8000; + arg0->segment.trans.flags |= OBJ_FLAGS_DEACTIVATED; func_800245B4(arg0->segment.unk2C.half.upper | 0xC000); gObjPtrList[objCount++] = arg0; if (1) {} // Fakematch @@ -1003,7 +1000,7 @@ void func_80010994(s32 updateRate) { tempVal = objCount; for (i = D_8011AE60; i < tempVal; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { if ((obj->behaviorId != BHV_LIGHT_RGBA) && (obj->behaviorId != BHV_WEAPON) && (obj->behaviorId != BHV_FOG_CHANGER)) { if (obj->interactObj != NULL) { if (obj->interactObj->unk11 != 2) { @@ -1046,14 +1043,14 @@ void func_80010994(s32 updateRate) { func_8000BADC(updateRate); for (i = D_8011AE60; i < tempVal; i++) { obj = gObjPtrList[i]; - if ((!(obj->segment.trans.unk6 & 0x8000) && (obj->behaviorId == BHV_WEAPON)) || (obj->behaviorId == BHV_FOG_CHANGER)) { + if ((!(obj->segment.trans.flags & 0x8000) && (obj->behaviorId == BHV_WEAPON)) || (obj->behaviorId == BHV_FOG_CHANGER)) { run_object_loop_func(obj, updateRate); } } if (D_8011AE64 > 0) { for (i = D_8011AE60; i < tempVal; i++) { obj = gObjPtrList[i]; - if (obj->segment.trans.unk6 & 0x8000) { + if (obj->segment.trans.flags & 0x8000) { //Why is this object being treated as a Particle2? func_800B22FC((Particle2 *) obj, updateRate); } @@ -1064,7 +1061,7 @@ void func_80010994(s32 updateRate) { if (func_80032C6C() > 0) { for (i = D_8011AE60; i < objCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.unk6 & 0x8000) && (obj->unk54 != NULL)) { + if (!(obj->segment.trans.flags & 0x8000) && (obj->unk54 != NULL)) { func_80032C7C(obj); } } @@ -1240,11 +1237,11 @@ s32 func_800113CC(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoun return ret; } /** - * Looks like it sets D_800DC848 to TRUE, and that will disable the check for out of bounds moves in move_object + * Make the next call of move_object never mark the object as out of bounds. * Official Name: objMoveXYZnocheck */ -s32 func_80011560(void) { //! @bug The developers probably intended this to be a void function. - D_800DC848 = 1; +s32 ignore_bounds_check(void) { //! @bug The developers probably intended this to be a void function. + gNoBoundsCheck = TRUE; // No return value! } @@ -1270,12 +1267,12 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { newYPos = obj->segment.trans.y_position + yPos; newZPos = obj->segment.trans.z_position + zPos; if (levelModel == NULL) { - D_800DC848 = 0; + gNoBoundsCheck = FALSE; return 0; } outOfBounds = FALSE; x2 = (levelModel->upperXBounds + 1000.0); - //@!bug should've campared against "obj->segment.trans.x_position" + //!@bug should've campared against "obj->segment.trans.x_position" if (newXPos > x2) { outOfBounds = TRUE; } @@ -1300,11 +1297,11 @@ s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { if (obj->segment.trans.z_position < z1) { outOfBounds = TRUE; } - if (D_800DC848 != 0) { + if (gNoBoundsCheck) { outOfBounds = FALSE; } - D_800DC848 = 0; + gNoBoundsCheck = FALSE; if (outOfBounds) { obj->segment.unk2C.half.lower = -1; return 1; @@ -1399,14 +1396,14 @@ void render_3d_billboard(Object *obj) { s32 alpha; s32 hasPrimCol; s32 hasEnvCol; - ObjectTransformExt sp60; + ObjectTransformExt objTrans; Object *var_a0; unk80068514_arg4* sp58; intensity = 255; hasPrimCol = FALSE; hasEnvCol = FALSE; - flags = obj->segment.trans.unk6 | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; + flags = obj->segment.trans.flags | RENDER_Z_UPDATE | RENDER_FOG_ACTIVE; if (obj->unk54 != NULL) { hasPrimCol = TRUE; hasEnvCol = TRUE; @@ -1466,23 +1463,22 @@ void render_3d_billboard(Object *obj) { // 5 = OilSlick, SmokeCloud, Bomb, BubbleWeapon if(var_a0 != NULL || !(obj->behaviorId != BHV_WEAPON || obj->unk64->weapon.weaponID != WEAPON_BUBBLE_TRAP)) { - sp60.trans.z_rotation = 0; - sp60.trans.x_rotation = 0; - sp60.trans.y_rotation = 0; - sp60.trans.scale = obj->segment.trans.scale; - sp60.trans.x_position = 0.0f; - sp60.trans.z_position = 0.0f; - sp60.trans.y_position = 12.0f; - sp60.unk18 = obj->segment.animFrame; - sp60.unk1A = 32; + objTrans.trans.z_rotation = 0; + objTrans.trans.x_rotation = 0; + objTrans.trans.y_rotation = 0; + objTrans.trans.scale = obj->segment.trans.scale; + objTrans.trans.x_position = 0.0f; + objTrans.trans.z_position = 0.0f; + objTrans.trans.y_position = 12.0f; + objTrans.unk18 = obj->segment.animFrame; + objTrans.unk1A = 32; if (var_a0 == NULL) { var_a0 = (Object *) obj->unk64->weapon.target; if (var_a0 == NULL) { var_a0 = obj; } } - func_800138A8(&var_a0->segment.trans, sp58, (Object *) &sp60, - RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); + func_800138A8(&var_a0->segment.trans, sp58, (Object *) &objTrans, RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); } else { render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, sp58, flags); } @@ -1494,6 +1490,12 @@ void render_3d_billboard(Object *obj) { } } +/** + * Renders a 3D object, with support for vehicle part entities as part of the process. + * Loads materials, and sets environment and/or primitive colours based on the material type. + * Computes the view matrix for the model, and calls a function to draw meshes. + * Loops through racers to find vehicle parts, which are wheels and propellers. +*/ void render_3d_model(Object *obj) { s32 i; s32 intensity; @@ -1624,7 +1626,7 @@ void render_3d_model(Object *obj) { } for (i = 0; i < obj60_unk0; i++) { loopObj = ((Object **) obj->unk60)[i + 1]; - if (!(loopObj->segment.trans.unk6 & 0x4000)) { + if (!(loopObj->segment.trans.flags & OBJ_FLAGS_INVISIBLE)) { index = obj->unk60->unk2C[i]; if (index >= 0 && index < objModel->unk18) { something = loopObj->unk68[loopObj->segment.unk38.byte.unk3A]; @@ -1648,7 +1650,7 @@ void render_3d_model(Object *obj) { cicFailed = TRUE; } if (!cicFailed) { - var_v0_2 = (loopObj->segment.trans.unk6 & 0x80 && obj60_unk0 == 3); + var_v0_2 = (loopObj->segment.trans.flags & OBJ_FLAGS_UNK_0080 && obj60_unk0 == 3); if (racerObj != NULL && racerObj->transparency < 255) { var_v0_2 = FALSE; } @@ -1741,7 +1743,7 @@ void func_80012CE8(Gfx **dlist) { */ void func_80012D5C(Gfx **dlist, MatrixS **mtx, Vertex **verts, Object *object) { f32 scale; - if (object->segment.trans.unk6 & 0x5000) + if (object->segment.trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) return; func_800B76B8(2, object->unk4A); gObjectCurrDisplayList = *dlist; @@ -1828,7 +1830,7 @@ void func_80012F94(Object *obj) { ret1 = 1.0f; ret2 = 1.0f; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { if (obj->segment.header->behaviorId == BHV_RACER) { objRacer = (Object_Racer *) obj->unk64; objRacer->unk201 = 30; @@ -1958,7 +1960,7 @@ GLOBAL_ASM("asm/non_matchings/objects/func_80012F94.s") void render_object(Object *this) { func_80012F94(this); - if (this->segment.trans.unk6 & 0x8000) { + if (this->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { func_800B3740(this, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); } else { if (this->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) @@ -1972,7 +1974,7 @@ void render_object(Object *this) { } void func_80013548(Object *obj) { - if (!(obj->segment.trans.unk6 & 0x8000) && obj->segment.header->behaviorId == BHV_RACER) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && obj->segment.header->behaviorId == BHV_RACER) { obj->segment.trans.x_position -= obj->unk64->racer.carBobX; obj->segment.trans.y_position -= obj->unk64->racer.carBobY; obj->segment.trans.z_position -= obj->unk64->racer.carBobZ; @@ -2019,13 +2021,13 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o ObjectModel *mdl; struct RacerShieldGfx* shield; s32 shieldType; - s32 var_a1; + s32 vehicleID; s32 var_a2; f32 scale; f32 shear; racer = (Object_Racer *) obj->unk64; - if (racer->shieldTimer > 0 && D_800DC75C != NULL) { + if (racer->shieldTimer > 0 && gShieldEffectObject != NULL) { gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; gObjectCurrVertexList = *vtxList; @@ -2033,23 +2035,23 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o if (var_a2 > 10) { var_a2 = 0; } - var_a1 = racer->vehicleID; - if (var_a1 >= NUMBER_OF_PLAYER_VEHICLES) { - var_a1 = 0; + vehicleID = racer->vehicleID; + if (vehicleID >= NUMBER_OF_PLAYER_VEHICLES) { + vehicleID = VEHICLE_CAR; } shield = ((struct RacerShieldGfx *) get_misc_asset(MISC_ASSET_SHIELD_DATA)); - var_a1 = (var_a1 * 10) + var_a2; - shield = shield + var_a1; - D_800DC75C->segment.trans.x_position = shield->x_position; - D_800DC75C->segment.trans.y_position = shield->y_position; - D_800DC75C->segment.trans.z_position = shield->z_position; - D_800DC75C->segment.trans.y_position += shield->y_offset * sins_f(D_8011B010[var_a2] * 0x200); + vehicleID = (vehicleID * 10) + var_a2; + shield = shield + vehicleID; + gShieldEffectObject->segment.trans.x_position = shield->x_position; + gShieldEffectObject->segment.trans.y_position = shield->y_position; + gShieldEffectObject->segment.trans.z_position = shield->z_position; + gShieldEffectObject->segment.trans.y_position += shield->y_offset * sins_f(D_8011B010[var_a2] * 0x200); shear = (coss_f(D_8011B010[var_a2] * 0x400) * 0.05f) + 0.95f; - D_800DC75C->segment.trans.scale = shield->scale * shear; + gShieldEffectObject->segment.trans.scale = shield->scale * shear; shear = shear * shield->turnSpeed; - D_800DC75C->segment.trans.y_rotation = D_8011B010[var_a2] * 0x800; - D_800DC75C->segment.trans.x_rotation = 0x800; - D_800DC75C->segment.trans.z_rotation = 0; + gShieldEffectObject->segment.trans.y_rotation = D_8011B010[var_a2] * 0x800; + gShieldEffectObject->segment.trans.x_rotation = 0x800; + gShieldEffectObject->segment.trans.z_rotation = 0; shieldType = racer->shieldType; if (shieldType != SHIELD_NONE) { shieldType--; @@ -2058,19 +2060,19 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o shieldType = SHIELD_LEVEL3 - 1; } scale = ((f32) shieldType * 0.1) + 1.0f; - D_800DC75C->segment.trans.scale *= scale; + gShieldEffectObject->segment.trans.scale *= scale; shear *= scale; - gfxData = D_800DC75C->unk68[shieldType]; + gfxData = gShieldEffectObject->unk68[shieldType]; mdl = gfxData->objModel; - D_800DC75C->unk44 = (Vertex *) gfxData->unk4[gfxData->unk1F]; + gShieldEffectObject->unk44 = (Vertex *) gfxData->unk4[gfxData->unk1F]; gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); if (racer->shieldTimer < 64) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, racer->shieldTimer * 4); } else { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); } - func_80068FA8(&gObjectCurrDisplayList, &gObjectCurrMatrix, D_800DC75C, obj, shear); - func_800143A8(mdl, D_800DC75C, 0, 4, 0); + func_80068FA8(&gObjectCurrDisplayList, &gObjectCurrMatrix, gShieldEffectObject, obj, shear); + func_800143A8(mdl, gShieldEffectObject, 0, 4, 0); gDkrInsertMatrix(gObjectCurrDisplayList++, 0, G_MTX_DKR_INDEX_0); if (racer->shieldTimer < 64) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); @@ -2090,7 +2092,7 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o Object_68 *gfxData; ObjectModel *mdl; f32* magnet; - s32 var_a0; + s32 vehicleID; s32 var_t0; s32 opacity; f32 shear; @@ -2099,39 +2101,39 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o racer = (Object_Racer *) obj->unk64; var_t0 = racer->unk2 * 4; if (D_8011B07B[var_t0]) { - if (D_800DC764 != NULL) { + if (gMagnetEffectObject != NULL) { gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; gObjectCurrVertexList = *vtxList; magnet = (f32 *) get_misc_asset(MISC_ASSET_MAGNET_DATA); - var_a0 = racer->vehicleID; - if (var_a0 < VEHICLE_CAR || var_a0 >= NUMBER_OF_PLAYER_VEHICLES) { - var_a0 = 0; + vehicleID = racer->vehicleID; + if (vehicleID < VEHICLE_CAR || vehicleID >= NUMBER_OF_PLAYER_VEHICLES) { + vehicleID = VEHICLE_CAR; } - magnet = &magnet[var_a0 * 5]; + magnet = &magnet[vehicleID * 5]; var_t0 = racer->unk2; if (var_t0 > 10) { var_t0 = 0; } - D_800DC764->segment.trans.x_position = magnet[0]; - D_800DC764->segment.trans.y_position = magnet[1]; - D_800DC764->segment.trans.z_position = magnet[2]; + gMagnetEffectObject->segment.trans.x_position = magnet[0]; + gMagnetEffectObject->segment.trans.y_position = magnet[1]; + gMagnetEffectObject->segment.trans.z_position = magnet[2]; magnet += 3; shear = (coss_f((D_8011B078[(var_t0 * 4) + 1] * 0x400)) * 0.02f) + 0.98f; - D_800DC764->segment.trans.scale = magnet[0] * shear; + gMagnetEffectObject->segment.trans.scale = magnet[0] * shear; magnet += 1; shear = magnet[0] * shear; - D_800DC764->segment.trans.y_rotation = D_8011B078[(var_t0 * 4) + 2] * 0x1000; - D_800DC764->segment.trans.x_rotation = 0; - D_800DC764->segment.trans.z_rotation = 0; - gfxData = *D_800DC764->unk68; + gMagnetEffectObject->segment.trans.y_rotation = D_8011B078[(var_t0 * 4) + 2] * 0x1000; + gMagnetEffectObject->segment.trans.x_rotation = 0; + gMagnetEffectObject->segment.trans.z_rotation = 0; + gfxData = *gMagnetEffectObject->unk68; mdl = gfxData->objModel; - D_800DC764->unk44 = (Vertex *) gfxData->unk4[gfxData->unk1F]; + gMagnetEffectObject->unk44 = (Vertex *) gfxData->unk4[gfxData->unk1F]; opacity = (((D_8011B078[(var_t0 * 4) + 1] * 8) & 0x7F) + 0x80); - func_8007F594(&gObjectCurrDisplayList, 2, 0xFFFFFF00 | opacity, D_800DC84C[racer->unk184]); - func_80068FA8(&gObjectCurrDisplayList, &gObjectCurrMatrix, D_800DC764, obj, shear); + func_8007F594(&gObjectCurrDisplayList, 2, 0xFFFFFF00 | opacity, gMagnetColours[racer->magnetModelID]); + func_80068FA8(&gObjectCurrDisplayList, &gObjectCurrMatrix, gMagnetEffectObject, obj, shear); D_800DC720 = TRUE; - func_800143A8(mdl, D_800DC764, 0, 4, 0); + func_800143A8(mdl, gMagnetEffectObject, 0, 4, 0); D_800DC720 = FALSE; gDkrInsertMatrix(gObjectCurrDisplayList++, 0, G_MTX_DKR_INDEX_0); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); @@ -2153,7 +2155,7 @@ void func_800142B8(void) { for (; i < objCount; i++) { currObj = gObjPtrList[i]; - if ((currObj->segment.trans.unk6 & 0x8000) == 0 && currObj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + if ((currObj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) == 0 && currObj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { for (j = 0; j < currObj->segment.header->numberOfModelIds; j++) { curr_68 = currObj->unk68[j]; if (curr_68 != NULL && curr_68->unk20 > 0) { @@ -2186,7 +2188,7 @@ void func_800155B8(void) { objsWithInteractives = 0; for (i = D_8011AE60; i < objCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { objInteract = obj->interactObj; if (objInteract != NULL) { objList[objsWithInteractives] = obj; @@ -2400,7 +2402,7 @@ Object *find_taj_object(void) { Object *current_obj; for (i = D_8011AE60; i < objCount; i++) { current_obj = gObjPtrList[i]; - if (!(current_obj->segment.trans.unk6 & 0x8000) && (current_obj->behaviorId == 62)) { + if (!(current_obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && (current_obj->behaviorId == BHV_PARK_WARDEN)) { return current_obj; } } @@ -2734,7 +2736,7 @@ void func_8001BC54(void) { gCameraObjCount = 0; for (i = 0; i < objCount; i++) { objPtr = gObjPtrList[i]; - if (!(objPtr->segment.trans.unk6 & 0x8000)) { + if (!(objPtr->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { if (objPtr->behaviorId == BHV_CAMERA_CONTROL) { if (gCameraObjCount < 20) { (*gCameraObjList)[gCameraObjCount] = objPtr; @@ -2861,7 +2863,7 @@ s32 func_8001C524(f32 diffX, f32 diffY, f32 diffZ, s32 someFlag) { if (someFlag) { sp64 = func_8001C418(diffY); } - dist = D_800E5644; + dist = (f32) 50000.0; result = 0xFF; for (numSteps = 0; numSteps != 128; numSteps++) { segment = (ObjectSegment*) (*D_8011AF04)[numSteps]; @@ -2871,7 +2873,7 @@ s32 func_8001C524(f32 diffX, f32 diffY, f32 diffZ, s32 someFlag) { if (someFlag && (sp64 != levelObj->doorID)) { var_a0 = 0; } - if ((someFlag == 2) && (levelObj->unk8 != 3)) { + if ((someFlag == 2) && (levelObj->angleY != 3)) { var_a0 = 0; } if (var_a0) { @@ -2988,7 +2990,7 @@ UNUSED void func_8001E13C(s16 arg0, s16 *arg1, s16 *arg2, s16 *arg3, s16 *arg4, for (i = 0; i < objCount; i++) { obj = gObjPtrList[i]; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { if (obj->behaviorId == BHV_RACER) { racer = &obj->unk64->racer; if (arg0 == racer->playerIndex) { @@ -3043,7 +3045,7 @@ void func_8001E36C(s32 arg0, f32 *arg1, f32 *arg2, f32 *arg3) { current_obj = gObjPtrList[i]; if (current_obj != NULL - && !(current_obj->segment.trans.unk6 & 0x8000) + && !(current_obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && current_obj->behaviorId == BHV_RAMP_SWITCH && current_obj->action == arg0) { *arg1 = current_obj->segment.trans.x_position; @@ -3157,7 +3159,7 @@ s8 func_800214E4(Object *obj, s32 updateRate) { animObj = (Object_AnimatedObject *) obj->unk64; if (animObj->unk3A != 0) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } if (animObj->unk36 == -1) { return animObj->unk3A; @@ -3169,7 +3171,7 @@ s8 func_800214E4(Object *obj, s32 updateRate) { animObj->unk36 = -2; } if (animObj->unk36 <= 0) { - obj->segment.trans.unk6 |= 0x4000; + obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; i = 0; if (D_8011AE78 > 0) { temp_v1 = animObj->unk28; @@ -3310,7 +3312,7 @@ Object *func_8002342C(f32 x, f32 z) { if (objCount > 0) { do { tempObj = gObjPtrList[i]; - if (!(tempObj->segment.trans.unk6 & 0x8000) && tempObj->behaviorId == BHV_UNK_57) { + if (!(tempObj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && tempObj->behaviorId == BHV_UNK_57) { diffX = tempObj->segment.trans.x_position - x; diffZ = tempObj->segment.trans.z_position - z; tempObj = gObjPtrList[i]; // fakematch @@ -3354,7 +3356,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj->behaviorId = obj->segment.header->behaviorId; switch (obj->behaviorId) { case BHV_RACER: - obj_init_racer(obj, (LevelObjectEntry_CharacterFlag *) entry); + obj_init_racer(obj, (LevelObjectEntry_Racer *) entry); break; case BHV_SCENERY: obj_init_scenery(obj, (LevelObjectEntry_Scenery*) entry); @@ -3612,131 +3614,131 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { } } -s32 func_80023E30(s32 arg0) { +s32 func_80023E30(s32 objectID) { s32 value = 0; - switch (arg0 - 1){ - case 0x00: + switch (objectID){ + case BHV_RACER: value = 0x1F; break; - case 0x01: + case BHV_SCENERY: value = 0x13; break; - case 0x04: + case BHV_WEAPON: value = 0x16; break; - case 0x0B: + case BHV_DINO_WHALE: value = 0x1B; break; - case 0x0D: - case 0x6E: + case BHV_DOOR: + case BHV_TT_DOOR: value = 0x30; break; - case 0x10: - case 0x4C: + case BHV_WEAPON_BALLOON: + case BHV_GOLDEN_BALLOON: value = 0x12; break; - case 0x45: - case 0x47: - case 0x5F: - case 0x60: + case BHV_HIT_TESTER: + case BHV_HIT_TESTER_2: + case BHV_SNOWBALL: + case BHV_SNOWBALL_2: value = 0x3B; break; - case 0x64: - case 0x65: - case 0x66: - case 0x67: + case BHV_SNOWBALL_3: + case BHV_SNOWBALL_4: + case BHV_HIT_TESTER_3: + case BHV_HIT_TESTER_4: value = 0x3A; break; - case 0x17: + case BHV_UNK_18: value = 0x04; break; - case 0x1E: + case BHV_STOPWATCH_MAN: value = 0x1B; break; - case 0x1F: - case 0x3F: - case 0x57: - case 0x6D: + case BHV_BANANA: + case BHV_WORLD_KEY: + case BHV_SILVER_COIN: + case BHV_SILVER_COIN_2: value = 0x12; break; - case 0x42: + case BHV_LOG: value = 0x30; break; - case 0x25: + case BHV_BRIDGE_WHALE_RAMP: value = 0x39; break; - case 0x26: + case BHV_RAMP_SWITCH: value = 0x12; break; - case 0x27: + case BHV_SEA_MONSTER: value = 0x09; break; - case 0x2C: + case BHV_COLLECT_EGG: value = 0x12; break; - case 0x2F: + case BHV_UNK_30: value = 0x09; break; - case 0x3E: + case BHV_UNK_3F: value = 0x09; break; - case 0x31: - case 0x37: - case 0x4F: - case 0x53: - case 0x55: - case 0x72: + case BHV_ANIMATED_OBJECT: + case BHV_VEHICLE_ANIMATION: + case BHV_PARK_WARDEN_2: + case BHV_WIZPIG_SHIP: + case BHV_ANIMATED_OBJECT_4: + case BHV_PIG_ROCKETEER: value = 0x0B; break; - case 0x35: + case BHV_CHARACTER_SELECT: value = 0x0B; break; - case 0x49: - case 0x5E: - case 0x62: - case 0x63: + case BHV_TROPHY_CABINET: + case BHV_DYNAMIC_LIGHT_OBJECT_2: + case BHV_ROCKET_SIGNPOST: + case BHV_ROCKET_SIGNPOST_2: value = 0x31; break; - case 0x5A: + case BHV_UNK_5B: value = 0x01; break; - case 0x50: + case BHV_ANIMATED_OBJECT_2: value = 0x0A; break; - case 0x06: - case 0x0C: - case 0x11: - case 0x19: - case 0x1D: - case 0x23: - case 0x28: - case 0x33: - case 0x36: - case 0x38: - case 0x43: - case 0x4D: - case 0x4E: - case 0x5C: - case 0x61: - case 0x6B: - case 0x73: + case BHV_EXIT: + case BHV_CHECKPOINT: + case BHV_WEAPON_2: + case BHV_SKY_CONTROL: + case BHV_MODECHANGE: + case BHV_BUOY_PIRATE_SHIP: + case BHV_BONUS: + case BHV_INFO_POINT: + case BHV_TRIGGER: + case BHV_ZIPPER_WATER: + case BHV_LAVA_SPURT: + case BHV_LASER_BOLT: + case BHV_LASER_GUN: + case BHV_ZIPPER_AIR: + case BHV_TELEPORT: + case BHV_FIREBALL_OCTOWEAPON: + case BHV_FIREBALL_OCTOWEAPON_2: value = 0x10; break; - case 0x51: + case BHV_ZIPPER_GROUND: value = 0x12; break; - case 0x30: - case 0x32: - case 0x3C: + case BHV_ANIMATION: + case BHV_CAMERA_ANIMATION: + case BHV_BUTTERFLY: value = 0x02; break; - case 0x3D: + case BHV_PARK_WARDEN: value = 0x1B; break; - case 0x6C: + case BHV_FROG: value = 0x0B; break; - case 0x71: + case BHV_UNK_72: value = 0x01; break; } diff --git a/src/objects.h b/src/objects.h index 8a851e8e..15bf888e 100644 --- a/src/objects.h +++ b/src/objects.h @@ -334,7 +334,7 @@ void func_80011390(void); s32 func_8001139C(); s32 get_race_start_timer(); s32 func_800113BC(); -s32 func_80011560(void); +s32 ignore_bounds_check(void); void func_80012C30(void); void func_80012C3C(Gfx** dlist); void func_80012C98(Gfx **dlist); @@ -399,7 +399,6 @@ s8 func_800235C0(void); void func_800235D0(s32 arg0); void run_object_init_func(Object *arg0, void *arg1, s32 arg2); void run_object_loop_func(Object *obj, s32 arg1); -void func_8002458C(s32 arg0); s16 *func_80024594(s32 *arg0, s32 *arg1); void func_800245B4(s16 arg0); void object_do_player_tumble(Object *this); diff --git a/src/particles.c b/src/particles.c index 789dd298..2311399a 100644 --- a/src/particles.c +++ b/src/particles.c @@ -1307,9 +1307,9 @@ void func_800B22FC(Particle2 *arg0, s32 arg1) { arg0->unk5C_halfs.unk5C += D_80127C80 * arg0->unk5C_halfs.unk5E; if (arg0->unk5C_halfs.unk5C < 0xFF) { if (arg0->unk40 & 0x1000) { - arg0->trans.unk6 |= 0x100; + arg0->trans.flags |= OBJ_FLAGS_UNK_0100; } else { - arg0->trans.unk6 |= 0x80; + arg0->trans.flags |= OBJ_FLAGS_UNK_0080; } } } else { @@ -1422,7 +1422,7 @@ UNUSED void func_800B3678(Gfx **arg0, MatrixS **arg1, Vertex **arg2) { objects = objGetObjList(&iObj, &nObjs); for (; iObj < nObjs; iObj++) { - if (objects[iObj]->segment.trans.unk6 & 0x8000) { + if (objects[iObj]->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { if ((s32) objects[iObj]->segment.header & 0x8000) { func_800B3740(objects[iObj], arg0, arg1, arg2, 0); } diff --git a/src/racer.c b/src/racer.c index abc718d3..1b9feb0b 100644 --- a/src/racer.c +++ b/src/racer.c @@ -210,9 +210,9 @@ s16 D_8011D5A0[2]; s16 gTTGhostNodeCount; // Gets assigned, but never used? s16 D_8011D5A8[2]; s16 D_8011D5AC; -s8 D_8011D5AE; +s8 gRacerWaveCount; s8 D_8011D5AF; -struct TempStruct8 **D_8011D5B0; +WaterProperties **gRacerCurrentWave; s32 D_8011D5B4; s16 D_8011D5B8; @@ -551,16 +551,16 @@ GLOBAL_ASM("asm/non_matchings/racer/func_80042D20.s") void func_80043ECC(Object *obj, Object_Racer *racer, s32 updateRate) { TempStruct5 *temp_v0; s8 *test; - s8 phi_a0; + s8 balloonType; s32 i; static s8 D_8011D5BA; static s8 D_8011D5BB; - static s8 D_8011D5BC; + static s8 sBalloonLevelAI; if (!obj) { D_8011D5BA = 0; D_8011D5BB = 0; - D_8011D5BC = 0; + sBalloonLevelAI = 0; return; } temp_v0 = func_8006C18C(); @@ -582,22 +582,22 @@ void func_80043ECC(Object *obj, Object_Racer *racer, s32 updateRate) { D_8011D5BA = 0; } if (racer->balloon_quantity) { - if (D_8011D5BC < racer->balloon_level) { + if (sBalloonLevelAI < racer->balloon_level) { temp_v0->unk8[1][0] += temp_v0->unk8[1][2]; temp_v0->unk8[1][1] += temp_v0->unk8[1][3]; } - D_8011D5BC = racer->balloon_level; + sBalloonLevelAI = racer->balloon_level; } else { - D_8011D5BC = 0; + sBalloonLevelAI = 0; } test = (s8 *) get_misc_asset(MISC_ASSET_UNK0C); if ((gCurrentButtonsReleased & Z_TRIG) && racer->balloon_quantity) { if (racer->balloon_level < 3) { - phi_a0 = test[racer->balloon_type * 3 + racer->balloon_level]; + balloonType = test[racer->balloon_type * 3 + racer->balloon_level]; } else { - phi_a0 = racer->balloon_type; + balloonType = racer->balloon_type; } - if (gRacerAIBalloonActionTable[phi_a0] == 1) { + if (gRacerAIBalloonActionTable[balloonType] == 1) { temp_v0->unk8[2][0] += temp_v0->unk8[2][2]; temp_v0->unk8[2][1] += temp_v0->unk8[2][3]; } @@ -647,7 +647,7 @@ void racer_AI_pathing_inputs(Object *obj, Object_Racer *racer, s32 updateRate) { } } - if (racer->velocity > -1.0 && racer->unk214 == 0 && !gRaceStartTimer && D_8011D544 == 0.0f && racer->unk1E2 && racer->unk215 == 0) { + if (racer->velocity > -1.0 && racer->unk214 == 0 && !gRaceStartTimer && D_8011D544 == 0.0f && racer->groundedWheels && racer->unk215 == 0) { racer->unk213 += updateRate; if (racer->unk213 > 60) { @@ -927,7 +927,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unk1D5 = 1; } } - if ((racer->unk1E2 != 0) && (racer->unk1E2 < 3)) { + if ((racer->groundedWheels) && (racer->groundedWheels < 3)) { obj->segment.trans.x_rotation -= (obj->segment.trans.x_rotation * updateRate) >> 6; racer->x_rotation_vel -= (racer->x_rotation_vel * updateRate) >> 6; } @@ -993,7 +993,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r temp_f0 = var_f18 - var_a3; var_f18 = (gCurrentRacerMiscAssetPtr[var_a3] * (1.0 - temp_f0)) + (gCurrentRacerMiscAssetPtr[var_a3 + 1] * temp_f0); gCurrentRacerWeightStat *= 0.75; - if (racer->unk1E2 >= 3) { + if (racer->groundedWheels >= 3) { obj->segment.y_velocity -= (gCurrentRacerWeightStat * 0.5) * updateRateF; } else { obj->segment.y_velocity -= gCurrentRacerWeightStat * updateRateF; @@ -1012,7 +1012,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f18 *= 1.0 - (sp11C / 300.0); } racer->steerVisualRotation -= (s32) (var_f14 * gCurrentRacerHandlingStat); - if ((racer->unk1E2 == 0) && (racer->buoyancy == 0.0)) { + if ((racer->groundedWheels == 0) && (racer->buoyancy == 0.0)) { if (obj->segment.y_velocity < 0.0f) { racer->unk1E0 += updateRate; } @@ -1032,12 +1032,12 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } - if ((((racer->playerIndex == PLAYER_ONE) && (racer->unk1E2 != 0)) && (var_t1 == 12)) && (gCurrentButtonsPressed & 0x2000)) { + if ((((racer->playerIndex == PLAYER_ONE) && (racer->groundedWheels)) && (var_t1 == 12)) && (gCurrentButtonsPressed & 0x2000)) { D_8011D582 = 2; } - if ((racer->unk1E2 != 0) || (racer->buoyancy > 0.0f)) { + if ((racer->groundedWheels) || (racer->buoyancy > 0.0f)) { if (racer->unk1E0 != 0) { - if (racer->unk1E2 != 0) { + if (racer->groundedWheels) { if (((gRaceStartTimer != 100) && (racer->playerIndex != PLAYER_COMPUTER)) && (racer->unk1E0 >= 6)) { play_sound_global(0xAEU, &racer->unk21C); func_80001FB8(0xAEU, (void *) racer->unk21C, (racer->unk1E0 * 2) + 0x32); @@ -1170,7 +1170,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.x_velocity += racer->ox1 * spF0; obj->segment.y_velocity += racer->oy1 * spF0; obj->segment.z_velocity += racer->oz1 * spF0; - if (((racer->unk1E2 != 0) && (gRacerInputBlocked == 0)) && (gRaceStartTimer == 0)) { + if (((racer->groundedWheels) && (gRacerInputBlocked == 0)) && (gRaceStartTimer == 0)) { temp_f2 = (gCurrentRacerWeightStat * updateRateF) * 0.25; sp11C = racer->pitch * temp_f2; temp_f2 = temp_f2 * racer->roll; @@ -1260,17 +1260,17 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r var_f14 = var_f14 * 0.8; if ((obj->segment.trans.y_position - var_f14) < sp118) { racer->buoyancy = sp118 - (obj->segment.trans.y_position - var_f14); - racer->unk1E5 = 5; + racer->waterTimer = 5; } else { racer->buoyancy = 0.0f; } } - if (racer->unk1E5 > 0) { - racer->unk1E5--; + if (racer->waterTimer > 0) { + racer->waterTimer--; } else { racer->buoyancy = 0.0f; } - if ((racer->unk1E5 > 0) && (obj->segment.trans.y_position < (sp118 + var_f14))) { + if ((racer->waterTimer > 0) && (obj->segment.trans.y_position < (sp118 + var_f14))) { obj->interactObj->flags |= 0x10; } else { obj->interactObj->flags &= 0xFFEF; @@ -1368,7 +1368,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r gCurrentRacerTransform.z_position = 0.0f; object_transform_to_matrix_2((f32 (*)[4]) sp68, &gCurrentRacerTransform); guMtxXFMF(sp68, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, &racer->lateral_velocity, (f32 *) (&racer->unk34), &racer->velocity); - if ((racer->unk1E2 == 0) && (racer->unk1E5 == 0)) { + if ((racer->groundedWheels == 0) && (racer->waterTimer == 0)) { var_v1 = (((-gCurrentStickY) * 0x40) & 0xFFFF) - (obj->segment.trans.x_rotation & 0xFFFF); if (var_v1 > 0x8000) { var_v1 -= 0xFFFF; @@ -1390,10 +1390,10 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (gRaceStartTimer != 0) { gCurrentButtonsPressed &= ~0x0010; } - if ((racer->buoyancy != 0.0f) || (racer->unk1E2 == 4)) { + if ((racer->buoyancy != 0.0f) || (racer->groundedWheels == 4)) { racer->unk1FB = 0; } - if (((gCurrentButtonsPressed & 0x0010) && ((racer->buoyancy > 0.0f) || (racer->unk1E2 >= 2))) && (racer->unk1FB == 0)) { + if (((gCurrentButtonsPressed & 0x0010) && ((racer->buoyancy > 0.0f) || (racer->groundedWheels >= 2))) && (racer->unk1FB == 0)) { if (racer->buoyancy != 0.0f) { obj->segment.y_velocity += 4.5; if (obj->segment.y_velocity > 5.5) { @@ -1805,7 +1805,7 @@ void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { baseFloat2 = 110.0f; baseFloat1 = 42.0f; } - if (((!(gCurrentRacerInput & 0x10)) || racer->unk1E2 < 3) && !racer->zipperDirCorrection) { + if (((!(gCurrentRacerInput & 0x10)) || racer->groundedWheels < 3) && !racer->zipperDirCorrection) { angle = (-racer->steerVisualRotation - (racer->unk196 & 0xFFFF)) + 0x8000; if (angle > 0x8000) { angle -= 0xFFFF; @@ -1884,7 +1884,7 @@ void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { phi_f14 = baseSpeed * 30.0f; phi_f14 = baseFloat2 + phi_f14; } - if (racer->velocity < 0.0 && !racer->unk1E2) { + if (racer->velocity < 0.0 && !racer->groundedWheels) { tempVel = -(racer->velocity * brakeVar); tempVel = tempVel * 6.0f; if (65.0 < tempVel) { @@ -2081,18 +2081,18 @@ void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r * Initialise the basic properties of each racer object. If it's tied to a human player, * will also initialise a camera object. */ -void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { +void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer) { Object_Racer *tempRacer; ActivePlayers player; s32 i; D_8011D53C = 0; tempRacer = (struct Object_Racer *) obj->unk64; - obj->segment.trans.y_rotation = racer->unkC; - obj->segment.trans.x_rotation = racer->unkA; - obj->segment.trans.z_rotation = racer->unk8; - player = racer->unkE; - tempRacer->unk194 = 0; + obj->segment.trans.y_rotation = racer->angleY; + obj->segment.trans.x_rotation = racer->angleX; + obj->segment.trans.z_rotation = racer->angleZ; + player = racer->playerIndex; + tempRacer->countLap = 0; tempRacer->stretch_height = 1.0f; tempRacer->stretch_height_cap = 1.0f; // Decide which player ID to assign to this object. Human players get a value from 0-3. @@ -2128,7 +2128,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { obj->interactObj->x_position = obj->segment.trans.x_position; obj->interactObj->y_position = obj->segment.trans.y_position; obj->interactObj->z_position = obj->segment.trans.z_position; - tempRacer->unk1E2 = 3; + tempRacer->groundedWheels = 3; tempRacer->unk1AA = 1; tempRacer->unk1AE = 1; tempRacer->miscAnimCounter = tempRacer->playerIndex * 5; @@ -2136,8 +2136,8 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { tempRacer->unk1FD = 0; tempRacer->magnetSoundMask = NULL; tempRacer->shieldSoundMask = NULL; - tempRacer->unk180 = 0; - tempRacer->unk218 = 0; + tempRacer->bananaSoundMask = NULL; + tempRacer->weaponSoundMask = NULL; tempRacer->unk220 = 0; tempRacer->unk21C = 0; if (tempRacer->playerIndex != PLAYER_COMPUTER && !D_8011D582) { @@ -2212,7 +2212,7 @@ void update_player_racer(Object *obj, s32 updateRate) { gCurrentSurfaceType = SURFACE_DEFAULT; gRaceStartTimer = func_8001139C(); updateRateF = updateRate; - tempRacer = (Object_Racer *)obj->unk64; + tempRacer = (Object_Racer *) obj->unk64; // Cap all of the velocities on the different axes. // Unfortunately, Rareware didn't appear to use a clamp macro here, which would've saved a lot of real estate. if (obj->segment.x_velocity > 50.0) { @@ -2327,7 +2327,7 @@ void update_player_racer(Object *obj, s32 updateRate) { gCurrentRacerMiscAssetPtr = (f32*) get_misc_asset(obj->segment.header->unk5C); D_8011D568 = (f32 *) get_misc_asset(obj->segment.header->unk5D); - if (obj->segment.y_velocity < 4.0 && (tempRacer->unk1E2 >= 3 || tempRacer->buoyancy != 0.0)) { + if (obj->segment.y_velocity < 4.0 && (tempRacer->groundedWheels > 2 || tempRacer->buoyancy != 0.0)) { tempRacer->unk1F1 = 0; } xTemp = obj->segment.trans.x_position; @@ -2419,24 +2419,24 @@ void update_player_racer(Object *obj, s32 updateRate) { gCurrentRacerInput = 0; } // Handle the race timer if it's currently active. - if (gRaceStartTimer == 0 && header->laps > (tempRacer->unk194)) { + if (gRaceStartTimer == 0 && header->laps > (tempRacer->countLap)) { // Keep it under 10 minutes. - if (tempRacer->lap_times[tempRacer->unk194] < normalise_time(36000) - updateRate) { - tempRacer->lap_times[tempRacer->unk194] += updateRate; + if (tempRacer->lap_times[tempRacer->countLap] < normalise_time(36000) - updateRate) { + tempRacer->lap_times[tempRacer->countLap] += updateRate; } else { - tempRacer->lap_times[tempRacer->unk194] = normalise_time(36000); + tempRacer->lap_times[tempRacer->countLap] = normalise_time(36000); } } // Assign a camera to human players. if (gCurrentPlayerIndex != PLAYER_COMPUTER) { gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); } - D_8011D5AE = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &D_8011D5B0); - if (D_8011D5AE) { - for (i = 0; i < D_8011D5AE; i++) { - if (D_8011D5B0[i]->unk10 == 0xF) { - if (D_8011D5B0[i]->unk0 < gCurrentCourseHeight) { - gCurrentCourseHeight = D_8011D5B0[i]->unk0; + gRacerWaveCount = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &gRacerCurrentWave); + if (gRacerWaveCount) { + for (i = 0; i < gRacerWaveCount; i++) { + if (gRacerCurrentWave[i]->type == WATER_UNK_F) { + if (gRacerCurrentWave[i]->waveHeight < gCurrentCourseHeight) { + gCurrentCourseHeight = gRacerCurrentWave[i]->waveHeight; } } } @@ -2446,19 +2446,19 @@ void update_player_racer(Object *obj, s32 updateRate) { gRacerWaveType = get_wave_properties(obj->segment.trans.y_position, &waterHeight, &gCurrentRacerWaterPos); if (gRacerWaveType) { if (obj->segment.trans.y_position - 5.0f < waterHeight) { - tempRacer->unk1E5 = 5; + tempRacer->waterTimer = 5; tempRacer->buoyancy = waterHeight - (obj->segment.trans.y_position - 5.0f); } else { tempRacer->buoyancy = 0.0f; } } else { - if (tempRacer->unk1E5 > 0) { - tempRacer->unk1E5--; + if (tempRacer->waterTimer > 0) { + tempRacer->waterTimer--; } else { tempRacer->buoyancy = 0.0f; } } - if (tempRacer->unk1E5 > 0 && obj->segment.trans.y_position < waterHeight + 5.0f) { + if (tempRacer->waterTimer > 0 && obj->segment.trans.y_position < waterHeight + 5.0f) { obj->interactObj->flags |= INTERACT_FLAGS_UNK_0010; } else { obj->interactObj->flags &= 0xFFEF; @@ -2500,7 +2500,7 @@ void update_player_racer(Object *obj, s32 updateRate) { func_8005C270(tempRacer); } checkpointNode = find_next_checkpoint_node(tempRacer->checkpoint, tempRacer->unk1C8); - if (tempRacer->playerIndex == PLAYER_COMPUTER && checkpointNode->unk36[tempRacer->unk1CA] == 5 && tempRacer->unk1E5) { + if (tempRacer->playerIndex == PLAYER_COMPUTER && checkpointNode->unk36[tempRacer->unk1CA] == 5 && tempRacer->waterTimer) { tempRacer->unk1C8 = 1; } if (checkpointNode->unk36[tempRacer->unk1CA] == 6) { @@ -2635,8 +2635,8 @@ void update_player_racer(Object *obj, s32 updateRate) { tempRacer->shieldType = SHIELD_NONE; } } - if (tempRacer->unk180) { - update_spatial_audio_position(tempRacer->unk180, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + if (tempRacer->bananaSoundMask) { + update_spatial_audio_position(tempRacer->bananaSoundMask, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); } if (is_in_time_trial() && tempRacer->playerIndex == PLAYER_ONE && gRaceStartTimer == 0) { func_80059BF0(obj, updateRate); @@ -2655,7 +2655,7 @@ void update_player_racer(Object *obj, s32 updateRate) { tempRacer->unk150->segment.trans.scale = obj->segment.unk30 / 265.0f; if (obj->segment.unk30 < 1500.0 || get_filtered_cheats() & CHEAT_MIRRORED_TRACKS) { tempObj = tempRacer->unk150; - tempObj->segment.trans.unk6 |= 0x4000; + tempObj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } if (tempRacer->unk150->segment.trans.scale < 1.0) { tempRacer->unk150->segment.trans.scale = 1.0f; @@ -2664,17 +2664,17 @@ void update_player_racer(Object *obj, s32 updateRate) { } tempRacer->unk1FE = -1; set_racer_tail_lights(tempRacer); - if (tempRacer->unk20E) { - if (tempRacer->unk210 > updateRate) { - tempRacer->unk210 -= updateRate; + if (tempRacer->delaySoundID) { + if (tempRacer->delaySoundTimer > updateRate) { + tempRacer->delaySoundTimer -= updateRate; } else { - tempRacer->unk210 = 0; + tempRacer->delaySoundTimer = 0; if (tempRacer->playerIndex == PLAYER_COMPUTER) { - play_sound_at_position(tempRacer->unk20E, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); + play_sound_at_position(tempRacer->delaySoundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); } else { - play_sound_spatial(tempRacer->unk20E, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); + play_sound_spatial(tempRacer->delaySoundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); } - tempRacer->unk20E = 0; + tempRacer->delaySoundID = SOUND_NONE; } } if (header->race_type & RACETYPE_CHALLENGE && header->race_type != RACETYPE_CHALLENGE_EGGS) { @@ -2682,8 +2682,8 @@ void update_player_racer(Object *obj, s32 updateRate) { } else { tempRacer->unk212 = 0; } - if (tempRacer->unk194 < tempRacer->lap) { - tempRacer->unk194 = tempRacer->lap; + if (tempRacer->countLap < tempRacer->lap) { + tempRacer->countLap = tempRacer->lap; } } } @@ -3087,7 +3087,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR surfaceTraction /= velocityDiff; } // If on the Taj pad and the horn is honked, summon Taj - if (racer->playerIndex == PLAYER_ONE && racer->unk1E2 != 0 && surfaceType == SURFACE_TAJ_PAD && gCurrentButtonsPressed & Z_TRIG) { + if (racer->playerIndex == PLAYER_ONE && racer->groundedWheels && surfaceType == SURFACE_TAJ_PAD && gCurrentButtonsPressed & Z_TRIG) { D_8011D582 = 2; } // Set grip levels to basically zero when floating on water. @@ -3927,7 +3927,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, racer_attack_handler_car(obj, racer, updateRate); if (racer->spinout_timer) { racer_spinout_car(obj, racer, updateRate, updateRateF); // Sbinalla - } else if (racer->unk1E2 > 0) { + } else if (racer->groundedWheels > 0) { update_car_velocity_ground(obj, racer, updateRate, updateRateF); } else { update_car_velocity_offground(obj, racer, updateRate, updateRateF); @@ -3955,7 +3955,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, obj->segment.z_velocity = zVel * 4.0f; obj->segment.y_velocity = 9.5f; racer->unk1F0 = 1; - } else if (racer->unk1E2 > 2) { + } else if (racer->groundedWheels > 2) { racer->unk1F0 = 0; } obj->segment.unk38.byte.unk3B = 0; @@ -4212,7 +4212,7 @@ GLOBAL_ASM("asm/non_matchings/racer/func_80054FD0.s") void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { f32 angleZ; f32 distance; - s32 sp74; + s32 hasCollision; s32 flags; s32 temp_v1_2; f32 xTemp; @@ -4231,17 +4231,17 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { obj->segment.trans.y_position = gCurrentCourseHeight; } racerSize = (f32 *) get_misc_asset(MISC_ASSET_RACER_HITBOX_SIZE); - surface = -1; + surface = SURFACE_NONE; radius = racerSize[racer->vehicleIDPrev]; tempPos.x = obj->segment.trans.x_position; tempPos.y = obj->segment.trans.y_position; tempPos.z = obj->segment.trans.z_position; D_8011D548 = 0.0f; D_8011D54C = 0.0f; - sp74 = 0; + hasCollision = FALSE; flags = 0; if (racer->playerIndex != PLAYER_COMPUTER || racer->vehicleIDPrev < VEHICLE_TRICKY) { - flags = func_80017248(obj, 1, &sp74, &racer->unkD8, &tempPos.x, &radius, &surface); + flags = func_80017248(obj, 1, &hasCollision, &racer->unkD8, &tempPos.x, &radius, &surface); } if (flags & 0x80) { D_8011D548 = tempPos.x - obj->segment.trans.x_position; @@ -4253,16 +4253,16 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { shouldSquish = TRUE; } func_80031130(1, &racer->unkD8.x, &tempPos.x, racer->vehicleID); - sp74 = 0; - racer->unk1E3 = func_80031600(&racer->unkD8.x, &tempPos.x, &radius, &surface, TRUE, &sp74); + hasCollision = FALSE; + racer->unk1E3 = func_80031600(&racer->unkD8.x, &tempPos.x, &radius, &surface, TRUE, &hasCollision); racer->unk1E4 = flags; racer->unk1E3 |= flags; - racer->unk1E2 = 0; + racer->groundedWheels = 0; if (racer->unk1E3) { - racer->unk1E3 = 15; - racer->unk1E2 = 4; + racer->unk1E3 = 0x8 | 0x4 | 0x2 | 0x1; + racer->groundedWheels = 4; } - if (shouldSquish && sp74) { + if (shouldSquish && hasCollision) { if (racer->squish_timer == 0) { racer->attackType = ATTACK_SQUISHED; } else { @@ -4272,21 +4272,21 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { for (i = 0; i < 3; i++) { racer->unkD8.f[i] = tempPos.f[i]; } + i = 1; // Fakematch racer->wheel_surfaces[0] = surface; - i = 1; racer->wheel_surfaces[1] = surface; racer->wheel_surfaces[2] = surface; racer->wheel_surfaces[3] = surface; obj->segment.trans.x_position = racer->unkD8.x; obj->segment.trans.y_position = racer->unkD8.y; obj->segment.trans.z_position = racer->unkD8.z; - if (racer->unk1E2) { + if (racer->groundedWheels) { func_8002ACD4(&xTemp, &yTemp, &zTemp); angleX = sins_f(-obj->segment.trans.y_rotation); angleZ = coss_f(-obj->segment.trans.y_rotation); distance = (xTemp * angleZ) + (zTemp * angleX); zTemp = (xTemp * angleX) - (zTemp * angleZ); - temp_v1_2 = -(s16)(u16)arctan2_f(distance, yTemp); + temp_v1_2 = -(s16) (u16) arctan2_f(distance, yTemp); if (temp_v1_2 < 0x2000 && temp_v1_2 > -0x2000) { racer->x_rotation_vel = temp_v1_2; } @@ -4295,7 +4295,7 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { obj->segment.trans.x_rotation = xRot; } if (racer->vehicleID == VEHICLE_LOOPDELOOP) { - if (1) + if (1) // Fakematch xRot -= (u16) obj->segment.trans.x_rotation; WRAP(xRot, -0x8000, 0x8000); obj->segment.trans.x_rotation += xRot >> 2; @@ -4326,10 +4326,9 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) f32 distance; f32 scaleY; f32 scaleZ; - UNUSED s32 pad; + UNUSED s32 pad[2]; s8 *miscAsset; Vertex *heldObjData; - UNUSED s32 playerIndex; u16 soundID = SOUND_NONE; if (racer->held_obj != NULL) { @@ -4391,9 +4390,9 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) if (gCurrentButtonsPressed & Z_TRIG) { func_800A74EC(318, racer->playerIndex); } - if (racer->unk195) { + if (racer->magnetLevel3) { if (racer->magnetTimer == 0) { - racer->unk195 = 0; + racer->magnetLevel3 = FALSE; } else { return; } @@ -4484,7 +4483,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) } if (weaponID == WEAPON_NITRO_LEVEL_3) { racer_play_sound(obj, SOUND_NITRO_LEVEL3_CHARGE); - func_800570A4(obj, 0x233, 0x1E); + racer_play_sound_after_delay(obj, SOUND_NITRO_LEVEL3_BOOST, 30); } else { racer_play_sound(obj, SOUND_NITRO_BOOST); } @@ -4503,7 +4502,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) if (racer->playerIndex != PLAYER_COMPUTER) { if (intendedTarget != NULL) { racer->magnetTimer = 90; - racer->unk184 = (weaponID - 5) >> 1; + racer->magnetModelID = (weaponID - WEAPON_MAGNET_LEVEL_1) >> 1; } if (racer->raceFinished == FALSE) { func_80072348(racer->playerIndex, 15); @@ -4515,10 +4514,10 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) racer->magnetTargetObj = NULL; if (racer->playerIndex != PLAYER_COMPUTER) { if (magnetTarget != NULL) { - magnetTarget->racer.unk195 = 1; + magnetTarget->racer.magnetLevel3 = TRUE; magnetTarget->racer.magnetTimer = 120; magnetTarget->racer.magnetTargetObj = obj; - magnetTarget->racer.unk184 = 2; + magnetTarget->racer.magnetModelID = MAGNET_LEVEL3; } if (racer->raceFinished == FALSE) { func_80072348(racer->playerIndex, 15); @@ -4558,7 +4557,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) spawnedObj->segment.z_velocity = obj->segment.z_velocity - (racer->oz1 * velocity); spawnedObj->segment.trans.y_rotation = obj->segment.trans.y_rotation; spawnedObj->segment.trans.x_rotation = obj->segment.trans.x_rotation; - if (racer->vehicleID == VEHICLE_HOVERCRAFT && racer->unk1E5) { + if (racer->vehicleID == VEHICLE_HOVERCRAFT && racer->waterTimer) { if (spawnedObj->segment.trans.x_rotation > -0x400 && spawnedObj->segment.trans.x_rotation < 0x400) { spawnedObj->segment.trans.x_rotation = 0; } @@ -4596,10 +4595,10 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) if (racer->playerIndex == PLAYER_COMPUTER) { play_sound_at_position(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); } else { - if (racer->unk218) { - func_8000488C(racer->unk218); + if (racer->weaponSoundMask) { + func_8000488C(racer->weaponSoundMask); } - play_sound_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, (s32** ) &racer->unk218); + play_sound_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, (s32** ) &racer->weaponSoundMask); } } } @@ -4670,7 +4669,7 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { diffZ /= vel; magnetTarget = racer->magnetTargetObj->unk64; vel = -magnetTarget->racer.velocity; - if (vel < 8.0 && racer->unk195 == 0) { + if (vel < 8.0 && racer->magnetLevel3 == FALSE) { vel = 8.0f; } if (vel > 20.0) { @@ -4678,25 +4677,30 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { } gRacerMagnetVelX = (vel + 5.0f) * diffX; gRacerMagnetVelZ = (vel + 5.0f) * diffZ; - if (magnetTarget->racer.shieldTimer != 0 && racer->unk195 == 0) { + if (magnetTarget->racer.shieldTimer && racer->magnetLevel3 == FALSE) { racer->magnetTimer = 0; } } /** * Play a spatial sound, emitting from the position of the racer object. + * Only affects human players that aren't in the middle of going through an exit. */ void racer_play_sound(Object *obj, s32 soundID) { Object_Racer *racer = &obj->unk64->racer; - if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->exitObj == 0) { + if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->exitObj == NULL) { play_sound_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); } } -void func_800570A4(Object *obj, s32 arg1, s32 arg2) { - Object_Racer *temp = &obj->unk64->racer; - temp->unk20E = arg1; - temp->unk210 = arg2; +/** + * Set a timer and sound ID. + * When that timer counts zero in the racer's update loop, it plays the sound passed through here. +*/ +void racer_play_sound_after_delay(Object *obj, s32 soundID, s32 delay) { + Object_Racer *racer = &obj->unk64->racer; + racer->delaySoundID = soundID; + racer->delaySoundTimer = delay; } /** @@ -5022,7 +5026,7 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { dialogueAngle = gDialogueCameraAngle / 10240.0f; // Goes between 0-1 gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * dialogueAngle); gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * dialogueAngle); - gCameraObject->y_velocity = (((func_8003ACAC() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); + gCameraObject->y_velocity = (((get_npc_pos_y() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); gCameraObject->unk38 = -gCameraObject->trans.x_rotation * dialogueAngle; gCameraObject->trans.x_position += gCameraObject->x_velocity; gCameraObject->trans.y_position += gCameraObject->y_velocity + gCameraObject->unk30; @@ -5160,7 +5164,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { baseSpeed *= 0.25; break; } - if (racer->unk1E2 > 2 || racer->unk1E5 != 0) { + if (racer->groundedWheels > 2 || racer->waterTimer != 0) { angle = (obj->segment.trans.x_rotation); if (angle > 0) { angle -= 0x71C; @@ -5567,7 +5571,11 @@ void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 * *hundredths = (((frameCount - (*minutes * (REFRESH_60HZ * 60))) - (*seconds * REFRESH_60HZ)) * 100) / REFRESH_60HZ; } -void func_800598D0(void) { +/** + * Allocate the ghost data heap into memory. + * The path node pool is globally loaded, despite only being used in time trial. +*/ +void allocate_ghost_data(void) { gGhostData[0] = allocate_from_main_pool_safe((sizeof(GhostNode) + sizeof(GhostDataFrame)) * MAX_NUMBER_OF_GHOST_NODES, COLOUR_TAG_RED); gGhostData[1] = (GhostHeader *) ((GhostNode *) gGhostData[0] + MAX_NUMBER_OF_GHOST_NODES); gGhostData[2] = NULL; // T.T. Ghost @@ -5630,7 +5638,7 @@ s32 load_tt_ghost(s32 ghostOffset, s32 size, s16 *outTime) { if (gGhostData[2] != NULL) { *outTime = ghost->time; gTTGhostNodeCount = ghost->nodeCount; - bcopy((u8 *)ghost + 8, gGhostData[2], size - sizeof(GhostHeader)); + bcopy((u8 *) ghost + 8, gGhostData[2], size - sizeof(GhostHeader)); free_from_memory_pool(ghost); return 0; } @@ -5872,18 +5880,18 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat gCurrentRacerHandlingStat = 1; gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_ASSET_UNK21); D_8011D568 = (f32 *) get_misc_asset(obj->segment.header->unk5D); - if ((obj->segment.y_velocity < 4.0) && ((racer->unk1E2 >= 3) || (racer->buoyancy != 0.0))) { + if ((obj->segment.y_velocity < 4.0) && ((racer->groundedWheels >= 3) || (racer->buoyancy != 0.0))) { racer->unk1F1 = 0; } if (racer->magnetTimer != 0) { racer_activate_magnet(obj, racer, updateRate); } if (racer->vehicleID != VEHICLE_HOVERCRAFT) { - racer->unk1E5 = 0; + racer->waterTimer = 0; racer->buoyancy = 0; - D_8011D5AE = 0; + gRacerWaveCount = 0; } else { - D_8011D5AE = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &D_8011D5B0); + gRacerWaveCount = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &gRacerCurrentWave); } func_8002ACC8(0); if ((racer->approachTarget != NULL) || (gRaceStartTimer != 0) || (racer->unk204 > 0)) { @@ -5921,7 +5929,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat checkpoint = find_next_checkpoint_node(racer->checkpoint, racer->unk1C8); if (checkpoint->unk36[racer->unk1CA] == 5) { racer->unk201 = 30; - if (racer->unk1E5 != 0) { + if (racer->waterTimer) { racer->unk1C8 = 1; } } @@ -6028,7 +6036,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat racer->unk150->segment.trans.z_position = obj->segment.trans.z_position; racer->unk150->segment.trans.scale = obj->segment.unk30 / 265.0f; if (obj->segment.unk30 < 1500.0) { - racer->unk150->segment.trans.unk6 |= 0x4000; + racer->unk150->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } if (racer->unk150->segment.trans.scale < 1.0) { racer->unk150->segment.trans.scale = 1.0f; @@ -6254,7 +6262,7 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } func_80042D20(obj, racer, updateRate); handle_racer_items(obj, racer, updateRate); - racer->unk1E5 = 0; + racer->waterTimer = 0; obj->interactObj->x_position = obj->segment.trans.x_position; obj->interactObj->y_position = obj->segment.trans.y_position; obj->interactObj->z_position = obj->segment.trans.z_position; @@ -6286,7 +6294,7 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR GLOBAL_ASM("asm/non_matchings/racer/func_8005B818.s") #endif -// This gets called if an anti-piracy checksum fails in func_8005F850. +// This gets called if an anti-piracy checksum fails in allocate_object_model_pools. /** * Triggered upon failure of an anti-tamper test. Sets the first index of the surface speed * table to an unreasonable value, wrecking drivability while on it. diff --git a/src/racer.h b/src/racer.h index eb31ae32..a67d4771 100644 --- a/src/racer.h +++ b/src/racer.h @@ -7,14 +7,6 @@ #define SEGMENT_NONE -1 // If the level in question does not use segmentation. -struct TempStruct8 { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; - s8 unk10; -}; - typedef enum ActivePlayers { PLAYER_COMPUTER = -1, PLAYER_ONE, @@ -73,6 +65,12 @@ typedef enum ShieldType { SHIELD_LEVEL3 } ShieldType; +typedef enum MagnetType { + MAGNET_LEVEL1, + MAGNET_LEVEL2, + MAGNET_LEVEL3 +} MagnetType; + typedef enum WeaponType { WEAPON_NONE = -1, WEAPON_ROCKET_HOMING, @@ -158,12 +156,12 @@ void func_800535C4(Object *obj, Object_Racer *racer); void handle_car_velocity_control(Object_Racer *racer); void play_char_horn_sound(Object *obj, Object_Racer *racer); void racer_play_sound(Object *obj, s32 soundID); -void func_800570A4(Object *obj, s32 arg1, s32 arg2); +void racer_play_sound_after_delay(Object *obj, s32 arg1, s32 arg2); void func_800575EC(Object *obj, Object_Racer *racer); void handle_base_steering(Object_Racer *racer, s32 updateRate, f32 updateRateF); void second_racer_camera_update(Object *obj, Object_Racer *racer, s32 mode, f32 arg3); void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 *hundredths); -void func_800598D0(void); +void allocate_ghost_data(void); void func_80059944(void); void func_80059984(s32 arg0); s32 func_800599A8(void); @@ -193,7 +191,7 @@ void update_camera_finish_race(f32 arg0, Object *obj, Object_Racer *racer); void update_camera_fixed(f32 arg0, Object *obj, Object_Racer *racer); void handle_racer_head_turning(Object *obj, Object_Racer *racer, s32 updateRate); void racer_approach_object(Object *obj, Object_Racer *racer, f32 divisor); -void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer); +void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer); void racer_AI_pathing_inputs(Object *obj, Object_Racer *racer, s32 updateRate); void func_80043ECC(Object *obj, Object_Racer *racer, s32 updateRate); void func_80055A84(Object *obj, Object_Racer *racer, s32 updateRate); diff --git a/src/textures_sprites.h b/src/textures_sprites.h index 88502a5c..394b7db5 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -41,6 +41,26 @@ enum RenderFlags { RENDER_UNK_8000000 = (1 << 27), }; +typedef enum TransFlags { + OBJ_FLAGS_UNK_0000, + OBJ_FLAGS_UNK_0001 = (1 << 0), + OBJ_FLAGS_UNK_0002 = (1 << 1), + OBJ_FLAGS_UNK_0004 = (1 << 2), + OBJ_FLAGS_UNK_0008 = (1 << 3), + OBJ_FLAGS_UNK_0010 = (1 << 4), + OBJ_FLAGS_UNK_0020 = (1 << 5), + OBJ_FLAGS_UNK_0040 = (1 << 6), + OBJ_FLAGS_UNK_0080 = (1 << 7), + OBJ_FLAGS_UNK_0100 = (1 << 8), + OBJ_FLAGS_INVIS_PLAYER1 = (1 << 9), // Player 1 cannot see this. + OBJ_FLAGS_INVIS_PLAYER2 = (1 << 10), // Player 2 cannot see this. + OBJ_FLAGS_UNK_0800 = (1 << 11), + OBJ_FLAGS_SHADOW_ONLY = (1 << 12), // Still has a shadow, but the model is invisible. + OBJ_FLAGS_UNK_2000 = (1 << 13), + OBJ_FLAGS_INVISIBLE = (1 << 14), // Invisible, and hidden shadow too. + OBJ_FLAGS_DEACTIVATED = (1 << 15), // Object is invisible and inactive. +} TransFlags; + #define TEX_TABLE_2D 0 #define TEX_TABLE_3D 1 diff --git a/src/unknown_005740.c b/src/unknown_005740.c index ee5bfe99..b585fcee 100644 --- a/src/unknown_005740.c +++ b/src/unknown_005740.c @@ -34,7 +34,6 @@ unk8011A6D8 **D_8011A6DC; // Struct of size 0xC0 f32 D_8011A6E0[334]; s32 D_8011AC18; s32 D_8011AC1C; -s16 D_8011AC20[128]; /******************************/ diff --git a/src/unknown_0255E0.c b/src/unknown_0255E0.c index 40a33e9a..31e40f5e 100644 --- a/src/unknown_0255E0.c +++ b/src/unknown_0255E0.c @@ -137,8 +137,8 @@ s32 D_8011D164; s32 D_8011D168[84]; WaterProperties *gTrackWaves[20]; s8 D_8011D308; -LevelModel *D_8011D30C; -s32 *D_8011D310; +LevelModel *gTrackModelHeap; +s32 *gLevelModelTable; UNUSED f32 gPrevCameraX; // Set but never read UNUSED f32 gPrevCameraY; // Set but never read UNUSED f32 gPrevCameraZ; // Set but never read @@ -319,7 +319,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, TriangleList **tris, if (gCurrentLevelHeader2->race_type == RACETYPE_CUTSCENE_1 || gCurrentLevelHeader2->unkBD) { gAntiAliasing = TRUE; } - if (gCurrentLevelHeader2->unk49 == -1) { + if (gCurrentLevelHeader2->skyDome == -1) { i = (gCurrentLevelHeader2->unkA4->width << 9) - 1; gCurrentLevelHeader2->unkA8 = (gCurrentLevelHeader2->unkA8 + (gCurrentLevelHeader2->unkA2 * tempUpdateRate)) & i; i = (gCurrentLevelHeader2->unkA4->height << 9) - 1; @@ -363,7 +363,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, TriangleList **tris, func_8002A31C(); if (numViewports < VIEWPORTS_COUNT_3_PLAYERS) { func_80068408(&gSceneCurrDisplayList, &gSceneCurrMatrix); - if (gCurrentLevelHeader2->unk49 == -1) { + if (gCurrentLevelHeader2->skyDome == -1) { func_80028050(); } else { render_skydome(); @@ -795,7 +795,7 @@ void render_skydome(void) { return; cam = get_active_camera_segment(); - if (gCurrentLevelHeader2->unk49 == 0) { + if (gCurrentLevelHeader2->skyDome == 0) { gSkydomeSegment->segment.trans.x_position = cam->trans.x_position; gSkydomeSegment->segment.trans.y_position = cam->trans.y_position; gSkydomeSegment->segment.trans.z_position = cam->trans.z_position; @@ -864,24 +864,24 @@ void set_anti_aliasing(s32 setting) { * Afterwards, render particles. */ void render_level_geometry_and_objects(void) { - s32 sp16C; + s32 objCount; s32 numberOfSegments; s32 objFlags; s32 sp160; s32 i; - s32 sp158; + s32 visibleFlags; u8 segmentIds[LEVEL_SEGMENT_MAX]; u8 objectsVisible[LEVEL_SEGMENT_MAX]; - s32 s0; + s32 visible; Object *obj; func_80012C30(); if (get_settings()->courseId == ASSET_LEVEL_OPENINGSEQUENCE) { - gAntiAliasing = 1; + gAntiAliasing = TRUE; } - sp160 = func_80014814(&sp16C); + sp160 = func_80014814(&objCount); if (gCurrentLevelModel->numberOfSegments > 1) { numberOfSegments = 0; @@ -909,23 +909,23 @@ void render_level_geometry_and_objects(void) { } reset_render_settings(&gSceneCurrDisplayList); - func_80015348(sp160, sp16C - 1); - sp158 = 0x200 << (get_current_viewport() & 1); + func_80015348(sp160, objCount - 1); + visibleFlags = OBJ_FLAGS_INVIS_PLAYER1 << (get_current_viewport() & 1); - for (i = sp160; i < sp16C; i++) { + for (i = sp160; i < objCount; i++) { obj = get_object(i); - s0 = 0xFF; - objFlags = obj->segment.trans.unk6; - if (objFlags & 0x80) { - s0 = 0; - } else if (!(objFlags & 0x8000)) { - s0 = obj->segment.unk38.byte.unk39; + visible = 255; + objFlags = obj->segment.trans.flags; + if (objFlags & OBJ_FLAGS_UNK_0080) { + visible = 0; + } else if (!(objFlags & OBJ_FLAGS_DEACTIVATED)) { + visible = obj->segment.unk38.byte.unk39; } - if (objFlags & sp158) { - s0 = 0; + if (objFlags & visibleFlags) { + visible = 0; } - if (obj != NULL && s0 == 0xFF && check_if_in_draw_range(obj) && (objectsVisible[obj->segment.unk2C.half.lower + 1] || obj->segment.unk34_a.unk34 > 1000.0)) { - if (obj->segment.trans.unk6 & 0x8000) { + if (obj != NULL && visible == 255 && check_if_in_draw_range(obj) && (objectsVisible[obj->segment.unk2C.half.lower + 1] || obj->segment.unk34_a.unk34 > 1000.0)) { + if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { @@ -938,16 +938,16 @@ void render_level_geometry_and_objects(void) { } } - for (i = sp16C - 1; i >= sp160; i--) { + for (i = objCount - 1; i >= sp160; i--) { obj = get_object(i); - objFlags = obj->segment.trans.unk6; - if (objFlags & sp158) { - s0 = FALSE; + objFlags = obj->segment.trans.flags; + if (objFlags & visibleFlags) { + visible = FALSE; } else { - s0 = TRUE; + visible = TRUE; } - if (obj != NULL && s0 && objFlags & 0x100 && objectsVisible[obj->segment.unk2C.half.lower + 1] && check_if_in_draw_range(obj)) { - if (obj->segment.trans.unk6 & 0x8000) { + if (obj != NULL && visible && objFlags & OBJ_FLAGS_UNK_0100 && objectsVisible[obj->segment.unk2C.half.lower + 1] && check_if_in_draw_range(obj)) { + if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { @@ -975,24 +975,24 @@ void render_level_geometry_and_objects(void) { func_80012C3C(&gSceneCurrDisplayList); // Particles and FX - for (i = sp16C - 1; i >= sp160; i--) { + for (i = objCount - 1; i >= sp160; i--) { obj = get_object(i); - s0 = 0xFF; - objFlags = obj->segment.trans.unk6; - if (objFlags & 0x80) { - s0 = 1; - } else if (!(objFlags & 0x8000)) { - s0 = obj->segment.unk38.byte.unk39; + visible = 255; + objFlags = obj->segment.trans.flags; + if (objFlags & OBJ_FLAGS_UNK_0080) { + visible = TRUE; + } else if (!(objFlags & OBJ_FLAGS_DEACTIVATED)) { + visible = obj->segment.unk38.byte.unk39; } - if (objFlags & sp158) { - s0 = 0; + if (objFlags & visibleFlags) { + visible = FALSE; } - if ((obj->behaviorId == BHV_RACER) && (s0 >= 0xFF)) { - s0 = 0; + if (obj->behaviorId == BHV_RACER && visible >= 255) { + visible = FALSE; } - if (obj != NULL && s0 < 0xFF && objectsVisible[obj->segment.unk2C.half.lower + 1] && check_if_in_draw_range(obj)) { - if (s0 > 0) { - if (obj->segment.trans.unk6 & 0x8000) { + if (obj != NULL && visible < 255 && objectsVisible[obj->segment.unk2C.half.lower + 1] && check_if_in_draw_range(obj)) { + if (visible > 0) { + if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); goto skip; } else if (obj->shadow != NULL) { @@ -1458,7 +1458,7 @@ s32 check_if_in_draw_range(Object *obj) { s32 temp2; f32 dist; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { alpha = 255; viewDistance = obj->segment.header->drawDistance; if (obj->segment.header->drawDistance) { @@ -1649,30 +1649,30 @@ void func_8002C0C4(s32 modelId) { LevelModel *mdl; set_texture_colour_tag(COLOUR_TAG_GREEN); - D_8011D30C = allocate_from_main_pool_safe(LEVEL_MODEL_MAX_SIZE, COLOUR_TAG_YELLOW); - gCurrentLevelModel = D_8011D30C; + gTrackModelHeap = allocate_from_main_pool_safe(LEVEL_MODEL_MAX_SIZE, COLOUR_TAG_YELLOW); + gCurrentLevelModel = gTrackModelHeap; D_8011D370 = allocate_from_main_pool_safe(0x7D0, COLOUR_TAG_YELLOW); D_8011D374 = allocate_from_main_pool_safe(0x1F4, COLOUR_TAG_YELLOW); D_8011D378 = 0; - D_8011D310 = (s32*)load_asset_section_from_rom(ASSET_LEVEL_MODELS_TABLE); + gLevelModelTable = (s32*)load_asset_section_from_rom(ASSET_LEVEL_MODELS_TABLE); - for(i = 0; D_8011D310[i] != -1; i++); + for(i = 0; gLevelModelTable[i] != -1; i++); i--; if (modelId >= i) { modelId = 0; } - //offset = D_8011D310[modelId]; - temp_s4 = D_8011D310[modelId + 1] - D_8011D310[modelId]; + //offset = gLevelModelTable[modelId]; + temp_s4 = gLevelModelTable[modelId + 1] - gLevelModelTable[modelId]; // temp = compressedRamAddr temp = (s32) gCurrentLevelModel; temp += (LEVEL_MODEL_MAX_SIZE - temp_s4); temp -= ((s32)temp % 16); // Align to 16-byte boundary. - load_asset_to_address(ASSET_LEVEL_MODELS, temp, D_8011D310[modelId], temp_s4); + load_asset_to_address(ASSET_LEVEL_MODELS, temp, gLevelModelTable[modelId], temp_s4); gzip_inflate((u8*) temp, (u8*) gCurrentLevelModel); - free_from_memory_pool(D_8011D310); // Done with the level models table, so free it. + free_from_memory_pool(gLevelModelTable); // Done with the level models table, so free it. mdl = gCurrentLevelModel; @@ -1711,8 +1711,8 @@ void func_8002C0C4(s32 modelId) { rmonPrintf("ERROR!! TrackMem overflow .. %d\n", temp_s4); } set_free_queue_state(0); - free_from_memory_pool(D_8011D30C); - allocate_at_address_in_main_pool(temp_s4, (u8* ) D_8011D30C, COLOUR_TAG_YELLOW); + free_from_memory_pool(gTrackModelHeap); + allocate_at_address_in_main_pool(temp_s4, (u8* ) gTrackModelHeap, COLOUR_TAG_YELLOW); set_free_queue_state(2); minimap_init(gCurrentLevelModel); @@ -1765,21 +1765,24 @@ LevelModel *get_current_level_model(void) { return gCurrentLevelModel; } -void func_8002C7D4(void) { +/** + * Frees and unloads level data from RAM. +*/ +void free_track(void) { s32 i; func_8000B290(); if (D_8011D384 != 0) { func_800B7D20(); } - for(i = 0; i < gCurrentLevelModel->numberOfTextures; i++) { + for (i = 0; i < gCurrentLevelModel->numberOfTextures; i++) { free_texture(gCurrentLevelModel->textures[i].texture); } - free_from_memory_pool(D_8011D30C); + free_from_memory_pool(gTrackModelHeap); free_from_memory_pool(D_8011D370); free_from_memory_pool(D_8011D374); free_sprite((Sprite *) gCurrentLevelModel->minimapSpriteIndex); - for(i = 0; i < MAXCONTROLLERS; i++) { + for (i = 0; i < MAXCONTROLLERS; i++) { free_from_memory_pool(D_8011D350[i]); free_from_memory_pool(D_8011D320[i]); free_from_memory_pool(D_8011D338[i]); @@ -2030,11 +2033,11 @@ void func_8002D8DC(s32 arg0, s32 arg1, s32 updateRate) { obj58 = obj->unk58; shadow = obj->shadow; sp94 += 1; - if (!(obj->segment.trans.unk6 & 0x8000)) { + if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { if (shadow != NULL && shadow->scale > 0.0f && arg0 == objHeader->unk32) { shadow->unk8 = -1; } - if (obj->segment.trans.unk6 & 0x4000) { + if (obj->segment.trans.flags & OBJ_FLAGS_INVISIBLE) { shadow = NULL; } if ((shadow != NULL && objHeader->unk32 == 2) || (obj58 != NULL && objHeader->unk36 == 2)) { @@ -2514,7 +2517,7 @@ void compute_scene_camera_transform_matrix(void) { guMtxXFMF(mtx, x, y, z, &x, &y, &z); //Store x/y/z as integers - gScenePerspectivePos.x = (s32) x; - gScenePerspectivePos.y = (s32) y; - gScenePerspectivePos.z = (s32) z; + gScenePerspectivePos.x = x; + gScenePerspectivePos.y = y; + gScenePerspectivePos.z = z; } diff --git a/src/unknown_0255E0.h b/src/unknown_0255E0.h index 422c4964..7c64e22a 100644 --- a/src/unknown_0255E0.h +++ b/src/unknown_0255E0.h @@ -124,7 +124,8 @@ typedef struct WaterProperties { enum WaveTypes { WATER_CALM = 11, - WATER_WAVY = 14 + WATER_WAVY = 14, + WATER_UNK_F = 15 }; extern s32 D_800DC870; @@ -182,11 +183,11 @@ void render_scene(Gfx** dList, MatrixS** mtx, Vertex** vtx, TriangleList** tris, void func_80030664(s32 arg0, s16 arg1, s16 arg2, u8 arg3, u8 arg4, u8 arg5); -void func_8002C7D4(void); +void free_track(void); void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 currentViewportIndex); s32 func_80027568(void); s32 func_8002CC30(LevelModelSegment*); -s8 func_8002B0F4(s16, f32 xPos, f32 zPos, struct TempStruct8**); +s8 func_8002B0F4(s16, f32 xPos, f32 zPos, WaterProperties***); // Definitely not triple pointer, but easiest way to fix warns. void func_800278E8(s32); void func_80028050(void); void initialise_player_viewport_vars(s32); diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index e8d4cefd..47164e3a 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -149,7 +149,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unkC += diffX; obj68->unk10 = -1; } - if (obj->segment.unk38.byte.unk3B == 2 && racer->unk1E2 == 0 && racer->velocity < -6.5) { + if (obj->segment.unk38.byte.unk3B == 2 && racer->groundedWheels == 0 && racer->velocity < -6.5) { obj->segment.unk38.byte.unk3B = 3; racer->unkC = 0.0f; } @@ -181,7 +181,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.unk38.byte.unk3B = 1; racer->unkC = 0.0f; } - if (obj->segment.unk38.byte.unk3B == 4 && racer->unk1E2 != 0 && racer->velocity > -6.0) { + if (obj->segment.unk38.byte.unk3B == 4 && racer->groundedWheels && racer->velocity > -6.0) { obj->segment.unk38.byte.unk3B = 3; racer->unkC = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; }