Starship/src/overlays/ovl_i5/sf_i5_4.c

425 lines
16 KiB
C
Raw Normal View History

#include "global.h"
void func_i5_801B5244(s32 arg0, s32 arg1);
void func_i5_801B5FE0(s32 arg0, s32 arg1, s32 arg2);
void func_i5_801B68A8(Gfx** dlist, s32 arg1, s32 arg2);
typedef struct {
/* 0x00 */ s32 unk_00;
/* 0x04 */ s32 unk_04;
/* 0x08 */ f32 unk_08;
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
/* 0x14 */ f32 unk_14;
/* 0x18 */ f32 unk_18;
/* 0x1C */ s16 unk_1C;
/* 0x20 */ f32 unk_20;
} UnkStruct_801C62E8; // size = 0x24
extern UnkStruct_801C62E8 D_i5_801C62E8[20];
// Quite likely just Vec3f.
typedef struct {
/* 0x00 */ f32 unk_00;
/* 0x04 */ f32 unk_04;
/* 0x08 */ f32 unk_08;
} UnkStruct_801C62D8; // size = 0xC
extern UnkStruct_801C62D8 D_i5_801C62D8;
extern u8 D_i5_801BA970[12];
extern f32 D_i5_801BE740;
extern f32 D_i5_801BE744;
extern s32 D_i5_801C5C04;
extern s32 D_i5_801C5C08;
extern s32 D_i5_801C5C0C;
extern f32 D_i5_801C5C10;
extern s32 D_i5_801C5C14;
// extern UnkStruct_801C62E8 D_i5_801C1D48[49]; // Really unsure about this struct
extern s32 D_i5_801C1D48[28][16];
extern f32 D_i5_801C24B8[28]; // size = 0x40
extern f32 D_i5_801C2448[28]; // size = 0x40
extern f32 D_i5_801C62E0;
extern Gfx D_i5_801C2528[27][65];
extern Gfx* D_i5_801C5C00[];
extern u16 D_6001BA8[];
extern s32 D_i5_801BA97C[2][3];
extern Gfx D_i5_801BA950;
extern Mtx** D_i5_801C5C18;
extern s16 D_i5_801BE748[3208]; // size = 0x1910
bool func_i5_801B49D0(Actor* actor) {
UnkStruct_801C62E8* var_v0;
s32 i;
bool found;
found = false;
var_v0 = D_i5_801C62E8;
for (i = 0; i < ARRAY_COUNT(D_i5_801C62E8); i++, var_v0++) {
if (var_v0->unk_00 == 0) {
found = true;
var_v0->unk_00 = 1;
var_v0->unk_04 = actor->obj.pos.y;
var_v0->unk_08 = actor->obj.pos.x;
var_v0->unk_0C = actor->obj.pos.z;
var_v0->unk_10 = actor->obj.rot.x;
var_v0->unk_14 = actor->obj.rot.y;
var_v0->unk_18 = actor->obj.rot.z;
break;
}
}
actor->obj.status = 0;
return found;
}
void func_i5_801B4A54(UnkStruct_801C62E8* arg0) {
// Lots of conversions between floats, and ints unnecessarily here because of this chain assignment.
arg0->unk_00 = arg0->unk_04 = arg0->unk_08 = arg0->unk_0C = arg0->unk_10 = arg0->unk_14 = arg0->unk_18 =
arg0->unk_1C = arg0->unk_20 = 0;
}
void func_i5_801B4AA8(s32* arg0, s32* arg1) {
Actor actor;
UnkStruct_801C62E8* var_s2;
s32* var_s1;
f32 temp_fa0;
f32 temp_fs0;
f32 temp_fs1;
f32 var_fv0;
f32 var_fv1;
s32 unk_04;
f32 unk_08;
f32 unk_10;
f32 unk_14;
f32 unk_18;
s32 i;
s32 j;
var_s2 = D_i5_801C62E8;
for (i = 0; i < ARRAY_COUNT(D_i5_801C62E8); i++, var_s2++) {
if (var_s2->unk_00 != 0) {
unk_04 = var_s2->unk_04;
unk_08 = var_s2->unk_08;
unk_10 = var_s2->unk_10;
unk_14 = var_s2->unk_14;
unk_18 = var_s2->unk_18;
var_s1 = arg0;
if (var_s1 == NULL) {
unk_04 = D_i5_801BA970[unk_04];
}
if (var_s2->unk_00 == 1) {
switch (unk_04) {
case 0:
break;
case 1:
case 3:
var_s2->unk_20 = var_s2->unk_18;
break;
case 4:
PRINTF("ICHIMAI POLYGON ON\n"); // ONE PLANE POLYGON ON
*arg1 |= 2;
break;
case 5:
PRINTF("CHIKEI POLYGON OFF\n"); // TERRAIN POLYGON OFF
*arg1 &= ~1;
break;
case 6:
PRINTF("CHIKEI POLYGON ON\n"); // TERRAIN POLYGON ON
*arg1 |= 1;
break;
case 7:
PRINTF("ICHIMAI POLYGON OFF\n"); // ONE PLANE POLYGON OFF
*arg1 &= ~2;
break;
case 8:
PRINTF("RANDAMU YAMA\n"); // RANDOM MOUNTAIN
var_s2->unk_20 = 5000.0f;
break;
}
var_s2->unk_00 = 2;
}
switch (unk_04) {
case 0:
break;
case 1:
for (j = 0; j < 16; j++, var_s1++) {
temp_fs0 = (j * 220.0f * D_i5_801BE740) - 1760.0f - unk_08;
if (fabsf(temp_fs0) <= unk_10) {
temp_fs1 = __sinf((var_s2->unk_20 / unk_18) * (M_DTOR * 180.0f));
var_fv0 = __cosf((temp_fs0 / unk_10) * (M_DTOR * 90.0f));
*var_s1 = *var_s1 + (var_fv0 * unk_14 * temp_fs1);
}
}
var_s2->unk_20 -= 220.0f;
if (var_s2->unk_20 <= 0.0f) {
func_i5_801B4A54(var_s2);
}
break;
case 2:
var_fv1 = unk_14;
j = 0;
temp_fa0 = unk_14 / (70.0f * M_DTOR);
unk_08 += (1760.0f - (unk_10 * 0.5f));
if (var_s2->unk_20 <= temp_fa0) {
var_fv1 = var_s2->unk_20 * (70.0f * M_DTOR);
} else if (temp_fa0 >= (unk_18 - var_s2->unk_20)) {
var_fv1 = (unk_18 - var_s2->unk_20) * (70.0f * M_DTOR);
}
var_fv0 = 0.0f;
do {
if (unk_08 <= var_fv0 && var_fv0 <= (unk_08 + unk_10) && *var_s1 < var_fv1) {
*var_s1 = var_fv1;
}
var_fv0 += 220.0f;
var_s1++;
j++;
} while (j != 16);
if (0) {} // fake
var_s2->unk_20 += 220.0f;
if (unk_18 <= var_s2->unk_20) {
func_i5_801B4A54(var_s2);
}
break;
case 3:
for (j = 0; j < 16; j++) {
temp_fs0 =
(__sinf(((var_s2->unk_20 * 8.0f) / var_s2->unk_18) * 2 * (M_DTOR * 180.0f)) * 500.0f) +
(((j * 220.0f * D_i5_801BE740) - 1760.0f) - var_s2->unk_08);
if (fabsf(temp_fs0) <= var_s2->unk_10) {
temp_fa0 = __cosf((temp_fs0 / var_s2->unk_10) * (M_DTOR * 90.0f));
if (temp_fa0 >= 0.7) {
temp_fa0 = 0.7f;
}
*var_s1 -=
temp_fa0 * var_s2->unk_14 * 4.0f * ((var_s2->unk_18 - var_s2->unk_20) / var_s2->unk_18);
}
*var_s1 +=
(var_s2->unk_14 - ((var_s2->unk_20 / var_s2->unk_18) * var_s2->unk_14)) * 4.0f * 0.7f;
var_s1++;
}
var_s2->unk_20 -= 220.0f;
if (var_s2->unk_20 <= 0.0f) {
func_i5_801B4A54(var_s2);
}
break;
case 8:
if (var_s2->unk_1C <= 0) {
for (j = 0; j < (s32) var_s2->unk_18; j++) {
var_s2->unk_1C = 1;
actor.obj.pos.x = (Rand_ZeroOne() * 3300.0f) - 1650.0f;
actor.obj.pos.z = 0.0f;
actor.obj.pos.y = 1.0f;
actor.obj.rot.x = (Rand_ZeroOne() * var_s2->unk_10 * 0.25f) + var_s2->unk_10;
actor.obj.rot.z = 2.0f * actor.obj.rot.x; // Should this have been obj.rot.y?
actor.obj.rot.z = (Rand_ZeroOne() * var_s2->unk_14 * 0.25f) + var_s2->unk_14;
func_i5_801B49D0(&actor);
}
var_s2->unk_20 -= 220.0f;
if (var_s2->unk_20 <= 0.0f) {
func_i5_801B4A54(var_s2);
}
} else {
var_s2->unk_1C--;
}
break;
default:
func_i5_801B4A54(var_s2);
break;
}
}
}
}
void func_i5_801B5110(f32 arg0, f32 arg1, f32 arg2) {
UnkStruct_801C62E8* ptr;
s32 i;
s32 j;
s32 h;
s32 k;
D_i5_801C5C04 = 0;
D_i5_801C5C08 = 0;
D_i5_801C5C0C = 0;
D_i5_801C5C10 = 0.0f;
D_i5_801BE740 = D_i5_801BE744 = 1.0f;
D_i5_801C62D8.unk_00 = arg0;
D_i5_801C62D8.unk_04 = arg1;
D_i5_801C62D8.unk_08 = 200.0f; // Probably used to be arg2
D_i5_801C5C14 = 1;
for (i = 0, ptr = D_i5_801C62E8; i < ARRAY_COUNT(D_i5_801C62E8); i++, ptr++) {
func_i5_801B4A54(ptr);
}
for (i = 0; i < ARRAY_COUNT(D_i5_801C1D48); i++) {
// clang-format off
for (k = 0; k < ARRAY_COUNT(D_i5_801C1D48[0]); k += 4) { \
for (h = 0; h < 4; h++) {
D_i5_801C1D48[i][k + h] = 0;
}
}
// clang-format on
D_i5_801C2448[i] = D_i5_801C24B8[i] = 1.0f;
}
func_i5_801B5244(D_i5_801C5C04, D_i5_801C5C08);
}
#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B5244.s")
#ifdef NON_EQUIVALENT
void func_i5_801B58AC(Gfx** dlists, f32 arg1) {
s32 spC4;
f32 temp_fa1;
s32 temp_hi;
s32 var_s0;
s32 i;
s32 var_s2;
s16* temp_t1;
s16* temp_v0_2;
s16* temp_v1;
s32 k;
s32 h;
RCP_SetupDL(dlists, 0x1D);
RCP_SetFog(dlists, gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar);
spC4 = D_i5_801C5C14;
if (D_i5_801C5C14 & 2) {
gDPTileSync((*dlists)++);
gDPSetTile((*dlists)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_WRAP,
5, G_TX_NOLOD, G_TX_MIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize((*dlists)++, G_TX_RENDERTILE, 0, 0, 124, 124);
gDPSetTextureImage((*dlists)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, D_6001BA8); // Ground Texture?
gDPTileSync((*dlists)++);
gDPSetTile((*dlists)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync((*dlists)++);
gDPLoadBlock((*dlists)++, G_TX_LOADTILE, 0, 0, 1023, 256);
gSPMatrix((*dlists)++, &gIdentityMtx, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW);
Matrix_Translate(gGfxMatrix, D_i5_801C62D8.unk_00, D_i5_801C62D8.unk_04, D_i5_801C62D8.unk_08 + D_i5_801C5C10,
0);
Matrix_ToMtx(gGfxMtx);
gSPMatrix((*dlists)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPDisplayList((*dlists)++, &D_i5_801BA950);
gSPPopMatrix((*dlists)++, G_MTX_MODELVIEW);
func_i5_801B4AA8(NULL, &D_i5_801C5C14);
}
if (D_i5_801C5C14 & 1) {
if (D_i5_801C5C0C == 1) {
D_i5_801C5C0C = 0;
temp_hi = (D_i5_801C5C08 + 27) % 28;
for (k = 0; k < ARRAY_COUNT(D_i5_801C1D48[0]); k += 4) {
for (h = 0; h < 4; h++) {
D_i5_801C1D48[temp_hi][k + h] = 0;
}
}
D_i5_801C2448[temp_hi] = D_i5_801BE740;
D_i5_801C24B8[temp_hi] = D_i5_801BE744;
func_i5_801B4AA8(D_i5_801C1D48[temp_hi], &spC4);
i = 0;
var_s2 = 0;
do {
temp_v0_2 = D_i5_801BE748[(D_i5_801C5C04 * 512) + var_s2];
if ((i != 0) && (i != 15)) {
temp_v0_2[0] = (D_i5_801C2448[D_i5_801C5C08] * ((i * 220.0f) - 1760.0f));
} else if (i == 0) {
temp_v0_2[0] = -4000;
} else {
temp_v0_2[0] = 4000;
}
temp_t1 = temp_v0_2 + 16;
if ((i != 0) && (i != 15)) {
temp_t1[0] = (D_i5_801C2448[(D_i5_801C5C08 + 1) % 28] * ((i * 220.0f) - 1760.0f));
} else if (i == 0) {
temp_t1[0] = -4000;
} else {
temp_t1[0] = 4000;
}
temp_v0_2[1] = D_i5_801C1D48[D_i5_801C5C08][i];
temp_t1[1] = D_i5_801C1D48[(D_i5_801C5C08 + 1) % 28][i];
temp_v1 = D_i5_801BE748[(((D_i5_801C5C04 + 27) % 27) * 512) + var_s2];
temp_t1[10] = 0;
temp_t1[2] = (D_i5_801C24B8[(D_i5_801C5C08 + 29) % 28] * -220.0f);
Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, D_i5_801C24B8[D_i5_801C5C08] * -220.0f, 0);
Matrix_ToMtx((D_i5_801C5C04 << 6) + &D_i5_801C5C18);
i += 1;
var_s2 += 0x20;
} while (i < 16);
func_i5_801B5FE0(D_i5_801C5C08, D_i5_801C5C04, 1);
}
gSPMatrix((*dlists)++, &gIdentityMtx, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
func_i5_801B68A8(dlists, D_i5_801C5C04, 1);
gSPPopMatrix((*dlists)++, G_MTX_MODELVIEW);
}
D_i5_801C5C10 += arg1;
if (D_i5_801C5C14 & 1) {
temp_fa1 = D_i5_801C24B8[(D_i5_801C5C08 + 25) % 28] * 220.0f;
if (temp_fa1 <= D_i5_801C5C10) {
D_i5_801C5C0C = 1;
D_i5_801C5C10 = Math_ModF(D_i5_801C5C10, temp_fa1);
D_i5_801C5C04 = (D_i5_801C5C04 + 26) % 27;
D_i5_801C5C08 = (D_i5_801C5C08 + 27) % 28;
}
}
if (D_i5_801C5C14 & 2) {
D_i5_801C5C10 = Math_ModF(D_i5_801C5C10, 220.0f * D_i5_801BE744);
}
D_i5_801C5C14 = spC4;
}
#else
#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B58AC.s")
#endif
#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B5FE0.s")
void func_i5_801B68A8(Gfx** dlist, s32 arg1, s32 arg2) {
s32 var_a0;
s32 var_a1;
s32 var;
gDPTileSync((*dlist)++);
gDPSetTile((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 8, 0x0000, G_TX_RENDERTILE, 0, G_TX_MIRROR | G_TX_WRAP, 5,
G_TX_NOLOD, G_TX_MIRROR | G_TX_WRAP, 5, G_TX_NOLOD);
gDPSetTileSize((*dlist)++, G_TX_RENDERTILE, 0, 0, 124, 124);
gDPSetTextureImage((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, D_6001BA8); // Ground Texture?
gDPTileSync((*dlist)++);
gDPSetTile((*dlist)++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
gDPLoadSync((*dlist)++);
gDPLoadBlock((*dlist)++, G_TX_LOADTILE, 0, 0, 1023, 256);
Matrix_Translate(gGfxMatrix, D_i5_801C62D8.unk_00, D_i5_801C62D8.unk_04, D_i5_801C62D8.unk_08 + D_i5_801C5C10, 0);
Matrix_ToMtx(gGfxMtx);
gSPMatrix((*dlist)++, gGfxMtx++, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
var = 1;
var_a0 = (arg1 + 25) % 27;
for (var_a1 = 26; var_a1 >= var; var_a1--) {
gSPDisplayList((*dlist)++, &D_i5_801C2528[var_a0]);
var_a0 = (var_a0 + 26) % 27;
}
}
bool func_i5_801B6AEC(f32 arg0, f32 arg1, f32 arg2) {
f32 sp2C;
f32 sp28;
f32 sp24;
func_i5_801B6E20(arg0, arg2, &sp2C, &sp28, &sp24);
if (arg1 < sp28) {
return true;
} else {
return false;
}
}
#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B6B40.s")
#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B6E20.s")
void func_i5_801B7240(f32 arg0, f32 arg1, f32* arg2, f32* arg3, f32* arg4) {
s32 pad;
f32 sp28;
f32 sp24;
func_i5_801B6E20(arg0, arg1, &sp28, arg3, &sp24);
*arg2 = sp28 * M_RTOD;
*arg4 = sp24 * M_RTOD;
}