From 93413ebb03948fa3911d6f4f71ad7088bf7c3126 Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Wed, 30 Apr 2025 02:42:08 +0200 Subject: [PATCH] match: func_800BE654 (#537) * match: func_800BE654 * lint: run format.sh * refac: replace 0xFFFFFFF with COLOUR_TAG_CYAN --- README.md | 14 ++-- include/structs.h | 14 +++- src/tracks.c | 4 +- src/waves.c | 199 +++++++++++++++++++++++++++++++++++++++++++++- src/waves.h | 2 +- 5 files changed, 218 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 30c248af..b65cea23 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 28, 2025, this is our current score: +As of April 29, 2025, this is our current score: -    Decomp progress: 81.27% +    Decomp progress: 81.51%     Documentation progress: 53.79% @@ -117,20 +117,20 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 28, 2025, this is our current score: +As of April 29, 2025, this is our current score: ``` ======================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------- 81.27% Complete (84.08% NON_MATCHING) --------- - # Decompiled functions: 1865 - # GLOBAL_ASM remaining: 86 + -------- 81.51% Complete (84.33% NON_MATCHING) --------- + # Decompiled functions: 1866 + # GLOBAL_ASM remaining: 85 # NON_MATCHING functions: 13 # NON_EQUIVALENT WIP functions: 27 --------------------- Game Status ---------------------- Balloons: 39/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 -------------------------------------------------------- - We are racing in the rematch against Smokey. (Lap 2/3) + We are racing in the rematch against Smokey. (Lap 3/3) ======================================================== ADVENTURE TWO (Cleanup & Documentation) ------------------- 53.79% Complete -------------------- diff --git a/include/structs.h b/include/structs.h index 2588cf46..c0b3ae2b 100644 --- a/include/structs.h +++ b/include/structs.h @@ -1065,9 +1065,17 @@ typedef struct Object_Boost { } Object_Boost; typedef struct Object_EffectBox { - /* 0x000 */ u8 pad0[0x1FE]; - /* 0x1FE */ u8 unk1FE; - /* 0x1FF */ u8 unk1FF; + s16 unk0; + u8 unk2; + u8 unk3; + s16 unk4; + s16 unk6; + s16 unk8; + s16 unkA; + s16 unkC; + s8 unkE[0x1FE - 0xE]; + u8 unk1FE; + u8 unk1FF; } Object_EffectBox; typedef struct Object_EggCreator { diff --git a/src/tracks.c b/src/tracks.c index d8072047..dc8e1d95 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -2192,7 +2192,7 @@ s32 check_if_in_draw_range(Object *obj) { case BHV_HIT_TESTER_2: // animated objects? case BHV_ANIMATED_OBJECT_2: // space ships obj64 = obj->unk64; - obj->segment.object.opacity = obj64->effect_box.pad0[0x42]; + obj->segment.object.opacity = obj64->wizpig2.pad0[0x42]; break; case BHV_PARK_WARDEN: case BHV_GOLDEN_BALLOON: @@ -3686,7 +3686,7 @@ void func_800304C8(Vec4f *arg0) { temp = (gNewShadowObj->segment.trans.z_position - arg0[1].z); if ((((gNewShadowObj->segment.trans.x_position - arg0[0].x) * (arg0[1].z - arg00z)) - - ((arg0[1].x - arg0[0].x) * (((0, gNewShadowObj->segment.trans.z_position)) -arg00z))) >= compare) { + ((arg0[1].x - arg0[0].x) * (((0, gNewShadowObj->segment.trans.z_position)) - arg00z))) >= compare) { found1 = TRUE; } if ((((gNewShadowObj->segment.trans.x_position - arg0[1].x) * (arg0[2].z - arg0[1].z)) - diff --git a/src/waves.c b/src/waves.c index ec3bf192..0d1e4822 100644 --- a/src/waves.c +++ b/src/waves.c @@ -1834,8 +1834,203 @@ s32 func_800BDC80(s32 arg0, unkArg1 *arg1, unkArg2 *arg2, f32 shadowXNegPosition #else #pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BDC80.s") #endif -// https://decomp.me/scratch/2RF3k -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BE654.s") + +Object_64 *func_800BE654(s32 arg0, f32 arg1, f32 arg2) { + f32 spE4; + f32 temp_f; + s32 pad; + f32 var_f0; + s32 pad2; + f32 var_f12; + s32 var_t4; + f32 temp_f2; + s32 spC4; + s32 spC0; + f32 var_f18; + f32 var_f20; + f32 var_f22; + s32 spB0; + s32 var_t1; + s32 var_a0; + s16 var_t0; + s16 var_v1; + s16 var_a3; + s16 var_a1; + f32 var_f2; + s32 var_v0; + f32 var_f14; + s32 var_v0_2; + s32 var_a2; + s32 sp80[3]; + s32 sp68[6]; + s32 sp5C[3]; + f32 sp50[3]; + Object_64 *object; + + var_t0 = 0x80; + object = NULL; + if ((D_800E3040 != NULL) && (arg0 >= 0) && (arg0 < gNumberOfLevelSegments)) { + object = mempool_alloc_safe((D_80129FC8.unk20 >> 1) + 0xE, COLOUR_TAG_CYAN); + object->effect_box.unk0 = D_800E30D8[arg0].unk6; + object->effect_box.unk2 = 0; + object->effect_box.unk3 = 1; + object->effect_box.unk4 = 0; + object->effect_box.unk6 = D_80129FC8.unk20; + var_f20 = D_8012A0BC; + var_f22 = D_8012A0B8; + temp_f2 = (1.0f - D_80129FC8.unk44) / 127.0f; + var_f2 = temp_f2; + spB0 = (arg0 * D_800E317C); + if (D_80129FC8.unk28 != 0) { + var_t4 = (D_80129FC8.unk0 * 2) + 1; + var_f20 *= 0.5f; + var_f22 *= 0.5f; + } else { + var_t4 = D_80129FC8.unk0 + 1; + } + arg1 -= D_800E30D8[arg0].unk4; + if (arg1 < 0.0f) { + arg1 = 0.0f; + // clang-format off + } else if (arg1 >= D_8012A0A0) { \ + arg1 = D_8012A0A0 - 1; + // clang-format on + } + arg2 -= D_800E30D8[arg0].unk8; + if (arg2 < 0.0f) { + arg2 = 0.0f; + } else if (D_8012A0A4 <= arg2) { + arg2 = D_8012A0A4 - 1; + } + spC4 = arg1 / var_f22; + spC0 = arg2 / var_f20; + object->effect_box.unk8 = spC4; + object->effect_box.unkA = spC0; + object->effect_box.unkC = arg0; + arg1 -= (spC4 * var_f22); + arg2 -= (spC0 * var_f20); + var_a0 = D_800E30D8[arg0].unk12 + spC4; + while (var_a0 >= D_80129FC8.unk4) { + var_a0 -= D_80129FC8.unk4; + } + + var_v0 = D_800E30D8[arg0].unk10 + spC0; + while (var_v0 >= D_80129FC8.unk4) { + var_v0 -= D_80129FC8.unk4; + } + + var_t1 = 0; + if ((arg2 != var_f20) && (arg1 < (((var_f20 - arg2) / var_f20) * var_f22))) { + var_t1 = 1; + } + + if (var_t1 != 0) { + sp80[0] = (var_v0 * D_80129FC8.unk4) + var_a0; + + if ((var_v0 + 1) >= D_80129FC8.unk4) { + sp80[1] = var_a0; + } else { + sp80[1] = ((var_v0 + 1) * D_80129FC8.unk4) + var_a0; + } + + if ((var_a0 + 1) >= D_80129FC8.unk4) { + sp80[2] = (var_v0 * D_80129FC8.unk4); + } else { + sp80[2] = (var_v0 * D_80129FC8.unk4) + var_a0 + 1; + } + + spE4 = 0.0f; + sp5C[0] = (spB0 + spC4) + (spC0 * var_t4); + sp5C[1] = (spB0 + spC4) + ((spC0 + 1) * var_t4); + sp5C[2] = (spB0 + spC4) + (spC0 * var_t4) + 1; + } else { + if ((var_a0 + 1) >= D_80129FC8.unk4) { + sp80[0] = var_v0 * D_80129FC8.unk4; + } else { + sp80[0] = var_a0 + 1 + (var_v0 * D_80129FC8.unk4); + } + + if ((var_v0 + 1) >= D_80129FC8.unk4) { + sp80[1] = var_a0; + } else { + sp80[1] = ((var_v0 + 1) * D_80129FC8.unk4) + var_a0; + } + + if ((var_a0 + 1) >= D_80129FC8.unk4) { + sp80[2] = 0; + } else { + sp80[2] = var_a0 + 1; + } + + if ((var_v0 + 1) < D_80129FC8.unk4) { + sp80[2] += (var_v0 + 1) * D_80129FC8.unk4; + } + + spE4 = var_f22; + sp5C[0] = (spC4 + spB0) + (spC0 * var_t4) + 1; + sp5C[1] = (spC4 + spB0) + (spC0 + 1) * var_t4; + sp5C[2] = (spC4 + spB0) + (spC0 + 1) * var_t4 + 1; + } + + for (var_a3 = 0; var_a3 < 3; var_a3++) { + sp68[var_a3 * 2] = D_800E3044[sp80[var_a3]].s[0]; + sp68[var_a3 * 2 + 1] = D_800E3044[sp80[var_a3]].s[1]; + sp50[var_a3] = 1.0f; + + var_a2 = D_800E3178[sp5C[var_a3]]; + if (var_a2 < 0x7F) { + sp50[var_a3] *= D_80129FC8.unk44 + (var_a2 * var_f2); + } + } + + if (D_80129FC8.unk28 != 0) { + sp50[0] *= 0.5; + sp50[1] *= 0.5; + sp50[2] *= 0.5; + } + + for (var_a3 = 0; var_a3 < (D_80129FC8.unk20 >> 1); var_a3++) { + temp_f = (D_800E3040[sp68[0]] + D_800E3040[sp68[1]]) * sp50[0]; + var_f12 = (D_800E3040[sp68[2]] + D_800E3040[sp68[3]]) * sp50[1]; + var_f0 = (D_800E3040[sp68[4]] + D_800E3040[sp68[5]]) * sp50[2]; + if (var_t1 != 0) { + var_f2 = (temp_f - var_f0) * var_f20; + var_f14 = (temp_f - var_f12) * var_f22; + } else { + var_f2 = (var_f12 - var_f0) * var_f20; + var_f14 = (temp_f - var_f0) * var_f22; + } + var_f18 = var_f20 * var_f22; + var_f0 = sqrtf((var_f2 * var_f2) + (var_f18 * var_f18) + (var_f14 * var_f14)); + var_f2 /= var_f0; + var_f14 /= var_f0; + var_f12 = var_f18 / var_f0; + var_v0_2 = -(s32) (((var_f2 * arg1) + (var_f14 * arg2) - ((spE4 * var_f2) + (temp_f * var_f12))) * 16.0f / + var_f12); + if ((var_v0_2 >= var_t0) || (var_v0_2 < -var_t0)) { + var_v1 = 0; + do { + var_t0 += var_t0; + var_v1++; + } while (var_v0_2 >= var_t0 || var_v0_2 < -var_t0); + + for (var_a1 = 0; var_a1 < var_a3; var_a1++) { + object->effect_box.unkE[var_a1] >>= var_v1; + } + object->effect_box.unk2 += var_v1; + } + object->effect_box.unkE[var_a3] = (var_v0_2 >> object->effect_box.unk2); + for (var_a1 = 0; var_a1 < 6; var_a1++) { + sp68[var_a1] += 2; + while (sp68[var_a1] >= D_80129FC8.unk20) { + sp68[var_a1] -= D_80129FC8.unk20; + } + } + } + } + + return object; +} /** * Finds the wave height and returns it for the spinning log object. diff --git a/src/waves.h b/src/waves.h index a65c4902..589006cb 100644 --- a/src/waves.h +++ b/src/waves.h @@ -145,7 +145,7 @@ unk800E3190 *func_800BF634(Object *obj, f32 xPos, f32 zPos, f32 arg3, s32 arg4, void wave_init(void); void func_800BA4B8(TextureHeader *tex, s32 rtile); -Object_64 *func_800BE654(s16, f32, f32); // Non Matching +Object_64 *func_800BE654(s32, f32, f32); void func_800BBF78(LevelModel *model); // Non Matching f32 func_800BB2F4(s32, f32, f32, Vec3f *); void func_800B8C04(s32, s32, s32, s32, s32);