diff --git a/include/functions_overlay.h b/include/functions_overlay.h index 3be2690d35..5ca660fe98 100644 --- a/include/functions_overlay.h +++ b/include/functions_overlay.h @@ -3910,7 +3910,7 @@ void func_8096A6F4(void); // func_8096A6F4 void EnJs_Update(void); // func_8096A8A4 void func_8096A9F4(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // func_8096A9F4 void EnJs_Draw(void); // func_8096AB20 -void func_8096B0A0(void); // func_8096B0A0 +void EnOkarinaEffect_SetupAction(void); // func_8096B0A0 void EnOkarinaEffect_Destroy(void); // func_8096B0AC void EnOkarinaEffect_Init(void); // func_8096B0BC void func_8096B104(void); // func_8096B104 diff --git a/include/variables.h b/include/variables.h index feb79205be..2fbc0a96e8 100644 --- a/include/variables.h +++ b/include/variables.h @@ -3979,7 +3979,7 @@ extern UNK_TYPE1 D_801F4E5C; // D_801F4E5C extern UNK_TYPE1 D_801F4E60; // D_801F4E60 extern UNK_TYPE1 D_801F4E64; // D_801F4E64 extern UNK_TYPE1 D_801F4E68; // D_801F4E68 -extern UNK_TYPE1 D_801F4E70; // D_801F4E70 +extern f32 D_801F4E70; // D_801F4E70 extern UNK_TYPE1 D_801F4E74; // D_801F4E74 extern UNK_TYPE1 D_801F4E78; // D_801F4E78 extern UNK_TYPE1 D_801F4E7A; // D_801F4E7A diff --git a/include/z64.h b/include/z64.h index 06d67c6207..c63692c4b0 100644 --- a/include/z64.h +++ b/include/z64.h @@ -955,7 +955,8 @@ typedef struct { /* 0xEF */ UNK_TYPE1 unkEF; /* 0xF0 */ UNK_TYPE1 unkF0; /* 0xF1 */ UNK_TYPE1 unkF1; -} KankyoContext; // size = 0xF4 + /* 0xF2 */ u8 unkF2[0xC]; +} KankyoContext; // size = 0xFE typedef struct { /* 0x00000 */ View view; @@ -966,7 +967,9 @@ typedef struct { /* 0x11F04 */ u16 unk11F04; /* 0x11F06 */ UNK_TYPE1 pad11F06[0x4]; /* 0x11F0A */ u8 unk11F0A; - /* 0x11F0B */ UNK_TYPE1 pad11F0B[0x17]; + /* 0x11F0B */ UNK_TYPE1 pad11F0B[0x5]; + /* 0x11F10 */ s32 unk11F10; + /* 0x11F11 */ UNK_TYPE1 pad11F11[0xD]; /* 0x11F22 */ u8 unk11F22; /* 0x11F23 */ UNK_TYPE1 pad11F23[0xFD]; /* 0x12020 */ u8 unk12020; @@ -1616,7 +1619,6 @@ struct GlobalContext { /* 0x17000 */ u16 unk17000; /* 0x17002 */ UNK_TYPE1 pad17002[0x2]; /* 0x17004 */ KankyoContext kankyoContext; - /* 0x170F8 */ UNK_TYPE1 pad170F8[0xC]; /* 0x17104 */ AnimationContext animationCtx; /* 0x17D88 */ SceneContext sceneContext; /* 0x186E0 */ RoomContext roomContext; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 70beb8756c..1311b2e36e 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -2441,8 +2441,9 @@ SECTIONS ovl_En_Okarina_Effect : AT(RomLocation) { build/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.o(.text) - build/asm/ovl_En_Okarina_Effect_data.o(.data) - build/asm/ovl_En_Okarina_Effect_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.o(.data) + build/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.o(.rodata) + build/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c index 42640c97be..4a4d39d208 100644 --- a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c +++ b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.c @@ -8,7 +8,10 @@ void EnOkarinaEffect_Init(Actor* thisx, GlobalContext* globalCtx); void EnOkarinaEffect_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnOkarinaEffect_Update(Actor* thisx, GlobalContext* globalCtx); -/* +void func_8096B104(EnOkarinaEffect* this, GlobalContext* globalCtx); +void func_8096B174(EnOkarinaEffect* this, GlobalContext* globalCtx); +void func_8096B1FC(EnOkarinaEffect* this, GlobalContext* globalCtx); + const ActorInit En_Okarina_Effect_InitVars = { ACTOR_EN_OKARINA_EFFECT, ACTORTYPE_ITEMACTION, @@ -20,18 +23,55 @@ const ActorInit En_Okarina_Effect_InitVars = { (ActorFunc)EnOkarinaEffect_Update, (ActorFunc)NULL }; -*/ -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/func_8096B0A0.asm") +void EnOkarinaEffect_SetupAction(EnOkarinaEffect* this, EnOkarinaEffectActionFunc* actionFunc) { + this->actionFunc = actionFunc; +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/EnOkarinaEffect_Destroy.asm") +void EnOkarinaEffect_Destroy(Actor* thisx, GlobalContext* globalCtx) { +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/EnOkarinaEffect_Init.asm") +void EnOkarinaEffect_Init(Actor* thisx, GlobalContext* globalCtx) { + EnOkarinaEffect* this = THIS; -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/func_8096B104.asm") + if (globalCtx->kankyoContext.unkF2[1]) { + Actor_MarkForDeath(&this->actor); + } + EnOkarinaEffect_SetupAction(&this->actor, func_8096B104); +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/func_8096B174.asm") +void func_8096B104(EnOkarinaEffect* this, GlobalContext* globalCtx) { + this->unk144 = 0x50; + globalCtx->kankyoContext.unkF2[4] = 0x3C; + D_801F4E70 = 501.0f; + globalCtx->kankyoContext.unkE3 = 2; + func_800FD78C(globalCtx); + EnOkarinaEffect_SetupAction(this, func_8096B174); +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/func_8096B1FC.asm") +void func_8096B174(EnOkarinaEffect* this, GlobalContext* globalCtx) { + DECR(this->unk144); + if (!globalCtx->unk16D30.unk1EC && !globalCtx->unk17000 && !globalCtx->msgCtx.unk11F10 && + !func_8016A01C(globalCtx) && this->unk144 == 0) { + EnOkarinaEffect_SetupAction(this, func_8096B1FC); + } +} -GLOBAL_ASM("asm/non_matchings/ovl_En_Okarina_Effect_0x8096B0A0/EnOkarinaEffect_Update.asm") +void func_8096B1FC(EnOkarinaEffect* this, GlobalContext* globalCtx) { + if (globalCtx->kankyoContext.unkF2[4]) { + if ((globalCtx->state.frames & 3) == 0) { + --globalCtx->kankyoContext.unkF2[4]; + if (globalCtx->kankyoContext.unkF2[4] == 8) { + func_800FD858(globalCtx); + } + } + } else { + Actor_MarkForDeath(&this->actor); + } +} + +void EnOkarinaEffect_Update(Actor* thisx, GlobalContext* globalCtx) { + EnOkarinaEffect* this = THIS; + + this->actionFunc(this, globalCtx); +} diff --git a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.h b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.h index ccf36394b6..1d0b3f7ffd 100644 --- a/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.h +++ b/src/overlays/actors/ovl_En_Okarina_Effect/z_en_okarina_effect.h @@ -5,9 +5,13 @@ struct EnOkarinaEffect; +typedef void (*EnOkarinaEffectActionFunc)(struct ArmsHook*, GlobalContext*); + typedef struct EnOkarinaEffect { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x8]; + /* 0x144 */ u16 unk144; + /* 0x146 */ u16 unk146; + /* 0x148 */ EnOkarinaEffectActionFunc actionFunc; } EnOkarinaEffect; // size = 0x14C extern const ActorInit En_Okarina_Effect_InitVars; diff --git a/tables/functions.txt b/tables/functions.txt index 3866e0016b..5b5315cb77 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -7932,7 +7932,7 @@ 0x8096A8A4:("EnJs_Update",), 0x8096A9F4:("func_8096A9F4",), 0x8096AB20:("EnJs_Draw",), - 0x8096B0A0:("func_8096B0A0",), + 0x8096B0A0:("EnOkarinaEffect_SetupAction",), 0x8096B0AC:("EnOkarinaEffect_Destroy",), 0x8096B0BC:("EnOkarinaEffect_Init",), 0x8096B104:("func_8096B104",),