From 51f40789c6b917512a20eb3fd760ea8b9fbd5878 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Mon, 2 Jan 2023 15:42:19 +0000 Subject: [PATCH] Improve and label a bunch of racer.c functions (#348) * label some racer funcs * Update object_functions.c * match render_epc_lock_up_display * Update thread0_epc.c * Update thread0_epc.c * delta * racer labelling * bit more * last ones for tonight * nonmatching func_80046524 * take a guess * quick rename * Update thread0_epc.c * some wave correction * Update waves.c * suddenly unplanned object cleanup * quick fixes * Update thread0_epc.c * Update src/racer.c Co-authored-by: Ryan Myers Co-authored-by: Ryan Myers --- asm/non_matchings/objects/func_8000B750.s | 2 +- asm/non_matchings/objects/func_80019808.s | 2 +- asm/non_matchings/objects/func_8001C6C4.s | 2 +- asm/non_matchings/objects/func_8001F460.s | 6 +- asm/non_matchings/objects/func_80021104.s | 2 +- asm/non_matchings/objects/func_80021600.s | 6 +- asm/non_matchings/objects/func_800230D0.s | 2 +- asm/non_matchings/racer/func_80042D20.s | 22 +- asm/non_matchings/racer/func_8004447C.s | 16 +- asm/non_matchings/racer/func_800452A0.s | 4 +- asm/non_matchings/racer/func_80046524.s | 30 +- asm/non_matchings/racer/func_800494E0.s | 6 +- asm/non_matchings/racer/func_80049794.s | 26 +- asm/non_matchings/racer/func_8004CC20.s | 12 +- asm/non_matchings/racer/func_8004F7F4.s | 30 +- asm/non_matchings/racer/func_80050A28.s | 32 +- asm/non_matchings/racer/func_80054FD0.s | 8 +- asm/non_matchings/racer/func_8005B818.s | 2 +- asm/non_matchings/racer/update_camera_car.s | 4 +- asm/non_matchings/racer/update_camera_plane.s | 8 +- .../thread0_epc/render_epc_lock_up_display.s | 419 ---- .../unknown_0255E0/func_800278E8.s | 2 +- .../unknown_032760/func_8003F2E8.s | 2 +- .../unknown_032760/obj_init_fish.s | 2 +- .../unknown_032760/obj_loop_butterfly.s | 4 +- .../unknown_032760/obj_loop_fish.s | 2 +- include/sound_ids.h | 4 +- include/structs.h | 30 +- src/camera.c | 12 +- src/camera.h | 2 +- src/game_ui.c | 2 +- src/menu.c | 14 +- src/object_functions.c | 198 +- src/objects.c | 103 +- src/objects.h | 42 +- src/racer.c | 1815 ++++++++++++----- src/racer.h | 82 +- src/save_data.c | 2 +- src/stacks.c | 2 +- src/stacks.h | 2 +- src/thread0_epc.c | 156 +- src/thread0_epc.h | 15 +- src/unknown_0255E0.c | 2 +- src/unknown_0255E0.h | 2 +- src/vehicle_bluey.c | 30 +- src/vehicle_bubbler.c | 30 +- src/vehicle_rocket.c | 20 +- src/vehicle_smokey.c | 44 +- src/vehicle_tricky.c | 30 +- src/vehicle_wizpig.c | 20 +- src/waves.c | 17 +- src/waves.h | 6 +- 52 files changed, 1821 insertions(+), 1514 deletions(-) delete mode 100644 asm/non_matchings/thread0_epc/render_epc_lock_up_display.s diff --git a/asm/non_matchings/objects/func_8000B750.s b/asm/non_matchings/objects/func_8000B750.s index be1edaae..99b2e0d4 100644 --- a/asm/non_matchings/objects/func_8000B750.s +++ b/asm/non_matchings/objects/func_8000B750.s @@ -231,7 +231,7 @@ glabel func_8000B750 /* 00C6A4 8000BAA4 46043200 */ add.s $f8, $f6, $f4 /* 00C6A8 8000BAA8 44078000 */ mfc1 $a3, $f16 /* 00C6AC 8000BAAC 44064000 */ mfc1 $a2, $f8 -/* 00C6B0 8000BAB0 0C00455C */ jal func_80011570 +/* 00C6B0 8000BAB0 0C00455C */ jal move_object /* 00C6B4 8000BAB4 00000000 */ nop .L8000BAB8: /* 00C6B8 8000BAB8 8FAF0090 */ lw $t7, 0x90($sp) diff --git a/asm/non_matchings/objects/func_80019808.s b/asm/non_matchings/objects/func_80019808.s index 3471c056..bed1ea7a 100644 --- a/asm/non_matchings/objects/func_80019808.s +++ b/asm/non_matchings/objects/func_80019808.s @@ -894,7 +894,7 @@ glabel func_80019808 /* 01B0C4 8001A4C4 AFA80080 */ sw $t0, 0x80($sp) /* 01B0C8 8001A4C8 0C01997A */ jal set_object_stack_pos /* 01B0CC 8001A4CC AFAA0044 */ sw $t2, 0x44($sp) -/* 01B0D0 8001A4D0 0C01A73F */ jal func_80069CFC +/* 01B0D0 8001A4D0 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 01B0D4 8001A4D4 00000000 */ nop /* 01B0D8 8001A4D8 8FA80080 */ lw $t0, 0x80($sp) /* 01B0DC 8001A4DC 3C098012 */ lui $t1, %hi(gRacersByPosition) # $t1, 0x8012 diff --git a/asm/non_matchings/objects/func_8001C6C4.s b/asm/non_matchings/objects/func_8001C6C4.s index 519d3f49..b0d2de75 100644 --- a/asm/non_matchings/objects/func_8001C6C4.s +++ b/asm/non_matchings/objects/func_8001C6C4.s @@ -331,7 +331,7 @@ glabel func_8001C6C4 /* 01D77C 8001CB7C 44055000 */ mfc1 $a1, $f10 /* 01D780 8001CB80 46068482 */ mul.s $f18, $f16, $f6 /* 01D784 8001CB84 44079000 */ mfc1 $a3, $f18 -/* 01D788 8001CB88 0C00455C */ jal func_80011570 +/* 01D788 8001CB88 0C00455C */ jal move_object /* 01D78C 8001CB8C 00000000 */ nop /* 01D790 8001CB90 C7A40088 */ lwc1 $f4, 0x88($sp) /* 01D794 8001CB94 8FA900EC */ lw $t1, 0xec($sp) diff --git a/asm/non_matchings/objects/func_8001F460.s b/asm/non_matchings/objects/func_8001F460.s index f9dc8c12..dd6cef33 100644 --- a/asm/non_matchings/objects/func_8001F460.s +++ b/asm/non_matchings/objects/func_8001F460.s @@ -941,7 +941,7 @@ glabel func_8001F460 /* 020DEC 800201EC AFA70068 */ sw $a3, 0x68($sp) /* 020DF0 800201F0 0C01997A */ jal set_object_stack_pos /* 020DF4 800201F4 AFA5005C */ sw $a1, 0x5c($sp) -/* 020DF8 800201F8 0C01A73F */ jal func_80069CFC +/* 020DF8 800201F8 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 020DFC 800201FC 00000000 */ nop /* 020E00 80020200 3C068012 */ lui $a2, %hi(D_8011AE74) # $a2, 0x8012 /* 020E04 80020204 8CC6AE74 */ lw $a2, %lo(D_8011AE74)($a2) @@ -1080,7 +1080,7 @@ glabel func_8001F460 /* 021008 80020408 AFA70068 */ sw $a3, 0x68($sp) /* 02100C 8002040C 0C01997A */ jal set_object_stack_pos /* 021010 80020410 AFB90080 */ sw $t9, 0x80($sp) -/* 021014 80020414 0C01A73F */ jal func_80069CFC +/* 021014 80020414 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 021018 80020418 00000000 */ nop /* 02101C 8002041C 3C068012 */ lui $a2, %hi(D_8011AE74) # $a2, 0x8012 /* 021020 80020420 8CC6AE74 */ lw $a2, %lo(D_8011AE74)($a2) @@ -1322,7 +1322,7 @@ glabel func_8001F460 /* 0213AC 800207AC 8FA7011C */ lw $a3, 0x11c($sp) /* 0213B0 800207B0 8FA60120 */ lw $a2, 0x120($sp) /* 0213B4 800207B4 8FA50124 */ lw $a1, 0x124($sp) -/* 0213B8 800207B8 0C00455C */ jal func_80011570 +/* 0213B8 800207B8 0C00455C */ jal move_object /* 0213BC 800207BC 00000000 */ nop /* 0213C0 800207C0 9263002E */ lbu $v1, 0x2e($s3) /* 0213C4 800207C4 24010001 */ li $at, 1 diff --git a/asm/non_matchings/objects/func_80021104.s b/asm/non_matchings/objects/func_80021104.s index 71661ed9..c76adace 100644 --- a/asm/non_matchings/objects/func_80021104.s +++ b/asm/non_matchings/objects/func_80021104.s @@ -25,7 +25,7 @@ glabel func_80021104 /* 021D5C 8002115C 80A40030 */ lb $a0, 0x30($a1) /* 021D60 80021160 0C01997A */ jal set_object_stack_pos /* 021D64 80021164 AFA30018 */ sw $v1, 0x18($sp) -/* 021D68 80021168 0C01A73F */ jal func_80069CFC +/* 021D68 80021168 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 021D6C 8002116C 00000000 */ nop /* 021D70 80021170 8FA30018 */ lw $v1, 0x18($sp) /* 021D74 80021174 C444000C */ lwc1 $f4, 0xc($v0) diff --git a/asm/non_matchings/objects/func_80021600.s b/asm/non_matchings/objects/func_80021600.s index 5689fbbb..529e6f9c 100644 --- a/asm/non_matchings/objects/func_80021600.s +++ b/asm/non_matchings/objects/func_80021600.s @@ -272,7 +272,7 @@ glabel func_80021600 /* 022608 80021A08 AFA9005C */ sw $t1, 0x5c($sp) /* 02260C 80021A0C 0C01997A */ jal set_object_stack_pos /* 022610 80021A10 AFA6004C */ sw $a2, 0x4c($sp) -/* 022614 80021A14 0C01A73F */ jal func_80069CFC +/* 022614 80021A14 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 022618 80021A18 00000000 */ nop /* 02261C 80021A1C 3C078012 */ lui $a3, %hi(D_8011AE74) # $a3, 0x8012 /* 022620 80021A20 8CE7AE74 */ lw $a3, %lo(D_8011AE74)($a3) @@ -400,7 +400,7 @@ glabel func_80021600 /* 0227F8 80021BF8 AFB80074 */ sw $t8, 0x74($sp) /* 0227FC 80021BFC 0C01997A */ jal set_object_stack_pos /* 022800 80021C00 AFA50150 */ sw $a1, 0x150($sp) -/* 022804 80021C04 0C01A73F */ jal func_80069CFC +/* 022804 80021C04 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 022808 80021C08 00000000 */ nop /* 02280C 80021C0C 3C078012 */ lui $a3, %hi(D_8011AE74) # $a3, 0x8012 /* 022810 80021C10 8CE7AE74 */ lw $a3, %lo(D_8011AE74)($a3) @@ -526,7 +526,7 @@ glabel func_80021600 /* 0229DC 80021DDC 44064000 */ mfc1 $a2, $f8 /* 0229E0 80021DE0 46043181 */ sub.s $f6, $f6, $f4 /* 0229E4 80021DE4 44073000 */ mfc1 $a3, $f6 -/* 0229E8 80021DE8 0C00455C */ jal func_80011570 +/* 0229E8 80021DE8 0C00455C */ jal move_object /* 0229EC 80021DEC E7A600F0 */ swc1 $f6, 0xf0($sp) /* 0229F0 80021DF0 8FA600EC */ lw $a2, 0xec($sp) /* 0229F4 80021DF4 27A400D0 */ addiu $a0, $sp, 0xd0 diff --git a/asm/non_matchings/objects/func_800230D0.s b/asm/non_matchings/objects/func_800230D0.s index 7cf37a13..f1fd7805 100644 --- a/asm/non_matchings/objects/func_800230D0.s +++ b/asm/non_matchings/objects/func_800230D0.s @@ -202,7 +202,7 @@ glabel func_800230D0 /* 023FCC 800233CC 8FBF001C */ lw $ra, 0x1c($sp) /* 023FD0 800233D0 0C01997A */ jal set_object_stack_pos /* 023FD4 800233D4 AFA8005C */ sw $t0, 0x5c($sp) -/* 023FD8 800233D8 0C01A73F */ jal func_80069CFC +/* 023FD8 800233D8 0C01A73F */ jal get_active_camera_segment_no_cutscenes /* 023FDC 800233DC 00000000 */ nop /* 023FE0 800233E0 C612000C */ lwc1 $f18, 0xc($s0) /* 023FE4 800233E4 8FA8005C */ lw $t0, 0x5c($sp) diff --git a/asm/non_matchings/racer/func_80042D20.s b/asm/non_matchings/racer/func_80042D20.s index eb4f5b23..25a45ab0 100644 --- a/asm/non_matchings/racer/func_80042D20.s +++ b/asm/non_matchings/racer/func_80042D20.s @@ -571,7 +571,7 @@ glabel func_80042D20 /* 044100 80043500 AFA9005C */ sw $t1, 0x5c($sp) /* 044104 80043504 A3AA004B */ sb $t2, 0x4b($sp) /* 044108 80043508 A7AC0034 */ sh $t4, 0x34($sp) -/* 04410C 8004350C 0C011114 */ jal func_80044450 +/* 04410C 8004350C 0C011114 */ jal roll_percent_chance /* 044110 80043510 A7AD0078 */ sh $t5, 0x78($sp) /* 044114 80043514 8FA9005C */ lw $t1, 0x5c($sp) /* 044118 80043518 83AA004B */ lb $t2, 0x4b($sp) @@ -592,7 +592,7 @@ glabel func_80042D20 /* 044150 80043550 AFA9005C */ sw $t1, 0x5c($sp) /* 044154 80043554 A3AA004B */ sb $t2, 0x4b($sp) /* 044158 80043558 A7AC0034 */ sh $t4, 0x34($sp) -/* 04415C 8004355C 0C011114 */ jal func_80044450 +/* 04415C 8004355C 0C011114 */ jal roll_percent_chance /* 044160 80043560 A7AD0078 */ sh $t5, 0x78($sp) /* 044164 80043564 8FA9005C */ lw $t1, 0x5c($sp) /* 044168 80043568 83AA004B */ lb $t2, 0x4b($sp) @@ -603,10 +603,10 @@ glabel func_80042D20 /* 04417C 8004357C A2000172 */ sb $zero, 0x172($s0) .L80043580: /* 044180 80043580 820F01D3 */ lb $t7, 0x1d3($s0) -/* 044184 80043584 3C19800E */ lui $t9, %hi(D_800DCD90) # $t9, 0x800e +/* 044184 80043584 3C19800E */ lui $t9, %hi(gRacerAIBalloonActionTable) # $t9, 0x800e /* 044188 80043588 15E00016 */ bnez $t7, .L800435E4 /* 04418C 8004358C 032AC821 */ addu $t9, $t9, $t2 -/* 044190 80043590 8339CD90 */ lb $t9, %lo(D_800DCD90)($t9) +/* 044190 80043590 8339CD90 */ lb $t9, %lo(gRacerAIBalloonActionTable)($t9) /* 044194 80043594 24010004 */ li $at, 4 /* 044198 80043598 17210012 */ bne $t9, $at, .L800435E4 /* 04419C 8004359C 00000000 */ nop @@ -614,7 +614,7 @@ glabel func_80042D20 /* 0441A4 800435A4 AFA9005C */ sw $t1, 0x5c($sp) /* 0441A8 800435A8 A3AA004B */ sb $t2, 0x4b($sp) /* 0441AC 800435AC A7AC0034 */ sh $t4, 0x34($sp) -/* 0441B0 800435B0 0C011114 */ jal func_80044450 +/* 0441B0 800435B0 0C011114 */ jal roll_percent_chance /* 0441B4 800435B4 A7AD0078 */ sh $t5, 0x78($sp) /* 0441B8 800435B8 8FA9005C */ lw $t1, 0x5c($sp) /* 0441BC 800435BC 83AA004B */ lb $t2, 0x4b($sp) @@ -629,9 +629,9 @@ glabel func_80042D20 /* 0441E0 800435E0 AC2ED530 */ sw $t6, %lo(gCurrentButtonsReleased)($at) .L800435E4: /* 0441E4 800435E4 820F0173 */ lb $t7, 0x173($s0) -/* 0441E8 800435E8 3C19800E */ lui $t9, %hi(D_800DCD90) # $t9, 0x800e +/* 0441E8 800435E8 3C19800E */ lui $t9, %hi(gRacerAIBalloonActionTable) # $t9, 0x800e /* 0441EC 800435EC 11E00065 */ beqz $t7, .L80043784 -/* 0441F0 800435F0 2739CD90 */ addiu $t9, %lo(D_800DCD90) # addiu $t9, $t9, -0x3270 +/* 0441F0 800435F0 2739CD90 */ addiu $t9, %lo(gRacerAIBalloonActionTable) # addiu $t9, $t9, -0x3270 /* 0441F4 800435F4 01591821 */ addu $v1, $t2, $t9 /* 0441F8 800435F8 80780000 */ lb $t8, ($v1) /* 0441FC 800435FC 24010001 */ li $at, 1 @@ -662,7 +662,7 @@ glabel func_80042D20 /* 04425C 8004365C AFA3002C */ sw $v1, 0x2c($sp) /* 044260 80043660 AFA9005C */ sw $t1, 0x5c($sp) /* 044264 80043664 A7AC0034 */ sh $t4, 0x34($sp) -/* 044268 80043668 0C011114 */ jal func_80044450 +/* 044268 80043668 0C011114 */ jal roll_percent_chance /* 04426C 8004366C A7AD0078 */ sh $t5, 0x78($sp) /* 044270 80043670 8FA3002C */ lw $v1, 0x2c($sp) /* 044274 80043674 8FA9005C */ lw $t1, 0x5c($sp) @@ -714,7 +714,7 @@ glabel func_80042D20 .L80043728: /* 044328 80043728 AFA9005C */ sw $t1, 0x5c($sp) /* 04432C 8004372C A7AC0034 */ sh $t4, 0x34($sp) -/* 044330 80043730 0C011114 */ jal func_80044450 +/* 044330 80043730 0C011114 */ jal roll_percent_chance /* 044334 80043734 A7AD0078 */ sh $t5, 0x78($sp) /* 044338 80043738 8FA9005C */ lw $t1, 0x5c($sp) /* 04433C 8004373C 87AC0034 */ lh $t4, 0x34($sp) @@ -751,7 +751,7 @@ glabel func_80042D20 /* 0443B0 800437B0 87A4003A */ lh $a0, 0x3a($sp) /* 0443B4 800437B4 AFA9005C */ sw $t1, 0x5c($sp) /* 0443B8 800437B8 A7AC0034 */ sh $t4, 0x34($sp) -/* 0443BC 800437BC 0C011114 */ jal func_80044450 +/* 0443BC 800437BC 0C011114 */ jal roll_percent_chance /* 0443C0 800437C0 A7AD0078 */ sh $t5, 0x78($sp) /* 0443C4 800437C4 8FA9005C */ lw $t1, 0x5c($sp) /* 0443C8 800437C8 87AC0034 */ lh $t4, 0x34($sp) @@ -866,7 +866,7 @@ glabel func_80042D20 /* 04455C 8004395C 00000000 */ nop /* 044560 80043960 A20F01CA */ sb $t7, 0x1ca($s0) /* 044564 80043964 87A4003C */ lh $a0, 0x3c($sp) -/* 044568 80043968 0C011114 */ jal func_80044450 +/* 044568 80043968 0C011114 */ jal roll_percent_chance /* 04456C 8004396C AFA9005C */ sw $t1, 0x5c($sp) /* 044570 80043970 8FA9005C */ lw $t1, 0x5c($sp) /* 044574 80043974 10400005 */ beqz $v0, .L8004398C diff --git a/asm/non_matchings/racer/func_8004447C.s b/asm/non_matchings/racer/func_8004447C.s index c2323c13..96947e56 100644 --- a/asm/non_matchings/racer/func_8004447C.s +++ b/asm/non_matchings/racer/func_8004447C.s @@ -169,7 +169,7 @@ glabel L800446AC /* 0452C8 800446C8 8FAF0038 */ lw $t7, 0x38($sp) /* 0452CC 800446CC 00000000 */ nop /* 0452D0 800446D0 81E40003 */ lb $a0, 3($t7) -/* 0452D4 800446D4 0C011114 */ jal func_80044450 +/* 0452D4 800446D4 0C011114 */ jal roll_percent_chance /* 0452D8 800446D8 00000000 */ nop /* 0452DC 800446DC 10400003 */ beqz $v0, .L800446EC /* 0452E0 800446E0 24190003 */ li $t9, 3 @@ -179,7 +179,7 @@ glabel L800446AC /* 0452EC 800446EC 8FB80038 */ lw $t8, 0x38($sp) /* 0452F0 800446F0 00000000 */ nop /* 0452F4 800446F4 83040006 */ lb $a0, 6($t8) -/* 0452F8 800446F8 0C011114 */ jal func_80044450 +/* 0452F8 800446F8 0C011114 */ jal roll_percent_chance /* 0452FC 800446FC 00000000 */ nop /* 045300 80044700 1040000D */ beqz $v0, .L80044738 /* 045304 80044704 8FAF0038 */ lw $t7, 0x38($sp) @@ -198,7 +198,7 @@ glabel L800446AC .L80044738: /* 045338 80044738 00000000 */ nop /* 04533C 8004473C 81E40005 */ lb $a0, 5($t7) -/* 045340 80044740 0C011114 */ jal func_80044450 +/* 045340 80044740 0C011114 */ jal roll_percent_chance /* 045344 80044744 00000000 */ nop /* 045348 80044748 1040000E */ beqz $v0, .L80044784 /* 04534C 8004474C 3C188012 */ lui $t8, %hi(D_8011D58C) # $t8, 0x8012 @@ -223,7 +223,7 @@ glabel L800446AC /* 045394 80044794 A60C01C6 */ sh $t4, 0x1c6($s0) .L80044798: /* 045398 80044798 81A40006 */ lb $a0, 6($t5) -/* 04539C 8004479C 0C011114 */ jal func_80044450 +/* 04539C 8004479C 0C011114 */ jal roll_percent_chance /* 0453A0 800447A0 00000000 */ nop /* 0453A4 800447A4 1040000D */ beqz $v0, .L800447DC /* 0453A8 800447A8 8FB80038 */ lw $t8, 0x38($sp) @@ -242,11 +242,11 @@ glabel L800446AC .L800447DC: /* 0453DC 800447DC 00000000 */ nop /* 0453E0 800447E0 83040000 */ lb $a0, ($t8) -/* 0453E4 800447E4 0C011114 */ jal func_80044450 +/* 0453E4 800447E4 0C011114 */ jal roll_percent_chance /* 0453E8 800447E8 00000000 */ nop /* 0453EC 800447EC 10400081 */ beqz $v0, .L800449F4 /* 0453F0 800447F0 24180002 */ li $t8, 2 -/* 0453F4 800447F4 0C011114 */ jal func_80044450 +/* 0453F4 800447F4 0C011114 */ jal roll_percent_chance /* 0453F8 800447F8 24040032 */ li $a0, 50 /* 0453FC 800447FC 8FAC0038 */ lw $t4, 0x38($sp) /* 045400 80044800 10400003 */ beqz $v0, .L80044810 @@ -255,7 +255,7 @@ glabel L800446AC /* 04540C 8004480C 240A0001 */ li $t2, 1 .L80044810: /* 045410 80044810 81840001 */ lb $a0, 1($t4) -/* 045414 80044814 0C011114 */ jal func_80044450 +/* 045414 80044814 0C011114 */ jal roll_percent_chance /* 045418 80044818 A7AA004C */ sh $t2, 0x4c($sp) /* 04541C 8004481C 87AA004C */ lh $t2, 0x4c($sp) /* 045420 80044820 10400003 */ beqz $v0, .L80044830 @@ -343,7 +343,7 @@ glabel L800446AC /* 04554C 8004494C 00000000 */ nop /* 045550 80044950 81E40002 */ lb $a0, 2($t7) /* 045554 80044954 A7A8004A */ sh $t0, 0x4a($sp) -/* 045558 80044958 0C011114 */ jal func_80044450 +/* 045558 80044958 0C011114 */ jal roll_percent_chance /* 04555C 8004495C A7A60050 */ sh $a2, 0x50($sp) /* 045560 80044960 87A60050 */ lh $a2, 0x50($sp) /* 045564 80044964 87A8004A */ lh $t0, 0x4a($sp) diff --git a/asm/non_matchings/racer/func_800452A0.s b/asm/non_matchings/racer/func_800452A0.s index 1689db3e..08a27b36 100644 --- a/asm/non_matchings/racer/func_800452A0.s +++ b/asm/non_matchings/racer/func_800452A0.s @@ -141,7 +141,7 @@ glabel func_800452A0 /* 046078 80045478 8FA80074 */ lw $t0, 0x74($sp) /* 04607C 8004547C 00000000 */ nop /* 046080 80045480 81040006 */ lb $a0, 6($t0) -/* 046084 80045484 0C011114 */ jal func_80044450 +/* 046084 80045484 0C011114 */ jal roll_percent_chance /* 046088 80045488 00000000 */ nop /* 04608C 8004548C 10400004 */ beqz $v0, .L800454A0 /* 046090 80045490 8FA90074 */ lw $t1, 0x74($sp) @@ -151,7 +151,7 @@ glabel func_800452A0 .L800454A0: /* 0460A0 800454A0 24120001 */ li $s2, 1 /* 0460A4 800454A4 81240002 */ lb $a0, 2($t1) -/* 0460A8 800454A8 0C011114 */ jal func_80044450 +/* 0460A8 800454A8 0C011114 */ jal roll_percent_chance /* 0460AC 800454AC 00000000 */ nop /* 0460B0 800454B0 10400007 */ beqz $v0, .L800454D0 /* 0460B4 800454B4 24010002 */ li $at, 2 diff --git a/asm/non_matchings/racer/func_80046524.s b/asm/non_matchings/racer/func_80046524.s index db6a2d52..ad59f51b 100644 --- a/asm/non_matchings/racer/func_80046524.s +++ b/asm/non_matchings/racer/func_80046524.s @@ -65,7 +65,7 @@ glabel func_80046524 /* 047140 80046540 0C00384E */ jal func_8000E138 /* 047144 80046544 AFA5012C */ sw $a1, 0x12c($sp) /* 047148 80046548 10400009 */ beqz $v0, .L80046570 -/* 04714C 8004654C 3C0A8012 */ lui $t2, %hi(D_8011D586) # $t2, 0x8012 +/* 04714C 8004654C 3C0A8012 */ lui $t2, %hi(gDialogueCameraAngle) # $t2, 0x8012 /* 047150 80046550 3C01800E */ lui $at, %hi(D_800E63A8 + 4) # $at, 0x800e /* 047154 80046554 C7A4012C */ lwc1 $f4, 0x12c($sp) /* 047158 80046558 C42963A8 */ lwc1 $f9, %lo(D_800E63A8)($at) @@ -101,7 +101,7 @@ glabel func_80046524 /* 0471C4 800465C4 3C018012 */ lui $at, %hi(D_8011D558) # $at, 0x8012 /* 0471C8 800465C8 AC20D558 */ sw $zero, %lo(D_8011D558)($at) /* 0471CC 800465CC C626000C */ lwc1 $f6, 0xc($s1) -/* 0471D0 800465D0 854AD586 */ lh $t2, %lo(D_8011D586)($t2) +/* 0471D0 800465D0 854AD586 */ lh $t2, %lo(gDialogueCameraAngle)($t2) /* 0471D4 800465D4 E7A60110 */ swc1 $f6, 0x110($sp) /* 0471D8 800465D8 C6280010 */ lwc1 $f8, 0x10($s1) /* 0471DC 800465DC 448A2000 */ mtc1 $t2, $f4 @@ -186,7 +186,7 @@ glabel func_80046524 /* 047304 80046704 0C014D71 */ jal func_800535C4 /* 047308 80046708 02002825 */ move $a1, $s0 /* 04730C 8004670C 02202025 */ move $a0, $s1 -/* 047310 80046710 0C01231F */ jal func_80048C7C +/* 047310 80046710 0C01231F */ jal racer_attack_handler_hovercraft /* 047314 80046714 02002825 */ move $a1, $s0 /* 047318 80046718 3C188012 */ lui $t8, %hi(gCurrentPlayerIndex) # $t8, 0x8012 /* 04731C 8004671C 8F18D55C */ lw $t8, %lo(gCurrentPlayerIndex)($t8) @@ -673,9 +673,9 @@ glabel func_80046524 /* 047A18 80046E18 A60C01A4 */ sh $t4, 0x1a4($s0) .L80046E1C: /* 047A1C 80046E1C 820301D4 */ lb $v1, 0x1d4($s0) -/* 047A20 80046E20 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 +/* 047A20 80046E20 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 /* 047A24 80046E24 10600041 */ beqz $v1, .L80046F2C -/* 047A28 80046E28 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 047A28 80046E28 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 047A2C 80046E2C 86020160 */ lh $v0, 0x160($s0) /* 047A30 80046E30 A20001D5 */ sb $zero, 0x1d5($s0) /* 047A34 80046E34 18600018 */ blez $v1, .L80046E98 @@ -1758,7 +1758,7 @@ glabel func_80046524 /* 048A20 80047E20 C628001C */ lwc1 $f8, 0x1c($s1) /* 048A24 80047E24 46103282 */ mul.s $f10, $f6, $f16 /* 048A28 80047E28 C6260020 */ lwc1 $f6, 0x20($s1) -/* 048A2C 80047E2C 3C018012 */ lui $at, %hi(D_8011D578) # $at, 0x8012 +/* 048A2C 80047E2C 3C018012 */ lui $at, %hi(gRacerMagnetVelX) # $at, 0x8012 /* 048A30 80047E30 460A4101 */ sub.s $f4, $f8, $f10 /* 048A34 80047E34 E624001C */ swc1 $f4, 0x1c($s1) /* 048A38 80047E38 C608003C */ lwc1 $f8, 0x3c($s0) @@ -1776,10 +1776,10 @@ glabel func_80046524 /* 048A68 80047E68 00000000 */ nop /* 048A6C 80047E6C 11E00007 */ beqz $t7, .L80047E8C /* 048A70 80047E70 00000000 */ nop -/* 048A74 80047E74 C426D578 */ lwc1 $f6, %lo(D_8011D578)($at) -/* 048A78 80047E78 3C018012 */ lui $at, %hi(D_8011D57C) # $at, 0x8012 +/* 048A74 80047E74 C426D578 */ lwc1 $f6, %lo(gRacerMagnetVelX)($at) +/* 048A78 80047E78 3C018012 */ lui $at, %hi(gRacerMagnetVelZ) # $at, 0x8012 /* 048A7C 80047E7C E626001C */ swc1 $f6, 0x1c($s1) -/* 048A80 80047E80 C428D57C */ lwc1 $f8, %lo(D_8011D57C)($at) +/* 048A80 80047E80 C428D57C */ lwc1 $f8, %lo(gRacerMagnetVelZ)($at) /* 048A84 80047E84 00000000 */ nop /* 048A88 80047E88 E6280024 */ swc1 $f8, 0x24($s1) .L80047E8C: @@ -1917,7 +1917,7 @@ glabel func_80046524 /* 048C6C 8004806C 44063000 */ mfc1 $a2, $f6 /* 048C70 80048070 460E5100 */ add.s $f4, $f10, $f14 /* 048C74 80048074 44072000 */ mfc1 $a3, $f4 -/* 048C78 80048078 0C00455C */ jal func_80011570 +/* 048C78 80048078 0C00455C */ jal move_object /* 048C7C 8004807C 00000000 */ nop /* 048C80 80048080 1040000F */ beqz $v0, .L800480C0 /* 048C84 80048084 3C198012 */ lui $t9, %hi(gCurrentPlayerIndex) # $t9, 0x8012 @@ -1934,7 +1934,7 @@ glabel func_80046524 /* 048CAC 800480AC 02202025 */ move $a0, $s1 /* 048CB0 800480B0 02002825 */ move $a1, $s0 /* 048CB4 800480B4 E7A800E8 */ swc1 $f8, 0xe8($sp) -/* 048CB8 800480B8 0C0141D5 */ jal func_80050754 +/* 048CB8 800480B8 0C0141D5 */ jal racer_approach_object /* 048CBC 800480BC E7A600E4 */ swc1 $f6, 0xe4($sp) .L800480C0: /* 048CC0 800480C0 C60A00D0 */ lwc1 $f10, 0xd0($s0) @@ -2108,7 +2108,7 @@ glabel func_80046524 /* 048F34 80048334 27A600D4 */ addiu $a2, $sp, 0xd4 /* 048F38 80048338 AFA80014 */ sw $t0, 0x14($sp) /* 048F3C 8004833C E7AA0018 */ swc1 $f10, 0x18($sp) -/* 048F40 80048340 0C012538 */ jal func_800494E0 +/* 048F40 80048340 0C012538 */ jal rotate_racer_in_water /* 048F44 80048344 AFAD0010 */ sw $t5, 0x10($sp) /* 048F48 80048348 C60C00C0 */ lwc1 $f12, 0xc0($s0) /* 048F4C 8004834C 00000000 */ nop @@ -2494,8 +2494,8 @@ glabel func_80046524 /* 0494E0 800488E0 E6260020 */ swc1 $f6, 0x20($s1) .L800488E4: /* 0494E4 800488E4 862A0000 */ lh $t2, ($s1) -/* 0494E8 800488E8 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 0494EC 800488EC 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 0494E8 800488E8 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 0494EC 800488EC 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 0494F0 800488F0 000A6023 */ negu $t4, $t2 /* 0494F4 800488F4 A4AC0000 */ sh $t4, ($a1) /* 0494F8 800488F8 862B0002 */ lh $t3, 2($s1) @@ -2726,7 +2726,7 @@ glabel func_80046524 /* 049840 80048C40 A04D003A */ sb $t5, 0x3a($v0) /* 049844 80048C44 8FA7012C */ lw $a3, 0x12c($sp) .L80048C48: -/* 049848 80048C48 0C01602D */ jal func_800580B4 +/* 049848 80048C48 0C01602D */ jal second_racer_camera_update /* 04984C 80048C4C 02002825 */ move $a1, $s0 /* 049850 80048C50 83AA0067 */ lb $t2, 0x67($sp) /* 049854 80048C54 02202025 */ move $a0, $s1 diff --git a/asm/non_matchings/racer/func_800494E0.s b/asm/non_matchings/racer/func_800494E0.s index 3717d2c1..7799286b 100644 --- a/asm/non_matchings/racer/func_800494E0.s +++ b/asm/non_matchings/racer/func_800494E0.s @@ -3,7 +3,7 @@ glabel D_800E64A0 .double 0.16666666666666666 .text -glabel func_800494E0 +glabel rotate_racer_in_water /* 04A0E0 800494E0 27BDFF78 */ addiu $sp, $sp, -0x88 /* 04A0E4 800494E4 8FB80098 */ lw $t8, 0x98($sp) /* 04A0E8 800494E8 00077600 */ sll $t6, $a3, 0x18 @@ -64,8 +64,8 @@ glabel func_800494E0 /* 04A1BC 800495BC E6300014 */ swc1 $f16, 0x14($s1) .L800495C0: /* 04A1C0 800495C0 86280000 */ lh $t0, ($s1) -/* 04A1C4 800495C4 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 04A1C8 800495C8 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 04A1C4 800495C4 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 04A1C8 800495C8 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 04A1CC 800495CC 3C013F80 */ li $at, 0x3F800000 # 1.000000 /* 04A1D0 800495D0 44815000 */ mtc1 $at, $f10 /* 04A1D4 800495D4 00084823 */ negu $t1, $t0 diff --git a/asm/non_matchings/racer/func_80049794.s b/asm/non_matchings/racer/func_80049794.s index b42e492d..0982a087 100644 --- a/asm/non_matchings/racer/func_80049794.s +++ b/asm/non_matchings/racer/func_80049794.s @@ -384,7 +384,7 @@ glabel func_80049794 /* 04A858 80049C58 0C014D71 */ jal func_800535C4 /* 04A85C 80049C5C 02002825 */ move $a1, $s0 /* 04A860 80049C60 02202025 */ move $a0, $s1 -/* 04A864 80049C64 0C013050 */ jal func_8004C140 +/* 04A864 80049C64 0C013050 */ jal racer_attack_handler_plane /* 04A868 80049C68 02002825 */ move $a1, $s0 /* 04A86C 80049C6C 3C0D8012 */ lui $t5, %hi(gCurrentPlayerIndex) # $t5, 0x8012 /* 04A870 80049C70 8DADD55C */ lw $t5, %lo(gCurrentPlayerIndex)($t5) @@ -550,8 +550,8 @@ glabel func_80049794 /* 04AAC8 80049EC8 E7A200C4 */ swc1 $f2, 0xc4($sp) .L80049ECC: /* 04AACC 80049ECC 862E0000 */ lh $t6, ($s1) -/* 04AAD0 80049ED0 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 04AAD4 80049ED4 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 04AAD0 80049ED0 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 04AAD4 80049ED4 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 04AAD8 80049ED8 A4AE0000 */ sh $t6, ($a1) /* 04AADC 80049EDC 862F0002 */ lh $t7, 2($s1) /* 04AAE0 80049EE0 3C013F80 */ li $at, 0x3F800000 # 1.000000 @@ -606,7 +606,7 @@ glabel func_80049794 /* 04ABA4 80049FA4 00000000 */ nop /* 04ABA8 80049FA8 8FA400F8 */ lw $a0, 0xf8($sp) /* 04ABAC 80049FAC 02202825 */ move $a1, $s1 -/* 04ABB0 80049FB0 0C013028 */ jal func_8004C0A0 +/* 04ABB0 80049FB0 0C013028 */ jal apply_plane_tilt_anim /* 04ABB4 80049FB4 02003025 */ move $a2, $s0 .L80049FB8: /* 04ABB8 80049FB8 86020000 */ lh $v0, ($s0) @@ -2347,11 +2347,11 @@ glabel func_80049794 /* 04C504 8004B904 820D0175 */ lb $t5, 0x175($s0) /* 04C508 8004B908 00000000 */ nop /* 04C50C 8004B90C 11A00007 */ beqz $t5, .L8004B92C -/* 04C510 8004B910 3C018012 */ lui $at, %hi(D_8011D578) # $at, 0x8012 -/* 04C514 8004B914 C428D578 */ lwc1 $f8, %lo(D_8011D578)($at) -/* 04C518 8004B918 3C018012 */ lui $at, %hi(D_8011D57C) # $at, 0x8012 +/* 04C510 8004B910 3C018012 */ lui $at, %hi(gRacerMagnetVelX) # $at, 0x8012 +/* 04C514 8004B914 C428D578 */ lwc1 $f8, %lo(gRacerMagnetVelX)($at) +/* 04C518 8004B918 3C018012 */ lui $at, %hi(gRacerMagnetVelZ) # $at, 0x8012 /* 04C51C 8004B91C E628001C */ swc1 $f8, 0x1c($s1) -/* 04C520 8004B920 C426D57C */ lwc1 $f6, %lo(D_8011D57C)($at) +/* 04C520 8004B920 C426D57C */ lwc1 $f6, %lo(gRacerMagnetVelZ)($at) /* 04C524 8004B924 00000000 */ nop /* 04C528 8004B928 E6260024 */ swc1 $f6, 0x24($s1) .L8004B92C: @@ -2449,7 +2449,7 @@ glabel func_80049794 /* 04C674 8004BA74 46006482 */ mul.s $f18, $f12, $f0 /* 04C678 8004BA78 44065000 */ mfc1 $a2, $f10 /* 04C67C 8004BA7C 44079000 */ mfc1 $a3, $f18 -/* 04C680 8004BA80 0C00455C */ jal func_80011570 +/* 04C680 8004BA80 0C00455C */ jal move_object /* 04C684 8004BA84 00000000 */ nop /* 04C688 8004BA88 C7AC00EC */ lwc1 $f12, 0xec($sp) /* 04C68C 8004BA8C 10400006 */ beqz $v0, .L8004BAA8 @@ -2468,7 +2468,7 @@ glabel func_80049794 .L8004BABC: /* 04C6BC 8004BABC 02202025 */ move $a0, $s1 /* 04C6C0 8004BAC0 02002825 */ move $a1, $s0 -/* 04C6C4 8004BAC4 0C0141D5 */ jal func_80050754 +/* 04C6C4 8004BAC4 0C0141D5 */ jal racer_approach_object /* 04C6C8 8004BAC8 E7AC00EC */ swc1 $f12, 0xec($sp) /* 04C6CC 8004BACC 3C028012 */ lui $v0, %hi(gCurrentPlayerIndex) # $v0, 0x8012 /* 04C6D0 8004BAD0 8C42D55C */ lw $v0, %lo(gCurrentPlayerIndex)($v0) @@ -2539,7 +2539,7 @@ glabel func_80049794 /* 04C7BC 8004BBBC 820201D2 */ lb $v0, 0x1d2($s0) /* 04C7C0 8004BBC0 3C0B8012 */ lui $t3, %hi(gRaceStartTimer) # $t3, 0x8012 /* 04C7C4 8004BBC4 1040000B */ beqz $v0, .L8004BBF4 -/* 04C7C8 8004BBC8 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 +/* 04C7C8 8004BBC8 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 /* 04C7CC 8004BBCC 8FB900F8 */ lw $t9, 0xf8($sp) /* 04C7D0 8004BBD0 00000000 */ nop /* 04C7D4 8004BBD4 00597823 */ subu $t7, $v0, $t9 @@ -2579,7 +2579,7 @@ glabel func_80049794 /* 04C854 8004BC54 8D6BD540 */ lw $t3, %lo(gRaceStartTimer)($t3) /* 04C858 8004BC58 24010064 */ li $at, 100 /* 04C85C 8004BC5C 15610005 */ bne $t3, $at, .L8004BC74 -/* 04C860 8004BC60 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 04C860 8004BC60 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 04C864 8004BC64 3C01C0A0 */ li $at, 0xC0A00000 # -5.000000 /* 04C868 8004BC68 44813000 */ mtc1 $at, $f6 /* 04C86C 8004BC6C 00000000 */ nop @@ -2856,7 +2856,7 @@ glabel func_80049794 /* 04CC5C 8004C05C AC590000 */ sw $t9, ($v0) .L8004C060: /* 04CC60 8004C060 8FA700FC */ lw $a3, 0xfc($sp) -/* 04CC64 8004C064 0C01602D */ jal func_800580B4 +/* 04CC64 8004C064 0C01602D */ jal second_racer_camera_update /* 04CC68 8004C068 24060001 */ li $a2, 1 /* 04CC6C 8004C06C 83AD005F */ lb $t5, 0x5f($sp) /* 04CC70 8004C070 02202025 */ move $a0, $s1 diff --git a/asm/non_matchings/racer/func_8004CC20.s b/asm/non_matchings/racer/func_8004CC20.s index 602fe036..26328fee 100644 --- a/asm/non_matchings/racer/func_8004CC20.s +++ b/asm/non_matchings/racer/func_8004CC20.s @@ -110,8 +110,8 @@ glabel func_8004CC20 /* 04D980 8004CD80 0C015D7B */ jal func_800575EC /* 04D984 8004CD84 A6000164 */ sh $zero, 0x164($s0) /* 04D988 8004CD88 862F0000 */ lh $t7, ($s1) -/* 04D98C 8004CD8C 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 04D990 8004CD90 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 04D98C 8004CD8C 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 04D990 8004CD90 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 04D994 8004CD94 A4AF0000 */ sh $t7, ($a1) /* 04D998 8004CD98 86380002 */ lh $t8, 2($s1) /* 04D99C 8004CD9C 44800000 */ mtc1 $zero, $f0 @@ -535,7 +535,7 @@ glabel func_8004CC20 /* 04DFD4 8004D3D4 46026402 */ mul.s $f16, $f12, $f2 /* 04DFD8 8004D3D8 44063000 */ mfc1 $a2, $f6 /* 04DFDC 8004D3DC 44078000 */ mfc1 $a3, $f16 -/* 04DFE0 8004D3E0 0C00455C */ jal func_80011570 +/* 04DFE0 8004D3E0 0C00455C */ jal move_object /* 04DFE4 8004D3E4 00000000 */ nop /* 04DFE8 8004D3E8 3C098012 */ lui $t1, %hi(gCurrentPlayerIndex) # $t1, 0x8012 /* 04DFEC 8004D3EC 2529D55C */ addiu $t1, %lo(gCurrentPlayerIndex) # addiu $t1, $t1, -0x2aa4 @@ -573,8 +573,8 @@ glabel func_8004CC20 /* 04E060 8004D460 C6240014 */ lwc1 $f4, 0x14($s1) /* 04E064 8004D464 46088281 */ sub.s $f10, $f16, $f8 /* 04E068 8004D468 862E0000 */ lh $t6, ($s1) -/* 04E06C 8004D46C 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 04E070 8004D470 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 04E06C 8004D46C 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 04E070 8004D470 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 04E074 8004D474 000E7823 */ negu $t7, $t6 /* 04E078 8004D478 44807000 */ mtc1 $zero, $f14 /* 04E07C 8004D47C 46023002 */ mul.s $f0, $f6, $f2 @@ -611,7 +611,7 @@ glabel func_8004CC20 /* 04E0F8 8004D4F8 8FA700DC */ lw $a3, 0xdc($sp) /* 04E0FC 8004D4FC 02202025 */ move $a0, $s1 /* 04E100 8004D500 02002825 */ move $a1, $s0 -/* 04E104 8004D504 0C01602D */ jal func_800580B4 +/* 04E104 8004D504 0C01602D */ jal second_racer_camera_update /* 04E108 8004D508 24060006 */ li $a2, 6 /* 04E10C 8004D50C 8E220060 */ lw $v0, 0x60($s1) /* 04E110 8004D510 02202025 */ move $a0, $s1 diff --git a/asm/non_matchings/racer/func_8004F7F4.s b/asm/non_matchings/racer/func_8004F7F4.s index 774bc375..8f938da2 100644 --- a/asm/non_matchings/racer/func_8004F7F4.s +++ b/asm/non_matchings/racer/func_8004F7F4.s @@ -49,7 +49,7 @@ glabel func_8004F7F4 /* 050464 8004F864 8FA600C0 */ lw $a2, 0xc0($sp) /* 050468 8004F868 8FA700C4 */ lw $a3, 0xc4($sp) /* 05046C 8004F86C 02202025 */ move $a0, $s1 -/* 050470 8004F870 0C015044 */ jal func_80054110 +/* 050470 8004F870 0C015044 */ jal update_onscreen_AI_racer /* 050474 8004F874 02002825 */ move $a1, $s0 /* 050478 8004F878 100003B2 */ b .L80050744 /* 05047C 8004F87C 8FBF002C */ lw $ra, 0x2c($sp) @@ -265,7 +265,7 @@ glabel func_8004F7F4 /* 050778 8004FB78 02002825 */ move $a1, $s0 /* 05077C 8004FB7C 8FA600C0 */ lw $a2, 0xc0($sp) /* 050780 8004FB80 02202025 */ move $a0, $s1 -/* 050784 8004FB84 0C014FA7 */ jal racer_attack_handler +/* 050784 8004FB84 0C014FA7 */ jal racer_attack_handler_car /* 050788 8004FB88 02002825 */ move $a1, $s0 /* 05078C 8004FB8C 820F01DB */ lb $t7, 0x1db($s0) /* 050790 8004FB90 00000000 */ nop @@ -292,7 +292,7 @@ glabel func_8004F7F4 /* 0507E0 8004FBE0 8E02001C */ lw $v0, 0x1c($s0) .L8004FBE4: /* 0507E4 8004FBE4 8FA700C4 */ lw $a3, 0xc4($sp) -/* 0507E8 8004FBE8 0C014B5F */ jal func_80052D7C +/* 0507E8 8004FBE8 0C014B5F */ jal update_car_velocity_offground /* 0507EC 8004FBEC 02002825 */ move $a1, $s0 /* 0507F0 8004FBF0 8E02001C */ lw $v0, 0x1c($s0) .L8004FBF4: @@ -380,7 +380,7 @@ glabel func_8004F7F4 /* 050920 8004FD20 27AB00B4 */ addiu $t3, $sp, 0xb4 /* 050924 8004FD24 AFAB0010 */ sw $t3, 0x10($sp) /* 050928 8004FD28 27A600B8 */ addiu $a2, $sp, 0xb8 -/* 05092C 8004FD2C 0C016420 */ jal func_80059080 +/* 05092C 8004FD2C 0C016420 */ jal set_position_goal_from_path /* 050930 8004FD30 27A700B0 */ addiu $a3, $sp, 0xb0 /* 050934 8004FD34 920C01F0 */ lbu $t4, 0x1f0($s0) # Used to access D_800E6620 and D_800E6620 + 4. @@ -556,8 +556,8 @@ glabel func_8004F7F4 /* 050BAC 8004FFAC 00000000 */ nop /* 050BB0 8004FFB0 860901A0 */ lh $t1, 0x1a0($s0) /* 050BB4 8004FFB4 8E0A010C */ lw $t2, 0x10c($s0) -/* 050BB8 8004FFB8 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 050BBC 8004FFBC 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 050BB8 8004FFB8 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 050BBC 8004FFBC 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 050BC0 8004FFC0 44800000 */ mtc1 $zero, $f0 /* 050BC4 8004FFC4 3C013F80 */ li $at, 0x3F800000 # 1.000000 /* 050BC8 8004FFC8 44812000 */ mtc1 $at, $f4 @@ -586,11 +586,11 @@ glabel func_8004F7F4 /* 050C20 80050020 820F0175 */ lb $t7, 0x175($s0) /* 050C24 80050024 00000000 */ nop /* 050C28 80050028 11E00007 */ beqz $t7, .L80050048 -/* 050C2C 8005002C 3C018012 */ lui $at, %hi(D_8011D578) # $at, 0x8012 -/* 050C30 80050030 C42AD578 */ lwc1 $f10, %lo(D_8011D578)($at) -/* 050C34 80050034 3C018012 */ lui $at, %hi(D_8011D57C) # $at, 0x8012 +/* 050C2C 8005002C 3C018012 */ lui $at, %hi(gRacerMagnetVelX) # $at, 0x8012 +/* 050C30 80050030 C42AD578 */ lwc1 $f10, %lo(gRacerMagnetVelX)($at) +/* 050C34 80050034 3C018012 */ lui $at, %hi(gRacerMagnetVelZ) # $at, 0x8012 /* 050C38 80050038 E62A001C */ swc1 $f10, 0x1c($s1) -/* 050C3C 8005003C C426D57C */ lwc1 $f6, %lo(D_8011D57C)($at) +/* 050C3C 8005003C C426D57C */ lwc1 $f6, %lo(gRacerMagnetVelZ)($at) /* 050C40 80050040 00000000 */ nop /* 050C44 80050044 E6260024 */ swc1 $f6, 0x24($s1) .L80050048: @@ -706,7 +706,7 @@ glabel func_8004F7F4 /* 050DDC 800501DC 46008482 */ mul.s $f18, $f16, $f0 /* 050DE0 800501E0 44063000 */ mfc1 $a2, $f6 /* 050DE4 800501E4 44079000 */ mfc1 $a3, $f18 -/* 050DE8 800501E8 0C00455C */ jal func_80011570 +/* 050DE8 800501E8 0C00455C */ jal move_object /* 050DEC 800501EC 00000000 */ nop /* 050DF0 800501F0 10400006 */ beqz $v0, .L8005020C /* 050DF4 800501F4 3C098012 */ lui $t1, %hi(gCurrentPlayerIndex) # $t1, 0x8012 @@ -721,7 +721,7 @@ glabel func_8004F7F4 /* 050E14 80050214 10000007 */ b .L80050234 /* 050E18 80050218 2401FFFF */ li $at, -1 .L8005021C: -/* 050E1C 8005021C 0C0141D5 */ jal func_80050754 +/* 050E1C 8005021C 0C0141D5 */ jal racer_approach_object /* 050E20 80050220 02002825 */ move $a1, $s0 /* 050E24 80050224 3C028012 */ lui $v0, %hi(gCurrentPlayerIndex) # $v0, 0x8012 /* 050E28 80050228 8C42D55C */ lw $v0, %lo(gCurrentPlayerIndex)($v0) @@ -749,8 +749,8 @@ glabel func_8004F7F4 /* 050E74 80050274 3C018012 */ lui $at, %hi(D_8011D548) # $at, 0x8012 /* 050E78 80050278 C428D548 */ lwc1 $f8, %lo(D_8011D548)($at) /* 050E7C 8005027C 3C018012 */ lui $at, %hi(D_8011D54C) # $at, 0x8012 -/* 050E80 80050280 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 050E84 80050284 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 050E80 80050280 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 050E84 80050284 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 050E88 80050288 44800000 */ mtc1 $zero, $f0 /* 050E8C 8005028C 27A40060 */ addiu $a0, $sp, 0x60 /* 050E90 80050290 E7AA00BC */ swc1 $f10, 0xbc($sp) @@ -1035,7 +1035,7 @@ glabel func_8004F7F4 .L800506C0: /* 0512C0 800506C0 02202025 */ move $a0, $s1 /* 0512C4 800506C4 02002825 */ move $a1, $s0 -/* 0512C8 800506C8 0C01602D */ jal func_800580B4 +/* 0512C8 800506C8 0C01602D */ jal second_racer_camera_update /* 0512CC 800506CC 00003025 */ move $a2, $zero /* 0512D0 800506D0 3C0A800E */ lui $t2, %hi(gNumViewports) # $t2, 0x800e /* 0512D4 800506D4 8D4ACB98 */ lw $t2, %lo(gNumViewports)($t2) diff --git a/asm/non_matchings/racer/func_80050A28.s b/asm/non_matchings/racer/func_80050A28.s index 16a2a166..95034901 100644 --- a/asm/non_matchings/racer/func_80050A28.s +++ b/asm/non_matchings/racer/func_80050A28.s @@ -64,8 +64,8 @@ glabel func_80050A28 .L80050A74: /* 051674 80050A74 E60E0084 */ swc1 $f14, 0x84($s0) /* 051678 80050A78 E60E0088 */ swc1 $f14, 0x88($s0) -/* 05167C 80050A7C 3C0E8012 */ lui $t6, %hi(D_8011D586) # $t6, 0x8012 -/* 051680 80050A80 85CED586 */ lh $t6, %lo(D_8011D586)($t6) +/* 05167C 80050A7C 3C0E8012 */ lui $t6, %hi(gDialogueCameraAngle) # $t6, 0x8012 +/* 051680 80050A80 85CED586 */ lh $t6, %lo(gDialogueCameraAngle)($t6) /* 051684 80050A84 3C088012 */ lui $t0, %hi(gCurrentRacerInput) # $t0, 0x8012 /* 051688 80050A88 15C00041 */ bnez $t6, .L80050B90 /* 05168C 80050A8C 2508D528 */ addiu $t0, %lo(gCurrentRacerInput) # addiu $t0, $t0, -0x2ad8 @@ -791,11 +791,11 @@ glabel func_80050A28 /* 0520D8 800514D8 46087380 */ add.s $f14, $f14, $f8 .L800514DC: /* 0520DC 800514DC 3C01800E */ lui $at, %hi(D_800DCBE8) # $at, 0x800e -/* 0520E0 800514E0 3C0D800E */ lui $t5, %hi(D_800DCC34) # $t5, 0x800e +/* 0520E0 800514E0 3C0D800E */ lui $t5, %hi(gSurfaceBobbingTable) # $t5, 0x800e /* 0520E4 800514E4 00230821 */ addu $at, $at, $v1 /* 0520E8 800514E8 01A36821 */ addu $t5, $t5, $v1 /* 0520EC 800514EC C426CBE8 */ lwc1 $f6, %lo(D_800DCBE8)($at) -/* 0520F0 800514F0 8DADCC34 */ lw $t5, %lo(D_800DCC34)($t5) +/* 0520F0 800514F0 8DADCC34 */ lw $t5, %lo(gSurfaceBobbingTable)($t5) /* 0520F4 800514F4 8FAC0068 */ lw $t4, 0x68($sp) /* 0520F8 800514F8 0122082A */ slt $at, $t1, $v0 /* 0520FC 800514FC 018D7021 */ addu $t6, $t4, $t5 @@ -1162,9 +1162,9 @@ glabel func_80050A28 /* 052650 80051A50 284100FF */ slti $at, $v0, 0xff /* 052654 80051A54 10200008 */ beqz $at, .L80051A78 /* 052658 80051A58 00025080 */ sll $t2, $v0, 2 -/* 05265C 80051A5C 3C0B800E */ lui $t3, %hi(D_800DCCF4) # $t3, 0x800e +/* 05265C 80051A5C 3C0B800E */ lui $t3, %hi(gSurfaceFlagTable) # $t3, 0x800e /* 052660 80051A60 016A5821 */ addu $t3, $t3, $t2 -/* 052664 80051A64 8D6BCCF4 */ lw $t3, %lo(D_800DCCF4)($t3) +/* 052664 80051A64 8D6BCCF4 */ lw $t3, %lo(gSurfaceFlagTable)($t3) /* 052668 80051A68 8CD80074 */ lw $t8, 0x74($a2) /* 05266C 80051A6C 00000000 */ nop /* 052670 80051A70 030BC825 */ or $t9, $t8, $t3 @@ -1175,9 +1175,9 @@ glabel func_80050A28 /* 052680 80051A80 284100FF */ slti $at, $v0, 0xff /* 052684 80051A84 10200008 */ beqz $at, .L80051AA8 /* 052688 80051A88 00026880 */ sll $t5, $v0, 2 -/* 05268C 80051A8C 3C0E800E */ lui $t6, %hi(D_800DCCF4) # $t6, 0x800e +/* 05268C 80051A8C 3C0E800E */ lui $t6, %hi(gSurfaceFlagTable) # $t6, 0x800e /* 052690 80051A90 01CD7021 */ addu $t6, $t6, $t5 -/* 052694 80051A94 8DCECCF4 */ lw $t6, %lo(D_800DCCF4)($t6) +/* 052694 80051A94 8DCECCF4 */ lw $t6, %lo(gSurfaceFlagTable)($t6) /* 052698 80051A98 8CCC0074 */ lw $t4, 0x74($a2) /* 05269C 80051A9C 000E7840 */ sll $t7, $t6, 1 /* 0526A0 80051AA0 018F5025 */ or $t2, $t4, $t7 @@ -1193,24 +1193,24 @@ glabel func_80050A28 /* 0526C4 80051AC4 45000018 */ bc1f .L80051B28 /* 0526C8 80051AC8 0009C080 */ sll $t8, $t1, 2 /* 0526CC 80051ACC 920201DE */ lbu $v0, 0x1de($s0) -/* 0526D0 80051AD0 3C19800E */ lui $t9, %hi(D_800DCD40) # $t9, 0x800e +/* 0526D0 80051AD0 3C19800E */ lui $t9, %hi(gSurfaceFlagTable4P) # $t9, 0x800e /* 0526D4 80051AD4 284100FF */ slti $at, $v0, 0xff /* 0526D8 80051AD8 10200007 */ beqz $at, .L80051AF8 /* 0526DC 80051ADC 00025880 */ sll $t3, $v0, 2 /* 0526E0 80051AE0 032BC821 */ addu $t9, $t9, $t3 -/* 0526E4 80051AE4 8F39CD40 */ lw $t9, %lo(D_800DCD40)($t9) +/* 0526E4 80051AE4 8F39CD40 */ lw $t9, %lo(gSurfaceFlagTable4P)($t9) /* 0526E8 80051AE8 8CD80074 */ lw $t8, 0x74($a2) /* 0526EC 80051AEC 00000000 */ nop /* 0526F0 80051AF0 03196825 */ or $t5, $t8, $t9 /* 0526F4 80051AF4 ACCD0074 */ sw $t5, 0x74($a2) .L80051AF8: /* 0526F8 80051AF8 920201DF */ lbu $v0, 0x1df($s0) -/* 0526FC 80051AFC 3C0F800E */ lui $t7, %hi(D_800DCD40) # $t7, 0x800e +/* 0526FC 80051AFC 3C0F800E */ lui $t7, %hi(gSurfaceFlagTable4P) # $t7, 0x800e /* 052700 80051B00 284100FF */ slti $at, $v0, 0xff /* 052704 80051B04 10200007 */ beqz $at, .L80051B24 /* 052708 80051B08 00026080 */ sll $t4, $v0, 2 /* 05270C 80051B0C 01EC7821 */ addu $t7, $t7, $t4 -/* 052710 80051B10 8DEFCD40 */ lw $t7, %lo(D_800DCD40)($t7) +/* 052710 80051B10 8DEFCD40 */ lw $t7, %lo(gSurfaceFlagTable4P)($t7) /* 052714 80051B14 8CCE0074 */ lw $t6, 0x74($a2) /* 052718 80051B18 000F5040 */ sll $t2, $t7, 1 /* 05271C 80051B1C 01CA5825 */ or $t3, $t6, $t2 @@ -1218,11 +1218,11 @@ glabel func_80050A28 .L80051B24: /* 052724 80051B24 0009C080 */ sll $t8, $t1, 2 .L80051B28: -/* 052728 80051B28 3C09800E */ lui $t1, %hi(D_800DCC80) # $t1, 0x800e +/* 052728 80051B28 3C09800E */ lui $t1, %hi(gSurfaceSoundTable) # $t1, 0x800e /* 05272C 80051B2C 8E020018 */ lw $v0, 0x18($s0) /* 052730 80051B30 01384821 */ addu $t1, $t1, $t8 /* 052734 80051B34 8FA60078 */ lw $a2, 0x78($sp) -/* 052738 80051B38 8D29CC80 */ lw $t1, %lo(D_800DCC80)($t1) +/* 052738 80051B38 8D29CC80 */ lw $t1, %lo(gSurfaceSoundTable)($t1) /* 05273C 80051B3C 14400011 */ bnez $v0, .L80051B84 /* 052740 80051B40 00000000 */ nop /* 052744 80051B44 1120000F */ beqz $t1, .L80051B84 @@ -1518,11 +1518,11 @@ glabel func_80050A28 /* 052B88 80051F88 C7AA0084 */ lwc1 $f10, 0x84($sp) /* 052B8C 80051F8C C4C80020 */ lwc1 $f8, 0x20($a2) /* 052B90 80051F90 460A7482 */ mul.s $f18, $f14, $f10 -/* 052B94 80051F94 3C0D8012 */ lui $t5, %hi(D_8011D586) # $t5, 0x8012 +/* 052B94 80051F94 3C0D8012 */ lui $t5, %hi(gDialogueCameraAngle) # $t5, 0x8012 /* 052B98 80051F98 3C01800E */ lui $at, %hi(D_800E66A8 + 4) # $at, 0x800e /* 052B9C 80051F9C 46124101 */ sub.s $f4, $f8, $f18 /* 052BA0 80051FA0 E4C40020 */ swc1 $f4, 0x20($a2) -/* 052BA4 80051FA4 85ADD586 */ lh $t5, %lo(D_8011D586)($t5) +/* 052BA4 80051FA4 85ADD586 */ lh $t5, %lo(gDialogueCameraAngle)($t5) /* 052BA8 80051FA8 00000000 */ nop /* 052BAC 80051FAC 11A00003 */ beqz $t5, .L80051FBC /* 052BB0 80051FB0 00000000 */ nop diff --git a/asm/non_matchings/racer/func_80054FD0.s b/asm/non_matchings/racer/func_80054FD0.s index 7930b66e..f2f4614d 100644 --- a/asm/non_matchings/racer/func_80054FD0.s +++ b/asm/non_matchings/racer/func_80054FD0.s @@ -25,8 +25,8 @@ glabel func_80054FD0 .L80055010: /* 055C10 80055010 A7A00130 */ sh $zero, 0x130($sp) /* 055C14 80055014 862E0000 */ lh $t6, ($s1) -/* 055C18 80055018 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 055C1C 8005501C 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 055C18 80055018 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 055C1C 8005501C 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 055C20 80055020 A4AE0000 */ sh $t6, ($a1) /* 055C24 80055024 862F0002 */ lh $t7, 2($s1) /* 055C28 80055028 3C013F80 */ li $at, 0x3F800000 # 1.000000 @@ -508,8 +508,8 @@ glabel func_80054FD0 /* 05633C 8005573C 46004283 */ div.s $f10, $f8, $f0 /* 056340 80055740 C6280014 */ lwc1 $f8, 0x14($s1) /* 056344 80055744 862F0000 */ lh $t7, ($s1) -/* 056348 80055748 3C058012 */ lui $a1, %hi(D_8011D510) # $a1, 0x8012 -/* 05634C 8005574C 24A5D510 */ addiu $a1, %lo(D_8011D510) # addiu $a1, $a1, -0x2af0 +/* 056348 80055748 3C058012 */ lui $a1, %hi(gCurrentRacerTransform) # $a1, 0x8012 +/* 05634C 8005574C 24A5D510 */ addiu $a1, %lo(gCurrentRacerTransform) # addiu $a1, $a1, -0x2af0 /* 056350 80055750 000FC023 */ negu $t8, $t7 /* 056354 80055754 3C013F80 */ li $at, 0x3F800000 # 1.000000 /* 056358 80055758 27A40060 */ addiu $a0, $sp, 0x60 diff --git a/asm/non_matchings/racer/func_8005B818.s b/asm/non_matchings/racer/func_8005B818.s index a591bc77..b479c678 100644 --- a/asm/non_matchings/racer/func_8005B818.s +++ b/asm/non_matchings/racer/func_8005B818.s @@ -589,7 +589,7 @@ glabel func_8005B818 /* 05CC80 8005C080 4406C000 */ mfc1 $a2, $f24 /* 05CC84 8005C084 4407E000 */ mfc1 $a3, $f28 /* 05CC88 8005C088 02602025 */ move $a0, $s3 -/* 05CC8C 8005C08C 0C00455C */ jal func_80011570 +/* 05CC8C 8005C08C 0C00455C */ jal move_object /* 05CC90 8005C090 A62E01C0 */ sh $t6, 0x1c0($s1) /* 05CC94 8005C094 1040000A */ beqz $v0, .L8005C0C0 /* 05CC98 8005C098 3C014034 */ li $at, 0x40340000 # 2.812500 diff --git a/asm/non_matchings/racer/update_camera_car.s b/asm/non_matchings/racer/update_camera_car.s index 75ea23e2..4c2101f9 100644 --- a/asm/non_matchings/racer/update_camera_car.s +++ b/asm/non_matchings/racer/update_camera_car.s @@ -569,7 +569,7 @@ glabel update_camera_car /* 059614 80058A14 460A4100 */ add.s $f4, $f8, $f10 /* 059618 80058A18 8D0F0000 */ lw $t7, ($t0) /* 05961C 80058A1C 460C2180 */ add.s $f6, $f4, $f12 -/* 059620 80058A20 3C098012 */ lui $t1, %hi(D_8011D586) # $t1, 0x8012 +/* 059620 80058A20 3C098012 */ lui $t1, %hi(gDialogueCameraAngle) # $t1, 0x8012 /* 059624 80058A24 E5E60014 */ swc1 $f6, 0x14($t7) /* 059628 80058A28 8D180000 */ lw $t8, ($t0) /* 05962C 80058A2C 84EE0196 */ lh $t6, 0x196($a3) @@ -589,7 +589,7 @@ glabel update_camera_car /* 059664 80058A64 45010005 */ bc1t .L80058A7C /* 059668 80058A68 00000000 */ nop .L80058A6C: -/* 05966C 80058A6C 8529D586 */ lh $t1, %lo(D_8011D586)($t1) +/* 05966C 80058A6C 8529D586 */ lh $t1, %lo(gDialogueCameraAngle)($t1) /* 059670 80058A70 00000000 */ nop /* 059674 80058A74 11200002 */ beqz $t1, .L80058A80 /* 059678 80058A78 00000000 */ nop diff --git a/asm/non_matchings/racer/update_camera_plane.s b/asm/non_matchings/racer/update_camera_plane.s index 5af11e49..9e31a06d 100644 --- a/asm/non_matchings/racer/update_camera_plane.s +++ b/asm/non_matchings/racer/update_camera_plane.s @@ -191,8 +191,8 @@ glabel update_camera_plane /* 04D130 8004C530 44093000 */ mfc1 $t1, $f6 /* 04D134 8004C534 00000000 */ nop .L8004C538: -/* 04D138 8004C538 3C0D8012 */ lui $t5, %hi(D_8011D586) # $t5, 0x8012 -/* 04D13C 8004C53C 85ADD586 */ lh $t5, %lo(D_8011D586)($t5) +/* 04D138 8004C538 3C0D8012 */ lui $t5, %hi(gDialogueCameraAngle) # $t5, 0x8012 +/* 04D13C 8004C53C 85ADD586 */ lh $t5, %lo(gDialogueCameraAngle)($t5) /* 04D140 8004C540 00000000 */ nop /* 04D144 8004C544 11A00005 */ beqz $t5, .L8004C55C /* 04D148 8004C548 00000000 */ nop @@ -587,7 +587,7 @@ glabel update_camera_plane /* 04D6E8 8004CAE8 46043280 */ add.s $f10, $f6, $f4 /* 04D6EC 8004CAEC 8D190000 */ lw $t9, ($t0) /* 04D6F0 8004CAF0 46105200 */ add.s $f8, $f10, $f16 -/* 04D6F4 8004CAF4 3C0E8012 */ lui $t6, %hi(D_8011D586) # $t6, 0x8012 +/* 04D6F4 8004CAF4 3C0E8012 */ lui $t6, %hi(gDialogueCameraAngle) # $t6, 0x8012 /* 04D6F8 8004CAF8 E7280014 */ swc1 $f8, 0x14($t9) /* 04D6FC 8004CAFC 8D0A0000 */ lw $t2, ($t0) /* 04D700 8004CB00 84EB0196 */ lh $t3, 0x196($a3) @@ -597,7 +597,7 @@ glabel update_camera_plane /* 04D710 8004CB10 00000000 */ nop /* 04D714 8004CB14 15A00005 */ bnez $t5, .L8004CB2C /* 04D718 8004CB18 00000000 */ nop -/* 04D71C 8004CB1C 85CED586 */ lh $t6, %lo(D_8011D586)($t6) +/* 04D71C 8004CB1C 85CED586 */ lh $t6, %lo(gDialogueCameraAngle)($t6) /* 04D720 8004CB20 34018001 */ li $at, 32769 /* 04D724 8004CB24 11C00014 */ beqz $t6, .L8004CB78 /* 04D728 8004CB28 00000000 */ nop diff --git a/asm/non_matchings/thread0_epc/render_epc_lock_up_display.s b/asm/non_matchings/thread0_epc/render_epc_lock_up_display.s deleted file mode 100644 index 853bfb30..00000000 --- a/asm/non_matchings/thread0_epc/render_epc_lock_up_display.s +++ /dev/null @@ -1,419 +0,0 @@ -.rdata -glabel D_800E8F18 -.asciz " epc\t\t0x%08x\n" -.ascii "\0\0" # padding -glabel D_800E8F28 -.asciz " cause\t\tmmAlloc(%d,0x%8x)\n" -.ascii "\0" # padding -glabel D_800E8F44 -.asciz " object\t\t" -.ascii "\0\0" # padding -glabel D_800E8F50 -.asciz "%s %d " -.ascii "\0" # padding -glabel D_800E8F58 -.asciz "\n" -.ascii "\0\0" # padding -glabel D_800E8F5C -.asciz "\n\n\n\n\n\n\n\n\n\n\n\n\n\n" -.ascii "\0" # padding -glabel D_800E8F6C -.asciz " Fault in thread %d\n" -.ascii "\0\0\0" # padding -glabel D_800E8F84 -.asciz " epc\t\t0x%08x\n" -.ascii "\0\0" # padding -glabel D_800E8F94 -.asciz " cause\t\t0x%08x\n" -glabel D_800E8FA4 -.asciz " sr\t\t0x%08x\n" -.ascii "\0\0\0" # padding -glabel D_800E8FB4 -.asciz " badvaddr\t0x%08x\n" -.ascii "\0\0" # padding -glabel D_800E8FC8 -.asciz " object\t\t" -.ascii "\0\0" # padding -glabel D_800E8FD4 -.asciz "%s %d " -.ascii "\0" # padding -glabel D_800E8FDC -.asciz "\n" -.ascii "\0\0" # padding -glabel D_800E8FE0 -.asciz " at 0x%08x v0 0x%08x v1 0x%08x\n" -glabel D_800E9000 -.asciz " a0 0x%08x a1 0x%08x a2 0x%08x\n" -glabel D_800E9020 -.asciz " a3 0x%08x t0 0x%08x t1 0x%08x\n" -glabel D_800E9040 -.asciz " t2 0x%08x t3 0x%08x t4 0x%08x\n" -glabel D_800E9060 -.asciz " t5 0x%08x t6 0x%08x t7 0x%08x\n" -glabel D_800E9080 -.asciz " s0 0x%08x s1 0x%08x s2 0x%08x\n" -glabel D_800E90A0 -.asciz " s3 0x%08x s4 0x%08x s5 0x%08x\n" -glabel D_800E90C0 -.asciz " s6 0x%08x s7 0x%08x t8 0x%08x\n" -glabel D_800E90E0 -.asciz " t9 0x%08x gp 0x%08x sp 0x%08x\n" -glabel D_800E9100 -.asciz " s8 0x%08x ra 0x%08x\n\n" -.ascii "\0" # padding -glabel D_800E9118 -.asciz " %08x %08x %08x\n" -.ascii "\0" # padding -glabel D_800E912C -.asciz " " -.ascii "\0" # padding -glabel D_800E9130 -.asciz "%04x " -.ascii "\0\0" # padding -glabel D_800E9138 -.asciz "\n" -.ascii "\0\0" # padding - -.late_rodata -glabel jpt_800E913C -.word L800B7898, L800B7C18, L800B7C18, L800B7C18, L800B7C70, L800B7CE4 - -.text -glabel render_epc_lock_up_display -/* 0B8410 800B7810 27BDFFA0 */ addiu $sp, $sp, -0x60 -/* 0B8414 800B7814 3C0F800E */ lui $t7, %hi(D_800E302C) # $t7, 0x800e -/* 0B8418 800B7818 AFBF002C */ sw $ra, 0x2c($sp) -/* 0B841C 800B781C AFB50028 */ sw $s5, 0x28($sp) -/* 0B8420 800B7820 AFB40024 */ sw $s4, 0x24($sp) -/* 0B8424 800B7824 AFB30020 */ sw $s3, 0x20($sp) -/* 0B8428 800B7828 AFB2001C */ sw $s2, 0x1c($sp) -/* 0B842C 800B782C AFB10018 */ sw $s1, 0x18($sp) -/* 0B8430 800B7830 AFB00014 */ sw $s0, 0x14($sp) -/* 0B8434 800B7834 25EF302C */ addiu $t7, %lo(D_800E302C) # addiu $t7, $t7, 0x302c -/* 0B8438 800B7838 8DE10000 */ lw $at, ($t7) -/* 0B843C 800B783C 27AE0050 */ addiu $t6, $sp, 0x50 -/* 0B8440 800B7840 ADC10000 */ sw $at, ($t6) -/* 0B8444 800B7844 8DE10008 */ lw $at, 8($t7) -/* 0B8448 800B7848 8DE80004 */ lw $t0, 4($t7) -/* 0B844C 800B784C 00009825 */ move $s3, $zero -/* 0B8450 800B7850 24040010 */ li $a0, 16 -/* 0B8454 800B7854 24050020 */ li $a1, 32 -/* 0B8458 800B7858 ADC10008 */ sw $at, 8($t6) -/* 0B845C 800B785C 0C02D8D7 */ jal set_render_printf_position -/* 0B8460 800B7860 ADC80004 */ sw $t0, 4($t6) -/* 0B8464 800B7864 3C03800E */ lui $v1, %hi(sLockupPage) # $v1, 0x800e -/* 0B8468 800B7868 24633024 */ addiu $v1, %lo(sLockupPage) # addiu $v1, $v1, 0x3024 -/* 0B846C 800B786C 8C620000 */ lw $v0, ($v1) -/* 0B8470 800B7870 00000000 */ nop -/* 0B8474 800B7874 2C410006 */ sltiu $at, $v0, 6 -/* 0B8478 800B7878 1020011B */ beqz $at, .L800B7CE8 -/* 0B847C 800B787C 00024880 */ sll $t1, $v0, 2 -/* 0B8480 800B7880 3C01800F */ lui $at, %hi(jpt_800E913C) # $at, 0x800f -/* 0B8484 800B7884 00290821 */ addu $at, $at, $t1 -/* 0B8488 800B7888 8C29913C */ lw $t1, %lo(jpt_800E913C)($at) -/* 0B848C 800B788C 00000000 */ nop -/* 0B8490 800B7890 01200008 */ jr $t1 -/* 0B8494 800B7894 00000000 */ nop -glabel L800B7898 -/* 0B8498 800B7898 444AF800 */ cfc1 $t2, $31 -/* 0B849C 800B789C 3C038013 */ lui $v1, %hi(gEpcInfo) # $v1, 0x8013 -/* 0B84A0 800B78A0 35410003 */ ori $at, $t2, 3 -/* 0B84A4 800B78A4 24639800 */ addiu $v1, %lo(gEpcInfo) # addiu $v1, $v1, -0x6800 -/* 0B84A8 800B78A8 38210002 */ xori $at, $at, 2 -/* 0B84AC 800B78AC 44C1F800 */ ctc1 $at, $31 -/* 0B84B0 800B78B0 C4640130 */ lwc1 $f4, 0x130($v1) -/* 0B84B4 800B78B4 C4680134 */ lwc1 $f8, 0x134($v1) -/* 0B84B8 800B78B8 460021A4 */ cvt.w.s $f6, $f4 -/* 0B84BC 800B78BC C4700138 */ lwc1 $f16, 0x138($v1) -/* 0B84C0 800B78C0 44CAF800 */ ctc1 $t2, $31 -/* 0B84C4 800B78C4 3C028013 */ lui $v0, %hi(D_80129FB0) # $v0, 0x8013 -/* 0B84C8 800B78C8 440B3000 */ mfc1 $t3, $f6 -/* 0B84CC 800B78CC 444CF800 */ cfc1 $t4, $31 -/* 0B84D0 800B78D0 8C6E0120 */ lw $t6, 0x120($v1) -/* 0B84D4 800B78D4 35810003 */ ori $at, $t4, 3 -/* 0B84D8 800B78D8 38210002 */ xori $at, $at, 2 -/* 0B84DC 800B78DC 44C1F800 */ ctc1 $at, $31 -/* 0B84E0 800B78E0 24429FB0 */ addiu $v0, %lo(D_80129FB0) # addiu $v0, $v0, -0x6050 -/* 0B84E4 800B78E4 460042A4 */ cvt.w.s $f10, $f8 -/* 0B84E8 800B78E8 AC4B0000 */ sw $t3, ($v0) -/* 0B84EC 800B78EC 44CCF800 */ ctc1 $t4, $31 -/* 0B84F0 800B78F0 440D5000 */ mfc1 $t5, $f10 -/* 0B84F4 800B78F4 00000000 */ nop -/* 0B84F8 800B78F8 4459F800 */ cfc1 $t9, $31 -/* 0B84FC 800B78FC AC4D0004 */ sw $t5, 4($v0) -/* 0B8500 800B7900 37210003 */ ori $at, $t9, 3 -/* 0B8504 800B7904 38210002 */ xori $at, $at, 2 -/* 0B8508 800B7908 44C1F800 */ ctc1 $at, $31 -/* 0B850C 800B790C 2401FFFF */ li $at, -1 -/* 0B8510 800B7910 460084A4 */ cvt.w.s $f18, $f16 -/* 0B8514 800B7914 44189000 */ mfc1 $t8, $f18 -/* 0B8518 800B7918 44D9F800 */ ctc1 $t9, $31 -/* 0B851C 800B791C 15C1002F */ bne $t6, $at, .L800B79DC -/* 0B8520 800B7920 AC580008 */ sw $t8, 8($v0) -/* 0B8524 800B7924 3C058013 */ lui $a1, %hi(gEpcInfo+0x11C) # $a1, 0x8013 -/* 0B8528 800B7928 8CA5991C */ lw $a1, %lo(gEpcInfo+0x11C)($a1) -/* 0B852C 800B792C 3C04800F */ lui $a0, %hi(D_800E8F18) # $a0, 0x800f -/* 0B8530 800B7930 0C02D7B7 */ jal render_printf -/* 0B8534 800B7934 24848F18 */ addiu $a0, %lo(D_800E8F18) # addiu $a0, $a0, -0x70e8 -/* 0B8538 800B7938 3C098013 */ lui $t1, %hi(gEpcInfo+0x3C) # $t1, 0x8013 -/* 0B853C 800B793C 3C0B8013 */ lui $t3, %hi(gEpcInfo+0x44) # $t3, 0x8013 -/* 0B8540 800B7940 8D669844 */ lw $a2, %lo(gEpcInfo+0x44)($t3) -/* 0B8544 800B7944 8D25983C */ lw $a1, %lo(gEpcInfo+0x3C)($t1) -/* 0B8548 800B7948 3C04800F */ lui $a0, %hi(D_800E8F28) # $a0, 0x800f -/* 0B854C 800B794C 0C02D7B7 */ jal render_printf -/* 0B8550 800B7950 24848F28 */ addiu $a0, %lo(D_800E8F28) # addiu $a0, $a0, -0x70d8 -/* 0B8554 800B7954 3C108013 */ lui $s0, %hi(D_80129FB0) # $s0, 0x8013 -/* 0B8558 800B7958 3C15800F */ lui $s5, %hi(D_800E8F44) # $s5, 0x800f -/* 0B855C 800B795C 26B58F44 */ addiu $s5, %lo(D_800E8F44) # addiu $s5, $s5, -0x70bc -/* 0B8560 800B7960 26109FB0 */ addiu $s0, %lo(D_80129FB0) # addiu $s0, $s0, -0x6050 -/* 0B8564 800B7964 00009025 */ move $s2, $zero -/* 0B8568 800B7968 2414FFFF */ li $s4, -1 -.L800B796C: -/* 0B856C 800B796C 8E060000 */ lw $a2, ($s0) -/* 0B8570 800B7970 27AF0050 */ addiu $t7, $sp, 0x50 -/* 0B8574 800B7974 1286000C */ beq $s4, $a2, .L800B79A8 -/* 0B8578 800B7978 00000000 */ nop -/* 0B857C 800B797C 16600006 */ bnez $s3, .L800B7998 -/* 0B8580 800B7980 024F8821 */ addu $s1, $s2, $t7 -/* 0B8584 800B7984 24130001 */ li $s3, 1 -/* 0B8588 800B7988 0C02D7B7 */ jal render_printf -/* 0B858C 800B798C 02A02025 */ move $a0, $s5 -/* 0B8590 800B7990 8E060000 */ lw $a2, ($s0) -/* 0B8594 800B7994 00000000 */ nop -.L800B7998: -/* 0B8598 800B7998 3C04800F */ lui $a0, %hi(D_800E8F50) # $a0, 0x800f -/* 0B859C 800B799C 8E250000 */ lw $a1, ($s1) -/* 0B85A0 800B79A0 0C02D7B7 */ jal render_printf -/* 0B85A4 800B79A4 24848F50 */ addiu $a0, %lo(D_800E8F50) # addiu $a0, $a0, -0x70b0 -.L800B79A8: -/* 0B85A8 800B79A8 3C0C8013 */ lui $t4, %hi(D_80129FBC) # $t4, 0x8013 -/* 0B85AC 800B79AC 258C9FBC */ addiu $t4, %lo(D_80129FBC) # addiu $t4, $t4, -0x6044 -/* 0B85B0 800B79B0 26100004 */ addiu $s0, $s0, 4 -/* 0B85B4 800B79B4 160CFFED */ bne $s0, $t4, .L800B796C -/* 0B85B8 800B79B8 26520004 */ addiu $s2, $s2, 4 -/* 0B85BC 800B79BC 3C04800F */ lui $a0, %hi(D_800E8F58) # $a0, 0x800f -/* 0B85C0 800B79C0 0C02D7B7 */ jal render_printf -/* 0B85C4 800B79C4 24848F58 */ addiu $a0, %lo(D_800E8F58) # addiu $a0, $a0, -0x70a8 -/* 0B85C8 800B79C8 3C04800F */ lui $a0, %hi(D_800E8F5C) # $a0, 0x800f -/* 0B85CC 800B79CC 0C02D7B7 */ jal render_printf -/* 0B85D0 800B79D0 24848F5C */ addiu $a0, %lo(D_800E8F5C) # addiu $a0, $a0, -0x70a4 -/* 0B85D4 800B79D4 100000C5 */ b .L800B7CEC -/* 0B85D8 800B79D8 8FBF002C */ lw $ra, 0x2c($sp) -.L800B79DC: -/* 0B85DC 800B79DC 3C04800F */ lui $a0, %hi(D_800E8F6C) # $a0, 0x800f -/* 0B85E0 800B79E0 8C650014 */ lw $a1, 0x14($v1) -/* 0B85E4 800B79E4 0C02D7B7 */ jal render_printf -/* 0B85E8 800B79E8 24848F6C */ addiu $a0, %lo(D_800E8F6C) # addiu $a0, $a0, -0x7094 -/* 0B85EC 800B79EC 3C058013 */ lui $a1, %hi(gEpcInfo+0x11C) # $a1, 0x8013 -/* 0B85F0 800B79F0 8CA5991C */ lw $a1, %lo(gEpcInfo+0x11C)($a1) -/* 0B85F4 800B79F4 3C04800F */ lui $a0, %hi(D_800E8F84) # $a0, 0x800f -/* 0B85F8 800B79F8 0C02D7B7 */ jal render_printf -/* 0B85FC 800B79FC 24848F84 */ addiu $a0, %lo(D_800E8F84) # addiu $a0, $a0, -0x707c -/* 0B8600 800B7A00 3C058013 */ lui $a1, %hi(gEpcInfo+0x120) # $a1, 0x8013 -/* 0B8604 800B7A04 8CA59920 */ lw $a1, %lo(gEpcInfo+0x120)($a1) -/* 0B8608 800B7A08 3C04800F */ lui $a0, %hi(D_800E8F94) # $a0, 0x800f -/* 0B860C 800B7A0C 0C02D7B7 */ jal render_printf -/* 0B8610 800B7A10 24848F94 */ addiu $a0, %lo(D_800E8F94) # addiu $a0, $a0, -0x706c -/* 0B8614 800B7A14 3C058013 */ lui $a1, %hi(gEpcInfo+0x118) # $a1, 0x8013 -/* 0B8618 800B7A18 8CA59918 */ lw $a1, %lo(gEpcInfo+0x118)($a1) -/* 0B861C 800B7A1C 3C04800F */ lui $a0, %hi(D_800E8FA4) # $a0, 0x800f -/* 0B8620 800B7A20 0C02D7B7 */ jal render_printf -/* 0B8624 800B7A24 24848FA4 */ addiu $a0, %lo(D_800E8FA4) # addiu $a0, $a0, -0x705c -/* 0B8628 800B7A28 3C058013 */ lui $a1, %hi(gEpcInfo+0x124) # $a1, 0x8013 -/* 0B862C 800B7A2C 8CA59924 */ lw $a1, %lo(gEpcInfo+0x124)($a1) -/* 0B8630 800B7A30 3C04800F */ lui $a0, %hi(D_800E8FB4) # $a0, 0x800f -/* 0B8634 800B7A34 0C02D7B7 */ jal render_printf -/* 0B8638 800B7A38 24848FB4 */ addiu $a0, %lo(D_800E8FB4) # addiu $a0, $a0, -0x704c -/* 0B863C 800B7A3C 3C108013 */ lui $s0, %hi(D_80129FB0) # $s0, 0x8013 -/* 0B8640 800B7A40 3C15800F */ lui $s5, %hi(D_800E8FC8) # $s5, 0x800f -/* 0B8644 800B7A44 26B58FC8 */ addiu $s5, %lo(D_800E8FC8) # addiu $s5, $s5, -0x7038 -/* 0B8648 800B7A48 26109FB0 */ addiu $s0, %lo(D_80129FB0) # addiu $s0, $s0, -0x6050 -/* 0B864C 800B7A4C 00009025 */ move $s2, $zero -/* 0B8650 800B7A50 2414FFFF */ li $s4, -1 -.L800B7A54: -/* 0B8654 800B7A54 8E060000 */ lw $a2, ($s0) -/* 0B8658 800B7A58 27AD0050 */ addiu $t5, $sp, 0x50 -/* 0B865C 800B7A5C 1286000C */ beq $s4, $a2, .L800B7A90 -/* 0B8660 800B7A60 00000000 */ nop -/* 0B8664 800B7A64 16600006 */ bnez $s3, .L800B7A80 -/* 0B8668 800B7A68 024D8821 */ addu $s1, $s2, $t5 -/* 0B866C 800B7A6C 24130001 */ li $s3, 1 -/* 0B8670 800B7A70 0C02D7B7 */ jal render_printf -/* 0B8674 800B7A74 02A02025 */ move $a0, $s5 -/* 0B8678 800B7A78 8E060000 */ lw $a2, ($s0) -/* 0B867C 800B7A7C 00000000 */ nop -.L800B7A80: -/* 0B8680 800B7A80 3C04800F */ lui $a0, %hi(D_800E8FD4) # $a0, 0x800f -/* 0B8684 800B7A84 8E250000 */ lw $a1, ($s1) -/* 0B8688 800B7A88 0C02D7B7 */ jal render_printf -/* 0B868C 800B7A8C 24848FD4 */ addiu $a0, %lo(D_800E8FD4) # addiu $a0, $a0, -0x702c -.L800B7A90: -/* 0B8690 800B7A90 3C198013 */ lui $t9, %hi(D_80129FBC) # $t9, 0x8013 -/* 0B8694 800B7A94 27399FBC */ addiu $t9, %lo(D_80129FBC) # addiu $t9, $t9, -0x6044 -/* 0B8698 800B7A98 26100004 */ addiu $s0, $s0, 4 -/* 0B869C 800B7A9C 1619FFED */ bne $s0, $t9, .L800B7A54 -/* 0B86A0 800B7AA0 26520004 */ addiu $s2, $s2, 4 -/* 0B86A4 800B7AA4 3C04800F */ lui $a0, %hi(D_800E8FDC) # $a0, 0x800f -/* 0B86A8 800B7AA8 0C02D7B7 */ jal render_printf -/* 0B86AC 800B7AAC 24848FDC */ addiu $a0, %lo(D_800E8FDC) # addiu $a0, $a0, -0x7024 -/* 0B86B0 800B7AB0 3C198013 */ lui $t9, %hi(gEpcInfo+0x24) # $t9, 0x8013 -/* 0B86B4 800B7AB4 3C0F8013 */ lui $t7, %hi(gEpcInfo+0x2C) # $t7, 0x8013 -/* 0B86B8 800B7AB8 3C098013 */ lui $t1, %hi(gEpcInfo+0x34) # $t1, 0x8013 -/* 0B86BC 800B7ABC 8D279834 */ lw $a3, %lo(gEpcInfo+0x34)($t1) -/* 0B86C0 800B7AC0 8DE6982C */ lw $a2, %lo(gEpcInfo+0x2C)($t7) -/* 0B86C4 800B7AC4 8F259824 */ lw $a1, %lo(gEpcInfo+0x24)($t9) -/* 0B86C8 800B7AC8 3C04800F */ lui $a0, %hi(D_800E8FE0) # $a0, 0x800f -/* 0B86CC 800B7ACC 0C02D7B7 */ jal render_printf -/* 0B86D0 800B7AD0 24848FE0 */ addiu $a0, %lo(D_800E8FE0) # addiu $a0, $a0, -0x7020 -/* 0B86D4 800B7AD4 3C0B8013 */ lui $t3, %hi(gEpcInfo+0x3C) # $t3, 0x8013 -/* 0B86D8 800B7AD8 3C0D8013 */ lui $t5, %hi(gEpcInfo+0x44) # $t5, 0x8013 -/* 0B86DC 800B7ADC 3C198013 */ lui $t9, %hi(gEpcInfo+0x4C) # $t9, 0x8013 -/* 0B86E0 800B7AE0 8F27984C */ lw $a3, %lo(gEpcInfo+0x4C)($t9) -/* 0B86E4 800B7AE4 8DA69844 */ lw $a2, %lo(gEpcInfo+0x44)($t5) -/* 0B86E8 800B7AE8 8D65983C */ lw $a1, %lo(gEpcInfo+0x3C)($t3) -/* 0B86EC 800B7AEC 3C04800F */ lui $a0, %hi(D_800E9000) # $a0, 0x800f -/* 0B86F0 800B7AF0 0C02D7B7 */ jal render_printf -/* 0B86F4 800B7AF4 24849000 */ addiu $a0, %lo(D_800E9000) # addiu $a0, $a0, -0x7000 -/* 0B86F8 800B7AF8 3C0F8013 */ lui $t7, %hi(gEpcInfo+0x54) # $t7, 0x8013 -/* 0B86FC 800B7AFC 3C098013 */ lui $t1, %hi(gEpcInfo+0x5C) # $t1, 0x8013 -/* 0B8700 800B7B00 3C0B8013 */ lui $t3, %hi(gEpcInfo+0x64) # $t3, 0x8013 -/* 0B8704 800B7B04 8D679864 */ lw $a3, %lo(gEpcInfo+0x64)($t3) -/* 0B8708 800B7B08 8D26985C */ lw $a2, %lo(gEpcInfo+0x5C)($t1) -/* 0B870C 800B7B0C 8DE59854 */ lw $a1, %lo(gEpcInfo+0x54)($t7) -/* 0B8710 800B7B10 3C04800F */ lui $a0, %hi(D_800E9020) # $a0, 0x800f -/* 0B8714 800B7B14 0C02D7B7 */ jal render_printf -/* 0B8718 800B7B18 24849020 */ addiu $a0, %lo(D_800E9020) # addiu $a0, $a0, -0x6fe0 -/* 0B871C 800B7B1C 3C0D8013 */ lui $t5, %hi(gEpcInfo+0x6C) # $t5, 0x8013 -/* 0B8720 800B7B20 3C198013 */ lui $t9, %hi(gEpcInfo+0x74) # $t9, 0x8013 -/* 0B8724 800B7B24 3C0F8013 */ lui $t7, %hi(gEpcInfo+0x7C) # $t7, 0x8013 -/* 0B8728 800B7B28 8DE7987C */ lw $a3, %lo(gEpcInfo+0x7C)($t7) -/* 0B872C 800B7B2C 8F269874 */ lw $a2, %lo(gEpcInfo+0x74)($t9) -/* 0B8730 800B7B30 8DA5986C */ lw $a1, %lo(gEpcInfo+0x6C)($t5) -/* 0B8734 800B7B34 3C04800F */ lui $a0, %hi(D_800E9040) # $a0, 0x800f -/* 0B8738 800B7B38 0C02D7B7 */ jal render_printf -/* 0B873C 800B7B3C 24849040 */ addiu $a0, %lo(D_800E9040) # addiu $a0, $a0, -0x6fc0 -/* 0B8740 800B7B40 3C098013 */ lui $t1, %hi(gEpcInfo+0x84) # $t1, 0x8013 -/* 0B8744 800B7B44 3C0B8013 */ lui $t3, %hi(gEpcInfo+0x8C) # $t3, 0x8013 -/* 0B8748 800B7B48 3C0D8013 */ lui $t5, %hi(gEpcInfo+0x94) # $t5, 0x8013 -/* 0B874C 800B7B4C 8DA79894 */ lw $a3, %lo(gEpcInfo+0x94)($t5) -/* 0B8750 800B7B50 8D66988C */ lw $a2, %lo(gEpcInfo+0x8C)($t3) -/* 0B8754 800B7B54 8D259884 */ lw $a1, %lo(gEpcInfo+0x84)($t1) -/* 0B8758 800B7B58 3C04800F */ lui $a0, %hi(D_800E9060) # $a0, 0x800f -/* 0B875C 800B7B5C 0C02D7B7 */ jal render_printf -/* 0B8760 800B7B60 24849060 */ addiu $a0, %lo(D_800E9060) # addiu $a0, $a0, -0x6fa0 -/* 0B8764 800B7B64 3C198013 */ lui $t9, %hi(gEpcInfo+0x9C) # $t9, 0x8013 -/* 0B8768 800B7B68 3C0F8013 */ lui $t7, %hi(gEpcInfo+0xA4) # $t7, 0x8013 -/* 0B876C 800B7B6C 3C098013 */ lui $t1, %hi(gEpcInfo+0xAC) # $t1, 0x8013 -/* 0B8770 800B7B70 8D2798AC */ lw $a3, %lo(gEpcInfo+0xAC)($t1) -/* 0B8774 800B7B74 8DE698A4 */ lw $a2, %lo(gEpcInfo+0xA4)($t7) -/* 0B8778 800B7B78 8F25989C */ lw $a1, %lo(gEpcInfo+0x9C)($t9) -/* 0B877C 800B7B7C 3C04800F */ lui $a0, %hi(D_800E9080) # $a0, 0x800f -/* 0B8780 800B7B80 0C02D7B7 */ jal render_printf -/* 0B8784 800B7B84 24849080 */ addiu $a0, %lo(D_800E9080) # addiu $a0, $a0, -0x6f80 -/* 0B8788 800B7B88 3C0B8013 */ lui $t3, %hi(gEpcInfo+0xB4) # $t3, 0x8013 -/* 0B878C 800B7B8C 3C0D8013 */ lui $t5, %hi(gEpcInfo+0xBC) # $t5, 0x8013 -/* 0B8790 800B7B90 3C198013 */ lui $t9, %hi(gEpcInfo+0xC4) # $t9, 0x8013 -/* 0B8794 800B7B94 8F2798C4 */ lw $a3, %lo(gEpcInfo+0xC4)($t9) -/* 0B8798 800B7B98 8DA698BC */ lw $a2, %lo(gEpcInfo+0xBC)($t5) -/* 0B879C 800B7B9C 8D6598B4 */ lw $a1, %lo(gEpcInfo+0xB4)($t3) -/* 0B87A0 800B7BA0 3C04800F */ lui $a0, %hi(D_800E90A0) # $a0, 0x800f -/* 0B87A4 800B7BA4 0C02D7B7 */ jal render_printf -/* 0B87A8 800B7BA8 248490A0 */ addiu $a0, %lo(D_800E90A0) # addiu $a0, $a0, -0x6f60 -/* 0B87AC 800B7BAC 3C0F8013 */ lui $t7, %hi(gEpcInfo+0xCC) # $t7, 0x8013 -/* 0B87B0 800B7BB0 3C098013 */ lui $t1, %hi(gEpcInfo+0xD4) # $t1, 0x8013 -/* 0B87B4 800B7BB4 3C0B8013 */ lui $t3, %hi(gEpcInfo+0xDC) # $t3, 0x8013 -/* 0B87B8 800B7BB8 8D6798DC */ lw $a3, %lo(gEpcInfo+0xDC)($t3) -/* 0B87BC 800B7BBC 8D2698D4 */ lw $a2, %lo(gEpcInfo+0xD4)($t1) -/* 0B87C0 800B7BC0 8DE598CC */ lw $a1, %lo(gEpcInfo+0xCC)($t7) -/* 0B87C4 800B7BC4 3C04800F */ lui $a0, %hi(D_800E90C0) # $a0, 0x800f -/* 0B87C8 800B7BC8 0C02D7B7 */ jal render_printf -/* 0B87CC 800B7BCC 248490C0 */ addiu $a0, %lo(D_800E90C0) # addiu $a0, $a0, -0x6f40 -/* 0B87D0 800B7BD0 3C0D8013 */ lui $t5, %hi(gEpcInfo+0xE4) # $t5, 0x8013 -/* 0B87D4 800B7BD4 3C198013 */ lui $t9, %hi(gEpcInfo+0xEC) # $t9, 0x8013 -/* 0B87D8 800B7BD8 3C0F8013 */ lui $t7, %hi(gEpcInfo+0xF4) # $t7, 0x8013 -/* 0B87DC 800B7BDC 8DE798F4 */ lw $a3, %lo(gEpcInfo+0xF4)($t7) -/* 0B87E0 800B7BE0 8F2698EC */ lw $a2, %lo(gEpcInfo+0xEC)($t9) -/* 0B87E4 800B7BE4 8DA598E4 */ lw $a1, %lo(gEpcInfo+0xE4)($t5) -/* 0B87E8 800B7BE8 3C04800F */ lui $a0, %hi(D_800E90E0) # $a0, 0x800f -/* 0B87EC 800B7BEC 0C02D7B7 */ jal render_printf -/* 0B87F0 800B7BF0 248490E0 */ addiu $a0, %lo(D_800E90E0) # addiu $a0, $a0, -0x6f20 -/* 0B87F4 800B7BF4 3C098013 */ lui $t1, %hi(gEpcInfo+0xFC) # $t1, 0x8013 -/* 0B87F8 800B7BF8 3C0B8013 */ lui $t3, %hi(gEpcInfo+0x104) # $t3, 0x8013 -/* 0B87FC 800B7BFC 8D669904 */ lw $a2, %lo(gEpcInfo+0x104)($t3) -/* 0B8800 800B7C00 8D2598FC */ lw $a1, %lo(gEpcInfo+0xFC)($t1) -/* 0B8804 800B7C04 3C04800F */ lui $a0, %hi(D_800E9100) # $a0, 0x800f -/* 0B8808 800B7C08 0C02D7B7 */ jal render_printf -/* 0B880C 800B7C0C 24849100 */ addiu $a0, %lo(D_800E9100) # addiu $a0, $a0, -0x6f00 -/* 0B8810 800B7C10 10000036 */ b .L800B7CEC -/* 0B8814 800B7C14 8FBF002C */ lw $ra, 0x2c($sp) -glabel L800B7C18 -/* 0B8818 800B7C18 00021880 */ sll $v1, $v0, 2 -/* 0B881C 800B7C1C 00621823 */ subu $v1, $v1, $v0 -/* 0B8820 800B7C20 00031900 */ sll $v1, $v1, 4 -/* 0B8824 800B7C24 2463FFD0 */ addiu $v1, $v1, -0x30 -/* 0B8828 800B7C28 3C0D8013 */ lui $t5, %hi(D_801299B0) # $t5, 0x8013 -/* 0B882C 800B7C2C 25AD99B0 */ addiu $t5, %lo(D_801299B0) # addiu $t5, $t5, -0x6650 -/* 0B8830 800B7C30 00036080 */ sll $t4, $v1, 2 -/* 0B8834 800B7C34 3C11800F */ lui $s1, %hi(D_800E9118) # $s1, 0x800f -/* 0B8838 800B7C38 26319118 */ addiu $s1, %lo(D_800E9118) # addiu $s1, $s1, -0x6ee8 -/* 0B883C 800B7C3C 018D8021 */ addu $s0, $t4, $t5 -/* 0B8840 800B7C40 0000A025 */ move $s4, $zero -/* 0B8844 800B7C44 24150010 */ li $s5, 16 -.L800B7C48: -/* 0B8848 800B7C48 8E050000 */ lw $a1, ($s0) -/* 0B884C 800B7C4C 8E060040 */ lw $a2, 0x40($s0) -/* 0B8850 800B7C50 8E070080 */ lw $a3, 0x80($s0) -/* 0B8854 800B7C54 0C02D7B7 */ jal render_printf -/* 0B8858 800B7C58 02202025 */ move $a0, $s1 -/* 0B885C 800B7C5C 26940001 */ addiu $s4, $s4, 1 -/* 0B8860 800B7C60 1695FFF9 */ bne $s4, $s5, .L800B7C48 -/* 0B8864 800B7C64 26100004 */ addiu $s0, $s0, 4 -/* 0B8868 800B7C68 10000020 */ b .L800B7CEC -/* 0B886C 800B7C6C 8FBF002C */ lw $ra, 0x2c($sp) -glabel L800B7C70 -/* 0B8870 800B7C70 000219C0 */ sll $v1, $v0, 7 -/* 0B8874 800B7C74 2463FE00 */ addiu $v1, $v1, -0x200 -/* 0B8878 800B7C78 3C198013 */ lui $t9, %hi(D_80129BB0) # $t9, 0x8013 -/* 0B887C 800B7C7C 27399BB0 */ addiu $t9, %lo(D_80129BB0) # addiu $t9, $t9, -0x6450 -/* 0B8880 800B7C80 0003C040 */ sll $t8, $v1, 1 -/* 0B8884 800B7C84 3C12800F */ lui $s2, %hi(D_800E9130) # $s2, 0x800f -/* 0B8888 800B7C88 26529130 */ addiu $s2, %lo(D_800E9130) # addiu $s2, $s2, -0x6ed0 -/* 0B888C 800B7C8C 03198821 */ addu $s1, $t8, $t9 -/* 0B8890 800B7C90 0000A025 */ move $s4, $zero -/* 0B8894 800B7C94 24150010 */ li $s5, 16 -/* 0B8898 800B7C98 24130008 */ li $s3, 8 -.L800B7C9C: -/* 0B889C 800B7C9C 3C04800F */ lui $a0, %hi(D_800E912C) # $a0, 0x800f -/* 0B88A0 800B7CA0 0C02D7B7 */ jal render_printf -/* 0B88A4 800B7CA4 2484912C */ addiu $a0, %lo(D_800E912C) # addiu $a0, $a0, -0x6ed4 -/* 0B88A8 800B7CA8 00008025 */ move $s0, $zero -.L800B7CAC: -/* 0B88AC 800B7CAC 96250000 */ lhu $a1, ($s1) -/* 0B88B0 800B7CB0 0C02D7B7 */ jal render_printf -/* 0B88B4 800B7CB4 02402025 */ move $a0, $s2 -/* 0B88B8 800B7CB8 26100001 */ addiu $s0, $s0, 1 -/* 0B88BC 800B7CBC 1613FFFB */ bne $s0, $s3, .L800B7CAC -/* 0B88C0 800B7CC0 26310002 */ addiu $s1, $s1, 2 -/* 0B88C4 800B7CC4 3C04800F */ lui $a0, %hi(D_800E9138) # $a0, 0x800f -/* 0B88C8 800B7CC8 0C02D7B7 */ jal render_printf -/* 0B88CC 800B7CCC 24849138 */ addiu $a0, %lo(D_800E9138) # addiu $a0, $a0, -0x6ec8 -/* 0B88D0 800B7CD0 26940001 */ addiu $s4, $s4, 1 -/* 0B88D4 800B7CD4 1695FFF1 */ bne $s4, $s5, .L800B7C9C -/* 0B88D8 800B7CD8 00000000 */ nop -/* 0B88DC 800B7CDC 10000003 */ b .L800B7CEC -/* 0B88E0 800B7CE0 8FBF002C */ lw $ra, 0x2c($sp) -glabel L800B7CE4 -/* 0B88E4 800B7CE4 AC600000 */ sw $zero, ($v1) -.L800B7CE8: -/* 0B88E8 800B7CE8 8FBF002C */ lw $ra, 0x2c($sp) -.L800B7CEC: -/* 0B88EC 800B7CEC 8FB00014 */ lw $s0, 0x14($sp) -/* 0B88F0 800B7CF0 8FB10018 */ lw $s1, 0x18($sp) -/* 0B88F4 800B7CF4 8FB2001C */ lw $s2, 0x1c($sp) -/* 0B88F8 800B7CF8 8FB30020 */ lw $s3, 0x20($sp) -/* 0B88FC 800B7CFC 8FB40024 */ lw $s4, 0x24($sp) -/* 0B8900 800B7D00 8FB50028 */ lw $s5, 0x28($sp) -/* 0B8904 800B7D04 03E00008 */ jr $ra -/* 0B8908 800B7D08 27BD0060 */ addiu $sp, $sp, 0x60 - -/* 0B890C 800B7D0C 00000000 */ nop diff --git a/asm/non_matchings/unknown_0255E0/func_800278E8.s b/asm/non_matchings/unknown_0255E0/func_800278E8.s index 1bb79539..d54604d7 100644 --- a/asm/non_matchings/unknown_0255E0/func_800278E8.s +++ b/asm/non_matchings/unknown_0255E0/func_800278E8.s @@ -104,7 +104,7 @@ glabel func_800278E8 .L80027A5C: /* 02865C 80027A5C 104000ED */ beqz $v0, .L80027E14 /* 028660 80027A60 8FBF001C */ lw $ra, 0x1c($sp) -/* 028664 80027A64 0C01A73F */ jal func_80069CFC +/* 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) diff --git a/asm/non_matchings/unknown_032760/func_8003F2E8.s b/asm/non_matchings/unknown_032760/func_8003F2E8.s index c1f592c6..58bea797 100644 --- a/asm/non_matchings/unknown_032760/func_8003F2E8.s +++ b/asm/non_matchings/unknown_032760/func_8003F2E8.s @@ -268,7 +268,7 @@ glabel func_8003F2E8 /* 0402B0 8003F6B0 8C45000C */ lw $a1, 0xc($v0) /* 0402B4 8003F6B4 8C460010 */ lw $a2, 0x10($v0) /* 0402B8 8003F6B8 8C470014 */ lw $a3, 0x14($v0) -/* 0402BC 8003F6BC 0C00455C */ jal func_80011570 +/* 0402BC 8003F6BC 0C00455C */ jal move_object /* 0402C0 8003F6C0 00000000 */ nop /* 0402C4 8003F6C4 8FA80038 */ lw $t0, 0x38($sp) /* 0402C8 8003F6C8 00000000 */ nop diff --git a/asm/non_matchings/unknown_032760/obj_init_fish.s b/asm/non_matchings/unknown_032760/obj_init_fish.s index 8e4df33e..5cabb823 100644 --- a/asm/non_matchings/unknown_032760/obj_init_fish.s +++ b/asm/non_matchings/unknown_032760/obj_init_fish.s @@ -122,7 +122,7 @@ glabel obj_init_fish /* 0379EC 80036DEC 8FA50030 */ lw $a1, 0x30($sp) /* 0379F0 80036DF0 8FA7002C */ lw $a3, 0x2c($sp) /* 0379F4 80036DF4 02202025 */ move $a0, $s1 -/* 0379F8 80036DF8 0C00455C */ jal func_80011570 +/* 0379F8 80036DF8 0C00455C */ jal move_object /* 0379FC 80036DFC 24060000 */ li $a2, 0 /* 037A00 80036E00 8FA90048 */ lw $t1, 0x48($sp) /* 037A04 80036E04 02001825 */ move $v1, $s0 diff --git a/asm/non_matchings/unknown_032760/obj_loop_butterfly.s b/asm/non_matchings/unknown_032760/obj_loop_butterfly.s index 346eb7a5..5d901a95 100644 --- a/asm/non_matchings/unknown_032760/obj_loop_butterfly.s +++ b/asm/non_matchings/unknown_032760/obj_loop_butterfly.s @@ -377,7 +377,7 @@ glabel L80040E54 /* 041D94 80041194 44075000 */ mfc1 $a3, $f10 /* 041D98 80041198 44052000 */ mfc1 $a1, $f4 /* 041D9C 8004119C 44063000 */ mfc1 $a2, $f6 -/* 041DA0 800411A0 0C00455C */ jal func_80011570 +/* 041DA0 800411A0 0C00455C */ jal move_object /* 041DA4 800411A4 02002025 */ move $a0, $s0 /* 041DA8 800411A8 8FA8003C */ lw $t0, 0x3c($sp) /* 041DAC 800411AC 44804000 */ mtc1 $zero, $f8 @@ -922,7 +922,7 @@ glabel L8004153C /* 04258C 8004198C 02002025 */ move $a0, $s0 /* 042590 80041990 E6120024 */ swc1 $f18, 0x24($s0) /* 042594 80041994 8E070024 */ lw $a3, 0x24($s0) -/* 042598 80041998 0C00455C */ jal func_80011570 +/* 042598 80041998 0C00455C */ jal move_object /* 04259C 8004199C 00000000 */ nop /* 0425A0 800419A0 8FA8003C */ lw $t0, 0x3c($sp) /* 0425A4 800419A4 00000000 */ nop diff --git a/asm/non_matchings/unknown_032760/obj_loop_fish.s b/asm/non_matchings/unknown_032760/obj_loop_fish.s index 8be289b2..7786438b 100644 --- a/asm/non_matchings/unknown_032760/obj_loop_fish.s +++ b/asm/non_matchings/unknown_032760/obj_loop_fish.s @@ -177,7 +177,7 @@ glabel obj_loop_fish /* 037F68 80037368 8FA60068 */ lw $a2, 0x68($sp) /* 037F6C 8003736C 44071000 */ mfc1 $a3, $f2 /* 037F70 80037370 44056000 */ mfc1 $a1, $f12 -/* 037F74 80037374 0C00455C */ jal func_80011570 +/* 037F74 80037374 0C00455C */ jal move_object /* 037F78 80037378 02202025 */ move $a0, $s1 /* 037F7C 8003737C C7A00060 */ lwc1 $f0, 0x60($sp) /* 037F80 80037380 C7B00058 */ lwc1 $f16, 0x58($sp) diff --git a/include/sound_ids.h b/include/sound_ids.h index 9a85fa73..7aaa5e6d 100644 --- a/include/sound_ids.h +++ b/include/sound_ids.h @@ -38,8 +38,8 @@ enum SoundID { /* 0x0017 */ SOUND_EXPLOSION2, // Not sure what this one's for. /* 0x0018 */ SOUND_VOICE_TT_GET_READY, /* 0x0019 */ SOUND_VOICE_TT_GO, -/* 0x001A */ SOUND_UNK_1A, -/* 0x001B */ SOUND_UNK_1B, +/* 0x001A */ SOUND_LAND_GRASS, +/* 0x001B */ SOUND_LAND_SAND, /* 0x001C */ SOUND_CAR_BRAKE, /* 0x001D */ SOUND_UNK_1D, /* 0x001E */ SOUND_UNK_1E, diff --git a/include/structs.h b/include/structs.h index 8fa6d17a..1f09a1f5 100644 --- a/include/structs.h +++ b/include/structs.h @@ -572,12 +572,12 @@ typedef struct LevelModel { /* 0x26 */ u16 unk26; u8 pad28[0x10]; /* 0x38 */ u32 minimapColor; -/* 0x3C */ s16 unk3C; -/* 0x3E */ s16 unk3E; -/* 0x40 */ s16 unk40; -/* 0x42 */ s16 unk42; -/* 0x44 */ s16 unk44; -/* 0x46 */ s16 unk46; +/* 0x3C */ s16 lowerXBounds; +/* 0x3E */ s16 upperXBounds; +/* 0x40 */ s16 lowerYBounds; +/* 0x42 */ s16 upperYBounds; +/* 0x44 */ s16 lowerZBounds; +/* 0x46 */ s16 upperZBounds; /* 0x48 */ s32 modelSize; } LevelModel; @@ -866,11 +866,6 @@ typedef struct Object_AnimCamera { /* 0x44 */ s8 unk44; } Object_AnimCamera; -typedef struct Object_AnimCar { - /* 0x000 */ u8 pad0[0x148]; - /* 0x148 */ struct Object *unk148; -} Object_AnimCar; - typedef struct Object_InfoPoint { /* 0x0 */ s16 unk0; } Object_InfoPoint; @@ -1012,10 +1007,10 @@ typedef struct Object_Racer { /* 0x08C */ f32 stretch_height; /* 0x090 */ f32 stretch_height_cap; /* 0x094 */ f32 camera_zoom; - /* 0x098 */ f32 unk98; // Can only guess this is yaw. + /* 0x098 */ f32 unk98; /* 0x09C */ f32 pitch; - /* 0x0A0 */ f32 unkA0; // might be roll - /* 0x0A4 */ f32 unkA4; + /* 0x0A0 */ f32 roll; + /* 0x0A4 */ f32 yaw; /* 0x0A8 */ f32 checkpoint_distance; /* 0x0AC */ f32 unkAC; /* 0x0B0 */ f32 unkB0; @@ -1046,7 +1041,7 @@ typedef struct Object_Racer { /* 0x13C */ s32 unk13C; /* 0x140 */ struct Object *magnetTargetObj; /* 0x144 */ struct Object *held_obj; - /* 0x148 */ struct Object *unk148; + /* 0x148 */ struct Object *approachTarget; /* 0x14C */ struct Object *unk14C; /* 0x150 */ struct Object *unk150; /* 0x154 */ struct Object *unk154; @@ -1088,7 +1083,7 @@ typedef struct Object_Racer { /* 0x19A */ s16 unk19A; /* 0x19C */ s16 unk19C; /* 0x19E */ s16 unk19E; - /* 0x1A0 */ s16 unk1A0; + /* 0x1A0 */ s16 steerVisualRotation; /* 0x1A2 */ s16 y_rotation_vel; /* 0x1A4 */ s16 x_rotation_vel; /* 0x1A6 */ s16 z_rotation_vel; @@ -1135,7 +1130,7 @@ typedef struct Object_Racer { /* 0x1E4 */ s8 unk1E4; /* 0x1E5 */ s8 unk1E5; /* 0x1E6 */ s8 drift_direction; - /* 0x1E7 */ s8 unk1E7; + /* 0x1E7 */ s8 miscAnimCounter; /* 0x1E8 */ s8 unk1E8; /* 0x1E9 */ s8 unk1E9; /* 0x1EA */ s8 unk1EA; @@ -1404,7 +1399,6 @@ typedef struct Object_64 { Object_CharacterFlag character_flag; Object_Snowball snowball; Object_AnimCamera anim_camera; - Object_AnimCar anim_car; Object_InfoPoint info_point; Object_TTDoor tt_door; Object_WorldKey world_key; diff --git a/src/camera.c b/src/camera.c index 31947894..a1baa472 100644 --- a/src/camera.c +++ b/src/camera.c @@ -1217,8 +1217,7 @@ void func_80069A40(Gfx **dlist) { D_80120D20--; D_80120D1C--; - // Fakematch? - { s32 temp = D_80120D20; if ((temp && temp) != 0){} } + { s32 temp = D_80120D20; if ((temp && temp) != 0){} } // Fakematch if (D_80120D1C > 0) { gSPMatrix((*dlist)++, OS_PHYSICAL_TO_K0(D_80120D88[D_80120D1C]), G_MTX_DKR_INDEX_1); @@ -1257,12 +1256,15 @@ UNUSED void func_80069CB4(s32 xRotation, s32 yRotation, s32 zRotation) { gActiveCameraStack[gActiveCameraID].trans.z_rotation += zRotation; } -ObjectSegment *func_80069CFC(void) { +/** + * Returns the segment data of the active camera, but won't apply the offset for cutscenes. +*/ +ObjectSegment *get_active_camera_segment_no_cutscenes(void) { return &gActiveCameraStack[gActiveCameraID]; } /** - * Returns the active segment data of the active camera. + * Returns the segment data of the active camera. */ ObjectSegment *get_active_camera_segment(void) { if (gCutsceneCameraActive) { @@ -1344,7 +1346,7 @@ UNUSED void debug_print_fixed_matrix_values(s16 *mtx) { rmonPrintf("%x ", (u16)val & 0xFFFF); } rmonPrintf("\n"); - if (!val){} + if (!val){} // Fakematch } rmonPrintf("\n"); } diff --git a/src/camera.h b/src/camera.h index aa77fad6..6f13d830 100644 --- a/src/camera.h +++ b/src/camera.h @@ -141,7 +141,7 @@ void func_80068158(Gfx **dlist, s32 arg1, s32 arg2, s32 arg3, s32 arg4); void func_800682AC(Gfx **dlist); void func_80068408(Gfx **dlist, MatrixS **mats); void func_80068508(s32 arg0); -ObjectSegment *func_80069CFC(void); +ObjectSegment *get_active_camera_segment_no_cutscenes(void); ObjectSegment *get_active_camera_segment(void); ObjectSegment *func_80069D7C(void); Matrix *func_80069DA4(void); diff --git a/src/game_ui.c b/src/game_ui.c index 8446a26b..a3ca5f5a 100644 --- a/src/game_ui.c +++ b/src/game_ui.c @@ -1872,7 +1872,7 @@ void render_minimap_and_misc_hud(Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 u gDPSetPrimColor(gHUDCurrDisplayList++, 0, 0, gMinimapRed, gMinimapGreen, gMinimapBlue, mapOpacity); } render_orthi_triangle_image(&gHUDCurrDisplayList, &gHUDCurrMatrix, &gHUDCurrVertex, (ObjectSegment* ) &objTrans.trans, (unk80068BF4* ) sp154, 0); - sp11C = (lvlMdl->unk3E - lvlMdl->unk3C) / (f32) (lvlMdl->unk46 - lvlMdl->unk44); + sp11C = (lvlMdl->upperXBounds - lvlMdl->lowerXBounds) / (f32) (lvlMdl->upperZBounds - lvlMdl->lowerZBounds); sp118 = coss_f((lvlMdl->unk24 * 0xFFFF) / 360); sp114 = sins_f((lvlMdl->unk24 * 0xFFFF) / 360); if (func_8000E4D8() && func_8001B288()) { diff --git a/src/menu.c b/src/menu.c index a406559e..d48e601a 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2538,7 +2538,7 @@ s32 menu_title_screen_loop(s32 updateRate) { gTitleDemoTimer = 0; } if ((gMenuDelay == 0) && (func_800214C4() || sp28)) { - if(gTitleDemoTimer){} + if(gTitleDemoTimer){} // Fakematch D_80126864 += 3; demo = &sTitleScreenDemoIds[D_80126864]; if (demo[0] == -1) { @@ -3860,7 +3860,7 @@ s32 menu_controller_pak_loop(s32 updateRate) { switch (D_800DF460) { case -1: if (yStick < 0) { - if(!xStick){} + if(!xStick){} // Fakematch D_800DF460 = 0; playMoveSound = TRUE; } @@ -8110,9 +8110,9 @@ void update_controller_sticks(void) { gControllersYAxis[i] = YClamp; if (gControllersYAxis[i] < -STICK_DEADZONE) { - gControllersYAxisDelay[i]++; + gControllersYAxisDelay[i]++; //!@Delta } else if (gControllersYAxis[i] > STICK_DEADZONE) { - gControllersYAxisDelay[i]++; + gControllersYAxisDelay[i]++; //!@Delta } else { gControllersYAxisDelay[i] = 0; } @@ -8124,9 +8124,9 @@ void update_controller_sticks(void) { gControllersXAxis[i] = XClamp; if (gControllersXAxis[i] < -STICK_DEADZONE) { - gControllersXAxisDelay[i]++; + gControllersXAxisDelay[i]++; //!@Delta } else if (gControllersXAxis[i] > STICK_DEADZONE) { - gControllersXAxisDelay[i]++; + gControllersXAxisDelay[i]++; //!@Delta } else { gControllersXAxisDelay[i] = 0; } @@ -8841,7 +8841,7 @@ s32 tt_menu_loop(void) { } } if ((buttonsPressed & A_BUTTON) && (sCurrentMenuID != TT_MENU_EXIT)) { - if(gPreviousMenuID && !gPreviousMenuID && !gPreviousMenuID){} // Fake match + if(gPreviousMenuID && !gPreviousMenuID && !gPreviousMenuID){} // Fakematch switch (gDialogueItemSelection) { case 1: play_sound_global(SOUND_SELECT2, NULL); diff --git a/src/object_functions.c b/src/object_functions.c index cd3e7646..773f3d40 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -221,7 +221,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { obj->segment.trans.y_position = 0.0f; obj->segment.trans.z_position = 0.0f; func_80011560(); - func_80011570(obj, someObj->segment.trans.x_position, someObj->segment.trans.y_position, someObj->segment.trans.z_position); + move_object(obj, someObj->segment.trans.x_position, someObj->segment.trans.y_position, someObj->segment.trans.z_position); } else { var_f2 = (someObj->segment.trans.x_position - obj->segment.trans.x_position) * 0.1; if (var_f2 > 10.0) { @@ -251,7 +251,7 @@ void obj_loop_fireball_octoweapon(Object *obj, s32 updateRate) { obj->segment.trans.y_rotation = arctan2_f(obj->segment.x_velocity, obj->segment.z_velocity); obj->segment.trans.x_rotation -= updateRate * 0x200; } - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); if (obj->unk4A == 298) { if (func_8002AD08(obj->segment.trans.y_position, &sp4C, NULL)) { obj->segment.trans.y_position = sp4C; @@ -455,7 +455,7 @@ void obj_loop_laserbolt(Object *obj, s32 updateRate) { obj->segment.y_velocity = (sp44 - obj->segment.trans.y_position) / updateRateF; obj->segment.z_velocity = (sp48 - obj->segment.trans.z_position) / updateRateF; } - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); if (sp38) { func_8003FC44(obj->segment.trans.x_position, obj->segment.trans.y_position - 36.0f, obj->segment.trans.z_position, 44, 0, 0.2, 0); sp4F = TRUE; @@ -514,9 +514,9 @@ void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { s32 numberOfObjects; LevelObjectEntry_EffectBox *level_entry; s32 i; - f32 xDiff; - f32 yDiff; - f32 zDiff; + f32 diffX; + f32 diffY; + f32 diffZ; f32 temp0; f32 temp1; f32 temp2; @@ -533,20 +533,20 @@ void obj_loop_effectbox(Object *obj, UNUSED s32 updateRate) { temp4 = level_entry->unkA * 3; for (i = 0; i < numberOfObjects; i++) { - xDiff = objList[i]->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = objList[i]->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = objList[i]->segment.trans.z_position - obj->segment.trans.z_position; - if ((-temp3 < yDiff) && (yDiff < temp3)) { - temp5 = (xDiff * temp0) + (zDiff * temp1); + diffX = objList[i]->segment.trans.x_position - obj->segment.trans.x_position; + diffY = objList[i]->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = objList[i]->segment.trans.z_position - obj->segment.trans.z_position; + if ((-temp3 < diffY) && (diffY < temp3)) { + temp5 = (diffX * temp0) + (diffZ * temp1); if ((-temp2 < temp5) && (temp5 < temp2)) { - temp5 = (-xDiff * temp1) + (zDiff * temp0); + temp5 = (-diffX * temp1) + (diffZ * temp0); if ((-temp4 < temp5) && (temp5 < temp4)) { curObj64 = &objList[i]->unk64->effect_box; curObj64->unk1FE = level_entry->unkC; curObj64->unk1FF = level_entry->unkD; temp5 = temp3 / 2; - if ((temp5 < yDiff) && (curObj64->unk1FE == 1)) { - temp5 = (1.0 - ((yDiff - temp5) / temp5)); + if ((temp5 < diffY) && (curObj64->unk1FE == 1)) { + temp5 = (1.0 - ((diffY - temp5) / temp5)); curObj64->unk1FF *= temp5; } } @@ -864,9 +864,9 @@ void obj_init_airzippers_waterzippers(Object *obj, LevelObjectEntry_AirZippers_W void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 updateRate) { Object *curRacerObj; Object_Racer *racer; - f32 xDiff; - f32 yDiff; - f32 zDiff; + f32 diffX; + f32 diffY; + f32 diffZ; s32 numObjects; Object** racerObjs; s32 i; @@ -882,10 +882,10 @@ void obj_loop_airzippers_waterzippers(Object *obj, UNUSED s32 updateRate) { curRacerObj = racerObjs[i]; racer = &curRacerObj->unk64->racer; if ((racer->unk1F5 == 0) && (racer->boostTimer < 15)) { - xDiff = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((s32) sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < 100) { + diffX = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; + diffY = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < 100) { racer->unk1F5 = 1; racer->unk14C = obj; } @@ -931,10 +931,10 @@ void obj_init_groundzipper(Object *arg0, LevelObjectEntry_GroundZipper *entry) { void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { Object *curRacerObj; Object_Racer *racer; - f32 xDiff; - f32 yDiff; + f32 diffX; + f32 diffY; s32 numObjects; - f32 zDiff; + f32 diffZ; Object** racerObjs; s32 i; @@ -947,10 +947,10 @@ void obj_loop_groundzipper(Object *obj, UNUSED s32 updateRate) { curRacerObj = racerObjs[i]; racer = &curRacerObj->unk64->racer; if ((racer->boostTimer < 15) && (racer->unk1E2 != 0)) { - xDiff = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((s32) sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < obj->unk78) { + diffX = curRacerObj->segment.trans.x_position - obj->segment.trans.x_position; + diffY = curRacerObj->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = curRacerObj->segment.trans.z_position - obj->segment.trans.z_position; + if ((s32) sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < obj->unk78) { if (racer->playerIndex != PLAYER_COMPUTER) { play_sound_spatial(SOUND_ZIP_PAD_BOOST, curRacerObj->segment.trans.x_position, curRacerObj->segment.trans.y_position, curRacerObj->segment.trans.z_position, NULL); } @@ -1175,7 +1175,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { } else { obj->action = TT_MODE_TURN_TOWARDS_PLAYER; } - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); func_8006F388(1); break; case TT_MODE_TURN_TOWARDS_PLAYER: @@ -1203,7 +1203,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { play_tt_voice_clip(SOUND_VOICE_TT_INTRO, 1); // Hi there, I'm T.T! } } - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); break; case TT_MODE_DIALOGUE: obj->segment.x_velocity = diffX * 0.05; @@ -1224,7 +1224,7 @@ void obj_loop_stopwatchman(Object *obj, s32 updateRate) { racer->unk118 = func_80004B40(racer->characterId, racer->vehicleID); } obj->unk7C.word = 0xB4; - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); break; case TT_MODE_DIALOGUE_END: tt->unk4 += 1.0 * updateRateF; @@ -1710,19 +1710,23 @@ void obj_loop_animcamera(Object *obj, s32 updateRate) { UNUSED void func_800387C0(UNUSED s32 arg0, UNUSED s32 arg1) { } +/** + * Racer cutscene target loop behaviour. + * Exists as a target point for racer objects to automatically move towards, for cutscenes. + */ void obj_loop_animcar(Object *obj, s32 updateRate) { - Object *someObj; - s32 temp_v0; - temp_v0 = obj->action; - someObj = NULL; - if (temp_v0 != 0) { - someObj = get_racer_object(temp_v0 - 1); + Object *racerObj; + s32 racerID; + racerID = obj->action; + racerObj = NULL; + if (racerID != 0) { + racerObj = get_racer_object(racerID - 1); } obj->unk7C.word = func_8001F460(obj, updateRate, obj); obj->segment.trans.unk6 |= 0x4000; - if (obj->unk7C.word == 0 && someObj != NULL) { - Object_AnimCar *someObj64 = &someObj->unk64->anim_car; - someObj64->unk148 = obj; + if (obj->unk7C.word == 0 && racerObj != NULL) { + Object_Racer *racer = &racerObj->unk64->racer; + racer->approachTarget = obj; } } @@ -1904,10 +1908,10 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { Object_Racer *racer; s32 numberOfRacers; Settings *settings; - f32 xDiff; - f32 zDiff; + f32 diffX; + f32 diffZ; f32 dist; - f32 yDiff; + f32 diffY; Object_Exit *obj64; s32 enableWarp; Object** racerObjects; @@ -1930,11 +1934,11 @@ void obj_loop_exit(Object *obj, UNUSED s32 updateRate) { for (i = 0; i < numberOfRacers; i++) { racerObj = racerObjects[i]; racer = &racerObj->unk64->racer; - if ((racer->playerIndex != -1) && (racer->unk108 == 0)) { - xDiff = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = racerObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < dist)) { + if ((racer->playerIndex != PLAYER_COMPUTER) && (racer->unk108 == 0)) { + diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; + diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + if ((sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist)) { temp = (obj64->unk0 * racerObj->segment.trans.x_position) + (obj64->unk8 * racerObj->segment.trans.z_position) + obj64->unkC; if (temp < 0.0f) { racer->unk108 = obj; @@ -2189,7 +2193,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { } else { obj->action = TAJ_MODE_TURN_TOWARDS_PLAYER; } - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); break; case TAJ_MODE_TURN_TOWARDS_PLAYER: func_8005A3C0(); @@ -2215,7 +2219,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->segment.x_velocity = xPosDiff * 0.125; obj->segment.y_velocity = 0; obj->segment.z_velocity = zPosDiff * 0.125; - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); break; case TAJ_MODE_GREET_PLAYER: obj->segment.unk38.byte.unk3B = 1; @@ -2507,7 +2511,7 @@ void obj_loop_parkwarden(Object *obj, s32 updateRate) { obj->segment.trans.y_rotation += ((var_a2 * updateRate) >> 4); xPosDiff = sins_f(obj->segment.trans.y_rotation + 0x8000); zPosDiff = coss_f(obj->segment.trans.y_rotation + 0x8000); - func_80011570( + move_object( obj, (updateRateF2 * xPosDiff) * 1.1, 0.0f, @@ -2769,11 +2773,11 @@ void obj_loop_bonus(Object *obj, UNUSED s32 updateRate) { Object *racerObj; Object_Racer *racer; s32 numberOfRacers; - f32 xDiff; - f32 yDiff; + f32 diffX; + f32 diffY; f32 halfDist; f32 dist; - f32 zDiff; + f32 diffZ; Object_Bonus *obj64; Object **racerObjects; s32 i; @@ -2786,11 +2790,11 @@ void obj_loop_bonus(Object *obj, UNUSED s32 updateRate) { for (i = 0; i < numberOfRacers; i++) { racerObj = racerObjects[i]; racer = &racerObj->unk64->racer; - yDiff = racerObj->segment.trans.y_position - obj->segment.trans.y_position; - if ((yDiff < halfDist) && (-halfDist < yDiff)) { - xDiff = racerObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = racerObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < dist)) { + diffY = racerObj->segment.trans.y_position - obj->segment.trans.y_position; + if ((diffY < halfDist) && (-halfDist < diffY)) { + diffX = racerObj->segment.trans.x_position - obj->segment.trans.x_position; + diffZ = racerObj->segment.trans.z_position - obj->segment.trans.z_position; + if ((sqrtf((diffX * diffX) + (diffY * diffY) + (diffZ * diffZ)) < dist)) { f32 temp = (obj64->unk0 * racerObj->segment.trans.x_position) + (obj64->unk8 * racerObj->segment.trans.z_position) + obj64->unkC; if (temp < 0.0f) { if ((s32) racer->bananas < 10) { @@ -2890,7 +2894,7 @@ void obj_loop_goldenballoon(Object *obj, s32 updateRate) { racer = &racerObj->unk64->racer; if (racer->playerIndex == PLAYER_ONE) { settings->balloonsPtr[settings->worldId]++; - if(isPirated == 1) { } + if(isPirated == 1) { } // Fakematch if (settings->worldId != 0) { settings->balloonsPtr[0]++; } @@ -3442,7 +3446,7 @@ void obj_loop_flycoin(Object *obj, s32 updateRate) { updateRateF *= 1.2; } obj->segment.y_velocity -= 0.5 * updateRateF; - func_80011570(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); + move_object(obj, obj->segment.x_velocity * updateRateF, obj->segment.y_velocity * updateRateF, obj->segment.z_velocity * updateRateF); obj->unk78 -= updateRate; if (obj->unk78 <= 0) { racerObj = (Object_Racer *) obj->unk7C.word; @@ -4029,7 +4033,7 @@ void handle_rocket_projectile(Object *obj, s32 updateRate) { diffX = offsetX - posX; diffY = offsetY - posY; diffZ = offsetZ - posZ; - if (func_80011570(obj, diffX, diffY, diffZ) != 0) { + if (move_object(obj, diffX, diffY, diffZ) != 0) { obj->unk78 = 0; } diffX = ((diffX * diffX) + (diffZ * diffZ)) / updateRateF; @@ -4506,41 +4510,41 @@ GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_loop_butterfly.s") GLOBAL_ASM("asm/non_matchings/unknown_032760/obj_init_midifade.s") void obj_init_midifadepoint(Object *obj, LevelObjectEntry_MidiFadePoint *entry) { - Object_MidiFadePoint *obj64; - ObjectModel **models; - ObjectModel *objModel; - Vertex *vertex; - s32 i; - f32 x; - f32 y; - f32 z; - f32 dist; + Object_MidiFadePoint *obj64; + ObjectModel **models; + ObjectModel *objModel; + Vertex *vertex; + s32 i; + f32 x; + f32 y; + f32 z; + f32 dist; - obj64 = &obj->unk64->midi_fade_point; - obj64->unk2 = entry->unkA; - obj64->unk0 = entry->unk8; - obj64->unk1C = entry->unk1C; - if (obj64->unk2 < obj64->unk0) { - obj64->unk2 = obj64->unk0 + 10; - } - obj->segment.trans.z_rotation = 0; - obj->segment.trans.x_rotation = 0; - obj->segment.trans.y_rotation = 0; + obj64 = &obj->unk64->midi_fade_point; + obj64->unk2 = entry->unkA; + obj64->unk0 = entry->unk8; + obj64->unk1C = entry->unk1C; + if (obj64->unk2 < obj64->unk0) { + obj64->unk2 = obj64->unk0 + 10; + } + obj->segment.trans.z_rotation = 0; + obj->segment.trans.x_rotation = 0; + obj->segment.trans.y_rotation = 0; - for (i = 0; i < 15; i++) { - obj64->unkC[i] = entry->unkC[i]; - } + for (i = 0; i < 15; i++) { + obj64->unkC[i] = entry->unkC[i]; + } - models = *((ObjectModel ***) obj->unk68); - objModel = models[0]; - vertex = objModel->vertices + 1; - x = vertex->x; - y = vertex->y; - z = vertex->z; - dist = sqrtf(((x * x) + (y * y)) + (z * z)); - obj64->unk4 = entry->unk8 / dist; - obj64->unk8 = entry->unkA / dist; - obj->segment.trans.scale = obj64->unk8; + models = *((ObjectModel ***) obj->unk68); + objModel = models[0]; + vertex = objModel->vertices + 1; + x = vertex->x; + y = vertex->y; + z = vertex->z; + dist = sqrtf(((x * x) + (y * y)) + (z * z)); + obj64->unk4 = entry->unk8 / dist; + obj64->unk8 = entry->unkA / dist; + obj->segment.trans.scale = obj64->unk8; } void obj_init_midichset(Object *obj, LevelObjectEntry_Midichset *entry) { @@ -4556,7 +4560,7 @@ void obj_init_bubbler(Object *obj, LevelObjectEntry_Bubbler *entry) { } void obj_loop_bubbler(Object *obj, s32 updateRate) { - if (obj->unk78 >= get_random_number_from_range(0, 0x400)) { + if (obj->unk78 >= get_random_number_from_range(0, 1024)) { obj->unk74 = 1; } else { obj->unk74 = 0; @@ -4735,11 +4739,11 @@ void obj_loop_frog(Object *obj, s32 updateRate) { obj->segment.x_velocity = frog->unk28 * cosine; obj->segment.z_velocity = frog->unk2C * cosine; func_80011560(); - func_80011570(obj, obj->segment.x_velocity, 0.0f, obj->segment.z_velocity); + move_object(obj, obj->segment.x_velocity, 0.0f, obj->segment.z_velocity); if (func_8002BAB0(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, &sp6C) != 0) { obj->segment.trans.y_position = 0.0f; func_80011560(); - func_80011570(obj, 0.0f, sp6C, 0.0f); + move_object(obj, 0.0f, sp6C, 0.0f); } if (frog->unk19 <= 0 && (frog->unk18 < 6 || frog->unk18 >= 27)) { if (func_80016DE8(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 40.0f, 0, (unk80042178 *) &racerObj) != 0) { diff --git a/src/objects.c b/src/objects.c index ff115a80..b292aaf7 100644 --- a/src/objects.c +++ b/src/objects.c @@ -886,7 +886,7 @@ s32 func_8000FD20(unk8000FD20 *arg0, unk8000FD20_2 *arg1) { return 40; } -s32 func_8000FD34(unk8000FD34 *arg0, unk_80016BC4_2 *arg1) { +s32 func_8000FD34(Object *arg0, Object_5C *arg1) { arg0->unk5C = arg1; func_80016BC4(arg0); return 268; @@ -1006,16 +1006,20 @@ s32 func_80011560(void) { //! @bug The developers probably intended this to be a // No return value! } -s32 func_80011570(Object *obj, f32 xPos, f32 yPos, f32 zPos) { - UNUSED f32 unused; - f32 test1, test2, test3, test4, test5, test6; +/** + * Sets the new position of the object using the differences given. + * Compares against the outer edges of the level geometry to decide wether or not to apply a segment ID. +*/ +s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos) { + s32 segmentID; + f32 x1, x2, y1, y2, z1, z2; f32 newXPos; f32 newYPos; f32 newZPos; LevelModel *levelModel; LevelModelSegmentBoundingBox *box; - s32 var_a0; - s32 var_v1; + s32 outsideBBox; + s32 outOfBounds; s32 intXPos, intYPos, intZPos; levelModel = get_current_level_model(); @@ -1026,38 +1030,39 @@ s32 func_80011570(Object *obj, f32 xPos, f32 yPos, f32 zPos) { D_800DC848 = 0; return 0; } - var_v1 = 0; - test1 = (levelModel->unk3E + 1000.0); - if (newXPos > test1) { - var_v1 = 1; + outOfBounds = FALSE; + x2 = (levelModel->upperXBounds + 1000.0); + //@!bug should've campared against "obj->segment.trans.x_position" + if (newXPos > x2) { + outOfBounds = TRUE; } - test2 = (levelModel->unk3C - 1000.0); - if (obj->segment.trans.x_position < test2) { - var_v1 = 1; + x1 = (levelModel->lowerXBounds - 1000.0); + if (obj->segment.trans.x_position < x1) { + outOfBounds = TRUE; } - if (1) { } if (1) { } if (1) { } - test3 = (levelModel->unk42 + 3000.0); - if (obj->segment.trans.y_position > test3) { - var_v1 = 1; + if (1) { } if (1) { } if (1) { } // Fakematch + y2 = (levelModel->upperYBounds + 3000.0); + if (obj->segment.trans.y_position > y2) { + outOfBounds = TRUE; } - test4 = (levelModel->unk40 - 500.00); - if (obj->segment.trans.y_position < test4) { - var_v1 = 1; + y1 = (levelModel->lowerYBounds - 500.00); + if (obj->segment.trans.y_position < y1) { + outOfBounds = TRUE; } - test5 = (levelModel->unk46 + 1000.0); - if (obj->segment.trans.z_position > test5) { - var_v1 = 1; + z2 = (levelModel->upperZBounds + 1000.0); + if (obj->segment.trans.z_position > z2) { + outOfBounds = TRUE; } - test6 = (levelModel->unk44 - 1000.0); - if (obj->segment.trans.z_position < test6) { - var_v1 = 1; + z1 = (levelModel->lowerZBounds - 1000.0); + if (obj->segment.trans.z_position < z1) { + outOfBounds = TRUE; } if (D_800DC848 != 0) { - var_v1 = 0; + outOfBounds = FALSE; } D_800DC848 = 0; - if (var_v1 != 0) { + if (outOfBounds) { obj->segment.unk2C.half.lower = -1; return 1; } @@ -1074,20 +1079,20 @@ s32 func_80011570(Object *obj, f32 xPos, f32 yPos, f32 zPos) { obj->segment.unk2C.half.lower = get_level_segment_index_from_position(intXPos, intYPos, intZPos); return 0; } else { - var_a0 = 0; - if ((box->x2 < intXPos) || (intXPos < box->x1)) { - var_a0 = 1; + outsideBBox = FALSE; + if (box->x2 < intXPos || intXPos < box->x1) { + outsideBBox = TRUE; } - if ((box->y2 < intYPos) || (intYPos < box->y1)) { - var_a0 = 1; + if (box->y2 < intYPos || intYPos < box->y1) { + outsideBBox = TRUE; } - if ((box->z2 < intZPos) || (intZPos < box->z1)) { - var_a0 = 1; + if (box->z2 < intZPos || intZPos < box->z1) { + outsideBBox = TRUE; } - if (var_a0 != 0) { - var_v1 = get_level_segment_index_from_position(intXPos, intYPos, intZPos); - if (var_v1 != -1) { - obj->segment.unk2C.half.lower = var_v1; + if (outsideBBox) { + segmentID = get_level_segment_index_from_position(intXPos, intYPos, intZPos); + if (segmentID != -1) { + obj->segment.unk2C.half.lower = segmentID; } } } @@ -1327,7 +1332,7 @@ void func_80012E28(Object *this) { tmp_f0 = (tmp_f0 < 0.0f) ? 0.0f : tmp_f0 * tmp_f0; temp = (1.0f - tmp_f0) * 24.0f + sp_20->unkD0; - if(0){} + if(0){} // Fakematch sp_1c = temp; } this->segment.trans.y_position = this->segment.trans.y_position + sp_1c; @@ -1538,24 +1543,24 @@ GLOBAL_ASM("asm/non_matchings/objects/func_800159C8.s") GLOBAL_ASM("asm/non_matchings/objects/func_80016500.s") GLOBAL_ASM("asm/non_matchings/objects/func_80016748.s") -void func_80016BC4(unk8000FD34 *arg0) { +void func_80016BC4(Object *arg0) { s32 var_s0; s32 var_s1; s32 *temp_v0; s8 var_v1; arg0->unk5C->unk104 = 0; - func_8001709C(); + func_8001709C(arg0); func_8001709C(arg0); var_s1 = 0; - var_v1 = arg0->unk40->unk55; + var_v1 = arg0->segment.header->numberOfModelIds; var_s0 = 0; if (var_v1 > 0) { do { temp_v0 = (s32 *) *(arg0->unk68 + var_s0); if (temp_v0 != NULL) { func_8006017C(*temp_v0); - var_v1 = arg0->unk40->unk55; + var_v1 = arg0->segment.header->numberOfModelIds; } var_s1 += 1; var_s0 += 1; @@ -2026,7 +2031,7 @@ s32 func_8001C48C(Object *obj) { return -1; } -s32 func_8001C524(f32 xDiff, f32 yDiff, f32 zDiff, s32 someFlag) { +s32 func_8001C524(f32 diffX, f32 diffY, f32 diffZ, s32 someFlag) { UNUSED f32 pad[6]; s32 sp64; f32 x; @@ -2041,7 +2046,7 @@ s32 func_8001C524(f32 xDiff, f32 yDiff, f32 zDiff, s32 someFlag) { LevelObjectEntry_TTDoor *levelObj; if (someFlag) { - sp64 = func_8001C418(yDiff); + sp64 = func_8001C418(diffY); } dist = D_800E5644; result = 0xFF; @@ -2057,9 +2062,9 @@ s32 func_8001C524(f32 xDiff, f32 yDiff, f32 zDiff, s32 someFlag) { var_a0 = 0; } if (var_a0) { - x = segment->trans.x_position - xDiff; - y = segment->trans.y_position - yDiff; - z = segment->trans.z_position - zDiff; + x = segment->trans.x_position - diffX; + y = segment->trans.y_position - diffY; + z = segment->trans.z_position - diffZ; len = sqrtf((x * x) + (y * y) + (z * z)); if (len < dist) { dist = len; diff --git a/src/objects.h b/src/objects.h index dfc8d69b..0e535a0e 100644 --- a/src/objects.h +++ b/src/objects.h @@ -188,24 +188,6 @@ typedef struct unk800179D0 { u32 unk3C; } unk800179D0; -/* Unknown Size */ -typedef struct unk800179D0_2 { - s32 unk04; -} unk800179D0_2; - -typedef struct unk8001D6E4_arg1_40 { - u8 pad0[0x71]; -/* 0x71 */ u8 unk71; -} unk8001D6E4_arg1_40; - -typedef struct unk8001D6E4_arg1 { -/* 0x00 */ s16 unk0; -/* 0x02 */ s16 unk2; -/* 0x04 */ s16 unk4; - u8 pad6[0x3A]; -/* 0x40 */ unk8001D6E4_arg1_40 *unk40; -} unk8001D6E4_arg1; - /* Unknown Size */ typedef struct unk8000FD20_2 { u8 unk00[0x13]; @@ -218,28 +200,12 @@ typedef struct unk8000FD20 { unk8000FD20_2 *unk4C; } unk8000FD20; -/* Unknown Size */ -typedef struct unk_80016BC4_2 { - u8 pad0[0x104]; - s8 unk104; -} unk_80016BC4_2; - /* Unknown Size */ typedef struct unk_80016BC4_3 { u8 pad0[0x55]; s8 unk55; } unk_80016BC4_3; -/* Unknown Size. This might just be unk8000FD20. */ -typedef struct unk8000FD34 { - u8 pad0[0x40]; - unk_80016BC4_3 *unk40; - u8 pad44[0x18]; - unk_80016BC4_2 *unk5C; - u8 pad60[0x8]; - s32* unk68; -} unk8000FD34; - typedef struct struct_8000FC6C { f32 unk0; TextureHeader *unk4; @@ -459,7 +425,7 @@ s32 func_80031F88(Object*, ObjectHeader24 *); s16 func_8001C418(f32 yPos); void func_80021400(s32 arg0); s32 func_8001B668(s32 arg0); -s32 func_80011570(Object *obj, f32 xPos, f32 yPos, f32 zPos); +s32 move_object(Object *obj, f32 xPos, f32 yPos, f32 zPos); Object *get_racer_object_by_port(s32 index); void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *obj); void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *obj); @@ -469,14 +435,14 @@ 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 func_8000B290(void); -void func_80016BC4(unk8000FD34*); +void func_80016BC4(Object *obj); s32 func_8001C48C(Object *obj); void func_80022CFC(s32 arg0, f32 x, f32 y, f32 z); Object *func_8001B7A8(Object *racer, s32 position, f32 *distance); -s32 func_8000FD34(unk8000FD34 *arg0, unk_80016BC4_2 *arg1); +s32 func_8000FD34(Object *arg0, Object_5C *arg1); void func_8000E4E8(s32 index); void func_8000F648(Object *obj, s32 count, s32 objType); -void func_8001709C(); +void func_8001709C(Object *obj); //Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); diff --git a/src/racer.c b/src/racer.c index b34e5e22..7df2c710 100644 --- a/src/racer.c +++ b/src/racer.c @@ -69,16 +69,16 @@ f32 D_800DCBE8[19] = { 0.8f, 0.84f, 0.8f, 0.8f, 0.8f, 0.8f, 0.8f, }; - -// Unused? Not sure if this is actually an array or just some random data. -s32 D_800DCC34[19] = { +// When driving over this surface, the car begins to bob up and down to give the effect of roughness. +s32 gSurfaceBobbingTable[19] = { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - -s32 D_800DCC80[13] = { - SOUND_NONE, SOUND_UNK_1A, SOUND_UNK_1B, SOUND_NONE, +// When landing on this surface, it makes a sound. +// Strangely, they did only two surface types then called it a day. +s32 gSurfaceSoundTable[13] = { + SOUND_NONE, SOUND_LAND_GRASS, SOUND_LAND_SAND, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE, SOUND_NONE @@ -98,18 +98,19 @@ u16 D_800DCCCC[20] = { 0x010C, 0x010C, 0x010C, 0x0000, }; -s32 D_800DCCF4[19] = { - 1, 4, 16, 1, 1, 1, 1, 1, 1, 1, +s32 gSurfaceFlagTable[19] = { + 1, 4, 0x10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0x100, 1, 1, 1, 1, 1, }; -s32 D_800DCD40[20] = { +s32 gSurfaceFlagTable4P[20] = { 0, 4, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x100, 0, 0, 0, 0, 0, 0, }; -s8 D_800DCD90[15] = { +// Used to know how the AI should use a balloon when they have one. +s8 gRacerAIBalloonActionTable[NUM_WEAPON_TYPES - 1] = { 1, 1, 2, 2, 4, 3, 0, 6, 4, 3, 2, 2, 5, 5, 5, }; @@ -145,26 +146,26 @@ s8 D_800DCDB0[16][2] = { // Checksum count for obj_loop_goldenballoon s32 gObjLoopGoldenBalloonChecksum = 0xA597; -FadeTransition D_800DCDD4 = FADE_TRANSITION(0, FADE_COLOR_BLACK, 50, -1); +FadeTransition gDoorFadeTransition = FADE_TRANSITION(0, FADE_COLOR_BLACK, 50, -1); /*******************************/ /************ .rodata ************/ -const char D_800E6280[] = "%.1f,%.1f,%.1f\n"; -const char D_800E6290[] = "Chk ovflow!!\n"; -const char D_800E62A0[] = "Back\n"; +const char gRacerDebugCoords[] = "%.1f,%.1f,%.1f\n"; +UNUSED const char gChecksumOverflowString[] = "Chk ovflow!!\n"; +UNUSED const char gRacerBackString[] = "Back\n"; /*********************************/ /************ .bss ************/ f32 gCurrentCourseHeight; -f32 D_8011D4F8[3]; +Vec3f gCurrentRacerWaterPos; s8 D_8011D504; ObjectCamera *gCameraObject; UNUSED s32 D_8011D50C; -ObjectTransform D_8011D510; +ObjectTransform gCurrentRacerTransform; u32 gCurrentRacerInput; u32 gCurrentButtonsPressed; u32 gCurrentButtonsReleased; @@ -188,15 +189,15 @@ f32 *D_8011D568; f32 gCurrentRacerWeightStat; f32 gCurrentRacerHandlingStat; f32 D_8011D574; -f32 D_8011D578; -f32 D_8011D57C; +f32 gRacerMagnetVelX; +f32 gRacerMagnetVelZ; u8 D_8011D580; s8 gCurrentSurfaceType; s8 D_8011D582; s8 D_8011D583; s8 D_8011D584; s8 gStartBoostTime; -s16 D_8011D586; +s16 gDialogueCameraAngle; s8 D_8011D588[4]; s8 D_8011D58C[4]; GhostHeader *gGhostData[3]; @@ -359,43 +360,43 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { if (racer->unk209 & 1) { if (racer->unk201 == 0) { if (racer->balloon_level == 0) { - if (func_80044450((s16) (s32) sp38)) { + if (roll_percent_chance((s16) (s32) sp38)) { racer->balloon_level++; } } if (var_t4 == 0 && var_t5 < 3) { - if (func_80044450(sp3C)) { + if (roll_percent_chance(sp3C)) { racer->balloon_type = 0; } } } - if (racer->boostTimer == 0 && D_800DCD90[balloonType] == 4) { - if (func_80044450(sp3C)) { + if (racer->boostTimer == 0 && gRacerAIBalloonActionTable[balloonType] == 4) { + if (roll_percent_chance(sp3C)) { gCurrentButtonsReleased |= Z_TRIG; } } if (racer->balloon_quantity != 0) { - if (D_800DCD90[balloonType] == 1) { + if (gRacerAIBalloonActionTable[balloonType] == 1) { if (sp5C != NULL && sp5C->racer.playerIndex == PLAYER_COMPUTER) { if (var_t4 < 4) { racer->unk1C6 = miscAsset2[racer->characterId] * 60; racer->unk1C9 = 4; } } else { - if (func_80044450(sp36) && var_t4 < 2) { + if (roll_percent_chance(sp36) && var_t4 < 2) { racer->unk1C6 = miscAsset2[racer->characterId] * 60; racer->unk1C9 = 4; } } } - if (D_800DCD90[balloonType] == 2) { + if (gRacerAIBalloonActionTable[balloonType] == 2) { if (sp58 != NULL && sp58->racer.playerIndex == PLAYER_COMPUTER) { if (var_t4 < 4) { racer->unk1C6 = miscAsset2[racer->characterId] * 60; racer->unk1C9 = 5; } } else { - if (func_80044450(sp36) && var_t4 < 2) { + if (roll_percent_chance(sp36) && var_t4 < 2) { racer->unk1C6 = miscAsset2[racer->characterId] * 60; racer->unk1C9 = 5; } @@ -406,7 +407,7 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { } if (racer->boostTimer != 0) { if (!(racer->unk209 & 2)) { - if (func_80044450(sp3A)) { + if (roll_percent_chance(sp3A)) { racer->unk209 |= 4; } racer->unk209 |= 2; @@ -433,7 +434,7 @@ void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate) { } if (D_8011D544 == 0.0f) { racer->unk1CA = D_800DCDA8[var_t5]; - if (func_80044450(sp3C)) { + if (roll_percent_chance(sp3C)) { racer->unk1CA -= 1; } } @@ -594,7 +595,7 @@ void func_80043ECC(s32 arg0, Object_Racer *racer, s32 updateRate) { } else { phi_a0 = racer->balloon_type; } - if (D_800DCD90[phi_a0] == 1) { + if (gRacerAIBalloonActionTable[phi_a0] == 1) { temp_v0->unk8[2][0] += temp_v0->unk8[2][2]; temp_v0->unk8[2][1] += temp_v0->unk8[2][3]; } @@ -615,7 +616,11 @@ void func_80043ECC(s32 arg0, Object_Racer *racer, s32 updateRate) { } } -void func_80044170(Object *obj, Object_Racer *racer, s32 updateRate) { +/** + * Depending on the race type, call a function that handles pathing. + * During those functions, the racer inputs will be set to simulate control. +*/ +void racer_AI_pathing_inputs(Object *obj, Object_Racer *racer, s32 updateRate) { s32 raceType; raceType = get_current_level_race_type(); @@ -678,8 +683,12 @@ void func_80044170(Object *obj, Object_Racer *racer, s32 updateRate) { CLAMP(gCurrentStickY, -75, 75); } -s32 func_80044450(s32 cap) { - return get_random_number_from_range(0, 99) < cap; +/** + * Rolls a number between 0 and 99. + * Effectively, this is to make a 1-100% chance of it returning true, based on the number passed. +*/ +s32 roll_percent_chance(s32 chance) { + return get_random_number_from_range(0, 99) < chance; } GLOBAL_ASM("asm/non_matchings/racer/func_8004447C.s") @@ -709,9 +718,726 @@ void func_80045128(struct TempStruct2 *header) { GLOBAL_ASM("asm/non_matchings/racer/func_800452A0.s") GLOBAL_ASM("asm/non_matchings/racer/func_80045C48.s") -GLOBAL_ASM("asm/non_matchings/racer/func_80046524.s") -void func_80048C7C(Object* obj, Object_Racer* racer) { +#ifdef NON_MATCHING +void func_80046524(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer) { + UNUSED s32 temp2; + UNUSED s32 pad0; + f32 sp11C; + f32 sp118; + f32 var_f14; + f32 sp108; + f32 sp10C; + f32 sp110; + f32 var_f18; + f32 var_f12; + f32 spFC; + f32 temp_f2; + f32 spF4; + f32 spF0; + f32 var_f16; + f32 spE4; + f32 spE8; + UNUSED s32 temp3; + f32 var_f2; + UNUSED f32 *pad3; + Vec3f *spD4; + f32 temp_f0; + s32 var_v0; + f32 spC8; + s32 i; + s32 var_a3; + s32 var_v1; + Unknown80046524 *temp_v0_16; + UNUSED s32 var_t0; + Asset20 *asset20; + s8 var_t1; + s8 temp_v0_10; + s8 var_a3_2; + f32 temp; + Matrix sp68; + s8 sp67; + UNUSED s32 prevUnk1D2; + UNUSED s32 var_t0_3; + float new_var; + if (func_8000E138() != 0) { + updateRateF *= 1.15; + } + sp67 = 0; + if (racer->playerIndex >= 0) { + if (gNumViewports < 2) { + obj->unk74 |= 0x100; + } + } + D_8011D550 = 0; + gCurrentCarSteerVel = 0; + D_8011D558 = 0; + sp108 = obj->segment.trans.x_position; + sp10C = obj->segment.trans.y_position; + sp110 = obj->segment.trans.z_position; + spC8 = 1.0 - (gDialogueCameraAngle / 10240.0f); + spE4 = ((-racer->ox1) * 10) * spC8; + spE8 = ((-racer->oz1) * 10) * spC8; + var_f2 = 8.0f; + if ((gCurrentPlayerIndex == (-1)) || (racer->raceFinished != 0)) { + var_f2 = 32.0f; + } + var_v1 = gCurrentStickX - racer->steerAngle; + var_a3 = (var_v1 * updateRateF) / var_f2; + if (var_v1 != 0) { + if (var_a3 == 0) { + if (var_v1 > 0) { + var_a3 = 1; + } + if (var_v1 < 0) { + var_a3 = -1; + } + } + } + racer->steerAngle += var_a3; + handle_racer_items(obj, racer, updateRate); + func_800535C4(obj, racer); + racer_attack_handler_hovercraft(obj, racer); + if (gCurrentPlayerIndex != PLAYER_COMPUTER) { + handle_racer_head_turning(obj, racer, updateRate); + } else { + slowly_reset_head_angle(racer); + } + if (gCurrentRacerInput & 0x8000) { + racer->throttle += updateRateF * 0.016; + if (racer->throttle > 1.0) { + racer->throttle = 1.0; + } + } else { + racer->throttle -= updateRateF * 0.016; + if (racer->throttle < 0.0f) { + racer->throttle = 0.0f; + } + } + sp11C = racer->throttle; + if ((racer->velocity > 0.0f) && (gCurrentRacerInput & 0x8000)) { + sp11C = 1.0f; + } + sp11C = sp11C * 3.0f; + spF4 = (sp11C * sp11C) / 9.0f; + if (racer->unk108 != 0) { + racer->throttle = 0.5f; + } + if (racer->velocity > 0.0) { + spF4 *= 1.2; + } + if ((gCurrentRacerInput & 0x4000) && ((gCurrentStickY < (-40)) || (racer->velocity < 0.0f))) { + racer->brake += updateRateF * 0.046; + if (racer->brake > 1.2) { + racer->brake = 1.2f; + } + if (racer->velocity < (-2.0)) { + func_80072348(racer->playerIndex, 5); + } + } else { + racer->brake -= updateRateF * 0.046; + if (racer->brake < 0.0f) { + racer->brake = 0.0f; + } + } + sp11C = racer->brake * 3.0f; + spF0 = (sp11C * sp11C) / 9.0f; + if (racer->velocity > 0.0) { + spF0 *= 0.3; + } + + + // Fake, fixes f12 & f14 swap. + if (1) { } if (1) { } if (1) { } if (1) { } if (1) { } + + + if (racer->unk1F5 != 0) { + gCurrentStickX = 0; + racer->magnetTimer = 0; + racer->steerAngle = 0; + racer->spinout_timer = 0; + racer->unk1E0 = 0; + var_v1 = racer->unk14C->segment.trans.y_rotation - (racer->steerVisualRotation & 0xFFFF); + if (var_v1 > 0x8000) { + var_v1 -= 0xFFFF; + } + if (var_v1 < (-0x8000)) { + var_v1 += 0xFFFF; + } + racer->steerVisualRotation += (var_v1 * updateRate) >> 3; + if (((var_v1 < 0x400) && (var_v1 > (-0x400))) || (racer->playerIndex == PLAYER_COMPUTER)) { + if (racer->playerIndex != PLAYER_COMPUTER) { + play_sound_spatial(0x107U, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 0); + play_random_character_voice(obj, 0x162, 8, 0x82); + } + racer->boostTimer = normalise_time(45); + racer->boostType = BOOST_LARGE; + if (racer->throttleReleased) { + racer->boostType |= BOOST_SMALL_FAST; + } + racer->unk1F5 = 0; + func_80072348(racer->playerIndex, 8U); + } else { + obj->segment.x_velocity = ((f64) obj->segment.x_velocity) * 0.75f; + obj->segment.y_velocity = ((f64) obj->segment.y_velocity) * 0.75f; + obj->segment.z_velocity = ((f64) obj->segment.z_velocity) * 0.75f; + } + } + var_f2 = -racer->velocity; + if (var_f2 < 0.0f) { + var_f2 = 0.0f; + } + if (var_f2 > 14.0) { + var_f2 = 14.0f; + } + var_f2 /= 14.0f; + if ((racer->unk1D4 != 0) || (racer->unk1D5 != 0)) { + apply_vehicle_rotation_offset(racer, updateRate, racer->y_rotation_offset, 0, 0); + } else { + apply_vehicle_rotation_offset(racer, updateRate, 0, (spF0 * 4096.0f) * var_f2, 0); + } + if (racer->unk1D5 != 0) { + racer->y_rotation_offset -= racer->y_rotation_offset >> 3; + if ((racer->y_rotation_offset < 16) && (racer->y_rotation_offset > (-16))) { + racer->unk1D5 = 0; + } + gCurrentStickX = 0; + } + if (racer->spinout_timer > 0) { + racer->unk1D4 += updateRate; + if (racer->unk1D4 > 10) { + racer->unk1D4 = 10; + } + } + else + if (racer->spinout_timer < 0) { + racer->unk1D4 -= updateRate; + if (racer->unk1D4 < (-10)) { + racer->unk1D4 = -10; + } + } + else + if (racer->unk1D4 < 0) { + racer->unk1D4 += updateRate; + if (racer->unk1D4 > 0) { + racer->unk1D4 = 0; + racer->unk1D5 = 1; + } + } + else + if (racer->unk1D4 > 0) { + racer->unk1D4 -= updateRate; + if (racer->unk1D4 < 0) { + racer->unk1D4 = 0; + racer->unk1D5 = 1; + } + } + if ((racer->unk1E2 != 0) && (racer->unk1E2 < 3)) { + obj->segment.trans.x_rotation -= (obj->segment.trans.x_rotation * updateRate) >> 6; + racer->x_rotation_vel -= (racer->x_rotation_vel * updateRate) >> 6; + } + + if (racer->unk1D4 != 0) { + i = racer->y_rotation_offset; + racer->unk1D5 = 0; + if (racer->unk1D4 > 0) { + racer->y_rotation_offset += (racer->unk1D4 * 0xB3) * updateRate; + if ((i < (-0x1000)) && (racer->y_rotation_offset >= (-0x1000))) { + racer->spinout_timer--; + } + } + if (racer->unk1D4 < 0) { + racer->y_rotation_offset -= (racer->unk1D4 * 0xB3) * updateRate; + if ((i > 0x1000) && (racer->y_rotation_offset <= 0x1000)) { + racer->spinout_timer++; + } + } + gCurrentRacerInput &= 0xFFFF3FFF; + gCurrentStickX = 0; + racer->steerAngle = 0; + gCurrentStickY = 0; + } + if (racer->unk1F1 != 0) { + racer->y_rotation_offset += updateRate * 0x500; + racer->x_rotation_offset += updateRate * 0x600; + } + gCurrentRacerTransform.y_rotation = obj->segment.trans.y_rotation; + gCurrentRacerTransform.x_rotation = obj->segment.trans.x_rotation; + gCurrentRacerTransform.z_rotation = 0; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix((f32 (*)[4]) sp68, &gCurrentRacerTransform); + guMtxXFMF(sp68, 0.0f, 0.0f, 1.0f, &racer->ox1, &racer->oy1, &racer->oz1); + guMtxXFMF(sp68, 0.0f, 1.0f, 0.0f, &racer->ox2, &racer->oy2, &racer->oz2); + guMtxXFMF(sp68, 1.0f, 0.0f, 0.0f, &racer->ox3, &racer->oy3, &racer->oz3); + if (racer->approachTarget == 0) { + obj->segment.unk38.byte.unk3B = 0; + var_v0 = racer->steerAngle; + var_v0 >>= 1; + var_v0 = 40 - var_v0; + if (var_v0 < 0) { + var_v0 = 0; + } + if (var_v0 > 73) { + var_v0 = 73; + } + obj->segment.animFrame = var_v0; + } + var_f18 = racer->velocity; + if (var_f18 < 0.0f) { + var_f18 = -var_f18; + } + var_t1 = 0; + var_a3_2 = 0; + if (var_f18 > 12.0f) { + var_f18 = 12.0f; + } + var_a3 = var_f18; + temp_f0 = var_f18 - var_a3; + var_f18 = (gCurrentRacerMiscAssetPtr[var_a3] * (1.0 - temp_f0)) + (gCurrentRacerMiscAssetPtr[var_a3 + 1] * temp_f0); + gCurrentRacerWeightStat *= 0.75; + if (racer->unk1E2 >= 3) { + obj->segment.y_velocity -= (gCurrentRacerWeightStat * 0.5) * updateRateF; + } else { + obj->segment.y_velocity -= gCurrentRacerWeightStat * updateRateF; + } + i = ((gCurrentPlayerIndex != PLAYER_COMPUTER) && (!racer->raceFinished)) ? racer->steerAngle : gCurrentStickX; + spFC = 0.004f; + obj->segment.y_velocity -= (obj->segment.y_velocity * 0.004) * updateRateF; + if ((gCurrentRacerInput & 0x4000) && (gCurrentStickY >= (-40)) && (racer->velocity >= (-0.5))) { + spFC *= 16.0f; + } + var_f14 = (i * 8) * updateRate; + if (gCurrentStickY < 0) { + var_f2 = (f32) (-gCurrentStickY); + sp11C = var_f2; + var_f14 *= 1.0 + (sp11C / 112.0); + var_f18 *= 1.0 - (sp11C / 300.0); + } + racer->steerVisualRotation -= (s32) (var_f14 * gCurrentRacerHandlingStat); + if ((racer->unk1E2 == 0) && (racer->buoyancy == 0.0)) { + if (obj->segment.y_velocity < 0.0f) { + racer->unk1E0 += updateRate; + } + if (racer->unk1E0 > 25) { + racer->unk1E0 = 25; + } + } + for (i = 0; i < 4; i++) { + if (racer->wheel_surfaces[i] == 0xFF) { + continue; + } + if (var_t1 < racer->wheel_surfaces[i]) { + var_t1 = racer->wheel_surfaces[i]; + } + if (racer->wheel_surfaces[i] == 4) { + var_a3_2 += 1; + } + } + + if ((((racer->playerIndex == PLAYER_ONE) && (racer->unk1E2 != 0)) && (var_t1 == 12)) && (gCurrentButtonsPressed & 0x2000)) { + D_8011D582 = 2; + } + if ((racer->unk1E2 != 0) || (racer->buoyancy > 0.0f)) { + if (racer->unk1E0 != 0) { + if (racer->unk1E2 != 0) { + if (((gRaceStartTimer != 100) && (racer->playerIndex != PLAYER_COMPUTER)) && (racer->unk1E0 >= 6)) { + play_sound_global(0xAEU, &racer->unk21C); + func_80001FB8(0xAEU, (void *) racer->unk21C, (racer->unk1E0 * 2) + 0x32); + } + } + else + if (racer->approachTarget == 0) { + racer_play_sound(obj, 0xAF); + obj->unk74 |= 0x30; + } + temp_f2 = racer->unk1E0 - 5.0f; + if ((temp_f2 > 0.0f) && (racer->approachTarget == 0)) { + racer->stretch_height_cap = 1.0 - (temp_f2 * 0.02); + } + racer->unk1E0 = 0; + } + } + var_f18 = var_f18 * (handle_racer_top_speed(obj, racer) * 1.7); + if (racer->boostTimer > 0) { + if (gRaceStartTimer == 0) { + spF4 = 1.0f; + spF0 = 0.0f; + if (var_f18 != 0.0) { + var_f18 = 2.0f; + } + racer->boostTimer -= updateRate; + } + } else { + racer->boostTimer = 0; + } + if (gRaceStartTimer != 0) { + var_f18 = 0.0f; + } + if (var_a3_2 != 0) { + temp_f0 = ((f32 *) get_misc_asset(0x20))[var_a3_2]; + var_f18 *= temp_f0; + spFC /= temp_f0; + racer->magnetTimer = 0; + racer->lateral_velocity = 0.0f; + } + if ((racer->boostTimer == 0) && (var_t1 == 3)) { + racer->boostTimer = normalise_time(45); + racer->boostType = BOOST_LARGE; + if (racer->throttleReleased) { + racer->boostType |= BOOST_SMALL_FAST; + } + racer_play_sound(obj, 0x107); + play_random_character_voice(obj, 0x162, 8, 0x82); + func_80072348(racer->playerIndex, 8U); + } + temp_f0 = sqrtf((obj->segment.z_velocity * obj->segment.z_velocity) + (obj->segment.x_velocity * obj->segment.x_velocity)); + if (temp_f0 > 0.25) { + racer->unk168 = arctan2_f(obj->segment.x_velocity, obj->segment.z_velocity) + 0x8000; + var_v1 = ((0x8000 - racer->unk168) & 0xFFFF) - (racer->unk196 & 0xFFFF); + if (var_v1 > 0x8000) { + var_v1 -= 0xFFFF; + } + if (var_v1 < (-0x8000)) { + var_v1 += 0xFFFF; + } + sp11C = temp_f0 - 0.25; + if (sp11C > 8.0) { + sp11C = 8.0f; + } + sp11C *= 0.125; + racer->unk196 += (((s32) ((var_v1 * ((f32) sp11C)) * 0.75)) * updateRate) >> 4; + var_v1 = (0x8000 - racer->unk196) - (racer->steerVisualRotation & 0xFFFF); + if (var_v1 > 0x8000) { + var_v1 -= 0xFFFF; + } + if (var_v1 < (-0x8000)) { + var_v1 += 0xFFFF; + } + if (temp_f0 > 10.0) { + temp_f0 = 10.0; + } + var_v1 = var_v1 * ((f32) (temp_f0 / 10.0)); + if ((gCurrentRacerInput & 0x8000) || (gCurrentRacerInput & 0x0010)) { + var_v1 *= 2; + } + racer->steerVisualRotation += ((s32) (var_v1 * updateRate)) >> 7; + } + var_v1 = (0x8000 - racer->steerVisualRotation) - (racer->unk196 & 0xFFFF); + if (var_v1 > 0x8000) { + var_v1 -= 0xFFFF; + } + if (var_v1 < (-0x8000)) { + var_v1 += 0xFFFF; + } + temp = 1.0f; + racer->unk196 += (((s32) ((((f32) var_v1) * 1.75) * temp)) * updateRate) >> 6; + if (racer->unk1F5 == 0) { + if ((gCurrentPlayerIndex == PLAYER_COMPUTER) && (racer->raceFinished == 0)) { + var_f16 = racer->lateral_velocity * 0.25; + temp_f0 = var_f16 * 0.35; + if (temp_f0 < 0.0) { + temp_f0 = -temp_f0; + } + if (0.2 < temp_f0) { + gCurrentRacerInput |= 0x0010; + } + obj->segment.x_velocity += racer->ox1 * temp_f0; + obj->segment.y_velocity += racer->oy1 * temp_f0; + obj->segment.z_velocity += racer->oz1 * temp_f0; + } else { + var_f16 = racer->lateral_velocity * 0.07; + if (gCurrentRacerInput & 0x0010) { + var_f16 *= 2; + if ((gCurrentStickX > (-40)) && (gCurrentStickX < 40)) { + spF4 *= 0.8; + } + else + if ((racer->lateral_velocity > 2.5) || (racer->lateral_velocity < (-2.5))) { + spF4 *= 1.5; + } + if (gCurrentRacerInput & 0x4000) { + var_f16 *= 2; + } + } + if (gCurrentRacerInput & 0x4000) {} + } + obj->segment.x_velocity -= racer->ox3 * var_f16; + obj->segment.y_velocity -= racer->oy3 * var_f16; + obj->segment.z_velocity -= racer->oz3 * var_f16; + spF4 *= var_f18; + obj->segment.x_velocity -= racer->ox1 * spF4; + obj->segment.y_velocity -= racer->oy1 * spF4; + obj->segment.z_velocity -= racer->oz1 * spF4; + spF0 *= var_f18 / 2; + obj->segment.x_velocity += racer->ox1 * spF0; + obj->segment.y_velocity += racer->oy1 * spF0; + obj->segment.z_velocity += racer->oz1 * spF0; + if (((racer->unk1E2 != 0) && (D_8011D584 == 0)) && (gRaceStartTimer == 0)) { + temp_f2 = (gCurrentRacerWeightStat * updateRateF) * 0.25; + sp11C = racer->pitch * temp_f2; + temp_f2 = temp_f2 * racer->roll; + obj->segment.x_velocity += (racer->ox1 * sp11C) + (racer->ox3 * temp_f2); + obj->segment.y_velocity += (racer->oy1 * sp11C) + (racer->oy3 * temp_f2); + obj->segment.z_velocity += (racer->oz1 * sp11C) + (racer->oz3 * temp_f2); + } + var_f12 = racer->velocity * racer->velocity; + if (racer->velocity < 0.0f) { + var_f12 = -var_f12; + } + if ((var_f12 < 1.0f) && (!(gCurrentRacerInput & 0x8000))) { + var_f16 = (racer->velocity * spFC) * 8.0f; + } else { + var_f16 = var_f12 * spFC; + } + obj->segment.x_velocity -= racer->ox1 * var_f16; + obj->segment.y_velocity -= racer->oy1 * var_f16; + obj->segment.z_velocity -= racer->oz1 * var_f16; + if (racer->magnetTimer != 0) { + obj->segment.x_velocity = gRacerMagnetVelX; + obj->segment.z_velocity = gRacerMagnetVelZ; + } + } + racer->unk10C = 0; + racer->y_rotation_vel += (gCurrentCarSteerVel - racer->y_rotation_vel) >> 3; + obj->segment.trans.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; + racer->z_rotation_vel += (D_8011D558 - racer->z_rotation_vel) >> 3; + obj->segment.trans.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; + if (racer->unk1D2 > 0) { + racer->unk1D2 -= updateRate; + } else { + racer->unk1D2 = 0; + } + var_f12 = 10.0; + spE4 += (racer->ox1 * var_f12) * spC8; + spE8 += (racer->oz1 * var_f12) * spC8; + if (racer->approachTarget == 0) { + var_f16 = obj->segment.x_velocity; + var_f12 = obj->segment.z_velocity; + if (racer->unk1D2 != 0) { + var_f16 += racer->unk11C; + var_f12 += racer->unk120; + } + if (D_8011D584 != 0) { + if ((var_f16 > 0.5) || (var_f16 < (-0.5))) { + var_f16 *= 0.65; + } else { + var_f16 = 0.0f; + } + if ((var_f12 > 0.5) || (var_f12 < (-0.5))) { + var_f12 *= 0.65; + } else { + var_f12 = 0.0f; + } + } else { + spE8 += racer->unk84 * updateRateF; + spE4 += racer->unk88 * updateRateF; + } + if (move_object(obj, (var_f16 * updateRateF) + spE8, obj->segment.y_velocity * updateRateF, (var_f12 * updateRateF) + spE4) && (gCurrentPlayerIndex != (-1))) { + sp67 = 1; + } + } else { + spE4 = 0.0; + spE8 = 0.0; + racer_approach_object(obj, racer, updateRateF); + } + racer->unkD0 -= (racer->unkD0 * 0.125) * updateRateF; + racer->unkD4 = (-obj->segment.y_velocity) * 7.0; + if (racer->unkD4 > 35.0) { + racer->unkD4 = 35.0; + } + if (racer->unkD4 < 0.0) { + racer->unkD4 = 0; + } + var_f14 = 5.0f; + sp118 = -10000.0f; + temp_v0_10 = func_8002AD08(obj->segment.trans.y_position, &sp118, spD4); + if (temp_v0_10) { + var_f14 = racer->velocity; + if (var_f14 < 0.0f) { + var_f14 = -var_f14; + } + if (var_f14 > 4.0) { + var_f14 = 4.0; + } + var_f14 = var_f14 * 0.8; + if ((obj->segment.trans.y_position - var_f14) < sp118) { + racer->buoyancy = sp118 - (obj->segment.trans.y_position - var_f14); + racer->unk1E5 = 5; + } else { + racer->buoyancy = 0.0f; + } + } + if (racer->unk1E5 > 0) { + racer->unk1E5--; + } else { + racer->buoyancy = 0.0f; + } + if ((racer->unk1E5 > 0) && (obj->segment.trans.y_position < (sp118 + var_f14))) { + obj->interactObj->unk14 |= 0x10; + } else { + obj->interactObj->unk14 &= 0xFFEF; + } + sp118 = obj->segment.trans.y_position - (sp118 + var_f14); + if (racer->buoyancy > 0.0) { + i = 0; + if (gCurrentRacerInput & 0x0010) { + i = gCurrentStickX * 2; + } + rotate_racer_in_water(obj, racer, spD4, temp_v0_10, updateRate, i, 1.0f); + } + if (racer->buoyancy > 0.0) { + obj->segment.trans.y_position += racer->buoyancy * racer->unkC4; + racer->unkC4 += (0.75 - racer->unkC4) * 0.125; + } + i = racer->unk1D2; + if (gCurrentPlayerIndex == PLAYER_COMPUTER && !func_80023568()) { + func_80055A84(obj, racer, updateRate); + } else { + func_80054FD0(obj, racer, updateRate); + } + if ((!i) && racer->unk1D2) { + i = 1; + } + racer->unk1D2 = i; + temp_f2 = 1.0f / updateRateF; + temp = ((obj->segment.trans.x_position - (sp108 + spE4)) - D_8011D548) * temp_f2; + new_var = (obj->segment.trans.z_position - (sp110 + spE8)) - D_8011D54C; + obj->segment.z_velocity = new_var * temp_f2; + obj->segment.x_velocity = temp; + obj->segment.y_velocity = (obj->segment.trans.y_position - sp10C) * temp_f2; + racer->forwardVel -= (racer->forwardVel + (racer->velocity * 0.05)) * 0.125; + if (((racer->buoyancy > 0.0) && (racer->unk1FB == 0)) && (obj->segment.y_velocity > 4.0)) { + obj->segment.y_velocity = 4.0f; + } + if ((gNumViewports < 2) && (obj->segment.header->unk57 >= 9)) { + if (((gCurrentRacerInput & (0x8000 | 0x0010)) == (0x8000 | 0x0010)) && ((gCurrentStickX < (-30)) || (gCurrentStickX > 30))) { + func_800B4668(obj, 8, updateRate << 10, 0x80); + } else { + func_800B46BC(obj, 8, updateRate << 9, 0x20); + } + } + if ((gCurrentPlayerIndex >= PLAYER_ONE) && (racer->buoyancy > 0.0)) { + if (gNumViewports < 3) { + temp_f2 = ((obj->segment.x_velocity * obj->segment.x_velocity) + (obj->segment.y_velocity * obj->segment.y_velocity)) + (obj->segment.z_velocity * obj->segment.z_velocity); + if (temp_f2 > 16.0f) { + if (temp_f2 < 80.0f) { + obj->unk74 |= 0x8 | 0x4; + } + if (temp_f2 > 28.0f) { + obj->unk74 |= 3; + } + if ((gNumViewports == 1) && (temp_f2 > 10.25f)) { + obj->unk74 |= 0x40; + } + } + } else { + if (racer->velocity < 0.0f) { + var_f2 = -racer->velocity; + } else { + var_f2 = racer->velocity; + } + if (var_f2 > 4.0f) { + obj->unk74 |= 0xC; + } + } + } + if (((gCurrentPlayerIndex != PLAYER_COMPUTER) && (racer->boostTimer == 0)) && (gNumViewports < 2)) { + asset20 = &((Asset20 *) get_misc_asset(20))[racer->unk2]; + i = ((racer->boostType & EMPOWER_BOOST) >> 2) + 10; + if (i > 10) { + if ((asset20->unk70 > 0) || (asset20->unk74 > 0.0)) { + obj->unk74 |= 1 << i; + } + } else if ((asset20->unk70 == 2) && (asset20->unk74 < 0.5)) { + obj->unk74 |= 1 << i; + } else if ((asset20->unk70 < 2) && (asset20->unk74 > 0.0f)) { + obj->unk74 |= 1 << i; + } + } + if (racer->unk201 == 0) { + obj->unk74 = 0; + } else { + obj->segment.y_velocity += updateRate * gCurrentRacerWeightStat; + func_800AF714(obj, updateRate); + obj->segment.y_velocity -= updateRate * gCurrentRacerWeightStat; + } + gCurrentRacerTransform.y_rotation = -obj->segment.trans.y_rotation; + gCurrentRacerTransform.x_rotation = -obj->segment.trans.x_rotation; + gCurrentRacerTransform.z_rotation = -obj->segment.trans.z_rotation; + gCurrentRacerTransform.scale = 1.0f; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + object_transform_to_matrix_2((f32 (*)[4]) sp68, &gCurrentRacerTransform); + guMtxXFMF(sp68, obj->segment.x_velocity, obj->segment.y_velocity, obj->segment.z_velocity, &racer->lateral_velocity, (f32 *) (&racer->unk34), &racer->velocity); + if ((racer->unk1E2 == 0) && (racer->unk1E5 == 0)) { + var_v1 = (((-gCurrentStickY) * 0x40) & 0xFFFF) - (obj->segment.trans.x_rotation & 0xFFFF); + if (var_v1 > 0x8000) { + var_v1 -= 0xFFFF; + } + if (var_v1 < (-0x8000)) { + var_v1 += 0xFFFF; + } + obj->segment.trans.x_rotation += var_v1 >> 2; + var_v0 = -(racer->x_rotation_vel & 0xFFFF); + if (var_v0 > 0x8000) { + var_v0 -= 0xFFFF; + } + if (var_v0 < (-0x8000)) { + var_v0 += 0xFFFF; + } + var_v0 *= updateRate; + racer->x_rotation_vel += var_v0 >> 4; + } + if (gRaceStartTimer != 0) { + gCurrentButtonsPressed &= ~0x0010; + } + if ((racer->buoyancy != 0.0f) || (racer->unk1E2 == 4)) { + racer->unk1FB = 0; + } + if (((gCurrentButtonsPressed & 0x0010) && ((racer->buoyancy > 0.0f) || (racer->unk1E2 >= 2))) && (racer->unk1FB == 0)) { + if (racer->buoyancy != 0.0f) { + obj->segment.y_velocity += 4.5; + if (obj->segment.y_velocity > 5.5) { + obj->segment.y_velocity = 5.5f; + } + } else { + obj->segment.y_velocity += 3.5; + } + racer->unk1FB = ((s32) ((f32) ((2.0 * obj->segment.y_velocity) / gCurrentRacerWeightStat))) + 1; + } + if (racer->unk1FB > 0) { + racer->unk1FB -= updateRate; + } else { + racer->unk1FB = 0; + } + if (sp118 > 40.0f) { + racer->unkC4 = 0.11f; + } + if (obj->unk60->unk0 == 1) { + temp_v0_16 = (Unknown80046524 *) obj->unk60->unk4; + temp_v0_16->unk0 = (gCurrentStickX * 0x14) + 0x4000; + temp_v0_16->unk3A++; + temp_v0_16->unk3A &= 1; + } + second_racer_camera_update(obj, racer, 4, updateRateF); + if (sp67) { + func_800230D0(obj, racer); + } +} +#else +GLOBAL_ASM("asm/non_matchings/racer/func_80046524.s") +#endif + +/** + * Initialise some states when a racer is attacked or runs into something. + * While the majority of the respondent behaviour takes place elsewhere, the squish behaviour happens here. + * Hovercraft do not have a spinning state, instead being in the same state when hit by a rocket. + */ +void racer_attack_handler_hovercraft(Object *obj, Object_Racer *racer) { s8 bananas; if (racer->playerIndex == PLAYER_COMPUTER) { @@ -719,7 +1445,7 @@ void func_80048C7C(Object* obj, Object_Racer* racer) { } else { bananas = racer->bananas; } - if ((racer->attackType == ATTACK_NONE) || (racer->shieldTimer > 0)) { + if (racer->attackType == ATTACK_NONE || racer->shieldTimer > 0) { racer->attackType = ATTACK_NONE; return; } @@ -760,7 +1486,7 @@ void func_80048C7C(Object* obj, Object_Racer* racer) { racer->unk1F1 = 1; racer->velocity = 0.0f; obj->segment.y_velocity += 20.5; - racer_play_sound(obj, 0x139); + racer_play_sound(obj, SOUND_WHEE); break; } racer->attackType = ATTACK_NONE; @@ -775,8 +1501,8 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) s32 numViewports; u8 tempZoom; UNUSED s32 pad[2]; - f32 phi_f14 = 165.0f; - f32 phi_f18 = 65.0f; + f32 phi_f14; + f32 phi_f18; f32 xVel; f32 zVel; UNUSED s32 pad2; @@ -785,12 +1511,15 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) f32 brakeVar; f32 baseSpeed; s32 sp24 = 0x400; - s32 delta; + s32 tempUpdateRate; s32 angle; s32 segmentIndex; s32 tempAngle; - delta = (s32) updateRate; + phi_f14 = 165.0f; + phi_f18 = 65.0f; + sp24 = 0x400; + tempUpdateRate = (s32) updateRate; // Place the camera a bit closer with 2+ players to help visibility. numViewports = get_viewport_count(); if (numViewports == 1) { @@ -836,7 +1565,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) angle = sp24 - angle; tempAngle = angle - (u16) gCameraObject->trans.x_rotation; WRAP(tempAngle, -0x8000, 0x8000); - gCameraObject->trans.x_rotation += (tempAngle * delta) >> 4; + gCameraObject->trans.x_rotation += (tempAngle * tempUpdateRate) >> 4; } get_viewport_count(); if (racer->velocity < 0.0) { @@ -866,7 +1595,7 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) phi_f18 = (gCameraObject->unk1C * sp34) + (gCameraObject->unk20 * phi_f18); xVel = sins_f(-racer->unk196 + 0x8000) * gCameraObject->unk1C; zVel = coss_f(-racer->unk196 + 0x8000) * gCameraObject->unk1C; - yVel = (1.0 - (D_8011D586 / 10240.0f)); + yVel = (1.0 - (gDialogueCameraAngle / 10240.0f)); // Goes between 0-1 xVel -= racer->ox1 * 10.0f * yVel; zVel -= racer->oz1 * 10.0f * yVel; yVel = racer->lateral_velocity * 2; @@ -901,16 +1630,17 @@ void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer) } } -// something to do with the boats; this function only fires on boats and it does so when the player's boat is accelerating? -// it returns the velocity, so maybe so -f32 func_800494E0(Object *obj1, Object_Racer *racer, f32 *pos, s8 arg3, s32 updateRate, s32 arg5, f32 arg6) { - Matrix mtx; +/** + * When on water, apply a rotation effect based on the movement of the waves and turning direction. +*/ +f32 rotate_racer_in_water(Object *obj, Object_Racer *racer, Vec3f *pos, s8 arg3, s32 updateRate, s32 arg5, f32 arg6) { + Matrix mtxF; f32 velocity; s32 angle; - s32 v1; - f32 delta; + s32 angleVel; + f32 updateRateF; - delta = updateRate; + updateRateF = updateRate; if (arg3 == 14) { velocity = racer->velocity; if (velocity < 0.0f) { @@ -921,74 +1651,81 @@ f32 func_800494E0(Object *obj1, Object_Racer *racer, f32 *pos, s8 arg3, s32 upda velocity = 0.0f; } } else { - obj1->segment.trans.x_position += pos[0] * delta * arg6; - obj1->segment.trans.z_position += pos[2] * delta * arg6; + obj->segment.trans.x_position += pos->x * updateRateF * arg6; + obj->segment.trans.z_position += pos->z * updateRateF * arg6; velocity = 1.0f; } - D_8011D510.y_rotation = -obj1->segment.trans.y_rotation; - D_8011D510.x_rotation = 0; - D_8011D510.z_rotation = 0; - D_8011D510.x_position = 0.0f; - D_8011D510.y_position = 0.0f; - D_8011D510.z_position = 0.0f; - D_8011D510.scale = 1.0f; - object_transform_to_matrix_2(mtx, &D_8011D510); - guMtxXFMF(mtx, pos[0], pos[1], pos[2], &pos[0], &pos[1], &pos[2]); - angle = -((s16) (u16)arctan2_f(pos[0], pos[1])) * velocity; + gCurrentRacerTransform.y_rotation = -obj->segment.trans.y_rotation; + gCurrentRacerTransform.x_rotation = 0; + gCurrentRacerTransform.z_rotation = 0; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix_2(mtxF, &gCurrentRacerTransform); + guMtxXFMF(mtxF, pos->x, pos->y, pos->z, &pos->x, &pos->y, &pos->z); + angle = -((s16) (u16)arctan2_f(pos->x, pos->y)) * velocity; angle = (u16) (angle - (arg5 << 6)) - (u16) racer->x_rotation_vel; angle = angle > 0x8000 ? angle - 0xffff : angle; angle = angle < -0x8000 ? angle + 0xffff : angle; racer->x_rotation_vel += (angle * updateRate) >> 4; - v1 = ((s16) (u16)arctan2_f(pos[2], pos[1]) * velocity); - v1 += -gCurrentStickY * 32; - v1 += 0x3C0; - angle = (u16)v1 - ((u16) obj1->segment.trans.x_rotation); + angleVel = ((s16) (u16)arctan2_f(pos->z, pos->y) * velocity); + angleVel += -gCurrentStickY * 32; + angleVel += 0x3C0; + angle = (u16)angleVel - ((u16) obj->segment.trans.x_rotation); angle = angle > 0x8000 ? angle - 0xffff : angle; angle = angle < -0x8000 ? angle + 0xffff : angle; - obj1->segment.trans.x_rotation += (angle * updateRate) >> 4; + obj->segment.trans.x_rotation += (angle * updateRate) >> 4; return velocity; } GLOBAL_ASM("asm/non_matchings/racer/func_80049794.s") -// Something Plane related. -void func_8004C0A0(s32 updateRate, Object *obj, Object_Racer *racer) { - s32 temp_v1; - s32 phi_v0; +/** + * When turning left and right in a plane, apply the tilting animation to the character. + * There's a few safeguards in place to ensure the animation frame is not out of bounds. +*/ +void apply_plane_tilt_anim(s32 updateRate, Object *obj, Object_Racer *racer) { + s32 animDiff; + s32 animAdd; if (racer->vehicleIDPrev != VEHICLE_CARPET) { //!@bug Typo. Should've been `== 0`, not `= 0`. if ((racer->unk1F2 = 0)) { return; // This never gets called because of the typo. } - phi_v0 = racer->steerAngle; - phi_v0 = 40 - (phi_v0 >> 1); - if (phi_v0 < 0) { - phi_v0 = 0; + animAdd = racer->steerAngle; + animAdd = 40 - (animAdd >> 1); + if (animAdd < 0) { + animAdd = 0; } - if (phi_v0 > 73) { - phi_v0 = 73; + if (animAdd > 73) { + animAdd = 73; } - temp_v1 = phi_v0 - obj->segment.animFrame; - phi_v0 = 0; - if (temp_v1 > 0) { - phi_v0 = updateRate * 3; - if (temp_v1 < phi_v0) { - phi_v0 = temp_v1; + animDiff = animAdd - obj->segment.animFrame; + animAdd = 0; + if (animDiff > 0) { + animAdd = updateRate * 3; + if (animDiff < animAdd) { + animAdd = animDiff; } } - if (temp_v1 < 0) { - phi_v0 = updateRate * -3; - if (phi_v0 < temp_v1) { - phi_v0 = temp_v1; + if (animDiff < 0) { + animAdd = updateRate * -3; + if (animAdd < animDiff) { + animAdd = animDiff; } } - obj->segment.animFrame += phi_v0; + obj->segment.animFrame += animAdd; //!@Delta } } -// Another attack handler by the looks of things. -void func_8004C140(Object *obj, Object_Racer *racer) { +/** + * Initialise some states when a racer is attacked or runs into something. + * While the majority of the respondent behaviour takes place elsewhere, the squish behaviour happens here. + * Planes do not have a spinning state, instead being in the same state when hit by a rocket. + */ +void racer_attack_handler_plane(Object *obj, Object_Racer *racer) { s8 bananas; s8 attackType; if (racer->playerIndex == PLAYER_COMPUTER) { @@ -997,7 +1734,7 @@ void func_8004C140(Object *obj, Object_Racer *racer) { bananas = racer->bananas; } attackType = racer->attackType; - if (attackType == 0 || racer->shieldTimer > 0) { + if (attackType == ATTACK_NONE || racer->shieldTimer > 0) { racer->attackType = ATTACK_NONE; return; } @@ -1036,7 +1773,6 @@ void func_8004C140(Object *obj, Object_Racer *racer) { } } - #ifdef NON_EQUIVALENT void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { s32 segmentIndex; @@ -1075,7 +1811,7 @@ void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { baseFloat1 = 42.0f; } if (((!(gCurrentRacerInput & 0x10)) || racer->unk1E2 < 3) && !racer->unk1F5) { - angle = (-racer->unk1A0 - (racer->unk196 & 0xFFFF)) + 0x8000; + angle = (-racer->steerVisualRotation - (racer->unk196 & 0xFFFF)) + 0x8000; if (angle > 0x8000) { angle -= 0xFFFF; } @@ -1106,8 +1842,8 @@ void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { } else { racer->camera_zoom = 0.0f; } - if (D_8011D586) { - racer->unk196 = 0x8000 - racer->unk1A0; + if (gDialogueCameraAngle) { + racer->unk196 = 0x8000 - racer->steerVisualRotation; } if (racer->unk1E0 == 2 || racer->unk1E0 == -2) { angle = 0; @@ -1210,7 +1946,7 @@ void update_camera_plane(f32 updateRate, Object* obj, Object_Racer* racer) { gCameraObject->trans.y_position -= yVel; gCameraObject->trans.z_position = zOffset + obj->segment.trans.z_position + (-coss_f(racer->unk196 + 0x4000) * 3.0f * racer->lateral_velocity); gCameraObject->trans.y_rotation = racer->unk196; - if (racer->unk1E0 || D_8011D586) { + if (racer->unk1E0 || gDialogueCameraAngle) { angle = -(u16) gCameraObject->trans.z_rotation; if (angle > 0x8000) { angle -= 0xFFFF; @@ -1249,8 +1985,8 @@ GLOBAL_ASM("asm/non_matchings/racer/func_8004CC20.s") * This happens in Walrus Cove and Darkmoon Caverns. * The camera's rotation follows the players exactly, in order to stay levelled. */ -void update_camera_loop(f32 updateRate, Object* obj, Object_Racer* racer) { - s32 delta; +void update_camera_loop(f32 updateRateF, Object *obj, Object_Racer *racer) { + s32 UpdateRate; UNUSED f32 pad; s32 segmentIndex; s32 angle; @@ -1261,12 +1997,12 @@ void update_camera_loop(f32 updateRate, Object* obj, Object_Racer* racer) { Matrix mtx; s32 angleDiff; - delta = (s32) updateRate; + UpdateRate = (s32) updateRateF; zoom = 120.0f; if (gRaceStartTimer > 60) { zoom += ((f32) (gRaceStartTimer - 60) * 4.0f); } - racer->unk196 = 0x8000 - racer->unk1A0; + racer->unk196 = 0x8000 - racer->steerVisualRotation; if (get_viewport_count() == 1) { zoom = 160.0f; } @@ -1278,14 +2014,14 @@ void update_camera_loop(f32 updateRate, Object* obj, Object_Racer* racer) { zoom -= 35.0f; } gCameraObject->unk1C += (zoom - gCameraObject->unk1C) * 0.125; - D_8011D510.y_rotation = -gCameraObject->trans.y_rotation + 0x8000; - D_8011D510.x_rotation = -gCameraObject->trans.x_rotation; - D_8011D510.z_rotation = 0; - D_8011D510.x_position = 0.0f; - D_8011D510.y_position = 0.0f; - D_8011D510.z_position = 0.0f; - D_8011D510.scale = 1.0f; - object_transform_to_matrix(mtx, &D_8011D510); + gCurrentRacerTransform.y_rotation = -gCameraObject->trans.y_rotation + 0x8000; + gCurrentRacerTransform.x_rotation = -gCameraObject->trans.x_rotation; + gCurrentRacerTransform.z_rotation = 0; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, 0.0f, 0.0f, gCameraObject->unk1C, &xVel, &yVel, &zVel); gCameraObject->trans.x_position = obj->segment.trans.x_position + xVel; gCameraObject->trans.y_position = obj->segment.trans.y_position + yVel; @@ -1297,11 +2033,11 @@ void update_camera_loop(f32 updateRate, Object* obj, Object_Racer* racer) { angleDiff = (u16) (-obj->segment.trans.z_rotation); angle = angleDiff - ((u16) gCameraObject->trans.z_rotation); WRAP(angle, -0x8000, 0x8000); - gCameraObject->trans.z_rotation += ((angle * delta) >> 4); + gCameraObject->trans.z_rotation += ((angle * UpdateRate) >> 4); angleDiff = -obj->segment.trans.x_rotation; angle = angleDiff - (u16) gCameraObject->trans.x_rotation; WRAP(angle, -0x8000, 0x8000); - gCameraObject->trans.x_rotation += ((angle * delta) >> 4); + gCameraObject->trans.x_rotation += ((angle * UpdateRate) >> 4); gCameraObject->trans.y_rotation = racer->unk196; segmentIndex = get_level_segment_index_from_position(gCameraObject->trans.x_position, gCameraObject->trans.y_position, gCameraObject->trans.z_position); if (segmentIndex != SEGMENT_NONE) { @@ -1374,11 +2110,11 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { } else { tempRacer->playerIndex = PLAYER_COMPUTER; } - tempRacer->unk1A0 = obj->segment.trans.y_rotation; + tempRacer->steerVisualRotation = obj->segment.trans.y_rotation; tempRacer->x_rotation_vel = obj->segment.trans.z_rotation; tempRacer->unkC4 = 0.5f; if (1) {} // Fakematch - tempRacer->unk196 = tempRacer->unk1A0; + tempRacer->unk196 = tempRacer->steerVisualRotation; tempRacer->unkD8.x = obj->segment.trans.x_position; tempRacer->unkD8.y = obj->segment.trans.y_position + 30.0f; tempRacer->unkD8.z = obj->segment.trans.z_position; @@ -1400,7 +2136,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { tempRacer->unk1E2 = 3; tempRacer->unk1AA = 1; tempRacer->unk1AE = 1; - tempRacer->unk1E7 = tempRacer->playerIndex * 5; + tempRacer->miscAnimCounter = tempRacer->playerIndex * 5; tempRacer->checkpoint_distance = 1.0f; tempRacer->unk1FD = 0; tempRacer->magnetSoundMask = NULL; @@ -1409,9 +2145,9 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { tempRacer->unk218 = 0; tempRacer->unk220 = 0; tempRacer->unk21C = 0; - if (tempRacer->playerIndex != -1 && !D_8011D582) { + if (tempRacer->playerIndex != PLAYER_COMPUTER && !D_8011D582) { set_object_stack_pos(player); - gCameraObject = (ObjectCamera *) func_80069CFC(); + gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); gCameraObject->trans.z_rotation = 0; gCameraObject->trans.x_rotation = 0x400; gCameraObject->trans.y_rotation = tempRacer->unk196; @@ -1425,7 +2161,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { } if (!D_8011D582) { D_8011D583 = 0; - D_8011D586 = 0; + gDialogueCameraAngle = 0; D_8011D584 = 0; } obj->interactObj->unk14 = 5; @@ -1434,7 +2170,7 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { obj->interactObj->unk12 = 0x14; tempRacer->unk1EE = 0; if (!D_8011D582) { - tempRacer->transparency = 0xFF; + tempRacer->transparency = 255; } D_8011D560 = 0; D_8011D544 = 300.0f; @@ -1443,7 +2179,9 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { D_8011D580 = 0; // This needs to be on one line to match. - for (i = 0; i < 4; i++) { D_8011D58C[i] = 0; } + for (i = 0; i < 4; i++) { \ + D_8011D58C[i] = 0; + } if (1) {} if (1) {} // Fakematch func_80043ECC(0, NULL, 0); D_8011D583 = i; @@ -1457,27 +2195,28 @@ void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer) { */ void update_player_racer(Object *obj, s32 updateRate) { s32 tempVar; - s32 temp_v0_17; + s32 checkpointCount; s32 context; Object *tempObj; - f32 delta; + f32 updateRateF; f32 waterHeight; Object_Racer *tempRacer; f32 xTemp; f32 yTemp; f32 zTemp; f32 lastCheckpointDist; - f32 temp_f12; + f32 playerIDF; LevelHeader *header; CheckpointNode *checkpointNode; - UNUSED s32 pad[2]; + s32 playerID; + f32 stretch; s32 i; struct LevelObjectEntryCommon newObject; gNumViewports = get_viewport_count() + 1; gCurrentSurfaceType = SURFACE_DEFAULT; gRaceStartTimer = func_8001139C(); - delta = updateRate; + updateRateF = updateRate; tempRacer = (Object_Racer *)obj->unk64; // Cap all of the velocities on the different axes. // Unfortunately, Rareware didn't appear to use a clamp macro here, which would've saved a lot of real estate. @@ -1522,7 +2261,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } // PAL moves 20% faster. if (osTvType == TV_TYPE_PAL) { - delta *= 1.2; + updateRateF *= 1.2; } tempRacer->unk1F6 -= updateRate; if (tempRacer->unk1F6 < 0) { @@ -1536,24 +2275,24 @@ void update_player_racer(Object *obj, s32 updateRate) { } header = get_current_level_header(); gCurrentCourseHeight = header->course_height; - tempRacer->throttleReleased = 0; + tempRacer->throttleReleased = FALSE; if (tempRacer->playerIndex == PLAYER_COMPUTER) { - func_8005A6F0(obj, tempRacer, updateRate, delta); // AI. + update_AI_racer(obj, tempRacer, updateRate, updateRateF); } else { // Print player 1's coordinates to the screen if the debug cheat is enabled. - if ((gRaceStartTimer == 0) && (tempRacer->playerIndex == PLAYER_ONE)) { + if (gRaceStartTimer == 0 && tempRacer->playerIndex == PLAYER_ONE) { if (get_filtered_cheats() & CHEAT_PRINT_COORDS) { - render_printf(D_800E6280, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); + render_printf(gRacerDebugCoords, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position); } } set_render_printf_background_colour(0, 0, 0, 128); if (func_8002341C()) { - D_8011D586 = 0; + gDialogueCameraAngle = 0; } context = get_render_context(); if (gRaceStartTimer == 0) { if (D_8011D544 > 0.0) { - D_8011D544 -= delta; + D_8011D544 -= updateRateF; } else { D_8011D544 = 0.0f; } @@ -1565,14 +2304,14 @@ void update_player_racer(Object *obj, s32 updateRate) { } else { tempRacer->unk18C = 0; } - gCurrentRacerMiscAssetPtr = (f32*) get_misc_asset(MISC_RACER_WEIGHT); + gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_WEIGHT); gCurrentRacerWeightStat = gCurrentRacerMiscAssetPtr[tempRacer->characterId] * 0.45; if (tempRacer->unk204 > 0) { gCurrentRacerWeightStat = -0.02f; } - gCurrentRacerMiscAssetPtr = (f32*) get_misc_asset(MISC_RACER_HANDLING); + gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_RACER_HANDLING); gCurrentRacerHandlingStat = gCurrentRacerMiscAssetPtr[tempRacer->characterId]; - gCurrentRacerMiscAssetPtr = (f32*) get_misc_asset(MISC_ASSET_UNK0B); + gCurrentRacerMiscAssetPtr = (f32 *) get_misc_asset(MISC_ASSET_UNK0B); D_8011D574 = gCurrentRacerMiscAssetPtr[tempRacer->characterId]; if (tempRacer->unk1FE == 3) { gCurrentRacerWeightStat *= (f32) tempRacer->unk1FF / 256; @@ -1584,11 +2323,11 @@ void update_player_racer(Object *obj, s32 updateRate) { } } if (tempRacer->unk1FE == 2) { - tempRacer->unk84 += ((sins_f((tempRacer->unk1FF << 8)) * 4.0f) - tempRacer->unk84) * 0.0625 * delta; - tempRacer->unk88 += ((coss_f((tempRacer->unk1FF << 8)) * 4.0f) - tempRacer->unk88) * 0.0625 * delta; + tempRacer->unk84 += ((sins_f((tempRacer->unk1FF << 8)) * 4.0f) - tempRacer->unk84) * 0.0625 * updateRateF; + tempRacer->unk88 += ((coss_f((tempRacer->unk1FF << 8)) * 4.0f) - tempRacer->unk88) * 0.0625 * updateRateF; } else { - tempRacer->unk84 -= tempRacer->unk84 * 0.0625 * delta; - tempRacer->unk88 -= tempRacer->unk88 * 0.0625 * delta; + tempRacer->unk84 -= tempRacer->unk84 * 0.0625 * updateRateF; + tempRacer->unk88 -= tempRacer->unk88 * 0.0625 * updateRateF; } gCurrentRacerMiscAssetPtr = (f32*) get_misc_asset(obj->segment.header->pad5B[1]); D_8011D568 = (f32 *) get_misc_asset(obj->segment.header->pad5B[2]); @@ -1606,14 +2345,14 @@ void update_player_racer(Object *obj, s32 updateRate) { } } set_object_stack_pos(tempRacer->playerIndex); - gCameraObject = (ObjectCamera *) func_80069CFC(); - tempRacer->unk1E7++; //!@delta + gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); + tempRacer->miscAnimCounter++; //!@Delta gCurrentPlayerIndex = tempRacer->playerIndex; - if ((tempRacer->raceFinished == TRUE) || (context == 1)) { + if (tempRacer->raceFinished == TRUE || context == DRAW_MENU) { tempRacer->unk1CA = 1; tempRacer->playerIndex = PLAYER_COMPUTER; tempRacer->unk1C9 = 0; - if (tempRacer->shieldTimer >= 6) { + if (tempRacer->shieldTimer > 5) { tempRacer->shieldTimer = 5; } } @@ -1637,13 +2376,13 @@ void update_player_racer(Object *obj, s32 updateRate) { racer_enter_door(tempRacer, updateRate); } } else { - func_80044170(obj, tempRacer, updateRate); + racer_AI_pathing_inputs(obj, tempRacer, updateRate); } //Set the value that decides whether to get an empowered boost. - if ((gCurrentRacerInput & A_BUTTON) == 0) { - tempRacer->throttleReleased = 1; + if (!(gCurrentRacerInput & A_BUTTON)) { + tempRacer->throttleReleased = TRUE; } - if (check_if_showing_cutscene_camera() || gRaceStartTimer == 100 || tempRacer->unk1F1 || D_8011D584 || tempRacer->unk148 || tempRacer->unk204 > 0) { + if (check_if_showing_cutscene_camera() || gRaceStartTimer == 100 || tempRacer->unk1F1 || D_8011D584 || tempRacer->approachTarget || tempRacer->unk204 > 0) { gCurrentStickX = 0; gCurrentStickY = 0; gCurrentRacerInput = 0; @@ -1653,12 +2392,12 @@ void update_player_racer(Object *obj, s32 updateRate) { } if (tempRacer->unk204 > 0) { tempRacer->unk204 -= updateRate; - tempRacer->velocity *= 0.9f; - obj->segment.x_velocity *= 0.87f; + tempRacer->velocity *= 0.9f; //!@Delta + obj->segment.x_velocity *= 0.87f; //!@Delta if (obj->segment.y_velocity > 2.0f) { obj->segment.y_velocity = 2.0f; } - obj->segment.z_velocity *= 0.87f; + obj->segment.z_velocity *= 0.87f; //!@Delta } if (tempRacer->unk206 > 0) { tempRacer->unk18A = tempRacer->unk206; @@ -1695,7 +2434,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } // Assign a camera to human players. if (gCurrentPlayerIndex != PLAYER_COMPUTER) { - gCameraObject = (ObjectCamera *) func_80069CFC(); + gCameraObject = (ObjectCamera *) get_active_camera_segment_no_cutscenes(); } D_8011D5AE = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &D_8011D5B0); if (D_8011D5AE) { @@ -1710,7 +2449,7 @@ void update_player_racer(Object *obj, s32 updateRate) { if (tempRacer->vehicleID != VEHICLE_HOVERCRAFT) { waterHeight = -10000.0f; // So I assume this func exists to find the water height. - D_8011D504 = func_8002AD08(obj->segment.trans.y_position, &waterHeight, D_8011D4F8); + D_8011D504 = func_8002AD08(obj->segment.trans.y_position, &waterHeight, &gCurrentRacerWaterPos); if (D_8011D504) { if (obj->segment.trans.y_position - 5.0f < waterHeight) { tempRacer->unk1E5 = 5; @@ -1733,35 +2472,30 @@ void update_player_racer(Object *obj, s32 updateRate) { } func_8002ACC8(0); switch (tempRacer->vehicleID) { - case VEHICLE_CAR: func_8004F7F4(updateRate, delta, obj, tempRacer); break; - case VEHICLE_LOOPDELOOP: func_8004CC20(updateRate, delta, obj, tempRacer); break; - case VEHICLE_HOVERCRAFT: func_80046524(updateRate, delta, obj, tempRacer); break; - case VEHICLE_PLANE: func_80049794(updateRate, delta, obj, tempRacer); break; + case VEHICLE_CAR: func_8004F7F4(updateRate, updateRateF, obj, tempRacer); break; + case VEHICLE_LOOPDELOOP: func_8004CC20(updateRate, updateRateF, obj, tempRacer); break; + case VEHICLE_HOVERCRAFT: func_80046524(updateRate, updateRateF, obj, tempRacer); break; + case VEHICLE_PLANE: func_80049794(updateRate, updateRateF, obj, tempRacer); break; case VEHICLE_FLYING_CAR: /* fall through */ - case VEHICLE_CARPET: update_carpet(updateRate, delta, obj, tempRacer); break; - case VEHICLE_TRICKY: update_tricky(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; - case VEHICLE_BLUEY: update_bluey(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; + case VEHICLE_CARPET: update_carpet(updateRate, updateRateF, obj, tempRacer); break; + case VEHICLE_TRICKY: update_tricky(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; + case VEHICLE_BLUEY: update_bluey(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; case VEHICLE_SMOKEY: /* fall through */ - case VEHICLE_PTERODACTYL: update_smokey(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentStickX, &gRaceStartTimer); break; - case VEHICLE_BUBBLER: update_bubbler(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; - case VEHICLE_WIZPIG: update_wizpig(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; - case VEHICLE_ROCKET: update_rocket(updateRate, delta, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; + case VEHICLE_PTERODACTYL: update_smokey(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentStickX, &gRaceStartTimer); break; + case VEHICLE_BUBBLER: update_bubbler(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; + case VEHICLE_WIZPIG: update_wizpig(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; + case VEHICLE_ROCKET: update_rocket(updateRate, updateRateF, obj, tempRacer, &gCurrentRacerInput, &gCurrentButtonsPressed, &gRaceStartTimer); break; } if (tempRacer->magnetTimer == 0) { if (tempRacer->magnetSoundMask) { func_8000488C(tempRacer->magnetSoundMask); - tempRacer->magnetSoundMask = 0; + tempRacer->magnetSoundMask = NULL; } } - temp_v0_17 = header->playerIndex; - if (temp_v0_17) { - temp_f12 = -(f32) temp_v0_17; - if (tempRacer->velocity > temp_v0_17) { - tempRacer->velocity = temp_v0_17; - } - if (tempRacer->velocity < temp_f12) { - tempRacer->velocity = temp_f12; - } + playerID = header->playerIndex; + if (playerID) { + playerIDF = -(f32) playerID; + CLAMP(tempRacer->velocity, playerIDF, playerID); } if (context != 1 || func_8000E148()) { func_800050D0(obj, gCurrentButtonsPressed, gCurrentRacerInput, updateRate); @@ -1782,9 +2516,9 @@ void update_player_racer(Object *obj, s32 updateRate) { if (tempRacer->playerIndex == PLAYER_COMPUTER && checkpointNode->unk36[tempRacer->unk1CA] == 2) { tempRacer->unk1C8 = 1; } - temp_v0_17 = get_checkpoint_count(); + checkpointCount = get_checkpoint_count(); tempRacer->checkpoint++; - if (tempRacer->checkpoint >= temp_v0_17) { + if (tempRacer->checkpoint >= checkpointCount) { tempRacer->checkpoint = 0; if (tempRacer->courseCheckpoint > 0) { if (tempRacer->lap < 120) { @@ -1825,7 +2559,7 @@ void update_player_racer(Object *obj, s32 updateRate) { } } } - if (tempRacer->courseCheckpoint < (header->laps + 3) * temp_v0_17) { + if (tempRacer->courseCheckpoint < (header->laps + 3) * checkpointCount) { tempRacer->courseCheckpoint++; } tempRacer->unk1A8 = 10000; @@ -1854,32 +2588,27 @@ void update_player_racer(Object *obj, s32 updateRate) { drop_bananas(obj, tempRacer, tempRacer->unk188); } tempRacer->playerIndex = gCurrentPlayerIndex; - update_player_camera(obj, tempRacer, delta); + update_player_camera(obj, tempRacer, updateRateF); D_8011D583 = 0; - if (tempRacer->unk148) { - tempRacer->unk148 = NULL; + if (tempRacer->approachTarget) { + tempRacer->approachTarget = NULL; tempRacer->velocity = 0.0f; tempRacer->lateral_velocity = 0.0f; } if (tempRacer->stretch_height <= tempRacer->stretch_height_cap) { - temp_f12 = 0.02f; + stretch = 0.02f; } else { - temp_f12 = -0.02f; + stretch = -0.02f; } - tempRacer->stretch_height += (((tempRacer->stretch_height_cap - tempRacer->stretch_height) * 0.125) + temp_f12) * delta; - if ((temp_f12 < 0.0f && tempRacer->stretch_height <= tempRacer->stretch_height_cap) || - (temp_f12 > 0.0f && tempRacer->stretch_height >= tempRacer->stretch_height_cap)) { + tempRacer->stretch_height += (((tempRacer->stretch_height_cap - tempRacer->stretch_height) * 0.125) + stretch) * updateRateF; + if ((stretch < 0.0f && tempRacer->stretch_height <= tempRacer->stretch_height_cap) || + (stretch > 0.0f && tempRacer->stretch_height >= tempRacer->stretch_height_cap)) { tempRacer->stretch_height = tempRacer->stretch_height_cap; tempRacer->stretch_height_cap = 1.0f; } tempVar = ((tempRacer->headAngleTarget - tempRacer->headAngle) * updateRate) >> 3; - if (tempVar > 0x800) { - tempVar = 0x800; - } - if (tempVar < -0x800) { - tempVar = -0x800; - } + CLAMP(tempVar, -0x800, 0x800); if (gAntiPiracyHeadroll) { tempRacer->headAngle += gAntiPiracyHeadroll; } else { @@ -1974,7 +2703,7 @@ void set_racer_tail_lights(Object_Racer *racer) { s32 lightTimer; racer->lightFlags &= ~RACER_LIGHT_BRAKE; - if ((gCurrentRacerInput & B_BUTTON)) { + if (gCurrentRacerInput & B_BUTTON) { racer->lightFlags |= RACER_LIGHT_BRAKE; } @@ -1996,25 +2725,29 @@ void set_racer_tail_lights(Object_Racer *racer) { GLOBAL_ASM("asm/non_matchings/racer/func_8004F7F4.s") -void func_80050754(Object *obj, Object_Racer *racer, f32 divisor) { - f32 xDiff; - f32 yDiff; - f32 zDiff; +/** + * At this point, control is taken away from the player. + * Instead, they'll automatically move towards a specific object. +*/ +void racer_approach_object(Object *obj, Object_Racer *racer, f32 divisor) { + f32 diffX; + f32 diffY; + f32 diffZ; obj->segment.unk38.byte.unk3B = 0; obj->segment.animFrame = 40; - xDiff = racer->unk148->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = racer->unk148->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = racer->unk148->segment.trans.z_position - obj->segment.trans.z_position; - func_80011570(obj, xDiff, yDiff, zDiff); - obj->segment.trans.y_rotation = racer->unk148->segment.trans.y_rotation; - obj->segment.trans.x_rotation = racer->unk148->segment.trans.x_rotation; - obj->segment.trans.z_rotation = racer->unk148->segment.trans.z_rotation; + diffX = racer->approachTarget->segment.trans.x_position - obj->segment.trans.x_position; + diffY = racer->approachTarget->segment.trans.y_position - obj->segment.trans.y_position; + diffZ = racer->approachTarget->segment.trans.z_position - obj->segment.trans.z_position; + move_object(obj, diffX, diffY, diffZ); + obj->segment.trans.y_rotation = racer->approachTarget->segment.trans.y_rotation; + obj->segment.trans.x_rotation = racer->approachTarget->segment.trans.x_rotation; + obj->segment.trans.z_rotation = racer->approachTarget->segment.trans.z_rotation; racer->x_rotation_vel = obj->segment.trans.z_rotation; - racer->unk1A0 = obj->segment.trans.y_rotation; - obj->segment.x_velocity = xDiff / divisor; - obj->segment.y_velocity = yDiff / divisor; - obj->segment.z_velocity = zDiff / divisor; + racer->steerVisualRotation = obj->segment.trans.y_rotation; + obj->segment.x_velocity = diffX / divisor; + obj->segment.y_velocity = diffY / divisor; + obj->segment.z_velocity = diffZ / divisor; racer->velocity = 0.0f; racer->unk1F2 = 0; racer->lateral_velocity = 0.0f; @@ -2116,10 +2849,10 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->unk84 = 0.0f; racer->unk88 = 0.0f; // Apply bobbing if there's no dialogue camera rotation active. - if (D_8011D586 == 0) { - scale = (f32) D_800DCDB0[0][racer->unk1E7 & 0x1F] * 0.024999999999999998; - racer->carBobX = -racer->unkA0 * scale; - racer->carBobY = -racer->unkA4 * scale; + if (gDialogueCameraAngle == 0) { + scale = (f32) D_800DCDB0[0][racer->miscAnimCounter & 0x1F] * 0.024999999999999998; + racer->carBobX = -racer->roll * scale; + racer->carBobY = -racer->yaw * scale; racer->carBobZ = -racer->pitch * scale; if (obj->unk60 != NULL) { for (i = 0; i < ((unk_Object_60 *) obj->unk60)->count; i++) { @@ -2170,7 +2903,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR sp58 = 1; } } - if ((racer->unk1E7 & 7) < 2) { + if ((racer->miscAnimCounter & 7) < 2) { racer->unk1D1 = get_random_number_from_range(-25, 25); } gCurrentStickX += racer->unk1D1; @@ -2205,7 +2938,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->y_rotation_vel = -0x8000; } if (racer->drifting == 0) { - racer->unk1A0 += racer->y_rotation_vel; + racer->steerVisualRotation += racer->y_rotation_vel; racer->unk19E = racer->y_rotation_vel; racer->y_rotation_vel = 0; racer->velocity = -racer->velocity; @@ -2308,7 +3041,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR SteeringVel = -steerAngle * velocityS; } // Set final turn velocity by taking the steering velocity and multiplying it by the handling stat of the character. - racer->unk1A0 -= (s32) (((SteeringVel * updateRate) >> 1) * gCurrentRacerHandlingStat); + racer->steerVisualRotation -= (s32) (((SteeringVel * updateRate) >> 1) * gCurrentRacerHandlingStat); // Now steer the car. handle_car_steering(racer); // Set base grip level to 0. @@ -2317,13 +3050,13 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR // If reversing, flip the steering if (racer->velocity < -4.0) { if (gCurrentCarSteerVel > 0x1400 || (racer->drift_direction != 0 && gCurrentCarSteerVel > 0)) { - SteeringVel = racer->unk1E7 & 7; + SteeringVel = racer->miscAnimCounter & 7; if (SteeringVel >= 4) { SteeringVel = 7 - SteeringVel; } gCurrentCarSteerVel += SteeringVel * 0x190; } else if (gCurrentCarSteerVel < -0x1400 || (racer->drift_direction != 0 && gCurrentCarSteerVel < 0)) { - SteeringVel = racer->unk1E7 & 7; + SteeringVel = racer->miscAnimCounter & 7; if (SteeringVel >= 4) { SteeringVel = 7 - SteeringVel; } @@ -2343,7 +3076,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR traction += gSurfaceTractionTable[racer->wheel_surfaces[i]]; } surfaceTraction += D_800DCBE8[racer->wheel_surfaces[i]]; - sp68 += D_800DCC34[racer->wheel_surfaces[i]]; + sp68 += gSurfaceBobbingTable[racer->wheel_surfaces[i]]; if (surfaceType < racer->wheel_surfaces[i]) { surfaceType = racer->wheel_surfaces[i]; } @@ -2434,23 +3167,23 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (get_viewport_count() < THREE_PLAYERS) { if ((sp60 && racer->velocity < -2.0) || sp58 || racer->unk1FB != 0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->unk74 |= D_800DCCF4[racer->wheel_surfaces[2]]; + obj->unk74 |= gSurfaceFlagTable[racer->wheel_surfaces[2]]; } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->unk74 |= D_800DCCF4[racer->wheel_surfaces[3]] * 2; + obj->unk74 |= gSurfaceFlagTable[racer->wheel_surfaces[3]] * 2; } } if (racer->velocity < -2.0) { if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->unk74 |= D_800DCD40[racer->wheel_surfaces[2]]; + obj->unk74 |= gSurfaceFlagTable4P[racer->wheel_surfaces[2]]; } if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->unk74 |= D_800DCD40[racer->wheel_surfaces[3]] * 2; + obj->unk74 |= gSurfaceFlagTable4P[racer->wheel_surfaces[3]] * 2; } } } // Play a sound on grass and sand when landing on it - surfaceType = D_800DCC80[surfaceType]; + surfaceType = gSurfaceSoundTable[surfaceType]; soundID = surfaceType; if (racer->unk18 == NULL && soundID != SOUND_NONE && racer->velocity < -2.0) { play_sound_global(soundID, &racer->unk18); @@ -2460,9 +3193,9 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } // Apply a bobbing effect when on grass and sand. if (racer->velocity < -2.0 && sp68 >= 4) { - scale = (f32) (racer->unk1E7 & 1) * 0.5; - racer->carBobX -= racer->unkA0 * scale; - racer->carBobY -= racer->unkA4 * scale; + scale = (f32) (racer->miscAnimCounter & 1) * 0.5; + racer->carBobX -= racer->roll * scale; + racer->carBobY -= racer->yaw * scale; racer->carBobZ -= racer->pitch * scale; } tempVel = racer->velocity; @@ -2524,7 +3257,7 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } surfaceTraction = gCurrentRacerWeightStat; obj->segment.y_velocity -= surfaceTraction * updateRateF; - if (D_8011D586 != 0) { + if (gDialogueCameraAngle != 0) { surfaceTraction = 0.0f; } if (racer->brake < 0.9 && racer->vehicleIDPrev < 5 && gRaceStartTimer == 0) { @@ -2602,7 +3335,7 @@ void handle_racer_head_turning(Object *obj, Object_Racer *racer, UNUSED s32 upda } } if (foundObj == FALSE) { - if ((racer->unk1E7 & 0x1F) < 2) { + if ((racer->miscAnimCounter & 0x1F) < 2) { intendedAngle = racer->velocity * 1280.0f; if (intendedAngle < 0) { @@ -2637,28 +3370,29 @@ void slowly_reset_head_angle(Object_Racer *racer) { */ s32 turn_head_towards_object(Object *obj, Object_Racer *racer, Object *targetObj, f32 distance) { s32 intendedAngle; - f32 xDiff; - f32 zDiff; - s32 ret = FALSE; + f32 diffX; + f32 diffZ; + s32 ret; - xDiff = targetObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = targetObj->segment.trans.z_position - obj->segment.trans.z_position; - if ((xDiff * xDiff) + (zDiff * zDiff) < distance) { - intendedAngle = (arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + ret = FALSE; + diffX = targetObj->segment.trans.x_position - obj->segment.trans.x_position; + diffZ = targetObj->segment.trans.z_position - obj->segment.trans.z_position; + if ((diffX * diffX) + (diffZ * diffZ) < distance) { + intendedAngle = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; WRAP(intendedAngle, -0x8000, 0x8000); CLAMP(intendedAngle, -0x3000, 0x3000); racer->headAngleTarget = intendedAngle; - if ((racer->unk1E7 & 0x3F) < 0x1F) { + if ((racer->miscAnimCounter & 0x3F) < 0x1F) { racer->headAngleTarget = 0; } racer = (struct Object_Racer *) targetObj->unk64; - intendedAngle = arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF); + intendedAngle = arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF); WRAP(intendedAngle, -0x8000, 0x8000); CLAMP(intendedAngle, -0x3000, 0x3000); racer->headAngleTarget = intendedAngle; if (ret) {} // Fakematch ret = TRUE; - if ((racer->unk1E7 & 0x1F) < 0xA) { + if ((racer->miscAnimCounter & 0x1F) < 0xA) { racer->headAngleTarget = 0; } } @@ -2703,7 +3437,7 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { } switch (racer->unk1F2) { case 0: // Sliding, creating tyre marks - angleVel = (s32) (((-racer->y_rotation_vel) >> 8) / gCurrentRacerHandlingStat); + angleVel = (s32) ((-racer->y_rotation_vel >> 8) / gCurrentRacerHandlingStat); angleVel = 40 - angleVel; if (angleVel < 0) { angleVel = 0; @@ -2739,7 +3473,7 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { case 3: // Boost actionStatus = 2; if (racer->unk1F3 & 4) { - actionStatus = 6; + actionStatus = 4 | 2; } func_80052988(obj, racer, 2, 0, 32, 4, actionStatus, updateRate); racer->unk1F3 &= 0xFFFB; @@ -2751,14 +3485,14 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { case 5: // Horn actionStatus = 2; if (gCurrentRacerInput & Z_TRIG) { - actionStatus = 6; + actionStatus = 4 | 2; } func_80052988(obj, racer, 4, 0, 48, 4, actionStatus, updateRate); break; case 6: actionStatus = 3; if (racer->velocity > 0.0 && gCurrentRacerInput & B_BUTTON) { - actionStatus = 7; // Reverse + actionStatus = 4 | 2 | 1; // Reverse } func_80052988(obj, racer, 1, 0, 80, 3, actionStatus, updateRate); break; @@ -2771,22 +3505,23 @@ void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate) { } } -void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 duration, s32 arg5, s32 arg6, s32 arg7) { +// Anims related to the car I think +void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 duration, s32 arg5, s32 flags, s32 arg7) { arg5 *= arg7; - if ((gCurrentPlayerIndex == -1) && (action >= 3)) { + if (gCurrentPlayerIndex == PLAYER_COMPUTER && action >= 3) { obj->segment.unk38.byte.unk3B = 0; racer->unk1F2 = 0; } else if (obj->segment.unk38.byte.unk3B == 0) { - if (arg6 & 1) { - if (obj->segment.animFrame >= 41) { - obj->segment.animFrame -= arg7 * 4; - if (obj->segment.animFrame < 41) { + if (flags & 1) { + if (obj->segment.animFrame > 40) { + obj->segment.animFrame -= arg7 * 4; //!@Delta + if (obj->segment.animFrame <= 40) { obj->segment.unk38.byte.unk3B = action; obj->segment.animFrame = arg3; } } else { - obj->segment.animFrame += arg7 * 4; + obj->segment.animFrame += arg7 * 4; //!@Delta if (obj->segment.animFrame >= 40) { obj->segment.unk38.byte.unk3B = action; obj->segment.animFrame = arg3; @@ -2798,9 +3533,9 @@ void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 d racer->unk1F3 &= ~0x80; } } else if (obj->segment.unk38.byte.unk3B == action) { - if (arg6 & 2) { + if (flags & 2) { if (racer->unk1F3 & 0x80) { - obj->segment.animFrame -= arg5; + obj->segment.animFrame -= arg5; //!@Delta if (obj->segment.animFrame <= 0) { obj->segment.unk38.byte.unk3B = 0; racer->unk1F2 = 0; @@ -2808,16 +3543,16 @@ void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 d racer->unk1F3 = 0; } } else { - obj->segment.animFrame += arg5; + obj->segment.animFrame += arg5; //!@Delta if (obj->segment.animFrame >= duration) { obj->segment.animFrame = duration - 1; - if (!(arg6 & 4)) { + if (!(flags & 4)) { racer->unk1F3 |= 0x80; } } } } else { - obj->segment.animFrame += arg5; + obj->segment.animFrame += arg5; //!@Delta if (obj->segment.animFrame >= duration) { obj->segment.unk38.byte.unk3B = 0; racer->unk1F2 = 0; @@ -2835,32 +3570,31 @@ void func_80052988(Object *obj, Object_Racer *racer, s32 action, s32 arg3, s32 d * If the spinout timer is above zero, remove steering control and have them rotate until * the timer runs out. */ -void racer_spinout_car(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF) { +void racer_spinout_car(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { s32 angleVel; - racer->velocity *= 0.97; //@Delta: Reduces 3% of speed per frame, not accounting for game speed. + racer->velocity *= 0.97; //!@Delta: Reduces 3% of speed per frame, not accounting for game speed. racer->lateral_velocity = 0.0f; if (racer->raceFinished == FALSE) { func_80072348(racer->playerIndex, 0); } angleVel = racer->y_rotation_vel; - if (gCurrentPlayerIndex >= 0) { - if (gNumViewports < 3) { + if (gCurrentPlayerIndex > PLAYER_COMPUTER) { + if (gNumViewports < VIEWPORTS_COUNT_4_PLAYERS) { obj->unk74 |= 0x4FC00; - goto skip; - } - if (racer->wheel_surfaces[2] < SURFACE_NONE) { - obj->unk74 |= 1 << (racer->wheel_surfaces[2] * 2); - } - if (racer->wheel_surfaces[3] < SURFACE_NONE) { - obj->unk74 |= 2 << (racer->wheel_surfaces[3] * 2); + } else { + if (racer->wheel_surfaces[2] < SURFACE_NONE) { + obj->unk74 |= 1 << (racer->wheel_surfaces[2] * 2); + } + if (racer->wheel_surfaces[3] < SURFACE_NONE) { + obj->unk74 |= 2 << (racer->wheel_surfaces[3] * 2); + } } } - skip: if (racer->spinout_timer > 0) { racer->y_rotation_vel += updateRate * 0x500; if (racer->y_rotation_vel > 0 && angleVel < 0) { - racer->spinout_timer--; //@Delta + racer->spinout_timer--; //!@Delta if (gCurrentStickX > 50 && racer->spinout_timer == 1) { racer->spinout_timer = 0; } @@ -2868,7 +3602,7 @@ void racer_spinout_car(Object* obj, Object_Racer* racer, s32 updateRate, f32 upd } else if (racer->spinout_timer < 0) { racer->y_rotation_vel -= updateRate * 0x500; if (racer->y_rotation_vel < 0 && angleVel > 0) { - racer->spinout_timer++; //@Delta + racer->spinout_timer++; //!@Delta if (gCurrentStickX < -50 && racer->spinout_timer == -1) { racer->spinout_timer = 0; } @@ -2880,15 +3614,18 @@ void racer_spinout_car(Object* obj, Object_Racer* racer, s32 updateRate, f32 upd racer->steerAngle = 0; } -void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF) { +/** + * Gets, sets and works with car velocity while either airborne or in water. + * It also handles turn velocity, too, as well as vertical velocity. + */ +void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { s32 steerAngle; s32 yStick; s32 angle; - s8 sp33; - f32 vel; - UNUSED s32 temp; + s8 canSteer; + f32 weight; - sp33 = 0; + canSteer = FALSE; if (racer->unk1FE == 1 && racer->playerIndex == PLAYER_COMPUTER) { gCurrentStickY = 60; } @@ -2898,15 +3635,10 @@ void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR } else { steerAngle = gCurrentStickX; } - racer->unk1A0 -= (u16) ((steerAngle * 6 * updateRate) >> 1); + racer->steerVisualRotation -= (u16) ((steerAngle * 6 * updateRate) >> 1); angle = -(u16) racer->x_rotation_vel; - if (angle > 0x8000) { - angle -= 0xFFFF; - } - if (angle < -0x8000) { - angle += 0xFFFF; - } - racer->x_rotation_vel += (angle >> 3); + WRAP(angle, -0x8000, 0x8000); + racer->x_rotation_vel += (angle >> 3); //!@Delta } if (racer->unk18) { func_8000488C((void *) racer->unk18); @@ -2929,18 +3661,18 @@ void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR } racer->unk1E8 = racer->steerAngle; if (gCurrentRacerInput & A_BUTTON) { - racer->velocity -= 0.5; + racer->velocity -= 0.5; //!@Delta } if (gCurrentRacerInput & B_BUTTON && gCurrentStickY < -25) { - racer->velocity += 0.5; + racer->velocity += 0.5; //!@Delta } - sp33 = 1; - racer->lateral_velocity *= 0.87; - racer->velocity *= 0.87; - obj->segment.y_velocity *= 0.9; - func_800494E0(obj, racer, D_8011D4F8, D_8011D504, updateRate, gCurrentStickX, 6.0f); + canSteer = TRUE; + racer->lateral_velocity *= 0.87; //!@Delta + racer->velocity *= 0.87; //!@Delta + obj->segment.y_velocity *= 0.9; //!@Delta + rotate_racer_in_water(obj, racer, &gCurrentRacerWaterPos, D_8011D504, updateRate, gCurrentStickX, 6.0f); } - if (racer->playerIndex == -1) { + if (racer->playerIndex == PLAYER_COMPUTER) { racer->unk1E8 = racer->steerAngle; } if (racer->boostTimer > 0) { @@ -2953,36 +3685,36 @@ void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR angle = -racer->steerAngle; angle *= 6; } - racer->unk1A0 -= angle & 0xFFFF; + racer->steerVisualRotation -= angle & 0xFFFF; gCurrentCarSteerVel = racer->unk110; if (racer->boostTimer) { if (racer->velocity > -20.0) { - racer->velocity -= 1.6; + racer->velocity -= 1.6; //!@Delta } } yStick = gCurrentStickY; - if ((yStick < 50) && (yStick > (-50))) { + if (yStick < 50 && yStick > -50) { yStick = 0; } obj->segment.y_velocity -= (obj->segment.y_velocity * 0.025) * updateRateF; - vel = gCurrentRacerWeightStat; + weight = gCurrentRacerWeightStat; if (racer->unk1F1 || racer->unk1F0) { - vel = 0.45f; + weight = 0.45f; racer->y_rotation_offset += 0x500 * updateRate; racer->x_rotation_offset += 0x600 * updateRate; } if (racer->unk1FE == 1 || racer->unk1FE == 3) { - racer->lateral_velocity *= 0.97; - racer->velocity *= 0.97; + racer->lateral_velocity *= 0.97; //!@Delta + racer->velocity *= 0.97; //!@Delta if (yStick > 50) { - racer->velocity -= 0.2; + racer->velocity -= 0.2; //!@Delta } if (yStick < -50) { - racer->velocity += 0.2; + racer->velocity += 0.2; //!@Delta } - sp33 = 1; + canSteer = TRUE; } - if (sp33) { + if (canSteer) { obj->unk74 = 0; racer->drift_direction = 0; racer->unk10C -= (racer->unk10C * updateRate) >> 4; @@ -2990,14 +3722,14 @@ void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR handle_car_steering(racer); } else { if (yStick > 50) { - vel *= 1.33; + weight *= 1.33; } if (yStick < -50) { - vel *= 0.53; + weight *= 0.53; } } if (racer->boostTimer) { - vel *= 0.5; + weight *= 0.5; } yStick = -yStick; yStick *= 64; @@ -3006,7 +3738,7 @@ void func_80052D7C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR angle = angle > 0x8000 ? angle - 0xFFFF : angle; angle = angle < -0x8000 ? angle + 0xFFFF : angle; obj->segment.trans.x_rotation += (angle >> 3); - obj->segment.y_velocity -= vel * updateRateF; + obj->segment.y_velocity -= weight * updateRateF; if (racer->buoyancy == 0.0) { steerAngle = -obj->segment.y_velocity * 20.0; if (steerAngle < 50) { @@ -3052,19 +3784,19 @@ void handle_car_steering(Object_Racer *racer) { } } -void func_800535C4(unk800535C4 *arg0, unk800535C4_2 *arg1) { +void func_800535C4(Object *obj, Object_Racer *racer) { Matrix mf; - D_8011D510.y_rotation = -arg1->unk1A0; - D_8011D510.x_rotation = -arg0->unk2; - D_8011D510.z_rotation = -arg1->unk1A4; - D_8011D510.x_position = 0; - D_8011D510.y_position = 0; - D_8011D510.z_position = 0; - D_8011D510.scale = 1; - object_transform_to_matrix_2(mf, &D_8011D510); + gCurrentRacerTransform.y_rotation = -racer->steerVisualRotation; + gCurrentRacerTransform.x_rotation = -obj->segment.trans.x_rotation; + gCurrentRacerTransform.z_rotation = -racer->x_rotation_vel; + gCurrentRacerTransform.x_position = 0; + gCurrentRacerTransform.y_position = 0; + gCurrentRacerTransform.z_position = 0; + gCurrentRacerTransform.scale = 1; + object_transform_to_matrix_2(mf, &gCurrentRacerTransform); - guMtxXFMF(mf, 0.0f, -1.0f, 0.0f, &arg1->ox, &arg1->oy, &arg1->oz); + guMtxXFMF(mf, 0.0f, -1.0f, 0.0f, &racer->roll, &racer->yaw, &racer->pitch); } /** @@ -3072,7 +3804,7 @@ void func_800535C4(unk800535C4 *arg0, unk800535C4_2 *arg1) { */ void handle_car_velocity_control(Object_Racer *racer) { if (racer->throttle > 0.0) { - racer->throttle -= 0.1; + racer->throttle -= 0.1; //!@Delta } if (gCurrentRacerInput & A_BUTTON) { @@ -3081,12 +3813,12 @@ void handle_car_velocity_control(Object_Racer *racer) { if (gCurrentRacerInput & B_BUTTON) { if (racer->brake < 1.0) { - racer->brake += 0.2; + racer->brake += 0.2; //!@Delta } } else { //! @bug Will cause a negative brake value resulting in higher velocity if (racer->brake > 0.05) { - racer->brake -= 0.1; + racer->brake -= 0.1; //!@Delta } } } @@ -3098,7 +3830,7 @@ GLOBAL_ASM("asm/non_matchings/racer/func_80053750.s") * While the majority of the respondent behaviour takes place elsewhere, the squish behaviour * happens here. */ -void racer_attack_handler(Object* obj, Object_Racer* racer, s32 updateRate) { +void racer_attack_handler_car(Object *obj, Object_Racer *racer, s32 updateRate) { s8 bananas; if (racer->playerIndex == PLAYER_COMPUTER) { @@ -3110,7 +3842,7 @@ void racer_attack_handler(Object* obj, Object_Racer* racer, s32 updateRate) { racer->squish_timer -= updateRate; racer->throttle = 0.0f; racer->stretch_height_cap = 0.1f; - if (racer->squish_timer <= 0 && racer->playerIndex >= 0) { + if (racer->squish_timer <= 0 && racer->playerIndex > PLAYER_COMPUTER) { racer_play_sound(obj, SOUND_PLOP2); } } else { @@ -3119,7 +3851,7 @@ void racer_attack_handler(Object* obj, Object_Racer* racer, s32 updateRate) { if (racer->attackType == 0 || racer->shieldTimer > 0) { racer->attackType = ATTACK_NONE; } else { - if ((racer->squish_timer == 0) || racer->attackType != ATTACK_SQUISHED) { + if (racer->squish_timer == 0 || racer->attackType != ATTACK_SQUISHED) { if (racer->attackType != ATTACK_SPIN && racer->attackType != ATTACK_SQUISHED) { drop_bananas(obj, racer, 2); } @@ -3149,7 +3881,7 @@ void racer_attack_handler(Object* obj, Object_Racer* racer, s32 updateRate) { break; // Crushed by something big, like a snowball. case ATTACK_SQUISHED: - racer->squish_timer = 0x3C; + racer->squish_timer = 60; break; // Running into a bubble trap. case ATTACK_BUBBLE: @@ -3170,7 +3902,12 @@ void racer_attack_handler(Object* obj, Object_Racer* racer, s32 updateRate) { } } -void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { +/** + * Only ran when onscreen or nearby, this function handles more authentic, but computationally expensive looking + * behaviour for AI controlled racers. + * This function also calls pathing, using splines, to know where to go. +*/ +void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { f32 tempVel; f32 xVel; f32 zVel; @@ -3182,7 +3919,7 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR Matrix mtx; LevelHeader *header; s32 angle; - s32 tempAngle; + s32 steerVel; xTemp = obj->segment.trans.x_position; yTemp = obj->segment.trans.y_position; @@ -3193,13 +3930,13 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR handle_car_velocity_control(racer); func_800575EC(obj, racer); handle_racer_items(obj, racer, updateRate); - racer_attack_handler(obj, racer, updateRate); + racer_attack_handler_car(obj, racer, updateRate); if (racer->spinout_timer) { racer_spinout_car(obj, racer, updateRate, updateRateF); // Sbinalla } else if (racer->unk1E2 > 0) { - func_8005492C(obj, racer, updateRate, updateRateF); + update_car_velocity_ground(obj, racer, updateRate, updateRateF); } else { - func_80052D7C(obj, racer, updateRate, updateRateF); + update_car_velocity_offground(obj, racer, updateRate, updateRateF); } apply_vehicle_rotation_offset(racer, updateRate, 0, 0, 0); header = get_current_level_header(); @@ -3209,7 +3946,7 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } else { racer->checkpoint_distance -= 0.1; } - func_80059080(obj, racer, &xVel, &yVel, &zVel); + set_position_goal_from_path(obj, racer, &xVel, &yVel, &zVel); if (racer->unk1F0) { racer->checkpoint_distance += 0.3; } else { @@ -3228,40 +3965,40 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->unk1F0 = 0; } obj->segment.unk38.byte.unk3B = 0; - tempAngle = ((-racer->y_rotation_vel >> 8) / gCurrentRacerHandlingStat); - tempAngle = 40 - tempAngle; - if (tempAngle < 0) { - tempAngle = 0; + steerVel = ((-racer->y_rotation_vel >> 8) / gCurrentRacerHandlingStat); + steerVel = 40 - steerVel; + if (steerVel < 0) { + steerVel = 0; } - if (tempAngle > 73) { - tempAngle = 73; + if (steerVel > 73) { + steerVel = 73; } - obj->segment.animFrame = tempAngle; + obj->segment.animFrame = steerVel; slowly_reset_head_angle(racer); angle = gCurrentCarSteerVel - (u16) racer->y_rotation_vel; WRAP(angle, -0x8000, 0x8000); angle >>= 2; CLAMP(angle, -0x2EE, 0x2EE); racer->y_rotation_vel += (angle * updateRate); - obj->segment.trans.y_rotation = racer->unk1A0 + racer->y_rotation_vel; + obj->segment.trans.y_rotation = racer->steerVisualRotation + racer->y_rotation_vel; racer->z_rotation_vel += ((D_8011D558 - racer->z_rotation_vel) * updateRate) >> 4; obj->segment.trans.z_rotation = racer->x_rotation_vel + racer->z_rotation_vel; if (!racer->unk1F0) { - D_8011D510.y_rotation = racer->unk1A0 + racer->unk10C; - D_8011D510.x_rotation = 0; - D_8011D510.z_rotation = 0; - D_8011D510.x_position = 0.0f; - D_8011D510.y_position = 0.0f; - D_8011D510.z_position = 0.0f; - D_8011D510.scale = 1.0f; - object_transform_to_matrix_2(mtx, &D_8011D510); + gCurrentRacerTransform.y_rotation = racer->steerVisualRotation + racer->unk10C; + gCurrentRacerTransform.x_rotation = 0; + gCurrentRacerTransform.z_rotation = 0; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix_2(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, racer->lateral_velocity, 0.0f, racer->velocity, &obj->segment.x_velocity, &tempVel, &obj->segment.z_velocity); } if (racer->magnetTimer) { - obj->segment.x_velocity = D_8011D578; - obj->segment.z_velocity = D_8011D57C; + obj->segment.x_velocity = gRacerMagnetVelX; + obj->segment.z_velocity = gRacerMagnetVelZ; } - if (!racer->unk148) { + if (!racer->approachTarget) { xVel = obj->segment.x_velocity; zVel = obj->segment.z_velocity; if (racer->unk1D2) { @@ -3270,11 +4007,11 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } xVel += racer->unk84; zVel += racer->unk88; - func_80011570(obj, xVel * updateRateF, obj->segment.y_velocity * updateRateF, zVel * updateRateF); + move_object(obj, xVel * updateRateF, obj->segment.y_velocity * updateRateF, zVel * updateRateF); } else { - func_80050754(obj, racer, updateRateF); + racer_approach_object(obj, racer, updateRateF); } - if (gCurrentPlayerIndex == -1 && !func_80023568()) { + if (gCurrentPlayerIndex == PLAYER_COMPUTER && !func_80023568()) { func_80055A84(obj, racer, updateRate); } else { func_80054FD0(obj, racer, updateRate); @@ -3289,14 +4026,14 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR xVel = (((obj->segment.trans.x_position - xTemp) - D_8011D548) * tempVel) - racer->unk84; obj->segment.y_velocity = (obj->segment.trans.y_position - yTemp) * tempVel; zVel = (((obj->segment.trans.z_position - zTemp) - D_8011D54C) * tempVel) - racer->unk88; - D_8011D510.y_rotation = -(racer->unk1A0 + racer->unk10C); - D_8011D510.x_rotation = -obj->segment.trans.x_rotation; - D_8011D510.z_rotation = -obj->segment.trans.z_rotation; - D_8011D510.x_position = 0.0f; - D_8011D510.y_position = 0.0f; - D_8011D510.z_position = 0.0f; - D_8011D510.scale = 1.0f; - object_transform_to_matrix_2(mtx, &D_8011D510); + gCurrentRacerTransform.y_rotation = -(racer->steerVisualRotation + racer->unk10C); + gCurrentRacerTransform.x_rotation = -obj->segment.trans.x_rotation; + gCurrentRacerTransform.z_rotation = -obj->segment.trans.z_rotation; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix_2(mtx, &gCurrentRacerTransform); guMtxXFMF(mtx, xVel, 0.0f, zVel, &hVel, &tempVel, &yVel); if (racer->unk1D2) { racer->unk1D2 -= updateRate; @@ -3306,23 +4043,27 @@ void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } else { tempVel = racer->velocity - yVel; if (tempVel > 0.5) { - racer->velocity -= tempVel - 0.5; + racer->velocity -= tempVel - 0.5; //!@Delta } if (tempVel < -0.5) { - racer->velocity -= tempVel + 0.5; + racer->velocity -= tempVel + 0.5; //!@Delta } tempVel = racer->lateral_velocity - hVel; if (tempVel && tempVel) {} if (tempVel > 0.5) { - racer->lateral_velocity -= tempVel - 0.5; + racer->lateral_velocity -= tempVel - 0.5; //!@Delta } if (tempVel < -0.5) { - racer->lateral_velocity -= tempVel + 0.5; + racer->lateral_velocity -= tempVel + 0.5; //!@Delta } } } -void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF) { +/** + * Gets, sets and works with car velocity while grounded. + * It also handles turn velocity, too. + */ +void update_car_velocity_ground(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { s32 xStick; s32 stickMultiplier; s32 surfaceType; @@ -3369,7 +4110,7 @@ void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR xStick *= updateRate; temp = (s32) ((xStick >> 1) * gCurrentRacerHandlingStat); temp2 = temp; - racer->unk1A0 -= temp2; + racer->steerVisualRotation -= temp2; handle_car_steering(racer); racer->lateral_velocity *= 0.9; surfaceType = SURFACE_DEFAULT; @@ -3392,9 +4133,9 @@ void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR } if (racer->boostTimer == 0 && surfaceType == SURFACE_ZIP_PAD) { racer->boostTimer = normalise_time(45); - racer->boostType = 3; + racer->boostType = BOOST_UNK3; } - racer->velocity -= velSquare * traction; + racer->velocity -= velSquare * traction; //!@Delta if (sp38) { if (racer->unk1EE < 16) { racer->unk1EE++; @@ -3403,10 +4144,10 @@ void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR racer->unk1EE = 0; } if (get_viewport_count() < 2 && sp38 && racer->velocity < -2.0) { - if (racer->wheel_surfaces[2] < 0xFF) { + if (racer->wheel_surfaces[2] < SURFACE_NONE) { obj->unk74 |= 1 << (racer->wheel_surfaces[2] * 2); } - if (racer->wheel_surfaces[3] < 0xFF) { + if (racer->wheel_surfaces[3] < SURFACE_NONE) { obj->unk74 |= 2 << (racer->wheel_surfaces[3] * 2); } } @@ -3438,21 +4179,21 @@ void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateR f32 reverseVel = (3.0 - racer->velocity) * 0.15; if (gCurrentStickY < -25 && !(gCurrentRacerInput & A_BUTTON) && gCurrentRacerInput & B_BUTTON) { racer->brake = 0.0f; - racer->velocity += reverseVel; + racer->velocity += reverseVel; //!@Delta } } forwardVel = (vel * racer->brake) * 0.32; - racer->velocity -= vel * racer->throttle; + racer->velocity -= vel * racer->throttle; //!@Delta if (racer->velocity > -0.04 && racer->velocity < 0.04) { racer->velocity = 0.0f; } if (racer->velocity < 0.0f) { - racer->velocity += forwardVel; + racer->velocity += forwardVel; //!@Delta if (racer->velocity > 0.0f) { racer->velocity = 0.0f; } } else { - racer->velocity -= forwardVel; + racer->velocity -= forwardVel; //!@Delta if (racer->velocity < 0.0f) { racer->velocity = 0.0f; } @@ -3511,9 +4252,9 @@ void func_80055A84(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) { D_8011D54C = tempPos.z - obj->segment.trans.z_position; flags &= ~0x80; } - shouldSquish = 0; + shouldSquish = FALSE; if (flags && tempPos.y < obj->segment.trans.y_position - 4.0) { - shouldSquish = 1; + shouldSquish = TRUE; } func_80031130(1, &racer->unkD8.x, &tempPos.x, racer->vehicleID); sp74 = 0; @@ -3582,40 +4323,40 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) Object *heldObj; Object *intendedTarget; Object_64 *magnetTarget; - f32 sp64; - ObjectModel *temp_a1; + f32 objDist; + ObjectModel *model; Object_64 *objData; f32 velocity; f32 distance; - f32 var_f2; - f32 var_f12; + f32 scaleY; + f32 scaleZ; UNUSED s32 pad; s8 *miscAsset; Vertex *heldObjData; UNUSED s32 playerIndex; - u16 soundID = 0; + u16 soundID = SOUND_NONE; if (racer->held_obj != NULL) { heldObj = racer->held_obj; if (gCurrentButtonsPressed & Z_TRIG || racer->raceFinished || racer->attackType) { - var_f2 = 0; - var_f12 = 0; + scaleY = 0; + scaleZ = 0; if (obj->unk68[obj->segment.unk38.byte.unk3A] != NULL) { - temp_a1 = obj->unk68[obj->segment.unk38.byte.unk3A]->objModel; - if (obj->segment.header->unk58 > -1 && obj->segment.header->unk58 < temp_a1->unk18) { + model = obj->unk68[obj->segment.unk38.byte.unk3A]->objModel; + if (obj->segment.header->unk58 > -1 && obj->segment.header->unk58 < model->unk18) { if (obj->unk44 != NULL) { heldObjData = obj->unk44; - heldObjData += temp_a1->unk14[obj->segment.header->unk58]; - var_f2 = heldObjData->y; - var_f2 *= obj->segment.trans.scale; - var_f12 = heldObjData->z; - var_f12 *= obj->segment.trans.scale; + heldObjData += model->unk14[obj->segment.header->unk58]; + scaleY = heldObjData->y; + scaleY *= obj->segment.trans.scale; + scaleZ = heldObjData->z; + scaleZ *= obj->segment.trans.scale; } } } - heldObj->segment.trans.x_position = obj->segment.trans.x_position + (racer->ox1 * var_f12) + (racer->ox2 * var_f2); - heldObj->segment.trans.y_position = obj->segment.trans.y_position + (racer->oy1 * var_f12) + (racer->oy2 * var_f2); - heldObj->segment.trans.z_position = obj->segment.trans.z_position + (racer->oz1 * var_f12) + (racer->oz2 * var_f2); + heldObj->segment.trans.x_position = obj->segment.trans.x_position + (racer->ox1 * scaleZ) + (racer->ox2 * scaleY); + heldObj->segment.trans.y_position = obj->segment.trans.y_position + (racer->oy1 * scaleZ) + (racer->oy2 * scaleY); + heldObj->segment.trans.z_position = obj->segment.trans.z_position + (racer->oz1 * scaleZ) + (racer->oz2 * scaleY); heldObj->segment.unk2C.half.lower = obj->segment.unk2C.half.lower; heldObj->segment.x_velocity = obj->segment.x_velocity * 0.7; heldObj->segment.y_velocity = obj->segment.y_velocity - 2.0; @@ -3661,24 +4402,24 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) return; } } - if ((gCurrentRacerInput & Z_TRIG) || gCurrentButtonsReleased & Z_TRIG) { + if (gCurrentRacerInput & Z_TRIG || gCurrentButtonsReleased & Z_TRIG) { switch (weaponID) { case WEAPON_ROCKET_HOMING: - intendedTarget = func_8005698C(obj, racer, &sp64); \ + intendedTarget = func_8005698C(obj, racer, &objDist); \ racer->magnetTimer = 0; racer->magnetTargetObj = intendedTarget; break; case WEAPON_MAGNET_LEVEL_1: case WEAPON_MAGNET_LEVEL_3: case WEAPON_MAGNET_LEVEL_2: - intendedTarget = func_8005698C(obj, racer, &sp64); + intendedTarget = func_8005698C(obj, racer, &objDist); racer->magnetTimer = 0; if (weaponID == WEAPON_MAGNET_LEVEL_1) { distance = 1000.0f; } else { distance = 1500.0f; } - if (sp64 < distance) { + if (objDist < distance) { if (weaponID == WEAPON_MAGNET_LEVEL_3 && intendedTarget != NULL) { magnetTarget = intendedTarget->unk64; } @@ -3695,15 +4436,15 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) velocity = 30.0f; switch (weaponID) { case WEAPON_ROCKET_HOMING: - sp64 = -10.0f; + objDist = -10.0f; objID = 229; break; case WEAPON_ROCKET: - sp64 = -10.0f; + objDist = -10.0f; break; case WEAPON_TRIPMINE: case WEAPON_UNK_11: - sp64 = 10.0f; + objDist = 10.0f; velocity = -2.0f; objID = 14; break; @@ -3713,11 +4454,11 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) } else { objID = 235; } - sp64 = 10.0f; + objDist = 10.0f; velocity = -2.0f; break; case WEAOON_BUBBLE_TRAP: - sp64 = 10.0f; + objDist = 10.0f; velocity = -2.0f; objID = 46; intendedTarget = NULL; @@ -3804,13 +4545,13 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) racer->balloon_quantity -= 1; return; default: - sp64 = 0; + objDist = 0; break; } play_random_character_voice(obj, SOUND_VOICE_CHARACTER_POSITIVE, 8, 129); - newObject.x = obj->segment.trans.x_position + (racer->ox1 * sp64); - newObject.y = obj->segment.trans.y_position + (racer->oy1 * sp64) + (10.0f * racer->oy2); - newObject.z = obj->segment.trans.z_position + (racer->oz1 * sp64); + newObject.x = obj->segment.trans.x_position + (racer->ox1 * objDist); + newObject.y = obj->segment.trans.y_position + (racer->oy1 * objDist) + (10.0f * racer->oy2); + newObject.z = obj->segment.trans.z_position + (racer->oz1 * objDist); newObject.size = 8; newObject.objectID = objID; spawnedObj = spawn_object(&newObject, 1); @@ -3876,6 +4617,9 @@ void handle_racer_items(Object *obj, Object_Racer *racer, UNUSED s32 updateRate) } } +/** + * Honk honk +*/ void play_char_horn_sound(Object *obj, Object_Racer *racer) { if (get_filtered_cheats() & CHEAT_HORN_CHEAT) { // Play character voice instead of horn. @@ -3917,7 +4661,7 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { } racer->boostType = BOOST_NONE; if (racer->throttleReleased) { - racer->boostType |= 4; + racer->boostType |= EMPOWER_BOOST; } if (racer->magnetSoundMask == NULL && racer->raceFinished == FALSE) { play_sound_global(SOUND_MAGNET_HUM, (void *) &racer->magnetSoundMask); @@ -3936,8 +4680,8 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { if (vel > 20.0) { vel = 20.0f; } - D_8011D578 = (vel + 5.0f) * (diffX); - D_8011D57C = (vel + 5.0f) * (diffZ); + gRacerMagnetVelX = (vel + 5.0f) * diffX; + gRacerMagnetVelZ = (vel + 5.0f) * diffZ; if (magnetTarget->racer.shieldTimer != 0 && racer->unk195 == 0) { racer->magnetTimer = 0; } @@ -3948,7 +4692,7 @@ void racer_activate_magnet(Object *obj, Object_Racer *racer, s32 updateRate) { */ void racer_play_sound(Object *obj, s32 soundID) { Object_Racer *racer = &obj->unk64->racer; - if (gCurrentPlayerIndex != -1 && racer->unk108 == 0) { + if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->unk108 == 0) { play_sound_spatial(soundID, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, NULL); } } @@ -3965,29 +4709,29 @@ void func_800570A4(Object *obj, s32 arg1, s32 arg2) { * acceptable offsets. Range will always be 8, because that's how many ID's for each * there are. */ -void play_random_character_voice(Object *obj, s32 soundID, s32 range, s32 arg3) { +void play_random_character_voice(Object *obj, s32 soundID, s32 range, s32 flags) { s32 soundIndex; - Object_64 *tempRacer; + Object_Racer *tempRacer; - tempRacer = obj->unk64; - if (tempRacer->racer.unk108 == 0 && ((!(arg3 & 0x80)) || gCurrentPlayerIndex != -1)) { - if (arg3 == 2) { - if ((tempRacer->racer.soundMask != 0) && (soundID != tempRacer->racer.unk2A)) { - func_800096F8(tempRacer->racer.soundMask); - tempRacer->racer.soundMask = 0; + tempRacer = (Object_Racer *) obj->unk64; + if (tempRacer->unk108 == 0 && (!(flags & 0x80) || gCurrentPlayerIndex != PLAYER_COMPUTER)) { + if (flags == 2) { + if (tempRacer->soundMask != NULL && soundID != tempRacer->unk2A) { + func_800096F8(tempRacer->soundMask); + tempRacer->soundMask = 0; } } - if (tempRacer->racer.soundMask == 0 && (arg3 != 3 || get_random_number_from_range(0, 1))) { - tempRacer->racer.unk2A = soundID; - soundID += tempRacer->racer.characterId; + if (tempRacer->soundMask == NULL && (flags != 3 || get_random_number_from_range(0, 1))) { + tempRacer->unk2A = soundID; + soundID += tempRacer->characterId; soundIndex = (get_random_number_from_range(0, range - 1) * 12) + soundID; if (range - 1 > 0) { - while (soundIndex == tempRacer->racer.lastSoundID) { + while (soundIndex == tempRacer->lastSoundID) { soundIndex = (get_random_number_from_range(0, range - 1) * 12) + soundID; } } - func_80009558(soundIndex, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, &tempRacer->racer.soundMask); - tempRacer->racer.lastSoundID = soundIndex; + func_80009558(soundIndex, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, 4, &tempRacer->soundMask); + tempRacer->lastSoundID = soundIndex; } } } @@ -4025,7 +4769,7 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { if (timer < 0) { timer = -timer; } - if ((gCurrentRacerInput & Z_TRIG)) { + if (gCurrentRacerInput & Z_TRIG) { if (timer < 2) { timer = 0; } @@ -4048,7 +4792,7 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { gStartBoostTime = racer->boostTimer; } // For the AI, expert AI will match the players start, and master AI will get a good start always. - if ((racer->playerIndex == PLAYER_COMPUTER) && (racer->aiSkill == AI_MASTER || (racer->aiSkill == AI_EXPERT && gStartBoostTime))) { + if (racer->playerIndex == PLAYER_COMPUTER && (racer->aiSkill == AI_MASTER || (racer->aiSkill == AI_EXPERT && gStartBoostTime))) { if (gStartBoostTime) { racer->boostTimer = gStartBoostTime; } else { @@ -4066,7 +4810,7 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { if (racer->boostTimer && !gRaceStartTimer && timer3 && racer->raceFinished == FALSE) { func_80072348(racer->playerIndex, 6); } - if ((gRaceStartTimer < 80) && gCurrentButtonsPressed & A_BUTTON) { + if (gRaceStartTimer < 80 && gCurrentButtonsPressed & A_BUTTON) { racer->startInput = 1; } if (!gRaceStartTimer) { @@ -4084,7 +4828,7 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { // Cheats only apply to human players. if (racer->playerIndex == PLAYER_COMPUTER) { bananas = racer->unk124; - } else { + } else { if (bananas > 10.0) { // Cap the banana speed boost to 10 if the unlimited bananas cheat is not enabled. if (!(get_filtered_cheats() & CHEAT_NO_LIMIT_TO_BANANAS)) { @@ -4109,19 +4853,19 @@ f32 handle_racer_top_speed(Object *obj, Object_Racer *racer) { } void func_800575EC(Object *obj, Object_Racer *racer) { - Matrix mf; + Matrix mtxF; - D_8011D510.y_rotation = obj->segment.trans.y_rotation; - D_8011D510.x_rotation = obj->segment.trans.x_rotation; - D_8011D510.z_rotation = 0; - D_8011D510.x_position = 0.0f; - D_8011D510.y_position = 0.0f; - D_8011D510.z_position = 0.0f; - D_8011D510.scale = 1.0f; - object_transform_to_matrix(mf, &D_8011D510); - guMtxXFMF(mf, 0.0f, 0.0f, 1.0f, &racer->ox1, &racer->oy1, &racer->oz1); - guMtxXFMF(mf, 0.0f, 1.0f, 0.0f, &racer->ox2, &racer->oy2, &racer->oz2); - guMtxXFMF(mf, 1.0f, 0.0f, 0.0f, &racer->ox3, &racer->oy3, &racer->oz3); + gCurrentRacerTransform.y_rotation = obj->segment.trans.y_rotation; + gCurrentRacerTransform.x_rotation = obj->segment.trans.x_rotation; + gCurrentRacerTransform.z_rotation = 0; + gCurrentRacerTransform.x_position = 0.0f; + gCurrentRacerTransform.y_position = 0.0f; + gCurrentRacerTransform.z_position = 0.0f; + gCurrentRacerTransform.scale = 1.0f; + object_transform_to_matrix(mtxF, &gCurrentRacerTransform); + guMtxXFMF(mtxF, 0.0f, 0.0f, 1.0f, &racer->ox1, &racer->oy1, &racer->oz1); + guMtxXFMF(mtxF, 0.0f, 1.0f, 0.0f, &racer->ox2, &racer->oy2, &racer->oz2); + guMtxXFMF(mtxF, 1.0f, 0.0f, 0.0f, &racer->ox3, &racer->oy3, &racer->oz3); } /** @@ -4130,7 +4874,7 @@ void func_800575EC(Object *obj, Object_Racer *racer) { */ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { LevelObjectEntryCommon newObject; - Object_Banana *temp; + Object_Banana *banana; s32 i; s16 angle[3]; s16 pos[3]; @@ -4145,7 +4889,7 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { if (number > 0 && number < 3) { angle[0] = racer->x_rotation_vel; angle[1] = obj->segment.trans.x_rotation; - angle[2] = racer->unk1A0; + angle[2] = racer->steerVisualRotation; pos[0] = 0; pos[1] = 8; pos[2] = 12; @@ -4161,8 +4905,8 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { bananaObj = spawn_object(&newObject, 1); if (bananaObj != NULL) { bananaObj->segment.unk3C_a.level_entry = NULL; - temp = (Object_Banana *)bananaObj->unk64; - temp->unk9 = racer->vehicleID; + banana = (Object_Banana *) bananaObj->unk64; + banana->unk9 = racer->vehicleID; bananaObj->segment.x_velocity = racer->ox1 * 2; bananaObj->segment.y_velocity = (0.0f - racer->oy1) + 5.0; bananaObj->segment.z_velocity = racer->oz1 * 2; @@ -4191,7 +4935,8 @@ void drop_bananas(Object *obj, Object_Racer *racer, s32 number) { * Get the velocity from a fraction of the difference. */ void handle_base_steering(Object_Racer *racer, UNUSED s32 updateRate, f32 updateRateF) { - s32 steering, turnVel; + s32 steering; + s32 turnVel; steering = gCurrentStickX - racer->steerAngle; turnVel = (steering * updateRateF) * 0.125; @@ -4214,9 +4959,9 @@ void handle_base_steering(Object_Racer *racer, UNUSED s32 updateRate, f32 update * Decides which behaviour to use, then branches off to that function. * Afterwards, writes position data to the current camera object. */ -void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRate) { - f32 temp_f14; - s32 delta; +void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRateF) { + f32 dialogueAngle; + s32 tempUpdateRateF; s32 angle; if (gCurrentButtonsPressed & U_CBUTTONS && func_800A0190()) { @@ -4251,84 +4996,88 @@ void update_player_camera(Object *obj, Object_Racer *racer, f32 updateRate) { break; case CAMERA_CAR: // Driving a car. - update_camera_car(updateRate, obj, racer); + update_camera_car(updateRateF, obj, racer); break; case CAMERA_PLANE: // Flying a plane. - update_camera_plane(updateRate, obj, racer); + update_camera_plane(updateRateF, obj, racer); break; case CAMERA_FIXED: // Fixes the camera in place, continuing to look at the player. Used when entering doors. - update_camera_fixed(updateRate, obj, racer); + update_camera_fixed(updateRateF, obj, racer); break; case CAMERA_HOVERCRAFT: // Driving a hovercraft. - update_camera_hovercraft(updateRate, obj, racer); + update_camera_hovercraft(updateRateF, obj, racer); break; case CAMERA_FINISH_CHALLENGE: // When you finish a challenge, the camera will rotate around the player, or around a set path, if the player's been KO'd. - update_camera_finish_challenge(updateRate, obj, racer); + update_camera_finish_challenge(updateRateF, obj, racer); break; case CAMERA_LOOP: // Used for loop-the-loops. Follows the face direction of the player exactly, the standard camera modes do not. - update_camera_loop(updateRate, obj, racer); + update_camera_loop(updateRateF, obj, racer); break; case CAMERA_FINISH_RACE: // When you finish a race, the camera will go into a more cinematic mode, following the player. - update_camera_finish_race(updateRate, obj, racer); + update_camera_finish_race(updateRateF, obj, racer); break; } - temp_f14 = D_8011D586 / 10240.0f; - gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * temp_f14); - gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * temp_f14); - gCameraObject->y_velocity = (((func_8003ACAC() + 48.5) - gCameraObject->trans.y_position) * temp_f14); - gCameraObject->unk38 = -gCameraObject->trans.x_rotation * temp_f14; + dialogueAngle = gDialogueCameraAngle / 10240.0f; // Goes between 0-1 + gCameraObject->x_velocity = (((obj->segment.trans.x_position + (91.75 * racer->ox1) + (90.0 * racer->ox3)) - gCameraObject->trans.x_position) * dialogueAngle); + gCameraObject->z_velocity = (((obj->segment.trans.z_position + (91.75 * racer->oz1) + (90.0 * racer->oz3)) - gCameraObject->trans.z_position) * dialogueAngle); + gCameraObject->y_velocity = (((func_8003ACAC() + 48.5) - gCameraObject->trans.y_position) * dialogueAngle); + gCameraObject->unk38 = -gCameraObject->trans.x_rotation * dialogueAngle; gCameraObject->trans.x_position += gCameraObject->x_velocity; gCameraObject->trans.y_position += gCameraObject->y_velocity + gCameraObject->unk30; gCameraObject->trans.z_position += gCameraObject->z_velocity; - if (!gRaceStartTimer && !D_8011D586) { + if (!gRaceStartTimer && !gDialogueCameraAngle) { gCameraObject->x_velocity = gCameraObject->x_velocity * 0.95; gCameraObject->y_velocity = gCameraObject->y_velocity * 0.95; gCameraObject->z_velocity = gCameraObject->z_velocity * 0.95; } - angle = D_8011D586; + angle = gDialogueCameraAngle; if (angle > 0x1400) { - angle = 0x2800 - D_8011D586; + angle = 0x2800 - gDialogueCameraAngle; } if (angle > 0x600) { angle = 0x600; } angle = ((angle >> 4) + 4); - delta = updateRate; + tempUpdateRateF = updateRateF; if (D_8011D583) { - D_8011D586 += (delta * angle); - if (D_8011D586 > 0x2800) { - D_8011D586 = 0x2800; + gDialogueCameraAngle += (tempUpdateRateF * angle); + if (gDialogueCameraAngle > 0x2800) { + gDialogueCameraAngle = 0x2800; } } else { - D_8011D586 -= (delta * angle); - if (D_8011D586 < 0) { - D_8011D586 = 0; + gDialogueCameraAngle -= (tempUpdateRateF * angle); + if (gDialogueCameraAngle < 0) { + gDialogueCameraAngle = 0; } } - gCameraObject->trans.y_rotation -= D_8011D586; - gCameraObject->unk3A -= delta; + gCameraObject->trans.y_rotation -= gDialogueCameraAngle; + gCameraObject->unk3A -= tempUpdateRateF; while (gCameraObject->unk3A < 0) { gCameraObject->unk3A += 5; gCameraObject->unk30 = -gCameraObject->unk30 * 0.75; } } -void func_800580B4(Object *obj, Object_Racer *racer, s32 mode, f32 arg3) { +/** + * After the racer logic is all done, update the camera once more. + * This time it will create the smooth following effect when turning. +*/ +void second_racer_camera_update(Object *obj, Object_Racer *racer, s32 mode, f32 updateRateF) { f32 xPos, yPos, zPos; if (gCurrentPlayerIndex != PLAYER_COMPUTER && racer->raceFinished != TRUE) { if (mode != gCameraObject->mode) { - update_player_camera(obj, racer, arg3); + update_player_camera(obj, racer, updateRateF); xPos = gCameraObject->trans.x_position; yPos = gCameraObject->trans.y_position; zPos = gCameraObject->trans.z_position; gCameraObject->mode = mode; - update_player_camera(obj, racer, arg3); + update_player_camera(obj, racer, updateRateF); if (gRaceStartTimer == 0 && D_8011D582 == 0) { gCameraObject->x_velocity = xPos - gCameraObject->trans.x_position; gCameraObject->y_velocity = yPos - (gCameraObject->trans.y_position + gCameraObject->unk30); @@ -4381,7 +5130,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { baseAngle = 0xD00; } angle = racer->unk19E >> 3; - racer->unk196 = (-racer->unk1A0 - racer->unk19E) + 0x8000; + racer->unk196 = (-racer->steerVisualRotation - racer->unk19E) + 0x8000; if (angle > 0x400) { angle = 0x400; } @@ -4517,7 +5266,7 @@ void update_camera_car(f32 updateRate, Object *obj, Object_Racer *racer) { gCameraObject->trans.z_position = zOffset + (-coss_f(racer->unk196 + 0x4000) * racer->unkC8) + cosOffset; gCameraObject->trans.y_rotation = racer->unk196; newAngle = gCameraObject->trans.z_rotation; - if ((racer->drift_direction && racer->brake > 0.0) || D_8011D586) { + if ((racer->drift_direction && racer->brake > 0.0) || gDialogueCameraAngle) { newAngle = 0; } angle = obj->segment.trans.z_rotation; @@ -4581,28 +5330,28 @@ void update_camera_finish_challenge(UNUSED f32 updateRate, Object *obj, Object_R */ void update_camera_finish_race(UNUSED f32 updateRate, Object *obj, Object_Racer *racer) { s32 cameraID; - Object *tempObj; - f32 xDiff; - f32 yDiff; - f32 zDiff; + Object *cam; + f32 diffX; + f32 diffY; + f32 diffZ; f32 distance; cameraID = racer->spectateCamID; - tempObj = func_8001BDD4(obj, &cameraID); - if (!tempObj) { + cam = func_8001BDD4(obj, &cameraID); + if (!cam) { gCameraObject->mode = CAMERA_FINISH_CHALLENGE; return; } racer->spectateCamID = cameraID; - gCameraObject->trans.x_position = tempObj->segment.trans.x_position; - gCameraObject->trans.y_position = tempObj->segment.trans.y_position; - gCameraObject->trans.z_position = tempObj->segment.trans.z_position; - xDiff = gCameraObject->trans.x_position - obj->segment.trans.x_position; - yDiff = gCameraObject->trans.y_position - obj->segment.trans.y_position; - zDiff = gCameraObject->trans.z_position - obj->segment.trans.z_position; - distance = sqrtf((xDiff * xDiff) + (zDiff * zDiff)); - gCameraObject->trans.y_rotation = 0x8000 - atan2s(xDiff, zDiff); - gCameraObject->trans.x_rotation = atan2s((s32) yDiff, (s32) distance); + gCameraObject->trans.x_position = cam->segment.trans.x_position; + gCameraObject->trans.y_position = cam->segment.trans.y_position; + gCameraObject->trans.z_position = cam->segment.trans.z_position; + diffX = gCameraObject->trans.x_position - obj->segment.trans.x_position; + diffY = gCameraObject->trans.y_position - obj->segment.trans.y_position; + diffZ = gCameraObject->trans.z_position - obj->segment.trans.z_position; + distance = sqrtf((diffX * diffX) + (diffZ * diffZ)); + gCameraObject->trans.y_rotation = 0x8000 - atan2s(diffX, diffZ); + gCameraObject->trans.x_rotation = atan2s((s32) diffY, (s32) distance); gCameraObject->trans.z_rotation = 0; gCameraObject->segmentIndex = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, gCameraObject->trans.z_position); } @@ -4612,19 +5361,23 @@ void update_camera_finish_race(UNUSED f32 updateRate, Object *obj, Object_Racer * Used when entering doors. */ void update_camera_fixed(f32 updateRate, Object *obj, Object_Racer *racer) { - s32 delta; - f32 xDiff; - f32 zDiff; - delta = (s32) updateRate; - xDiff = gCameraObject->trans.x_position - obj->segment.trans.x_position; - zDiff = gCameraObject->trans.z_position - obj->segment.trans.z_position; - gCameraObject->trans.y_rotation += ((((-atan2s(xDiff, zDiff)) - gCameraObject->trans.y_rotation) + 0x8000) * delta) >> 4; - gCameraObject->trans.z_rotation -= ((s32) (gCameraObject->trans.z_rotation * delta)) >> 4; + s32 updateRateF; + f32 diffX; + f32 diffZ; + updateRateF = (s32) updateRate; + diffX = gCameraObject->trans.x_position - obj->segment.trans.x_position; + diffZ = gCameraObject->trans.z_position - obj->segment.trans.z_position; + gCameraObject->trans.y_rotation += ((((-atan2s(diffX, diffZ)) - gCameraObject->trans.y_rotation) + 0x8000) * updateRateF) >> 4; + gCameraObject->trans.z_rotation -= ((s32) (gCameraObject->trans.z_rotation * updateRateF)) >> 4; gCameraObject->segmentIndex = get_level_segment_index_from_position(gCameraObject->trans.x_position, racer->oy1, gCameraObject->trans.z_position); } -// Think this is used to calculate the path for the AI. -void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel, f32 *zVel) { +/** + * Iterate through every checkpoint and find the current location of the racer. + * Sets the position arguments based on the intended location the spline functions return. + * These coordinates are then used to generate a velocity. +*/ +void set_position_goal_from_path(UNUSED Object *obj, Object_Racer *racer, f32 *x, f32 *y, f32 *z) { CheckpointNode *checkpoint; s32 splinePos; s32 destReached; @@ -4642,7 +5395,7 @@ void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel if (magnitude < 0.0f) { magnitude = 0.0f; } - if (racer->checkpoint) {} + if (racer->checkpoint) {} // Fakematch splinePos = racer->checkpoint - 2; if (splinePos < 0) { splinePos += splineEnd; @@ -4657,14 +5410,14 @@ void func_80059080(UNUSED Object *obj, Object_Racer *racer, f32 *xVel, f32 *yVel splinePos = 0; } } - destReached = 0; + destReached = FALSE; if (magnitude >= 1.0) { - destReached = 1; + destReached = TRUE; magnitude -= 1.0; } - *xVel = catmull_rom_interpolation(splineX, destReached, magnitude); - *yVel = catmull_rom_interpolation(splineY, destReached, magnitude); - *zVel = catmull_rom_interpolation(splineZ, destReached, magnitude); + *x = catmull_rom_interpolation(splineX, destReached, magnitude); + *y = catmull_rom_interpolation(splineY, destReached, magnitude); + *z = catmull_rom_interpolation(splineZ, destReached, magnitude); } } @@ -4768,7 +5521,7 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { diffX *= scale; diffZ *= scale; } - angle = arctan2_f(diffX, diffZ) - (racer->unk1A0 & 0xFFFF) - 0x8000; + angle = arctan2_f(diffX, diffZ) - (racer->steerVisualRotation & 0xFFFF) - 0x8000; WRAP(angle, -0x8000, 0x8000); if (angle > 0x4000 || angle < -0x4000) { if (racer->unk1FC < 200 && racer->velocity <= -1.0) { @@ -4804,6 +5557,10 @@ void func_80059208(Object *obj, Object_Racer *racer, s32 updateRate) { GLOBAL_ASM("asm/non_matchings/racer/func_80059208.s") #endif +/** + * Writes a human readable time to the passed arguments. + * Used to visualise a standard time to the player for a stopwatch, or a record. +*/ void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 *hundredths) { if (gVideoRefreshRate == REFRESH_50HZ) { frameCount = (f32)frameCount * 1.2; @@ -4815,7 +5572,7 @@ void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 * } void func_800598D0(void) { - gGhostData[0] = allocate_from_main_pool_safe(0x21C0, COLOUR_TAG_RED); + gGhostData[0] = allocate_from_main_pool_safe((sizeof(GhostNode) + sizeof(GhostDataFrame)) * MAX_NUMBER_OF_GHOST_NODES, COLOUR_TAG_RED); gGhostData[1] = (GhostHeader *) ((GhostNode *) gGhostData[0] + MAX_NUMBER_OF_GHOST_NODES); gGhostData[2] = NULL; // T.T. Ghost D_8011D5A0[0] = 0; @@ -4913,15 +5670,19 @@ void func_8005A3C0(void) { D_8011D583 = 1; } -void func_8005A3D0(void) { +/** + * Antipiracy function that loops over an address of a function a number of times. + * It compares the number it gets to a generated checksum to determine if the game has been tampered with at all. +*/ +void compare_balloon_checksums(void) { s32 i; s32 count = 0; - u8 *temp = (u8 *)&obj_loop_goldenballoon; + u8 *temp = (u8 *) &obj_loop_goldenballoon; for (i = 0; i < gObjLoopGoldenBalloonLength; i++) { count += temp[i]; } - // Antipiracy measure + // Antipiracy measure that makes every racer's head spin. if (count != gObjLoopGoldenBalloonChecksum) { gAntiPiracyHeadroll = 0x800; } @@ -4934,12 +5695,12 @@ void func_8005A3D0(void) { */ void racer_enter_door(Object_Racer* racer, s32 updateRate) { struct Object_Exit *temp_a3; - f32 delta; + f32 updateRateF; s32 angle; temp_a3 = (struct Object_Exit *) racer->unk108->unk64; racer->playerIndex = PLAYER_COMPUTER; - angle = (u16) arctan2_f(temp_a3->unk0, temp_a3->unk8) - (racer->unk1A0 & 0xFFFF); + angle = (u16) arctan2_f(temp_a3->unk0, temp_a3->unk8) - (racer->steerVisualRotation & 0xFFFF); WRAP(angle, -0x8000, 0x8000); angle = -angle >> 5; gCurrentStickX = angle; @@ -4952,9 +5713,9 @@ void racer_enter_door(Object_Racer* racer, s32 updateRate) { } else if (racer->velocity < -5.0) { gCurrentRacerInput |= B_BUTTON; } - delta = (f32) updateRate; - gCameraObject->trans.x_position += (temp_a3->unk0 * delta) * 1.5; - gCameraObject->trans.z_position += (temp_a3->unk8 * delta) * 1.5; + updateRateF = (f32) updateRate; + gCameraObject->trans.x_position += (temp_a3->unk0 * updateRateF) * 1.5; + gCameraObject->trans.z_position += (temp_a3->unk8 * updateRateF) * 1.5; if (gCurrentStickX > 75) { gCurrentStickX = 75; gCurrentRacerInput |= A_BUTTON | B_BUTTON; } // Only matches if it's on the same line if (gCurrentStickX < -75) { gCurrentStickX = -75; @@ -4968,7 +5729,7 @@ void racer_enter_door(Object_Racer* racer, s32 updateRate) { } if ((racer->transitionTimer < -1 && gCurrentStickX < 10 && gCurrentStickX > -10) || racer->transitionTimer == -1) { if (check_if_showing_cutscene_camera() == 0) { - func_800C01D8(&D_800DCDD4); + func_800C01D8(&gDoorFadeTransition); } racer->transitionTimer = 60 - updateRate; } @@ -4982,7 +5743,11 @@ void racer_enter_door(Object_Racer* racer, s32 updateRate) { } } -void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { +/** + * The top level function for handling the actions of a computer controlled racer. + * Mostly the same as how the player controlled one works, minus controller input and includes some decisionmaking logic. +*/ +void update_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF) { s32 var_t2; Object **objects; s32 renderContext; @@ -5037,7 +5802,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } } - racer->unk1E7++; //!@delta + racer->miscAnimCounter++; //!@Delta if (func_8002341C() || func_80023568() || racer->vehicleID == VEHICLE_LOOPDELOOP || D_8011D544 > 120.0f || gRaceStartTimer != 0 || levelHeader->race_type & RACETYPE_CHALLENGE_BATTLE) { racer->unk201 = 30; @@ -5079,9 +5844,9 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR racer->unk201 = 30; } if (racer->unk201 != 0) { - func_80044170(obj, racer, updateRate); + racer_AI_pathing_inputs(obj, racer, updateRate); if (!(gCurrentRacerInput & A_BUTTON)) { - racer->throttleReleased = 1; + racer->throttleReleased = TRUE; } if (racer->unk1FE == 3) { gCurrentRacerWeightStat *= ((f32) racer->unk1FF / 256); @@ -5117,7 +5882,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR D_8011D5AE = func_8002B0F4(obj->segment.unk2C.half.lower, obj->segment.trans.x_position, obj->segment.trans.z_position, (struct TempStruct8 **) &D_8011D5B0); } func_8002ACC8(0); - if ((racer->unk148 != NULL) || (gRaceStartTimer != 0) || (racer->unk204 > 0)) { + if ((racer->approachTarget != NULL) || (gRaceStartTimer != 0) || (racer->unk204 > 0)) { gCurrentStickX = 0; gCurrentStickY = 0; gCurrentRacerInput = 0; @@ -5161,7 +5926,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR } if (checkpoint->unk36[racer->unk1CA] == 4) { if (racer->velocity < -4.0) { - racer->velocity *= 0.9; + racer->velocity *= 0.9; //!@Delta } } if (var_t2 == 0) { @@ -5207,8 +5972,8 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if (racer->unk188 > 0) { drop_bananas(obj, racer, racer->unk188); } - if (racer->unk148 != NULL) { - racer->unk148 = NULL; + if (racer->approachTarget != NULL) { + racer->approachTarget = NULL; racer->velocity = 0.0f; racer->lateral_velocity = 0.0f; } @@ -5254,7 +6019,7 @@ void func_8005A6F0(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR if ((racer->unk150 != NULL) && (gRaceStartTimer == 0)) { s8 *temp; racer->unk150->segment.trans.x_position = obj->segment.trans.x_position; - temp = (s8 *)get_misc_asset(MISC_ASSET_UNK00); + temp = (s8 *) get_misc_asset(MISC_ASSET_UNK00); racer->unk150->segment.trans.y_position = obj->segment.trans.y_position + temp[racer->characterId]; racer->unk150->segment.trans.z_position = obj->segment.trans.z_position; racer->unk150->segment.trans.scale = obj->segment.unk30 / 265.0f; @@ -5465,15 +6230,15 @@ void func_8005B818(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR sp9C /= temp_f0_5; sp94 /= temp_f0_5; sp98 /= temp_f0_5; - racer->unk1A0 = arctan2_f(sp9C, sp94) - 0x8000; - obj->segment.trans.y_rotation = racer->unk1A0; + racer->steerVisualRotation = arctan2_f(sp9C, sp94) - 0x8000; + obj->segment.trans.y_rotation = racer->steerVisualRotation; obj->segment.trans.x_rotation = arctan2_f(sp98, 1.0f); } racer->unk1C2 = racer->unk1BE; racer->unk1C4 = racer->unk1C0; - racer->unk1BE = racer->unk1A0; + racer->unk1BE = racer->steerVisualRotation; racer->unk1C0 = obj->segment.trans.x_rotation; - if (func_80011570(obj, var_f26, temp_f24_3, var_f28)) { + if (move_object(obj, var_f26, temp_f24_3, var_f28)) { obj->segment.trans.x_position += var_f26; obj->segment.trans.y_position += temp_f24_3; obj->segment.trans.z_position += var_f28; diff --git a/src/racer.h b/src/racer.h index 86c4b3ed..88e67cd4 100644 --- a/src/racer.h +++ b/src/racer.h @@ -90,7 +90,9 @@ typedef enum WeaponType { WEAPON_SHIELD_LEVEL_1, WEAPON_SHIELD_LEVEL_2, WEAPON_SHIELD_LEVEL_3, - WEAPON_NITRO_LEVEL_3 + WEAPON_NITRO_LEVEL_3, + + NUM_WEAPON_TYPES } WeaponType; typedef enum LightFlags { @@ -122,51 +124,29 @@ typedef struct ObjectCamera { /* 0x003F */ u8 unk3F; } ObjectCamera; -/* Unknown Size */ -typedef struct unk8005234C { - u8 unk0[0x16C]; - s16 unk16C; -} unk8005234C; - typedef struct TempStruct5 { f32 unk0; f32 unk4; s8 unk8[4][4]; } TempStruct5; -/* Unknown Size */ -typedef struct unk800535C4 { +typedef struct Asset20 { + f32 unk0; + u8 pad4[0x6C]; + u8 unk70; + f32 unk74; + u8 pad78[0x8]; +} Asset20; + +typedef struct Unknown80046524 { s16 unk0; - s16 unk2; -} unk800535C4; + u8 pad2[0x38]; + s8 unk3A; +} Unknown80046524; -/* Unknown Size */ -typedef struct unk800535C4_2 { - /* 0x00 */ u8 unk0[0x9C]; - /* 0x9C */ f32 oz; - /* 0xA0 */ f32 ox; - /* 0xA4 */ f32 oy; - /* 0xA8 */ u8 unkA8[0xF8]; - /* 0x1A0 */ s16 unk1A0; - /* 0x1A2 */ s16 unk1A2; - /* 0x1A4 */ s16 unk1A4; -} unk800535C4_2; - -/* Unknown Size */ -typedef struct unk80056930 { - u8 unk0[0x3]; - s8 unk3; -} unk80056930; - -/* Unknown Size */ -typedef struct unk800579B0 { - u8 unk0[0x1E1]; - s8 unk1E1; -} unk800579B0; - -s32 func_80044450(s32 cap); -void func_8004C0A0(s32 updateRate, Object *obj, Object_Racer *racer); -void func_8004C140(Object *obj, Object_Racer *racer); +s32 roll_percent_chance(s32 chance); +void apply_plane_tilt_anim(s32 updateRate, Object *obj, Object_Racer *racer); +void racer_attack_handler_plane(Object *obj, Object_Racer *racer); void update_carpet(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *racer); void set_racer_tail_lights(Object_Racer *arg0); s32 func_80052188(void); @@ -174,14 +154,14 @@ void func_800521B8(s32 arg0); void slowly_reset_head_angle(Object_Racer *racer); void func_80052988(Object *obj, Object_Racer *arg1, s32 action, s32 arg3, s32 duration, s32 arg5, s32 arg6, s32 arg7); void handle_car_steering(Object_Racer *racer); -void func_800535C4(unk800535C4 *arg0, unk800535C4_2 *arg1); +void func_800535C4(Object *obj, Object_Racer *racer); void handle_car_velocity_control(Object_Racer *racer); void play_char_horn_sound(Object *obj, Object_Racer *racer); void racer_play_sound(Object *obj, s32 soundID); void func_800570A4(Object *obj, s32 arg1, s32 arg2); void func_800575EC(Object *obj, Object_Racer *racer); void handle_base_steering(Object_Racer *racer, s32 updateRate, f32 updateRateF); -void func_800580B4(Object *obj, Object_Racer *racer, s32 mode, f32 arg3); +void second_racer_camera_update(Object *obj, Object_Racer *racer, s32 mode, f32 arg3); void get_timestamp_from_frames(s32 frameCount, s32 *minutes, s32 *seconds, s32 *hundredths); void func_800598D0(void); void func_80059944(void); @@ -194,7 +174,7 @@ s32 func_80059B7C(s32 controllerIndex, s32 mapId, s16 arg2, s16 arg3, s16 arg4); s16 func_80059E20(void); void func_8005A3B0(void); void func_8005A3C0(void); -void func_8005A3D0(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); @@ -202,8 +182,8 @@ 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); void apply_vehicle_rotation_offset(Object_Racer *obj, s32 max, s16 yRotation, s16 xRotation, s16 zRotation); -void func_80059080(Object *obj, Object_Racer *racer, f32 *velX, f32 *velY, f32 *velZ); -void func_80054110(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF); +void set_position_goal_from_path(Object *obj, Object_Racer *racer, f32 *x, f32 *y, f32 *z); +void update_onscreen_AI_racer(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateRateF); void update_camera_hovercraft(f32 updateRate, Object *obj, Object_Racer *racer); void update_camera_plane(f32 updateRate, Object *obj, Object_Racer *racer); void update_camera_loop(f32 updateRate, Object *obj, Object_Racer *racer); @@ -212,20 +192,20 @@ void update_camera_finish_challenge(f32 arg0, Object *obj, Object_Racer *racer); void update_camera_finish_race(f32 arg0, Object *obj, Object_Racer *racer); void update_camera_fixed(f32 arg0, Object *obj, Object_Racer *racer); void handle_racer_head_turning(Object *obj, Object_Racer *racer, s32 updateRate); -void func_80050754(Object *obj, Object_Racer *racer, f32 divisor); +void racer_approach_object(Object *obj, Object_Racer *racer, f32 divisor); void obj_init_racer(Object *obj, LevelObjectEntry_CharacterFlag *racer); -void func_80044170(Object *obj, Object_Racer *racer, s32 updateRate); +void racer_AI_pathing_inputs(Object *obj, Object_Racer *racer, s32 updateRate); void func_80043ECC(s32 arg0, Object_Racer *racer, s32 updateRate); void func_80055A84(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(Object* obj, Object_Racer* racer, s32 updateRate); -void func_80048C7C(Object* obj, Object_Racer* racer); +void racer_attack_handler_car(Object* obj, Object_Racer* racer, s32 updateRate); +void racer_attack_handler_hovercraft(Object* obj, Object_Racer* racer); void racer_enter_door(Object_Racer *racer, s32 updateRate); void func_8005250C(Object* obj, Object_Racer* racer, s32 updateRate); -void func_8005492C(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF); -f32 func_800494E0(Object* obj1, Object_Racer* racer, f32 *pos, s8 arg3, s32 updateRate, s32 arg5, f32 arg6); -void func_8005A6F0(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF); +void update_car_velocity_ground(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF); +f32 rotate_racer_in_water(Object* obj1, Object_Racer* racer, Vec3f *pos, s8 arg3, s32 updateRate, s32 arg5, f32 arg6); +void update_AI_racer(Object* obj, Object_Racer* racer, s32 updateRate, f32 updateRateF); void func_80042D20(Object *obj, Object_Racer *racer, s32 updateRate); void handle_racer_items(Object *obj, Object_Racer *racer, s32 updateRate); void drop_bananas(Object *obj, Object_Racer *racer, s32 number); @@ -235,7 +215,7 @@ void update_player_racer(Object *obj, s32 updateRate); void set_ghost_position_and_rotation(Object *obj); void func_80054FD0(Object *obj, Object_Racer *racer, s32); void func_80053750(Object *obj, Object_Racer *racer, f32); -void func_80052D7C(Object *obj, Object_Racer *racer, s32, f32); +void update_car_velocity_offground(Object *obj, Object_Racer *racer, s32, f32); s32 func_80017248(void*, s32, s32*, Vec3f*, f32*, f32*, s8* surface); void func_80059BF0(Object* obj, s32 updateRate); void func_80059208(Object* obj, Object_Racer* racer, s32 updateRate); /* extern */ diff --git a/src/save_data.c b/src/save_data.c index 50c89063..5d6e5748 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -1442,7 +1442,7 @@ void init_controller_paks(void) { sControllerPaksPresent |= controllerBit; } else if (ret == PFS_ERR_ID_FATAL) { - if (controllerIndex) { } + if (controllerIndex) { } // Fakematch ret = osMotorInit(sControllerMesgQueue, &pfs[controllerIndex], controllerIndex); if (ret == 0) { //If we found a rumble pak, set the bit that has one diff --git a/src/stacks.c b/src/stacks.c index 8d023e6c..49589f41 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -9,7 +9,7 @@ /************ .bss ************/ u8 piThreadStack[0x100]; // piThreadStack[OS_PIM_STACKSIZE]; -u8 D_80129BB0[0x400]; // epcStack? +u16 D_80129BB0[512][1]; // epcStack? s32 D_80129FB0[3]; s32 D_80129FBC; diff --git a/src/stacks.h b/src/stacks.h index b2b65c49..42b1b638 100644 --- a/src/stacks.h +++ b/src/stacks.h @@ -6,7 +6,7 @@ #define OS_PIM_STACKSIZE 4096 extern u8 piThreadStack[0x100]; // piThreadStack[OS_PIM_STACKSIZE]; -extern u8 D_80129BB0[0x400]; //epcStack? +extern u16 D_80129BB0[512][1]; //epcStack? extern s32 D_80129FB0[3]; extern s32 D_80129FBC; diff --git a/src/thread0_epc.c b/src/thread0_epc.c index 8290c6a9..970e7ea2 100644 --- a/src/thread0_epc.c +++ b/src/thread0_epc.c @@ -30,20 +30,13 @@ const char sCoreFileExt2[] = { 0, 0, 0, 0 }; /************ .data ************/ s32 sLockupStatus = -1; -s32 sLockupPage = 0; +s32 sLockupPage = EPC_PAGE_REGISTER; s32 sLockupDelay = 0; -char *D_800E302C[3] = { - "setup", "control", "print" -}; - /*******************************/ /************ .bss ************/ -epcInfo gEpcInfo; //Very similar to __OSThreadContext -s32 D_801299B0[64]; - /******************************/ extern OSMesgQueue D_80129790; @@ -181,9 +174,9 @@ void func_800B7460(s32 *epc, s32 size, s32 mask) { sp840.a1 = mask; sp840.epc = epc; sp840.cause = -1; - sp840.unk130 = D_80129FB0[0]; - sp840.unk134 = D_80129FB0[1]; - sp840.unk138 = D_80129FB0[2]; + sp840.unk130[0] = D_80129FB0[0]; + sp840.unk130[1] = D_80129FB0[1]; + sp840.unk130[2] = D_80129FB0[2]; bcopy(&sp840, &sp40, 0x1B0); bzero(&sp240, 0x200); v0 = func_80024594(&sp38, &size); @@ -215,6 +208,8 @@ s32 get_lockup_status(void) { s64 sp420[128]; // Overwrite epcStack? s64 sp220[64]; u8 dataFromControllerPak[512]; //Looks to be sizeof(epcInfo), aligned to 64 + extern epcInfo gEpcInfo; + extern s32 D_801299B0[64]; if (sLockupStatus != -1) { return sLockupStatus; @@ -223,8 +218,7 @@ s32 get_lockup_status(void) { // Looks like it reads EpcInfo data from the controller pak, which is interesting if ((get_si_device_status(controllerIndex) == CONTROLLER_PAK_GOOD) && (get_file_number(controllerIndex, (char *)sCoreFileName2, (char *)sCoreFileExt2, &fileNum) == CONTROLLER_PAK_GOOD) && - (read_data_from_controller_pak(controllerIndex, fileNum, dataFromControllerPak, 2048) == CONTROLLER_PAK_GOOD)) - { + (read_data_from_controller_pak(controllerIndex, fileNum, dataFromControllerPak, 0x800) == CONTROLLER_PAK_GOOD)) { bcopy(&dataFromControllerPak, &gEpcInfo, sizeof(epcInfo)); bcopy(&sp220, &D_801299B0, sizeof(sp220)); bcopy(&sp420, &D_80129BB0, sizeof(sp420)); @@ -241,64 +235,46 @@ s32 get_lockup_status(void) { void lockup_screen_loop(s32 updateRate) { sLockupDelay += updateRate; - if (sLockupDelay >= 61) { + if (sLockupDelay > 60) { sLockupDelay = 0; sLockupPage++; } } -#ifdef NON_EQUIVALENT +#define GET_REG(reg) (s32)gEpcInfo.reg + +/** + * Draw onscreen the four pages of the crash screen. + * Page 0 shows the address of the instruction that crashed as well as fixed point registers + * Page 1-3 show the stack dump of the crashed thread. + * Page 4 appears to show the data of the EPC stack itself? +*/ void render_epc_lock_up_display(void) { - char *sp50[3]; + u16 *temp; + char *sp50[3] = {"setup", "control", "print"}; + s32 offset; s32 s3; - s32 i, j; - - sp50[0] = D_800E302C[0]; // "setup" - sp50[1] = D_800E302C[1]; // "control" - sp50[2] = D_800E302C[2]; // "print" - + s32 j; + s32 i; + static epcInfo gEpcInfo; + static s32 D_801299B0[64]; + s3 = 0; - set_render_printf_position(0x10, 0x20); + set_render_printf_position(16, 32); switch (sLockupPage) { - case 0: - D_80129FB0[0] = gEpcInfo.unk130; - D_80129FB0[1] = gEpcInfo.unk134; - D_80129FB0[2] = gEpcInfo.unk138; - if (gEpcInfo.cause != -1) { - render_printf(" Fault in thread %d\n", gEpcInfo.thread); + 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 render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); - render_printf(" cause\t\t0x%08x\n", gEpcInfo.cause); - render_printf(" sr\t\t0x%08x\n", gEpcInfo.sr); - render_printf(" badvaddr\t0x%08x\n", gEpcInfo.badvaddr); + 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 (s3 == 0) { - s3 = 1; - render_printf(" object\t\t"); - } - render_printf("%s %d ", sp50[i], D_80129FB0[i]); - } - } - render_printf("\n"); - render_printf(" at 0x%08x v0 0x%08x v1 0x%08x\n", gEpcInfo.at, gEpcInfo.v0, gEpcInfo.v1); - render_printf(" a0 0x%08x a1 0x%08x a2 0x%08x\n", gEpcInfo.a0, gEpcInfo.a1, gEpcInfo.a2); - render_printf(" a3 0x%08x t0 0x%08x t1 0x%08x\n", gEpcInfo.a3, gEpcInfo.t0, gEpcInfo.t1); - render_printf(" t2 0x%08x t3 0x%08x t4 0x%08x\n", gEpcInfo.t2, gEpcInfo.t3, gEpcInfo.t4); - render_printf(" t5 0x%08x t6 0x%08x t7 0x%08x\n", gEpcInfo.t5, gEpcInfo.t6, gEpcInfo.t7); - render_printf(" s0 0x%08x s1 0x%08x s2 0x%08x\n", gEpcInfo.s0, gEpcInfo.s1, gEpcInfo.s2); - render_printf(" s3 0x%08x s4 0x%08x s5 0x%08x\n", gEpcInfo.s3, gEpcInfo.s4, gEpcInfo.s5); - render_printf(" s6 0x%08x s7 0x%08x t8 0x%08x\n", gEpcInfo.s6, gEpcInfo.s7, gEpcInfo.t8); - render_printf(" t9 0x%08x gp 0x%08x sp 0x%08x\n", gEpcInfo.t9, gEpcInfo.gp, gEpcInfo.sp); - render_printf(" s8 0x%08x ra 0x%08x\n\n", gEpcInfo.s8, gEpcInfo.ra); - } else { // gEpcInfo.cause == -1 - render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); - render_printf(" cause\t\tmmAlloc(%d,0x%8x)\n", gEpcInfo.a0, gEpcInfo.a1); - for (i = 0; i < 3; i++) { - if (D_80129FB0[i] != -1) { - if (s3 == 0) { - s3 = 1; + if (!s3) { + s3 = TRUE; render_printf(" object\t\t"); } render_printf("%s %d ", sp50[i], D_80129FB0[i]); @@ -306,32 +282,58 @@ void render_epc_lock_up_display(void) { } render_printf("\n"); render_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - render_printf(" s8 0x%08x ra 0x%08x\n\n", gEpcInfo.s8, gEpcInfo.ra); - render_printf("\n"); + break; + } + render_printf(" Fault in thread %d\n", gEpcInfo.thread[0]); + render_printf(" epc\t\t0x%08x\n", gEpcInfo.epc); + render_printf(" cause\t\t0x%08x\n", gEpcInfo.cause); + 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 (!s3) { + s3 = TRUE; + render_printf(" object\t\t"); + } + render_printf("%s %d ", sp50[i], D_80129FB0[i]); + } + } + render_printf("\n"); + render_printf(" at 0x%08x v0 0x%08x v1 0x%08x\n", GET_REG(at), GET_REG(v0), GET_REG(v1)); + render_printf(" a0 0x%08x a1 0x%08x a2 0x%08x\n", GET_REG(a0), GET_REG(a1), GET_REG(a2)); + render_printf(" a3 0x%08x t0 0x%08x t1 0x%08x\n", GET_REG(a3), GET_REG(t0), GET_REG(t1)); + render_printf(" t2 0x%08x t3 0x%08x t4 0x%08x\n", GET_REG(t2), GET_REG(t3), GET_REG(t4)); + render_printf(" t5 0x%08x t6 0x%08x t7 0x%08x\n", GET_REG(t5), GET_REG(t6), GET_REG(t7)); + render_printf(" s0 0x%08x s1 0x%08x s2 0x%08x\n", GET_REG(s0), GET_REG(s1), GET_REG(s2)); + render_printf(" s3 0x%08x s4 0x%08x s5 0x%08x\n", GET_REG(s3), GET_REG(s4), GET_REG(s5)); + render_printf(" s6 0x%08x s7 0x%08x t8 0x%08x\n", GET_REG(s6), GET_REG(s7), GET_REG(t8)); + render_printf(" t9 0x%08x gp 0x%08x sp 0x%08x\n", GET_REG(t9), GET_REG(gp), GET_REG(sp)); + render_printf(" s8 0x%08x ra 0x%08x\n\n", GET_REG(s8), GET_REG(ra)); + break; + case EPC_PAGE_STACK_TOP: + case EPC_PAGE_STACK_MIDDLE: + case EPC_PAGE_STACK_BOTTOM: + offset = (sLockupPage - 1) * 48; + for (j = (s32) &D_801299B0[offset], i = 0; i < 16; i++) { + render_printf(" %08x %08x %08x\n", ((u8**)j)[0], ((u8**)j)[16], ((u8**)j)[32]); + j = (s32) ((s32 *) j + 1); } break; - default: - for (i = 0; i < 16; i++) { - render_printf(" %08x %08x %08x\n", - D_801299B0[i - 1], - D_801299B0[i - 1 + 16], - D_801299B0[i - 1 + 32]); - } - break; - case 4: - for (i = 0; i < 16; i++) { + case EPC_PAGE_UNK04: + offset = (sLockupPage - 4) * 128; + for (temp = (u16 *) D_80129BB0[offset], i = 0; i < 16; i++) { render_printf(" "); - for (j = 0; j < 8; j++) { - render_printf("%04x ", D_80129BB0[(i * 16) + j - 2]); + for(j = 0; j < 8; j++) { + render_printf("%04x ", temp[0]); + temp++; } render_printf("\n"); } break; - case 5: + case EPC_PAGE_EXIT: sLockupPage = 0; - break; + return; + default: + return; } -} -#else -GLOBAL_ASM("asm/non_matchings/thread0_epc/render_epc_lock_up_display.s") -#endif +} \ No newline at end of file diff --git a/src/thread0_epc.h b/src/thread0_epc.h index a8832a52..2bcbdfdd 100644 --- a/src/thread0_epc.h +++ b/src/thread0_epc.h @@ -12,7 +12,7 @@ typedef struct epcInfo { /* 0x08 */ s32 unk8; /* 0x0C */ s32 unkC; /* 0x10 */ s32 unk10; -/* 0x14 */ s32 thread; +/* 0x14 */ s32 thread[1]; /* 0x18 */ s32 unk18; /* 0x1C */ s32 unk1C; /* 0x20 */ s64 at; @@ -54,9 +54,7 @@ typedef struct epcInfo { /* 0x124 */ s32 badvaddr; /* 0x128 */ s32 unk128; /* 0x12C */ s32 unk12C; -/* 0x130 */ f32 unk130; -/* 0x134 */ f32 unk134; -/* 0x138 */ f32 unk138; +/* 0x130 */ f32 unk130[3]; /* 0x13C */ u8 pad13C[0x74]; } epcInfo; @@ -70,6 +68,15 @@ typedef struct unk800D2470 { /* 0x118 */ s32 unk118; } unk800D2470; +enum EPCScreenPage { + EPC_PAGE_REGISTER, + EPC_PAGE_STACK_TOP, + EPC_PAGE_STACK_MIDDLE, + EPC_PAGE_STACK_BOTTOM, + EPC_PAGE_UNK04, + EPC_PAGE_EXIT +}; + void func_800B6E50(void); void func_800B6EE0(void); void func_800B6F04(void); diff --git a/src/unknown_0255E0.c b/src/unknown_0255E0.c index 12b9be6a..ab907140 100644 --- a/src/unknown_0255E0.c +++ b/src/unknown_0255E0.c @@ -481,7 +481,7 @@ void func_80027E24(s32 arg0) { void func_80027FC4(s32 arg0) { LevelObjectEntryCommon sp20; - func_8005A3D0(); + compare_balloon_checksums(); if (arg0 == -1) { D_8011B0B8 = NULL; return; diff --git a/src/unknown_0255E0.h b/src/unknown_0255E0.h index 0fa8dc5b..68648a1c 100644 --- a/src/unknown_0255E0.h +++ b/src/unknown_0255E0.h @@ -134,7 +134,7 @@ Gfx *func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 currentViewportInde s32 func_80027568(void); s32 func_8002CC30(LevelModelSegment*); s8 func_8002B0F4(s16, f32 xPos, f32 zPos, struct TempStruct8**); -s32 func_8002AD08(f32 yPos, f32* waterHeight, f32*); +s32 func_8002AD08(f32 yPos, f32* waterHeight, Vec3f*); void func_800278E8(s32); void func_80028050(void); void func_80028CD0(s32); diff --git a/src/vehicle_bluey.c b/src/vehicle_bluey.c index 645dec1f..f6f604dc 100644 --- a/src/vehicle_bluey.c +++ b/src/vehicle_bluey.c @@ -68,8 +68,8 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra s16 sp5E; s16 sp5C; s16 sp5A; - f32 xDiff; - f32 zDiff; + f32 diffX; + f32 diffZ; s32 var_v0; s32 sp48; ObjectModel *objModel; @@ -128,10 +128,10 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra obj->segment.y_velocity += 7.5; } } - if (racer->unk148 != NULL) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = obj->segment.z_velocity * obj->segment.z_velocity; - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != NULL) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } sp3C = FALSE; if ((find_next_checkpoint_node(racer->checkpoint, racer->unk1C8))->unk36[racer->unk1CA] == 1) { @@ -174,13 +174,13 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra } obj68 = *obj->unk68; objModel = obj68->objModel; - xDiff = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; + diffX = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; while (racer->unkC < 0.0f) { - racer->unkC += xDiff; + racer->unkC += diffX; obj68->unk10 = -1; } - while (xDiff < racer->unkC) { - racer->unkC -= xDiff; + while (diffX < racer->unkC) { + racer->unkC -= diffX; obj68->unk10 = -1; } if ((obj68->unk10 == -1) && (obj->segment.unk38.byte.unk3B == 4)) { @@ -196,16 +196,16 @@ void update_bluey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *ra func_800AFC3C(obj, updateRate); fade_when_near_camera(obj, racer, 0x28); firstRacerObj = get_racer_object(0); - xDiff = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) < 700.0) { - sp48 = (arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + 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; } if (obj->segment.unk38.byte.unk3B == 1) { - if ((racer->unk1E7 & 0x1F) < 10) { + if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } diff --git a/src/vehicle_bubbler.c b/src/vehicle_bubbler.c index 1840257a..391178a0 100644 --- a/src/vehicle_bubbler.c +++ b/src/vehicle_bubbler.c @@ -50,14 +50,14 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * s16 animFrame; s16 sp52; s32 objectID; - f32 zDiff; + f32 diffZ; Object_68 *gfxData; s32 timer; UNUSED s32 pad; s32 sp38; ObjectModel *model; Object *firstRacerObj; - f32 xDiff; + f32 diffX; s32 temp2; set_boss_voice_clip_offset(D_800DCE40); @@ -105,22 +105,22 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * racer->unkC = 0.0f; } racer->attackType = ATTACK_NONE; - if (racer->unk148 != 0) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = obj->segment.z_velocity * obj->segment.z_velocity; - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != 0) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } gfxData = *obj->unk68; model = gfxData->objModel; - xDiff = (model->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; + diffX = (model->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; obj->segment.unk38.byte.unk3B = 1; racer->unkC += 2.0 * updateRateF; while (racer->unkC < 0.0f) { - racer->unkC += xDiff; + racer->unkC += diffX; gfxData->unk10 = -1; } - while (xDiff < racer->unkC) { - racer->unkC -= xDiff; + while (diffX < racer->unkC) { + racer->unkC -= diffX; gfxData->unk10 = -1; } if (gfxData->unk10 == -1 && obj->segment.unk38.byte.unk3B == 2) { @@ -153,16 +153,16 @@ void update_bubbler(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer * break; } firstRacerObj = get_racer_object(0); - xDiff = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) < 700.0) { - timer = (arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + 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); racer->headAngleTarget = timer; } if (obj->segment.unk38.byte.unk3B == 1) { - if ((racer->unk1E7 & 0x1F) < 10) { + if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } diff --git a/src/vehicle_rocket.c b/src/vehicle_rocket.c index 698db24f..09266c4e 100644 --- a/src/vehicle_rocket.c +++ b/src/vehicle_rocket.c @@ -47,8 +47,8 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s16 sp3E; s16 sp3C; s16 sp3A; - f32 zDiff; - f32 xDiff; + f32 diffZ; + f32 diffX; s32 sp2C; Object *someObj; Object *firstRacerObj; @@ -107,10 +107,10 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; - if (racer->unk148 != NULL) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = obj->segment.z_velocity * obj->segment.z_velocity; - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != NULL) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; obj->segment.x_velocity = 0.0f; @@ -121,13 +121,13 @@ void update_rocket(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unkC += 2.0 * updateRateF; gfxData = *obj->unk68; objModel = gfxData->objModel; - xDiff = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; - while (xDiff <= racer->unkC) { - racer->unkC -= xDiff; + diffX = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; + while (diffX <= racer->unkC) { + racer->unkC -= diffX; gfxData->unk10 = -1; } while (racer->unkC <= 0.0f) { - racer->unkC += xDiff; + racer->unkC += diffX; gfxData->unk10 = -1; } if (obj->segment.unk38.byte.unk3B == 1 && gfxData->unk10 == -1) { diff --git a/src/vehicle_smokey.c b/src/vehicle_smokey.c index 49b0e194..f5d95bbe 100644 --- a/src/vehicle_smokey.c +++ b/src/vehicle_smokey.c @@ -27,8 +27,8 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s16 sp5E; s16 sp5C; s16 sp5A; - f32 xDiff; - f32 zDiff; + f32 diffX; + f32 diffZ; ObjectModel *objModel; Object_68 *obj68; s32 sp44; @@ -85,10 +85,10 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; - if (racer->unk148 != 0) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = obj->segment.z_velocity * obj->segment.z_velocity; - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != 0) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; obj->segment.x_velocity = 0.0f; @@ -98,7 +98,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } obj68 = *obj->unk68; objModel = obj68->objModel; - xDiff = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; + diffX = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; var_f2 = (racer->velocity * updateRateF) * 0.45; if (var_f2 <= 0.0) { if (var_f2 > -2.0) { @@ -141,12 +141,12 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r default: break; } - while (xDiff <= racer->unkC) { - racer->unkC -= xDiff; + while (diffX <= racer->unkC) { + racer->unkC -= diffX; obj68->unk10 = -1; } while (racer->unkC <= 0.0f) { - racer->unkC += xDiff; + racer->unkC += diffX; obj68->unk10 = -1; } if (obj->segment.unk38.byte.unk3B == 2 && racer->unk1E2 == 0 && racer->velocity < -6.5) { @@ -207,10 +207,10 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r func_800AFC3C(obj, updateRate); fade_when_near_camera(obj, racer, 40); firstRacerObj = get_racer_object(0); - xDiff = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) < 700.0) { - sp44 = (arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + 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; } @@ -226,7 +226,7 @@ void update_smokey(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->headAngleTarget = sp44; } if (obj->segment.unk38.byte.unk3B >= 2) { - if ((racer->unk1E7 & 0x1F) < 10) { + if ((racer->miscAnimCounter & 0x1F) < 10) { racer->headAngleTarget >>= 1; } } @@ -251,9 +251,9 @@ void func_8005E204(Object *obj, Object_Racer *racer, f32 arg2, s32 objectID, s32 Object *newObj; s32 i; LevelObjectEntryCommon spawnObj; - f32 xDiff; - f32 zDiff; - f32 yDiff; + f32 diffX; + f32 diffZ; + f32 diffY; var_s6 = func_8000E988(&sp80, &sp7C); spawnObj.objectID = objectID; @@ -267,10 +267,10 @@ void func_8005E204(Object *obj, Object_Racer *racer, f32 arg2, s32 objectID, s32 if (temp_s1->behaviorId == BHV_UNK_6B) { temp_s2 = temp_s1->segment.unk3C_a.level_entry; if ((s8) temp_s2->animation.z_rotation == racer->lap + 1 || (s8) temp_s2->animation.z_rotation == 0) { - xDiff = temp_s1->segment.trans.x_position - obj->segment.trans.x_position; - yDiff = temp_s1->segment.trans.y_position - obj->segment.trans.y_position; - zDiff = temp_s1->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((xDiff * xDiff) + (yDiff * yDiff) + (zDiff * zDiff)) < (f32) ((s8) temp_s2->animation.x_rotation & 0xFF) * 4.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->unk78 == 0) { temp_s1->unk78 = 1; newObj = spawn_object(&spawnObj, 1); diff --git a/src/vehicle_tricky.c b/src/vehicle_tricky.c index ca41dc55..b32d847a 100644 --- a/src/vehicle_tricky.c +++ b/src/vehicle_tricky.c @@ -67,8 +67,8 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s16 sp56; s16 sp54; s16 sp52; - f32 xDiff; - f32 zDiff; + f32 diffX; + f32 diffZ; ObjectModel *objModel; s32 sp40; Object_68 *obj68; @@ -123,14 +123,14 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r } } racer->attackType = ATTACK_NONE; - if (racer->unk148 != NULL) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = obj->segment.z_velocity * obj->segment.z_velocity; - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != NULL) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = obj->segment.z_velocity * obj->segment.z_velocity; + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); } obj68 = *obj->unk68; objModel = obj68->objModel; - xDiff = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; + diffX = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 16) - 17; if (obj->segment.unk38.byte.unk3B != 3) { if (racer->velocity < -2.0) { obj->segment.unk38.byte.unk3B = 1; @@ -146,11 +146,11 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->unkC += 2.0 * updateRateF; } while (racer->unkC < 0.0f) { - racer->unkC += xDiff; + racer->unkC += diffX; obj68->unk10 = -1; } - while (xDiff < racer->unkC) { - racer->unkC -= xDiff; + while (diffX < racer->unkC) { + racer->unkC -= diffX; obj68->unk10 = -1; } if (obj68->unk10 == -1 && obj->segment.unk38.byte.unk3B == 3) { @@ -177,16 +177,16 @@ void update_tricky(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r break; } firstRacerObj = get_racer_object(0); - xDiff = firstRacerObj->segment.trans.x_position - obj->segment.trans.x_position; - zDiff = firstRacerObj->segment.trans.z_position - obj->segment.trans.z_position; - if (sqrtf((xDiff * xDiff) + (zDiff * zDiff)) < 700.0) { - sp40 = (arctan2_f(xDiff, zDiff) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; + 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) { + sp40 = (arctan2_f(diffX, diffZ) - (obj->segment.trans.y_rotation & 0xFFFF)) + 0x8000; WRAP(sp40, -0x8000, 0x8000); CLAMP(sp40, -sp38, sp38); racer->headAngleTarget = sp40; } if (obj->segment.unk38.byte.unk3B == 1) { - if ((racer->unk1E7 & 0x1F) < 0xA) { + if ((racer->miscAnimCounter & 0x1F) < 0xA) { racer->headAngleTarget >>= 1; } } diff --git a/src/vehicle_wizpig.c b/src/vehicle_wizpig.c index 5825ec28..e88d607b 100644 --- a/src/vehicle_wizpig.c +++ b/src/vehicle_wizpig.c @@ -46,8 +46,8 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r s16 sp3C; s16 sp3A; s16 sp38; - f32 zDiff; - f32 xDiff; + f32 diffZ; + f32 diffX; f32 var_f12; s32 sp28; Object *firstRacerObj; @@ -106,10 +106,10 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r obj->segment.y_velocity += 4.0; } racer->attackType = ATTACK_NONE; - if (racer->unk148 != NULL) { - xDiff = obj->segment.x_velocity * obj->segment.x_velocity; - zDiff = (obj->segment.z_velocity * obj->segment.z_velocity); - racer->velocity = -sqrtf((xDiff * xDiff) + (zDiff * zDiff)); + if (racer->approachTarget != NULL) { + diffX = obj->segment.x_velocity * obj->segment.x_velocity; + diffZ = (obj->segment.z_velocity * obj->segment.z_velocity); + racer->velocity = -sqrtf((diffX * diffX) + (diffZ * diffZ)); if (racer->velocity > -0.5) { racer->velocity = 0.0f; obj->segment.x_velocity = 0.0f; @@ -125,7 +125,7 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r racer->x_rotation_offset = -obj->segment.trans.x_rotation; gfxData = *obj->unk68; objModel = gfxData->objModel; - xDiff = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 0x10) - 0x11; + diffX = (objModel->animations[obj->segment.unk38.byte.unk3B].unk4 * 0x10) - 0x11; var_f12 = (racer->velocity * updateRateF) * 0.45; if (var_f12 <= 0.0) { if (var_f12 > -2.0) { @@ -168,12 +168,12 @@ void update_wizpig(s32 updateRate, f32 updateRateF, Object *obj, Object_Racer *r break; } - while (xDiff <= racer->unkC) { - racer->unkC -= xDiff; + while (diffX <= racer->unkC) { + racer->unkC -= diffX; gfxData->unk10 = -1; } while (racer->unkC <= 0.0f){ - racer->unkC += xDiff; + racer->unkC += diffX; gfxData->unk10 = -1; } if (obj->segment.unk38.byte.unk3B == 2 && sp38 != 0) { diff --git a/src/waves.c b/src/waves.c index 3ca81263..199d7047 100644 --- a/src/waves.c +++ b/src/waves.c @@ -255,12 +255,13 @@ GLOBAL_ASM("asm/non_matchings/waves/func_800BA4B8.s") GLOBAL_ASM("asm/non_matchings/waves/func_800BA8E4.s") GLOBAL_ASM("asm/non_matchings/waves/func_800BB2F4.s") -void func_800BBDDC(s32 arg0) { - func_800BBE08(); - func_800BBF78(arg0); +void func_800BBDDC(LevelModel *level, LevelHeader *header) { + func_800BBE08(level, (unk800BBE08_arg1 *) header); + func_800BBF78(level); } -void func_800BBE08(LevelModel *arg0, unk800BBE08_arg1 *arg1) { +//TODO: arg1 should be a LevelHeader +void func_800BBE08(LevelModel *level, unk800BBE08_arg1 *arg1) { s16 numSegments; s32 j; TriangleBatchInfo *curBatch; @@ -269,11 +270,11 @@ void func_800BBE08(LevelModel *arg0, unk800BBE08_arg1 *arg1) { LevelModelSegmentBoundingBox *bb; LevelModelSegment *segment; - numSegments = arg0->numberOfSegments; + numSegments = level->numberOfSegments; curBatch = 0; for (i = 0; (curBatch == 0) && (i < numSegments); i++) { - segment = &arg0->segments[i]; + segment = &level->segments[i]; for (j = 0; (curBatch == 0) && (j < segment->numberOfBatches); j++) { if ((segment->batches[j].flags & 0x01002100) == 0x01002000) { curBatch = &segment->batches[j]; @@ -286,13 +287,13 @@ void func_800BBE08(LevelModel *arg0, unk800BBE08_arg1 *arg1) { } else { i--; } - bb = &arg0->segmentsBoundingBoxes[i]; + bb = &level->segmentsBoundingBoxes[i]; D_8012A0A8 = bb->x2 - bb->x1; D_8012A0AC = bb->z2 - bb->z1; D_8012A0B0 = bb->x1; D_8012A0B4 = bb->z1; D_8012A07C = curBatch; - D_8012A080 = arg0->textures[curBatch->textureIndex].texture; + D_8012A080 = level->textures[curBatch->textureIndex].texture; temp_t6 = (curBatch->flags & 0x70000000) >> 0x1C; if (temp_t6 > 0) { D_800E3180 = arg1->unk70[temp_t6]; diff --git a/src/waves.h b/src/waves.h index 4ad25c98..d9c34f5d 100644 --- a/src/waves.h +++ b/src/waves.h @@ -92,17 +92,17 @@ typedef struct unk800BFC54_arg0 { void func_800B7D20(void); void func_800B8B8C(void); s32 func_800B9228(LevelModelSegment *arg0); -void func_800BBDDC(s32 arg0); +void func_800BBDDC(LevelModel *level, LevelHeader *header); void func_800BFE98(s32 arg0); void func_800B8134(unk800B8134 *arg0); -void func_800BBE08(); +void func_800BBE08(LevelModel *level, unk800BBE08_arg1 *arg1); void obj_loop_wavepower(Object *obj); void func_800BFC54(unk800BFC54_arg0 *arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4); void func_800BF3E4(s32 arg0); Object_64 *func_800BE654(s16, f32, f32); // Non Matching f32 func_800BEEB4(Object_64 *); // Non Matching -void func_800BBF78(s32 arg0); // Non Matching +void func_800BBF78(LevelModel *arg0); // Non Matching f32 func_800BB2F4(s32, f32, f32, f32*); void func_800B8C04(s32, s32, s32, s32, s32); void func_800BF524(Object *);