diff --git a/README.md b/README.md index ab54c68b..6b0997fc 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd As of May 1, 2025, this is our current score: -    Decomp progress: 81.98% +    Decomp progress: 82.09%     Documentation progress: 53.79% @@ -121,9 +121,9 @@ As of May 1, 2025, this is our current score: ``` ===================================================================== ADVENTURE ONE (ASM -> C Decompilation) - --------------- 81.98% Complete (84.79% NON_MATCHING) --------------- - # Decompiled functions: 1867 - # GLOBAL_ASM remaining: 84 + --------------- 82.09% Complete (84.90% NON_MATCHING) --------------- + # Decompiled functions: 1868 + # GLOBAL_ASM remaining: 83 # NON_MATCHING functions: 13 # NON_EQUIVALENT WIP functions: 27 ---------------------------- Game Status ---------------------------- diff --git a/src/tracks.c b/src/tracks.c index dc8e1d95..f847e243 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -106,10 +106,10 @@ unk8011B330 D_8011B330[120]; // Struct sizeof(0x20) / sizeof(32) s32 D_8011C230; s32 D_8011C234; unk8011C238 D_8011C238[32]; // Struct sizeof(0xC) / sizeof(12) -s32 D_8011C3B8[320]; -s32 D_8011C8B8[512]; +unk8011C3B8 D_8011C3B8[64]; +unk8011C8B8 D_8011C8B8[128]; s32 D_8011D0B8; -Vec4f *D_8011D0BC; +unk8011C8B8 *D_8011D0BC; TextureHeader *gNewShadowTexture; Object *gNewShadowObj; f32 D_8011D0C8; @@ -3547,7 +3547,94 @@ void shadow_generate(Object *obj, s32 isWater) { } #pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_8002E904.s") -#pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_8002EEEC.s") + +void func_8002EEEC(s32 arg0) { + unk8011C8B8 spA8[8]; + f32 sp88[8]; + s32 var_v0; + s32 var_a0; + s32 var_a1; + s32 temp_v0; + s32 temp_v0_3; + s32 var_s4; + s32 var_t1; + s32 var_v1; + s32 tempIdx; + + sp88[0] = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; + sp88[1] = gNewShadowObj->segment.trans.z_position + gNewShadowLength; + sp88[2] = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; + sp88[3] = gNewShadowObj->segment.trans.z_position + gNewShadowLength; + sp88[4] = gNewShadowObj->segment.trans.x_position - gNewShadowWidth; + sp88[5] = gNewShadowObj->segment.trans.z_position - gNewShadowLength; + sp88[6] = gNewShadowObj->segment.trans.x_position + gNewShadowWidth; + sp88[7] = gNewShadowObj->segment.trans.z_position - gNewShadowLength; + temp_v0 = func_800BDC80(arg0, D_8011C3B8, &D_8011C8B8[D_8011D0B8], sp88[4], sp88[5], sp88[0], sp88[1]); + + for (var_s4 = 0; var_s4 < temp_v0; var_s4++) { + var_a0 = D_8011C3B8[var_s4].unk2; + var_a1 = D_8011C3B8[var_s4].unk2; + if (D_8011C3B8[var_s4].unk8 < var_a1) { + var_a0 = D_8011C3B8[var_s4].unk8; + } else if (var_a1 < D_8011C3B8[var_s4].unk8) { + var_a1 = D_8011C3B8[var_s4].unk8; + } + if (D_8011C3B8[var_s4].unkE < var_a0) { + var_a0 = D_8011C3B8[var_s4].unkE; + } else if (var_a1 < D_8011C3B8[var_s4].unkE) { + var_a1 = D_8011C3B8[var_s4].unkE; + } + if (gNewShadowY2 >= var_a0) { + if (var_a1 >= gNewShadowY1) { + spA8[0].unk0 = D_8011C3B8[var_s4].unk0; + spA8[0].unk8 = D_8011C3B8[var_s4].unk4; + spA8[1].unk0 = D_8011C3B8[var_s4].unk6; + spA8[1].unk8 = D_8011C3B8[var_s4].unkA; + spA8[2].unk0 = D_8011C3B8[var_s4].unkC; + spA8[2].unk8 = D_8011C3B8[var_s4].unk10; + + for (var_v0 = 0; var_v0 != 3; var_v0++) { + spA8[var_v0].unkE = -1; + } + + D_8011D0BC = &D_8011C8B8[D_8011D0B8 + var_s4]; + temp_v0_3 = func_8002FF6C(3, spA8, 4, sp88); + if (temp_v0_3 >= 3) { + tempIdx = D_8011C230; + D_8011C238[tempIdx].unk1 = 0; + for (var_t1 = 0; var_t1 < temp_v0_3; var_t1++) { + if (spA8[var_t1].unkE < 0) { + var_a1 = -1; + var_v1 = 0; + while (var_v1 < D_8011B118 && var_a1 == -1) { + if ((D_8011B120[var_v1].x == spA8[var_t1].unk0) && + (D_8011B120[var_v1].z == spA8[var_t1].unk8)) { + var_a1 = var_v1; + } + var_v1++; + } + if (var_a1 == -1) { + D_8011B120[D_8011B118].x = spA8[var_t1].unk0; + D_8011B120[D_8011B118].unkC = (unk8011B120_unkC *) D_8011D0BC; + D_8011B120[D_8011B118].z = spA8[var_t1].unk8; + D_8011C238[tempIdx].unk2[var_t1] = D_8011B118++; + } else { + D_8011C238[tempIdx].unk2[var_t1] = var_a1; + } + } else { + D_8011C238[tempIdx].unk2[var_t1] = spA8[var_t1].unkE; + D_8011C238[tempIdx].unk1 |= 1 << var_t1; + } + } + D_8011C230 = tempIdx + 1; + D_8011C238[tempIdx].unk0 = temp_v0_3; + } + } + } + } + + D_8011D0B8 += temp_v0; +} #ifdef NON_EQUIVALENT void func_8002F2AC(void) { diff --git a/src/tracks.h b/src/tracks.h index 41f618f5..98ac0a24 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -103,6 +103,30 @@ typedef struct unk8011D478 { s8 unk7; } unk8011D478; + +/* Size: 0x10 bytes */ +typedef struct unk8011C8B8 { + f32 unk0; + f32 unk4; + f32 unk8; + s16 unkC; + s16 unkE; +} unk8011C8B8; + +/* Size: 0x14 bytes */ +typedef struct unk8011C3B8 { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; + s16 unk8; + s16 unkA; + s16 unkC; + s16 unkE; + s16 unk10; + s16 unk12; +} unk8011C3B8; + // In this struct, data is rightshifted 16 bytes, so make the smooth transition more precise. typedef struct EnvironmentFog { s32 r; @@ -212,5 +236,7 @@ void func_80025510(s32); void func_8002C0C4(s32 modelId); void func_800304C8(Vec4f *arg0); s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3); +s32 func_8002FF6C(s32, unk8011C8B8 *, s32, f32 *); +s32 func_800BDC80(s32, unk8011C3B8 *, unk8011C8B8 *, f32, f32, f32, f32); #endif diff --git a/src/waves.c b/src/waves.c index b2f8a00a..6d05256a 100644 --- a/src/waves.c +++ b/src/waves.c @@ -1776,31 +1776,7 @@ void func_800BCC70(LevelModel *arg0) { } #ifdef NON_EQUIVALENT -typedef struct unkArg1 { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; - s16 unkC; - s16 unkE; - s16 unk10; - s16 unk12; -} unkArg1; - -typedef struct unkArg2 { - f32 unk0; - f32 unk4; - f32 unk8; - f32 unkC; -} unkArg2; - -// arg0 -// arg1 is s32 D_8011C3B8[320]; according to func_8002EEEC -// arg2 might be s32 D_8011C8B8[512] - -s32 func_800BDC80(s32 arg0, unkArg1 *arg1, unkArg2 *arg2, f32 shadowXNegPosition, f32 shadowZNegPosition, +s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNegPosition, f32 shadowZNegPosition, f32 shadowXPosition, f32 shadowZPosition) { s32 sp36C; s32 sp368; @@ -1840,9 +1816,9 @@ s32 func_800BDC80(s32 arg0, unkArg1 *arg1, unkArg2 *arg2, f32 shadowXNegPosition f32 spC8; s32 var_v0; s32 spA4; - unkArg2 *var_v0_4; + unk8011C8B8 *var_v0_4; s32 sp98; - unkArg1 *var_s0_2; + unk8011C3B8 *var_s0_2; s32 sp90; s32 temp3_2; s32 temp4_2;