ovl_Bg_Dkjail_Ivy OK (#1014)

* ovl_Bg_Dkjail_Ivy OK

* Co-authored-by: petrie911 petrie911@users.noreply.github.com

* xml

* pr review

* pr review

* pos / vel / accel

* format

* angle

* Update src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c

Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com>

* in-function static

* BgDkjailIvy_SetIdle

* _WaitForCut

* setup

* pr review

* Actor_Kill

Co-authored-by: Anghelo Carvajal <angheloalf95@gmail.com>
Co-authored-by: EllipticEllipsis <elliptic.ellipsis@gmail.com>
This commit is contained in:
Alejandro Asenjo 2022-10-16 00:36:25 -03:00 committed by GitHub
parent 29a7a6714a
commit 62b465b3ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 174 additions and 36 deletions

View File

@ -1,6 +1,6 @@
<Root> <Root>
<File Name="object_dkjail_obj" Segment="6"> <File Name="object_dkjail_obj" Segment="6">
<DList Name="object_dkjail_obj_DL_000080" Offset="0x80" /> <DList Name="gDkjailIvyDL" Offset="0x80" />
<DList Name="object_dkjail_obj_DL_000150" Offset="0x150" /> <DList Name="object_dkjail_obj_DL_000150" Offset="0x150" />
<Texture Name="object_dkjail_obj_Tex_000158" OutName="tex_000158" Format="rgba16" Width="32" Height="32" Offset="0x158" /> <Texture Name="object_dkjail_obj_Tex_000158" OutName="tex_000158" Format="rgba16" Width="32" Height="32" Offset="0x158" />
<Texture Name="object_dkjail_obj_Tex_000958" OutName="tex_000958" Format="ia8" Width="32" Height="64" Offset="0x958" /> <Texture Name="object_dkjail_obj_Tex_000958" OutName="tex_000958" Format="ia8" Width="32" Height="64" Offset="0x958" />

3
spec
View File

@ -3388,8 +3388,7 @@ beginseg
name "ovl_Bg_Dkjail_Ivy" name "ovl_Bg_Dkjail_Ivy"
compress compress
include "build/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.o" include "build/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.o"
include "build/data/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy.data.o" include "build/src/overlays/actors/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy_reloc.o"
include "build/data/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy.reloc.o"
endseg endseg
beginseg beginseg

View File

@ -5,6 +5,8 @@
*/ */
#include "z_bg_dkjail_ivy.h" #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 #define FLAGS 0x00000000
@ -15,7 +17,13 @@ void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play);
void BgDkjailIvy_Update(Actor* thisx, PlayState* play); void BgDkjailIvy_Update(Actor* thisx, PlayState* play);
void BgDkjailIvy_Draw(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 = { const ActorInit Bg_Dkjail_Ivy_InitVars = {
ACTOR_BG_DKJAIL_IVY, ACTOR_BG_DKJAIL_IVY,
ACTORCAT_BG, ACTORCAT_BG,
@ -28,47 +36,175 @@ const ActorInit Bg_Dkjail_Ivy_InitVars = {
(ActorFunc)BgDkjailIvy_Draw, (ActorFunc)BgDkjailIvy_Draw,
}; };
// static ColliderCylinderInit sCylinderInit = { static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80ADE950 = { {
{ COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, }, COLTYPE_NONE,
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x01000200, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_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 } }, { 20, 80, 0, { 0, 0, 0 } },
}; };
// static InitChainEntry sInitChain[] = { void BgDkjailIvy_IvyCutEffects(BgDkjailIvy* this, PlayState* play) {
static InitChainEntry D_80ADE98C[] = { 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(uncullZoneForward, 4000, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP),
}; };
#endif void BgDkjailIvy_Init(Actor* thisx, PlayState* play) {
s32 pad;
BgDkjailIvy* this = THIS;
extern ColliderCylinderInit D_80ADE950; Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
extern InitChainEntry D_80ADE98C[]; DynaPolyActor_Init(&this->dyna, 0);
Collider_InitCylinder(play, &this->collider);
extern UNK_TYPE D_06000080; if (Flags_GetSwitch(play, BG_DKJAIL_GET_SWITCH(thisx))) {
extern UNK_TYPE D_060011A8; 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);
}

View File

@ -3,15 +3,18 @@
#include "global.h" #include "global.h"
#define BG_DKJAIL_GET_SWITCH(thisx) ((thisx)->params & 0x7F)
struct BgDkjailIvy; struct BgDkjailIvy;
typedef void (*BgDkjailIvyActionFunc)(struct BgDkjailIvy*, PlayState*); typedef void (*BgDkjailIvyActionFunc)(struct BgDkjailIvy*, PlayState*);
typedef struct BgDkjailIvy { typedef struct BgDkjailIvy {
/* 0x000 */ Actor actor; /* 0x000 */ DynaPolyActor dyna;
/* 0x144 */ char unk_144[0x64]; /* 0x15C */ ColliderCylinder collider;
/* 0x1A8 */ BgDkjailIvyActionFunc actionFunc; /* 0x1A8 */ BgDkjailIvyActionFunc actionFunc;
/* 0x1AC */ char unk_1AC[0x4]; /* 0x1AC */ s8 fadeOutTimer;
/* 0x1AD */ u8 alpha;
} BgDkjailIvy; // size = 0x1B0 } BgDkjailIvy; // size = 0x1B0
extern const ActorInit Bg_Dkjail_Ivy_InitVars; extern const ActorInit Bg_Dkjail_Ivy_InitVars;

View File

@ -12330,15 +12330,15 @@
0x80ADD7B4:("func_80ADD7B4",), 0x80ADD7B4:("func_80ADD7B4",),
0x80ADD7CC:("EnSellnuts_TransformLimbDraw",), 0x80ADD7CC:("EnSellnuts_TransformLimbDraw",),
0x80ADD8A4:("EnSellnuts_Draw",), 0x80ADD8A4:("EnSellnuts_Draw",),
0x80ADE230:("func_80ADE230",), 0x80ADE230:("BgDkjailIvy_IvyCutEffects",),
0x80ADE5A4:("BgDkjailIvy_Init",), 0x80ADE5A4:("BgDkjailIvy_Init",),
0x80ADE664:("BgDkjailIvy_Destroy",), 0x80ADE664:("BgDkjailIvy_Destroy",),
0x80ADE6AC:("func_80ADE6AC",), 0x80ADE6AC:("BgDkjailIvy_SetupWaitForCut",),
0x80ADE6C0:("func_80ADE6C0",), 0x80ADE6C0:("BgDkjailIvy_WaitForCut",),
0x80ADE734:("func_80ADE734",), 0x80ADE734:("BgDkjailIvy_SetupCutscene",),
0x80ADE748:("func_80ADE748",), 0x80ADE748:("BgDkjailIvy_BeginCutscene",),
0x80ADE7E0:("func_80ADE7E0",), 0x80ADE7E0:("BgDkjailIvy_SetupFadeOut",),
0x80ADE7F4:("func_80ADE7F4",), 0x80ADE7F4:("BgDkjailIvy_FadeOut",),
0x80ADE850:("BgDkjailIvy_Update",), 0x80ADE850:("BgDkjailIvy_Update",),
0x80ADE874:("BgDkjailIvy_Draw",), 0x80ADE874:("BgDkjailIvy_Draw",),
0x80ADEA70:("ObjVisiblock_Init",), 0x80ADEA70:("ObjVisiblock_Init",),