En_Fu_Kago (#729)

* En_Fu_Kago

* PR
This commit is contained in:
Maide
2022-03-27 15:36:59 +01:00
committed by GitHub
parent 9e13859495
commit 9e230005b0
5 changed files with 374 additions and 39 deletions
+1 -2
View File
@@ -3512,8 +3512,7 @@ beginseg
name "ovl_En_Fu_Kago"
compress
include "build/src/overlays/actors/ovl_En_Fu_Kago/z_en_fu_kago.o"
include "build/data/ovl_En_Fu_Kago/ovl_En_Fu_Kago.data.o"
include "build/data/ovl_En_Fu_Kago/ovl_En_Fu_Kago.reloc.o"
include "build/src/overlays/actors/ovl_En_Fu_Kago/ovl_En_Fu_Kago_reloc.o"
endseg
beginseg
+1
View File
@@ -2,6 +2,7 @@
#define Z_EN_FU_H
#include "global.h"
#include "overlays/actors/ovl_Bg_Fu_Mizu/z_bg_fu_mizu.h"
struct EnFu;
+357 -24
View File
@@ -5,6 +5,9 @@
*/
#include "z_en_fu_kago.h"
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
#include "overlays/actors/ovl_En_Fu/z_en_fu.h"
#include "objects/object_fu_mato/object_fu_mato.h"
#define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20)
@@ -15,7 +18,15 @@ void EnFuKago_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnFuKago_Update(Actor* thisx, GlobalContext* globalCtx);
void EnFuKago_Draw(Actor* thisx, GlobalContext* globalCtx);
#if 0
void func_80ACF994(EnFuKago* this);
void func_80ACF9A8(EnFuKago* this, GlobalContext* globalCtx);
void func_80ACF9DC(EnFuKago* this);
void func_80ACF9FC(EnFuKago* this, GlobalContext* globalCtx);
void func_80ACFA78(EnFuKago* this, GlobalContext* globalCtx);
void func_80AD0028(EnFuKago* this, GlobalContext* globalCtx);
void func_80AD0274(EnFuKago* this);
void func_80AD0288(EnFuKago* this, GlobalContext* globalCtx);
const ActorInit En_Fu_Kago_InitVars = {
ACTOR_EN_FU_KAGO,
ACTORCAT_BG,
@@ -28,46 +39,368 @@ const ActorInit En_Fu_Kago_InitVars = {
(ActorFunc)EnFuKago_Draw,
};
// static ColliderSphereInit sSphereInit = {
static ColliderSphereInit D_80AD05F0 = {
{ COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_SPHERE, },
{ ELEMTYPE_UNK4, { 0xF7CFFFFF, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, },
static ColliderSphereInit sSphereInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_NONE,
OC1_ON | OC1_NO_PUSH | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_SPHERE,
},
{
ELEMTYPE_UNK4,
{ 0xF7CFFFFF, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_ON,
},
{ 0, { { 0, 0, 0 }, 200 }, 100 },
};
#endif
Gfx* D_80AD061C[] = {
object_fu_mato_DL_0006A0, object_fu_mato_DL_000740, object_fu_mato_DL_0007E0,
object_fu_mato_DL_000880, object_fu_mato_DL_000920, object_fu_mato_DL_0009C0,
};
extern ColliderSphereInit D_80AD05F0;
Vec3f D_80AD0634[] = {
{ -1.0f, 0.5f, 1.73f }, { 1.0f, 0.5f, 1.73f }, { 2.0f, 0.5f, 0.0f },
{ 1.0f, 0.5f, -1.73f }, { -1.0f, 0.5f, -1.73f }, { -2.0f, 0.5f, 0.0f },
};
extern UNK_TYPE D_060006A0;
extern UNK_TYPE D_060015C0;
Vec3f D_80AD067C[] = {
{ -0.5f, 0.5f, 0.87f }, { 0.5f, 0.5f, 0.87f }, { 1.0f, 0.5f, 0.0f },
{ 0.5f, 0.5f, -0.87f }, { -0.5f, 0.5f, -0.87f }, { -1.0f, 0.5f, 0.0f },
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/EnFuKago_Init.s")
Vec3f D_80AD06C4[] = {
{ -13.7f, 9.0f, 15.5f }, { 13.7f, 9.0f, 15.5f }, { 13.7f, 9.0f, 0.0f },
{ 13.7f, 9.0f, -15.5f }, { -13.7f, 9.0f, -15.5f }, { -13.7f, 9.0f, 0.0f },
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/EnFuKago_Destroy.s")
void EnFuKago_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnFuKago* this = THIS;
CollisionHeader* sp34 = NULL;
Actor* npc = globalCtx->actorCtx.actorLists[ACTORCAT_NPC].first;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACF8B8.s")
DynaPolyActor_Init(&this->dyna, 1);
CollisionHeader_GetVirtual(&object_fu_mato_Colheader_0015C0, &sp34);
this->dyna.bgId = DynaPoly_SetBgActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, sp34);
Actor_SetScale(&this->dyna.actor, 0.1f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACF994.s")
while (npc != NULL) {
if (npc->id == ACTOR_EN_FU) {
this->dyna.actor.parent = npc;
break;
}
npc = npc->next;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACF9A8.s")
if (npc == NULL) {
Actor_MarkForDeath(&this->dyna.actor);
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACF9DC.s")
Collider_InitSphere(globalCtx, &this->collider);
Collider_SetSphere(globalCtx, &this->collider, &this->dyna.actor, &sSphereInit);
this->collider.dim.worldSphere.radius = 10;
this->unk_33A = 0;
this->unk_33C = 0;
this->dyna.actor.colChkInfo.health = 1;
func_80ACF994(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACF9FC.s")
void EnFuKago_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnFuKago* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACFA78.s")
DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80ACFDAC.s")
s32 func_80ACF8B8(EnFuKago* this, GlobalContext* globalCtx) {
this->collider.dim.worldSphere.center.x = this->dyna.actor.world.pos.x;
this->collider.dim.worldSphere.center.y = this->dyna.actor.world.pos.y + 10.0f;
this->collider.dim.worldSphere.center.z = this->dyna.actor.world.pos.z;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80AD0028.s")
if (this->collider.base.ocFlags1 & OC1_HIT) {
this->collider.base.ocFlags1 &= ~OC1_HIT;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80AD0274.s")
if (this->collider.base.oc->id == ACTOR_EN_BOM) {
this->dyna.actor.child = this->collider.base.oc;
} else if (this->collider.base.oc->id == ACTOR_PLAYER) {
func_80ACFA78(this, globalCtx);
return false;
} else {
return false;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80AD0288.s")
Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_SY_TRE_BOX_APPEAR);
return true;
} else {
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
return false;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/EnFuKago_Update.s")
void func_80ACF994(EnFuKago* this) {
this->actionFunc = func_80ACF9A8;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/func_80AD0340.s")
void func_80ACF9A8(EnFuKago* this, GlobalContext* globalCtx) {
if (func_80ACF8B8(this, globalCtx)) {
func_80ACF9DC(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fu_Kago/EnFuKago_Draw.s")
void func_80ACF9DC(EnFuKago* this) {
EnBom* bom = (EnBom*)this->dyna.actor.child;
bom->timer = 20;
this->actionFunc = func_80ACF9FC;
}
void func_80ACF9FC(EnFuKago* this, GlobalContext* globalCtx) {
EnBom* bom = (EnBom*)this->dyna.actor.child;
EnFu* fu = (EnFu*)this->dyna.actor.parent;
if (this->dyna.actor.child->update == NULL) {
this->dyna.actor.child = NULL;
func_80ACF994(this);
} else if (bom->timer == 1) {
fu->unk_548++;
func_80ACFA78(this, globalCtx);
} else {
this->dyna.actor.child->world.pos.x = this->dyna.actor.world.pos.x;
this->dyna.actor.child->world.pos.z = this->dyna.actor.world.pos.z;
}
}
void func_80ACFA78(EnFuKago* this, GlobalContext* globalCtx) {
s32 i;
Vec3f sp98;
Vec3s sp90;
Vec3s sp88 = { 0, 0, 0 };
EnFuKagoStruct* ptr;
s16 y;
this->dyna.actor.colChkInfo.health = 0;
sp98 = this->dyna.actor.world.pos;
sp90 = this->dyna.actor.shape.rot;
ptr = &this->unk_1B8[0];
y = sp90.y;
for (i = 0; i < ARRAY_COUNT(this->unk_1B8); i++) {
ptr->unk_00 = sp98;
ptr->unk_30 = sp88;
ptr->unk_0C.x = (Math_CosS(y) * D_80AD0634[i].x) + (Math_SinS(y) * D_80AD0634[i].z);
ptr->unk_0C.y = D_80AD0634[i].y + Rand_Centered();
ptr->unk_0C.z = (Math_CosS(y) * D_80AD0634[i].z) - (Math_SinS(y) * D_80AD0634[i].x);
ptr->unk_18.x = (Math_CosS(y) * D_80AD067C[i].x) + (Math_SinS(y) * D_80AD067C[i].z);
ptr->unk_18.y = D_80AD067C[i].y;
ptr->unk_18.z = (Math_CosS(y) * D_80AD067C[i].z) - (Math_SinS(y) * D_80AD067C[i].x);
ptr->unk_36.x = (s16)Rand_Next() >> 5;
ptr->unk_36.y = 0;
ptr->unk_36.z = (s16)Rand_Next() >> 5;
ptr->unk_24.x = D_80AD06C4[i].x;
ptr->unk_24.y = D_80AD06C4[i].y;
ptr->unk_24.z = D_80AD06C4[i].z;
ptr->unk_3C = 0;
ptr->unk_00.x += 18.0f * ptr->unk_0C.x;
ptr->unk_00.y += 18.0f * ptr->unk_0C.y;
ptr->unk_00.z += 18.0f * ptr->unk_0C.z;
ptr++;
}
this->dyna.actor.freezeTimer = 2;
EffectSsHahen_SpawnBurst(globalCtx, &this->dyna.actor.world.pos, 17.0f, 0, 15, 13, 20, -1, 10, NULL);
this->unk_338 = 60;
this->unk_33A = 1;
Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_WOODBOX_BREAK);
func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
this->actionFunc = func_80AD0028;
}
Vec3f D_80AD0714 = { 0.0f, 0.0f, 0.0f };
void func_80ACFDAC(EnFuKago* this, GlobalContext* globalCtx, EnFuKagoStruct* arg2) {
Vec3f sp34;
f32 temp_f0;
if (arg2->unk_3C == 0) {
if (arg2->unk_00.y < 15.0f) {
sp34 = arg2->unk_00;
sp34.y = 30.0f;
EffectSsGSplash_Spawn(globalCtx, &sp34, NULL, NULL, 0, 800);
EffectSsGRipple_Spawn(globalCtx, &sp34, 250, 650, 0);
arg2->unk_3C = 1;
}
Math_SmoothStepToF(&arg2->unk_18.x, 0.0f, 0.1f, 0.1f, 0.1f);
Math_SmoothStepToF(&arg2->unk_18.y, -1.0f, 0.1f, 0.1f, 0.1f);
Math_SmoothStepToF(&arg2->unk_18.z, 0.0f, 0.1f, 0.1f, 0.1f);
return;
}
temp_f0 = Math_Vec3f_DistXZ(&arg2->unk_00, &D_80AD0714);
arg2->unk_18.y = ((15.0f - arg2->unk_00.y) * 0.1f) - (0.2f * arg2->unk_0C.y);
arg2->unk_18.x = arg2->unk_0C.x * -0.1f;
arg2->unk_18.z = arg2->unk_0C.z * -0.1f;
if (temp_f0 < 190.0f) {
arg2->unk_00.x *= 190.0f / temp_f0;
arg2->unk_00.z *= 190.0f / temp_f0;
}
if (ABS_ALT(arg2->unk_36.x) > 100) {
Math_SmoothStepToS(&arg2->unk_36.x, 0, 0xA, 0x64, 0xA);
}
if (ABS_ALT(arg2->unk_36.z) > 100) {
Math_SmoothStepToS(&arg2->unk_36.z, 0, 0xA, 0x64, 0xA);
}
if ((globalCtx->gameplayFrames % 8) == 0) {
sp34 = arg2->unk_00;
sp34.y = 30.0f;
EffectSsGRipple_Spawn(globalCtx, &sp34, 250, 650, 0);
}
}
void func_80AD0028(EnFuKago* this, GlobalContext* globalCtx) {
EnFuKagoStruct* ptr = this->unk_1B8;
s32 i;
for (i = 0; i < ARRAY_COUNT(this->unk_1B8); i++) {
func_80ACFDAC(this, globalCtx, ptr);
ptr->unk_0C.x += ptr->unk_18.x;
ptr->unk_0C.y += ptr->unk_18.y;
ptr->unk_0C.z += ptr->unk_18.z;
ptr->unk_00.x += ptr->unk_0C.x;
ptr->unk_00.y += ptr->unk_0C.y;
ptr->unk_00.z += ptr->unk_0C.z;
ptr->unk_30.x += ptr->unk_36.x;
ptr->unk_30.y += ptr->unk_36.y;
ptr->unk_30.z += ptr->unk_36.z;
ptr++;
}
if (this->unk_338 == 59) {
this->unk_1B8[3].unk_0C.x *= -1.0f;
this->unk_1B8[3].unk_0C.z *= -1.0f;
this->unk_1B8[4].unk_0C.x *= -1.0f;
this->unk_1B8[4].unk_0C.z *= -1.0f;
} else if (this->unk_338 == 58) {
Vec3f sp34 = this->unk_1B8[5].unk_0C;
this->unk_1B8[5].unk_0C.x = sp34.z;
this->unk_1B8[5].unk_0C.z = -sp34.x;
sp34 = this->unk_1B8[2].unk_0C;
this->unk_1B8[2].unk_0C.x = -sp34.z;
this->unk_1B8[2].unk_0C.z = sp34.x;
this->unk_1B8[5].unk_36.x *= -1;
this->unk_1B8[5].unk_36.y *= -1;
this->unk_1B8[5].unk_36.z *= -1;
this->unk_1B8[2].unk_36.x *= -1;
this->unk_1B8[2].unk_36.y *= -1;
this->unk_1B8[2].unk_36.z *= -1;
} else if (this->unk_338 == 0) {
func_80AD0274(this);
}
this->unk_338--;
}
void func_80AD0274(EnFuKago* this) {
this->actionFunc = func_80AD0288;
}
void func_80AD0288(EnFuKago* this, GlobalContext* globalCtx) {
s32 pad;
Vec3f* scale = &this->dyna.actor.scale;
Math_SmoothStepToF(&scale->x, 0.0f, 0.1f, 0.005f, 0.005f);
scale->z = scale->x;
scale->y = scale->x;
if (scale->x == 0.0f) {
Actor_MarkForDeath(&this->dyna.actor);
}
}
void EnFuKago_Update(Actor* thisx, GlobalContext* globalCtx) {
EnFuKago* this = THIS;
this->actionFunc(this, globalCtx);
if (this->unk_33C == 1) {
func_80AD0274(this);
}
}
void func_80AD0340(EnFuKago* this, GlobalContext* globalCtx) {
s32 pad[2];
EnFuKagoStruct* ptr = &this->unk_1B8[0];
s32 i;
Vec3f* scale = &this->dyna.actor.scale;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
for (i = 0; i < ARRAY_COUNT(D_80AD061C); i++, ptr++) {
Matrix_StatePush();
Matrix_SetStateRotationAndTranslation(ptr->unk_00.x, ptr->unk_00.y, ptr->unk_00.z, &this->dyna.actor.shape.rot);
Matrix_InsertTranslation(ptr->unk_24.x, ptr->unk_24.y, ptr->unk_24.z, MTXMODE_APPLY);
Matrix_InsertRotation(ptr->unk_30.x, ptr->unk_30.y, ptr->unk_30.z, MTXMODE_APPLY);
Matrix_InsertTranslation(-ptr->unk_24.x, -ptr->unk_24.y, -ptr->unk_24.z, MTXMODE_APPLY);
Matrix_Scale(scale->x, scale->y, scale->z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, D_80AD061C[i]);
Matrix_StatePop();
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void EnFuKago_Draw(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnFuKago* this = THIS;
if (this->unk_33A == 0) {
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_0006A0);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_000740);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_0007E0);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_000880);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_000920);
gSPDisplayList(POLY_OPA_DISP++, object_fu_mato_DL_0009C0);
CLOSE_DISPS(globalCtx->state.gfxCtx);
} else {
func_80AD0340(this, globalCtx);
}
}
@@ -7,11 +7,23 @@ struct EnFuKago;
typedef void (*EnFuKagoActionFunc)(struct EnFuKago*, GlobalContext*);
typedef struct {
/* 0x00 */ Vec3f unk_00;
/* 0x0C */ Vec3f unk_0C;
/* 0x18 */ Vec3f unk_18;
/* 0x24 */ Vec3f unk_24;
/* 0x30 */ Vec3s unk_30;
/* 0x36 */ Vec3s unk_36;
/* 0x3C */ s16 unk_3C;
} EnFuKagoStruct; // size = 0x40
typedef struct EnFuKago {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x18];
/* 0x0000 */ DynaPolyActor dyna;
/* 0x015C */ EnFuKagoActionFunc actionFunc;
/* 0x0160 */ char unk_160[0x1DC];
/* 0x0160 */ ColliderSphere collider;
/* 0x01B8 */ EnFuKagoStruct unk_1B8[6];
/* 0x0338 */ s16 unk_338;
/* 0x033A */ s16 unk_33A;
/* 0x033C */ s16 unk_33C;
} EnFuKago; // size = 0x340
-10
View File
@@ -1236,16 +1236,6 @@ D_0600007C = 0x0600007C;
D_0600CFE0 = 0x0600CFE0;
D_06011058 = 0x06011058;
// ovl_En_Fu_Kago
D_060006A0 = 0x060006A0;
D_06000740 = 0x06000740;
D_060007E0 = 0x060007E0;
D_06000880 = 0x06000880;
D_06000920 = 0x06000920;
D_060009C0 = 0x060009C0;
D_060015C0 = 0x060015C0;
// ovl_En_Fu_Mato
D_060023D4 = 0x060023D4;