diff --git a/README.md b/README.md index af052b88..ed57022c 100755 --- a/README.md +++ b/README.md @@ -113,24 +113,24 @@ s32 is_drumstick_unlocked(void) { } ``` -As of August 15th 2021, this is our current score: +As of August 18th 2021, this is our current score: ``` ======================================================= ADVENTURE ONE (ASM -> C Decompilation) - ------------------- 14.00% Complete ------------------- - # Decompiled functions: 874 - # GLOBAL_ASM remaining: 903 - # NON_MATCHING functions: 92 + ------------------- 14.25% Complete ------------------- + # Decompiled functions: 884 + # GLOBAL_ASM remaining: 894 + # NON_MATCHING functions: 100 --------------------- Game Status --------------------- Balloons: 8/47, Keys: 1/4, Trophies: 0/5 T.T. Amulets: 0/4, Wizpig Amulets: 0/4 ------------------------------------------------------- - We are collecting eggs in Fire Mountain. (0/3 Eggs) + We are collecting eggs in Fire Mountain. (1/3 Eggs) ======================================================= ADVENTURE TWO (Cleanup & Documentation) ------------------- 0.75% Complete ------------------- # Documented functions: 61 - # Undocumented remaining: 1716 + # Undocumented remaining: 1717 --------------------- Game Status --------------------- Balloons: 0/47, Keys: 0/4, Trophies: 0/5 T.T. Amulets: 0/4, Wizpig Amulets: 0/4 diff --git a/asm/non_matchings/textures_sprites/func_8007F460.s b/asm/non_matchings/textures_sprites/func_8007F460.s deleted file mode 100644 index 6fd90741..00000000 --- a/asm/non_matchings/textures_sprites/func_8007F460.s +++ /dev/null @@ -1,88 +0,0 @@ -glabel func_8007F460 -/* 080060 8007F460 948E0000 */ lhu $t6, ($a0) -/* 080064 8007F464 00000000 */ nop -/* 080068 8007F468 29C10002 */ slti $at, $t6, 2 -/* 08006C 8007F46C 14200047 */ bnez $at, .L8007F58C -/* 080070 8007F470 00000000 */ nop -/* 080074 8007F474 948F0004 */ lhu $t7, 4($a0) -/* 080078 8007F478 94830006 */ lhu $v1, 6($a0) -/* 08007C 8007F47C 01E5C021 */ addu $t8, $t7, $a1 -/* 080080 8007F480 3302FFFF */ andi $v0, $t8, 0xffff -/* 080084 8007F484 0043082A */ slt $at, $v0, $v1 -/* 080088 8007F488 14200006 */ bnez $at, .L8007F4A4 -/* 08008C 8007F48C A4980004 */ sh $t8, 4($a0) -.L8007F490: -/* 080090 8007F490 0043C823 */ subu $t9, $v0, $v1 -/* 080094 8007F494 3322FFFF */ andi $v0, $t9, 0xffff -/* 080098 8007F498 0043082A */ slt $at, $v0, $v1 -/* 08009C 8007F49C 1020FFFC */ beqz $at, .L8007F490 -/* 0800A0 8007F4A0 A4990004 */ sh $t9, 4($a0) -.L8007F4A4: -/* 0800A4 8007F4A4 94830002 */ lhu $v1, 2($a0) -/* 0800A8 8007F4A8 00000000 */ nop -/* 0800AC 8007F4AC 00034080 */ sll $t0, $v1, 2 -/* 0800B0 8007F4B0 00884821 */ addu $t1, $a0, $t0 -/* 0800B4 8007F4B4 9525000E */ lhu $a1, 0xe($t1) -/* 0800B8 8007F4B8 00000000 */ nop -/* 0800BC 8007F4BC 0045082A */ slt $at, $v0, $a1 -/* 0800C0 8007F4C0 14200013 */ bnez $at, .L8007F510 -/* 0800C4 8007F4C4 00000000 */ nop -.L8007F4C8: -/* 0800C8 8007F4C8 948C0000 */ lhu $t4, ($a0) -/* 0800CC 8007F4CC 246B0001 */ addiu $t3, $v1, 1 -/* 0800D0 8007F4D0 3163FFFF */ andi $v1, $t3, 0xffff -/* 0800D4 8007F4D4 00455023 */ subu $t2, $v0, $a1 -/* 0800D8 8007F4D8 006C082A */ slt $at, $v1, $t4 -/* 0800DC 8007F4DC A48A0004 */ sh $t2, 4($a0) -/* 0800E0 8007F4E0 14200003 */ bnez $at, .L8007F4F0 -/* 0800E4 8007F4E4 A48B0002 */ sh $t3, 2($a0) -/* 0800E8 8007F4E8 A4800002 */ sh $zero, 2($a0) -/* 0800EC 8007F4EC 3003FFFF */ andi $v1, $zero, 0xffff -.L8007F4F0: -/* 0800F0 8007F4F0 00036880 */ sll $t5, $v1, 2 -/* 0800F4 8007F4F4 008D7021 */ addu $t6, $a0, $t5 -/* 0800F8 8007F4F8 95C5000E */ lhu $a1, 0xe($t6) -/* 0800FC 8007F4FC 94820004 */ lhu $v0, 4($a0) -/* 080100 8007F500 00000000 */ nop -/* 080104 8007F504 0045082A */ slt $at, $v0, $a1 -/* 080108 8007F508 1020FFEF */ beqz $at, .L8007F4C8 -/* 08010C 8007F50C 00000000 */ nop -.L8007F510: -/* 080110 8007F510 948F0000 */ lhu $t7, ($a0) -/* 080114 8007F514 24670001 */ addiu $a3, $v1, 1 -/* 080118 8007F518 00EF082A */ slt $at, $a3, $t7 -/* 08011C 8007F51C 00602825 */ move $a1, $v1 -/* 080120 8007F520 14200002 */ bnez $at, .L8007F52C -/* 080124 8007F524 00E03025 */ move $a2, $a3 -/* 080128 8007F528 00003025 */ move $a2, $zero -.L8007F52C: -/* 08012C 8007F52C 0006C880 */ sll $t9, $a2, 2 -/* 080130 8007F530 00994021 */ addu $t0, $a0, $t9 -/* 080134 8007F534 9509000C */ lhu $t1, 0xc($t0) -/* 080138 8007F538 0005C080 */ sll $t8, $a1, 2 -/* 08013C 8007F53C 01220019 */ multu $t1, $v0 -/* 080140 8007F540 00981821 */ addu $v1, $a0, $t8 -/* 080144 8007F544 946B000E */ lhu $t3, 0xe($v1) -/* 080148 8007F548 946D000C */ lhu $t5, 0xc($v1) -/* 08014C 8007F54C 00005012 */ mflo $t2 -/* 080150 8007F550 00000000 */ nop -/* 080154 8007F554 00000000 */ nop -/* 080158 8007F558 014B001A */ div $zero, $t2, $t3 -/* 08015C 8007F55C 15600002 */ bnez $t3, .L8007F568 -/* 080160 8007F560 00000000 */ nop -/* 080164 8007F564 0007000D */ break 7 -.L8007F568: -/* 080168 8007F568 2401FFFF */ li $at, -1 -/* 08016C 8007F56C 15610004 */ bne $t3, $at, .L8007F580 -/* 080170 8007F570 3C018000 */ lui $at, 0x8000 -/* 080174 8007F574 15410002 */ bne $t2, $at, .L8007F580 -/* 080178 8007F578 00000000 */ nop -/* 08017C 8007F57C 0006000D */ break 6 -.L8007F580: -/* 080180 8007F580 00006012 */ mflo $t4 -/* 080184 8007F584 018D7021 */ addu $t6, $t4, $t5 -/* 080188 8007F588 AC8E0008 */ sw $t6, 8($a0) -.L8007F58C: -/* 08018C 8007F58C 03E00008 */ jr $ra -/* 080190 8007F590 00000000 */ nop - diff --git a/asm/non_matchings/unknown_0255E0/func_800249F0.s b/asm/non_matchings/unknown_0255E0/func_800249F0.s index adc29b9c..6882ca33 100644 --- a/asm/non_matchings/unknown_0255E0/func_800249F0.s +++ b/asm/non_matchings/unknown_0255E0/func_800249F0.s @@ -11,8 +11,8 @@ glabel func_800249F0 /* 025614 80024A14 0C01AF6C */ jal get_current_level_header /* 025618 80024A18 AFA70034 */ sw $a3, 0x34($sp) /* 02561C 80024A1C 3C048012 */ lui $a0, %hi(D_8011B0F8) # $a0, 0x8012 -/* 025620 80024A20 3C05800E */ lui $a1, %hi(D_800DC91C) # $a1, 0x800e -/* 025624 80024A24 24A5C91C */ addiu $a1, %lo(D_800DC91C) # addiu $a1, $a1, -0x36e4 +/* 025620 80024A20 3C05800E */ lui $a1, %hi(gCurrentLevelHeader2) # $a1, 0x800e +/* 025624 80024A24 24A5C91C */ addiu $a1, %lo(gCurrentLevelHeader2) # addiu $a1, $a1, -0x36e4 /* 025628 80024A28 2484B0F8 */ addiu $a0, %lo(D_8011B0F8) # addiu $a0, $a0, -0x4f08 /* 02562C 80024A2C ACA20000 */ sw $v0, ($a1) /* 025630 80024A30 AC800000 */ sw $zero, ($a0) @@ -78,8 +78,8 @@ glabel func_800249F0 /* 02570C 80024B0C 0C027B20 */ jal is_in_two_player_adventure /* 025710 80024B10 00000000 */ nop /* 025714 80024B14 1040000B */ beqz $v0, .L80024B44 -/* 025718 80024B18 3C0E800E */ lui $t6, %hi(D_800DC91C) # $t6, 0x800e -/* 02571C 80024B1C 8DCEC91C */ lw $t6, %lo(D_800DC91C)($t6) +/* 025718 80024B18 3C0E800E */ lui $t6, %hi(gCurrentLevelHeader2) # $t6, 0x800e +/* 02571C 80024B1C 8DCEC91C */ lw $t6, %lo(gCurrentLevelHeader2)($t6) /* 025720 80024B20 00000000 */ nop /* 025724 80024B24 81C3004C */ lb $v1, 0x4c($t6) /* 025728 80024B28 00000000 */ nop @@ -100,8 +100,8 @@ glabel func_800249F0 /* 025754 80024B54 00000000 */ nop /* 025758 80024B58 13000006 */ beqz $t8, .L80024B74 /* 02575C 80024B5C 3C04800E */ lui $a0, %hi(gCurrentLevelModel) # $a0, 0x800e -/* 025760 80024B60 3C05800E */ lui $a1, %hi(D_800DC91C) # $a1, 0x800e -/* 025764 80024B64 8CA5C91C */ lw $a1, %lo(D_800DC91C)($a1) +/* 025760 80024B60 3C05800E */ lui $a1, %hi(gCurrentLevelHeader2) # $a1, 0x800e +/* 025764 80024B64 8CA5C91C */ lw $a1, %lo(gCurrentLevelHeader2)($a1) /* 025768 80024B68 8C84C918 */ lw $a0, %lo(gCurrentLevelModel)($a0) /* 02576C 80024B6C 0C02E0AD */ jal func_800B82B4 /* 025770 80024B70 00000000 */ nop @@ -204,8 +204,8 @@ glabel func_800249F0 /* 0258E4 80024CE4 0C00B637 */ jal func_8002D8DC /* 0258E8 80024CE8 00003025 */ move $a2, $zero /* 0258EC 80024CEC AE000000 */ sw $zero, ($s0) -/* 0258F0 80024CF0 3C02800E */ lui $v0, %hi(D_800DC91C) # $v0, 0x800e -/* 0258F4 80024CF4 8C42C91C */ lw $v0, %lo(D_800DC91C)($v0) +/* 0258F0 80024CF0 3C02800E */ lui $v0, %hi(gCurrentLevelHeader2) # $v0, 0x800e +/* 0258F4 80024CF4 8C42C91C */ lw $v0, %lo(gCurrentLevelHeader2)($v0) /* 0258F8 80024CF8 3C018012 */ lui $at, %hi(D_8011B0E1) # $at, 0x8012 /* 0258FC 80024CFC 904C00B7 */ lbu $t4, 0xb7($v0) /* 025900 80024D00 00000000 */ nop diff --git a/asm/non_matchings/unknown_0255E0/func_80024D54.s b/asm/non_matchings/unknown_0255E0/func_80024D54.s index b063d87f..a53579c5 100644 --- a/asm/non_matchings/unknown_0255E0/func_80024D54.s +++ b/asm/non_matchings/unknown_0255E0/func_80024D54.s @@ -58,8 +58,8 @@ glabel func_80024D54 /* 025A28 80024E28 24040002 */ li $a0, 2 /* 025A2C 80024E2C 0C00B637 */ jal func_8002D8DC /* 025A30 80024E30 24050002 */ li $a1, 2 -/* 025A34 80024E34 3C03800E */ lui $v1, %hi(D_800DC91C) # $v1, 0x800e -/* 025A38 80024E38 8C63C91C */ lw $v1, %lo(D_800DC91C)($v1) +/* 025A34 80024E34 3C03800E */ lui $v1, %hi(gCurrentLevelHeader2) # $v1, 0x800e +/* 025A38 80024E38 8C63C91C */ lw $v1, %lo(gCurrentLevelHeader2)($v1) /* 025A3C 80024E3C 00001025 */ move $v0, $zero /* 025A40 80024E40 0062C821 */ addu $t9, $v1, $v0 .L80024E44: @@ -70,8 +70,8 @@ glabel func_80024D54 /* 025A54 80024E54 8FA50084 */ lw $a1, 0x84($sp) /* 025A58 80024E58 0C01FC93 */ jal func_8007F24C /* 025A5C 80024E5C AFA20034 */ sw $v0, 0x34($sp) -/* 025A60 80024E60 3C03800E */ lui $v1, %hi(D_800DC91C) # $v1, 0x800e -/* 025A64 80024E64 8C63C91C */ lw $v1, %lo(D_800DC91C)($v1) +/* 025A60 80024E60 3C03800E */ lui $v1, %hi(gCurrentLevelHeader2) # $v1, 0x800e +/* 025A64 80024E64 8C63C91C */ lw $v1, %lo(gCurrentLevelHeader2)($v1) /* 025A68 80024E68 8FA20034 */ lw $v0, 0x34($sp) /* 025A6C 80024E6C 00000000 */ nop .L80024E70: @@ -84,10 +84,10 @@ glabel func_80024D54 /* 025A88 80024E88 10810007 */ beq $a0, $at, .L80024EA8 /* 025A8C 80024E8C 00000000 */ nop /* 025A90 80024E90 8FA50084 */ lw $a1, 0x84($sp) -/* 025A94 80024E94 0C01FD18 */ jal func_8007F460 +/* 025A94 80024E94 0C01FD18 */ jal update_pulsating_light_data /* 025A98 80024E98 00000000 */ nop -/* 025A9C 80024E9C 3C03800E */ lui $v1, %hi(D_800DC91C) # $v1, 0x800e -/* 025AA0 80024EA0 8C63C91C */ lw $v1, %lo(D_800DC91C)($v1) +/* 025A9C 80024E9C 3C03800E */ lui $v1, %hi(gCurrentLevelHeader2) # $v1, 0x800e +/* 025AA0 80024EA0 8C63C91C */ lw $v1, %lo(gCurrentLevelHeader2)($v1) /* 025AA4 80024EA4 00000000 */ nop .L80024EA8: /* 025AA8 80024EA8 3C048012 */ lui $a0, %hi(D_8011B0E0) # $a0, 0x8012 @@ -126,8 +126,8 @@ glabel func_80024D54 /* 025B20 80024F20 846E00A8 */ lh $t6, 0xa8($v1) /* 025B24 80024F24 00086A40 */ sll $t5, $t0, 9 /* 025B28 80024F28 25A8FFFF */ addiu $t0, $t5, -1 -/* 025B2C 80024F2C 3C02800E */ lui $v0, %hi(D_800DC91C) # $v0, 0x800e -/* 025B30 80024F30 2442C91C */ addiu $v0, %lo(D_800DC91C) # addiu $v0, $v0, -0x36e4 +/* 025B2C 80024F2C 3C02800E */ lui $v0, %hi(gCurrentLevelHeader2) # $v0, 0x800e +/* 025B30 80024F30 2442C91C */ addiu $v0, %lo(gCurrentLevelHeader2) # addiu $v0, $v0, -0x36e4 /* 025B34 80024F34 3C058012 */ lui $a1, %hi(D_8011B114) # $a1, 0x8012 /* 025B38 80024F38 3C068012 */ lui $a2, %hi(D_8011B110) # $a2, 0x8012 /* 025B3C 80024F3C 24C6B110 */ addiu $a2, %lo(D_8011B110) # addiu $a2, $a2, -0x4ef0 @@ -275,8 +275,8 @@ glabel func_80024D54 /* 025D54 80025154 02202025 */ move $a0, $s1 /* 025D58 80025158 0C01A102 */ jal func_80068408 /* 025D5C 8002515C 02402825 */ move $a1, $s2 -/* 025D60 80025160 3C0E800E */ lui $t6, %hi(D_800DC91C) # $t6, 0x800e -/* 025D64 80025164 8DCEC91C */ lw $t6, %lo(D_800DC91C)($t6) +/* 025D60 80025160 3C0E800E */ lui $t6, %hi(gCurrentLevelHeader2) # $t6, 0x800e +/* 025D64 80025164 8DCEC91C */ lw $t6, %lo(gCurrentLevelHeader2)($t6) /* 025D68 80025168 2401FFFF */ li $at, -1 /* 025D6C 8002516C 81D80049 */ lb $t8, 0x49($t6) /* 025D70 80025170 00000000 */ nop @@ -315,8 +315,8 @@ glabel func_80024D54 /* 025DE8 800251E8 2404FFFF */ li $a0, -1 /* 025DEC 800251EC 0C02ACC2 */ jal func_800AB308 /* 025DF0 800251F0 2405FE00 */ li $a1, -512 -/* 025DF4 800251F4 3C0B800E */ lui $t3, %hi(D_800DC91C) # $t3, 0x800e -/* 025DF8 800251F8 8D6BC91C */ lw $t3, %lo(D_800DC91C)($t3) +/* 025DF4 800251F4 3C0B800E */ lui $t3, %hi(gCurrentLevelHeader2) # $t3, 0x800e +/* 025DF8 800251F8 8D6BC91C */ lw $t3, %lo(gCurrentLevelHeader2)($t3) /* 025DFC 800251FC 2A610002 */ slti $at, $s3, 2 /* 025E00 80025200 856C0090 */ lh $t4, 0x90($t3) /* 025E04 80025204 00000000 */ nop diff --git a/asm/non_matchings/unknown_0255E0/func_80028050.s b/asm/non_matchings/unknown_0255E0/func_80028050.s index ce6c017d..0b25df8c 100644 --- a/asm/non_matchings/unknown_0255E0/func_80028050.s +++ b/asm/non_matchings/unknown_0255E0/func_80028050.s @@ -10,8 +10,8 @@ glabel func_80028050 /* 028C70 80028070 AFB30020 */ sw $s3, 0x20($sp) /* 028C74 80028074 0C01A748 */ jal func_80069D20 /* 028C78 80028078 AFB2001C */ sw $s2, 0x1c($sp) -/* 028C7C 8002807C 3C0E800E */ lui $t6, %hi(D_800DC91C) # $t6, 0x800e -/* 028C80 80028080 8DCEC91C */ lw $t6, %lo(D_800DC91C)($t6) +/* 028C7C 8002807C 3C0E800E */ lui $t6, %hi(gCurrentLevelHeader2) # $t6, 0x800e +/* 028C80 80028080 8DCEC91C */ lw $t6, %lo(gCurrentLevelHeader2)($t6) /* 028C84 80028084 00409025 */ move $s2, $v0 /* 028C88 80028088 8DC300A4 */ lw $v1, 0xa4($t6) /* 028C8C 8002808C 00000000 */ nop @@ -41,10 +41,10 @@ glabel func_80028050 /* 028CEC 800280EC 46040302 */ mul.s $f12, $f0, $f4 /* 028CF0 800280F0 C7A6010C */ lwc1 $f6, 0x10c($sp) /* 028CF4 800280F4 8FA70074 */ lw $a3, 0x74($sp) -/* 028CF8 800280F8 3C04800E */ lui $a0, %hi(D_800DC91C) # $a0, 0x800e +/* 028CF8 800280F8 3C04800E */ lui $a0, %hi(gCurrentLevelHeader2) # $a0, 0x800e /* 028CFC 800280FC 46083082 */ mul.s $f2, $f6, $f8 /* 028D00 80028100 46006487 */ neg.s $f18, $f12 -/* 028D04 80028104 8C84C91C */ lw $a0, %lo(D_800DC91C)($a0) +/* 028D04 80028104 8C84C91C */ lw $a0, %lo(gCurrentLevelHeader2)($a0) /* 028D08 80028108 46029200 */ add.s $f8, $f18, $f2 /* 028D0C 8002810C 46029281 */ sub.s $f10, $f18, $f2 /* 028D10 80028110 E7A80030 */ swc1 $f8, 0x30($sp) @@ -325,8 +325,8 @@ glabel func_80028050 /* 02915C 8002855C 03236021 */ addu $t4, $t9, $v1 /* 029160 80028560 0C01A102 */ jal func_80068408 /* 029164 80028564 A7AC0124 */ sh $t4, 0x124($sp) -/* 029168 80028568 3C04800E */ lui $a0, %hi(D_800DC91C) # $a0, 0x800e -/* 02916C 8002856C 8C84C91C */ lw $a0, %lo(D_800DC91C)($a0) +/* 029168 80028568 3C04800E */ lui $a0, %hi(gCurrentLevelHeader2) # $a0, 0x800e +/* 02916C 8002856C 8C84C91C */ lw $a0, %lo(gCurrentLevelHeader2)($a0) /* 029170 80028570 2403FFFF */ li $v1, -1 /* 029174 80028574 8C8A0074 */ lw $t2, 0x74($a0) /* 029178 80028578 2406FFFF */ li $a2, -1 diff --git a/asm/non_matchings/unknown_0255E0/func_800289B8.s b/asm/non_matchings/unknown_0255E0/func_800289B8.s index b1cb104a..0473229d 100644 --- a/asm/non_matchings/unknown_0255E0/func_800289B8.s +++ b/asm/non_matchings/unknown_0255E0/func_800289B8.s @@ -1,7 +1,7 @@ glabel func_800289B8 /* 0295B8 800289B8 27BDFFC8 */ addiu $sp, $sp, -0x38 -/* 0295BC 800289BC 3C02800E */ lui $v0, %hi(D_800DC91C) # $v0, 0x800e -/* 0295C0 800289C0 8C42C91C */ lw $v0, %lo(D_800DC91C)($v0) +/* 0295BC 800289BC 3C02800E */ lui $v0, %hi(gCurrentLevelHeader2) # $v0, 0x800e +/* 0295C0 800289C0 8C42C91C */ lw $v0, %lo(gCurrentLevelHeader2)($v0) /* 0295C4 800289C4 AFBF001C */ sw $ra, 0x1c($sp) /* 0295C8 800289C8 AFB00018 */ sw $s0, 0x18($sp) /* 0295CC 800289CC 904E00C1 */ lbu $t6, 0xc1($v0) diff --git a/asm/non_matchings/unknown_0255E0/func_80029D14.s b/asm/non_matchings/unknown_0255E0/func_80029DE0.s similarity index 58% rename from asm/non_matchings/unknown_0255E0/func_80029D14.s rename to asm/non_matchings/unknown_0255E0/func_80029DE0.s index 01a2501f..461ec5fb 100644 --- a/asm/non_matchings/unknown_0255E0/func_80029D14.s +++ b/asm/non_matchings/unknown_0255E0/func_80029DE0.s @@ -1,59 +1,5 @@ -glabel func_80029D14 -/* 02A914 80029D14 27BDFFE8 */ addiu $sp, $sp, -0x18 -/* 02A918 80029D18 3C08800E */ lui $t0, %hi(gCurrentLevelModel) # $t0, 0x800e -/* 02A91C 80029D1C 8D08C918 */ lw $t0, %lo(gCurrentLevelModel)($t0) -/* 02A920 80029D20 AFBF0014 */ sw $ra, 0x14($sp) -/* 02A924 80029D24 AFA60020 */ sw $a2, 0x20($sp) -/* 02A928 80029D28 850E001A */ lh $t6, 0x1a($t0) -/* 02A92C 80029D2C 00803825 */ move $a3, $a0 -/* 02A930 80029D30 008E082A */ slt $at, $a0, $t6 -/* 02A934 80029D34 10200026 */ beqz $at, .L80029DD0 -/* 02A938 80029D38 3C038012 */ lui $v1, %hi(D_8011B0D4) # $v1, 0x8012 -/* 02A93C 80029D3C 8C63B0D4 */ lw $v1, %lo(D_8011B0D4)($v1) -/* 02A940 80029D40 2401FFFF */ li $at, -1 -/* 02A944 80029D44 1061000B */ beq $v1, $at, .L80029D74 -/* 02A948 80029D48 24020001 */ li $v0, 1 -/* 02A94C 80029D4C 8D0F0010 */ lw $t7, 0x10($t0) -/* 02A950 80029D50 0004C8C3 */ sra $t9, $a0, 3 -/* 02A954 80029D54 01E3C021 */ addu $t8, $t7, $v1 -/* 02A958 80029D58 03194821 */ addu $t1, $t8, $t9 -/* 02A95C 80029D5C 91220000 */ lbu $v0, ($t1) -/* 02A960 80029D60 308A0007 */ andi $t2, $a0, 7 -/* 02A964 80029D64 01421006 */ srlv $v0, $v0, $t2 -/* 02A968 80029D68 304B00FF */ andi $t3, $v0, 0xff -/* 02A96C 80029D6C 10000001 */ b .L80029D74 -/* 02A970 80029D70 01601025 */ move $v0, $t3 -.L80029D74: -/* 02A974 80029D74 304C0001 */ andi $t4, $v0, 1 -/* 02A978 80029D78 11800015 */ beqz $t4, .L80029DD0 -/* 02A97C 80029D7C 00077080 */ sll $t6, $a3, 2 -/* 02A980 80029D80 8D0D0008 */ lw $t5, 8($t0) -/* 02A984 80029D84 01C77023 */ subu $t6, $t6, $a3 -/* 02A988 80029D88 000E7080 */ sll $t6, $t6, 2 -/* 02A98C 80029D8C AFA70018 */ sw $a3, 0x18($sp) -/* 02A990 80029D90 AFA5001C */ sw $a1, 0x1c($sp) -/* 02A994 80029D94 0C00A97E */ jal func_8002A5F8 -/* 02A998 80029D98 01AE2021 */ addu $a0, $t5, $t6 -/* 02A99C 80029D9C 8FA5001C */ lw $a1, 0x1c($sp) -/* 02A9A0 80029DA0 8FA70018 */ lw $a3, 0x18($sp) -/* 02A9A4 80029DA4 1040000B */ beqz $v0, .L80029DD4 -/* 02A9A8 80029DA8 8FBF0014 */ lw $ra, 0x14($sp) -/* 02A9AC 80029DAC 8FAF0020 */ lw $t7, 0x20($sp) -/* 02A9B0 80029DB0 8CB80000 */ lw $t8, ($a1) -/* 02A9B4 80029DB4 00000000 */ nop -/* 02A9B8 80029DB8 01F8C821 */ addu $t9, $t7, $t8 -/* 02A9BC 80029DBC A3270000 */ sb $a3, ($t9) -/* 02A9C0 80029DC0 8CA90000 */ lw $t1, ($a1) -/* 02A9C4 80029DC4 00000000 */ nop -/* 02A9C8 80029DC8 252A0001 */ addiu $t2, $t1, 1 -/* 02A9CC 80029DCC ACAA0000 */ sw $t2, ($a1) -.L80029DD0: -/* 02A9D0 80029DD0 8FBF0014 */ lw $ra, 0x14($sp) -.L80029DD4: -/* 02A9D4 80029DD4 27BD0018 */ addiu $sp, $sp, 0x18 -/* 02A9D8 80029DD8 03E00008 */ jr $ra -/* 02A9DC 80029DDC 00000000 */ nop - +# Unused +glabel func_80029DE0 /* 02A9E0 80029DE0 3C02800E */ lui $v0, %hi(gCurrentLevelModel) # $v0, 0x800e /* 02A9E4 80029DE4 8C42C918 */ lw $v0, %lo(gCurrentLevelModel)($v0) /* 02A9E8 80029DE8 00803025 */ move $a2, $a0 diff --git a/asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s b/asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s index ff4688bf..1d951652 100644 --- a/asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s +++ b/asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s @@ -40,7 +40,7 @@ glabel render_level_geometry_and_objects /* 029C2C 8002902C 00002025 */ move $a0, $zero /* 029C30 80029030 00002825 */ move $a1, $zero /* 029C34 80029034 27A700D8 */ addiu $a3, $sp, 0xd8 -/* 029C38 80029038 0C00A6BE */ jal func_80029AF8 +/* 029C38 80029038 0C00A6BE */ jal traverse_segments_bsp_tree /* 029C3C 8002903C 24C6FFFF */ addiu $a2, $a2, -1 /* 029C40 80029040 3C10800E */ lui $s0, %hi(gCurrentLevelModel) # $s0, 0x800e /* 029C44 80029044 8E10C918 */ lw $s0, %lo(gCurrentLevelModel)($s0) diff --git a/asm/non_matchings/unknown_0255E0/render_level_segment.s b/asm/non_matchings/unknown_0255E0/render_level_segment.s index 2ddbf7d6..1e698ef8 100644 --- a/asm/non_matchings/unknown_0255E0/render_level_segment.s +++ b/asm/non_matchings/unknown_0255E0/render_level_segment.s @@ -148,9 +148,9 @@ glabel render_level_segment /* 02A46C 8002986C 3C19FB00 */ lui $t9, 0xfb00 /* 02A470 80029870 260C0008 */ addiu $t4, $s0, 8 /* 02A474 80029874 AE4C0000 */ sw $t4, ($s2) -/* 02A478 80029878 3C0B800E */ lui $t3, %hi(D_800DC91C) # $t3, 0x800e +/* 02A478 80029878 3C0B800E */ lui $t3, %hi(gCurrentLevelHeader2) # $t3, 0x800e /* 02A47C 8002987C AE190000 */ sw $t9, ($s0) -/* 02A480 80029880 8D6BC91C */ lw $t3, %lo(D_800DC91C)($t3) +/* 02A480 80029880 8D6BC91C */ lw $t3, %lo(gCurrentLevelHeader2)($t3) /* 02A484 80029884 00186880 */ sll $t5, $t8, 2 /* 02A488 80029888 016D7021 */ addu $t6, $t3, $t5 /* 02A48C 8002988C 8DC20070 */ lw $v0, 0x70($t6) @@ -179,8 +179,8 @@ glabel render_level_segment /* 02A4E0 800298E0 00115B40 */ sll $t3, $s1, 0xd /* 02A4E4 800298E4 05610046 */ bgez $t3, .L80029A00 /* 02A4E8 800298E8 02402025 */ move $a0, $s2 -/* 02A4EC 800298EC 3C19800E */ lui $t9, %hi(D_800DC91C) # $t9, 0x800e -/* 02A4F0 800298F0 8F39C91C */ lw $t9, %lo(D_800DC91C)($t9) +/* 02A4EC 800298EC 3C19800E */ lui $t9, %hi(gCurrentLevelHeader2) # $t9, 0x800e +/* 02A4F0 800298F0 8F39C91C */ lw $t9, %lo(gCurrentLevelHeader2)($t9) /* 02A4F4 800298F4 8E500000 */ lw $s0, ($s2) /* 02A4F8 800298F8 8F2E00AC */ lw $t6, 0xac($t9) /* 02A4FC 800298FC 260F0008 */ addiu $t7, $s0, 8 diff --git a/asm/non_matchings/unknown_0255E0/func_80029AF8.s b/asm/non_matchings/unknown_0255E0/traverse_segments_bsp_tree.s similarity index 94% rename from asm/non_matchings/unknown_0255E0/func_80029AF8.s rename to asm/non_matchings/unknown_0255E0/traverse_segments_bsp_tree.s index ae80797d..3eb7e1c0 100644 --- a/asm/non_matchings/unknown_0255E0/func_80029AF8.s +++ b/asm/non_matchings/unknown_0255E0/traverse_segments_bsp_tree.s @@ -1,4 +1,4 @@ -glabel func_80029AF8 +glabel traverse_segments_bsp_tree /* 02A6F8 80029AF8 27BDFFB8 */ addiu $sp, $sp, -0x48 /* 02A6FC 80029AFC AFBE0040 */ sw $fp, 0x40($sp) /* 02A700 80029B00 AFB7003C */ sw $s7, 0x3c($sp) @@ -83,12 +83,12 @@ glabel func_80029AF8 /* 02A82C 80029C2C AFB30010 */ sw $s3, 0x10($sp) /* 02A830 80029C30 02802825 */ move $a1, $s4 /* 02A834 80029C34 02403825 */ move $a3, $s2 -/* 02A838 80029C38 0C00A6BE */ jal func_80029AF8 +/* 02A838 80029C38 0C00A6BE */ jal traverse_segments_bsp_tree /* 02A83C 80029C3C 24C6FFFF */ addiu $a2, $a2, -1 /* 02A840 80029C40 10000004 */ b .L80029C54 /* 02A844 80029C44 86040002 */ lh $a0, 2($s0) .L80029C48: -/* 02A848 80029C48 0C00A745 */ jal func_80029D14 +/* 02A848 80029C48 0C00A745 */ jal add_segment_to_order /* 02A84C 80029C4C 02802025 */ move $a0, $s4 /* 02A850 80029C50 86040002 */ lh $a0, 2($s0) .L80029C54: @@ -101,7 +101,7 @@ glabel func_80029AF8 .L80029C6C: /* 02A86C 80029C6C 02A02025 */ move $a0, $s5 /* 02A870 80029C70 02602825 */ move $a1, $s3 -/* 02A874 80029C74 0C00A745 */ jal func_80029D14 +/* 02A874 80029C74 0C00A745 */ jal add_segment_to_order /* 02A878 80029C78 02403025 */ move $a2, $s2 /* 02A87C 80029C7C 1000001A */ b .L80029CE8 /* 02A880 80029C80 8FBF0044 */ lw $ra, 0x44($sp) @@ -113,12 +113,12 @@ glabel func_80029AF8 /* 02A894 80029C94 92050005 */ lbu $a1, 5($s0) /* 02A898 80029C98 AFB30010 */ sw $s3, 0x10($sp) /* 02A89C 80029C9C 02A03025 */ move $a2, $s5 -/* 02A8A0 80029CA0 0C00A6BE */ jal func_80029AF8 +/* 02A8A0 80029CA0 0C00A6BE */ jal traverse_segments_bsp_tree /* 02A8A4 80029CA4 02403825 */ move $a3, $s2 /* 02A8A8 80029CA8 10000004 */ b .L80029CBC /* 02A8AC 80029CAC 86040000 */ lh $a0, ($s0) .L80029CB0: -/* 02A8B0 80029CB0 0C00A745 */ jal func_80029D14 +/* 02A8B0 80029CB0 0C00A745 */ jal add_segment_to_order /* 02A8B4 80029CB4 02A02025 */ move $a0, $s5 /* 02A8B8 80029CB8 86040000 */ lh $a0, ($s0) .L80029CBC: @@ -131,7 +131,7 @@ glabel func_80029AF8 .L80029CD4: /* 02A8D4 80029CD4 02802025 */ move $a0, $s4 /* 02A8D8 80029CD8 02602825 */ move $a1, $s3 -/* 02A8DC 80029CDC 0C00A745 */ jal func_80029D14 +/* 02A8DC 80029CDC 0C00A745 */ jal add_segment_to_order /* 02A8E0 80029CE0 02403025 */ move $a2, $s2 /* 02A8E4 80029CE4 8FBF0044 */ lw $ra, 0x44($sp) .L80029CE8: diff --git a/asm/non_matchings/unknown_06B2B0/load_level.s b/asm/non_matchings/unknown_06B2B0/load_level.s index 954c738a..95e4e7f4 100644 --- a/asm/non_matchings/unknown_06B2B0/load_level.s +++ b/asm/non_matchings/unknown_06B2B0/load_level.s @@ -711,7 +711,7 @@ glabel load_level /* 06C88C 8006BC8C 8E2E0000 */ lw $t6, ($s1) /* 06C890 8006BC90 00000000 */ nop /* 06C894 8006BC94 8DC400AC */ lw $a0, 0xac($t6) -/* 06C898 8006BC98 0C01FD05 */ jal func_8007F414 +/* 06C898 8006BC98 0C01FD05 */ jal init_pulsating_light_data /* 06C89C 8006BC9C 00000000 */ nop /* 06C8A0 8006BCA0 8E230000 */ lw $v1, ($s1) /* 06C8A4 8006BCA4 00000000 */ nop diff --git a/include/structs.h b/include/structs.h index db8f5e5b..b6066a66 100644 --- a/include/structs.h +++ b/include/structs.h @@ -67,7 +67,7 @@ typedef struct TextureHeader { /* 0x03 */ u8 unk3; /* 0x04 */ u8 unk4; /* 0x05 */ u8 numberOfInstances; // Always 1 in the ROM. - /* 0x06 */ u16 flags; + /* 0x06 */ s16 flags; // 0x04 = Interlaced texture // 0x40 = U clamp flag. 0 = Wrap, 1 = Clamp // 0x80 = V clamp flag. 0 = Wrap, 1 = Clamp @@ -180,6 +180,30 @@ typedef struct Settings { /* 0x0117 */ u8 display_times; } Settings; +/* Unknown size */ +typedef struct LevelHeader_70 { + u8 pad0[0x10]; + /* 0x10 */ u8 red; + /* 0x11 */ u8 green; + /* 0x12 */ u8 blue; + /* 0x13 */ u8 alpha; +} LevelHeader_70; + +// Used to update the pulsating lights in Spaceport Alpha +typedef struct PulsatingLightDataFrame { + u16 value; + u16 time; +} PulsatingLightDataFrame; + +typedef struct PulsatingLightData { + u16 numberFrames; + u16 currentFrame; + u16 time; + u16 totalTime; + s32 outColorValue; + PulsatingLightDataFrame frames[1]; // Length varies based on numberFrames. +} PulsatingLightData; + /* Size: 0xC4 bytes */ typedef struct LevelHeader { /* 0x00 */ s8 world; @@ -222,8 +246,9 @@ typedef struct LevelHeader { /* 0x53 */ u8 unk53; /* 0x54 */ u16 instruments; - /* 0x56 */ u8 pad56[0x1E]; + /* 0x56 */ u8 pad56[0x1A]; + /* 0x70 */ LevelHeader_70 *unk70; /* 0x74 */ s8 *unk74[7]; // Weather related? @@ -243,7 +268,7 @@ typedef struct LevelHeader { /* 0xA4 */ s32 unkA4; /* 0xA8 */ u16 unkA8; /* 0xAA */ u16 unkAA; - /* 0xAC */ s8 *unkAC; + /* 0xAC */ PulsatingLightData *pulseLightData; /* 0xB0 */ s16 unkB0; /* 0xB2 */ u8 unkB2; @@ -327,13 +352,20 @@ typedef struct TriangleBatchInfo { /* 0x00 */ u8 textureIndex; // 0xFF = No texture /* 0x02 */ s16 verticesOffset; /* 0x04 */ s16 facesOffset; -/* 0x06 */ u8 unk6; +/* 0x06 */ u8 unk6; // 0xFF = vertex colors, otherwise use dynamic lighting normals (Objects only) +/* 0x07 */ u8 unk7; /* 0x08 */ u32 flags; + // 0x00000002 = ??? + // 0x00000008 = ??? // 0x00000010 = Depth write // 0x00000100 = Hidden/Invisible geometry // 0x00000200 = ??? Used in func_80060AC8 + // 0x00000800 = ??? + // 0x00002000 = ??? // 0x00008000 = Environment mapping // 0x00010000 = Texture is animated + // 0x00040000 = Has pulsating light data. + // 0x70000000 = bits 28, 29, & 30 are some kind of index. Not used in any levels. } TriangleBatchInfo; /* Size: 8 bytes */ @@ -392,13 +424,22 @@ typedef struct LevelModelSegmentBoundingBox { s16 unkA; } LevelModelSegmentBoundingBox; +/* Size: 8 bytes */ +typedef struct BspTreeNode { + s16 leftNode; // less than split value + s16 rightNode; // greater or equal to split value? + u8 splitType; // 0 = Camera X, 1 = Camera Y, 2 = Camera Z + u8 segmentIndex; + s16 splitValue; // Decides left or right +} BspTreeNode; + typedef struct LevelModel { /* 0x00 */ TextureInfo *textures; /* 0x04 */ LevelModelSegment *segments; /* 0x08 */ LevelModelSegmentBoundingBox *segmentsBoundingBoxes; /* 0x0C */ s32 unkC; -/* 0x10 */ s32 *segmentsBitfields; -/* 0x14 */ s32 *segmentsBspTree; +/* 0x10 */ u8 *segmentsBitfields; +/* 0x14 */ BspTreeNode *segmentsBspTree; /* 0x18 */ s16 numberOfTextures; /* 0x1A */ s16 numberOfSegments; u8 pad1C[4]; @@ -425,7 +466,10 @@ typedef struct Object_40 { f32 unk4; f32 unk8; f32 unkC; - u8 pad10[0x2D]; + u8 pad10[0x20]; + u16 unk30; + s16 unk32; + u8 pad34[0x9]; u8 unk3D; u8 pad3E[0x15]; s8 unk53; @@ -449,6 +493,12 @@ typedef struct Object_4C { s8 unk17; } Object_4C; +typedef struct Object_50 { + u8 pad0[0x8]; + s16 unk8; + s16 unkA; +} Object_50; + typedef struct Object_54 { s32 unk0; u8 unk4; @@ -559,7 +609,7 @@ typedef struct Object { /* 0x0000 */ s16 y_rotation; /* 0x0002 */ s16 x_rotation; /* 0x0004 */ s16 z_rotation; - /* 0x0006 */ s16 unk6; + /* 0x0006 */ s16 unk6; // Flags? /* 0x0008 */ f32 scale; /* 0x000C */ f32 x_position; /* 0x0010 */ f32 y_position; @@ -594,7 +644,7 @@ typedef struct Object { /* 0x0048 */ s16 unk48; /* 0x004A */ s16 unk4A; /* 0x004C */ Object_4C *unk4C; //player + 0x318 - /* 0x0050 */ void *unk50; //player + 0x2F4 + /* 0x0050 */ Object_50 *unk50; //player + 0x2F4 /* 0x0054 */ Object_54 *unk54; //player + 0x2C0 /* 0x0058 */ void *unk58; //player + 0x304 /* 0x005C */ Object_5C *unk5C; diff --git a/src/textures_sprites.c b/src/textures_sprites.c index b100fe0a..f8116524 100644 --- a/src/textures_sprites.c +++ b/src/textures_sprites.c @@ -1304,33 +1304,42 @@ void func_8007F1E8(unk8007F1E8 *arg0) { GLOBAL_ASM("asm/non_matchings/textures_sprites/func_8007F24C.s") -typedef struct unk8007F414_E { - u16 unk0; - u16 unk2; -} unk8007F414_E; - -typedef struct unk8007F414 { - u16 unk0; - u16 unk2; - u16 unk4; - u16 unk6; - s32 unk8; - u16 unkC; - unk8007F414_E unkE[1]; -} unk8007F414; - -void func_8007F414(unk8007F414 *arg0) { +void init_pulsating_light_data(PulsatingLightData *data) { s32 i; - arg0->unk2 = 0; - arg0->unk4 = 0; - arg0->unk6 = 0; - arg0->unk8 = arg0->unkC; - for (i = 0; i < arg0->unk0; i++) { - arg0->unk6 += arg0->unkE[i].unk0; + data->currentFrame = 0; + data->time = 0; + data->totalTime = 0; + data->outColorValue = data->frames[0].value; + for (i = 0; i < data->numberFrames; i++) { + data->totalTime += data->frames[i].time; } } -GLOBAL_ASM("asm/non_matchings/textures_sprites/func_8007F460.s") +void update_pulsating_light_data(PulsatingLightData *data, s32 timeDelta) { + s32 thisFrameIndex, nextFrameIndex; + + if (data->numberFrames > 1) { + data->time += timeDelta; + while (data->time >= data->totalTime) { + data->time -= data->totalTime; + } + while (data->time >= data->frames[data->currentFrame].time) { + data->time -= data->frames[data->currentFrame].time; + data->currentFrame++; + if (data->currentFrame >= data->numberFrames) { + data->currentFrame = 0; + } + } + thisFrameIndex = data->currentFrame; + nextFrameIndex = thisFrameIndex + 1; + if (nextFrameIndex >= data->numberFrames) { + nextFrameIndex = 0; + } + + data->outColorValue = data->frames[thisFrameIndex].value + + ((data->frames[nextFrameIndex].value * data->time) / data->frames[thisFrameIndex].time); + } +} #ifdef NON_MATCHING void func_8007F594(Gfx **dlist, u32 index, u32 primitiveColor, u32 environmentColor) { diff --git a/src/unknown_0255E0.c b/src/unknown_0255E0.c index ba35c2ff..cd4cb141 100644 --- a/src/unknown_0255E0.c +++ b/src/unknown_0255E0.c @@ -54,7 +54,7 @@ f32 D_800DC8AC[27] = { }; LevelModel* gCurrentLevelModel = NULL; -LevelHeader *D_800DC91C = NULL; +LevelHeader *gCurrentLevelHeader2 = NULL; s32 D_800DC920 = -1; s32 D_800DC924 = 0; @@ -84,12 +84,7 @@ s32 D_8011B0A4; s32 D_8011B0A8; s32 D_8011B0AC; -typedef struct{ - s16 unk00; - s16 unk02; - s16 unk04; -}unk8011B0B0; -unk8011B0B0 *D_8011B0B0; +Object *D_8011B0B0; // Camera Object? s32 D_8011B0B4; Object *D_8011B0B8; @@ -145,7 +140,17 @@ s32 D_8011D0E8; s32 D_8011D0EC; s32 D_8011D0F0; s32 D_8011D0F4; -s32 D_8011D0F8[12]; + +/* Size: 0x10 bytes */ +typedef struct unk8011D0F8 { + f32 unk0; + f32 unk4; + f32 unk8; + f32 unkC; +} unk8011D0F8; + +unk8011D0F8 D_8011D0F8[3]; + s32 D_8011D128[15]; s32 D_8011D164; s32 D_8011D168[84]; @@ -157,11 +162,37 @@ s32 D_8011D314; s32 D_8011D318; s32 D_8011D31C; s32 D_8011D320[4]; -s32 D_8011D330[2]; + + +/* Size: 0x10 bytes */ +typedef struct unk8011D330 { + u8 pad0[0x10]; +} unk8011D330; + +unk8011D330 *D_8011D330; +s32 D_8011D334; + s32 D_8011D338[4]; -s32 D_8011D348[2]; + +/* Size: 0xA bytes */ +typedef struct unk8011D348 { + u8 pad0[0x9]; + u8 unk9; +} unk8011D348; +unk8011D348 *D_8011D348; + +s32 D_8011D34C; s32 D_8011D350[4]; -s32 D_8011D360; + +/* Size: 0x8 bytes */ +typedef struct unk8011D360 { + u8 pad0[4]; + s16 unk4; + s16 unk6; +} unk8011D360; + +unk8011D360 *D_8011D360; + s32 D_8011D364; s32 D_8011D368; s32 D_8011D36C; @@ -169,8 +200,8 @@ s32 D_8011D370; s32 D_8011D374; s32 D_8011D378; s32 D_8011D37C; -s32 D_8011D380; -s32 D_8011D384; +f32 D_8011D380; +u32 D_8011D384; /* Size: 0x38 bytes */ typedef struct unk8011D388 { @@ -226,6 +257,13 @@ s32 D_8011D4BC; extern void guMtxXFMF(void*, f32, f32, f32, f32*, f32*, f32*); f32 func_800BB2F4(s32, f32, f32, f32*); +void func_8007B3D0(Gfx**); +Object *get_object(s32); +Settings *get_settings(); +void traverse_segments_bsp_tree(s32 nodeIndex, s32 segmentIndex, s32 segmentIndex2, u8 *segmentsOrder, u32 *segmentsOrderIndex); +s32 func_80014814(s32*); +void func_80015348(s32, s32); +void render_level_segment(s32 segmentId, s32 nonOpaque); s32 func_800249E0(s32 arg0) { @@ -236,38 +274,18 @@ s32 func_800249E0(s32 arg0) { #if 1 GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_800249F0.s") #else -extern u32 D_800DC874; -extern u32 D_800DC87C; -extern u32 D_8011B0C8; -extern u8 D_8011B0E1; -extern u8 D_8011B0E2; -extern u8 D_8011B0E3; -extern u32 D_8011B0F8; -extern u32 D_8011B100; -extern u32 D_8011B104; -extern u32 D_8011B108; -extern u32 D_8011B10C; -extern u32 D_8011B110; -extern u32 D_8011B114; -extern u32 D_8011D320[4]; -extern u32 D_8011D338[4]; -extern u32 D_8011D348; -extern u32 D_8011D350[4]; - -extern u32 D_8011D384; - void func_800249F0(u32 arg0, u32 arg1, s32 arg2, u32 arg3, u32 arg4, u32 arg5, u32 arg6){ s32 i; s32 tmp_a2; - D_800DC91C = get_current_level_header(); + gCurrentLevelHeader2 = get_current_level_header(); D_8011B0F8 = 0; D_8011B100 = 0; D_8011B104 = 0; D_8011B108 = 0; D_8011B10C = 0; - if(D_800DC91C->race_type == 6 || D_800DC91C->race_type == 7){ + if(gCurrentLevelHeader2->race_type == 6 || gCurrentLevelHeader2->race_type == 7){ D_8011B0F8 = 1; } func_8002C0C4(arg0); @@ -281,14 +299,14 @@ void func_800249F0(u32 arg0, u32 arg1, s32 arg2, u32 arg3, u32 arg4, u32 arg5, u } } } - if(is_in_two_player_adventure() && (D_800DC91C->race_type == 0 || D_800DC91C->race_type & 0x40)){ + if(is_in_two_player_adventure() && (gCurrentLevelHeader2->race_type == 0 || gCurrentLevelHeader2->race_type & 0x40)){ tmp_a2 = 2; }else{ tmp_a2 = arg2; tmp_a2++; } if(D_8011D384){ - func_800B82B4(gCurrentLevelModel, D_800DC91C, tmp_a2); + func_800B82B4(gCurrentLevelModel, gCurrentLevelHeader2, tmp_a2); } func_8006652C(arg2); func_80027FC4(arg1); @@ -322,10 +340,10 @@ void func_800249F0(u32 arg0, u32 arg1, s32 arg2, u32 arg3, u32 arg4, u32 arg5, u func_8002D8DC(1,1,0); func_8002D8DC(2,2,0); D_8011B0C8 = 0; - if(D_800DC91C->unkB7){ - D_8011B0E1 = D_800DC91C->unkB4; - D_8011B0E2 = D_800DC91C->unkB5; - D_8011B0E3 = D_800DC91C->unkB6; + if(gCurrentLevelHeader2->unkB7){ + D_8011B0E1 = gCurrentLevelHeader2->unkB4; + D_8011B0E2 = gCurrentLevelHeader2->unkB5; + D_8011B0E3 = gCurrentLevelHeader2->unkB6; func_80025510(arg2 + 1); } } @@ -394,12 +412,12 @@ GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_80028050.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_800289B8.s") #else void func_800289B8(void){ - u8 sp_2f = D_800DC91C->unkC1; - u8 sp_2e = D_800DC91C->unkC2; - u8 sp_2d = D_800DC91C->unkC3; - u8 sp_2c = D_800DC91C->unkBE; - u8 sp_2b = D_800DC91C->unkBF; - u8 sp_2a = D_800DC91C->unkC0; + u8 sp_2f = gCurrentLevelHeader2->unkC1; + u8 sp_2e = gCurrentLevelHeader2->unkC2; + u8 sp_2d = gCurrentLevelHeader2->unkC3; + u8 sp_2c = gCurrentLevelHeader2->unkBE; + u8 sp_2b = gCurrentLevelHeader2->unkBF; + u8 sp_2a = gCurrentLevelHeader2->unkC0; u32 sp_24 = D_8011B0A8; func_8007B3D0(&D_8011B0A0); func_8007B4C8(&D_8011B0A0, 0, 8); @@ -413,7 +431,7 @@ void render_skydome(void){ return; v0_some_struct = func_80069D20(); - if(D_800DC91C->unk49 == 0){ + if(gCurrentLevelHeader2->unk49 == 0){ D_8011B0B8->x_position = v0_some_struct->x_position; D_8011B0B8->y_position = v0_some_struct->y_position; D_8011B0B8->z_position = v0_some_struct->z_position; @@ -435,11 +453,363 @@ void func_80028FA0(s32 arg0) { D_8011B0FC = arg0; } -GLOBAL_ASM("asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s") -GLOBAL_ASM("asm/non_matchings/unknown_0255E0/render_level_segment.s") +#ifdef NON_MATCHING -GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_80029AF8.s") -GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_80029D14.s") +// Regalloc & stack issues. +void render_level_geometry_and_objects(void) { + s32 sp16C; + s32 sp168; + s32 objFlags; + s32 sp160; + s32 i; + s32 sp158; + u8 spD8[128]; + u8 sp58[128]; + s32 s0; + Object *obj; + s32 sp44; + + func_80012C30(); + if (get_settings()->courseId == 0x24) { // 0x24 = Opening sequence area + D_8011B0FC = 1; + } + sp160 = func_80014814(&sp16C); + if (gCurrentLevelModel->numberOfSegments >= 2) { + sp168 = 0; + traverse_segments_bsp_tree(0, 0, gCurrentLevelModel->numberOfSegments - 1, &spD8, &sp168); + } else { + sp168 = 1; + spD8[0] = 0; + } + + for (i = 1; i <= gCurrentLevelModel->numberOfSegments; i++) { + sp58[i] = FALSE; + } + sp58[0] = TRUE; + + if (D_8011B0E0 != 0) { + for (i = 0; i < sp168; i++) { + render_level_segment(spD8[i], 0); // Render opaque segments + sp58[spD8[i]+1] = TRUE; + } + } + if (gCurrentLevelModel->numberOfSegments < 2) { + sp58[1] = TRUE; + } + func_8007B3D0(&D_8011B0A0); + func_80015348(sp160, sp16C - 1); + + sp158 = 0x200 << (func_80066220() & 1); + for (i = sp160; i < sp16C; i++) { + obj = get_object(i); + s0 = 0xFF; + objFlags = obj->unk6; + if (objFlags & 0x80) { + s0 = 0; + } + else if (!(objFlags & 0x8000)) { + s0 = obj->unk39; + } + if (objFlags & sp158) { + s0 = 0; + } + if ((obj != NULL) && (s0 == 0xFF) && (func_8002A900(obj)) && ((sp58[obj->unk2E + 1]) || (1000.0 < obj->unk34))) { + if (obj->unk6 & 0x8000) { + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + } else if (obj->unk50 != NULL) { + render_floor_decal(obj, obj->unk50); + } + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + if ((obj->unk58 != NULL) && (obj->descriptor_ptr->unk30 & 0x10)) { + func_8002D670(obj, obj->unk58); + } + } + } + + i = sp16C - 1; + if (i >= sp160) { + sp44 = sp160 - 1; + do { + obj = get_object(i); + objFlags = obj->unk6; + if (objFlags & sp158) { + s0 = FALSE; + } else { + s0 = TRUE; + } + if (obj != NULL && s0 && (objFlags & 0x100) && (sp58[obj->unk2E + 1]) && (func_8002A900(obj) != 0)) { + if (obj->unk6 & 0x8000) { + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + } else if (obj->unk50 != NULL) { + render_floor_decal(obj, obj->unk50); + } + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + if ((obj->unk58 != NULL) && (obj->descriptor_ptr->unk30 & 0x10)) { + func_8002D670(obj, obj->unk58); + } + } + i--; + } while(i != sp44); + } + i = sp168 - 1; + if (D_8011B0E0 != 0) { + while (i >= 0) { + render_level_segment(spD8[i], 1); // Render transparent segments + i--; + } + } + if (D_8011D384 != 0) { + func_800BA8E4(&D_8011B0A0, &D_8011B0A4, func_80066220()); + } + func_8007B3D0(&D_8011B0A0); + func_8007B4C8(&D_8011B0A0, 0, 0xA); + func_80012C3C(&D_8011B0A0); + + i = sp16C - 1; + if (i >= sp160) { + sp44 = sp160 - 1; + do { + obj = get_object(i); + s0 = 0xFF; + objFlags = obj->unk6; + if (objFlags & 0x80) { + s0 = 1; + } else if (!(objFlags & 0x8000)) { + s0 = obj->unk39; + } + if (objFlags & sp158) { + s0 = 0; + } + if ((obj->unk48 == 1) && (s0 >= 0xFF)) { + s0 = 0; + } + if (obj != NULL && s0 < 0xFF && sp58[obj->unk2E + 1] && func_8002A900(obj)) { + if (s0 > 0) { + if (obj->unk6 & 0x8000) { + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + } else { + if (obj->unk50 != NULL) { + render_floor_decal(obj, obj->unk50); + } + // This is being called when it shouldn't. + func_80012D5C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + if ((obj->unk58 != 0) && (obj->descriptor_ptr->unk30 & 0x10)) { + func_8002D670(obj, obj->unk58); + } + } + } + if (obj->unk48 == 1) { + func_80013A0C(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + func_80013DCC(&D_8011B0A0, &D_8011B0A4, &D_8011B0A8, obj); + } + } + i--; + } while(i != sp44); + } + if (D_800DC924 && func_80027568()) { + func_8002581C(&spD8, sp168, func_80066220()); + } + D_8011B0FC = 0; +} +#else +GLOBAL_ASM("asm/non_matchings/unknown_0255E0/render_level_geometry_and_objects.s") +#endif + +// *Should* be functionally equivalent. +#ifdef NON_MATCHING +// nonOpaque: 0 for solid geometry, 1 for transparent geometry. +void render_level_segment(s32 segmentId, s32 nonOpaque) { + LevelModelSegment *segment = &gCurrentLevelModel->segments[segmentId]; // spAC + LevelHeader_70 *lvlHeader70; + TriangleBatchInfo *batchInfo; + TextureHeader *texture; + s32 temp_v0; + s32 temp_v1; + s32 flags; + s32 renderBatch; + s32 numberVertices; + s32 numberTriangles; + s32 vertices; + s32 triangles; + s32 color; + s32 hasTexture; + s32 levelHeaderIndex; + s32 sp78; + s32 i; + s32 sp70; + s32 textureIndex; + s32 textureFlags; + s32 temp; + + if (nonOpaque && (D_8011D384 != 0)) { + sp78 = func_800B9228(segment); + } else { + sp78 = 0; + } + if (nonOpaque) { + sp70 = segment->numberOfBatches; + i = segment->unk40; + } else { + sp70 = segment->unk40; + i = 0; + } + + for(; i < sp70; i++) { + batchInfo = &segment->batches[i]; + flags = batchInfo->flags; + textureFlags = 0; + if (!(flags & 0x100)) { // 0x100 = Is this invisible geometry? + textureIndex = batchInfo->textureIndex; + renderBatch = FALSE; + if (textureIndex == 0xFF) { + texture = NULL; // Solid color only + } else { + texture = gCurrentLevelModel->textures[textureIndex].texture; + textureFlags = texture->flags; + } + flags |= (0x8 | 0x2); + if (!(flags & 0x10) && !(flags & 0x800)) { // 0x10 = Depth write + flags |= D_8011B0FC; + } + // textureFlags & 0x04 = Is interlaced texture + if ((!(textureFlags & 4) && !(flags & 0x2000)) || (flags & 0x800)) { + renderBatch = TRUE; + } + if (nonOpaque) { + renderBatch = (renderBatch + 1) & 1; // Why not just do `renderBatch ^= 1;` or `renderBatch = !renderBatch`? + } + if (sp78 && (flags & 0x2000)) { + renderBatch = FALSE; + } + if (renderBatch) { + temp_v0 = batchInfo->verticesOffset; + temp_v1 = batchInfo->facesOffset; + numberVertices = (batchInfo + 1)->verticesOffset - temp_v0; + numberTriangles = (batchInfo + 1)->facesOffset - temp_v1; + vertices = &segment->vertices[temp_v0]; + triangles = &segment->triangles[temp_v1]; + levelHeaderIndex = (flags >> 28) & 7; + if (levelHeaderIndex != 0) { // This is unused, so this should always be false. + lvlHeader70 = gCurrentLevelHeader2->unk70;//gCurrentLevelHeader2[levelHeaderIndex].unk70; + gDPSetEnvColor(D_8011B0A0++, lvlHeader70->red, lvlHeader70->green, lvlHeader70->blue, lvlHeader70->alpha) + } else { + gDPSetEnvColor(D_8011B0A0++, 255, 255, 255, 0) + } + temp = batchInfo->unk7 << 14; + if (flags & 0x40000) { // Only gets used in Spaceport alpha for the pulsating lights in the outside section. + color = gCurrentLevelHeader2->pulseLightData->outColorValue & 0xFF; + gDPSetPrimColor(D_8011B0A0++, 0, 0, color, color, color, color) + func_8007BA5C(&D_8011B0A0, texture, flags, temp); + vertices += 0x80000000; + gDkrVertices(D_8011B0A0++, vertices, (((numberVertices - 1) << 3) | (vertices & 6)), numberVertices) + gDkrTriangles(D_8011B0A0++, triangles + 0x80000000, numberTriangles, TRIN_ENABLE_TEXTURE) + gDPSetPrimColor(D_8011B0A0++, 0, 0, 255, 255, 255, 255) // Reset the primitive color + } else { + func_8007B4E8(&D_8011B0A0, texture, flags, temp); + hasTexture = (texture == NULL) ? TRIN_DISABLE_TEXTURE : TRIN_ENABLE_TEXTURE; + vertices += 0x80000000; + gDkrVertices(D_8011B0A0++, vertices, (((numberVertices - 1) << 3) | (vertices & 6)), numberVertices) + gDkrTriangles(D_8011B0A0++, triangles + 0x80000000, numberTriangles, hasTexture) + + } + } + } + } +} +#else +GLOBAL_ASM("asm/non_matchings/unknown_0255E0/render_level_segment.s") +#endif + +#ifdef NON_MATCHING + +void add_segment_to_order(s32 segmentIndex, u32 *segmentsOrderIndex, u8 *segmentsOrder); + +// Regalloc issues. +void traverse_segments_bsp_tree(s32 nodeIndex, s32 segmentIndex, s32 segmentIndex2, u8 *segmentsOrder, u32 *segmentsOrderIndex) { + BspTreeNode *curNode; + s32 camValue; + + while(TRUE) { + curNode = &gCurrentLevelModel->segmentsBspTree[nodeIndex]; + if (curNode->splitType == 0) { + camValue = D_8011B0B0->x_position; // Camera X + } else if (curNode->splitType == 1) { + camValue = D_8011B0B0->y_position; // Camera Y + } else { + camValue = D_8011B0B0->z_position; // Camera Z + } + if (camValue < curNode->splitValue) { + if (curNode->leftNode != -1) { + traverse_segments_bsp_tree(curNode->leftNode, segmentIndex, curNode->segmentIndex - 1, segmentsOrder, segmentsOrderIndex); + } else { + add_segment_to_order(segmentIndex, segmentsOrderIndex, segmentsOrder); + } + if (curNode->rightNode != -1) { + segmentIndex = curNode->segmentIndex; + nodeIndex = curNode->rightNode; + continue; + } + add_segment_to_order(segmentIndex2, segmentsOrderIndex, segmentsOrder); + return; + } + if (curNode->rightNode != -1) { + traverse_segments_bsp_tree(curNode->rightNode, curNode->segmentIndex, segmentIndex2, segmentsOrder, segmentsOrderIndex); + } else { + add_segment_to_order(segmentIndex2, segmentsOrderIndex, segmentsOrder); + } + nodeIndex = curNode->leftNode; + if (nodeIndex == -1) { + break; + } + segmentIndex2 = curNode->segmentIndex; + segmentIndex2--; + } + add_segment_to_order(segmentIndex, segmentsOrderIndex, segmentsOrder); +} + +#else +GLOBAL_ASM("asm/non_matchings/unknown_0255E0/traverse_segments_bsp_tree.s") +#endif + +void add_segment_to_order(s32 segmentIndex, u32 *segmentsOrderIndex, u8 *segmentsOrder) { + u32 temp; + if (segmentIndex < gCurrentLevelModel->numberOfSegments) { + if (D_8011B0D4 != -1) { + temp = gCurrentLevelModel->segmentsBitfields[D_8011B0D4 + (segmentIndex >> 3)]; + temp >>= segmentIndex & 7; + temp &= 0xFF; + } else { + temp = 1; + } + if ((temp & 1) && func_8002A5F8(&gCurrentLevelModel->segmentsBoundingBoxes[segmentIndex])) { + segmentsOrder[(*segmentsOrderIndex)++] = segmentIndex; + } + } +} + +#ifdef NON_MATCHING +// Unused. Has regalloc issues. +s32 func_80029DE0(Object *obj, s32 segmentIndex) { + LevelModelSegmentBoundingBox* bb; + s32 x, y, z; + if (segmentIndex >= gCurrentLevelModel->numberOfSegments) { + return FALSE; + } + x = obj->x_position; + y = obj->y_position; + z = obj->z_position; + bb = &gCurrentLevelModel->segmentsBoundingBoxes[segmentIndex]; + if ((x < (bb->unk6 + 25)) && ((bb->unk0 - 25) < x) && + (z < (bb->unkA + 25)) && ((bb->unk4 - 25) < z) && + (y < (bb->unk8 + 25)) && ((bb->unk2 - 25) < y)) { + return TRUE; + } + + return FALSE; +} +#else +GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_80029DE0.s") +#endif #ifdef NON_MATCHING @@ -541,7 +911,66 @@ LevelModelSegmentBoundingBox *func_8002A2DC(s32 arg0){ } GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002A31C.s") + +#ifdef NON_MATCHING +f32 func_80066348(f32, f32, f32); + +// Has some minor issues, but should be functionally equivalent. +s32 func_8002A5F8(LevelModelSegmentBoundingBox *bb) { + s64 sp48; + s32 i, j; + s32 s2; + f32 temp0, temp1, temp2, temp3; + + j = 0; + while(TRUE) { + temp0 = D_8011D0F8[j].unk0; + temp1 = D_8011D0F8[j].unk4; + temp2 = D_8011D0F8[j].unk8; + temp3 = D_8011D0F8[j].unkC; + i = 0; + s2 = FALSE; + while(i < 8 && !s2) { + if (i & 1) { + sp48 = bb->unk0 * temp0; + } else { + sp48 = bb->unk6 * temp0; + } + if (i & 2) { + sp48 += bb->unk2 * temp1; + } else { + sp48 += bb->unk8 * temp1; + } + if (i & 4) { + sp48 += bb->unk4 * temp2; + } else { + sp48 += bb->unkA * temp2; + } + sp48 += temp3; + if (sp48 > 0) { + s2 = TRUE; + } + i++; + } + j++; + if (i == 8 && !s2) { + return FALSE; + } + if (j == 3) { + D_8011D380 = func_80066348((bb->unk6 + bb->unk0) >> 1, (bb->unk8 + bb->unk2) >> 1, (bb->unkA + bb->unk4) >> 1); + if (D_8011D380 < 1000.0) { + D_8011B0BC = 1; + return TRUE; + } + D_8011B0BC = 0; + return TRUE; + } + } +} +#else GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002A5F8.s") +#endif + GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002A900.s") void func_8002ACC8(s32 arg0) { @@ -637,6 +1066,7 @@ GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002D30C.s") #endif GLOBAL_ASM("asm/non_matchings/unknown_0255E0/render_floor_decal.s") + GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002D670.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002D8DC.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002DE30.s") @@ -648,6 +1078,7 @@ GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002F440.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002FA64.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002FD74.s") GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_8002FF6C.s") + GLOBAL_ASM("asm/non_matchings/unknown_0255E0/func_800304C8.s") #ifdef NON_MATCHING @@ -767,9 +1198,9 @@ void func_80031018(void){ f32 sp_30 = 0.0f; f32 sp_2C = -65536.0f; - sp_38.unk04 = D_8011B0B0->unk04; - sp_38.unk02 = D_8011B0B0->unk02; - sp_38.unk00 = D_8011B0B0->unk00; + sp_38.unk04 = D_8011B0B0->z_rotation; + sp_38.unk02 = D_8011B0B0->x_rotation; + sp_38.unk00 = D_8011B0B0->y_rotation; sp_38.unk0C = 0.0f; sp_38.unk10 = 0.0f; sp_38.unk14 = 0.0f; diff --git a/src/unknown_0255E0.h b/src/unknown_0255E0.h index 67c43a01..3d472345 100644 --- a/src/unknown_0255E0.h +++ b/src/unknown_0255E0.h @@ -23,7 +23,7 @@ extern f32 D_800DC884[10]; extern f32 D_800DC8AC[27]; extern LevelModel* gCurrentLevelModel; -extern LevelHeader *D_800DC91C; +extern LevelHeader *gCurrentLevelHeader; extern s32 D_800DC920; extern s32 D_800DC924; diff --git a/src/unknown_06B2B0.c b/src/unknown_06B2B0.c index 18c37033..ce93f75c 100644 --- a/src/unknown_06B2B0.c +++ b/src/unknown_06B2B0.c @@ -632,9 +632,10 @@ void load_level(s32 levelId, s32 numberOfPlayers, s32 entranceId, s32 vehicleId, gCurrentLevelHeader->unkA8 = (u16)0; gCurrentLevelHeader->unkAA = (u16)0; } - if ((s32)gCurrentLevelHeader->unkAC != -1) { - gCurrentLevelHeader->unkAC = get_misc_asset((s32)gCurrentLevelHeader->unkAC); - func_8007F414(gCurrentLevelHeader->unkAC); + if ((s32)gCurrentLevelHeader->pulseLightData != -1) { + // Only used in spaceport alpha for some pulsating lights. + gCurrentLevelHeader->pulseLightData = get_misc_asset((s32)gCurrentLevelHeader->pulseLightData); + init_pulsating_light_data(gCurrentLevelHeader->pulseLightData); } update_camera_fov(gCurrentLevelHeader->cameraFOV); func_80077B34(gCurrentLevelHeader->bgColorRed, gCurrentLevelHeader->bgColorGreen, gCurrentLevelHeader->bgColorBlue);