diff --git a/assets/xml/objects/object_kamejima.xml b/assets/xml/objects/object_kamejima.xml index 9b45ad4789..425e4643d0 100644 --- a/assets/xml/objects/object_kamejima.xml +++ b/assets/xml/objects/object_kamejima.xml @@ -1,5 +1,8 @@  + + + diff --git a/spec b/spec index 4b1978d38f..90bf986e5b 100644 --- a/spec +++ b/spec @@ -4501,9 +4501,7 @@ beginseg name "ovl_Eff_Kamejima_Wave" compress include "build/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.o" - include "build/data/ovl_Eff_Kamejima_Wave/ovl_Eff_Kamejima_Wave.data.o" - include "build/data/ovl_Eff_Kamejima_Wave/ovl_Eff_Kamejima_Wave.bss.o" - include "build/data/ovl_Eff_Kamejima_Wave/ovl_Eff_Kamejima_Wave.reloc.o" + include "build/src/overlays/actors/ovl_Eff_Kamejima_Wave/ovl_Eff_Kamejima_Wave_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c index f644ad9dca..83842569fe 100644 --- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c +++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.c @@ -5,6 +5,7 @@ */ #include "z_eff_kamejima_wave.h" +#include "objects/object_kamejima/object_kamejima.h" #define FLAGS (ACTOR_FLAG_10) @@ -13,8 +14,14 @@ void EffKamejimaWave_Init(Actor* thisx, PlayState* play); void EffKamejimaWave_Destroy(Actor* thisx, PlayState* play); void EffKamejimaWave_Update(Actor* thisx, PlayState* play); +void EffKamejimaWave_Draw(Actor* thisx, PlayState* play); + +void func_80BCEC6C(EffKamejimaWave* this, PlayState* play); +void func_80BCEDE0(EffKamejimaWave* this, PlayState* play); +void func_80BCEBC0(EffKamejimaWave* this, PlayState* play); +void func_80BCED34(EffKamejimaWave* this, PlayState* play); +void EffKamejimaWave_SetVtxAlpha(u8 alpha); -#if 0 const ActorInit Eff_Kamejima_Wave_InitVars = { ACTOR_EFF_KAMEJIMA_WAVE, ACTORCAT_ITEMACTION, @@ -27,26 +34,138 @@ const ActorInit Eff_Kamejima_Wave_InitVars = { (ActorFunc)NULL, }; -#endif +static Color_RGBA8 sPrimColors[] = { + { 255, 240, 255, 255 }, { 255, 255, 255, 255 }, { 255, 240, 230, 255 }, { 140, 170, 220, 255 } +}; +static Color_RGBA8 sEnvColors[] = { + { 130, 80, 90, 255 }, { 90, 120, 130, 255 }, { 130, 80, 70, 255 }, { 40, 60, 110, 255 } +}; -extern UNK_TYPE D_06000000; -extern UNK_TYPE D_06000140; -extern UNK_TYPE D_06001AF0; +s16 sVtxAlpha; +AnimatedMaterial* D_80BCF1C4; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/EffKamejimaWave_Init.s") +void EffKamejimaWave_Init(Actor* thisx, PlayState* play) { + EffKamejimaWave* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/EffKamejimaWave_Destroy.s") + Actor_SetScale(&this->actor, 0.2f); + this->actor.scale.y = 0.0f; + if (EFFKAMEJIMAWAVE_GET_F(thisx) == EFFKAMEJIMAWAVE_PARAMS_1) { + this->actionFunc = func_80BCEDE0; + sVtxAlpha = 255; + } else { + this->actionFunc = func_80BCEC6C; + sVtxAlpha = 255; + } + D_80BCF1C4 = Lib_SegmentedToVirtual(object_kamejima_Matanimheader_001AF0); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCEBC0.s") +void EffKamejimaWave_Destroy(Actor* thisx, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCEC6C.s") +void func_80BCEBC0(EffKamejimaWave* this, PlayState* play) { + this->actor.scale.y += this->scaleOffset; + this->scaleOffset -= 0.003f; + this->actor.shape.rot.x += 0x64; + if (this->scaleOffset < 0.0f) { + this->actor.scale.x += 0.003f; + } + if (this->scaleOffset < -0.01f) { + this->scaleOffset = -0.01f; + } + if (this->actor.scale.y < 0.0f) { + this->actor.scale.y = 0.0f; + this->actor.scale.x = 0.2f; + this->actionFunc = func_80BCEC6C; + this->actor.draw = NULL; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCED34.s") +void func_80BCEC6C(EffKamejimaWave* this, PlayState* play) { + if (Cutscene_CheckActorAction(play, 0x1E0)) { + Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 0x1E0)); + if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x1E0)]->action == 2) { + this->scaleOffset = 0.05f; + this->actionFunc = func_80BCEBC0; + this->actor.draw = EffKamejimaWave_Draw; + sVtxAlpha = 255; + this->actor.shape.rot.x = 0; + Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_TORTOISE_WAKE_UP); + } + } else { + this->actor.draw = NULL; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCEDE0.s") +void func_80BCED34(EffKamejimaWave* this, PlayState* play) { + this->actor.scale.y += this->scaleOffset; + this->scaleOffset -= 0.002f; + this->actor.shape.rot.x += 0x8C; + if (this->scaleOffset < 0.0f) { + this->actor.scale.x += 0.002f; + } + if (this->scaleOffset < 0.0f) { + this->scaleOffset = 0; + } + if (sVtxAlpha >= 4) { + sVtxAlpha -= 4; + } else { + this->actor.scale.y = 0.0f; + this->actionFunc = func_80BCEDE0; + this->actor.draw = NULL; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/EffKamejimaWave_Update.s") +void func_80BCEDE0(EffKamejimaWave* this, PlayState* play) { + if (Cutscene_CheckActorAction(play, 0x1F6)) { + Cutscene_ActorTranslateAndYaw(&this->actor, play, Cutscene_GetActorActionIndex(play, 0x1F6)); + if (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, 0x1F6)]->action == 2) { + this->scaleOffset = 0.03f; + this->actor.scale.x = 0.35f; + this->actionFunc = func_80BCED34; + this->actor.draw = EffKamejimaWave_Draw; + this->actor.shape.rot.x = 0; + } + } else { + this->actor.draw = NULL; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCEEBC.s") +void EffKamejimaWave_Update(Actor* thisx, PlayState* play) { + EffKamejimaWave* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Eff_Kamejima_Wave/func_80BCEF0C.s") + this->actionFunc(this, play); +} + +void EffKamejimaWave_SetVtxAlpha(u8 alpha) { + Vtx* vtx = Lib_SegmentedToVirtual(&object_kamejima_Vtx_000000); + + vtx[2].v.cn[3] = alpha; + vtx[6].v.cn[3] = alpha; + vtx[8].v.cn[3] = alpha; + vtx[9].v.cn[3] = alpha; + vtx[12].v.cn[3] = alpha; + vtx[16].v.cn[3] = alpha; + vtx[18].v.cn[3] = alpha; + vtx[19].v.cn[3] = alpha; +} + +void EffKamejimaWave_Draw(Actor* thisx, PlayState* play) { + Color_RGBA8 primColor; + Color_RGBA8 envColor; + + func_800FE7A8(sPrimColors, &primColor); + func_800FE7A8(sEnvColors, &envColor); + EffKamejimaWave_SetVtxAlpha(sVtxAlpha); + + OPEN_DISPS(play->state.gfxCtx); + + func_8012C2DC(play->state.gfxCtx); + Matrix_Scale(6.0f, 5.0f, 5.0f, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + AnimatedMat_Draw(play, D_80BCF1C4); + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, primColor.r, primColor.g, primColor.b, 255); + gDPSetEnvColor(POLY_XLU_DISP++, envColor.r, envColor.g, envColor.b, 255); + gSPDisplayList(POLY_XLU_DISP++, object_kamejima_DL_000140); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h index 89f8ccc687..9b4713034c 100644 --- a/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h +++ b/src/overlays/actors/ovl_Eff_Kamejima_Wave/z_eff_kamejima_wave.h @@ -3,16 +3,24 @@ #include "global.h" +#define EFFKAMEJIMAWAVE_GET_F(thisx) ((thisx)->params & 0xF) + struct EffKamejimaWave; typedef void (*EffKamejimaWaveActionFunc)(struct EffKamejimaWave*, PlayState*); typedef struct EffKamejimaWave { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x8]; + /* 0x144 */ f32 scaleOffset; + /* 0x148 */ UNK_TYPE1 pad148[4]; /* 0x14C */ EffKamejimaWaveActionFunc actionFunc; } EffKamejimaWave; // size = 0x150 +typedef enum params { + /* 0x0 */ EFFKAMEJIMAWAVE_PARAMS_0, + /* 0x1 */ EFFKAMEJIMAWAVE_PARAMS_1 +} EffKamejimaWaveParams; + extern const ActorInit Eff_Kamejima_Wave_InitVars; #endif // Z_EFF_KAMEJIMA_WAVE_H diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 66d8be89ca..b8a69680bc 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -15668,8 +15668,8 @@ 0x80BCED34:("func_80BCED34",), 0x80BCEDE0:("func_80BCEDE0",), 0x80BCEE98:("EffKamejimaWave_Update",), - 0x80BCEEBC:("func_80BCEEBC",), - 0x80BCEF0C:("func_80BCEF0C",), + 0x80BCEEBC:("EffKamejimaWave_SetVtxAlpha",), + 0x80BCEF0C:("EffKamejimaWave_Draw",), 0x80BCF1D0:("EnHg_Init",), 0x80BCF328:("EnHg_Destroy",), 0x80BCF354:("func_80BCF354",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index ff6b7a6b94..53849e442a 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -15824,7 +15824,7 @@ 0x80BCF0C0:("D_80BCF0C0","f32","",0x4), 0x80BCF0C4:("D_80BCF0C4","f32","",0x4), 0x80BCF0C8:("D_80BCF0C8","f32","",0x4), - 0x80BCF1C0:("D_80BCF1C0","UNK_TYPE1","",0x1), + 0x80BCF1C0:("sVtxAlpha","UNK_TYPE1","",0x1), 0x80BCF1C1:("D_80BCF1C1","UNK_TYPE1","",0x1), 0x80BCF1C4:("D_80BCF1C4","UNK_TYPE1","",0x1), 0x80BCFF90:("En_Hg_InitVars","UNK_TYPE1","",0x1),