diff --git a/spec b/spec index 3959b14b72..6235e8f526 100644 --- a/spec +++ b/spec @@ -1400,8 +1400,7 @@ endseg beginseg name "ovl_Bg_Spot05_Soko" include "build/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.o" - include "build/data/overlays/actors/z_bg_spot05_soko.data.o" - include "build/data/overlays/actors/z_bg_spot05_soko.reloc.o" + include "build/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c b/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c index 6155326378..d0bb19a5ba 100644 --- a/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c +++ b/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.c @@ -1,14 +1,25 @@ +/* + * File: z_bg_spot05_soko.c + * Overlay: ovl_Bg_Spot05_Soko + * Description: Sacred Forest Meadow Entities + */ + #include "z_bg_spot05_soko.h" #define ROOM 0x00 #define FLAGS 0x00000000 -void BgSpot05Soko_Init(BgSpot05Soko* this, GlobalContext* globalCtx); -void BgSpot05Soko_Destroy(BgSpot05Soko* this, GlobalContext* globalCtx); -void BgSpot05Soko_Update(BgSpot05Soko* this, GlobalContext* globalCtx); -void BgSpot05Soko_Draw(BgSpot05Soko* this, GlobalContext* globalCtx); +static void BgSpot05Soko_Init(BgSpot05Soko* this, GlobalContext* globalCtx); +static void BgSpot05Soko_Destroy(BgSpot05Soko* this, GlobalContext* globalCtx); +static void BgSpot05Soko_Update(BgSpot05Soko* this, GlobalContext* globalCtx); +static void BgSpot05Soko_Draw(BgSpot05Soko* this, GlobalContext* globalCtx); +static void func_808AE5A8(BgSpot05Soko* this, GlobalContext* globalCtx); +static void func_808AE5B4(BgSpot05Soko* this, GlobalContext* globalCtx); +static void func_808AE630(BgSpot05Soko* this, GlobalContext* globalCtx); + +extern Gfx* D_060012C0; +extern Gfx* D_06000918; -/* const ActorInit Bg_Spot05_Soko_InitVars = { ACTOR_BG_SPOT05_SOKO, ACTORTYPE_PROP, @@ -21,17 +32,78 @@ const ActorInit Bg_Spot05_Soko_InitVars = { (ActorFunc)BgSpot05Soko_Update, (ActorFunc)BgSpot05Soko_Draw, }; -*/ -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/BgSpot05Soko_Init.s") -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/BgSpot05Soko_Destroy.s") +static InitChainEntry initChain[] = { + ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/func_808AE5A8.s") +static Gfx* dListTbl[] = { + 0x06000840, + 0x06001190, + NULL, +}; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/func_808AE5B4.s") +static void BgSpot05Soko_Init(BgSpot05Soko* this, GlobalContext* globalCtx) { -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/func_808AE630.s") + Actor* thisx = &this->dyna.actor; + u32 sp24[2]; + sp24[0] = 0; + Actor_ProcessInitChain(thisx, initChain); + this->switchFlag = (thisx->params >> 8) & 0xFF; + thisx->params &= 0xFF; + DynaPolyInfo_SetActorMove(thisx, DPM_UNK); + if (thisx->params == 0) { + DynaPolyInfo_Alloc(&D_06000918, &sp24); + if (LINK_IS_ADULT) { + Actor_Kill(thisx); + } else { + this->actionFunc = &func_808AE5A8; + } + } else { + DynaPolyInfo_Alloc(&D_060012C0, &sp24); + if (Flags_GetSwitch(globalCtx, this->switchFlag) != 0) { + Actor_Kill(thisx); + } else { + this->actionFunc = &func_808AE5B4; + thisx->flags |= 0x10; + } + } + this->dyna.dynaPolyId = DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, thisx, sp24[0]); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/BgSpot05Soko_Update.s") +static void BgSpot05Soko_Destroy(BgSpot05Soko* this, GlobalContext* globalCtx) { + DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Bg_Spot05_Soko/BgSpot05Soko_Draw.s") +static void func_808AE5A8(BgSpot05Soko* this, GlobalContext* globalCtx) { +} + +static void func_808AE5B4(BgSpot05Soko* this, GlobalContext* globalCtx) { + Actor* thisx = &this->dyna.actor; + if (Flags_GetSwitch(globalCtx, this->switchFlag)) { + Audio_PlaySoundAtPosition(globalCtx, &thisx->posRot.pos, 0x1E, NA_SE_EV_METALDOOR_CLOSE); + Actor_SetHeight(thisx, 50.0f); + func_80080480(globalCtx, thisx); + this->actionFunc = &func_808AE630; + thisx->speedXZ = 0.5f; + } +} + +static void func_808AE630(BgSpot05Soko* this, GlobalContext* globalCtx) { + Actor* thisx = &this->dyna.actor; + + thisx->speedXZ *= 1.5f; + if (Math_ApproxF(&thisx->posRot.pos.y, thisx->initPosRot.pos.y - 120.0f, thisx->speedXZ) != 0) { + Actor_Kill(thisx); + } +} + +static void BgSpot05Soko_Update(BgSpot05Soko* this, GlobalContext* globalCtx) { + Actor* thisx = &this->dyna.actor; + this->actionFunc(thisx, globalCtx); +} + +extern Gfx* D_808AE724[]; +static void BgSpot05Soko_Draw(BgSpot05Soko* this, GlobalContext* globalCtx) { + Gfx_DrawDListOpa(globalCtx, dListTbl[this->dyna.actor.params]); +} diff --git a/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.h b/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.h index b54c3899b9..bea4a9f338 100644 --- a/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.h +++ b/src/overlays/actors/ovl_Bg_Spot05_Soko/z_bg_spot05_soko.h @@ -5,8 +5,9 @@ #include typedef struct { - /* 0x0000 */ Actor actor; - /* 0x014C */ char unk_14C[0x20]; + /* 0x0000 */ DynaPolyActor dyna; + /* 0x0164 */ ActorFunc actionFunc; + /* 0x0168 */ s32 switchFlag; } BgSpot05Soko; // size = 0x016C extern const ActorInit Bg_Spot05_Soko_InitVars; diff --git a/undefined_syms.txt b/undefined_syms.txt index d4e050db8d..b7d74fd5cf 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -467,4 +467,8 @@ link_animetion_segment = 0x07000000; // z_en_ds D_06004768 = 0x06004768; -D_0600039C = 0x0600039C; \ No newline at end of file +D_0600039C = 0x0600039C; + +// z_bg_spot05_soko +D_06000918 = 0x06000918; +D_060012C0 = 0x060012C0; \ No newline at end of file