improve match for func_800BDC80 & match func_80060EA8, func_8002F2AC (#609)

* improve match for func_800BDC80 & match func_80060EA8

* match: func_8002F2AC
This commit is contained in:
Dominik Peters
2025-06-08 21:53:07 +02:00
committed by GitHub
parent eaa2ac9fa4
commit e90c783fbc
6 changed files with 452 additions and 658 deletions
+9 -9
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 June 5, 2025, this is our current score:
As of June 8, 2025, this is our current score:
&emsp;&emsp;&emsp;&emsp;Decomp progress: 89.17%
&emsp;&emsp;&emsp;&emsp;Decomp progress: 89.54%
&emsp;&emsp;&emsp;&emsp;Documentation progress: 59.17%
<!-- README_SCORE_SUMMARY_END -->
@@ -117,20 +117,20 @@ s32 is_drumstick_unlocked(void) {
```
<!-- README_SCORE_BEGIN -->
As of June 5, 2025, this is our current score:
As of June 8, 2025, this is our current score:
```
====================================================================
ADVENTURE ONE (ASM -> C Decompilation)
-------------- 89.17% Complete (90.50% NON_MATCHING) ---------------
# Decompiled functions: 1907
# GLOBAL_ASM remaining: 44
-------------- 89.54% Complete (90.88% NON_MATCHING) ---------------
# Decompiled functions: 1909
# GLOBAL_ASM remaining: 42
# NON_MATCHING functions: 6
# NON_EQUIVALENT WIP functions: 23
# NON_EQUIVALENT WIP functions: 21
--------------------------- Game Status ----------------------------
Balloons: 41/47, Keys: 4/4, Trophies: 4/5
Balloons: 42/47, Keys: 4/4, Trophies: 4/5
T.T. Amulets: 4/4, Wizpig Amulets: 4/4
--------------------------------------------------------------------
We are racing in Spaceport Alpha. (Lap 3/3)
We are racing in Star City. (Lap 1/3)
====================================================================
ADVENTURE TWO (Cleanup & Documentation)
------------------------- 59.17% Complete --------------------------
+158 -302
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -2460,7 +2460,7 @@ void func_800101AC(Object *obj, s32 arg1) {
}
} else {
for (j = 0; j < numberOfModelIds; j++) {
sprite_free(&tempObj->unk68[j]->sprite);
sprite_free(tempObj->unk68[j]->sprite);
}
}
try_free_object_header(tempObj->segment.object.unk2C);
@@ -2509,7 +2509,7 @@ void func_800101AC(Object *obj, s32 arg1) {
// TODO: Get a Snowball struct?
snowball = &obj->unk64->racer;
if (snowball->unk20 != NULL) {
audspat_point_stop(snowball->unk20);
audspat_point_stop((AudioPoint *) snowball->unk20);
}
break;
case BHV_WAVE_GENERATOR:
@@ -2520,7 +2520,7 @@ void func_800101AC(Object *obj, s32 arg1) {
break;
case BHV_ANIMATION:
if (obj->unk64 != NULL && arg1 == 0) {
free_object(&obj->unk64->obj);
free_object(obj->unk64->obj);
}
break;
case BHV_OVERRIDE_POS:
@@ -2610,7 +2610,7 @@ void func_800101AC(Object *obj, s32 arg1) {
}
if (gObjPtrList[i]->behaviorId == BHV_WEAPON_2 || gObjPtrList[i]->behaviorId == BHV_FLY_COIN ||
gObjPtrList[i]->behaviorId == BHV_WEAPON) {
free_object(gObjPtrList[i]);
free_object((Object *) gObjPtrList[i]);
}
}
}
@@ -2629,11 +2629,11 @@ void func_800101AC(Object *obj, s32 arg1) {
}
} else if (obj->segment.header->modelType == OBJECT_MODEL_TYPE_MISC) {
for (i = 0; i < numberOfModelIds; i++) {
tex_free(&obj->unk68[i]->texHeader);
tex_free(obj->unk68[i]->texHeader);
}
} else {
for (i = 0; i < numberOfModelIds; i++) {
sprite_free(&obj->unk68[i]->sprite);
sprite_free(obj->unk68[i]->sprite);
}
}
if (obj->segment.header->particleCount > 0) {
+72 -76
View File
@@ -3775,11 +3775,11 @@ void func_8002E904(LevelModelSegment *arg0, s32 arg1, s32 arg2) {
if (gNewShadowY2 >= minY) {
if (maxY >= gNewShadowY1) {
for (i = 0; i < 3; i++) {
sp100[i].unk0 = vertices[triangles->verticesArray[i + 1]].x;
sp100[i].unk8 = vertices[triangles->verticesArray[i + 1]].z;
sp100[i].unkE = -1;
sp100[i].x = vertices[triangles->verticesArray[i + 1]].x;
sp100[i].z = vertices[triangles->verticesArray[i + 1]].z;
sp100[i].unkC_union.s.unkE = -1;
}
// @note while the cast to Vec4f is incorrect, func_8002FD74 only uses unk0 and unk8 which
// @note while the cast to Vec4f is incorrect, func_8002FD74 x uses unk0 and z which
// are both floats so this is fine as the size is the same
if (func_8002FD74(spD0[2].x, spD0[2].y, spD0[0].x, spD0[0].y, 3, (Vec4f *) sp100) != 0) {
temp_t6 = arg0->unk14[curFacesOffset].triangleIndex * 4;
@@ -3792,26 +3792,26 @@ void func_8002E904(LevelModelSegment *arg0, s32 arg1, s32 arg2) {
if (someCount >= 3) {
D_8011C238[D_8011C230].unk1 = 0;
for (i2 = 0; i2 < someCount; i2++) {
if (sp100[i2].unkE < 0) {
if (sp100[i2].unkC_union.s.unkE < 0) {
foundIndex = -1;
i = 0;
while ((i < D_8011B118) && (foundIndex == -1)) {
if ((D_8011B120[i].x == sp100[i2].unk0) &&
(D_8011B120[i].z == sp100[i2].unk8)) {
if ((D_8011B120[i].x == sp100[i2].x) &&
(D_8011B120[i].z == sp100[i2].z)) {
foundIndex = i;
}
i++;
}
if (foundIndex == -1) {
D_8011B120[D_8011B118].x = sp100[i2].unk0;
D_8011B120[D_8011B118].x = sp100[i2].x;
D_8011B120[D_8011B118].unkC = D_8011D0BC;
D_8011B120[D_8011B118].z = sp100[i2].unk8;
D_8011B120[D_8011B118].z = sp100[i2].z;
D_8011C238[D_8011C230].unk2[i2] = D_8011B118++;
} else {
D_8011C238[D_8011C230].unk2[i2] = foundIndex;
}
} else {
D_8011C238[D_8011C230].unk2[i2] = sp100[i2].unkE;
D_8011C238[D_8011C230].unk2[i2] = sp100[i2].unkC_union.s.unkE;
D_8011C238[D_8011C230].unk1 |= 1 << i2;
}
}
@@ -3833,6 +3833,7 @@ void func_8002E904(LevelModelSegment *arg0, s32 arg1, s32 arg2) {
}
}
// Handles water shadow generation?
void func_8002EEEC(s32 arg0) {
unk8011C8B8 spA8[8];
Vec2f sp88[4];
@@ -3863,29 +3864,29 @@ void func_8002EEEC(s32 arg0) {
// clang-format on
for (var_s4 = 0; var_s4 < temp_v0; var_s4++) {
var_a0 = D_8011C3B8[var_s4].unk2;
var_a1 = D_8011C3B8[var_s4].unk2;
if (D_8011C3B8[var_s4].unk8 < var_a1) {
var_a0 = D_8011C3B8[var_s4].unk8;
} else if (var_a1 < D_8011C3B8[var_s4].unk8) {
var_a1 = D_8011C3B8[var_s4].unk8;
var_a0 = D_8011C3B8[var_s4].y1;
var_a1 = D_8011C3B8[var_s4].y1;
if (D_8011C3B8[var_s4].y2 < var_a0) {
var_a0 = D_8011C3B8[var_s4].y2;
} else if (var_a1 < D_8011C3B8[var_s4].y2) {
var_a1 = D_8011C3B8[var_s4].y2;
}
if (D_8011C3B8[var_s4].unkE < var_a0) {
var_a0 = D_8011C3B8[var_s4].unkE;
} else if (var_a1 < D_8011C3B8[var_s4].unkE) {
var_a1 = D_8011C3B8[var_s4].unkE;
if (D_8011C3B8[var_s4].y3 < var_a0) {
var_a0 = D_8011C3B8[var_s4].y3;
} else if (var_a1 < D_8011C3B8[var_s4].y3) {
var_a1 = D_8011C3B8[var_s4].y3;
}
if (gNewShadowY2 >= var_a0) {
if (var_a1 >= gNewShadowY1) {
spA8[0].unk0 = D_8011C3B8[var_s4].unk0;
spA8[0].unk8 = D_8011C3B8[var_s4].unk4;
spA8[1].unk0 = D_8011C3B8[var_s4].unk6;
spA8[1].unk8 = D_8011C3B8[var_s4].unkA;
spA8[2].unk0 = D_8011C3B8[var_s4].unkC;
spA8[2].unk8 = D_8011C3B8[var_s4].unk10;
spA8[0].x = D_8011C3B8[var_s4].x1;
spA8[0].z = D_8011C3B8[var_s4].z1;
spA8[1].x = D_8011C3B8[var_s4].x2;
spA8[1].z = D_8011C3B8[var_s4].z2;
spA8[2].x = D_8011C3B8[var_s4].x3;
spA8[2].z = D_8011C3B8[var_s4].z3;
for (var_v0 = 0; var_v0 != 3; var_v0++) {
spA8[var_v0].unkE = -1;
spA8[var_v0].unkC_union.s.unkE = -1;
}
D_8011D0BC = &D_8011C8B8[D_8011D0B8 + var_s4];
@@ -3894,26 +3895,26 @@ void func_8002EEEC(s32 arg0) {
tempIdx = D_8011C230;
D_8011C238[tempIdx].unk1 = 0;
for (var_t1 = 0; var_t1 < temp_v0_3; var_t1++) {
if (spA8[var_t1].unkE < 0) {
if (spA8[var_t1].unkC_union.s.unkE < 0) {
var_a1 = -1;
var_v1 = 0;
while (var_v1 < D_8011B118 && var_a1 == -1) {
if ((D_8011B120[var_v1].x == spA8[var_t1].unk0) &&
(D_8011B120[var_v1].z == spA8[var_t1].unk8)) {
if ((D_8011B120[var_v1].x == spA8[var_t1].x) &&
(D_8011B120[var_v1].z == spA8[var_t1].z)) {
var_a1 = var_v1;
}
var_v1++;
}
if (var_a1 == -1) {
D_8011B120[D_8011B118].x = spA8[var_t1].unk0;
D_8011B120[D_8011B118].x = spA8[var_t1].x;
D_8011B120[D_8011B118].unkC = D_8011D0BC;
D_8011B120[D_8011B118].z = spA8[var_t1].unk8;
D_8011B120[D_8011B118].z = spA8[var_t1].z;
D_8011C238[tempIdx].unk2[var_t1] = D_8011B118++;
} else {
D_8011C238[tempIdx].unk2[var_t1] = var_a1;
}
} else {
D_8011C238[tempIdx].unk2[var_t1] = spA8[var_t1].unkE;
D_8011C238[tempIdx].unk2[var_t1] = spA8[var_t1].unkC_union.s.unkE;
D_8011C238[tempIdx].unk1 |= 1 << var_t1;
}
}
@@ -3927,32 +3928,29 @@ void func_8002EEEC(s32 arg0) {
D_8011D0B8 += temp_v0;
}
#ifdef NON_EQUIVALENT
void func_8002F2AC(void) {
f32 temp_f12;
f32 temp_f16;
unk8011C8B8 *var_v0;
s32 i, j;
s32 i, j, k;
unk8011B330 *curr;
for (i = 0; i < D_8011B118; i++) {
var_v0 = D_8011B120[i].unkC;
temp_f16 = D_8011B120[i].x * var_v0->unk0;
temp_f12 = D_8011B120[i].z * var_v0->unk8;
D_8011B120[i].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC) / var_v0->unk4);
temp_f16 = D_8011B120[i].x * var_v0->x;
temp_f12 = D_8011B120[i].z * var_v0->z;
D_8011B120[i].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC_union.w) / var_v0->y);
}
for (i = 0; i < ARRAY_COUNT(D_8011B320); i++) {
for (j = 0; j < D_8011B320[i]; j++) {
var_v0 = D_8011B330[j + i].unkC;
temp_f16 = D_8011B330[j + i].x * var_v0->unk0;
temp_f12 = D_8011B330[j + i].z * var_v0->unk8;
D_8011B330[j + i].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC) / var_v0->unk4);
for (j = 0, k = i * sizeof(unk8011B330); j < D_8011B320[i]; j++, k++) {
var_v0 = D_8011B330[k].unkC;
temp_f16 = D_8011B330[k].x * var_v0->x;
temp_f12 = D_8011B330[k].z * var_v0->z;
D_8011B330[k].y = (f32) (-(temp_f16 + temp_f12 + var_v0->unkC_union.w) / var_v0->y);
}
}
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_8002F2AC.s")
#endif
void func_8002F440(void) {
s32 spAC;
@@ -4185,58 +4183,56 @@ s32 func_8002FF6C(s32 arg0, unk8011C8B8 *arg1, s32 arg2, Vec2f *arg3) {
if (var_v1 >= var_s2) {
var_v1 = 0;
}
temp_f16 = (temp_f12 * var_s3[var_t1].unk0) + (var_s3[var_t1].unk8 * temp_f14) + var_f2;
temp_f22 = (temp_f12 * var_s3[var_v1].unk0) + (var_s3[var_v1].unk8 * temp_f14) + var_f2;
temp_f16 = (temp_f12 * var_s3[var_t1].x) + (var_s3[var_t1].z * temp_f14) + var_f2;
temp_f22 = (temp_f12 * var_s3[var_v1].x) + (var_s3[var_v1].z * temp_f14) + var_f2;
if ((temp_f16 >= 0.0f && temp_f22 < 0.0f) || (temp_f16 < 0.0f && temp_f22 >= 0.0f)) {
var_a0 = D_8011B320[var_v0];
var_a1 = -1;
var_v1_3 = var_v0 << 5;
while (var_a0 > 0 && var_a1 < 0) {
if ((D_8011B330[var_v1_3].unk10 == var_s3[var_t1].unk0) &&
(D_8011B330[var_v1_3].unk14 == var_s3[var_t1].unk8) &&
(D_8011B330[var_v1_3].unk18 == var_s3[var_v1].unk0) &&
(D_8011B330[var_v1_3].unk1C == var_s3[var_v1].unk8)) {
if ((D_8011B330[var_v1_3].unk10 == var_s3[var_t1].x) &&
(D_8011B330[var_v1_3].unk14 == var_s3[var_t1].z) &&
(D_8011B330[var_v1_3].unk18 == var_s3[var_v1].x) &&
(D_8011B330[var_v1_3].unk1C == var_s3[var_v1].z)) {
var_a1 = var_v1_3;
} else if ((D_8011B330[var_v1_3].unk10 == var_s3[var_v1].unk0) &&
(D_8011B330[var_v1_3].unk14 == var_s3[var_v1].unk8) &&
(D_8011B330[var_v1_3].unk18 == var_s3[var_t1].unk0) &&
(D_8011B330[var_v1_3].unk1C == var_s3[var_t1].unk8)) {
} else if ((D_8011B330[var_v1_3].unk10 == var_s3[var_v1].x) &&
(D_8011B330[var_v1_3].unk14 == var_s3[var_v1].z) &&
(D_8011B330[var_v1_3].unk18 == var_s3[var_t1].x) &&
(D_8011B330[var_v1_3].unk1C == var_s3[var_t1].z)) {
var_a1 = var_v1_3;
}
var_a0 -= 1;
var_v1_3++;
}
if (var_a1 >= 0) {
var_s0[var_t2].unkE = var_a1;
var_s0[var_t2].unk0 = D_8011B330[var_a1].x;
var_s0[var_t2].unk8 = D_8011B330[var_a1].z;
var_s0[var_t2].unkC_union.s.unkE = var_a1;
var_s0[var_t2].x = D_8011B330[var_a1].x;
var_s0[var_t2].z = D_8011B330[var_a1].z;
var_t2++;
} else {
temp_f24 = temp_f16 / (temp_f16 - temp_f22);
var_s0[var_t2].unk0 =
var_s3[var_t1].unk0 + ((var_s3[var_v1].unk0 - var_s3[var_t1].unk0) * temp_f24);
var_s0[var_t2].unk8 =
var_s3[var_t1].unk8 + ((var_s3[var_v1].unk8 - var_s3[var_t1].unk8) * temp_f24);
var_s0[var_t2].x = var_s3[var_t1].x + ((var_s3[var_v1].x - var_s3[var_t1].x) * temp_f24);
var_s0[var_t2].z = var_s3[var_t1].z + ((var_s3[var_v1].z - var_s3[var_t1].z) * temp_f24);
if (D_8011B320[var_v0] > 0x1F) {
D_8011B320[var_v0] = 0x1F;
}
var_v1_3 = D_8011B320[var_v0] + (var_v0 << 5);
D_8011B330[var_v1_3].unk10 = var_s3[var_t1].unk0;
D_8011B330[var_v1_3].unk14 = var_s3[var_t1].unk8;
D_8011B330[var_v1_3].unk18 = var_s3[var_v1].unk0;
D_8011B330[var_v1_3].unk1C = var_s3[var_v1].unk8;
D_8011B330[var_v1_3].x = var_s0[var_t2].unk0;
D_8011B330[var_v1_3].z = var_s0[var_t2].unk8;
D_8011B330[var_v1_3].unk10 = var_s3[var_t1].x;
D_8011B330[var_v1_3].unk14 = var_s3[var_t1].z;
D_8011B330[var_v1_3].unk18 = var_s3[var_v1].x;
D_8011B330[var_v1_3].unk1C = var_s3[var_v1].z;
D_8011B330[var_v1_3].x = var_s0[var_t2].x;
D_8011B330[var_v1_3].z = var_s0[var_t2].z;
D_8011B330[var_v1_3].unkC = D_8011D0BC;
D_8011B320[var_v0]++;
var_s0[var_t2].unkE = var_v1_3;
var_s0[var_t2].unkC_union.s.unkE = var_v1_3;
var_t2++;
}
}
if (temp_f22 <= 0.0f) {
var_s0[var_t2].unkE = var_s3[var_v1].unkE;
var_s0[var_t2].unk0 = var_s3[var_v1].unk0;
var_s0[var_t2].unk8 = var_s3[var_v1].unk8;
var_s0[var_t2].unkC_union.s.unkE = var_s3[var_v1].unkC_union.s.unkE;
var_s0[var_t2].x = var_s3[var_v1].x;
var_s0[var_t2].z = var_s3[var_v1].z;
var_t2++;
}
}
@@ -4251,9 +4247,9 @@ s32 func_8002FF6C(s32 arg0, unk8011C8B8 *arg1, s32 arg2, Vec2f *arg3) {
if (var_s2 >= 3) {
if (var_s3 != arg1) {
for (var_t1 = 0; var_t1 < var_s2; var_t1++) {
arg1[var_t1].unk0 = var_s3[var_t1].unk0;
arg1[var_t1].unk8 = var_s3[var_t1].unk8;
arg1[var_t1].unkE = var_s3[var_t1].unkE;
arg1[var_t1].x = var_s3[var_t1].x;
arg1[var_t1].z = var_s3[var_t1].z;
arg1[var_t1].unkC_union.s.unkE = var_s3[var_t1].unkC_union.s.unkE;
}
}
} else {
+32 -27
View File
@@ -18,31 +18,36 @@ enum ShadowUpdate {
/* Size: 0x10 bytes */
typedef struct unk8011C8B8 {
f32 unk0;
f32 unk4;
f32 unk8;
s16 unkC;
s16 unkE;
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
/* 0x08 */ f32 z;
union {
/* 0x0C */ f32 w;
struct {
/* 0x0C */ s16 unkC;
/* 0x0E */ s16 unkE;
} s;
} unkC_union;
} unk8011C8B8;
/* Size: 0x10 bytes */
typedef struct unk8011B120 {
f32 x;
f32 y;
f32 z;
unk8011C8B8 *unkC;
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
/* 0x08 */ f32 z;
/* 0x0C */ unk8011C8B8 *unkC;
} unk8011B120;
/* Size: 0x20 bytes */
typedef struct unk8011B330 {
f32 x;
f32 y;
f32 z;
unk8011C8B8 *unkC;
f32 unk10;
f32 unk14;
f32 unk18;
f32 unk1C;
/* 0x00 */ f32 x;
/* 0x04 */ f32 y;
/* 0x08 */ f32 z;
/* 0x0C */ unk8011C8B8 *unkC;
/* 0x10 */ f32 unk10;
/* 0x14 */ f32 unk14;
/* 0x18 */ f32 unk18;
/* 0x1C */ f32 unk1C;
} unk8011B330;
/* Size: 0x10 bytes */
@@ -69,16 +74,16 @@ typedef struct unk8011D478 {
/* Size: 0x14 bytes */
typedef struct unk8011C3B8 {
s16 unk0;
s16 unk2;
s16 unk4;
s16 unk6;
s16 unk8;
s16 unkA;
s16 unkC;
s16 unkE;
s16 unk10;
s16 unk12;
/* 0x00 */ s16 x1;
/* 0x02 */ s16 y1;
/* 0x04 */ s16 z1;
/* 0x06 */ s16 x2;
/* 0x08 */ s16 y2;
/* 0x0A */ s16 z2;
/* 0x0C */ s16 x3;
/* 0x0E */ s16 y3;
/* 0x10 */ s16 z3;
/* 0x12 */ s16 unk12;
} unk8011C3B8;
// In this struct, data is rightshifted 16 bytes, so make the smooth transition more precise.
+175 -238
View File
@@ -1837,291 +1837,228 @@ void func_800BCC70(LevelModel *model) {
#ifdef NON_EQUIVALENT
s32 func_800BDC80(s32 arg0, unk8011C3B8 *arg1, unk8011C8B8 *arg2, f32 shadowXNegPosition, f32 shadowZNegPosition,
f32 shadowXPosition, f32 shadowZPosition) {
s32 sp36C;
s32 sp368;
s32 sp364;
s32 colCount;
s32 startCol; // sp368
s32 startRow; // sp364
f32 var_f0;
f32 var_f12;
s32 sp358;
s32 sp354;
f32 var_f14;
s32 sp34C;
f32 var_f16;
f32 var_f18;
f32 pad_sp35C;
s32 endCol; // sp358
s32 endRow; // sp354
s32 colOffset; // sp350
s32 rowOffset; // sp34C
f32 pad_sp348;
f32 pad_sp344;
f32 pad_sp340;
f32 var_f24;
f32 var_f26;
f32 var_f28;
f32 var_f20;
f32 pad_sp334;
s16 var_a1; // sp332
f32 var_f20;
f32 var_f22;
s16 var_s8;
s16 var_s2_s16;
s16 var_s3_2;
s32 var_s5;
s32 var_a2_2;
s32 var_lo;
s32 var_lo_2;
s32 pad_sp27C;
s32 pad_sp278;
s32 pad_sp274;
s32 pad_sp270;
s32 var_s0;
s32 var_s1;
s32 var_v1;
s32 var_s6;
s32 var_t0;
s32 currentCol;
s32 currentRow;
s32 waveCount;
s32 temp1_2;
s32 temp2_2;
s16 spD8[0x110]; // probably incorrect size
s32 pad_sp254;
s32 var_a3;
s32 pad_sp24C;
s32 var_t0;
s32 var_v0;
unk8011C8B8 *var_v0_4;
s32 pad_sp23C;
unk8011C3B8 *var_s0_2;
s16 spD8[256]; // 16 x 16
s32 var_s2;
s32 var_s4;
f32 spCC;
f32 spC8;
s32 var_v0;
s32 spA4;
unk8011C8B8 *var_v0_4;
s32 sp98;
unk8011C3B8 *var_s0_2;
s32 sp90;
f32 steps[2]; // spC8
s32 pad_spC4;
s32 temp3_2;
s32 temp4_2;
s32 var_s7; // sp74
s32 counter;
s32 var_t8;
s32 var_t6;
s32 pad[3];
var_t0 = (arg0 * gWaveTileTotal);
spCC = gWaveVtxStepX;
spC8 = gWaveVtxStepZ;
steps[1] = gWaveVtxStepX;
steps[0] = gWaveVtxStepZ;
var_f24 = (1.0f - gWaveController.unk44) / 127.0f;
if (gWaveController.doubleDensity != FALSE) {
sp36C = gWaveController.subdivisions * 2;
spCC *= 0.5;
spC8 *= 0.5;
waveCount = (arg0 * gWaveTileTotal);
if (gWaveController.doubleDensity) {
var_f22 = 0.5f;
steps[1] *= 0.5;
steps[0] *= 0.5;
colCount = gWaveController.subdivisions * 2;
} else {
var_f22 = 1.0f;
sp36C = gWaveController.subdivisions;
colCount = gWaveController.subdivisions;
}
var_f12 = shadowXNegPosition - gWaveModel[arg0].originX;
var_f14 = shadowZNegPosition - gWaveModel[arg0].originZ;
var_f16 = shadowXPosition - gWaveModel[arg0].originX;
var_f18 = shadowZPosition - gWaveModel[arg0].originZ;
shadowXNegPosition -= gWaveModel[arg0].originX;
shadowZNegPosition -= gWaveModel[arg0].originZ;
shadowXPosition -= gWaveModel[arg0].originX;
shadowZPosition -= gWaveModel[arg0].originZ;
if (var_f12 < 0.0f) {
sp368 = 0;
if (shadowXNegPosition < 0.0f) {
startCol = 0;
} else {
sp368 = var_f12 / spCC;
startCol = shadowXNegPosition / steps[1];
}
if (var_f14 < 0.0f) {
sp364 = 0;
// 0 instead of 0.0f is "correct" here
if (shadowZNegPosition < 0) {
startRow = 0;
} else {
sp364 = var_f14 / spC8;
startRow = shadowZNegPosition / steps[0];
}
if (gWaveBoundingBoxW <= var_f16) {
sp358 = sp36C;
if (gWaveBoundingBoxW <= shadowXPosition) {
endCol = colCount;
} else {
sp358 = (s32) (var_f16 / spCC) + 1;
endCol = (s32) (shadowXPosition / steps[1]) + 1;
}
if (gWaveBoundingBoxH <= var_f18) {
sp354 = sp36C;
if (gWaveBoundingBoxH <= shadowZPosition) {
endRow = colCount;
} else {
sp354 = (s32) (var_f18 / spCC) + 1;
endRow = (s32) (shadowZPosition / steps[1]) + 1;
}
var_v1 = gWaveModel[arg0].unk12 + sp368;
while (var_v1 >= gWaveController.tileCount) {
var_v1 -= gWaveController.tileCount;
colOffset = gWaveModel[arg0].unk12 + startCol;
while (colOffset >= gWaveController.tileCount) {
colOffset -= gWaveController.tileCount;
}
var_v0 = gWaveModel[arg0].unk10 + sp364;
while (var_v0 >= gWaveController.tileCount) {
var_v0 -= gWaveController.tileCount;
rowOffset = gWaveModel[arg0].unk10 + startRow;
while (rowOffset >= gWaveController.tileCount) {
rowOffset -= gWaveController.tileCount;
}
var_s6 = sp364;
var_s7 = 0;
if (sp354 >= sp364) {
spA4 = var_t0 + sp368 + (sp364 * sp36C);
sp90 = sp354 + 1;
sp34C = var_v0;
do {
var_s4 = spA4;
var_s0 = var_v1;
var_s2 = (sp34C * gWaveController.tileCount) + var_v1;
if (sp358 >= sp368) {
var_s1 = sp368;
var_s5 = sp358 + 1;
do {
var_f20 = (gWaveHeightTable[gWaveHeightIndices[var_s2].s[0]] +
gWaveHeightTable[gWaveHeightIndices[var_s2].s[1]]) *
gWaveController.magnitude;
if (gWaveGenCount > 0) {
var_f20 += waves_get_y(arg0, var_s1, var_s6);
}
if (D_800E3178[var_s4] < 0x7F) {
// s32 cast below required
var_f20 *= gWaveController.unk44 + ((s32) D_800E3178[var_s4] * var_f24);
}
var_s1++;
var_s7++;
var_s0++;
var_s4++;
var_s2++;
spD8[var_s7 - 1] = gWaveModel[arg0].originY + (s32) (var_f20 * var_f22);
if (var_s0 >= gWaveController.tileCount) {
var_s0 -= gWaveController.tileCount;
var_s2 -= gWaveController.tileCount;
}
} while (var_s5 != var_s1);
for (currentRow = startRow, counter = 0; endRow >= currentRow; currentRow++) {
var_s0 = colOffset;
var_s2 = (rowOffset * gWaveController.tileCount) + var_s0;
var_s4 = waveCount + startCol + (currentRow * colCount);
for (currentCol = startCol; endCol >= currentCol; currentCol++) {
var_f20 = (gWaveHeightTable[gWaveHeightIndices[var_s2].s[0]] +
gWaveHeightTable[gWaveHeightIndices[var_s2].s[1]]) *
gWaveController.magnitude;
if (gWaveGenCount > 0) {
var_f20 += waves_get_y(arg0, currentCol, currentRow);
}
sp34C++;
if (sp34C >= gWaveController.tileCount) {
sp34C -= gWaveController.tileCount;
var_v0 = D_800E3178[var_s4];
if (var_v0 < 0x7F) {
var_f20 *= gWaveController.unk44 + (var_v0 * var_f24);
}
spA4 += sp36C;
var_s6++;
} while (sp90 != var_s6);
// s32 cast below required
spD8[counter] = gWaveModel[arg0].originY + (s32) (var_f20 * var_f22);
counter++;
var_s4++;
var_s0++;
var_s2++;
if (var_s0 >= gWaveController.tileCount) {
var_s0 -= gWaveController.tileCount;
var_s2 -= gWaveController.tileCount;
}
}
rowOffset++;
if (rowOffset >= gWaveController.tileCount) {
rowOffset -= gWaveController.tileCount;
}
}
var_s7 = 0;
sp36C = (sp358 - sp368) + 1;
var_a1 = gWaveModel[arg0].originZ + (s32) (sp364 * spC8);
if (sp364 < sp354) {
sp98 = sp368 * spCC;
var_s6 = sp364;
do {
var_s8 = gWaveModel[arg0].originZ + (s32) ((var_s6 + 1) * spC8);
var_s3_2 = gWaveModel[arg0].originX + sp98;
if (sp368 < sp358) {
var_s0_2 = &arg1[var_s7];
// a3 / t5 as index
var_lo = (var_s6 - sp364) * sp36C;
// t0 / t8 as index
var_lo_2 = ((var_s6 - sp364) + 1) * sp36C;
/*
t4 = sp368
t8 = t4 - t4 ????
t6 = t8 * 2
t3 = spD8
v0 = t6 + t3
--
a3 = a2 * t7 (var_lo)
t5 = a3 * 2
s4 = v0 + t5
*/
// temp1 = &spD8[sp368 - sp368 + var_lo];
var_t8 = sp368;
temp1_2 = sp368 + var_lo - sp368;
/*
t4 = sp368
t6 = t4 * 2
at = neg t4
t3 = at * 2
t9 = t6 + t3
t1 = t9 + t5
--
a3 = a2 * t7 (var_lo)
t5 = a3 * 2
a3 = t5
--
v1 = t1 + a3
*/
// temp2 = &spD8[sp368 + var_lo];
temp2_2 = sp368 + var_lo;
/*
t4 = sp368
t8 = t4 - t4 ????
t6 = t8 * 2
t3 = spD8
v0 = t6 + t3
--
t0 = t2 * t7 (var_lo_2)
t8 = t0 * 2
--
s5 = v0 + t8
*/
// temp3 = &spD8[(sp368 - sp368) + var_lo_2];
temp3_2 = sp368 + var_lo_2 - sp368;
/*
t4 = sp368
t6 = t4 * 2
at = neg t4
t3 = at * 2
t9 = t6 + t3
t1 = t9 + t5
--
t0 = t2 * t7 (var_lo_2)
t8 = t0 * 2
--
a0 = t1 + t8
*/
// temp4 = &spD8[sp368 + var_lo_2];
temp4_2 = sp368 + var_lo_2;
var_s1 = var_s6;
var_f26 = spCC * spC8;
var_f28 = var_f26 * var_f26;
do {
var_s0_2->unk0 = var_s3_2;
var_s2_s16 = gWaveModel[arg0].originX + (s32) (var_s1 * spCC);
var_s0_2->unk6 = var_s3_2;
var_s0_2->unkC = var_s2_s16;
var_s0_2->unk2 = spD8[temp1_2];
var_s0_2->unk8 = spD8[temp3_2];
var_s0_2->unkE = spD8[temp2_2 + 1];
var_s0_2->unk4 = var_a1;
var_s0_2->unkA = var_s8;
var_s0_2->unk10 = var_a1;
var_f20 = (var_s0_2->unk2 - var_s0_2->unkE) * spC8;
var_f22 = (var_s0_2->unk2 - var_s0_2->unk8) * spCC;
var_f0 = sqrtf((var_f20 * var_f20) + var_f28 + (var_f22 * var_f22));
if (var_f0 > 0.0f) {
var_f24 = (1.0f / var_f0);
var_v0_4 = &arg2[var_s7];
var_v0_4->unk0 = var_f20 * var_f24;
var_v0_4->unk4 = var_f26 * var_f24;
var_v0_4->unk8 = var_f22 * var_f24;
var_v0_4->unkC = -((var_v0_4->unk8 * var_s0_2->unk4) +
((var_s0_2->unk0 * var_v0_4->unk0) + (var_s0_2->unk2 * var_v0_4->unk4)));
var_s7++;
var_s0_2++;
}
var_s0_2->unk0 = var_s2_s16;
var_s0_2->unk6 = var_s3_2;
var_s0_2->unkC = var_s2_s16;
var_s0_2->unk2 = spD8[temp1_2 + 1];
var_s0_2->unk8 = spD8[temp3_2];
var_s0_2->unkE = spD8[temp4_2 + 1];
var_s0_2->unk4 = var_a1;
var_s0_2->unkA = var_s8;
var_s0_2->unk10 = var_s8;
var_f20 = (var_s0_2->unk8 - var_s0_2->unkE) * spC8;
var_f22 = (var_s0_2->unk2 - var_s0_2->unkE) * spCC;
var_f0 = sqrtf((var_f20 * var_f20) + var_f28 + (var_f22 * var_f22));
if (var_f0 > 0.0f) {
var_f24 = (1.0f / var_f0);
var_v0_4 = &arg2[var_s7];
var_v0_4->unk0 = var_f20 * var_f24;
var_v0_4->unk4 = var_f26 * var_f24;
var_v0_4->unk8 = var_f22 * var_f24;
colCount = (endCol - startCol) + 1;
var_a1 = gWaveModel[arg0].originZ + (s32) (steps[0] * startRow);
var_s3_2 = gWaveModel[arg0].originX + (s32) (steps[1] * startCol);
counter = 0;
var_s0_2 = &arg1[counter];
for (currentRow = startRow; currentRow < endRow; currentRow++) {
// 0 .. 15
var_a3 = (currentRow - startRow) * colCount;
// 1 .. 16
var_t0 = ((currentRow - startRow) + 1) * colCount;
var_v0_4->unkC = -((var_v0_4->unk8 * var_s0_2->unk4) +
((var_s0_2->unk0 * var_v0_4->unk0) + (var_s0_2->unk2 * var_v0_4->unk4)));
var_s7++;
var_s0_2++;
}
var_s1++;
temp1_2++;
temp3_2++;
temp2_2++;
temp4_2++;
var_s3_2 = var_s2_s16;
} while (var_s1 != sp358);
}
var_a1 = var_s8;
var_s6++;
} while (var_s6 != sp354);
var_s8 = gWaveModel[arg0].originZ + (s32) (steps[0] * (currentRow + 1));
var_f26 = steps[0] * steps[1];
if (startCol < endCol) {
currentCol = startCol; // s1
do {
// v0 = currentCol - startCol as index of spD8
// t1 = -currentCol + startCol as index of spD8
var_t6 = (startCol * -1) + currentCol;
var_t8 = currentCol - startCol;
temp1_2 = var_a3 + var_t8; // s4 current row + col
temp2_2 = var_t0 + var_t8; // v1 current row + next col
temp3_2 = var_a3 + var_t6; // s5 next row + current col
temp4_2 = var_t0 + var_t6; // a0 next row + col
pad_spC4 = steps[1] * (currentCol + 1);
var_s2_s16 = gWaveModel[arg0].originX + pad_spC4;
var_s0_2->x1 = var_s3_2;
var_s0_2->x2 = var_s3_2;
var_s0_2->x3 = var_s2_s16;
var_s0_2->y1 = spD8[temp1_2];
var_s0_2->y2 = spD8[temp3_2];
var_s0_2->y3 = spD8[temp2_2 + 1];
var_s0_2->z1 = var_a1;
var_s0_2->z2 = var_s8;
var_s0_2->z3 = var_a1;
var_f20 = (var_s0_2->y1 - var_s0_2->y3) * steps[0];
var_f22 = (var_s0_2->y1 - var_s0_2->y2) * steps[1];
var_f0 = sqrtf((var_f20 * var_f20) + (var_f26 * var_f26) + (var_f22 * var_f22));
if (var_f0 > 0.0f) {
var_f24 = (1.0f / var_f0);
var_v0_4 = &arg2[counter];
var_v0_4->x = var_f20 * var_f24;
var_v0_4->y = var_f26 * var_f24;
var_v0_4->z = var_f22 * var_f24;
var_v0_4->unkC_union.w =
-((var_v0_4->z * var_s0_2->z1) + ((var_s0_2->x1 * var_v0_4->x) + (var_s0_2->y1 * var_v0_4->y)));
counter++;
var_s0_2++;
}
var_s0_2->x1 = var_s2_s16;
var_s0_2->x2 = var_s3_2;
var_s0_2->x3 = var_s2_s16;
var_s0_2->y1 = spD8[temp1_2 + 1];
var_s0_2->y2 = spD8[temp3_2];
var_s0_2->y3 = spD8[temp4_2 + 1];
var_s0_2->z1 = var_a1;
var_s0_2->z2 = var_s8;
var_s0_2->z3 = var_s8;
var_f20 = (var_s0_2->y2 - var_s0_2->y3) * steps[0];
var_f22 = (var_s0_2->y1 - var_s0_2->y3) * steps[1];
var_f0 = sqrtf((var_f20 * var_f20) + (var_f26 * var_f26) + (var_f22 * var_f22));
if (var_f0 > 0) {
var_f24 = (1.0f / var_f0);
var_v0_4 = &arg2[counter];
var_v0_4->x = var_f20 * var_f24;
var_v0_4->y = var_f26 * var_f24;
var_v0_4->z = var_f22 * var_f24;
var_v0_4->unkC_union.w =
-((var_v0_4->z * var_s0_2->z1) + ((var_s0_2->x1 * var_v0_4->x) + (var_s0_2->y1 * var_v0_4->y)));
counter++;
var_s0_2++;
}
currentCol++;
var_s3_2 = var_s2_s16;
} while (currentCol < endCol);
}
var_a1 = var_s8;
}
return var_s7;
return counter;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800BDC80.s")