From 59eda67fbe3ed15b982985c58e398a6e584ce9df Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Sat, 26 Apr 2025 02:55:03 +0200 Subject: [PATCH] match: func_800B8C04 (#529) --- README.md | 14 +- src/waves.c | 226 ++++++++++++--------------- src/waves.h | 8 + ver/symbols/symbol_addrs.jpn.v79.txt | 3 - ver/symbols/symbol_addrs.pal.v77.txt | 3 - ver/symbols/symbol_addrs.pal.v80.txt | 3 - ver/symbols/symbol_addrs.us.v77.txt | 3 - ver/symbols/symbol_addrs.us.v80.txt | 3 - 8 files changed, 118 insertions(+), 145 deletions(-) diff --git a/README.md b/README.md index e9cb68d9..cfd470fd 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of April 24, 2025, this is our current score: +As of April 26, 2025, this is our current score: -    Decomp progress: 80.40% +    Decomp progress: 80.58%     Documentation progress: 53.79% @@ -117,15 +117,15 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 24, 2025, this is our current score: +As of April 26, 2025, this is our current score: ``` ======================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------- 80.40% Complete (82.97% NON_MATCHING) --------- - # Decompiled functions: 1859 - # GLOBAL_ASM remaining: 92 + -------- 80.58% Complete (83.15% NON_MATCHING) --------- + # Decompiled functions: 1860 + # GLOBAL_ASM remaining: 91 # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 31 + # NON_EQUIVALENT WIP functions: 30 --------------------- Game Status ---------------------- Balloons: 39/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 diff --git a/src/waves.c b/src/waves.c index 80e9adae..ec3bf192 100644 --- a/src/waves.c +++ b/src/waves.c @@ -101,22 +101,8 @@ s32 D_8012A0DC; // used in mempool_alloc_safe size calculation s32 gNumberOfLevelSegments; s32 D_8012A0E8[64]; s16 D_8012A1E8[512]; // used to index D_800E30D8 and as arg0 for func_800B92F4 and func_800B97A8 - -typedef struct unk8012A5E8 { - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - s32 unk8; -} unk8012A5E8; - -// This could be (and probably is) just a pointer -unk8012A5E8 D_8012A5E8[1]; -// might be the same as D_8012A5E8 -s16 D_8012A5F4; -UNUSED s32 D_8012A5F8; -UNUSED s32 D_8012A5FC; -s16 D_8012A600[144]; +unk8012A5E8 D_8012A5E8[2]; +unk8012A5E8 D_8012A600[24]; f32 gWavePowerBase; f32 gWaveMagnitude; s32 gWavePowerDivisor; @@ -403,46 +389,46 @@ void func_800B8B8C(void) { } } -#ifdef NON_EQUIVALENT void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewport, s32 updateRate) { - s32 i; - s32 j; - s32 k; - s32 var_t4; - s32 tempXPosRatio; - u32 var_t2; - s32 var_v1; s32 xPosRatio; s32 zPosRatio; - s32 var_a0; + s32 tempXPosRatio; + s32 var_v1; + s32 var_s5; + u32 var_t2; s32 var_t5; + s32 var_v0; s32 var_s4; - s32 var_t9; - unk8012A5E8 *temp; + s32 var_a3; + s32 var_s6; - // possible fake: xPosRatio = (xPosition - D_8012A0D0) / gWaveBoundingBoxDiffX; zPosRatio = (zPosition - D_8012A0D4) / gWaveBoundingBoxDiffZ; - D_8012A5E8[0].unk0 = -1; - D_8012A5F4 = -1; - // D_8012A600 seems to be unused - for (var_v1 = 0; var_v1 < 144; var_v1 += 24) { - D_8012A600[var_v1] = -1; - D_8012A600[var_v1 + 6] = -1; - D_8012A600[var_v1 + 12] = -1; - D_8012A600[var_v1 + 18] = -1; + if (0) {} + + for (var_v1 = 0; var_v1 != ARRAY_COUNT(D_8012A600); var_v1 += 4) { + D_8012A5E8[0].unk0 = -1; + D_8012A5E8[1].unk0 = -1; + D_8012A600[var_v1].unk0 = -1; + D_8012A600[var_v1 + 1].unk0 = -1; + D_8012A600[var_v1 + 2].unk0 = -1; + D_8012A600[var_v1 + 3].unk0 = -1; } - if (D_80129FC8.unk28 != FALSE) { - var_t5 = gWaveBoundingBoxDiffZ; - var_v1 = 0; - var_s4 = 0; - if ((gWaveBoundingBoxDiffX >> 1) < ((xPosition - (xPosRatio * gWaveBoundingBoxDiffX)) - D_8012A0D0)) { + if (D_80129FC8.unk28 != 0) { + xPosition -= (xPosRatio * gWaveBoundingBoxDiffX) + D_8012A0D0; + zPosition -= (zPosRatio * gWaveBoundingBoxDiffZ) + D_8012A0D4; + if ((gWaveBoundingBoxDiffX >> 1) < xPosition) { var_v1 = 8; + } else { + var_v1 = 0; } - if ((gWaveBoundingBoxDiffZ >> 1) < ((zPosition - (zPosRatio * gWaveBoundingBoxDiffZ)) - D_8012A0D4)) { + + if ((gWaveBoundingBoxDiffZ >> 1) < zPosition) { var_s4 = 16; + } else { + var_s4 = 0; } for (var_v1 -= (D_80129FC8.unk24 >> 1) * 8; var_v1 < 0; var_v1 += 16) { @@ -453,72 +439,12 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp zPosRatio -= 1; } - for (i = 0; i < D_80129FC8.unk24; i++) { - if (zPosRatio >= 0) { - if (zPosRatio < D_8012A0DC) { - var_t5 = var_v1; - tempXPosRatio = xPosRatio; - var_t2 = (zPosRatio * D_8012A0D8) + xPosRatio; - for (j = 0; j < D_80129FC8.unk24; j++) { - // clang-format off - if ( - (tempXPosRatio >= 0) && - (tempXPosRatio < D_8012A0D8) && - (D_8012A0E8[zPosRatio] & (1 << tempXPosRatio)) - ) { - // clang-format on - var_t4 = var_t5 + var_s4; - D_800E30D4[var_t2] |= D_800E30E0[i * D_80129FC8.unk24 + j] << var_t4; - for (k = 0; k < gNumberOfLevelSegments; k++) { - if (var_t2 == (&D_800E30D8[k])->unkC) { - temp = &D_8012A5E8[k]; - temp->unk0 = k; - temp->unk2 = var_t4 >> 3; - temp->unk8 = k * D_800E317C; - temp->unk4 = (&D_800E30D8[k])->unk12; - if (var_t5 != 0) { - temp->unk8 = k * D_800E317C + D_80129FC8.unk0; - temp->unk4 += D_80129FC8.unk0; - while (temp->unk4 >= D_80129FC8.unk4) { - temp->unk4 -= D_80129FC8.unk4; - } - } - temp->unk6 = (&D_800E30D8[k])->unk10; - if (var_s4 != 0) { - temp->unk8 += ((D_80129FC8.unk0 * 2) + 1) * D_80129FC8.unk0; - temp->unk6 += D_80129FC8.unk0; - while (temp->unk6 >= D_80129FC8.unk4) { - temp->unk6 -= D_80129FC8.unk4; - } - } - k = 0x7FFF; - } - } - } - var_t5 += 8; - if (var_t5 > 8) { - var_t5 -= 16; - tempXPosRatio += 1; - var_t2 += 1; - } - } - } - } - var_s4 += 16; - if (var_s4 > 16) { - var_s4 -= 32; - zPosRatio += 1; - } - } - } else { - xPosRatio -= D_80129FC8.unk24 >> 1; // a1 - zPosRatio -= D_80129FC8.unk24 >> 1; // s7 - for (i = 0; i < D_80129FC8.unk24; i++, zPosRatio++) { + for (var_s6 = 0, var_a3 = 0; var_s6 < D_80129FC8.unk24; var_s6++) { if ((zPosRatio >= 0) && (zPosRatio < D_8012A0DC)) { tempXPosRatio = xPosRatio; - var_t2 = (zPosRatio * D_8012A0D8) + tempXPosRatio; - for (j = 0; j < D_80129FC8.unk24; j++, tempXPosRatio++, var_t2++) { - + var_t5 = var_v1; + var_t2 = (zPosRatio * D_8012A0D8) + xPosRatio; + for (var_s5 = 0; var_s5 < D_80129FC8.unk24; var_s5++) { // clang-format off if ( (tempXPosRatio >= 0) && @@ -526,16 +452,72 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp (D_8012A0E8[zPosRatio] & (1 << tempXPosRatio)) ) { // clang-format on - D_800E30D4[var_t2] = D_800E30E0[i * D_80129FC8.unk24 + j]; - for (k = 0; k < gNumberOfLevelSegments; k++) { - if (var_t2 == (&D_800E30D8[k])->unkC) { - temp = &D_8012A5E8[k]; - temp->unk0 = k; - temp->unk2 = 0; - temp->unk4 = (&D_800E30D8[k])->unk12; - temp->unk6 = (&D_800E30D8[k])->unk10; - temp->unk8 = k * D_800E317C; - k = 0x7FFF; + D_800E30D4[var_t2] |= D_800E30E0[var_s6 * D_80129FC8.unk24 + var_s5] << (var_t5 + var_s4); + for (var_v0 = 0; var_v0 < gNumberOfLevelSegments; var_v0++) { + if (var_t2 == D_800E30D8[var_v0].unkC) { + D_8012A5E8[var_a3].unk0 = var_v0; + D_8012A5E8[var_a3].unk2 = (var_t5 + var_s4) >> 3; + D_8012A5E8[var_a3].unk8 = var_v0 * D_800E317C; + D_8012A5E8[var_a3].unk4 = D_800E30D8[var_v0].unk12; + if (var_t5 != 0) { + D_8012A5E8[var_a3].unk8 += D_80129FC8.unk0; + D_8012A5E8[var_a3].unk4 += D_80129FC8.unk0; + while (D_8012A5E8[var_a3].unk4 >= D_80129FC8.unk4) { + D_8012A5E8[var_a3].unk4 -= D_80129FC8.unk4; + } + } + D_8012A5E8[var_a3].unk6 = D_800E30D8[var_v0].unk10; + if (var_s4 != 0) { + D_8012A5E8[var_a3].unk8 += ((D_80129FC8.unk0 * 2) + 1) * D_80129FC8.unk0; + D_8012A5E8[var_a3].unk6 += D_80129FC8.unk0; + while (D_8012A5E8[var_a3].unk6 >= D_80129FC8.unk4) { + D_8012A5E8[var_a3].unk6 -= D_80129FC8.unk4; + } + } + var_a3++; + var_v0 = 0x7FFF; + } + } + } + var_t5 += 8; + if (var_t5 > 8) { + var_t5 -= 16; + tempXPosRatio++; + var_t2++; + } + } + } + var_s4 += 16; + if (var_s4 > 16) { + var_s4 -= 32; + zPosRatio++; + } + } + } else { + xPosRatio -= D_80129FC8.unk24 >> 1; + zPosRatio -= D_80129FC8.unk24 >> 1; + for (var_s6 = 0, var_a3 = 0; var_s6 < D_80129FC8.unk24; var_s6++, zPosRatio++) { + if ((zPosRatio >= 0) && (zPosRatio < D_8012A0DC)) { + tempXPosRatio = xPosRatio; + var_t2 = (zPosRatio * D_8012A0D8) + xPosRatio; + for (var_s5 = 0; var_s5 < D_80129FC8.unk24; var_s5++, tempXPosRatio++, var_t2++) { + // clang-format off + if ( + (tempXPosRatio >= 0) && + (tempXPosRatio < D_8012A0D8) && + (D_8012A0E8[zPosRatio] & (1 << tempXPosRatio)) + ) { + // clang-format on + D_800E30D4[var_t2] = D_800E30E0[var_s6 * D_80129FC8.unk24 + var_s5]; + for (var_v0 = 0; var_v0 < gNumberOfLevelSegments; var_v0++) { + if (var_t2 == D_800E30D8[var_v0].unkC) { + D_8012A5E8[var_a3].unk0 = var_v0; + D_8012A5E8[var_a3].unk2 = 0; + D_8012A5E8[var_a3].unk4 = D_800E30D8[var_v0].unk12; + D_8012A5E8[var_a3].unk6 = D_800E30D8[var_v0].unk10; + D_8012A5E8[var_a3].unk8 = var_v0 * D_800E317C; + var_a3++; + var_v0 = 0x7FFF; } } } @@ -543,11 +525,9 @@ void func_800B8C04(s32 xPosition, s32 yPosition, s32 zPosition, s32 currentViewp } } } + func_800BA288(currentViewport, updateRate); } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800B8C04.s") -#endif s32 func_800B9228(LevelModelSegment *arg0) { s32 v0 = 0; @@ -790,7 +770,7 @@ void func_800B9C18(s32 arg0) { D_800E3048[var_s0].u = var_v1; D_800E3048[var_s0].v = var_a2; var_v1 += D_8012A08C; - var_s0 += 1; + var_s0++; } var_a2 += D_8012A090; } @@ -1179,7 +1159,7 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C); } var_a0 = sp58 + sp70 + (sp6C * sp60); - var_a0 += 1; + var_a0++; var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); @@ -1206,7 +1186,7 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { spA0 += func_800BEFC4(arg0, sp70 + 1, sp6C); } var_a0 = sp58 + sp70 + (sp6C * sp60); - var_a0 += 1; + var_a0++; var_v0 = D_800E3178[var_a0]; if (D_800E3178[var_a0] < 0x7F) { spA0 *= D_80129FC8.unk44 + (var_v0 * var_f16); @@ -1233,7 +1213,7 @@ f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C + 1); } var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); - var_a0 += 1; + var_a0++; var_v0 = D_800E3178[var_a0]; if (var_v0 < 0x7F) { var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); diff --git a/src/waves.h b/src/waves.h index 6c78cfda..a65c4902 100644 --- a/src/waves.h +++ b/src/waves.h @@ -47,6 +47,14 @@ typedef struct unk800E3184 { u8 unk0[8]; } unk800E3184; +typedef struct unk8012A5E8 { + s16 unk0; + s16 unk2; + s16 unk4; + s16 unk6; + s32 unk8; +} unk8012A5E8; + typedef struct unk80129FC8 { s32 unk0; // count or index? s32 unk4; // compared to and substracted diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index 08ffabea..104181e1 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -4518,9 +4518,6 @@ gNumberOfLevelSegments = 0x8012BB90; D_8012A0E8 = 0x8012BB98; D_8012A1E8 = 0x8012BC98; D_8012A5E8 = 0x8012C098; -D_8012A5F4 = 0x8012C0A4; -D_8012A5F8 = 0x8012C0A8; -D_8012A5FC = 0x8012C0AC; D_8012A600 = 0x8012C0B0; gWavePowerBase = 0x8012C1D0; gWaveMagnitude = 0x8012C1D4; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 55204c1e..06e70949 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -4202,9 +4202,6 @@ gNumberOfLevelSegments = 0x8012A170; D_8012A0E8 = 0x8012A178; D_8012A1E8 = 0x8012A278; D_8012A5E8 = 0x8012A678; -D_8012A5F4 = 0x8012A684; -D_8012A5F8 = 0x8012A688; -D_8012A5FC = 0x8012A68C; D_8012A600 = 0x8012A690; gWavePowerBase = 0x8012A7B0; gWaveMagnitude = 0x8012A7B4; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 0e548a49..200bb5bb 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -4137,9 +4137,6 @@ gNumberOfLevelSegments = 0x8012A730; D_8012A0E8 = 0x8012A738; D_8012A1E8 = 0x8012A838; D_8012A5E8 = 0x8012AC38; -D_8012A5F4 = 0x8012AC44; -D_8012A5F8 = 0x8012AC48; -D_8012A5FC = 0x8012AC4C; D_8012A600 = 0x8012AC50; gWavePowerBase = 0x8012AD70; gWaveMagnitude = 0x8012AD74; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index c70b5ca3..975c98b6 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -4647,9 +4647,6 @@ gNumberOfLevelSegments = 0x8012A0E0; D_8012A0E8 = 0x8012A0E8; D_8012A1E8 = 0x8012A1E8; D_8012A5E8 = 0x8012A5E8; -D_8012A5F4 = 0x8012A5F4; -D_8012A5F8 = 0x8012A5F8; -D_8012A5FC = 0x8012A5FC; D_8012A600 = 0x8012A600; gWavePowerBase = 0x8012A720; gWaveMagnitude = 0x8012A724; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 65d162bd..eb031245 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -4132,9 +4132,6 @@ gNumberOfLevelSegments = 0x8012A6A0; D_8012A0E8 = 0x8012A6A8; D_8012A1E8 = 0x8012A7A8; D_8012A5E8 = 0x8012ABA8; -D_8012A5F4 = 0x8012ABB4; -D_8012A5F8 = 0x8012ABB8; -D_8012A5FC = 0x8012ABBC; D_8012A600 = 0x8012ABC0; gWavePowerBase = 0x8012ACE0; gWaveMagnitude = 0x8012ACE4;