diff --git a/Makefile b/Makefile index b5caca3f..73ff2a0a 100755 --- a/Makefile +++ b/Makefile @@ -210,7 +210,7 @@ endif CC_CHECK_CFLAGS := -fsyntax-only -funsigned-char $(INCLUDE_CFLAGS) $(DEF_INC_CFLAGS) -std=gnu90 -Wall -Wextra -Wno-format-security -Wno-main -DNON_MATCHING -DAVOID_UB -D_LANGUAGE_C -DNDEBUG -Werror-implicit-function-declaration #Warnings to ignore -CC_CHECK_CFLAGS += -Wno-builtin-declaration-mismatch -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast +CC_CHECK_CFLAGS += -Wno-builtin-declaration-mismatch -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -Wno-switch ####################### ASSETS ######################### diff --git a/README.md b/README.md index c27142a5..02606244 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the Currently, only the US 1.0 version of the game is supported. US 1.1, EU 1.0, EU 1.1, and JP are not supported at this time. -As of November 18, 2023, this is our current score: +As of November 30, 2023, this is our current score: -    Decomp progress: 65.67% +    Decomp progress: 65.92%     Documentation progress: 35.21% @@ -125,15 +125,15 @@ s32 is_drumstick_unlocked(void) { ``` -As of November 18, 2023, this is our current score: +As of November 30, 2023, this is our current score: ``` ==================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 65.67% Complete (68.46% NON_MATCHING) --------------- - # Decompiled functions: 1676 - # GLOBAL_ASM remaining: 169 - # NON_MATCHING functions: 15 - # NON_EQUIVALENT WIP functions: 52 + -------------- 65.92% Complete (68.87% NON_MATCHING) --------------- + # Decompiled functions: 1678 + # GLOBAL_ASM remaining: 167 + # NON_MATCHING functions: 16 + # NON_EQUIVALENT WIP functions: 54 --------------------------- Game Status ---------------------------- Balloons: 31/47, Keys: 3/4, Trophies: 3/5 T.T. Amulets: 3/4, Wizpig Amulets: 3/4 diff --git a/asm/non_matchings/particles/func_800AFC3C.s b/asm/non_matchings/particles/func_800AFC3C.s deleted file mode 100644 index 52eeb3a5..00000000 --- a/asm/non_matchings/particles/func_800AFC3C.s +++ /dev/null @@ -1,153 +0,0 @@ -glabel func_800AFC3C -/* 0B083C 800AFC3C 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* 0B0840 800AFC40 AFBF0034 */ sw $ra, 0x34($sp) -/* 0B0844 800AFC44 AFB60030 */ sw $s6, 0x30($sp) -/* 0B0848 800AFC48 AFB5002C */ sw $s5, 0x2c($sp) -/* 0B084C 800AFC4C AFB40028 */ sw $s4, 0x28($sp) -/* 0B0850 800AFC50 AFB30024 */ sw $s3, 0x24($sp) -/* 0B0854 800AFC54 AFB20020 */ sw $s2, 0x20($sp) -/* 0B0858 800AFC58 AFB1001C */ sw $s1, 0x1c($sp) -/* 0B085C 800AFC5C AFB00018 */ sw $s0, 0x18($sp) -/* 0B0860 800AFC60 8C8E0040 */ lw $t6, 0x40($a0) -/* 0B0864 800AFC64 8C950074 */ lw $s5, 0x74($a0) -/* 0B0868 800AFC68 81C70057 */ lb $a3, 0x57($t6) -/* 0B086C 800AFC6C 00809025 */ move $s2, $a0 -/* 0B0870 800AFC70 00A0B025 */ move $s6, $a1 -/* 0B0874 800AFC74 18E0006F */ blez $a3, .L800AFE34 -/* 0B0878 800AFC78 00009825 */ move $s3, $zero -/* 0B087C 800AFC7C 0000A025 */ move $s4, $zero -.L800AFC80: -/* 0B0880 800AFC80 8E46006C */ lw $a2, 0x6c($s2) -/* 0B0884 800AFC84 32AF0001 */ andi $t7, $s5, 1 -/* 0B0888 800AFC88 11E00032 */ beqz $t7, .L800AFD54 -/* 0B088C 800AFC8C 00D41821 */ addu $v1, $a2, $s4 -/* 0B0890 800AFC90 84620004 */ lh $v0, 4($v1) -/* 0B0894 800AFC94 02402025 */ move $a0, $s2 -/* 0B0898 800AFC98 30588000 */ andi $t8, $v0, 0x8000 -/* 0B089C 800AFC9C 17000009 */ bnez $t8, .L800AFCC4 -/* 0B08A0 800AFCA0 30594000 */ andi $t9, $v0, 0x4000 -/* 0B08A4 800AFCA4 0C02BD4B */ jal func_800AF52C -/* 0B08A8 800AFCA8 02602825 */ move $a1, $s3 -/* 0B08AC 800AFCAC 8E46006C */ lw $a2, 0x6c($s2) -/* 0B08B0 800AFCB0 00000000 */ nop -/* 0B08B4 800AFCB4 00D41821 */ addu $v1, $a2, $s4 -/* 0B08B8 800AFCB8 84620004 */ lh $v0, 4($v1) -/* 0B08BC 800AFCBC 00000000 */ nop -/* 0B08C0 800AFCC0 30594000 */ andi $t9, $v0, 0x4000 -.L800AFCC4: -/* 0B08C4 800AFCC4 13200007 */ beqz $t9, .L800AFCE4 -/* 0B08C8 800AFCC8 30490400 */ andi $t1, $v0, 0x400 -/* 0B08CC 800AFCCC 00134140 */ sll $t0, $s3, 5 -/* 0B08D0 800AFCD0 00C82821 */ addu $a1, $a2, $t0 -/* 0B08D4 800AFCD4 0C02BF97 */ jal func_800AFE5C -/* 0B08D8 800AFCD8 02402025 */ move $a0, $s2 -/* 0B08DC 800AFCDC 10000019 */ b .L800AFD44 -/* 0B08E0 800AFCE0 8E590040 */ lw $t9, 0x40($s2) -.L800AFCE4: -/* 0B08E4 800AFCE4 11200006 */ beqz $t1, .L800AFD00 -/* 0B08E8 800AFCE8 02402025 */ move $a0, $s2 -/* 0B08EC 800AFCEC 00135140 */ sll $t2, $s3, 5 -/* 0B08F0 800AFCF0 0C02BF97 */ jal func_800AFE5C -/* 0B08F4 800AFCF4 00CA2821 */ addu $a1, $a2, $t2 -/* 0B08F8 800AFCF8 10000012 */ b .L800AFD44 -/* 0B08FC 800AFCFC 8E590040 */ lw $t9, 0x40($s2) -.L800AFD00: -/* 0B0900 800AFD00 846B000A */ lh $t3, 0xa($v1) -/* 0B0904 800AFD04 02402025 */ move $a0, $s2 -/* 0B0908 800AFD08 01766021 */ addu $t4, $t3, $s6 -/* 0B090C 800AFD0C A46C000A */ sh $t4, 0xa($v1) -/* 0B0910 800AFD10 8E46006C */ lw $a2, 0x6c($s2) -/* 0B0914 800AFD14 0013C140 */ sll $t8, $s3, 5 -/* 0B0918 800AFD18 00D41821 */ addu $v1, $a2, $s4 -/* 0B091C 800AFD1C 8C6E0000 */ lw $t6, ($v1) -/* 0B0920 800AFD20 846D000A */ lh $t5, 0xa($v1) -/* 0B0924 800AFD24 85CF0040 */ lh $t7, 0x40($t6) -/* 0B0928 800AFD28 00000000 */ nop -/* 0B092C 800AFD2C 01AF082A */ slt $at, $t5, $t7 -/* 0B0930 800AFD30 14200003 */ bnez $at, .L800AFD40 -/* 0B0934 800AFD34 00000000 */ nop -/* 0B0938 800AFD38 0C02BF97 */ jal func_800AFE5C -/* 0B093C 800AFD3C 00D82821 */ addu $a1, $a2, $t8 -.L800AFD40: -/* 0B0940 800AFD40 8E590040 */ lw $t9, 0x40($s2) -.L800AFD44: -/* 0B0944 800AFD44 00000000 */ nop -/* 0B0948 800AFD48 83270057 */ lb $a3, 0x57($t9) -/* 0B094C 800AFD4C 10000034 */ b .L800AFE20 -/* 0B0950 800AFD50 26730001 */ addiu $s3, $s3, 1 -.L800AFD54: -/* 0B0954 800AFD54 84620004 */ lh $v0, 4($v1) -/* 0B0958 800AFD58 00000000 */ nop -/* 0B095C 800AFD5C 30488000 */ andi $t0, $v0, 0x8000 -/* 0B0960 800AFD60 1100002E */ beqz $t0, .L800AFE1C -/* 0B0964 800AFD64 30494000 */ andi $t1, $v0, 0x4000 -/* 0B0968 800AFD68 11200015 */ beqz $t1, .L800AFDC0 -/* 0B096C 800AFD6C 304C0400 */ andi $t4, $v0, 0x400 -/* 0B0970 800AFD70 00135140 */ sll $t2, $s3, 5 -/* 0B0974 800AFD74 00CA8821 */ addu $s1, $a2, $t2 -/* 0B0978 800AFD78 92300006 */ lbu $s0, 6($s1) -/* 0B097C 800AFD7C 02202825 */ move $a1, $s1 -/* 0B0980 800AFD80 2610FFC0 */ addiu $s0, $s0, -0x40 -/* 0B0984 800AFD84 06010002 */ bgez $s0, .L800AFD90 -/* 0B0988 800AFD88 02402025 */ move $a0, $s2 -/* 0B098C 800AFD8C 00008025 */ move $s0, $zero -.L800AFD90: -/* 0B0990 800AFD90 0C02BF97 */ jal func_800AFE5C -/* 0B0994 800AFD94 A2300006 */ sb $s0, 6($s1) -/* 0B0998 800AFD98 16000004 */ bnez $s0, .L800AFDAC -/* 0B099C 800AFD9C A2300006 */ sb $s0, 6($s1) -/* 0B09A0 800AFDA0 02402025 */ move $a0, $s2 -/* 0B09A4 800AFDA4 0C02BDB9 */ jal func_800AF6E4 -/* 0B09A8 800AFDA8 02602825 */ move $a1, $s3 -.L800AFDAC: -/* 0B09AC 800AFDAC 8E4B0040 */ lw $t3, 0x40($s2) -/* 0B09B0 800AFDB0 00000000 */ nop -/* 0B09B4 800AFDB4 81670057 */ lb $a3, 0x57($t3) -/* 0B09B8 800AFDB8 10000019 */ b .L800AFE20 -/* 0B09BC 800AFDBC 26730001 */ addiu $s3, $s3, 1 -.L800AFDC0: -/* 0B09C0 800AFDC0 11800010 */ beqz $t4, .L800AFE04 -/* 0B09C4 800AFDC4 02402025 */ move $a0, $s2 -/* 0B09C8 800AFDC8 00137140 */ sll $t6, $s3, 5 -/* 0B09CC 800AFDCC 344D0200 */ ori $t5, $v0, 0x200 -/* 0B09D0 800AFDD0 00CE2021 */ addu $a0, $a2, $t6 -/* 0B09D4 800AFDD4 A46D0004 */ sh $t5, 4($v1) -/* 0B09D8 800AFDD8 908F0006 */ lbu $t7, 6($a0) -/* 0B09DC 800AFDDC 02402025 */ move $a0, $s2 -/* 0B09E0 800AFDE0 15E00003 */ bnez $t7, .L800AFDF0 -/* 0B09E4 800AFDE4 00000000 */ nop -/* 0B09E8 800AFDE8 0C02BDB9 */ jal func_800AF6E4 -/* 0B09EC 800AFDEC 02602825 */ move $a1, $s3 -.L800AFDF0: -/* 0B09F0 800AFDF0 8E580040 */ lw $t8, 0x40($s2) -/* 0B09F4 800AFDF4 00000000 */ nop -/* 0B09F8 800AFDF8 83070057 */ lb $a3, 0x57($t8) -/* 0B09FC 800AFDFC 10000008 */ b .L800AFE20 -/* 0B0A00 800AFE00 26730001 */ addiu $s3, $s3, 1 -.L800AFE04: -/* 0B0A04 800AFE04 0C02BDB9 */ jal func_800AF6E4 -/* 0B0A08 800AFE08 02602825 */ move $a1, $s3 -/* 0B0A0C 800AFE0C 8E590040 */ lw $t9, 0x40($s2) -/* 0B0A10 800AFE10 00000000 */ nop -/* 0B0A14 800AFE14 83270057 */ lb $a3, 0x57($t9) -/* 0B0A18 800AFE18 00000000 */ nop -.L800AFE1C: -/* 0B0A1C 800AFE1C 26730001 */ addiu $s3, $s3, 1 -.L800AFE20: -/* 0B0A20 800AFE20 0267082A */ slt $at, $s3, $a3 -/* 0B0A24 800AFE24 00154042 */ srl $t0, $s5, 1 -/* 0B0A28 800AFE28 26940020 */ addiu $s4, $s4, 0x20 -/* 0B0A2C 800AFE2C 1420FF94 */ bnez $at, .L800AFC80 -/* 0B0A30 800AFE30 0100A825 */ move $s5, $t0 -.L800AFE34: -/* 0B0A34 800AFE34 8FBF0034 */ lw $ra, 0x34($sp) -/* 0B0A38 800AFE38 8FB00018 */ lw $s0, 0x18($sp) -/* 0B0A3C 800AFE3C 8FB1001C */ lw $s1, 0x1c($sp) -/* 0B0A40 800AFE40 8FB20020 */ lw $s2, 0x20($sp) -/* 0B0A44 800AFE44 8FB30024 */ lw $s3, 0x24($sp) -/* 0B0A48 800AFE48 8FB40028 */ lw $s4, 0x28($sp) -/* 0B0A4C 800AFE4C 8FB5002C */ lw $s5, 0x2c($sp) -/* 0B0A50 800AFE50 8FB60030 */ lw $s6, 0x30($sp) -/* 0B0A54 800AFE54 03E00008 */ jr $ra -/* 0B0A58 800AFE58 27BD0038 */ addiu $sp, $sp, 0x38 - diff --git a/asm/non_matchings/particles/func_800B3E64.s b/asm/non_matchings/particles/func_800B3E64.s deleted file mode 100644 index 485206a2..00000000 --- a/asm/non_matchings/particles/func_800B3E64.s +++ /dev/null @@ -1,399 +0,0 @@ -glabel func_800B3E64 -/* 0B4A64 800B3E64 27BDFF70 */ addiu $sp, $sp, -0x90 -/* 0B4A68 800B3E68 AFBF0044 */ sw $ra, 0x44($sp) -/* 0B4A6C 800B3E6C AFBE0040 */ sw $fp, 0x40($sp) -/* 0B4A70 800B3E70 AFB7003C */ sw $s7, 0x3c($sp) -/* 0B4A74 800B3E74 AFB60038 */ sw $s6, 0x38($sp) -/* 0B4A78 800B3E78 AFB50034 */ sw $s5, 0x34($sp) -/* 0B4A7C 800B3E7C AFB40030 */ sw $s4, 0x30($sp) -/* 0B4A80 800B3E80 AFB3002C */ sw $s3, 0x2c($sp) -/* 0B4A84 800B3E84 AFB20028 */ sw $s2, 0x28($sp) -/* 0B4A88 800B3E88 AFB10024 */ sw $s1, 0x24($sp) -/* 0B4A8C 800B3E8C AFB00020 */ sw $s0, 0x20($sp) -/* 0B4A90 800B3E90 E7B50018 */ swc1 $f21, 0x18($sp) -/* 0B4A94 800B3E94 E7B4001C */ swc1 $f20, 0x1c($sp) -/* 0B4A98 800B3E98 8C960070 */ lw $s6, 0x70($a0) -/* 0B4A9C 800B3E9C 0000A825 */ move $s5, $zero -/* 0B4AA0 800B3EA0 12C0016B */ beqz $s6, .L800B4450 -/* 0B4AA4 800B3EA4 00009825 */ move $s3, $zero -/* 0B4AA8 800B3EA8 8ECE000C */ lw $t6, 0xc($s6) -/* 0B4AAC 800B3EAC 00000000 */ nop -/* 0B4AB0 800B3EB0 11C00168 */ beqz $t6, .L800B4454 -/* 0B4AB4 800B3EB4 8FBF0044 */ lw $ra, 0x44($sp) -/* 0B4AB8 800B3EB8 92C20006 */ lbu $v0, 6($s6) -/* 0B4ABC 800B3EBC 27BE007C */ addiu $fp, $sp, 0x7c -/* 0B4AC0 800B3EC0 2442FFFF */ addiu $v0, $v0, -1 -/* 0B4AC4 800B3EC4 04400162 */ bltz $v0, .L800B4450 -/* 0B4AC8 800B3EC8 00029080 */ sll $s2, $v0, 2 -/* 0B4ACC 800B3ECC 4480A000 */ mtc1 $zero, $f20 -/* 0B4AD0 800B3ED0 27B70070 */ addiu $s7, $sp, 0x70 -/* 0B4AD4 800B3ED4 2414000A */ li $s4, 10 -.L800B3ED8: -/* 0B4AD8 800B3ED8 8ECF000C */ lw $t7, 0xc($s6) -/* 0B4ADC 800B3EDC 02E02825 */ move $a1, $s7 -/* 0B4AE0 800B3EE0 01F2C021 */ addu $t8, $t7, $s2 -/* 0B4AE4 800B3EE4 8F100000 */ lw $s0, ($t8) -/* 0B4AE8 800B3EE8 00000000 */ nop -/* 0B4AEC 800B3EEC 8619003A */ lh $t9, 0x3a($s0) -/* 0B4AF0 800B3EF0 02002025 */ move $a0, $s0 -/* 0B4AF4 800B3EF4 13200157 */ beqz $t9, .L800B4454 -/* 0B4AF8 800B3EF8 8FBF0044 */ lw $ra, 0x44($sp) -/* 0B4AFC 800B3EFC C6040008 */ lwc1 $f4, 8($s0) -/* 0B4B00 800B3F00 8E110044 */ lw $s1, 0x44($s0) -/* 0B4B04 800B3F04 E7B40074 */ swc1 $f20, 0x74($sp) -/* 0B4B08 800B3F08 E7B40078 */ swc1 $f20, 0x78($sp) -/* 0B4B0C 800B3F0C 0C01C0C8 */ jal f32_vec3_apply_object_rotation -/* 0B4B10 800B3F10 E7A40070 */ swc1 $f4, 0x70($sp) -/* 0B4B14 800B3F14 E7B4007C */ swc1 $f20, 0x7c($sp) -/* 0B4B18 800B3F18 C6060008 */ lwc1 $f6, 8($s0) -/* 0B4B1C 800B3F1C E7B40084 */ swc1 $f20, 0x84($sp) -/* 0B4B20 800B3F20 02002025 */ move $a0, $s0 -/* 0B4B24 800B3F24 03C02825 */ move $a1, $fp -/* 0B4B28 800B3F28 0C01C0C8 */ jal f32_vec3_apply_object_rotation -/* 0B4B2C 800B3F2C E7A60080 */ swc1 $f6, 0x80($sp) -/* 0B4B30 800B3F30 92090075 */ lbu $t1, 0x75($s0) -/* 0B4B34 800B3F34 C7A80070 */ lwc1 $f8, 0x70($sp) -/* 0B4B38 800B3F38 000950C0 */ sll $t2, $t1, 3 -/* 0B4B3C 800B3F3C 01540019 */ multu $t2, $s4 -/* 0B4B40 800B3F40 C60A000C */ lwc1 $f10, 0xc($s0) -/* 0B4B44 800B3F44 8E280008 */ lw $t0, 8($s1) -/* 0B4B48 800B3F48 460A4400 */ add.s $f16, $f8, $f10 -/* 0B4B4C 800B3F4C 444CF800 */ cfc1 $t4, $31 -/* 0B4B50 800B3F50 00000000 */ nop -/* 0B4B54 800B3F54 35810003 */ ori $at, $t4, 3 -/* 0B4B58 800B3F58 38210002 */ xori $at, $at, 2 -/* 0B4B5C 800B3F5C 44C1F800 */ ctc1 $at, $31 -/* 0B4B60 800B3F60 00000000 */ nop -/* 0B4B64 800B3F64 460084A4 */ cvt.w.s $f18, $f16 -/* 0B4B68 800B3F68 00005812 */ mflo $t3 -/* 0B4B6C 800B3F6C 440D9000 */ mfc1 $t5, $f18 -/* 0B4B70 800B3F70 010B1821 */ addu $v1, $t0, $t3 -/* 0B4B74 800B3F74 A46D0028 */ sh $t5, 0x28($v1) -/* 0B4B78 800B3F78 44CCF800 */ ctc1 $t4, $31 -/* 0B4B7C 800B3F7C C6060010 */ lwc1 $f6, 0x10($s0) -/* 0B4B80 800B3F80 C7A40074 */ lwc1 $f4, 0x74($sp) -/* 0B4B84 800B3F84 24630046 */ addiu $v1, $v1, 0x46 -/* 0B4B88 800B3F88 46062200 */ add.s $f8, $f4, $f6 -/* 0B4B8C 800B3F8C 444EF800 */ cfc1 $t6, $31 -/* 0B4B90 800B3F90 00000000 */ nop -/* 0B4B94 800B3F94 35C10003 */ ori $at, $t6, 3 -/* 0B4B98 800B3F98 38210002 */ xori $at, $at, 2 -/* 0B4B9C 800B3F9C 44C1F800 */ ctc1 $at, $31 -/* 0B4BA0 800B3FA0 00000000 */ nop -/* 0B4BA4 800B3FA4 460042A4 */ cvt.w.s $f10, $f8 -/* 0B4BA8 800B3FA8 440F5000 */ mfc1 $t7, $f10 -/* 0B4BAC 800B3FAC 44CEF800 */ ctc1 $t6, $31 -/* 0B4BB0 800B3FB0 A46FFFE4 */ sh $t7, -0x1c($v1) -/* 0B4BB4 800B3FB4 C6120014 */ lwc1 $f18, 0x14($s0) -/* 0B4BB8 800B3FB8 C7B00078 */ lwc1 $f16, 0x78($sp) -/* 0B4BBC 800B3FBC 00000000 */ nop -/* 0B4BC0 800B3FC0 46128100 */ add.s $f4, $f16, $f18 -/* 0B4BC4 800B3FC4 4458F800 */ cfc1 $t8, $31 -/* 0B4BC8 800B3FC8 00000000 */ nop -/* 0B4BCC 800B3FCC 37010003 */ ori $at, $t8, 3 -/* 0B4BD0 800B3FD0 38210002 */ xori $at, $at, 2 -/* 0B4BD4 800B3FD4 44C1F800 */ ctc1 $at, $31 -/* 0B4BD8 800B3FD8 00000000 */ nop -/* 0B4BDC 800B3FDC 460021A4 */ cvt.w.s $f6, $f4 -/* 0B4BE0 800B3FE0 44193000 */ mfc1 $t9, $f6 -/* 0B4BE4 800B3FE4 44D8F800 */ ctc1 $t8, $31 -/* 0B4BE8 800B3FE8 A479FFE6 */ sh $t9, -0x1a($v1) -/* 0B4BEC 800B3FEC 9209006C */ lbu $t1, 0x6c($s0) -/* 0B4BF0 800B3FF0 00000000 */ nop -/* 0B4BF4 800B3FF4 A069FFE8 */ sb $t1, -0x18($v1) -/* 0B4BF8 800B3FF8 920A006D */ lbu $t2, 0x6d($s0) -/* 0B4BFC 800B3FFC 00000000 */ nop -/* 0B4C00 800B4000 A06AFFE9 */ sb $t2, -0x17($v1) -/* 0B4C04 800B4004 9208006E */ lbu $t0, 0x6e($s0) -/* 0B4C08 800B4008 00000000 */ nop -/* 0B4C0C 800B400C A068FFEA */ sb $t0, -0x16($v1) -/* 0B4C10 800B4010 860B005C */ lh $t3, 0x5c($s0) -/* 0B4C14 800B4014 00000000 */ nop -/* 0B4C18 800B4018 000B6203 */ sra $t4, $t3, 8 -/* 0B4C1C 800B401C A06CFFEB */ sb $t4, -0x15($v1) -/* 0B4C20 800B4020 C7A8007C */ lwc1 $f8, 0x7c($sp) -/* 0B4C24 800B4024 C60A000C */ lwc1 $f10, 0xc($s0) -/* 0B4C28 800B4028 00000000 */ nop -/* 0B4C2C 800B402C 460A4400 */ add.s $f16, $f8, $f10 -/* 0B4C30 800B4030 444DF800 */ cfc1 $t5, $31 -/* 0B4C34 800B4034 00000000 */ nop -/* 0B4C38 800B4038 35A10003 */ ori $at, $t5, 3 -/* 0B4C3C 800B403C 38210002 */ xori $at, $at, 2 -/* 0B4C40 800B4040 44C1F800 */ ctc1 $at, $31 -/* 0B4C44 800B4044 00000000 */ nop -/* 0B4C48 800B4048 460084A4 */ cvt.w.s $f18, $f16 -/* 0B4C4C 800B404C 440E9000 */ mfc1 $t6, $f18 -/* 0B4C50 800B4050 44CDF800 */ ctc1 $t5, $31 -/* 0B4C54 800B4054 A46EFFEC */ sh $t6, -0x14($v1) -/* 0B4C58 800B4058 C7A40080 */ lwc1 $f4, 0x80($sp) -/* 0B4C5C 800B405C C6060010 */ lwc1 $f6, 0x10($s0) -/* 0B4C60 800B4060 00000000 */ nop -/* 0B4C64 800B4064 46062200 */ add.s $f8, $f4, $f6 -/* 0B4C68 800B4068 444FF800 */ cfc1 $t7, $31 -/* 0B4C6C 800B406C 00000000 */ nop -/* 0B4C70 800B4070 35E10003 */ ori $at, $t7, 3 -/* 0B4C74 800B4074 38210002 */ xori $at, $at, 2 -/* 0B4C78 800B4078 44C1F800 */ ctc1 $at, $31 -/* 0B4C7C 800B407C 00000000 */ nop -/* 0B4C80 800B4080 460042A4 */ cvt.w.s $f10, $f8 -/* 0B4C84 800B4084 44185000 */ mfc1 $t8, $f10 -/* 0B4C88 800B4088 44CFF800 */ ctc1 $t7, $31 -/* 0B4C8C 800B408C A478FFEE */ sh $t8, -0x12($v1) -/* 0B4C90 800B4090 C7B00084 */ lwc1 $f16, 0x84($sp) -/* 0B4C94 800B4094 C6120014 */ lwc1 $f18, 0x14($s0) -/* 0B4C98 800B4098 00000000 */ nop -/* 0B4C9C 800B409C 46128100 */ add.s $f4, $f16, $f18 -/* 0B4CA0 800B40A0 4459F800 */ cfc1 $t9, $31 -/* 0B4CA4 800B40A4 00000000 */ nop -/* 0B4CA8 800B40A8 37210003 */ ori $at, $t9, 3 -/* 0B4CAC 800B40AC 38210002 */ xori $at, $at, 2 -/* 0B4CB0 800B40B0 44C1F800 */ ctc1 $at, $31 -/* 0B4CB4 800B40B4 00000000 */ nop -/* 0B4CB8 800B40B8 460021A4 */ cvt.w.s $f6, $f4 -/* 0B4CBC 800B40BC 44093000 */ mfc1 $t1, $f6 -/* 0B4CC0 800B40C0 44D9F800 */ ctc1 $t9, $31 -/* 0B4CC4 800B40C4 A469FFF0 */ sh $t1, -0x10($v1) -/* 0B4CC8 800B40C8 920A006C */ lbu $t2, 0x6c($s0) -/* 0B4CCC 800B40CC 00000000 */ nop -/* 0B4CD0 800B40D0 A06AFFF2 */ sb $t2, -0xe($v1) -/* 0B4CD4 800B40D4 9208006D */ lbu $t0, 0x6d($s0) -/* 0B4CD8 800B40D8 00000000 */ nop -/* 0B4CDC 800B40DC A068FFF3 */ sb $t0, -0xd($v1) -/* 0B4CE0 800B40E0 920B006E */ lbu $t3, 0x6e($s0) -/* 0B4CE4 800B40E4 00000000 */ nop -/* 0B4CE8 800B40E8 A06BFFF4 */ sb $t3, -0xc($v1) -/* 0B4CEC 800B40EC 860C005C */ lh $t4, 0x5c($s0) -/* 0B4CF0 800B40F0 00000000 */ nop -/* 0B4CF4 800B40F4 000C6A03 */ sra $t5, $t4, 8 -/* 0B4CF8 800B40F8 A06DFFF5 */ sb $t5, -0xb($v1) -/* 0B4CFC 800B40FC C608000C */ lwc1 $f8, 0xc($s0) -/* 0B4D00 800B4100 C7AA0070 */ lwc1 $f10, 0x70($sp) -/* 0B4D04 800B4104 00000000 */ nop -/* 0B4D08 800B4108 460A4401 */ sub.s $f16, $f8, $f10 -/* 0B4D0C 800B410C 444EF800 */ cfc1 $t6, $31 -/* 0B4D10 800B4110 00000000 */ nop -/* 0B4D14 800B4114 35C10003 */ ori $at, $t6, 3 -/* 0B4D18 800B4118 38210002 */ xori $at, $at, 2 -/* 0B4D1C 800B411C 44C1F800 */ ctc1 $at, $31 -/* 0B4D20 800B4120 00000000 */ nop -/* 0B4D24 800B4124 460084A4 */ cvt.w.s $f18, $f16 -/* 0B4D28 800B4128 440F9000 */ mfc1 $t7, $f18 -/* 0B4D2C 800B412C 44CEF800 */ ctc1 $t6, $31 -/* 0B4D30 800B4130 A46FFFF6 */ sh $t7, -0xa($v1) -/* 0B4D34 800B4134 C6040010 */ lwc1 $f4, 0x10($s0) -/* 0B4D38 800B4138 C7A60074 */ lwc1 $f6, 0x74($sp) -/* 0B4D3C 800B413C 00000000 */ nop -/* 0B4D40 800B4140 46062201 */ sub.s $f8, $f4, $f6 -/* 0B4D44 800B4144 4458F800 */ cfc1 $t8, $31 -/* 0B4D48 800B4148 00000000 */ nop -/* 0B4D4C 800B414C 37010003 */ ori $at, $t8, 3 -/* 0B4D50 800B4150 38210002 */ xori $at, $at, 2 -/* 0B4D54 800B4154 44C1F800 */ ctc1 $at, $31 -/* 0B4D58 800B4158 00000000 */ nop -/* 0B4D5C 800B415C 460042A4 */ cvt.w.s $f10, $f8 -/* 0B4D60 800B4160 44195000 */ mfc1 $t9, $f10 -/* 0B4D64 800B4164 44D8F800 */ ctc1 $t8, $31 -/* 0B4D68 800B4168 A479FFF8 */ sh $t9, -8($v1) -/* 0B4D6C 800B416C C6100014 */ lwc1 $f16, 0x14($s0) -/* 0B4D70 800B4170 C7B20078 */ lwc1 $f18, 0x78($sp) -/* 0B4D74 800B4174 00000000 */ nop -/* 0B4D78 800B4178 46128101 */ sub.s $f4, $f16, $f18 -/* 0B4D7C 800B417C 4449F800 */ cfc1 $t1, $31 -/* 0B4D80 800B4180 00000000 */ nop -/* 0B4D84 800B4184 35210003 */ ori $at, $t1, 3 -/* 0B4D88 800B4188 38210002 */ xori $at, $at, 2 -/* 0B4D8C 800B418C 44C1F800 */ ctc1 $at, $31 -/* 0B4D90 800B4190 00000000 */ nop -/* 0B4D94 800B4194 460021A4 */ cvt.w.s $f6, $f4 -/* 0B4D98 800B4198 440A3000 */ mfc1 $t2, $f6 -/* 0B4D9C 800B419C 44C9F800 */ ctc1 $t1, $31 -/* 0B4DA0 800B41A0 A46AFFFA */ sh $t2, -6($v1) -/* 0B4DA4 800B41A4 9208006C */ lbu $t0, 0x6c($s0) -/* 0B4DA8 800B41A8 00000000 */ nop -/* 0B4DAC 800B41AC A068FFFC */ sb $t0, -4($v1) -/* 0B4DB0 800B41B0 920B006D */ lbu $t3, 0x6d($s0) -/* 0B4DB4 800B41B4 00000000 */ nop -/* 0B4DB8 800B41B8 A06BFFFD */ sb $t3, -3($v1) -/* 0B4DBC 800B41BC 920C006E */ lbu $t4, 0x6e($s0) -/* 0B4DC0 800B41C0 00000000 */ nop -/* 0B4DC4 800B41C4 A06CFFFE */ sb $t4, -2($v1) -/* 0B4DC8 800B41C8 860D005C */ lh $t5, 0x5c($s0) -/* 0B4DCC 800B41CC 00000000 */ nop -/* 0B4DD0 800B41D0 000D7203 */ sra $t6, $t5, 8 -/* 0B4DD4 800B41D4 A06EFFFF */ sb $t6, -1($v1) -/* 0B4DD8 800B41D8 C7AA007C */ lwc1 $f10, 0x7c($sp) -/* 0B4DDC 800B41DC C608000C */ lwc1 $f8, 0xc($s0) -/* 0B4DE0 800B41E0 00000000 */ nop -/* 0B4DE4 800B41E4 460A4401 */ sub.s $f16, $f8, $f10 -/* 0B4DE8 800B41E8 444FF800 */ cfc1 $t7, $31 -/* 0B4DEC 800B41EC 00000000 */ nop -/* 0B4DF0 800B41F0 35E10003 */ ori $at, $t7, 3 -/* 0B4DF4 800B41F4 38210002 */ xori $at, $at, 2 -/* 0B4DF8 800B41F8 44C1F800 */ ctc1 $at, $31 -/* 0B4DFC 800B41FC 00000000 */ nop -/* 0B4E00 800B4200 460084A4 */ cvt.w.s $f18, $f16 -/* 0B4E04 800B4204 44189000 */ mfc1 $t8, $f18 -/* 0B4E08 800B4208 44CFF800 */ ctc1 $t7, $31 -/* 0B4E0C 800B420C A4780000 */ sh $t8, ($v1) -/* 0B4E10 800B4210 C7A60080 */ lwc1 $f6, 0x80($sp) -/* 0B4E14 800B4214 C6040010 */ lwc1 $f4, 0x10($s0) -/* 0B4E18 800B4218 00000000 */ nop -/* 0B4E1C 800B421C 46062201 */ sub.s $f8, $f4, $f6 -/* 0B4E20 800B4220 4459F800 */ cfc1 $t9, $31 -/* 0B4E24 800B4224 00000000 */ nop -/* 0B4E28 800B4228 37210003 */ ori $at, $t9, 3 -/* 0B4E2C 800B422C 38210002 */ xori $at, $at, 2 -/* 0B4E30 800B4230 44C1F800 */ ctc1 $at, $31 -/* 0B4E34 800B4234 00000000 */ nop -/* 0B4E38 800B4238 460042A4 */ cvt.w.s $f10, $f8 -/* 0B4E3C 800B423C 44095000 */ mfc1 $t1, $f10 -/* 0B4E40 800B4240 44D9F800 */ ctc1 $t9, $31 -/* 0B4E44 800B4244 A4690002 */ sh $t1, 2($v1) -/* 0B4E48 800B4248 C7B20084 */ lwc1 $f18, 0x84($sp) -/* 0B4E4C 800B424C C6100014 */ lwc1 $f16, 0x14($s0) -/* 0B4E50 800B4250 00000000 */ nop -/* 0B4E54 800B4254 46128101 */ sub.s $f4, $f16, $f18 -/* 0B4E58 800B4258 444AF800 */ cfc1 $t2, $31 -/* 0B4E5C 800B425C 00000000 */ nop -/* 0B4E60 800B4260 35410003 */ ori $at, $t2, 3 -/* 0B4E64 800B4264 38210002 */ xori $at, $at, 2 -/* 0B4E68 800B4268 44C1F800 */ ctc1 $at, $31 -/* 0B4E6C 800B426C 00000000 */ nop -/* 0B4E70 800B4270 460021A4 */ cvt.w.s $f6, $f4 -/* 0B4E74 800B4274 44083000 */ mfc1 $t0, $f6 -/* 0B4E78 800B4278 44CAF800 */ ctc1 $t2, $31 -/* 0B4E7C 800B427C A4680004 */ sh $t0, 4($v1) -/* 0B4E80 800B4280 920B006C */ lbu $t3, 0x6c($s0) -/* 0B4E84 800B4284 00000000 */ nop -/* 0B4E88 800B4288 A06B0006 */ sb $t3, 6($v1) -/* 0B4E8C 800B428C 920C006D */ lbu $t4, 0x6d($s0) -/* 0B4E90 800B4290 00000000 */ nop -/* 0B4E94 800B4294 A06C0007 */ sb $t4, 7($v1) -/* 0B4E98 800B4298 920D006E */ lbu $t5, 0x6e($s0) -/* 0B4E9C 800B429C 00000000 */ nop -/* 0B4EA0 800B42A0 A06D0008 */ sb $t5, 8($v1) -/* 0B4EA4 800B42A4 860E005C */ lh $t6, 0x5c($s0) -/* 0B4EA8 800B42A8 00000000 */ nop -/* 0B4EAC 800B42AC 000E7A03 */ sra $t7, $t6, 8 -/* 0B4EB0 800B42B0 A06F0009 */ sb $t7, 9($v1) -/* 0B4EB4 800B42B4 92190075 */ lbu $t9, 0x75($s0) -/* 0B4EB8 800B42B8 8E380008 */ lw $t8, 8($s1) -/* 0B4EBC 800B42BC 001948C0 */ sll $t1, $t9, 3 -/* 0B4EC0 800B42C0 01340019 */ multu $t1, $s4 -/* 0B4EC4 800B42C4 00005012 */ mflo $t2 -/* 0B4EC8 800B42C8 030A2021 */ addu $a0, $t8, $t2 -/* 0B4ECC 800B42CC 12600009 */ beqz $s3, .L800B42F4 -/* 0B4ED0 800B42D0 00801825 */ move $v1, $a0 -/* 0B4ED4 800B42D4 92AB0075 */ lbu $t3, 0x75($s5) -/* 0B4ED8 800B42D8 8E680008 */ lw $t0, 8($s3) -/* 0B4EDC 800B42DC 000B60C0 */ sll $t4, $t3, 3 -/* 0B4EE0 800B42E0 01940019 */ multu $t4, $s4 -/* 0B4EE4 800B42E4 00006812 */ mflo $t5 -/* 0B4EE8 800B42E8 010D1021 */ addu $v0, $t0, $t5 -/* 0B4EEC 800B42EC 10000002 */ b .L800B42F8 -/* 0B4EF0 800B42F0 24420028 */ addiu $v0, $v0, 0x28 -.L800B42F4: -/* 0B4EF4 800B42F4 24820028 */ addiu $v0, $a0, 0x28 -.L800B42F8: -/* 0B4EF8 800B42F8 844E0000 */ lh $t6, ($v0) -/* 0B4EFC 800B42FC 2652FFFC */ addiu $s2, $s2, -4 -/* 0B4F00 800B4300 A46E0000 */ sh $t6, ($v1) -/* 0B4F04 800B4304 844F0002 */ lh $t7, 2($v0) -/* 0B4F08 800B4308 2463001E */ addiu $v1, $v1, 0x1e -/* 0B4F0C 800B430C A46FFFE4 */ sh $t7, -0x1c($v1) -/* 0B4F10 800B4310 84590004 */ lh $t9, 4($v0) -/* 0B4F14 800B4314 2442001E */ addiu $v0, $v0, 0x1e -/* 0B4F18 800B4318 A479FFE6 */ sh $t9, -0x1a($v1) -/* 0B4F1C 800B431C 9049FFE8 */ lbu $t1, -0x18($v0) -/* 0B4F20 800B4320 0200A825 */ move $s5, $s0 -/* 0B4F24 800B4324 A069FFE8 */ sb $t1, -0x18($v1) -/* 0B4F28 800B4328 9058FFE9 */ lbu $t8, -0x17($v0) -/* 0B4F2C 800B432C 02209825 */ move $s3, $s1 -/* 0B4F30 800B4330 A078FFE9 */ sb $t8, -0x17($v1) -/* 0B4F34 800B4334 904AFFEA */ lbu $t2, -0x16($v0) -/* 0B4F38 800B4338 00000000 */ nop -/* 0B4F3C 800B433C A06AFFEA */ sb $t2, -0x16($v1) -/* 0B4F40 800B4340 904BFFEB */ lbu $t3, -0x15($v0) -/* 0B4F44 800B4344 00000000 */ nop -/* 0B4F48 800B4348 A06BFFEB */ sb $t3, -0x15($v1) -/* 0B4F4C 800B434C 844CFFEC */ lh $t4, -0x14($v0) -/* 0B4F50 800B4350 00000000 */ nop -/* 0B4F54 800B4354 A46CFFEC */ sh $t4, -0x14($v1) -/* 0B4F58 800B4358 8448FFEE */ lh $t0, -0x12($v0) -/* 0B4F5C 800B435C 00000000 */ nop -/* 0B4F60 800B4360 A468FFEE */ sh $t0, -0x12($v1) -/* 0B4F64 800B4364 844DFFF0 */ lh $t5, -0x10($v0) -/* 0B4F68 800B4368 00000000 */ nop -/* 0B4F6C 800B436C A46DFFF0 */ sh $t5, -0x10($v1) -/* 0B4F70 800B4370 904EFFF2 */ lbu $t6, -0xe($v0) -/* 0B4F74 800B4374 00000000 */ nop -/* 0B4F78 800B4378 A06EFFF2 */ sb $t6, -0xe($v1) -/* 0B4F7C 800B437C 904FFFF3 */ lbu $t7, -0xd($v0) -/* 0B4F80 800B4380 00000000 */ nop -/* 0B4F84 800B4384 A06FFFF3 */ sb $t7, -0xd($v1) -/* 0B4F88 800B4388 9059FFF4 */ lbu $t9, -0xc($v0) -/* 0B4F8C 800B438C 00000000 */ nop -/* 0B4F90 800B4390 A079FFF4 */ sb $t9, -0xc($v1) -/* 0B4F94 800B4394 9049FFF5 */ lbu $t1, -0xb($v0) -/* 0B4F98 800B4398 00000000 */ nop -/* 0B4F9C 800B439C A069FFF5 */ sb $t1, -0xb($v1) -/* 0B4FA0 800B43A0 8458FFF6 */ lh $t8, -0xa($v0) -/* 0B4FA4 800B43A4 00000000 */ nop -/* 0B4FA8 800B43A8 A478FFF6 */ sh $t8, -0xa($v1) -/* 0B4FAC 800B43AC 844AFFF8 */ lh $t2, -8($v0) -/* 0B4FB0 800B43B0 00000000 */ nop -/* 0B4FB4 800B43B4 A46AFFF8 */ sh $t2, -8($v1) -/* 0B4FB8 800B43B8 844BFFFA */ lh $t3, -6($v0) -/* 0B4FBC 800B43BC 00000000 */ nop -/* 0B4FC0 800B43C0 A46BFFFA */ sh $t3, -6($v1) -/* 0B4FC4 800B43C4 904CFFFC */ lbu $t4, -4($v0) -/* 0B4FC8 800B43C8 00000000 */ nop -/* 0B4FCC 800B43CC A06CFFFC */ sb $t4, -4($v1) -/* 0B4FD0 800B43D0 9048FFFD */ lbu $t0, -3($v0) -/* 0B4FD4 800B43D4 00000000 */ nop -/* 0B4FD8 800B43D8 A068FFFD */ sb $t0, -3($v1) -/* 0B4FDC 800B43DC 904DFFFE */ lbu $t5, -2($v0) -/* 0B4FE0 800B43E0 2408FFFF */ li $t0, -1 -/* 0B4FE4 800B43E4 A06DFFFE */ sb $t5, -2($v1) -/* 0B4FE8 800B43E8 904EFFFF */ lbu $t6, -1($v0) -/* 0B4FEC 800B43EC 00000000 */ nop -/* 0B4FF0 800B43F0 A06EFFFF */ sb $t6, -1($v1) -/* 0B4FF4 800B43F4 844F0000 */ lh $t7, ($v0) -/* 0B4FF8 800B43F8 00000000 */ nop -/* 0B4FFC 800B43FC A46F0000 */ sh $t7, ($v1) -/* 0B5000 800B4400 84590002 */ lh $t9, 2($v0) -/* 0B5004 800B4404 00000000 */ nop -/* 0B5008 800B4408 A4790002 */ sh $t9, 2($v1) -/* 0B500C 800B440C 84490004 */ lh $t1, 4($v0) -/* 0B5010 800B4410 00000000 */ nop -/* 0B5014 800B4414 A4690004 */ sh $t1, 4($v1) -/* 0B5018 800B4418 90580006 */ lbu $t8, 6($v0) -/* 0B501C 800B441C 00000000 */ nop -/* 0B5020 800B4420 A0780006 */ sb $t8, 6($v1) -/* 0B5024 800B4424 904A0007 */ lbu $t2, 7($v0) -/* 0B5028 800B4428 00000000 */ nop -/* 0B502C 800B442C A06A0007 */ sb $t2, 7($v1) -/* 0B5030 800B4430 904B0008 */ lbu $t3, 8($v0) -/* 0B5034 800B4434 00000000 */ nop -/* 0B5038 800B4438 A06B0008 */ sb $t3, 8($v1) -/* 0B503C 800B443C 904C0009 */ lbu $t4, 9($v0) -/* 0B5040 800B4440 00000000 */ nop -/* 0B5044 800B4444 A06C0009 */ sb $t4, 9($v1) -/* 0B5048 800B4448 0641FEA3 */ bgez $s2, .L800B3ED8 -/* 0B504C 800B444C A2080077 */ sb $t0, 0x77($s0) -.L800B4450: -/* 0B5050 800B4450 8FBF0044 */ lw $ra, 0x44($sp) -.L800B4454: -/* 0B5054 800B4454 C7B50018 */ lwc1 $f21, 0x18($sp) -/* 0B5058 800B4458 C7B4001C */ lwc1 $f20, 0x1c($sp) -/* 0B505C 800B445C 8FB00020 */ lw $s0, 0x20($sp) -/* 0B5060 800B4460 8FB10024 */ lw $s1, 0x24($sp) -/* 0B5064 800B4464 8FB20028 */ lw $s2, 0x28($sp) -/* 0B5068 800B4468 8FB3002C */ lw $s3, 0x2c($sp) -/* 0B506C 800B446C 8FB40030 */ lw $s4, 0x30($sp) -/* 0B5070 800B4470 8FB50034 */ lw $s5, 0x34($sp) -/* 0B5074 800B4474 8FB60038 */ lw $s6, 0x38($sp) -/* 0B5078 800B4478 8FB7003C */ lw $s7, 0x3c($sp) -/* 0B507C 800B447C 8FBE0040 */ lw $fp, 0x40($sp) -/* 0B5080 800B4480 03E00008 */ jr $ra -/* 0B5084 800B4484 27BD0090 */ addiu $sp, $sp, 0x90 diff --git a/include/level_object_entries.h b/include/level_object_entries.h index 2ea6dd80..19d8ebaa 100644 --- a/include/level_object_entries.h +++ b/include/level_object_entries.h @@ -24,12 +24,6 @@ typedef struct LevelObjectEntry_Scenery { /* 0x0B */ u8 solid; } LevelObjectEntry_Scenery; -typedef struct LevelObjectEntry_Fish { - /* 0x00 */ LevelObjectEntryCommon common; - /* 0x08 */ u8 pad8[0x4]; - /* 0x0C */ u8 unkC[1]; //Unknown size -} LevelObjectEntry_Fish; - typedef struct LevelObjectEntry_Animator { /* 0x00 */ LevelObjectEntryCommon common; /* 0x08 */ s8 batchID; @@ -430,6 +424,17 @@ typedef struct LevelObjectEntry_Butterfly { /* 0x0B */ u8 unkB; } LevelObjectEntry_Butterfly; +typedef struct LevelObjectEntry_Fish { + /* 0x00 */ LevelObjectEntryCommon common; + /* 0x08 */ u16 unk8; + /* 0x0A */ u8 unkA; + /* 0x0B */ u8 unkB; + /* 0x0C */ u8 unkC; + /* 0x0D */ u8 unkD; + /* 0x0E */ u8 unkE; + /* 0x0F */ u8 unkF; +} LevelObjectEntry_Fish; + typedef struct LevelObjectEntry_Parkwarden { /* 0x00 */ LevelObjectEntryCommon common; } LevelObjectEntry_Parkwarden; diff --git a/include/structs.h b/include/structs.h index 91836f1c..2410ac14 100644 --- a/include/structs.h +++ b/include/structs.h @@ -634,8 +634,8 @@ typedef struct LevelModelSegment { /* 0x08 */ s32 unk8; /* 0x0C */ TriangleBatchInfo *batches; /* 0x10 */ s16 *unk10; -/* 0x14 */ u8 *unk14; -/* 0x18 */ s16 *unk18; +/* 0x14 */ u16 *unk14; +/* 0x18 */ f32 *unk18; /* 0x1C */ s16 numberOfVertices; /* 0x1E */ s16 numberOfTriangles; /* 0x20 */ s16 numberOfBatches; @@ -1713,9 +1713,10 @@ typedef struct Object_68 { /* Size: 0x20 bytes */ typedef struct Object_6C { - /* 0x00 */ u8 pad0[0x4]; + /* 0x00 */ struct Particle *unk0; /* 0x04 */ s16 unk4; - /* 0x05 */ u8 pad6[0x4]; + /* 0x06 */ u8 unk6; + /* 0x07 */ u8 pad7[0x3]; /* 0x0A */ s16 unkA; /* 0x0C */ u8 padC[0x14]; } Object_6C; @@ -1866,6 +1867,36 @@ typedef struct ObjectSegment { /* 0x0040 */ ObjectHeader *header; } ObjectSegment; +typedef struct Object_LightData_UnkC_Unk44 { + u8 pad0[8]; + Vertex *unk8; +} Object_LightData_UnkC_Unk44; + +typedef struct Object_LightData_UnkC { + /* 0x00 */ ObjectTransform trans; + /* 0x18 */ u8 pad18[0x22]; + /* 0x3A */ s16 unk3A; + /* 0x3C */ u8 pad3C[0x8]; + /* 0x44 */ Object_LightData_UnkC_Unk44 *unk44; + /* 0x48 */ u8 pad48[0x14]; + /* 0x5C */ s16 unk5C; + /* 0x5E */ u8 pad5E[0xE]; + /* 0x6C */ u8 unk6C; + /* 0x6D */ u8 unk6D; + /* 0x6E */ u8 unk6E; + /* 0x6F */ u8 pad6F[0x6]; + /* 0x75 */ u8 unk75; + /* 0x76 */ u8 pad76; + /* 0x77 */ s8 unk77; +} Object_LightData_UnkC; + +typedef struct Object_LightData { + /* 0x00 */ u8 pad0[6]; + /* 0x06 */ u8 unk6; + /* 0x07 */ u8 pad7[5]; + /* 0x0C */ Object_LightData_UnkC **unkC; +} Object_LightData; + /* Size: 0x0630 bytes */ typedef struct Object { /* 0x0000 */ ObjectSegment segment; @@ -1881,7 +1912,7 @@ typedef struct Object { /* 0x0064 */ Object_64 *unk64; //player + 0x98 /* 0x0068 */ Object_68 **unk68; //player + 0x80 /* 0x006C */ Object_6C *unk6C; //player + 0x370 - /* 0x0070 */ u32 *lightData; + /* 0x0070 */ Object_LightData **lightData; /* 0x0074 */ u32 unk74; /* 0x0078 */ ObjProperties properties; /* 0x0080 */ void *unk80; @@ -1912,7 +1943,13 @@ typedef struct GhostHeader { }; s16 unk2; }; - s16 time; // In frames, where 60 frames = 1 second. + union { + struct { + u8 unk4; + s8 unk5; + }; + s16 time; // In frames, where 60 frames = 1 second. + }; s16 nodeCount; } GhostHeader; diff --git a/src/menu.c b/src/menu.c index 15ef9477..9163e83e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -6070,7 +6070,7 @@ s32 menu_character_select_loop(s32 updateRate) { phi_t3 = 0; if (gEnteredCharSelectFrom == 0) { phi_t3++; - if ((gActiveMagicCodes << 7) < 0) { + if (gActiveMagicCodes & CHEAT_TWO_PLAYER_ADVENTURE) { phi_t3++; } } @@ -7337,7 +7337,7 @@ s32 menu_track_select_loop(s32 updateRate) { if (D_801267D0 < 0) { func_8008F534(); gTrackSpecifiedWithTrackIdToLoad = 0; - if (gNumberOfActivePlayers >= 3 || (gNumberOfActivePlayers == 2 && (gActiveMagicCodes << 7) >= 0)) { + if (gNumberOfActivePlayers >= 3 || (gNumberOfActivePlayers == 2 && !(gActiveMagicCodes & CHEAT_TWO_PLAYER_ADVENTURE))) { cutsceneId = 0; if (is_drumstick_unlocked()) { cutsceneId = 1; diff --git a/src/menu.h b/src/menu.h index d1c4e12f..af5950d0 100644 --- a/src/menu.h +++ b/src/menu.h @@ -309,7 +309,7 @@ typedef struct TitleScreenDemos { /* Size 0x10 bytes */ typedef struct TrackRenderDetails { /* 0x00 */ char *hubName; - /* 0x04 */ u8 *trackName; + /* 0x04 */ char *trackName; /* 0x08 */ s16 xOff; /* 0x0A */ s16 yOff; /* 0x0C */ u8 visible; diff --git a/src/object_functions.c b/src/object_functions.c index 1b697967..1b239a56 100644 --- a/src/object_functions.c +++ b/src/object_functions.c @@ -36,7 +36,7 @@ // Unsure about the signed/unsigned with these arrays. FadeTransition gTajTransformTransitionEnd = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_INVERT, FADE_COLOR_WHITE, 7, 3); -FadeTransition gTajTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, 0xFFFF); +FadeTransition gTajTransition = FADE_TRANSITION(FADE_FULLSCREEN, FADE_FLAG_NONE, FADE_COLOR_BLACK, 30, -1); Vertex gCharacterFlagVertices[4] = { { -256, 256, 0, 255, 255, 255, 255 }, @@ -45,31 +45,29 @@ Vertex gCharacterFlagVertices[4] = { { -256, -256, 0, 255, 255, 255, 255 }, }; -u16 D_800DC9A8[20] = { - 0x0000, 0x0040, 0xFFC0, 0x0000, - 0xFFC0, 0xFFC0, 0x0000, 0x0040, - 0x0020, 0x0000, 0xFFC0, 0x0020, - 0x0000, 0x0040, 0x0040, 0x0000, - 0xFFC0, 0x0040, 0x0000, 0x0000, +VertexPosition D_800DC9A8[6] = { + { 0, 64, -64 }, + { 0, -64, -64 }, + { 0, 64, 32 }, + { 0, -64, 32 }, + { 0, 64, 64 }, + { 0, -64, 64 }, }; -u16 D_800DC9D0[64] = { - 0x0000, 0x0301, 0x0004, 0x0000, - 0x0001, 0x0004, 0x0004, 0x0004, - 0x0000, 0x0203, 0x0004, 0x0000, - 0x0001, 0x0000, 0x0001, 0x0004, - 0x0002, 0x0503, 0x0001, 0x0000, - 0x0000, 0x0004, 0x0001, 0x0004, - 0x0002, 0x0405, 0x0001, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0004, - 0x0000, 0x0103, 0x0004, 0x0000, - 0x0004, 0x0004, 0x0001, 0x0004, - 0x0000, 0x0302, 0x0004, 0x0000, - 0x0001, 0x0004, 0x0001, 0x0000, - 0x0002, 0x0305, 0x0001, 0x0000, - 0x0001, 0x0004, 0x0000, 0x0004, - 0x0002, 0x0504, 0x0001, 0x0000, - 0x0000, 0x0004, 0x0000, 0x0000, + +UNUSED s32 D_800DC9C8 = 0; + +// Fish Object Related +Triangle D_800DC9D0[8] = { + { {{ 0, 0, 3, 1 }}, {{{ 4, 0 }}}, {{{ 1, 4 }}}, {{{ 4, 4 }}} }, + { {{ 0, 0, 2, 3 }}, {{{ 4, 0 }}}, {{{ 1, 0 }}}, {{{ 1, 4 }}} }, + { {{ 0, 2, 5, 3 }}, {{{ 1, 0 }}}, {{{ 0, 4 }}}, {{{ 1, 4 }}} }, + { {{ 0, 2, 4, 5 }}, {{{ 1, 0 }}}, {{{ 0, 0 }}}, {{{ 0, 4 }}} }, + { {{ 0, 0, 1, 3 }}, {{{ 4, 0 }}}, {{{ 4, 4 }}}, {{{ 1, 4 }}} }, + { {{ 0, 0, 3, 2 }}, {{{ 4, 0 }}}, {{{ 1, 4 }}}, {{{ 1, 0 }}} }, + { {{ 0, 2, 3, 5 }}, {{{ 1, 0 }}}, {{{ 1, 4 }}}, {{{ 0, 4 }}} }, + { {{ 0, 2, 5, 4 }}, {{{ 1, 0 }}}, {{{ 0, 4 }}}, {{{ 0, 0 }}} }, }; + u8 D_800DCA50[8] = { 2, 5, 6, 3, 10, 8, 7, 9 }; @@ -104,6 +102,7 @@ s8 D_800DCA9C[12] = { 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +// Butterfly Object Related Triangle D_800DCAA8[8] = { { {{ 0, 0, 3, 1 }}, {{{ 0, 0 }}}, {{{ -1, -1 }}}, {{{ 0, -1 }}} }, { {{ 0, 0, 2, 3 }}, {{{ 0, 0 }}}, {{{ -1, 0 }}}, {{{ -1, -1 }}} }, @@ -1422,7 +1421,98 @@ void play_tt_voice_clip(u16 soundID, s32 interrupt) { } } +#ifdef NON_EQUIVALENT +void obj_init_fish(Object *fishObj, LevelObjectEntry_Fish *fishEntry, s32 param) { + Object_Fish *fish; + f32 sinsFE, cossFE, sins104, coss104; + f32 xPos; + f32 zPos; + s32 uMask; + s32 vMask; + s32 i; + + fish = &fishObj->unk64->fish; + fish->unk100 = fishEntry->unkE << 4; + fish->unk104 = fishEntry->unkF << 8; + fish->unk114 = fishEntry->unk8; + fish->unk118 = fishEntry->unkA; + fish->unk108 = fishEntry->common.x; + fish->unk10C = fishEntry->common.y; + fish->unk110 = fishEntry->common.z; + if (param == 0) { + fish->unkFE = get_random_number_from_range(0, 0x10000); + fish->unk102 = get_random_number_from_range(0, 0x10000); + fish->unk106 = get_random_number_from_range(0, 0x10000); + fish->unkFD = 0; + } else { + fish->unkFE = 0x4000; + fishObj->segment.trans.y_rotation = fish->unk104; + } + sinsFE = sins_f((fish->unkFE * 2)) * fish->unk114; + cossFE = coss_f(fish->unkFE) * fish->unk114; + sins104 = sins_f(fish->unk104); + coss104 = coss_f(fish->unk104); + + fishObj->segment.trans.x_position = fish->unk108; + xPos = (sinsFE * coss104) + (cossFE * sins104); + + fishObj->segment.trans.z_position = fish->unk110; + zPos = (cossFE * coss104) - (sinsFE * sins104); + + ignore_bounds_check(); + move_object(fishObj, xPos, 0.0f, zPos); + if (param == 0) { + for(i = 0; i < 8; i++) { + fish->triangles[i].flags = D_800DC9D0[i].flags; + fish->triangles[i].vi0 = D_800DC9D0[i].vi0; + fish->triangles[i].vi1 = D_800DC9D0[i].vi1; + fish->triangles[i].vi2 = D_800DC9D0[i].vi2; + } + uMask = 0; + for(i = 0; i < 6; i++) { + fish->vertices[uMask].x = D_800DC9A8[uMask].x; + fish->vertices[uMask].y = D_800DC9A8[uMask].y; + fish->vertices[uMask].z = D_800DC9A8[uMask].z; + fish->vertices[uMask].r = 255; + fish->vertices[uMask].g = 255; + fish->vertices[uMask].b = 255; + fish->vertices[uMask].a = 255; + fish->vertices[uMask+6].x = D_800DC9A8[uMask].x; + fish->vertices[uMask+6].y = D_800DC9A8[uMask].y; + fish->vertices[uMask+6].z = D_800DC9A8[uMask].z; + fish->vertices[uMask+6].r = 255; + fish->vertices[uMask+6].g = 255; + fish->vertices[uMask+6].b = 255; + fish->vertices[uMask+6].a = 255; + uMask++; + } + fish->unkFC = 1; + } + fishObj->segment.trans.scale = fishEntry->unkC * 0.01f; + if (fishEntry->unkB < fishObj->segment.header->numberOfModelIds) { + fish->texture = (TextureHeader *) fishObj->unk68[fishEntry->unkB]; + } else { + fish->texture = (TextureHeader *) fishObj->unk68[0]; + } + if (fish->texture != NULL) { + uMask = (fish->texture->width - 1) << 5; + vMask = (fish->texture->height - 1) << 5; + } else { + uMask = 0; + vMask = 0; + } + for(i = 0; i < 8; i++) { + fish->triangles[i].uv0.u = D_800DC9D0[i].uv0.u * uMask >> 2; + fish->triangles[i].uv0.v = D_800DC9D0[i].uv0.v * vMask >> 2; + fish->triangles[i].uv1.u = D_800DC9D0[i].uv1.u * uMask >> 2; + fish->triangles[i].uv1.v = D_800DC9D0[i].uv1.v * vMask >> 2; + fish->triangles[i].uv2.u = D_800DC9D0[i].uv2.u * uMask >> 2; + fish->triangles[i].uv2.v = D_800DC9D0[i].uv2.v * vMask >> 2; + } +} +#else GLOBAL_ASM("asm/non_matchings/object_functions/obj_init_fish.s") +#endif void obj_loop_fish(Object *fishObj, s32 updateRate) { f32 zThing; @@ -5388,14 +5478,14 @@ void obj_init_wavegenerator(Object *obj, UNUSED LevelObjectEntry_WaveGenerator * func_800BF524(obj); } -void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butterflyEntry, s32 arg2) { +void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butterflyEntry, s32 param) { Object_Butterfly *butterfly; s32 uMask; s32 vMask; s32 i; butterfly = &butterflyObj->unk64->butterfly; - if (arg2 == 0) { + if (param == 0) { butterflyObj->segment.y_velocity = 0.0f; butterfly->unkFE = 0; butterfly->unk100 = 0; @@ -5431,9 +5521,9 @@ void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butter } butterflyObj->segment.trans.scale = butterflyEntry->unkB * 0.01f; if (butterflyEntry->unkA < butterflyObj->segment.header->numberOfModelIds) { - butterfly->texture = (TextureHeader* ) butterflyObj->unk68[butterflyEntry->unkA]; + butterfly->texture = (TextureHeader *) butterflyObj->unk68[butterflyEntry->unkA]; } else { - butterfly->texture = (TextureHeader* ) butterflyObj->unk68[0]; + butterfly->texture = (TextureHeader *) butterflyObj->unk68[0]; } if (butterfly->texture != NULL) { uMask = (butterfly->texture->width - 1) << 5; diff --git a/src/object_functions.h b/src/object_functions.h index aa16bdb6..3d1a97d9 100644 --- a/src/object_functions.h +++ b/src/object_functions.h @@ -392,10 +392,10 @@ void obj_loop_fish(Object *fishObj, s32 updateRate); void obj_loop_weaponballoon(Object *weaponBalloonObj, s32 updateRate); void obj_loop_char_select(Object *charSelectObj, s32 updateRate); void func_8003F2E8(Object *weaponObj, s32 updateRate); - -//Non Matching +void obj_init_butterfly(Object *butterflyObj, LevelObjectEntry_Butterfly *butterflyEntry, s32 param); +void obj_init_animation(Object *obj, LevelObjectEntry_Animation *entry, s32 arg2); +void obj_init_lensflareswitch(Object *obj, LevelObjectEntry_LensFlareSwitch *entry, UNUSED s32 arg2); void obj_loop_lavaspurt(Object *obj, s32 updateRate); -void obj_loop_animator(Object *obj, s32 updateRate); void obj_loop_vehicleanim(Object *obj, s32 updateRate); void obj_loop_snowball(Object *obj, s32 updateRate); void obj_loop_goldenballoon(Object *obj, s32 updateRate); @@ -403,26 +403,25 @@ void obj_loop_groundzipper(Object *obj, s32 updateRate); void obj_loop_laserbolt(Object *obj, s32 updateRate); void obj_loop_posarrow(Object *obj, s32 updateRate); void obj_loop_bananacreator(Object *obj, s32 updateRate); -void obj_loop_butterfly(Object *obj, s32 updateRate); void obj_loop_airzippers_waterzippers(Object *obj, s32 updateRate); -void obj_loop_texscroll(Object *obj, s32 updateRate); void obj_loop_exit(Object *obj, s32 updateRate); void obj_loop_scenery(Object *obj, s32 updateRate); -void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry); -INCONSISTENT void obj_init_butterfly(); void obj_init_trigger(Object *obj, LevelObjectEntry_Trigger *entry); -INCONSISTENT void obj_init_animation(); -INCONSISTENT void obj_init_lensflareswitch(); void obj_init_lensflare(Object *obj, LevelObjectEntry_LensFlare *entry); void obj_init_weaponballoon(Object *obj, LevelObjectEntry_WeaponBalloon *entry); void obj_init_door(Object *obj, LevelObjectEntry_Door *entry); void obj_init_audio(Object *obj, LevelObjectEntry_Audio *entry); void obj_init_bombexplosion(Object *obj, LevelObjectEntry_BombExplosion *entry); -void obj_init_fish(Object *obj, LevelObjectEntry_Fish *entry); void obj_init_scenery(Object *obj, LevelObjectEntry_Scenery *entry); -void calc_env_mapping_for_object(ObjectModel *, s16, s16, s16); void handle_rocket_projectile(Object *obj, s32 updateRate); +//Non Matching +void calc_env_mapping_for_object(ObjectModel *, s16, s16, s16); +void obj_init_fish(Object *obj, LevelObjectEntry_Fish *entry, s32 param); +void obj_init_midifade(Object *obj, LevelObjectEntry_MidiFade *entry); +void obj_loop_texscroll(Object *obj, s32 updateRate); +void obj_loop_butterfly(Object *obj, s32 updateRate); +void obj_loop_animator(Object *obj, s32 updateRate); s32 func_8001C524(f32 x, f32 y, f32 z, s32 arg3); s32 func_8001CC48(s32, s32, s32); f32 func_8001C6C4(Object_64 *, Object *, f32, f32, s32); diff --git a/src/objects.c b/src/objects.c index 9fcb5a8c..b2b78de1 100644 --- a/src/objects.c +++ b/src/objects.c @@ -2582,7 +2582,7 @@ void render_3d_misc(Object *obj) { break; case BHV_FISH: objData = obj->unk64; - scale = obj->segment.level_entry->fish.unkC[1]; + scale = obj->segment.level_entry->fish.unkD; scale *= 0.01f; render_misc_model(obj, &objData->fish.vertices[objData->fish.unkFC * 6], 6, objData->fish.triangles, 8, objData->fish.texture, RENDER_Z_COMPARE | RENDER_FOG_ACTIVE | RENDER_CUTOUT, 0, scale); @@ -6257,7 +6257,7 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { obj_init_scenery(obj, (LevelObjectEntry_Scenery*) entry); break; case BHV_FISH: - obj_init_fish(obj, (LevelObjectEntry_Fish *) entry); + obj_init_fish(obj, (LevelObjectEntry_Fish *) entry, param); break; case BHV_ANIMATOR: obj_init_animator(obj, (LevelObjectEntry_Animator *) entry, param); @@ -6364,7 +6364,7 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { obj_init_lensflare(obj, (LevelObjectEntry_LensFlare *) entry); break; case BHV_LENS_FLARE_SWITCH: - obj_init_lensflareswitch(obj, (LevelObjectEntry_LensFlareSwitch *) entry); + obj_init_lensflareswitch(obj, (LevelObjectEntry_LensFlareSwitch *) entry, param); break; case BHV_COLLECT_EGG: obj_init_collectegg(obj, (LevelObjectEntry_CollectEgg *) entry); @@ -6376,7 +6376,7 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { obj_init_characterflag(obj, (LevelObjectEntry_CharacterFlag *) entry); break; case BHV_ANIMATION: - obj_init_animation(obj, (LevelObjectEntry_Animation *) entry); + obj_init_animation(obj, (LevelObjectEntry_Animation *) entry, param); break; case BHV_INFO_POINT: obj_init_infopoint(obj, (LevelObjectEntry_InfoPoint *) entry); @@ -6395,7 +6395,7 @@ void run_object_init_func(Object *obj, void *entry, s32 param) { obj_init_wavegenerator(obj, (LevelObjectEntry_WaveGenerator *) entry, param); break; case BHV_BUTTERFLY: - obj_init_butterfly(obj, (LevelObjectEntry_Butterfly *) entry); + obj_init_butterfly(obj, (LevelObjectEntry_Butterfly *) entry, param); break; case BHV_PARK_WARDEN: obj_init_parkwarden(obj, (LevelObjectEntry_Parkwarden *) entry); diff --git a/src/particles.c b/src/particles.c index d8f09732..2ebc945f 100644 --- a/src/particles.c +++ b/src/particles.c @@ -577,8 +577,67 @@ void func_800AF6E4(Object *obj, s32 arg1) { } GLOBAL_ASM("asm/non_matchings/particles/func_800AF714.s") -GLOBAL_ASM("asm/non_matchings/particles/func_800AFC3C.s") +void func_800AFC3C(Object *obj, s32 updateRate) { + Object_6C *temp_s1; + Object_6C *temp_s1_2; + s32 var_s0; + s32 i; + UNUSED s32 pad; + s32 var_a3; + u32 bits; + + bits = obj->unk74; + var_a3 = obj->segment.header->unk57; + for(i = 0; i < var_a3; i++) { + if (bits & 1) { + if (!(obj->unk6C[i].unk4 & 0x8000)) { + func_800AF52C(obj, i); + } + if (obj->unk6C[i].unk4 & 0x4000) { + func_800AFE5C((Particle *) obj, (Particle *) &obj->unk6C[i]); + } else if((obj->unk6C[i].unk4 & 0x400)) { + func_800AFE5C((Particle *) obj, (Particle *) &obj->unk6C[i]); + } else { + obj->unk6C[i].unkA += updateRate; + if (obj->unk6C[i].unkA >= obj->unk6C[i].unk0->segment.unk40_s16) { + func_800AFE5C((Particle *) obj, (Particle *) &obj->unk6C[i]); + } + } + var_a3 = obj->segment.header->unk57; + } else { + if (obj->unk6C[i].unk4 & 0x8000) { + if (obj->unk6C[i].unk4 & 0x4000) { + temp_s1 = &obj->unk6C[i]; + var_s0 = temp_s1->unk6 - 0x40; + if (var_s0 < 0) { + var_s0 = 0; + } + temp_s1->unk6 = var_s0; + func_800AFE5C((Particle *) obj, (Particle *) temp_s1); + temp_s1->unk6 = var_s0; + if (var_s0 == 0) { + func_800AF6E4(obj, i); + } + var_a3 = obj->segment.header->unk57; + } else if((obj->unk6C[i].unk4 & 0x400)) { + temp_s1_2 = &obj->unk6C[i]; + obj->unk6C[i].unk4 |= 0x200; + if (temp_s1_2->unk6 == 0) { + func_800AF6E4(obj, i); + } + var_a3 = obj->segment.header->unk57; + } else { + func_800AF6E4(obj, i); + var_a3 = obj->segment.header->unk57; + } + } + } + bits >>= 1; + } +} + +//TODO: Should this be void func_800AFE5C(Object *arg0, Object_6C *arg1)? void func_800AFE5C(Particle *arg0, Particle *arg1) { Particle *temp_s0; Particle *tempObj; @@ -1647,7 +1706,128 @@ void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vt } } -GLOBAL_ASM("asm/non_matchings/particles/func_800B3E64.s") +void func_800B3E64(Object *obj) { + UNUSED s32 pad; + s32 index; + Vec3f vec3_1; + Vec3f vec3_0; + Object_LightData_UnkC *temp_s0; + Object_LightData_UnkC *prev_s0; + Object_LightData *lightData; + Object_LightData_UnkC_Unk44 *temp_s1; + Vertex *otherVerts; + Vertex *verts; + Object_LightData_UnkC_Unk44 *prev_s1; + + lightData = (Object_LightData *) obj->lightData; + prev_s0 = NULL; + prev_s1 = NULL; + if (lightData != NULL) { + if (lightData->unkC != NULL) { + index = (lightData->unk6 - 1); + while (index >= 0) { + temp_s0 = lightData->unkC[index]; + if (temp_s0->unk3A != 0) { + temp_s1 = temp_s0->unk44; + vec3_0.f[0] = temp_s0->trans.scale; + vec3_0.f[1] = 0.0f; + vec3_0.f[2] = 0.0f; + f32_vec3_apply_object_rotation(&temp_s0->trans, &vec3_0.f[0]); + vec3_1.f[0] = 0.0f; + vec3_1.f[1] = temp_s0->trans.scale; + vec3_1.f[2] = 0.0f; + f32_vec3_apply_object_rotation(&temp_s0->trans, &vec3_1.f[0]); + + // It seems super odd to do negative indices. Why not just increment by 4 and add up from there? + verts = &temp_s1->unk8[temp_s0->unk75 << 3]; + if (1) { } if (1) { } if (1) { } if (1) { } if (1) { } if (1) { } // Fake + verts += 7; + verts[-3].x = temp_s0->trans.x_position + vec3_0.f[0]; + verts[-3].y = temp_s0->trans.y_position + vec3_0.f[1]; + verts[-3].z = temp_s0->trans.z_position + vec3_0.f[2]; + verts[-3].r = temp_s0->unk6C; + verts[-3].g = temp_s0->unk6D; + verts[-3].b = temp_s0->unk6E; + verts[-3].a = temp_s0->unk5C >> 8; + verts[-2].x = temp_s0->trans.x_position + vec3_1.f[0]; + verts[-2].y = temp_s0->trans.y_position + vec3_1.f[1]; + verts[-2].z = temp_s0->trans.z_position + vec3_1.f[2]; + verts[-2].r = temp_s0->unk6C; + verts[-2].g = temp_s0->unk6D; + verts[-2].b = temp_s0->unk6E; + verts[-2].a = temp_s0->unk5C >> 8; + verts[-1].x = temp_s0->trans.x_position - vec3_0.f[0]; + verts[-1].y = temp_s0->trans.y_position - vec3_0.f[1]; + verts[-1].z = temp_s0->trans.z_position - vec3_0.f[2]; + verts[-1].r = temp_s0->unk6C; + verts[-1].g = temp_s0->unk6D; + verts[-1].b = temp_s0->unk6E; + verts[-1].a = temp_s0->unk5C >> 8; + verts[0].x = temp_s0->trans.x_position - vec3_1.f[0]; + verts[0].y = temp_s0->trans.y_position - vec3_1.f[1]; + verts[0].z = temp_s0->trans.z_position - vec3_1.f[2]; + verts[0].r = temp_s0->unk6C; + verts[0].g = temp_s0->unk6D; + verts[0].b = temp_s0->unk6E; + verts[0].a = temp_s0->unk5C >> 8; + + verts = &temp_s1->unk8[temp_s0->unk75 << 3]; + if (prev_s1 != NULL) { + if(1) { // Fake + otherVerts = &prev_s1->unk8[prev_s0->unk75 << 3]; + } + otherVerts += 4; + } else { + otherVerts = &temp_s1->unk8[temp_s0->unk75 << 3]; + otherVerts += 4; + } + + + index--; + verts += 3; + otherVerts += 3; + + prev_s0 = temp_s0; + prev_s1 = temp_s1; + + verts[-3].x = otherVerts[-3].x; + verts[-3].y = otherVerts[-3].y; + verts[-3].z = otherVerts[-3].z; + verts[-3].r = otherVerts[-3].r; + verts[-3].g = otherVerts[-3].g; + verts[-3].b = otherVerts[-3].b; + verts[-3].a = otherVerts[-3].a; + verts[-2].x = otherVerts[-2].x; + verts[-2].y = otherVerts[-2].y; + verts[-2].z = otherVerts[-2].z; + verts[-2].r = otherVerts[-2].r; + verts[-2].g = otherVerts[-2].g; + verts[-2].b = otherVerts[-2].b; + verts[-2].a = otherVerts[-2].a; + verts[-1].x = otherVerts[-1].x; + verts[-1].y = otherVerts[-1].y; + verts[-1].z = otherVerts[-1].z; + verts[-1].r = otherVerts[-1].r; + verts[-1].g = otherVerts[-1].g; + verts[-1].b = otherVerts[-1].b; + verts[-1].a = otherVerts[-1].a; + verts[0].x = otherVerts[0].x; + verts[0].y = otherVerts[0].y; + verts[0].z = otherVerts[0].z; + verts[0].r = otherVerts[0].r; + verts[0].g = otherVerts[0].g; + verts[0].b = otherVerts[0].b; + verts[0].a = otherVerts[0].a; + + temp_s0->unk77 = -1; + + continue; + } + break; + } + } + } +} /** * Return a specific particle asset table from the main table. diff --git a/src/particles.h b/src/particles.h index 0c72b0a5..23a70b08 100644 --- a/src/particles.h +++ b/src/particles.h @@ -137,7 +137,13 @@ typedef struct ParticleSegment { SegmentPropertiesCamera camera; }; /* 0x003C */ void *unk3C; - /* 0x0040 */ s32 unk40; + union { + struct { + /* 0x0040 */ s16 unk40_s16; + /* 0x0042 */ s16 unk42; + }; + s32 unk40; + }; } ParticleSegment; typedef struct ParticleModel { @@ -231,9 +237,10 @@ void func_800AF134(Particle *arg0, s32 arg1, s32 arg2, s16 arg3, s16 arg4, s16 a void render_particle(Particle *particle, Gfx **dList, MatrixS **mtx, Vertex **vtx, s32 flags); void func_800B4668(Object *obj, s32 idx, s32 arg2, s32 arg3); void func_800B46BC(Object *obj, s32 idx, s32 arg2, s32 arg3); +void func_800AFC3C(Object *obj, s32 updateRate); +void func_800B3E64(Object *obj); void func_800AF404(s32 arg0); // Non Matching -void func_800AFC3C(Object *, s32); // Non Matching void func_800AE728(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5); // Non Matching void func_800AF714(Object*, s32); // Non matching Particle *func_800B0BAC(); @@ -243,6 +250,5 @@ void move_particle_velocity_parent(Particle *); void move_particle_with_velocities(Particle *); void move_particle_basic(Particle *); void move_particle_with_velocity(Particle *); -void func_800B3E64(Object *); // Non Matching #endif diff --git a/src/racer.c b/src/racer.c index 7c456503..ab0945e1 100644 --- a/src/racer.c +++ b/src/racer.c @@ -5623,7 +5623,7 @@ s32 func_800599B8(s32 arg0, s32 mapId, s16 arg2, s16 *arg3, s16 *arg4) { s16 sp2E; temp_t8 = (D_8011D59C + 1) & 1; - temp_v0 = func_80074B34(arg0, (s16)mapId, arg2, arg3, arg4, &sp2E, (GhostHeader *) gGhostData[temp_t8]); + temp_v0 = func_80074B34(arg0, (s16) mapId, arg2, arg3, arg4, &sp2E, (GhostHeader *) gGhostData[temp_t8]); if (arg3 != 0) { if (temp_v0 == 0) { D_8011D5A0[temp_t8] = sp2E; diff --git a/src/save_data.c b/src/save_data.c index e7ef32b7..87436b27 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -1146,21 +1146,33 @@ s32 get_ghost_data_file_size(void) { } #ifdef NON_EQUIVALENT -s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData) { +typedef struct unkGhostData { + u8 unk0; + u8 unk1; + s16 unk2; + u8 unk4; + u8 unk5; + s16 unk6; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; + u8 unkC; +} unkGhostData; +s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, u16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData) { #define GHSS_FILE_SIZE 0x100 - u8 *fileData; + static OSPfs *pfs; //Maybe static? + s32 i; + u8 *cPakFile; + s32 bytesFree; s32 fileNumber; + s32 notesFree; s32 fileOffset; s32 fileSize; - s32 bytesFree; - s32 notesFree; - s32 ret; - s32 retTemp; - s32 var_v1; - u8 *temp_a1; - GhostHeader *ghostHeader; - u8 *var_v0_2; - u8 *temp_v0_4; + SIDeviceStatus ret; + SIDeviceStatus retTemp; + GhostHeader *fileData; + unkGhostData *temp_v0_4; fileOffset = 0; ret = get_si_device_status(controllerIndex); @@ -1174,46 +1186,42 @@ s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 *ghostCha } ret = get_file_number(controllerIndex, (char *) sDKRacingGhosts, (char *) sDKRacingGhostFileExt, &fileNumber); if (ret == CONTROLLER_PAK_GOOD) { - fileData = allocate_from_main_pool_safe(GHSS_FILE_SIZE, COLOUR_TAG_BLACK); - if (!(pfs[controllerIndex].status & PFS_INITIALIZED)) { - osPfsInit(sControllerMesgQueue, &pfs[controllerIndex], controllerIndex); + cPakFile = allocate_from_main_pool_safe(GHSS_FILE_SIZE, COLOUR_TAG_BLACK); + pfs = &pfs[controllerIndex]; //This should be uninintialized? + if (!(pfs->status & PFS_INITIALIZED)) { + osPfsInit(sControllerMesgQueue, &pfs, controllerIndex); } - ret = read_data_from_controller_pak(controllerIndex, fileNumber, fileData, GHSS_FILE_SIZE); + ret = read_data_from_controller_pak(controllerIndex, fileNumber, cPakFile, GHSS_FILE_SIZE); if (ret == CONTROLLER_PAK_GOOD) { - temp_a1 = fileData + 4; - if (fileData[0] == GHSS) { - var_v1 = 0; - var_v0_2 = temp_a1; -loop_10: - var_v1 += 4; - if ((levelId == var_v0_2[0]) && (vehicleId == var_v0_2[1])) { - fileOffset = var_v0_2[2]; - fileSize = var_v0_2[6] - var_v0_2[2]; - } else { - var_v0_2 += 4; - if (var_v1 < 24) { - goto loop_10; + //The first 4 bytes of any data from the controller pak will have initials declaring it's type. + if (*((s32 *)cPakFile) == GHSS) { + fileData = (GhostHeader *) (cPakFile + 4); + for (i = 0; i < 5; i++) { + if (levelId == fileData[i].unk0.levelID && vehicleId == fileData[i].unk0.vehicleID) { + fileOffset = fileData[i].unk2; + fileSize = fileData[i].nodeCount - fileData[i].unk2; + break; } } if (fileOffset == 0) { ret = CONTROLLER_PAK_NO_ROOM_FOR_GHOSTS; - if (fileData[4] == 0xFF) { + if (fileData->unk0.levelID == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } - temp_v0_4 = temp_a1 + (2 * 4); - if (fileData[4] == 0xFF) { + if (fileData->unk4 == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } - if (temp_v0_4[0] == 0xFF) { + temp_v0_4 = (unkGhostData *) (fileData + 1); + if (temp_v0_4->unk0 == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } - if (temp_v0_4[4] == 0xFF) { + if (temp_v0_4->unk4 == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } - if (temp_v0_4[8] == 0xFF) { + if (temp_v0_4->unk8 == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } - if (temp_v0_4[12] == 0xFF) { + if (temp_v0_4->unkC == 0xFF) { ret = CONTROLLER_PAK_SWITCH_TO_RUMBLE; } } @@ -1221,23 +1229,24 @@ loop_10: ret = CONTROLLER_PAK_BAD_DATA; } } - free_from_memory_pool(fileData); + free_from_memory_pool(cPakFile); if (fileOffset != 0) { if (ghostCharacterId != NULL) { - ghostHeader = allocate_from_main_pool_safe(fileSize + GHSS_FILE_SIZE, COLOUR_TAG_BLACK); + cPakFile = allocate_from_main_pool_safe(fileSize + GHSS_FILE_SIZE, COLOUR_TAG_BLACK); retTemp = CONTROLLER_PAK_BAD_DATA; - if (osPfsReadWriteFile(&pfs[controllerIndex], fileNumber, PFS_READ, fileOffset, fileSize, (u8 *) ghostHeader) == 0) { - if (calculate_ghost_header_checksum(ghostHeader) == ghostHeader->checksum) { - *ghostCharacterId = ghostHeader->characterID; - *ghostTime = ghostHeader->time; - *ghostNodeCount = ghostHeader->nodeCount; - bcopy(ghostHeader + 8, ghostData, *ghostNodeCount * sizeof(GhostNode)); + if (osPfsReadWriteFile(pfs, fileNumber, PFS_READ, fileOffset, fileSize, cPakFile) == 0) { + fileData = (GhostHeader *) cPakFile; + if (calculate_ghost_header_checksum(fileData) == fileData->checksum) { + *ghostCharacterId = fileData->characterID; + *ghostTime = fileData->time; + *ghostNodeCount = fileData->nodeCount; + bcopy(fileData, ghostData, *ghostNodeCount * sizeof(GhostNode)); retTemp = CONTROLLER_PAK_GOOD; } else { retTemp = CONTROLLER_PAK_BAD_DATA; } } - free_from_memory_pool(ghostHeader); + free_from_memory_pool(cPakFile); ret = retTemp; } } @@ -1248,13 +1257,13 @@ loop_10: start_reading_controller_data(controllerIndex); if (ret == CONTROLLER_PAK_CHANGED) { if (get_free_space(controllerIndex, &bytesFree, ¬esFree) == CONTROLLER_PAK_GOOD) { - if ((bytesFree < get_ghost_data_file_size()) || ((notesFree == 0))) { + if (bytesFree < get_ghost_data_file_size() || notesFree == 0) { return CONTROLLER_PAK_FULL; } - /* Duplicate return node #48. Try simplifying control flow for better match */ - return ret; } - return CONTROLLER_PAK_BAD_DATA; + else { + return CONTROLLER_PAK_BAD_DATA; + } } return ret; } @@ -1307,7 +1316,50 @@ typedef struct GhostData { /* 0x1E */ s16 unk1E; } GhostData; +#ifdef NON_EQUIVALENT +//This is just a mess until we can figure out the ghost data structs properly. +SIDeviceStatus func_80074EB8(s32 controllerIndex, s16 arg1, s16 arg2, s16 ghostCharacterId, s16 ghostTime, s16 ghostNodeCount, u8 *dest) { + #define GHSS_FILE_SIZE 0x100 + SIDeviceStatus ret; + s32 fileSize; + u8 *temp_v0_3; + GhostDataData *temp_v0_4; + void *temp_v0_5; + GhostHeader *temp_v1; + GhostHeader *ghost; + + fileSize = 0x1100 * 6; + temp_v0_3 = allocate_from_main_pool_safe(fileSize + 0x200, COLOUR_TAG_BLACK); + *((s32 *)temp_v0_3) = GHSS; + ghost = (GhostHeader *) (temp_v0_3 + 4); + //temp_v0_3->unk0 = GHSS; + ghost->unk0.levelID = arg1; + ghost->nodeCount = 0x100; + temp_v1 = ghost + 4; + //ghost->unkA = (s16) (ghost->nodeCount + 0x1100); + ghost->unk5 = arg2; + temp_v0_4 = temp_v1 + 4; + temp_v0_4->unk0 = 0xFF; + temp_v0_4->unk4 = 0xFF; + temp_v0_4->unk2 = (s16) temp_v1->time; + temp_v0_4->unk6 = (s16) temp_v1->time; + // temp_v0_5 = temp_v1 + (3 * 4); + // temp_v0_5->unk0 = 0xFF; + // temp_v0_5->unk4 = 0xFF; + // temp_v0_5->unk2 = (s16) temp_v1->time; + // temp_v0_5->unk8 = 0xFF; + // temp_v0_5->unk6 = (s16) temp_v1->time; + // temp_v0_5->unkC = 0xFF; + // temp_v0_5->unkA = (s16) temp_v1->time; + // temp_v0_5->unkE = (s16) temp_v1->time; + func_80074AA8((GhostHeader *) &ghost[temp_v1->unk2], ghostCharacterId, ghostTime, ghostNodeCount, dest); + ret = write_controller_pak_file(controllerIndex, -1, "DKRACING-GHOSTS", "", (u8 *) ghost, fileSize + GHSS_FILE_SIZE); + free_from_memory_pool(ghost); + return ret; +} +#else GLOBAL_ASM("asm/non_matchings/save_data/func_80074EB8.s") +#endif #ifdef NON_EQUIVALENT SIDeviceStatus func_80075000(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 ghostCharacterId, s16 ghostTime, s16 ghostNodeCount, GhostHeader *ghostData) { @@ -1990,7 +2042,7 @@ SIDeviceStatus write_controller_pak_file(s32 controllerIndex, s32 fileNumber, ch u8 fileNameAsFontCodes[PFS_FILE_NAME_LEN]; UNUSED s32 temp2; u8 fileExtAsFontCodes[PFS_FILE_EXT_LEN]; - s32 ret; + SIDeviceStatus ret; s32 file_number; s32 bytesToSave; u32 game_code; diff --git a/src/save_data.h b/src/save_data.h index d454dce9..c7dfa30d 100644 --- a/src/save_data.h +++ b/src/save_data.h @@ -114,11 +114,11 @@ void func_800732E8(Settings *settings, u8 *saveData); void func_800738A4(Settings *settings, u8 *saveData); //Using some context, and best guesses, these could be the names of the variables -s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, s16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData); //Non matching +s32 func_80074B34(s32 controllerIndex, s16 levelId, s16 vehicleId, u16 *ghostCharacterId, s16 *ghostTime, s16 *ghostNodeCount, GhostHeader *ghostData); //Non matching char *string_to_font_codes(char *inString, char *outString, s32 stringLength); //Reasonably certain about these names for now. -s32 func_80074EB8(s32 controllerIndex, s16 arg1, s16 arg2, s16 ghostCharacterId, s16 ghostTime, s16 ghostNodeCount, u8 *dest); +SIDeviceStatus func_80074EB8(s32 controllerIndex, s16 arg1, s16 arg2, s16 ghostCharacterId, s16 ghostTime, s16 ghostNodeCount, u8 *dest); SIDeviceStatus func_80075000(s32 controllerIndex, s16 arg1, s16 arg2, s16 ghostCharacterId, s16 ghostTime, s16 ghostNodeCount, GhostHeader *arg6); s32 func_800753D8(s32 controllerIndex, s32 arg1); diff --git a/src/tracks.c b/src/tracks.c index b0904c32..c487d8fa 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -1677,7 +1677,142 @@ s32 func_8002B9BC(Object *obj, f32 *arg1, f32 *arg2, s32 arg3) { } } +#ifdef NON_MATCHING +// Collision: Returns the Y Values in yOut, and the number of values in the array as the return. +// Get's the Y Offset acrross a surface. +// Basically it goes down, finds a triangle, then locates where the intersection is and returns the Y level of that. +s32 func_8002BAB0(s32 levelSegmentIndex, f32 xIn, f32 zIn, f32 *yOut) { + LevelModelSegment *currentSegment; + LevelModelSegmentBoundingBox *currentBoundingBox; + Triangle *tri; + Vertex *vert; + f32 temp_f2_2; + s16 vert2X; + s16 vert2Z; + s16 temp_a2; + s16 vert3X; + s16 vert3Z; + s32 currentVerticesOffset; + s16 nextFaceOffset; + s16 vert1X; + s16 currentFaceOffset; + s16 vert1Z; + s16 var_a1; + s32 faceNum; + s16 var_s1; + s16 var_t0; + s16 var_t1; + s32 XInInt; + s32 ZInInt; + s32 temp_ra_1; + s32 temp_ra_2; + s32 temp_ra_3; + s32 yOutCount; + s32 batchNum; + s32 i; + s32 var_v0; + s32 stopSorting; + TriangleBatchInfo *currentBatch; + f32 *temp_v1_4; + Vec4f tempVec4f; + u16 *new_var; + u16 temp; + + if (levelSegmentIndex < 0 || levelSegmentIndex >= gCurrentLevelModel->numberOfSegments) { + return 0; + } + + // if (!temp_v1_4){} //Fake, but fixes one regalloc, at the cost of a much worse stack. + vert = NULL; //fake? + currentSegment = &gCurrentLevelModel->segments[levelSegmentIndex]; + currentBoundingBox = &gCurrentLevelModel->segmentsBoundingBoxes[levelSegmentIndex]; + var_a1 = 1; + var_s1 = 0; + XInInt = xIn; + ZInInt = zIn; + + temp_a2 = ((currentBoundingBox->x2 - currentBoundingBox->x1) >> 3) + 1; + var_t0 = temp_a2 + currentBoundingBox->x1; + var_t1 = currentBoundingBox->x1; + for (i = 0; i < 8; i++) { + if (var_t0 >= XInInt && XInInt >= var_t1) { + var_s1 |= var_a1; + } + var_t0 += temp_a2; + var_t1 += temp_a2; + var_a1 *= 2; + } + + //Same as above, but for Z + temp_a2 = ((currentBoundingBox->z2 - currentBoundingBox->z1) >> 3) + 1; + var_t0 = temp_a2 + currentBoundingBox->z1; + var_t1 = currentBoundingBox->z1; + for (i = 0; i < 8; i++) { + if (var_t0 >= ZInInt && ZInInt >= var_t1) { + var_s1 |= var_a1; + } + var_t0 += temp_a2; + var_t1 += temp_a2; + var_a1 *= 2; + } + + yOutCount = 0; + for (batchNum = 0; batchNum < currentSegment->numberOfBatches; batchNum++) { + if (1) { } // fake + currentBatch = ¤tSegment->batches[batchNum]; + currentFaceOffset = currentBatch->facesOffset; + nextFaceOffset = (currentBatch + 1)->facesOffset; + currentVerticesOffset = currentBatch->verticesOffset; + for (faceNum = currentFaceOffset; faceNum < nextFaceOffset; faceNum++) { + if (var_s1 == (currentSegment->unk10[faceNum] & var_s1)) { + tri = ¤tSegment->triangles[faceNum]; + vert = ¤tSegment->vertices[tri->verticesArray[1] + currentVerticesOffset]; + vert1X = vert->x; + vert1Z = vert->z; + vert = ¤tSegment->vertices[tri->verticesArray[2] + currentVerticesOffset]; + vert2X = vert->x; + vert2Z = vert->z; + vert = ¤tSegment->vertices[tri->verticesArray[3] + currentVerticesOffset]; + vert3X = vert->x; + vert3Z = vert->z; + temp_ra_1 = ((((XInInt - vert2X) * (vert3Z - vert2Z)) - ((vert3X - vert2X) * (ZInInt - vert2Z))) >= 0); + temp_ra_2 = ((((XInInt - vert1X) * (vert2Z - vert1Z)) - ((vert2X - vert1X) * (ZInInt - vert1Z))) >= 0); + temp_ra_3 = ((((XInInt - vert1X) * (vert3Z - vert1Z)) - ((vert3X - vert1X) * (ZInInt - vert1Z))) >= 0); + var_v0 = faceNum; //fake? + if (temp_ra_1 == temp_ra_2 && temp_ra_2 != temp_ra_3) { + new_var = currentSegment->unk14; + temp = new_var[faceNum * 4]; + temp_v1_4 = (f32 *) ¤tSegment->unk18[temp * 4]; + tempVec4f.x = temp_v1_4[0]; + tempVec4f.y = temp_v1_4[1]; + tempVec4f.z = temp_v1_4[2]; + tempVec4f.w = temp_v1_4[3]; + if (tempVec4f.y != 0.0) { + yOut[yOutCount] = -(((tempVec4f.x * xIn) + (tempVec4f.z * zIn) + tempVec4f.w) / tempVec4f.y); + yOutCount++; + } + } + } + } + } + + do { + stopSorting = TRUE; + for (var_v0 = 0; var_v0 < yOutCount - 1; var_v0++) { + if (yOut[var_v0] > yOut[var_v0 + 1]) { + stopSorting = FALSE; + temp_f2_2 = yOut[var_v0]; + yOut[var_v0] = yOut[var_v0 + 1]; + yOut[var_v0 + 1] = temp_f2_2; + } + } + } while (!stopSorting); + + return yOutCount; +} +#else GLOBAL_ASM("asm/non_matchings/tracks/func_8002BAB0.s") +#endif #ifdef NON_MATCHING // generate_track @@ -1730,7 +1865,7 @@ void func_8002C0C4(s32 modelId) { LOCAL_OFFSET_TO_RAM_ADDRESS(Vertex *, gCurrentLevelModel->segments[k].vertices); LOCAL_OFFSET_TO_RAM_ADDRESS(Triangle *, gCurrentLevelModel->segments[k].triangles); LOCAL_OFFSET_TO_RAM_ADDRESS(TriangleBatchInfo *, gCurrentLevelModel->segments[k].batches); - LOCAL_OFFSET_TO_RAM_ADDRESS(u8 *, gCurrentLevelModel->segments[k].unk14); + LOCAL_OFFSET_TO_RAM_ADDRESS(u16 *, gCurrentLevelModel->segments[k].unk14); } for(k = 0; k < gCurrentLevelModel->numberOfTextures; k++) { gCurrentLevelModel->textures[k].texture = load_texture(((s32)gCurrentLevelModel->textures[k].texture) | 0x8000); @@ -1739,7 +1874,7 @@ void func_8002C0C4(s32 modelId) { for(k = 0; k < gCurrentLevelModel->numberOfSegments; k++) { gCurrentLevelModel->segments[k].unk10 = (s16 *) j; j = (s32) align16(((u8 *) (gCurrentLevelModel->segments[k].numberOfTriangles * 2)) + j); - gCurrentLevelModel->segments[k].unk18 = (s16 *) j; + gCurrentLevelModel->segments[k].unk18 = (f32 *) j; j = (s32) &((u8*)j)[func_8002CC30(&gCurrentLevelModel->segments[k])]; func_8002C954(&gCurrentLevelModel->segments[k], &gCurrentLevelModel->segmentsBoundingBoxes[k], k); gCurrentLevelModel->segments[k].unk30 = 0; diff --git a/src/tracks.h b/src/tracks.h index d8e47316..a85d9f11 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -205,7 +205,7 @@ void func_8002EEEC(void); void func_8002F2AC(void); void func_8002F440(void); f32 func_8002FA64(void); -s32 func_8002BAB0(s32, f32, f32, f32*); +s32 func_8002BAB0(s32 levelSegmentIndex, f32 xIn, f32 zIn, f32 *yOut); void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, u32 entranceId, u32 collectables, u32 arg6); void func_800B82B4(LevelModel *, LevelHeader *, s32); void func_80025510(s32);