From 05cc501f17a83e818887f6ebafcaee5ce4813788 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Thu, 18 Jul 2024 15:33:24 -0400 Subject: [PATCH] 3 Matches, and various bits of cleaning up (#451) * Move save_data rodata to memory where it makes more sense. * Some minor weather cleanup * WIP func_800B7EB4 * WIP func_800B7EB4 * func_800B7EB4 NON_MATCHING * Match func_800B7EB4 * func_800B7EB4 to wave_init * WIP func_800B82B4 * func_800B82B4 WIP * Match func_8001E4C4 * Match func_8000B290 * Update README * Some minor cleanup * Minor cleanup --- README.md | 22 +- asm/non_matchings/objects/func_8000B020.s | 161 ------------- asm/non_matchings/objects/func_8001E4C4.s | 157 ------------- asm/non_matchings/waves/func_800B7EB4.s | 167 -------------- asm/non_matchings/waves/func_800B82B4.s | 2 +- include/structs.h | 8 +- src/memory.c | 17 ++ src/objects.c | 242 +++++++++++++------ src/objects.h | 10 +- src/save_data.c | 17 -- src/waves.c | 269 +++++++++++++++++----- src/waves.h | 2 +- src/weather.c | 20 +- src/weather.h | 8 +- tools/ido-static-recomp | 2 +- 15 files changed, 440 insertions(+), 664 deletions(-) delete mode 100644 asm/non_matchings/objects/func_8000B020.s delete mode 100644 asm/non_matchings/objects/func_8001E4C4.s delete mode 100644 asm/non_matchings/waves/func_800B7EB4.s diff --git a/README.md b/README.md index 7c9e0707..e4e4a287 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ Currently, only the US 1.0 version of the game is supported. US 1.1, EU 1.0, EU As of July 4, 2024, this is our current score: -    Decomp progress: 67.54% +    Decomp progress: 67.74% -    Documentation progress: 48.33% +    Documentation progress: 49.32% --- @@ -130,26 +130,26 @@ As of July 4th, 2024, this is our current score: ``` ============================================= ADVENTURE ONE (ASM -> C Decompilation) - --- 67.54% Complete (70.04% NON_MATCHING) --- - # Decompiled functions: 1692 - # GLOBAL_ASM remaining: 153 + --- 67.74% Complete (70.25% NON_MATCHING) --- + # Decompiled functions: 1695 + # GLOBAL_ASM remaining: 150 # NON_MATCHING functions: 14 # NON_EQUIVALENT WIP functions: 49 ---------------- Game Status ---------------- Balloons: 32/47, Keys: 3/4, Trophies: 3/5 T.T. Amulets: 3/4, Wizpig Amulets: 3/4 --------------------------------------------- - We are racing in Greenwood Village. (Lap 2/3) + We are racing in Greenwood Village. (Lap 3/3) ============================================= ADVENTURE TWO (Cleanup & Documentation) - -------------- 48.33% Complete -------------- - # Documented functions: 1068 - # Undocumented remaining: 500 + -------------- 49.32% Complete -------------- + # Documented functions: 1080 + # Undocumented remaining: 488 ---------------- Game Status ---------------- - Balloons: 23/47, Keys: 2/4, Trophies: 2/5 + Balloons: 24/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 --------------------------------------------- - We are racing in Crescent Island. (Lap 3/3) + We are racing in Pirate Lagoon. (Lap 2/3) ============================================= ``` diff --git a/asm/non_matchings/objects/func_8000B020.s b/asm/non_matchings/objects/func_8000B020.s deleted file mode 100644 index 8ed527cd..00000000 --- a/asm/non_matchings/objects/func_8000B020.s +++ /dev/null @@ -1,161 +0,0 @@ -glabel func_8000B020 -/* 00BC20 8000B020 27BDFF98 */ addiu $sp, $sp, -0x68 -/* 00BC24 8000B024 AFB10020 */ sw $s1, 0x20($sp) -/* 00BC28 8000B028 00048880 */ sll $s1, $a0, 2 -/* 00BC2C 8000B02C AFB30028 */ sw $s3, 0x28($sp) -/* 00BC30 8000B030 AFB0001C */ sw $s0, 0x1c($sp) -/* 00BC34 8000B034 02248821 */ addu $s1, $s1, $a0 -/* 00BC38 8000B038 00809825 */ move $s3, $a0 -/* 00BC3C 8000B03C 00118840 */ sll $s1, $s1, 1 -/* 00BC40 8000B040 00058100 */ sll $s0, $a1, 4 -/* 00BC44 8000B044 AFB20024 */ sw $s2, 0x24($sp) -/* 00BC48 8000B048 02112021 */ addu $a0, $s0, $s1 -/* 00BC4C 8000B04C 00A09025 */ move $s2, $a1 -/* 00BC50 8000B050 AFBF003C */ sw $ra, 0x3c($sp) -/* 00BC54 8000B054 00047040 */ sll $t6, $a0, 1 -/* 00BC58 8000B058 AFB70038 */ sw $s7, 0x38($sp) -/* 00BC5C 8000B05C AFB60034 */ sw $s6, 0x34($sp) -/* 00BC60 8000B060 AFB50030 */ sw $s5, 0x30($sp) -/* 00BC64 8000B064 AFB4002C */ sw $s4, 0x2c($sp) -/* 00BC68 8000B068 E7B50010 */ swc1 $f21, 0x10($sp) -/* 00BC6C 8000B06C E7B40014 */ swc1 $f20, 0x14($sp) -/* 00BC70 8000B070 01C02025 */ move $a0, $t6 -/* 00BC74 8000B074 0C01C327 */ jal allocate_from_main_pool_safe -/* 00BC78 8000B078 3405FFFF */ li $a1, 65535 -/* 00BC7C 8000B07C 3C03800E */ lui $v1, %hi(D_800DC754) # $v1, 0x800e -/* 00BC80 8000B080 3C05800E */ lui $a1, %hi(D_800DC74C) # $a1, 0x800e -/* 00BC84 8000B084 0050C021 */ addu $t8, $v0, $s0 -/* 00BC88 8000B088 24A5C74C */ addiu $a1, %lo(D_800DC74C) # addiu $a1, $a1, -0x38b4 -/* 00BC8C 8000B08C 2463C754 */ addiu $v1, %lo(D_800DC754) # addiu $v1, $v1, -0x38ac -/* 00BC90 8000B090 03104021 */ addu $t0, $t8, $s0 -/* 00BC94 8000B094 01115021 */ addu $t2, $t0, $s1 -/* 00BC98 8000B098 AC620000 */ sw $v0, ($v1) -/* 00BC9C 8000B09C AC780004 */ sw $t8, 4($v1) -/* 00BCA0 8000B0A0 ACA80000 */ sw $t0, ($a1) -/* 00BCA4 8000B0A4 ACAA0004 */ sw $t2, 4($a1) -/* 00BCA8 8000B0A8 3C018012 */ lui $at, %hi(D_8011AFF8) # $at, 0x8012 -/* 00BCAC 8000B0AC AC33AFF8 */ sw $s3, %lo(D_8011AFF8)($at) -/* 00BCB0 8000B0B0 3C018012 */ lui $at, %hi(D_8011AFFC) # $at, 0x8012 -/* 00BCB4 8000B0B4 AC20AFFC */ sw $zero, %lo(D_8011AFFC)($at) -/* 00BCB8 8000B0B8 3C018012 */ lui $at, %hi(D_8011B000) # $at, 0x8012 -/* 00BCBC 8000B0BC AC32B000 */ sw $s2, %lo(D_8011B000)($at) -/* 00BCC0 8000B0C0 3C018012 */ lui $at, %hi(D_8011B004) # $at, 0x8012 -/* 00BCC4 8000B0C4 AC20B004 */ sw $zero, %lo(D_8011B004)($at) -/* 00BCC8 8000B0C8 3C018012 */ lui $at, %hi(D_8011B008) # $at, 0x8012 -/* 00BCCC 8000B0CC AC20B008 */ sw $zero, %lo(D_8011B008)($at) -/* 00BCD0 8000B0D0 0C0078A7 */ jal get_misc_asset -/* 00BCD4 8000B0D4 24040014 */ li $a0, 20 -/* 00BCD8 8000B0D8 3C118012 */ lui $s1, %hi(D_8011B020) # $s1, 0x8012 -/* 00BCDC 8000B0DC 3C138012 */ lui $s3, %hi(D_8011B068) # $s3, 0x8012 -/* 00BCE0 8000B0E0 4480A000 */ mtc1 $zero, $f20 -/* 00BCE4 8000B0E4 0040A825 */ move $s5, $v0 -/* 00BCE8 8000B0E8 2673B068 */ addiu $s3, %lo(D_8011B068) # addiu $s3, $s3, -0x4f98 -/* 00BCEC 8000B0EC 2631B020 */ addiu $s1, %lo(D_8011B020) # addiu $s1, $s1, -0x4fe0 -/* 00BCF0 8000B0F0 00009025 */ move $s2, $zero -/* 00BCF4 8000B0F4 27B70058 */ addiu $s7, $sp, 0x58 -/* 00BCF8 8000B0F8 24160001 */ li $s6, 1 -.L8000B0FC: -/* 00BCFC 8000B0FC 240B007E */ li $t3, 126 -/* 00BD00 8000B100 240C000A */ li $t4, 10 -/* 00BD04 8000B104 A3AB0058 */ sb $t3, 0x58($sp) -/* 00BD08 8000B108 A3AC0059 */ sb $t4, 0x59($sp) -/* 00BD0C 8000B10C A7A0005A */ sh $zero, 0x5a($sp) -/* 00BD10 8000B110 A7A0005C */ sh $zero, 0x5c($sp) -/* 00BD14 8000B114 A7A0005E */ sh $zero, 0x5e($sp) -/* 00BD18 8000B118 A3B20060 */ sb $s2, 0x60($sp) -/* 00BD1C 8000B11C 02E02025 */ move $a0, $s7 -/* 00BD20 8000B120 0C003A95 */ jal spawn_object -/* 00BD24 8000B124 24050001 */ li $a1, 1 -/* 00BD28 8000B128 1040001B */ beqz $v0, .L8000B198 -/* 00BD2C 8000B12C AE220000 */ sw $v0, ($s1) -/* 00BD30 8000B130 AC400078 */ sw $zero, 0x78($v0) -/* 00BD34 8000B134 8E2E0000 */ lw $t6, ($s1) -/* 00BD38 8000B138 001279C0 */ sll $t7, $s2, 7 -/* 00BD3C 8000B13C 02AF8021 */ addu $s0, $s5, $t7 -/* 00BD40 8000B140 3C188012 */ lui $t8, %hi(D_8011B010) # $t8, 0x8012 -/* 00BD44 8000B144 ADC0007C */ sw $zero, 0x7c($t6) -/* 00BD48 8000B148 8604006C */ lh $a0, 0x6c($s0) -/* 00BD4C 8000B14C 2718B010 */ addiu $t8, %lo(D_8011B010) # addiu $t8, $t8, -0x4ff0 -/* 00BD50 8000B150 A2000070 */ sb $zero, 0x70($s0) -/* 00BD54 8000B154 E6140074 */ swc1 $f20, 0x74($s0) -/* 00BD58 8000B158 0258A021 */ addu $s4, $s2, $t8 -/* 00BD5C 8000B15C 0C01F04B */ jal func_8007C12C -/* 00BD60 8000B160 00002825 */ move $a1, $zero -/* 00BD64 8000B164 8604006E */ lh $a0, 0x6e($s0) -/* 00BD68 8000B168 0C01EB9D */ jal load_texture -/* 00BD6C 8000B16C AE020078 */ sw $v0, 0x78($s0) -/* 00BD70 8000B170 AE02007C */ sw $v0, 0x7c($s0) -/* 00BD74 8000B174 00002025 */ move $a0, $zero -/* 00BD78 8000B178 0C01BE53 */ jal get_random_number_from_range -/* 00BD7C 8000B17C 240500FF */ li $a1, 255 -/* 00BD80 8000B180 A2020072 */ sb $v0, 0x72($s0) -/* 00BD84 8000B184 A2000073 */ sb $zero, 0x73($s0) -/* 00BD88 8000B188 00002025 */ move $a0, $zero -/* 00BD8C 8000B18C 0C01BE53 */ jal get_random_number_from_range -/* 00BD90 8000B190 240500FF */ li $a1, 255 -/* 00BD94 8000B194 A2820000 */ sb $v0, ($s4) -.L8000B198: -/* 00BD98 8000B198 26520001 */ addiu $s2, $s2, 1 -/* 00BD9C 8000B19C 2A41000A */ slti $at, $s2, 0xa -/* 00BDA0 8000B1A0 26310004 */ addiu $s1, $s1, 4 -/* 00BDA4 8000B1A4 26730001 */ addiu $s3, $s3, 1 -/* 00BDA8 8000B1A8 1420FFD4 */ bnez $at, .L8000B0FC -/* 00BDAC 8000B1AC A276FFFF */ sb $s6, -1($s3) -/* 00BDB0 8000B1B0 24190009 */ li $t9, 9 -/* 00BDB4 8000B1B4 3C01800E */ lui $at, %hi(D_800DC760) # $at, 0x800e -/* 00BDB8 8000B1B8 2408008D */ li $t0, 141 -/* 00BDBC 8000B1BC 2409000A */ li $t1, 10 -/* 00BDC0 8000B1C0 AC39C760 */ sw $t9, %lo(D_800DC760)($at) -/* 00BDC4 8000B1C4 A3A80058 */ sb $t0, 0x58($sp) -/* 00BDC8 8000B1C8 A3A90059 */ sb $t1, 0x59($sp) -/* 00BDCC 8000B1CC A7A0005A */ sh $zero, 0x5a($sp) -/* 00BDD0 8000B1D0 A7A0005C */ sh $zero, 0x5c($sp) -/* 00BDD4 8000B1D4 A7A0005E */ sh $zero, 0x5e($sp) -/* 00BDD8 8000B1D8 02E02025 */ move $a0, $s7 -/* 00BDDC 8000B1DC 0C003A95 */ jal spawn_object -/* 00BDE0 8000B1E0 00002825 */ move $a1, $zero -/* 00BDE4 8000B1E4 3C01800E */ lui $at, %hi(gShieldEffectObject) # $at, 0x800e -/* 00BDE8 8000B1E8 3C108012 */ lui $s0, %hi(D_8011B078) # $s0, 0x8012 -/* 00BDEC 8000B1EC 3C118012 */ lui $s1, %hi(gSceneCurrDisplayList) # $s1, 0x8012 -/* 00BDF0 8000B1F0 AC22C75C */ sw $v0, %lo(gShieldEffectObject)($at) -/* 00BDF4 8000B1F4 2631B0A0 */ addiu $s1, %lo(gSceneCurrDisplayList) # addiu $s1, $s1, -0x4f60 -/* 00BDF8 8000B1F8 2610B078 */ addiu $s0, %lo(D_8011B078) # addiu $s0, $s0, -0x4f88 -.L8000B1FC: -/* 00BDFC 8000B1FC A2000000 */ sb $zero, ($s0) -/* 00BE00 8000B200 00002025 */ move $a0, $zero -/* 00BE04 8000B204 0C01BE53 */ jal get_random_number_from_range -/* 00BE08 8000B208 240500FF */ li $a1, 255 -/* 00BE0C 8000B20C A2020001 */ sb $v0, 1($s0) -/* 00BE10 8000B210 00002025 */ move $a0, $zero -/* 00BE14 8000B214 0C01BE53 */ jal get_random_number_from_range -/* 00BE18 8000B218 240500FF */ li $a1, 255 -/* 00BE1C 8000B21C 26100004 */ addiu $s0, $s0, 4 -/* 00BE20 8000B220 A202FFFE */ sb $v0, -2($s0) -/* 00BE24 8000B224 1611FFF5 */ bne $s0, $s1, .L8000B1FC -/* 00BE28 8000B228 A200FFFF */ sb $zero, -1($s0) -/* 00BE2C 8000B22C 240A001B */ li $t2, 27 -/* 00BE30 8000B230 240B008A */ li $t3, 138 -/* 00BE34 8000B234 A3AA0058 */ sb $t2, 0x58($sp) -/* 00BE38 8000B238 A3AB0059 */ sb $t3, 0x59($sp) -/* 00BE3C 8000B23C A7A0005A */ sh $zero, 0x5a($sp) -/* 00BE40 8000B240 A7A0005C */ sh $zero, 0x5c($sp) -/* 00BE44 8000B244 A7A0005E */ sh $zero, 0x5e($sp) -/* 00BE48 8000B248 02E02025 */ move $a0, $s7 -/* 00BE4C 8000B24C 0C003A95 */ jal spawn_object -/* 00BE50 8000B250 00002825 */ move $a1, $zero -/* 00BE54 8000B254 8FBF003C */ lw $ra, 0x3c($sp) -/* 00BE58 8000B258 3C01800E */ lui $at, %hi(gMagnetEffectObject) # $at, 0x800e -/* 00BE5C 8000B25C C7B50010 */ lwc1 $f21, 0x10($sp) -/* 00BE60 8000B260 C7B40014 */ lwc1 $f20, 0x14($sp) -/* 00BE64 8000B264 8FB0001C */ lw $s0, 0x1c($sp) -/* 00BE68 8000B268 8FB10020 */ lw $s1, 0x20($sp) -/* 00BE6C 8000B26C 8FB20024 */ lw $s2, 0x24($sp) -/* 00BE70 8000B270 8FB30028 */ lw $s3, 0x28($sp) -/* 00BE74 8000B274 8FB4002C */ lw $s4, 0x2c($sp) -/* 00BE78 8000B278 8FB50030 */ lw $s5, 0x30($sp) -/* 00BE7C 8000B27C 8FB60034 */ lw $s6, 0x34($sp) -/* 00BE80 8000B280 8FB70038 */ lw $s7, 0x38($sp) -/* 00BE84 8000B284 AC22C764 */ sw $v0, %lo(gMagnetEffectObject)($at) -/* 00BE88 8000B288 03E00008 */ jr $ra -/* 00BE8C 8000B28C 27BD0068 */ addiu $sp, $sp, 0x68 - diff --git a/asm/non_matchings/objects/func_8001E4C4.s b/asm/non_matchings/objects/func_8001E4C4.s deleted file mode 100644 index a4fc1dd0..00000000 --- a/asm/non_matchings/objects/func_8001E4C4.s +++ /dev/null @@ -1,157 +0,0 @@ -glabel func_8001E4C4 -/* 01F0C4 8001E4C4 3C088012 */ lui $t0, %hi(gObjectCount) # $t0, 0x8012 -/* 01F0C8 8001E4C8 2508AE5C */ addiu $t0, %lo(gObjectCount) # addiu $t0, $t0, -0x51a4 -/* 01F0CC 8001E4CC 8D030000 */ lw $v1, ($t0) -/* 01F0D0 8001E4D0 00001025 */ move $v0, $zero -/* 01F0D4 8001E4D4 18600013 */ blez $v1, .L8001E524 -/* 01F0D8 8001E4D8 00002025 */ move $a0, $zero -/* 01F0DC 8001E4DC 3C098012 */ lui $t1, %hi(gObjPtrList) # $t1, 0x8012 -/* 01F0E0 8001E4E0 2529AE58 */ addiu $t1, %lo(gObjPtrList) # addiu $t1, $t1, -0x51a8 -/* 01F0E4 8001E4E4 2406DFFF */ li $a2, -8193 -.L8001E4E8: -/* 01F0E8 8001E4E8 8D2E0000 */ lw $t6, ($t1) -/* 01F0EC 8001E4EC 24420001 */ addiu $v0, $v0, 1 -/* 01F0F0 8001E4F0 01C47821 */ addu $t7, $t6, $a0 -/* 01F0F4 8001E4F4 8DE50000 */ lw $a1, ($t7) -/* 01F0F8 8001E4F8 24840004 */ addiu $a0, $a0, 4 -/* 01F0FC 8001E4FC 84B80006 */ lh $t8, 6($a1) -/* 01F100 8001E500 00000000 */ nop -/* 01F104 8001E504 0306C824 */ and $t9, $t8, $a2 -/* 01F108 8001E508 A4B90006 */ sh $t9, 6($a1) -/* 01F10C 8001E50C 8D030000 */ lw $v1, ($t0) -/* 01F110 8001E510 00000000 */ nop -/* 01F114 8001E514 0043082A */ slt $at, $v0, $v1 -/* 01F118 8001E518 1420FFF3 */ bnez $at, .L8001E4E8 -/* 01F11C 8001E51C 00000000 */ nop -/* 01F120 8001E520 00001025 */ move $v0, $zero -.L8001E524: -/* 01F124 8001E524 3C098012 */ lui $t1, %hi(gObjPtrList) # $t1, 0x8012 -/* 01F128 8001E528 1860002C */ blez $v1, .L8001E5DC -/* 01F12C 8001E52C 2529AE58 */ addiu $t1, %lo(gObjPtrList) # addiu $t1, $t1, -0x51a8 -/* 01F130 8001E530 3C0B8012 */ lui $t3, %hi(gCutsceneID) # $t3, 0x8012 -/* 01F134 8001E534 256BAE7A */ addiu $t3, %lo(gCutsceneID) # addiu $t3, $t3, -0x5186 -/* 01F138 8001E538 00002025 */ move $a0, $zero -/* 01F13C 8001E53C 240C0014 */ li $t4, 20 -/* 01F140 8001E540 240A0031 */ li $t2, 49 -.L8001E544: -/* 01F144 8001E544 8D2D0000 */ lw $t5, ($t1) -/* 01F148 8001E548 00000000 */ nop -/* 01F14C 8001E54C 01A47021 */ addu $t6, $t5, $a0 -/* 01F150 8001E550 8DC50000 */ lw $a1, ($t6) -/* 01F154 8001E554 00000000 */ nop -/* 01F158 8001E558 10A0001A */ beqz $a1, .L8001E5C4 -/* 01F15C 8001E55C 00000000 */ nop -/* 01F160 8001E560 84A30006 */ lh $v1, 6($a1) -/* 01F164 8001E564 00000000 */ nop -/* 01F168 8001E568 306F8000 */ andi $t7, $v1, 0x8000 -/* 01F16C 8001E56C 15E00015 */ bnez $t7, .L8001E5C4 -/* 01F170 8001E570 00000000 */ nop -/* 01F174 8001E574 84B80048 */ lh $t8, 0x48($a1) -/* 01F178 8001E578 00000000 */ nop -/* 01F17C 8001E57C 15580011 */ bne $t2, $t8, .L8001E5C4 -/* 01F180 8001E580 00000000 */ nop -/* 01F184 8001E584 8CA6003C */ lw $a2, 0x3c($a1) -/* 01F188 8001E588 85790000 */ lh $t9, ($t3) -/* 01F18C 8001E58C 80C70021 */ lb $a3, 0x21($a2) -/* 01F190 8001E590 00000000 */ nop -/* 01F194 8001E594 1327000B */ beq $t9, $a3, .L8001E5C4 -/* 01F198 8001E598 00000000 */ nop -/* 01F19C 8001E59C 11870009 */ beq $t4, $a3, .L8001E5C4 -/* 01F1A0 8001E5A0 00000000 */ nop -/* 01F1A4 8001E5A4 8CA60064 */ lw $a2, 0x64($a1) -/* 01F1A8 8001E5A8 346D2000 */ ori $t5, $v1, 0x2000 -/* 01F1AC 8001E5AC 10C00005 */ beqz $a2, .L8001E5C4 -/* 01F1B0 8001E5B0 A4AD0006 */ sh $t5, 6($a1) -/* 01F1B4 8001E5B4 84CE0006 */ lh $t6, 6($a2) -/* 01F1B8 8001E5B8 00000000 */ nop -/* 01F1BC 8001E5BC 35CF2000 */ ori $t7, $t6, 0x2000 -/* 01F1C0 8001E5C0 A4CF0006 */ sh $t7, 6($a2) -.L8001E5C4: -/* 01F1C4 8001E5C4 8D030000 */ lw $v1, ($t0) -/* 01F1C8 8001E5C8 24420001 */ addiu $v0, $v0, 1 -/* 01F1CC 8001E5CC 0043082A */ slt $at, $v0, $v1 -/* 01F1D0 8001E5D0 1420FFDC */ bnez $at, .L8001E544 -/* 01F1D4 8001E5D4 24840004 */ addiu $a0, $a0, 4 -/* 01F1D8 8001E5D8 00001025 */ move $v0, $zero -.L8001E5DC: -/* 01F1DC 8001E5DC 2466FFFF */ addiu $a2, $v1, -1 -/* 01F1E0 8001E5E0 04C0003D */ bltz $a2, .L8001E6D8 -/* 01F1E4 8001E5E4 00C03825 */ move $a3, $a2 -/* 01F1E8 8001E5E8 00E2082A */ slt $at, $a3, $v0 -.L8001E5EC: -/* 01F1EC 8001E5EC 14200014 */ bnez $at, .L8001E640 -/* 01F1F0 8001E5F0 00001825 */ move $v1, $zero -/* 01F1F4 8001E5F4 8D380000 */ lw $t8, ($t1) -/* 01F1F8 8001E5F8 0002C880 */ sll $t9, $v0, 2 -/* 01F1FC 8001E5FC 03192021 */ addu $a0, $t8, $t9 -.L8001E600: -/* 01F200 8001E600 8C8D0000 */ lw $t5, ($a0) -/* 01F204 8001E604 00000000 */ nop -/* 01F208 8001E608 85AE0006 */ lh $t6, 6($t5) -/* 01F20C 8001E60C 00000000 */ nop -/* 01F210 8001E610 31CF2000 */ andi $t7, $t6, 0x2000 -/* 01F214 8001E614 11E00004 */ beqz $t7, .L8001E628 -/* 01F218 8001E618 00000000 */ nop -/* 01F21C 8001E61C 24420001 */ addiu $v0, $v0, 1 -/* 01F220 8001E620 10000002 */ b .L8001E62C -/* 01F224 8001E624 24840004 */ addiu $a0, $a0, 4 -.L8001E628: -/* 01F228 8001E628 2403FFFF */ li $v1, -1 -.L8001E62C: -/* 01F22C 8001E62C 00E2082A */ slt $at, $a3, $v0 -/* 01F230 8001E630 14200003 */ bnez $at, .L8001E640 -/* 01F234 8001E634 00000000 */ nop -/* 01F238 8001E638 1060FFF1 */ beqz $v1, .L8001E600 -/* 01F23C 8001E63C 00000000 */ nop -.L8001E640: -/* 01F240 8001E640 04C00013 */ bltz $a2, .L8001E690 -/* 01F244 8001E644 00001825 */ move $v1, $zero -/* 01F248 8001E648 8D380000 */ lw $t8, ($t1) -/* 01F24C 8001E64C 0006C880 */ sll $t9, $a2, 2 -/* 01F250 8001E650 03192021 */ addu $a0, $t8, $t9 -.L8001E654: -/* 01F254 8001E654 8C8D0000 */ lw $t5, ($a0) -/* 01F258 8001E658 00000000 */ nop -/* 01F25C 8001E65C 85AE0006 */ lh $t6, 6($t5) -/* 01F260 8001E660 00000000 */ nop -/* 01F264 8001E664 31CF2000 */ andi $t7, $t6, 0x2000 -/* 01F268 8001E668 11E00003 */ beqz $t7, .L8001E678 -/* 01F26C 8001E66C 00000000 */ nop -/* 01F270 8001E670 10000003 */ b .L8001E680 -/* 01F274 8001E674 2403FFFF */ li $v1, -1 -.L8001E678: -/* 01F278 8001E678 24C6FFFF */ addiu $a2, $a2, -1 -/* 01F27C 8001E67C 2484FFFC */ addiu $a0, $a0, -4 -.L8001E680: -/* 01F280 8001E680 04C00004 */ bltz $a2, .L8001E694 -/* 01F284 8001E684 0046082A */ slt $at, $v0, $a2 -/* 01F288 8001E688 1060FFF2 */ beqz $v1, .L8001E654 -/* 01F28C 8001E68C 00000000 */ nop -.L8001E690: -/* 01F290 8001E690 0046082A */ slt $at, $v0, $a2 -.L8001E694: -/* 01F294 8001E694 1020000D */ beqz $at, .L8001E6CC -/* 01F298 8001E698 0002C080 */ sll $t8, $v0, 2 -/* 01F29C 8001E69C 8D230000 */ lw $v1, ($t1) -/* 01F2A0 8001E6A0 00064080 */ sll $t0, $a2, 2 -/* 01F2A4 8001E6A4 0068C821 */ addu $t9, $v1, $t0 -/* 01F2A8 8001E6A8 8F2D0000 */ lw $t5, ($t9) -/* 01F2AC 8001E6AC 00782021 */ addu $a0, $v1, $t8 -/* 01F2B0 8001E6B0 8C850000 */ lw $a1, ($a0) -/* 01F2B4 8001E6B4 AC8D0000 */ sw $t5, ($a0) -/* 01F2B8 8001E6B8 8D2E0000 */ lw $t6, ($t1) -/* 01F2BC 8001E6BC 24420001 */ addiu $v0, $v0, 1 -/* 01F2C0 8001E6C0 01C87821 */ addu $t7, $t6, $t0 -/* 01F2C4 8001E6C4 24C6FFFF */ addiu $a2, $a2, -1 -/* 01F2C8 8001E6C8 ADE50000 */ sw $a1, ($t7) -.L8001E6CC: -/* 01F2CC 8001E6CC 00C2082A */ slt $at, $a2, $v0 -/* 01F2D0 8001E6D0 1020FFC6 */ beqz $at, .L8001E5EC -/* 01F2D4 8001E6D4 00E2082A */ slt $at, $a3, $v0 -.L8001E6D8: -/* 01F2D8 8001E6D8 3C018012 */ lui $at, %hi(gObjectListStart) # $at, 0x8012 -/* 01F2DC 8001E6DC AC22AE60 */ sw $v0, %lo(gObjectListStart)($at) -/* 01F2E0 8001E6E0 3C018012 */ lui $at, %hi(D_8011AE7C) # $at, 0x8012 -/* 01F2E4 8001E6E4 03E00008 */ jr $ra -/* 01F2E8 8001E6E8 A420AE7C */ sh $zero, %lo(D_8011AE7C)($at) - diff --git a/asm/non_matchings/waves/func_800B7EB4.s b/asm/non_matchings/waves/func_800B7EB4.s deleted file mode 100644 index cac0425f..00000000 --- a/asm/non_matchings/waves/func_800B7EB4.s +++ /dev/null @@ -1,167 +0,0 @@ -glabel func_800B7EB4 -/* 0B8AB4 800B7EB4 27BDFFD8 */ addiu $sp, $sp, -0x28 -/* 0B8AB8 800B7EB8 AFBF0024 */ sw $ra, 0x24($sp) -/* 0B8ABC 800B7EBC AFB20020 */ sw $s2, 0x20($sp) -/* 0B8AC0 800B7EC0 AFB1001C */ sw $s1, 0x1c($sp) -/* 0B8AC4 800B7EC4 0C02DF48 */ jal free_waves -/* 0B8AC8 800B7EC8 AFB00018 */ sw $s0, 0x18($sp) -/* 0B8ACC 800B7ECC 3C128013 */ lui $s2, %hi(D_80129FC8) # $s2, 0x8013 -/* 0B8AD0 800B7ED0 26529FC8 */ addiu $s2, %lo(D_80129FC8) # addiu $s2, $s2, -0x6038 -/* 0B8AD4 800B7ED4 8E440020 */ lw $a0, 0x20($s2) -/* 0B8AD8 800B7ED8 3C1100FF */ lui $s1, (0x00FFFFFF >> 16) # lui $s1, 0xff -/* 0B8ADC 800B7EDC 3631FFFF */ ori $s1, (0x00FFFFFF & 0xFFFF) # ori $s1, $s1, 0xffff -/* 0B8AE0 800B7EE0 00047080 */ sll $t6, $a0, 2 -/* 0B8AE4 800B7EE4 01C02025 */ move $a0, $t6 -/* 0B8AE8 800B7EE8 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8AEC 800B7EEC 02202825 */ move $a1, $s1 -/* 0B8AF0 800B7EF0 3C01800E */ lui $at, %hi(D_800E3040) # $at, 0x800e -/* 0B8AF4 800B7EF4 AC223040 */ sw $v0, %lo(D_800E3040)($at) -/* 0B8AF8 800B7EF8 8E430004 */ lw $v1, 4($s2) -/* 0B8AFC 800B7EFC 02202825 */ move $a1, $s1 -/* 0B8B00 800B7F00 00037880 */ sll $t7, $v1, 2 -/* 0B8B04 800B7F04 01E30019 */ multu $t7, $v1 -/* 0B8B08 800B7F08 00002012 */ mflo $a0 -/* 0B8B0C 800B7F0C 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8B10 800B7F10 00000000 */ nop -/* 0B8B14 800B7F14 3C01800E */ lui $at, %hi(D_800E3044) # $at, 0x800e -/* 0B8B18 800B7F18 AC223044 */ sw $v0, %lo(D_800E3044)($at) -/* 0B8B1C 800B7F1C 8E430000 */ lw $v1, ($s2) -/* 0B8B20 800B7F20 02202825 */ move $a1, $s1 -/* 0B8B24 800B7F24 24630001 */ addiu $v1, $v1, 1 -/* 0B8B28 800B7F28 0003C080 */ sll $t8, $v1, 2 -/* 0B8B2C 800B7F2C 03030019 */ multu $t8, $v1 -/* 0B8B30 800B7F30 00002012 */ mflo $a0 -/* 0B8B34 800B7F34 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8B38 800B7F38 00000000 */ nop -/* 0B8B3C 800B7F3C 3C01800E */ lui $at, %hi(D_800E3048) # $at, 0x800e -/* 0B8B40 800B7F40 AC223048 */ sw $v0, %lo(D_800E3048)($at) -/* 0B8B44 800B7F44 8E430000 */ lw $v1, ($s2) -/* 0B8B48 800B7F48 241F0009 */ li $ra, 9 -/* 0B8B4C 800B7F4C 24630001 */ addiu $v1, $v1, 1 -/* 0B8B50 800B7F50 0003C880 */ sll $t9, $v1, 2 -/* 0B8B54 800B7F54 03230019 */ multu $t9, $v1 -/* 0B8B58 800B7F58 02202825 */ move $a1, $s1 -/* 0B8B5C 800B7F5C 00008012 */ mflo $s0 -/* 0B8B60 800B7F60 00000000 */ nop -/* 0B8B64 800B7F64 00000000 */ nop -/* 0B8B68 800B7F68 021F0019 */ multu $s0, $ra -/* 0B8B6C 800B7F6C 00002012 */ mflo $a0 -/* 0B8B70 800B7F70 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8B74 800B7F74 00000000 */ nop -/* 0B8B78 800B7F78 3C04800E */ lui $a0, %hi(D_800E304C) # $a0, 0x800e -/* 0B8B7C 800B7F7C 2484304C */ addiu $a0, %lo(D_800E304C) # addiu $a0, $a0, 0x304c -/* 0B8B80 800B7F80 3C03800E */ lui $v1, %hi(D_800E3050) # $v1, 0x800e -/* 0B8B84 800B7F84 00104080 */ sll $t0, $s0, 2 -/* 0B8B88 800B7F88 AC820000 */ sw $v0, ($a0) -/* 0B8B8C 800B7F8C 241F0009 */ li $ra, 9 -/* 0B8B90 800B7F90 01104023 */ subu $t0, $t0, $s0 -/* 0B8B94 800B7F94 24633050 */ addiu $v1, %lo(D_800E3050) # addiu $v1, $v1, 0x3050 -/* 0B8B98 800B7F98 24050001 */ li $a1, 1 -/* 0B8B9C 800B7F9C 02003025 */ move $a2, $s0 -/* 0B8BA0 800B7FA0 00105080 */ sll $t2, $s0, 2 -/* 0B8BA4 800B7FA4 00103840 */ sll $a3, $s0, 1 -/* 0B8BA8 800B7FA8 00105880 */ sll $t3, $s0, 2 -/* 0B8BAC 800B7FAC 00106080 */ sll $t4, $s0, 2 -/* 0B8BB0 800B7FB0 00104880 */ sll $t1, $s0, 2 -/* 0B8BB4 800B7FB4 00106880 */ sll $t5, $s0, 2 -.L800B7FB8: -/* 0B8BB8 800B7FB8 8C8E0000 */ lw $t6, ($a0) -/* 0B8BBC 800B7FBC 24A50004 */ addiu $a1, $a1, 4 -/* 0B8BC0 800B7FC0 01C67821 */ addu $t7, $t6, $a2 -/* 0B8BC4 800B7FC4 AC6F0000 */ sw $t7, ($v1) -/* 0B8BC8 800B7FC8 8C980000 */ lw $t8, ($a0) -/* 0B8BCC 800B7FCC 00CA3021 */ addu $a2, $a2, $t2 -/* 0B8BD0 800B7FD0 0307C821 */ addu $t9, $t8, $a3 -/* 0B8BD4 800B7FD4 AC790004 */ sw $t9, 4($v1) -/* 0B8BD8 800B7FD8 8C8E0000 */ lw $t6, ($a0) -/* 0B8BDC 800B7FDC 00EB3821 */ addu $a3, $a3, $t3 -/* 0B8BE0 800B7FE0 01C87821 */ addu $t7, $t6, $t0 -/* 0B8BE4 800B7FE4 AC6F0008 */ sw $t7, 8($v1) -/* 0B8BE8 800B7FE8 8C980000 */ lw $t8, ($a0) -/* 0B8BEC 800B7FEC 010C4021 */ addu $t0, $t0, $t4 -/* 0B8BF0 800B7FF0 0309C821 */ addu $t9, $t8, $t1 -/* 0B8BF4 800B7FF4 AC79000C */ sw $t9, 0xc($v1) -/* 0B8BF8 800B7FF8 012D4821 */ addu $t1, $t1, $t5 -/* 0B8BFC 800B7FFC 14BFFFEE */ bne $a1, $ra, .L800B7FB8 -/* 0B8C00 800B8000 24630010 */ addiu $v1, $v1, 0x10 -/* 0B8C04 800B8004 8E430000 */ lw $v1, ($s2) -/* 0B8C08 800B8008 3C0F8013 */ lui $t7, %hi(D_8012A078) # $t7, 0x8013 -/* 0B8C0C 800B800C 24630001 */ addiu $v1, $v1, 1 -/* 0B8C10 800B8010 00037140 */ sll $t6, $v1, 5 -/* 0B8C14 800B8014 01C37023 */ subu $t6, $t6, $v1 -/* 0B8C18 800B8018 000E7080 */ sll $t6, $t6, 2 -/* 0B8C1C 800B801C 01C37021 */ addu $t6, $t6, $v1 -/* 0B8C20 800B8020 000E7040 */ sll $t6, $t6, 1 -/* 0B8C24 800B8024 01C30019 */ multu $t6, $v1 -/* 0B8C28 800B8028 8DEFA078 */ lw $t7, %lo(D_8012A078)($t7) -/* 0B8C2C 800B802C 24010002 */ li $at, 2 -/* 0B8C30 800B8030 00008012 */ mflo $s0 -/* 0B8C34 800B8034 00102040 */ sll $a0, $s0, 1 -/* 0B8C38 800B8038 11E10009 */ beq $t7, $at, .L800B8060 -/* 0B8C3C 800B803C 00000000 */ nop -/* 0B8C40 800B8040 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8C44 800B8044 02202825 */ move $a1, $s1 -/* 0B8C48 800B8048 3C03800E */ lui $v1, %hi(D_800E3070) # $v1, 0x800e -/* 0B8C4C 800B804C 24633070 */ addiu $v1, %lo(D_800E3070) # addiu $v1, $v1, 0x3070 -/* 0B8C50 800B8050 0050C821 */ addu $t9, $v0, $s0 -/* 0B8C54 800B8054 AC620000 */ sw $v0, ($v1) -/* 0B8C58 800B8058 1000000D */ b .L800B8090 -/* 0B8C5C 800B805C AC790004 */ sw $t9, 4($v1) -.L800B8060: -/* 0B8C60 800B8060 00102080 */ sll $a0, $s0, 2 -/* 0B8C64 800B8064 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8C68 800B8068 02202825 */ move $a1, $s1 -/* 0B8C6C 800B806C 3C03800E */ lui $v1, %hi(D_800E3070) # $v1, 0x800e -/* 0B8C70 800B8070 24633070 */ addiu $v1, %lo(D_800E3070) # addiu $v1, $v1, 0x3070 -/* 0B8C74 800B8074 00507821 */ addu $t7, $v0, $s0 -/* 0B8C78 800B8078 AC6F0004 */ sw $t7, 4($v1) -/* 0B8C7C 800B807C 01F0C821 */ addu $t9, $t7, $s0 -/* 0B8C80 800B8080 03307821 */ addu $t7, $t9, $s0 -/* 0B8C84 800B8084 AC620000 */ sw $v0, ($v1) -/* 0B8C88 800B8088 AC790008 */ sw $t9, 8($v1) -/* 0B8C8C 800B808C AC6F000C */ sw $t7, 0xc($v1) -.L800B8090: -/* 0B8C90 800B8090 8E420000 */ lw $v0, ($s2) -/* 0B8C94 800B8094 3C198013 */ lui $t9, %hi(D_8012A078) # $t9, 0x8013 -/* 0B8C98 800B8098 0002C140 */ sll $t8, $v0, 5 -/* 0B8C9C 800B809C 03020019 */ multu $t8, $v0 -/* 0B8CA0 800B80A0 8F39A078 */ lw $t9, %lo(D_8012A078)($t9) -/* 0B8CA4 800B80A4 24010002 */ li $at, 2 -/* 0B8CA8 800B80A8 00008012 */ mflo $s0 -/* 0B8CAC 800B80AC 00102040 */ sll $a0, $s0, 1 -/* 0B8CB0 800B80B0 13210009 */ beq $t9, $at, .L800B80D8 -/* 0B8CB4 800B80B4 00000000 */ nop -/* 0B8CB8 800B80B8 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8CBC 800B80BC 02202825 */ move $a1, $s1 -/* 0B8CC0 800B80C0 3C03800E */ lui $v1, %hi(D_800E3080) # $v1, 0x800e -/* 0B8CC4 800B80C4 24633080 */ addiu $v1, %lo(D_800E3080) # addiu $v1, $v1, 0x3080 -/* 0B8CC8 800B80C8 00507821 */ addu $t7, $v0, $s0 -/* 0B8CCC 800B80CC AC620000 */ sw $v0, ($v1) -/* 0B8CD0 800B80D0 1000000D */ b .L800B8108 -/* 0B8CD4 800B80D4 AC6F0004 */ sw $t7, 4($v1) -.L800B80D8: -/* 0B8CD8 800B80D8 00102080 */ sll $a0, $s0, 2 -/* 0B8CDC 800B80DC 0C01C327 */ jal allocate_from_main_pool_safe -/* 0B8CE0 800B80E0 02202825 */ move $a1, $s1 -/* 0B8CE4 800B80E4 3C03800E */ lui $v1, %hi(D_800E3080) # $v1, 0x800e -/* 0B8CE8 800B80E8 24633080 */ addiu $v1, %lo(D_800E3080) # addiu $v1, $v1, 0x3080 -/* 0B8CEC 800B80EC 0050C821 */ addu $t9, $v0, $s0 -/* 0B8CF0 800B80F0 AC790004 */ sw $t9, 4($v1) -/* 0B8CF4 800B80F4 03307821 */ addu $t7, $t9, $s0 -/* 0B8CF8 800B80F8 01F0C821 */ addu $t9, $t7, $s0 -/* 0B8CFC 800B80FC AC620000 */ sw $v0, ($v1) -/* 0B8D00 800B8100 AC6F0008 */ sw $t7, 8($v1) -/* 0B8D04 800B8104 AC79000C */ sw $t9, 0xc($v1) -.L800B8108: -/* 0B8D08 800B8108 8E44002C */ lw $a0, 0x2c($s2) -/* 0B8D0C 800B810C 0C01EB9D */ jal load_texture -/* 0B8D10 800B8110 00000000 */ nop -/* 0B8D14 800B8114 8FBF0024 */ lw $ra, 0x24($sp) -/* 0B8D18 800B8118 3C01800E */ lui $at, %hi(D_800E30D0) # $at, 0x800e -/* 0B8D1C 800B811C 8FB00018 */ lw $s0, 0x18($sp) -/* 0B8D20 800B8120 8FB1001C */ lw $s1, 0x1c($sp) -/* 0B8D24 800B8124 8FB20020 */ lw $s2, 0x20($sp) -/* 0B8D28 800B8128 AC2230D0 */ sw $v0, %lo(D_800E30D0)($at) -/* 0B8D2C 800B812C 03E00008 */ jr $ra -/* 0B8D30 800B8130 27BD0028 */ addiu $sp, $sp, 0x28 - diff --git a/asm/non_matchings/waves/func_800B82B4.s b/asm/non_matchings/waves/func_800B82B4.s index 896bb0a3..66bb434e 100644 --- a/asm/non_matchings/waves/func_800B82B4.s +++ b/asm/non_matchings/waves/func_800B82B4.s @@ -26,7 +26,7 @@ glabel func_800B82B4 /* B8EF8 800B82F8 AC26A078 */ sw $a2, %lo(D_8012A078)($at) /* B8EFC 800B82FC 0C02E04D */ jal func_800B8134 /* B8F00 800B8300 00A02025 */ or $a0, $a1, $zero -/* B8F04 800B8304 0C02DFAD */ jal func_800B7EB4 +/* B8F04 800B8304 0C02DFAD */ jal wave_init /* B8F08 800B8308 00000000 */ nop /* B8F0C 800B830C 8FA40070 */ lw $a0, 0x70($sp) /* B8F10 800B8310 0C02EF77 */ jal func_800BBDDC diff --git a/include/structs.h b/include/structs.h index 88a66623..10932985 100644 --- a/include/structs.h +++ b/include/structs.h @@ -975,6 +975,11 @@ typedef struct Object_Animation { /* 0x5C */ s32 unk5C; } Object_Animation; +typedef struct Object_Animation2 { + /* 0x00 */ u8 pad0[6]; + /* 0x06 */ s16 flags; +} Object_Animation2; + typedef struct Object_OverridePos { /* 0x00 */ f32 x; /* 0x04 */ f32 y; @@ -1607,13 +1612,13 @@ typedef struct Object_CharacterSelect { s8 pad42; s8 unk43; } Object_CharacterSelect; - typedef struct Object_64 { union { Object_Laser laser; Object_TrophyCabinet trophy_cabinet; Object_Animator animator; Object_Animation animation; + Object_Animation2 animation2; Object_WeaponBalloon weapon_balloon; Object_Weapon weapon; Object_Butterfly butterfly; @@ -1654,6 +1659,7 @@ typedef struct Object_64 { Object_8001E89C_64 obj8001E89C_64; Object_CharacterSelect characterSelect; Object_AiNode ai_node; + Object_OverridePos override_pos; }; } Object_64; diff --git a/src/memory.c b/src/memory.c index e54d165d..75684dd3 100644 --- a/src/memory.c +++ b/src/memory.c @@ -673,6 +673,23 @@ UNUSED void render_memory_colour_tags(void) { render_printf("ORANGE %d\n\n", get_memory_colour_tag_count(COLOUR_TAG_ORANGE)); } +/************ .rodata ************/ + +UNUSED const char D_800E7590[] = "Region = %d loc = %x size = %x\t"; +UNUSED const char D_800E75B4[] = "FREE"; +UNUSED const char D_800E75BC[] = "ALLOCATED"; +UNUSED const char D_800E75C8[] = "ALLOCATED,FIXED"; +UNUSED const char D_800E75D8[] = "\n"; +UNUSED const char D_800E75DC[] = "\n"; +UNUSED const char D_800E75E0[] = "Region number = %d\t"; +UNUSED const char D_800E75F4[] = "maxSlots = %d\t"; +UNUSED const char D_800E7604[] = "slotsUsed = %d\t"; +UNUSED const char D_800E7614[] = "loc = %x\t"; +UNUSED const char D_800E7620[] = "size = %x\n"; +UNUSED const char D_800E762C[] = "\n"; + +/*********************************/ + UNUSED void mmSlotPrint(void) { s32 i; s32 skip; diff --git a/src/objects.c b/src/objects.c index 620ff632..0fd4ab07 100644 --- a/src/objects.c +++ b/src/objects.c @@ -324,31 +324,85 @@ s32 D_8011B000; s32 D_8011B004; s32 D_8011B008; u8 D_8011B010[16]; -Object *D_8011B020[10]; +Object *D_8011B020[NUMBER_OF_CHARACTERS]; s32 D_8011B048[4]; s32 D_8011B058[4]; u8 D_8011B068[16]; -u8 D_8011B078[3]; -u8 D_8011B07B[1]; -s32 D_8011B080[7]; +ColourRGBA D_8011B078[NUMBER_OF_CHARACTERS]; // Note: D_8011B078 might not be a ColourRGBA. extern s16 gGhostMapID; /******************************/ -GLOBAL_ASM("asm/non_matchings/objects/func_8000B020.s") +typedef struct LevelObjectEntry_unk8000B020 { + LevelObjectEntryCommon common; + s8 unk8; + s8 unk9; +} LevelObjectEntry_unk8000B020; -struct TempStruct9 { - u8 pad[0x78]; - Sprite *unk78; - TextureHeader *unk7C; -}; +void func_8000B020(s32 numberOfVertices, s32 numberOfTriangles) { + Asset20 *miscAsset20; + LevelObjectEntry_unk8000B020 objEntry; + s32 i; + + D_800DC754[0] = + (s32) allocate_from_main_pool_safe(((numberOfTriangles * 16) + (numberOfVertices * 10)) * 2, COLOUR_TAG_BLUE); + D_800DC754[1] = D_800DC754[0] + (numberOfTriangles * 16); + D_800DC74C[0] = D_800DC754[1] + (numberOfTriangles * 16); + D_800DC74C[1] = D_800DC74C[0] + (numberOfVertices * 10); + D_8011AFF8 = numberOfVertices; + D_8011AFFC = 0; + D_8011B000 = numberOfTriangles; + D_8011B004 = 0; + D_8011B008 = 0; + miscAsset20 = (Asset20 *) get_misc_asset(ASSET_MISC_20); + for (i = 0; i < ARRAY_COUNT(D_8011B020); i++) { + objEntry.common.objectID = ASSET_OBJECT_ID_BOOST; + objEntry.common.size = 10; + objEntry.common.x = 0; + objEntry.common.y = 0; + objEntry.common.z = 0; + objEntry.unk8 = i; + D_8011B020[i] = spawn_object(&objEntry.common, 1); + if (D_8011B020[i] != NULL) { + D_8011B020[i]->properties.common.unk0 = 0; + D_8011B020[i]->properties.common.unk4 = 0; + miscAsset20[i].unk70 = 0; + miscAsset20[i].unk74 = 0.0f; + miscAsset20[i].unk78 = (Sprite *) func_8007C12C(miscAsset20[i].unk6C, 0); + miscAsset20[i].unk7C = load_texture(miscAsset20[i].unk6E); + miscAsset20[i].unk72 = get_random_number_from_range(0, 255); + miscAsset20[i].unk73 = 0; + D_8011B010[i] = get_random_number_from_range(0, 255); + } + D_8011B068[i] = 1; + } + D_800DC760 = 9; + objEntry.common.objectID = ASSET_OBJECT_ID_SHIELD; + objEntry.common.size = 10; + objEntry.common.x = 0; + objEntry.common.y = 0; + objEntry.common.z = 0; + gShieldEffectObject = spawn_object((LevelObjectEntryCommon *) &objEntry, 0); + for (i = 0; i < ARRAY_COUNT(D_8011B078); i++) { + D_8011B078[i].r = 0; + D_8011B078[i].g = get_random_number_from_range(0, 255); + D_8011B078[i].b = get_random_number_from_range(0, 255); + D_8011B078[i].a = 0; + } + objEntry.common.objectID = ASSET_OBJECT_ID_AINODE; + objEntry.common.size = 138; + objEntry.common.x = 0; + objEntry.common.y = 0; + objEntry.common.z = 0; + gMagnetEffectObject = spawn_object((LevelObjectEntryCommon *) &objEntry, 0); +} void func_8000B290(void) { - Sprite *temp_a0_2; - TextureHeader *temp_a0_3; + Sprite *sprite; + TextureHeader *texture; s32 temp_a0; - struct TempStruct9 *var_s0; + Asset20 *asset20; u32 i; temp_a0 = D_800DC754[0]; @@ -359,25 +413,25 @@ void func_8000B290(void) { D_800DC74C[0] = 0; D_800DC74C[1] = 0; } - var_s0 = (struct TempStruct9 *) get_misc_asset(ASSET_MISC_20); + asset20 = (Asset20 *) get_misc_asset(ASSET_MISC_20); for (i = 0; i < 10; i++) { - temp_a0_2 = var_s0[i].unk78; - if (temp_a0_2 != 0) { - free_sprite(temp_a0_2); - var_s0[i].unk78 = 0; + sprite = asset20[i].unk78; + if (sprite != NULL) { + free_sprite(sprite); + asset20[i].unk78 = NULL; } - temp_a0_3 = var_s0[i].unk7C; - if (temp_a0_3 != 0) { - free_texture(temp_a0_3); - var_s0[i].unk7C = 0; + texture = asset20[i].unk7C; + if (texture != NULL) { + free_texture(texture); + asset20[i].unk7C = NULL; } } - if (gShieldEffectObject) { + if (gShieldEffectObject != NULL) { free_object(gShieldEffectObject); } gShieldEffectObject = NULL; - if (gMagnetEffectObject) { + if (gMagnetEffectObject != NULL) { free_object(gMagnetEffectObject); } gMagnetEffectObject = NULL; @@ -451,7 +505,7 @@ void func_8000BADC(s32 updateRate) { asset20Part->unk74 -= updateRateF * 0.05f; updateRateF = 0.0f; if (asset20Part->unk74 < 0.0f) { - asset20Part->unk70 = 0U; + asset20Part->unk70 = 0; asset20Part->unk74 += 1.0f; } } @@ -460,27 +514,27 @@ void func_8000BADC(s32 updateRate) { if (asset20Part->unk74 < 0.0f) { asset20Part->unk74 = 0.0f; } - asset20Part->unk70 = 0U; + asset20Part->unk70 = 0; } } } if ((asset20Part->unk70 > 0) || (asset20Part->unk74 > 0.0f)) { func_8000B750((*gRacers)[i], racer->racerIndex, racer->vehicleIDPrev, racer->boostType, 0); } - temp = racer->racerIndex << 2; - D_8011B078[temp + 1] += updateRate; - D_8011B078[temp + 2] += updateRate; + temp = racer->racerIndex; + D_8011B078[temp].g += updateRate; + D_8011B078[temp].b += updateRate; if (racer->magnetTimer != 0) { - if (D_8011B078[temp + 3] + (updateRate << 2) < 32) { - D_8011B078[temp + 3] += (updateRate << 2); + if (D_8011B078[temp].a + (updateRate << 2) < 32) { + D_8011B078[temp].a += (updateRate << 2); } else { - D_8011B078[temp + 3] = 32; + D_8011B078[temp].a = 32; } } else { - if (D_8011B078[temp + 3] - updateRate > 0) { - D_8011B078[temp + 3] -= updateRate; + if (D_8011B078[temp].a - updateRate > 0) { + D_8011B078[temp].a -= updateRate; } else { - D_8011B078[temp + 3] = 0; + D_8011B078[temp].a = 0; } } } @@ -2839,7 +2893,7 @@ void render_3d_model(Object *obj) { hasEnvCol = TRUE; } if (obj->behaviorId == BHV_RACER) { - racerObj = (Object_Racer *) obj->unk64; + racerObj = &obj->unk64->racer; object_do_player_tumble(obj); } else { racerObj = NULL; @@ -3348,17 +3402,17 @@ void render_bubble_trap(ObjectTransform *trans, Object_68 *gfxData, Object *obj, * Afterwards, render the graphics with opacity scaling with the fadetimer. */ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *obj) { - struct Object_Racer *racer; + Object_Racer *racer; Object_68 *gfxData; ObjectModel *mdl; - struct RacerShieldGfx *shield; + RacerShieldGfx *shield; s32 shieldType; s32 vehicleID; s32 racerIndex; f32 scale; f32 shear; - racer = (Object_Racer *) obj->unk64; + racer = &obj->unk64->racer; if (racer->shieldTimer > 0 && gShieldEffectObject != NULL) { gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; @@ -3371,7 +3425,7 @@ void render_racer_shield(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o if (vehicleID >= NUMBER_OF_PLAYER_VEHICLES) { vehicleID = VEHICLE_CAR; } - shield = ((struct RacerShieldGfx *) get_misc_asset(ASSET_MISC_SHIELD_DATA)); + shield = (RacerShieldGfx *) get_misc_asset(ASSET_MISC_SHIELD_DATA); vehicleID = (vehicleID * 10) + racerIndex; shield = shield + vehicleID; gShieldEffectObject->segment.trans.x_position = shield->x_position; @@ -3430,9 +3484,9 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o f32 shear; UNUSED s32 pad; - racer = (Object_Racer *) obj->unk64; - var_t0 = racer->racerIndex * 4; - if (D_8011B07B[var_t0]) { + racer = &obj->unk64->racer; + var_t0 = racer->racerIndex; + if (D_8011B078[var_t0].a != 0) { if (gMagnetEffectObject != NULL) { gObjectCurrDisplayList = *dList; gObjectCurrMatrix = *mtx; @@ -3451,17 +3505,17 @@ void render_racer_magnet(Gfx **dList, MatrixS **mtx, Vertex **vtxList, Object *o gMagnetEffectObject->segment.trans.y_position = magnet[1]; gMagnetEffectObject->segment.trans.z_position = magnet[2]; magnet += 3; - shear = (coss_f((D_8011B078[(var_t0 * 4) + 1] * 0x400)) * 0.02f) + 0.98f; + shear = (coss_f((D_8011B078[var_t0].g * 0x400)) * 0.02f) + 0.98f; gMagnetEffectObject->segment.trans.scale = magnet[0] * shear; magnet += 1; shear = magnet[0] * shear; - gMagnetEffectObject->segment.trans.y_rotation = D_8011B078[(var_t0 * 4) + 2] * 0x1000; + gMagnetEffectObject->segment.trans.y_rotation = D_8011B078[var_t0].b * 0x1000; gMagnetEffectObject->segment.trans.x_rotation = 0; gMagnetEffectObject->segment.trans.z_rotation = 0; gfxData = *gMagnetEffectObject->unk68; mdl = gfxData->objModel; gMagnetEffectObject->unk44 = (Vertex *) gfxData->unk4[gfxData->animationTaskNum]; - opacity = ((D_8011B078[(var_t0 * 4) + 1] * 8) & 0x7F) + 0x80; + opacity = ((D_8011B078[var_t0].g * 8) & 0x7F) + 0x80; func_8007F594(&gObjectCurrDisplayList, 2, COLOUR_RGBA32(255, 255, 255, opacity), gMagnetColours[racer->magnetModelID]); apply_object_shear_matrix(&gObjectCurrDisplayList, &gObjectCurrMatrix, gMagnetEffectObject, obj, shear); @@ -4225,7 +4279,7 @@ GLOBAL_ASM("asm/non_matchings/objects/func_80019808.s") s8 set_course_finish_flags(Settings *settings) { Object_Racer *racer; - racer = (Object_Racer *) gRacersByPosition[PLAYER_ONE]->unk64; + racer = &gRacersByPosition[PLAYER_ONE]->unk64->racer; if (racer->playerIndex == PLAYER_COMPUTER) { return FALSE; } @@ -5027,7 +5081,7 @@ void ainode_update(void) { for (i = 0; i < AINODE_COUNT; i++) { obj = (*gAINodes)[i]; if (obj != NULL) { - aiNodeObj64 = (Object_AiNode *) obj->unk64; + aiNodeObj64 = &obj->unk64->ai_node; aiNodeEntry = &obj->segment.level_entry->aiNode; for (j = 0; j < 4; j++) { index2 = aiNodeEntry->adjacent[j]; @@ -5185,8 +5239,8 @@ s32 func_8001CC48(s32 nodeCurrent, s32 arg1, s32 direction) { if (someObj == NULL) { return NODE_NONE; } - entry = (LevelObjectEntry_AiNode *) someObj->segment.level_entry; - someObj64 = (Object_AiNode *) someObj->unk64; + entry = &someObj->segment.level_entry->aiNode; + someObj64 = &someObj->unk64->ai_node; test = direction & 3; // Swapping these messes up the registers. @@ -5240,7 +5294,7 @@ s16 func_8001CD28(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { } while (i < AINODE_COUNT); aiNodeObj = (*gAINodes)[arg0]; - aiNode = (Object_AiNode *) aiNodeObj->unk64; + aiNode = &aiNodeObj->unk64->ai_node; aiNodeEntry = &aiNodeObj->segment.level_entry->aiNode; var_t1 = 0; var_ra = 0; @@ -5615,7 +5669,57 @@ UNUSED s32 get_object_list_index(void) { return gObjectListStart; } -GLOBAL_ASM("asm/non_matchings/objects/func_8001E4C4.s") +void func_8001E4C4(void) { + Object *obj; + s32 lastObjCount; + s32 curObjCount; + s32 i; + s32 j; + LevelObjectEntry_Animation *entryAnimation; + + for (i = 0; i < gObjectCount; i++) { + gObjPtrList[i]->segment.trans.flags &= ~OBJ_FLAGS_UNK_2000; + } + for (i = 0; i < gObjectCount; i++) { + obj = gObjPtrList[i]; + if (obj != NULL && !(obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) && obj->behaviorId == BHV_ANIMATION) { + entryAnimation = &obj->segment.level_entry->animation; + if (entryAnimation->channel != gCutsceneID && entryAnimation->channel != 20) { + obj->segment.trans.flags |= OBJ_FLAGS_UNK_2000; + if (obj->unk64 != NULL) { + obj->unk64->animation2.flags |= OBJ_FLAGS_UNK_2000; + } + } + } + } + curObjCount = gObjectCount - 1; + lastObjCount = curObjCount; + for (i = 0; curObjCount >= i;) { + for (j = 0; lastObjCount >= i && (j == 0);) { + if (gObjPtrList[i]->segment.trans.flags & OBJ_FLAGS_UNK_2000) { + i++; + } else { + j = -1; + } + } + for (j = 0; curObjCount >= 0 && j == 0;) { + if (gObjPtrList[curObjCount]->segment.trans.flags & OBJ_FLAGS_UNK_2000) { + j = -1; + } else { + curObjCount--; + } + } + if (i < curObjCount) { + obj = gObjPtrList[i]; + gObjPtrList[i] = gObjPtrList[curObjCount]; + gObjPtrList[curObjCount] = obj; + i++; + curObjCount--; + } + } + gObjectListStart = i; + D_8011AE7C = 0; +} void func_8001E6EC(s8 arg0) { LevelObjectEntry_OverridePos *overridePosEntry; @@ -5624,12 +5728,12 @@ void func_8001E6EC(s8 arg0) { s32 i; s32 j; s32 someBool; - Object_64 *unk64; + Object_Animation *animation; for (i = 0; i < D_8011AE00; i++) { overridePosObj = D_8011ADD8[i]; overridePosEntry = &overridePosObj->segment.level_entry->overridePos; - overridePos = (Object_OverridePos *) overridePosObj->unk64; + overridePos = &overridePosObj->unk64->override_pos; if ((overridePosEntry->cutsceneId == gCutsceneID) || ((overridePosEntry->cutsceneId == 20))) { for (j = 0; (j < D_8011AE78) && (overridePosEntry->behaviorId != D_8011AE74[j]->properties.animatedObj.behaviourID); @@ -5637,14 +5741,14 @@ void func_8001E6EC(s8 arg0) { if (j != D_8011AE78 && D_8011AE74[j]->unk64 != NULL) { someBool = (D_8011AE74[j]->unk64->animation.unk5C) ? FALSE : TRUE; if (arg0 != someBool) { - unk64 = D_8011AE74[j]->unk64; - overridePos->x = unk64->animation.x; - overridePos->y = unk64->animation.y; - overridePos->z = unk64->animation.z; - overridePos->anim = &unk64->animation; - unk64->animation.x = overridePosObj->segment.trans.x_position; - unk64->animation.y = overridePosObj->segment.trans.y_position; - unk64->animation.z = overridePosObj->segment.trans.z_position; + animation = &D_8011AE74[j]->unk64->animation; + overridePos->x = animation->x; + overridePos->y = animation->y; + overridePos->z = animation->z; + overridePos->anim = animation; + animation->x = overridePosObj->segment.trans.x_position; + animation->y = overridePosObj->segment.trans.y_position; + animation->z = overridePosObj->segment.trans.z_position; } } else { overridePos->anim = NULL; @@ -5657,7 +5761,7 @@ void func_8001E6EC(s8 arg0) { void func_8001E89C(void) { s32 i; Object *obj; - Object_64 *obj64; + Object_8001E89C_64 *obj64; // some flag, flips to 1 when loading a new zone if (D_8011AE01 != 0) { @@ -5668,12 +5772,12 @@ void func_8001E89C(void) { // loading (boss) cutscene for (i = 0; i < D_8011AE00; i++) { obj = D_8011ADD8[i]; - obj64 = obj->unk64; + obj64 = &obj->unk64->obj8001E89C_64; - if (obj64->obj8001E89C_64.unkC != NULL) { - obj64->obj8001E89C_64.unkC->unkC = obj64->obj8001E89C_64.unk0; - obj64->obj8001E89C_64.unkC->unk10 = obj64->obj8001E89C_64.unk4; - obj64->obj8001E89C_64.unkC->unk14 = obj64->obj8001E89C_64.unk8; + if (obj64->unkC != NULL) { + obj64->unkC->unkC = obj64->unk0; + obj64->unkC->unk10 = obj64->unk4; + obj64->unkC->unk14 = obj64->unk8; } } } @@ -5952,7 +6056,7 @@ s8 func_800214E4(Object *obj, s32 updateRate) { s32 i; Object_AnimatedObject *animObj; - animObj = (Object_AnimatedObject *) obj->unk64; + animObj = &obj->unk64->animatedObject; if (animObj->unk3A != 0) { obj->segment.trans.flags |= OBJ_FLAGS_INVISIBLE; } diff --git a/src/objects.h b/src/objects.h index 752928d7..5c3eb580 100644 --- a/src/objects.h +++ b/src/objects.h @@ -322,13 +322,16 @@ typedef struct unk800149C0 { // Size: 0x80 bytes. typedef struct Asset20 { f32 unk0; - s32 pad4[27]; + u8 pad4[0x68]; + s16 unk6C; + s16 unk6E; u8 unk70; u8 unk71; u8 unk72; s8 unk73; f32 unk74; - u8 pad78[0x8]; + Sprite *unk78; + TextureHeader *unk7C; } Asset20; #define CIC_ID 6103 @@ -497,6 +500,8 @@ void mode_init_taj_race(void); void func_8000BADC(s32 updateRate); f32 func_8002277C(f32 *data, s32 index, f32 x); void race_transition_adventure(s32 updateRate); +void func_8001E4C4(void); +void func_8000B020(s32 numberOfVertices, s32 numberOfTriangles); //Non Matching void calc_dynamic_lighting_for_object_1(Object *, ObjectModel *, s16, Object *, f32, f32); @@ -515,7 +520,6 @@ void func_80012F94(Object *); void func_800101AC(Object *, s32); void func_800135B8(Object *); void func_8000CC7C(Vehicle, u32, s32); -void func_8000B020(s32, s32); void func_80017E98(void); void spectate_update(void); void func_8001E93C(void); diff --git a/src/save_data.c b/src/save_data.c index e0068019..6b8affa5 100644 --- a/src/save_data.c +++ b/src/save_data.c @@ -25,23 +25,6 @@ s32 gRumbleKillTimer = 0; /*******************************/ -/************ .rodata ************/ - -UNUSED const char D_800E7590[] = "Region = %d loc = %x size = %x\t"; -UNUSED const char D_800E75B4[] = "FREE"; -UNUSED const char D_800E75BC[] = "ALLOCATED"; -UNUSED const char D_800E75C8[] = "ALLOCATED,FIXED"; -UNUSED const char D_800E75D8[] = "\n"; -UNUSED const char D_800E75DC[] = "\n"; -UNUSED const char D_800E75E0[] = "Region number = %d\t"; -UNUSED const char D_800E75F4[] = "maxSlots = %d\t"; -UNUSED const char D_800E7604[] = "slotsUsed = %d\t"; -UNUSED const char D_800E7614[] = "loc = %x\t"; -UNUSED const char D_800E7620[] = "size = %x\n"; -UNUSED const char D_800E762C[] = "\n"; - -/*********************************/ - /************ .bss ************/ OSMesgQueue *sControllerMesgQueue; diff --git a/src/waves.c b/src/waves.c index f2f5b435..dda714cf 100644 --- a/src/waves.c +++ b/src/waves.c @@ -14,20 +14,15 @@ /************ .data ************/ f32 *D_800E3040 = NULL; -s32 *D_800E3044 = NULL; +s16 *D_800E3044 = NULL; s32 *D_800E3048 = NULL; -s32 *D_800E304C = NULL; - -// Could be an array of pointers? -s32 D_800E3050[8] = { - 0, 0, 0, 0, 0, 0, 0, 0, -}; +f32 *D_800E304C[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; Vertex *D_800E3070[2] = { NULL, NULL }; s32 *D_800E3078[2] = { NULL, NULL }; // This could also be D_800E3080[2] + D_800E3088[2] -s32 *D_800E3080[4] = { NULL, NULL, NULL, NULL }; +u8 *D_800E3080[4] = { NULL, NULL, NULL, NULL }; /* Size: 0x10, might just be an array? */ typedef struct unk800E3090 { @@ -85,7 +80,8 @@ s32 D_80129FC4; unk80129FC8 D_80129FC8; s32 D_8012A018; f32 D_8012A01C; -f32 D_8012A020[2]; +f32 D_8012A020; +UNUSED s32 D_8012A024; unk8012A028 *D_8012A028[20]; s32 D_8012A078; TriangleBatchInfo *gWaveBatch; @@ -146,7 +142,7 @@ void free_waves(void) { FREE_MEM(D_800E3040); FREE_MEM(D_800E3044); FREE_MEM(D_800E3048); - FREE_MEM(D_800E304C); + FREE_MEM(D_800E304C[0]); FREE_MEM(D_800E3070[0]); FREE_MEM(D_800E3080[0]); FREE_TEX(D_800E30D0); @@ -159,69 +155,44 @@ void free_waves(void) { D_800E3188 = NULL; } -#ifdef NON_EQUIVALENT -// wave_init -void func_800B7EB4(void) { - s32 *var_v1; - s32 temp_lo; - s32 temp_t7; - s32 temp_t9; - s32 temp_v1; - s32 var_a1; - s32 var_a2; - s32 var_a3; - s32 var_t0; - s32 var_t1; +void wave_init(void) { + s32 temp; + s32 allocSize; + s32 i; free_waves(); - D_800E3040 = (s32 *) allocate_from_main_pool_safe(D_80129FC8.unk20 << 2, COLOUR_TAG_CYAN); + D_800E3040 = (f32 *) allocate_from_main_pool_safe(D_80129FC8.unk20 << 2, COLOUR_TAG_CYAN); D_800E3044 = (s32 *) allocate_from_main_pool_safe((D_80129FC8.unk4 << 2) * D_80129FC8.unk4, COLOUR_TAG_CYAN); D_800E3048 = (s32 *) allocate_from_main_pool_safe(((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1), COLOUR_TAG_CYAN); - temp_lo = ((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1); - D_800E304C = allocate_from_main_pool_safe(temp_lo * 9, COLOUR_TAG_CYAN); - - // for (var_a1 = 1; var_a1 < 4; var_a1++) { - // D_800E3050[var_a1] = (s32 *) ((u32) D_800E304C + (temp_lo * var_a1)); - // } - - var_v1 = D_800E3050; - var_a1 = 1; - do { - var_v1[0] = (s32 *) (D_800E304C + temp_lo); - var_v1[1] = (s32 *) (D_800E304C + (temp_lo * 2)); - var_v1[2] = (s32 *) (D_800E304C + (temp_lo * 3)); - var_v1[3] = (s32 *) (D_800E304C + (temp_lo * 4)); - var_v1 += 4; - var_a1 += 4; - } while (var_a1 < 9); - - // temp_lo = (D_80129FC8.unk0 + 1) * 250 * (D_80129FC8.unk0 + 1); - temp_lo = ((((D_80129FC8.unk0 + 1) << 5) - D_80129FC8.unk0) * 10) * (D_80129FC8.unk0 + 1); - if (D_8012A078 != 2) { - D_800E3070[0] = (s32 *) allocate_from_main_pool_safe(temp_lo << 1, COLOUR_TAG_CYAN); - D_800E3070[1] = (s32 *) ((u32) D_800E3070[0] + temp_lo); - } else { - D_800E3070[0] = (s32 *) allocate_from_main_pool_safe(temp_lo << 2, COLOUR_TAG_CYAN); - D_800E3070[1] = (s32 *) ((u32) D_800E3070[0] + temp_lo); - D_800E3070[2] = (s32 *) ((u32) D_800E3070[1] + temp_lo); - D_800E3070[3] = (s32 *) ((u32) D_800E3070[2] + temp_lo); + allocSize = ((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1); + D_800E304C[0] = allocate_from_main_pool_safe(allocSize * ARRAY_COUNT(D_800E304C), COLOUR_TAG_CYAN); + for (i = 1; i < ARRAY_COUNT(D_800E304C); i++) { + D_800E304C[i] = (f32 *) (((u32) D_800E304C[0]) + (allocSize * i)); } - temp_lo = (D_80129FC8.unk0 << 5) * D_80129FC8.unk0; + temp = (D_80129FC8.unk0 + 1); + allocSize = (temp * 250 * (D_80129FC8.unk0 + 1)); if (D_8012A078 != 2) { - D_800E3080[0] = allocate_from_main_pool_safe(temp_lo << 1, COLOUR_TAG_CYAN); - D_800E3080[1] = (s32 *) ((u32) D_800E3080[0] + temp_lo); + D_800E3070[0] = (Vertex *) allocate_from_main_pool_safe(allocSize << 1, COLOUR_TAG_CYAN); + D_800E3070[1] = (Vertex *) (((u32) D_800E3070[0]) + allocSize); } else { - D_800E3080[0] = (s32 *) allocate_from_main_pool_safe(temp_lo << 2, COLOUR_TAG_CYAN); - D_800E3080[1] = (s32 *) ((u32) D_800E3080[0] + temp_lo); - D_800E3080[2] = (s32 *) ((u32) D_800E3080[1] + temp_lo); - D_800E3080[3] = (s32 *) ((u32) D_800E3080[2] + temp_lo); + D_800E3070[0] = (Vertex *) allocate_from_main_pool_safe(allocSize << 2, COLOUR_TAG_CYAN); + D_800E3070[1] = (Vertex *) (((u32) D_800E3070[0]) + allocSize); + D_800E3070[2] = (Vertex *) (((u32) D_800E3070[1]) + allocSize); + D_800E3070[3] = (Vertex *) (((u32) D_800E3070[2]) + allocSize); + } + allocSize = (D_80129FC8.unk0 * 32) * D_80129FC8.unk0; + if (D_8012A078 != 2) { + D_800E3080[0] = allocate_from_main_pool_safe(allocSize << 1, COLOUR_TAG_CYAN); + D_800E3080[1] = (s32 *) (((u32) D_800E3080[0]) + allocSize); + } else { + D_800E3080[0] = (s32 *) allocate_from_main_pool_safe(allocSize << 2, COLOUR_TAG_CYAN); + D_800E3080[1] = (s32 *) (((u32) D_800E3080[0]) + allocSize); + D_800E3080[2] = (s32 *) (((u32) D_800E3080[1]) + allocSize); + D_800E3080[3] = (s32 *) (((u32) D_800E3080[2]) + allocSize); } D_800E30D0 = load_texture(D_80129FC8.unk2C); } -#else -GLOBAL_ASM("asm/non_matchings/waves/func_800B7EB4.s") -#endif void func_800B8134(LevelHeader *header) { if (D_8012A078 != 2) { @@ -254,7 +225,181 @@ void func_800B8134(LevelHeader *header) { D_80129FC8.unk4C = header->unk70_u8; } +#ifdef NON_EQUIVALENT +void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { + s32 sp54; + s32 sp4C; + s32 temp_lo; + s32 var_a0; + s32 var_a0_2; + s32 var_a2; + s32 var_fp; + s32 var_s0; + s32 var_s0_3; + s32 var_s3; + s32 var_s5; + s32 var_s6; + s32 var_s7; + s8 var_s0_4; + s32 i; + s32 j; + + D_8012A078 = arg2; + func_800B8134(arg1); + wave_init(); + func_800BBDDC(arg0, arg1); + D_8012A0A0 = (f32) gWaveBoundingBoxDiffX; + D_8012A0A4 = (f32) gWaveBoundingBoxDiffZ; + D_8012A0B8 = D_8012A0A0 / D_80129FC8.unk0; + D_8012A0BC = D_8012A0A4 / D_80129FC8.unk0; + D_8012A084 = 0; + D_8012A088 = 0; + D_8012A08C = ((gWaveTexture->width * D_80129FC8.unk30) * 32) / D_80129FC8.unk0; + D_8012A090 = ((gWaveTexture->height * D_80129FC8.unk34) * 32) / D_80129FC8.unk0; + D_8012A094 = (gWaveTexture->width * 32) - 1; + D_8012A098 = (gWaveTexture->height * 32) - 1; + D_8012A09C = 0; + var_s6 = D_80129FC8.unk10; + var_fp = D_80129FC8.unk1C; + sp54 = (D_80129FC8.unk8 << 16) / D_80129FC8.unk20; + sp4C = (D_80129FC8.unk14 << 16) / D_80129FC8.unk20; + D_8012A01C = 10000.0f; + D_8012A020 = -10000.0f; + var_s7 = 0; + for (var_s0 = 0; var_s0 < D_80129FC8.unk20; var_s0++) { + D_800E3040[var_s0] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); + if (D_80129FC8.unk28 != 0) { + D_800E3040[var_s0] *= 2.0f; + } + if (D_800E3040[var_s0] < D_8012A01C) { + D_8012A01C = D_800E3040[var_s0]; + } + if (D_8012A020 < D_800E3040[var_s0]) { + D_8012A020 = D_800E3040[var_s0]; + } + var_s6 += sp54; + var_fp += sp4C; + } + save_rng_seed(); + set_rng_seed(0x57415646); + var_s5 = 0; + for (; var_s7 < D_80129FC8.unk4; var_s7++) { + for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { + D_800E3044[(var_s5 * 2)] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + D_800E3044[(var_s5 * 2) + 1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + var_s5++; + } + } + load_rng_seed(); + if (arg2 != 2) { + var_s3 = 2; + } else { + var_s3 = 4; + } + var_a2 = 0; + var_s5 = 0; + do { + for (var_s7 = 0; (D_80129FC8.unk0 >= var_s7); var_s7++) { + for (var_s0_3 = 0; D_80129FC8.unk0 >= var_s0_3; var_s0_3++) { + for (var_a0 = 0; var_a0 < var_s3; var_a0++) { + D_800E3070[var_a0][var_s5].x = (var_s0_3 * D_8012A0B8) + 0.5; + D_800E3070[var_a0][var_s5].z = (var_s7 * D_8012A0BC) + 0.5; + if (D_80129FC8.unk4C == 0) { + D_800E3070[var_a0][var_s5].r = 255; + D_800E3070[var_a0][var_s5].g = 255; + D_800E3070[var_a0][var_s5].b = 255; + } else { + D_800E3070[var_a0][var_s5].r = 0; + D_800E3070[var_a0][var_s5].g = 0; + D_800E3070[var_a0][var_s5].b = 0; + } + D_800E3070[var_a0][var_s5].a = 255; + } + var_s5++; + } + } + var_a2++; + } while (var_a2 < 25); + + var_s5 = 0; + for (var_s7 = 0; var_s7 < D_80129FC8.unk0; var_s7++) { + for (var_s0_4 = 0; var_s0_4 < D_80129FC8.unk0; var_s0_4++) { + for (var_a0_2 = 0; var_a0_2 < var_s3; var_a0_2++) { + D_800E3080[var_s5 * 16][var_a0_2] = 0x40; + } + var_s5 += 2; + } + } + func_800BC6C8(); + temp_lo = D_80129FC8.unk0 * (D_80129FC8.unk0 + 1); + // var_a3 = D_800E3070; + // var_a0_3 = D_8012A028; + // do { + // temp_a1_2 = *var_a3; + // var_a3 += 4; + // // var_a0_3->unk2 = 0; + // // var_a0_3->unk0 = (s16) temp_a1_2->x; + // // temp_v0_4 = &temp_a1_2[D_80129FC8.unk0]; + // // var_a0_3->unk4 = (s16) temp_a1_2->z; + // // temp_a2 = &temp_a1_2[temp_lo]; + // // var_a0_3->unk6 = (u8) temp_a1_2->r; + // // var_a0_3 += 0x28; + // // var_a0_3->unk-21 = (u8) temp_a1_2->g; + // // var_a0_3->unk-20 = (u8) temp_a1_2->b; + // // var_a0_3->unk-1F = (u8) temp_a1_2->a; + // // var_a0_3->unk-1C = 0; + // // var_a0_3->unk-1E = (s16) temp_v0_4->x; + // // var_a0_3->unk-1A = (s16) temp_v0_4->z; + // // var_a0_3->unk-18 = (u8) temp_v0_4->r; + // // var_a0_3->unk-17 = (u8) temp_v0_4->g; + // // var_a0_3->unk-16 = (u8) temp_v0_4->b; + // // var_a0_3->unk-15 = (u8) temp_v0_4->a; + // // var_a0_3->unk-12 = 0; + // // var_a0_3->unk-14 = (s16) temp_a2->x; + // // var_a0_3->unk-10 = (s16) temp_a2->z; + // // var_a0_3->unk-E = (u8) temp_a2->r; + // // var_a0_3->unk-D = (u8) temp_a2->g; + // // temp_v0_5 = &(&temp_a1_2[temp_lo])[D_80129FC8.unk0]; + // // var_a0_3->unk-C = (u8) temp_a2->b; + // // var_a0_3->unk-B = (u8) temp_a2->a; + // // var_a0_3->unk-8 = 0; + // // var_a0_3->unk-A = (s16) temp_v0_5->x; + // // var_a0_3->unk-6 = (s16) temp_v0_5->z; + // // var_a0_3->unk-4 = (u8) temp_v0_5->r; + // // var_a0_3->unk-3 = (u8) temp_v0_5->g; + // // var_a0_3->unk-2 = (u8) temp_v0_5->b; + // // var_a0_3->unk-1 = (u8) temp_v0_5->a; + // } while ((u32)var_a3 != (u32)D_800E3078); + + for (i = 0; i < ARRAY_COUNT(D_8012A028); i++) { + for (j = 0; j < ARRAY_COUNT(D_800E3070); j++) { + D_8012A028[i]->vert[temp_lo].x = D_800E3070[temp_lo + i][j].x; + D_8012A028[i]->vert[temp_lo].y = 0; + D_8012A028[i]->vert[temp_lo].z = D_800E3070[temp_lo + i][j].z; + D_8012A028[i]->vert[temp_lo].r = D_800E3070[temp_lo + i][j].r; + D_8012A028[i]->vert[temp_lo].g = D_800E3070[temp_lo + i][j].g; + D_8012A028[i]->vert[temp_lo].b = D_800E3070[temp_lo + i][j].b; + D_8012A028[i]->vert[temp_lo].a = D_800E3070[temp_lo + i][j].a; + } + } + + func_800BCC70(arg0); + if (D_80129FC8.unk24 == 3) { + D_800E30E0 = D_800E30E8; + D_800E30E4 = D_800E30FC; + } else { + D_80129FC8.unk24 = 5; + D_800E30E0 = D_800E3110; + D_800E30E4 = D_800E3144; + } + D_800E3188 = 0; + gWavePowerDivisor = 0; + gWaveGeneratorObj = NULL; + D_8012A018 = 0; +} +#else GLOBAL_ASM("asm/non_matchings/waves/func_800B82B4.s") +#endif void func_800B8B8C(void) { s32 temp_v0; diff --git a/src/waves.h b/src/waves.h index da223714..73dc872e 100644 --- a/src/waves.h +++ b/src/waves.h @@ -127,6 +127,7 @@ f32 log_wave_height(Object_Log *log, s32 updateRate); void func_800BA288(s32 arg0, s32 arg1); void func_800BF9F8(unk800BF9F8 *arg0, f32 arg1, f32 arg2); unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, f32 arg5, f32 arg6, f32 arg7, s32 arg8); +void wave_init(void); Object_64 *func_800BE654(s16, f32, f32); // Non Matching void func_800BBF78(LevelModel *arg0); // Non Matching @@ -136,6 +137,5 @@ void func_800BF524(Object *); f32 func_800BEFC4(s32, s32, s32); void func_800BC6C8(void); void func_800BCC70(LevelModel *arg0); -void func_800B7EB4(void); #endif diff --git a/src/weather.c b/src/weather.c index e713750e..cc1938d6 100644 --- a/src/weather.c +++ b/src/weather.c @@ -19,16 +19,14 @@ /************ .data ************/ SnowGfxData gWeatherPresets[3] = { - { 0, 0x40, (TextureHeader *) 0, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, - 8 }, // Snow - { 0, 0x100, (TextureHeader *) 1, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, - 8 }, // Rain - { 0, 0x08, (TextureHeader *) 2, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, - 8 }, // Unused, game crashes with this. + { 0, 0x40, { WEATHER_SNOW }, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, 8 }, + { 0, 0x100, { WEATHER_RAIN }, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, 8 }, + // Unused, game crashes with this. + { 0, 0x08, { WEATHER_UNK }, 0xFE000000, 0xFE000000, 0xFE000000, 0x03FFFFFF, 0x03FFFFFF, 0x03FFFFFF, 4, 4, 8, 8 }, }; SnowPosData *gSnowPhysics = NULL; -SnowGfxData gSnowGfx = { NULL, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +SnowGfxData gSnowGfx = { NULL, 0, { NULL }, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; Vertex *gSnowVerts = NULL; s32 gSnowVertCount = 0; @@ -264,7 +262,7 @@ void weather_reset(s32 weatherType, s32 density, s32 velX, s32 velY, s32 velZ, s if (weatherType > WEATHER_RAIN) { weatherType = WEATHER_RAIN; } - if (gWeatherPresets[weatherType].texture == ((TextureHeader *) 1)) { + if (gWeatherPresets[weatherType].type == WEATHER_RAIN) { rain_init(intensity + 1, opacity + 1); return; } @@ -282,7 +280,7 @@ void weather_reset(s32 weatherType, s32 density, s32 velX, s32 velY, s32 velZ, s gSnowGfx.vertOffsetH = gWeatherPresets[weatherType].vertOffsetH; gSnowGfx.vertWidth = gSnowGfx.vertOffsetW * 2; gSnowGfx.vertHeight = gSnowGfx.vertOffsetH * 2; - if (gWeatherPresets[weatherType].texture == NULL) { + if (gWeatherPresets[weatherType].type == WEATHER_SNOW) { snow_init(); } numOfElements = density; @@ -638,7 +636,7 @@ void lensflare_init(Object *obj) { /** * Based on face direction, start rendering lens flare effects on screen. * Each element is shifted based on the preset to create the effect of the sun shining in your face. -*/ + */ void lensflare_render(Gfx **dList, MatrixS **mats, Vertex **verts, ObjectSegment *segment) { u16 height; f32 mag2; @@ -913,7 +911,7 @@ void rain_update(s32 updateRate) { * If it's raining hard enough, then start generating rain splash particles. * Set position to be a random spot near the camera and account for wave height. * Every existing splash particle gets rendered as a billboard. -*/ + */ void rain_render_splashes(s32 updateRate) { s32 temp_t0; s32 i; diff --git a/src/weather.h b/src/weather.h index 2bac675f..83e7a8da 100644 --- a/src/weather.h +++ b/src/weather.h @@ -7,14 +7,18 @@ typedef enum WeatherType { WEATHER_SNOW, - WEATHER_RAIN + WEATHER_RAIN, + WEATHER_UNK } WeatherType; /* Size: 0x2C Bytes */ typedef struct SnowGfxData { Vec3i *pos; s32 size; - TextureHeader *texture; + union { + WeatherType type; + TextureHeader *texture; + }; s32 offsetX; s32 offsetY; s32 offsetZ; diff --git a/tools/ido-static-recomp b/tools/ido-static-recomp index 461f6b5f..d6dd7fde 160000 --- a/tools/ido-static-recomp +++ b/tools/ido-static-recomp @@ -1 +1 @@ -Subproject commit 461f6b5f14606655bc0abd1c92f2508f60b1417c +Subproject commit d6dd7fdea26cfe89dd01d7545618d4a9ae4f690a