diff --git a/Makefile b/Makefile index a5e42eed..14920cbe 100755 --- a/Makefile +++ b/Makefile @@ -350,6 +350,7 @@ endif clean_src: clean_lib ifneq ($(wildcard $(BUILD_DIR)/src/.*),) rm -r $(BUILD_DIR)/src/*.o + rm -rf dkr.ld else @echo "/build/lib directory has already been deleted." endif diff --git a/README.md b/README.md index f57de392..453d1b14 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the Currently, only the US 1.0 version of the game is supported. US 1.1, EU 1.0, EU 1.1, and JP are not supported at this time. -As of April 24, 2023, this is our current score: +As of May 19, 2023, this is our current score: -    Decomp progress: 51.18% +    Decomp progress: 51.99% -    Documentation progress: 24.34% +    Documentation progress: 26.52% --- @@ -132,11 +132,11 @@ As of April 28, 2023, this is our current score: ``` ================================================= ADVENTURE ONE (ASM -> C Decompilation) - ---------------- 51.57% Complete ---------------- - # Decompiled functions: 1503 - # GLOBAL_ASM remaining: 329 + ---------------- 51.99% Complete ---------------- + # Decompiled functions: 1507 + # GLOBAL_ASM remaining: 325 # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 64 + # NON_EQUIVALENT WIP functions: 65 ------------------ Game Status ------------------ Balloons: 26/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 @@ -144,14 +144,14 @@ As of April 28, 2023, this is our current score: We are racing the octopus boss Bubbler. (Lap 1/3) ================================================= ADVENTURE TWO (Cleanup & Documentation) - ---------------- 25.60% Complete ---------------- - # Documented functions: 541 - # Undocumented remaining: 1023 + ---------------- 26.52% Complete ---------------- + # Documented functions: 568 + # Undocumented remaining: 996 ------------------ Game Status ------------------ - Balloons: 12/47, Keys: 1/4, Trophies: 1/5 + Balloons: 13/47, Keys: 1/4, Trophies: 1/5 T.T. Amulets: 1/4, Wizpig Amulets: 1/4 ------------------------------------------------- - We are racing Taj in the Car Challenge. (Lap 3/3) + We are racing in Everfrost Peak. (Lap 2/3) ================================================= ``` diff --git a/asm/non_matchings/game_ui/func_800AA600.s b/asm/non_matchings/game_ui/func_800AA600.s index 76df79db..27374cc7 100644 --- a/asm/non_matchings/game_ui/func_800AA600.s +++ b/asm/non_matchings/game_ui/func_800AA600.s @@ -583,7 +583,7 @@ glabel func_800AA600 /* 0ABA8C 800AAE8C 24846CFC */ addiu $a0, %lo(gHUDCurrDisplayList) # addiu $a0, $a0, 0x6cfc /* 0ABA90 800AAE90 A0E0003A */ sb $zero, 0x3a($a3) /* 0ABA94 800AAE94 A0EE0039 */ sb $t6, 0x39($a3) -/* 0ABA98 800AAE98 0C004B57 */ jal func_80012D5C +/* 0ABA98 800AAE98 0C004B57 */ jal render_object /* 0ABA9C 800AAE9C E4E60008 */ swc1 $f6, 8($a3) /* 0ABAA0 800AAEA0 10000018 */ b .L800AAF04 /* 0ABAA4 800AAEA4 86080006 */ lh $t0, 6($s0) diff --git a/asm/non_matchings/menu/func_8009CA60.s b/asm/non_matchings/menu/func_8009CA60.s index 77c03f59..26b43219 100644 --- a/asm/non_matchings/menu/func_8009CA60.s +++ b/asm/non_matchings/menu/func_8009CA60.s @@ -61,7 +61,7 @@ glabel func_8009CA60 /* 09D74C 8009CB4C A159003A */ sb $t9, 0x3a($t2) .L8009CB50: /* 09D750 8009CB50 8D8CF764 */ lw $t4, %lo(sMenuGuiOpacity)($t4) -/* 09D754 8009CB54 0C004B57 */ jal func_80012D5C +/* 09D754 8009CB54 0C004B57 */ jal render_object /* 09D758 8009CB58 A0EC0039 */ sb $t4, 0x39($a3) /* 09D75C 8009CB5C 10000084 */ b .L8009CD70 /* 09D760 8009CB60 8FBF0024 */ lw $ra, 0x24($sp) diff --git a/asm/non_matchings/objects/func_80010994.s b/asm/non_matchings/objects/func_80010994.s index 16467e0e..5f5bd3fa 100644 --- a/asm/non_matchings/objects/func_80010994.s +++ b/asm/non_matchings/objects/func_80010994.s @@ -1,534 +1,534 @@ -glabel func_80010994 -/* 011594 80010994 27BDFF98 */ addiu $sp, $sp, -0x68 -/* 011598 80010998 AFB40028 */ sw $s4, 0x28($sp) -/* 01159C 8001099C 0080A025 */ move $s4, $a0 -/* 0115A0 800109A0 AFBF0034 */ sw $ra, 0x34($sp) -/* 0115A4 800109A4 AFB60030 */ sw $s6, 0x30($sp) -/* 0115A8 800109A8 AFB5002C */ sw $s5, 0x2c($sp) -/* 0115AC 800109AC AFB30024 */ sw $s3, 0x24($sp) -/* 0115B0 800109B0 AFB20020 */ sw $s2, 0x20($sp) -/* 0115B4 800109B4 AFB1001C */ sw $s1, 0x1c($sp) -/* 0115B8 800109B8 AFB00018 */ sw $s0, 0x18($sp) -/* 0115BC 800109BC 0C00916D */ jal func_800245B4 -/* 0115C0 800109C0 2404FFFF */ li $a0, -1 -/* 0115C4 800109C4 3C028012 */ lui $v0, %hi(D_8011ADB0) # $v0, 0x8012 -/* 0115C8 800109C8 8C42ADB0 */ lw $v0, %lo(D_8011ADB0)($v0) -/* 0115CC 800109CC 3C018012 */ lui $at, %hi(gRaceStartCountdown) # $at, 0x8012 -/* 0115D0 800109D0 1840000D */ blez $v0, .L80010A08 -/* 0115D4 800109D4 AC22ADB8 */ sw $v0, %lo(gRaceStartCountdown)($at) -/* 0115D8 800109D8 0C028064 */ jal func_800A0190 -/* 0115DC 800109DC 00000000 */ nop -/* 0115E0 800109E0 10400009 */ beqz $v0, .L80010A08 -/* 0115E4 800109E4 3C038012 */ lui $v1, %hi(D_8011ADBC) # $v1, 0x8012 -/* 0115E8 800109E8 3C048012 */ lui $a0, %hi(D_8011ADB0) # $a0, 0x8012 -/* 0115EC 800109EC 2484ADB0 */ addiu $a0, %lo(D_8011ADB0) # addiu $a0, $a0, -0x5250 -/* 0115F0 800109F0 8C8E0000 */ lw $t6, ($a0) -/* 0115F4 800109F4 2463ADBC */ addiu $v1, %lo(D_8011ADBC) # addiu $v1, $v1, -0x5244 -/* 0115F8 800109F8 01D41023 */ subu $v0, $t6, $s4 -/* 0115FC 800109FC AC820000 */ sw $v0, ($a0) -/* 011600 80010A00 10000009 */ b .L80010A28 -/* 011604 80010A04 AC600000 */ sw $zero, ($v1) -.L80010A08: -/* 011608 80010A08 3C038012 */ lui $v1, %hi(D_8011ADBC) # $v1, 0x8012 -/* 01160C 80010A0C 2463ADBC */ addiu $v1, %lo(D_8011ADBC) # addiu $v1, $v1, -0x5244 -/* 011610 80010A10 8C780000 */ lw $t8, ($v1) -/* 011614 80010A14 3C028012 */ lui $v0, %hi(D_8011ADB0) # $v0, 0x8012 -/* 011618 80010A18 0314C821 */ addu $t9, $t8, $s4 -/* 01161C 80010A1C AC790000 */ sw $t9, ($v1) -/* 011620 80010A20 8C42ADB0 */ lw $v0, %lo(D_8011ADB0)($v0) -/* 011624 80010A24 00000000 */ nop -.L80010A28: -/* 011628 80010A28 1C400003 */ bgtz $v0, .L80010A38 -/* 01162C 80010A2C 3C048012 */ lui $a0, %hi(gNumRacers) # $a0, 0x8012 -/* 011630 80010A30 3C018012 */ lui $at, %hi(D_8011ADB0) # $at, 0x8012 -/* 011634 80010A34 AC20ADB0 */ sw $zero, %lo(D_8011ADB0)($at) -.L80010A38: -/* 011638 80010A38 3C028012 */ lui $v0, %hi(D_8011AD21) # $v0, 0x8012 -/* 01163C 80010A3C 3C018012 */ lui $at, %hi(D_8011AD3D) # $at, 0x8012 -/* 011640 80010A40 2442AD21 */ addiu $v0, %lo(D_8011AD21) # addiu $v0, $v0, -0x52df -/* 011644 80010A44 A020AD3D */ sb $zero, %lo(D_8011AD3D)($at) -/* 011648 80010A48 80480000 */ lb $t0, ($v0) -/* 01164C 80010A4C 24090001 */ li $t1, 1 -/* 011650 80010A50 01285023 */ subu $t2, $t1, $t0 -/* 011654 80010A54 A04A0000 */ sb $t2, ($v0) -/* 011658 80010A58 804B0000 */ lb $t3, ($v0) -/* 01165C 80010A5C 3C018012 */ lui $at, %hi(D_8011AD22) # $at, 0x8012 -/* 011660 80010A60 002B0821 */ addu $at, $at, $t3 -/* 011664 80010A64 2484AEF0 */ addiu $a0, %lo(gNumRacers) # addiu $a0, $a0, -0x5110 -/* 011668 80010A68 A020AD22 */ sb $zero, %lo(D_8011AD22)($at) -/* 01166C 80010A6C 8C8C0000 */ lw $t4, ($a0) -/* 011670 80010A70 00009825 */ move $s3, $zero -/* 011674 80010A74 19800021 */ blez $t4, .L80010AFC -/* 011678 80010A78 3C158012 */ lui $s5, %hi(gRacers) # $s5, 0x8012 -/* 01167C 80010A7C 26B5AEE4 */ addiu $s5, %lo(gRacers) # addiu $s5, $s5, -0x511c -/* 011680 80010A80 00001825 */ move $v1, $zero -.L80010A84: -/* 011684 80010A84 8EAD0000 */ lw $t5, ($s5) -/* 011688 80010A88 26730001 */ addiu $s3, $s3, 1 -/* 01168C 80010A8C 01A37021 */ addu $t6, $t5, $v1 -/* 011690 80010A90 8DC20000 */ lw $v0, ($t6) -/* 011694 80010A94 00000000 */ nop -/* 011698 80010A98 8C450064 */ lw $a1, 0x64($v0) -/* 01169C 80010A9C C444000C */ lwc1 $f4, 0xc($v0) -/* 0116A0 80010AA0 00000000 */ nop -/* 0116A4 80010AA4 E4A4005C */ swc1 $f4, 0x5c($a1) -/* 0116A8 80010AA8 8EAF0000 */ lw $t7, ($s5) -/* 0116AC 80010AAC 00000000 */ nop -/* 0116B0 80010AB0 01E3C021 */ addu $t8, $t7, $v1 -/* 0116B4 80010AB4 8F190000 */ lw $t9, ($t8) -/* 0116B8 80010AB8 00000000 */ nop -/* 0116BC 80010ABC C7260010 */ lwc1 $f6, 0x10($t9) -/* 0116C0 80010AC0 00000000 */ nop -/* 0116C4 80010AC4 E4A60060 */ swc1 $f6, 0x60($a1) -/* 0116C8 80010AC8 8EA90000 */ lw $t1, ($s5) -/* 0116CC 80010ACC 00000000 */ nop -/* 0116D0 80010AD0 01234021 */ addu $t0, $t1, $v1 -/* 0116D4 80010AD4 8D0A0000 */ lw $t2, ($t0) -/* 0116D8 80010AD8 24630004 */ addiu $v1, $v1, 4 -/* 0116DC 80010ADC C5480014 */ lwc1 $f8, 0x14($t2) -/* 0116E0 80010AE0 00000000 */ nop -/* 0116E4 80010AE4 E4A80064 */ swc1 $f8, 0x64($a1) -/* 0116E8 80010AE8 8C8B0000 */ lw $t3, ($a0) -/* 0116EC 80010AEC 00000000 */ nop -/* 0116F0 80010AF0 026B082A */ slt $at, $s3, $t3 -/* 0116F4 80010AF4 1420FFE3 */ bnez $at, .L80010A84 -/* 0116F8 80010AF8 00000000 */ nop -.L80010AFC: -/* 0116FC 80010AFC 3C158012 */ lui $s5, %hi(gRacers) # $s5, 0x8012 -/* 011700 80010B00 0C0050AE */ jal func_800142B8 -/* 011704 80010B04 26B5AEE4 */ addiu $s5, %lo(gRacers) # addiu $s5, $s5, -0x511c -/* 011708 80010B08 0C00556E */ jal func_800155B8 -/* 01170C 80010B0C 00000000 */ nop -/* 011710 80010B10 0C007A27 */ jal func_8001E89C -/* 011714 80010B14 00000000 */ nop -/* 011718 80010B18 3C138012 */ lui $s3, %hi(D_8011AE70) # $s3, 0x8012 -/* 01171C 80010B1C 2673AE70 */ addiu $s3, %lo(D_8011AE70) # addiu $s3, $s3, -0x5190 -/* 011720 80010B20 8E6C0000 */ lw $t4, ($s3) -/* 011724 80010B24 00008825 */ move $s1, $zero -/* 011728 80010B28 1980000F */ blez $t4, .L80010B68 -/* 01172C 80010B2C 3C108012 */ lui $s0, %hi(D_8011AE6C) # $s0, 0x8012 -/* 011730 80010B30 2610AE6C */ addiu $s0, %lo(D_8011AE6C) # addiu $s0, $s0, -0x5194 -/* 011734 80010B34 00009025 */ move $s2, $zero -.L80010B38: -/* 011738 80010B38 8E0D0000 */ lw $t5, ($s0) -/* 01173C 80010B3C 02802825 */ move $a1, $s4 -/* 011740 80010B40 01B27021 */ addu $t6, $t5, $s2 -/* 011744 80010B44 8DC40000 */ lw $a0, ($t6) -/* 011748 80010B48 0C008FD2 */ jal run_object_loop_func -/* 01174C 80010B4C 00000000 */ nop -/* 011750 80010B50 8E6F0000 */ lw $t7, ($s3) -/* 011754 80010B54 26310001 */ addiu $s1, $s1, 1 -/* 011758 80010B58 022F082A */ slt $at, $s1, $t7 -/* 01175C 80010B5C 1420FFF6 */ bnez $at, .L80010B38 -/* 011760 80010B60 26520004 */ addiu $s2, $s2, 4 -/* 011764 80010B64 00008825 */ move $s1, $zero -.L80010B68: -/* 011768 80010B68 3C108012 */ lui $s0, %hi(D_8011AE6C) # $s0, 0x8012 -/* 01176C 80010B6C 2610AE6C */ addiu $s0, %lo(D_8011AE6C) # addiu $s0, $s0, -0x5194 -/* 011770 80010B70 0C0079BB */ jal func_8001E6EC -/* 011774 80010B74 24040001 */ li $a0, 1 -/* 011778 80010B78 8E780000 */ lw $t8, ($s3) -/* 01177C 80010B7C 00000000 */ nop -/* 011780 80010B80 1B00000C */ blez $t8, .L80010BB4 -/* 011784 80010B84 00009025 */ move $s2, $zero -.L80010B88: -/* 011788 80010B88 8E190000 */ lw $t9, ($s0) -/* 01178C 80010B8C 00000000 */ nop -/* 011790 80010B90 03324821 */ addu $t1, $t9, $s2 -/* 011794 80010B94 8D240000 */ lw $a0, ($t1) -/* 011798 80010B98 0C005C27 */ jal func_8001709C -/* 01179C 80010B9C 00000000 */ nop -/* 0117A0 80010BA0 8E680000 */ lw $t0, ($s3) -/* 0117A4 80010BA4 26310001 */ addiu $s1, $s1, 1 -/* 0117A8 80010BA8 0228082A */ slt $at, $s1, $t0 -/* 0117AC 80010BAC 1420FFF6 */ bnez $at, .L80010B88 -/* 0117B0 80010BB0 26520004 */ addiu $s2, $s2, 4 -.L80010BB4: -/* 0117B4 80010BB4 3C138012 */ lui $s3, %hi(objCount) # $s3, 0x8012 -/* 0117B8 80010BB8 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 -/* 0117BC 80010BBC 8E73AE5C */ lw $s3, %lo(objCount)($s3) -/* 0117C0 80010BC0 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) -/* 0117C4 80010BC4 00000000 */ nop -/* 0117C8 80010BC8 0233082A */ slt $at, $s1, $s3 -/* 0117CC 80010BCC 1020004C */ beqz $at, .L80010D00 -/* 0117D0 80010BD0 00119080 */ sll $s2, $s1, 2 -/* 0117D4 80010BD4 00135080 */ sll $t2, $s3, 2 -/* 0117D8 80010BD8 3C168012 */ lui $s6, %hi(gObjPtrList) # $s6, 0x8012 -/* 0117DC 80010BDC 26D6AE58 */ addiu $s6, %lo(gObjPtrList) # addiu $s6, $s6, -0x51a8 -/* 0117E0 80010BE0 AFAA0038 */ sw $t2, 0x38($sp) -/* 0117E4 80010BE4 24110021 */ li $s1, 33 -.L80010BE8: -/* 0117E8 80010BE8 8ECB0000 */ lw $t3, ($s6) -/* 0117EC 80010BEC 00000000 */ nop -/* 0117F0 80010BF0 01726021 */ addu $t4, $t3, $s2 -/* 0117F4 80010BF4 8D900000 */ lw $s0, ($t4) -/* 0117F8 80010BF8 00000000 */ nop -/* 0117FC 80010BFC 860D0006 */ lh $t5, 6($s0) -/* 011800 80010C00 00000000 */ nop -/* 011804 80010C04 31AE8000 */ andi $t6, $t5, 0x8000 -/* 011808 80010C08 15C00039 */ bnez $t6, .L80010CF0 -/* 01180C 80010C0C 8FAB0038 */ lw $t3, 0x38($sp) -/* 011810 80010C10 86020048 */ lh $v0, 0x48($s0) -/* 011814 80010C14 24010005 */ li $at, 5 -/* 011818 80010C18 12220035 */ beq $s1, $v0, .L80010CF0 -/* 01181C 80010C1C 8FAB0038 */ lw $t3, 0x38($sp) -/* 011820 80010C20 10410032 */ beq $v0, $at, .L80010CEC -/* 011824 80010C24 2401000F */ li $at, 15 -/* 011828 80010C28 10410031 */ beq $v0, $at, .L80010CF0 -/* 01182C 80010C2C 8FAB0038 */ lw $t3, 0x38($sp) -/* 011830 80010C30 8E02004C */ lw $v0, 0x4c($s0) -/* 011834 80010C34 02002025 */ move $a0, $s0 -/* 011838 80010C38 10400009 */ beqz $v0, .L80010C60 -/* 01183C 80010C3C 00000000 */ nop -/* 011840 80010C40 904F0011 */ lbu $t7, 0x11($v0) -/* 011844 80010C44 24010002 */ li $at, 2 -/* 011848 80010C48 11E10007 */ beq $t7, $at, .L80010C68 -/* 01184C 80010C4C 02002025 */ move $a0, $s0 -/* 011850 80010C50 0C008FD2 */ jal run_object_loop_func -/* 011854 80010C54 02802825 */ move $a1, $s4 -/* 011858 80010C58 10000004 */ b .L80010C6C -/* 01185C 80010C5C 8E060040 */ lw $a2, 0x40($s0) -.L80010C60: -/* 011860 80010C60 0C008FD2 */ jal run_object_loop_func -/* 011864 80010C64 02802825 */ move $a1, $s4 -.L80010C68: -/* 011868 80010C68 8E060040 */ lw $a2, 0x40($s0) -.L80010C6C: -/* 01186C 80010C6C 00000000 */ nop -/* 011870 80010C70 80D80053 */ lb $t8, 0x53($a2) -/* 011874 80010C74 00000000 */ nop -/* 011878 80010C78 1700001D */ bnez $t8, .L80010CF0 -/* 01187C 80010C7C 8FAB0038 */ lw $t3, 0x38($sp) -/* 011880 80010C80 80C40055 */ lb $a0, 0x55($a2) -/* 011884 80010C84 00002825 */ move $a1, $zero -/* 011888 80010C88 18800012 */ blez $a0, .L80010CD4 -/* 01188C 80010C8C 00001025 */ move $v0, $zero -.L80010C90: -/* 011890 80010C90 8E190068 */ lw $t9, 0x68($s0) -/* 011894 80010C94 24A50001 */ addiu $a1, $a1, 1 -/* 011898 80010C98 03224821 */ addu $t1, $t9, $v0 -/* 01189C 80010C9C 8D230000 */ lw $v1, ($t1) -/* 0118A0 80010CA0 00000000 */ nop -/* 0118A4 80010CA4 10600009 */ beqz $v1, .L80010CCC -/* 0118A8 80010CA8 00A4082A */ slt $at, $a1, $a0 -/* 0118AC 80010CAC 8C680000 */ lw $t0, ($v1) -/* 0118B0 80010CB0 00000000 */ nop -/* 0118B4 80010CB4 A5140052 */ sh $s4, 0x52($t0) -/* 0118B8 80010CB8 8E060040 */ lw $a2, 0x40($s0) -/* 0118BC 80010CBC 00000000 */ nop -/* 0118C0 80010CC0 80C40055 */ lb $a0, 0x55($a2) -/* 0118C4 80010CC4 00000000 */ nop -/* 0118C8 80010CC8 00A4082A */ slt $at, $a1, $a0 -.L80010CCC: -/* 0118CC 80010CCC 1420FFF0 */ bnez $at, .L80010C90 -/* 0118D0 80010CD0 24420004 */ addiu $v0, $v0, 4 -.L80010CD4: -/* 0118D4 80010CD4 90CA0072 */ lbu $t2, 0x72($a2) -/* 0118D8 80010CD8 240100FF */ li $at, 255 -/* 0118DC 80010CDC 11410003 */ beq $t2, $at, .L80010CEC -/* 0118E0 80010CE0 02002025 */ move $a0, $s0 -/* 0118E4 80010CE4 0C005024 */ jal func_80014090 -/* 0118E8 80010CE8 02802825 */ move $a1, $s4 -.L80010CEC: -/* 0118EC 80010CEC 8FAB0038 */ lw $t3, 0x38($sp) -.L80010CF0: -/* 0118F0 80010CF0 26520004 */ addiu $s2, $s2, 4 -/* 0118F4 80010CF4 024B082A */ slt $at, $s2, $t3 -/* 0118F8 80010CF8 1420FFBB */ bnez $at, .L80010BE8 -/* 0118FC 80010CFC 00000000 */ nop -.L80010D00: -/* 011900 80010D00 3C0C8012 */ lui $t4, %hi(gNumRacers) # $t4, 0x8012 -/* 011904 80010D04 8D8CAEF0 */ lw $t4, %lo(gNumRacers)($t4) -/* 011908 80010D08 3C168012 */ lui $s6, %hi(gObjPtrList) # $s6, 0x8012 -/* 01190C 80010D0C 26D6AE58 */ addiu $s6, %lo(gObjPtrList) # addiu $s6, $s6, -0x51a8 -/* 011910 80010D10 1980000E */ blez $t4, .L80010D4C -/* 011914 80010D14 00008825 */ move $s1, $zero -/* 011918 80010D18 00009025 */ move $s2, $zero -.L80010D1C: -/* 01191C 80010D1C 8EAD0000 */ lw $t5, ($s5) -/* 011920 80010D20 02802825 */ move $a1, $s4 -/* 011924 80010D24 01B27021 */ addu $t6, $t5, $s2 -/* 011928 80010D28 8DC40000 */ lw $a0, ($t6) -/* 01192C 80010D2C 0C01378E */ jal update_player_racer -/* 011930 80010D30 00000000 */ nop -/* 011934 80010D34 3C0F8012 */ lui $t7, %hi(gNumRacers) # $t7, 0x8012 -/* 011938 80010D38 8DEFAEF0 */ lw $t7, %lo(gNumRacers)($t7) -/* 01193C 80010D3C 26310001 */ addiu $s1, $s1, 1 -/* 011940 80010D40 022F082A */ slt $at, $s1, $t7 -/* 011944 80010D44 1420FFF5 */ bnez $at, .L80010D1C -/* 011948 80010D48 26520004 */ addiu $s2, $s2, 4 -.L80010D4C: -/* 01194C 80010D4C 0C01AF66 */ jal get_current_level_race_type -/* 011950 80010D50 00000000 */ nop -/* 011954 80010D54 1440001C */ bnez $v0, .L80010DC8 -/* 011958 80010D58 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 -/* 01195C 80010D5C 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) -/* 011960 80010D60 00008825 */ move $s1, $zero -/* 011964 80010D64 18E00018 */ blez $a3, .L80010DC8 -/* 011968 80010D68 2412FFFF */ li $s2, -1 -/* 01196C 80010D6C 3C108012 */ lui $s0, %hi(gRacersByPosition) # $s0, 0x8012 -/* 011970 80010D70 2610AEE8 */ addiu $s0, %lo(gRacersByPosition) # addiu $s0, $s0, -0x5118 -.L80010D74: -/* 011974 80010D74 8E180000 */ lw $t8, ($s0) -/* 011978 80010D78 0011C880 */ sll $t9, $s1, 2 -/* 01197C 80010D7C 03194821 */ addu $t1, $t8, $t9 -/* 011980 80010D80 8D240000 */ lw $a0, ($t1) -/* 011984 80010D84 00000000 */ nop -/* 011988 80010D88 8C850064 */ lw $a1, 0x64($a0) -/* 01198C 80010D8C 00000000 */ nop -/* 011990 80010D90 84A80000 */ lh $t0, ($a1) -/* 011994 80010D94 00000000 */ nop -/* 011998 80010D98 12480008 */ beq $s2, $t0, .L80010DBC -/* 01199C 80010D9C 26310001 */ addiu $s1, $s1, 1 -/* 0119A0 80010DA0 0C010FB3 */ jal func_80043ECC -/* 0119A4 80010DA4 02803025 */ move $a2, $s4 -/* 0119A8 80010DA8 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 -/* 0119AC 80010DAC 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) -/* 0119B0 80010DB0 00000000 */ nop -/* 0119B4 80010DB4 00E08825 */ move $s1, $a3 -/* 0119B8 80010DB8 26310001 */ addiu $s1, $s1, 1 -.L80010DBC: -/* 0119BC 80010DBC 0227082A */ slt $at, $s1, $a3 -/* 0119C0 80010DC0 1420FFEC */ bnez $at, .L80010D74 -/* 0119C4 80010DC4 00000000 */ nop -.L80010DC8: -/* 0119C8 80010DC8 0C002EB7 */ jal func_8000BADC -/* 0119CC 80010DCC 02802025 */ move $a0, $s4 -/* 0119D0 80010DD0 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 -/* 0119D4 80010DD4 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) -/* 0119D8 80010DD8 00000000 */ nop -/* 0119DC 80010DDC 0233082A */ slt $at, $s1, $s3 -/* 0119E0 80010DE0 1020001D */ beqz $at, .L80010E58 -/* 0119E4 80010DE4 00119080 */ sll $s2, $s1, 2 -/* 0119E8 80010DE8 00131080 */ sll $v0, $s3, 2 -.L80010DEC: -/* 0119EC 80010DEC 8ECA0000 */ lw $t2, ($s6) -/* 0119F0 80010DF0 00000000 */ nop -/* 0119F4 80010DF4 01525821 */ addu $t3, $t2, $s2 -/* 0119F8 80010DF8 8D700000 */ lw $s0, ($t3) -/* 0119FC 80010DFC 00000000 */ nop -/* 011A00 80010E00 860C0006 */ lh $t4, 6($s0) -/* 011A04 80010E04 00000000 */ nop -/* 011A08 80010E08 318D8000 */ andi $t5, $t4, 0x8000 -/* 011A0C 80010E0C 15A00005 */ bnez $t5, .L80010E24 -/* 011A10 80010E10 00000000 */ nop -/* 011A14 80010E14 860E0048 */ lh $t6, 0x48($s0) -/* 011A18 80010E18 24010005 */ li $at, 5 -/* 011A1C 80010E1C 11C10005 */ beq $t6, $at, .L80010E34 -/* 011A20 80010E20 02002025 */ move $a0, $s0 -.L80010E24: -/* 011A24 80010E24 860F0048 */ lh $t7, 0x48($s0) -/* 011A28 80010E28 2401000F */ li $at, 15 -/* 011A2C 80010E2C 15E10006 */ bne $t7, $at, .L80010E48 -/* 011A30 80010E30 02002025 */ move $a0, $s0 -.L80010E34: -/* 011A34 80010E34 02802825 */ move $a1, $s4 -/* 011A38 80010E38 0C008FD2 */ jal run_object_loop_func -/* 011A3C 80010E3C AFA20044 */ sw $v0, 0x44($sp) -/* 011A40 80010E40 8FA20044 */ lw $v0, 0x44($sp) -/* 011A44 80010E44 00000000 */ nop -.L80010E48: -/* 011A48 80010E48 26520004 */ addiu $s2, $s2, 4 -/* 011A4C 80010E4C 0242082A */ slt $at, $s2, $v0 -/* 011A50 80010E50 1420FFE6 */ bnez $at, .L80010DEC -/* 011A54 80010E54 00000000 */ nop -.L80010E58: -/* 011A58 80010E58 3C188012 */ lui $t8, %hi(D_8011AE64) # $t8, 0x8012 -/* 011A5C 80010E5C 8F18AE64 */ lw $t8, %lo(D_8011AE64)($t8) -/* 011A60 80010E60 00000000 */ nop -/* 011A64 80010E64 1B000018 */ blez $t8, .L80010EC8 -/* 011A68 80010E68 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 -/* 011A6C 80010E6C 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) -/* 011A70 80010E70 00131080 */ sll $v0, $s3, 2 -/* 011A74 80010E74 0233082A */ slt $at, $s1, $s3 -/* 011A78 80010E78 10200013 */ beqz $at, .L80010EC8 -/* 011A7C 80010E7C 00119080 */ sll $s2, $s1, 2 -.L80010E80: -/* 011A80 80010E80 8ED90000 */ lw $t9, ($s6) -/* 011A84 80010E84 02802825 */ move $a1, $s4 -/* 011A88 80010E88 03324821 */ addu $t1, $t9, $s2 -/* 011A8C 80010E8C 8D300000 */ lw $s0, ($t1) -/* 011A90 80010E90 00000000 */ nop -/* 011A94 80010E94 86080006 */ lh $t0, 6($s0) -/* 011A98 80010E98 02002025 */ move $a0, $s0 -/* 011A9C 80010E9C 310A8000 */ andi $t2, $t0, 0x8000 -/* 011AA0 80010EA0 11400005 */ beqz $t2, .L80010EB8 -/* 011AA4 80010EA4 00000000 */ nop -/* 011AA8 80010EA8 0C02C8BF */ jal func_800B22FC -/* 011AAC 80010EAC AFA20044 */ sw $v0, 0x44($sp) -/* 011AB0 80010EB0 8FA20044 */ lw $v0, 0x44($sp) -/* 011AB4 80010EB4 00000000 */ nop -.L80010EB8: -/* 011AB8 80010EB8 26520004 */ addiu $s2, $s2, 4 -/* 011ABC 80010EBC 0242082A */ slt $at, $s2, $v0 -/* 011AC0 80010EC0 1420FFEF */ bnez $at, .L80010E80 -/* 011AC4 80010EC4 00000000 */ nop -.L80010EC8: -/* 011AC8 80010EC8 0C00C8E6 */ jal lightUpdateLights -/* 011ACC 80010ECC 02802025 */ move $a0, $s4 -/* 011AD0 80010ED0 0C00CB1B */ jal func_80032C6C -/* 011AD4 80010ED4 00000000 */ nop -/* 011AD8 80010ED8 1840001F */ blez $v0, .L80010F58 -/* 011ADC 80010EDC 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 -/* 011AE0 80010EE0 3C028012 */ lui $v0, %hi(objCount) # $v0, 0x8012 -/* 011AE4 80010EE4 8C42AE5C */ lw $v0, %lo(objCount)($v0) -/* 011AE8 80010EE8 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) -/* 011AEC 80010EEC 00000000 */ nop -/* 011AF0 80010EF0 0222082A */ slt $at, $s1, $v0 -/* 011AF4 80010EF4 10200018 */ beqz $at, .L80010F58 -/* 011AF8 80010EF8 00119080 */ sll $s2, $s1, 2 -.L80010EFC: -/* 011AFC 80010EFC 8ECB0000 */ lw $t3, ($s6) -/* 011B00 80010F00 00000000 */ nop -/* 011B04 80010F04 01726021 */ addu $t4, $t3, $s2 -/* 011B08 80010F08 8D900000 */ lw $s0, ($t4) -/* 011B0C 80010F0C 00000000 */ nop -/* 011B10 80010F10 860D0006 */ lh $t5, 6($s0) -/* 011B14 80010F14 00000000 */ nop -/* 011B18 80010F18 31AE8000 */ andi $t6, $t5, 0x8000 -/* 011B1C 80010F1C 15C0000A */ bnez $t6, .L80010F48 -/* 011B20 80010F20 00000000 */ nop -/* 011B24 80010F24 8E0F0054 */ lw $t7, 0x54($s0) -/* 011B28 80010F28 00000000 */ nop -/* 011B2C 80010F2C 11E00006 */ beqz $t7, .L80010F48 -/* 011B30 80010F30 00000000 */ nop -/* 011B34 80010F34 0C00CB1F */ jal func_80032C7C -/* 011B38 80010F38 02002025 */ move $a0, $s0 -/* 011B3C 80010F3C 3C028012 */ lui $v0, %hi(objCount) # $v0, 0x8012 -/* 011B40 80010F40 8C42AE5C */ lw $v0, %lo(objCount)($v0) -/* 011B44 80010F44 00000000 */ nop -.L80010F48: -/* 011B48 80010F48 26310001 */ addiu $s1, $s1, 1 -/* 011B4C 80010F4C 0222082A */ slt $at, $s1, $v0 -/* 011B50 80010F50 1420FFEA */ bnez $at, .L80010EFC -/* 011B54 80010F54 26520004 */ addiu $s2, $s2, 4 -.L80010F58: -/* 011B58 80010F58 0C0079BB */ jal func_8001E6EC -/* 011B5C 80010F5C 00002025 */ move $a0, $zero -/* 011B60 80010F60 3C188012 */ lui $t8, %hi(D_8011AEF7) # $t8, 0x8012 -/* 011B64 80010F64 8318AEF7 */ lb $t8, %lo(D_8011AEF7)($t8) -/* 011B68 80010F68 00000000 */ nop -/* 011B6C 80010F6C 13000003 */ beqz $t8, .L80010F7C -/* 011B70 80010F70 00000000 */ nop -/* 011B74 80010F74 0C008A52 */ jal func_80022948 -/* 011B78 80010F78 00000000 */ nop -.L80010F7C: -/* 011B7C 80010F7C 3C108012 */ lui $s0, %hi(D_8011ADAC) # $s0, 0x8012 -/* 011B80 80010F80 2610ADAC */ addiu $s0, %lo(D_8011ADAC) # addiu $s0, $s0, -0x5254 -/* 011B84 80010F84 8E190000 */ lw $t9, ($s0) -/* 011B88 80010F88 00000000 */ nop -/* 011B8C 80010F8C 17200009 */ bnez $t9, .L80010FB4 -/* 011B90 80010F90 00000000 */ nop -/* 011B94 80010F94 0C004013 */ jal gParticlePtrList_flush -/* 011B98 80010F98 00000000 */ nop -/* 011B9C 80010F9C 0C005FA6 */ jal func_80017E98 -/* 011BA0 80010FA0 00000000 */ nop -/* 011BA4 80010FA4 0C006F15 */ jal func_8001BC54 -/* 011BA8 80010FA8 00000000 */ nop -/* 011BAC 80010FAC 0C007A4F */ jal func_8001E93C -/* 011BB0 80010FB0 00000000 */ nop -.L80010FB4: -/* 011BB4 80010FB4 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 -/* 011BB8 80010FB8 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) -/* 011BBC 80010FBC 3C098012 */ lui $t1, %hi(D_8011AD4E) # $t1, 0x8012 -/* 011BC0 80010FC0 10E00010 */ beqz $a3, .L80011004 -/* 011BC4 80010FC4 00000000 */ nop -/* 011BC8 80010FC8 8529AD4E */ lh $t1, %lo(D_8011AD4E)($t1) -/* 011BCC 80010FCC 00000000 */ nop -/* 011BD0 80010FD0 15200007 */ bnez $t1, .L80010FF0 -/* 011BD4 80010FD4 00000000 */ nop -/* 011BD8 80010FD8 0C006602 */ jal func_80019808 -/* 011BDC 80010FDC 02802025 */ move $a0, $s4 -/* 011BE0 80010FE0 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 -/* 011BE4 80010FE4 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) -/* 011BE8 80010FE8 10000006 */ b .L80011004 -/* 011BEC 80010FEC 00000000 */ nop -.L80010FF0: -/* 011BF0 80010FF0 0C006A3D */ jal func_8001A8F4 -/* 011BF4 80010FF4 02802025 */ move $a0, $s4 -/* 011BF8 80010FF8 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 -/* 011BFC 80010FFC 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) -/* 011C00 80011000 00000000 */ nop -.L80011004: -/* 011C04 80011004 3C048012 */ lui $a0, %hi(gRacersByPort) # $a0, 0x8012 -/* 011C08 80011008 8C84AEEC */ lw $a0, %lo(gRacersByPort)($a0) -/* 011C0C 8001100C 00E02825 */ move $a1, $a3 -/* 011C10 80011010 0C00210E */ jal func_80008438 -/* 011C14 80011014 02803025 */ move $a2, $s4 -/* 011C18 80011018 44945000 */ mtc1 $s4, $f10 -/* 011C1C 8001101C 24080001 */ li $t0, 1 -/* 011C20 80011020 46805420 */ cvt.s.w $f16, $f10 -/* 011C24 80011024 AE080000 */ sw $t0, ($s0) -/* 011C28 80011028 3C018012 */ lui $at, %hi(D_8011ADA8) # $at, 0x8012 -/* 011C2C 8001102C E430ADA8 */ swc1 $f16, %lo(D_8011ADA8)($at) -/* 011C30 80011030 3C018012 */ lui $at, %hi(D_8011AD24) # $at, 0x8012 -/* 011C34 80011034 A020AD24 */ sb $zero, %lo(D_8011AD24)($at) -/* 011C38 80011038 3C018012 */ lui $at, %hi(D_8011AD53) # $at, 0x8012 -/* 011C3C 8001103C 0C0038AD */ jal func_8000E2B4 -/* 011C40 80011040 A020AD53 */ sb $zero, %lo(D_8011AD53)($at) -/* 011C44 80011044 0C0273EC */ jal func_8009CFB0 -/* 011C48 80011048 00000000 */ nop -/* 011C4C 8001104C 0C005E74 */ jal func_800179D0 -/* 011C50 80011050 00000000 */ nop -/* 011C54 80011054 3C038012 */ lui $v1, %hi(D_8011AF00) # $v1, 0x8012 -/* 011C58 80011058 2463AF00 */ addiu $v1, %lo(D_8011AF00) # addiu $v1, $v1, -0x5100 -/* 011C5C 8001105C 80620000 */ lb $v0, ($v1) -/* 011C60 80011060 24010001 */ li $at, 1 -/* 011C64 80011064 14410026 */ bne $v0, $at, .L80011100 -/* 011C68 80011068 3C0A8012 */ lui $t2, %hi(D_8011ADB0) # $t2, 0x8012 -/* 011C6C 8001106C 8D4AADB0 */ lw $t2, %lo(D_8011ADB0)($t2) -/* 011C70 80011070 24010050 */ li $at, 80 -/* 011C74 80011074 15410025 */ bne $t2, $at, .L8001110C -/* 011C78 80011078 3C0B8012 */ lui $t3, %hi(D_8011AE7A) # $t3, 0x8012 -/* 011C7C 8001107C 856BAE7A */ lh $t3, %lo(D_8011AE7A)($t3) -/* 011C80 80011080 00002825 */ move $a1, $zero -/* 011C84 80011084 15600021 */ bnez $t3, .L8001110C -/* 011C88 80011088 00009825 */ move $s3, $zero -/* 011C8C 8001108C 24100004 */ li $s0, 4 -.L80011090: -/* 011C90 80011090 02602025 */ move $a0, $s3 -/* 011C94 80011094 0C01A955 */ jal get_buttons_pressed_from_player -/* 011C98 80011098 AFA50054 */ sw $a1, 0x54($sp) -/* 011C9C 8001109C 8FA50054 */ lw $a1, 0x54($sp) -/* 011CA0 800110A0 26730001 */ addiu $s3, $s3, 1 -/* 011CA4 800110A4 1670FFFA */ bne $s3, $s0, .L80011090 -/* 011CA8 800110A8 00A22825 */ or $a1, $a1, $v0 -/* 011CAC 800110AC 30AC8000 */ andi $t4, $a1, 0x8000 -/* 011CB0 800110B0 11800005 */ beqz $t4, .L800110C8 -/* 011CB4 800110B4 30AD4000 */ andi $t5, $a1, 0x4000 -/* 011CB8 800110B8 0C007917 */ jal func_8001E45C -/* 011CBC 800110BC 24040064 */ li $a0, 100 -/* 011CC0 800110C0 10000013 */ b .L80011110 -/* 011CC4 800110C4 8FBF0034 */ lw $ra, 0x34($sp) -.L800110C8: -/* 011CC8 800110C8 11A00011 */ beqz $t5, .L80011110 -/* 011CCC 800110CC 8FBF0034 */ lw $ra, 0x34($sp) -/* 011CD0 800110D0 0C02658B */ jal get_trophy_race_world_id -/* 011CD4 800110D4 00000000 */ nop -/* 011CD8 800110D8 1440000D */ bnez $v0, .L80011110 -/* 011CDC 800110DC 8FBF0034 */ lw $ra, 0x34($sp) -/* 011CE0 800110E0 0C0270B4 */ jal is_in_tracks_mode -/* 011CE4 800110E4 00000000 */ nop -/* 011CE8 800110E8 14400009 */ bnez $v0, .L80011110 -/* 011CEC 800110EC 8FBF0034 */ lw $ra, 0x34($sp) -/* 011CF0 800110F0 0C01BC50 */ jal func_8006F140 -/* 011CF4 800110F4 24040001 */ li $a0, 1 -/* 011CF8 800110F8 10000005 */ b .L80011110 -/* 011CFC 800110FC 8FBF0034 */ lw $ra, 0x34($sp) -.L80011100: -/* 011D00 80011100 14400002 */ bnez $v0, .L8001110C -/* 011D04 80011104 240E0001 */ li $t6, 1 -/* 011D08 80011108 A06E0000 */ sb $t6, ($v1) -.L8001110C: -/* 011D0C 8001110C 8FBF0034 */ lw $ra, 0x34($sp) -.L80011110: -/* 011D10 80011110 8FB00018 */ lw $s0, 0x18($sp) -/* 011D14 80011114 8FB1001C */ lw $s1, 0x1c($sp) -/* 011D18 80011118 8FB20020 */ lw $s2, 0x20($sp) -/* 011D1C 8001111C 8FB30024 */ lw $s3, 0x24($sp) -/* 011D20 80011120 8FB40028 */ lw $s4, 0x28($sp) -/* 011D24 80011124 8FB5002C */ lw $s5, 0x2c($sp) -/* 011D28 80011128 8FB60030 */ lw $s6, 0x30($sp) -/* 011D2C 8001112C 03E00008 */ jr $ra -/* 011D30 80011130 27BD0068 */ addiu $sp, $sp, 0x68 - +glabel func_80010994 +/* 011594 80010994 27BDFF98 */ addiu $sp, $sp, -0x68 +/* 011598 80010998 AFB40028 */ sw $s4, 0x28($sp) +/* 01159C 8001099C 0080A025 */ move $s4, $a0 +/* 0115A0 800109A0 AFBF0034 */ sw $ra, 0x34($sp) +/* 0115A4 800109A4 AFB60030 */ sw $s6, 0x30($sp) +/* 0115A8 800109A8 AFB5002C */ sw $s5, 0x2c($sp) +/* 0115AC 800109AC AFB30024 */ sw $s3, 0x24($sp) +/* 0115B0 800109B0 AFB20020 */ sw $s2, 0x20($sp) +/* 0115B4 800109B4 AFB1001C */ sw $s1, 0x1c($sp) +/* 0115B8 800109B8 AFB00018 */ sw $s0, 0x18($sp) +/* 0115BC 800109BC 0C00916D */ jal func_800245B4 +/* 0115C0 800109C0 2404FFFF */ li $a0, -1 +/* 0115C4 800109C4 3C028012 */ lui $v0, %hi(D_8011ADB0) # $v0, 0x8012 +/* 0115C8 800109C8 8C42ADB0 */ lw $v0, %lo(D_8011ADB0)($v0) +/* 0115CC 800109CC 3C018012 */ lui $at, %hi(gRaceStartCountdown) # $at, 0x8012 +/* 0115D0 800109D0 1840000D */ blez $v0, .L80010A08 +/* 0115D4 800109D4 AC22ADB8 */ sw $v0, %lo(gRaceStartCountdown)($at) +/* 0115D8 800109D8 0C028064 */ jal func_800A0190 +/* 0115DC 800109DC 00000000 */ nop +/* 0115E0 800109E0 10400009 */ beqz $v0, .L80010A08 +/* 0115E4 800109E4 3C038012 */ lui $v1, %hi(D_8011ADBC) # $v1, 0x8012 +/* 0115E8 800109E8 3C048012 */ lui $a0, %hi(D_8011ADB0) # $a0, 0x8012 +/* 0115EC 800109EC 2484ADB0 */ addiu $a0, %lo(D_8011ADB0) # addiu $a0, $a0, -0x5250 +/* 0115F0 800109F0 8C8E0000 */ lw $t6, ($a0) +/* 0115F4 800109F4 2463ADBC */ addiu $v1, %lo(D_8011ADBC) # addiu $v1, $v1, -0x5244 +/* 0115F8 800109F8 01D41023 */ subu $v0, $t6, $s4 +/* 0115FC 800109FC AC820000 */ sw $v0, ($a0) +/* 011600 80010A00 10000009 */ b .L80010A28 +/* 011604 80010A04 AC600000 */ sw $zero, ($v1) +.L80010A08: +/* 011608 80010A08 3C038012 */ lui $v1, %hi(D_8011ADBC) # $v1, 0x8012 +/* 01160C 80010A0C 2463ADBC */ addiu $v1, %lo(D_8011ADBC) # addiu $v1, $v1, -0x5244 +/* 011610 80010A10 8C780000 */ lw $t8, ($v1) +/* 011614 80010A14 3C028012 */ lui $v0, %hi(D_8011ADB0) # $v0, 0x8012 +/* 011618 80010A18 0314C821 */ addu $t9, $t8, $s4 +/* 01161C 80010A1C AC790000 */ sw $t9, ($v1) +/* 011620 80010A20 8C42ADB0 */ lw $v0, %lo(D_8011ADB0)($v0) +/* 011624 80010A24 00000000 */ nop +.L80010A28: +/* 011628 80010A28 1C400003 */ bgtz $v0, .L80010A38 +/* 01162C 80010A2C 3C048012 */ lui $a0, %hi(gNumRacers) # $a0, 0x8012 +/* 011630 80010A30 3C018012 */ lui $at, %hi(D_8011ADB0) # $at, 0x8012 +/* 011634 80010A34 AC20ADB0 */ sw $zero, %lo(D_8011ADB0)($at) +.L80010A38: +/* 011638 80010A38 3C028012 */ lui $v0, %hi(D_8011AD21) # $v0, 0x8012 +/* 01163C 80010A3C 3C018012 */ lui $at, %hi(D_8011AD3D) # $at, 0x8012 +/* 011640 80010A40 2442AD21 */ addiu $v0, %lo(D_8011AD21) # addiu $v0, $v0, -0x52df +/* 011644 80010A44 A020AD3D */ sb $zero, %lo(D_8011AD3D)($at) +/* 011648 80010A48 80480000 */ lb $t0, ($v0) +/* 01164C 80010A4C 24090001 */ li $t1, 1 +/* 011650 80010A50 01285023 */ subu $t2, $t1, $t0 +/* 011654 80010A54 A04A0000 */ sb $t2, ($v0) +/* 011658 80010A58 804B0000 */ lb $t3, ($v0) +/* 01165C 80010A5C 3C018012 */ lui $at, %hi(D_8011AD22) # $at, 0x8012 +/* 011660 80010A60 002B0821 */ addu $at, $at, $t3 +/* 011664 80010A64 2484AEF0 */ addiu $a0, %lo(gNumRacers) # addiu $a0, $a0, -0x5110 +/* 011668 80010A68 A020AD22 */ sb $zero, %lo(D_8011AD22)($at) +/* 01166C 80010A6C 8C8C0000 */ lw $t4, ($a0) +/* 011670 80010A70 00009825 */ move $s3, $zero +/* 011674 80010A74 19800021 */ blez $t4, .L80010AFC +/* 011678 80010A78 3C158012 */ lui $s5, %hi(gRacers) # $s5, 0x8012 +/* 01167C 80010A7C 26B5AEE4 */ addiu $s5, %lo(gRacers) # addiu $s5, $s5, -0x511c +/* 011680 80010A80 00001825 */ move $v1, $zero +.L80010A84: +/* 011684 80010A84 8EAD0000 */ lw $t5, ($s5) +/* 011688 80010A88 26730001 */ addiu $s3, $s3, 1 +/* 01168C 80010A8C 01A37021 */ addu $t6, $t5, $v1 +/* 011690 80010A90 8DC20000 */ lw $v0, ($t6) +/* 011694 80010A94 00000000 */ nop +/* 011698 80010A98 8C450064 */ lw $a1, 0x64($v0) +/* 01169C 80010A9C C444000C */ lwc1 $f4, 0xc($v0) +/* 0116A0 80010AA0 00000000 */ nop +/* 0116A4 80010AA4 E4A4005C */ swc1 $f4, 0x5c($a1) +/* 0116A8 80010AA8 8EAF0000 */ lw $t7, ($s5) +/* 0116AC 80010AAC 00000000 */ nop +/* 0116B0 80010AB0 01E3C021 */ addu $t8, $t7, $v1 +/* 0116B4 80010AB4 8F190000 */ lw $t9, ($t8) +/* 0116B8 80010AB8 00000000 */ nop +/* 0116BC 80010ABC C7260010 */ lwc1 $f6, 0x10($t9) +/* 0116C0 80010AC0 00000000 */ nop +/* 0116C4 80010AC4 E4A60060 */ swc1 $f6, 0x60($a1) +/* 0116C8 80010AC8 8EA90000 */ lw $t1, ($s5) +/* 0116CC 80010ACC 00000000 */ nop +/* 0116D0 80010AD0 01234021 */ addu $t0, $t1, $v1 +/* 0116D4 80010AD4 8D0A0000 */ lw $t2, ($t0) +/* 0116D8 80010AD8 24630004 */ addiu $v1, $v1, 4 +/* 0116DC 80010ADC C5480014 */ lwc1 $f8, 0x14($t2) +/* 0116E0 80010AE0 00000000 */ nop +/* 0116E4 80010AE4 E4A80064 */ swc1 $f8, 0x64($a1) +/* 0116E8 80010AE8 8C8B0000 */ lw $t3, ($a0) +/* 0116EC 80010AEC 00000000 */ nop +/* 0116F0 80010AF0 026B082A */ slt $at, $s3, $t3 +/* 0116F4 80010AF4 1420FFE3 */ bnez $at, .L80010A84 +/* 0116F8 80010AF8 00000000 */ nop +.L80010AFC: +/* 0116FC 80010AFC 3C158012 */ lui $s5, %hi(gRacers) # $s5, 0x8012 +/* 011700 80010B00 0C0050AE */ jal func_800142B8 +/* 011704 80010B04 26B5AEE4 */ addiu $s5, %lo(gRacers) # addiu $s5, $s5, -0x511c +/* 011708 80010B08 0C00556E */ jal func_800155B8 +/* 01170C 80010B0C 00000000 */ nop +/* 011710 80010B10 0C007A27 */ jal func_8001E89C +/* 011714 80010B14 00000000 */ nop +/* 011718 80010B18 3C138012 */ lui $s3, %hi(D_8011AE70) # $s3, 0x8012 +/* 01171C 80010B1C 2673AE70 */ addiu $s3, %lo(D_8011AE70) # addiu $s3, $s3, -0x5190 +/* 011720 80010B20 8E6C0000 */ lw $t4, ($s3) +/* 011724 80010B24 00008825 */ move $s1, $zero +/* 011728 80010B28 1980000F */ blez $t4, .L80010B68 +/* 01172C 80010B2C 3C108012 */ lui $s0, %hi(D_8011AE6C) # $s0, 0x8012 +/* 011730 80010B30 2610AE6C */ addiu $s0, %lo(D_8011AE6C) # addiu $s0, $s0, -0x5194 +/* 011734 80010B34 00009025 */ move $s2, $zero +.L80010B38: +/* 011738 80010B38 8E0D0000 */ lw $t5, ($s0) +/* 01173C 80010B3C 02802825 */ move $a1, $s4 +/* 011740 80010B40 01B27021 */ addu $t6, $t5, $s2 +/* 011744 80010B44 8DC40000 */ lw $a0, ($t6) +/* 011748 80010B48 0C008FD2 */ jal run_object_loop_func +/* 01174C 80010B4C 00000000 */ nop +/* 011750 80010B50 8E6F0000 */ lw $t7, ($s3) +/* 011754 80010B54 26310001 */ addiu $s1, $s1, 1 +/* 011758 80010B58 022F082A */ slt $at, $s1, $t7 +/* 01175C 80010B5C 1420FFF6 */ bnez $at, .L80010B38 +/* 011760 80010B60 26520004 */ addiu $s2, $s2, 4 +/* 011764 80010B64 00008825 */ move $s1, $zero +.L80010B68: +/* 011768 80010B68 3C108012 */ lui $s0, %hi(D_8011AE6C) # $s0, 0x8012 +/* 01176C 80010B6C 2610AE6C */ addiu $s0, %lo(D_8011AE6C) # addiu $s0, $s0, -0x5194 +/* 011770 80010B70 0C0079BB */ jal func_8001E6EC +/* 011774 80010B74 24040001 */ li $a0, 1 +/* 011778 80010B78 8E780000 */ lw $t8, ($s3) +/* 01177C 80010B7C 00000000 */ nop +/* 011780 80010B80 1B00000C */ blez $t8, .L80010BB4 +/* 011784 80010B84 00009025 */ move $s2, $zero +.L80010B88: +/* 011788 80010B88 8E190000 */ lw $t9, ($s0) +/* 01178C 80010B8C 00000000 */ nop +/* 011790 80010B90 03324821 */ addu $t1, $t9, $s2 +/* 011794 80010B94 8D240000 */ lw $a0, ($t1) +/* 011798 80010B98 0C005C27 */ jal func_8001709C +/* 01179C 80010B9C 00000000 */ nop +/* 0117A0 80010BA0 8E680000 */ lw $t0, ($s3) +/* 0117A4 80010BA4 26310001 */ addiu $s1, $s1, 1 +/* 0117A8 80010BA8 0228082A */ slt $at, $s1, $t0 +/* 0117AC 80010BAC 1420FFF6 */ bnez $at, .L80010B88 +/* 0117B0 80010BB0 26520004 */ addiu $s2, $s2, 4 +.L80010BB4: +/* 0117B4 80010BB4 3C138012 */ lui $s3, %hi(objCount) # $s3, 0x8012 +/* 0117B8 80010BB8 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 +/* 0117BC 80010BBC 8E73AE5C */ lw $s3, %lo(objCount)($s3) +/* 0117C0 80010BC0 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) +/* 0117C4 80010BC4 00000000 */ nop +/* 0117C8 80010BC8 0233082A */ slt $at, $s1, $s3 +/* 0117CC 80010BCC 1020004C */ beqz $at, .L80010D00 +/* 0117D0 80010BD0 00119080 */ sll $s2, $s1, 2 +/* 0117D4 80010BD4 00135080 */ sll $t2, $s3, 2 +/* 0117D8 80010BD8 3C168012 */ lui $s6, %hi(gObjPtrList) # $s6, 0x8012 +/* 0117DC 80010BDC 26D6AE58 */ addiu $s6, %lo(gObjPtrList) # addiu $s6, $s6, -0x51a8 +/* 0117E0 80010BE0 AFAA0038 */ sw $t2, 0x38($sp) +/* 0117E4 80010BE4 24110021 */ li $s1, 33 +.L80010BE8: +/* 0117E8 80010BE8 8ECB0000 */ lw $t3, ($s6) +/* 0117EC 80010BEC 00000000 */ nop +/* 0117F0 80010BF0 01726021 */ addu $t4, $t3, $s2 +/* 0117F4 80010BF4 8D900000 */ lw $s0, ($t4) +/* 0117F8 80010BF8 00000000 */ nop +/* 0117FC 80010BFC 860D0006 */ lh $t5, 6($s0) +/* 011800 80010C00 00000000 */ nop +/* 011804 80010C04 31AE8000 */ andi $t6, $t5, 0x8000 +/* 011808 80010C08 15C00039 */ bnez $t6, .L80010CF0 +/* 01180C 80010C0C 8FAB0038 */ lw $t3, 0x38($sp) +/* 011810 80010C10 86020048 */ lh $v0, 0x48($s0) +/* 011814 80010C14 24010005 */ li $at, 5 +/* 011818 80010C18 12220035 */ beq $s1, $v0, .L80010CF0 +/* 01181C 80010C1C 8FAB0038 */ lw $t3, 0x38($sp) +/* 011820 80010C20 10410032 */ beq $v0, $at, .L80010CEC +/* 011824 80010C24 2401000F */ li $at, 15 +/* 011828 80010C28 10410031 */ beq $v0, $at, .L80010CF0 +/* 01182C 80010C2C 8FAB0038 */ lw $t3, 0x38($sp) +/* 011830 80010C30 8E02004C */ lw $v0, 0x4c($s0) +/* 011834 80010C34 02002025 */ move $a0, $s0 +/* 011838 80010C38 10400009 */ beqz $v0, .L80010C60 +/* 01183C 80010C3C 00000000 */ nop +/* 011840 80010C40 904F0011 */ lbu $t7, 0x11($v0) +/* 011844 80010C44 24010002 */ li $at, 2 +/* 011848 80010C48 11E10007 */ beq $t7, $at, .L80010C68 +/* 01184C 80010C4C 02002025 */ move $a0, $s0 +/* 011850 80010C50 0C008FD2 */ jal run_object_loop_func +/* 011854 80010C54 02802825 */ move $a1, $s4 +/* 011858 80010C58 10000004 */ b .L80010C6C +/* 01185C 80010C5C 8E060040 */ lw $a2, 0x40($s0) +.L80010C60: +/* 011860 80010C60 0C008FD2 */ jal run_object_loop_func +/* 011864 80010C64 02802825 */ move $a1, $s4 +.L80010C68: +/* 011868 80010C68 8E060040 */ lw $a2, 0x40($s0) +.L80010C6C: +/* 01186C 80010C6C 00000000 */ nop +/* 011870 80010C70 80D80053 */ lb $t8, 0x53($a2) +/* 011874 80010C74 00000000 */ nop +/* 011878 80010C78 1700001D */ bnez $t8, .L80010CF0 +/* 01187C 80010C7C 8FAB0038 */ lw $t3, 0x38($sp) +/* 011880 80010C80 80C40055 */ lb $a0, 0x55($a2) +/* 011884 80010C84 00002825 */ move $a1, $zero +/* 011888 80010C88 18800012 */ blez $a0, .L80010CD4 +/* 01188C 80010C8C 00001025 */ move $v0, $zero +.L80010C90: +/* 011890 80010C90 8E190068 */ lw $t9, 0x68($s0) +/* 011894 80010C94 24A50001 */ addiu $a1, $a1, 1 +/* 011898 80010C98 03224821 */ addu $t1, $t9, $v0 +/* 01189C 80010C9C 8D230000 */ lw $v1, ($t1) +/* 0118A0 80010CA0 00000000 */ nop +/* 0118A4 80010CA4 10600009 */ beqz $v1, .L80010CCC +/* 0118A8 80010CA8 00A4082A */ slt $at, $a1, $a0 +/* 0118AC 80010CAC 8C680000 */ lw $t0, ($v1) +/* 0118B0 80010CB0 00000000 */ nop +/* 0118B4 80010CB4 A5140052 */ sh $s4, 0x52($t0) +/* 0118B8 80010CB8 8E060040 */ lw $a2, 0x40($s0) +/* 0118BC 80010CBC 00000000 */ nop +/* 0118C0 80010CC0 80C40055 */ lb $a0, 0x55($a2) +/* 0118C4 80010CC4 00000000 */ nop +/* 0118C8 80010CC8 00A4082A */ slt $at, $a1, $a0 +.L80010CCC: +/* 0118CC 80010CCC 1420FFF0 */ bnez $at, .L80010C90 +/* 0118D0 80010CD0 24420004 */ addiu $v0, $v0, 4 +.L80010CD4: +/* 0118D4 80010CD4 90CA0072 */ lbu $t2, 0x72($a2) +/* 0118D8 80010CD8 240100FF */ li $at, 255 +/* 0118DC 80010CDC 11410003 */ beq $t2, $at, .L80010CEC +/* 0118E0 80010CE0 02002025 */ move $a0, $s0 +/* 0118E4 80010CE4 0C005024 */ jal func_80014090 +/* 0118E8 80010CE8 02802825 */ move $a1, $s4 +.L80010CEC: +/* 0118EC 80010CEC 8FAB0038 */ lw $t3, 0x38($sp) +.L80010CF0: +/* 0118F0 80010CF0 26520004 */ addiu $s2, $s2, 4 +/* 0118F4 80010CF4 024B082A */ slt $at, $s2, $t3 +/* 0118F8 80010CF8 1420FFBB */ bnez $at, .L80010BE8 +/* 0118FC 80010CFC 00000000 */ nop +.L80010D00: +/* 011900 80010D00 3C0C8012 */ lui $t4, %hi(gNumRacers) # $t4, 0x8012 +/* 011904 80010D04 8D8CAEF0 */ lw $t4, %lo(gNumRacers)($t4) +/* 011908 80010D08 3C168012 */ lui $s6, %hi(gObjPtrList) # $s6, 0x8012 +/* 01190C 80010D0C 26D6AE58 */ addiu $s6, %lo(gObjPtrList) # addiu $s6, $s6, -0x51a8 +/* 011910 80010D10 1980000E */ blez $t4, .L80010D4C +/* 011914 80010D14 00008825 */ move $s1, $zero +/* 011918 80010D18 00009025 */ move $s2, $zero +.L80010D1C: +/* 01191C 80010D1C 8EAD0000 */ lw $t5, ($s5) +/* 011920 80010D20 02802825 */ move $a1, $s4 +/* 011924 80010D24 01B27021 */ addu $t6, $t5, $s2 +/* 011928 80010D28 8DC40000 */ lw $a0, ($t6) +/* 01192C 80010D2C 0C01378E */ jal update_player_racer +/* 011930 80010D30 00000000 */ nop +/* 011934 80010D34 3C0F8012 */ lui $t7, %hi(gNumRacers) # $t7, 0x8012 +/* 011938 80010D38 8DEFAEF0 */ lw $t7, %lo(gNumRacers)($t7) +/* 01193C 80010D3C 26310001 */ addiu $s1, $s1, 1 +/* 011940 80010D40 022F082A */ slt $at, $s1, $t7 +/* 011944 80010D44 1420FFF5 */ bnez $at, .L80010D1C +/* 011948 80010D48 26520004 */ addiu $s2, $s2, 4 +.L80010D4C: +/* 01194C 80010D4C 0C01AF66 */ jal get_current_level_race_type +/* 011950 80010D50 00000000 */ nop +/* 011954 80010D54 1440001C */ bnez $v0, .L80010DC8 +/* 011958 80010D58 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 +/* 01195C 80010D5C 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) +/* 011960 80010D60 00008825 */ move $s1, $zero +/* 011964 80010D64 18E00018 */ blez $a3, .L80010DC8 +/* 011968 80010D68 2412FFFF */ li $s2, -1 +/* 01196C 80010D6C 3C108012 */ lui $s0, %hi(gRacersByPosition) # $s0, 0x8012 +/* 011970 80010D70 2610AEE8 */ addiu $s0, %lo(gRacersByPosition) # addiu $s0, $s0, -0x5118 +.L80010D74: +/* 011974 80010D74 8E180000 */ lw $t8, ($s0) +/* 011978 80010D78 0011C880 */ sll $t9, $s1, 2 +/* 01197C 80010D7C 03194821 */ addu $t1, $t8, $t9 +/* 011980 80010D80 8D240000 */ lw $a0, ($t1) +/* 011984 80010D84 00000000 */ nop +/* 011988 80010D88 8C850064 */ lw $a1, 0x64($a0) +/* 01198C 80010D8C 00000000 */ nop +/* 011990 80010D90 84A80000 */ lh $t0, ($a1) +/* 011994 80010D94 00000000 */ nop +/* 011998 80010D98 12480008 */ beq $s2, $t0, .L80010DBC +/* 01199C 80010D9C 26310001 */ addiu $s1, $s1, 1 +/* 0119A0 80010DA0 0C010FB3 */ jal func_80043ECC +/* 0119A4 80010DA4 02803025 */ move $a2, $s4 +/* 0119A8 80010DA8 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 +/* 0119AC 80010DAC 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) +/* 0119B0 80010DB0 00000000 */ nop +/* 0119B4 80010DB4 00E08825 */ move $s1, $a3 +/* 0119B8 80010DB8 26310001 */ addiu $s1, $s1, 1 +.L80010DBC: +/* 0119BC 80010DBC 0227082A */ slt $at, $s1, $a3 +/* 0119C0 80010DC0 1420FFEC */ bnez $at, .L80010D74 +/* 0119C4 80010DC4 00000000 */ nop +.L80010DC8: +/* 0119C8 80010DC8 0C002EB7 */ jal func_8000BADC +/* 0119CC 80010DCC 02802025 */ move $a0, $s4 +/* 0119D0 80010DD0 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 +/* 0119D4 80010DD4 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) +/* 0119D8 80010DD8 00000000 */ nop +/* 0119DC 80010DDC 0233082A */ slt $at, $s1, $s3 +/* 0119E0 80010DE0 1020001D */ beqz $at, .L80010E58 +/* 0119E4 80010DE4 00119080 */ sll $s2, $s1, 2 +/* 0119E8 80010DE8 00131080 */ sll $v0, $s3, 2 +.L80010DEC: +/* 0119EC 80010DEC 8ECA0000 */ lw $t2, ($s6) +/* 0119F0 80010DF0 00000000 */ nop +/* 0119F4 80010DF4 01525821 */ addu $t3, $t2, $s2 +/* 0119F8 80010DF8 8D700000 */ lw $s0, ($t3) +/* 0119FC 80010DFC 00000000 */ nop +/* 011A00 80010E00 860C0006 */ lh $t4, 6($s0) +/* 011A04 80010E04 00000000 */ nop +/* 011A08 80010E08 318D8000 */ andi $t5, $t4, 0x8000 +/* 011A0C 80010E0C 15A00005 */ bnez $t5, .L80010E24 +/* 011A10 80010E10 00000000 */ nop +/* 011A14 80010E14 860E0048 */ lh $t6, 0x48($s0) +/* 011A18 80010E18 24010005 */ li $at, 5 +/* 011A1C 80010E1C 11C10005 */ beq $t6, $at, .L80010E34 +/* 011A20 80010E20 02002025 */ move $a0, $s0 +.L80010E24: +/* 011A24 80010E24 860F0048 */ lh $t7, 0x48($s0) +/* 011A28 80010E28 2401000F */ li $at, 15 +/* 011A2C 80010E2C 15E10006 */ bne $t7, $at, .L80010E48 +/* 011A30 80010E30 02002025 */ move $a0, $s0 +.L80010E34: +/* 011A34 80010E34 02802825 */ move $a1, $s4 +/* 011A38 80010E38 0C008FD2 */ jal run_object_loop_func +/* 011A3C 80010E3C AFA20044 */ sw $v0, 0x44($sp) +/* 011A40 80010E40 8FA20044 */ lw $v0, 0x44($sp) +/* 011A44 80010E44 00000000 */ nop +.L80010E48: +/* 011A48 80010E48 26520004 */ addiu $s2, $s2, 4 +/* 011A4C 80010E4C 0242082A */ slt $at, $s2, $v0 +/* 011A50 80010E50 1420FFE6 */ bnez $at, .L80010DEC +/* 011A54 80010E54 00000000 */ nop +.L80010E58: +/* 011A58 80010E58 3C188012 */ lui $t8, %hi(D_8011AE64) # $t8, 0x8012 +/* 011A5C 80010E5C 8F18AE64 */ lw $t8, %lo(D_8011AE64)($t8) +/* 011A60 80010E60 00000000 */ nop +/* 011A64 80010E64 1B000018 */ blez $t8, .L80010EC8 +/* 011A68 80010E68 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 +/* 011A6C 80010E6C 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) +/* 011A70 80010E70 00131080 */ sll $v0, $s3, 2 +/* 011A74 80010E74 0233082A */ slt $at, $s1, $s3 +/* 011A78 80010E78 10200013 */ beqz $at, .L80010EC8 +/* 011A7C 80010E7C 00119080 */ sll $s2, $s1, 2 +.L80010E80: +/* 011A80 80010E80 8ED90000 */ lw $t9, ($s6) +/* 011A84 80010E84 02802825 */ move $a1, $s4 +/* 011A88 80010E88 03324821 */ addu $t1, $t9, $s2 +/* 011A8C 80010E8C 8D300000 */ lw $s0, ($t1) +/* 011A90 80010E90 00000000 */ nop +/* 011A94 80010E94 86080006 */ lh $t0, 6($s0) +/* 011A98 80010E98 02002025 */ move $a0, $s0 +/* 011A9C 80010E9C 310A8000 */ andi $t2, $t0, 0x8000 +/* 011AA0 80010EA0 11400005 */ beqz $t2, .L80010EB8 +/* 011AA4 80010EA4 00000000 */ nop +/* 011AA8 80010EA8 0C02C8BF */ jal func_800B22FC +/* 011AAC 80010EAC AFA20044 */ sw $v0, 0x44($sp) +/* 011AB0 80010EB0 8FA20044 */ lw $v0, 0x44($sp) +/* 011AB4 80010EB4 00000000 */ nop +.L80010EB8: +/* 011AB8 80010EB8 26520004 */ addiu $s2, $s2, 4 +/* 011ABC 80010EBC 0242082A */ slt $at, $s2, $v0 +/* 011AC0 80010EC0 1420FFEF */ bnez $at, .L80010E80 +/* 011AC4 80010EC4 00000000 */ nop +.L80010EC8: +/* 011AC8 80010EC8 0C00C8E6 */ jal lightUpdateLights +/* 011ACC 80010ECC 02802025 */ move $a0, $s4 +/* 011AD0 80010ED0 0C00CB1B */ jal func_80032C6C +/* 011AD4 80010ED4 00000000 */ nop +/* 011AD8 80010ED8 1840001F */ blez $v0, .L80010F58 +/* 011ADC 80010EDC 3C118012 */ lui $s1, %hi(D_8011AE60) # $s1, 0x8012 +/* 011AE0 80010EE0 3C028012 */ lui $v0, %hi(objCount) # $v0, 0x8012 +/* 011AE4 80010EE4 8C42AE5C */ lw $v0, %lo(objCount)($v0) +/* 011AE8 80010EE8 8E31AE60 */ lw $s1, %lo(D_8011AE60)($s1) +/* 011AEC 80010EEC 00000000 */ nop +/* 011AF0 80010EF0 0222082A */ slt $at, $s1, $v0 +/* 011AF4 80010EF4 10200018 */ beqz $at, .L80010F58 +/* 011AF8 80010EF8 00119080 */ sll $s2, $s1, 2 +.L80010EFC: +/* 011AFC 80010EFC 8ECB0000 */ lw $t3, ($s6) +/* 011B00 80010F00 00000000 */ nop +/* 011B04 80010F04 01726021 */ addu $t4, $t3, $s2 +/* 011B08 80010F08 8D900000 */ lw $s0, ($t4) +/* 011B0C 80010F0C 00000000 */ nop +/* 011B10 80010F10 860D0006 */ lh $t5, 6($s0) +/* 011B14 80010F14 00000000 */ nop +/* 011B18 80010F18 31AE8000 */ andi $t6, $t5, 0x8000 +/* 011B1C 80010F1C 15C0000A */ bnez $t6, .L80010F48 +/* 011B20 80010F20 00000000 */ nop +/* 011B24 80010F24 8E0F0054 */ lw $t7, 0x54($s0) +/* 011B28 80010F28 00000000 */ nop +/* 011B2C 80010F2C 11E00006 */ beqz $t7, .L80010F48 +/* 011B30 80010F30 00000000 */ nop +/* 011B34 80010F34 0C00CB1F */ jal func_80032C7C +/* 011B38 80010F38 02002025 */ move $a0, $s0 +/* 011B3C 80010F3C 3C028012 */ lui $v0, %hi(objCount) # $v0, 0x8012 +/* 011B40 80010F40 8C42AE5C */ lw $v0, %lo(objCount)($v0) +/* 011B44 80010F44 00000000 */ nop +.L80010F48: +/* 011B48 80010F48 26310001 */ addiu $s1, $s1, 1 +/* 011B4C 80010F4C 0222082A */ slt $at, $s1, $v0 +/* 011B50 80010F50 1420FFEA */ bnez $at, .L80010EFC +/* 011B54 80010F54 26520004 */ addiu $s2, $s2, 4 +.L80010F58: +/* 011B58 80010F58 0C0079BB */ jal func_8001E6EC +/* 011B5C 80010F5C 00002025 */ move $a0, $zero +/* 011B60 80010F60 3C188012 */ lui $t8, %hi(D_8011AEF7) # $t8, 0x8012 +/* 011B64 80010F64 8318AEF7 */ lb $t8, %lo(D_8011AEF7)($t8) +/* 011B68 80010F68 00000000 */ nop +/* 011B6C 80010F6C 13000003 */ beqz $t8, .L80010F7C +/* 011B70 80010F70 00000000 */ nop +/* 011B74 80010F74 0C008A52 */ jal func_80022948 +/* 011B78 80010F78 00000000 */ nop +.L80010F7C: +/* 011B7C 80010F7C 3C108012 */ lui $s0, %hi(D_8011ADAC) # $s0, 0x8012 +/* 011B80 80010F80 2610ADAC */ addiu $s0, %lo(D_8011ADAC) # addiu $s0, $s0, -0x5254 +/* 011B84 80010F84 8E190000 */ lw $t9, ($s0) +/* 011B88 80010F88 00000000 */ nop +/* 011B8C 80010F8C 17200009 */ bnez $t9, .L80010FB4 +/* 011B90 80010F90 00000000 */ nop +/* 011B94 80010F94 0C004013 */ jal gParticlePtrList_flush +/* 011B98 80010F98 00000000 */ nop +/* 011B9C 80010F9C 0C005FA6 */ jal func_80017E98 +/* 011BA0 80010FA0 00000000 */ nop +/* 011BA4 80010FA4 0C006F15 */ jal func_8001BC54 +/* 011BA8 80010FA8 00000000 */ nop +/* 011BAC 80010FAC 0C007A4F */ jal func_8001E93C +/* 011BB0 80010FB0 00000000 */ nop +.L80010FB4: +/* 011BB4 80010FB4 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 +/* 011BB8 80010FB8 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) +/* 011BBC 80010FBC 3C098012 */ lui $t1, %hi(D_8011AD4E) # $t1, 0x8012 +/* 011BC0 80010FC0 10E00010 */ beqz $a3, .L80011004 +/* 011BC4 80010FC4 00000000 */ nop +/* 011BC8 80010FC8 8529AD4E */ lh $t1, %lo(D_8011AD4E)($t1) +/* 011BCC 80010FCC 00000000 */ nop +/* 011BD0 80010FD0 15200007 */ bnez $t1, .L80010FF0 +/* 011BD4 80010FD4 00000000 */ nop +/* 011BD8 80010FD8 0C006602 */ jal func_80019808 +/* 011BDC 80010FDC 02802025 */ move $a0, $s4 +/* 011BE0 80010FE0 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 +/* 011BE4 80010FE4 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) +/* 011BE8 80010FE8 10000006 */ b .L80011004 +/* 011BEC 80010FEC 00000000 */ nop +.L80010FF0: +/* 011BF0 80010FF0 0C006A3D */ jal func_8001A8F4 +/* 011BF4 80010FF4 02802025 */ move $a0, $s4 +/* 011BF8 80010FF8 3C078012 */ lui $a3, %hi(gNumRacers) # $a3, 0x8012 +/* 011BFC 80010FFC 8CE7AEF0 */ lw $a3, %lo(gNumRacers)($a3) +/* 011C00 80011000 00000000 */ nop +.L80011004: +/* 011C04 80011004 3C048012 */ lui $a0, %hi(gRacersByPort) # $a0, 0x8012 +/* 011C08 80011008 8C84AEEC */ lw $a0, %lo(gRacersByPort)($a0) +/* 011C0C 8001100C 00E02825 */ move $a1, $a3 +/* 011C10 80011010 0C00210E */ jal func_80008438 +/* 011C14 80011014 02803025 */ move $a2, $s4 +/* 011C18 80011018 44945000 */ mtc1 $s4, $f10 +/* 011C1C 8001101C 24080001 */ li $t0, 1 +/* 011C20 80011020 46805420 */ cvt.s.w $f16, $f10 +/* 011C24 80011024 AE080000 */ sw $t0, ($s0) +/* 011C28 80011028 3C018012 */ lui $at, %hi(gObjectUpdateRateF) # $at, 0x8012 +/* 011C2C 8001102C E430ADA8 */ swc1 $f16, %lo(gObjectUpdateRateF)($at) +/* 011C30 80011030 3C018012 */ lui $at, %hi(D_8011AD24) # $at, 0x8012 +/* 011C34 80011034 A020AD24 */ sb $zero, %lo(D_8011AD24)($at) +/* 011C38 80011038 3C018012 */ lui $at, %hi(D_8011AD53) # $at, 0x8012 +/* 011C3C 8001103C 0C0038AD */ jal func_8000E2B4 +/* 011C40 80011040 A020AD53 */ sb $zero, %lo(D_8011AD53)($at) +/* 011C44 80011044 0C0273EC */ jal try_close_dialogue_box +/* 011C48 80011048 00000000 */ nop +/* 011C4C 8001104C 0C005E74 */ jal func_800179D0 +/* 011C50 80011050 00000000 */ nop +/* 011C54 80011054 3C038012 */ lui $v1, %hi(D_8011AF00) # $v1, 0x8012 +/* 011C58 80011058 2463AF00 */ addiu $v1, %lo(D_8011AF00) # addiu $v1, $v1, -0x5100 +/* 011C5C 8001105C 80620000 */ lb $v0, ($v1) +/* 011C60 80011060 24010001 */ li $at, 1 +/* 011C64 80011064 14410026 */ bne $v0, $at, .L80011100 +/* 011C68 80011068 3C0A8012 */ lui $t2, %hi(D_8011ADB0) # $t2, 0x8012 +/* 011C6C 8001106C 8D4AADB0 */ lw $t2, %lo(D_8011ADB0)($t2) +/* 011C70 80011070 24010050 */ li $at, 80 +/* 011C74 80011074 15410025 */ bne $t2, $at, .L8001110C +/* 011C78 80011078 3C0B8012 */ lui $t3, %hi(D_8011AE7A) # $t3, 0x8012 +/* 011C7C 8001107C 856BAE7A */ lh $t3, %lo(D_8011AE7A)($t3) +/* 011C80 80011080 00002825 */ move $a1, $zero +/* 011C84 80011084 15600021 */ bnez $t3, .L8001110C +/* 011C88 80011088 00009825 */ move $s3, $zero +/* 011C8C 8001108C 24100004 */ li $s0, 4 +.L80011090: +/* 011C90 80011090 02602025 */ move $a0, $s3 +/* 011C94 80011094 0C01A955 */ jal get_buttons_pressed_from_player +/* 011C98 80011098 AFA50054 */ sw $a1, 0x54($sp) +/* 011C9C 8001109C 8FA50054 */ lw $a1, 0x54($sp) +/* 011CA0 800110A0 26730001 */ addiu $s3, $s3, 1 +/* 011CA4 800110A4 1670FFFA */ bne $s3, $s0, .L80011090 +/* 011CA8 800110A8 00A22825 */ or $a1, $a1, $v0 +/* 011CAC 800110AC 30AC8000 */ andi $t4, $a1, 0x8000 +/* 011CB0 800110B0 11800005 */ beqz $t4, .L800110C8 +/* 011CB4 800110B4 30AD4000 */ andi $t5, $a1, 0x4000 +/* 011CB8 800110B8 0C007917 */ jal func_8001E45C +/* 011CBC 800110BC 24040064 */ li $a0, 100 +/* 011CC0 800110C0 10000013 */ b .L80011110 +/* 011CC4 800110C4 8FBF0034 */ lw $ra, 0x34($sp) +.L800110C8: +/* 011CC8 800110C8 11A00011 */ beqz $t5, .L80011110 +/* 011CCC 800110CC 8FBF0034 */ lw $ra, 0x34($sp) +/* 011CD0 800110D0 0C02658B */ jal get_trophy_race_world_id +/* 011CD4 800110D4 00000000 */ nop +/* 011CD8 800110D8 1440000D */ bnez $v0, .L80011110 +/* 011CDC 800110DC 8FBF0034 */ lw $ra, 0x34($sp) +/* 011CE0 800110E0 0C0270B4 */ jal is_in_tracks_mode +/* 011CE4 800110E4 00000000 */ nop +/* 011CE8 800110E8 14400009 */ bnez $v0, .L80011110 +/* 011CEC 800110EC 8FBF0034 */ lw $ra, 0x34($sp) +/* 011CF0 800110F0 0C01BC50 */ jal func_8006F140 +/* 011CF4 800110F4 24040001 */ li $a0, 1 +/* 011CF8 800110F8 10000005 */ b .L80011110 +/* 011CFC 800110FC 8FBF0034 */ lw $ra, 0x34($sp) +.L80011100: +/* 011D00 80011100 14400002 */ bnez $v0, .L8001110C +/* 011D04 80011104 240E0001 */ li $t6, 1 +/* 011D08 80011108 A06E0000 */ sb $t6, ($v1) +.L8001110C: +/* 011D0C 8001110C 8FBF0034 */ lw $ra, 0x34($sp) +.L80011110: +/* 011D10 80011110 8FB00018 */ lw $s0, 0x18($sp) +/* 011D14 80011114 8FB1001C */ lw $s1, 0x1c($sp) +/* 011D18 80011118 8FB20020 */ lw $s2, 0x20($sp) +/* 011D1C 8001111C 8FB30024 */ lw $s3, 0x24($sp) +/* 011D20 80011120 8FB40028 */ lw $s4, 0x28($sp) +/* 011D24 80011124 8FB5002C */ lw $s5, 0x2c($sp) +/* 011D28 80011128 8FB60030 */ lw $s6, 0x30($sp) +/* 011D2C 8001112C 03E00008 */ jr $ra +/* 011D30 80011130 27BD0068 */ addiu $sp, $sp, 0x68 + diff --git a/asm/non_matchings/objects/func_80012F94.s b/asm/non_matchings/objects/func_80012F94.s index 7bded792..2fe92257 100644 --- a/asm/non_matchings/objects/func_80012F94.s +++ b/asm/non_matchings/objects/func_80012F94.s @@ -356,9 +356,9 @@ glabel func_80012F94 /* 01406C 8001346C 3C018012 */ lui $at, %hi(D_8011AD28) # $at, 0x8012 /* 014070 80013470 8FBF001C */ lw $ra, 0x1c($sp) /* 014074 80013474 E420AD28 */ swc1 $f0, %lo(D_8011AD28)($at) -/* 014078 80013478 3C018012 */ lui $at, %hi(D_8011AD30) # $at, 0x8012 +/* 014078 80013478 3C018012 */ lui $at, %hi(gCurrentLightIntensity) # $at, 0x8012 /* 01407C 8001347C 8FB00018 */ lw $s0, 0x18($sp) -/* 014080 80013480 E42EAD30 */ swc1 $f14, %lo(D_8011AD30)($at) +/* 014080 80013480 E42EAD30 */ swc1 $f14, %lo(gCurrentLightIntensity)($at) /* 014084 80013484 03E00008 */ jr $ra /* 014088 80013488 27BD0050 */ addiu $sp, $sp, 0x50 diff --git a/asm/non_matchings/objects/func_800159C8.s b/asm/non_matchings/objects/func_800159C8.s index f265333d..7e2cb4b6 100644 --- a/asm/non_matchings/objects/func_800159C8.s +++ b/asm/non_matchings/objects/func_800159C8.s @@ -30,8 +30,8 @@ glabel func_800159C8 /* 0165EC 800159EC 460A4001 */ sub.s $f0, $f8, $f10 /* 0165F0 800159F0 44814000 */ mtc1 $at, $f8 /* 0165F4 800159F4 C4A60014 */ lwc1 $f6, 0x14($a1) -/* 0165F8 800159F8 3C018012 */ lui $at, %hi(D_8011ADA8) # $at, 0x8012 -/* 0165FC 800159FC C42AADA8 */ lwc1 $f10, %lo(D_8011ADA8)($at) +/* 0165F8 800159F8 3C018012 */ lui $at, %hi(gObjectUpdateRateF) # $at, 0x8012 +/* 0165FC 800159FC C42AADA8 */ lwc1 $f10, %lo(gObjectUpdateRateF)($at) /* 016600 80015A00 46043381 */ sub.s $f14, $f6, $f4 /* 016604 80015A04 8CA6004C */ lw $a2, 0x4c($a1) /* 016608 80015A08 460A4183 */ div.s $f6, $f8, $f10 diff --git a/asm/non_matchings/objects/spawn_object.s b/asm/non_matchings/objects/spawn_object.s index 7282fd11..e786c9d2 100644 --- a/asm/non_matchings/objects/spawn_object.s +++ b/asm/non_matchings/objects/spawn_object.s @@ -21,7 +21,7 @@ glabel spawn_object /* 00F68C 8000EA8C 0018C840 */ sll $t9, $t8, 1 /* 00F690 8000EA90 01D92825 */ or $a1, $t6, $t9 /* 00F694 8000EA94 AFA50064 */ sw $a1, 0x64($sp) -/* 00F698 8000EA98 0C02DDAE */ jal func_800B76B8 +/* 00F698 8000EA98 0C02DDAE */ jal update_object_stack_trace /* 00F69C 8000EA9C 00002025 */ move $a0, $zero /* 00F6A0 8000EAA0 8FA3006C */ lw $v1, 0x6c($sp) /* 00F6A4 8000EAA4 3C0F8012 */ lui $t7, %hi(gAssetsObjectHeadersTableLength) # $t7, 0x8012 @@ -89,7 +89,7 @@ glabel spawn_object /* 00F784 8000EB84 31AF0001 */ andi $t7, $t5, 1 /* 00F788 8000EB88 11E00006 */ beqz $t7, .L8000EBA4 /* 00F78C 8000EB8C 8FA20068 */ lw $v0, 0x68($sp) -/* 00F790 8000EB90 0C02DDAE */ jal func_800B76B8 +/* 00F790 8000EB90 0C02DDAE */ jal update_object_stack_trace /* 00F794 8000EB94 2405FFFF */ li $a1, -1 /* 00F798 8000EB98 100002A4 */ b .L8000F62C /* 00F79C 8000EB9C 00001025 */ move $v0, $zero @@ -828,7 +828,7 @@ glabel L8000EDE0 /* 010214 8000F614 0C01867D */ jal func_800619F4 /* 010218 8000F618 00002025 */ move $a0, $zero /* 01021C 8000F61C 00002025 */ move $a0, $zero -/* 010220 8000F620 0C02DDAE */ jal func_800B76B8 +/* 010220 8000F620 0C02DDAE */ jal update_object_stack_trace /* 010224 8000F624 2405FFFF */ li $a1, -1 /* 010228 8000F628 02401025 */ move $v0, $s2 .L8000F62C: diff --git a/asm/non_matchings/racer/func_80046524.s b/asm/non_matchings/racer/func_80046524.s index 6da2e554..84bdbac5 100644 --- a/asm/non_matchings/racer/func_80046524.s +++ b/asm/non_matchings/racer/func_80046524.s @@ -2152,7 +2152,7 @@ glabel func_80046524 /* 048FDC 800483DC 02202025 */ move $a0, $s1 /* 048FE0 800483E0 8FA60128 */ lw $a2, 0x128($sp) /* 048FE4 800483E4 02002825 */ move $a1, $s0 -/* 048FE8 800483E8 0C0156A1 */ jal func_80055A84 +/* 048FE8 800483E8 0C0156A1 */ jal onscreen_ai_racer_physics /* 048FEC 800483EC AFA800C4 */ sw $t0, 0xc4($sp) /* 048FF0 800483F0 8FA800C4 */ lw $t0, 0xc4($sp) /* 048FF4 800483F4 10000008 */ b .L80048418 diff --git a/asm/non_matchings/racer/func_80049794.s b/asm/non_matchings/racer/func_80049794.s index 8373d242..f0d0ffbf 100644 --- a/asm/non_matchings/racer/func_80049794.s +++ b/asm/non_matchings/racer/func_80049794.s @@ -2492,7 +2492,7 @@ glabel func_80049794 /* 04C710 8004BB10 02202025 */ move $a0, $s1 /* 04C714 8004BB14 02002825 */ move $a1, $s0 /* 04C718 8004BB18 AFA800B8 */ sw $t0, 0xb8($sp) -/* 04C71C 8004BB1C 0C0156A1 */ jal func_80055A84 +/* 04C71C 8004BB1C 0C0156A1 */ jal onscreen_ai_racer_physics /* 04C720 8004BB20 E7AC00EC */ swc1 $f12, 0xec($sp) /* 04C724 8004BB24 8FA800B8 */ lw $t0, 0xb8($sp) /* 04C728 8004BB28 C7AC00EC */ lwc1 $f12, 0xec($sp) diff --git a/asm/non_matchings/racer/func_8004CC20.s b/asm/non_matchings/racer/func_8004CC20.s index 26328fee..a97b6a94 100644 --- a/asm/non_matchings/racer/func_8004CC20.s +++ b/asm/non_matchings/racer/func_8004CC20.s @@ -553,7 +553,7 @@ glabel func_8004CC20 /* 04E018 8004D418 02202025 */ move $a0, $s1 /* 04E01C 8004D41C 8FA600D8 */ lw $a2, 0xd8($sp) /* 04E020 8004D420 02202025 */ move $a0, $s1 -/* 04E024 8004D424 0C0156A1 */ jal func_80055A84 +/* 04E024 8004D424 0C0156A1 */ jal onscreen_ai_racer_physics /* 04E028 8004D428 02002825 */ move $a1, $s0 /* 04E02C 8004D42C 10000004 */ b .L8004D440 /* 04E030 8004D430 3C013F80 */ li $at, 0x3F800000 # 1.000000 diff --git a/asm/non_matchings/racer/func_8004F7F4.s b/asm/non_matchings/racer/func_8004F7F4.s index 22eed90f..09317d24 100644 --- a/asm/non_matchings/racer/func_8004F7F4.s +++ b/asm/non_matchings/racer/func_8004F7F4.s @@ -732,7 +732,7 @@ glabel func_8004F7F4 /* 050E38 80050238 02202025 */ move $a0, $s1 /* 050E3C 8005023C 8FA600C0 */ lw $a2, 0xc0($sp) /* 050E40 80050240 02202025 */ move $a0, $s1 -/* 050E44 80050244 0C0156A1 */ jal func_80055A84 +/* 050E44 80050244 0C0156A1 */ jal onscreen_ai_racer_physics /* 050E48 80050248 02002825 */ move $a1, $s0 /* 050E4C 8005024C 10000005 */ b .L80050264 /* 050E50 80050250 3C013F80 */ lui $at, 0x3f80 diff --git a/asm/non_matchings/thread0_epc/func_800B71B0.s b/asm/non_matchings/thread0_epc/func_800B71B0.s index 37c1e005..dbd0fbd7 100644 --- a/asm/non_matchings/thread0_epc/func_800B71B0.s +++ b/asm/non_matchings/thread0_epc/func_800B71B0.s @@ -33,8 +33,8 @@ glabel func_800B71B0 /* 0B7E20 800B7220 00000000 */ nop /* 0B7E24 800B7224 10990081 */ beq $a0, $t9, .L800B742C /* 0B7E28 800B7228 00000000 */ nop -/* 0B7E2C 800B722C 3C028013 */ lui $v0, %hi(D_80129FB0) # $v0, 0x8013 -/* 0B7E30 800B7230 24429FB0 */ addiu $v0, %lo(D_80129FB0) # addiu $v0, $v0, -0x6050 +/* 0B7E2C 800B722C 3C028013 */ lui $v0, %hi(gObjectStackTrace) # $v0, 0x8013 +/* 0B7E30 800B7230 24429FB0 */ addiu $v0, %lo(gObjectStackTrace) # addiu $v0, $v0, -0x6050 /* 0B7E34 800B7234 8C480000 */ lw $t0, ($v0) /* 0B7E38 800B7238 00E02025 */ move $a0, $a3 /* 0B7E3C 800B723C 44882000 */ mtc1 $t0, $f4 diff --git a/asm/non_matchings/thread0_epc/func_800B7460.s b/asm/non_matchings/thread0_epc/func_800B7460.s index 61fbc472..50de5920 100644 --- a/asm/non_matchings/thread0_epc/func_800B7460.s +++ b/asm/non_matchings/thread0_epc/func_800B7460.s @@ -10,8 +10,8 @@ glabel func_800B7460 /* 0B8080 800B7480 27A40840 */ addiu $a0, $sp, 0x840 /* 0B8084 800B7484 0C034138 */ jal bzero /* 0B8088 800B7488 240501B0 */ li $a1, 432 -/* 0B808C 800B748C 3C028013 */ lui $v0, %hi(D_80129FB0) # $v0, 0x8013 -/* 0B8090 800B7490 24429FB0 */ addiu $v0, %lo(D_80129FB0) # addiu $v0, $v0, -0x6050 +/* 0B808C 800B748C 3C028013 */ lui $v0, %hi(gObjectStackTrace) # $v0, 0x8013 +/* 0B8090 800B7490 24429FB0 */ addiu $v0, %lo(gObjectStackTrace) # addiu $v0, $v0, -0x6050 /* 0B8094 800B7494 8C580000 */ lw $t8, ($v0) /* 0B8098 800B7498 8C590004 */ lw $t9, 4($v0) /* 0B809C 800B749C 8C480008 */ lw $t0, 8($v0) diff --git a/asm/non_matchings/unknown_0255E0/func_800278E8.s b/asm/non_matchings/unknown_0255E0/func_800278E8.s index 8039afcf..45cf2f95 100644 --- a/asm/non_matchings/unknown_0255E0/func_800278E8.s +++ b/asm/non_matchings/unknown_0255E0/func_800278E8.s @@ -1,352 +1,352 @@ -glabel func_800278E8 -/* 0284E8 800278E8 27BDFF90 */ addiu $sp, $sp, -0x70 -/* 0284EC 800278EC AFBF001C */ sw $ra, 0x1c($sp) -/* 0284F0 800278F0 AFA40070 */ sw $a0, 0x70($sp) -/* 0284F4 800278F4 AFB10018 */ sw $s1, 0x18($sp) -/* 0284F8 800278F8 AFB00014 */ sw $s0, 0x14($sp) -/* 0284FC 800278FC 0C006E9D */ jal get_racer_objects -/* 028500 80027900 27A40038 */ addiu $a0, $sp, 0x38 -/* 028504 80027904 8FAE0038 */ lw $t6, 0x38($sp) -/* 028508 80027908 00001825 */ move $v1, $zero -/* 02850C 8002790C 19C00031 */ blez $t6, .L800279D4 -/* 028510 80027910 00003025 */ move $a2, $zero -/* 028514 80027914 00408025 */ move $s0, $v0 -.L80027918: -/* 028518 80027918 8E020000 */ lw $v0, ($s0) -/* 02851C 8002791C 00000000 */ nop -/* 028520 80027920 10400028 */ beqz $v0, .L800279C4 -/* 028524 80027924 8FAE0038 */ lw $t6, 0x38($sp) -/* 028528 80027928 8C510064 */ lw $s1, 0x64($v0) -/* 02852C 8002792C 27A50030 */ addiu $a1, $sp, 0x30 -/* 028530 80027930 822F01FD */ lb $t7, 0x1fd($s1) -/* 028534 80027934 00000000 */ nop -/* 028538 80027938 AFAF0030 */ sw $t7, 0x30($sp) -/* 02853C 8002793C 8E040000 */ lw $a0, ($s0) -/* 028540 80027940 AFA60034 */ sw $a2, 0x34($sp) -/* 028544 80027944 0C006F75 */ jal func_8001BDD4 -/* 028548 80027948 AFA30040 */ sw $v1, 0x40($sp) -/* 02854C 8002794C 8FB80030 */ lw $t8, 0x30($sp) -/* 028550 80027950 823901D8 */ lb $t9, 0x1d8($s1) -/* 028554 80027954 8FA30040 */ lw $v1, 0x40($sp) -/* 028558 80027958 8FA60034 */ lw $a2, 0x34($sp) -/* 02855C 8002795C 13200009 */ beqz $t9, .L80027984 -/* 028560 80027960 A23801FD */ sb $t8, 0x1fd($s1) -/* 028564 80027964 862801AC */ lh $t0, 0x1ac($s1) -/* 028568 80027968 24010001 */ li $at, 1 -/* 02856C 8002796C 15010015 */ bne $t0, $at, .L800279C4 -/* 028570 80027970 8FAE0038 */ lw $t6, 0x38($sp) -/* 028574 80027974 AFB1003C */ sw $s1, 0x3c($sp) -/* 028578 80027978 8E090000 */ lw $t1, ($s0) -/* 02857C 8002797C 10000010 */ b .L800279C0 -/* 028580 80027980 AFA90048 */ sw $t1, 0x48($sp) -.L80027984: -/* 028584 80027984 14600005 */ bnez $v1, .L8002799C -/* 028588 80027988 00000000 */ nop -/* 02858C 8002798C 8E0A0000 */ lw $t2, ($s0) -/* 028590 80027990 02201825 */ move $v1, $s1 -/* 028594 80027994 1000000A */ b .L800279C0 -/* 028598 80027998 AFAA004C */ sw $t2, 0x4c($sp) -.L8002799C: -/* 02859C 8002799C 862B01AE */ lh $t3, 0x1ae($s1) -/* 0285A0 800279A0 846C01AE */ lh $t4, 0x1ae($v1) -/* 0285A4 800279A4 00000000 */ nop -/* 0285A8 800279A8 016C082A */ slt $at, $t3, $t4 -/* 0285AC 800279AC 10200005 */ beqz $at, .L800279C4 -/* 0285B0 800279B0 8FAE0038 */ lw $t6, 0x38($sp) -/* 0285B4 800279B4 8E0D0000 */ lw $t5, ($s0) -/* 0285B8 800279B8 02201825 */ move $v1, $s1 -/* 0285BC 800279BC AFAD004C */ sw $t5, 0x4c($sp) -.L800279C0: -/* 0285C0 800279C0 8FAE0038 */ lw $t6, 0x38($sp) -.L800279C4: -/* 0285C4 800279C4 24C60001 */ addiu $a2, $a2, 1 -/* 0285C8 800279C8 00CE082A */ slt $at, $a2, $t6 -/* 0285CC 800279CC 1420FFD2 */ bnez $at, .L80027918 -/* 0285D0 800279D0 26100004 */ addiu $s0, $s0, 4 -.L800279D4: -/* 0285D4 800279D4 10600005 */ beqz $v1, .L800279EC -/* 0285D8 800279D8 8FB1003C */ lw $s1, 0x3c($sp) -/* 0285DC 800279DC 8FA5004C */ lw $a1, 0x4c($sp) -/* 0285E0 800279E0 10000004 */ b .L800279F4 -/* 0285E4 800279E4 00608825 */ move $s1, $v1 -/* 0285E8 800279E8 8FB1003C */ lw $s1, 0x3c($sp) -.L800279EC: -/* 0285EC 800279EC 8FA50048 */ lw $a1, 0x48($sp) -/* 0285F0 800279F0 00000000 */ nop -.L800279F4: -/* 0285F4 800279F4 822401FD */ lb $a0, 0x1fd($s1) -/* 0285F8 800279F8 0C006F65 */ jal get_camera_object -/* 0285FC 800279FC AFA50054 */ sw $a1, 0x54($sp) -/* 028600 80027A00 3C0F8012 */ lui $t7, %hi(D_8011B104) # $t7, 0x8012 -/* 028604 80027A04 8DEFB104 */ lw $t7, %lo(D_8011B104)($t7) -/* 028608 80027A08 823801FD */ lb $t8, 0x1fd($s1) -/* 02860C 80027A0C 8FA50054 */ lw $a1, 0x54($sp) -/* 028610 80027A10 11F80005 */ beq $t7, $t8, .L80027A28 -/* 028614 80027A14 00408025 */ move $s0, $v0 -/* 028618 80027A18 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 02861C 80027A1C 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028620 80027A20 1000000E */ b .L80027A5C -/* 028624 80027A24 ACE00000 */ sw $zero, ($a3) -.L80027A28: -/* 028628 80027A28 3C038012 */ lui $v1, %hi(D_8011B100) # $v1, 0x8012 -/* 02862C 80027A2C 2463B100 */ addiu $v1, %lo(D_8011B100) # addiu $v1, $v1, -0x4f00 -/* 028630 80027A30 8C790000 */ lw $t9, ($v1) -/* 028634 80027A34 86280000 */ lh $t0, ($s1) -/* 028638 80027A38 00000000 */ nop -/* 02863C 80027A3C 13280007 */ beq $t9, $t0, .L80027A5C -/* 028640 80027A40 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028644 80027A44 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028648 80027A48 240900B4 */ li $t1, 180 -/* 02864C 80027A4C ACE90000 */ sw $t1, ($a3) -/* 028650 80027A50 862A0000 */ lh $t2, ($s1) -/* 028654 80027A54 00000000 */ nop -/* 028658 80027A58 AC6A0000 */ sw $t2, ($v1) -.L80027A5C: -/* 02865C 80027A5C 104000ED */ beqz $v0, .L80027E14 -/* 028660 80027A60 8FBF001C */ lw $ra, 0x1c($sp) -/* 028664 80027A64 0C01A73F */ jal get_active_camera_segment_no_cutscenes -/* 028668 80027A68 AFA50054 */ sw $a1, 0x54($sp) -/* 02866C 80027A6C C604000C */ lwc1 $f4, 0xc($s0) -/* 028670 80027A70 8FA50054 */ lw $a1, 0x54($sp) -/* 028674 80027A74 E444000C */ swc1 $f4, 0xc($v0) -/* 028678 80027A78 C6060010 */ lwc1 $f6, 0x10($s0) -/* 02867C 80027A7C C44A000C */ lwc1 $f10, 0xc($v0) -/* 028680 80027A80 E4460010 */ swc1 $f6, 0x10($v0) -/* 028684 80027A84 C6080014 */ lwc1 $f8, 0x14($s0) -/* 028688 80027A88 C4520010 */ lwc1 $f18, 0x10($v0) -/* 02868C 80027A8C E4480014 */ swc1 $f8, 0x14($v0) -/* 028690 80027A90 C4A40010 */ lwc1 $f4, 0x10($a1) -/* 028694 80027A94 C4B0000C */ lwc1 $f16, 0xc($a1) -/* 028698 80027A98 46049181 */ sub.s $f6, $f18, $f4 -/* 02869C 80027A9C 46105081 */ sub.s $f2, $f10, $f16 -/* 0286A0 80027AA0 E7A60064 */ swc1 $f6, 0x64($sp) -/* 0286A4 80027AA4 C4480014 */ lwc1 $f8, 0x14($v0) -/* 0286A8 80027AA8 C4AA0014 */ lwc1 $f10, 0x14($a1) -/* 0286AC 80027AAC 46021402 */ mul.s $f16, $f2, $f2 -/* 0286B0 80027AB0 460A4381 */ sub.s $f14, $f8, $f10 -/* 0286B4 80027AB4 E7A20068 */ swc1 $f2, 0x68($sp) -/* 0286B8 80027AB8 E7AE0060 */ swc1 $f14, 0x60($sp) -/* 0286BC 80027ABC 460E7482 */ mul.s $f18, $f14, $f14 -/* 0286C0 80027AC0 AFA20058 */ sw $v0, 0x58($sp) -/* 0286C4 80027AC4 0C0326B4 */ jal sqrtf -/* 0286C8 80027AC8 46128300 */ add.s $f12, $f16, $f18 -/* 0286CC 80027ACC 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 0286D0 80027AD0 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 0286D4 80027AD4 8CEB0000 */ lw $t3, ($a3) -/* 0286D8 80027AD8 8FA30058 */ lw $v1, 0x58($sp) -/* 0286DC 80027ADC C7A20068 */ lwc1 $f2, 0x68($sp) -/* 0286E0 80027AE0 C7AE0060 */ lwc1 $f14, 0x60($sp) -/* 0286E4 80027AE4 1160008C */ beqz $t3, .L80027D18 -/* 0286E8 80027AE8 46000306 */ mov.s $f12, $f0 -/* 0286EC 80027AEC 444CF800 */ cfc1 $t4, $31 -/* 0286F0 80027AF0 AFA30058 */ sw $v1, 0x58($sp) -/* 0286F4 80027AF4 35810003 */ ori $at, $t4, 3 -/* 0286F8 80027AF8 38210002 */ xori $at, $at, 2 -/* 0286FC 80027AFC 44C1F800 */ ctc1 $at, $31 -/* 028700 80027B00 E7AC005C */ swc1 $f12, 0x5c($sp) -/* 028704 80027B04 46001124 */ cvt.w.s $f4, $f2 -/* 028708 80027B08 44CCF800 */ ctc1 $t4, $31 -/* 02870C 80027B0C 44042000 */ mfc1 $a0, $f4 -/* 028710 80027B10 00000000 */ nop -/* 028714 80027B14 444DF800 */ cfc1 $t5, $31 -/* 028718 80027B18 00000000 */ nop -/* 02871C 80027B1C 35A10003 */ ori $at, $t5, 3 -/* 028720 80027B20 38210002 */ xori $at, $at, 2 -/* 028724 80027B24 44C1F800 */ ctc1 $at, $31 -/* 028728 80027B28 00000000 */ nop -/* 02872C 80027B2C 460071A4 */ cvt.w.s $f6, $f14 -/* 028730 80027B30 44053000 */ mfc1 $a1, $f6 -/* 028734 80027B34 44CDF800 */ ctc1 $t5, $31 -/* 028738 80027B38 0C01C19B */ jal atan2s -/* 02873C 80027B3C 00000000 */ nop -/* 028740 80027B40 8FA30058 */ lw $v1, 0x58($sp) -/* 028744 80027B44 00027023 */ negu $t6, $v0 -/* 028748 80027B48 84660000 */ lh $a2, ($v1) -/* 02874C 80027B4C 34018000 */ li $at, 32768 -/* 028750 80027B50 01C68023 */ subu $s0, $t6, $a2 -/* 028754 80027B54 02018021 */ addu $s0, $s0, $at -/* 028758 80027B58 00107C00 */ sll $t7, $s0, 0x10 -/* 02875C 80027B5C 000FC403 */ sra $t8, $t7, 0x10 -/* 028760 80027B60 34018001 */ li $at, 32769 -/* 028764 80027B64 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028768 80027B68 C7AC005C */ lwc1 $f12, 0x5c($sp) -/* 02876C 80027B6C 0301082A */ slt $at, $t8, $at -/* 028770 80027B70 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 028774 80027B74 14200007 */ bnez $at, .L80027B94 -/* 028778 80027B78 03008025 */ move $s0, $t8 -/* 02877C 80027B7C 3C08FFFF */ lui $t0, (0xFFFF0001 >> 16) # lui $t0, 0xffff -/* 028780 80027B80 35080001 */ ori $t0, (0xFFFF0001 & 0xFFFF) # ori $t0, $t0, 1 -/* 028784 80027B84 0018C823 */ negu $t9, $t8 -/* 028788 80027B88 01198023 */ subu $s0, $t0, $t9 -/* 02878C 80027B8C 00104C00 */ sll $t1, $s0, 0x10 -/* 028790 80027B90 00098403 */ sra $s0, $t1, 0x10 -.L80027B94: -/* 028794 80027B94 8CEB0000 */ lw $t3, ($a3) -/* 028798 80027B98 3C014334 */ li $at, 0x43340000 # 180.000000 -/* 02879C 80027B9C 448B4000 */ mtc1 $t3, $f8 -/* 0287A0 80027BA0 44818000 */ mtc1 $at, $f16 -/* 0287A4 80027BA4 468042A0 */ cvt.s.w $f10, $f8 -/* 0287A8 80027BA8 3C014180 */ li $at, 0x41800000 # 16.000000 -/* 0287AC 80027BAC 44812000 */ mtc1 $at, $f4 -/* 0287B0 80027BB0 46105483 */ div.s $f18, $f10, $f16 -/* 0287B4 80027BB4 44904000 */ mtc1 $s0, $f8 -/* 0287B8 80027BB8 00000000 */ nop -/* 0287BC 80027BBC 468042A0 */ cvt.s.w $f10, $f8 -/* 0287C0 80027BC0 46122182 */ mul.s $f6, $f4, $f18 -/* 0287C4 80027BC4 00000000 */ nop -/* 0287C8 80027BC8 46065403 */ div.s $f16, $f10, $f6 -/* 0287CC 80027BCC 444CF800 */ cfc1 $t4, $31 -/* 0287D0 80027BD0 00000000 */ nop -/* 0287D4 80027BD4 35810003 */ ori $at, $t4, 3 -/* 0287D8 80027BD8 38210002 */ xori $at, $at, 2 -/* 0287DC 80027BDC 44C1F800 */ ctc1 $at, $31 -/* 0287E0 80027BE0 00000000 */ nop -/* 0287E4 80027BE4 46008124 */ cvt.w.s $f4, $f16 -/* 0287E8 80027BE8 44CCF800 */ ctc1 $t4, $31 -/* 0287EC 80027BEC 440E2000 */ mfc1 $t6, $f4 -/* 0287F0 80027BF0 00000000 */ nop -/* 0287F4 80027BF4 4458F800 */ cfc1 $t8, $31 -/* 0287F8 80027BF8 00CE7821 */ addu $t7, $a2, $t6 -/* 0287FC 80027BFC 37010003 */ ori $at, $t8, 3 -/* 028800 80027C00 A46F0000 */ sh $t7, ($v1) -/* 028804 80027C04 38210002 */ xori $at, $at, 2 -/* 028808 80027C08 44C1F800 */ ctc1 $at, $31 -/* 02880C 80027C0C C7B20064 */ lwc1 $f18, 0x64($sp) -/* 028810 80027C10 AFA30058 */ sw $v1, 0x58($sp) -/* 028814 80027C14 46009224 */ cvt.w.s $f8, $f18 -/* 028818 80027C18 44D8F800 */ ctc1 $t8, $31 -/* 02881C 80027C1C 44044000 */ mfc1 $a0, $f8 -/* 028820 80027C20 00000000 */ nop -/* 028824 80027C24 4448F800 */ cfc1 $t0, $31 -/* 028828 80027C28 00000000 */ nop -/* 02882C 80027C2C 35010003 */ ori $at, $t0, 3 -/* 028830 80027C30 38210002 */ xori $at, $at, 2 -/* 028834 80027C34 44C1F800 */ ctc1 $at, $31 -/* 028838 80027C38 00000000 */ nop -/* 02883C 80027C3C 460062A4 */ cvt.w.s $f10, $f12 -/* 028840 80027C40 44055000 */ mfc1 $a1, $f10 -/* 028844 80027C44 44C8F800 */ ctc1 $t0, $31 -/* 028848 80027C48 0C01C19B */ jal atan2s -/* 02884C 80027C4C 00000000 */ nop -/* 028850 80027C50 8FA30058 */ lw $v1, 0x58($sp) -/* 028854 80027C54 34018001 */ li $at, 32769 -/* 028858 80027C58 84640002 */ lh $a0, 2($v1) -/* 02885C 80027C5C 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 -/* 028860 80027C60 00448023 */ subu $s0, $v0, $a0 -/* 028864 80027C64 0010CC00 */ sll $t9, $s0, 0x10 -/* 028868 80027C68 00194C03 */ sra $t1, $t9, 0x10 -/* 02886C 80027C6C 0121082A */ slt $at, $t1, $at -/* 028870 80027C70 01208025 */ move $s0, $t1 -/* 028874 80027C74 14200007 */ bnez $at, .L80027C94 -/* 028878 80027C78 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 -/* 02887C 80027C7C 3C0BFFFF */ lui $t3, (0xFFFF0001 >> 16) # lui $t3, 0xffff -/* 028880 80027C80 356B0001 */ ori $t3, (0xFFFF0001 & 0xFFFF) # ori $t3, $t3, 1 -/* 028884 80027C84 00095023 */ negu $t2, $t1 -/* 028888 80027C88 016A8023 */ subu $s0, $t3, $t2 -/* 02888C 80027C8C 00106400 */ sll $t4, $s0, 0x10 -/* 028890 80027C90 000C8403 */ sra $s0, $t4, 0x10 -.L80027C94: -/* 028894 80027C94 8CEE0000 */ lw $t6, ($a3) -/* 028898 80027C98 3C014334 */ li $at, 0x43340000 # 180.000000 -/* 02889C 80027C9C 448E3000 */ mtc1 $t6, $f6 -/* 0288A0 80027CA0 44812000 */ mtc1 $at, $f4 -/* 0288A4 80027CA4 46803420 */ cvt.s.w $f16, $f6 -/* 0288A8 80027CA8 3C014180 */ li $at, 0x41800000 # 16.000000 -/* 0288AC 80027CAC 44814000 */ mtc1 $at, $f8 -/* 0288B0 80027CB0 46048483 */ div.s $f18, $f16, $f4 -/* 0288B4 80027CB4 44903000 */ mtc1 $s0, $f6 -/* 0288B8 80027CB8 00000000 */ nop -/* 0288BC 80027CBC 46803420 */ cvt.s.w $f16, $f6 -/* 0288C0 80027CC0 46124282 */ mul.s $f10, $f8, $f18 -/* 0288C4 80027CC4 00000000 */ nop -/* 0288C8 80027CC8 460A8103 */ div.s $f4, $f16, $f10 -/* 0288CC 80027CCC 444FF800 */ cfc1 $t7, $31 -/* 0288D0 80027CD0 00000000 */ nop -/* 0288D4 80027CD4 35E10003 */ ori $at, $t7, 3 -/* 0288D8 80027CD8 38210002 */ xori $at, $at, 2 -/* 0288DC 80027CDC 44C1F800 */ ctc1 $at, $31 -/* 0288E0 80027CE0 00000000 */ nop -/* 0288E4 80027CE4 46002224 */ cvt.w.s $f8, $f4 -/* 0288E8 80027CE8 44084000 */ mfc1 $t0, $f8 -/* 0288EC 80027CEC 44CFF800 */ ctc1 $t7, $31 -/* 0288F0 80027CF0 0088C821 */ addu $t9, $a0, $t0 -/* 0288F4 80027CF4 A4790002 */ sh $t9, 2($v1) -/* 0288F8 80027CF8 8CE90000 */ lw $t1, ($a3) -/* 0288FC 80027CFC 8FAB0070 */ lw $t3, 0x70($sp) -/* 028900 80027D00 00000000 */ nop -/* 028904 80027D04 012B5023 */ subu $t2, $t1, $t3 -/* 028908 80027D08 05410035 */ bgez $t2, .L80027DE0 -/* 02890C 80027D0C ACEA0000 */ sw $t2, ($a3) -/* 028910 80027D10 10000033 */ b .L80027DE0 -/* 028914 80027D14 ACE00000 */ sw $zero, ($a3) -.L80027D18: -/* 028918 80027D18 444DF800 */ cfc1 $t5, $31 -/* 02891C 80027D1C AFA30058 */ sw $v1, 0x58($sp) -/* 028920 80027D20 35A10003 */ ori $at, $t5, 3 -/* 028924 80027D24 38210002 */ xori $at, $at, 2 -/* 028928 80027D28 44C1F800 */ ctc1 $at, $31 -/* 02892C 80027D2C E7AC005C */ swc1 $f12, 0x5c($sp) -/* 028930 80027D30 460014A4 */ cvt.w.s $f18, $f2 -/* 028934 80027D34 44CDF800 */ ctc1 $t5, $31 -/* 028938 80027D38 44049000 */ mfc1 $a0, $f18 -/* 02893C 80027D3C 00000000 */ nop -/* 028940 80027D40 444EF800 */ cfc1 $t6, $31 -/* 028944 80027D44 00000000 */ nop -/* 028948 80027D48 35C10003 */ ori $at, $t6, 3 -/* 02894C 80027D4C 38210002 */ xori $at, $at, 2 -/* 028950 80027D50 44C1F800 */ ctc1 $at, $31 -/* 028954 80027D54 00000000 */ nop -/* 028958 80027D58 460071A4 */ cvt.w.s $f6, $f14 -/* 02895C 80027D5C 44053000 */ mfc1 $a1, $f6 -/* 028960 80027D60 44CEF800 */ ctc1 $t6, $31 -/* 028964 80027D64 0C01C19B */ jal atan2s -/* 028968 80027D68 00000000 */ nop -/* 02896C 80027D6C 4448F800 */ cfc1 $t0, $31 -/* 028970 80027D70 8FA30058 */ lw $v1, 0x58($sp) -/* 028974 80027D74 340F8000 */ li $t7, 32768 -/* 028978 80027D78 C7AC005C */ lwc1 $f12, 0x5c($sp) -/* 02897C 80027D7C 01E2C023 */ subu $t8, $t7, $v0 -/* 028980 80027D80 35010003 */ ori $at, $t0, 3 -/* 028984 80027D84 38210002 */ xori $at, $at, 2 -/* 028988 80027D88 A4780000 */ sh $t8, ($v1) -/* 02898C 80027D8C C7B00064 */ lwc1 $f16, 0x64($sp) -/* 028990 80027D90 44C1F800 */ ctc1 $at, $31 -/* 028994 80027D94 00000000 */ nop -/* 028998 80027D98 460082A4 */ cvt.w.s $f10, $f16 -/* 02899C 80027D9C 44C8F800 */ ctc1 $t0, $31 -/* 0289A0 80027DA0 44045000 */ mfc1 $a0, $f10 -/* 0289A4 80027DA4 00000000 */ nop -/* 0289A8 80027DA8 4459F800 */ cfc1 $t9, $31 -/* 0289AC 80027DAC 00000000 */ nop -/* 0289B0 80027DB0 37210003 */ ori $at, $t9, 3 -/* 0289B4 80027DB4 38210002 */ xori $at, $at, 2 -/* 0289B8 80027DB8 44C1F800 */ ctc1 $at, $31 -/* 0289BC 80027DBC 00000000 */ nop -/* 0289C0 80027DC0 46006124 */ cvt.w.s $f4, $f12 -/* 0289C4 80027DC4 44052000 */ mfc1 $a1, $f4 -/* 0289C8 80027DC8 44D9F800 */ ctc1 $t9, $31 -/* 0289CC 80027DCC 0C01C19B */ jal atan2s -/* 0289D0 80027DD0 00000000 */ nop -/* 0289D4 80027DD4 8FA30058 */ lw $v1, 0x58($sp) -/* 0289D8 80027DD8 00000000 */ nop -/* 0289DC 80027DDC A4620002 */ sh $v0, 2($v1) -.L80027DE0: -/* 0289E0 80027DE0 A4600004 */ sh $zero, 4($v1) -/* 0289E4 80027DE4 C62E003C */ lwc1 $f14, 0x3c($s1) -/* 0289E8 80027DE8 C46C000C */ lwc1 $f12, 0xc($v1) -/* 0289EC 80027DEC 8C660014 */ lw $a2, 0x14($v1) -/* 0289F0 80027DF0 0C00A7C6 */ jal get_level_segment_index_from_position -/* 0289F4 80027DF4 AFA30058 */ sw $v1, 0x58($sp) -/* 0289F8 80027DF8 8FA30058 */ lw $v1, 0x58($sp) -/* 0289FC 80027DFC 3C018012 */ lui $at, %hi(D_8011B104) # $at, 0x8012 -/* 028A00 80027E00 A4620034 */ sh $v0, 0x34($v1) -/* 028A04 80027E04 822901FD */ lb $t1, 0x1fd($s1) -/* 028A08 80027E08 00000000 */ nop -/* 028A0C 80027E0C AC29B104 */ sw $t1, %lo(D_8011B104)($at) -/* 028A10 80027E10 8FBF001C */ lw $ra, 0x1c($sp) -.L80027E14: -/* 028A14 80027E14 8FB00014 */ lw $s0, 0x14($sp) -/* 028A18 80027E18 8FB10018 */ lw $s1, 0x18($sp) -/* 028A1C 80027E1C 03E00008 */ jr $ra -/* 028A20 80027E20 27BD0070 */ addiu $sp, $sp, 0x70 - +glabel func_800278E8 +/* 0284E8 800278E8 27BDFF90 */ addiu $sp, $sp, -0x70 +/* 0284EC 800278EC AFBF001C */ sw $ra, 0x1c($sp) +/* 0284F0 800278F0 AFA40070 */ sw $a0, 0x70($sp) +/* 0284F4 800278F4 AFB10018 */ sw $s1, 0x18($sp) +/* 0284F8 800278F8 AFB00014 */ sw $s0, 0x14($sp) +/* 0284FC 800278FC 0C006E9D */ jal get_racer_objects +/* 028500 80027900 27A40038 */ addiu $a0, $sp, 0x38 +/* 028504 80027904 8FAE0038 */ lw $t6, 0x38($sp) +/* 028508 80027908 00001825 */ move $v1, $zero +/* 02850C 8002790C 19C00031 */ blez $t6, .L800279D4 +/* 028510 80027910 00003025 */ move $a2, $zero +/* 028514 80027914 00408025 */ move $s0, $v0 +.L80027918: +/* 028518 80027918 8E020000 */ lw $v0, ($s0) +/* 02851C 8002791C 00000000 */ nop +/* 028520 80027920 10400028 */ beqz $v0, .L800279C4 +/* 028524 80027924 8FAE0038 */ lw $t6, 0x38($sp) +/* 028528 80027928 8C510064 */ lw $s1, 0x64($v0) +/* 02852C 8002792C 27A50030 */ addiu $a1, $sp, 0x30 +/* 028530 80027930 822F01FD */ lb $t7, 0x1fd($s1) +/* 028534 80027934 00000000 */ nop +/* 028538 80027938 AFAF0030 */ sw $t7, 0x30($sp) +/* 02853C 8002793C 8E040000 */ lw $a0, ($s0) +/* 028540 80027940 AFA60034 */ sw $a2, 0x34($sp) +/* 028544 80027944 0C006F75 */ jal find_nearest_spectate_camera +/* 028548 80027948 AFA30040 */ sw $v1, 0x40($sp) +/* 02854C 8002794C 8FB80030 */ lw $t8, 0x30($sp) +/* 028550 80027950 823901D8 */ lb $t9, 0x1d8($s1) +/* 028554 80027954 8FA30040 */ lw $v1, 0x40($sp) +/* 028558 80027958 8FA60034 */ lw $a2, 0x34($sp) +/* 02855C 8002795C 13200009 */ beqz $t9, .L80027984 +/* 028560 80027960 A23801FD */ sb $t8, 0x1fd($s1) +/* 028564 80027964 862801AC */ lh $t0, 0x1ac($s1) +/* 028568 80027968 24010001 */ li $at, 1 +/* 02856C 8002796C 15010015 */ bne $t0, $at, .L800279C4 +/* 028570 80027970 8FAE0038 */ lw $t6, 0x38($sp) +/* 028574 80027974 AFB1003C */ sw $s1, 0x3c($sp) +/* 028578 80027978 8E090000 */ lw $t1, ($s0) +/* 02857C 8002797C 10000010 */ b .L800279C0 +/* 028580 80027980 AFA90048 */ sw $t1, 0x48($sp) +.L80027984: +/* 028584 80027984 14600005 */ bnez $v1, .L8002799C +/* 028588 80027988 00000000 */ nop +/* 02858C 8002798C 8E0A0000 */ lw $t2, ($s0) +/* 028590 80027990 02201825 */ move $v1, $s1 +/* 028594 80027994 1000000A */ b .L800279C0 +/* 028598 80027998 AFAA004C */ sw $t2, 0x4c($sp) +.L8002799C: +/* 02859C 8002799C 862B01AE */ lh $t3, 0x1ae($s1) +/* 0285A0 800279A0 846C01AE */ lh $t4, 0x1ae($v1) +/* 0285A4 800279A4 00000000 */ nop +/* 0285A8 800279A8 016C082A */ slt $at, $t3, $t4 +/* 0285AC 800279AC 10200005 */ beqz $at, .L800279C4 +/* 0285B0 800279B0 8FAE0038 */ lw $t6, 0x38($sp) +/* 0285B4 800279B4 8E0D0000 */ lw $t5, ($s0) +/* 0285B8 800279B8 02201825 */ move $v1, $s1 +/* 0285BC 800279BC AFAD004C */ sw $t5, 0x4c($sp) +.L800279C0: +/* 0285C0 800279C0 8FAE0038 */ lw $t6, 0x38($sp) +.L800279C4: +/* 0285C4 800279C4 24C60001 */ addiu $a2, $a2, 1 +/* 0285C8 800279C8 00CE082A */ slt $at, $a2, $t6 +/* 0285CC 800279CC 1420FFD2 */ bnez $at, .L80027918 +/* 0285D0 800279D0 26100004 */ addiu $s0, $s0, 4 +.L800279D4: +/* 0285D4 800279D4 10600005 */ beqz $v1, .L800279EC +/* 0285D8 800279D8 8FB1003C */ lw $s1, 0x3c($sp) +/* 0285DC 800279DC 8FA5004C */ lw $a1, 0x4c($sp) +/* 0285E0 800279E0 10000004 */ b .L800279F4 +/* 0285E4 800279E4 00608825 */ move $s1, $v1 +/* 0285E8 800279E8 8FB1003C */ lw $s1, 0x3c($sp) +.L800279EC: +/* 0285EC 800279EC 8FA50048 */ lw $a1, 0x48($sp) +/* 0285F0 800279F0 00000000 */ nop +.L800279F4: +/* 0285F4 800279F4 822401FD */ lb $a0, 0x1fd($s1) +/* 0285F8 800279F8 0C006F65 */ jal get_camera_object +/* 0285FC 800279FC AFA50054 */ sw $a1, 0x54($sp) +/* 028600 80027A00 3C0F8012 */ lui $t7, %hi(D_8011B104) # $t7, 0x8012 +/* 028604 80027A04 8DEFB104 */ lw $t7, %lo(D_8011B104)($t7) +/* 028608 80027A08 823801FD */ lb $t8, 0x1fd($s1) +/* 02860C 80027A0C 8FA50054 */ lw $a1, 0x54($sp) +/* 028610 80027A10 11F80005 */ beq $t7, $t8, .L80027A28 +/* 028614 80027A14 00408025 */ move $s0, $v0 +/* 028618 80027A18 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 +/* 02861C 80027A1C 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 +/* 028620 80027A20 1000000E */ b .L80027A5C +/* 028624 80027A24 ACE00000 */ sw $zero, ($a3) +.L80027A28: +/* 028628 80027A28 3C038012 */ lui $v1, %hi(D_8011B100) # $v1, 0x8012 +/* 02862C 80027A2C 2463B100 */ addiu $v1, %lo(D_8011B100) # addiu $v1, $v1, -0x4f00 +/* 028630 80027A30 8C790000 */ lw $t9, ($v1) +/* 028634 80027A34 86280000 */ lh $t0, ($s1) +/* 028638 80027A38 00000000 */ nop +/* 02863C 80027A3C 13280007 */ beq $t9, $t0, .L80027A5C +/* 028640 80027A40 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 +/* 028644 80027A44 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 +/* 028648 80027A48 240900B4 */ li $t1, 180 +/* 02864C 80027A4C ACE90000 */ sw $t1, ($a3) +/* 028650 80027A50 862A0000 */ lh $t2, ($s1) +/* 028654 80027A54 00000000 */ nop +/* 028658 80027A58 AC6A0000 */ sw $t2, ($v1) +.L80027A5C: +/* 02865C 80027A5C 104000ED */ beqz $v0, .L80027E14 +/* 028660 80027A60 8FBF001C */ lw $ra, 0x1c($sp) +/* 028664 80027A64 0C01A73F */ jal get_active_camera_segment_no_cutscenes +/* 028668 80027A68 AFA50054 */ sw $a1, 0x54($sp) +/* 02866C 80027A6C C604000C */ lwc1 $f4, 0xc($s0) +/* 028670 80027A70 8FA50054 */ lw $a1, 0x54($sp) +/* 028674 80027A74 E444000C */ swc1 $f4, 0xc($v0) +/* 028678 80027A78 C6060010 */ lwc1 $f6, 0x10($s0) +/* 02867C 80027A7C C44A000C */ lwc1 $f10, 0xc($v0) +/* 028680 80027A80 E4460010 */ swc1 $f6, 0x10($v0) +/* 028684 80027A84 C6080014 */ lwc1 $f8, 0x14($s0) +/* 028688 80027A88 C4520010 */ lwc1 $f18, 0x10($v0) +/* 02868C 80027A8C E4480014 */ swc1 $f8, 0x14($v0) +/* 028690 80027A90 C4A40010 */ lwc1 $f4, 0x10($a1) +/* 028694 80027A94 C4B0000C */ lwc1 $f16, 0xc($a1) +/* 028698 80027A98 46049181 */ sub.s $f6, $f18, $f4 +/* 02869C 80027A9C 46105081 */ sub.s $f2, $f10, $f16 +/* 0286A0 80027AA0 E7A60064 */ swc1 $f6, 0x64($sp) +/* 0286A4 80027AA4 C4480014 */ lwc1 $f8, 0x14($v0) +/* 0286A8 80027AA8 C4AA0014 */ lwc1 $f10, 0x14($a1) +/* 0286AC 80027AAC 46021402 */ mul.s $f16, $f2, $f2 +/* 0286B0 80027AB0 460A4381 */ sub.s $f14, $f8, $f10 +/* 0286B4 80027AB4 E7A20068 */ swc1 $f2, 0x68($sp) +/* 0286B8 80027AB8 E7AE0060 */ swc1 $f14, 0x60($sp) +/* 0286BC 80027ABC 460E7482 */ mul.s $f18, $f14, $f14 +/* 0286C0 80027AC0 AFA20058 */ sw $v0, 0x58($sp) +/* 0286C4 80027AC4 0C0326B4 */ jal sqrtf +/* 0286C8 80027AC8 46128300 */ add.s $f12, $f16, $f18 +/* 0286CC 80027ACC 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 +/* 0286D0 80027AD0 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 +/* 0286D4 80027AD4 8CEB0000 */ lw $t3, ($a3) +/* 0286D8 80027AD8 8FA30058 */ lw $v1, 0x58($sp) +/* 0286DC 80027ADC C7A20068 */ lwc1 $f2, 0x68($sp) +/* 0286E0 80027AE0 C7AE0060 */ lwc1 $f14, 0x60($sp) +/* 0286E4 80027AE4 1160008C */ beqz $t3, .L80027D18 +/* 0286E8 80027AE8 46000306 */ mov.s $f12, $f0 +/* 0286EC 80027AEC 444CF800 */ cfc1 $t4, $31 +/* 0286F0 80027AF0 AFA30058 */ sw $v1, 0x58($sp) +/* 0286F4 80027AF4 35810003 */ ori $at, $t4, 3 +/* 0286F8 80027AF8 38210002 */ xori $at, $at, 2 +/* 0286FC 80027AFC 44C1F800 */ ctc1 $at, $31 +/* 028700 80027B00 E7AC005C */ swc1 $f12, 0x5c($sp) +/* 028704 80027B04 46001124 */ cvt.w.s $f4, $f2 +/* 028708 80027B08 44CCF800 */ ctc1 $t4, $31 +/* 02870C 80027B0C 44042000 */ mfc1 $a0, $f4 +/* 028710 80027B10 00000000 */ nop +/* 028714 80027B14 444DF800 */ cfc1 $t5, $31 +/* 028718 80027B18 00000000 */ nop +/* 02871C 80027B1C 35A10003 */ ori $at, $t5, 3 +/* 028720 80027B20 38210002 */ xori $at, $at, 2 +/* 028724 80027B24 44C1F800 */ ctc1 $at, $31 +/* 028728 80027B28 00000000 */ nop +/* 02872C 80027B2C 460071A4 */ cvt.w.s $f6, $f14 +/* 028730 80027B30 44053000 */ mfc1 $a1, $f6 +/* 028734 80027B34 44CDF800 */ ctc1 $t5, $31 +/* 028738 80027B38 0C01C19B */ jal atan2s +/* 02873C 80027B3C 00000000 */ nop +/* 028740 80027B40 8FA30058 */ lw $v1, 0x58($sp) +/* 028744 80027B44 00027023 */ negu $t6, $v0 +/* 028748 80027B48 84660000 */ lh $a2, ($v1) +/* 02874C 80027B4C 34018000 */ li $at, 32768 +/* 028750 80027B50 01C68023 */ subu $s0, $t6, $a2 +/* 028754 80027B54 02018021 */ addu $s0, $s0, $at +/* 028758 80027B58 00107C00 */ sll $t7, $s0, 0x10 +/* 02875C 80027B5C 000FC403 */ sra $t8, $t7, 0x10 +/* 028760 80027B60 34018001 */ li $at, 32769 +/* 028764 80027B64 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 +/* 028768 80027B68 C7AC005C */ lwc1 $f12, 0x5c($sp) +/* 02876C 80027B6C 0301082A */ slt $at, $t8, $at +/* 028770 80027B70 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 +/* 028774 80027B74 14200007 */ bnez $at, .L80027B94 +/* 028778 80027B78 03008025 */ move $s0, $t8 +/* 02877C 80027B7C 3C08FFFF */ lui $t0, (0xFFFF0001 >> 16) # lui $t0, 0xffff +/* 028780 80027B80 35080001 */ ori $t0, (0xFFFF0001 & 0xFFFF) # ori $t0, $t0, 1 +/* 028784 80027B84 0018C823 */ negu $t9, $t8 +/* 028788 80027B88 01198023 */ subu $s0, $t0, $t9 +/* 02878C 80027B8C 00104C00 */ sll $t1, $s0, 0x10 +/* 028790 80027B90 00098403 */ sra $s0, $t1, 0x10 +.L80027B94: +/* 028794 80027B94 8CEB0000 */ lw $t3, ($a3) +/* 028798 80027B98 3C014334 */ li $at, 0x43340000 # 180.000000 +/* 02879C 80027B9C 448B4000 */ mtc1 $t3, $f8 +/* 0287A0 80027BA0 44818000 */ mtc1 $at, $f16 +/* 0287A4 80027BA4 468042A0 */ cvt.s.w $f10, $f8 +/* 0287A8 80027BA8 3C014180 */ li $at, 0x41800000 # 16.000000 +/* 0287AC 80027BAC 44812000 */ mtc1 $at, $f4 +/* 0287B0 80027BB0 46105483 */ div.s $f18, $f10, $f16 +/* 0287B4 80027BB4 44904000 */ mtc1 $s0, $f8 +/* 0287B8 80027BB8 00000000 */ nop +/* 0287BC 80027BBC 468042A0 */ cvt.s.w $f10, $f8 +/* 0287C0 80027BC0 46122182 */ mul.s $f6, $f4, $f18 +/* 0287C4 80027BC4 00000000 */ nop +/* 0287C8 80027BC8 46065403 */ div.s $f16, $f10, $f6 +/* 0287CC 80027BCC 444CF800 */ cfc1 $t4, $31 +/* 0287D0 80027BD0 00000000 */ nop +/* 0287D4 80027BD4 35810003 */ ori $at, $t4, 3 +/* 0287D8 80027BD8 38210002 */ xori $at, $at, 2 +/* 0287DC 80027BDC 44C1F800 */ ctc1 $at, $31 +/* 0287E0 80027BE0 00000000 */ nop +/* 0287E4 80027BE4 46008124 */ cvt.w.s $f4, $f16 +/* 0287E8 80027BE8 44CCF800 */ ctc1 $t4, $31 +/* 0287EC 80027BEC 440E2000 */ mfc1 $t6, $f4 +/* 0287F0 80027BF0 00000000 */ nop +/* 0287F4 80027BF4 4458F800 */ cfc1 $t8, $31 +/* 0287F8 80027BF8 00CE7821 */ addu $t7, $a2, $t6 +/* 0287FC 80027BFC 37010003 */ ori $at, $t8, 3 +/* 028800 80027C00 A46F0000 */ sh $t7, ($v1) +/* 028804 80027C04 38210002 */ xori $at, $at, 2 +/* 028808 80027C08 44C1F800 */ ctc1 $at, $31 +/* 02880C 80027C0C C7B20064 */ lwc1 $f18, 0x64($sp) +/* 028810 80027C10 AFA30058 */ sw $v1, 0x58($sp) +/* 028814 80027C14 46009224 */ cvt.w.s $f8, $f18 +/* 028818 80027C18 44D8F800 */ ctc1 $t8, $31 +/* 02881C 80027C1C 44044000 */ mfc1 $a0, $f8 +/* 028820 80027C20 00000000 */ nop +/* 028824 80027C24 4448F800 */ cfc1 $t0, $31 +/* 028828 80027C28 00000000 */ nop +/* 02882C 80027C2C 35010003 */ ori $at, $t0, 3 +/* 028830 80027C30 38210002 */ xori $at, $at, 2 +/* 028834 80027C34 44C1F800 */ ctc1 $at, $31 +/* 028838 80027C38 00000000 */ nop +/* 02883C 80027C3C 460062A4 */ cvt.w.s $f10, $f12 +/* 028840 80027C40 44055000 */ mfc1 $a1, $f10 +/* 028844 80027C44 44C8F800 */ ctc1 $t0, $31 +/* 028848 80027C48 0C01C19B */ jal atan2s +/* 02884C 80027C4C 00000000 */ nop +/* 028850 80027C50 8FA30058 */ lw $v1, 0x58($sp) +/* 028854 80027C54 34018001 */ li $at, 32769 +/* 028858 80027C58 84640002 */ lh $a0, 2($v1) +/* 02885C 80027C5C 3C078012 */ lui $a3, %hi(D_8011B108) # $a3, 0x8012 +/* 028860 80027C60 00448023 */ subu $s0, $v0, $a0 +/* 028864 80027C64 0010CC00 */ sll $t9, $s0, 0x10 +/* 028868 80027C68 00194C03 */ sra $t1, $t9, 0x10 +/* 02886C 80027C6C 0121082A */ slt $at, $t1, $at +/* 028870 80027C70 01208025 */ move $s0, $t1 +/* 028874 80027C74 14200007 */ bnez $at, .L80027C94 +/* 028878 80027C78 24E7B108 */ addiu $a3, %lo(D_8011B108) # addiu $a3, $a3, -0x4ef8 +/* 02887C 80027C7C 3C0BFFFF */ lui $t3, (0xFFFF0001 >> 16) # lui $t3, 0xffff +/* 028880 80027C80 356B0001 */ ori $t3, (0xFFFF0001 & 0xFFFF) # ori $t3, $t3, 1 +/* 028884 80027C84 00095023 */ negu $t2, $t1 +/* 028888 80027C88 016A8023 */ subu $s0, $t3, $t2 +/* 02888C 80027C8C 00106400 */ sll $t4, $s0, 0x10 +/* 028890 80027C90 000C8403 */ sra $s0, $t4, 0x10 +.L80027C94: +/* 028894 80027C94 8CEE0000 */ lw $t6, ($a3) +/* 028898 80027C98 3C014334 */ li $at, 0x43340000 # 180.000000 +/* 02889C 80027C9C 448E3000 */ mtc1 $t6, $f6 +/* 0288A0 80027CA0 44812000 */ mtc1 $at, $f4 +/* 0288A4 80027CA4 46803420 */ cvt.s.w $f16, $f6 +/* 0288A8 80027CA8 3C014180 */ li $at, 0x41800000 # 16.000000 +/* 0288AC 80027CAC 44814000 */ mtc1 $at, $f8 +/* 0288B0 80027CB0 46048483 */ div.s $f18, $f16, $f4 +/* 0288B4 80027CB4 44903000 */ mtc1 $s0, $f6 +/* 0288B8 80027CB8 00000000 */ nop +/* 0288BC 80027CBC 46803420 */ cvt.s.w $f16, $f6 +/* 0288C0 80027CC0 46124282 */ mul.s $f10, $f8, $f18 +/* 0288C4 80027CC4 00000000 */ nop +/* 0288C8 80027CC8 460A8103 */ div.s $f4, $f16, $f10 +/* 0288CC 80027CCC 444FF800 */ cfc1 $t7, $31 +/* 0288D0 80027CD0 00000000 */ nop +/* 0288D4 80027CD4 35E10003 */ ori $at, $t7, 3 +/* 0288D8 80027CD8 38210002 */ xori $at, $at, 2 +/* 0288DC 80027CDC 44C1F800 */ ctc1 $at, $31 +/* 0288E0 80027CE0 00000000 */ nop +/* 0288E4 80027CE4 46002224 */ cvt.w.s $f8, $f4 +/* 0288E8 80027CE8 44084000 */ mfc1 $t0, $f8 +/* 0288EC 80027CEC 44CFF800 */ ctc1 $t7, $31 +/* 0288F0 80027CF0 0088C821 */ addu $t9, $a0, $t0 +/* 0288F4 80027CF4 A4790002 */ sh $t9, 2($v1) +/* 0288F8 80027CF8 8CE90000 */ lw $t1, ($a3) +/* 0288FC 80027CFC 8FAB0070 */ lw $t3, 0x70($sp) +/* 028900 80027D00 00000000 */ nop +/* 028904 80027D04 012B5023 */ subu $t2, $t1, $t3 +/* 028908 80027D08 05410035 */ bgez $t2, .L80027DE0 +/* 02890C 80027D0C ACEA0000 */ sw $t2, ($a3) +/* 028910 80027D10 10000033 */ b .L80027DE0 +/* 028914 80027D14 ACE00000 */ sw $zero, ($a3) +.L80027D18: +/* 028918 80027D18 444DF800 */ cfc1 $t5, $31 +/* 02891C 80027D1C AFA30058 */ sw $v1, 0x58($sp) +/* 028920 80027D20 35A10003 */ ori $at, $t5, 3 +/* 028924 80027D24 38210002 */ xori $at, $at, 2 +/* 028928 80027D28 44C1F800 */ ctc1 $at, $31 +/* 02892C 80027D2C E7AC005C */ swc1 $f12, 0x5c($sp) +/* 028930 80027D30 460014A4 */ cvt.w.s $f18, $f2 +/* 028934 80027D34 44CDF800 */ ctc1 $t5, $31 +/* 028938 80027D38 44049000 */ mfc1 $a0, $f18 +/* 02893C 80027D3C 00000000 */ nop +/* 028940 80027D40 444EF800 */ cfc1 $t6, $31 +/* 028944 80027D44 00000000 */ nop +/* 028948 80027D48 35C10003 */ ori $at, $t6, 3 +/* 02894C 80027D4C 38210002 */ xori $at, $at, 2 +/* 028950 80027D50 44C1F800 */ ctc1 $at, $31 +/* 028954 80027D54 00000000 */ nop +/* 028958 80027D58 460071A4 */ cvt.w.s $f6, $f14 +/* 02895C 80027D5C 44053000 */ mfc1 $a1, $f6 +/* 028960 80027D60 44CEF800 */ ctc1 $t6, $31 +/* 028964 80027D64 0C01C19B */ jal atan2s +/* 028968 80027D68 00000000 */ nop +/* 02896C 80027D6C 4448F800 */ cfc1 $t0, $31 +/* 028970 80027D70 8FA30058 */ lw $v1, 0x58($sp) +/* 028974 80027D74 340F8000 */ li $t7, 32768 +/* 028978 80027D78 C7AC005C */ lwc1 $f12, 0x5c($sp) +/* 02897C 80027D7C 01E2C023 */ subu $t8, $t7, $v0 +/* 028980 80027D80 35010003 */ ori $at, $t0, 3 +/* 028984 80027D84 38210002 */ xori $at, $at, 2 +/* 028988 80027D88 A4780000 */ sh $t8, ($v1) +/* 02898C 80027D8C C7B00064 */ lwc1 $f16, 0x64($sp) +/* 028990 80027D90 44C1F800 */ ctc1 $at, $31 +/* 028994 80027D94 00000000 */ nop +/* 028998 80027D98 460082A4 */ cvt.w.s $f10, $f16 +/* 02899C 80027D9C 44C8F800 */ ctc1 $t0, $31 +/* 0289A0 80027DA0 44045000 */ mfc1 $a0, $f10 +/* 0289A4 80027DA4 00000000 */ nop +/* 0289A8 80027DA8 4459F800 */ cfc1 $t9, $31 +/* 0289AC 80027DAC 00000000 */ nop +/* 0289B0 80027DB0 37210003 */ ori $at, $t9, 3 +/* 0289B4 80027DB4 38210002 */ xori $at, $at, 2 +/* 0289B8 80027DB8 44C1F800 */ ctc1 $at, $31 +/* 0289BC 80027DBC 00000000 */ nop +/* 0289C0 80027DC0 46006124 */ cvt.w.s $f4, $f12 +/* 0289C4 80027DC4 44052000 */ mfc1 $a1, $f4 +/* 0289C8 80027DC8 44D9F800 */ ctc1 $t9, $31 +/* 0289CC 80027DCC 0C01C19B */ jal atan2s +/* 0289D0 80027DD0 00000000 */ nop +/* 0289D4 80027DD4 8FA30058 */ lw $v1, 0x58($sp) +/* 0289D8 80027DD8 00000000 */ nop +/* 0289DC 80027DDC A4620002 */ sh $v0, 2($v1) +.L80027DE0: +/* 0289E0 80027DE0 A4600004 */ sh $zero, 4($v1) +/* 0289E4 80027DE4 C62E003C */ lwc1 $f14, 0x3c($s1) +/* 0289E8 80027DE8 C46C000C */ lwc1 $f12, 0xc($v1) +/* 0289EC 80027DEC 8C660014 */ lw $a2, 0x14($v1) +/* 0289F0 80027DF0 0C00A7C6 */ jal get_level_segment_index_from_position +/* 0289F4 80027DF4 AFA30058 */ sw $v1, 0x58($sp) +/* 0289F8 80027DF8 8FA30058 */ lw $v1, 0x58($sp) +/* 0289FC 80027DFC 3C018012 */ lui $at, %hi(D_8011B104) # $at, 0x8012 +/* 028A00 80027E00 A4620034 */ sh $v0, 0x34($v1) +/* 028A04 80027E04 822901FD */ lb $t1, 0x1fd($s1) +/* 028A08 80027E08 00000000 */ nop +/* 028A0C 80027E0C AC29B104 */ sw $t1, %lo(D_8011B104)($at) +/* 028A10 80027E10 8FBF001C */ lw $ra, 0x1c($sp) +.L80027E14: +/* 028A14 80027E14 8FB00014 */ lw $s0, 0x14($sp) +/* 028A18 80027E18 8FB10018 */ lw $s1, 0x18($sp) +/* 028A1C 80027E1C 03E00008 */ jr $ra +/* 028A20 80027E20 27BD0070 */ addiu $sp, $sp, 0x70 + diff --git a/include/structs.h b/include/structs.h index 7d4cbdbd..99b0f620 100644 --- a/include/structs.h +++ b/include/structs.h @@ -634,7 +634,7 @@ typedef enum { OBJECT_MODEL_TYPE_SPRITE_BILLBOARD, OBJECT_MODEL_TYPE_VEHICLE_PART, OBJECT_MODEL_TYPE_UNKNOWN3, - OBJECT_MODEL_TYPE_UNKNOWN4 + OBJECT_MODEL_TYPE_MISC } ObjectModelType; typedef struct ObjHeaderParticleEntry { @@ -1037,7 +1037,7 @@ typedef struct Object_Racer { /* 0x003 */ s8 characterId; // Affects minimap color, horn, voice, etc. /* 0x004 */ s32 unk4; /* 0x008 */ f32 forwardVel; - /* 0x00C */ f32 unkC; + /* 0x00C */ f32 animationSpeed; /* 0x010 */ s32 unk10; /* 0x014 */ s32 unk14; /* 0x018 */ s32 unk18; @@ -1225,7 +1225,7 @@ typedef struct Object_Racer { /* 0x201 */ s8 unk201; /* 0x202 */ s8 silverCoinCount; /* 0x203 */ s8 boostType; - /* 0x204 */ s16 unk204; + /* 0x204 */ s16 bubbleTrapTimer; /* 0x206 */ s16 unk206; /* 0x208 */ s8 unk208; /* 0x209 */ u8 unk209; @@ -1671,7 +1671,7 @@ typedef struct Object { /* 0x0044 */ unk800B0698_44 *unk44_0; }; /* 0x0048 */ s16 behaviorId; - /* 0x004A */ s16 unk4A; + /* 0x004A */ s16 unk4A; // Upper byte is object ID, lower byte is object size. /* 0x004C */ ObjectInteraction *interactObj; //player + 0x318 /* 0x0050 */ ShadowData *shadow; //player + 0x2F4 /* 0x0054 */ Object_54 *unk54; //player + 0x2C0 diff --git a/src/camera.h b/src/camera.h index 2f9c8d6b..2c46fe4a 100644 --- a/src/camera.h +++ b/src/camera.h @@ -84,7 +84,6 @@ void func_800660C0(void); void func_800660D0(void); UNUSED f32 get_current_camera_fov(void); void update_camera_fov(f32 camFieldOfView); -UNUSED void calculate_camera_perspective(void); Matrix *func_80066204(void); s32 get_viewport_count(void); s32 get_current_viewport(void); @@ -123,7 +122,7 @@ void set_camera_shake(f32 magnitude); void func_80067D3C(Gfx **dlist, MatrixS **mats); void render_ortho_triangle_image(Gfx **dList, MatrixS **mtx, Vertex **vtx, ObjectSegment *segment, Sprite *sprite, s32 flags); s32 render_sprite_billboard(Gfx **dlist, MatrixS **mtx, Vertex **vertexList, Object *obj, unk80068514_arg4 *arg4, s32 flags); -void camera_push_model_mtx(Gfx **arg0, MatrixS **arg1, ObjectTransform *arg2, f32 arg3, f32 arg4); +void camera_push_model_mtx(Gfx **arg0, MatrixS **arg1, ObjectTransform *arg2, f32 scale, f32 scaleY); void set_viewport_scissor(Gfx **dlist); void func_80069A40(Gfx **dlist); void copy_viewports_to_stack(void); diff --git a/src/font.h b/src/font.h index 747a0bdc..e6943099 100644 --- a/src/font.h +++ b/src/font.h @@ -171,9 +171,6 @@ void move_dialogue_box_to_front(s32 dialogueBoxID, DialogueBox *box); void assign_dialogue_box_id(s32 dialogueBoxID); void open_dialogue_box(s32 dialogueBoxID); void close_dialogue_box(s32 dialogueBoxID); -UNUSED void set_dialogue_box_unused_flag(s32 dialogueBoxID); -UNUSED void dialogue_box_clear_flags(s32 dialogueBoxID); -UNUSED void enable_dialogue_box_vertices(s32 dialogueBoxID); void func_800C56D0(s32 dialogueBoxID); void render_dialogue_boxes(Gfx **dlist, MatrixS **mat, Vertex **verts); void render_fill_rectangle(Gfx **dlist, s32 ulx, s32 uly, s32 lrx, s32 lry); diff --git a/src/game_text.c b/src/game_text.c index b6e1fdde..f0a662b7 100644 --- a/src/game_text.c +++ b/src/game_text.c @@ -209,7 +209,7 @@ void func_800C30CC(void) { D_800E3670 = 0; D_8012A789 = 0; for (i = 0; i < 10; i++) { - func_8009CFB0(); + try_close_dialogue_box(); }; func_800C2AB4(); } @@ -323,7 +323,7 @@ void func_800C3440(s32 arg0) { D_8012A784 = 1; } } - func_8009CFEC(3); + npc_dialogue_loop(DIALOGUE_CHALLENGE); } } } diff --git a/src/menu.c b/src/menu.c index 23459742..b31eecc4 100644 --- a/src/menu.c +++ b/src/menu.c @@ -8213,6 +8213,9 @@ void func_8009BD5C(void) { void func_8009BE54() { } +/** + * Reset all menu related joystick inputs for each player. +*/ void reset_controller_sticks(void) { s32 i; for (i = 0; i < 4; i++) { @@ -8228,6 +8231,10 @@ void reset_controller_sticks(void) { #define STICK_DEADZONE 35 #define STICK_DELAY_AMOUNT 15 +/** + * Reads the stick inputs, then with the aid of a maximum range and a deadzone, writes it to the menu inputs. + * Stick input delay is not time corrected, meaning holding the stick is slower at lower framerates. +*/ void update_controller_sticks(void) { s32 XClamp, YClamp; s32 i; @@ -8608,7 +8615,11 @@ void func_8009CF68(s32 arg0) { } } -void func_8009CFB0(void) { +/** + * If the call to close dialogue has been made, this will begin hiding it. + * It then also resets the menus stick inputs. +*/ +void try_close_dialogue_box(void) { if (gNeedToCloseDialogueBox) { gNeedToCloseDialogueBox = FALSE; close_dialogue_box(1); @@ -8616,17 +8627,21 @@ void func_8009CFB0(void) { } } -s32 func_8009CFEC(u32 dialogueOption) { +/** + * Top level function for controlling dialogue with NPC's. + * Returning nonzero will trigger those NPC's to stop dialogue. +*/ +s32 npc_dialogue_loop(u32 dialogueOption) { s32 result; D_800DF4E4[dialogueOption] = 0; - if ((func_800C3400() != 0) && (dialogueOption != DIALOG_CHALLENGE)) { + if ((func_800C3400() != 0) && (dialogueOption != DIALOGUE_CHALLENGE)) { return 0; } if (gNeedToCloseDialogueBox) { return 0; } - if (dialogueOption != DIALOG_CHALLENGE) { + if (dialogueOption != DIALOGUE_CHALLENGE) { func_8006F388(1); } result = 0; @@ -8636,19 +8651,19 @@ s32 func_8009CFEC(u32 dialogueOption) { set_current_dialogue_background_colour(1, 0, 0, 0, 128); func_8001F450(); switch (dialogueOption) { - case DIALOG_TAJ: + case DIALOGUE_TAJ: result = taj_menu_loop(); // Taj menu break; - case DIALOG_TT: + case DIALOGUE_TT: result = tt_menu_loop(); // T.T. menu break; - case DIALOG_CHALLENGE: + case DIALOGUE_CHALLENGE: result = func_800C3564(); // Taj challenge completed/failed menu break; - case DIALOG_TROPHY: + case DIALOGUE_TROPHY: result = trophy_race_cabinet_menu_loop(); // Trophy race cabinet menu break; - case DIALOG_RACERESULT: + case DIALOGUE_RACERESULT: result = dialogue_race_defeat(); break; } diff --git a/src/menu.h b/src/menu.h index 2d8af0bb..b4d6f1db 100644 --- a/src/menu.h +++ b/src/menu.h @@ -21,12 +21,12 @@ #define TT_MENU_EXIT 10 enum DialogueMenuCases { - DIALOG_TAJ, - DIALOG_UNK_01, - DIALOG_TT, - DIALOG_CHALLENGE, - DIALOG_TROPHY, - DIALOG_RACERESULT + DIALOGUE_TAJ, + DIALOGUE_UNK_01, + DIALOGUE_TT, + DIALOGUE_CHALLENGE, + DIALOGUE_TROPHY, + DIALOGUE_RACERESULT }; #define CHEAT(index) 1 << index @@ -831,8 +831,8 @@ void allocate_menu_images(s16 *imageSet); void allocate_and_set_menu_image_properties(s32 imageID); void func_8009CA58(void); void func_8009CF68(s32 arg0); -void func_8009CFB0(void); -s32 func_8009CFEC(u32 arg0); +void try_close_dialogue_box(void); +s32 npc_dialogue_loop(u32 arg0); void set_option_text_colour(s32 condition); void render_dialogue_option(char *text, s32 yOffset, s32 optionID); void handle_menu_joystick_input(void); diff --git a/src/object_functions.c b/src/object_functions.c index 9bb56df6..78f4eb8c 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -287,7 +287,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 44, SOUND_EXPLOSION, 1.0f, 1); gParticlePtrList_addObject(obj); } else if (obj->properties.fireball.timer > 0) { - racer->unk204 = 60; + racer->bubbleTrapTimer = 60; obj->properties.fireball.timer = -60; obj->properties.fireball.obj = someObj; play_sound_global(SOUND_BUBBLE_RISE, &weapon->soundMask); @@ -688,7 +688,7 @@ void obj_loop_trophycab(Object *obj, s32 updateRate) { if (obj->properties.trophyCabinet.action == 1) { func_800AB1AC(3); set_hud_visibility(0U); - dialogueID = func_8009CFEC(4); + dialogueID = npc_dialogue_loop(DIALOGUE_TROPHY); if (dialogueID) { obj->properties.trophyCabinet.action = 0; func_8009CF68(4); @@ -882,7 +882,7 @@ void obj_loop_rocketsignpost(Object *obj, UNUSED s32 updateRate) { Object *playerObj; ObjectInteraction *interactObj; - playerObj = get_racer_object(0); + playerObj = get_racer_object(PLAYER_ONE); if (playerObj != NULL) { interactObj = obj->interactObj; if (interactObj->distance < 200) { @@ -1223,7 +1223,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { func_800AB194(3); } if (obj->properties.npc.action >= TT_MODE_TURN_TOWARDS_PLAYER) { - index = func_8009CFEC(2U); + index = npc_dialogue_loop(DIALOGUE_TT); } else { func_8009CF68(2); index = 0; @@ -1432,7 +1432,7 @@ void obj_loop_posarrow(Object *obj, UNUSED s32 updateRate) { } /* Offical name: animInit */ -void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 arg2) { +void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 param) { Object_Animator *obj64; LevelModel *levelModel; s16 segmentBatchCount; @@ -1443,7 +1443,8 @@ void obj_init_animator(Object *obj, LevelObjectEntry_Animator *entry, s32 arg2) obj64->speedFactorX = entry->speedFactorX; obj64->speedFactorY = entry->speedfactorY; obj64->segmentId = get_level_segment_index_from_position(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); - if (arg2 == 0) { + // Always true. + if (param == 0) { obj64->xSpeed = 0; obj64->ySpeed = 0; } @@ -2122,7 +2123,7 @@ void obj_loop_dino_whale(Object *obj, s32 updateRate) { } animFrame = obj->segment.animFrame; func_8001F460(obj, updateRate, obj); - func_800113CC(obj, 0, animFrame, SOUND_STOMP2, SOUND_STOMP3); + play_footstep_sounds(obj, 0, animFrame, SOUND_STOMP2, SOUND_STOMP3); if (obj->interactObj->distance < 255) { if (obj->properties.common.unk0 == 0) { obj->properties.common.unk0 = 60; @@ -2178,7 +2179,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { Object *temp_v0_12; s32 var_a2; Object **racerObjs; - s32 var_a2_2; + s32 dialogueID; s32 numRacers; Object_NPC *taj; Object_64 *racer64; @@ -2280,11 +2281,11 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { case TAJ_MODE_DIALOGUE: case TAJ_MODE_TRANSFORM_BEGIN: case TAJ_MODE_TRANSFORM_END: - var_a2_2 = func_8009CFEC(0); + dialogueID = npc_dialogue_loop(DIALOGUE_TAJ); break; default: func_8009CF68(0); - var_a2_2 = 0; + dialogueID = 0; break; } @@ -2302,7 +2303,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { func_8006F388(1); break; } - if (obj->properties.npc.action != TAJ_MODE_ROAM && var_a2_2 != 0 && obj->properties.npc.action < 4) { + if (obj->properties.npc.action != TAJ_MODE_ROAM && dialogueID != 0 && obj->properties.npc.action < 4) { obj->properties.npc.action = TAJ_MODE_DIALOGUE; } switch (obj->properties.npc.action) { @@ -2389,8 +2390,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->segment.object.animationID = 4; taj->animFrameF += updateRateF * 1.0; racer_set_dialogue_camera(); - if (var_a2_2 == 3 || var_a2_2 == 4) { - obj->properties.npc.action = (var_a2_2 == 4) ? TAJ_MODE_END_DIALOGUE_UNUSED : TAJ_MODE_END_DIALOGUE; + if (dialogueID == 3 || dialogueID == 4) { + obj->properties.npc.action = (dialogueID == 4) ? TAJ_MODE_END_DIALOGUE_UNUSED : TAJ_MODE_END_DIALOGUE; taj->animFrameF = 0.1f; obj->segment.object.animationID = 2; taj->unk1C = 0; @@ -2401,8 +2402,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { func_80001074(levelHeader->instruments); func_80008168(); } - if (var_a2_2 & 0x80) { - D_8011D4E0 = var_a2_2 & 0x7F; + if (dialogueID & 0x80) { + D_8011D4E0 = dialogueID & 0x7F; if (D_8011D4E0 != racer64->racer.vehicleID) { obj->properties.npc.action = TAJ_MODE_TRANSFORM_BEGIN; taj->animFrameF = 0; @@ -2412,8 +2413,8 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { set_menu_id_if_option_equal(0x62, 2); } } - if (var_a2_2 & 0x40) { - D_8011D4E0 = var_a2_2 & 0xF; + if (dialogueID & 0x40) { + D_8011D4E0 = dialogueID & 0xF; if (D_8011D4E0 != racer64->racer.vehicleID) { D_8011D4E0 |= 0x80; obj->properties.npc.action = TAJ_MODE_TRANSFORM_BEGIN; @@ -3425,7 +3426,7 @@ void obj_loop_bridge_whaleramp(Object *obj, s32 updateRate) { break; case 2: obj->properties.common.unk0 = 1; - racerObj = get_racer_object(0); + racerObj = get_racer_object(PLAYER_ONE); if (racerObj != NULL) { racer = (Object_Racer *) racerObj->unk64; switch(racer->vehicleID) { diff --git a/src/objects.c b/src/objects.c index 18cfbf1e..b5388212 100644 --- a/src/objects.c +++ b/src/objects.c @@ -153,7 +153,7 @@ s8 D_8011AD24[2]; s8 D_8011AD26[2]; f32 D_8011AD28; s32 D_8011AD2C; -f32 D_8011AD30; +f32 gCurrentLightIntensity; Object *D_8011AD34; s32 D_8011AD38; //D_8011AD38 is ultimately set by func_80074B34, and is almost definitely SIDeviceStatus s8 D_8011AD3C; @@ -183,7 +183,7 @@ s32 D_8011AD74; Gfx *D_8011AD78[10]; s32 gAssetsMiscTableLength; s16 D_8011ADA4; -f32 D_8011ADA8; +f32 gObjectUpdateRateF; s32 D_8011ADAC; s32 D_8011ADB0; s32 D_8011ADB4; @@ -347,6 +347,10 @@ Object *func_8000BF44(s32 arg0) { return D_8011B020[arg0]; } +/** + * Allocate memory for objects and object related systems. + * This includes the objects themselves, particles, and all of the pointer lists for tracking objects. +*/ void allocate_object_pools(void) { s32 i; @@ -389,13 +393,14 @@ void allocate_object_pools(void) { gAssetsMiscTableLength++; } - decrypt_magic_codes(&gAssetsMiscSection[gAssetsMiscTable[65]], (gAssetsMiscTable[66] - gAssetsMiscTable[65]) * 4); + decrypt_magic_codes(&gAssetsMiscSection[gAssetsMiscTable[ASSET_MISC_MAGIC_CODES]], + (gAssetsMiscTable[ASSET_MISC_TITLE_SCREEN_DEMO_IDS] - gAssetsMiscTable[ASSET_MISC_MAGIC_CODES]) * sizeof(s32 *)); gObjPtrList = (Object **) allocate_from_main_pool_safe(sizeof(uintptr_t) * OBJECT_SLOT_COUNT, COLOUR_TAG_BLUE); D_8011ADC4 = 0; gTimeTrialEnabled = 0; gIsTimeTrial = FALSE; - D_8011ADA8 = 2.0f; - func_8000C460(); + gObjectUpdateRateF = 2.0f; + clear_object_pointers(); } #ifdef NON_EQUIVALENT @@ -425,7 +430,10 @@ void decrypt_magic_codes(s32 *data, s32 length) { GLOBAL_ASM("asm/non_matchings/objects/decrypt_magic_codes.s") #endif -void func_8000C460(void) { +/** + * Set all object counters and headers to zero, effectively telling the game there are no objects currently in the scene. +*/ +void clear_object_pointers(void) { s32 i; D_8011AD26[0] = 1; @@ -441,13 +449,13 @@ void func_8000C460(void) { D_8011AD22[0] = 0; D_8011AD22[1] = 0; - for (i = 0; i < 0x80; i++) { + for (i = 0; i < 128; i++) { (*D_8011AF04)[i] = 0; } for (i = 0; i < 8; i++) { (*D_8011ADCC)[i] = 0; } - for (i = 0; i < 0x10; i++) { + for (i = 0; i < 16; i++) { D_8011AFF4[i].unk0 = 0; } @@ -491,7 +499,7 @@ void func_8000C604(void) { gParticleCount = 0; objCount = 0; D_8011AE60 = 0; - func_8000C460(); + clear_object_pointers(); free_from_memory_pool((void *) D_8011AEB0[0]); free_from_memory_pool((void *) D_8011AEB0[1]); } @@ -772,12 +780,18 @@ Object *get_object(s32 index) { return gObjPtrList[index]; } +/** + * Return the standard object list index and how many objects are in that list. +*/ Object **objGetObjList(s32 *arg0, s32 *cnt) { *arg0 = D_8011AE60; *cnt = objCount; return gObjPtrList; } +/** + * Return the number of objects currently existing. +*/ UNUSED s32 getObjectCount(void) { return objCount; } @@ -911,11 +925,11 @@ void gParticlePtrList_addObject(Object *object) { gParticleCount++; } -s32 func_80010018(void) { +UNUSED s32 func_80010018(void) { return gAssetsLvlObjTranslationTableLength; } -s32 func_80010028(s32 arg0) { +UNUSED s32 func_80010028(s32 arg0) { return (gAssetsLvlObjTranslationTable[arg0] < gAssetsObjectHeadersTableLength); } @@ -1085,11 +1099,11 @@ void func_80010994(s32 updateRate) { } func_80008438(gRacersByPort, gNumRacers, updateRate); D_8011ADAC = 1; - D_8011ADA8 = (f32) updateRate; + gObjectUpdateRateF = (f32) updateRate; D_8011AD24[0] = 0; D_8011AD53 = 0; func_8000E2B4(); - func_8009CFB0(); + try_close_dialogue_box(); func_800179D0(); } while(0); //FAKEMATCH if (D_8011AF00 == 1) { @@ -1197,7 +1211,10 @@ UNUSED s32 func_800113BC() { return D_8011ADBC; } -s32 func_800113CC(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoundId) { +/** + * When the object reaches a certain anim frame, play a sound and shake the camera to emphasise the effect of their movement. +*/ +s32 play_footstep_sounds(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoundId) { s8 *asset; f32 shakeDist; f32 shakeMagnitude; @@ -1219,7 +1236,7 @@ s32 func_800113CC(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoun animFrame = obj->segment.animFrame >> 4; for (i = 0; i < asset0; i++) { nextAsset = asset[i+3]; - if (((animFrame >= nextAsset) && (frame < nextAsset)) || ((nextAsset >= animFrame) && (nextAsset < frame))) { + if ((animFrame >= nextAsset && frame < nextAsset) || (nextAsset >= animFrame && nextAsset < frame)) { set_camera_shake_by_distance(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, shakeDist, shakeMagnitude); if (i & 1) { @@ -1339,9 +1356,13 @@ s32 move_object(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 flags, u32 texOffset, f32 arg8) { +/** + * Set up the basic model view matrix, load a texture, then render the mesh. + * A much simpler, faster way to render an object model as opposed to render_3d_model +*/ +void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 flags, u32 texOffset, f32 scale) { s32 hasTexture = FALSE; - camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, arg8, 0.0f); + camera_push_model_mtx(&gObjectCurrDisplayList, &gObjectCurrMatrix, &obj->segment.trans, scale, 0.0f); gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); if (tex != NULL) { @@ -1353,33 +1374,36 @@ void func_80011960(Object *obj, Vertex *verts, u32 numVertices, Triangle *triang func_80069A40(&gObjectCurrDisplayList); } -void func_80011AD0(Object *this) { - f32 tmp_f0; - Object_64 *obj64; +/** + * A few objects use unconventional means to render. They are handled here. +*/ +void render_3d_misc(Object *obj) { + f32 scale; + Object_64 *objData; - switch (this->behaviorId) { + switch (obj->behaviorId) { case BHV_CHARACTER_FLAG: - if (this->properties.characterFlag.characterID >= 0) { - obj64 = this->unk64; - func_80011960(this, obj64->character_flag.vertices, 4, obj64->character_flag.triangles, - 2, obj64->character_flag.texture, RENDER_ANTI_ALIASING | RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); + if (obj->properties.characterFlag.characterID >= 0) { + objData = obj->unk64; + render_misc_model(obj, objData->character_flag.vertices, 4, objData->character_flag.triangles, 2, objData->character_flag.texture, + RENDER_ANTI_ALIASING | RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); } break; case BHV_BUTTERFLY: - obj64 = this->unk64; - func_80011960(this, &obj64->butterfly.vertices[obj64->butterfly.unkFC * 6], 6, obj64->butterfly.triangles, 8, obj64->butterfly.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); + objData = obj->unk64; + render_misc_model(obj, &objData->butterfly.vertices[objData->butterfly.unkFC * 6], 6, objData->butterfly.triangles, 8, objData->butterfly.texture, + RENDER_Z_COMPARE | RENDER_FOG_ACTIVE, 0, 1.0f); break; - case BHV_FISH: - obj64 = this->unk64; - tmp_f0 = this->segment.level_entry->fish.unkC[1]; - tmp_f0 *= 0.01f; - func_80011960(this, &obj64->fish.vertices[obj64->fish.unkFC * 6], 6, obj64->fish.triangles, 8, obj64->fish.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, tmp_f0); + objData = obj->unk64; + scale = obj->segment.level_entry->fish.unkC[1]; + scale *= 0.01f; + render_misc_model(obj, &objData->fish.vertices[objData->fish.unkFC * 6], 6, objData->fish.triangles, 8, objData->fish.texture, + RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scale); break; - case BHV_BOOST: - if ((this->properties.common.unk0 != 0) && ((this->unk64->boost.unk70 > 0) || (this->unk64->boost.unk74 > 0.0f))) { - func_800135B8(this); + if (obj->properties.common.unk0 && (obj->unk64->boost.unk70 > 0 || obj->unk64->boost.unk74 > 0.0f)) { + func_800135B8(obj); } break; } @@ -1397,8 +1421,8 @@ void render_3d_billboard(Object *obj) { s32 hasPrimCol; s32 hasEnvCol; ObjectTransformExt objTrans; - Object *var_a0; - unk80068514_arg4* sp58; + Object *bubbleTrap; + Object_68* gfxData; intensity = 255; hasPrimCol = FALSE; @@ -1452,17 +1476,17 @@ void render_3d_billboard(Object *obj) { } else { gDPSetEnvColor(gObjectCurrDisplayList++, 255, 255, 255, 0); } - sp58 = (unk80068514_arg4 *) obj->unk68[obj->segment.object.numModelIDs]; - var_a0 = NULL; + gfxData = obj->unk68[obj->segment.object.numModelIDs]; + bubbleTrap = NULL; if (obj->behaviorId == BHV_FIREBALL_OCTOWEAPON_2) { - var_a0 = obj->properties.fireball.obj; + bubbleTrap = obj->properties.fireball.obj; if (obj->properties.fireball.timer > 0) { - var_a0 = obj; + bubbleTrap = obj; } } // 5 = OilSlick, SmokeCloud, Bomb, BubbleWeapon - if(var_a0 != NULL || !(obj->behaviorId != BHV_WEAPON || obj->unk64->weapon.weaponID != WEAPON_BUBBLE_TRAP)) { + if(bubbleTrap != NULL || !(obj->behaviorId != BHV_WEAPON || obj->unk64->weapon.weaponID != WEAPON_BUBBLE_TRAP)) { objTrans.trans.z_rotation = 0; objTrans.trans.x_rotation = 0; objTrans.trans.y_rotation = 0; @@ -1470,17 +1494,17 @@ void render_3d_billboard(Object *obj) { objTrans.trans.x_position = 0.0f; objTrans.trans.z_position = 0.0f; objTrans.trans.y_position = 12.0f; - objTrans.unk18 = obj->segment.animFrame; + objTrans.animFrame = obj->segment.animFrame; objTrans.unk1A = 32; - if (var_a0 == NULL) { - var_a0 = (Object *) obj->unk64->weapon.target; - if (var_a0 == NULL) { - var_a0 = obj; + if (bubbleTrap == NULL) { + bubbleTrap = (Object *) obj->unk64->weapon.target; + if (bubbleTrap == NULL) { + bubbleTrap = obj; } } - func_800138A8(&var_a0->segment.trans, sp58, (Object *) &objTrans, RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); + render_bubble_trap(&bubbleTrap->segment.trans, gfxData, (Object *) &objTrans, RENDER_Z_COMPARE | RENDER_SEMI_TRANSPARENT | RENDER_Z_UPDATE); } else { - render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, sp58, flags); + render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, (unk80068514_arg4 *) gfxData, flags); } if (hasPrimCol) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); @@ -1505,7 +1529,7 @@ void render_3d_model(Object *obj) { s32 hasOpacity; s32 hasEnvCol; s32 flags; - s32 var_v0; + s32 meshBatch; s32 cicFailed; f32 vtxX; f32 vtxY; @@ -1525,7 +1549,7 @@ void render_3d_model(Object *obj) { hasEnvCol = FALSE; intensity = 255; if (obj->unk54 != NULL) { - intensity = (s32) (obj->unk54->unk0 * 255.0f * D_8011AD30); + intensity = (s32) (obj->unk54->unk0 * 255.0f * gCurrentLightIntensity); hasOpacity = TRUE; hasEnvCol = TRUE; } @@ -1550,11 +1574,11 @@ void render_3d_model(Object *obj) { } obj->unk44 = (Vertex *) obj68->unk4[obj68->unk1F]; if (obj->behaviorId == BHV_UNK_3F) { // 63 = stopwatchicon, stopwatchhand - calc_dyn_light_and_env_map_for_object(objModel, obj, 0, D_8011AD30); + calc_dyn_light_and_env_map_for_object(objModel, obj, 0, gCurrentLightIntensity); } else if (flags) { - calc_dyn_light_and_env_map_for_object(objModel, obj, -1, D_8011AD30); + calc_dyn_light_and_env_map_for_object(objModel, obj, -1, gCurrentLightIntensity); } else { - func_800245F0(objModel, obj, D_8011AD30); + func_800245F0(objModel, obj, gCurrentLightIntensity); } } if ((racerObj != NULL) && (racerObj->playerIndex == PLAYER_COMPUTER) && (racerObj->vehicleID < VEHICLE_TRICKY)) { @@ -1607,9 +1631,9 @@ void render_3d_model(Object *obj) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); } if (alpha < 255) { - var_v0 = func_800143A8(objModel, obj, 0, 4, spB0); + meshBatch = func_800143A8(objModel, obj, 0, RENDER_SEMI_TRANSPARENT, spB0); } else { - var_v0 = func_800143A8(objModel, obj, 0, 0, spB0); + meshBatch = func_800143A8(objModel, obj, 0, RENDER_NONE, spB0); } if (obj->segment.header->unk71) { if (hasOpacity) { @@ -1692,17 +1716,17 @@ void render_3d_model(Object *obj) { } } } - if (var_v0 != -1) { + if (meshBatch != -1) { if (obj->segment.header->unk71) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, obj->unk54->unk18, obj->unk54->unk19, obj->unk54->unk1A, alpha); func_8007B43C(); } - func_800143A8(objModel, obj, var_v0, 4, spB0); + func_800143A8(objModel, obj, meshBatch, 4, spB0); if (obj->segment.header->unk71) { func_8007B454(); } } - if ((hasOpacity) || (obj->segment.header->unk71)) { + if (hasOpacity || obj->segment.header->unk71) { gDPSetPrimColor(gObjectCurrDisplayList++, 0, 0, 255, 255, 255, 255); } if (hasEnvCol) { @@ -1739,23 +1763,24 @@ void func_80012CE8(Gfx **dlist) { } /** + * Update the object stack trace, set the draw pointers, then begin rendering the object. * Official Name: objPrintObject */ -void func_80012D5C(Gfx **dlist, MatrixS **mtx, Vertex **verts, Object *object) { +void render_object(Gfx **dList, MatrixS **mtx, Vertex **verts, Object *obj) { f32 scale; - if (object->segment.trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) + if (obj->segment.trans.flags & (OBJ_FLAGS_INVISIBLE | OBJ_FLAGS_SHADOW_ONLY)) return; - func_800B76B8(2, object->unk4A); - gObjectCurrDisplayList = *dlist; + update_object_stack_trace(OBJECT_DRAW, obj->unk4A); + gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; gObjectCurrVertexList = *verts; - scale = object->segment.trans.scale; - render_object(object); - object->segment.trans.scale = scale; - *dlist = gObjectCurrDisplayList; + scale = obj->segment.trans.scale; + render_object_parts(obj); + obj->segment.trans.scale = scale; + *dList = gObjectCurrDisplayList; *mtx = gObjectCurrMatrix; *verts = gObjectCurrVertexList; - func_800B76B8(2, -1); + update_object_stack_trace(OBJECT_DRAW, OBJECT_CLEAR); } @@ -1807,6 +1832,7 @@ void object_undo_player_tumble(Object *obj) { } } +// set_temp_model_transforms #ifdef NON_EQUIVALENT void func_80012F94(Object *obj) { u8 *bossAsset; @@ -1952,28 +1978,37 @@ void func_80012F94(Object *obj) { } } D_8011AD28 = ret1; - D_8011AD30 = ret2; + gCurrentLightIntensity = ret2; } #else GLOBAL_ASM("asm/non_matchings/objects/func_80012F94.s") #endif -void render_object(Object *this) { - func_80012F94(this); - if (this->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - func_800B3740((Particle *) this, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); +/** + * Determine which model type the object is using, then call the related function to render it. + * Beforehand, call a function to apply a temporary transformation, mostly for racers. + * Afterwards, undo that. +*/ +void render_object_parts(Object *obj) { + func_80012F94(obj); + if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { + func_800B3740((Particle *) obj, &gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, 0x8000); } else { - if (this->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) - render_3d_model(this); - else if (this->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) - render_3d_billboard(this); - else if (this->segment.header->modelType == OBJECT_MODEL_TYPE_UNKNOWN4) - func_80011AD0(this); + if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_3D_MODEL) { + render_3d_model(obj); + } else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_SPRITE_BILLBOARD) { + render_3d_billboard(obj); + } else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_MISC) { + render_3d_misc(obj); + } } - func_80013548(this); + unset_temp_model_transforms(obj); } -void func_80013548(Object *obj) { +/** + * After rendering, sets the object position back to normal. +*/ +void unset_temp_model_transforms(Object *obj) { if (!(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && obj->segment.header->behaviorId == BHV_RACER) { obj->segment.trans.x_position -= obj->unk64->racer.carBobX; obj->segment.trans.y_position -= obj->unk64->racer.carBobY; @@ -1983,12 +2018,15 @@ void func_80013548(Object *obj) { GLOBAL_ASM("asm/non_matchings/objects/func_800135B8.s") -void func_800138A8(ObjectTransform *trans, unk80068514_arg4 *arg1, Object *obj, s32 flags) { +/** + * Render the bubble trap weapon. +*/ +void render_bubble_trap(ObjectTransform *trans, Object_68 *gfxData, Object *obj, s32 flags) { f32 x; f32 y; f32 z; ObjectSegment *cameraSegment; - f32 posSq; + f32 dist; f32_vec3_apply_object_rotation(trans, &obj->segment.trans.x_position); obj->segment.trans.x_position += trans->x_position; @@ -1998,17 +2036,17 @@ void func_800138A8(ObjectTransform *trans, unk80068514_arg4 *arg1, Object *obj, x = cameraSegment->trans.x_position - obj->segment.trans.x_position; y = cameraSegment->trans.y_position - obj->segment.trans.y_position; z = cameraSegment->trans.z_position - obj->segment.trans.z_position; - posSq = sqrtf((x * x) + (y * y ) + (z * z)); - if (posSq > 0.0) { - posSq = obj->segment.unk1A / posSq; - x *= posSq; - y *= posSq; - z *= posSq; + dist = sqrtf((x * x) + (y * y) + (z * z)); + if (dist > 0.0) { + dist = obj->segment.unk1A / dist; + x *= dist; + y *= dist; + z *= dist; } obj->segment.trans.x_position += x; obj->segment.trans.y_position += y; obj->segment.trans.z_position += z; - render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, arg1, flags); + render_sprite_billboard(&gObjectCurrDisplayList, &gObjectCurrMatrix, &gObjectCurrVertexList, obj, (unk80068514_arg4 *) gfxData, flags); } /** @@ -2847,7 +2885,11 @@ Object *get_camera_object(s32 cameraIndex) { return (*gCameraObjList)[cameraIndex]; } -Object *func_8001BDD4(Object *obj, s32 *cameraId) { +/** + * Take the current camera passed through the function and compare distances between the next and previous camera. + * Set the camera to be whichever's closest to the object. +*/ +Object *find_nearest_spectate_camera(Object *obj, s32 *cameraId) { Object *nextCamera; Object *prevCamera; Object *currCamera; @@ -3026,7 +3068,11 @@ void update_envmap_position(f32 x, f32 y, f32 z) { gEnvmapPos.z = z; } -void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 arg3) { +/** + * If the triangle batch allows for it, compute envmap normals for the mesh. + * Some objects will prefer some extra additions on top before calculating, like light intensity. +*/ +void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 intensity) { s16 environmentMappingEnabled; s32 dynamicLightingEnabled; s16 i; @@ -3038,19 +3084,19 @@ void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s if (model->batches[i].unk6 != 0xFF) { dynamicLightingEnabled = -1; // This is a bit weird, but I guess it works. } - if (model->batches[i].flags & 0x8000) { + if (model->batches[i].flags & BATCH_FLAGS_ENVMAP) { environmentMappingEnabled = -1; } } if (dynamicLightingEnabled) { // Calculates dynamic lighting for the object - if (object->segment.header->unk71 != 0) { + if (object->segment.header->unk71) { // Dynamic lighting for some objects? (Intro diddy, Taj, T.T., Bosses) - calc_dynamic_lighting_for_object_1(object, model, arg2, object, arg3, 1.0f); + calc_dynamic_lighting_for_object_1(object, model, arg2, object, intensity, 1.0f); } else { // Dynamic lighting for other objects? (Racers, Rare logo, Wizpig face, etc.) - calc_dynamic_lighting_for_object_2(object, model, arg2, arg3); + calc_dynamic_lighting_for_object_2(object, model, arg2, intensity); } } @@ -3147,15 +3193,18 @@ void func_8001E45C(s32 arg0) { if (arg0 != D_8011AE7A) { D_8011AE7A = arg0; D_8011ADAC = 0; - D_8011AE7E = (u8)1; + D_8011AE7E = 1; if (get_render_context() == DRAW_MENU) { set_frame_blackout_timer(); } } } -// Unused? -s32 func_8001E4B4(void) { +/** + * Returns the index of the standard object list. + * Goes unused, since objGetObjList exists +*/ +UNUSED s32 get_object_list_index(void) { return D_8011AE60; } @@ -3332,7 +3381,7 @@ void init_racer_for_challenge(s32 vehicleID) { Object_Racer *racer; D_8011AEF7 = 3; - racer = &get_racer_object(0)->unk64->racer; + racer = &get_racer_object(PLAYER_ONE)->unk64->racer; racer->courseCheckpoint = 0; racer->checkpoint = 0; racer->lap = 0; @@ -3431,8 +3480,9 @@ GLOBAL_ASM("asm/non_matchings/objects/func_800235DC.s") /** * Run when an object is created. * Used to do one-time things like initialising variables + * Arg2 is always zero. Effectively unused. */ -void run_object_init_func(Object *obj, void *entry, s32 arg2) { +void run_object_init_func(Object *obj, void *entry, s32 param) { obj->behaviorId = obj->segment.header->behaviorId; switch (obj->behaviorId) { case BHV_RACER: @@ -3445,7 +3495,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_fish(obj, (LevelObjectEntry_Fish *) entry); break; case BHV_ANIMATOR: - obj_init_animator(obj, (LevelObjectEntry_Animator *) entry, arg2); + obj_init_animator(obj, (LevelObjectEntry_Animator *) entry, param); break; case BHV_SMOKE: obj_init_smoke(obj, (LevelObjectEntry_Smoke *) entry); @@ -3479,7 +3529,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_dino_whale(obj, (LevelObjectEntry_Dino_Whale *) entry); break; case BHV_CHECKPOINT: - obj_init_checkpoint(obj, (LevelObjectEntry_Checkpoint *) entry, arg2); + obj_init_checkpoint(obj, (LevelObjectEntry_Checkpoint *) entry, param); break; case BHV_MODECHANGE: obj_init_modechange(obj, (LevelObjectEntry_ModeChange *) entry); @@ -3516,7 +3566,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_torch_mist(obj, (LevelObjectEntry_Torch_Mist *) entry); break; case BHV_TEXTURE_SCROLL: - obj_init_texscroll(obj, (LevelObjectEntry_TexScroll *) entry, arg2); + obj_init_texscroll(obj, (LevelObjectEntry_TexScroll *) entry, param); break; case BHV_STOPWATCH_MAN: obj_init_stopwatchman(obj, (LevelObjectEntry_StopWatchMan *) entry); @@ -3525,13 +3575,13 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_banana(obj, (LevelObjectEntry_Banana *) entry); break; case BHV_LIGHT_RGBA: - obj_init_rgbalight(obj, (LevelObjectEntry_RgbaLight *) entry, arg2); + obj_init_rgbalight(obj, (LevelObjectEntry_RgbaLight *) entry, param); break; case BHV_BUOY_PIRATE_SHIP: - obj_init_buoy_pirateship(obj, (LevelObjectEntry_Buoy_PirateShip *) entry, arg2); + obj_init_buoy_pirateship(obj, (LevelObjectEntry_Buoy_PirateShip *) entry, param); break; case BHV_LOG: - obj_init_log(obj, (LevelObjectEntry_Log *) entry, arg2); + obj_init_log(obj, (LevelObjectEntry_Log *) entry, param); break; case BHV_WEATHER: obj_init_weather(obj, (LevelObjectEntry_Weather *) entry); @@ -3577,7 +3627,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_unknown58(obj, (LevelObjectEntry_Unknown58 *) entry); break; case BHV_WAVE_GENERATOR: - obj_init_wavegenerator(obj, (LevelObjectEntry_WaveGenerator *) entry, arg2); + obj_init_wavegenerator(obj, (LevelObjectEntry_WaveGenerator *) entry, param); break; case BHV_BUTTERFLY: obj_init_butterfly(obj, (LevelObjectEntry_Butterfly *) entry); @@ -3666,7 +3716,7 @@ void run_object_init_func(Object *obj, void *entry, s32 arg2) { obj_init_wardensmoke(obj, (LevelObjectEntry_WardenSmoke *) entry); break; case BHV_UNK_5E: - obj_init_unknown94(obj, (LevelObjectEntry_Unknown94 *) entry, arg2); + obj_init_unknown94(obj, (LevelObjectEntry_Unknown94 *) entry, param); break; case BHV_TELEPORT: obj_init_teleport(obj, (LevelObjectEntry_Teleport *) entry); @@ -3830,7 +3880,7 @@ s32 func_80023E30(s32 objectID) { * One big switch statement for whichever object. */ void run_object_loop_func(Object *obj, s32 updateRate) { - func_800B76B8(1, obj->unk4A); + update_object_stack_trace(OBJECT_UPDATE, obj->unk4A); switch (obj->behaviorId) { case BHV_SCENERY: obj_loop_scenery(obj, updateRate); @@ -4071,7 +4121,7 @@ void run_object_loop_func(Object *obj, s32 updateRate) { obj_loop_levelname(obj, updateRate); break; } - func_800B76B8(1, -1); + update_object_stack_trace(OBJECT_UPDATE, OBJECT_CLEAR); } UNUSED void func_8002458C(UNUSED s32 arg0) { diff --git a/src/objects.h b/src/objects.h index a8573159..d6668168 100644 --- a/src/objects.h +++ b/src/objects.h @@ -116,7 +116,7 @@ enum ObjectBehaviours { BHV_HIT_TESTER_4, BHV_RANGE_TRIGGER, BHV_UNK_6A, - BHV_UNK_6B, + BHV_BOSS_HAZARD_TRIGGER, BHV_FIREBALL_OCTOWEAPON, BHV_FROG, BHV_SILVER_COIN_2, @@ -265,7 +265,7 @@ typedef struct TTGhostTable { typedef struct ObjectTransformExt { ObjectTransform trans; - s16 unk18; + s16 animFrame; s16 unk1A; } ObjectTransformExt; @@ -303,7 +303,7 @@ extern s32 osCicId; // Used for an Anti-Piracy check in render_3d_model Object *func_8000BF44(s32 arg0); void allocate_object_pools(void); -void func_8000C460(void); +void clear_object_pointers(void); void func_8000C604(void); s32 normalise_time(s32 timer); void func_8000CBC0(void); @@ -336,13 +336,13 @@ s32 get_race_start_timer(); s32 func_800113BC(); s32 ignore_bounds_check(void); void func_80012C30(void); -void func_80012C3C(Gfx** dlist); -void func_80012C98(Gfx **dlist); -void func_80012CE8(Gfx **dlist); -void func_80012D5C(Gfx **dlist, MatrixS **mtx, Vertex **verts, Object *object); +void func_80012C3C(Gfx** dList); +void func_80012C98(Gfx **dList); +void func_80012CE8(Gfx **dList); +void render_object(Gfx **dList, MatrixS **mtx, Vertex **verts, Object *obj); void object_undo_player_tumble(Object *obj); -void render_object(Object *this); -void func_80013548(Object *arg0); +void render_object_parts(Object *obj); +void unset_temp_model_transforms(Object *arg0); void func_800142B8(void); u32 func_800179D0(void); void set_taj_challenge_type(s32 arg0); @@ -373,10 +373,9 @@ void func_8001D1AC(void); void func_8001D1BC(s32 arg0); Object *func_8001D1E4(s32 *arg0); Object *func_8001D214(s32 arg0); -void func_8001D23C(s32 arg0, s32 arg1, s32 arg2); void func_8001D258(f32 arg0, f32 arg1, s16 arg2, s16 arg3, s16 arg4); void func_8001D4B4(s32*, f32, f32, s16, s16, s16); -void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 arg3); +void calc_dyn_light_and_env_map_for_object(ObjectModel *model, Object *object, s32 arg2, f32 intensity); s32 *get_misc_asset(s32 index); s32 func_8001E2EC(s32 arg0); void func_8001E344(s32 arg0); @@ -384,7 +383,7 @@ void func_8001E36C(s32 arg0, f32 *arg1, f32 *arg2, f32 *arg3); s16 func_8001E440(); void func_8001E450(s32 arg0); void func_8001E45C(s32 arg0); -s32 func_8001E4B4(void); +s32 get_object_list_index(void); s8 func_8001F3B8(void); void func_8001F3C8(s32 arg0); void func_8001F450(void); @@ -416,7 +415,7 @@ void update_envmap_position(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 flags, u32 offset, f32 arg8); +void render_misc_model(Object *obj, Vertex *verts, u32 numVertices, Triangle *triangles, u32 numTriangles, TextureHeader *tex, u32 flags, u32 offset, f32 yScale); void func_8000B290(void); void func_80016BC4(Object *obj); s32 func_8001C48C(Object *obj); @@ -426,16 +425,17 @@ s32 func_8000FD34(Object *arg0, Object_5C *arg1); void func_8000E4E8(s32 index); void objFreeAssets(Object *obj, s32 count, s32 objType); void func_8001709C(Object *obj); -s32 func_800113CC(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoundId); -void func_80011AD0(Object *this); -Object *func_8001BDD4(Object *obj, s32 *cameraID); +s32 play_footstep_sounds(Object *obj, s32 arg1, s32 frame, s32 oddSoundId, s32 evenSoundId); +void render_3d_misc(Object *this); +Object *find_nearest_spectate_camera(Object *obj, s32 *cameraID); s32 init_object_shadow(Object *obj, ShadowData *shadow); s32 func_800143A8(ObjectModel *objModel, Object *obj, s32 startIndex, s32 flags, s32 someBool); +void render_bubble_trap(ObjectTransform *trans, Object_68 *gfxData, Object *obj, s32 flags); +void gParticlePtrList_flush(void); //Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); void calc_dynamic_lighting_for_object_2(Object *, ObjectModel *, s16, f32); -void gParticlePtrList_flush(void); void decrypt_magic_codes(s32 *arg0, s32 length); s32 func_80014814(s32 *); void func_80015348(s32, s32); @@ -448,7 +448,6 @@ void func_80022E18(s32); /* extern */ void func_80018CE0(Object* obj, f32 xPos, f32 yPos, f32 zPos, s32 updateRate); /* extern */ s32 func_800185E4(s8, Object* obj, f32 xPos, f32 yPos, f32 zPos, f32* checkpointDistance, u8*); /* extern */ void func_80011134(Object *, s32); -void func_800138A8(ObjectTransform*, unk80068514_arg4*, Object *, s32); Object *func_8002342C(f32 x, f32 z); void func_8006017C(s32); void func_80012F94(Object *); diff --git a/src/particles.c b/src/particles.c index 8f12244c..8edad952 100644 --- a/src/particles.c +++ b/src/particles.c @@ -1479,7 +1479,7 @@ void func_800B3740(Particle *particle, Gfx **dlist, MatrixS **mtx, Vertex **vtx, if (particle->segment.camera.unk3A > 0) { gDPSetPrimColor((*dlist)++, 0, 0, particle->unk4A, particle->unk4A, particle->unk4A, 255); if (particle->unk77 == 0) { - func_800B3E64(particle); + func_800B3E64((Object *) particle); } sp30 = (unk800B0698_44 *) particle->unk44_0; temp = particle->unk75; diff --git a/src/racer.c b/src/racer.c index e5c96d3e..89936a8a 100644 --- a/src/racer.c +++ b/src/racer.c @@ -1289,7 +1289,7 @@ void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } i = racer->unk1D2; if (gCurrentPlayerIndex == PLAYER_COMPUTER && !func_80023568()) { - func_80055A84(obj, racer, updateRate); + onscreen_ai_racer_physics(obj, racer, updateRate); } else { func_80054FD0(obj, racer, updateRate); } @@ -1469,7 +1469,7 @@ void racer_attack_handler_hovercraft(Object *obj, Object_Racer *racer) { break; // Running into a bubble trap. case ATTACK_BUBBLE: - racer->unk204 = 0x78; + racer->bubbleTrapTimer = 120; obj->segment.x_velocity *= 0.7; if (obj->segment.y_velocity > 2.0f) { obj->segment.y_velocity = 2.0f; @@ -1759,7 +1759,7 @@ void racer_attack_handler_plane(Object *obj, Object_Racer *racer) { } break; case ATTACK_BUBBLE: - racer->unk204 = 120; + racer->bubbleTrapTimer = 120; obj->segment.x_velocity *= 0.7; obj->segment.z_velocity *= 0.7; break; @@ -2301,7 +2301,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_WEIGHT); gCurrentRacerWeightStat = gCurrentRacerMiscAssetPtr[tempRacer->characterId] * 0.45; - if (tempRacer->unk204 > 0) { + if (tempRacer->bubbleTrapTimer > 0) { gCurrentRacerWeightStat = -0.02f; } gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_HANDLING); @@ -2313,7 +2313,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } if (tempRacer->unk1FE == 1) { gCurrentRacerWeightStat -= (gCurrentRacerWeightStat * tempRacer->unk1FF) / 128; - if (tempRacer->unk204 > 0) { + if (tempRacer->bubbleTrapTimer > 0) { gCurrentRacerWeightStat = -gCurrentRacerWeightStat; } } @@ -2377,7 +2377,7 @@ void update_player_racer(Object *obj, s32 updateRate) { if (!(gCurrentRacerInput & A_BUTTON)) { tempRacer->throttleReleased = TRUE; } - if (check_if_showing_cutscene_camera() || gRaceStartTimer == 100 || tempRacer->unk1F1 || gRacerInputBlocked || tempRacer->approachTarget || tempRacer->unk204 > 0) { + if (check_if_showing_cutscene_camera() || gRaceStartTimer == 100 || tempRacer->unk1F1 || gRacerInputBlocked || tempRacer->approachTarget || tempRacer->bubbleTrapTimer > 0) { gCurrentStickX = 0; gCurrentStickY = 0; gCurrentRacerInput = 0; @@ -2385,8 +2385,8 @@ void update_player_racer(Object *obj, s32 updateRate) { gCurrentButtonsReleased = 0; tempRacer->steerAngle = 0; } - if (tempRacer->unk204 > 0) { - tempRacer->unk204 -= updateRate; + if (tempRacer->bubbleTrapTimer > 0) { + tempRacer->bubbleTrapTimer -= updateRate; tempRacer->velocity *= 0.9f; //!@Delta obj->segment.x_velocity *= 0.87f; //!@Delta if (obj->segment.y_velocity > 2.0f) { @@ -3877,7 +3877,7 @@ void racer_attack_handler_car(Object *obj, Object_Racer *racer, s32 updateRate) break; // Running into a bubble trap. case ATTACK_BUBBLE: - racer->unk204 = 0x78; + racer->bubbleTrapTimer = 120; racer->velocity *= 0.5; break; // This goes unused. @@ -4004,7 +4004,7 @@ void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, racer_approach_object(obj, racer, updateRateF); } if (gCurrentPlayerIndex == PLAYER_COMPUTER && !func_80023568()) { - func_80055A84(obj, racer, updateRate); + onscreen_ai_racer_physics(obj, racer, updateRate); } else { func_80054FD0(obj, racer, updateRate); } @@ -4207,7 +4207,11 @@ void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate GLOBAL_ASM("asm/non_matchings/racer/func_80054FD0.s") -void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { +/** + * Update the collision of the racer. + * Also update wheel contacts and hitbox size. +*/ +void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { f32 angleZ; f32 distance; s32 hasCollision; @@ -4288,7 +4292,7 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { if (temp_v1_2 < 0x2000 && temp_v1_2 > -0x2000) { racer->x_rotation_vel = temp_v1_2; } - xRot = -(s16)(u16)arctan2_f(zTemp, yTemp); + xRot = -(s16) (u16) arctan2_f(zTemp, yTemp); if ((xRot < 0x2000) && (xRot > -0x2000)) { obj->segment.trans.x_rotation = xRot; } @@ -5335,8 +5339,8 @@ void update_camera_finish_race(UNUSED f32 updateRate, Object *obj, Object_Racer f32 distance; cameraID = racer->spectateCamID; - cam = func_8001BDD4(obj, &cameraID); - if (!cam) { + cam = find_nearest_spectate_camera(obj, &cameraID); + if (cam == NULL) { gCameraObject->mode = CAMERA_FINISH_CHALLENGE; return; } @@ -5794,7 +5798,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_WEIGHT); gCurrentRacerWeightStat = gCurrentRacerMiscAssetPtr[racer->characterId] * 0.45; - if (racer->unk204 > 0) { + if (racer->bubbleTrapTimer > 0) { gCurrentRacerWeightStat = -0.02f; } gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_HANDLING); @@ -5842,8 +5846,8 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat var_fv1 = (var_fv1 * var_fv1) + (temp_f0 * temp_f0); } } - if (racer->unk204 > 0) { - racer->unk204 -= updateRate; + if (racer->bubbleTrapTimer > 0) { + racer->bubbleTrapTimer -= updateRate; racer->velocity *= 0.8f; //!@Delta } if (racer->unk206 > 0) { @@ -5863,7 +5867,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat } if (racer->unk1FE == 1) { gCurrentRacerWeightStat -= ((gCurrentRacerWeightStat * racer->unk1FF) / 128); - if (racer->unk204 > 0) { + if (racer->bubbleTrapTimer > 0) { gCurrentRacerWeightStat = -gCurrentRacerWeightStat; } gCurrentStickY = 60; @@ -5892,7 +5896,7 @@ void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updat gRacerWaveCount = func_8002B0F4(obj->segment.object.segmentID, obj->segment.trans.x_position, obj->segment.trans.z_position, &gRacerCurrentWave); } func_8002ACC8(0); - if ((racer->approachTarget != NULL) || (gRaceStartTimer != 0) || (racer->unk204 > 0)) { + if (racer->approachTarget != NULL || gRaceStartTimer != 0 || racer->bubbleTrapTimer > 0) { gCurrentStickX = 0; gCurrentStickY = 0; gCurrentRacerInput = 0; diff --git a/src/racer.h b/src/racer.h index c8f6f032..f09ccf5b 100644 --- a/src/racer.h +++ b/src/racer.h @@ -175,7 +175,7 @@ void racer_set_dialogue_camera(void); void compare_balloon_checksums(void); void antipiracy_modify_surface_traction_table(void); s32 turn_head_towards_object(Object *obj, Object_Racer *racer, Object *targetObj, f32 distance); -void func_80055A84(Object *obj, Object_Racer *racer, s32 arg2); +void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, s32 arg2); void func_8005C270(Object_Racer *racer); f32 handle_racer_top_speed(Object *obj, Object_Racer *racer); void play_random_character_voice(Object *obj, s32 soundID, s32 range, s32 arg3); @@ -194,7 +194,7 @@ void racer_approach_object(Object *obj, Object_Racer *racer, f32 divisor); void obj_init_racer(Object *obj, LevelObjectEntry_Racer *racer); void racer_AI_pathing_inputs(Object *obj, Object_Racer *racer, s32 updateRate); void func_80043ECC(Object *obj, Object_Racer *racer, s32 updateRate); -void func_80055A84(Object *obj, Object_Racer *racer, s32 updateRate); +void onscreen_ai_racer_physics(Object *obj, Object_Racer *racer, s32 updateRate); void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRate); void racer_spinout_car(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF); void racer_attack_handler_car(Object* obj, Object_Racer* racer, s32 updateRate); diff --git a/src/screen_asset.h b/src/screen_asset.h index 71c014b3..fa4c6875 100644 --- a/src/screen_asset.h +++ b/src/screen_asset.h @@ -11,7 +11,4 @@ #define SCREEN_HEIGHT_PART 6 -UNUSED u32 load_screen(s32 screenIndex); -UNUSED void render_screen(Gfx **dlist, u8 *screenAddress); - #endif diff --git a/src/stacks.c b/src/stacks.c index 096b8a78..3393e657 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -13,7 +13,7 @@ UNUSED u8 D_8012A9B0[0x100]; u16 D_80129BB0[512]; // epcStack? -s32 D_80129FB0[3]; +s32 gObjectStackTrace[3]; s32 D_80129FBC; /******************************/ diff --git a/src/stacks.h b/src/stacks.h index c1bbea65..51e1bcff 100644 --- a/src/stacks.h +++ b/src/stacks.h @@ -7,7 +7,7 @@ extern u8 D_8012A9B0[0x100]; extern u16 D_80129BB0[512]; -extern s32 D_80129FB0[3]; +extern s32 gObjectStackTrace[3]; extern s32 D_80129FBC; #endif diff --git a/src/textures_sprites.h b/src/textures_sprites.h index 8ffc9141..b6f0f7b4 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -64,7 +64,7 @@ enum RenderFlags { RENDER_UNK_1000000 = (1 << 24), RENDER_UNK_2000000 = (1 << 25), RENDER_UNK_4000000 = (1 << 26), - RENDER_VTX_ALPHA = (1 << 27), // Allows use of vertex alpha, disabling fog if necessary. + RENDER_VTX_ALPHA = (1 << 27) // Allows use of vertex alpha, disabling fog if necessary. }; typedef enum TransFlags { @@ -84,7 +84,7 @@ typedef enum TransFlags { OBJ_FLAGS_SHADOW_ONLY = (1 << 12), // Still has a shadow, but the model is invisible. OBJ_FLAGS_UNK_2000 = (1 << 13), OBJ_FLAGS_INVISIBLE = (1 << 14), // Invisible, and hidden shadow too. - OBJ_FLAGS_DEACTIVATED = (1 << 15), // Object is invisible and inactive. + OBJ_FLAGS_DEACTIVATED = (1 << 15) // Object is invisible and inactive. } TransFlags; #define TEX_TABLE_2D 0 diff --git a/src/thread0_epc.c b/src/thread0_epc.c index c8262191..a1c8ee8f 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -51,7 +51,7 @@ void thread0_create(void) { osCreateThread(&gEPCThread, 0, thread0_Main, 0, &gEPCStack[0x200], OS_PRIORITY_MAX); osStartThread(&gEPCThread); for (i = 0; i < 3; i++) { - D_80129FB0[i] = -1; + gObjectStackTrace[i] = -1; } } @@ -123,9 +123,9 @@ void func_800B7460(s32 *epc, s32 size, s32 mask) { sp840.a1 = mask; sp840.epc = epc; sp840.cause = -1; - sp840.unk130[0] = D_80129FB0[0]; - sp840.unk130[1] = D_80129FB0[1]; - sp840.unk130[2] = D_80129FB0[2]; + sp840.objectStackTrace[0] = gObjectStackTrace[0]; + sp840.objectStackTrace[1] = gObjectStackTrace[1]; + sp840.objectStackTrace[2] = gObjectStackTrace[2]; bcopy(&sp840, &sp40, sizeof(epcInfo)); bzero(&sp240, 0x200); v0 = func_80024594(&sp38, &size); @@ -144,9 +144,13 @@ void func_800B7460(s32 *epc, s32 size, s32 mask) { GLOBAL_ASM("asm/non_matchings/thread0_epc/func_800B7460.s") #endif -void func_800B76B8(s32 arg0, s32 arg1) { - if ((arg0 >= 0) && (arg0 < 3)) { - D_80129FB0[arg0] = arg1; +/** + * Mark the object type given, so if the game crashes while processing it, the debug screen will tell you which object ID is to blame. + * Split into three sections, for spawning an object, updating an object and for rendering an object. +*/ +void update_object_stack_trace(s32 index, s32 value) { + if (index >= OBJECT_SPAWN && index <= OBJECT_DRAW) { + gObjectStackTrace[index] = value; } } @@ -182,7 +186,10 @@ s32 get_lockup_status(void) { return sLockupStatus; } -/* Official name: diCpuTraceTick */ +/** + * Counts up. Automatically switches page every second. + * Official name: diCpuTraceTick +*/ void lockup_screen_loop(s32 updateRate) { sLockupDelay += updateRate; if (sLockupDelay > 60) { @@ -201,7 +208,7 @@ void lockup_screen_loop(s32 updateRate) { */ void render_epc_lock_up_display(void) { u16 *temp; - char *sp50[3] = {"setup", "control", "print"}; + char *objStatusString[3] = {"setup", "control", "print"}; s32 offset; s32 s3; s32 j; @@ -215,19 +222,19 @@ void render_epc_lock_up_display(void) { switch (sLockupPage) { case EPC_PAGE_REGISTER: - D_80129FB0[0] = gEpcInfo.unk130[0]; - D_80129FB0[1] = gEpcInfo.unk130[1]; - D_80129FB0[2] = gEpcInfo.unk130[2]; - if (((u32 *) gEpcInfo.unk130)[-4] == -1U) { // TODO: find better solution + gObjectStackTrace[OBJECT_SPAWN] = gEpcInfo.objectStackTrace[OBJECT_SPAWN]; + gObjectStackTrace[OBJECT_UPDATE] = gEpcInfo.objectStackTrace[OBJECT_UPDATE]; + gObjectStackTrace[OBJECT_DRAW] = gEpcInfo.objectStackTrace[OBJECT_DRAW]; + if (((u32 *) gEpcInfo.objectStackTrace)[-4] == -1U) { // TODO: find better solution render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); render_printf(" cause\t\tmmAlloc(%d,0x%8x)\n", GET_REG(a0), GET_REG(a1)); for (i = 0; i < 3; i++) { - if (D_80129FB0[i] != -1) { + if (gObjectStackTrace[i] != OBJECT_CLEAR) { if (!s3) { s3 = TRUE; render_printf(" object\t\t"); } - render_printf("%s %d ", sp50[i], D_80129FB0[i]); + render_printf("%s %d ", objStatusString[i], gObjectStackTrace[i]); } } render_printf("\n"); @@ -240,12 +247,12 @@ void render_epc_lock_up_display(void) { render_printf(" sr\t\t0x%08x\n", gEpcInfo.sr); render_printf(" badvaddr\t0x%08x\n", gEpcInfo.badvaddr); for (i = 0; i < 3; i++) { - if (D_80129FB0[i] != -1) { + if (gObjectStackTrace[i] != OBJECT_CLEAR) { if (!s3) { s3 = TRUE; render_printf(" object\t\t"); } - render_printf("%s %d ", sp50[i], D_80129FB0[i]); + render_printf("%s %d ", objStatusString[i], gObjectStackTrace[i]); } } render_printf("\n"); diff --git a/src/thread0_epc.h b/src/thread0_epc.h index 96650bd8..49eb0afd 100644 --- a/src/thread0_epc.h +++ b/src/thread0_epc.h @@ -54,7 +54,7 @@ typedef struct epcInfo { /* 0x124 */ s32 badvaddr; /* 0x128 */ s32 unk128; /* 0x12C */ s32 unk12C; -/* 0x130 */ f32 unk130[3]; +/* 0x130 */ f32 objectStackTrace[3]; /* 0x13C */ u8 pad13C[0x74]; } epcInfo; @@ -77,9 +77,16 @@ enum EPCScreenPage { EPC_PAGE_EXIT }; +enum ObjectStackTraceID { + OBJECT_CLEAR = -1, + OBJECT_SPAWN, + OBJECT_UPDATE, + OBJECT_DRAW +}; + void func_800B70D0(void); void func_800B7144(void); -void func_800B76B8(s32 arg0, s32 arg1); +void update_object_stack_trace(s32 arg0, s32 arg1); s32 get_lockup_status(void); void lockup_screen_loop(s32 arg0); void thread0_create(void); diff --git a/src/thread3_main.h b/src/thread3_main.h index edf8e118..9755e1c5 100644 --- a/src/thread3_main.h +++ b/src/thread3_main.h @@ -70,7 +70,6 @@ void func_8006D8E0(s32 arg0); void func_8006D8F0(s32 arg0); void func_8006D968(s8 *arg0); RenderContext get_render_context(void); -UNUSED void func_8006DA1C(s32 arg0); void load_menu_with_level_background(s32 menuId, s32 levelId, s32 cutsceneId); void set_level_default_vehicle(Vehicle arg0); void func_8006DB20(Vehicle vehicleId); diff --git a/src/unknown_0255E0.c b/src/unknown_0255E0.c index 556fbfcb..bd51c8df 100644 --- a/src/unknown_0255E0.c +++ b/src/unknown_0255E0.c @@ -194,6 +194,7 @@ s32 set_scene_viewport_num(s32 numPorts) { return 0; } +// track_init #ifdef NON_EQUIVALENT void func_8002C0C4(s32 modelId); void func_800249F0(u32 arg0, u32 arg1, s32 arg2, Vehicle vehicle, u32 arg4, u32 arg5, u32 arg6) { @@ -807,7 +808,7 @@ void render_skydome(void) { func_80068408(&gSceneCurrDisplayList, &gSceneCurrMatrix); if (gSceneRenderSkyDome) { - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, gSkydomeSegment); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, gSkydomeSegment); } } @@ -930,12 +931,12 @@ void render_level_geometry_and_objects(void) { } if (obj != NULL && visible == 255 && check_if_in_draw_range(obj) && (objectsVisible[obj->segment.object.segmentID + 1] || obj->segment.camera.unk34 > 1000.0)) { if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { render_object_shadow(obj, obj->shadow); } - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); if (obj->unk58 != NULL && obj->segment.header->unk30 & 0x10) { func_8002D670(obj, obj->unk58); } @@ -952,12 +953,12 @@ void render_level_geometry_and_objects(void) { } if (obj != NULL && visible && objFlags & OBJ_FLAGS_UNK_0100 && objectsVisible[obj->segment.object.segmentID + 1] && check_if_in_draw_range(obj)) { if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { render_object_shadow(obj, obj->shadow); } - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); if ((obj->unk58 != NULL) && (obj->segment.header->unk30 & 0x10)) { func_8002D670(obj, obj->unk58); } @@ -984,25 +985,25 @@ void render_level_geometry_and_objects(void) { visible = 255; objFlags = obj->segment.trans.flags; if (objFlags & OBJ_FLAGS_UNK_0080) { - visible = TRUE; + visible = 1; } else if (!(objFlags & OBJ_FLAGS_DEACTIVATED)) { visible = obj->segment.object.opacity; } if (objFlags & visibleFlags) { - visible = FALSE; + visible = 0; } if (obj->behaviorId == BHV_RACER && visible >= 255) { - visible = FALSE; + visible = 0; } if (obj != NULL && visible < 255 && objectsVisible[obj->segment.object.segmentID + 1] && check_if_in_draw_range(obj)) { if (visible > 0) { if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); goto skip; } else if (obj->shadow != NULL) { render_object_shadow(obj, obj->shadow); } - func_80012D5C(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); + render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); if ((obj->unk58 != 0) && (obj->segment.header->unk30 & 0x10)) { func_8002D670(obj, obj->unk58); } diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index deec7ec7..fdae567d 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -14,7 +14,7 @@ /************ .data ************/ -u16 D_800DCE00[16] = { +u16 gBlueyVoiceTable[16] = { SOUND_VOICE_BLUEY_EH3, SOUND_VOICE_BLUEY_EH, SOUND_VOICE_BLUEY_OHNO, @@ -33,94 +33,83 @@ u16 D_800DCE00[16] = { SOUND_NONE, }; -u16 D_800DCE20[16] = { - SOUND_VOICE_BOSS_LAUGH2, - SOUND_VOICE_TRICKY_HM, - SOUND_VOICE_TRICKY_HMMM, - SOUND_VOICE_WIZPIG_HA, - SOUND_VOICE_WIZPIG_H2, - SOUND_VOICE_SMOKEY_EH, - SOUND_VOICE_SMOKEY_HEH, - SOUND_VOICE_SMOKEY_HAH, - SOUND_VOICE_SMOKEY_LAUGH, - SOUND_VOICE_SMOKEY_HM, - SOUND_VOICE_SMOKEY_HM2, - SOUND_VOICE_CONKER_YEHAHA, - SOUND_VOICE_TIMBER_WOW, - SOUND_WHOOSH2, - SOUND_NONE, - SOUND_NONE, -}; - /*******************************/ /************ .bss ************/ -s8 D_8011D5D0; -s8 D_8011D5D1; +s8 gBlueyCutsceneTimer; +s8 gBlueyStartBoost; /******************************/ +enum BlueAnimations { + ANIM_BLUEY_RUN, + ANIM_BLUEY_WALK, + ANIM_BLUEY_IDLE, + ANIM_BLUEY_TURN, + ANIM_BLUEY_DAMAGE +}; + /** * Top level function for the Bluey vehicle, as seen in the Snowflake Mountain boss stage. */ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer) { - s16 sp5E; - s16 sp5C; - s16 sp5A; + s16 animID; + s16 animFrame; + s16 tempHeadAngle; f32 diffX; f32 diffZ; - s32 var_v0; - s32 sp48; + s32 steerVel; + s32 tempStartTimer; ObjectModel *objModel; - Object_68 *obj68; + Object_68 *gfxData; s32 sp3C; UNUSED s32 pad; Object *firstRacerObj; - set_boss_voice_clip_offset(D_800DCE00); + set_boss_voice_clip_offset(gBlueyVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - sp5E = obj->segment.object.animationID; - sp5C = obj->segment.animFrame; - sp5A = racer->headAngle; + animID = obj->segment.object.animationID; + animFrame = obj->segment.animFrame; + tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE && func_80023568()) { func_80021400(130); racer->raceFinished++; } - sp48 = *startTimer; - if (sp48 == 100) { - D_8011D5D0 = 0; + tempStartTimer = *startTimer; + if (tempStartTimer == 100) { + gBlueyCutsceneTimer = 0; } if (racer->playerIndex == PLAYER_COMPUTER) { if (*startTimer != 100) { *startTimer -= 15; if (*startTimer < 0) { - if (D_8011D5D1 == 0) { - func_8005CB04(0); + if (gBlueyStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); racer->boostTimer = 3; } - D_8011D5D1 = 1; + gBlueyStartBoost = TRUE; *startTimer = 0; *input |= A_BUTTON; } else { - D_8011D5D1 = 0; + gBlueyStartBoost = FALSE; } } } func_8004F7F4(updateRate, updateRateF, obj, racer); - *startTimer = sp48; + *startTimer = tempStartTimer; racer->lateral_velocity = 0.0f; - racer->headAngle = sp5A; - obj->segment.object.animationID = (s8) sp5E; - obj->segment.animFrame = sp5C; + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; + obj->segment.animFrame = animFrame; if (racer->attackType != ATTACK_NONE) { - if (obj->segment.object.animationID != 4) { + if (obj->segment.object.animationID != ANIM_BLUEY_DAMAGE) { racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = 4; - racer->unkC = 0.0f; - func_8005CB04(1); + obj->segment.object.animationID = ANIM_BLUEY_DAMAGE; + racer->animationSpeed = 0.0f; + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); racer->attackType = ATTACK_NONE; @@ -137,89 +126,88 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra if ((find_next_checkpoint_node(racer->checkpoint, racer->unk1C8))->unk36[racer->unk1CA] == 1) { sp3C = TRUE; } - if (obj->segment.object.animationID != 4) { + if (obj->segment.object.animationID != ANIM_BLUEY_DAMAGE) { if (racer->velocity < -2.0) { if (sp3C) { if (racer->unk1CD != 3) { - racer->unkC = 40.0f; + racer->animationSpeed = 40.0f; } - obj->segment.object.animationID = 3; - var_v0 = racer->steerAngle; - var_v0 *= 2; - var_v0 = 40 - var_v0; - if (var_v0 < 0) { - var_v0 = 0; + obj->segment.object.animationID = ANIM_BLUEY_TURN; + steerVel = racer->steerAngle * 2; + steerVel = 40 - steerVel; + if (steerVel < 0) { + steerVel = 0; } - if (var_v0 > 73) { - var_v0 = 73; + if (steerVel > 73) { + steerVel = 73; } racer->unk1CD = 3; - racer->unkC += (var_v0 - racer->unkC) * 0.25; + racer->animationSpeed += (steerVel - racer->animationSpeed) * 0.25; } else { racer->unk1CD = 0; - obj->segment.object.animationID = 0; - racer->unkC -= (racer->velocity * updateRateF) * 0.5; + obj->segment.object.animationID = ANIM_BLUEY_RUN; + racer->animationSpeed -= (racer->velocity * updateRateF) * 0.5; } } else if (racer->velocity < -0.1 || 0.1 < racer->velocity) { racer->unk1CD = 1; - obj->segment.object.animationID = 1; - racer->unkC -= racer->velocity * updateRateF * 2; + obj->segment.object.animationID = ANIM_BLUEY_WALK; + racer->animationSpeed -= racer->velocity * updateRateF * 2; } else { racer->unk1CD = 2; - obj->segment.object.animationID = 2; - racer->unkC += updateRateF * 1.0; + obj->segment.object.animationID = ANIM_BLUEY_IDLE; + racer->animationSpeed += updateRateF * 1.0; } } else { - racer->unkC += updateRateF * 1.0; + racer->animationSpeed += updateRateF * 1.0; } - obj68 = *obj->unk68; - objModel = obj68->objModel; + gfxData = *obj->unk68; + objModel = gfxData->objModel; diffX = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; - while (racer->unkC < 0.0f) { - racer->unkC += diffX; - obj68->unk10 = -1; + while (racer->animationSpeed < 0.0f) { + racer->animationSpeed += diffX; + gfxData->unk10 = -1; } - while (diffX < racer->unkC) { - racer->unkC -= diffX; - obj68->unk10 = -1; + while (diffX < racer->animationSpeed) { + racer->animationSpeed -= diffX; + gfxData->unk10 = -1; } - if ((obj68->unk10 == -1) && (obj->segment.object.animationID == 4)) { + if (gfxData->unk10 == -1 && obj->segment.object.animationID == ANIM_BLUEY_DAMAGE) { obj->segment.object.animationID = racer->unk1CD; } - sp5C = obj->segment.animFrame; - obj->segment.animFrame = racer->unkC; + animFrame = obj->segment.animFrame; + obj->segment.animFrame = racer->animationSpeed; obj->unk74 = 0; - if (obj->segment.object.animationID == 0) { - func_800113CC(obj, 2, sp5C, SOUND_STOMP2, SOUND_STOMP3); + if (obj->segment.object.animationID == ANIM_BLUEY_RUN) { + play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); obj->unk74 |= 3; } func_800AFC3C(obj, updateRate); - fade_when_near_camera(obj, racer, 0x28); - firstRacerObj = get_racer_object(0); + fade_when_near_camera(obj, racer, 40); + firstRacerObj = get_racer_object(PLAYER_ONE); diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - sp48 = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; - WRAP(sp48, -0x8000, 0x8000); - CLAMP(sp48, -0xC00, 0xC00); - racer->headAngleTarget = sp48; + tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + WRAP(tempStartTimer, -0x8000, 0x8000); + CLAMP(tempStartTimer, -0xC00, 0xC00); + racer->headAngleTarget = tempStartTimer; } - if (obj->segment.object.animationID == 1) { + if (obj->segment.object.animationID == ANIM_BLUEY_WALK) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } - if (obj->segment.object.animationID == 3) { + if (obj->segment.object.animationID == ANIM_BLUEY_TURN) { racer->headAngleTarget = 0; } racer = (Object_Racer *) firstRacerObj->unk64; - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_BLUEY_WALK) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { - if (D_8011D5D0 == 0) { - D_8011D5D0 = 1; - func_8005CB68(racer, &D_8011D5D0); + if (gBlueyCutsceneTimer == 0) { + gBlueyCutsceneTimer = 1; + func_8005CB68(racer, &gBlueyCutsceneTimer); } } } diff --git a/src/vehicle_bubbler.c b/src/vehicle_bubbler.c index 5b0dfb41..42d15893 100644 --- a/src/vehicle_bubbler.c +++ b/src/vehicle_bubbler.c @@ -13,7 +13,7 @@ /************ .data ************/ -u16 D_800DCE40[16] = { +u16 gBubblerVoiceTable[16] = { SOUND_VOICE_BUBBLER_HOHO, SOUND_VOICE_BUBBLER_OW, SOUND_VOICE_BUBBLER_AUGH, @@ -36,73 +36,79 @@ u16 D_800DCE40[16] = { /************ .bss ************/ -s8 D_8011D5F0; -s8 D_8011D5F1; +s8 gBubblerCutsceneTimer; +s8 gBubblerStartBoost; /******************************/ +enum BubblerAnimations { + ANIM_BUBBLER_IDLE, + ANIM_BUBBLER_MOVE, + ANIM_BUBBLER_DAMAGE +}; + /** * Top level function for updating the "Bubbler" vehicle. * Basically this controls the Bubbler boss on Sherbert Island, who follows a path, then throws special tripmines and bubble traps on the course. */ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer) { - s16 sp56; + s16 animID; s16 animFrame; - s16 sp52; + s16 tempHeadAngle; s32 objectID; f32 diffZ; Object_68 *gfxData; s32 timer; UNUSED s32 pad; - s32 sp38; + s32 headAngleRange; ObjectModel *model; Object *firstRacerObj; f32 diffX; s32 temp2; - set_boss_voice_clip_offset(D_800DCE40); + set_boss_voice_clip_offset(gBubblerVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - sp56 = obj->segment.object.animationID; + animID = obj->segment.object.animationID; animFrame = obj->segment.animFrame; - sp52 = racer->headAngle; + tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE) { func_80021400(130); racer->raceFinished++; } timer = *startTimer; if (timer == 100) { - D_8011D5F0 = 0; + gBubblerCutsceneTimer = 0; } if (racer->playerIndex == PLAYER_COMPUTER && *startTimer != 100) { *startTimer -= 30; if (*startTimer < 0) { - if (D_8011D5F1 == 0) { - func_8005CB04(0); + if (gBubblerStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); racer->boostTimer = 5; } - D_8011D5F1 = 1; + gBubblerStartBoost = TRUE; *startTimer = 0; *input |= 0x8000; } else { - D_8011D5F1 = 0; + gBubblerStartBoost = FALSE; } } func_8004F7F4(updateRate, updateRateF, obj, racer); *startTimer = timer; racer->lateral_velocity = 0.0f; - racer->headAngle = sp52; - obj->segment.object.animationID = sp56; + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; obj->segment.animFrame = animFrame; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != 2) { + if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_BUBBLER_DAMAGE) { racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = 2; + obj->segment.object.animationID = ANIM_BUBBLER_DAMAGE; obj->segment.y_velocity += 7.5; - func_8005CB04(1); + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, 0); set_camera_shake(12.0f); racer->velocity *= 0.3; - racer->unkC = 0.0f; + racer->animationSpeed = 0.0f; } racer->attackType = ATTACK_NONE; if (racer->approachTarget != 0) { @@ -113,21 +119,21 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * gfxData = *obj->unk68; model = gfxData->objModel; diffX = (model->animations[obj->segment.object.animationID].unk4 * 16) - 17; - obj->segment.object.animationID = 1; - racer->unkC += 2.0 * updateRateF; - while (racer->unkC < 0.0f) { - racer->unkC += diffX; + obj->segment.object.animationID = ANIM_BUBBLER_MOVE; + racer->animationSpeed += 2.0 * updateRateF; + while (racer->animationSpeed < 0.0f) { + racer->animationSpeed += diffX; gfxData->unk10 = -1; } - while (diffX < racer->unkC) { - racer->unkC -= diffX; + while (diffX < racer->animationSpeed) { + racer->animationSpeed -= diffX; gfxData->unk10 = -1; } - if (gfxData->unk10 == -1 && obj->segment.object.animationID == 2) { - obj->segment.object.animationID = 1; - racer->unkC = 0.0f; + if (gfxData->unk10 == -1 && obj->segment.object.animationID == ANIM_BUBBLER_DAMAGE) { + obj->segment.object.animationID = ANIM_BUBBLER_MOVE; + racer->animationSpeed = 0.0f; } - obj->segment.animFrame = racer->unkC; + obj->segment.animFrame = racer->animationSpeed; if (racer->playerIndex == PLAYER_COMPUTER) { temp2 = func_80023568(); if (temp2 != 0) { @@ -135,45 +141,45 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * if (temp2 == 6) { objectID = 0x12A; } - func_8005E204(obj, racer, 0.0f, objectID, 0x245); + spawn_boss_hazard(obj, racer, 0.0f, objectID, SOUND_VOICE_BUBBLER_HOHO2); } } obj->unk74 = 0; func_800AFC3C(obj, updateRate); - fade_when_near_camera(obj, racer, 0x28); + fade_when_near_camera(obj, racer, 40); switch (obj->segment.object.animationID) { - case 1: - sp38 = 0x2500; + case ANIM_BUBBLER_MOVE: + headAngleRange = 0x2500; break; - case 2: - sp38 = 0x100; + case ANIM_BUBBLER_DAMAGE: + headAngleRange = 0x100; break; default: - sp38 = 0x1500; + headAngleRange = 0x1500; break; } - firstRacerObj = get_racer_object(0); + firstRacerObj = get_racer_object(PLAYER_ONE); diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { timer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; WRAP(timer, -0x8000, 0x8000); - CLAMP(timer, -sp38, sp38); + CLAMP(timer, -headAngleRange, headAngleRange); racer->headAngleTarget = timer; } - if (obj->segment.object.animationID == 1) { + if (obj->segment.object.animationID == ANIM_BUBBLER_MOVE) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } racer = (Object_Racer *) firstRacerObj->unk64; - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_BUBBLER_MOVE) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { - if (D_8011D5F0 == 0) { - D_8011D5F0 = 1; - func_8005CB68(racer, &D_8011D5F0); + if (gBubblerCutsceneTimer == 0) { + gBubblerCutsceneTimer = 1; + func_8005CB68(racer, &gBubblerCutsceneTimer); } } } diff --git a/src/vehicle_misc.h b/src/vehicle_misc.h index d9f74777..c6f4c6bc 100644 --- a/src/vehicle_misc.h +++ b/src/vehicle_misc.h @@ -4,18 +4,8 @@ #include "types.h" #include "structs.h" -extern u16 D_800DCDE0[16]; -extern u16 D_800DCE20[16]; -extern u16 D_800DCE40[16]; -extern s16 D_800DCE60[14]; -extern s16 D_800DCE80[14]; - -typedef struct unk8005C2F0 { - u8 pad0[0xC]; - f32 unkC; - u8 pad10[0x108]; - s32 unk118; -} unk8005C2F0; +#define BOSS_SOUND_POSITIVE 0 +#define BOSS_SOUND_NEGATIVE 1 void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer); void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer); @@ -23,11 +13,11 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, s32 *stickMag, s32 *startTimer); void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer); void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer); -void func_8005E204(Object *obj, Object_Racer *racer, f32 arg2, s32 objectID, s32 arg4); -void func_8005C2F0(Object *object, unk8005C2F0 *arg1); +void spawn_boss_hazard(Object *obj, Object_Racer *racer, f32 offset, s32 objectID, s32 soundID); +void func_8005C2F0(Object *object, Object_Racer *racer); void set_boss_voice_clip_offset(u16 *soundID); void func_8005CA84(f32 x, f32 y, f32 z, s32 arg3); -void func_8005CB04(s32 arg0); +void play_random_boss_sound(s32 arg0); void fade_when_near_camera(Object *object, Object_Racer *racer, s32 distance); void func_8005CB68(Object_Racer *racer, s8 *arg1); // Non Matching diff --git a/src/vehicle_rocket.c b/src/vehicle_rocket.c index 01d0e930..7f1357d8 100644 --- a/src/vehicle_rocket.c +++ b/src/vehicle_rocket.c @@ -14,7 +14,7 @@ /************ .data ************/ //sSoundEffectsPool index values? -s16 D_800DCE80[14] = { +s16 gRocketVoiceTable[14] = { SOUND_VOICE_BOSS_LAUGH2, SOUND_VOICE_TRICKY_HM, SOUND_VOICE_TRICKY_HMMM, @@ -35,75 +35,80 @@ s16 D_800DCE80[14] = { /************ .bss ************/ -s8 D_8011D610; -s8 D_8011D611; +s8 gRocketCutsceneTimer; +s8 gRocketStartBoost; /******************************/ +enum RocketAnimations { + ANIM_ROCKET_IDLE, + ANIM_ROCKET_DAMAGE +}; + /** * Top level update function for the Wizpig Rocket vehicle, used in the Wizpig rematch. */ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer) { - s16 sp3E; - s16 sp3C; - s16 sp3A; + s16 animID; + s16 animFrame; + s16 tempHeadAngle; f32 diffZ; f32 diffX; - s32 sp2C; + s32 tempStartTimer; Object *someObj; Object *firstRacerObj; Object_WizpigRocket *rocket; Object_68 *gfxData; ObjectModel *objModel; - set_boss_voice_clip_offset((u16* ) D_800DCE80); + set_boss_voice_clip_offset((u16* ) gRocketVoiceTable); racer->unk1EC = 0; - sp3E = obj->segment.object.animationID; - sp3C = obj->segment.animFrame; - sp3A = racer->headAngle; - if ((racer->velocity < 0.3) && (-0.3 < racer->velocity)) { + animID = obj->segment.object.animationID; + animFrame = obj->segment.animFrame; + tempHeadAngle = racer->headAngle; + if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *buttonsPressed = 0; } if (racer->raceFinished == TRUE && func_80023568()) { func_80021400(130); racer->raceFinished++; } - sp2C = *startTimer; - if (sp2C == 0x64) { - D_8011D610 = 0; + tempStartTimer = *startTimer; + if (tempStartTimer == 100) { + gRocketCutsceneTimer = 0; } racer->zipperDirCorrection = FALSE; if (racer->playerIndex == PLAYER_COMPUTER) { if (*startTimer != 100) { - *startTimer -= 30; + *startTimer -= 30; if (*startTimer < 0) { - if (D_8011D611 == 0) { - func_8005CB04(0); + if (gRocketStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); } - D_8011D611 = 1; + gRocketStartBoost = TRUE; *startTimer = 0; *input |= A_BUTTON; } else { - D_8011D611 = 0; + gRocketStartBoost = FALSE; } } } racer->vehicleID = VEHICLE_CARPET; func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; - *startTimer = sp2C; + *startTimer = tempStartTimer; obj->unk74 = 0; - racer->headAngle = sp3A; - obj->segment.object.animationID = sp3E; - obj->segment.animFrame = sp3C; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != 1) { - func_8005CB04(1); + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; + obj->segment.animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_ROCKET_DAMAGE) { + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); obj->segment.x_velocity *= 0.4; - obj->segment.object.animationID = 1; + obj->segment.object.animationID = ANIM_ROCKET_DAMAGE; obj->segment.z_velocity *= 0.4; - racer->unkC = 0.0f; + racer->animationSpeed = 0.0f; obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; @@ -118,23 +123,23 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.z_velocity = 0.0f; } } - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; gfxData = *obj->unk68; objModel = gfxData->objModel; diffX = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; - while (diffX <= racer->unkC) { - racer->unkC -= diffX; + while (diffX <= racer->animationSpeed) { + racer->animationSpeed -= diffX; gfxData->unk10 = -1; } - while (racer->unkC <= 0.0f) { - racer->unkC += diffX; + while (racer->animationSpeed <= 0.0f) { + racer->animationSpeed += diffX; gfxData->unk10 = -1; } - if (obj->segment.object.animationID == 1 && gfxData->unk10 == -1) { - obj->segment.object.animationID = 0; - racer->unkC = 0.0f; + if (obj->segment.object.animationID == ANIM_ROCKET_DAMAGE && gfxData->unk10 == -1) { + obj->segment.object.animationID = ANIM_ROCKET_IDLE; + racer->animationSpeed = 0.0f; } - obj->segment.animFrame = racer->unkC; + obj->segment.animFrame = racer->animationSpeed; obj->unk74 = 0; func_800AF714(obj, updateRate); fade_when_near_camera(obj, racer, 40); @@ -151,15 +156,15 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } } - firstRacerObj = get_racer_object(0); - racer = (Object_Racer*)firstRacerObj->unk64; - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + firstRacerObj = get_racer_object(PLAYER_ONE); + racer = (Object_Racer *) firstRacerObj->unk64; + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_ROCKET_DAMAGE) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != 0) { - if (D_8011D610 == 0) { - D_8011D610 = 1; - func_8005CB68(racer, &D_8011D610); + if (gRocketCutsceneTimer == 0) { + gRocketCutsceneTimer = 1; + func_8005CB68(racer, &gRocketCutsceneTimer); } } } diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index 455641b1..cf12c657 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -12,35 +12,67 @@ #include "racer.h" #include "particles.h" +/************ .data ************/ + +u16 gSmokeyVoiceTable[16] = { + SOUND_VOICE_BOSS_LAUGH2, + SOUND_VOICE_TRICKY_HM, + SOUND_VOICE_TRICKY_HMMM, + SOUND_VOICE_WIZPIG_HA, + SOUND_VOICE_WIZPIG_H2, + SOUND_VOICE_SMOKEY_EH, + SOUND_VOICE_SMOKEY_HEH, + SOUND_VOICE_SMOKEY_HAH, + SOUND_VOICE_SMOKEY_LAUGH, + SOUND_VOICE_SMOKEY_HM, + SOUND_VOICE_SMOKEY_HM2, + SOUND_VOICE_CONKER_YEHAHA, + SOUND_VOICE_TIMBER_WOW, + SOUND_WHOOSH2, + SOUND_NONE, + SOUND_NONE, +}; + +/*******************************/ + /************ .bss ************/ -s8 D_8011D5E0; -s8 D_8011D5E1; +s8 gSmokeyCutsceneTimer; +s8 gSmokeyStartBoost; /******************************/ +enum SmokeyAnimations { + ANIM_SMOKEY_IDLE, + ANIM_SMOKEY_RUN, + ANIM_SMOKEY_WALK, + ANIM_SMOKEY_LAND, + ANIM_SMOKEY_FLY, + ANIM_SMOKEY_DAMAGE +}; + /** * Top level function for updating the "Smokey" vehicle as seen in the Dragon Forest boss stage. * Also controls the pteradactyl found in Dino domain, from when it had a larger role ingame. */ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, s32 *stickMag, s32 *startTimer) { - s16 sp5E; - s16 sp5C; - s16 sp5A; + s16 animID; + s16 animFrame; + s16 tempHeadAngle; f32 diffX; f32 diffZ; ObjectModel *objModel; - Object_68 *obj68; - s32 sp44; - f32 var_f2; + Object_68 *gfxData; + s32 headAngleRange; + f32 animVelocity; UNUSED s32 pad; - s16 newvar; + s16 stepFrame; Object *firstRacerObj; - set_boss_voice_clip_offset(D_800DCE20); - sp5E = obj->segment.object.animationID; - sp5C = obj->segment.animFrame; - sp5A = racer->headAngle; + set_boss_voice_clip_offset(gSmokeyVoiceTable); + animID = obj->segment.object.animationID; + animFrame = obj->segment.animFrame; + tempHeadAngle = racer->headAngle; if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *stickMag = 0; } @@ -48,40 +80,40 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80021400(130); racer->raceFinished++; } - sp44 = *startTimer; - if (sp44 == 100) { - D_8011D5E0 = 0; + headAngleRange = *startTimer; + if (headAngleRange == 100) { + gSmokeyCutsceneTimer = 0; } if (racer->playerIndex == PLAYER_COMPUTER && *startTimer != 100) { *startTimer -= 60; if (*startTimer < 0) { - if (D_8011D5E1 == 0) { - func_8005CB04(0); + if (gSmokeyStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); racer->boostTimer = 10; } - D_8011D5E1 = 1; + gSmokeyStartBoost = TRUE; *startTimer = 0; *input |= A_BUTTON; } else { - D_8011D5E1 = 0; + gSmokeyStartBoost = FALSE; } } racer->vehicleID = VEHICLE_SMOKEY; func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; - *startTimer = sp44; + *startTimer = headAngleRange; obj->unk74 = 0; - racer->headAngle = sp5A; - obj->segment.object.animationID = sp5E; - obj->segment.animFrame = sp5C; - if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != 5) { - func_8005CB04(1); + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; + obj->segment.animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_SMOKEY_DAMAGE) { + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, 0); set_camera_shake(12.0f); - obj->segment.object.animationID = 5; + obj->segment.object.animationID = ANIM_SMOKEY_DAMAGE; obj->segment.x_velocity *= 0.27; obj->segment.z_velocity *= 0.27; - racer->unkC = 0.0f; + racer->animationSpeed = 0.0f; obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; @@ -96,158 +128,162 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.z_velocity = 0.0f; } } - obj68 = *obj->unk68; - objModel = obj68->objModel; + gfxData = *obj->unk68; + objModel = gfxData->objModel; diffX = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; - var_f2 = (racer->velocity * updateRateF) * 0.45; - if (var_f2 <= 0.0) { - if (var_f2 > -2.0) { - var_f2 = -2.0f; + animVelocity = (racer->velocity * updateRateF) * 0.45; + if (animVelocity <= 0.0) { + if (animVelocity > -2.0) { + animVelocity = -2.0f; } - } else if (var_f2 < 2.0) { - var_f2 = 2.0f; + } else if (animVelocity < 2.0) { + animVelocity = 2.0f; } switch (obj->segment.object.animationID) { case 0: racer->unk1CD = 0; - racer->unkC += 1.0 * updateRateF; + racer->animationSpeed += 1.0 * updateRateF; break; case 1: if (racer->unk1CD == 2) { - racer->unkC += var_f2; + racer->animationSpeed += animVelocity; } else { - racer->unkC -= var_f2; + racer->animationSpeed -= animVelocity; } break; case 2: racer->unk1CD = 2; - racer->unkC -= var_f2; + racer->animationSpeed -= animVelocity; break; case 3: if (racer->unk1CD == 4) { - racer->unkC -= 2.0 * updateRateF; + racer->animationSpeed -= 2.0 * updateRateF; } else { - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; } break; case 4: racer->unk1CD = 4; - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; break; case 5: - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; break; default: break; } - while (diffX <= racer->unkC) { - racer->unkC -= diffX; - obj68->unk10 = -1; + while (diffX <= racer->animationSpeed) { + racer->animationSpeed -= diffX; + gfxData->unk10 = -1; } - while (racer->unkC <= 0.0f) { - racer->unkC += diffX; - obj68->unk10 = -1; + while (racer->animationSpeed <= 0.0f) { + racer->animationSpeed += diffX; + gfxData->unk10 = -1; } - if (obj->segment.object.animationID == 2 && racer->groundedWheels == 0 && racer->velocity < -6.5) { - obj->segment.object.animationID = 3; - racer->unkC = 0.0f; + if (obj->segment.object.animationID == ANIM_SMOKEY_WALK && racer->groundedWheels == 0 && racer->velocity < -6.5) { + obj->segment.object.animationID = ANIM_SMOKEY_LAND; + racer->animationSpeed = 0.0f; } - if (obj68->unk10 == -1 || obj->segment.object.animationID == 0) { - if (obj->segment.object.animationID == 5) { + if (gfxData->unk10 == -1 || obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { + if (obj->segment.object.animationID == ANIM_SMOKEY_DAMAGE) { obj->segment.object.animationID = racer->unk1CD; - racer->unkC = 0.0f; - } else if (obj->segment.object.animationID == 1) { + racer->animationSpeed = 0.0f; + } else if (obj->segment.object.animationID == ANIM_SMOKEY_RUN) { if (racer->unk1CD == 0) { - obj->segment.object.animationID = 2; + obj->segment.object.animationID = ANIM_SMOKEY_WALK; } else { - obj->segment.object.animationID = 0; + obj->segment.object.animationID = ANIM_SMOKEY_IDLE; } - } else if (obj->segment.object.animationID == 3) { + } else if (obj->segment.object.animationID == ANIM_SMOKEY_LAND) { if (racer->unk1CD == 4) { - obj->segment.object.animationID = 2; + obj->segment.object.animationID = ANIM_SMOKEY_WALK; } else { - obj->segment.object.animationID = 4; + obj->segment.object.animationID = ANIM_SMOKEY_FLY; } } else if (-0.1 < racer->velocity && racer->velocity < 0.1) { - if (obj->segment.object.animationID == 2) { - obj->segment.object.animationID = 1; - racer->unkC = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; + if (obj->segment.object.animationID == ANIM_SMOKEY_WALK) { + obj->segment.object.animationID = ANIM_SMOKEY_RUN; + racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; } else { - obj->segment.object.animationID = 0; + obj->segment.object.animationID = ANIM_SMOKEY_IDLE; } } else { - if (obj->segment.object.animationID == 0) { - obj->segment.object.animationID = 1; - racer->unkC = 0.0f; + if (obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { + obj->segment.object.animationID = ANIM_SMOKEY_RUN; + racer->animationSpeed = 0.0f; } - if (obj->segment.object.animationID == 4 && racer->groundedWheels && racer->velocity > -6.0) { - obj->segment.object.animationID = 3; - racer->unkC = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; + if (obj->segment.object.animationID == ANIM_SMOKEY_FLY && racer->groundedWheels && racer->velocity > -6.0) { + obj->segment.object.animationID = ANIM_SMOKEY_LAND; + racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; } } } - sp5C = obj->segment.animFrame; - obj->segment.animFrame = racer->unkC; - newvar = obj->segment.animFrame >> 4; + animFrame = obj->segment.animFrame; + obj->segment.animFrame = racer->animationSpeed; + stepFrame = obj->segment.animFrame >> 4; obj->unk74 = 0; - if (obj->segment.object.animationID != 1 && obj->segment.object.animationID != 2) { - sp5C >>= 4; - newvar = 1; - if (obj->segment.object.animationID == 0) { - newvar = 3; + if (obj->segment.object.animationID != ANIM_SMOKEY_RUN && obj->segment.object.animationID != 2) { + animFrame >>= 4; + stepFrame = 1; + if (obj->segment.object.animationID == ANIM_SMOKEY_IDLE) { + stepFrame = 3; } - if (sp5C == newvar && newvar + 1 == obj->segment.animFrame >> 4) { + if (animFrame == stepFrame && stepFrame + 1 == obj->segment.animFrame >> 4) { play_sound_at_position(SOUND_UNK_223, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, 0); } } - if (racer->vehicleIDPrev == 7 && racer->playerIndex == PLAYER_COMPUTER && func_80023568()) { - func_8005E204(obj, racer, 100.0f, 137, 165); + if (racer->vehicleIDPrev == VEHICLE_SMOKEY && racer->playerIndex == PLAYER_COMPUTER && func_80023568()) { + spawn_boss_hazard(obj, racer, 100.0f, 137, SOUND_VOICE_TRICKY_HM); } func_800AFC3C(obj, updateRate); fade_when_near_camera(obj, racer, 40); - firstRacerObj = get_racer_object(0); + firstRacerObj = get_racer_object(PLAYER_ONE); diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { - sp44 = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; - if (sp44 > 0x8000) { - sp44 -= 0xFFFF; + headAngleRange = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + if (headAngleRange > 0x8000) { + headAngleRange -= 0xFFFF; } - if (sp44 < -0x8000) { - sp44 += 0xFFFF; + if (headAngleRange < -0x8000) { + headAngleRange += 0xFFFF; } - if (sp44 > 0xC00) { - sp44 = 0xC00; + if (headAngleRange > 0xC00) { + headAngleRange = 0xC00; } - if (sp44 < -0xC00) { - sp44 = -0xC00; + if (headAngleRange < -0xC00) { + headAngleRange = -0xC00; } - racer->headAngleTarget = sp44; + racer->headAngleTarget = headAngleRange; } - if (obj->segment.object.animationID >= 2) { + if (obj->segment.object.animationID >= ANIM_SMOKEY_WALK) { if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } racer = (Object_Racer *) firstRacerObj->unk64; - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_SMOKEY_RUN) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != FALSE) { - if (D_8011D5E0 == 0) { - D_8011D5E0 = 1; - func_8005CB68(racer, &D_8011D5E0); + if (gSmokeyCutsceneTimer == 0) { + gSmokeyCutsceneTimer = 1; + func_8005CB68(racer, &gSmokeyCutsceneTimer); } } } -void func_8005E204(Object *obj, Object_Racer *racer, f32 arg2, s32 objectID, s32 arg4) { - Object **var_s6; - s32 sp80; - s32 sp7C; - LevelObjectEntry *temp_s2; - Object *temp_s1; +/** + * Compare distance to any boss hazard triggers found throughout the course. + * When close enough to one, spawn a hazard, set by the caller of the function. +*/ +void spawn_boss_hazard(Object *obj, Object_Racer *racer, f32 offset, s32 objectID, s32 soundID) { + Object **objList; + s32 objListID; + s32 objListCount; + LevelObjectEntry *entry; + Object *tempObj; Object *newObj; s32 i; LevelObjectEntryCommon spawnObj; @@ -255,38 +291,38 @@ void func_8005E204(Object *obj, Object_Racer *racer, f32 arg2, s32 objectID, s32 f32 diffZ; f32 diffY; - var_s6 = objGetObjList(&sp80, &sp7C); + objList = objGetObjList(&objListID, &objListCount); spawnObj.objectID = objectID; spawnObj.size = (((objectID & 0x100) & 0xFFFF) >> 1) | 8; - spawnObj.x = obj->segment.trans.x_position - (racer->ox1 * arg2); - spawnObj.y = obj->segment.trans.y_position - (racer->oy1 * arg2); - spawnObj.z = obj->segment.trans.z_position - (racer->oz1 * arg2); + spawnObj.x = obj->segment.trans.x_position - (racer->ox1 * offset); + spawnObj.y = obj->segment.trans.y_position - (racer->oy1 * offset); + spawnObj.z = obj->segment.trans.z_position - (racer->oz1 * offset); - for (i = 0; i < sp7C; i++) { - temp_s1 = var_s6[i]; - if (temp_s1->behaviorId == BHV_UNK_6B) { - temp_s2 = temp_s1->segment.level_entry; - if ((s8) temp_s2->animation.z_rotation == racer->lap + 1 || (s8) temp_s2->animation.z_rotation == 0) { - diffX = temp_s1->segment.trans.x_position - obj->segment.trans.x_position; - diffY = temp_s1->segment.trans.y_position - obj->segment.trans.y_position; - diffZ = temp_s1->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < (f32) ((s8) temp_s2->animation.x_rotation & 0xFF) * 4.0) { - if (temp_s1->properties.racer.unk0 == 0) { - temp_s1->properties.racer.unk0 = (Object *) 1; // ??? + for (i = 0; i < objListCount; i++) { + tempObj = objList[i]; + if (tempObj->behaviorId == BHV_BOSS_HAZARD_TRIGGER) { + entry = tempObj->segment.level_entry; + if ((s8) entry->animation.z_rotation == racer->lap + 1 || (s8) entry->animation.z_rotation == 0) { + diffX = tempObj->segment.trans.x_position - obj->segment.trans.x_position; + diffY = tempObj->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = tempObj->segment.trans.z_position - obj->segment.trans.z_position; + if (sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < (f32) ((s8) entry->animation.x_rotation & 0xFF) * 4.0) { + if (tempObj->properties.racer.unk0 == 0) { + tempObj->properties.racer.unk0 = (Object *) 1; // ??? newObj = spawn_object(&spawnObj, 1); if (newObj != NULL) { newObj->segment.level_entry = NULL; newObj->segment.x_velocity = obj->segment.x_velocity; newObj->segment.y_velocity = obj->segment.y_velocity; newObj->segment.z_velocity = obj->segment.z_velocity; - newObj->properties.racer.unk0 = temp_s1; - newObj->properties.racer.unk4 = (s8) temp_s2->animation.y_rotation * 60; + newObj->properties.racer.unk0 = tempObj; + newObj->properties.racer.unk4 = (s8) entry->animation.y_rotation * 60; newObj->segment.animFrame = get_random_number_from_range(0, 255); - play_sound_at_position(arg4, newObj->segment.trans.x_position, newObj->segment.trans.y_position, newObj->segment.trans.z_position, 4, NULL); + play_sound_at_position(soundID, newObj->segment.trans.x_position, newObj->segment.trans.y_position, newObj->segment.trans.z_position, 4, NULL); } } } else { - temp_s1->properties.racer.unk0 = 0; + tempObj->properties.racer.unk0 = 0; } } } diff --git a/src/vehicle_tricky.c b/src/vehicle_tricky.c index 7f55e980..898c3dc4 100644 --- a/src/vehicle_tricky.c +++ b/src/vehicle_tricky.c @@ -17,7 +17,7 @@ /************ .data ************/ -u16 D_800DCDE0[16] = { +u16 gTrickyVoiceTable[16] = { SOUND_VOICE_BOSS_LAUGH, SOUND_VOICE_TRICKY_WOAH, SOUND_VOICE_TRICKY_WOAH2, @@ -40,48 +40,55 @@ u16 D_800DCDE0[16] = { /************ .bss ************/ -f32 D_8011D5C0; -s8 D_8011D5C4; +f32 gTrickyRacerPeakHeight; +s8 gTrickyCutsceneTimer; u16 *gBossSoundIDOffset; -s8 D_8011D5CC; +s8 gTrickyStartBoost; /******************************/ -void func_8005C2F0(Object *object, unk8005C2F0 *arg1) { +enum TrickyAnimations { + ANIM_TRICKY_IDLE, + ANIM_TRICKY_RUN, + ANIM_TRICKY_WALK, + ANIM_TRICKY_DAMAGE +}; + +void func_8005C2F0(Object *object, Object_Racer *racer) { object->interactObj->flags = INTERACT_FLAGS_SOLID | INTERACT_FLAGS_UNK_0004; object->interactObj->unk11 = 0; object->interactObj->hitboxRadius = 30; object->interactObj->pushForce = 0; - arg1->unkC = 0.0f; - D_8011D5C0 = object->segment.trans.y_position; - if (arg1->unk118 != 0) { + racer->animationSpeed = 0.0f; + gTrickyRacerPeakHeight = object->segment.trans.y_position; + if (racer->unk118 != 0) { func_80006AC8(object); } - D_8011D5C4 = 0; + gTrickyCutsceneTimer = 0; } /** * Top level function for updating the Tricky vehicle as seen in the Dino Domain boss. */ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer) { - s16 sp56; - s16 sp54; - s16 sp52; + s16 animID; + s16 animFrame; + s16 tempHeadAngle; f32 diffX; f32 diffZ; ObjectModel *objModel; s32 tempStartTimer; - Object_68 *obj68; - s32 sp38; + Object_68 *gfxData; + s32 headAngleRange; UNUSED s32 pad; Object *firstRacerObj; - set_boss_voice_clip_offset(D_800DCDE0); + set_boss_voice_clip_offset(gTrickyVoiceTable); *buttonsPressed &= ~R_TRIG; *input &= ~R_TRIG; - sp56 = obj->segment.object.animationID; - sp54 = obj->segment.animFrame; - sp52 = racer->headAngle; + animID = obj->segment.object.animationID; + animFrame = obj->segment.animFrame; + tempHeadAngle = racer->headAngle; if (racer->raceFinished == TRUE) { func_80021400(130); racer->raceFinished++; @@ -91,15 +98,15 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r if (*startTimer != 100) { *startTimer -= 15; if (*startTimer < 0) { - if (D_8011D5CC == FALSE) { - func_8005CB04(0); + if (gTrickyStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); racer->boostTimer = 5; } - D_8011D5CC = TRUE; + gTrickyStartBoost = TRUE; *startTimer = 0; *input |= A_BUTTON; } else { - D_8011D5CC = FALSE; + gTrickyStartBoost = FALSE; } } } @@ -107,18 +114,18 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_8004F7F4(updateRate, updateRateF, obj, racer); *startTimer = tempStartTimer; racer->lateral_velocity = 0.0f; - racer->headAngle = sp52; - obj->segment.object.animationID = sp56; - obj->segment.animFrame = sp54; - if ((racer->attackType != ATTACK_NONE) && (obj->segment.object.animationID != 3)) { + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; + obj->segment.animFrame = animFrame; + if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_TRICKY_DAMAGE) { racer->unk1CD = obj->segment.object.animationID; - obj->segment.object.animationID = 3; + obj->segment.object.animationID = ANIM_TRICKY_DAMAGE; obj->segment.y_velocity += 7.5; - func_8005CB04(1); + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); racer->velocity *= 0.3; - racer->unkC = 0.0f; + racer->animationSpeed = 0.0f; } racer->attackType = ATTACK_NONE; if (racer->approachTarget != NULL) { @@ -126,85 +133,86 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r diffZ = obj->segment.z_velocity * obj->segment.z_velocity; racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } - obj68 = *obj->unk68; - objModel = obj68->objModel; + gfxData = *obj->unk68; + objModel = gfxData->objModel; diffX = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; - if (obj->segment.object.animationID != 3) { + if (obj->segment.object.animationID != ANIM_TRICKY_DAMAGE) { if (racer->velocity < -2.0) { - obj->segment.object.animationID = 1; - racer->unkC -= (racer->velocity * updateRateF) * 0.5; - } else if ((racer->velocity < -0.1) || (racer->velocity > 0.1)) { - obj->segment.object.animationID = 2; - racer->unkC -= (racer->velocity * updateRateF) * 2; + obj->segment.object.animationID = ANIM_TRICKY_RUN; + racer->animationSpeed -= (racer->velocity * updateRateF) * 0.5; + } else if (racer->velocity < -0.1 || racer->velocity > 0.1) { + obj->segment.object.animationID = ANIM_TRICKY_WALK; + racer->animationSpeed -= (racer->velocity * updateRateF) * 2; } else { - obj->segment.object.animationID = 0; - racer->unkC += 1.0 * updateRateF; + obj->segment.object.animationID = ANIM_TRICKY_IDLE; + racer->animationSpeed += 1.0 * updateRateF; } } else { - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; } - while (racer->unkC < 0.0f) { - racer->unkC += diffX; - obj68->unk10 = -1; + while (racer->animationSpeed < 0.0f) { + racer->animationSpeed += diffX; + gfxData->unk10 = -1; } - while (diffX < racer->unkC) { - racer->unkC -= diffX; - obj68->unk10 = -1; + while (diffX < racer->animationSpeed) { + racer->animationSpeed -= diffX; + gfxData->unk10 = -1; } - if (obj68->unk10 == -1 && obj->segment.object.animationID == 3) { + if (gfxData->unk10 == -1 && obj->segment.object.animationID == ANIM_TRICKY_DAMAGE) { obj->segment.object.animationID = racer->unk1CD; } - sp54 = obj->segment.animFrame; - obj->segment.animFrame = racer->unkC; + animFrame = obj->segment.animFrame; + obj->segment.animFrame = racer->animationSpeed; obj->unk74 = 0; - if (obj->segment.object.animationID == 1) { - func_800113CC(obj, 2, sp54, SOUND_STOMP2, SOUND_STOMP3); + if (obj->segment.object.animationID == ANIM_TRICKY_RUN) { + play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); obj->unk74 |= 3; } func_800AFC3C(obj, updateRate); fade_when_near_camera(obj, racer, 120); switch( obj->segment.object.animationID) { - case 1: - sp38 = 0x2500; + case ANIM_TRICKY_RUN: + headAngleRange = 0x2500; break; - case 2: - sp38 = 0x100; + case ANIM_TRICKY_WALK: + headAngleRange = 0x100; break; default: - sp38 = 0x1500; + headAngleRange = 0x1500; break; } - firstRacerObj = get_racer_object(0); + firstRacerObj = get_racer_object(PLAYER_ONE); diffX = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; diffZ = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; if (sqrtf((diffX * diffX) + (diffZ * diffZ)) < 700.0) { tempStartTimer = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; WRAP(tempStartTimer, -0x8000, 0x8000); - CLAMP(tempStartTimer, -sp38, sp38); + CLAMP(tempStartTimer, -headAngleRange, headAngleRange); racer->headAngleTarget = tempStartTimer; } - if (obj->segment.object.animationID == 1) { - if ((racer->miscAnimCounter & 0x1F) < 0xA) { + if (obj->segment.object.animationID == ANIM_TRICKY_RUN) { + if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } + // Record the players height record. Falling 400 units below that will trigger a warp. racer = (Object_Racer *) firstRacerObj->unk64; - if (D_8011D5C0 < firstRacerObj->segment.trans.y_position) { - D_8011D5C0 = firstRacerObj->segment.trans.y_position; + if (gTrickyRacerPeakHeight < firstRacerObj->segment.trans.y_position) { + gTrickyRacerPeakHeight = firstRacerObj->segment.trans.y_position; } - if ((firstRacerObj->segment.trans.y_position + 400.0) < D_8011D5C0) { + if (firstRacerObj->segment.trans.y_position + 400.0 < gTrickyRacerPeakHeight) { if (fxFadeOn() == 0 && is_in_two_player_adventure()) { func_8006F398(); } func_8006F140(1); } - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_TRICKY_RUN) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished != FALSE) { - if (D_8011D5C4 == 0) { - D_8011D5C4 = 1; - func_8005CB68(racer, &D_8011D5C4); + if (gTrickyCutsceneTimer == 0) { + gTrickyCutsceneTimer = 1; + func_8005CB68(racer, &gTrickyCutsceneTimer); } } } @@ -217,23 +225,27 @@ void set_boss_voice_clip_offset(u16 *soundID) { } void func_8005CA84(f32 x, f32 y, f32 z, s32 offset) { - s8 phi_v1 = get_random_number_from_range(0, 1); + s8 randomOffset = get_random_number_from_range(0, 1); if (offset == 0) { - phi_v1 = 0; + randomOffset = 0; } - offset += phi_v1; - play_sound_at_position(gBossSoundIDOffset[offset], x, y, z, 4, 0); + offset += randomOffset; + play_sound_at_position(gBossSoundIDOffset[offset], x, y, z, 4, NULL); } -void func_8005CB04(s32 offset) { - s8 phi_v1 = get_random_number_from_range(0, 1); +/** + * Add a random amount to offset, then play a random voice clip within that range. +*/ +void play_random_boss_sound(s32 offset) { + s8 randomOffset = get_random_number_from_range(0, 1); if (offset == 0) { - phi_v1 = 0; + randomOffset = 0; } - offset += phi_v1; - play_sound_global(gBossSoundIDOffset[offset], 0); + offset += randomOffset; + play_sound_global(gBossSoundIDOffset[offset], NULL); } +// boss_race_finish #ifdef NON_EQUIVALENT // This looks like it's just some stack and regalloc differences, but I can't be certain it's NON_MATCHING yet. // This function looks like it sets up the animation sequences @@ -377,7 +389,7 @@ GLOBAL_ASM("asm/non_matchings/unknown_05CEF0/func_8005CB68.s") * When close to the camera, fade the object so it doesn't block the screen. */ void fade_when_near_camera(Object *object, Object_Racer *racer, s32 distance) { - Object *player = get_racer_object(0); + Object *player = get_racer_object(PLAYER_ONE); racer->transparency = 255; if (!func_8001139C()) { if ((object->segment.object.distanceToCamera + distance) < player->segment.object.distanceToCamera) { diff --git a/src/vehicle_wizpig.c b/src/vehicle_wizpig.c index accbc077..332a72a5 100644 --- a/src/vehicle_wizpig.c +++ b/src/vehicle_wizpig.c @@ -12,7 +12,7 @@ /************ .data ************/ -s16 D_800DCE60[14] = { +s16 gWizpigVoiceTable[14] = { SOUND_VOICE_BOSS_LAUGH2, SOUND_VOICE_TRICKY_HM, SOUND_VOICE_TRICKY_HMMM, @@ -33,32 +33,41 @@ s16 D_800DCE60[14] = { /************ .bss ************/ -s8 D_8011D600; -s8 D_8011D601; +s8 gWizpigCutsceneTimer; +s8 gWizpigStartBoost; /******************************/ +enum WizpigAnimations { + ANIM_WIZPIG_IDLE, + ANIM_WIZPIG_WALK, + ANIM_WIZPIG_RUN, + ANIM_WIZPIG_JUMP, + ANIM_WIZPIG_FLY, + ANIM_WIZPIG_DAMAGE // Unused. +}; + /** * Top level function for updating the wizpig vehicle from the first boss race against him. */ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer, u32 *input, u32 *buttonsPressed, s32 *startTimer) { - s16 sp3E; - s16 sp3C; - s16 sp3A; - s16 sp38; + s16 animID; + s16 animFrame; + s16 tempHeadAngle; + s16 nextCheckpoint; f32 diffZ; f32 diffX; - f32 var_f12; - s32 sp28; + f32 animVelocity; + s32 tempStartTimer; Object *firstRacerObj; ObjectModel *objModel; Object_68 *gfxData; - set_boss_voice_clip_offset((u16* ) D_800DCE60); + set_boss_voice_clip_offset((u16* ) gWizpigVoiceTable); racer->unk1EC = 0; - sp3E = obj->segment.object.animationID; - sp3C = obj->segment.animFrame; - sp3A = racer->headAngle; + animID = obj->segment.object.animationID; + animFrame = obj->segment.animFrame; + tempHeadAngle = racer->headAngle; if (racer->velocity < 0.3 && -0.3 < racer->velocity) { *buttonsPressed = 0; } @@ -66,43 +75,44 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_80021400(130); racer->raceFinished++; } - sp28 = *startTimer; - if (sp28 == 0x64) { - D_8011D600 = 0; + tempStartTimer = *startTimer; + if (tempStartTimer == 100) { + gWizpigCutsceneTimer = 0; } racer->zipperDirCorrection = FALSE; if (racer->playerIndex == PLAYER_COMPUTER) { if (*startTimer != 100) { *startTimer -= 30; if (*startTimer < 0) { - if (D_8011D601 == 0) { - func_8005CB04(0); + if (gWizpigStartBoost == FALSE) { + play_random_boss_sound(BOSS_SOUND_POSITIVE); racer->boostTimer = 10; } - D_8011D601 = 1; + gWizpigStartBoost = TRUE; *startTimer = 0; - *input |= 0x8000; + *input |= A_BUTTON; } else { - D_8011D601 = 0; + gWizpigStartBoost = FALSE; } } } racer->vehicleID = VEHICLE_WIZPIG; func_80049794(updateRate, updateRateF, obj, racer); racer->vehicleID = racer->vehicleIDPrev; - *startTimer = sp28; + *startTimer = tempStartTimer; obj->unk74 = 0; - racer->headAngle = sp3A; - obj->segment.object.animationID = sp3E; - obj->segment.animFrame = sp3C; - if (racer->attackType != 0 && obj->segment.object.animationID != 5) { - func_8005CB04(1); + racer->headAngle = tempHeadAngle; + obj->segment.object.animationID = animID; + obj->segment.animFrame = animFrame; + // Unused, since there are no weapon balloons in Wizpig 1. + if (racer->attackType != ATTACK_NONE && obj->segment.object.animationID != ANIM_WIZPIG_DAMAGE) { + play_random_boss_sound(BOSS_SOUND_NEGATIVE); play_sound_global(SOUND_EXPLOSION, NULL); set_camera_shake(12.0f); - obj->segment.object.animationID = 5; + obj->segment.object.animationID = ANIM_WIZPIG_DAMAGE; obj->segment.x_velocity *= 0.4; obj->segment.z_velocity *= 0.4; - racer->unkC = 0.0f; + racer->animationSpeed = 0.0f; obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; @@ -117,127 +127,126 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.z_velocity = 0.0f; } } - sp38 = 0; - sp38 = sp38; + nextCheckpoint = FALSE; if (find_next_checkpoint_node(racer->checkpoint, racer->unk1C8)->unk36[racer->unk1CA] == 1) { - sp38 = 1; + nextCheckpoint = TRUE; } racer->x_rotation_offset = -obj->segment.trans.x_rotation; gfxData = *obj->unk68; objModel = gfxData->objModel; diffX = (objModel->animations[obj->segment.object.animationID].unk4 * 0x10) - 0x11; - var_f12 = (racer->velocity * updateRateF) * 0.45; - if (var_f12 <= 0.0) { - if (var_f12 > -2.0) { - var_f12 = -2.0f; + animVelocity = (racer->velocity * updateRateF) * 0.45; + if (animVelocity <= 0.0) { + if (animVelocity > -2.0) { + animVelocity = -2.0f; } - } else if (var_f12 < 2.0) { - var_f12 = 2.0f; + } else if (animVelocity < 2.0) { + animVelocity = 2.0f; } switch (obj->segment.object.animationID) { - case 0: + case ANIM_WIZPIG_IDLE: racer->unk1CD = 0; - racer->unkC += 1.0 * updateRateF; + racer->animationSpeed += 1.0 * updateRateF; break; - case 1: + case ANIM_WIZPIG_WALK: if (racer->unk1CD == 2) { - racer->unkC += var_f12; + racer->animationSpeed += animVelocity; } else { - racer->unkC -= var_f12; + racer->animationSpeed -= animVelocity; } break; - case 2: + case ANIM_WIZPIG_RUN: racer->unk1CD = 2; - racer->unkC -= var_f12; + racer->animationSpeed -= animVelocity; break; - case 3: + case ANIM_WIZPIG_JUMP: if (racer->unk1CD == 4) { - racer->unkC -= 2.0 * updateRateF; + racer->animationSpeed -= 2.0 * updateRateF; } else { - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; } break; - case 4: + case ANIM_WIZPIG_FLY: racer->unk1CD = 4; - racer->unkC += 2.0 * updateRateF; + racer->animationSpeed += 2.0 * updateRateF; break; - case 5: - racer->unkC += 2.0 * updateRateF; + case ANIM_WIZPIG_DAMAGE: + racer->animationSpeed += 2.0 * updateRateF; break; default: break; } - while (diffX <= racer->unkC) { - racer->unkC -= diffX; + while (diffX <= racer->animationSpeed) { + racer->animationSpeed -= diffX; gfxData->unk10 = -1; } - while (racer->unkC <= 0.0f){ - racer->unkC += diffX; + while (racer->animationSpeed <= 0.0f){ + racer->animationSpeed += diffX; gfxData->unk10 = -1; } - if (obj->segment.object.animationID == 2 && sp38 != 0) { - obj->segment.object.animationID = 3; - racer->unkC = 0.0f; + if (obj->segment.object.animationID == ANIM_WIZPIG_RUN && nextCheckpoint) { + obj->segment.object.animationID = ANIM_WIZPIG_JUMP; + racer->animationSpeed = 0.0f; } - if (gfxData->unk10 == -1 || obj->segment.object.animationID == 0) { - if (obj->segment.object.animationID == 5) { - obj->segment.object.animationID = (s8) racer->unk1CD; - racer->unkC = 0.0f; - } else if (obj->segment.object.animationID == 1) { + if (gfxData->unk10 == -1 || obj->segment.object.animationID == ANIM_WIZPIG_IDLE) { + if (obj->segment.object.animationID == ANIM_WIZPIG_DAMAGE) { + obj->segment.object.animationID = racer->unk1CD; + racer->animationSpeed = 0.0f; + } else if (obj->segment.object.animationID == ANIM_WIZPIG_WALK) { if (racer->unk1CD == 0) { - obj->segment.object.animationID = 2; + obj->segment.object.animationID = ANIM_WIZPIG_RUN; } else { - obj->segment.object.animationID = 0; + obj->segment.object.animationID = ANIM_WIZPIG_IDLE; } - } else if (obj->segment.object.animationID == 3) { + } else if (obj->segment.object.animationID == ANIM_WIZPIG_JUMP) { if (racer->unk1CD == 4) { - obj->segment.object.animationID = 2; + obj->segment.object.animationID = ANIM_WIZPIG_RUN; } else { - obj->segment.object.animationID = 4; + obj->segment.object.animationID = ANIM_WIZPIG_FLY; } } else { if (-0.1 < racer->velocity && racer->velocity < 0.1) { - if (obj->segment.object.animationID == 2) { - obj->segment.object.animationID = 1; - racer->unkC = (objModel->animations[obj->segment.object.animationID].unk4 * 0x10) - 0x11; + if (obj->segment.object.animationID == ANIM_WIZPIG_RUN) { + obj->segment.object.animationID = ANIM_WIZPIG_WALK; + racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; } else { - obj->segment.object.animationID = 0; + obj->segment.object.animationID = ANIM_WIZPIG_IDLE; } } else { - if (obj->segment.object.animationID == 0) { - obj->segment.object.animationID = 1; - racer->unkC = 0.0f; + if (obj->segment.object.animationID == ANIM_WIZPIG_IDLE) { + obj->segment.object.animationID = ANIM_WIZPIG_WALK; + racer->animationSpeed = 0.0f; } - if ((obj->segment.object.animationID == 4) && (sp38 == 0)) { - obj->segment.object.animationID = 3; - racer->unkC = (objModel->animations[obj->segment.object.animationID].unk4 * 0x10) - 0x11; + if ((obj->segment.object.animationID == ANIM_WIZPIG_FLY) && nextCheckpoint == FALSE) { + obj->segment.object.animationID = ANIM_WIZPIG_JUMP; + racer->animationSpeed = (objModel->animations[obj->segment.object.animationID].unk4 * 16) - 17; } } } } - sp3C = obj->segment.animFrame; - obj->segment.animFrame = racer->unkC; + animFrame = obj->segment.animFrame; + obj->segment.animFrame = racer->animationSpeed; obj->unk74 = 0; - if (obj->segment.object.animationID == 2) { - func_800113CC(obj, 2, sp3C, SOUND_STOMP2, SOUND_STOMP3); + if (obj->segment.object.animationID == ANIM_WIZPIG_RUN) { + play_footstep_sounds(obj, 2, animFrame, SOUND_STOMP2, SOUND_STOMP3); } if (racer->playerIndex == PLAYER_COMPUTER) { if (func_80023568() != 0) { - func_8005E204(obj, racer, 100.0f, 0x89, 0xA5); + spawn_boss_hazard(obj, racer, 100.0f, 0x89, SOUND_VOICE_TRICKY_HM); } } func_800AFC3C(obj, updateRate); - fade_when_near_camera(obj, racer, 0x28); - firstRacerObj = get_racer_object(0); + fade_when_near_camera(obj, racer, 40); + firstRacerObj = get_racer_object(PLAYER_ONE); racer = (Object_Racer *) firstRacerObj->unk64; - if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == 1) { + if (obj == firstRacerObj->interactObj->obj && firstRacerObj->interactObj->flags & INTERACT_FLAGS_PUSHING && obj->segment.object.animationID == ANIM_WIZPIG_WALK) { racer->attackType = ATTACK_SQUISHED; } if (racer->raceFinished) { - if (D_8011D600 == 0) { - D_8011D600 = 1; - func_8005CB68(racer, &D_8011D600); + if (gWizpigCutsceneTimer == 0) { + gWizpigCutsceneTimer = 1; + func_8005CB68(racer, &gWizpigCutsceneTimer); } } } diff --git a/src/video.h b/src/video.h index 5c955374..e17a5185 100644 --- a/src/video.h +++ b/src/video.h @@ -91,8 +91,6 @@ extern VideoModeResolution gVideoModeResolutions[8]; void init_video(s32 videoModeIndex, OSSched *sc); void set_video_mode_index(s32 videoModeIndex); -UNUSED s32 get_video_mode_index(void); -UNUSED void set_video_width_and_height_from_index(s32 fbIndex); s32 get_video_width_and_height_as_s32(void); void init_vi_settings(void); void init_framebuffer(s32 index);