From dc45ff2b336ba2321db2b37a28d4e9ecb04b73ae Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Tue, 8 Apr 2025 13:41:44 +0200 Subject: [PATCH] match: func_800BB2F4 (#502) --- README.md | 52 +++++++------- src/waves.c | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/waves.h | 2 +- 3 files changed, 221 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 5949570e..35214bbb 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 6, 2025, this is our current score: +As of April 8, 2025, this is our current score: -    Decomp progress: 77.14% +    Decomp progress: 77.46%     Documentation progress: 49.86% @@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 6, 2025, this is our current score: +As of April 8, 2025, this is our current score: ``` - ======================================================================= - ADVENTURE ONE (ASM -> C Decompilation) - ---------------- 77.14% Complete (79.75% NON_MATCHING) ---------------- - # Decompiled functions: 1840 - # GLOBAL_ASM remaining: 111 - # NON_MATCHING functions: 14 - # NON_EQUIVALENT WIP functions: 36 - ----------------------------- Game Status ----------------------------- - Balloons: 36/47, Keys: 4/4, Trophies: 3/5 - T.T. Amulets: 4/4, Wizpig Amulets: 3/4 - ----------------------------------------------------------------------- - We are collecting silver coins in Greenwood Village. (8/8 silver coins) - ======================================================================= - ADVENTURE TWO (Cleanup & Documentation) - --------------------------- 49.86% Complete --------------------------- - # Documented functions: 1089 - # Undocumented remaining: 565 - ----------------------------- Game Status ----------------------------- - Balloons: 24/47, Keys: 3/4, Trophies: 2/5 - T.T. Amulets: 2/4, Wizpig Amulets: 2/4 - ----------------------------------------------------------------------- - We are racing in Pirate Lagoon. (Lap 3/3) - ======================================================================= + ==================================================================== + ADVENTURE ONE (ASM -> C Decompilation) + -------------- 77.46% Complete (80.07% NON_MATCHING) --------------- + # Decompiled functions: 1841 + # GLOBAL_ASM remaining: 110 + # NON_MATCHING functions: 14 + # NON_EQUIVALENT WIP functions: 36 + --------------------------- Game Status ---------------------------- + Balloons: 37/47, Keys: 4/4, Trophies: 3/5 + T.T. Amulets: 4/4, Wizpig Amulets: 3/4 + -------------------------------------------------------------------- + We are collecting silver coins in Boulder Canyon. (1/8 silver coins) + ==================================================================== + ADVENTURE TWO (Cleanup & Documentation) + ------------------------- 49.86% Complete -------------------------- + # Documented functions: 1089 + # Undocumented remaining: 565 + --------------------------- Game Status ---------------------------- + Balloons: 24/47, Keys: 3/4, Trophies: 2/5 + T.T. Amulets: 2/4, Wizpig Amulets: 2/4 + -------------------------------------------------------------------- + We are racing in Pirate Lagoon. (Lap 3/3) + ==================================================================== ``` diff --git a/src/waves.c b/src/waves.c index 1967bff1..9c6a61a6 100644 --- a/src/waves.c +++ b/src/waves.c @@ -49,7 +49,7 @@ s16 D_800E3110[26] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 s16 D_800E3144[26] = { 0, 1, 1, 1, 2, 3, 4, 4, 4, 5, 3, 4, 4, 4, 5, 3, 4, 4, 4, 5, 6, 7, 7, 7, 8, 0 }; -s32 *D_800E3178 = NULL; +u8 *D_800E3178 = NULL; s32 D_800E317C = 0; LevelHeader_70 *D_800E3180 = NULL; unk800E3184 *D_800E3184 = NULL; @@ -629,7 +629,7 @@ void func_800B92F4(s32 arg0, s32 arg1) { var_f20 += func_800BEFC4(arg0, j + sp8C, i + sp88); } var_f20 *= D_800E304C[sp98][vertexIdx]; - var_v0 = ((u8 *) ((s32) D_800E3178 + D_8012A5E8[k].unk8))[0]; + var_v0 = D_800E3178[D_8012A5E8[k].unk8]; // clang-format off var_v0 <<= 1; \ @@ -819,7 +819,198 @@ void func_800BA288(s32 arg0, s32 arg1) { // https://decomp.me/scratch/h4uac #pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BA4B8.s") #pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BA8E4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BB2F4.s") + +f32 func_800BB2F4(s32 arg0, f32 arg1, f32 arg2, Vec3f *arg3) { + f32 spA4; + f32 spA0; + f32 var_f12; // sp9C + f32 var_f2; // sp98 + f32 sp94; + f32 sp90; + f32 var_f16; // sp8C + f32 arg3X; // sp8C + f32 arg3Z; // sp84 + f32 arg3Y; // sp80 + s32 var_a0; + f32 sp78; + s32 var_v0; + s32 sp70; + s32 sp6C; + s32 var_t0; // sp68 + s32 var_a3; // sp64 + s32 sp60; + u8 *tempD_800E3178; + s32 sp58; + s32 pad; + + if ((arg0 < 0) || (arg0 >= D_8012A0E0)) { + arg0 = 0; + } + + sp78 = D_800E30D8[arg0].unk6; + + sp90 = D_8012A0BC; + sp94 = D_8012A0B8; + var_f16 = (1.0f - D_80129FC8.unk44) / 127.0f; + sp58 = arg0 * D_800E317C; + + if (D_80129FC8.unk28 != 0) { + sp90 *= 0.5f; + sp94 *= 0.5f; + sp60 = (D_80129FC8.unk0 * 2) + 1; + } else { + sp60 = D_80129FC8.unk0 + 1; + } + + arg1 -= D_800E30D8[arg0].unk4; + if (arg1 < 0.0f) { + arg1 = 0.0f; + } else if (D_8012A0A0 <= arg1) { + arg1 = D_8012A0A0 - 1; // needs to be 1 instead of 1.0f + } + + arg2 -= D_800E30D8[arg0].unk8; + if (arg2 < 0.0f) { + arg2 = 0.0f; + } else if (D_8012A0A4 <= arg2) { + arg2 = D_8012A0A4 - 1; // needs to be 1 instead of 1.0f + } + + sp70 = arg1 / sp94; + sp6C = arg2 / sp90; + arg1 -= sp70 * sp94; + arg2 -= sp6C * sp90; + + var_t0 = D_800E30D8[arg0].unk12 + sp70; + while (var_t0 >= D_80129FC8.unk4) { + var_t0 -= D_80129FC8.unk4; + } + + var_a3 = D_800E30D8[arg0].unk10 + sp6C; + while (var_a3 >= D_80129FC8.unk4) { + var_a3 -= D_80129FC8.unk4; + } + + var_v0 = 0; + if ((arg2 != sp90) && (arg1 < (((sp90 - arg2) / sp90) * sp94))) { + var_v0 = 1; + } + + if (var_v0) { + var_a0 = (var_a3 * D_80129FC8.unk4) + var_t0; + spA0 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + var_a0 = sp58 + sp70 + (sp6C * sp60); + if (D_800E3188 > 0) { + spA0 += func_800BEFC4(arg0, sp70, sp6C); + } + + var_v0 = D_800E3178[var_a0]; + if (D_800E3178[var_a0] < 0x7F) { + spA0 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + var_a0 = (var_a3 + 1) >= D_80129FC8.unk4 ? var_t0 : ((var_a3 + 1) * D_80129FC8.unk4) + var_t0; + var_f12 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + if (D_800E3188 > 0) { + var_f12 += func_800BEFC4(arg0, sp70, sp6C + 1); + } + var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); + var_v0 = D_800E3178[var_a0]; + if (D_800E3178[var_a0] < 0x7F) { + var_f12 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + var_a0 = (var_t0 + 1) >= D_80129FC8.unk4 ? var_a3 * D_80129FC8.unk4 : (var_t0 ^ 0) + var_a3 * D_80129FC8.unk4 + 1; + var_f2 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + if (D_800E3188 > 0) { + var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C); + } + var_a0 = sp58 + sp70 + (sp6C * sp60); + var_a0 += 1; + var_v0 = D_800E3178[var_a0]; + if (D_800E3178[var_a0] < 0x7F) { + var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + if (D_80129FC8.unk28 != 0) { + spA0 *= 0.5f; + var_f12 *= 0.5f; + var_f2 *= 0.5f; + } + + spA4 = 0.0f; + arg3X = (spA0 - var_f2) * sp90; + arg3Z = sp90 * sp94; + arg3Y = (spA0 - var_f12) * sp94; + } else { + var_a0 = (var_t0 + 1) >= D_80129FC8.unk4 ? var_a3 * D_80129FC8.unk4 : (var_t0 ^ 0) + (var_a3 * D_80129FC8.unk4) + 1; + spA0 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + if (D_800E3188 > 0) { + spA0 += func_800BEFC4(arg0, sp70 + 1, sp6C); + } + var_a0 = sp58 + sp70 + (sp6C * sp60); + var_a0 += 1; + var_v0 = D_800E3178[var_a0]; + if (D_800E3178[var_a0] < 0x7F) { + spA0 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + var_a0 = (var_a3 + 1) >= D_80129FC8.unk4 ? var_t0 : ((var_a3 + 1) * D_80129FC8.unk4) + var_t0; + var_f12 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + if (D_800E3188 > 0) { + var_f12 += func_800BEFC4(arg0, sp70, sp6C + 1); + } + var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); + var_v0 = (tempD_800E3178 = D_800E3178)[var_a0]; + if (var_v0 < 0x7F) { + var_f12 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + var_a0 = (var_t0 + 1) >= D_80129FC8.unk4 ? 0 : (var_t0 + 1); + if ((var_a3 + 1) < D_80129FC8.unk4) { + var_a0 += (var_a3 + 1) * D_80129FC8.unk4; + } + + var_f2 = (D_800E3040[D_800E3044[var_a0].s[0]] + D_800E3040[D_800E3044[var_a0].s[1]]) * D_80129FC8.magnitude; + if (D_800E3188 > 0) { + var_f2 += func_800BEFC4(arg0, sp70 + 1, sp6C + 1); + } + var_a0 = sp58 + sp70 + ((sp6C + 1) * sp60); + var_a0 += 1; + var_v0 = D_800E3178[var_a0]; + if (var_v0 < 0x7F) { + var_f2 *= D_80129FC8.unk44 + (var_v0 * var_f16); + } + + if (D_80129FC8.unk28 != 0) { + spA0 *= 0.5f; + var_f12 *= 0.5f; + var_f2 *= 0.5f; + } + + spA4 = sp94; + arg3X = sp90 * (var_f12 - var_f2); + arg3Z = sp90 * sp94; + arg3Y = sp94 * (spA0 - var_f2); + } + + var_f16 = sqrtf((arg3X * arg3X) + (arg3Z * arg3Z) + (arg3Y * arg3Y)); + if (var_f16 != 0.0 && arg3Z != 0.0) { + arg3X /= var_f16; + arg3Z /= var_f16; + arg3Y /= var_f16; + sp78 -= (((arg3X * arg1) + (arg3Y * arg2)) - ((spA4 * arg3X) + (spA0 * arg3Z))) / arg3Z; + } + + if (arg3) { + arg3->x = arg3X; + arg3->y = arg3Z; + arg3->z = arg3Y; + } + + return sp78; +} + void func_800BBDDC(LevelModel *level, LevelHeader *header) { func_800BBE08(level, (unk800BBE08_arg1 *) header); diff --git a/src/waves.h b/src/waves.h index ec626e9e..ddc26f06 100644 --- a/src/waves.h +++ b/src/waves.h @@ -134,7 +134,7 @@ void wave_init(void); Object_64 *func_800BE654(s16, f32, f32); // Non Matching void func_800BBF78(LevelModel *arg0); // Non Matching -f32 func_800BB2F4(s32, f32, f32, f32*); +f32 func_800BB2F4(s32, f32, f32, Vec3f *); void func_800B8C04(s32, s32, s32, s32, s32); void func_800BF524(Object *); f32 func_800BEFC4(s32, s32, s32);