From 041a3927b922621ee86df4172195b5f89b9c6afa Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Thu, 15 Dec 2022 20:19:28 +0000 Subject: [PATCH] Few matches + renames (#340) * implicit errors * good lord that was a lot * Update csplayer.c * Update game.c * give names to the image segments * Update csplayer.c * whole bunch of nonmatching stuff * rename a thing * match func_8001BB68 * match func_8001A7D8 and document checkpoints * match func_8000F648 * match func_800214E4 * Head. * match func_8002342C * nonmatching obj_loop_weaponballoon * match func_8001709C * match func_8003E694 * Update object_functions.c * name a field * match new_memory_pool * we do a little labelling * label function rendermode flags * name interacted objects * Update object_functions.c * quick fixes * Update unknown_05FF10.c * alakazoom * Update src/racer.c Co-authored-by: David Benepe * Update src/objects.c Co-authored-by: David Benepe * Update include/structs.h Co-authored-by: Ryan Myers * oh this is necessary because recursive lol Co-authored-by: David Benepe Co-authored-by: Ryan Myers --- asm/non_matchings/memory/new_memory_pool.s | 52 - asm/non_matchings/objects/func_8000C718.s | 4 +- asm/non_matchings/objects/func_8000F648.s | 80 -- asm/non_matchings/objects/func_8001709C.s | 110 -- asm/non_matchings/objects/func_80017E98.s | 48 +- asm/non_matchings/objects/func_800185E4.s | 16 +- asm/non_matchings/objects/func_8001955C.s | 6 +- asm/non_matchings/objects/func_8001A7D8.s | 69 -- asm/non_matchings/objects/func_8001BB68.s | 60 - asm/non_matchings/objects/func_800214E4.s | 82 -- asm/non_matchings/objects/func_800230D0.s | 12 +- asm/non_matchings/objects/func_8002342C.s | 84 -- asm/non_matchings/objects/spawn_object.s | 4 +- asm/non_matchings/racer/func_80045C48.s | 6 +- asm/non_matchings/racer/func_80059208.s | 12 +- asm/non_matchings/racer/func_8005B818.s | 4 +- .../unknown_0255E0/func_8002581C.s | 2 +- .../unknown_032760/func_8003E694.s | 380 ------ .../unknown_05DCD0/func_8005D0D0.s | 2 +- .../unknown_05F690/func_8005EA90.s | 2 +- include/level_object_entries.h | 15 + include/structs.h | 44 +- lib/src/mips1/al/csplayer.c | 63 +- src/camera.c | 4 +- src/game.c | 4 +- src/game_ui.c | 4 +- src/memory.c | 44 +- src/memory.h | 2 +- src/menu.c | 14 +- src/object_functions.c | 975 +++++++++------ src/object_functions.h | 84 +- src/object_models.c | 10 +- src/object_models.h | 2 +- src/objects.c | 356 ++++-- src/objects.h | 60 +- src/racer.c | 1100 +++++++++++++++-- src/save_data.c | 2 +- src/save_data.h | 2 +- src/textures_sprites.c | 15 +- src/textures_sprites.h | 4 +- src/unknown_008C40.c | 2 +- src/unknown_0255E0.c | 38 +- src/unknown_05CEF0.c | 18 +- src/unknown_05FF10.c | 8 +- src/unknown_078050.c | 8 +- src/unknown_078050.h | 3 + src/weather.c | 2 +- 47 files changed, 2203 insertions(+), 1715 deletions(-) delete mode 100644 asm/non_matchings/memory/new_memory_pool.s delete mode 100644 asm/non_matchings/objects/func_8000F648.s delete mode 100644 asm/non_matchings/objects/func_8001709C.s delete mode 100644 asm/non_matchings/objects/func_8001A7D8.s delete mode 100644 asm/non_matchings/objects/func_8001BB68.s delete mode 100644 asm/non_matchings/objects/func_800214E4.s delete mode 100644 asm/non_matchings/objects/func_8002342C.s delete mode 100644 asm/non_matchings/unknown_032760/func_8003E694.s diff --git a/asm/non_matchings/memory/new_memory_pool.s b/asm/non_matchings/memory/new_memory_pool.s deleted file mode 100644 index e61ff9ab..00000000 --- a/asm/non_matchings/memory/new_memory_pool.s +++ /dev/null @@ -1,52 +0,0 @@ -glabel new_memory_pool -/* 0717E4 80070BE4 3C098012 */ lui $t1, %hi(gNumberOfMemoryPools) # $t1, 0x8012 -/* 0717E8 80070BE8 252935C0 */ addiu $t1, %lo(gNumberOfMemoryPools) # addiu $t1, $t1, 0x35c0 -/* 0717EC 80070BEC 8D2E0000 */ lw $t6, ($t1) -/* 0717F0 80070BF0 3C198012 */ lui $t9, %hi(gMemoryPools) # $t9, 0x8012 -/* 0717F4 80070BF4 25CF0001 */ addiu $t7, $t6, 1 -/* 0717F8 80070BF8 000FC100 */ sll $t8, $t7, 4 -/* 0717FC 80070BFC 27393580 */ addiu $t9, %lo(gMemoryPools) # addiu $t9, $t9, 0x3580 -/* 071800 80070C00 03193821 */ addu $a3, $t8, $t9 -/* 071804 80070C04 AD2F0000 */ sw $t7, ($t1) -/* 071808 80070C08 ACE60000 */ sw $a2, ($a3) -/* 07180C 80070C0C ACE00004 */ sw $zero, 4($a3) -/* 071810 80070C10 ACE40008 */ sw $a0, 8($a3) -/* 071814 80070C14 ACE5000C */ sw $a1, 0xc($a3) -/* 071818 80070C18 00804025 */ move $t0, $a0 -/* 07181C 80070C1C 18C00007 */ blez $a2, .L80070C3C -/* 071820 80070C20 00001825 */ move $v1, $zero -.L80070C24: -/* 071824 80070C24 A503000E */ sh $v1, 0xe($t0) -/* 071828 80070C28 8CEA0000 */ lw $t2, ($a3) -/* 07182C 80070C2C 24630001 */ addiu $v1, $v1, 1 -/* 071830 80070C30 006A082A */ slt $at, $v1, $t2 -/* 071834 80070C34 1420FFFB */ bnez $at, .L80070C24 -/* 071838 80070C38 25080014 */ addiu $t0, $t0, 0x14 -.L80070C3C: -/* 07183C 80070C3C 00061880 */ sll $v1, $a2, 2 -/* 071840 80070C40 00661821 */ addu $v1, $v1, $a2 -/* 071844 80070C44 00031880 */ sll $v1, $v1, 2 -/* 071848 80070C48 00832021 */ addu $a0, $a0, $v1 -/* 07184C 80070C4C 8CE80008 */ lw $t0, 8($a3) -/* 071850 80070C50 308B000F */ andi $t3, $a0, 0xf -/* 071854 80070C54 11600006 */ beqz $t3, .L80070C70 -/* 071858 80070C58 00A37023 */ subu $t6, $a1, $v1 -/* 07185C 80070C5C 2401FFF0 */ li $at, -16 -/* 071860 80070C60 00816024 */ and $t4, $a0, $at -/* 071864 80070C64 258D0010 */ addiu $t5, $t4, 0x10 -/* 071868 80070C68 10000002 */ b .L80070C74 -/* 07186C 80070C6C AD0D0000 */ sw $t5, ($t0) -.L80070C70: -/* 071870 80070C70 AD040000 */ sw $a0, ($t0) -.L80070C74: -/* 071874 80070C74 2404FFFF */ li $a0, -1 -/* 071878 80070C78 AD0E0004 */ sw $t6, 4($t0) -/* 07187C 80070C7C A5000008 */ sh $zero, 8($t0) -/* 071880 80070C80 A504000A */ sh $a0, 0xa($t0) -/* 071884 80070C84 A504000C */ sh $a0, 0xc($t0) -/* 071888 80070C88 8CEF0004 */ lw $t7, 4($a3) -/* 07188C 80070C8C 8CE20008 */ lw $v0, 8($a3) -/* 071890 80070C90 25F80001 */ addiu $t8, $t7, 1 -/* 071894 80070C94 03E00008 */ jr $ra -/* 071898 80070C98 ACF80004 */ sw $t8, 4($a3) - diff --git a/asm/non_matchings/objects/func_8000C718.s b/asm/non_matchings/objects/func_8000C718.s index 96e57580..7efba882 100644 --- a/asm/non_matchings/objects/func_8000C718.s +++ b/asm/non_matchings/objects/func_8000C718.s @@ -8,7 +8,7 @@ glabel func_8000C718 /* 00D330 8000C730 90650000 */ lbu $a1, ($v1) /* 00D334 8000C734 3C0C8012 */ lui $t4, %hi(gAssetsObjectHeadersTable) # $t4, 0x8012 /* 00D338 8000C738 10A0000B */ beqz $a1, .L8000C768 -/* 00D33C 8000C73C 3C048012 */ lui $a0, %hi(D_8011AE68) # $a0, 0x8012 +/* 00D33C 8000C73C 3C048012 */ lui $a0, %hi(gObjectMemoryPool) # $a0, 0x8012 /* 00D340 8000C740 24B80001 */ addiu $t8, $a1, 1 /* 00D344 8000C744 A0780000 */ sb $t8, ($v1) /* 00D348 8000C748 8FA80028 */ lw $t0, 0x28($sp) @@ -26,7 +26,7 @@ glabel func_8000C718 /* 00D374 8000C774 018B1021 */ addu $v0, $t4, $t3 /* 00D378 8000C778 8C460000 */ lw $a2, ($v0) /* 00D37C 8000C77C 8C4D0004 */ lw $t5, 4($v0) -/* 00D380 8000C780 8C84AE68 */ lw $a0, %lo(D_8011AE68)($a0) +/* 00D380 8000C780 8C84AE68 */ lw $a0, %lo(gObjectMemoryPool)($a0) /* 00D384 8000C784 01A62823 */ subu $a1, $t5, $a2 /* 00D388 8000C788 AFA50020 */ sw $a1, 0x20($sp) /* 00D38C 8000C78C AFAB0018 */ sw $t3, 0x18($sp) diff --git a/asm/non_matchings/objects/func_8000F648.s b/asm/non_matchings/objects/func_8000F648.s deleted file mode 100644 index b9ccefa5..00000000 --- a/asm/non_matchings/objects/func_8000F648.s +++ /dev/null @@ -1,80 +0,0 @@ -glabel func_8000F648 -/* 010248 8000F648 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 01024C 8000F64C AFB30020 */ sw $s3, 0x20($sp) -/* 010250 8000F650 AFB2001C */ sw $s2, 0x1c($sp) -/* 010254 8000F654 00A09025 */ move $s2, $a1 -/* 010258 8000F658 00809825 */ move $s3, $a0 -/* 01025C 8000F65C AFBF0024 */ sw $ra, 0x24($sp) -/* 010260 8000F660 AFB10018 */ sw $s1, 0x18($sp) -/* 010264 8000F664 14C00012 */ bnez $a2, .L8000F6B0 -/* 010268 8000F668 AFB00014 */ sw $s0, 0x14($sp) -/* 01026C 8000F66C 18A00033 */ blez $a1, .L8000F73C -/* 010270 8000F670 00008825 */ move $s1, $zero -/* 010274 8000F674 00008025 */ move $s0, $zero -.L8000F678: -/* 010278 8000F678 8E6E0068 */ lw $t6, 0x68($s3) -/* 01027C 8000F67C 00000000 */ nop -/* 010280 8000F680 01D07821 */ addu $t7, $t6, $s0 -/* 010284 8000F684 8DE20000 */ lw $v0, ($t7) -/* 010288 8000F688 00000000 */ nop -/* 01028C 8000F68C 10400003 */ beqz $v0, .L8000F69C -/* 010290 8000F690 00000000 */ nop -/* 010294 8000F694 0C017FD0 */ jal func_8005FF40 -/* 010298 8000F698 00402025 */ move $a0, $v0 -.L8000F69C: -/* 01029C 8000F69C 26310001 */ addiu $s1, $s1, 1 -/* 0102A0 8000F6A0 1632FFF5 */ bne $s1, $s2, .L8000F678 -/* 0102A4 8000F6A4 26100004 */ addiu $s0, $s0, 4 -/* 0102A8 8000F6A8 10000025 */ b .L8000F740 -/* 0102AC 8000F6AC 8FBF0024 */ lw $ra, 0x24($sp) -.L8000F6B0: -/* 0102B0 8000F6B0 24010004 */ li $at, 4 -/* 0102B4 8000F6B4 14C10012 */ bne $a2, $at, .L8000F700 -/* 0102B8 8000F6B8 00000000 */ nop -/* 0102BC 8000F6BC 1A40001F */ blez $s2, .L8000F73C -/* 0102C0 8000F6C0 00008825 */ move $s1, $zero -/* 0102C4 8000F6C4 00008025 */ move $s0, $zero -.L8000F6C8: -/* 0102C8 8000F6C8 8E780068 */ lw $t8, 0x68($s3) -/* 0102CC 8000F6CC 00000000 */ nop -/* 0102D0 8000F6D0 0310C821 */ addu $t9, $t8, $s0 -/* 0102D4 8000F6D4 8F220000 */ lw $v0, ($t9) -/* 0102D8 8000F6D8 00000000 */ nop -/* 0102DC 8000F6DC 10400003 */ beqz $v0, .L8000F6EC -/* 0102E0 8000F6E0 00000000 */ nop -/* 0102E4 8000F6E4 0C01ECAF */ jal free_texture -/* 0102E8 8000F6E8 00402025 */ move $a0, $v0 -.L8000F6EC: -/* 0102EC 8000F6EC 26310001 */ addiu $s1, $s1, 1 -/* 0102F0 8000F6F0 1632FFF5 */ bne $s1, $s2, .L8000F6C8 -/* 0102F4 8000F6F4 26100004 */ addiu $s0, $s0, 4 -/* 0102F8 8000F6F8 10000011 */ b .L8000F740 -/* 0102FC 8000F6FC 8FBF0024 */ lw $ra, 0x24($sp) -.L8000F700: -/* 010300 8000F700 1A40000E */ blez $s2, .L8000F73C -/* 010304 8000F704 00008825 */ move $s1, $zero -/* 010308 8000F708 00008025 */ move $s0, $zero -.L8000F70C: -/* 01030C 8000F70C 8E680068 */ lw $t0, 0x68($s3) -/* 010310 8000F710 00000000 */ nop -/* 010314 8000F714 01104821 */ addu $t1, $t0, $s0 -/* 010318 8000F718 8D220000 */ lw $v0, ($t1) -/* 01031C 8000F71C 00000000 */ nop -/* 010320 8000F720 10400003 */ beqz $v0, .L8000F730 -/* 010324 8000F724 00000000 */ nop -/* 010328 8000F728 0C01F32C */ jal free_sprite -/* 01032C 8000F72C 00402025 */ move $a0, $v0 -.L8000F730: -/* 010330 8000F730 26310001 */ addiu $s1, $s1, 1 -/* 010334 8000F734 1632FFF5 */ bne $s1, $s2, .L8000F70C -/* 010338 8000F738 26100004 */ addiu $s0, $s0, 4 -.L8000F73C: -/* 01033C 8000F73C 8FBF0024 */ lw $ra, 0x24($sp) -.L8000F740: -/* 010340 8000F740 8FB00014 */ lw $s0, 0x14($sp) -/* 010344 8000F744 8FB10018 */ lw $s1, 0x18($sp) -/* 010348 8000F748 8FB2001C */ lw $s2, 0x1c($sp) -/* 01034C 8000F74C 8FB30020 */ lw $s3, 0x20($sp) -/* 010350 8000F750 03E00008 */ jr $ra -/* 010354 8000F754 27BD0028 */ addiu $sp, $sp, 0x28 - diff --git a/asm/non_matchings/objects/func_8001709C.s b/asm/non_matchings/objects/func_8001709C.s deleted file mode 100644 index 8eb1677b..00000000 --- a/asm/non_matchings/objects/func_8001709C.s +++ /dev/null @@ -1,110 +0,0 @@ -glabel func_8001709C -/* 017C9C 8001709C 27BDFF70 */ addiu $sp, $sp, -0x90 -/* 017CA0 800170A0 AFBF001C */ sw $ra, 0x1c($sp) -/* 017CA4 800170A4 AFB00018 */ sw $s0, 0x18($sp) -/* 017CA8 800170A8 8C90005C */ lw $s0, 0x5c($a0) -/* 017CAC 800170AC 00803825 */ move $a3, $a0 -/* 017CB0 800170B0 920E0104 */ lbu $t6, 0x104($s0) -/* 017CB4 800170B4 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 017CB8 800170B8 25CF0001 */ addiu $t7, $t6, 1 -/* 017CBC 800170BC 31F80001 */ andi $t8, $t7, 1 -/* 017CC0 800170C0 A2180104 */ sb $t8, 0x104($s0) -/* 017CC4 800170C4 84EA0000 */ lh $t2, ($a3) -/* 017CC8 800170C8 44812000 */ mtc1 $at, $f4 -/* 017CCC 800170CC 000A5823 */ negu $t3, $t2 -/* 017CD0 800170D0 A7AB0078 */ sh $t3, 0x78($sp) -/* 017CD4 800170D4 84EC0002 */ lh $t4, 2($a3) -/* 017CD8 800170D8 330800FF */ andi $t0, $t8, 0xff -/* 017CDC 800170DC 000C6823 */ negu $t5, $t4 -/* 017CE0 800170E0 A7AD007A */ sh $t5, 0x7a($sp) -/* 017CE4 800170E4 84EE0004 */ lh $t6, 4($a3) -/* 017CE8 800170E8 E7A40080 */ swc1 $f4, 0x80($sp) -/* 017CEC 800170EC 000E7823 */ negu $t7, $t6 -/* 017CF0 800170F0 A7AF007C */ sh $t7, 0x7c($sp) -/* 017CF4 800170F4 C4E6000C */ lwc1 $f6, 0xc($a3) -/* 017CF8 800170F8 00084980 */ sll $t1, $t0, 6 -/* 017CFC 800170FC 46003207 */ neg.s $f8, $f6 -/* 017D00 80017100 E7A80084 */ swc1 $f8, 0x84($sp) -/* 017D04 80017104 C4EA0010 */ lwc1 $f10, 0x10($a3) -/* 017D08 80017108 02092021 */ addu $a0, $s0, $t1 -/* 017D0C 8001710C 46005407 */ neg.s $f16, $f10 -/* 017D10 80017110 E7B00088 */ swc1 $f16, 0x88($sp) -/* 017D14 80017114 C4F20014 */ lwc1 $f18, 0x14($a3) -/* 017D18 80017118 AFA70090 */ sw $a3, 0x90($sp) -/* 017D1C 8001711C 46009107 */ neg.s $f4, $f18 -/* 017D20 80017120 E7A4008C */ swc1 $f4, 0x8c($sp) -/* 017D24 80017124 AFA4006C */ sw $a0, 0x6c($sp) -/* 017D28 80017128 0C01BF9D */ jal object_transform_to_matrix_2 -/* 017D2C 8001712C 27A50078 */ addiu $a1, $sp, 0x78 -/* 017D30 80017130 8FA70090 */ lw $a3, 0x90($sp) -/* 017D34 80017134 3C013FF0 */ li $at, 0x3FF00000 # 1.875000 -/* 017D38 80017138 C4E60008 */ lwc1 $f6, 8($a3) -/* 017D3C 8001713C 44816800 */ mtc1 $at, $f13 -/* 017D40 80017140 44806000 */ mtc1 $zero, $f12 -/* 017D44 80017144 46003221 */ cvt.d.s $f8, $f6 -/* 017D48 80017148 00000000 */ nop -/* 017D4C 8001714C 46286283 */ div.d $f10, $f12, $f8 -/* 017D50 80017150 8FA4006C */ lw $a0, 0x6c($sp) -/* 017D54 80017154 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 017D58 80017158 44800000 */ mtc1 $zero, $f0 -/* 017D5C 8001715C 44818000 */ mtc1 $at, $f16 -/* 017D60 80017160 27A2002C */ addiu $v0, $sp, 0x2c -/* 017D64 80017164 27A3006C */ addiu $v1, $sp, 0x6c -/* 017D68 80017168 27A5002C */ addiu $a1, $sp, 0x2c -/* 017D6C 8001716C 00803025 */ move $a2, $a0 -/* 017D70 80017170 462050A0 */ cvt.s.d $f2, $f10 -.L80017174: -/* 017D74 80017174 24420010 */ addiu $v0, $v0, 0x10 -/* 017D78 80017178 E440FFF0 */ swc1 $f0, -0x10($v0) -/* 017D7C 8001717C E440FFF4 */ swc1 $f0, -0xc($v0) -/* 017D80 80017180 E440FFF8 */ swc1 $f0, -8($v0) -/* 017D84 80017184 1443FFFB */ bne $v0, $v1, .L80017174 -/* 017D88 80017188 E440FFFC */ swc1 $f0, -4($v0) -/* 017D8C 8001718C E7A2002C */ swc1 $f2, 0x2c($sp) -/* 017D90 80017190 E7A20040 */ swc1 $f2, 0x40($sp) -/* 017D94 80017194 E7A20054 */ swc1 $f2, 0x54($sp) -/* 017D98 80017198 E7B00068 */ swc1 $f16, 0x68($sp) -/* 017D9C 8001719C AFA70090 */ sw $a3, 0x90($sp) -/* 017DA0 800171A0 0C01BDDA */ jal f32_matrix_mult -/* 017DA4 800171A4 E7A20070 */ swc1 $f2, 0x70($sp) -/* 017DA8 800171A8 C7A20070 */ lwc1 $f2, 0x70($sp) -/* 017DAC 800171AC 3C013FF0 */ li $at, 0x3FF00000 # 1.875000 -/* 017DB0 800171B0 44816800 */ mtc1 $at, $f13 -/* 017DB4 800171B4 44806000 */ mtc1 $zero, $f12 -/* 017DB8 800171B8 460014A1 */ cvt.d.s $f18, $f2 -/* 017DBC 800171BC 00000000 */ nop -/* 017DC0 800171C0 46326103 */ div.d $f4, $f12, $f18 -/* 017DC4 800171C4 8FA70090 */ lw $a3, 0x90($sp) -/* 017DC8 800171C8 27A50078 */ addiu $a1, $sp, 0x78 -/* 017DCC 800171CC 84F80000 */ lh $t8, ($a3) -/* 017DD0 800171D0 00000000 */ nop -/* 017DD4 800171D4 A7B80078 */ sh $t8, 0x78($sp) -/* 017DD8 800171D8 84F90002 */ lh $t9, 2($a3) -/* 017DDC 800171DC 00000000 */ nop -/* 017DE0 800171E0 A7B9007A */ sh $t9, 0x7a($sp) -/* 017DE4 800171E4 84E80004 */ lh $t0, 4($a3) -/* 017DE8 800171E8 00000000 */ nop -/* 017DEC 800171EC A7A8007C */ sh $t0, 0x7c($sp) -/* 017DF0 800171F0 462021A0 */ cvt.s.d $f6, $f4 -/* 017DF4 800171F4 E7A60080 */ swc1 $f6, 0x80($sp) -/* 017DF8 800171F8 C4E8000C */ lwc1 $f8, 0xc($a3) -/* 017DFC 800171FC 00000000 */ nop -/* 017E00 80017200 E7A80084 */ swc1 $f8, 0x84($sp) -/* 017E04 80017204 C4EA0010 */ lwc1 $f10, 0x10($a3) -/* 017E08 80017208 00000000 */ nop -/* 017E0C 8001720C E7AA0088 */ swc1 $f10, 0x88($sp) -/* 017E10 80017210 C4F00014 */ lwc1 $f16, 0x14($a3) -/* 017E14 80017214 00000000 */ nop -/* 017E18 80017218 E7B0008C */ swc1 $f16, 0x8c($sp) -/* 017E1C 8001721C 92090104 */ lbu $t1, 0x104($s0) -/* 017E20 80017220 00000000 */ nop -/* 017E24 80017224 252B0002 */ addiu $t3, $t1, 2 -/* 017E28 80017228 000B6180 */ sll $t4, $t3, 6 -/* 017E2C 8001722C 0C01BF0C */ jal object_transform_to_matrix -/* 017E30 80017230 020C2021 */ addu $a0, $s0, $t4 -/* 017E34 80017234 AE000100 */ sw $zero, 0x100($s0) -/* 017E38 80017238 8FBF001C */ lw $ra, 0x1c($sp) -/* 017E3C 8001723C 8FB00018 */ lw $s0, 0x18($sp) -/* 017E40 80017240 03E00008 */ jr $ra -/* 017E44 80017244 27BD0090 */ addiu $sp, $sp, 0x90 - diff --git a/asm/non_matchings/objects/func_80017E98.s b/asm/non_matchings/objects/func_80017E98.s index 2e849b5d..8e0e26ae 100644 --- a/asm/non_matchings/objects/func_80017E98.s +++ b/asm/non_matchings/objects/func_80017E98.s @@ -3,7 +3,7 @@ glabel func_80017E98 /* 018A9C 80017E9C 3C038012 */ lui $v1, %hi(objCount) # $v1, 0x8012 /* 018AA0 80017EA0 8C63AE5C */ lw $v1, %lo(objCount)($v1) /* 018AA4 80017EA4 AFB30044 */ sw $s3, 0x44($sp) -/* 018AA8 80017EA8 3C018012 */ lui $at, %hi(D_8011AED0) # $at, 0x8012 +/* 018AA8 80017EA8 3C018012 */ lui $at, %hi(gNumberOfCheckpoints) # $at, 0x8012 /* 018AAC 80017EAC AFBF005C */ sw $ra, 0x5c($sp) /* 018AB0 80017EB0 AFBE0058 */ sw $fp, 0x58($sp) /* 018AB4 80017EB4 AFB70054 */ sw $s7, 0x54($sp) @@ -18,15 +18,15 @@ glabel func_80017E98 /* 018AD8 80017ED8 E7B50028 */ swc1 $f21, 0x28($sp) /* 018ADC 80017EDC E7B4002C */ swc1 $f20, 0x2c($sp) /* 018AE0 80017EE0 00005025 */ move $t2, $zero -/* 018AE4 80017EE4 AC20AED0 */ sw $zero, %lo(D_8011AED0)($at) +/* 018AE4 80017EE4 AC20AED0 */ sw $zero, %lo(gNumberOfCheckpoints)($at) /* 018AE8 80017EE8 18600047 */ blez $v1, .L80018008 /* 018AEC 80017EEC 00009825 */ move $s3, $zero -/* 018AF0 80017EF0 3C148012 */ lui $s4, %hi(D_8011AECC) # $s4, 0x8012 +/* 018AF0 80017EF0 3C148012 */ lui $s4, %hi(gTrackCheckpoints) # $s4, 0x8012 /* 018AF4 80017EF4 3C098012 */ lui $t1, %hi(D_8011AED8) # $t1, 0x8012 /* 018AF8 80017EF8 3C068012 */ lui $a2, %hi(gObjPtrList) # $a2, 0x8012 /* 018AFC 80017EFC 24C6AE58 */ addiu $a2, %lo(gObjPtrList) # addiu $a2, $a2, -0x51a8 /* 018B00 80017F00 2529AED8 */ addiu $t1, %lo(D_8011AED8) # addiu $t1, $t1, -0x5128 -/* 018B04 80017F04 2694AECC */ addiu $s4, %lo(D_8011AECC) # addiu $s4, $s4, -0x5134 +/* 018B04 80017F04 2694AECC */ addiu $s4, %lo(gTrackCheckpoints) # addiu $s4, $s4, -0x5134 /* 018B08 80017F08 00001025 */ move $v0, $zero /* 018B0C 80017F0C 2408000D */ li $t0, 13 /* 018B10 80017F10 2405003C */ li $a1, 60 @@ -42,10 +42,10 @@ glabel func_80017E98 /* 018B34 80017F34 17200032 */ bnez $t9, .L80018000 /* 018B38 80017F38 0263082A */ slt $at, $s3, $v1 /* 018B3C 80017F3C 860B0048 */ lh $t3, 0x48($s0) -/* 018B40 80017F40 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 +/* 018B40 80017F40 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 /* 018B44 80017F44 150B002E */ bne $t0, $t3, .L80018000 /* 018B48 80017F48 0263082A */ slt $at, $s3, $v1 -/* 018B4C 80017F4C 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) +/* 018B4C 80017F4C 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) /* 018B50 80017F50 00000000 */ nop /* 018B54 80017F54 28E1003C */ slti $at, $a3, 0x3c /* 018B58 80017F58 10200029 */ beqz $at, .L80018000 @@ -58,8 +58,8 @@ glabel func_80017E98 /* 018B74 80017F74 0263082A */ slt $at, $s3, $v1 /* 018B78 80017F78 00E50019 */ multu $a3, $a1 /* 018B7C 80017F7C 8E8E0000 */ lw $t6, ($s4) -/* 018B80 80017F80 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 -/* 018B84 80017F84 24E7AED0 */ addiu $a3, %lo(D_8011AED0) # addiu $a3, $a3, -0x5130 +/* 018B80 80017F80 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 +/* 018B84 80017F84 24E7AED0 */ addiu $a3, %lo(gNumberOfCheckpoints) # addiu $a3, $a3, -0x5130 /* 018B88 80017F88 00007812 */ mflo $t7 /* 018B8C 80017F8C 01CFC021 */ addu $t8, $t6, $t7 /* 018B90 80017F90 AF100028 */ sw $s0, 0x28($t8) @@ -95,11 +95,11 @@ glabel func_80017E98 /* 018C00 80018000 1420FFC4 */ bnez $at, .L80017F14 /* 018C04 80018004 24420004 */ addiu $v0, $v0, 4 .L80018008: -/* 018C08 80018008 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 -/* 018C0C 8001800C 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) -/* 018C10 80018010 3C148012 */ lui $s4, %hi(D_8011AECC) # $s4, 0x8012 +/* 018C08 80018008 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 +/* 018C0C 8001800C 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) +/* 018C10 80018010 3C148012 */ lui $s4, %hi(gTrackCheckpoints) # $s4, 0x8012 /* 018C14 80018014 8FB20104 */ lw $s2, 0x104($sp) -/* 018C18 80018018 2694AECC */ addiu $s4, %lo(D_8011AECC) # addiu $s4, $s4, -0x5134 +/* 018C18 80018018 2694AECC */ addiu $s4, %lo(gTrackCheckpoints) # addiu $s4, $s4, -0x5134 /* 018C1C 8001801C 00004825 */ move $t1, $zero /* 018C20 80018020 24E6FFFF */ addiu $a2, $a3, -1 /* 018C24 80018024 24080001 */ li $t0, 1 @@ -126,7 +126,7 @@ glabel func_80017E98 /* 018C6C 8001806C 8C500028 */ lw $s0, 0x28($v0) /* 018C70 80018070 03111021 */ addu $v0, $t8, $s1 /* 018C74 80018074 8C4C0064 */ lw $t4, 0x64($v0) -/* 018C78 80018078 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 +/* 018C78 80018078 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 /* 018C7C 8001807C AC4C0028 */ sw $t4, 0x28($v0) /* 018C80 80018080 8E8F0000 */ lw $t7, ($s4) /* 018C84 80018084 00004025 */ move $t0, $zero @@ -136,7 +136,7 @@ glabel func_80017E98 /* 018C94 80018094 00000000 */ nop /* 018C98 80018098 01B17021 */ addu $t6, $t5, $s1 /* 018C9C 8001809C ADD00064 */ sw $s0, 0x64($t6) -/* 018CA0 800180A0 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) +/* 018CA0 800180A0 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) /* 018CA4 800180A4 00000000 */ nop /* 018CA8 800180A8 24E6FFFF */ addiu $a2, $a3, -1 /* 018CAC 800180AC 0266082A */ slt $at, $s3, $a2 @@ -150,21 +150,21 @@ glabel func_80017E98 /* 018CC4 800180C4 2508AED4 */ addiu $t0, %lo(D_8011AED4) # addiu $t0, $t0, -0x512c /* 018CC8 800180C8 AD070000 */ sw $a3, ($t0) /* 018CCC 800180CC 00EAC823 */ subu $t9, $a3, $t2 -/* 018CD0 800180D0 3C018012 */ lui $at, %hi(D_8011AED0) # $at, 0x8012 +/* 018CD0 800180D0 3C018012 */ lui $at, %hi(gNumberOfCheckpoints) # $at, 0x8012 /* 018CD4 800180D4 1120000A */ beqz $t1, .L80018100 -/* 018CD8 800180D8 AC39AED0 */ sw $t9, %lo(D_8011AED0)($at) +/* 018CD8 800180D8 AC39AED0 */ sw $t9, %lo(gNumberOfCheckpoints)($at) /* 018CDC 800180DC 24040014 */ li $a0, 20 /* 018CE0 800180E0 0C02D8D7 */ jal set_render_printf_position /* 018CE4 800180E4 240500DC */ li $a1, 220 -/* 018CE8 800180E8 3C04800E */ lui $a0, %hi(D_800E50D4) # $a0, 0x800e -/* 018CEC 800180EC 248450D4 */ addiu $a0, %lo(D_800E50D4) # addiu $a0, $a0, 0x50d4 +/* 018CE8 800180E8 3C04800E */ lui $a0, %hi(sDuplicateCheckpointString) # $a0, 0x800e +/* 018CEC 800180EC 248450D4 */ addiu $a0, %lo(sDuplicateCheckpointString) # addiu $a0, $a0, 0x50d4 /* 018CF0 800180F0 0C02D7B7 */ jal render_printf /* 018CF4 800180F4 02402825 */ move $a1, $s2 /* 018CF8 800180F8 3C088012 */ lui $t0, %hi(D_8011AED4) # $t0, 0x8012 /* 018CFC 800180FC 2508AED4 */ addiu $t0, %lo(D_8011AED4) # addiu $t0, $t0, -0x512c .L80018100: -/* 018D00 80018100 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 -/* 018D04 80018104 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) +/* 018D00 80018100 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 +/* 018D04 80018104 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) /* 018D08 80018108 8D020000 */ lw $v0, ($t0) /* 018D0C 8001810C 00E09825 */ move $s3, $a3 /* 018D10 80018110 00E2082A */ slt $at, $a3, $v0 @@ -193,10 +193,10 @@ glabel func_80017E98 /* 018D64 80018164 00000000 */ nop /* 018D68 80018168 A073003A */ sb $s3, 0x3a($v1) /* 018D6C 8001816C 8E8D0000 */ lw $t5, ($s4) -/* 018D70 80018170 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 +/* 018D70 80018170 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 /* 018D74 80018174 01B17021 */ addu $t6, $t5, $s1 /* 018D78 80018178 A1C4003A */ sb $a0, 0x3a($t6) -/* 018D7C 8001817C 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) +/* 018D7C 8001817C 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) /* 018D80 80018180 24060001 */ li $a2, 1 .L80018184: /* 018D84 80018184 24840001 */ addiu $a0, $a0, 1 @@ -252,7 +252,7 @@ glabel func_80017E98 /* 018E40 80018240 3C014000 */ li $at, 0x40000000 # 2.000000 /* 018E44 80018244 E6440000 */ swc1 $f4, ($s2) /* 018E48 80018248 C7A600E4 */ lwc1 $f6, 0xe4($sp) -/* 018E4C 8001824C 3C078012 */ lui $a3, %hi(D_8011AED0) # $a3, 0x8012 +/* 018E4C 8001824C 3C078012 */ lui $a3, %hi(gNumberOfCheckpoints) # $a3, 0x8012 /* 018E50 80018250 E6460004 */ swc1 $f6, 4($s2) /* 018E54 80018254 C7A800E0 */ lwc1 $f8, 0xe0($sp) /* 018E58 80018258 266C0001 */ addiu $t4, $s3, 1 @@ -298,7 +298,7 @@ glabel func_80017E98 /* 018EF8 800182F8 44183000 */ mfc1 $t8, $f6 /* 018EFC 800182FC 44D9F800 */ ctc1 $t9, $31 /* 018F00 80018300 A658002C */ sh $t8, 0x2c($s2) -/* 018F04 80018304 8CE7AED0 */ lw $a3, %lo(D_8011AED0)($a3) +/* 018F04 80018304 8CE7AED0 */ lw $a3, %lo(gNumberOfCheckpoints)($a3) /* 018F08 80018308 00000000 */ nop /* 018F0C 8001830C 0267082A */ slt $at, $s3, $a3 /* 018F10 80018310 1020003A */ beqz $at, .L800183FC diff --git a/asm/non_matchings/objects/func_800185E4.s b/asm/non_matchings/objects/func_800185E4.s index 2e81bbd2..865b5f0a 100644 --- a/asm/non_matchings/objects/func_800185E4.s +++ b/asm/non_matchings/objects/func_800185E4.s @@ -7,8 +7,8 @@ glabel D_800E5628 .text glabel func_800185E4 /* 0191E4 800185E4 27BDFF88 */ addiu $sp, $sp, -0x78 -/* 0191E8 800185E8 3C028012 */ lui $v0, %hi(D_8011AED0) # $v0, 0x8012 -/* 0191EC 800185EC 8C42AED0 */ lw $v0, %lo(D_8011AED0)($v0) +/* 0191E8 800185E8 3C028012 */ lui $v0, %hi(gNumberOfCheckpoints) # $v0, 0x8012 +/* 0191EC 800185EC 8C42AED0 */ lw $v0, %lo(gNumberOfCheckpoints)($v0) /* 0191F0 800185F0 AFA70084 */ sw $a3, 0x84($sp) /* 0191F4 800185F4 00A03825 */ move $a3, $a1 /* 0191F8 800185F8 AFBF001C */ sw $ra, 0x1c($sp) @@ -24,8 +24,8 @@ glabel func_800185E4 /* 01921C 8001861C 8FAF0078 */ lw $t7, 0x78($sp) /* 019220 80018620 2408003C */ li $t0, 60 /* 019224 80018624 01E80019 */ multu $t7, $t0 -/* 019228 80018628 3C068012 */ lui $a2, %hi(D_8011AECC) # $a2, 0x8012 -/* 01922C 8001862C 8CC6AECC */ lw $a2, %lo(D_8011AECC)($a2) +/* 019228 80018628 3C068012 */ lui $a2, %hi(gTrackCheckpoints) # $a2, 0x8012 +/* 01922C 8001862C 8CC6AECC */ lw $a2, %lo(gTrackCheckpoints)($a2) /* 019230 80018630 8FB90090 */ lw $t9, 0x90($sp) /* 019234 80018634 00005825 */ move $t3, $zero /* 019238 80018638 00004812 */ mflo $t1 @@ -298,10 +298,10 @@ glabel func_800185E4 /* 019634 80018A34 46085182 */ mul.s $f6, $f10, $f8 /* 019638 80018A38 C7AA0084 */ lwc1 $f10, 0x84($sp) /* 01963C 80018A3C 00A02025 */ move $a0, $a1 -/* 019640 80018A40 3C0D8012 */ lui $t5, %hi(D_8011AED0) # $t5, 0x8012 +/* 019640 80018A40 3C0D8012 */ lui $t5, %hi(gNumberOfCheckpoints) # $t5, 0x8012 /* 019644 80018A44 460A2202 */ mul.s $f8, $f4, $f10 /* 019648 80018A48 C4AA0008 */ lwc1 $f10, 8($a1) -/* 01964C 80018A4C 3C0E8012 */ lui $t6, %hi(D_8011AECC) # $t6, 0x8012 +/* 01964C 80018A4C 3C0E8012 */ lui $t6, %hi(gTrackCheckpoints) # $t6, 0x8012 /* 019650 80018A50 46083100 */ add.s $f4, $f6, $f8 /* 019654 80018A54 C7A60088 */ lwc1 $f6, 0x88($sp) /* 019658 80018A58 00000000 */ nop @@ -324,13 +324,13 @@ glabel func_800185E4 /* 01969C 80018A9C A04301F8 */ sb $v1, 0x1f8($v0) /* 0196A0 80018AA0 A04C01F9 */ sb $t4, 0x1f9($v0) .L80018AA4: -/* 0196A4 80018AA4 8DADAED0 */ lw $t5, %lo(D_8011AED0)($t5) +/* 0196A4 80018AA4 8DADAED0 */ lw $t5, %lo(gNumberOfCheckpoints)($t5) /* 0196A8 80018AA8 25080001 */ addiu $t0, $t0, 1 /* 0196AC 80018AAC 150D0002 */ bne $t0, $t5, .L80018AB8 /* 0196B0 80018AB0 2529003C */ addiu $t1, $t1, 0x3c /* 0196B4 80018AB4 00004825 */ move $t1, $zero .L80018AB8: -/* 0196B8 80018AB8 8DCEAECC */ lw $t6, %lo(D_8011AECC)($t6) +/* 0196B8 80018AB8 8DCEAECC */ lw $t6, %lo(gTrackCheckpoints)($t6) /* 0196BC 80018ABC C4E0000C */ lwc1 $f0, 0xc($a3) /* 0196C0 80018AC0 012E2821 */ addu $a1, $t1, $t6 /* 0196C4 80018AC4 C4AE0000 */ lwc1 $f14, ($a1) diff --git a/asm/non_matchings/objects/func_8001955C.s b/asm/non_matchings/objects/func_8001955C.s index 57c02ad7..437a4b13 100644 --- a/asm/non_matchings/objects/func_8001955C.s +++ b/asm/non_matchings/objects/func_8001955C.s @@ -6,8 +6,8 @@ glabel D_800E5630 glabel func_8001955C /* 01A15C 8001955C 27BDFF40 */ addiu $sp, $sp, -0xc0 /* 01A160 80019560 AFB60040 */ sw $s6, 0x40($sp) -/* 01A164 80019564 3C168012 */ lui $s6, %hi(D_8011AED0) # $s6, 0x8012 -/* 01A168 80019568 8ED6AED0 */ lw $s6, %lo(D_8011AED0)($s6) +/* 01A164 80019564 3C168012 */ lui $s6, %hi(gNumberOfCheckpoints) # $s6, 0x8012 +/* 01A168 80019568 8ED6AED0 */ lw $s6, %lo(gNumberOfCheckpoints)($s6) /* 01A16C 8001956C AFA600C8 */ sw $a2, 0xc8($sp) /* 01A170 80019570 30CE00FF */ andi $t6, $a2, 0xff /* 01A174 80019574 01C03025 */ move $a2, $t6 @@ -44,7 +44,7 @@ glabel func_8001955C /* 01A1E8 800195E8 27B50094 */ addiu $s5, $sp, 0x94 .L800195EC: /* 01A1EC 800195EC 02202025 */ move $a0, $s1 -/* 01A1F0 800195F0 0C006E87 */ jal func_8001BA1C +/* 01A1F0 800195F0 0C006E87 */ jal find_next_checkpoint_node /* 01A1F4 800195F4 02802825 */ move $a1, $s4 /* 01A1F8 800195F8 C448001C */ lwc1 $f8, 0x1c($v0) /* 01A1FC 800195FC C44A0008 */ lwc1 $f10, 8($v0) diff --git a/asm/non_matchings/objects/func_8001A7D8.s b/asm/non_matchings/objects/func_8001A7D8.s deleted file mode 100644 index 6505e73f..00000000 --- a/asm/non_matchings/objects/func_8001A7D8.s +++ /dev/null @@ -1,69 +0,0 @@ -glabel func_8001A7D8 -/* 01B3D8 8001A7D8 3C0E8012 */ lui $t6, %hi(gRacersByPosition) # $t6, 0x8012 -/* 01B3DC 8001A7DC 8DCEAEE8 */ lw $t6, %lo(gRacersByPosition)($t6) -/* 01B3E0 8001A7E0 2401FFFF */ li $at, -1 -/* 01B3E4 8001A7E4 8DCF0000 */ lw $t7, ($t6) -/* 01B3E8 8001A7E8 3C038012 */ lui $v1, %hi(D_8011ADC4) # $v1, 0x8012 -/* 01B3EC 8001A7EC 8DE20064 */ lw $v0, 0x64($t7) -/* 01B3F0 8001A7F0 2463ADC4 */ addiu $v1, %lo(D_8011ADC4) # addiu $v1, $v1, -0x523c -/* 01B3F4 8001A7F4 84580000 */ lh $t8, ($v0) -/* 01B3F8 8001A7F8 00000000 */ nop -/* 01B3FC 8001A7FC 17010003 */ bne $t8, $at, .L8001A80C -/* 01B400 8001A800 00000000 */ nop -/* 01B404 8001A804 03E00008 */ jr $ra -/* 01B408 8001A808 00001025 */ move $v0, $zero - -.L8001A80C: -/* 01B40C 8001A80C A0600000 */ sb $zero, ($v1) -/* 01B410 8001A810 90880049 */ lbu $t0, 0x49($a0) -/* 01B414 8001A814 8C990004 */ lw $t9, 4($a0) -/* 01B418 8001A818 00084880 */ sll $t1, $t0, 2 -/* 01B41C 8001A81C 03295021 */ addu $t2, $t9, $t1 -/* 01B420 8001A820 8D4B0000 */ lw $t3, ($t2) -/* 01B424 8001A824 3C0D8012 */ lui $t5, %hi(D_8011AEF5) # $t5, 0x8012 -/* 01B428 8001A828 316C0002 */ andi $t4, $t3, 2 -/* 01B42C 8001A82C 1580000F */ bnez $t4, .L8001A86C -/* 01B430 8001A830 3C0A8012 */ lui $t2, %hi(gIsSilverCoinRace) # $t2, 0x8012 -/* 01B434 8001A834 91ADAEF5 */ lbu $t5, %lo(D_8011AEF5)($t5) -/* 01B438 8001A838 240E0001 */ li $t6, 1 -/* 01B43C 8001A83C 15A00021 */ bnez $t5, .L8001A8C4 -/* 01B440 8001A840 00000000 */ nop -/* 01B444 8001A844 A06E0000 */ sb $t6, ($v1) -/* 01B448 8001A848 90980049 */ lbu $t8, 0x49($a0) -/* 01B44C 8001A84C 8C8F0004 */ lw $t7, 4($a0) -/* 01B450 8001A850 00184080 */ sll $t0, $t8, 2 -/* 01B454 8001A854 01E81021 */ addu $v0, $t7, $t0 -/* 01B458 8001A858 8C590000 */ lw $t9, ($v0) -/* 01B45C 8001A85C 00000000 */ nop -/* 01B460 8001A860 37290002 */ ori $t1, $t9, 2 -/* 01B464 8001A864 10000017 */ b .L8001A8C4 -/* 01B468 8001A868 AC490000 */ sw $t1, ($v0) -.L8001A86C: -/* 01B46C 8001A86C 814AAE03 */ lb $t2, %lo(gIsSilverCoinRace)($t2) -/* 01B470 8001A870 00000000 */ nop -/* 01B474 8001A874 11400013 */ beqz $t2, .L8001A8C4 -/* 01B478 8001A878 00000000 */ nop -/* 01B47C 8001A87C 804B0202 */ lb $t3, 0x202($v0) -/* 01B480 8001A880 3C0C8012 */ lui $t4, %hi(D_8011AEF5) # $t4, 0x8012 -/* 01B484 8001A884 29610008 */ slti $at, $t3, 8 -/* 01B488 8001A888 1420000E */ bnez $at, .L8001A8C4 -/* 01B48C 8001A88C 00000000 */ nop -/* 01B490 8001A890 918CAEF5 */ lbu $t4, %lo(D_8011AEF5)($t4) -/* 01B494 8001A894 240D0001 */ li $t5, 1 -/* 01B498 8001A898 1580000A */ bnez $t4, .L8001A8C4 -/* 01B49C 8001A89C 00000000 */ nop -/* 01B4A0 8001A8A0 A06D0000 */ sb $t5, ($v1) -/* 01B4A4 8001A8A4 90980049 */ lbu $t8, 0x49($a0) -/* 01B4A8 8001A8A8 8C8E0004 */ lw $t6, 4($a0) -/* 01B4AC 8001A8AC 00187880 */ sll $t7, $t8, 2 -/* 01B4B0 8001A8B0 01CF1021 */ addu $v0, $t6, $t7 -/* 01B4B4 8001A8B4 8C480000 */ lw $t0, ($v0) -/* 01B4B8 8001A8B8 00000000 */ nop -/* 01B4BC 8001A8BC 35190004 */ ori $t9, $t0, 4 -/* 01B4C0 8001A8C0 AC590000 */ sw $t9, ($v0) -.L8001A8C4: -/* 01B4C4 8001A8C4 80620000 */ lb $v0, ($v1) -/* 01B4C8 8001A8C8 00000000 */ nop -/* 01B4CC 8001A8CC 03E00008 */ jr $ra -/* 01B4D0 8001A8D0 00000000 */ nop - diff --git a/asm/non_matchings/objects/func_8001BB68.s b/asm/non_matchings/objects/func_8001BB68.s deleted file mode 100644 index 176abdd2..00000000 --- a/asm/non_matchings/objects/func_8001BB68.s +++ /dev/null @@ -1,60 +0,0 @@ -glabel func_8001BB68 -/* 01C768 8001BB68 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* 01C76C 8001BB6C AFB3002C */ sw $s3, 0x2c($sp) -/* 01C770 8001BB70 AFB20028 */ sw $s2, 0x28($sp) -/* 01C774 8001BB74 00A09025 */ move $s2, $a1 -/* 01C778 8001BB78 00C09825 */ move $s3, $a2 -/* 01C77C 8001BB7C AFBF0034 */ sw $ra, 0x34($sp) -/* 01C780 8001BB80 AFB10024 */ sw $s1, 0x24($sp) -/* 01C784 8001BB84 00808825 */ move $s1, $a0 -/* 01C788 8001BB88 AFB40030 */ sw $s4, 0x30($sp) -/* 01C78C 8001BB8C AFB00020 */ sw $s0, 0x20($sp) -/* 01C790 8001BB90 24060002 */ li $a2, 2 -/* 01C794 8001BB94 0C01ED32 */ jal func_8007B4C8 -/* 01C798 8001BB98 00002825 */ move $a1, $zero -/* 01C79C 8001BB9C 3C148012 */ lui $s4, %hi(D_8011AED0) # $s4, 0x8012 -/* 01C7A0 8001BBA0 2694AED0 */ addiu $s4, %lo(D_8011AED0) # addiu $s4, $s4, -0x5130 -/* 01C7A4 8001BBA4 8E820000 */ lw $v0, ($s4) -/* 01C7A8 8001BBA8 00000000 */ nop -/* 01C7AC 8001BBAC 28410004 */ slti $at, $v0, 4 -/* 01C7B0 8001BBB0 1420001C */ bnez $at, .L8001BC24 -/* 01C7B4 8001BBB4 8FBF0034 */ lw $ra, 0x34($sp) -/* 01C7B8 8001BBB8 1840000D */ blez $v0, .L8001BBF0 -/* 01C7BC 8001BBBC 00008025 */ move $s0, $zero -/* 01C7C0 8001BBC0 02002025 */ move $a0, $s0 -.L8001BBC4: -/* 01C7C4 8001BBC4 00002825 */ move $a1, $zero -/* 01C7C8 8001BBC8 02203025 */ move $a2, $s1 -/* 01C7CC 8001BBCC 02403825 */ move $a3, $s2 -/* 01C7D0 8001BBD0 0C006F10 */ jal func_8001BC40 -/* 01C7D4 8001BBD4 AFB30010 */ sw $s3, 0x10($sp) -/* 01C7D8 8001BBD8 8E820000 */ lw $v0, ($s4) -/* 01C7DC 8001BBDC 26100001 */ addiu $s0, $s0, 1 -/* 01C7E0 8001BBE0 0202082A */ slt $at, $s0, $v0 -/* 01C7E4 8001BBE4 1420FFF7 */ bnez $at, .L8001BBC4 -/* 01C7E8 8001BBE8 02002025 */ move $a0, $s0 -/* 01C7EC 8001BBEC 00008025 */ move $s0, $zero -.L8001BBF0: -/* 01C7F0 8001BBF0 1840000B */ blez $v0, .L8001BC20 -/* 01C7F4 8001BBF4 02002025 */ move $a0, $s0 -.L8001BBF8: -/* 01C7F8 8001BBF8 24050001 */ li $a1, 1 -/* 01C7FC 8001BBFC 02203025 */ move $a2, $s1 -/* 01C800 8001BC00 02403825 */ move $a3, $s2 -/* 01C804 8001BC04 0C006F10 */ jal func_8001BC40 -/* 01C808 8001BC08 AFB30010 */ sw $s3, 0x10($sp) -/* 01C80C 8001BC0C 8E8E0000 */ lw $t6, ($s4) -/* 01C810 8001BC10 26100001 */ addiu $s0, $s0, 1 -/* 01C814 8001BC14 020E082A */ slt $at, $s0, $t6 -/* 01C818 8001BC18 1420FFF7 */ bnez $at, .L8001BBF8 -/* 01C81C 8001BC1C 02002025 */ move $a0, $s0 -.L8001BC20: -/* 01C820 8001BC20 8FBF0034 */ lw $ra, 0x34($sp) -.L8001BC24: -/* 01C824 8001BC24 8FB00020 */ lw $s0, 0x20($sp) -/* 01C828 8001BC28 8FB10024 */ lw $s1, 0x24($sp) -/* 01C82C 8001BC2C 8FB20028 */ lw $s2, 0x28($sp) -/* 01C830 8001BC30 8FB3002C */ lw $s3, 0x2c($sp) -/* 01C834 8001BC34 8FB40030 */ lw $s4, 0x30($sp) -/* 01C838 8001BC38 03E00008 */ jr $ra -/* 01C83C 8001BC3C 27BD0038 */ addiu $sp, $sp, 0x38 diff --git a/asm/non_matchings/objects/func_800214E4.s b/asm/non_matchings/objects/func_800214E4.s deleted file mode 100644 index 6ff0df4c..00000000 --- a/asm/non_matchings/objects/func_800214E4.s +++ /dev/null @@ -1,82 +0,0 @@ -glabel func_800214E4 -/* 0220E4 800214E4 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 0220E8 800214E8 AFBF0014 */ sw $ra, 0x14($sp) -/* 0220EC 800214EC 8C860064 */ lw $a2, 0x64($a0) -/* 0220F0 800214F0 00803825 */ move $a3, $a0 -/* 0220F4 800214F4 80CE003A */ lb $t6, 0x3a($a2) -/* 0220F8 800214F8 00000000 */ nop -/* 0220FC 800214FC 11C00005 */ beqz $t6, .L80021514 -/* 022100 80021500 00000000 */ nop -/* 022104 80021504 848F0006 */ lh $t7, 6($a0) -/* 022108 80021508 00000000 */ nop -/* 02210C 8002150C 35F84000 */ ori $t8, $t7, 0x4000 -/* 022110 80021510 A4980006 */ sh $t8, 6($a0) -.L80021514: -/* 022114 80021514 84C20036 */ lh $v0, 0x36($a2) -/* 022118 80021518 2403FFFF */ li $v1, -1 -/* 02211C 8002151C 14620004 */ bne $v1, $v0, .L80021530 -/* 022120 80021520 00000000 */ nop -/* 022124 80021524 80C2003A */ lb $v0, 0x3a($a2) -/* 022128 80021528 10000032 */ b .L800215F4 -/* 02212C 8002152C 8FBF0014 */ lw $ra, 0x14($sp) -.L80021530: -/* 022130 80021530 04400004 */ bltz $v0, .L80021544 -/* 022134 80021534 0045C823 */ subu $t9, $v0, $a1 -/* 022138 80021538 A4D90036 */ sh $t9, 0x36($a2) -/* 02213C 8002153C 84C20036 */ lh $v0, 0x36($a2) -/* 022140 80021540 00000000 */ nop -.L80021544: -/* 022144 80021544 14620004 */ bne $v1, $v0, .L80021558 -/* 022148 80021548 2408FFFE */ li $t0, -2 -/* 02214C 8002154C A4C80036 */ sh $t0, 0x36($a2) -/* 022150 80021550 84C20036 */ lh $v0, 0x36($a2) -/* 022154 80021554 00000000 */ nop -.L80021558: -/* 022158 80021558 1C400024 */ bgtz $v0, .L800215EC -/* 02215C 8002155C 3C198012 */ lui $t9, %hi(D_8011AE74) # $t9, 0x8012 -/* 022160 80021560 84E90006 */ lh $t1, 6($a3) -/* 022164 80021564 3C058012 */ lui $a1, %hi(D_8011AE78) # $a1, 0x8012 -/* 022168 80021568 352A4000 */ ori $t2, $t1, 0x4000 -/* 02216C 8002156C A4EA0006 */ sh $t2, 6($a3) -/* 022170 80021570 84A5AE78 */ lh $a1, %lo(D_8011AE78)($a1) -/* 022174 80021574 00001025 */ move $v0, $zero -/* 022178 80021578 18A00014 */ blez $a1, .L800215CC -/* 02217C 8002157C 3C048012 */ lui $a0, %hi(D_8011AE74) # $a0, 0x8012 -/* 022180 80021580 8C84AE74 */ lw $a0, %lo(D_8011AE74)($a0) -/* 022184 80021584 84C30028 */ lh $v1, 0x28($a2) -/* 022188 80021588 8C8B0000 */ lw $t3, ($a0) -/* 02218C 8002158C 00000000 */ nop -/* 022190 80021590 8D6C007C */ lw $t4, 0x7c($t3) -/* 022194 80021594 00000000 */ nop -/* 022198 80021598 106C000C */ beq $v1, $t4, .L800215CC -/* 02219C 8002159C 00000000 */ nop -.L800215A0: -/* 0221A0 800215A0 24420001 */ addiu $v0, $v0, 1 -/* 0221A4 800215A4 0045082A */ slt $at, $v0, $a1 -/* 0221A8 800215A8 10200008 */ beqz $at, .L800215CC -/* 0221AC 800215AC 00026880 */ sll $t5, $v0, 2 -/* 0221B0 800215B0 008D7021 */ addu $t6, $a0, $t5 -/* 0221B4 800215B4 8DCF0000 */ lw $t7, ($t6) -/* 0221B8 800215B8 00000000 */ nop -/* 0221BC 800215BC 8DF8007C */ lw $t8, 0x7c($t7) -/* 0221C0 800215C0 00000000 */ nop -/* 0221C4 800215C4 1478FFF6 */ bne $v1, $t8, .L800215A0 -/* 0221C8 800215C8 00000000 */ nop -.L800215CC: -/* 0221CC 800215CC 8F39AE74 */ lw $t9, %lo(D_8011AE74)($t9) -/* 0221D0 800215D0 00024080 */ sll $t0, $v0, 2 -/* 0221D4 800215D4 03284821 */ addu $t1, $t9, $t0 -/* 0221D8 800215D8 8D240000 */ lw $a0, ($t1) -/* 0221DC 800215DC 0C007BE9 */ jal func_8001EFA4 -/* 0221E0 800215E0 00E02825 */ move $a1, $a3 -/* 0221E4 800215E4 10000002 */ b .L800215F0 -/* 0221E8 800215E8 24020001 */ li $v0, 1 -.L800215EC: -/* 0221EC 800215EC 00001025 */ move $v0, $zero -.L800215F0: -/* 0221F0 800215F0 8FBF0014 */ lw $ra, 0x14($sp) -.L800215F4: -/* 0221F4 800215F4 27BD0018 */ addiu $sp, $sp, 0x18 -/* 0221F8 800215F8 03E00008 */ jr $ra -/* 0221FC 800215FC 00000000 */ nop - diff --git a/asm/non_matchings/objects/func_800230D0.s b/asm/non_matchings/objects/func_800230D0.s index 2cfe46c8..7cf37a13 100644 --- a/asm/non_matchings/objects/func_800230D0.s +++ b/asm/non_matchings/objects/func_800230D0.s @@ -1,7 +1,7 @@ glabel func_800230D0 /* 023CD0 800230D0 27BDFFA0 */ addiu $sp, $sp, -0x60 -/* 023CD4 800230D4 3C028012 */ lui $v0, %hi(D_8011AED0) # $v0, 0x8012 -/* 023CD8 800230D8 8C42AED0 */ lw $v0, %lo(D_8011AED0)($v0) +/* 023CD4 800230D4 3C028012 */ lui $v0, %hi(gNumberOfCheckpoints) # $v0, 0x8012 +/* 023CD8 800230D8 8C42AED0 */ lw $v0, %lo(gNumberOfCheckpoints)($v0) /* 023CDC 800230DC AFB10018 */ sw $s1, 0x18($sp) /* 023CE0 800230E0 AFB00014 */ sw $s0, 0x14($sp) /* 023CE4 800230E4 00808025 */ move $s0, $a0 @@ -63,8 +63,8 @@ glabel func_800230D0 /* 023DB4 800231B4 8604002E */ lh $a0, 0x2e($s0) .L800231B8: /* 023DB8 800231B8 00026900 */ sll $t5, $v0, 4 -/* 023DBC 800231BC 3C0E8012 */ lui $t6, %hi(D_8011AECC) # $t6, 0x8012 -/* 023DC0 800231C0 8DCEAECC */ lw $t6, %lo(D_8011AECC)($t6) +/* 023DBC 800231BC 3C0E8012 */ lui $t6, %hi(gTrackCheckpoints) # $t6, 0x8012 +/* 023DC0 800231C0 8DCEAECC */ lw $t6, %lo(gTrackCheckpoints)($t6) /* 023DC4 800231C4 01A26823 */ subu $t5, $t5, $v0 /* 023DC8 800231C8 000D6880 */ sll $t5, $t5, 2 /* 023DCC 800231CC 3C01420C */ li $at, 0x420C0000 # 35.000000 @@ -128,8 +128,8 @@ glabel func_800230D0 /* 023EA8 800232A8 A63901A0 */ sh $t9, 0x1a0($s1) .L800232AC: /* 023EAC 800232AC A2200192 */ sb $zero, 0x192($s1) -/* 023EB0 800232B0 3C0A8012 */ lui $t2, %hi(D_8011AED0) # $t2, 0x8012 -/* 023EB4 800232B4 8D4AAED0 */ lw $t2, %lo(D_8011AED0)($t2) +/* 023EB0 800232B0 3C0A8012 */ lui $t2, %hi(gNumberOfCheckpoints) # $t2, 0x8012 +/* 023EB4 800232B4 8D4AAED0 */ lw $t2, %lo(gNumberOfCheckpoints)($t2) /* 023EB8 800232B8 82290193 */ lb $t1, 0x193($s1) /* 023EBC 800232BC 862C01A0 */ lh $t4, 0x1a0($s1) /* 023EC0 800232C0 012A0019 */ multu $t1, $t2 diff --git a/asm/non_matchings/objects/func_8002342C.s b/asm/non_matchings/objects/func_8002342C.s deleted file mode 100644 index 91c1b344..00000000 --- a/asm/non_matchings/objects/func_8002342C.s +++ /dev/null @@ -1,84 +0,0 @@ -glabel func_8002342C -/* 02402C 8002342C 27BDFFB0 */ addiu $sp, $sp, -0x50 -/* 024030 80023430 AFB3003C */ sw $s3, 0x3c($sp) -/* 024034 80023434 3C138012 */ lui $s3, %hi(objCount) # $s3, 0x8012 -/* 024038 80023438 2673AE5C */ addiu $s3, %lo(objCount) # addiu $s3, $s3, -0x51a4 -/* 02403C 8002343C 8E6E0000 */ lw $t6, ($s3) -/* 024040 80023440 E7B4001C */ swc1 $f20, 0x1c($sp) -/* 024044 80023444 AFB60048 */ sw $s6, 0x48($sp) -/* 024048 80023448 AFB10034 */ sw $s1, 0x34($sp) -/* 02404C 8002344C E7B90028 */ swc1 $f25, 0x28($sp) -/* 024050 80023450 E7B8002C */ swc1 $f24, 0x2c($sp) -/* 024054 80023454 E7B70020 */ swc1 $f23, 0x20($sp) -/* 024058 80023458 E7B60024 */ swc1 $f22, 0x24($sp) -/* 02405C 8002345C 4480A000 */ mtc1 $zero, $f20 -/* 024060 80023460 46006586 */ mov.s $f22, $f12 -/* 024064 80023464 46007606 */ mov.s $f24, $f14 -/* 024068 80023468 AFBF004C */ sw $ra, 0x4c($sp) -/* 02406C 8002346C AFB50044 */ sw $s5, 0x44($sp) -/* 024070 80023470 AFB40040 */ sw $s4, 0x40($sp) -/* 024074 80023474 AFB20038 */ sw $s2, 0x38($sp) -/* 024078 80023478 AFB00030 */ sw $s0, 0x30($sp) -/* 02407C 8002347C E7B50018 */ swc1 $f21, 0x18($sp) -/* 024080 80023480 00008825 */ move $s1, $zero -/* 024084 80023484 19C00027 */ blez $t6, .L80023524 -/* 024088 80023488 0000B025 */ move $s6, $zero -/* 02408C 8002348C 3C148012 */ lui $s4, %hi(gObjPtrList) # $s4, 0x8012 -/* 024090 80023490 2694AE58 */ addiu $s4, %lo(gObjPtrList) # addiu $s4, $s4, -0x51a8 -/* 024094 80023494 00009025 */ move $s2, $zero -/* 024098 80023498 24150057 */ li $s5, 87 -.L8002349C: -/* 02409C 8002349C 8E8F0000 */ lw $t7, ($s4) -/* 0240A0 800234A0 00000000 */ nop -/* 0240A4 800234A4 01F2C021 */ addu $t8, $t7, $s2 -/* 0240A8 800234A8 8F020000 */ lw $v0, ($t8) -/* 0240AC 800234AC 00000000 */ nop -/* 0240B0 800234B0 84590006 */ lh $t9, 6($v0) -/* 0240B4 800234B4 00000000 */ nop -/* 0240B8 800234B8 33288000 */ andi $t0, $t9, 0x8000 -/* 0240BC 800234BC 15000014 */ bnez $t0, .L80023510 -/* 0240C0 800234C0 00000000 */ nop -/* 0240C4 800234C4 84490048 */ lh $t1, 0x48($v0) -/* 0240C8 800234C8 00000000 */ nop -/* 0240CC 800234CC 16A90010 */ bne $s5, $t1, .L80023510 -/* 0240D0 800234D0 00000000 */ nop -/* 0240D4 800234D4 C444000C */ lwc1 $f4, 0xc($v0) -/* 0240D8 800234D8 C4460014 */ lwc1 $f6, 0x14($v0) -/* 0240DC 800234DC 46162001 */ sub.s $f0, $f4, $f22 -/* 0240E0 800234E0 00408025 */ move $s0, $v0 -/* 0240E4 800234E4 46000202 */ mul.s $f8, $f0, $f0 -/* 0240E8 800234E8 46183081 */ sub.s $f2, $f6, $f24 -/* 0240EC 800234EC 46021282 */ mul.s $f10, $f2, $f2 -/* 0240F0 800234F0 0C0326B4 */ jal sqrtf -/* 0240F4 800234F4 460A4300 */ add.s $f12, $f8, $f10 -/* 0240F8 800234F8 4600A03C */ c.lt.s $f20, $f0 -/* 0240FC 800234FC 00000000 */ nop -/* 024100 80023500 45000003 */ bc1f .L80023510 -/* 024104 80023504 00000000 */ nop -/* 024108 80023508 46000506 */ mov.s $f20, $f0 -/* 02410C 8002350C 0200B025 */ move $s6, $s0 -.L80023510: -/* 024110 80023510 8E6A0000 */ lw $t2, ($s3) -/* 024114 80023514 26310001 */ addiu $s1, $s1, 1 -/* 024118 80023518 022A082A */ slt $at, $s1, $t2 -/* 02411C 8002351C 1420FFDF */ bnez $at, .L8002349C -/* 024120 80023520 26520004 */ addiu $s2, $s2, 4 -.L80023524: -/* 024124 80023524 8FBF004C */ lw $ra, 0x4c($sp) -/* 024128 80023528 02C01025 */ move $v0, $s6 -/* 02412C 8002352C 8FB60048 */ lw $s6, 0x48($sp) -/* 024130 80023530 C7B50018 */ lwc1 $f21, 0x18($sp) -/* 024134 80023534 C7B4001C */ lwc1 $f20, 0x1c($sp) -/* 024138 80023538 C7B70020 */ lwc1 $f23, 0x20($sp) -/* 02413C 8002353C C7B60024 */ lwc1 $f22, 0x24($sp) -/* 024140 80023540 C7B90028 */ lwc1 $f25, 0x28($sp) -/* 024144 80023544 C7B8002C */ lwc1 $f24, 0x2c($sp) -/* 024148 80023548 8FB00030 */ lw $s0, 0x30($sp) -/* 02414C 8002354C 8FB10034 */ lw $s1, 0x34($sp) -/* 024150 80023550 8FB20038 */ lw $s2, 0x38($sp) -/* 024154 80023554 8FB3003C */ lw $s3, 0x3c($sp) -/* 024158 80023558 8FB40040 */ lw $s4, 0x40($sp) -/* 02415C 8002355C 8FB50044 */ lw $s5, 0x44($sp) -/* 024160 80023560 03E00008 */ jr $ra -/* 024164 80023564 27BD0050 */ addiu $sp, $sp, 0x50 - diff --git a/asm/non_matchings/objects/spawn_object.s b/asm/non_matchings/objects/spawn_object.s index c44a4aaa..6adf67b6 100644 --- a/asm/non_matchings/objects/spawn_object.s +++ b/asm/non_matchings/objects/spawn_object.s @@ -582,7 +582,7 @@ glabel L8000EDE0 /* 00FE9C 8000F29C 00C23021 */ addu $a2, $a2, $v0 .L8000F2A0: /* 00FEA0 8000F2A0 8209005A */ lb $t1, 0x5a($s0) -/* 00FEA4 8000F2A4 3C048012 */ lui $a0, %hi(D_8011AE68) # $a0, 0x8012 +/* 00FEA4 8000F2A4 3C048012 */ lui $a0, %hi(gObjectMemoryPool) # $a0, 0x8012 /* 00FEA8 8000F2A8 19200007 */ blez $t1, .L8000F2C8 /* 00FEAC 8000F2AC 00D22823 */ subu $a1, $a2, $s2 /* 00FEB0 8000F2B0 AE460070 */ sw $a2, 0x70($s2) @@ -592,7 +592,7 @@ glabel L8000EDE0 /* 00FEC0 8000F2C0 00CF3021 */ addu $a2, $a2, $t7 /* 00FEC4 8000F2C4 00D22823 */ subu $a1, $a2, $s2 .L8000F2C8: -/* 00FEC8 8000F2C8 8C84AE68 */ lw $a0, %lo(D_8011AE68)($a0) +/* 00FEC8 8000F2C8 8C84AE68 */ lw $a0, %lo(gObjectMemoryPool)($a0) /* 00FECC 8000F2CC 00A08825 */ move $s1, $a1 /* 00FED0 8000F2D0 0C01C3A4 */ jal allocate_from_pool_containing_slots /* 00FED4 8000F2D4 02408025 */ move $s0, $s2 diff --git a/asm/non_matchings/racer/func_80045C48.s b/asm/non_matchings/racer/func_80045C48.s index 913367c2..35d6878d 100644 --- a/asm/non_matchings/racer/func_80045C48.s +++ b/asm/non_matchings/racer/func_80045C48.s @@ -19,7 +19,7 @@ glabel func_80045C48 /* 04688C 80045C8C AFA400E8 */ sw $a0, 0xe8($sp) /* 046890 80045C90 AFA600F0 */ sw $a2, 0xf0($sp) /* 046894 80045C94 AFA000C4 */ sw $zero, 0xc4($sp) -/* 046898 80045C98 0C006E99 */ jal func_8001BA64 +/* 046898 80045C98 0C006E99 */ jal get_checkpoint_count /* 04689C 80045C9C AC20D538 */ sw $zero, %lo(gCurrentStickY)($at) /* 0468A0 80045CA0 14400005 */ bnez $v0, .L80045CB8 /* 0468A4 80045CA4 00409025 */ move $s2, $v0 @@ -69,7 +69,7 @@ glabel func_80045C48 /* 046940 80045D40 AFA70034 */ sw $a3, 0x34($sp) /* 046944 80045D44 AFA60038 */ sw $a2, 0x38($sp) /* 046948 80045D48 AFA30030 */ sw $v1, 0x30($sp) -/* 04694C 80045D4C 0C006E87 */ jal func_8001BA1C +/* 04694C 80045D4C 0C006E87 */ jal find_next_checkpoint_node /* 046950 80045D50 02002025 */ move $a0, $s0 /* 046954 80045D54 8FA60038 */ lw $a2, 0x38($sp) /* 046958 80045D58 C4520010 */ lwc1 $f18, 0x10($v0) @@ -363,7 +363,7 @@ glabel func_80045C48 /* 046D90 80046190 AFA70034 */ sw $a3, 0x34($sp) /* 046D94 80046194 AFA60038 */ sw $a2, 0x38($sp) /* 046D98 80046198 AFA30030 */ sw $v1, 0x30($sp) -/* 046D9C 8004619C 0C006E87 */ jal func_8001BA1C +/* 046D9C 8004619C 0C006E87 */ jal find_next_checkpoint_node /* 046DA0 800461A0 02002025 */ move $a0, $s0 /* 046DA4 800461A4 862901BA */ lh $t1, 0x1ba($s1) /* 046DA8 800461A8 C448001C */ lwc1 $f8, 0x1c($v0) diff --git a/asm/non_matchings/racer/func_80059208.s b/asm/non_matchings/racer/func_80059208.s index f23b92d8..b4c59013 100644 --- a/asm/non_matchings/racer/func_80059208.s +++ b/asm/non_matchings/racer/func_80059208.s @@ -10,7 +10,7 @@ glabel func_80059208 /* 059E14 80059214 00A08825 */ move $s1, $a1 /* 059E18 80059218 AFB00014 */ sw $s0, 0x14($sp) /* 059E1C 8005921C AFA400C0 */ sw $a0, 0xc0($sp) -/* 059E20 80059220 0C006E99 */ jal func_8001BA64 +/* 059E20 80059220 0C006E99 */ jal get_checkpoint_count /* 059E24 80059224 AFA600C8 */ sw $a2, 0xc8($sp) /* 059E28 80059228 10400155 */ beqz $v0, .L80059780 /* 059E2C 8005922C 8FBF001C */ lw $ra, 0x1c($sp) @@ -67,7 +67,7 @@ glabel func_80059208 /* 059EEC 800592EC 11400124 */ beqz $t2, .L80059780 /* 059EF0 800592F0 8FBF001C */ lw $ra, 0x1c($sp) /* 059EF4 800592F4 82240192 */ lb $a0, 0x192($s1) -/* 059EF8 800592F8 0C006E80 */ jal func_8001BA00 +/* 059EF8 800592F8 0C006E80 */ jal get_checkpoint_node /* 059EFC 800592FC AFA800B4 */ sw $t0, 0xb4($sp) /* 059F00 80059300 804B003A */ lb $t3, 0x3a($v0) /* 059F04 80059304 8FA800B4 */ lw $t0, 0xb4($sp) @@ -83,7 +83,7 @@ glabel func_80059208 /* 059F28 80059328 00000000 */ nop /* 059F2C 8005932C 00882021 */ addu $a0, $a0, $t0 .L80059330: -/* 059F30 80059330 0C006E80 */ jal func_8001BA00 +/* 059F30 80059330 0C006E80 */ jal get_checkpoint_node /* 059F34 80059334 00000000 */ nop /* 059F38 80059338 804C003A */ lb $t4, 0x3a($v0) /* 059F3C 8005933C 00000000 */ nop @@ -105,7 +105,7 @@ glabel func_80059208 /* 059F74 80059374 E7A2002C */ swc1 $f2, 0x2c($sp) /* 059F78 80059378 E7A30028 */ swc1 $f3, 0x28($sp) /* 059F7C 8005937C E7A00058 */ swc1 $f0, 0x58($sp) -/* 059F80 80059380 0C006E87 */ jal func_8001BA1C +/* 059F80 80059380 0C006E87 */ jal find_next_checkpoint_node /* 059F84 80059384 AFA800B4 */ sw $t0, 0xb4($sp) /* 059F88 80059388 82300192 */ lb $s0, 0x192($s1) /* 059F8C 8005938C 8FA800B4 */ lw $t0, 0xb4($sp) @@ -117,7 +117,7 @@ glabel func_80059208 /* 059FA4 800593A4 02002025 */ move $a0, $s0 .L800593A8: /* 059FA8 800593A8 AFA800B4 */ sw $t0, 0xb4($sp) -/* 059FAC 800593AC 0C006E80 */ jal func_8001BA00 +/* 059FAC 800593AC 0C006E80 */ jal get_checkpoint_node /* 059FB0 800593B0 E7A20040 */ swc1 $f2, 0x40($sp) /* 059FB4 800593B4 C7A20040 */ lwc1 $f2, 0x40($sp) /* 059FB8 800593B8 C440001C */ lwc1 $f0, 0x1c($v0) @@ -142,7 +142,7 @@ glabel func_80059208 /* 05A000 80059400 AFA70024 */ sw $a3, 0x24($sp) /* 05A004 80059404 AFA60034 */ sw $a2, 0x34($sp) /* 05A008 80059408 AFA30020 */ sw $v1, 0x20($sp) -/* 05A00C 8005940C 0C006E87 */ jal func_8001BA1C +/* 05A00C 8005940C 0C006E87 */ jal find_next_checkpoint_node /* 05A010 80059410 02002025 */ move $a0, $s0 /* 05A014 80059414 862D01BA */ lh $t5, 0x1ba($s1) /* 05A018 80059418 C44A001C */ lwc1 $f10, 0x1c($v0) diff --git a/asm/non_matchings/racer/func_8005B818.s b/asm/non_matchings/racer/func_8005B818.s index bc0149a8..a591bc77 100644 --- a/asm/non_matchings/racer/func_8005B818.s +++ b/asm/non_matchings/racer/func_8005B818.s @@ -46,7 +46,7 @@ glabel func_8005B818 /* 05C478 8005B878 3C018012 */ lui $at, %hi(gCurrentRacerMiscAssetPtr) # $at, 0x8012 /* 05C47C 8005B87C 0C01AF6C */ jal get_current_level_header /* 05C480 8005B880 AC22D564 */ sw $v0, %lo(gCurrentRacerMiscAssetPtr)($at) -/* 05C484 8005B884 0C006E99 */ jal func_8001BA64 +/* 05C484 8005B884 0C006E99 */ jal get_checkpoint_count /* 05C488 8005B888 AFA20080 */ sw $v0, 0x80($sp) /* 05C48C 8005B88C 10400260 */ beqz $v0, .L8005C210 /* 05C490 8005B890 AFA2011C */ sw $v0, 0x11c($sp) @@ -215,7 +215,7 @@ glabel func_8005B818 /* 05C6E8 8005BAE8 AFA70074 */ sw $a3, 0x74($sp) /* 05C6EC 8005BAEC AFA60078 */ sw $a2, 0x78($sp) /* 05C6F0 8005BAF0 AFA40120 */ sw $a0, 0x120($sp) -/* 05C6F4 8005BAF4 0C006E87 */ jal func_8001BA1C +/* 05C6F4 8005BAF4 0C006E87 */ jal find_next_checkpoint_node /* 05C6F8 8005BAF8 AFA3007C */ sw $v1, 0x7c($sp) /* 05C6FC 8005BAFC 8FA3007C */ lw $v1, 0x7c($sp) /* 05C700 8005BB00 C4460010 */ lwc1 $f6, 0x10($v0) diff --git a/asm/non_matchings/unknown_0255E0/func_8002581C.s b/asm/non_matchings/unknown_0255E0/func_8002581C.s index 72dd18db..fec2f172 100644 --- a/asm/non_matchings/unknown_0255E0/func_8002581C.s +++ b/asm/non_matchings/unknown_0255E0/func_8002581C.s @@ -40,7 +40,7 @@ glabel func_8002581C /* 0264A0 800258A0 2484B0A0 */ addiu $a0, %lo(gSceneCurrDisplayList) # addiu $a0, $a0, -0x4f60 /* 0264A4 800258A4 00002825 */ move $a1, $zero /* 0264A8 800258A8 24060003 */ li $a2, 3 -/* 0264AC 800258AC 0C01ED32 */ jal func_8007B4C8 +/* 0264AC 800258AC 0C01ED32 */ jal load_and_set_texture_no_offset /* 0264B0 800258B0 AD0B0004 */ sw $t3, 4($t0) /* 0264B4 800258B4 3C018012 */ lui $at, %hi(D_8011D49C) # $at, 0x8012 /* 0264B8 800258B8 A420D49C */ sh $zero, %lo(D_8011D49C)($at) diff --git a/asm/non_matchings/unknown_032760/func_8003E694.s b/asm/non_matchings/unknown_032760/func_8003E694.s deleted file mode 100644 index cb6dce49..00000000 --- a/asm/non_matchings/unknown_032760/func_8003E694.s +++ /dev/null @@ -1,380 +0,0 @@ -.late_rodata -glabel D_800E61F0 -.double 1.2 - -.text -glabel func_8003E694 -/* 03F294 8003E694 27BDFF18 */ addiu $sp, $sp, -0xe8 -/* 03F298 8003E698 AFBF002C */ sw $ra, 0x2c($sp) -/* 03F29C 8003E69C AFB10028 */ sw $s1, 0x28($sp) -/* 03F2A0 8003E6A0 AFB00024 */ sw $s0, 0x24($sp) -/* 03F2A4 8003E6A4 AFA500EC */ sw $a1, 0xec($sp) -/* 03F2A8 8003E6A8 8C83004C */ lw $v1, 0x4c($a0) -/* 03F2AC 8003E6AC 44800000 */ mtc1 $zero, $f0 -/* 03F2B0 8003E6B0 846E0014 */ lh $t6, 0x14($v1) -/* 03F2B4 8003E6B4 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 03F2B8 8003E6B8 35CF0100 */ ori $t7, $t6, 0x100 -/* 03F2BC 8003E6BC A46F0014 */ sh $t7, 0x14($v1) -/* 03F2C0 8003E6C0 C484000C */ lwc1 $f4, 0xc($a0) -/* 03F2C4 8003E6C4 8C910064 */ lw $s1, 0x64($a0) -/* 03F2C8 8003E6C8 E7A400BC */ swc1 $f4, 0xbc($sp) -/* 03F2CC 8003E6CC C4860010 */ lwc1 $f6, 0x10($a0) -/* 03F2D0 8003E6D0 44815000 */ mtc1 $at, $f10 -/* 03F2D4 8003E6D4 E7A600B8 */ swc1 $f6, 0xb8($sp) -/* 03F2D8 8003E6D8 C4880014 */ lwc1 $f8, 0x14($a0) -/* 03F2DC 8003E6DC 00808025 */ move $s0, $a0 -/* 03F2E0 8003E6E0 E7A800B4 */ swc1 $f8, 0xb4($sp) -/* 03F2E4 8003E6E4 84980000 */ lh $t8, ($a0) -/* 03F2E8 8003E6E8 27A5003C */ addiu $a1, $sp, 0x3c -/* 03F2EC 8003E6EC A7B8003C */ sh $t8, 0x3c($sp) -/* 03F2F0 8003E6F0 84990002 */ lh $t9, 2($a0) -/* 03F2F4 8003E6F4 A7A00040 */ sh $zero, 0x40($sp) -/* 03F2F8 8003E6F8 27A40054 */ addiu $a0, $sp, 0x54 -/* 03F2FC 8003E6FC E7A00048 */ swc1 $f0, 0x48($sp) -/* 03F300 8003E700 E7A0004C */ swc1 $f0, 0x4c($sp) -/* 03F304 8003E704 E7A00050 */ swc1 $f0, 0x50($sp) -/* 03F308 8003E708 E7AA0044 */ swc1 $f10, 0x44($sp) -/* 03F30C 8003E70C 0C01BF0C */ jal object_transform_to_matrix -/* 03F310 8003E710 A7B9003E */ sh $t9, 0x3e($sp) -/* 03F314 8003E714 44800000 */ mtc1 $zero, $f0 -/* 03F318 8003E718 8E270010 */ lw $a3, 0x10($s1) -/* 03F31C 8003E71C 2608001C */ addiu $t0, $s0, 0x1c -/* 03F320 8003E720 26090020 */ addiu $t1, $s0, 0x20 -/* 03F324 8003E724 260A0024 */ addiu $t2, $s0, 0x24 -/* 03F328 8003E728 44050000 */ mfc1 $a1, $f0 -/* 03F32C 8003E72C 44060000 */ mfc1 $a2, $f0 -/* 03F330 8003E730 AFAA0018 */ sw $t2, 0x18($sp) -/* 03F334 8003E734 AFA90014 */ sw $t1, 0x14($sp) -/* 03F338 8003E738 AFA80010 */ sw $t0, 0x10($sp) -/* 03F33C 8003E73C 0C01BD93 */ jal guMtxXFMF -/* 03F340 8003E740 27A40054 */ addiu $a0, $sp, 0x54 -/* 03F344 8003E744 8FAB00EC */ lw $t3, 0xec($sp) -/* 03F348 8003E748 3C0C8000 */ lui $t4, %hi(osTvType) # $t4, 0x8000 -/* 03F34C 8003E74C 448B8000 */ mtc1 $t3, $f16 -/* 03F350 8003E750 8D8C0300 */ lw $t4, %lo(osTvType)($t4) -/* 03F354 8003E754 46808020 */ cvt.s.w $f0, $f16 -/* 03F358 8003E758 3C01800E */ lui $at, %hi(D_800E61F0 + 4) # $at, 0x800e -/* 03F35C 8003E75C 15800006 */ bnez $t4, .L8003E778 -/* 03F360 8003E760 46000086 */ mov.s $f2, $f0 -/* 03F364 8003E764 C42561F0 */ lwc1 $f5, %lo(D_800E61F0)($at) -/* 03F368 8003E768 C42461F4 */ lwc1 $f4, %lo(D_800E61F0 + 4)($at) -/* 03F36C 8003E76C 460004A1 */ cvt.d.s $f18, $f0 -/* 03F370 8003E770 46249182 */ mul.d $f6, $f18, $f4 -/* 03F374 8003E774 462030A0 */ cvt.s.d $f2, $f6 -.L8003E778: -/* 03F378 8003E778 C60A001C */ lwc1 $f10, 0x1c($s0) -/* 03F37C 8003E77C C608000C */ lwc1 $f8, 0xc($s0) -/* 03F380 8003E780 46025402 */ mul.s $f16, $f10, $f2 -/* 03F384 8003E784 24010006 */ li $at, 6 -/* 03F388 8003E788 24040001 */ li $a0, 1 -/* 03F38C 8003E78C 2605000C */ addiu $a1, $s0, 0xc -/* 03F390 8003E790 46104480 */ add.s $f18, $f8, $f16 -/* 03F394 8003E794 27A600C8 */ addiu $a2, $sp, 0xc8 -/* 03F398 8003E798 E7B200C8 */ swc1 $f18, 0xc8($sp) -/* 03F39C 8003E79C C6060020 */ lwc1 $f6, 0x20($s0) -/* 03F3A0 8003E7A0 C6040010 */ lwc1 $f4, 0x10($s0) -/* 03F3A4 8003E7A4 46023282 */ mul.s $f10, $f6, $f2 -/* 03F3A8 8003E7A8 2407FFFF */ li $a3, -1 -/* 03F3AC 8003E7AC 460A2200 */ add.s $f8, $f4, $f10 -/* 03F3B0 8003E7B0 E7A800CC */ swc1 $f8, 0xcc($sp) -/* 03F3B4 8003E7B4 C6120024 */ lwc1 $f18, 0x24($s0) -/* 03F3B8 8003E7B8 C6100014 */ lwc1 $f16, 0x14($s0) -/* 03F3BC 8003E7BC 46029182 */ mul.s $f6, $f18, $f2 -/* 03F3C0 8003E7C0 46068100 */ add.s $f4, $f16, $f6 -/* 03F3C4 8003E7C4 E7A400D0 */ swc1 $f4, 0xd0($sp) -/* 03F3C8 8003E7C8 922D0018 */ lbu $t5, 0x18($s1) -/* 03F3CC 8003E7CC 00000000 */ nop -/* 03F3D0 8003E7D0 11A1001E */ beq $t5, $at, .L8003E84C -/* 03F3D4 8003E7D4 3C014180 */ li $at, 0x41800000 # 16.000000 -/* 03F3D8 8003E7D8 44815000 */ mtc1 $at, $f10 -/* 03F3DC 8003E7DC AFA50038 */ sw $a1, 0x38($sp) -/* 03F3E0 8003E7E0 E7A200C0 */ swc1 $f2, 0xc0($sp) -/* 03F3E4 8003E7E4 0C00C44C */ jal func_80031130 -/* 03F3E8 8003E7E8 E7AA00C4 */ swc1 $f10, 0xc4($sp) -/* 03F3EC 8003E7EC 240EFFFF */ li $t6, -1 -/* 03F3F0 8003E7F0 8FA40038 */ lw $a0, 0x38($sp) -/* 03F3F4 8003E7F4 240F0001 */ li $t7, 1 -/* 03F3F8 8003E7F8 27B800A4 */ addiu $t8, $sp, 0xa4 -/* 03F3FC 8003E7FC AFA000A4 */ sw $zero, 0xa4($sp) -/* 03F400 8003E800 A3AE0097 */ sb $t6, 0x97($sp) -/* 03F404 8003E804 AFB80014 */ sw $t8, 0x14($sp) -/* 03F408 8003E808 AFAF0010 */ sw $t7, 0x10($sp) -/* 03F40C 8003E80C 27A500C8 */ addiu $a1, $sp, 0xc8 -/* 03F410 8003E810 27A600C4 */ addiu $a2, $sp, 0xc4 -/* 03F414 8003E814 0C00C580 */ jal func_80031600 -/* 03F418 8003E818 27A70097 */ addiu $a3, $sp, 0x97 -/* 03F41C 8003E81C 8FB900A4 */ lw $t9, 0xa4($sp) -/* 03F420 8003E820 C7A200C0 */ lwc1 $f2, 0xc0($sp) -/* 03F424 8003E824 1B200009 */ blez $t9, .L8003E84C -/* 03F428 8003E828 27A400B0 */ addiu $a0, $sp, 0xb0 -/* 03F42C 8003E82C 27A500AC */ addiu $a1, $sp, 0xac -/* 03F430 8003E830 27A600A8 */ addiu $a2, $sp, 0xa8 -/* 03F434 8003E834 0C00AB35 */ jal func_8002ACD4 -/* 03F438 8003E838 E7A200C0 */ swc1 $f2, 0xc0($sp) -/* 03F43C 8003E83C C7A200C0 */ lwc1 $f2, 0xc0($sp) -/* 03F440 8003E840 10400002 */ beqz $v0, .L8003E84C -/* 03F444 8003E844 00000000 */ nop -/* 03F448 8003E848 AE000078 */ sw $zero, 0x78($s0) -.L8003E84C: -/* 03F44C 8003E84C C7A800C8 */ lwc1 $f8, 0xc8($sp) -/* 03F450 8003E850 C7B200BC */ lwc1 $f18, 0xbc($sp) -/* 03F454 8003E854 C7B000CC */ lwc1 $f16, 0xcc($sp) -/* 03F458 8003E858 C7A600B8 */ lwc1 $f6, 0xb8($sp) -/* 03F45C 8003E85C C7A400D0 */ lwc1 $f4, 0xd0($sp) -/* 03F460 8003E860 C7AA00B4 */ lwc1 $f10, 0xb4($sp) -/* 03F464 8003E864 46124001 */ sub.s $f0, $f8, $f18 -/* 03F468 8003E868 02002025 */ move $a0, $s0 -/* 03F46C 8003E86C 46068301 */ sub.s $f12, $f16, $f6 -/* 03F470 8003E870 44050000 */ mfc1 $a1, $f0 -/* 03F474 8003E874 460A2381 */ sub.s $f14, $f4, $f10 -/* 03F478 8003E878 44066000 */ mfc1 $a2, $f12 -/* 03F47C 8003E87C 44077000 */ mfc1 $a3, $f14 -/* 03F480 8003E880 E7AE00A8 */ swc1 $f14, 0xa8($sp) -/* 03F484 8003E884 E7AC00AC */ swc1 $f12, 0xac($sp) -/* 03F488 8003E888 E7A000B0 */ swc1 $f0, 0xb0($sp) -/* 03F48C 8003E88C 0C00455C */ jal func_80011570 -/* 03F490 8003E890 E7A200C0 */ swc1 $f2, 0xc0($sp) -/* 03F494 8003E894 C7A200C0 */ lwc1 $f2, 0xc0($sp) -/* 03F498 8003E898 10400002 */ beqz $v0, .L8003E8A4 -/* 03F49C 8003E89C 00000000 */ nop -/* 03F4A0 8003E8A0 AE000078 */ sw $zero, 0x78($s0) -.L8003E8A4: -/* 03F4A4 8003E8A4 C7A800B0 */ lwc1 $f8, 0xb0($sp) -/* 03F4A8 8003E8A8 C7B000A8 */ lwc1 $f16, 0xa8($sp) -/* 03F4AC 8003E8AC 46084482 */ mul.s $f18, $f8, $f8 -/* 03F4B0 8003E8B0 3C014000 */ li $at, 0x40000000 # 2.000000 -/* 03F4B4 8003E8B4 46108182 */ mul.s $f6, $f16, $f16 -/* 03F4B8 8003E8B8 44818000 */ mtc1 $at, $f16 -/* 03F4BC 8003E8BC 46069100 */ add.s $f4, $f18, $f6 -/* 03F4C0 8003E8C0 00000000 */ nop -/* 03F4C4 8003E8C4 46022283 */ div.s $f10, $f4, $f2 -/* 03F4C8 8003E8C8 E7AA00B0 */ swc1 $f10, 0xb0($sp) -/* 03F4CC 8003E8CC C6200010 */ lwc1 $f0, 0x10($s1) -/* 03F4D0 8003E8D0 C7A600B0 */ lwc1 $f6, 0xb0($sp) -/* 03F4D4 8003E8D4 46000202 */ mul.s $f8, $f0, $f0 -/* 03F4D8 8003E8D8 00000000 */ nop -/* 03F4DC 8003E8DC 46104483 */ div.s $f18, $f8, $f16 -/* 03F4E0 8003E8E0 4612303C */ c.lt.s $f6, $f18 -/* 03F4E4 8003E8E4 E7B200A8 */ swc1 $f18, 0xa8($sp) -/* 03F4E8 8003E8E8 45000002 */ bc1f .L8003E8F4 -/* 03F4EC 8003E8EC 00000000 */ nop -/* 03F4F0 8003E8F0 AE000078 */ sw $zero, 0x78($s0) -.L8003E8F4: -/* 03F4F4 8003E8F4 92220018 */ lbu $v0, 0x18($s1) -/* 03F4F8 8003E8F8 00000000 */ nop -/* 03F4FC 8003E8FC 14400023 */ bnez $v0, .L8003E98C -/* 03F500 8003E900 00000000 */ nop -/* 03F504 8003E904 0C006E99 */ jal func_8001BA64 -/* 03F508 8003E908 00000000 */ nop -/* 03F50C 8003E90C 1840001D */ blez $v0, .L8003E984 -/* 03F510 8003E910 240DFFFF */ li $t5, -1 -/* 03F514 8003E914 82240019 */ lb $a0, 0x19($s1) -/* 03F518 8003E918 C7A400B4 */ lwc1 $f4, 0xb4($sp) -/* 03F51C 8003E91C 8FA600BC */ lw $a2, 0xbc($sp) -/* 03F520 8003E920 8FA700B8 */ lw $a3, 0xb8($sp) -/* 03F524 8003E924 2628000C */ addiu $t0, $s1, 0xc -/* 03F528 8003E928 27A90097 */ addiu $t1, $sp, 0x97 -/* 03F52C 8003E92C AFA90018 */ sw $t1, 0x18($sp) -/* 03F530 8003E930 AFA80014 */ sw $t0, 0x14($sp) -/* 03F534 8003E934 AFA2009C */ sw $v0, 0x9c($sp) -/* 03F538 8003E938 02002825 */ move $a1, $s0 -/* 03F53C 8003E93C 0C006179 */ jal func_800185E4 -/* 03F540 8003E940 E7A40010 */ swc1 $f4, 0x10($sp) -/* 03F544 8003E944 8FA3009C */ lw $v1, 0x9c($sp) -/* 03F548 8003E948 1440000B */ bnez $v0, .L8003E978 -/* 03F54C 8003E94C 00000000 */ nop -/* 03F550 8003E950 822A0019 */ lb $t2, 0x19($s1) -/* 03F554 8003E954 00000000 */ nop -/* 03F558 8003E958 254B0001 */ addiu $t3, $t2, 1 -/* 03F55C 8003E95C A22B0019 */ sb $t3, 0x19($s1) -/* 03F560 8003E960 822C0019 */ lb $t4, 0x19($s1) -/* 03F564 8003E964 00000000 */ nop -/* 03F568 8003E968 0183082A */ slt $at, $t4, $v1 -/* 03F56C 8003E96C 14200002 */ bnez $at, .L8003E978 -/* 03F570 8003E970 00000000 */ nop -/* 03F574 8003E974 A2200019 */ sb $zero, 0x19($s1) -.L8003E978: -/* 03F578 8003E978 92220018 */ lbu $v0, 0x18($s1) -/* 03F57C 8003E97C 10000003 */ b .L8003E98C -/* 03F580 8003E980 00000000 */ nop -.L8003E984: -/* 03F584 8003E984 92220018 */ lbu $v0, 0x18($s1) -/* 03F588 8003E988 A22D0019 */ sb $t5, 0x19($s1) -.L8003E98C: -/* 03F58C 8003E98C 14400007 */ bnez $v0, .L8003E9AC -/* 03F590 8003E990 02002025 */ move $a0, $s0 -/* 03F594 8003E994 8FA500EC */ lw $a1, 0xec($sp) -/* 03F598 8003E998 02002025 */ move $a0, $s0 -/* 03F59C 8003E99C 0C00FB76 */ jal func_8003EDD8 -/* 03F5A0 8003E9A0 02203025 */ move $a2, $s1 -/* 03F5A4 8003E9A4 10000005 */ b .L8003E9BC -/* 03F5A8 8003E9A8 8E03004C */ lw $v1, 0x4c($s0) -.L8003E9AC: -/* 03F5AC 8003E9AC 8FA500EC */ lw $a1, 0xec($sp) -/* 03F5B0 8003E9B0 0C00FB05 */ jal func_8003EC14 -/* 03F5B4 8003E9B4 02203025 */ move $a2, $s1 -/* 03F5B8 8003E9B8 8E03004C */ lw $v1, 0x4c($s0) -.L8003E9BC: -/* 03F5BC 8003E9BC 00000000 */ nop -/* 03F5C0 8003E9C0 8C620000 */ lw $v0, ($v1) -/* 03F5C4 8003E9C4 00000000 */ nop -/* 03F5C8 8003E9C8 1040004E */ beqz $v0, .L8003EB04 -/* 03F5CC 8003E9CC 00000000 */ nop -/* 03F5D0 8003E9D0 8E2E0004 */ lw $t6, 4($s1) -/* 03F5D4 8003E9D4 00402825 */ move $a1, $v0 -/* 03F5D8 8003E9D8 144E000C */ bne $v0, $t6, .L8003EA0C -/* 03F5DC 8003E9DC 240401C2 */ li $a0, 450 -/* 03F5E0 8003E9E0 0C00322D */ jal normalise_time -/* 03F5E4 8003E9E4 AFA200E4 */ sw $v0, 0xe4($sp) -/* 03F5E8 8003E9E8 8E030078 */ lw $v1, 0x78($s0) -/* 03F5EC 8003E9EC 8FA500E4 */ lw $a1, 0xe4($sp) -/* 03F5F0 8003E9F0 0062082A */ slt $at, $v1, $v0 -/* 03F5F4 8003E9F4 10200043 */ beqz $at, .L8003EB04 -/* 03F5F8 8003E9F8 00000000 */ nop -/* 03F5FC 8003E9FC 10600041 */ beqz $v1, .L8003EB04 -/* 03F600 8003EA00 00000000 */ nop -/* 03F604 8003EA04 8E03004C */ lw $v1, 0x4c($s0) -/* 03F608 8003EA08 00000000 */ nop -.L8003EA0C: -/* 03F60C 8003EA0C 922F0018 */ lbu $t7, 0x18($s1) -/* 03F610 8003EA10 2402003C */ li $v0, 60 -/* 03F614 8003EA14 15E00009 */ bnez $t7, .L8003EA3C -/* 03F618 8003EA18 00000000 */ nop -/* 03F61C 8003EA1C 8E380000 */ lw $t8, ($s1) -/* 03F620 8003EA20 00000000 */ nop -/* 03F624 8003EA24 14B80003 */ bne $a1, $t8, .L8003EA34 -/* 03F628 8003EA28 00000000 */ nop -/* 03F62C 8003EA2C 10000003 */ b .L8003EA3C -/* 03F630 8003EA30 2402004B */ li $v0, 75 -.L8003EA34: -/* 03F634 8003EA34 10000001 */ b .L8003EA3C -/* 03F638 8003EA38 24020014 */ li $v0, 20 -.L8003EA3C: -/* 03F63C 8003EA3C 90790013 */ lbu $t9, 0x13($v1) -/* 03F640 8003EA40 00000000 */ nop -/* 03F644 8003EA44 0322082A */ slt $at, $t9, $v0 -/* 03F648 8003EA48 1020002E */ beqz $at, .L8003EB04 -/* 03F64C 8003EA4C 00000000 */ nop -/* 03F650 8003EA50 8CA80040 */ lw $t0, 0x40($a1) -/* 03F654 8003EA54 24040001 */ li $a0, 1 -/* 03F658 8003EA58 81090054 */ lb $t1, 0x54($t0) -/* 03F65C 8003EA5C 00000000 */ nop -/* 03F660 8003EA60 14890018 */ bne $a0, $t1, .L8003EAC4 -/* 03F664 8003EA64 00000000 */ nop -/* 03F668 8003EA68 8CA30064 */ lw $v1, 0x64($a1) -/* 03F66C 8003EA6C 2406FFFF */ li $a2, -1 -/* 03F670 8003EA70 A0640187 */ sb $a0, 0x187($v1) -/* 03F674 8003EA74 8E2A0004 */ lw $t2, 4($s1) -/* 03F678 8003EA78 846B0000 */ lh $t3, ($v1) -/* 03F67C 8003EA7C 8D420064 */ lw $v0, 0x64($t2) -/* 03F680 8003EA80 14CB0005 */ bne $a2, $t3, .L8003EA98 -/* 03F684 8003EA84 00000000 */ nop -/* 03F688 8003EA88 844C0000 */ lh $t4, ($v0) -/* 03F68C 8003EA8C 00000000 */ nop -/* 03F690 8003EA90 10CC0005 */ beq $a2, $t4, .L8003EAA8 -/* 03F694 8003EA94 00000000 */ nop -.L8003EA98: -/* 03F698 8003EA98 904D01EF */ lbu $t5, 0x1ef($v0) -/* 03F69C 8003EA9C 00000000 */ nop -/* 03F6A0 8003EAA0 35AE0002 */ ori $t6, $t5, 2 -/* 03F6A4 8003EAA4 A04E01EF */ sb $t6, 0x1ef($v0) -.L8003EAA8: -/* 03F6A8 8003EAA8 806F01D8 */ lb $t7, 0x1d8($v1) -/* 03F6AC 8003EAAC 00000000 */ nop -/* 03F6B0 8003EAB0 15E00004 */ bnez $t7, .L8003EAC4 -/* 03F6B4 8003EAB4 00000000 */ nop -/* 03F6B8 8003EAB8 84640000 */ lh $a0, ($v1) -/* 03F6BC 8003EABC 0C01C8D2 */ jal func_80072348 -/* 03F6C0 8003EAC0 24050009 */ li $a1, 9 -.L8003EAC4: -/* 03F6C4 8003EAC4 C60C000C */ lwc1 $f12, 0xc($s0) -/* 03F6C8 8003EAC8 C60E0010 */ lwc1 $f14, 0x10($s0) -/* 03F6CC 8003EACC 8E060014 */ lw $a2, 0x14($s0) -/* 03F6D0 8003EAD0 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 03F6D4 8003EAD4 44815000 */ mtc1 $at, $f10 -/* 03F6D8 8003EAD8 24180011 */ li $t8, 17 -/* 03F6DC 8003EADC 24190001 */ li $t9, 1 -/* 03F6E0 8003EAE0 AFB90018 */ sw $t9, 0x18($sp) -/* 03F6E4 8003EAE4 AFB80010 */ sw $t8, 0x10($sp) -/* 03F6E8 8003EAE8 2407002C */ li $a3, 44 -/* 03F6EC 8003EAEC 0C00FF11 */ jal func_8003FC44 -/* 03F6F0 8003EAF0 E7AA0014 */ swc1 $f10, 0x14($sp) -/* 03F6F4 8003EAF4 0C003FEE */ jal gParticlePtrList_addObject -/* 03F6F8 8003EAF8 02002025 */ move $a0, $s0 -/* 03F6FC 8003EAFC 10000041 */ b .L8003EC04 -/* 03F700 8003EB00 8FBF002C */ lw $ra, 0x2c($sp) -.L8003EB04: -/* 03F704 8003EB04 8E08007C */ lw $t0, 0x7c($s0) -/* 03F708 8003EB08 8FA900EC */ lw $t1, 0xec($sp) -/* 03F70C 8003EB0C 8E030060 */ lw $v1, 0x60($s0) -/* 03F710 8003EB10 01095021 */ addu $t2, $t0, $t1 -/* 03F714 8003EB14 10600027 */ beqz $v1, .L8003EBB4 -/* 03F718 8003EB18 AE0A007C */ sw $t2, 0x7c($s0) -/* 03F71C 8003EB1C 8C710004 */ lw $s1, 4($v1) -/* 03F720 8003EB20 29410008 */ slti $at, $t2, 8 -/* 03F724 8003EB24 10200009 */ beqz $at, .L8003EB4C -/* 03F728 8003EB28 01401025 */ move $v0, $t2 -/* 03F72C 8003EB2C 44824000 */ mtc1 $v0, $f8 -/* 03F730 8003EB30 3C013F00 */ li $at, 0x3F000000 # 0.500000 -/* 03F734 8003EB34 46804420 */ cvt.s.w $f16, $f8 -/* 03F738 8003EB38 44813000 */ mtc1 $at, $f6 -/* 03F73C 8003EB3C 00000000 */ nop -/* 03F740 8003EB40 46068482 */ mul.s $f18, $f16, $f6 -/* 03F744 8003EB44 1000001B */ b .L8003EBB4 -/* 03F748 8003EB48 E6320008 */ swc1 $f18, 8($s1) -.L8003EB4C: -/* 03F74C 8003EB4C 28410010 */ slti $at, $v0, 0x10 -/* 03F750 8003EB50 1020000D */ beqz $at, .L8003EB88 -/* 03F754 8003EB54 00402025 */ move $a0, $v0 -/* 03F758 8003EB58 244BFFF8 */ addiu $t3, $v0, -8 -/* 03F75C 8003EB5C 448B2000 */ mtc1 $t3, $f4 -/* 03F760 8003EB60 3C013E80 */ li $at, 0x3E800000 # 0.250000 -/* 03F764 8003EB64 468022A0 */ cvt.s.w $f10, $f4 -/* 03F768 8003EB68 44814000 */ mtc1 $at, $f8 -/* 03F76C 8003EB6C 3C014080 */ li $at, 0x40800000 # 4.000000 -/* 03F770 8003EB70 46085402 */ mul.s $f16, $f10, $f8 -/* 03F774 8003EB74 44813000 */ mtc1 $at, $f6 -/* 03F778 8003EB78 00000000 */ nop -/* 03F77C 8003EB7C 46103481 */ sub.s $f18, $f6, $f16 -/* 03F780 8003EB80 1000000C */ b .L8003EBB4 -/* 03F784 8003EB84 E6320008 */ swc1 $f18, 8($s1) -.L8003EB88: -/* 03F788 8003EB88 00046700 */ sll $t4, $a0, 0x1c -/* 03F78C 8003EB8C 0C01C1F1 */ jal sins_f -/* 03F790 8003EB90 000C2403 */ sra $a0, $t4, 0x10 -/* 03F794 8003EB94 3C013E80 */ li $at, 0x3E800000 # 0.250000 -/* 03F798 8003EB98 44812000 */ mtc1 $at, $f4 -/* 03F79C 8003EB9C 3C014000 */ li $at, 0x40000000 # 2.000000 -/* 03F7A0 8003EBA0 46040282 */ mul.s $f10, $f0, $f4 -/* 03F7A4 8003EBA4 44814000 */ mtc1 $at, $f8 -/* 03F7A8 8003EBA8 00000000 */ nop -/* 03F7AC 8003EBAC 46085180 */ add.s $f6, $f10, $f8 -/* 03F7B0 8003EBB0 E6260008 */ swc1 $f6, 8($s1) -.L8003EBB4: -/* 03F7B4 8003EBB4 8E0E0078 */ lw $t6, 0x78($s0) -/* 03F7B8 8003EBB8 8FAF00EC */ lw $t7, 0xec($sp) -/* 03F7BC 8003EBBC 2407002C */ li $a3, 44 -/* 03F7C0 8003EBC0 01CFC023 */ subu $t8, $t6, $t7 -/* 03F7C4 8003EBC4 0701000E */ bgez $t8, .L8003EC00 -/* 03F7C8 8003EBC8 AE180078 */ sw $t8, 0x78($s0) -/* 03F7CC 8003EBCC C60C000C */ lwc1 $f12, 0xc($s0) -/* 03F7D0 8003EBD0 C60E0010 */ lwc1 $f14, 0x10($s0) -/* 03F7D4 8003EBD4 8E060014 */ lw $a2, 0x14($s0) -/* 03F7D8 8003EBD8 3C013F80 */ li $at, 0x3F800000 # 1.000000 -/* 03F7DC 8003EBDC 44818000 */ mtc1 $at, $f16 -/* 03F7E0 8003EBE0 24080011 */ li $t0, 17 -/* 03F7E4 8003EBE4 24090001 */ li $t1, 1 -/* 03F7E8 8003EBE8 AFA90018 */ sw $t1, 0x18($sp) -/* 03F7EC 8003EBEC AFA80010 */ sw $t0, 0x10($sp) -/* 03F7F0 8003EBF0 0C00FF11 */ jal func_8003FC44 -/* 03F7F4 8003EBF4 E7B00014 */ swc1 $f16, 0x14($sp) -/* 03F7F8 8003EBF8 0C003FEE */ jal gParticlePtrList_addObject -/* 03F7FC 8003EBFC 02002025 */ move $a0, $s0 -.L8003EC00: -/* 03F800 8003EC00 8FBF002C */ lw $ra, 0x2c($sp) -.L8003EC04: -/* 03F804 8003EC04 8FB00024 */ lw $s0, 0x24($sp) -/* 03F808 8003EC08 8FB10028 */ lw $s1, 0x28($sp) -/* 03F80C 8003EC0C 03E00008 */ jr $ra -/* 03F810 8003EC10 27BD00E8 */ addiu $sp, $sp, 0xe8 - diff --git a/asm/non_matchings/unknown_05DCD0/func_8005D0D0.s b/asm/non_matchings/unknown_05DCD0/func_8005D0D0.s index ccd595a1..dd1ab7da 100644 --- a/asm/non_matchings/unknown_05DCD0/func_8005D0D0.s +++ b/asm/non_matchings/unknown_05DCD0/func_8005D0D0.s @@ -181,7 +181,7 @@ glabel func_8005D0D0 .L8005D358: /* 05DF58 8005D358 82040192 */ lb $a0, 0x192($s0) /* 05DF5C 8005D35C 920501C8 */ lbu $a1, 0x1c8($s0) -/* 05DF60 8005D360 0C006E87 */ jal func_8001BA1C +/* 05DF60 8005D360 0C006E87 */ jal find_next_checkpoint_node /* 05DF64 8005D364 AFA0003C */ sw $zero, 0x3c($sp) /* 05DF68 8005D368 820E01CA */ lb $t6, 0x1ca($s0) /* 05DF6C 8005D36C 8FA3003C */ lw $v1, 0x3c($sp) diff --git a/asm/non_matchings/unknown_05F690/func_8005EA90.s b/asm/non_matchings/unknown_05F690/func_8005EA90.s index fcbc435f..fbdfa6b5 100644 --- a/asm/non_matchings/unknown_05F690/func_8005EA90.s +++ b/asm/non_matchings/unknown_05F690/func_8005EA90.s @@ -210,7 +210,7 @@ glabel func_8005EA90 .L8005ED70: /* 05F970 8005ED70 82040192 */ lb $a0, 0x192($s0) /* 05F974 8005ED74 920501C8 */ lbu $a1, 0x1c8($s0) -/* 05F978 8005ED78 0C006E87 */ jal func_8001BA1C +/* 05F978 8005ED78 0C006E87 */ jal find_next_checkpoint_node /* 05F97C 8005ED7C A7A00038 */ sh $zero, 0x38($sp) /* 05F980 8005ED80 820E01CA */ lb $t6, 0x1ca($s0) /* 05F984 8005ED84 87A60038 */ lh $a2, 0x38($sp) diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 80f22014..fcea0105 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -120,6 +120,21 @@ typedef struct LevelObjectEntry_Checkpoint { /* 0x08 */ u8 unk8; /* 0x09 */ u8 unk9; /* 0x0A */ u8 unkA; + /* 0x0B */ s8 unkB; + /* 0x0C */ s8 unkC; + /* 0x0D */ s8 unkD; + /* 0x0E */ s8 unkE; + /* 0x0F */ s8 unkF; + /* 0x10 */ s8 unk10; + /* 0x11 */ s8 unk11; + /* 0x12 */ s8 unk12; + /* 0x13 */ s8 unk13; + /* 0x14 */ s8 unk14; + /* 0x15 */ s8 unk15; + /* 0x16 */ s8 unk16; + /* 0x17 */ s8 unk17; + /* 0x18 */ s8 unk18; + /* 0x19 */ u8 unk19; } LevelObjectEntry_Checkpoint; typedef struct LevelObjectEntry_Door { diff --git a/include/structs.h b/include/structs.h index 9556172e..c1b09b62 100644 --- a/include/structs.h +++ b/include/structs.h @@ -648,19 +648,19 @@ typedef struct Object_44 { Object_44_C *unkC; } Object_44; -typedef struct Object_4C { - void *unk0; +typedef struct ObjectInteraction { + struct Object *obj; f32 x_position; f32 y_position; f32 z_position; u8 unk10; u8 unk11; u8 unk12; - u8 unk13; + u8 distance; s16 unk14; s8 unk16; s8 unk17; -} Object_4C; +} ObjectInteraction; typedef struct Object_50 { f32 unk0; @@ -708,9 +708,14 @@ typedef struct Object_58 { s16 unkE; } Object_58; +typedef f32 FakeHalfMatrix[2][4]; typedef struct Object_5C { - u8 pad0[0x100]; - void *unk100; + union { + /* 0x0000 */ Matrix matrices[4]; + /* 0x0000 */ FakeHalfMatrix _matrices[8]; // This is a hack. The Matrix[4] is the real one. + }; + /* 0x0100 */ void *unk100; + /* 0x0104 */ u8 unk104; } Object_5C; typedef struct Object_60 { @@ -768,11 +773,11 @@ typedef struct Object_Weapon { /* 0x00 */ struct Object *target; /* 0x04 */ struct Object *owner; /* 0x08 */ s32 unk8; - /* 0x0C */ s32 unkC; + /* 0x0C */ f32 checkpointDist; /* 0x10 */ f32 forwardVel; /* 0x14 */ s32 unk14; /* 0x18 */ u8 weaponID; - /* 0x19 */ u8 checkpoint; + /* 0x19 */ s8 checkpoint; /* 0x19 */ s16 unk1A; /* 0x19 */ s32 unk1C; } Object_Weapon; @@ -1131,7 +1136,7 @@ typedef struct Object_Racer { /* 0x1F7 */ u8 transparency; /* 0x290 */ u8 indicator_type; /* 0x291 */ s8 indicator_timer; - /* 0x1FA */ s8 unk1FA; + /* 0x1FA */ s8 drifting; /* 0x1FB */ s8 unk1FB; /* 0x1FC */ u8 unk1FC; /* 0x1FD */ u8 unk1FD; @@ -1139,7 +1144,7 @@ typedef struct Object_Racer { /* 0x1FF */ u8 unk1FF; /* 0x200 */ s8 transitionTimer; /* 0x201 */ s8 unk201; - /* 0x202 */ s8 unk202; + /* 0x202 */ s8 silverCoinCount; /* 0x203 */ s8 boostType; /* 0x204 */ s16 unk204; /* 0x206 */ s16 unk206; @@ -1347,6 +1352,15 @@ typedef struct Object_Fireball_Octoweapon { s32 unk1C; } Object_Fireball_Octoweapon; +typedef struct Object_AnimatedObject { + u8 pad0[0x28]; + s16 unk28; + u8 pad2A[0xC]; + s16 unk36; + u8 pad38[0x2]; + s8 unk3A; +} Object_AnimatedObject; + typedef struct Object_64 { union { Object_Laser laser; @@ -1394,6 +1408,7 @@ typedef struct Object_64 { Object_Log log; Object_Fireball_Octoweapon fireball_octoweapon; Object_LaserGun lasergun; + Object_AnimatedObject animatedObject; }; } Object_64; @@ -1409,6 +1424,11 @@ typedef struct Object_68 { /* 0x1F */ s8 unk1F; /* 0x20 */ s8 unk20; /* 0x21 */ s8 unk21; + /* 0x22 */ s16 unk22; + /* 0x24 */ s32 unk24; + /* 0x28 */ s32 unk28; + /* 0x2C */ s32 unk2C; + /* 0x30 */ s32 unk30; } Object_68; /* Size: 0x20 bytes */ @@ -1433,7 +1453,7 @@ typedef struct ObjectTransform { /* Size: 0x44 bytes */ typedef struct ObjectSegment { /* 0x0000 */ ObjectTransform trans; - /* 0x0018 */ s16 unk18; + /* 0x0018 */ s16 animFrame; /* 0x001A */ s16 unk1A; /* 0x001C */ f32 x_velocity; /* 0x0020 */ f32 y_velocity; @@ -1483,7 +1503,7 @@ typedef struct Object { /* 0x0044 */ Vertex *unk44; /* 0x0048 */ s16 behaviorId; /* 0x004A */ s16 unk4A; - /* 0x004C */ Object_4C *unk4C; //player + 0x318 + /* 0x004C */ ObjectInteraction *interactObj; //player + 0x318 /* 0x0050 */ Object_50 *unk50; //player + 0x2F4 /* 0x0054 */ Object_54 *unk54; //player + 0x2C0 /* 0x0058 */ void *unk58; //player + 0x304 diff --git a/lib/src/mips1/al/csplayer.c b/lib/src/mips1/al/csplayer.c index f6b9468b..218c219f 100644 --- a/lib/src/mips1/al/csplayer.c +++ b/lib/src/mips1/al/csplayer.c @@ -64,7 +64,7 @@ void alCSPNew(ALCSPlayer *seqp, ALSeqpConfig *c) */ seqp->maxChannels = c->maxChannels; seqp->chanState = alHeapAlloc(hp, c->maxChannels, sizeof(ALChanState)+4); //TODO: ALChanState likely has some added values as well - __initChanState((ALCSPlayer*)seqp); /* sct 11/6/95 */ + __initChanState((void *) seqp); /* sct 11/6/95 */ /* * init the voice state array @@ -114,12 +114,12 @@ ALMicroTime __CSPVoiceHandler(void *node) switch (seqp->nextEvent.type) { case (AL_SEQ_REF_EVT): - __CSPHandleNextSeqEvent(seqp); + __CSPHandleNextSeqEvent((void *) seqp); break; case (AL_SEQP_API_EVT): evt.type = AL_SEQP_API_EVT; - alEvtqPostEvent(&seqp->evtq, (ALEvent *)&evt, seqp->frameTime); + alEvtqPostEvent(&seqp->evtq, (ALEvent *) &evt, seqp->frameTime); break; case (AL_NOTE_END_EVT): @@ -127,15 +127,15 @@ ALMicroTime __CSPVoiceHandler(void *node) alSynStopVoice(seqp->drvr, voice); alSynFreeVoice(seqp->drvr, voice); - vs = (ALVoiceState *)voice->clientPrivate; + vs = (ALVoiceState *) voice->clientPrivate; if(vs->flags) - __seqpStopOsc((ALSeqPlayer*)seqp,vs); - __unmapVoice((ALSeqPlayer*)seqp, voice); + __seqpStopOsc((ALSeqPlayer *) seqp,vs); + __unmapVoice((ALSeqPlayer *) seqp, voice); break; case (AL_SEQP_ENV_EVT): voice = seqp->nextEvent.msg.vol.voice; - vs = (ALVoiceState *)voice->clientPrivate; + vs = (ALVoiceState *) voice->clientPrivate; if(vs->envPhase == AL_PHASE_ATTACK) vs->envPhase = AL_PHASE_DECAY; @@ -143,15 +143,15 @@ ALMicroTime __CSPVoiceHandler(void *node) delta = seqp->nextEvent.msg.vol.delta; vs->envEndTime = seqp->curTime + delta; vs->envGain = seqp->nextEvent.msg.vol.vol; - alSynSetVol(seqp->drvr, voice, __vsVol(vs, (ALSeqPlayer*)seqp), delta); + alSynSetVol(seqp->drvr, voice, __vsVol(vs, (ALSeqPlayer *) seqp), delta); break; case (AL_TREM_OSC_EVT): vs = seqp->nextEvent.msg.osc.vs; oscState = seqp->nextEvent.msg.osc.oscState; delta = (*seqp->updateOsc)(oscState,&oscValue); - vs->tremelo = (u8)oscValue; - alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs,(ALSeqPlayer*)seqp), + vs->tremelo = (u8) oscValue; + alSynSetVol(seqp->drvr, &vs->voice, __vsVol(vs,(ALSeqPlayer *) seqp), __vsDelta(vs,seqp->curTime)); evt.type = AL_TREM_OSC_EVT; evt.msg.osc.vs = vs; @@ -176,11 +176,11 @@ ALMicroTime __CSPVoiceHandler(void *node) case (AL_SEQP_MIDI_EVT): case (AL_CSP_NOTEOFF_EVT): /* nextEvent is a note off midi message */ - __CSPHandleMIDIMsg(seqp, &seqp->nextEvent); + __CSPHandleMIDIMsg((void *) seqp, &seqp->nextEvent); break; case (AL_SEQP_META_EVT): - __CSPHandleMetaMsg(seqp, &seqp->nextEvent); + __CSPHandleMetaMsg((void *) seqp, &seqp->nextEvent); break; case (AL_SEQP_VOL_EVT): @@ -188,7 +188,7 @@ ALMicroTime __CSPVoiceHandler(void *node) for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { alSynSetVol(seqp->drvr, &vs->voice, - __vsVol(vs, (ALSeqPlayer*)seqp), + __vsVol(vs, (ALSeqPlayer *) seqp), __vsDelta(vs, seqp->curTime)); } break; @@ -197,7 +197,7 @@ ALMicroTime __CSPVoiceHandler(void *node) if (seqp->state != AL_PLAYING) { seqp->state = AL_PLAYING; - __CSPPostNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */ + __CSPPostNextSeqEvent((void *) seqp); /* seqp must be AL_PLAYING before we call this routine. */ } break; @@ -219,8 +219,8 @@ ALMicroTime __CSPVoiceHandler(void *node) alSynStopVoice(seqp->drvr, &vs->voice); alSynFreeVoice(seqp->drvr, &vs->voice); if(vs->flags) - __seqpStopOsc((ALSeqPlayer*)seqp,vs); - __unmapVoice((ALSeqPlayer*)seqp, &vs->voice); + __seqpStopOsc((ALSeqPlayer *) seqp,vs); + __unmapVoice((ALSeqPlayer *) seqp, &vs->voice); } seqp->state = AL_STOPPED; @@ -258,8 +258,8 @@ ALMicroTime __CSPVoiceHandler(void *node) occurring prior to KILL_TIME. */ for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) { - if (__voiceNeedsNoteKill ((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME)) - __seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME); + if (__voiceNeedsNoteKill ((ALSeqPlayer *) seqp, &vs->voice, KILL_TIME)) + __seqpReleaseVoice((ALSeqPlayer *) seqp, &vs->voice, KILL_TIME); } seqp->state = AL_STOPPING; @@ -282,7 +282,7 @@ ALMicroTime __CSPVoiceHandler(void *node) seqp->target = seqp->nextEvent.msg.spseq.seq; //__setUsptFromTempo (seqp, 500000.0); if (seqp->bank) - __initFromBank((ALSeqPlayer *)seqp, seqp->bank); + __initFromBank((ALSeqPlayer *) seqp, seqp->bank); break; case (AL_SEQP_BANK_EVT): @@ -292,7 +292,7 @@ ALMicroTime __CSPVoiceHandler(void *node) #endif seqp->bank = seqp->nextEvent.msg.spbank.bank; - __initFromBank((ALSeqPlayer *)seqp, seqp->bank); + __initFromBank((ALSeqPlayer *) seqp, seqp->bank); break; /* sct 11/6/95 - these events should now be handled by __CSPHandleNextSeqEvent */ @@ -347,12 +347,12 @@ void __CSPHandleNextSeqEvent(ALCSPlayer *seqp) switch (evt.type) { case AL_SEQ_MIDI_EVT: - __CSPHandleMIDIMsg(seqp, &evt); + __CSPHandleMIDIMsg((void *) seqp, &evt); __CSPPostNextSeqEvent(seqp); break; case AL_TEMPO_EVT: - __CSPHandleMetaMsg(seqp, &evt); + __CSPHandleMetaMsg((void *) seqp, &evt); __CSPPostNextSeqEvent(seqp); break; @@ -792,7 +792,6 @@ GLOBAL_ASM("lib/asm/non_matchings/csplayer/__CSPHandleMIDIMsg.s") void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event) { ALTempoEvent *tevt = &event->msg.tempo; - ALEvent evt; s32 tempo; s32 oldUspt; u32 ticks; @@ -806,19 +805,19 @@ void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event) { oldUspt = seqp->uspt; tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0); - __setUsptFromTempo (seqp, (f32)tempo); /* sct 1/8/96 */ + __setUsptFromTempo (seqp, (f32) tempo); /* sct 1/8/96 */ - thisNode = (ALEventListItem*)seqp->evtq.allocList.next; + thisNode = (ALEventListItem *) seqp->evtq.allocList.next; while(thisNode) { curDelta += thisNode->delta; - nextNode = (ALEventListItem*)thisNode->node.next; + nextNode = (ALEventListItem *) thisNode->node.next; if(thisNode->evt.type == AL_CSP_NOTEOFF_EVT) { - alUnlink((ALLink*)thisNode); + alUnlink((ALLink *) thisNode); if(firstTemp) - alLink((ALLink*)thisNode,(ALLink*)firstTemp); + alLink((ALLink *) thisNode,(ALLink *) firstTemp); else { thisNode->node.next = 0; @@ -839,7 +838,7 @@ void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event) thisNode = firstTemp; while(thisNode) { - nextNode = (ALEventListItem*)thisNode->node.next; + nextNode = (ALEventListItem *) thisNode->node.next; ticks = thisNode->delta/oldUspt; thisNode->delta = ticks * seqp->uspt; __CSPRepostEvent(&seqp->evtq,thisNode); @@ -866,11 +865,11 @@ void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item) } else { - nextItem = (ALEventListItem *)node->next; + nextItem = (ALEventListItem *) node->next; if (item->delta < nextItem->delta) { nextItem->delta -= item->delta; - alLink((ALLink *)item, node); + alLink((ALLink *) item, node); break; } item->delta -= nextItem->delta; @@ -882,7 +881,7 @@ void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item) void __setUsptFromTempo(ALCSPlayer *seqp, f32 tempo) { if (seqp->target) - seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt); + seqp->uspt = (s32) ((f32) tempo * seqp->target->qnpt); else seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */ } diff --git a/src/camera.c b/src/camera.c index 664aaa70..d2fc8f85 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1055,7 +1055,7 @@ s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Obj } else { sp34 = gActiveCameraStack[gActiveCameraID + 4].trans.z_rotation + obj->segment.trans.z_rotation; } - var_s2 = obj->segment.unk18; + var_s2 = obj->segment.animFrame; D_80120D1C++; f32_matrix_from_rotation_and_scale((f32 (*)[4]) D_80120D70[D_80120D1C], sp34, obj->segment.trans.scale, gVideoAspectRatio); f32_matrix_to_s16_matrix(D_80120D70[D_80120D1C], *mtx); @@ -1105,7 +1105,7 @@ void func_80068BF4(Gfx **dList, MatrixS **mtx, Vertex **vtx, ObjectSegment *segm temp_v1->a = 255; gDkrVertices((*dList)++, OS_PHYSICAL_TO_K0(*vtx), (((s32)OS_PHYSICAL_TO_K0(*vtx)) & 6), 13); (*vtx)++; // Can't be done in the macro? - index = segment->unk18; + index = segment->animFrame; D_80120D1C ++; D_80120CF0.y_rotation = -segment->trans.y_rotation; D_80120CF0.x_rotation = -segment->trans.x_rotation; diff --git a/src/game.c b/src/game.c index da419453..09fc79a1 100644 --- a/src/game.c +++ b/src/game.c @@ -181,7 +181,7 @@ s32 gNMIMesgBuf[8]; /******************************/ -#ifdef NON_MATCHING +#ifdef NON_EQUIVALENT // Only has regalloc issues. void func_8006A6B0(void) { s32 i; @@ -871,7 +871,7 @@ void init_game(void) { sControllerStatus = init_controllers(); func_8007AC70(); // Should be very similar to func_8005F850 func_8005F850(); // Matched - func_8000BF8C(); + allocate_object_pools(); func_800B5E88(); func_800598D0(); init_particle_assets(); diff --git a/src/game_ui.c b/src/game_ui.c index 94f8b307..93a0ebfd 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -1984,7 +1984,7 @@ void func_800AAFD0(ObjectModel *objModel) { for (i = 0; i < numBatches; i++) { flags = objModel->batches[i].flags; - if (!(flags & 0x100)) { + if (!(flags & RENDER_Z_UPDATE)) { vertOffset = objModel->batches[i].verticesOffset; triOffset = objModel->batches[i].facesOffset; numVerts = objModel->batches[i + 1].verticesOffset - vertOffset; @@ -1998,7 +1998,7 @@ void func_800AAFD0(ObjectModel *objModel) { } else { texPtr = objModel->textures[texIndex].texture; } - func_8007B4C8(&gHUDCurrDisplayList, texPtr, flags & ~2); + load_and_set_texture_no_offset(&gHUDCurrDisplayList, texPtr, flags & ~RENDER_Z_COMPARE); gSPVertexDKR(gHUDCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); if (texPtr == NULL) { textureEnabled = TRIN_DISABLE_TEXTURE; diff --git a/src/memory.c b/src/memory.c index f37abc3a..6b4dea4d 100644 --- a/src/memory.c +++ b/src/memory.c @@ -69,56 +69,48 @@ MemoryPoolSlot *new_sub_memory_pool(s32 poolDataSize, s32 numSlots) { MemoryPoolSlot *newPool; size = poolDataSize + (numSlots * sizeof(MemoryPoolSlot)); - slots = (MemoryPoolSlot *)allocate_from_main_pool_safe(size, COLOUR_TAG_WHITE); + slots = (MemoryPoolSlot *) allocate_from_main_pool_safe(size, COLOUR_TAG_WHITE); newPool = new_memory_pool(slots, size, numSlots); set_status_register_flags(temp); return newPool; } -#ifdef NON_EQUIVALENT -//Match found in Dinosaur Planet, and it's *really* close, but not yet there. +/** + * Create and initialise a memory pool in RAM that will act as the place where arbitrary allocations can go. + * Will return the location of the first free slot in that pool. +*/ MemoryPoolSlot *new_memory_pool(MemoryPoolSlot *slots, s32 poolSize, s32 numSlots) { MemoryPoolSlot *firstSlot; + s32 poolCount; MemoryPool *pool; s32 i; - s32 len; - - //The comma seperation seems to generate a better match - len = gNumberOfMemoryPools++, pool = &gMemoryPools[len]; - - len = numSlots * sizeof(MemoryPoolSlot); - pool->maxNumSlots = numSlots; - pool->curNumSlots = 0; - pool->slots = slots; - pool->size = poolSize; - + + poolCount = ++gNumberOfMemoryPools; \ + gMemoryPools[poolCount].maxNumSlots = numSlots; + gMemoryPools[poolCount].curNumSlots = 0; + gMemoryPools[poolCount].slots = slots; + gMemoryPools[poolCount].size = poolSize; + pool = &gMemoryPools[poolCount++]; firstSlot = slots; - + if(0){} if (!pool->maxNumSlots){} // Fakematch for (i = 0; i < pool->maxNumSlots; i++) { firstSlot->index = i; firstSlot++; } - firstSlot = &pool->slots[0]; slots += numSlots; - if (((s32)slots & 0xF) != 0) { - firstSlot->data = _ALIGN16(slots); + if ((s32) slots & 0xF) { + firstSlot->data = (u8 *) _ALIGN16(slots); } else { - firstSlot->data = slots; + firstSlot->data = (u8 *) slots; } - - firstSlot->size = poolSize - len; + firstSlot->size = poolSize - (numSlots * sizeof(MemoryPoolSlot)); firstSlot->flags = 0; firstSlot->prevIndex = -1; firstSlot->nextIndex = -1; - pool->curNumSlots++; - return pool->slots; } -#else -GLOBAL_ASM("asm/non_matchings/memory/new_memory_pool.s") -#endif /** * Reserves and returns memory from the main memory pool. Has 2 assert checks. diff --git a/src/memory.h b/src/memory.h index 8f21e877..64fea418 100644 --- a/src/memory.h +++ b/src/memory.h @@ -96,9 +96,9 @@ u8 *align4(u8 *address); void print_memory_colour_tags(void); void render_memory_colour_tags(void); void func_80071CE8(void); +MemoryPoolSlot *new_memory_pool(MemoryPoolSlot *slots, s32 poolSize, s32 numSlots); MemoryPoolSlot *allocate_from_memory_pool(s32 memoryPoolIndex, s32 size, u32 colorTag); // Non Matching -MemoryPoolSlot *new_memory_pool(MemoryPoolSlot *slots, s32 poolSize, s32 numSlots); // Non Matching void free_memory_pool_slot(s32 poolIndex, s32 slotIndex); // Non Matching void *allocate_at_address_in_main_pool(s32 size, u8 *address, u32 colorTag); // Non Matching void free_slot_containing_address(u8 *address); // Non Matching diff --git a/src/menu.c b/src/menu.c index d12d53cd..e05fc6ac 100644 --- a/src/menu.c +++ b/src/menu.c @@ -8407,7 +8407,7 @@ GLOBAL_ASM("asm/non_matchings/menu/func_8009CA60.s") */ void render_track_selection_viewport_border(ObjectModel *objMdl) { UNUSED s32 pad1[4]; - s32 sp5C; + s32 flags; UNUSED s32 pad2[4]; TextureHeader *tex; Triangle *tris; @@ -8416,13 +8416,13 @@ void render_track_selection_viewport_border(ObjectModel *objMdl) { Vertex *verts; s32 numVerts; s32 numTris; - s32 var_a3; + s32 texOffset; s32 texEnabled; s32 i; - sp5C = 9; + flags = RENDER_FOG_ACTIVE | RENDER_ANTI_ALIASING; if (sMenuGuiOpacity != 255) { - sp5C = 13; + flags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_ANTI_ALIASING; } for (i = 0; i < objMdl->numberOfBatches; i++) { if (!(objMdl->batches[i].flags & 0x100)) { @@ -8436,13 +8436,13 @@ void render_track_selection_viewport_border(ObjectModel *objMdl) { if (objMdl->batches[i].textureIndex == -1) { tex = NULL; texEnabled = FALSE; - var_a3 = 0; + texOffset = 0; } else { tex = objMdl->textures[objMdl->batches[i].textureIndex].texture; texEnabled = TRUE; - var_a3 = objMdl->batches[i].unk7 << 14; + texOffset = objMdl->batches[i].unk7 << 14; } - load_and_set_texture(&sMenuCurrDisplayList, tex, sp5C, var_a3); + load_and_set_texture(&sMenuCurrDisplayList, tex, flags, texOffset); gSPVertexDKR(sMenuCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), numVerts, 0); gSPPolygon(sMenuCurrDisplayList++, OS_PHYSICAL_TO_K0(tris), numTris, texEnabled); diff --git a/src/object_functions.c b/src/object_functions.c index 6a141f9d..7b56bffb 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -141,12 +141,12 @@ void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry) { obj->segment.unk3A = entry->unk8; obj->segment.trans.y_rotation = entry->unkA << 6 << 4; if (entry->unkB) { - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 1; - obj->unk4C->unk10 = 20; - obj->unk4C->unk12 = 0; - obj->unk4C->unk16 = -5; - obj->unk4C->unk17 = entry->unkB; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 1; + obj->interactObj->unk10 = 20; + obj->interactObj->unk12 = 0; + obj->interactObj->unk16 = -5; + obj->interactObj->unk17 = entry->unkB; } if (obj->segment.unk3A >= obj->segment.header->numberOfModelIds) { obj->segment.unk3A = 0; @@ -155,18 +155,18 @@ void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry) { obj->unk7C.word = 0; } -void obj_loop_scenery(Object *obj, s32 speed) { +void obj_loop_scenery(Object *obj, s32 updateRate) { Object78_80033DD0 *obj78; s32 temp_v0; - if (obj->unk4C != NULL) { + if (obj->interactObj != NULL) { obj78 = (Object78_80033DD0 *) &obj->action; if (obj->unk7C.half.upper > 0) { - obj78->unk4 -= speed; + obj78->unk4 -= updateRate; } - if ((obj->unk4C->unk14 & 0x40) && ((s32) obj78->unk4 <= 0)) { + if ((obj->interactObj->unk14 & 0x40) && ((s32) obj78->unk4 <= 0)) { func_80009558(SOUND_TWANG, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); - obj78->unk0 = (s32*) obj->unk4C->unk0; + obj78->unk0 = (s32*) obj->interactObj->obj; obj78->unk6 = 1820; obj78->unk4 = 10; if (get_number_of_active_players() < 2) { @@ -189,8 +189,8 @@ void obj_loop_scenery(Object *obj, s32 speed) { } void obj_init_fireball_octoweapon(Object *obj, UNUSED LevelObjectEntry_Fireball_Octoweapon *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; } /** @@ -206,7 +206,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { Object_Fireball_Octoweapon *weapon; Object_Racer *racer; UNUSED s32 pad2[6]; - Object_4C *obj4C; + ObjectInteraction *obj4C; s32 temp; f32 sp4C; @@ -257,12 +257,12 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { } } } - obj->segment.unk18 += updateRate * 10; + obj->segment.animFrame += updateRate * 10; weapon = (Object_Fireball_Octoweapon *) obj->unk64; - obj4C = obj->unk4C; - if ((obj4C->unk0)) { - if ((obj4C->unk13 < 60)) { - someObj = obj4C->unk0; + obj4C = obj->interactObj; + if ((obj4C->obj)) { + if ((obj4C->distance < 60)) { + someObj = obj4C->obj; if((someObj->segment.header->behaviorId == BHV_RACER)) { racer = (Object_Racer *) someObj->unk64; if (racer->playerIndex != PLAYER_COMPUTER) { @@ -325,8 +325,8 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { */ void obj_init_lasergun(Object *obj, LevelObjectEntry_Lasergun *entry) { Object_LaserGun *laserGun; - obj->unk4C->unk14 = 34; - obj->unk4C->unk11 = 0; + obj->interactObj->unk14 = 34; + obj->interactObj->unk11 = 0; laserGun = &obj->unk64->lasergun; laserGun->targeting = entry->targeting; laserGun->fireRate = entry->fireRate; @@ -352,17 +352,17 @@ void obj_loop_lasergun(Object *obj, s32 updateRate) { f32 diffX; f32 diffZ; f32 diffY; - Object_4C *obj4C; + ObjectInteraction *obj4C; LevelObjectEntryCommon spawnObj; lasergun = (Object_LaserGun *) obj->unk64; if (lasergun->fireTimer > 0) { lasergun->fireTimer -= updateRate; } else { - obj4C = obj->unk4C; - if (lasergun->unk11 >= obj4C->unk13) { + obj4C = obj->interactObj; + if (lasergun->unk11 >= obj4C->distance) { if (lasergun->targeting) { - racerObj = obj4C->unk0; + racerObj = obj4C->obj; if (racerObj != NULL && racerObj->behaviorId == BHV_RACER) { diffX = obj->segment.trans.x_position - racerObj->segment.trans.x_position; diffY = obj->segment.trans.y_position - racerObj->segment.trans.y_position; @@ -410,8 +410,8 @@ void obj_loop_lasergun(Object *obj, s32 updateRate) { } void obj_init_laserbolt(Object *obj, UNUSED LevelObjectEntry_Laserbolt *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; } typedef struct Object_7C_80034860 { @@ -419,8 +419,8 @@ typedef struct Object_7C_80034860 { s16 unkC; } Object_7C_80034860; -void obj_loop_laserbolt(Object *obj, s32 speed) { - f32 sp5C; +void obj_loop_laserbolt(Object *obj, s32 updateRate) { + f32 updateRateF; Object *obj4C_obj; @@ -437,37 +437,37 @@ void obj_loop_laserbolt(Object *obj, s32 speed) { sp4F = FALSE; - sp5C = speed; + updateRateF = updateRate; if (osTvType == TV_TYPE_PAL) { - sp5C *= 1.2; + updateRateF *= 1.2; } - sp40 = obj->segment.trans.x_position + (obj->segment.x_velocity * sp5C); - sp44 = obj->segment.trans.y_position + (obj->segment.y_velocity * sp5C); - sp48 = obj->segment.trans.z_position + (obj->segment.z_velocity * sp5C); + sp40 = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); + sp44 = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); + sp48 = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); sp3C = 9.0f; func_80031130(1, &obj->segment.trans.x_position, &sp40, -1); sp38 = FALSE; func_80031600(&obj->segment.trans.x_position, &sp40, &sp3C, &sp4E, 1, &sp38); if (sp38) { - obj->segment.x_velocity = (sp40 - obj->segment.trans.x_position) / sp5C; - obj->segment.y_velocity = (sp44 - obj->segment.trans.y_position) / sp5C; - obj->segment.z_velocity = (sp48 - obj->segment.trans.z_position) / sp5C; + obj->segment.x_velocity = (sp40 - obj->segment.trans.x_position) / updateRateF; + obj->segment.y_velocity = (sp44 - obj->segment.trans.y_position) / updateRateF; + obj->segment.z_velocity = (sp48 - obj->segment.trans.z_position) / updateRateF; } - func_80011570(obj, obj->segment.x_velocity * sp5C, obj->segment.y_velocity * sp5C, obj->segment.z_velocity * sp5C); + func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); if (sp38) { func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, obj->segment.trans.z_position, 44, 0, 0.2, 0); sp4F = TRUE; } if (obj->unk78 > 0) { - obj->unk78 -= speed; + obj->unk78 -= updateRate; } else { sp4F = TRUE; } - if (obj->unk4C->unk13 < 80) { - obj4C_obj = (Object*)obj->unk4C->unk0; + if (obj->interactObj->distance < 80) { + obj4C_obj = (Object*)obj->interactObj->obj; if (obj4C_obj && (obj4C_obj->behaviorId == 1)) { obj4C_obj64 = &obj4C_obj->unk64->laser; sp4F = TRUE; @@ -497,8 +497,8 @@ void obj_init_torch_mist(Object *obj, LevelObjectEntry_Torch_Mist *entry) { obj->unk78 = entry->unk8; } -void obj_loop_torch_mist(Object *obj, s32 speed) { - obj->segment.unk18 += obj->unk78 * speed; +void obj_loop_torch_mist(Object *obj, s32 updateRate) { + obj->segment.animFrame += obj->unk78 * updateRate; } void obj_init_effectbox(UNUSED Object *obj, UNUSED LevelObjectEntry_EffectBox *entry) { @@ -507,7 +507,7 @@ void obj_init_effectbox(UNUSED Object *obj, UNUSED LevelObjectEntry_EffectBox *e #ifdef NON_MATCHING // Has regalloc issues -void obj_loop_effectbox(Object *obj, UNUSED s32 speed) { +void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { Object **objList; Object_EffectBox *curObj64; s32 numberOfObjects; @@ -558,8 +558,8 @@ GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_effectbox.s") #endif void obj_init_trophycab(Object *obj, LevelObjectEntry_TrophyCab *entry) { - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 2; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 2; obj->segment.trans.y_rotation = entry->rotation << 6 << 4; // Not sure about the values here. } @@ -674,10 +674,10 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { } void obj_init_collectegg(Object *obj, UNUSED LevelObjectEntry_CollectEgg *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } void obj_loop_collectegg(Object *obj, s32 updateRate) { @@ -686,14 +686,14 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { Object_Racer *racer; f32 sp40[3]; f32 sp3C; - f32 speed; + f32 updateRateF; s32 sp34; s8 sp33; egg = (Object_CollectEgg *) obj->unk64; - speed = updateRate; + updateRateF = updateRate; if (osTvType == TV_TYPE_PAL) { - speed *= 1.2; + updateRateF *= 1.2; } switch (egg->unkB) { case 0: @@ -701,17 +701,17 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { break; case 2: obj->segment.trans.unk6 &= 0xBFFF; - sp40[0] = obj->segment.trans.x_position + (obj->segment.x_velocity * speed); - sp40[1] = obj->segment.trans.y_position + (obj->segment.y_velocity * speed); - sp40[2] = obj->segment.trans.z_position + (obj->segment.z_velocity * speed); + sp40[0] = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); + sp40[1] = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); + sp40[2] = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); sp3C = 9.0f; func_80031130(1, &obj->segment.trans.x_position, sp40, -1); sp34 = 0; sp33 = 0; func_80031600(&obj->segment.trans.x_position, sp40, &sp3C, &sp33, 1, &sp34); - obj->segment.x_velocity = (sp40[0] - obj->segment.trans.x_position) / speed; - obj->segment.y_velocity = (sp40[1] - obj->segment.trans.y_position) / speed; - obj->segment.z_velocity = (sp40[2] - obj->segment.trans.z_position) / speed; + obj->segment.x_velocity = (sp40[0] - obj->segment.trans.x_position) / updateRateF; + obj->segment.y_velocity = (sp40[1] - obj->segment.trans.y_position) / updateRateF; + obj->segment.z_velocity = (sp40[2] - obj->segment.trans.z_position) / updateRateF; obj->segment.trans.x_position = sp40[0]; obj->segment.trans.y_position = sp40[1]; obj->segment.trans.z_position = sp40[2]; @@ -771,7 +771,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { racer->raceFinished = TRUE; } } - obj->segment.unk18 = 0x80; + obj->segment.animFrame = 128; break; } } @@ -779,7 +779,7 @@ void obj_loop_collectegg(Object *obj, s32 updateRate) { void obj_init_eggcreator(UNUSED Object *obj, UNUSED LevelObjectEntry_EggCreator *entry) { } -void obj_loop_eggcreator(Object *obj, UNUSED s32 speed) { +void obj_loop_eggcreator(Object *obj, UNUSED s32 updateRate) { unk8003564C sp20; Object *someObj; @@ -810,21 +810,21 @@ void obj_init_lighthouse_rocketsignpost(Object *obj, LevelObjectEntry_Lighthouse if (obj->segment.unk3A >= obj->segment.header->numberOfModelIds) { obj->segment.unk3A = 0; } - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } -void obj_loop_rocketsignpost(Object *obj, UNUSED s32 speed) { +void obj_loop_rocketsignpost(Object *obj, UNUSED s32 updateRate) { Object *playerObj; - Object_4C *obj4C; + ObjectInteraction *obj4C; playerObj = get_racer_object(0); if (playerObj != NULL) { - obj4C = obj->unk4C; - if (obj4C->unk13 < 0xC8) { - if (playerObj == obj4C->unk0) { + obj4C = obj->interactObj; + if (obj4C->distance < 0xC8) { + if (playerObj == obj4C->obj) { // Detect if the player honks or slams into the signpost. if ((get_buttons_pressed_from_player(PLAYER_ONE) & Z_TRIG) || playerObj == obj->unk5C->unk100) { func_8006F29C(); @@ -832,7 +832,7 @@ void obj_loop_rocketsignpost(Object *obj, UNUSED s32 speed) { } } } - obj->unk4C->unk13 = 0xFF; + obj->interactObj->distance = 0xFF; } void obj_init_airzippers_waterzippers(Object *obj, LevelObjectEntry_AirZippers_WaterZippers *entry) { @@ -850,17 +850,17 @@ void obj_init_airzippers_waterzippers(Object *obj, LevelObjectEntry_AirZippers_W if (obj->segment.unk3A >= objHeader->numberOfModelIds) { obj->segment.unk3A = 0; } - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; if (get_filtered_cheats() & CHEAT_TURN_OFF_ZIPPERS) { gParticlePtrList_addObject(obj); } } -void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 speed) { +void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 updateRate) { Object *curRacerObj; Object_Racer *racer; f32 xDiff; @@ -875,7 +875,7 @@ void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 speed) { } else { obj->segment.trans.unk6 &= 0xBFFF; } - if ((obj->unk4C->unk13 < 100) && !(obj->segment.trans.unk6 & 0x4000)) { + if ((obj->interactObj->distance < 100) && !(obj->segment.trans.unk6 & 0x4000)) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { curRacerObj = racerObjs[i]; @@ -916,18 +916,18 @@ void obj_init_groundzipper(Object *arg0, LevelObjectEntry_GroundZipper *entry) { if (arg0->unk78 > 255) { arg0->unk78 = 255; } - arg0->unk4C->unk14 = 2; - arg0->unk4C->unk11 = 0; - arg0->unk4C->unk10 = 0x14; - arg0->unk4C->unk12 = 0; - arg0->unk4C->unk16 = -0x64; - arg0->unk4C->unk17 = 0x64; + arg0->interactObj->unk14 = 2; + arg0->interactObj->unk11 = 0; + arg0->interactObj->unk10 = 0x14; + arg0->interactObj->unk12 = 0; + arg0->interactObj->unk16 = -0x64; + arg0->interactObj->unk17 = 0x64; if (get_filtered_cheats() & CHEAT_TURN_OFF_ZIPPERS) { gParticlePtrList_addObject(arg0); } } -void obj_loop_groundzipper(Object *obj, UNUSED s32 speed) { +void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { Object *curRacerObj; Object_Racer *racer; f32 xDiff; @@ -940,7 +940,7 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 speed) { 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->unk4C->unk13 < obj->unk78) { + if ((s32) obj->interactObj->distance < obj->unk78) { racerObjs = get_racer_objects(&numObjects); for (i = 0; i < numObjects; i++) { curRacerObj = racerObjs[i]; @@ -972,26 +972,26 @@ void obj_init_unknown58(Object *obj, UNUSED LevelObjectEntry_Unknown58 *entry) { obj->unk7C.word = (s32) obj->segment.header; } -void obj_loop_unknown58(Object *obj, s32 speed) { +void obj_loop_unknown58(Object *obj, s32 updateRate) { Object *someObj; Object *someOtherObj; Object_UnkId58 *someOtherObj64; Object_60 *obj60; obj->segment.unk3B = 0; - obj->segment.unk18 = 0x28; + obj->segment.animFrame = 40; if (func_8001139C() == 0) { - obj->unk78 += speed; + obj->unk78 += updateRate; } set_ghost_position_and_rotation(obj); - func_800AFC3C(obj, speed); + func_800AFC3C(obj, updateRate); someOtherObj = get_racer_object(0); someOtherObj64 = &someOtherObj->unk64->unkid58; obj60 = obj->unk60; if (obj60->unk0 == 1) { s8 temp = someOtherObj64->unk1D6; - if ((temp == 1) || (temp == 2)) { - someObj = (Object *)obj60->unk4; + if (temp == 1 || temp == 2) { + someObj = (Object *) obj60->unk4; someObj->segment.trans.y_rotation = 0x4000; someObj->segment.unk3A++; someObj->segment.unk3A &= 1; @@ -1012,7 +1012,7 @@ void obj_init_characterflag(Object *obj, LevelObjectEntry_CharacterFlag *entry) obj->segment.trans.scale = (f32)(obj->segment.header->scale * phi_f0); } -void obj_loop_characterflag(Object *obj, UNUSED s32 speed) { +void obj_loop_characterflag(Object *obj, UNUSED s32 updateRate) { s32 temp_t4; s32 temp_t5; Object *someObj; @@ -1048,10 +1048,10 @@ GLOBAL_ASM("asm/non_matchings/unknown_032760/func_80036040.s") void obj_init_stopwatchman(Object *obj, UNUSED LevelObjectEntry_StopWatchMan *entry) { Object_TT *temp; - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; + obj->interactObj->unk12 = 0; temp = &obj->unk64->tt; temp->unkD = 0xFF; temp->unk0 = 0.0f; @@ -1085,7 +1085,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { updateRateF *= 1.2; } tt = (Object_NPC *) obj->unk64; - if (obj->segment.unk18 == 0) { + if (obj->segment.animFrame == 0) { if (tt->unk4 > 1.0) { tt->unk4 = 0.0f; } @@ -1115,7 +1115,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { index = get_buttons_pressed_from_player(PLAYER_ONE); if (obj->action == TT_MODE_ROAM && distance < 300.0 && obj->unk7C.word == 0) { if (angleDiff > -0x2000 && angleDiff < 0x2000) { - if ((obj->unk4C->unk14 & 8 && racerObj == obj->unk4C->unk0) || index & Z_TRIG) { + if ((obj->interactObj->unk14 & 8 && racerObj == obj->interactObj->obj) || index & Z_TRIG) { if (index & Z_TRIG) { play_char_horn_sound(racerObj, racer); } @@ -1266,7 +1266,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { if (obj->action != TT_MODE_ROAM) { D_8011D4D0 = obj->segment.trans.y_position; } - obj->segment.unk18 = 1.0 * tt->unk4; + obj->segment.animFrame = 1.0 * tt->unk4; func_80061C0C(obj); if (0) { } // Fakematch if (obj->unk7C.word > 0) { @@ -1299,15 +1299,15 @@ void obj_init_lavaspurt(Object *obj, LevelObjectEntry_LavaSpurt *entry) { obj->unk7C.word = entry->unk8; } -void obj_loop_lavaspurt(Object *obj, s32 speed) { +void obj_loop_lavaspurt(Object *obj, s32 updateRate) { if (obj->unk78 > 0) { - obj->unk78 -= speed; + obj->unk78 -= updateRate; obj->segment.trans.unk6 |= 0x4000; } else { obj->segment.trans.unk6 &= ~0x4000; - obj->segment.unk18 += speed * 4; - if (obj->segment.unk18 >= 256) { - obj->segment.unk18 = 0; + obj->segment.animFrame += updateRate * 4; + if (obj->segment.animFrame > 255) { + obj->segment.animFrame = 0; obj->unk78 = get_random_number_from_range(0, 30) + obj->unk7C.word; } } @@ -1317,7 +1317,7 @@ void obj_init_posarrow(Object *obj, UNUSED LevelObjectEntry_PosArrow *entry) { obj->segment.trans.unk6 |= 0x4000; } -void obj_loop_posarrow(Object *obj, UNUSED s32 speed) { +void obj_loop_posarrow(Object *obj, UNUSED s32 updateRate) { Object_PosArrow *someObj64; Object **someObjList; Object *someObj; @@ -1332,7 +1332,7 @@ void obj_loop_posarrow(Object *obj, UNUSED s32 speed) { obj->segment.trans.unk6 &= ~0x4000; someObj64->unk150 = obj; } - obj->segment.unk18 = obj->unk78 * 127; + obj->segment.animFrame = obj->unk78 * 127; } } @@ -1369,7 +1369,7 @@ void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 arg2) // Has minor issues -void obj_loop_animator(Object* obj, s32 speed) { +void obj_loop_animator(Object *obj, s32 updateRate) { Object_Animator* obj64; // 3C s32 sp20; s32 sp1C; @@ -1389,12 +1389,12 @@ void obj_loop_animator(Object* obj, s32 speed) { obj64 = &obj->unk64->animator; - temp = obj64->xSpeedFactor * speed; + temp = obj64->xSpeedFactor * updateRate; obj64->xSpeed += temp << 4; sp20 = obj64->xSpeed >> 4; obj64->xSpeed &= 0xF; - temp2 = obj64->ySpeedFactor * speed; + temp2 = obj64->ySpeedFactor * updateRate; obj64->ySpeed += temp2 << 4; sp1C = obj64->ySpeed >> 4; obj64->ySpeed &= 0xF; @@ -1516,16 +1516,16 @@ void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2 } -void obj_loop_animobject(Object *obj, s32 speed) { - func_8001F460(obj, speed, obj); +void obj_loop_animobject(Object *obj, s32 updateRate) { + func_8001F460(obj, updateRate, obj); } -void obj_loop_dooropener(Object *obj, s32 speed) { +void obj_loop_dooropener(Object *obj, s32 updateRate) { s32 phi_a0; unk80037D08_arg0_64 *sp18; sp18 = (unk80037D08_arg0_64 *) obj->unk64; - phi_a0 = 1 - func_8001F460(obj, speed, obj); + phi_a0 = 1 - func_8001F460(obj, updateRate, obj); if (sp18->unk2A > 0) { phi_a0 = 0; } @@ -1613,11 +1613,11 @@ void obj_loop_wizpigship(Object *wizShipObj, s32 updateRate) { } } -void obj_loop_vehicleanim(Object *obj, s32 speed) { +void obj_loop_vehicleanim(Object *obj, s32 updateRate) { Object_60_800380F8 *obj60; Object *someObj; - func_8001F460(obj, speed, obj); + func_8001F460(obj, updateRate, obj); obj60 = (Object_60_800380F8 *) obj->unk60; if (obj60 != NULL) { if (obj60->unk0 > 0) { @@ -1632,38 +1632,38 @@ void obj_loop_vehicleanim(Object *obj, s32 speed) { } void obj_init_hittester(Object *obj, UNUSED LevelObjectEntry_HitTester *entry) { - obj->unk4C->unk14 = 0x81; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 0x81; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } -void obj_loop_hittester(Object *obj, s32 speed) { - func_8001F460(obj, speed, obj); +void obj_loop_hittester(Object *obj, s32 updateRate) { + func_8001F460(obj, updateRate, obj); } void obj_init_dynamic_lighting_object(Object *obj, UNUSED LevelObjectEntry_DynamicLightingObject *entry) { - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } void obj_init_unknown96(Object *obj, UNUSED LevelObjectEntry_Unknown96 *entry) { - obj->unk4C->unk14 = 0x81; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 0x81; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } void obj_init_snowball(Object *obj, UNUSED LevelObjectEntry_Snowball *entry) { - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } -void obj_loop_snowball(Object *obj, s32 speed) { +void obj_loop_snowball(Object *obj, s32 updateRate) { Object_Snowball *obj64 = &obj->unk64->snowball; if (obj64->unk24 == 0) { if (obj64->unk38 != 0) { @@ -1677,7 +1677,7 @@ void obj_loop_snowball(Object *obj, s32 speed) { update_spatial_audio_position(obj64->soundMask, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); } } - func_8001F460(obj, speed, obj); + func_8001F460(obj, updateRate, obj); } UNUSED void func_80038330(UNUSED s32 arg0, UNUSED s32 arg1) { @@ -1685,12 +1685,12 @@ UNUSED void func_80038330(UNUSED s32 arg0, UNUSED s32 arg1) { GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_char_select.s") -void obj_loop_animcamera(Object *obj, s32 speed) { +void obj_loop_animcamera(Object *obj, s32 updateRate) { s32 temp_v0; s32 phi_v1; Object_AnimCamera *obj64; - temp_v0 = func_8001F460(obj, speed, obj); + temp_v0 = func_8001F460(obj, updateRate, obj); obj->segment.trans.unk6 |= 0x4000; obj64 = &obj->unk64->anim_camera; if (temp_v0 == 0) { @@ -1708,7 +1708,7 @@ void obj_loop_animcamera(Object *obj, s32 speed) { UNUSED void func_800387C0(UNUSED s32 arg0, UNUSED s32 arg1) { } -void obj_loop_animcar(Object *obj, s32 speed) { +void obj_loop_animcar(Object *obj, s32 updateRate) { Object *someObj; s32 temp_v0; temp_v0 = obj->action; @@ -1716,7 +1716,7 @@ void obj_loop_animcar(Object *obj, s32 speed) { if (temp_v0 != 0) { someObj = get_racer_object(temp_v0 - 1); } - obj->unk7C.word = func_8001F460(obj, speed, obj); + obj->unk7C.word = func_8001F460(obj, updateRate, obj); obj->segment.trans.unk6 |= 0x4000; if (obj->unk7C.word == 0 && someObj != NULL) { Object_AnimCar *someObj64 = &someObj->unk64->anim_car; @@ -1726,21 +1726,21 @@ void obj_loop_animcar(Object *obj, s32 speed) { void obj_init_infopoint(Object *obj, LevelObjectEntry_InfoPoint *entry) { if (entry->unk8[1] != 0) { - obj->unk4C->unk14 = 0x21; + obj->interactObj->unk14 = 0x21; } else { - obj->unk4C->unk14 = 0x22; + obj->interactObj->unk14 = 0x22; } - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0xF; - obj->unk4C->unk12 = 0; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0xF; + obj->interactObj->unk12 = 0; obj->unk78 = (entry->unk8[2] << 16) | entry->unk8[0]; // Not sure about the values here. obj->unk7C.word = entry->unk8[1]; obj->segment.trans.y_rotation = entry->unkB << 10; // Not sure about the values here. } -void obj_loop_infopoint(Object *obj, UNUSED s32 speed) { +void obj_loop_infopoint(Object *obj, UNUSED s32 updateRate) { s16 player; - Object_4C *obj4C; + ObjectInteraction *obj4C; Object *playerObj; if (obj->unk7C.word == 0) { @@ -1749,9 +1749,9 @@ void obj_loop_infopoint(Object *obj, UNUSED s32 speed) { obj->segment.trans.unk6 &= ~0x4000; } - obj4C = obj->unk4C; - if (obj4C->unk13 < ((obj->unk78 >> 16) & 0xFF)) { - playerObj = obj4C->unk0; + obj4C = obj->interactObj; + if (obj4C->distance < ((obj->unk78 >> 16) & 0xFF)) { + playerObj = obj4C->obj; if (playerObj->segment.header->behaviorId == 1) { Object_InfoPoint *playerObj64 = &playerObj->unk64->info_point; player = playerObj64->unk0; @@ -1765,53 +1765,53 @@ void obj_loop_infopoint(Object *obj, UNUSED s32 speed) { void obj_init_smoke(UNUSED Object *obj, UNUSED LevelObjectEntry_Smoke *entry) { } -void obj_loop_smoke(Object *obj, s32 speed) { - f32 temp_f2 = speed; +void obj_loop_smoke(Object *obj, s32 updateRate) { + f32 updateRateF = updateRate; if (osTvType == TV_TYPE_PAL) { - temp_f2 *= 1.2; + updateRateF *= 1.2; } - obj->segment.trans.x_position += obj->segment.x_velocity * temp_f2; - obj->segment.unk18 += speed * 16; - obj->segment.trans.y_position += obj->segment.y_velocity * temp_f2; - obj->segment.trans.z_position += obj->segment.z_velocity * temp_f2; - if (obj->segment.unk18 >= 256) { + obj->segment.trans.x_position += obj->segment.x_velocity * updateRateF; + obj->segment.animFrame += updateRate * 16; + obj->segment.trans.y_position += obj->segment.y_velocity * updateRateF; + obj->segment.trans.z_position += obj->segment.z_velocity * updateRateF; + if (obj->segment.animFrame > 255) { gParticlePtrList_addObject(obj); - obj->segment.unk18 = 255; + obj->segment.animFrame = 255; } } void obj_init_unknown25(UNUSED Object *obj, UNUSED LevelObjectEntry_Unknown25 *entry) { } -void obj_loop_unknown25(Object *obj, s32 speed) { - obj->segment.unk18 += speed * 8; - if (obj->segment.unk18 >= 256) { +void obj_loop_unknown25(Object *obj, s32 updateRate) { + obj->segment.animFrame += updateRate * 8; + if (obj->segment.animFrame > 255) { gParticlePtrList_addObject(obj); - obj->segment.unk18 = 255; + obj->segment.animFrame = 255; } } void obj_init_wardensmoke(UNUSED Object *obj, UNUSED LevelObjectEntry_WardenSmoke *entry) { } -void obj_loop_wardensmoke(Object *obj, s32 speed) { - f32 temp_f2; +void obj_loop_wardensmoke(Object *obj, s32 updateRate) { + f32 updateRateF; - temp_f2 = (f32)speed; + updateRateF = (f32) updateRate; if (osTvType == TV_TYPE_PAL) { - temp_f2 *= 1.2; + updateRateF *= 1.2; } - obj->segment.unk18 += speed * 4; - obj->segment.trans.y_position += temp_f2 * 0.25; - if (obj->segment.unk18 >= 256) { + obj->segment.animFrame += updateRate * 4; + obj->segment.trans.y_position += updateRateF * 0.25; + if (obj->segment.animFrame > 255) { gParticlePtrList_addObject(obj); - obj->segment.unk18 = 255; + obj->segment.animFrame = 255; } } void obj_init_bombexplosion(Object *obj, LevelObjectEntry_BombExplosion *entry) { LevelObjectEntry_BombExplosion *entry2; - obj->segment.unk18 = 0; + obj->segment.animFrame = 0; obj->segment.trans.scale = 0.5f; obj->segment.unk3A = get_random_number_from_range(0, obj->segment.header->numberOfModelIds - 1); entry2 = entry; // Needed for a match. @@ -1853,19 +1853,19 @@ void obj_loop_bombexplosion(Object *obj, s32 updateRate) { void obj_init_teleport(Object *obj, UNUSED LevelObjectEntry_Teleport *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0xF; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0xF; + obj->interactObj->unk12 = 0; if (get_settings()->cutsceneFlags & CUTSCENE_LIGHTHOUSE_ROCKET) { obj->action = 1; } } -void obj_loop_teleport(Object *obj, UNUSED s32 speed) { +void obj_loop_teleport(Object *obj, UNUSED s32 updateRate) { if (obj->action != 0) { LevelObjectEntry_Teleport *level_entry = &obj->segment.unk3C_a.level_entry->teleport; - if (obj->unk4C->unk13 < 0x78) { + if (obj->interactObj->distance < 0x78) { func_8006F338(level_entry->unk8); obj->action = 0; play_sound_global(SOUND_WHOOSH2, NULL); @@ -1891,13 +1891,13 @@ void obj_init_exit(Object *obj, LevelObjectEntry_Exit *entry) { obj64->unkC = -((obj64->unk0 * obj->segment.trans.x_position) + (obj64->unk8 * obj->segment.trans.z_position)); obj64->unk10 = entry->unk10; obj64->unk14 = entry->bossFlag; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = entry->unk10; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = entry->unk10; + obj->interactObj->unk12 = 0; } -void obj_loop_exit(Object *obj, UNUSED s32 speed) { +void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { Object *racerObj; Object_Racer *racer; s32 numberOfRacers; @@ -1922,7 +1922,7 @@ void obj_loop_exit(Object *obj, UNUSED s32 speed) { enableWarp = FALSE; } if (enableWarp) { - if (obj->unk4C->unk13 < obj64->unk10) { + if (obj->interactObj->distance < obj64->unk10) { dist = obj64->unk10; racerObjects = get_racer_objects(&numberOfRacers); for (i = 0; i < numberOfRacers; i++) { @@ -1951,7 +1951,7 @@ void obj_init_cameracontrol(Object *obj, LevelObjectEntry_CameraControl *entry) func_80011390(); } -void obj_loop_cameracontrol(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_cameracontrol(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_setuppoint(Object *obj, LevelObjectEntry_SetupPoint *entry) { @@ -1960,29 +1960,29 @@ void obj_init_setuppoint(Object *obj, LevelObjectEntry_SetupPoint *entry) { obj->segment.trans.y_rotation = entry->unkA << 6 << 4; // Not sure about the values here. } -void obj_loop_setuppoint(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_setuppoint(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_dino_whale(Object *obj, UNUSED LevelObjectEntry_Dino_Whale *entry) { - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 3; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 3; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; } -void obj_loop_dino_whale(Object *obj, s32 speed) { +void obj_loop_dino_whale(Object *obj, s32 updateRate) { s32 sp2C; if (obj->unk78 > 0) { - obj->unk78 -= speed; - speed *= 2; + obj->unk78 -= updateRate; + updateRate *= 2; } else { obj->unk78 = 0; } - sp2C = obj->segment.unk18; - func_8001F460(obj, speed, obj); + sp2C = obj->segment.animFrame; + func_8001F460(obj, updateRate, obj); func_800113CC(obj, 0, sp2C, 0xAC, 0xAD); - if (obj->unk4C->unk13 < 0xFF) { + if (obj->interactObj->distance < 0xFF) { if (obj->unk78 == 0) { obj->unk78 = 0x3C; func_80009558(SOUND_VOICE_BRONTO_ROAR, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); @@ -1992,10 +1992,10 @@ void obj_loop_dino_whale(Object *obj, s32 speed) { void obj_init_parkwarden(Object *obj, UNUSED LevelObjectEntry_Parkwarden *entry) { Object_NPC *temp; - obj->unk4C->unk14 = (u16)1; - obj->unk4C->unk11 = (u8)0; - obj->unk4C->unk10 = (u8)0x1E; - obj->unk4C->unk12 = (u8)0; + obj->interactObj->unk14 = (u16)1; + obj->interactObj->unk11 = (u8)0; + obj->interactObj->unk10 = (u8)0x1E; + obj->interactObj->unk12 = (u8)0; temp = &obj->unk64->npc; temp->unkD = 0xFF; temp->unk0 = 0.0f; @@ -2053,7 +2053,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { taj = (Object_NPC *) obj->unk64; levelHeader = get_current_level_header(); obj->unk74 = 0; - if (obj->segment.unk18 == 0 && taj->unk4 > 1.0) { + if (obj->segment.animFrame == 0 && taj->unk4 > 1.0) { taj->unk4 = 0.0f; } distance = 0.0f; @@ -2072,7 +2072,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { (obj->action == NULL) && (distance < 300.0) && ( - ((obj->unk4C->unk14 & 8) && (racerObj == obj->unk4C->unk0)) || + ((obj->interactObj->unk14 & 8) && (racerObj == obj->interactObj->obj)) || (buttonsPressed & Z_TRIG) ) ) { @@ -2091,7 +2091,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { var_a2 = TRUE; } } - obj->unk4C->unk14 = 1; + obj->interactObj->unk14 = 1; if ((func_80052188() || (var_a2)) && ((obj->action == 0 || obj->action == 31))) { func_800012E8(); set_music_player_voice_limit(24); @@ -2466,7 +2466,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } break; case TAJ_MODE_RACE: - obj->unk4C->unk14 = 0; + obj->interactObj->unk14 = 0; obj->segment.unk3B = 6; obj->segment.unk38.half.lower = 0xFF; taj->unk4 += updateRateF * 1.0; @@ -2611,7 +2611,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { if (sp6B != 0) { func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 0xC, 0, 1.0f, 0); } - obj->segment.unk18 = taj->unk4 * 1.0; + obj->segment.animFrame = taj->unk4 * 1.0; func_80061C0C(obj); func_800AFC3C(obj, updateRate); } @@ -2630,7 +2630,7 @@ void play_taj_voice_clip(u16 soundID, s32 interrupt) { } } -void obj_loop_gbparkwarden(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_gbparkwarden(UNUSED Object *obj, UNUSED s32 updateRate) { } f32 func_8003ACAC(void) { @@ -2648,7 +2648,7 @@ void obj_init_checkpoint(Object *obj, LevelObjectEntry_Checkpoint *entry, UNUSED func_80011390(); } -void obj_loop_checkpoint(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_checkpoint(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_modechange(Object *obj, LevelObjectEntry_ModeChange *entry) { @@ -2668,10 +2668,10 @@ void obj_init_modechange(Object *obj, LevelObjectEntry_ModeChange *entry) { obj64->unkC = -((obj64->unk0 * obj->segment.trans.x_position) + (obj64->unk8 * obj->segment.trans.z_position)); obj64->unk10 = entry->unk8; obj64->unk14 = entry->unkA; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = entry->unk8; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = entry->unk8; + obj->interactObj->unk12 = 0; } void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { @@ -2689,7 +2689,7 @@ void obj_loop_modechange(Object *obj, UNUSED s32 updateRate) { f32 dist; modeChange = (Object_ModeChange *) obj->unk64; - if (obj->unk4C->unk13 < modeChange->unk10) { + if (obj->interactObj->distance < modeChange->unk10) { radiusF = modeChange->unk10; racerObjects = get_racer_objects(&numRacers); for (i = 0; i < numRacers; i++) { @@ -2749,13 +2749,13 @@ void obj_init_bonus(Object *obj, LevelObjectEntry_Bonus *entry) { obj64->unkC = -((obj64->unk0 * obj->segment.trans.x_position) + (obj64->unk8 * obj->segment.trans.z_position)); obj64->unk10 = entry->unk8; obj64->unk14 = entry->unkA; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = entry->unk8; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = entry->unk8; + obj->interactObj->unk12 = 0; } -void obj_loop_bonus(Object *obj, UNUSED s32 speed) { +void obj_loop_bonus(Object *obj, UNUSED s32 updateRate) { Object *racerObj; Object_Racer *racer; s32 numberOfRacers; @@ -2769,7 +2769,7 @@ void obj_loop_bonus(Object *obj, UNUSED s32 speed) { s32 i; obj64 = &obj->unk64->bonus; - if (obj->unk4C->unk13 < obj64->unk10) { + if (obj->interactObj->distance < obj64->unk10) { dist = obj64->unk10; halfDist = dist * 0.5; racerObjects = get_racer_objects(&numberOfRacers); @@ -2806,10 +2806,10 @@ void obj_init_goldenballoon(Object *obj, LevelObjectEntry_GoldenBalloon *entry) if (entry->unk8 == -1) { rmonPrintf("Illegal door no!!!\n"); // Did the devs just copy-paste the door init function? } - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 4; - obj->unk4C->unk10 = 20; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 4; + obj->interactObj->unk10 = 20; + obj->interactObj->unk12 = 0; scalef = entry->scale & 0xFF; if (scalef < 10.0f) { scalef = 10.0f; @@ -2829,37 +2829,37 @@ void obj_init_goldenballoon(Object *obj, LevelObjectEntry_GoldenBalloon *entry) } } -void obj_loop_goldenballoon(Object *obj, s32 speed) { +void obj_loop_goldenballoon(Object *obj, s32 updateRate) { LevelObjectEntry *levelEntry; - Object_4C *obj4C; + ObjectInteraction *obj4C; Object_Racer *racer; Object_GoldenBalloon *obj64; Settings *settings; s32 flag; s32 doubleSpeed; Object *racerObj; - f32 sp2C; + f32 updateRateF; f32 speedf; s32 isPirated; - sp2C = speed; + updateRateF = updateRate; if (osTvType == TV_TYPE_PAL) { - sp2C *= 1.2; + updateRateF *= 1.2; } isPirated = FALSE; // AntiPiracy check. Seems to set a flag that prevents collecting balloons. if (IO_READ(0x284) != 0x240B17D7) { isPirated = TRUE; } - speedf = sp2C; + speedf = updateRateF; settings = get_settings(); levelEntry = obj->segment.unk3C_a.level_entry; flag = 0x10000 << levelEntry->goldenBalloon.unk8; if (settings->courseFlagsPtr[settings->courseId] & flag) { if (obj->unk7C.word > 0) { obj->unk74 = 2; - func_800AFC3C(obj, speed); - obj->unk7C.word -= speed; + func_800AFC3C(obj, updateRate); + obj->unk7C.word -= updateRate; } else { gParticlePtrList_addObject(obj); } @@ -2867,15 +2867,15 @@ void obj_loop_goldenballoon(Object *obj, s32 speed) { obj->segment.trans.unk6 |= 0x4000; if (obj->action == 0) { obj->segment.trans.unk6 &= 0xBFFF; - doubleSpeed = speed * 2; + doubleSpeed = updateRate * 2; if (obj->segment.unk38.half.lower < (255 - doubleSpeed)) { obj->segment.unk38.half.lower += doubleSpeed; } else { obj->segment.unk38.half.lower = 255; } - obj4C = obj->unk4C; - if ((obj4C->unk13 < 45) && (isPirated == FALSE)) { - racerObj = obj4C->unk0; + obj4C = obj->interactObj; + if ((obj4C->distance < 45) && (isPirated == FALSE)) { + racerObj = obj4C->obj; if ((racerObj && (racerObj->segment.header->behaviorId == 1))) { racer = &racerObj->unk64->racer; if (racer->playerIndex == PLAYER_ONE) { @@ -2890,7 +2890,7 @@ void obj_loop_goldenballoon(Object *obj, s32 speed) { obj->unk7C.word = 16; obj->unk74 = 2; obj->segment.trans.unk6 |= 0x4000; - func_800AFC3C(obj, speed); + func_800AFC3C(obj, updateRate); } } } @@ -2907,7 +2907,7 @@ void obj_loop_goldenballoon(Object *obj, s32 speed) { obj64->unkC = obj64->unkD; } } else { - func_8001C6C4((Object_64 *) obj64, obj, sp2C, speedf, 0); + func_8001C6C4((Object_64 *) obj64, obj, updateRateF, speedf, 0); } } } @@ -2945,10 +2945,10 @@ void obj_init_door(Object *obj, LevelObjectEntry_Door *entry) { obj->segment.trans.scale = obj->segment.header->scale * phi_f0; obj64->unk13 = (u8) entry->unkF; obj64->unk14 = (s8) entry->unk11; - obj->unk4C->unk14 = 0x21; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 0x21; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; if (obj->segment.unk3A >= obj->segment.header->numberOfModelIds) { obj->segment.unk3A = 0; } @@ -2976,10 +2976,10 @@ void obj_init_ttdoor(Object *obj, LevelObjectEntry_TTDoor *entry) { } phi_f0 /= 64; obj->segment.trans.scale = obj->segment.header->scale * phi_f0; - obj->unk4C->unk14 = 0x21; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 0x21; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; if (obj->segment.unk3A >= obj->segment.header->numberOfModelIds) { obj->segment.unk3A = 0; } @@ -3005,8 +3005,8 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { } else { obj->segment.unk3A = D_800DCA9C[settings->ttAmulet]; } - if (obj->unk4C->unk13 < ttDoor->unk12 && (settings->ttAmulet < 4 || *settings->balloonsPtr < 47)) { - racerObj = obj->unk4C->unk0; + if (obj->interactObj->distance < ttDoor->unk12 && (settings->ttAmulet < 4 || *settings->balloonsPtr < 47)) { + racerObj = obj->interactObj->obj; if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if (racer->playerIndex != PLAYER_COMPUTER && racerObj == obj->unk5C->unk100) { @@ -3039,7 +3039,7 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { ttDoor->unkC = 0; } openDoor = TRUE; - if (settings->ttAmulet >= 4 && obj->unk4C->unk13 < ttDoor->unk12 && *settings->balloonsPtr >= 47) { + if (settings->ttAmulet >= 4 && obj->interactObj->distance < ttDoor->unk12 && *settings->balloonsPtr >= 47) { angle = obj->segment.trans.y_rotation - obj->unk7C.word; } else { angle = obj->segment.trans.y_rotation - obj->unk78; @@ -3065,9 +3065,9 @@ void obj_loop_ttdoor(Object *obj, s32 updateRate) { ttDoor->soundMask = NULL; } } - obj->unk4C->unk13 = 0xFF; - obj->unk4C->unk0 = NULL; - obj->unk4C->unk14 &= 0xFFF7; + obj->interactObj->distance = 0xFF; + obj->interactObj->obj = NULL; + obj->interactObj->unk14 &= 0xFFF7; obj->unk5C->unk100 = NULL; } @@ -3098,10 +3098,10 @@ void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry) { obj64->unkC = -((obj64->unk0 * obj->segment.trans.x_position) + (obj64->unk8 * obj->segment.trans.z_position)); obj64->unk10 = entry->scale; obj64->unk14 = entry->unkD; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = entry->scale; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = entry->scale; + obj->interactObj->unk12 = 0; } @@ -3130,7 +3130,7 @@ void obj_loop_trigger(Object *obj, UNUSED s32 updateRate) { curRaceType = get_current_level_race_type(); if (triggerEntry->unk9 >= 0) { flags = 0x10000 << triggerEntry->unk9; - if (obj->unk4C->unk13 < trigger->unk10) { + if (obj->interactObj->distance < trigger->unk10) { if (((u8) curRaceType != RACETYPE_HUBWORLD) || !(courseFlags & flags)) { radiusF = trigger->unk10; racers = get_racer_objects(&numRacers); @@ -3166,10 +3166,10 @@ void obj_init_bridge_whaleramp(Object *obj, LevelObjectEntry_Bridge_WhaleRamp *e obj->segment.unk3A = entry->unk8; obj->segment.trans.y_rotation = entry->unk9 << 6 << 4; temp->unk0 = obj->segment.trans.y_position; - obj->unk4C->unk14 = 0x21; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 0x21; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; temp->unk4 = 0; if (obj->segment.unk3A >= obj->segment.header->numberOfModelIds) { obj->segment.unk3A = 0; @@ -3255,7 +3255,7 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { switch (entry->unkB) { case 0: obj->unk78 = 0; - if (obj->unk4C->unk13 < entry->unkC) { + if (obj->interactObj->distance < entry->unkC) { obj->unk78 = 1; } break; @@ -3292,30 +3292,30 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { break; } - obj->unk4C->unk13 = 255; - obj->unk4C->unk0 = NULL; - obj->unk4C->unk14 &= 0xFFF7; + obj->interactObj->distance = 255; + obj->interactObj->obj = NULL; + obj->interactObj->unk14 &= 0xFFF7; } void obj_init_rampswitch(Object *obj, LevelObjectEntry_RampSwitch *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x14; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x14; + obj->interactObj->unk12 = 0; obj->action = entry->unk8; } -void obj_loop_rampswitch(Object *obj, UNUSED s32 speed) { - if (obj->unk4C->unk13 < 0x2D) { +void obj_loop_rampswitch(Object *obj, UNUSED s32 updateRate) { + if (obj->interactObj->distance < 0x2D) { func_8001E344(obj->action); } - obj->unk4C->unk13 = (u8)0xFF; + obj->interactObj->distance = (u8)0xFF; } void obj_init_seamonster(UNUSED Object *obj, UNUSED LevelObjectEntry_SeaMonster *entry) { } -void obj_loop_seamonster(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_seamonster(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_fogchanger(Object *obj, LevelObjectEntry_FogChanger *entry) { @@ -3326,15 +3326,15 @@ void obj_init_fogchanger(Object *obj, LevelObjectEntry_FogChanger *entry) { } void obj_init_skycontrol(Object *obj, LevelObjectEntry_SkyControl *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = entry->unk9; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = entry->unk9; obj->action = entry->unk8; obj->unk7C.word = entry->unk9; } -void obj_loop_skycontrol(Object *obj, UNUSED s32 speed) { - if (obj->unk4C->unk13 < obj->unk7C.word) { +void obj_loop_skycontrol(Object *obj, UNUSED s32 updateRate) { + if (obj->interactObj->distance < obj->unk7C.word) { func_80028044(obj->action); } } @@ -3347,11 +3347,11 @@ void obj_init_ainode(Object *obj, LevelObjectEntry_AiNode *entry) { func_8001D1AC(); } -void obj_loop_ainode(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_ainode(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_treasuresucker(Object *obj, LevelObjectEntry_TreasureSucker *entry) { - obj->segment.unk18 = 0x78; + obj->segment.animFrame = 120; obj->action = (entry->unk8 - 1) & 3; } @@ -3445,20 +3445,20 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { play_sound_global(SOUND_SELECT, NULL); } } - obj->segment.unk18 += updateRate * 8; + obj->segment.animFrame += updateRate * 8; } void obj_init_bananacreator(Object *obj, UNUSED LevelObjectEntry_BananaCreator *entry) { - obj->segment.unk18 = 100; + obj->segment.animFrame = 100; } -void obj_loop_bananacreator(Object *obj, s32 speed) { +void obj_loop_bananacreator(Object *obj, s32 updateRate) { LevelObjectEntryCommon newEntry; Object *newBananaObj; Object_Banana *newBananaObj64; if (obj->unk7C.word != 0) { - obj->unk78 -= speed; + obj->unk78 -= updateRate; } if (obj->unk78 <= 0) { @@ -3482,9 +3482,9 @@ void obj_loop_bananacreator(Object *obj, s32 speed) { void obj_init_banana(Object *obj, UNUSED LevelObjectEntry_Banana *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; obj->unk7C.half.upper = 0x14; obj->unk7C.half.lower = 0x10; if (get_filtered_cheats() & CHEAT_DISABLE_BANANAS) { @@ -3517,7 +3517,7 @@ void obj_loop_banana(Object *obj, s32 updateRate) { updateRateF *= 1.2; } banana = (Object_Banana *) obj->unk64; - obj->segment.unk18 += updateRate * 8; + obj->segment.animFrame += updateRate * 8; obj78 = (Object_78_Banana *) &obj->unk78; if (obj->unk78 == -1) { obj->segment.trans.unk6 |= 0x4000; @@ -3584,9 +3584,9 @@ void obj_loop_banana(Object *obj, s32 updateRate) { } else { obj78->unk4 = 0; } - if (obj->unk4C->unk13 < 0x78) { + if (obj->interactObj->distance < 0x78) { if (get_current_level_race_type() == RACETYPE_CHALLENGE_BANANAS) { - racerObj = obj->unk4C->unk0; + racerObj = obj->interactObj->obj; if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if (racer->playerIndex == PLAYER_COMPUTER) { @@ -3595,8 +3595,8 @@ void obj_loop_banana(Object *obj, s32 updateRate) { } } } - if (obj->unk4C->unk13 < sp44 && obj78->unk4 == 0) { - racerObj = obj->unk4C->unk0; + if (obj->interactObj->distance < sp44 && obj78->unk4 == 0) { + racerObj = obj->interactObj->obj; 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) { @@ -3634,9 +3634,9 @@ void obj_loop_banana(Object *obj, s32 updateRate) { * Rareware duplicated this function just to check for adventure 2... */ void obj_init_silvercoin_adv2(Object *obj, UNUSED LevelObjectEntry_SilverCoinAdv2 *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; obj->action = 3; obj->unk7C.word = 16; if (!is_in_tracks_mode()) { @@ -3658,9 +3658,9 @@ void obj_init_silvercoin_adv2(Object *obj, UNUSED LevelObjectEntry_SilverCoinAdv * If the flag is inactive, destroy the object. */ void obj_init_silvercoin(Object *obj, UNUSED LevelObjectEntry_SilverCoin *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; obj->action = SILVER_COIN_INACTIVE; obj->unk7C.word = 0; if (!is_in_tracks_mode()) { @@ -3683,16 +3683,16 @@ void obj_init_silvercoin(Object *obj, UNUSED LevelObjectEntry_SilverCoin *entry) * When collected, the coins are hidden for that player, rather than being removed outright. */ void obj_loop_silvercoin(Object *obj, s32 updateRate) { - Object_4C* silverCoin4C; + ObjectInteraction *silverCoin4C; Object_Racer* racer; Object *racerObj; s32 temp; temp = func_8006C19C(); if ((temp && obj->action != SILVER_COIN_INACTIVE) || (!temp && obj->action == SILVER_COIN_ACTIVE)) { - silverCoin4C = obj->unk4C; - if (silverCoin4C->unk13 < 80) { - racerObj = (Object *) silverCoin4C->unk0; + silverCoin4C = obj->interactObj; + if (silverCoin4C->distance < 80) { + racerObj = (Object *) silverCoin4C->obj; if (racerObj != NULL && racerObj->segment.header->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if (racer->playerIndex != PLAYER_COMPUTER) { @@ -3700,13 +3700,13 @@ void obj_loop_silvercoin(Object *obj, s32 updateRate) { obj->action |= SILVER_COIN_COLLECTED << racer->playerIndex; obj->unk7C.word = 0x10; obj->segment.trans.unk6 |= 0x200 << racer->playerIndex; - play_sequence(SEQUENCE_SILVER_COIN_1 + racer->unk202); - racer->unk202++; + play_sequence(SEQUENCE_SILVER_COIN_1 + racer->silverCoinCount); + racer->silverCoinCount++; } } } } - obj->segment.unk18 += 8 * updateRate; + obj->segment.animFrame += 8 * updateRate; } if (obj->unk7C.word > 0) { obj->unk7C.word -= updateRate; @@ -3718,9 +3718,9 @@ void obj_loop_silvercoin(Object *obj, s32 updateRate) { void obj_init_worldkey(Object *obj, LevelObjectEntry_WorldKey *entry) { Settings *settings; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; entry->unk8 &= 0xF; obj->action = entry->unk8; settings = get_settings(); @@ -3733,18 +3733,18 @@ void obj_init_worldkey(Object *obj, LevelObjectEntry_WorldKey *entry) { /** * Rotates the key and checks to see if the player grabbed it. */ -void obj_loop_worldkey(Object *worldKeyObj, s32 speed) { +void obj_loop_worldkey(Object *worldKeyObj, s32 updateRate) { Settings *settings; Object *playerObj; // Check if the player is near the key - // "worldKeyObj->unk4C->unk13" is the player's distance from the key (Up to 255). - if (worldKeyObj->unk4C->unk13 < WORLD_KEY_GRAB_CHECK_RADIUS) { - // "worldKeyObj->unk4C->unk0" is only set when the player is within 255 units of + // "worldKeyObj->interactObj->distance" is the player's distance from the key (Up to 255). + if (worldKeyObj->interactObj->distance < WORLD_KEY_GRAB_CHECK_RADIUS) { + // "worldKeyObj->interactObj->obj" is only set when the player is within 255 units of // the key object, otherwise it is NULL. - playerObj = worldKeyObj->unk4C->unk0; + playerObj = worldKeyObj->interactObj->obj; if (playerObj != NULL) { - if (playerObj->segment.header->behaviorId == 1) { // Is the player a racer? + if (playerObj->segment.header->behaviorId == BHV_RACER) { Object_WorldKey *obj64 = &playerObj->unk64->world_key; if (obj64->unk0 != -1) { // Player has grabbed the key! @@ -3758,7 +3758,7 @@ void obj_loop_worldkey(Object *worldKeyObj, s32 speed) { } // Rotate world key - worldKeyObj->segment.trans.y_rotation += speed * 256; + worldKeyObj->segment.trans.y_rotation += updateRate * 0x100; } void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry) { @@ -3766,9 +3766,9 @@ void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry) Object_WeaponBalloon *obj64; f32 scalef; - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 4; - obj->unk4C->unk10 = 0x14; + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 4; + obj->interactObj->unk10 = 0x14; cheats = get_filtered_cheats(); @@ -3814,41 +3814,294 @@ void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry) } } +#ifdef NON_MATCHING +void obj_loop_weaponballoon(Object *obj, s32 updateRate) { + s8 currentBalloon; + Object_Racer *racer; + Object_WeaponBalloon *balloon; + s8 *balloonAsset; + s8 prevQuantity; + s8 levelMask; + Object *interactObj; + s32 newvar; + + balloon = (Object_WeaponBalloon *) obj->unk64; + obj->segment.trans.scale = balloon->unk0 * (1.0 - (balloon->unk4 / 90.0f)); + if (obj->segment.trans.scale < 0.001) { + obj->segment.trans.scale = 0.001f; + } + if (obj->segment.trans.scale < 0.1) { + obj->segment.trans.unk6 |= 0x4000; + } else { + obj->segment.trans.unk6 &= 0xBFFF; + } + if (obj->unk7C.word > 0) { + obj->unk74 = 1; + func_800AFC3C(obj, updateRate); + obj->unk7C.word -= updateRate; + } + if (balloon->unk4 != 0) { + if (!(balloon->unk4 == 90 && obj->interactObj->distance < 45)) { + balloon->unk4 = (balloon->unk4 - updateRate) - updateRate; + } + if (balloon->unk4 < 0) { + balloon->unk4 = 0; + } + } else { + if (obj->interactObj->distance < 45) { + interactObj = obj->interactObj->obj; + if (interactObj != NULL && interactObj->segment.header->behaviorId == BHV_RACER) { + racer = (Object_Racer *) interactObj->unk64; + if (racer->unk1D6 < 5 || racer->playerIndex != PLAYER_COMPUTER) { + currentBalloon = racer->balloon_type; + racer->balloon_type = obj->unk78; + if (currentBalloon == racer->balloon_type && racer->balloon_quantity != 0) { + racer->balloon_level++; + } else { + racer->balloon_level = 0; + } + // Disallow level 3 ballons in challenge mode + if (get_current_level_race_type() & RACETYPE_CHALLENGE) { + if (racer->balloon_level > 1) { + racer->balloon_level = 1; + } + // And instantly upgrade oil slicks to tripmines. + if (racer->balloon_type == BALLOON_TYPE_TRAP) { + racer->balloon_level = 1; + } + } + levelMask = 3; // 3 isn't an attainable level so the future check won't be true if the item's already max level. + if (get_filtered_cheats() & CHEAT_MAXIMUM_POWER_UP) { + racer->balloon_level = 2; + } + if (racer->balloon_level > 2) { + racer->balloon_level = 2; + levelMask = 2; + } + balloonAsset = (s8 *) get_misc_asset(MISC_ASSET_UNK0C); + prevQuantity = racer->balloon_quantity; + racer->balloon_quantity = balloonAsset[(racer->balloon_type * 10) + (racer->balloon_level * 2) + 1]; + racer->unk209 |= 1; + if (get_number_of_active_players() < THREE_PLAYERS) { + obj->unk7C.word = 0x10; + } + if (racer->playerIndex == PLAYER_COMPUTER) { + func_80009558(SOUND_BALLOON_POP, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); + } else { + if (levelMask == racer->balloon_level) { + if (racer->raceFinished == FALSE) { + if (prevQuantity != racer->balloon_quantity) { + func_800A7484(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); + newvar = racer->balloon_level; + if (racer->balloon_level > 2) { + newvar = 2; + } + play_sound_global(SOUND_COLLECT_ITEM + newvar, NULL); + } else { + func_80009558(SOUND_BALLOON_POP, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, NULL); + } + } + } else if (racer->raceFinished == FALSE) { + newvar = racer->balloon_level; + if (newvar > 0) { + func_800A7484(SOUND_VOICE_TT_POWERUP, 1.0f, racer->playerIndex); + } + play_sound_global(SOUND_COLLECT_ITEM + racer->balloon_level, NULL); + } + } + obj->unk74 = 1; + func_800AFC3C(obj, updateRate); + balloon->unk4 = 90; + } + } + } + } +} +#else GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_weaponballoon.s") +#endif void obj_init_wballoonpop(UNUSED Object *obj, UNUSED LevelObjectEntry_WBalloonPop *entry) { } -void obj_loop_wballoonpop(UNUSED Object *obj, UNUSED s32 speed) { +void obj_loop_wballoonpop(UNUSED Object *obj, UNUSED s32 updateRate) { } void obj_init_weapon(Object *obj, UNUSED LevelObjectEntry_Weapon *entry) { - obj->unk4C->unk14 = 2; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x18; - obj->unk4C->unk12 = 0; - obj->unk78 = normalise_time(0x1E0); + obj->interactObj->unk14 = 2; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x18; + obj->interactObj->unk12 = 0; + obj->unk78 = normalise_time(480); obj->unk7C.word = 0; } -void obj_loop_weapon(Object *obj, s32 speed) { - Object_Weapon *obj64 = &obj->unk64->weapon; - switch (obj64->weaponID) { - case 0: - case 1: - func_8003E694(obj, speed); +void obj_loop_weapon(Object *obj, s32 updateRate) { + Object_Weapon *weapon = &obj->unk64->weapon; + switch (weapon->weaponID) { + case WEAPON_ROCKET_HOMING: + case WEAPON_ROCKET: + handle_rocket_projectile(obj, updateRate); break; - case 2: - case 3: - case 10: - case 11: - func_8003F2E8(obj, speed); + case WEAPON_TRIPMINE: + case WEAPON_OIL_SLICK: + case WEAOON_BUBBLE_TRAP: + case WEAPON_UNK_11: + func_8003F2E8(obj, updateRate); break; } return; } -GLOBAL_ASM("asm/non_matchings/unknown_032760/func_8003E694.s") +/** + * Firing a standard rocket makes it fly forward. + * A homing rocket uses the checkpoint system to path towards its victim. + * When it collides with a racer, they're launched into the air. +*/ +void handle_rocket_projectile(Object *obj, s32 updateRate) { + Object *interactObj; + Object_Racer *weaponOwner; + Object_Weapon *weapon; + Object *temp_s1_2; + UNUSED s32 pad; + f32 offsetZ; + f32 offsetY; + f32 offsetX; + f32 spC4; + f32 updateRateF; + f32 posX; + f32 posY; + f32 posZ; + f32 diffX; + f32 diffY; + f32 diffZ; + s32 spA4; + s32 size; + s32 numCheckpoints; + Object_Racer *racer; + s8 sp97; + Matrix mtxf; + ObjectTransform trans; + + obj->interactObj->unk14 |= 0x100; + weapon = (Object_Weapon *) obj->unk64; + posX = obj->segment.trans.x_position; + posY = obj->segment.trans.y_position; + posZ = obj->segment.trans.z_position; + trans.y_rotation = obj->segment.trans.y_rotation; + trans.x_rotation = obj->segment.trans.x_rotation; + trans.z_rotation = 0; + trans.x_position = 0.0f; + trans.y_position = 0.0f; + trans.z_position = 0.0f; + trans.scale = 1.0f; + object_transform_to_matrix(mtxf, &trans); + guMtxXFMF(mtxf, 0.0f, 0.0f, weapon->forwardVel, &obj->segment.x_velocity, &obj->segment.y_velocity, &obj->segment.z_velocity); + updateRateF = updateRate; + if (osTvType == TV_TYPE_PAL) { + updateRateF *= 1.2; + } + offsetX = obj->segment.trans.x_position + (obj->segment.x_velocity * updateRateF); + offsetY = obj->segment.trans.y_position + (obj->segment.y_velocity * updateRateF); + offsetZ = obj->segment.trans.z_position + (obj->segment.z_velocity * updateRateF); + if (weapon->weaponID != WEAPON_MAGNET_LEVEL_3) { + spC4 = 16.0f; + func_80031130(1, &obj->segment.trans.x_position, &offsetX, -1); + spA4 = 0; + sp97 = -1; + func_80031600(&obj->segment.trans.x_position, &offsetX, &spC4, &sp97, 1, &spA4); + if (spA4 > 0) { + if (func_8002ACD4(&diffX, &diffY, &diffZ) != 0) { + obj->unk78 = 0; + } + } + } + diffX = offsetX - posX; + diffY = offsetY - posY; + diffZ = offsetZ - posZ; + if (func_80011570(obj, diffX, diffY, diffZ) != 0) { + obj->unk78 = 0; + } + diffX = ((diffX * diffX) + (diffZ * diffZ)) / updateRateF; + diffZ = (weapon->forwardVel * weapon->forwardVel) / 2; + if (diffX < diffZ) { + obj->unk78 = 0; + } + if (weapon->weaponID == WEAPON_ROCKET_HOMING) { + numCheckpoints = get_checkpoint_count(); + if (numCheckpoints > 0) { + if (func_800185E4(weapon->checkpoint, obj, posX, posY, posZ, &weapon->checkpointDist, (u8* ) &sp97) == FALSE) { + weapon->checkpoint++; + if (weapon->checkpoint >= numCheckpoints) { + weapon->checkpoint = 0; + } + } + } else { + weapon->checkpoint = -1; + } + } + if (weapon->weaponID == WEAPON_ROCKET_HOMING) { + func_8003EDD8(obj, updateRate, weapon); + } else { + func_8003EC14(obj, updateRate, weapon); + } + //TODO: Fix these gotos. + if (obj->interactObj->obj != NULL) { + interactObj = obj->interactObj->obj; + if (interactObj == weapon->owner) { + if (obj->unk78 < normalise_time(450) && obj->unk78 != 0) { + goto block_25; + } + goto block_37; + } +block_25: + if (weapon->weaponID == WEAPON_ROCKET_HOMING) { + if (interactObj == weapon->target) { + size = 75; + } else { + size = 20; + } + } else { + size = 60; + } + if (obj->interactObj->distance < size) { + if (interactObj->segment.header->behaviorId == BHV_RACER) { + racer = (Object_Racer *) interactObj->unk64; + racer->attackType = ATTACK_EXPLOSION; + weaponOwner = (Object_Racer *) weapon->owner->unk64; + if (racer->playerIndex != PLAYER_COMPUTER || weaponOwner->playerIndex != PLAYER_COMPUTER) { + weaponOwner->boost_sound |= 2; + } + if (racer->raceFinished == FALSE) { + func_80072348(racer->playerIndex, 9); + } + } + func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 44, 17, 1.0f, 1); + gParticlePtrList_addObject(obj); + return; + } + } +block_37: + obj->unk7C.word += updateRate; + if (obj->unk60 != NULL) { + temp_s1_2 = (Object *) obj->unk60->unk4; + if (obj->unk7C.word < 8) { + temp_s1_2->segment.trans.scale = obj->unk7C.word * 0.5f; + } else if (obj->unk7C.word < 16) { + temp_s1_2->segment.trans.scale = 4.0f - ((obj->unk7C.word - 8) * 0.25f); + } else { + temp_s1_2->segment.trans.scale = (sins_f(obj->unk7C.word << 12) * 0.25f) + 2.0f; + } + } + obj->unk78 -= updateRate; + if (obj->unk78 < 0) { + func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 44, 17, 1.0f, 1); + gParticlePtrList_addObject(obj); + return; + } +} + + GLOBAL_ASM("asm/non_matchings/unknown_032760/func_8003EC14.s") GLOBAL_ASM("asm/non_matchings/unknown_032760/func_8003EDD8.s") @@ -3999,8 +4252,8 @@ void obj_init_texscroll(Object *obj, LevelObjectEntry_TexScroll *entry, s32 arg2 if (obj64->unk0 >= numberOfTexturesInLevel) { obj64->unk0 = numberOfTexturesInLevel - 1; } - obj64->unk4 = (s16)entry->unkA; - obj64->unk6 = (s16)entry->unkB; + obj64->unk4 = (s16) entry->unkA; + obj64->unk6 = (s16) entry->unkB; if (arg2 == 0) { obj64->unk8 = 0; obj64->unkA = 0; @@ -4015,25 +4268,25 @@ void obj_init_rgbalight(Object *obj, LevelObjectEntry_RgbaLight *entry, UNUSED s void obj_init_buoy_pirateship(Object *obj, UNUSED LevelObjectEntry_Buoy_PirateShip *entry, UNUSED s32 arg2) { obj->unk64 = func_800BE654(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position); - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0x1E; - obj->unk4C->unk12 = 0; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0x1E; + obj->interactObj->unk12 = 0; } -void obj_loop_buoy_pirateship(Object *obj, s32 speed) { +void obj_loop_buoy_pirateship(Object *obj, s32 updateRate) { if (obj->unk64 != NULL) { obj->segment.trans.y_position = func_800BEEB4(obj->unk64); } - obj->segment.unk18 += speed * 8; + obj->segment.animFrame += updateRate * 8; } void obj_init_log(Object *obj, LevelObjectEntry_Log *entry, UNUSED s32 arg2) { f32 phi_f0; obj->unk64 = func_800BE654(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position); - obj->unk4C->unk14 = 1; - obj->unk4C->unk11 = 2; - obj->unk4C->unk10 = 0x1E; + obj->interactObj->unk14 = 1; + obj->interactObj->unk11 = 2; + obj->interactObj->unk10 = 0x1E; phi_f0 = entry->unk9 & 0xFF; if (phi_f0 < 10.0f) { phi_f0 = 10.0f; @@ -4049,7 +4302,6 @@ void obj_loop_log(Object *obj, s32 updateRate) { Object_Log *log; f32 cosine; f32 sine; - Object_5C *temp_v0; Object_Racer *racer; f32 temp; f32 temp2; @@ -4060,14 +4312,13 @@ void obj_loop_log(Object *obj, s32 updateRate) { } else { obj->segment.trans.y_position = ((LevelObjectEntryCommon *) obj->segment.unk3C_a.level_entry)->y; } - temp_v0 = obj->unk5C; - if (temp_v0->unk100 != NULL) { + if (obj->unk5C->unk100 != NULL) { obj->unk7C.word++; - racerObj = (Object *) temp_v0->unk100; + racerObj = (Object *) obj->unk5C->unk100; if (racerObj->behaviorId == BHV_RACER) { racer = (Object_Racer *) racerObj->unk64; if (racer->velocity < -4.0 && racer->raceFinished == FALSE) { - func_80072348(racer->playerIndex, 0x12); + func_80072348(racer->playerIndex, 18); } } sine = sins_f(-obj->segment.trans.y_rotation); @@ -4120,7 +4371,7 @@ void obj_init_weather(Object *obj, LevelObjectEntry_Weather *entry) { * When passed through by the player, it will update the current weather settings. * Can be used to stop, start or change the intensity of the current weather. */ -void obj_loop_weather(Object *obj, UNUSED s32 speed) { +void obj_loop_weather(Object *obj, UNUSED s32 updateRate) { s32 currViewport; s32 numberOfObjects; Object_Racer *curObj64; @@ -4294,14 +4545,14 @@ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { obj->unk78 = entry->unkA; } -void obj_loop_bubbler(Object *obj, s32 speed) { +void obj_loop_bubbler(Object *obj, s32 updateRate) { if (obj->unk78 >= get_random_number_from_range(0, 0x400)) { obj->unk74 = 1; } else { obj->unk74 = 0; } if (get_number_of_active_players() < 2) { - func_800AFC3C(obj, speed); + func_800AFC3C(obj, updateRate); } } @@ -4313,13 +4564,13 @@ void obj_init_boost(Object *obj, LevelObjectEntry_Boost *entry) { void obj_init_unknown94(UNUSED Object *obj, UNUSED LevelObjectEntry_Unknown94 *entry, UNUSED s32 arg2) { } -void obj_loop_unknown94(UNUSED Object *obj, s32 UNUSED speed) { +void obj_loop_unknown94(UNUSED Object *obj, s32 UNUSED updateRate) { } void obj_init_rangetrigger(UNUSED Object *obj, UNUSED LevelObjectEntry_RangeTrigger *entry) { } -void obj_loop_rangetrigger(Object *obj, s32 speed) { +void obj_loop_rangetrigger(Object *obj, s32 updateRate) { UNUSED s32 temp; LevelObjectEntry_RangeTrigger *level_entry; unk80042178 sp20; @@ -4330,7 +4581,7 @@ void obj_loop_rangetrigger(Object *obj, s32 speed) { } else { obj->unk74 = 0; } - func_800AFC3C(obj, speed); + func_800AFC3C(obj, updateRate); } void obj_init_frog(Object *obj, LevelObjectEntry_Frog *entry) { @@ -4467,7 +4718,7 @@ void obj_loop_frog(Object *obj, s32 updateRate) { frog->unk16 = get_random_number_from_range(0, 300); frog->unk18 = 0; } - obj->segment.unk18 = ((32 - frog->unk18) << 3) / 3; + obj->segment.animFrame = ((32 - frog->unk18) << 3) / 3; cosine = (coss_f(frog->unk18 << 10) + 1.0f) * 0.5f; obj->segment.trans.x_position = frog->unk20; obj->segment.trans.z_position = frog->unk24; @@ -4523,18 +4774,18 @@ void obj_loop_frog(Object *obj, s32 updateRate) { } } -void obj_loop_pigrocketeer(Object *obj, s32 speed) { +void obj_loop_pigrocketeer(Object *obj, s32 updateRate) { Object *someObj; Object_Wizpig2 *obj64; - func_8001F460(obj, speed, obj); + func_8001F460(obj, updateRate, obj); someObj = func_8000BF44(-1); if (someObj != NULL) { obj64 = &someObj->unk64->wizpig2; someObj->action = 0; if (obj64 != 0) { - obj64->unk72 += speed; + obj64->unk72 += updateRate; obj64->unk70 = 2; obj64->unk74 = 1.0f; func_8000B750(obj, -1, 2, 1, 1); @@ -4610,8 +4861,8 @@ void obj_loop_levelname(Object *obj, s32 updateRate) { } } -void obj_loop_wizghosts(Object *obj, s32 speed) { - func_8001F460(obj, speed, obj); - obj->segment.unk18 = (obj->segment.unk18 + (speed * 8)) & 0xFF; +void obj_loop_wizghosts(Object *obj, s32 updateRate) { + func_8001F460(obj, updateRate, obj); + obj->segment.animFrame = (obj->segment.animFrame + (updateRate * 8)) & 0xFF; } diff --git a/src/object_functions.h b/src/object_functions.h index 5013fa48..f66b10e5 100644 --- a/src/object_functions.h +++ b/src/object_functions.h @@ -276,75 +276,75 @@ void obj_init_fireball_octoweapon(Object *obj, LevelObjectEntry_Fireball_Octowea void obj_init_lasergun(Object *obj, LevelObjectEntry_Lasergun *entry); void obj_init_laserbolt(Object *obj, LevelObjectEntry_Laserbolt *entry); void obj_init_torch_mist(Object *obj, LevelObjectEntry_Torch_Mist *entry); -void obj_loop_torch_mist(Object *obj, s32 speed); +void obj_loop_torch_mist(Object *obj, s32 updateRate); void obj_init_effectbox(Object *obj, LevelObjectEntry_EffectBox *entry); void obj_init_trophycab(Object *obj, LevelObjectEntry_TrophyCab *entry); void obj_init_collectegg(Object *obj, LevelObjectEntry_CollectEgg *entry); void obj_init_eggcreator(Object *obj, LevelObjectEntry_EggCreator *entry); -void obj_loop_eggcreator(Object *obj, s32 speed); +void obj_loop_eggcreator(Object *obj, s32 updateRate); void obj_init_lighthouse_rocketsignpost(Object *obj, LevelObjectEntry_Lighthouse_RocketSignpost *entry); -void obj_loop_rocketsignpost(Object *obj, s32 speed); +void obj_loop_rocketsignpost(Object *obj, s32 updateRate); void obj_init_airzippers_waterzippers(Object *obj, LevelObjectEntry_AirZippers_WaterZippers *entry); void obj_init_unknown58(Object *obj, LevelObjectEntry_Unknown58 *entry); -void obj_loop_unknown58(Object *obj, s32 speed); +void obj_loop_unknown58(Object *obj, s32 updateRate); void obj_init_characterflag(Object *obj, LevelObjectEntry_CharacterFlag *entry); -void obj_loop_characterflag(Object *obj, s32 speed); +void obj_loop_characterflag(Object *obj, s32 updateRate); void obj_init_stopwatchman(Object *obj, LevelObjectEntry_StopWatchMan *entry); void play_tt_voice_clip(u16 soundID, s32 interrupt); void obj_init_lavaspurt(Object *obj, LevelObjectEntry_LavaSpurt *entry); void obj_init_posarrow(Object *obj, LevelObjectEntry_PosArrow *entry); void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 arg2); -void obj_loop_animobject(Object *obj, s32 speed); -void obj_loop_dooropener(Object *obj, s32 speed); +void obj_loop_animobject(Object *obj, s32 updateRate); +void obj_loop_dooropener(Object *obj, s32 updateRate); void obj_init_overridepos(Object *obj, LevelObjectEntry_OverridePos *entry); void func_80037D60(s32 arg0, s32 arg1); void obj_init_wizpigship(Object *obj, LevelObjectEntry_WizpigShip *entry); void obj_init_hittester(Object *obj, LevelObjectEntry_HitTester *entry); -void obj_loop_hittester(Object *obj, s32 speed); +void obj_loop_hittester(Object *obj, s32 updateRate); void obj_init_dynamic_lighting_object(Object *obj, LevelObjectEntry_DynamicLightingObject *entry); void obj_init_unknown96(Object *obj, LevelObjectEntry_Unknown96 *entry); void obj_init_snowball(Object *obj, LevelObjectEntry_Snowball *entry); void func_80038330(s32 arg0, s32 arg1); -void obj_loop_animcamera(Object *obj, s32 speed); +void obj_loop_animcamera(Object *obj, s32 updateRate); void func_800387C0(s32 arg0, s32 arg1); -void obj_loop_animcar(Object *obj, s32 speed); +void obj_loop_animcar(Object *obj, s32 updateRate); void obj_init_infopoint(Object *obj, LevelObjectEntry_InfoPoint *entry); -void obj_loop_infopoint(Object *obj, s32 speed); +void obj_loop_infopoint(Object *obj, s32 updateRate); void obj_init_smoke(Object *obj, LevelObjectEntry_Smoke *entry); -void obj_loop_smoke(Object *obj, s32 speed); +void obj_loop_smoke(Object *obj, s32 updateRate); void obj_init_unknown25(Object *obj, LevelObjectEntry_Unknown25 *entry); -void obj_loop_unknown25(Object *obj, s32 speed); +void obj_loop_unknown25(Object *obj, s32 updateRate); void obj_init_wardensmoke(Object *obj, LevelObjectEntry_WardenSmoke *entry); -void obj_loop_wardensmoke(Object *obj, s32 speed); +void obj_loop_wardensmoke(Object *obj, s32 updateRate); void obj_init_teleport(Object *obj, LevelObjectEntry_Teleport *entry); -void obj_loop_teleport(Object *obj, s32 speed); +void obj_loop_teleport(Object *obj, s32 updateRate); void obj_init_exit(Object *obj, LevelObjectEntry_Exit *entry); void obj_init_cameracontrol(Object *obj, LevelObjectEntry_CameraControl *entry); -void obj_loop_cameracontrol(Object *obj, s32 speed); +void obj_loop_cameracontrol(Object *obj, s32 updateRate); void obj_init_setuppoint(Object *obj, LevelObjectEntry_SetupPoint *entry); -void obj_loop_setuppoint(Object *obj, s32 speed); +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 speed); +void obj_loop_dino_whale(Object *obj, s32 updateRate); void obj_init_parkwarden(Object *obj, LevelObjectEntry_Parkwarden *entry); void func_80039320(s16 voiceClip); void play_taj_voice_clip(u16 soundID, s32 interrupt); -void obj_loop_gbparkwarden(Object *obj, s32 speed); +void obj_loop_gbparkwarden(Object *obj, s32 updateRate); f32 func_8003ACAC(void); void obj_init_checkpoint(Object *obj, LevelObjectEntry_Checkpoint *entry, s32 arg2); -void obj_loop_checkpoint(Object *obj, s32 speed); +void obj_loop_checkpoint(Object *obj, s32 updateRate); void obj_init_modechange(Object *obj, LevelObjectEntry_ModeChange *entry); void obj_init_bonus(Object *obj, LevelObjectEntry_Bonus *entry); void obj_init_ttdoor(Object *obj, LevelObjectEntry_TTDoor *entry); void obj_init_bridge_whaleramp(Object *obj, LevelObjectEntry_Bridge_WhaleRamp *entry); void obj_init_rampswitch(Object *obj, LevelObjectEntry_RampSwitch *entry); -void obj_loop_rampswitch(Object *obj, s32 speed); +void obj_loop_rampswitch(Object *obj, s32 updateRate); void obj_init_seamonster(Object *obj, LevelObjectEntry_SeaMonster *entry); -void obj_loop_seamonster(Object *obj, s32 speed); +void obj_loop_seamonster(Object *obj, s32 updateRate); void obj_init_fogchanger(Object *obj, LevelObjectEntry_FogChanger *entry); void obj_init_skycontrol(Object *obj, LevelObjectEntry_SkyControl *entry); -void obj_loop_skycontrol(Object *obj, s32 speed); +void obj_loop_skycontrol(Object *obj, s32 updateRate); void obj_init_ainode(Object *obj, LevelObjectEntry_AiNode *entry); -void obj_loop_ainode(Object *obj, s32 speed); +void obj_loop_ainode(Object *obj, s32 updateRate); void obj_init_treasuresucker(Object *obj, LevelObjectEntry_TreasureSucker *entry); void obj_init_flycoin(Object *obj, LevelObjectEntry_FlyCoin *entry); void obj_init_bananacreator(Object *obj, LevelObjectEntry_BananaCreator *entry); @@ -352,11 +352,11 @@ void obj_init_banana(Object *obj, LevelObjectEntry_Banana *entry); void obj_init_silvercoin_adv2(Object *obj, LevelObjectEntry_SilverCoinAdv2 *entry); void obj_init_silvercoin(Object *obj, LevelObjectEntry_SilverCoin *entry); void obj_init_worldkey(Object *obj, LevelObjectEntry_WorldKey *entry); -void obj_loop_worldkey(Object *worldKeyObj, s32 speed); +void obj_loop_worldkey(Object *worldKeyObj, s32 updateRate); void obj_init_wballoonpop(Object *obj, LevelObjectEntry_WBalloonPop *entry); -void obj_loop_wballoonpop(Object *obj, s32 speed); +void obj_loop_wballoonpop(Object *obj, s32 updateRate); void obj_init_weapon(Object *obj, LevelObjectEntry_Weapon *entry); -void obj_loop_weapon(Object *obj, s32 speed); +void obj_loop_weapon(Object *obj, s32 updateRate); void func_8003F0D0(void); void func_8003F0DC(void); void obj_init_audioline(Object *obj, LevelObjectEntry_AudioLine *entry); @@ -364,21 +364,21 @@ void obj_init_audioreverb(Object *obj, LevelObjectEntry_AudioReverb *entry); void obj_init_texscroll(Object *obj, LevelObjectEntry_TexScroll *entry, s32 arg2); void obj_init_rgbalight(Object *obj, LevelObjectEntry_RgbaLight *entry, s32 arg2); void obj_init_buoy_pirateship(Object *obj, LevelObjectEntry_Buoy_PirateShip *entry, s32 arg2); -void obj_loop_buoy_pirateship(Object *obj, s32 speed); +void obj_loop_buoy_pirateship(Object *obj, s32 updateRate); void obj_init_log(Object *obj, LevelObjectEntry_Log *entry, s32 arg2); void obj_init_wavegenerator(Object *obj, LevelObjectEntry_WaveGenerator *entry, s32 arg2); void obj_init_midichset(Object *obj, LevelObjectEntry_Midichset *entry); void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry); -void obj_loop_bubbler(Object *obj, s32 speed); +void obj_loop_bubbler(Object *obj, s32 updateRate); void obj_init_boost(Object *obj, LevelObjectEntry_Boost *entry); void obj_init_unknown94(Object *obj, LevelObjectEntry_Unknown94 *entry, s32 arg2); -void obj_loop_unknown94(Object *obj, s32 speed); +void obj_loop_unknown94(Object *obj, s32 updateRate); void obj_init_rangetrigger(Object *obj, LevelObjectEntry_RangeTrigger *entry); -void obj_loop_rangetrigger(Object *obj, s32 speed); +void obj_loop_rangetrigger(Object *obj, s32 updateRate); void obj_init_frog(Object *obj, LevelObjectEntry_Frog *entry); -void obj_loop_pigrocketeer(Object *obj, s32 speed); +void obj_loop_pigrocketeer(Object *obj, s32 updateRate); void obj_init_levelname(Object *obj, LevelObjectEntry_LevelName *entry); -void obj_loop_wizghosts(Object *obj, s32 speed); +void obj_loop_wizghosts(Object *obj, s32 updateRate); void obj_loop_ttdoor(Object *obj, s32 updateRate); void obj_loop_trophycab(Object *obj, s32 updateRate); void obj_loop_wizpigship(Object* wizShipObj, s32 updateRate); @@ -408,11 +408,11 @@ void obj_loop_lasergun(Object *obj, s32 updateRate); void func_8003F0F8(Object *obj, struct Object_Weapon *weapon, u16 soundID); //Non Matching -void obj_loop_lavaspurt(Object *obj, s32 speed); -void obj_loop_animator(Object *obj, s32 speed); -void obj_loop_vehicleanim(Object *obj, s32 speed); -void obj_loop_snowball(Object *obj, s32 speed); -void obj_loop_goldenballoon(Object *obj, s32 speed); +void obj_loop_lavaspurt(Object *obj, s32 updateRate); +void obj_loop_animator(Object *obj, s32 updateRate); +void obj_loop_vehicleanim(Object *obj, s32 updateRate); +void obj_loop_snowball(Object *obj, s32 updateRate); +void obj_loop_goldenballoon(Object *obj, s32 updateRate); void obj_loop_groundzipper(Object *obj, s32 updateRate); void obj_loop_laserbolt(Object *obj, s32 updateRate); void obj_loop_posarrow(Object *obj, s32 updateRate); @@ -440,6 +440,7 @@ void obj_init_bombexplosion(Object *obj, LevelObjectEntry_BombExplosion *entry); void obj_init_fish(Object *obj, LevelObjectEntry_Fish *entry); void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry); void calc_env_mapping_for_object(ObjectModel *, s16, s16, s16); +void handle_rocket_projectile(Object *obj, s32 updateRate); s32 func_8001C524(f32 x, f32 y, f32 z, s32 arg3); s32 func_8001CC48(s32, s32, s32); @@ -448,12 +449,13 @@ void func_8000CBF0(Object*, s32); void func_8001EE74(); -void func_8001EFA4(Object*, Object_Animation*); +void func_8001EFA4(Object *, Object_Animation*); void func_8001F23C(Object *obj, LevelObjectEntry_Animation *entry); s32 func_8001F3EC(s32); s32 func_80021600(s32); -void func_80036040(Object*, Object_64*); -void func_8003E694(Object *, s32 updateRate); +void func_80036040(Object *, Object_64*); void func_8003F2E8(Object *, s32 updateRate); +void func_8003EC14(Object *, s32, Object_Weapon*); +void func_8003EDD8(Object *, s32, Object_Weapon*); #endif diff --git a/src/object_models.c b/src/object_models.c index 8e6b7816..ed4496ed 100644 --- a/src/object_models.c +++ b/src/object_models.c @@ -100,7 +100,7 @@ void func_8005FF40(ObjectModel **modelPtr) { D_8011D628[D_8011D634] = modelIndex; D_8011D634++; D_8011D624[modelIndex].unk0 = -1; - D_8011D624[modelIndex].model = (ObjectModel *)-1; + D_8011D624[modelIndex].model = (ObjectModel *) -1; free_from_memory_pool(modelPtr); } } @@ -194,11 +194,11 @@ void func_80061C0C(Object *obj) { } else { var_v1 = 0; } - if (obj->segment.unk18 >> 4 < 0) { - obj->segment.unk18 = var_v1; + if (obj->segment.animFrame >> 4 < 0) { + obj->segment.animFrame = var_v1; } - if (var_v1 < obj->segment.unk18 >> 4) { - obj->segment.unk18 = 0; + if (var_v1 < obj->segment.animFrame >> 4) { + obj->segment.animFrame = 0; temp_a1->unk10 = -1; } } diff --git a/src/object_models.h b/src/object_models.h index ecdb7264..6741299f 100644 --- a/src/object_models.h +++ b/src/object_models.h @@ -19,6 +19,6 @@ void func_800619F4(s32 arg0); void func_80061C0C(Object* obj); void free_object_model(ObjectModel *model); //Non Matching -void func_8005FF40(ObjectModel **modelPtr); //Non Matching +void func_8005FF40(ObjectModel **modelPtr); #endif diff --git a/src/objects.c b/src/objects.c index 70fec9ed..1b28a01d 100644 --- a/src/objects.c +++ b/src/objects.c @@ -22,6 +22,11 @@ #include "camera.h" #include "waves.h" #include "object_functions.h" +#include "object_models.h" + +#define MAX_CHECKPOINTS 60 +#define OBJECT_POOL_SIZE 0x15800 +#define OBJECT_SLOT_COUNT 512 /************ .data ************/ @@ -108,21 +113,21 @@ u16 D_800DC864 = 0x0028; /************ .rodata ************/ -const char D_800E4F60[] = "Objects out of ram(1) !!\n"; -const char D_800E4F7C[] = "Door numbering error %d!!\n"; -const char D_800E4F98[] = "objGetScope: Unknown scope for object %d\n"; -const char D_800E4FC4[] = "ObjList (Part) Overflow %d!!!\n"; -const char D_800E4FE4[] = "ObjSetupObject(1) Memory fail!!\n"; -const char D_800E5008[] = "ObjSetupObject(2) Memory fail!!\n"; -const char D_800E502C[] = "ObjSetupObject(5) Memory fail!!\n"; -const char D_800E5050[] = "ObjSetupObject(6) Memory fail!!\n"; -const char D_800E5074[] = "ObjSetupObject(3) Memory fail!!\n"; -const char D_800E5098[] = "ObjList Overflow %d!!!\n"; -const char D_800E50B0[] = "ObjSetupObject(4) Memory fail!!\n"; -const char D_800E50D4[] = "Error: Multiple checkpoint no: %d !!\n"; -const char D_800E50FC[] = "ERROR Channel %d\n"; -const char D_800E5110[] = "RO error %d!!\n"; -const char D_800E5120[] = "ARGHHHHHHHHH\n"; +UNUSED const char sObjectOutofMemString[] = "Objects out of ram(1) !!\n"; +UNUSED const char sDoorNumberErrorString[] = "Door numbering error %d!!\n"; +UNUSED const char sObjectScopeErrorString[] = "objGetScope: Unknown scope for object %d\n"; +UNUSED const char sObjectListDataOverflowString[] = "ObjList (Part) Overflow %d!!!\n"; +UNUSED const char sObjectSetupError1String[] = "ObjSetupObject(1) Memory fail!!\n"; +UNUSED const char sObjectSetupError2String[] = "ObjSetupObject(2) Memory fail!!\n"; +UNUSED const char sObjectSetupError5String[] = "ObjSetupObject(5) Memory fail!!\n"; +UNUSED const char sObjectSetupError6String[] = "ObjSetupObject(6) Memory fail!!\n"; +UNUSED const char sObjectSetupError3String[] = "ObjSetupObject(3) Memory fail!!\n"; +UNUSED const char sObjectListOverflowString[] = "ObjList Overflow %d!!!\n"; +UNUSED const char sObjectSetupError4String[] = "ObjSetupObject(4) Memory fail!!\n"; +UNUSED const char sDuplicateCheckpointString[] = "Error: Multiple checkpoint no: %d !!\n"; +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; /*********************************/ @@ -196,7 +201,7 @@ Object **gObjPtrList; // Not sure about the number of elements s32 objCount; s32 D_8011AE60; s32 D_8011AE64; -s32 *D_8011AE68; +Object *gObjectMemoryPool; s32 *D_8011AE6C; s32 D_8011AE70; Object **D_8011AE74; @@ -220,8 +225,8 @@ s32 gAssetsLvlObjTranslationTableLength; s32 D_8011AEC0; Object **gParticlePtrList; s32 gParticleCount; -unknown8011AECC *D_8011AECC; // Array of structs, unknown number of members -s32 D_8011AED0; +CheckpointNode *gTrackCheckpoints; // Array of structs, unknown number of members +s32 gNumberOfCheckpoints; s32 D_8011AED4; s16 D_8011AED8; u32 (*D_8011AEDC)[64]; // Not sure about the number of elements @@ -332,19 +337,19 @@ Object *func_8000BF44(s32 arg0) { return D_8011B020[arg0]; } -void func_8000BF8C(void) { +void allocate_object_pools(void) { s32 i; func_8001D258(0.67f, 0.33f, 0, -0x2000, 0); - D_8011AE68 = (s32 *) new_sub_memory_pool(0x15800, 0x200); - gParticlePtrList = (Object **) allocate_from_main_pool_safe(0x320, COLOUR_TAG_BLUE); + gObjectMemoryPool = (Object *) new_sub_memory_pool(OBJECT_POOL_SIZE, OBJECT_SLOT_COUNT); + gParticlePtrList = (Object **) allocate_from_main_pool_safe(sizeof(uintptr_t) * 200, COLOUR_TAG_BLUE); D_8011AE6C = (s32 *) allocate_from_main_pool_safe(0x50, COLOUR_TAG_BLUE); D_8011AE74 = (Object **) allocate_from_main_pool_safe(0x200, COLOUR_TAG_BLUE); - D_8011AECC = (unknown8011AECC *) allocate_from_main_pool_safe(0xE10, COLOUR_TAG_BLUE); + gTrackCheckpoints = (CheckpointNode *) allocate_from_main_pool_safe(sizeof(CheckpointNode) * MAX_CHECKPOINTS, COLOUR_TAG_BLUE); D_8011AEDC = allocate_from_main_pool_safe(0x50, COLOUR_TAG_BLUE); - gRacers = allocate_from_main_pool_safe(0x28, COLOUR_TAG_BLUE); - gRacersByPort = (Object **) allocate_from_main_pool_safe(0x28, COLOUR_TAG_BLUE); - gRacersByPosition = (Object **) allocate_from_main_pool_safe(0x28, COLOUR_TAG_BLUE); + gRacers = allocate_from_main_pool_safe(sizeof(uintptr_t) * 10, COLOUR_TAG_BLUE); + gRacersByPort = (Object **) allocate_from_main_pool_safe(sizeof(uintptr_t) * 10, COLOUR_TAG_BLUE); + gRacersByPosition = (Object **) allocate_from_main_pool_safe(sizeof(uintptr_t) * 10, COLOUR_TAG_BLUE); D_8011AF04 = allocate_from_main_pool_safe(0x200, COLOUR_TAG_BLUE); D_8011ADCC = allocate_from_main_pool_safe(8, COLOUR_TAG_BLUE); D_8011AFF4 = (unk800179D0 *) allocate_from_main_pool_safe(0x400, COLOUR_TAG_BLUE); @@ -353,7 +358,7 @@ void func_8000BF8C(void) { while (gAssetsLvlObjTranslationTable[gAssetsLvlObjTranslationTableLength] == 0) { gAssetsLvlObjTranslationTableLength--; } - D_8011AD58 = (s32 *)allocate_from_main_pool_safe(0x800, COLOUR_TAG_BLUE); + D_8011AD58 = (s32 *) allocate_from_main_pool_safe(0x800, COLOUR_TAG_BLUE); gAssetsObjectHeadersTable = (s32 *) load_asset_section_from_rom(ASSET_OBJECT_HEADERS_TABLE); gAssetsObjectHeadersTableLength = 0; while (-1 != gAssetsObjectHeadersTable[gAssetsObjectHeadersTableLength]) { @@ -375,7 +380,7 @@ void func_8000BF8C(void) { } decrypt_magic_codes(&gAssetsMiscSection[gAssetsMiscTable[65]], (gAssetsMiscTable[66] - gAssetsMiscTable[65]) * 4); - gObjPtrList = (Object **)allocate_from_main_pool_safe(0x800, COLOUR_TAG_BLUE); + gObjPtrList = (Object **) allocate_from_main_pool_safe(sizeof(uintptr_t) * OBJECT_SLOT_COUNT, COLOUR_TAG_BLUE); D_8011ADC4 = 0; gTimeTrialEnabled = 0; D_8011AEF5 = 0; @@ -418,7 +423,7 @@ void func_8000C460(void) { D_8011AD60 = 0; gParticleCount = 0; D_8011AE70 = 0; - D_8011AED0 = 0; + gNumberOfCheckpoints = 0; D_8011AED4 = 0; gNumRacers = 0; D_8011AE78 = 0; @@ -743,6 +748,9 @@ GLOBAL_ASM("asm/non_matchings/objects/func_8000E5EC.s") GLOBAL_ASM("asm/non_matchings/objects/func_8000E79C.s") GLOBAL_ASM("asm/non_matchings/objects/func_8000E898.s") +/** + * Returns the object at the current offset by ID. +*/ Object *get_object(s32 index) { if (index < 0 || index >= objCount) { return 0; @@ -770,12 +778,34 @@ void func_8000E9D0(Object *arg0) { arg0->segment.trans.unk6 |= 0x8000; func_800245B4(arg0->segment.unk2C.half.upper | 0xC000); gObjPtrList[objCount++] = arg0; - if (1){} + if (1) {} // Fakematch D_8011AE64++; } GLOBAL_ASM("asm/non_matchings/objects/spawn_object.s") -GLOBAL_ASM("asm/non_matchings/objects/func_8000F648.s") + +void func_8000F648(Object *obj, s32 count, s32 objType) { + s32 i; + if (objType == 0) { // 3D model + for (i = 0; i < count; i++) { + if (obj->unk68[i] != NULL) { + func_8005FF40((ObjectModel **) (s32) obj->unk68[i]); + } + } + } else if (objType == 4) { + for (i = 0; i < count; i++) { + if (obj->unk68[i] != NULL) { + free_texture((TextureHeader *) (s32) obj->unk68[i]); + } + } + } else { // Sprite + for (i = 0; i < count; i++) { + if (obj->unk68[i] != NULL) { + free_sprite((Sprite *) (s32) obj->unk68[i]); + } + } + } +} void func_8000F758(Object *obj) { s32 i; @@ -1061,7 +1091,7 @@ s32 func_80011570(Object *obj, f32 xPos, f32 yPos, f32 zPos) { return 0; } -void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 arg6, u32 arg7, f32 arg8) { +void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 flags, u32 texOffset, f32 arg8) { s32 hasTexture = FALSE; func_80069484(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, arg8, 0.0f); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); @@ -1069,7 +1099,7 @@ void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triang if (tex != NULL) { hasTexture = TRUE; } - load_and_set_texture(&gObjectCurrDisplayList, (TextureHeader* ) tex, (s32) arg6, (s32) arg7); + load_and_set_texture(&gObjectCurrDisplayList, (TextureHeader* ) tex, flags, texOffset); gSPVertexDKR(gObjectCurrDisplayList++, OS_K0_TO_PHYSICAL(verts), numVertices, 0); gSPPolygon(gObjectCurrDisplayList++, OS_K0_TO_PHYSICAL(triangles), numTriangles, hasTexture); func_80069A40(&gObjectCurrDisplayList); @@ -1204,7 +1234,7 @@ void render_3d_billboard(Object *obj) { sp60.trans.x_position = 0.0f; sp60.trans.z_position = 0.0f; sp60.trans.y_position = 12.0f; - sp60.unk18 = obj->segment.unk18; + sp60.unk18 = obj->segment.animFrame; sp60.unk1A = 32; if (var_a0 == NULL) { var_a0 = (Object *) obj->unk64->weapon.target; @@ -1532,7 +1562,48 @@ void func_80016BC4(unk8000FD34 *arg0) { GLOBAL_ASM("asm/non_matchings/objects/func_80016C68.s") GLOBAL_ASM("asm/non_matchings/objects/func_80016DE8.s") -GLOBAL_ASM("asm/non_matchings/objects/func_8001709C.s") + +void func_8001709C(Object *obj) { + ObjectTransform sp78; + s32 i; + f32 inverseScale; + Matrix *sp6C; + Matrix sp2C; + Object_5C *obj5C; + + obj5C = obj->unk5C; + obj5C->unk104 = (obj5C->unk104 + 1) & 1; + sp6C = (Matrix *) &obj5C->_matrices[obj5C->unk104 << 1]; + sp78.y_rotation = -obj->segment.trans.y_rotation; + sp78.x_rotation = -obj->segment.trans.x_rotation; + sp78.z_rotation = -obj->segment.trans.z_rotation; + sp78.scale = 1.0f; + sp78.x_position = -obj->segment.trans.x_position; + sp78.y_position = -obj->segment.trans.y_position; + sp78.z_position = -obj->segment.trans.z_position; + object_transform_to_matrix_2((float (*)[4]) sp6C, (ObjectTransform* ) &sp78); + inverseScale = 1.0 / obj->segment.trans.scale; + i = 0; + while (i < 16) { + ((f32 *) sp2C)[i] = 0.0f; + i++; + } + sp2C[0][0] = inverseScale; + sp2C[1][1] = inverseScale; + sp2C[2][2] = inverseScale; + sp2C[3][3] = 1.0f; + f32_matrix_mult(sp6C, &sp2C, sp6C); + sp78.y_rotation = obj->segment.trans.y_rotation; + sp78.x_rotation = obj->segment.trans.x_rotation; + sp78.z_rotation = obj->segment.trans.z_rotation; + sp78.scale = 1.0 / inverseScale; + sp78.x_position = obj->segment.trans.x_position; + sp78.y_position = obj->segment.trans.y_position; + sp78.z_position = obj->segment.trans.z_position; + object_transform_to_matrix(obj5C->_matrices[(obj5C->unk104 + 2) << 1], (ObjectTransform* ) &sp78); + obj5C->unk100 = NULL; +} + GLOBAL_ASM("asm/non_matchings/objects/func_80017248.s") unk800179D0 *func_8001790C(u32 *arg0, u32 *arg1) { @@ -1604,7 +1675,26 @@ Object *func_80018C6C(void) { GLOBAL_ASM("asm/non_matchings/objects/func_80018CE0.s") GLOBAL_ASM("asm/non_matchings/objects/func_8001955C.s") GLOBAL_ASM("asm/non_matchings/objects/func_80019808.s") -GLOBAL_ASM("asm/non_matchings/objects/func_8001A7D8.s") + +s8 func_8001A7D8(unk8001A7D8_arg0 *arg0) { + Object_Racer *racer; + + racer = (Object_Racer *) gRacersByPosition[0]->unk64; + if (racer->playerIndex == PLAYER_COMPUTER) { + return 0; + } + D_8011ADC4 = 0; + if (!(arg0->unk4[arg0->unk49] & 2)) { + if (D_8011AEF5 == 0) { + D_8011ADC4 = 1; + arg0->unk4[arg0->unk49] |= 2; + } + } else if (gIsSilverCoinRace && racer->silverCoinCount >= 8 && D_8011AEF5 == 0) { + D_8011ADC4 = 1; + arg0->unk4[arg0->unk49] |= 4; + } + return D_8011ADC4; +} void func_8001A8D4(s32 arg0) { D_8011AD4E = 0x12C; @@ -1742,9 +1832,9 @@ f32 func_8001B834(Object_Racer *racer1, Object_Racer *racer2) { s32 r1_ccp; UNUSED s32 temp_lo; s32 var_v1; - s32 r1_lcp; + s32 checkpointID; - if (D_8011AED0 <= 0) { + if (gNumberOfCheckpoints <= 0) { return 0.0f; } var_f2 = 0.0f; @@ -1755,23 +1845,23 @@ f32 func_8001B834(Object_Racer *racer1, Object_Racer *racer2) { racer2 = temp_racer; var_v1 = TRUE; } - r1_lcp = racer1->checkpoint; + checkpointID = racer1->checkpoint; for (r1_ccp = racer1->courseCheckpoint; r1_ccp < racer2->courseCheckpoint; r1_ccp++) { - var_f2 += D_8011AECC[r1_lcp++].unk20; - if (r1_lcp == D_8011AED0) { - r1_lcp = 0; + var_f2 += gTrackCheckpoints[checkpointID++].distance; + if (checkpointID == gNumberOfCheckpoints) { + checkpointID = 0; } } - r1_lcp = racer1->checkpoint - 1; - if (r1_lcp < 0) { - r1_lcp = D_8011AED0 - 1; + checkpointID = racer1->checkpoint - 1; + if (checkpointID < 0) { + checkpointID = gNumberOfCheckpoints - 1; } - var_f2 += (D_8011AECC[r1_lcp].unk20 * racer1->checkpoint_distance); - r1_lcp = racer2->checkpoint - 1; - if (r1_lcp < 0) { - r1_lcp = D_8011AED0 - 1; + var_f2 += (gTrackCheckpoints[checkpointID].distance * racer1->checkpoint_distance); + checkpointID = racer2->checkpoint - 1; + if (checkpointID < 0) { + checkpointID = gNumberOfCheckpoints - 1; } - var_f2 -= (D_8011AECC[r1_lcp].unk20 * racer2->checkpoint_distance); + var_f2 -= (gTrackCheckpoints[checkpointID].distance * racer2->checkpoint_distance); if (var_v1) { var_f2 = -var_f2; } @@ -1780,50 +1870,68 @@ f32 func_8001B834(Object_Racer *racer1, Object_Racer *racer2) { UNUSED f32 func_8001B974(Object_Racer* racer) { f32 distLeft; - s32 lapChkPts; + s32 checkpointID; - if (D_8011AED0 <= 0) { + if (gNumberOfCheckpoints <= 0) { return 0.0f; } distLeft = 0.0f; - for (lapChkPts = racer->checkpoint; lapChkPts < D_8011AED0; lapChkPts++) { - distLeft += D_8011AECC[lapChkPts].unk20; + for (checkpointID = racer->checkpoint; checkpointID < gNumberOfCheckpoints; checkpointID++) { + distLeft += gTrackCheckpoints[checkpointID].distance; } - lapChkPts = racer->checkpoint - 1; - if (lapChkPts < 0) { - lapChkPts = D_8011AED0 - 1; + checkpointID = racer->checkpoint - 1; + if (checkpointID < 0) { + checkpointID = gNumberOfCheckpoints - 1; } - distLeft += (D_8011AECC[lapChkPts].unk20 * racer->checkpoint_distance); + distLeft += (gTrackCheckpoints[checkpointID].distance * racer->checkpoint_distance); return distLeft; } -// Returns a pointer to some struct that is 0x3C bytes long. -unknown8011AECC *func_8001BA00(s32 arg0) { - return &D_8011AECC[arg0]; +/** + * Returns a pointer to a specific checkpoint. +*/ +CheckpointNode *get_checkpoint_node(s32 checkpointID) { + return &gTrackCheckpoints[checkpointID]; } -unknown8011AECC *func_8001BA1C(s32 arg0, s32 arg1) { - unknown8011AECC *val = &D_8011AECC[arg0]; - if (arg1 != 0 && val->unk3A != -1) { - val = &D_8011AECC[val->unk3A]; +/** + * Takes the position along the checkpoint path, and finds the next applicable node. + * If an alternative path is available, use that node instead. +*/ +CheckpointNode *find_next_checkpoint_node(s32 splinePos, s32 arg1) { + CheckpointNode *checkpointNode = &gTrackCheckpoints[splinePos]; + if (arg1 != 0 && checkpointNode->altRouteID != -1) { + checkpointNode = &gTrackCheckpoints[checkpointNode->altRouteID]; } - return val; + return checkpointNode; } -s32 func_8001BA64() { - return D_8011AED0; +/** + * Returns the number of active checkpoints in the current level. +*/ +s32 get_checkpoint_count(void) { + return gNumberOfCheckpoints; } +/** + * Returns the group of racer objects. +*/ Object **get_racer_objects(s32 *numRacers) { *numRacers = gNumRacers; return *gRacers; } +/** + * Returns the group of racer objects, ordered by player index. +*/ Object **get_racer_objects_by_port(s32 *numRacers) { *numRacers = gNumRacers; return gRacersByPort; } +/** + * Returns the group of racer objects, ordered by current race position. +*/ Object **get_racer_objects_by_position(s32 *numRacers) { *numRacers = gNumRacers; return gRacersByPosition; @@ -1849,9 +1957,31 @@ Object *get_racer_object_by_port(s32 index) { return gRacersByPort[index]; } -GLOBAL_ASM("asm/non_matchings/objects/func_8001BB68.s") +/** + * Unused function that would've iterated through all active checkpoints to render their visual nodes. + * The function it calls is completely stubbed out. +*/ +UNUSED void debug_render_checkpoints(Gfx **dlist, MatrixS **mtx, Vertex **vtx) { + s32 i; -UNUSED void func_8001BC40(UNUSED s32 arg0, UNUSED s32 arg1, UNUSED s32 arg2, UNUSED s32 arg3) { + load_and_set_texture_no_offset(dlist, NULL, RENDER_Z_COMPARE); + if (gNumberOfCheckpoints > 3) { + for (i = 0; i < gNumberOfCheckpoints; i++) { + // Ground path + debug_render_checkpoint_node(i, 0, dlist, mtx, vtx); + } + for (i = 0; i < gNumberOfCheckpoints; i++){ + // Air path + debug_render_checkpoint_node(i, 1, dlist, mtx, vtx); + } + } +} + +/** + * Would've rendered an individual checkpoint node. On https://noclip.website, with dev objects enabled, you can see a visual representation of + * what these checkpoints would've looked like ingame. +*/ +UNUSED void debug_render_checkpoint_node(UNUSED s32 checkpointID, UNUSED s32 pathID, UNUSED Gfx **dList, UNUSED MatrixS **mtx, UNUSED Vertex **vtx) { } GLOBAL_ASM("asm/non_matchings/objects/func_8001BC54.s") @@ -2166,7 +2296,45 @@ s8 func_800214C4(void) { return D_8011AD22[1 - D_8011AD20[1]]; } -GLOBAL_ASM("asm/non_matchings/objects/func_800214E4.s") +s8 func_800214E4(Object *obj, s32 updateRate) { + s16 temp_v1; + s32 i; + Object_AnimatedObject *animObj; + + animObj = (Object_AnimatedObject *) obj->unk64; + if (animObj->unk3A != 0) { + obj->segment.trans.unk6 |= 0x4000; + } + if (animObj->unk36 == -1) { + return animObj->unk3A; + } + if (animObj->unk36 >= 0) { + animObj->unk36 -= updateRate; + } + if (animObj->unk36 == -1) { + animObj->unk36 = -2; + } + if (animObj->unk36 <= 0) { + obj->segment.trans.unk6 |= 0x4000; + i = 0; + if (D_8011AE78 > 0) { + temp_v1 = animObj->unk28; + if (temp_v1 != (s32) (*D_8011AE74)->unk7C.word) { +loop_11: + i++; + if (i < D_8011AE78) { + if (temp_v1 != (s32) D_8011AE74[i]->unk7C.word) { + goto loop_11; + } + } + } + } + func_8001EFA4(D_8011AE74[i], (Object_Animation *) obj); + return 1; + } + return 0; +} + GLOBAL_ASM("asm/non_matchings/objects/func_80021600.s") f32 catmull_rom_interpolation(f32 *arg0, s32 arg1, f32 arg2) { @@ -2270,35 +2438,37 @@ s8 func_8002341C(void) { return D_8011AEF6; } -#ifdef NON_EQUIVALENT - -//bad regalloc -//finds furthest object (with some additional conditions) Object *func_8002342C(f32 x, f32 z) { - Object *retval = NULL; + Object *tempObj; + Object *bestObj; + f32 diffX; + f32 diffZ; + f32 distance; + f32 bestDist; s32 i; - Object *currObj = NULL; - f32 dist; - f32 max = 0.0f; - for (i = 0; i < objCount; i++) { - currObj = gObjPtrList[i]; - if ((currObj->segment.trans.unk6 & 0x8000) == 0 && currObj->behaviorId == 87) { - x = currObj->segment.trans.x_position - x; - z = currObj->segment.trans.z_position - z; - dist = sqrtf(x * x + z * z); - - if (max < dist) { - max = dist; - retval = currObj; + bestDist = 0.0f; + i = 0; + bestObj = NULL; + if (objCount > 0) { + do { + tempObj = gObjPtrList[i]; + if (!(tempObj->segment.trans.unk6 & 0x8000) && tempObj->behaviorId == BHV_UNK_57) { + diffX = tempObj->segment.trans.x_position - x; + diffZ = tempObj->segment.trans.z_position - z; + tempObj = gObjPtrList[i]; // fakematch + distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); + if (bestDist < distance) { + bestDist = distance; + bestObj = tempObj; + } } - } + i += 1; + } while (i < objCount); } - return retval; + return bestObj; } -#else -GLOBAL_ASM("asm/non_matchings/objects/func_8002342C.s") -#endif + s32 func_80023568(void) { if (D_8011AD3C != 0) { diff --git a/src/objects.h b/src/objects.h index 76cfd55d..962081dc 100644 --- a/src/objects.h +++ b/src/objects.h @@ -159,25 +159,25 @@ typedef struct unknown800DC6F0 { } unknown800DC6F0; /* Size: 0x3C bytes */ -typedef struct unknown8011AECC { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; - f32 unk10; - f32 unk14; - f32 unk18; - f32 unk1C; - f32 unk20; - f32 unk24; - Object* unk28; - u8 pad2C[0x2]; - s8 unk2E[4]; - s8 unk32[4]; - s8 unk36[4]; - s8 unk3A; - s8 unk3B; -} unknown8011AECC; +typedef struct CheckpointNode { +/* 0x00 */ f32 rotationXFrac; +/* 0x04 */ f32 rotationYFrac; +/* 0x08 */ f32 rotationZFrac; +/* 0x0C */ f32 unkC; +/* 0x10 */ f32 x; +/* 0x14 */ f32 y; +/* 0x18 */ f32 z; +/* 0x1C */ f32 scale; +/* 0x20 */ f32 distance; +/* 0x24 */ f32 unk24; // Appears to be exactly the same as distance? +/* 0x28 */ Object *obj; +/* 0x2C */ s16 unk2C; +/* 0x2E */ s8 unk2E[4]; +/* 0x32 */ s8 unk32[4]; +/* 0x36 */ s8 unk36[4]; // Appear to be flags of some sort? +/* 0x3A */ s8 altRouteID; // -1 if there's none to be found. +/* 0x3B */ s8 unk3B; +} CheckpointNode; /* Size: 0x40 bytes */ typedef struct unk800179D0 { @@ -300,6 +300,13 @@ typedef struct unk80022CFC_1 { s32 unk78; } unk80022CFC_1; +typedef struct unk8001A7D8_arg0 { + u8 pad0[4]; + s32 *unk4; + u8 pad8[0x41]; + u8 unk49; +} unk8001A7D8_arg0; + extern unknown800DC6F0 D_800DC6F0; extern unknown800DC6F0 D_800DC6F8; @@ -345,7 +352,7 @@ extern u8 D_800DC860; extern u16 D_800DC864; Object *func_8000BF44(s32 arg0); -void func_8000BF8C(void); +void allocate_object_pools(void); void func_8000C460(void); void func_8000C604(void); s32 normalise_time(s32 timer); @@ -403,14 +410,14 @@ s32 func_8001B738(s32 controllerIndex); u8 has_ghost_to_save(); void func_8001B790(void); f32 func_8001B834(Object_Racer *racer1, Object_Racer *racer2); -unknown8011AECC *func_8001BA00(s32 arg0); -unknown8011AECC *func_8001BA1C(s32 arg0, s32 arg1); -s32 func_8001BA64(); +CheckpointNode *get_checkpoint_node(s32 arg0); +CheckpointNode *find_next_checkpoint_node(s32 arg0, s32 arg1); +s32 get_checkpoint_count(void); Object **get_racer_objects(s32 *numRacers); Object **get_racer_objects_by_port(s32 *numRacers); Object **get_racer_objects_by_position(s32 *numRacers); Object *get_racer_object(s32 index); -void func_8001BC40(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +void debug_render_checkpoint_node(s32 checkpointID, s32 pathID, Gfx** dList, MatrixS **mtx, Vertex **vtx); u32 func_8001BD94(s32 arg0); void func_8001D1AC(void); void func_8001D1BC(s32 arg0); @@ -460,7 +467,7 @@ void set_and_normalize_D_8011AFE8(f32 arg0, f32 arg1, f32 arg2); s32 func_8000FC6C(struct_8000FC6C_3 *arg0, struct_8000FC6C *arg1); s32 func_8001B2F0(s32 mapId); void render_3d_billboard(Object *obj); -void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 arg6, u32 arg7, f32 arg8); +void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 flags, u32 offset, f32 arg8); void func_8000B290(void); void func_80016BC4(unk8000FD34*); s32 func_8001C48C(Object *obj); @@ -468,6 +475,8 @@ void func_80022CFC(s32 arg0, f32 x, f32 y, f32 z); Object *func_8001B7A8(Object *racer, s32 position, f32 *distance); s32 func_8000FD34(unk8000FD34 *arg0, unk_80016BC4_2 *arg1); void func_8000E4E8(s32 index); +void func_8000F648(Object *obj, s32 count, s32 objType); +void func_8001709C(); //Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); @@ -492,7 +501,6 @@ void func_80068FA8(Gfx**, MatrixS**, Object*, Object*, f32); /* extern */ void func_800138A8(Object*, unk80068514_arg4*, ObjectTransformExt *, s32); Object *func_8002342C(f32 x, f32 z); void func_8006017C(s32); -void func_8001709C(); void func_80012F94(Object *); void render_3d_model(Object *); void func_800101AC(Object *, s32); diff --git a/src/racer.c b/src/racer.c index e7c12f9d..ce1fed65 100644 --- a/src/racer.c +++ b/src/racer.c @@ -218,7 +218,335 @@ s16 D_8011D5B8; /******************************/ +#ifdef NON_MATCHING +void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { + s32 numRacers; + u8 *miscAsset4; + f32 sp90; + s32 var_v0; + f32 temp_f12; + s16 index; + s8 sp3F; + f32 sp94; + s16 temp_v1_2; + s16 var_t0; + Object_64 *sp5C; + s16 var_t5; + s16 racerID; + LevelHeader *header; + Object **racerGroup; + s8 balloonType; + s16 temp_v0; + f32 *miscAsset3; + s16 sp3C; + s16 sp38; + Object_64 *sp58; + TempStruct5 *sp54; + s16 sp3A; + f32 temp_f0; + s16 sp6E; + f32 var_f14; + s8 *miscAsset2; + s8 *miscAsset1; + s16 sp36; + Object *temp_v0_3; + s16 var_t4; + s16 temp_v0_10; + + sp6E = racer->unk1CA; + miscAsset1 = (s8 *) get_misc_asset(MISC_ASSET_UNK01); + miscAsset2 = (s8 *) get_misc_asset(MISC_ASSET_UNK02); + header = get_current_level_header(); + racerGroup = get_racer_objects_by_position(&numRacers); + sp54 = func_8006C18C(); + if (racer->unk1C6 > 0) { + racer->unk1C6 -= updateRate; + } else { + racer->unk1C6 = 0; + } + if (func_8001AE44() != 0) { + gCurrentRacerInput |= A_BUTTON; + } else { + index = 0; + var_t5 = 0; + var_t0 = 0; + var_t4 = -1; + for (var_v0 = 1; index < numRacers; index++) { + if ((Object_Racer *) racerGroup[index]->unk64 == racer) { + var_v0 = FALSE; + racerID = index; + } + if (racerGroup[index]->unk64->racer.playerIndex == PLAYER_COMPUTER) { + var_t0++; + if (var_v0) { + var_t5++; + } + } else if (var_t4 == -1) { + var_t4 = index; + } + } + if (var_t4 == -1) { + var_t4 = 0; + } + if (var_t0 != 0) { + temp_v0 = func_80023568(); + if (gRaceStartTimer == 0) { + if (racer->unk1D6 != 4) { + temp_v1_2 = racerID - 1; + if (racer->unk20B < racerID && temp_v1_2 >= 0 && temp_v1_2 < numRacers) { + if (racerGroup[temp_v1_2]->unk64->racer.playerIndex != PLAYER_COMPUTER) { + if (temp_v0 == FALSE) { + play_random_character_voice(obj, SOUND_VOICE_CHARACTER_NEGATIVE, 8, 3); + } else { + func_8005CA84(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 5); + } + play_random_character_voice(racerGroup[temp_v1_2], SOUND_VOICE_CHARACTER_POSITIVE, 8, 2); + } + } + temp_v1_2 = racerID + 1; + if (racer->unk20B < racerID && temp_v1_2 >= 0 && temp_v1_2 < numRacers) { + if (racerGroup[temp_v1_2]->unk64->racer.playerIndex != PLAYER_COMPUTER) { + play_random_character_voice(racerGroup[racerID + 1], SOUND_VOICE_CHARACTER_NEGATIVE, 8, 2); + if (temp_v0 == FALSE) { + play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 3); + } else { + func_8005CA84(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 3); + } + } + } + } + } + racer->unk20B = racerID; + sp5C = NULL; + sp94 = 0.0f; + sp90 = 0.0f; + temp_v0_3 = func_8001B7A8((Object *) racer, 1, &sp94); + if (temp_v0_3 != NULL) { + sp5C = temp_v0_3->unk64; + } + sp58 = NULL; + temp_v0_3 = func_8001B7A8((Object *) racer, -1, &sp90); + if (temp_v0_3 != NULL) { + sp58 = temp_v0_3->unk64; + } + if (sp5C != NULL) { + sp3F = sp5C->racer.characterId; + } + if (var_t0 < 7 && get_trophy_race_world_id() == 0 && func_80023568() == 0 && func_8002341C() == 0) { + if (gRaceStartTimer == 100) { + racer->aiSkill = get_random_number_from_range(AI_MASTER, AI_HARD); + } + } else { + if (get_trophy_race_world_id() != 0) { + racer->aiSkill = header->unk16[racer->characterId]; + } else { + racer->aiSkill = header->unkC[racer->characterId]; + } + } + if (D_8011D544 != 0.0f) { + racer->unk1CA = D_800DCDA0[racer->unk1AE]; + } + if ((f32) (s16) ((racer->aiSkill - 2) << 2) <= 300.0f - D_8011D544) { + gCurrentRacerInput |= A_BUTTON; + } + miscAsset4 = (u8 *) get_misc_asset(MISC_ASSET_UNK0C); + if (racer->balloon_level < 3) { + balloonType = miscAsset4[racer->balloon_type * 3 + racer->balloon_level]; + } else { + balloonType = racer->balloon_type; + } + sp38 = (((sp54->unk8[1][1] - sp54->unk8[1][0]) * (7 - var_t5)) / 7) + sp54->unk8[1][0]; + sp36 = (((sp54->unk8[2][1] - sp54->unk8[2][0]) * (7 - var_t5)) / 7) + sp54->unk8[2][0]; + sp3A = (((sp54->unk8[0][1] - sp54->unk8[0][0]) * (7 - var_t5)) / 7) + sp54->unk8[0][0]; + sp3C = (((sp54->unk8[3][1] - sp54->unk8[3][0]) * (7 - var_t5)) / 7) + sp54->unk8[3][0]; + if (racer->unk209 & 1) { + if (racer->unk201 == 0) { + if (racer->balloon_level == 0) { + if (func_80044450((s16) (s32) sp38)) { + racer->balloon_level++; + } + } + if (var_t4 == 0 && var_t5 < 3) { + if (func_80044450(sp3C)) { + racer->balloon_type = 0; + } + } + } + if (racer->boostTimer == 0 && D_800DCD90[balloonType] == 4) { + if (func_80044450(sp3C)) { + gCurrentButtonsReleased |= Z_TRIG; + } + } + if (racer->balloon_quantity != 0) { + if (D_800DCD90[balloonType] == 1) { + if (sp5C != NULL && sp5C->racer.playerIndex == PLAYER_COMPUTER) { + if (var_t4 < 4) { + racer->unk1C6 = miscAsset2[racer->characterId] * 60; + racer->unk1C9 = 4; + } + } else { + if (func_80044450(sp36) && var_t4 < 2) { + racer->unk1C6 = miscAsset2[racer->characterId] * 60; + racer->unk1C9 = 4; + } + } + } + if (D_800DCD90[balloonType] == 2) { + if (sp58 != NULL && sp58->racer.playerIndex == PLAYER_COMPUTER) { + if (var_t4 < 4) { + racer->unk1C6 = miscAsset2[racer->characterId] * 60; + racer->unk1C9 = 5; + } + } else { + if (func_80044450(sp36) && var_t4 < 2) { + racer->unk1C6 = miscAsset2[racer->characterId] * 60; + racer->unk1C9 = 5; + } + } + } + } + racer->unk209 &= (0x8000 | 0x4000 | 0x2000 | 0x1000 | 0x800 | 0x400 | 0x200 | 0x100 | 0x80 | 0x40 | 0x20 | 0x10 | 0x8 | 0x4 | 0x2); + } + if (racer->boostTimer != 0) { + if (!(racer->unk209 & 2)) { + if (func_80044450(sp3A)) { + racer->unk209 |= 4; + } + racer->unk209 |= 2; + } + if (racer->unk209 & 4) { + gCurrentRacerInput &= 0xFFFF7FFF; + } + } else { + racer->unk209 &= ~2; + if (racer->velocity > -12.0) { + racer->unk209 = (u16) (racer->unk209 & 0xFFFB); + } + } + if (racer->unk209 & 4) { + gCurrentRacerInput &= 0xFFFF7FFF; + } + if (racer->unk1C6 == 0) { + if (racer->unk1C9 == 4 || racer->unk1C9 == 5) { + gCurrentButtonsReleased |= Z_TRIG; + } + racer->unk1C9 = 0; + if (sp58 != NULL && sp58->racer.playerIndex != PLAYER_COMPUTER && sp90 < 200.0f && var_t5 != 0 && var_t4 < 3 && miscAsset1[racer->characterId + (sp3F * 10)] < 5) { + racer->unk1C9 = 5; + } + if (D_8011D544 == 0.0f) { + racer->unk1CA = D_800DCDA8[var_t5]; + if (func_80044450(sp3C)) { + racer->unk1CA -= 1; + } + } + racer->unk1C6 = 300; + } + if (7 - var_t5 == 7 && sp58 != NULL && sp90 < -2500.0) { + racer->unk1CA = 1; + racer->unk209 = (u16) (racer->unk209 & 0xFFFB); + } + if (gRaceStartTimer == 0) { + temp_f12 = sqrtf(((sp54->unk0 * 0.025) + 0.561) / 0.004); + temp_f0 = sqrtf(((sp54->unk4 * 0.025) + 0.561) / 0.004); + temp_f12 += ((temp_f0 - temp_f12) / 7.0f) * (7 - var_t5); + if (racer->unk1CA > 1) { + temp_f12 += (f32) (racer->unk1CA - 1) * 0.2; + } + racer->unk124 = (((temp_f12 * temp_f12) * 0.004) - 0.595) / 0.025; + } + if (sp5C != NULL && racer->unk1CA == 3 && sp94 < 500.0) { + racer->unk1CA = 2; + } + switch (racer->unk1C9) { + case 0: + if (sp5C != NULL && sp5C->racer.playerIndex == PLAYER_COMPUTER && sp5C->racer.unk1C9 == 0) { + if (racer->unk1CA == sp5C->racer.unk1CA && sp94 < 100.0) { + racer->unk1CA++; + if (racer->unk1CA > 3) { + racer->unk1CA = 3; + } + } + } + break; + case 4: + if (sp5C != NULL) { + racer->unk1BA = sp5C->racer.unk1BA; + } + break; + case 5: + if (sp58 != NULL) { + racer->unk1BA = sp58->racer.unk1BA; + } + break; + } + temp_v0_10 = (u16) func_8002341C(); + if (temp_v0_10 != 0 || temp_v0 != 0) { + racer->unk1CA = 0; + racer->unk1C9 = 0; + if (temp_v0 != 0) { + miscAsset3 = (f32 *) get_misc_asset(0x12); + temp_v0_10 = temp_v0; + } else { + miscAsset3 = (f32 *) get_misc_asset(0x11); + } + racer->unk124 = miscAsset3[temp_v0_10]; + } + if (temp_v0 != 0) { + if (gRaceStartTimer != 0) { + D_8011D5B8 = 900; + } else { + D_8011D5B8 -= updateRate; + if (D_8011D5B8 < 0) { + D_8011D5B8 = 0; + if (racerID == 1 && sp94 > 650.0) { + racer->unk124 += 2.0; + } + } else { + var_f14 = racer->unk124; + if (D_8011D5B8 > 720) { + var_f14 = racer->unk124 + 5.0; + } else if (racerID == 1 || sp90 < 200.0) { + // This section isn't close to right + var_f14 = racer->unk124 + 2.5625; + } + if (racer->unk124 < var_f14) { + racer->unk124 = var_f14; + } + } + } + if (racer->raceFinished != FALSE) { + racer->boostTimer = 0; + racer->unk213 = 0; + gCurrentRacerInput &= 0xFFFF7FFF; + gCurrentRacerInput |= B_BUTTON; + if (racer->velocity > -0.3) { + gCurrentRacerInput |= A_BUTTON; + gCurrentStickX = 0; + } + } + } + if (racer->unk214 != 0) { + racer->unk1CA = sp6E; + } + if (racer->unk1BA > 64) { + racer->unk1BA = 64; + } + if (racer->unk1BC > 40) { + racer->unk1BC = 40; + } + if (racer->unk1BA < -64) { + racer->unk1BA = -64; + } + if (racer->unk1BC < -40) { + racer->unk1BC = -40; + } + } + } +} +#else GLOBAL_ASM("asm/non_matchings/racer/func_80042D20.s") +#endif void func_80043ECC(s32 arg0, Object_Racer *racer, s32 updateRate) { TempStruct5 *temp_v0; @@ -644,7 +972,7 @@ void func_8004C0A0(s32 updateRate, Object *obj, Object_Racer *racer) { if (phi_v0 > 73) { phi_v0 = 73; } - temp_v1 = phi_v0 - obj->segment.unk18; + temp_v1 = phi_v0 - obj->segment.animFrame; phi_v0 = 0; if (temp_v1 > 0) { phi_v0 = updateRate * 3; @@ -658,7 +986,7 @@ void func_8004C0A0(s32 updateRate, Object *obj, Object_Racer *racer) { phi_v0 = temp_v1; } } - obj->segment.unk18 += phi_v0; + obj->segment.animFrame += phi_v0; } } @@ -995,9 +1323,9 @@ void func_8004D95C(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80006AC8(obj); } if (func_8002341C() && racer->unk1D6 == 10) { - obj->unk4C->unk14 = 0; + obj->interactObj->unk14 = 0; } - sp26 = obj->segment.unk18; + sp26 = obj->segment.animFrame; racer->unk1D6 = 10; func_80049794(updateRate, updateRateF, obj, racer); racer->unk1D6 = racer->unk1D7; @@ -1012,7 +1340,7 @@ void func_8004D95C(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unk154->segment.trans.x_rotation = obj->segment.trans.x_rotation; racer->unk154->segment.trans.z_rotation = obj->segment.trans.z_rotation; obj->segment.unk3B = 0; - obj->segment.unk18 = sp26 + updateRate; + obj->segment.animFrame = sp26 + updateRate; func_80061C0C(obj); } } @@ -1066,9 +1394,9 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { tempRacer->prev_x_position = obj->segment.trans.x_position; tempRacer->prev_y_position = obj->segment.trans.y_position; tempRacer->prev_z_position = obj->segment.trans.z_position; - obj->unk4C->x_position = obj->segment.trans.x_position; - obj->unk4C->y_position = obj->segment.trans.y_position; - obj->unk4C->z_position = obj->segment.trans.z_position; + 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->unk1AA = 1; tempRacer->unk1AE = 1; @@ -1100,10 +1428,10 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { D_8011D586 = 0; D_8011D584 = 0; } - obj->unk4C->unk14 = 5; - obj->unk4C->unk11 = 0; - obj->unk4C->unk10 = 0xF; - obj->unk4C->unk12 = 0x14; + obj->interactObj->unk14 = 5; + obj->interactObj->unk11 = 0; + obj->interactObj->unk10 = 0xF; + obj->interactObj->unk12 = 0x14; tempRacer->unk1EE = 0; if (!D_8011D582) { tempRacer->transparency = 0xFF; @@ -1127,21 +1455,21 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { * Main function for handling everything related to the player controlled racer object. * Branches off into a different function if the player becomes computer controlled. (Finishing a race) */ -void update_player_racer(Object* obj, s32 updateRate) { +void update_player_racer(Object *obj, s32 updateRate) { s32 tempVar; s32 temp_v0_17; s32 context; - Object* tempObj; + Object *tempObj; f32 delta; f32 waterHeight; - Object_Racer* tempRacer; + Object_Racer *tempRacer; f32 xTemp; f32 yTemp; f32 zTemp; f32 lastCheckpointDist; f32 temp_f12; - LevelHeader* header; - unknown8011AECC* temp_v0_16; + LevelHeader *header; + CheckpointNode *checkpointNode; s32 angleVel; UNUSED s32 pad; s32 i; @@ -1399,9 +1727,9 @@ void update_player_racer(Object* obj, s32 updateRate) { } } if (tempRacer->unk1E5 > 0 && obj->segment.trans.y_position < waterHeight + 5.0f) { - obj->unk4C->unk14 |= 0x10; + obj->interactObj->unk14 |= 0x10; } else { - obj->unk4C->unk14 &= 0xFFEF; + obj->interactObj->unk14 &= 0xFFEF; } } func_8002ACC8(0); @@ -1466,18 +1794,18 @@ void update_player_racer(Object* obj, s32 updateRate) { if (tempVar == -100) { func_8005C270(tempRacer); } - temp_v0_16 = func_8001BA1C(tempRacer->checkpoint, tempRacer->unk1C8); - if (tempRacer->playerIndex == PLAYER_COMPUTER && temp_v0_16->unk36[tempRacer->unk1CA] == 5 && tempRacer->unk1E5) { + checkpointNode = find_next_checkpoint_node(tempRacer->checkpoint, tempRacer->unk1C8); + if (tempRacer->playerIndex == PLAYER_COMPUTER && checkpointNode->unk36[tempRacer->unk1CA] == 5 && tempRacer->unk1E5) { tempRacer->unk1C8 = 1; } - if (temp_v0_16->unk36[tempRacer->unk1CA] == 6) { + if (checkpointNode->unk36[tempRacer->unk1CA] == 6) { tempRacer->lap = header->laps + 1; } if (tempVar == 0) { - if (tempRacer->playerIndex == PLAYER_COMPUTER && temp_v0_16->unk36[tempRacer->unk1CA] == 2) { + if (tempRacer->playerIndex == PLAYER_COMPUTER && checkpointNode->unk36[tempRacer->unk1CA] == 2) { tempRacer->unk1C8 = 1; } - temp_v0_17 = func_8001BA64(); + temp_v0_17 = get_checkpoint_count(); tempRacer->checkpoint++; if (tempRacer->checkpoint >= temp_v0_17) { tempRacer->checkpoint = 0; @@ -1494,7 +1822,7 @@ void update_player_racer(Object* obj, s32 updateRate) { } if (func_8002341C()) { if (gCurrentPlayerIndex != PLAYER_COMPUTER) { - temp_v0_16 = func_8001BA1C(tempRacer->checkpoint, tempRacer->unk1C8); + checkpointNode = find_next_checkpoint_node(tempRacer->checkpoint, tempRacer->unk1C8); if (!tempRacer->unk15C) { newObject.x = 0; newObject.y = 0; @@ -1508,15 +1836,15 @@ void update_player_racer(Object* obj, s32 updateRate) { } } if (tempRacer->unk15C) { - tempRacer->unk15C->segment.trans.x_position = temp_v0_16->unk28->segment.trans.x_position; - tempRacer->unk15C->segment.trans.y_position = temp_v0_16->unk28->segment.trans.y_position; + tempRacer->unk15C->segment.trans.x_position = checkpointNode->obj->segment.trans.x_position; + tempRacer->unk15C->segment.trans.y_position = checkpointNode->obj->segment.trans.y_position; if (tempRacer->unk1D6 == 0) { tempRacer->unk15C->segment.trans.y_position -= 30.0; } - tempRacer->unk15C->segment.trans.z_position = temp_v0_16->unk28->segment.trans.z_position; - tempRacer->unk15C->segment.trans.y_rotation = temp_v0_16->unk28->segment.trans.y_rotation; - tempRacer->unk15C->segment.trans.x_rotation = temp_v0_16->unk28->segment.trans.x_rotation; - tempRacer->unk15C->segment.unk2C.half.lower = temp_v0_16->unk28->segment.unk2C.half.lower; + tempRacer->unk15C->segment.trans.z_position = checkpointNode->obj->segment.trans.z_position; + tempRacer->unk15C->segment.trans.y_rotation = checkpointNode->obj->segment.trans.y_rotation; + tempRacer->unk15C->segment.trans.x_rotation = checkpointNode->obj->segment.trans.x_rotation; + tempRacer->unk15C->segment.unk2C.half.lower = checkpointNode->obj->segment.unk2C.half.lower; } } } @@ -1532,7 +1860,7 @@ void update_player_racer(Object* obj, s32 updateRate) { } if (func_8002341C()) { if (tempRacer->unk15C) { - tempRacer->unk15C->segment.unk18 += 8 * updateRate; + tempRacer->unk15C->segment.animFrame += 8 * updateRate; } if ((tempRacer->unk1BA > 400) || (tempRacer->unk1BA < -400)) { func_80022E18(2); @@ -1621,7 +1949,7 @@ void update_player_racer(Object* obj, s32 updateRate) { if (tempRacer->unk150 && gRaceStartTimer == 0) { s8 *yAsset; tempRacer->unk150->segment.trans.x_position = obj->segment.trans.x_position; - yAsset = (s8 *)get_misc_asset(MISC_ASSET_UNK00); + yAsset = (s8 *) get_misc_asset(MISC_ASSET_UNK00); tempRacer->unk150->segment.trans.y_position = obj->segment.trans.y_position + yAsset[tempRacer->characterId]; tempRacer->unk150->segment.trans.z_position = obj->segment.trans.z_position; @@ -1693,7 +2021,7 @@ void func_80050754(Object *obj, Object_Racer *racer, f32 divisor) { f32 zDiff; obj->segment.unk3B = 0; - obj->segment.unk18 = 40; + obj->segment.animFrame = 40; xDiff = racer->unk148->segment.trans.x_position - obj->segment.trans.x_position; yDiff = racer->unk148->segment.trans.y_position - obj->segment.trans.y_position; zDiff = racer->unk148->segment.trans.z_position - obj->segment.trans.z_position; @@ -1771,7 +2099,485 @@ void apply_vehicle_rotation_offset(Object_Racer *obj, s32 max, s16 yRotation, s1 } } +#ifdef NON_MATCHING +typedef struct unk_Object_60 { + s32 count; + ObjectTransform *transforms[1]; // Array of ObjectTransform pointers. +} unk_Object_60; + +void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { + s32 soundID; + f32 scale; + f32 velocityDiff; + s32 sp68; // 68 + s32 surfaceType; + s32 sp60; // 60 + s32 velocityS; + s32 sp58; // 58 + s8 stoneWheels; + s8 steerAngle; + f32 velSquare; // 50 + s32 SteeringVel; + f32 *miscAsset; + f32 traction; + f32 tempVel; + f32 surfaceTraction; + ObjectTransform *temp_v0; + f32 topSpeed; // 78 + s32 i; + + sp58 = 0; + // Set the square value of the current forward velocity + velSquare = racer->velocity * racer->velocity; + if (racer->velocity < 0.0f) { + velSquare = -velSquare; + } + racer->unk84 = 0.0f; + racer->unk88 = 0.0f; + // Apply bobbing if there's no dialogue camera rotation active. + if (D_8011D586 == 0) { + scale = (f32) D_800DCDB0[0][racer->unk1E7 & 0x1F] * 0.024999999999999998; + racer->carBobX = -racer->unkA0 * scale; + racer->carBobY = -racer->unkA4 * scale; + racer->carBobZ = -racer->pitch * scale; + if (obj->unk60 != NULL) { + for (i = 0; i < ((unk_Object_60 *) obj->unk60)->count; i++) { + scale = 1.0f / obj->segment.trans.scale; + temp_v0 = ((unk_Object_60 *) obj->unk60)->transforms[i]; + temp_v0->x_position = (f32) (-racer->carBobX * scale); + temp_v0->y_position = (f32) (-racer->carBobY * scale); + temp_v0->z_position = (f32) (-racer->carBobZ * scale); + } + } + } else { + racer->carBobX = 0.0f; + racer->carBobY = 0.0f; + racer->carBobZ = 0.0f; + } + // If moving forward, active throttle will set this var to 60, otherwise it's stuck at 0 + if (racer->velocity > -0.5) { + if (gCurrentRacerInput & A_BUTTON) { + racer->unk1FB = 60; + } else { + racer->unk1FB = 0; + } + } else if (!(gCurrentRacerInput & A_BUTTON)) { + racer->unk1FB = 0; + } + if (racer->unk1FB > 0) { + racer->unk1FB -= updateRate; + } else { + racer->unk1FB = 0; + } + sp60 = FALSE; + // If currently braking, do something idk + if (racer->brake > 0.4) { + if (racer->velocity < -2.0 && racer->raceFinished == FALSE) { + func_80072348(racer->playerIndex, 1); + } + sp60 = TRUE; + if (gCurrentPlayerIndex >= PLAYER_ONE) { + if (gNumViewports < FOUR_PLAYERS) { + if (racer->drift_direction > 0) { + obj->unk74 |= 0x1000 | 0x400; + } else if (racer->drift_direction < 0) { + obj->unk74 |= 0x2000 | 0x800; + } else { + obj->unk74 |= 0x2000 | 0x1000; + } + } else { + sp58 = 1; + } + } + if ((racer->unk1E7 & 7) < 2) { + racer->unk1D1 = get_random_number_from_range(-25, 25); + } + gCurrentStickX += racer->unk1D1; + } + // If moving fast enough, enable drifting if the R button is held + if (racer->drifting == 0 && racer->velocity > 2.0 && gCurrentRacerInput & R_TRIG && (gCurrentStickX > 50 || gCurrentStickX < -50)) { + if (gCurrentStickX > 0) { + racer->drifting = 1; + } else { + racer->drifting = -1; + } + } + // Handle drifting + if (racer->drifting) { + gCurrentRacerInput = (gCurrentRacerInput & 0xFFFF7FFF); + gCurrentRacerInput |= B_BUTTON; + gCurrentStickY = -70; + sp60 = TRUE; + if (gNumViewports < FOUR_PLAYERS) { + obj->unk74 |= 0x2000 | 0x1000 | 0x800 | 0x400; + } else { + sp58 = 1; + } + racer->y_rotation_vel += updateRate * 0x600 * racer->drifting; + if (racer->drifting > 0) { + if (racer->y_rotation_vel < 0 && racer->y_rotation_vel >= 0) { + racer->drifting = 0; + racer->y_rotation_vel = 0x7FFF; + } + } else if (racer->y_rotation_vel > 0 && racer->y_rotation_vel <= 0) { + racer->drifting = 0; + racer->y_rotation_vel = -0x8000; + } + if (racer->drifting == 0) { + racer->unk1A0 += racer->y_rotation_vel; + racer->unk19E = racer->y_rotation_vel; + racer->y_rotation_vel = 0; + racer->velocity = -racer->velocity; + } + } + // Apply some flags when drifting + if (racer->drift_direction != 0 && gCurrentPlayerIndex >= PLAYER_ONE) { + if (gNumViewports < FOUR_PLAYERS) { + if (racer->drift_direction > 0) { + obj->unk74 |= 0x1000 | 0x400; + } else { + obj->unk74 |= 0x2000 | 0x800; + } + } else { + sp58 = 1; + } + } + // Decide which way to drift when the R button is held + if (racer->drift_direction == 0 && gCurrentRacerInput & R_TRIG && racer->velocity < -3.0 && (gCurrentStickX > 15 || gCurrentStickX < -15)) { + if (gCurrentStickX < 0) { + racer->drift_direction = -1; + } + if (gCurrentStickX > 0) { + racer->drift_direction = 1; + } + } + // Disable drifting if going too slow + if (racer->velocity > -2.0) { + racer->drift_direction = 0; + } + // Get top speed value + topSpeed = handle_racer_top_speed(obj, racer); + // If currently drifting, apply a minor speed multiplier and tilt the natural steering towards the drift direction + if (gCurrentRacerInput & R_TRIG && racer->drift_direction != 0) { + topSpeed *= 1.1; + SteeringVel = (gCurrentStickX >> 1) + (racer->drift_direction * 30); + if (SteeringVel > 75) { + SteeringVel = 75; + } + if (SteeringVel < -75) { + SteeringVel = -75; + } + } else { + racer->drift_direction = 0; + } + i = ((racer->unk10C - (racer->drift_direction << 13)) * updateRate) >> 4; + racer->unk10C -= i; + // racer->unk10C -= ((racer->unk10C - (racer->drift_direction << 13)) * updateRate) >> 4; + // sounds for drifting and sliding + if (!(racer->y_rotation_vel <= 0x1800 && racer->y_rotation_vel >= -0x1800 && + racer->drift_direction == 0 && racer->drifting == 0 && racer->unk1FB == 0)) { + sp60 = 1; + if (racer->unk1FB != 0 && racer->raceFinished == FALSE) { + func_80072348(racer->playerIndex, 0); + } + if (racer->y_rotation_vel < 0) { + obj->unk74 |= 0x1000 | 0x400; + } else { + obj->unk74 |= 0x2000 | 0x800; + } + if (racer->drift_direction != 0 || racer->drifting != 0 || racer->unk1FB != 0) { + if (racer->unk10 == 0) { + play_sound_spatial(SOUND_CAR_SLIDE, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, (s32 **) &racer->unk10); + } else { + func_80009B7C((void *) racer->unk10, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + } + if (racer->unk14) { + func_8000488C(racer->unk14); + } + } else { + if (racer->unk10) { + func_8000488C(racer->unk10); + } + } + } else { + if (racer->unk10) { + func_8000488C(racer->unk10); + } + if (racer->unk14) { + func_8000488C(racer->unk14); + } + } + // Velocity of steering input + steerAngle = racer->steerAngle; + velocityS = 6; + // Turn twice as fast under braking (because that's totally how cars work) + if (gCurrentRacerInput & B_BUTTON) { + velocityS = 12; + } + // Turn thrice as fast when drifting and braking. + if (gCurrentRacerInput & B_BUTTON && racer->drift_direction != 0) { + velocityS = 18; + } + // Multiply steering velocity with angle + SteeringVel = 0; + if (racer->velocity < -0.3) { + SteeringVel = steerAngle * velocityS; + } + if (racer->velocity > 0.3) { + SteeringVel = -steerAngle * velocityS; + } + // Set final turn velocity by taking the steering velocity and multiplying it by the handling stat of the character. + racer->unk1A0 -= (s32) (((SteeringVel * updateRate) >> 1) * gCurrentRacerHandlingStat); + // Now steer the car. + handle_car_steering(racer); + // Set base grip level to 0. + traction = 0.0f; + surfaceType = SURFACE_DEFAULT; + // If reversing, flip the steering + if (racer->velocity < -4.0) { + if (gCurrentCarSteerVel > 0x1400 || (racer->drift_direction != 0 && gCurrentCarSteerVel > 0)) { + SteeringVel = racer->unk1E7 & 7; + if (SteeringVel >= 4) { + SteeringVel = 7 - SteeringVel; + } + gCurrentCarSteerVel += SteeringVel * 0x190; + } else if (gCurrentCarSteerVel < -0x1400 || (racer->drift_direction != 0 && gCurrentCarSteerVel < 0)) { + SteeringVel = racer->unk1E7 & 7; + if (SteeringVel >= 4) { + SteeringVel = 7 - SteeringVel; + } + gCurrentCarSteerVel -= SteeringVel * 0x190; + } + } + surfaceTraction = 0.0f; + velocityDiff = 0.0f; + sp68 = 0; // Number of wheels contacting grass or sand + stoneWheels = 0; // Number of wheels contacting the stone surface type + // Iterate through each wheel and find which surface they're on. + for (i = 0; i < 4; i++) { + if (racer->wheel_surfaces[i] != SURFACE_NONE) { + if (get_filtered_cheats() & CHEAT_FOUR_WHEEL_DRIVER) { + traction += gSurfaceTractionTable[0]; + } else { + traction += gSurfaceTractionTable[racer->wheel_surfaces[i]]; + } + surfaceTraction += D_800DCBE8[racer->wheel_surfaces[i]]; + sp68 += D_800DCC34[racer->wheel_surfaces[i]]; + if (surfaceType < racer->wheel_surfaces[i]) { + surfaceType = racer->wheel_surfaces[i]; + } + if (racer->wheel_surfaces[i] == SURFACE_STONE) { + stoneWheels++; + } + velocityDiff += 1.0f; + } + } + // With multiple contact patches, average the surface properties across. + if (velocityDiff > 1.0f) { + i--; // fakematch + traction /= velocityDiff; + 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) { + D_8011D582 = 2; + } + // Set grip levels to basically zero when floating on water. + if (racer->buoyancy != 0.0) { + traction = 0.02f; + surfaceTraction = 0.0f; + } + // no clue :) + if (surfaceType == SURFACE_SAND && racer->velocity < -2.0 && racer->raceFinished == FALSE) { + func_80072348(racer->playerIndex, 0); + } + miscAsset = (f32 *) get_misc_asset(MISC_ASSET_UNK08); + // Degrade lateral velocity + if (gCurrentPlayerIndex != PLAYER_COMPUTER) { + if (!(racer->velocity > -2.0) && racer->drift_direction == 0 && racer->raceFinished == FALSE) { + racer->lateral_velocity += (racer->velocity * gCurrentStickX) / miscAsset[racer->characterId]; + if (racer->playerIndex == PLAYER_COMPUTER) { + racer->lateral_velocity *= 0.9; + } + } + } + if (racer->velocity > -3.0) { + tempVel = -(racer->velocity + 2.0); + if (tempVel < 0.0) { + tempVel = 0.0f; + } + gCurrentCarSteerVel *= tempVel; + surfaceTraction = ((1.0 - tempVel) * 0.7) + (surfaceTraction * tempVel); + } + // Multiply current velocity by the surface grip levels. + racer->lateral_velocity *= surfaceTraction; + tempVel = coss_f(racer->x_rotation_vel); + if (tempVel < 0.0f) { + tempVel = -tempVel; + } + // Multiply lateral velocity by pitch + racer->lateral_velocity *= tempVel; + gCurrentSurfaceType = surfaceType; + if (stoneWheels != 0) { + miscAsset = (f32 *) get_misc_asset(MISC_ASSET_UNK20); + topSpeed *= miscAsset[stoneWheels]; + racer->magnetTimer = 0; + racer->lateral_velocity = 0.0f; + } else if (surfaceType == SURFACE_FROZEN_WATER) { + racer->boost_sound |= 4; + racer_play_sound(obj, SOUND_BOUNCE2); + } + // If driving over a zip pad, apply a boost. + if (racer->boostTimer == 0 && surfaceType == SURFACE_UNK03) { + racer->boostTimer = normalise_time(45); + racer->boostType = BOOST_LARGE; + racer_play_sound(obj, SOUND_ZIP_PAD_BOOST); + play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 0x82); + if (racer->raceFinished == FALSE) { + func_80072348(racer->playerIndex, 8); + } + } + // Slow down gradually when not acellerating and almost at a standstill + if (velSquare < 1.0f && !(gCurrentRacerInput & A_BUTTON)) { + racer->velocity -= racer->velocity * traction * 8.0f; + } else { + racer->velocity -= velSquare * traction; + } + if (sp60) { + if (racer->unk1EE <= 15) { + racer->unk1EE++; + } + } else { + racer->unk1EE = 0; + } + if (get_viewport_count() < THREE_PLAYERS) { + if ((sp60 && racer->velocity < -2.0) || sp58 || racer->unk1FB != 0) { + if (racer->wheel_surfaces[2] < SURFACE_NONE) { + obj->unk74 |= D_800DCCF4[racer->wheel_surfaces[2]]; + } + if (racer->wheel_surfaces[3] < SURFACE_NONE) { + obj->unk74 |= D_800DCCF4[racer->wheel_surfaces[3]] * 2; + } + } + if (racer->velocity < -2.0) { + if (racer->wheel_surfaces[2] < SURFACE_NONE) { + obj->unk74 |= D_800DCD40[racer->wheel_surfaces[2]]; + } + if (racer->wheel_surfaces[3] < SURFACE_NONE) { + obj->unk74 |= D_800DCD40[racer->wheel_surfaces[3]] * 2; + } + } + } + // Play a sound on grass and sand when landing on it + surfaceType = D_800DCC80[surfaceType]; + soundID = surfaceType; + if (racer->unk18 == NULL && soundID != SOUND_NONE && racer->velocity < -2.0) { + play_sound_global(soundID, &racer->unk18); + } + if (racer->unk18 != NULL && (soundID == SOUND_NONE || racer->velocity > -2.0)) { + func_8000488C(racer->unk18); + } + // Apply a bobbing effect when on grass and sand. + if (racer->velocity < -2.0 && sp68 >= 4) { + scale = (f32) (racer->unk1E7 & 1) * 0.5; + racer->carBobX -= racer->unkA0 * scale; + racer->carBobY -= racer->unkA4 * scale; + racer->carBobZ -= racer->pitch * scale; + } + tempVel = racer->velocity; + // Keep velocity positive and keep it below 12 + if (tempVel < 0.0f) { + tempVel = -tempVel; + } + if (tempVel > 12.0f) { + tempVel = 12.0f; + } + // Convert the velocity value to an int + velocityS = (s32) tempVel; + miscAsset = &gCurrentRacerMiscAssetPtr[velocityS]; + velocityDiff = tempVel - velocityS; + // Calculate the velocity multiplier based on current velocity + surfaceTraction = (f32) ((miscAsset[1] * velocityDiff) + (miscAsset[0] * (1.0 - velocityDiff))); + surfaceTraction = (surfaceTraction * 1.7); + surfaceTraction *= topSpeed; + // Force the throttle wide open if boosting + if (racer->boostTimer > 0) { + if (gRaceStartTimer == 0) { + racer->throttle = 1.0f; + if (surfaceTraction != 0.0) { + surfaceTraction = 2.0f; + } + racer->boostTimer -= updateRate; + } + } else { + racer->boostTimer = 0; + } + if (racer->velocity > -2.0 && racer->velocity < 3.0 && (racer->playerIndex != PLAYER_COMPUTER || racer->unk214 != 0)) { + tempVel = (3.0 - racer->velocity) * 0.15; + if (soundID == 4) { + tempVel *= 0.25; + } + if ((gCurrentStickY < -25) && !(gCurrentRacerInput & A_BUTTON) && (gCurrentRacerInput & B_BUTTON)) { + if (racer->unk1D7 >= 5) { + tempVel *= 0.3; + } + racer->velocity += tempVel; + racer->brake = 0.0f; + } + } + tempVel = (racer->brake * surfaceTraction) * 0.32; + racer->velocity -= surfaceTraction * racer->throttle; + if (racer->velocity > -0.04 && racer->velocity < 0.04) { + racer->velocity = 0.0f; + } + if (racer->velocity < 0.0f) { + racer->velocity += tempVel; + if (racer->velocity > 0.0f) { + racer->velocity = 0.0f; + } + } else { + racer->velocity -= tempVel; + if (racer->velocity < 0.0f) { + racer->velocity = 0.0f; + } + } + surfaceTraction = gCurrentRacerWeightStat; + obj->segment.y_velocity -= surfaceTraction * updateRateF; + if (D_8011D586 != 0) { + surfaceTraction = 0.0f; + } + if (racer->brake < 0.9 && racer->unk1D7 < 5 && gRaceStartTimer == 0) { + if (racer->pitch < 0.0) { + velocityDiff = -racer->pitch; + velocityDiff -= 0.3; + if (velocityDiff < 0.0) { + velocityDiff = 0.0f; + } + if (velocityDiff > 0.1) { + velocityDiff = 0.1f; + } + velocityDiff *= 35.0f; + } else { + velocityDiff = 0.0f; + } + racer->velocity += surfaceTraction * (racer->pitch / (4.0f - velocityDiff)) * updateRateF; + } + racer->forwardVel -= (racer->forwardVel + (racer->velocity * 0.05)) * 0.125; + racer->unk1E8 = racer->steerAngle; + racer->unk110 = gCurrentCarSteerVel; + if (racer->unk1E0 != 0) { + if (gCurrentPlayerIndex != PLAYER_COMPUTER) { + if (racer->wheel_surfaces[0] != SURFACE_NONE) { + D_8011D550 = D_800DCCCC[racer->wheel_surfaces[0]]; + *((s16*) &D_8011D552) = racer->unk1E0; // necessary because a different function expects a char. + racer->unk1E0 = 0; + } + } + } +} +#else GLOBAL_ASM("asm/non_matchings/racer/func_80050A28.s") +#endif // Loops for as long as Taj exists. After swapping vehicle once, will remain true until you enter a door. s32 func_80052188(void) { @@ -1913,7 +2719,7 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { if (angleVel > 73) { angleVel = 73; } - newAngle = angleVel - obj->segment.unk18; + newAngle = angleVel - obj->segment.animFrame; angleVel = 0; if (newAngle > 0) { angleVel = updateRate * 3; @@ -1927,7 +2733,7 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { angleVel = newAngle; } } - obj->segment.unk18 += angleVel; + obj->segment.animFrame += angleVel; obj->segment.unk3B = 0; if (angleVel) {} // Fakematch if (racer->unk1F3 & 4) { @@ -1981,54 +2787,54 @@ void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 d racer->unk1F2 = 0; } else if (obj->segment.unk3B == 0) { if (arg6 & 1) { - if (obj->segment.unk18 >= 41) { - obj->segment.unk18 -= arg7 * 4; - if (obj->segment.unk18 < 41) { + if (obj->segment.animFrame >= 41) { + obj->segment.animFrame -= arg7 * 4; + if (obj->segment.animFrame < 41) { obj->segment.unk3B = action; - obj->segment.unk18 = arg3; + obj->segment.animFrame = arg3; } } else { - obj->segment.unk18 += arg7 * 4; - if (obj->segment.unk18 >= 40) { + obj->segment.animFrame += arg7 * 4; + if (obj->segment.animFrame >= 40) { obj->segment.unk3B = action; - obj->segment.unk18 = arg3; + obj->segment.animFrame = arg3; } } } else { obj->segment.unk3B = action; - obj->segment.unk18 = arg3; + obj->segment.animFrame = arg3; racer->unk1F3 &= ~0x80; } } else if (obj->segment.unk3B == action) { if (arg6 & 2) { if (racer->unk1F3 & 0x80) { - obj->segment.unk18 -= arg5; - if (obj->segment.unk18 <= 0) { + obj->segment.animFrame -= arg5; + if (obj->segment.animFrame <= 0) { obj->segment.unk3B = 0; racer->unk1F2 = 0; - obj->segment.unk18 = 40; + obj->segment.animFrame = 40; racer->unk1F3 = 0; } } else { - obj->segment.unk18 += arg5; - if (obj->segment.unk18 >= duration) { - obj->segment.unk18 = duration - 1; + obj->segment.animFrame += arg5; + if (obj->segment.animFrame >= duration) { + obj->segment.animFrame = duration - 1; if (!(arg6 & 4)) { racer->unk1F3 |= 0x80; } } } } else { - obj->segment.unk18 += arg5; - if (obj->segment.unk18 >= duration) { + obj->segment.animFrame += arg5; + if (obj->segment.animFrame >= duration) { obj->segment.unk3B = 0; racer->unk1F2 = 0; - obj->segment.unk18 = 40; + obj->segment.animFrame = 40; racer->unk1F3 = 0; } } } else { - obj->segment.unk18 = arg3; + obj->segment.animFrame = arg3; obj->segment.unk3B = action; } } @@ -2438,7 +3244,7 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (tempAngle > 73) { tempAngle = 73; } - obj->segment.unk18 = tempAngle; + obj->segment.animFrame = tempAngle; func_8005234C(racer); angle = gCurrentCarSteerVel - (u16) racer->y_rotation_vel; WRAP(angle, -0x8000, 0x8000); @@ -3054,7 +3860,7 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) soundID = SOUND_PLOP; break; case WEAPON_UNK_11: - spawnedObj->segment.unk18 = 0; + spawnedObj->segment.animFrame = 0; break; } if (soundID != SOUND_NONE) { @@ -3829,7 +4635,7 @@ void update_camera_fixed(f32 updateRate, Object *obj, Object_Racer *racer) { // Think this is used to calculate the path for the AI. void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel, f32 *zVel) { - unknown8011AECC *temp_v0_2; + CheckpointNode *checkpoint; s32 splinePos; s32 destReached; s32 splineEnd; @@ -3839,7 +4645,7 @@ void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel f32 magnitude; s32 i; - splineEnd = func_8001BA64(); + splineEnd = get_checkpoint_count(); if (splineEnd) { magnitude = 1.0 - racer->checkpoint_distance; @@ -3852,10 +4658,10 @@ void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel splinePos += splineEnd; } for (i = 0; i < 5; i++) { - temp_v0_2 = func_8001BA1C(splinePos, racer->unk1C8); - splineX[i] = temp_v0_2->unk10; - splineY[i] = temp_v0_2->unk14; - splineZ[i] = temp_v0_2->unk18; + checkpoint = find_next_checkpoint_node(splinePos, racer->unk1C8); + splineX[i] = checkpoint->x; + splineY[i] = checkpoint->y; + splineZ[i] = checkpoint->z; splinePos++; if (splinePos == splineEnd) { splinePos = 0; @@ -3872,7 +4678,141 @@ void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel } } +#ifdef NON_MATCHING +void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { + UNUSED s32 pad[2]; + s32 temp_v0; + CheckpointNode *temp_v0_4; + f32 posX[5]; + f32 posY[5]; + f32 posZ[5]; + UNUSED s32 pad2; + f32 tempX; + s32 counter; + f32 tempY; + s32 angle; + f32 tempZ; + f32 splinePos; + f32 diffX; + f32 diffY; + f32 diffZ; + f32 distance; + f32 divisor; + f32 scale; + s32 splineIndex; + s32 i; + + temp_v0 = get_checkpoint_count(); + if (temp_v0 == 0) { + return; + } + if ((func_8006BD88() == 0) && (racer->checkpoint >= temp_v0)) { + racer->lap = 0; + racer->checkpoint = 0; + racer->courseCheckpoint = 0; + } + splinePos = 1.0 - racer->checkpoint_distance; + if (splinePos < -0.2) { + racer->checkpoint--; + if (racer->checkpoint < 0) { + racer->checkpoint += temp_v0; + if (racer->lap > 0) { + racer->lap--; + } + } + if (racer->courseCheckpoint > -0x7D00) { + racer->courseCheckpoint--; + } + if (racer->unk1C8) { + temp_v0_4 = get_checkpoint_node(racer->checkpoint); + if (temp_v0_4->altRouteID == -1) { + racer->unk1C8 = 0; + } + counter = racer->checkpoint - 1; + if (counter < 0) { + counter += temp_v0; + } + temp_v0_4 = get_checkpoint_node(counter); + if (temp_v0_4->altRouteID == -1) { + racer->unk1C8 = 0; + } + } + } else { + if (splinePos < 0.0f) { + splinePos = 0.0f; + } + temp_v0_4 = find_next_checkpoint_node(racer->checkpoint, racer->unk1C8); + scale = temp_v0_4->scale; + counter = racer->checkpoint - 1; + if (counter < 0) { + counter = temp_v0 - 1; + } + temp_v0_4 = get_checkpoint_node(counter); + distance = temp_v0_4->scale; + divisor = ((scale - temp_v0_4->scale) * splinePos) + distance; + counter = racer->checkpoint - 2; + if (counter < 0) { + counter += temp_v0; + } + for (i = 0; (i < 5) ^ 0; i++) { + temp_v0_4 = find_next_checkpoint_node(counter, racer->unk1C8); + posX[i] = temp_v0_4->x + ((temp_v0_4->scale * temp_v0_4->rotationZFrac) * racer->unk1BA); + posY[i] = temp_v0_4->y + (temp_v0_4->scale * racer->unk1BC); + posZ[i] = temp_v0_4->z + ((temp_v0_4->scale * (-temp_v0_4->rotationXFrac)) * racer->unk1BA); + counter++; + if (counter == temp_v0) { + counter = 0; + } + } + splineIndex = FALSE; + if (splinePos >= 1.0) { + splinePos -= 1.0; + splineIndex = TRUE; + } + tempX = cubic_spline_interpolation(posX, splineIndex, splinePos, &diffX); + tempY = cubic_spline_interpolation(posY, splineIndex, splinePos, &diffY); + tempZ = cubic_spline_interpolation(posZ, splineIndex, splinePos, &diffZ); + distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); + if (distance != 0.0f) { + scale = 1.0f / distance; + diffX *= scale; + diffZ *= scale; + } + angle = arctan2_f(diffX, diffZ) - (racer->unk1A0 & 0xFFFF) - 0x8000; + WRAP(angle, -0x8000, 0x8000); + if (angle > 0x4000 || angle < -0x4000) { + if (racer->unk1FC < 200 && racer->velocity <= -1.0) { + racer->unk1FC += updateRate; + } + } else { + racer->unk1FC = 0; + } + diffY = diffX; + diffX = diffZ; + diffZ = -diffY; + splinePos = obj->segment.trans.x_position; + distance = obj->segment.trans.z_position; + diffX = -(((splinePos * diffX) + (diffZ * distance) - ((tempZ * diffZ) + (diffX * tempX))) / divisor); + if (diffX > 5.0f) { + diffX = 5.0f; + } + if (diffX < -5.0f) { + diffX = -5.0f; + } + racer->unk1BA += (s32) diffX; + diffY = (obj->segment.trans.y_position - tempY) / divisor; + if (diffY > 100.0f) { + diffY = 100.0f; + } + if (diffY < -100.0f) { + diffY = -100.0f; + } + racer->unk1BC += (s32) diffY; + } +} +#else GLOBAL_ASM("asm/non_matchings/racer/func_80059208.s") +#endif void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 *hundredths) { if (gVideoRefreshRate == REFRESH_50HZ) { @@ -4067,7 +5007,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR LevelHeader *levelHeader; //sp70 s32 temp_v0_10; f32 temp_f0; - unknown8011AECC *temp_v0_9; + CheckpointNode *temp_v0_9; Object_Racer *tempRacer; f32 temp_fv1_2; @@ -4226,7 +5166,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (var_t2 == -100) { func_8005C270(racer); } - temp_v0_9 = func_8001BA1C(racer->checkpoint, racer->unk1C8); + temp_v0_9 = find_next_checkpoint_node(racer->checkpoint, racer->unk1C8); if (temp_v0_9->unk36[racer->unk1CA] == 5) { racer->unk201 = 30; if (racer->unk1E5 != 0) { @@ -4245,7 +5185,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (temp_v0_9->unk36[racer->unk1CA] == 2) { racer->unk1C8 = 1; } - temp_v0_10 = func_8001BA64(); + temp_v0_10 = get_checkpoint_count(); racer->checkpoint++; if (racer->checkpoint >= temp_v0_10) { racer->checkpoint = 0; @@ -4390,12 +5330,12 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR s32 var_s2; s32 var_v0; s8 temp_v0_3; - unknown8011AECC *temp_v0_2; + CheckpointNode *checkpoint; s32 i; gCurrentRacerMiscAssetPtr = get_misc_asset(MISC_ASSET_UNK21); levelHeader = get_current_level_header(); - sp11C = func_8001BA64(); + sp11C = get_checkpoint_count(); if (sp11C != 0) { racer->unk1C9 = 0; racer->unk1F5 = 0; @@ -4453,15 +5393,15 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR var_a0 -= sp11C; } for (i = 0; i < 1; i++) { - temp_v0_2 = func_8001BA1C(var_a0, racer->unk1C8); - var_v1[i] = temp_v0_2->unk10; - var_a2[i] = temp_v0_2->unk14; - var_a3[i] = temp_v0_2->unk18; - var_t1[i] = temp_v0_2->unk2E[racer->unk1CA]; - var_t0[i] = temp_v0_2->unk32[racer->unk1CA]; - var_v1[i] += ((temp_v0_2->unk1C * temp_v0_2->unk8 * temp_v0_2->unk2E[racer->unk1CA])); - var_a2[i] += ((temp_v0_2->unk1C * temp_v0_2->unk32[racer->unk1CA])); - var_a3[i] += ((temp_v0_2->unk1C * -temp_v0_2->unk0 * temp_v0_2->unk2E[racer->unk1CA])); + checkpoint = find_next_checkpoint_node(var_a0, racer->unk1C8); + var_v1[i] = checkpoint->x; + var_a2[i] = checkpoint->y; + var_a3[i] = checkpoint->z; + var_t1[i] = checkpoint->unk2E[racer->unk1CA]; + var_t0[i] = checkpoint->unk32[racer->unk1CA]; + var_v1[i] += ((checkpoint->scale * checkpoint->rotationZFrac * checkpoint->unk2E[racer->unk1CA])); + var_a2[i] += ((checkpoint->scale * checkpoint->unk32[racer->unk1CA])); + var_a3[i] += ((checkpoint->scale * -checkpoint->rotationXFrac * checkpoint->unk2E[racer->unk1CA])); var_a0++; if (var_a0 == sp11C) { var_a0 = 0; @@ -4563,9 +5503,9 @@ 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; - obj->unk4C->x_position = obj->segment.trans.x_position; - obj->unk4C->y_position = obj->segment.trans.y_position; - obj->unk4C->z_position = obj->segment.trans.z_position; + 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; racer->drift_direction = 0; racer->y_rotation_vel = 0; racer->z_rotation_vel = 0; @@ -4604,7 +5544,7 @@ void antipiracy_modify_surface_traction_table(void) { } void func_8005C270(Object_Racer *racer) { - s32 temp = func_8001BA64(); + s32 temp = get_checkpoint_count(); racer->checkpoint--; if (racer->checkpoint < 0) { diff --git a/src/save_data.c b/src/save_data.c index 50686917..50c89063 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -1154,7 +1154,7 @@ s32 func_80074B1C(void) { } #ifdef NON_EQUIVALENT -s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, u16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData) { +s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData) { #define GHSS_FILE_SIZE 0x100 u8 *fileData; s32 fileNumber; diff --git a/src/save_data.h b/src/save_data.h index 2fc7d6ff..403eac0d 100644 --- a/src/save_data.h +++ b/src/save_data.h @@ -92,7 +92,7 @@ void func_800732E8(Settings *settings, u8 *saveData); void func_800738A4(Settings *settings, u8 *saveData); //Using some context, and best guesses, these could be the names of the variables -s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, u16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData); //Non matching +s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData); //Non matching char *string_to_font_codes(char *inString, char *outString, s32 stringLength); //Reasonably certain about these names for now. diff --git a/src/textures_sprites.c b/src/textures_sprites.c index a1787b09..7b999705 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -1122,16 +1122,21 @@ Struct_Unk_8007B46C *func_8007B46C(Struct_Unk_8007B46C *arg0, s32 arg1) { return arg0; } -void func_8007B4C8(Gfx **dlist, TextureHeader *arg1, u32 flags) { - load_and_set_texture(dlist, arg1, flags, 0); +/** + * A version of the function below that chooses not to pass along an offset. +*/ +void load_and_set_texture_no_offset(Gfx **dlist, TextureHeader *texhead, u32 flags) { + load_and_set_texture(dlist, texhead, flags, 0); } /** * Load a texture from memory into texture memory. * Also set render mode, combine mode and othermodes based on flags. * Also tracks which modes are active, to prevent setting them again if they're already active. + * A number can be attached that adds a texture address offset. An example of this being used is + * the numbered doors in the hub, to change what number is written on it. */ -void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 arg3) { +void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 texOffset) { s32 forceFlags; s32 doPipeSync; s32 dlIndex; @@ -1140,8 +1145,8 @@ void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 ar doPipeSync = TRUE; if (texhead != NULL) { - if ((arg3) && (arg3 < (texhead->numOfTextures << 8))) { - texhead = (TextureHeader *) ((s8 *) texhead + ((arg3 >> 16) * texhead->textureSize)); + if (texOffset && (texOffset < texhead->numOfTextures << 8)) { + texhead = (TextureHeader *) ((s8 *) texhead + ((texOffset >> 16) * texhead->textureSize)); } flags |= texhead->flags; diff --git a/src/textures_sprites.h b/src/textures_sprites.h index eeb4411f..a557a7c2 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -133,10 +133,10 @@ void set_texture_colour_tag(s32 tagID); void reset_render_settings(Gfx **dlist); void func_8007B43C(void); void func_8007B454(void); -void func_8007B4C8(Gfx **dlist, TextureHeader *arg1, u32 flags); +void load_and_set_texture_no_offset(Gfx **dlist, TextureHeader *texhead, u32 flags); void func_8007BF1C(s32 arg0); s32 func_8007EF64(s16 arg0); -void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 arg3); +void load_and_set_texture(Gfx **dlist, TextureHeader *texhead, s32 flags, s32 offset); // There might be a file boundary here. void func_8007EF80(TextureHeader *texture, u32 *triangleBatchInfoFlags, s32 *arg2, s32 arg3); diff --git a/src/unknown_008C40.c b/src/unknown_008C40.c index d06b715d..14b7cd2d 100644 --- a/src/unknown_008C40.c +++ b/src/unknown_008C40.c @@ -228,7 +228,7 @@ void func_8000A414(Gfx **arg0, Vertex **arg1, Triangle **arg2, unk800A414_arg3 * sp30 = *arg1; sp2C = *arg2; - func_8007B4C8(&sp34, NULL, 0U); + load_and_set_texture_no_offset(&sp34, NULL, RENDER_NONE); gDkrVertices(sp34++, OS_PHYSICAL_TO_K0(sp30), (((s32)OS_PHYSICAL_TO_K0(sp30)) & 6) | 0x18, 0x28); gDkrTriangles(sp34++, OS_PHYSICAL_TO_K0(sp2C), 2, 0); sp30[0].x = sp2A; diff --git a/src/unknown_0255E0.c b/src/unknown_0255E0.c index 873ef001..55b94349 100644 --- a/src/unknown_0255E0.c +++ b/src/unknown_0255E0.c @@ -534,7 +534,7 @@ void draw_gradient_background(void) { headerGreen1 = gCurrentLevelHeader2->unkBF; headerBlue1 = gCurrentLevelHeader2->unkC0; reset_render_settings(&gSceneCurrDisplayList); - func_8007B4C8(&gSceneCurrDisplayList, 0, 8); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, 0, RENDER_FOG_ACTIVE); gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(verts), 4, 0); gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(tris), 2, 0); set_twenty = 20; @@ -776,7 +776,7 @@ void render_level_geometry_and_objects(void) { } reset_render_settings(&gSceneCurrDisplayList); - func_8007B4C8(&gSceneCurrDisplayList, 0, 0xA); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, 0, RENDER_FOG_ACTIVE | RENDER_Z_COMPARE); func_80012C3C(&gSceneCurrDisplayList); for (i = sp16C - 1; i >= sp160; i--) { @@ -837,7 +837,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { //s32 hasTexture; UNUSED s32 unused; s32 levelHeaderIndex; - s32 temp; + s32 texOffset; s32 sp78; s32 startPos; s32 endPos; @@ -859,7 +859,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { batchInfo = &segment->batches[i]; textureFlags = 0; // Texture flags batchFlags = batchInfo->flags; - if (!(batchInfo->flags & 0x100)) { // 0x100 = Is this invisible geometry? + if (!(batchInfo->flags & RENDER_Z_UPDATE)) { renderBatch = FALSE; if (batchInfo->textureIndex == 0xFF) { texture = NULL; // Solid color only @@ -871,17 +871,17 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { } batchFlags |= 10; - if (!(batchFlags & 0x10) && !(batchFlags & 0x800)) { // 0x10 = Depth write + if (!(batchFlags & RENDER_UNK_0000010) && !(batchFlags & RENDER_DECAL)) { // 0x10 = Depth write batchFlags |= D_8011B0FC; } // temp & 0x04 = Is interlaced texture - if ((!(textureFlags & 4) && !(batchFlags & 0x2000)) || (batchFlags & 0x800)) { + if ((!(textureFlags & 4) && !(batchFlags & RENDER_UNK_0002000)) || (batchFlags & 0x800)) { renderBatch = TRUE; } if (nonOpaque) { renderBatch = (renderBatch + 1) & 1; // Why not just do `renderBatch ^= 1;` or `renderBatch = !renderBatch`? } - if (sp78 && (batchFlags & 0x2000)) { + if (sp78 && (batchFlags & RENDER_UNK_0002000)) { renderBatch = FALSE; } if (renderBatch) { @@ -892,7 +892,7 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { vertices = (s32) &segment->vertices[batchInfo->verticesOffset]; triangles = (s32) &segment->triangles[batchInfo->facesOffset]; - temp = batchInfo->unk7 << 14; + texOffset = batchInfo->unk7 << 14; levelHeaderIndex = (batchFlags >> 28) & 7; if (levelHeaderIndex != 0) { // This is unused, so this should always be false. @@ -906,15 +906,15 @@ void render_level_segment(s32 segmentId, s32 nonOpaque) { } else { gDPSetEnvColor(gSceneCurrDisplayList++, 255, 255, 255, 0); } - if (batchFlags & 0x40000) { // Only gets used in Spaceport alpha for the pulsating lights in the outside section. + if (batchFlags & RENDER_UNK_0040000) { // Only gets used in Spaceport alpha for the pulsating lights in the outside section. color = gCurrentLevelHeader2->pulseLightData->outColorValue & 0xFF; gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, color, color, color, color); - func_8007BA5C(&gSceneCurrDisplayList, texture, batchFlags, temp); + func_8007BA5C(&gSceneCurrDisplayList, texture, batchFlags, texOffset); gSPVertexDKR(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(vertices), numberVertices, 0); gSPPolygon(gSceneCurrDisplayList++, OS_PHYSICAL_TO_K0(triangles), numberTriangles, TRIN_ENABLE_TEXTURE); gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, 255); // Reset the primitive color } else { - load_and_set_texture(&gSceneCurrDisplayList, texture, batchFlags, temp); + load_and_set_texture(&gSceneCurrDisplayList, texture, batchFlags, texOffset); batchFlags = TRIN_ENABLE_TEXTURE; if(texture == NULL) { batchFlags = TRIN_DISABLE_TEXTURE; @@ -1588,7 +1588,7 @@ void render_floor_decal(Object *obj, Object_50 *arg1) { s32 temp_a3; Vertex *vtx; Triangle *tri; - s32 temp; + s32 flags; UNUSED s32 temp2; s32 temp3; s32 new_var; @@ -1606,16 +1606,16 @@ void render_floor_decal(Object *obj, Object_50 *arg1) { D_8011D330 = (unk8011D330 *) D_8011D320[D_8011B0CC]; D_8011D348 = (unk8011D348 *) D_8011D338[D_8011B0CC]; someAlpha = D_8011D348[D_8011D360[i].unk6].unk9; - temp = 10; + flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; if (someAlpha == 0 || obj->segment.unk38.half.lower == 0) { i = arg1->unkA; } else if (someAlpha != 255 || obj->segment.unk38.half.lower != 255) { - temp = 14; + flags = RENDER_FOG_ACTIVE | RENDER_SEMI_TRANSPARENT | RENDER_Z_COMPARE; someAlpha = (obj->segment.unk38.half.lower * someAlpha) >> 8; gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, someAlpha); } while (i < arg1->unkA) { - func_8007B4C8(&gSceneCurrDisplayList, (TextureHeader *) D_8011D360[i].unk0, temp); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, (TextureHeader *) D_8011D360[i].unk0, flags); // I hope we can clean this part up. temp2 = new_var2 = D_8011D360[i].unk4; // Fakematch temp3 = new_var = D_8011D360[i].unk6; @@ -1628,7 +1628,7 @@ void render_floor_decal(Object *obj, Object_50 *arg1) { i++; } - if (temp != 2) { + if (flags != RENDER_Z_COMPARE) { gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, 255); } } @@ -1641,7 +1641,7 @@ void func_8002D670(Object *obj, Object_50 *arg1) { s32 temp_a3; Vertex *vtx; Triangle *tri; - s32 temp; + s32 flags; UNUSED s32 temp2; UNUSED s32 temp3; @@ -1656,12 +1656,12 @@ void func_8002D670(Object *obj, Object_50 *arg1) { i = arg1->unkA; } } - temp = 10; + flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; D_8011D360 = (unk8011D360* ) D_8011D350[D_8011B0D0]; D_8011D330 = (unk8011D330* ) D_8011D320[D_8011B0D0]; D_8011D348 = (unk8011D348* ) D_8011D338[D_8011B0D0]; while (i < arg1->unkA) { - func_8007B4C8(&gSceneCurrDisplayList, (TextureHeader *) D_8011D360[i].unk0, temp); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, (TextureHeader *) D_8011D360[i].unk0, flags); temp2 = D_8011D360[i].unk4; // Fakematch temp3 = D_8011D360[i].unk6; // Fakematch temp_a3 = D_8011D360[i+1].unk4 - D_8011D360[i].unk4; diff --git a/src/unknown_05CEF0.c b/src/unknown_05CEF0.c index e18a2cdf..f85c9ff9 100644 --- a/src/unknown_05CEF0.c +++ b/src/unknown_05CEF0.c @@ -48,10 +48,10 @@ s8 D_8011D5CC; /******************************/ void func_8005C2F0(Object *object, unk8005C2F0 *arg1) { - object->unk4C->unk14 = 5; - object->unk4C->unk11 = 0; - object->unk4C->unk10 = 0x1E; - object->unk4C->unk12 = 0; + object->interactObj->unk14 = 5; + object->interactObj->unk11 = 0; + object->interactObj->unk10 = 0x1E; + object->interactObj->unk12 = 0; arg1->unkC = 0.0f; D_8011D5C0 = object->segment.trans.y_position; if (arg1->unk118 != 0) { @@ -79,7 +79,7 @@ void func_8005C364(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; sp56 = obj->segment.unk3B; - sp54 = obj->segment.unk18; + sp54 = obj->segment.animFrame; sp52 = racer->unk16A; if (racer->raceFinished == TRUE) { func_80021400(130); @@ -106,7 +106,7 @@ void func_8005C364(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->lateral_velocity = 0.0f; racer->unk16A = sp52; obj->segment.unk3B = sp56; - obj->segment.unk18 = sp54; + obj->segment.animFrame = sp54; if ((racer->attackType != ATTACK_NONE) && (obj->segment.unk3B != 3)) { racer->unk1CD = obj->segment.unk3B; obj->segment.unk3B = 3; @@ -150,8 +150,8 @@ void func_8005C364(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if ((temp_v0_2->unk10 == -1) && (obj->segment.unk3B == 3)) { obj->segment.unk3B = racer->unk1CD; } - sp54 = obj->segment.unk18; - obj->segment.unk18 = racer->unkC; + sp54 = obj->segment.animFrame; + obj->segment.animFrame = racer->unkC; obj->unk74 = 0; if (obj->segment.unk3B == 1) { func_800113CC(obj, 2, sp54, 172, 173); @@ -206,7 +206,7 @@ void func_8005C364(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } func_8006F140(1); } - if ((obj == temp_v0_4->unk4C->unk0) && (temp_v0_4->unk4C->unk14 & 8) && (obj->segment.unk3B == 1)) { + if ((obj == temp_v0_4->interactObj->obj) && (temp_v0_4->interactObj->unk14 & 8) && (obj->segment.unk3B == 1)) { temp_s0->attackType = ATTACK_SQUISHED; } if ((temp_s0->raceFinished != FALSE) && (D_8011D5C4 == 0)) { diff --git a/src/unknown_05FF10.c b/src/unknown_05FF10.c index 1a7a949c..e8c27c94 100644 --- a/src/unknown_05FF10.c +++ b/src/unknown_05FF10.c @@ -57,7 +57,7 @@ void func_8005F310(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_8005CA78(D_800DCE80); racer->unk1EC = 0; sp3E = obj->segment.unk3B; - sp3C = obj->segment.unk18; + sp3C = obj->segment.animFrame; sp3A = racer->unk16A; if ((racer->velocity < 0.3) && (racer->velocity > -0.3)) { *buttonsPressed = 0; @@ -91,7 +91,7 @@ void func_8005F310(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->unk74 = 0; racer->unk16A = sp3A; obj->segment.unk3B = sp3E; - obj->segment.unk18 = sp3C; + obj->segment.animFrame = sp3C; if ((racer->attackType != ATTACK_NONE) && (obj->segment.unk3B != 1)) { func_8005CB04(1); play_sound_global(SOUND_EXPLOSION, NULL); @@ -130,7 +130,7 @@ void func_8005F310(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unkC = 0; } obj->unk74 = 0; - obj->segment.unk18 = racer->unkC; + obj->segment.animFrame = racer->unkC; func_800AF714(obj, updateRate); func_8005D048(obj, racer, 40); if (*startTimer != 100) { @@ -151,7 +151,7 @@ void func_8005F310(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } tempObj = get_racer_object(0); obj64 = tempObj->unk64; - if ((obj == tempObj->unk4C->unk0) && (tempObj->unk4C->unk14 & 8) && (obj->segment.unk3B == 1)) { + if ((obj == tempObj->interactObj->obj) && (tempObj->interactObj->unk14 & 8) && (obj->segment.unk3B == 1)) { obj64->racer.attackType = ATTACK_SQUISHED; } if ((obj64->racer.raceFinished != FALSE) && (D_8011D610 == 0)) { diff --git a/src/unknown_078050.c b/src/unknown_078050.c index f842547b..2a9ab0c1 100644 --- a/src/unknown_078050.c +++ b/src/unknown_078050.c @@ -425,11 +425,11 @@ void render_background(Gfx **dlist, Matrix *mtx, s32 drawBG) { gDPPipeSync((*dlist)++); gDPSetScissor((*dlist)++, 0, 0, 0, w - 1, h - 1); gDPSetCycleType((*dlist)++, G_CYC_FILL); - gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, w, 0x02000000); + gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, w, SEGMENT_DEPTH_BUFFER); gDPSetFillColor((*dlist)++, GPACK_RGBA5551(255, 255, 240, 0) << 16 | GPACK_RGBA5551(255, 255, 240, 0)); gDPFillRectangle((*dlist)++, 0, 0, w - 1, h - 1); gDPPipeSync((*dlist)++); - gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, w, 0x01000000); + gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, w, SEGMENT_COLOUR_BUFFER); if (drawBG) { if (func_80066910(0)) { if (D_800DE4CC) { @@ -472,8 +472,8 @@ void render_background(Gfx **dlist, Matrix *mtx, s32 drawBG) { */ void init_rdp_and_framebuffer(Gfx **dlist) { s32 width = GET_VIDEO_WIDTH(get_video_width_and_height_as_s32()); - gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, 0x01000000); - gDPSetDepthImage((*dlist)++, 0x2000000); + gDPSetColorImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, SEGMENT_COLOUR_BUFFER); + gDPSetDepthImage((*dlist)++, SEGMENT_DEPTH_BUFFER); gSPDisplayList((*dlist)++, dRdpInit); } diff --git a/src/unknown_078050.h b/src/unknown_078050.h index 0b315b31..243ecc8b 100644 --- a/src/unknown_078050.h +++ b/src/unknown_078050.h @@ -10,6 +10,9 @@ #include "game_ui.h" #include "video.h" +#define SEGMENT_DEPTH_BUFFER 0x02000000 +#define SEGMENT_COLOUR_BUFFER 0x01000000 + typedef union { void (*function)(Gfx*, Matrix *); void *ptr; diff --git a/src/weather.c b/src/weather.c index c828dfa8..1f6744d8 100644 --- a/src/weather.c +++ b/src/weather.c @@ -353,7 +353,7 @@ void render_falling_snow(void) { mtx = (u32) func_80069DB0(); gSPMatrix(gCurrWeatherDisplayList++, OS_PHYSICAL_TO_K0(mtx ^ 0), G_MTX_DKR_INDEX_0); gDkrInsertMatrix(gCurrWeatherDisplayList++, G_MTX_DKR_INDEX_0, 0); - func_8007B4C8(&gCurrWeatherDisplayList, D_800E28D8.unk8, 2U); + load_and_set_texture_no_offset(&gCurrWeatherDisplayList, D_800E28D8.unk8, RENDER_Z_COMPARE); while (i + D_80127C00 < D_800E2908) { mtx = (u32) &D_800E2904[i]; gSPVertexDKR(gCurrWeatherDisplayList++, OS_PHYSICAL_TO_K0(mtx), D_80127C00, 0);