|
|
|
@@ -5,6 +5,8 @@
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "z_bg_dkjail_ivy.h"
|
|
|
|
|
#include "assets/objects/gameplay_keep/gameplay_keep.h"
|
|
|
|
|
#include "assets/objects/object_dkjail_obj/object_dkjail_obj.h"
|
|
|
|
|
|
|
|
|
|
#define FLAGS 0x00000000
|
|
|
|
|
|
|
|
|
@@ -15,7 +17,13 @@ void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play);
|
|
|
|
|
void BgDkjailIvy_Update(Actor* thisx, PlayState* play);
|
|
|
|
|
void BgDkjailIvy_Draw(Actor* thisx, PlayState* play);
|
|
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
void BgDkjailIvy_SetupWaitForCut(BgDkjailIvy* this);
|
|
|
|
|
void BgDkjailIvy_WaitForCut(BgDkjailIvy* this, PlayState* play);
|
|
|
|
|
void BgDkjailIvy_SetupCutscene(BgDkjailIvy* this);
|
|
|
|
|
void BgDkjailIvy_BeginCutscene(BgDkjailIvy* this, PlayState* play);
|
|
|
|
|
void BgDkjailIvy_SetupFadeOut(BgDkjailIvy* this);
|
|
|
|
|
void BgDkjailIvy_FadeOut(BgDkjailIvy* this, PlayState* play);
|
|
|
|
|
|
|
|
|
|
const ActorInit Bg_Dkjail_Ivy_InitVars = {
|
|
|
|
|
ACTOR_BG_DKJAIL_IVY,
|
|
|
|
|
ACTORCAT_BG,
|
|
|
|
@@ -28,47 +36,175 @@ const ActorInit Bg_Dkjail_Ivy_InitVars = {
|
|
|
|
|
(ActorFunc)BgDkjailIvy_Draw,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// static ColliderCylinderInit sCylinderInit = {
|
|
|
|
|
static ColliderCylinderInit D_80ADE950 = {
|
|
|
|
|
{ COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, },
|
|
|
|
|
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x01000200, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
|
|
|
|
|
static ColliderCylinderInit sCylinderInit = {
|
|
|
|
|
{
|
|
|
|
|
COLTYPE_NONE,
|
|
|
|
|
AT_NONE,
|
|
|
|
|
AC_ON | AC_TYPE_PLAYER,
|
|
|
|
|
OC1_NONE,
|
|
|
|
|
OC2_NONE,
|
|
|
|
|
COLSHAPE_CYLINDER,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
ELEMTYPE_UNK0,
|
|
|
|
|
{ 0x00000000, 0x00, 0x00 },
|
|
|
|
|
{ 0x01000200, 0x00, 0x00 },
|
|
|
|
|
TOUCH_NONE | TOUCH_SFX_NORMAL,
|
|
|
|
|
BUMP_ON,
|
|
|
|
|
OCELEM_NONE,
|
|
|
|
|
},
|
|
|
|
|
{ 20, 80, 0, { 0, 0, 0 } },
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// static InitChainEntry sInitChain[] = {
|
|
|
|
|
static InitChainEntry D_80ADE98C[] = {
|
|
|
|
|
void BgDkjailIvy_IvyCutEffects(BgDkjailIvy* this, PlayState* play) {
|
|
|
|
|
static Gfx* sLeafDlists[] = { gKakeraLeafMiddle, gKakeraLeafTip };
|
|
|
|
|
static s16 sLeafScales[] = { 110, 80, 60, 40 };
|
|
|
|
|
f32 phi_fs0;
|
|
|
|
|
s32 i;
|
|
|
|
|
Vec3f spD4;
|
|
|
|
|
Vec3f pos;
|
|
|
|
|
Vec3f vel;
|
|
|
|
|
Vec3f accel;
|
|
|
|
|
s16 angle;
|
|
|
|
|
|
|
|
|
|
Matrix_RotateYS(this->dyna.actor.home.rot.y, MTXMODE_NEW);
|
|
|
|
|
|
|
|
|
|
for (i = 0, angle = 0; i < 50; i++, angle += 0x4E20) {
|
|
|
|
|
spD4.y = (i * (90.0f / 49.0f)) + 2.0f;
|
|
|
|
|
if (spD4.y < 45.0f) {
|
|
|
|
|
phi_fs0 = ((1.0f / 180.0f) * spD4.y) + 0.75f;
|
|
|
|
|
} else if (spD4.y < 90.0f) {
|
|
|
|
|
phi_fs0 = ((-1.0f / 180.0f) * spD4.y) + 1.25f;
|
|
|
|
|
} else {
|
|
|
|
|
phi_fs0 = ((-1.0f / 30.0f) * spD4.y) + 3.75f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
spD4.x = Math_SinS(angle) * 40.0f * phi_fs0;
|
|
|
|
|
spD4.z = (Rand_ZeroOne() * 6.0f) - 3.0f;
|
|
|
|
|
|
|
|
|
|
Matrix_MultVec3f(&spD4, &pos);
|
|
|
|
|
|
|
|
|
|
vel.x = (Rand_ZeroOne() - 0.5f) + (pos.x * 0.075f);
|
|
|
|
|
vel.y = 2.0f * Rand_ZeroOne();
|
|
|
|
|
vel.z = (Rand_ZeroOne() - 0.5f) + (pos.z * 0.075f);
|
|
|
|
|
|
|
|
|
|
pos.x += this->dyna.actor.world.pos.x;
|
|
|
|
|
pos.y += this->dyna.actor.world.pos.y;
|
|
|
|
|
pos.z += this->dyna.actor.world.pos.z;
|
|
|
|
|
|
|
|
|
|
EffectSsKakera_Spawn(play, &pos, &vel, &pos, -0x82, 0x40, 0x28, 0, 0, sLeafScales[i & 3], 0, 0, 44, -1,
|
|
|
|
|
GAMEPLAY_KEEP, sLeafDlists[(s32)Rand_Next() > 0]);
|
|
|
|
|
|
|
|
|
|
if ((i > 20) && ((i % 2) != 0)) {
|
|
|
|
|
accel.x = (Rand_ZeroOne() - 0.5f) * 0.2f;
|
|
|
|
|
accel.y = (Rand_ZeroOne() * 0.02f) - 0.1f;
|
|
|
|
|
accel.z = (Rand_ZeroOne() - 0.5f) * 0.2f;
|
|
|
|
|
|
|
|
|
|
func_800B12F0(play, &pos, &gZeroVec3f, &accel, ((Rand_Next() >> 26) + 10), (Rand_Next() >> 28), 50);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static InitChainEntry sInitChain[] = {
|
|
|
|
|
ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE),
|
|
|
|
|
ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
|
|
|
|
|
ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_CONTINUE),
|
|
|
|
|
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
void BgDkjailIvy_Init(Actor* thisx, PlayState* play) {
|
|
|
|
|
s32 pad;
|
|
|
|
|
BgDkjailIvy* this = THIS;
|
|
|
|
|
|
|
|
|
|
extern ColliderCylinderInit D_80ADE950;
|
|
|
|
|
extern InitChainEntry D_80ADE98C[];
|
|
|
|
|
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
|
|
|
|
|
DynaPolyActor_Init(&this->dyna, 0);
|
|
|
|
|
Collider_InitCylinder(play, &this->collider);
|
|
|
|
|
|
|
|
|
|
extern UNK_TYPE D_06000080;
|
|
|
|
|
extern UNK_TYPE D_060011A8;
|
|
|
|
|
if (Flags_GetSwitch(play, BG_DKJAIL_GET_SWITCH(thisx))) {
|
|
|
|
|
Actor_Kill(&this->dyna.actor);
|
|
|
|
|
} else {
|
|
|
|
|
DynaPolyActor_LoadMesh(play, &this->dyna, &object_dkjail_obj_Colheader_0011A8);
|
|
|
|
|
Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit);
|
|
|
|
|
Collider_UpdateCylinder(&this->dyna.actor, &this->collider);
|
|
|
|
|
this->alpha = 255;
|
|
|
|
|
BgDkjailIvy_SetupWaitForCut(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE230.s")
|
|
|
|
|
void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play) {
|
|
|
|
|
BgDkjailIvy* this = THIS;
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Init.s")
|
|
|
|
|
DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
|
|
|
|
|
Collider_DestroyCylinder(play, &this->collider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Destroy.s")
|
|
|
|
|
void BgDkjailIvy_SetupWaitForCut(BgDkjailIvy* this) {
|
|
|
|
|
this->actionFunc = BgDkjailIvy_WaitForCut;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE6AC.s")
|
|
|
|
|
void BgDkjailIvy_WaitForCut(BgDkjailIvy* this, PlayState* play) {
|
|
|
|
|
if (this->collider.base.acFlags & AC_HIT) {
|
|
|
|
|
this->collider.base.acFlags &= ~AC_HIT;
|
|
|
|
|
this->dyna.actor.flags |= ACTOR_FLAG_10;
|
|
|
|
|
ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
|
|
|
|
|
BgDkjailIvy_SetupCutscene(this);
|
|
|
|
|
} else {
|
|
|
|
|
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE6C0.s")
|
|
|
|
|
void BgDkjailIvy_SetupCutscene(BgDkjailIvy* this) {
|
|
|
|
|
this->actionFunc = BgDkjailIvy_BeginCutscene;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE734.s")
|
|
|
|
|
void BgDkjailIvy_BeginCutscene(BgDkjailIvy* this, PlayState* play) {
|
|
|
|
|
if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) {
|
|
|
|
|
ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor);
|
|
|
|
|
this->fadeOutTimer = 50;
|
|
|
|
|
func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId);
|
|
|
|
|
Flags_SetSwitch(play, BG_DKJAIL_GET_SWITCH(&this->dyna.actor));
|
|
|
|
|
BgDkjailIvy_IvyCutEffects(this, play);
|
|
|
|
|
Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_GRASS_WALL_BROKEN);
|
|
|
|
|
BgDkjailIvy_SetupFadeOut(this);
|
|
|
|
|
} else {
|
|
|
|
|
ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE748.s")
|
|
|
|
|
void BgDkjailIvy_SetupFadeOut(BgDkjailIvy* this) {
|
|
|
|
|
this->actionFunc = BgDkjailIvy_FadeOut;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE7E0.s")
|
|
|
|
|
void BgDkjailIvy_FadeOut(BgDkjailIvy* this, PlayState* play) {
|
|
|
|
|
if (this->alpha > 8) {
|
|
|
|
|
this->alpha -= 8;
|
|
|
|
|
} else {
|
|
|
|
|
this->alpha = 0;
|
|
|
|
|
this->dyna.actor.draw = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE7F4.s")
|
|
|
|
|
this->fadeOutTimer--;
|
|
|
|
|
if (this->fadeOutTimer <= 0) {
|
|
|
|
|
Actor_Kill(&this->dyna.actor);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Update.s")
|
|
|
|
|
void BgDkjailIvy_Update(Actor* thisx, PlayState* play) {
|
|
|
|
|
BgDkjailIvy* this = THIS;
|
|
|
|
|
|
|
|
|
|
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Draw.s")
|
|
|
|
|
this->actionFunc(this, play);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BgDkjailIvy_Draw(Actor* thisx, PlayState* play) {
|
|
|
|
|
BgDkjailIvy* this = THIS;
|
|
|
|
|
|
|
|
|
|
OPEN_DISPS(play->state.gfxCtx);
|
|
|
|
|
|
|
|
|
|
func_8012C2DC(play->state.gfxCtx);
|
|
|
|
|
|
|
|
|
|
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->alpha);
|
|
|
|
|
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
|
|
|
|
gSPDisplayList(POLY_XLU_DISP++, &gDkjailIvyDL);
|
|
|
|
|
|
|
|
|
|
CLOSE_DISPS(play->state.gfxCtx);
|
|
|
|
|
}
|
|
|
|
|