match: func_800BE654 (#537)

* match: func_800BE654

* lint: run format.sh

* refac: replace 0xFFFFFFF with COLOUR_TAG_CYAN
This commit is contained in:
Dominik Peters
2025-04-29 20:42:08 -04:00
committed by GitHub
parent 57aa448faa
commit 93413ebb03
5 changed files with 218 additions and 15 deletions
+7 -7
View File
@@ -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.
<!-- README_SCORE_SUMMARY_BEGIN -->
As of April 28, 2025, this is our current score:
As of April 29, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 81.27%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 81.51%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 53.79%
<!-- README_SCORE_SUMMARY_END -->
@@ -117,20 +117,20 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
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 --------------------
+11 -3
View File
@@ -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 {
+2 -2
View File
@@ -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)) -
+197 -2
View File
@@ -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.
+1 -1
View File
@@ -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);