From 22f5d22fa0355cb04504bf72413bb30cba374759 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Thu, 1 Feb 2024 22:02:52 -0500 Subject: [PATCH] sf_i5_4.c WIP (#113) * Match func_i5_801B49D0 * Match func_i5_801B4A54 * Fix warning * merge master * WIP func_i5_801B4AA8 * Stack fixed func_i5_801B4AA8 * Match func_i5_801B4AA8 * Better math for the func * Match func_i5_801B5110 * Migrate RODATA * format * Match func_i5_801B6AEC * Match func_i5_801B68A8 * Translation update * WIP func_i5_801B58AC * header cleanup * make format --- include/functions.h | 3 + src/overlays/ovl_i5/fox_i5.c | 2 +- src/overlays/ovl_i5/fox_ti_cs.c | 2 +- src/overlays/ovl_i5/sf_i5_4.c | 415 +++++++++++++++++++++++++++++++- tools/m2c | 2 +- 5 files changed, 412 insertions(+), 12 deletions(-) diff --git a/include/functions.h b/include/functions.h index f04c1856..9eb96984 100644 --- a/include/functions.h +++ b/include/functions.h @@ -616,4 +616,7 @@ void func_i1_80193D64(s32, Vec3f*, void*); void func_ending_8018A96C(void); void func_ending_8018AAC4(void); +// sf_i5_5 +bool func_i5_801B49D0(Actor* actor); + #endif diff --git a/src/overlays/ovl_i5/fox_i5.c b/src/overlays/ovl_i5/fox_i5.c index 339cae6e..dc8eaaf4 100644 --- a/src/overlays/ovl_i5/fox_i5.c +++ b/src/overlays/ovl_i5/fox_i5.c @@ -4,5 +4,5 @@ UNK_TYPE D_i5_801BBEE0; s32 D_i5_801B7290 = 0; void func_i5_80187520(u32 mode, void* ptr) { - PRINTF("i5 指定外!\n"); + PRINTF("i5 指定外!\n"); // i5 not specified! } diff --git a/src/overlays/ovl_i5/fox_ti_cs.c b/src/overlays/ovl_i5/fox_ti_cs.c index 601ee0c7..ac8bab4f 100644 --- a/src/overlays/ovl_i5/fox_ti_cs.c +++ b/src/overlays/ovl_i5/fox_ti_cs.c @@ -512,7 +512,7 @@ void func_i5_801882CC(Player* player) { player->camAt.y += camAtY; - if (gCsFrameCount == 0x564) { + if (gCsFrameCount == 1380) { func_800182F4(0x103C00FF); func_800182F4(0x113C00FF); } diff --git a/src/overlays/ovl_i5/sf_i5_4.c b/src/overlays/ovl_i5/sf_i5_4.c index ddbb16ad..310e1a2e 100644 --- a/src/overlays/ovl_i5/sf_i5_4.c +++ b/src/overlays/ovl_i5/sf_i5_4.c @@ -1,27 +1,424 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B49D0.s") +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); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B4A54.s") +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]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B4AA8.s") +// 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; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B5110.s") +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") -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B68A8.s") +void func_i5_801B68A8(Gfx** dlist, s32 arg1, s32 arg2) { + s32 var_a0; + s32 var_a1; + s32 var; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B6AEC.s") + 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") -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/func_i5_801B7240.s") +void func_i5_801B7240(f32 arg0, f32 arg1, f32* arg2, f32* arg3, f32* arg4) { + s32 pad; + f32 sp28; + f32 sp24; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/sf_i5_4/D_i5_801BBDF0.s") + func_i5_801B6E20(arg0, arg1, &sp28, arg3, &sp24); + *arg2 = sp28 * M_RTOD; + *arg4 = sp24 * M_RTOD; +} diff --git a/tools/m2c b/tools/m2c index 05102b12..0514701e 160000 --- a/tools/m2c +++ b/tools/m2c @@ -1 +1 @@ -Subproject commit 05102b12b75400ad2be8bd0872404237b36e1702 +Subproject commit 0514701ef53ce46e91e4e675455c44647714d014