match: func_800BB2F4 (#502)

This commit is contained in:
Dominik Peters
2025-04-08 07:41:44 -04:00
committed by GitHub
parent fa806d366f
commit dc45ff2b33
3 changed files with 221 additions and 30 deletions
+26 -26
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 6, 2025, this is our current score:
As of April 8, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 77.14%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 77.46%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 49.86%
<!-- README_SCORE_SUMMARY_END -->
@@ -117,30 +117,30 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
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)
====================================================================
```
<!-- README_SCORE_END -->
+194 -3
View File
@@ -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);
+1 -1
View File
@@ -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);