From 431ae096fb54f637be9de539f0413d8029b6a9dc Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:15:25 -0300 Subject: [PATCH] fox_ti_cs decompiled (#83) * A few fox_ti_cs functions * func_i5_8018769C * actor * space * MISSION ACCOMPLISHED * remove padding in data * pass * pr review --- include/functions.h | 5 + src/overlays/ovl_i5/fox_ti_cs.c | 538 +++++++++++++++++++++++++++++++- yamls/us/overlays.yaml | 2 +- 3 files changed, 538 insertions(+), 7 deletions(-) diff --git a/include/functions.h b/include/functions.h index 21ba649e..d27a7800 100644 --- a/include/functions.h +++ b/include/functions.h @@ -145,6 +145,10 @@ void func_8004319C(Player* player, f32 arg1, f32 arg2, f32 arg3); // fox_43E80 void func_80043468(Player* player); void func_800444BC(Player * player); +void func_80044868(Player*); +void func_80045130(Player*); +void func_80045678(Player*); +void func_80045E7C(Player*); void func_80047504(Player * player); void func_80046358(Player*); @@ -521,6 +525,7 @@ s32 Play_CheckMedalStatus(u16); s32 Play_GetMaxShields(void); void func_800A6028(Vec3f*, u32); void func_800A5844(void); +void func_800A594C(void); void func_800A5D6C(void); void func_800A5FA0(Vec3f* , u32 , s32 ); void func_800A6070(Vec3f* arg0, u32 arg1); diff --git a/src/overlays/ovl_i5/fox_ti_cs.c b/src/overlays/ovl_i5/fox_ti_cs.c index 8e2b78df..fdc4aa90 100644 --- a/src/overlays/ovl_i5/fox_ti_cs.c +++ b/src/overlays/ovl_i5/fox_ti_cs.c @@ -1,11 +1,537 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/fox_ti_cs/func_i5_80187530.s") +Vec3f D_i5_801B72A0[] = { 500.0f, -700.0f, 200.0f, -500.0f, -700.0f, 200.0f }; +Vec3f D_i5_801B72B8[] = { 40.0f, 10.0f, 30.0f, 41.0f, 10.0f, 10.0f, 43.0f, 10.0f, -10.0f, 45.0f, 10.0f, -30.0f, + -40.0f, 10.0f, 30.0f, -41.0f, 10.0f, 10.0f, -43.0f, 10.0f, -10.0f, -45.0f, 10.0f, -30.0f }; +f32 D_i5_801B7318[] = { 1000.0f, -1000.0f, 0.0f, 0.0f }; +f32 D_i5_801B7328[] = { 1000.0f, 1000.0f, 1000.0f, 4000.0f }; +f32 D_i5_801B7338[] = { 1000.0f, 1000.0f, 1000.0f, -4000.0f }; +f32 D_i5_801B7348[] = { 90.0f, -90.0f, 0.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/fox_ti_cs/func_i5_801875D0.s") +void func_i5_80187530(Actor* actor) { + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.id = OBJ_ACTOR_195; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/fox_ti_cs/func_i5_8018769C.s") + actor->obj.pos.x = 0.0f; + actor->obj.pos.y = 3000.0f; + actor->obj.pos.z = 0.0f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/fox_ti_cs/func_i5_80188108.s") + actor->obj.rot.y = 180.0f; + Object_SetInfo(&actor->info, actor->obj.id); + Audio_PlaySfx(0x11030010U, &actor->sfxPos, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->unk_0B6 = 1; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i5/fox_ti_cs/func_i5_801882CC.s") +void func_i5_801875D0(Actor* actor, s32 arg1) { + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.id = OBJ_ACTOR_195; + + actor->obj.pos.x = D_i5_801B72A0[arg1].x; + actor->obj.pos.y = D_i5_801B72A0[arg1].y + 3000.0f; + actor->obj.pos.z = D_i5_801B72A0[arg1].z; + + actor->obj.rot.y = 180.0f; + actor->iwork[11] = 1; + Object_SetInfo(&actor->info, actor->obj.id); + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i5_8018769C(Player* player) { + f32 sp64; + Actor* actor = &gActors[3]; + Vec3f sp54; + Vec3f sp48; + + sp64 = 20000.0f; + + switch (player->unk_1D0) { + case 0: + D_80177A80 = 0; + D_80177BAC = 1; + player->unk_0D4 = 0.0f; + + func_i5_80187530(&gActors[3]); + + if (gTeamShields[1] > 0) { + func_i5_801875D0(&gActors[10], 0); + } + + if (gTeamShields[3] > 0) { + func_i5_801875D0(&gActors[11], 1); + } + + player->pos.x = actor->obj.pos.x; + player->pos.y = actor->obj.pos.y - 530.0f; + player->pos.z = actor->obj.pos.z; + + player->camEye.x = D_80177978 = 5000.0f; + player->camEye.y = D_80177980 = 1000.0f; + player->camEye.z = D_80177988 = -5000.0f; + + player->camAt.x = D_801779A0 = player->pos.x; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = player->pos.z; + + player->unk_240 = 1; + player->unk_1D0 = 1; + gFogFar = 1006; + gPlayer->unk_19C = 0; + gBgColor = 0x78C1; + + case 1: + D_80177A48[0] = 0.01f; + sp64 = 20.0f; + D_80177978 = actor->obj.pos.x - 500.0f; + D_80177980 = actor->obj.pos.y - 500.0f; + D_80177988 = actor->obj.pos.z - 750.0f; + + if (D_80177A80 == 330) { + func_800BA808(gMsg_ID_4113, RCID_FOX); + } + + if (D_80177A80 == 430) { + player->unk_1D0 = 2; + player->timer_1F8 = 10; + Audio_PlaySfx(0x09000002U, &player->unk_460, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->pos.z; + break; + + case 2: + Math_SmoothStepToF(&player->vel.z, -10.0f, 1.0f, 1.0f, 0.0f); + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->pos.z; + + if (player->timer_1F8 == 1) { + player->unk_0D4 = 1.0f; + D_80177A48[0] = 0.05f; + } + + if (player->timer_1F8 == 0) { + if (player->unk_0D4 > -0.3f) { + player->unk_0D4 = player->unk_0D4 - 0.05f; + } + } + + if ((D_80177A80 > 450) && (D_80177A80 < 490)) { + Math_SmoothStepToF(&player->unk_170, 2.0f, 1.0f, 0.2f, 0.0f); + Math_SmoothStepToF(&player->unk_16C, 2.0f, 1.0f, 0.2f, 0.0f); + } else { + Math_SmoothStepToF(&player->unk_170, 0.5f, 1.0f, 0.2f, 0.0f); + Math_SmoothStepToF(&player->unk_16C, 0.5f, 1.0f, 0.2f, 0.0f); + } + + if (D_80177A80 == 500) { + D_80177A80 = 480; + + player->unk_1D0 = 3; + player->unk_144 = 200.0f; + + D_80177D20 = 200.0f; + D_80177CC8 = D_80177D20; + + player->pos.z = -(D_80177D20) -200.0f; + player->unk_0D4 = 0.0f; + player->vel.y = 0.0f; + player->pos.y = 2000.0f; + player->vel.z = 0.0f; + + player->camAt.x = D_801779A0 = player->pos.x; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = player->pos.z; + + gPlayer->unk_19C = 1; + + gBgColor = 0x2089; + + player->unk_16C = 0.5f; + player->unk_170 = 0.5f; + + D_80177A48[2] = -270.0f; + D_80177A48[3] = 200.0f; + D_80177A48[1] = 0.0f; + + *D_80177A10 = 0; + + Matrix_RotateY(gCalcMatrix, D_80177A48[2] * M_DTOR, 0); + + sp54.x = 0.0f; + sp54.y = 30.0f; + sp54.z = D_80177A48[3]; + + Matrix_MultVec3f(gCalcMatrix, &sp54, &sp48); + + D_80177978 = sp48.x; + + player->camEye.x = sp48.x; + + D_80177980 = sp48.y; + + player->camEye.y = sp48.y; + player->camEye.z = D_80177988 = player->pos.z + player->unk_144 + sp48.z; + } + break; + + case 3: + Math_SmoothStepToF(&D_80177A48[2], 0.0f, 0.1f, 4.0f, 0.0f); + Matrix_RotateY(gCalcMatrix, D_80177A48[2] * M_DTOR, 0); + + sp54.x = 0.0f; + sp54.y = 30.0f; + sp54.z = D_80177A48[3]; + + Matrix_MultVec3f(gCalcMatrix, &sp54, &sp48); + + D_80177978 = sp48.x; + D_80177980 = sp48.y; + D_80177988 = player->pos.z + player->unk_144 + sp48.z; + D_801779A0 = player->pos.x; + + player->camAt.x = D_801779A0; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = player->pos.z + player->unk_144; + + Math_SmoothStepToF(&player->pos.y, D_80177A48[1], 0.1f, 50.0f, 0.0f); + + if (player->pos.y < 200.0f) { + Math_SmoothStepToF(&player->unk_170, 1.0f, 1.0f, 0.2f, 0.0f); + Math_SmoothStepToF(&player->unk_16C, 1.0f, 1.0f, 0.2f, 0.0f); + Math_SmoothStepToF(&D_80177A48[1], 70.0f, 0.05f, 1.0f, 0.0f); + Math_SmoothStepToF(&D_80177A48[3], 400.0f, 1.0f, 5.0f, 0.0f); + + if (D_80177A10[0] == 0) { + D_80177A10[0]++; + Audio_PlaySfx(0x01008016U, &player->unk_460, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + + if (player->pos.y < 100.0f) { + func_8007A900(((Rand_ZeroOne() - 0.5f) * 30.0f) + player->pos.x, 30.0f, + ((Rand_ZeroOne() - 0.5f) * 30.0f) + player->unk_138, (2.0f * Rand_ZeroOne()) + 3.5f, 255, + 12, 1); + Object_Kill(&gActors[3].obj, &gActors[3].sfxPos); + } + + Math_SmoothStepToF(&player->unk_0F0, __sinf(((gFrameCount) *5.0f) * M_DTOR) * 10.0f, 0.1f, 100.0f, 0.0f); + + if (D_80177A80 == 0x244) { + D_80177838 = 0x32; + player->state_1C8 = PLAYERSTATE_1C8_3; + player->unk_1D0 = player->timer_1F8 = player->timer_1FC = player->unk_240 = 0; + player->unk_0D4 = 3.0f; + player->unk_014 = 0.0f; + D_8017782C = 1; + func_800A594C(); + D_8017782C = 0; + if ((gControllerHold[player->num].button & Z_TRIG) && (gControllerHold[player->num].button & R_TRIG)) { + func_8001A55C(&player->unk_460, 0x01008016); + } + } + break; + } + + player->pos.y += player->vel.y; + player->vel.y -= player->unk_0D4; + player->pos.z += player->vel.z; + player->unk_138 = player->pos.z; + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], sp64, 0.00f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], sp64, 0.00f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], sp64, 0.00f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], sp64, 0.00f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], sp64, 0.00f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], sp64, 0.00f); +} + +void func_i5_80188108(Actor* actor, s32 arg1) { + Player* player = &gPlayer[0]; + + Actor_Initialize(actor); + actor->obj.pos.x = D_i5_801B7318[arg1] + player->pos.x; + actor->obj.pos.y = D_i5_801B7328[arg1] + player->pos.y; + actor->obj.pos.z = D_i5_801B7338[arg1] + player->pos.z; + + actor->fwork[7] = Rand_ZeroOne() * 360.0f; + actor->fwork[8] = Rand_ZeroOne() * 360.0f; + + actor->vel.x = player->vel.x; + actor->vel.y = player->vel.y; + actor->vel.z = player->vel.z; + + actor->obj.status = 1; + actor->obj.id = OBJ_ACTOR_195; + actor->obj.rot.y = 180.0f; + + Object_SetInfo(&actor->info, actor->obj.id); + + if (arg1 < 3) { + actor->iwork[11] = 1; + actor->unk_0C9 = 1; + actor->fwork[3] = D_i5_801B7348[arg1]; + actor->unk_0B8 = 30; + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else { + actor->unk_0B6 = 1; + actor->unk_0B8 = 20; + Audio_PlaySfx(0x11030010U, &actor->sfxPos, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->fwork[9] = 20.0f; + } +} + +void func_i5_801882CC(Player* player) { + f32 x; + f32 camAtY = 0.0f; + Vec3f src; + Vec3f dest; + s32 i; + + switch (player->unk_1D0) { + case 0: + D_80177A80 = D_80178284 = D_80178488 = 0; + + func_800A6148(); + + player->unk_1D0 = 1; + + D_80177A48[0] = 0.0f; + D_80177A48[1] = 0.0f; + D_80177A48[2] = 0.0f; + D_80177A48[3] = 250.0f; + + player->unk_0D4 = 3.0f; + + func_i5_80188108(gActors, 0); + + if (gTeamShields[1] > 0) { + func_i5_80188108(&gActors[1], 1); + } + if (gTeamShields[3] > 0) { + func_i5_80188108(&gActors[2], 2); + } + + func_8001A55C(&player->unk_460_arr[0], 0x01004024U); + + case 1: + Math_SmoothStepToF(D_80177A48, 0.1f, 1.0f, 0.01f, 0.0f); + Math_SmoothStepToF(&player->unk_0D0, 4.9f, 0.1f, 1.0f, 0.0f); + Math_SmoothStepToF(&player->unk_08C, 0.0f, 0.1f, 1.0f, 0.0f); + + if (D_80177A80 < 0x460) { + Math_SmoothStepToF(&D_80177A48[1], 0.65f, 0.1f, 0.01f, 0.0f); + } else { + Math_SmoothStepToF(&D_80177A48[1], 0.0f, 0.1f, 0.02f, 0.0f); + } + + D_80177A48[2] = D_80177A48[1] + D_80177A48[2]; + + Matrix_RotateX(gCalcMatrix, -0.17453292f, 0); + Matrix_RotateY(gCalcMatrix, D_80177A48[2] * M_DTOR, 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = D_80177A48[3]; + + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + D_80177978 = player->pos.x + dest.x; + D_80177980 = player->pos.y + dest.y; + D_80177988 = player->pos.z + player->unk_144 + dest.z + 50.0f; + + if (D_80177980 < 5.0f) { + D_80177980 = 5.0f; + } + + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y + 30.0f; + D_801779C0 = player->pos.z + player->unk_144; + + func_80045130(player); + func_80044868(player); + func_80045678(player); + func_80045E7C(player); + func_800A8BA4(player); + func_800ADF58(player); + + if (!(gFrameCount & 3)) { + f32 x; + f32 y; + f32 z; + + for (i = 0; i < 8; i++) { + x = D_i5_801B72B8[i].x; + y = D_i5_801B72B8[i].y + (Rand_ZeroOne() - 0.5f) * 10.0f; + z = D_i5_801B72B8[i].z; + + func_8007A900(player->pos.x + x, player->pos.y + y, player->unk_138 + z, + (Rand_ZeroOne() * 0.5f) + 0.5f, 255, 21, 0); + } + } + break; + + case 2: + Math_SmoothStepToF(D_80177A48, 0.1f, 1.0f, 0.01f, 0.0f); + D_80177978 -= 2.5f; + D_80177988 -= 1.0f; + + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y + 30.0f; + D_801779C0 = player->pos.z + player->unk_144; + + if (player->pos.y < 100.0f) { + camAtY = __sinf((gFrameCount * 130.0f) * 0.017453292f) * 3.0f; + } + + Math_SmoothStepToF(&player->unk_170, 2.0f, 1.0f, 0.2f, 0.0f); + Math_SmoothStepToF(&player->unk_16C, 2.0f, 1.0f, 0.2f, 0.0f); + + if (D_80177A80 < 1470) { + func_8007A900(((Rand_ZeroOne() - 0.5f) * 30.0f) + (player->pos.x + 30.0f), 30.0f, + ((Rand_ZeroOne() - 0.5f) * 30.0f) + player->unk_138, (2.0f * Rand_ZeroOne()) + 3.5f, 255, + 12, 1); + } + + func_8007A900(((Rand_ZeroOne() - 0.5f) * 30.0f) + (player->pos.x - 30.0f), 30.0f, + ((Rand_ZeroOne() - 0.5f) * 30.0f) + player->unk_138, (2.0f * Rand_ZeroOne()) + 3.5f, 255, 12, + 1); + Math_SmoothStepToF(&player->unk_0F0, __sinf((gFrameCount * 6.0f) * 0.017453292f) * 18.0f, 0.1f, 100.0f, + 0.0f); + Math_SmoothStepToF(&player->unk_080, __sinf((gFrameCount * 3.0f) * 0.017453292f) * 5.0f, 0.1f, 100.0f, + 0.0f); + + x = __sinf((gFrameCount * 4.0f) * 0.017453292f) * -1.5f; + + player->vel.x = x; + player->vel.y += 0.1f; + player->vel.z -= 0.17f; + + player->pos.x += x; + player->pos.y += player->vel.y; + player->pos.z += player->vel.z; + + player->unk_138 = player->pos.z; + break; + } + + switch (D_80177A80) { + case 831: + D_80177830 = 1; + break; + + case 1031: + D_80177830 = 0; + break; + + case 50: + func_8001D444(0U, 0x26U, 0U, 0xFFU); + break; + + case 80: + D_80177840 = 100; + break; + + case 160: + func_800BA808(gMsg_ID_20010, RCID_FOX); + break; + + case 248: + func_800BA808(gMsg_ID_4100, RCID_SLIPPY); + break; + + case 380: + switch (gTeamShields[1]) { + case -1: + func_800BA808(gMsg_ID_20331, RCID_ROB64); + break; + + case 0: + func_800BA808(gMsg_ID_20343, RCID_ROB64); + break; + + default: + func_800BA808(gMsg_ID_4101, RCID_FALCO); + break; + } + + break; + + case 525: + switch (gTeamShields[3]) { + case -1: + func_800BA808(gMsg_ID_20332, RCID_ROB64); + break; + + case 0: + func_800BA808(gMsg_ID_20344, RCID_ROB64); + break; + + default: + func_800BA808(gMsg_ID_4102, RCID_PEPPY); + break; + } + break; + + case 671: + func_800BA808(gMsg_ID_4103, RCID_FOX); + break; + + case 1200: + gActors->unk_0B8++; + break; + + case 1220: + gActors[1].unk_0B8++; + break; + + case 1240: + gActors[2].unk_0B8++; + break; + + case 1280: + gOverlayStage = 5; + break; + + case 1300: + player->unk_1D0++; + D_80177A48[0] = 0.0f; + player->vel.z = 0.0f; + player->vel.y = 0.0f; + func_i5_80188108(&gActors[3], 3); + D_80161A44 = 30000.0f; + player->unk_240 = 1; + func_8001CA24(0); + Audio_PlaySfx(0x01008016U, &player->unk_460, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 20000.0f, 0.00f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 20000.0f, 0.00f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 20000.0f, 0.00f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 20000.0f, 0.00f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 20000.0f, 0.00f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 20000.0f, 0.00f); + + player->camAt.y += camAtY; + + if (D_80177A80 == 0x564) { + func_800182F4(0x103C00FF); + func_800182F4(0x113C00FF); + } + + if (D_80177A80 > 1440) { + D_80178348 = D_80178350 = D_80178354 = 0; + D_80178358 = 255; + + if (D_80178340 == 255) { + player->state_1C8 = PLAYERSTATE_1C8_6; + D_8017837C = 4; + func_800A6148(); + func_8001DBD0(10); + D_800D3180[12] = Play_CheckMedalStatus(150) + 1; + } + } +} diff --git a/yamls/us/overlays.yaml b/yamls/us/overlays.yaml index 3652c1fa..088b8628 100644 --- a/yamls/us/overlays.yaml +++ b/yamls/us/overlays.yaml @@ -117,7 +117,7 @@ - [0xE7CC10, c, fox_ma] - [0xE97CC0, c, E97CC0] - [0xE9A580, .data, fox_i5] - - [0xE9A590, data, fox_ti_cs] + - [0xE9A590, .data, fox_ti_cs] - [0xE9A650, data, fox_ti] - [0xE9DC00, data, E97CC0] - [0xE9DCD0, .rodata, fox_i5]