diff --git a/configure.py b/configure.py index e6154fb68..d6a27ef5a 100644 --- a/configure.py +++ b/configure.py @@ -1321,7 +1321,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_tag_light"), ActorRel(Matching, "d_a_tag_msg"), ActorRel(NonMatching, "d_a_tag_photo"), - ActorRel(NonMatching, "d_a_tag_waterlevel"), + ActorRel(Matching, "d_a_tag_waterlevel"), ActorRel(NonMatching, "d_a_tama"), ActorRel(Matching, "d_a_tbox", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_tpota"), diff --git a/include/d/actor/d_a_tag_waterlevel.h b/include/d/actor/d_a_tag_waterlevel.h index ac22d2308..57d4743a7 100644 --- a/include/d/actor/d_a_tag_waterlevel.h +++ b/include/d/actor/d_a_tag_waterlevel.h @@ -2,22 +2,36 @@ #define D_A_TAG_WATERLEVEL_H #include "f_op/f_op_actor.h" +#include "d/d_a_obj.h" namespace daTagWaterlevel { class Act_c : public fopAc_ac_c { public: - void get_now() {} - void get_state() {} - void prm_get_sch() const {} + enum Prm_e { + PRM_SCH_W = 8, + PRM_SCH_S = 0, + }; + enum State_e { + STATE_1 = 1, + STATE_2 = 2, + }; + + static f32 get_now() { return M_now; } + static State_e get_state() { return M_state; } + inline u8 prm_get_sch() const { return daObj::PrmAbstract(this, PRM_SCH_W, PRM_SCH_S); } s32 _create(); - BOOL _delete(); + bool _delete(); void bgm_proc(); - BOOL _execute(); - BOOL _draw(); - + bool _execute(); + bool _draw(); + + static State_e M_state; + static f32 M_now; + public: - /* Place member variables here */ + /* 0x290 */ f32 field_0x290; + /* 0x294 */ s32 mAction; }; }; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 4049b1f7d..f5c894674 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -2202,6 +2202,10 @@ inline void dComIfGp_event_offEventFlag(s16 flag) { g_dComIfG_gameInfo.play.getEvent().offEventFlag(flag); } +inline BOOL dComIfGp_event_chkEventFlag(s16 flag) { + return g_dComIfG_gameInfo.play.getEvent().chkEventFlag(flag); +} + inline void dComIfGp_event_remove() { g_dComIfG_gameInfo.play.getEvent().remove(); } diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 0adbcb533..d6e83e4f2 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -442,5 +442,6 @@ void dKy_get_seacolor(GXColor* amb, GXColor* dif); cXyz dKy_get_orion_pos(); cXyz dKy_get_hokuto_pos(); void dKy_DayProc(); +u8 dKy_get_schbit(); #endif /* D_KANKYO_D_KANKYO_H */ diff --git a/include/m_Do/m_Do_audio.h b/include/m_Do/m_Do_audio.h index efbf31bf6..9fba62eef 100644 --- a/include/m_Do/m_Do_audio.h +++ b/include/m_Do/m_Do_audio.h @@ -170,4 +170,12 @@ inline void mDoAud_cbPracticeStop() { mDoAud_zelAudio_c::getInterface()->cbPracticeStop(); } +inline void mDoAud_stWaterLevelUp() { + mDoAud_zelAudio_c::getInterface()->stWaterLevelUp(); +} + +inline void mDoAud_stWaterLevelDown() { + mDoAud_zelAudio_c::getInterface()->stWaterLevelDown(); +} + #endif /* M_DO_AUDIO_H */ diff --git a/src/d/actor/d_a_tag_waterlevel.cpp b/src/d/actor/d_a_tag_waterlevel.cpp index 13e41cc08..8b23c880b 100644 --- a/src/d/actor/d_a_tag_waterlevel.cpp +++ b/src/d/actor/d_a_tag_waterlevel.cpp @@ -4,29 +4,158 @@ // #include "d/actor/d_a_tag_waterlevel.h" -#include "dolphin/types.h" +#include "d/d_a_obj.h" +#include "d/d_com_inf_game.h" +#include "d/d_kankyo.h" +#include "d/d_procname.h" +#include "SSystem/SComponent/c_lib.h" -/* 00000078-00000128 .text _create__Q215daTagWaterlevel5Act_cFv */ -s32 daTagWaterlevel::Act_c::_create() { - /* Nonmatching */ -} +namespace daTagWaterlevel { + namespace { + struct Attr_c { + f32 field_0x00; + f32 field_0x04; + f32 field_0x08; + f32 field_0x0c; + }; -/* 00000128-00000130 .text _delete__Q215daTagWaterlevel5Act_cFv */ -BOOL daTagWaterlevel::Act_c::_delete() { - /* Nonmatching */ -} + static const Attr_c L_attr = { + 0.005f, 0.05f, 0.015f, 0.005f, + }; -/* 00000130-000001D8 .text bgm_proc__Q215daTagWaterlevel5Act_cFv */ -void daTagWaterlevel::Act_c::bgm_proc() { - /* Nonmatching */ -} + inline const Attr_c & attr() { return L_attr; } + } -/* 000001D8-00000364 .text _execute__Q215daTagWaterlevel5Act_cFv */ -BOOL daTagWaterlevel::Act_c::_execute() { - /* Nonmatching */ -} + /* 00000078-000001D4 .text _create__Q28daTagRet5Act_cFv */ + s32 Act_c::_create() { + fopAcM_SetupActor(this, Act_c); -/* 00000364-0000036C .text _draw__Q215daTagWaterlevel5Act_cFv */ -BOOL daTagWaterlevel::Act_c::_draw() { - /* Nonmatching */ -} + if ((prm_get_sch() & dKy_get_schbit() & 0xFF)) { + M_now = 1.0f; + } else { + M_now = 0.0f; + } + + field_0x290 = 0.0f; + mAction = 0; + + return cPhs_COMPLEATE_e; + } + + /* 00000128-00000130 .text _delete__Q215daTagWaterlevel5Act_cFv */ + bool Act_c::_delete() { + return true; + } + + /* 00000130-000001D8 .text bgm_proc__Q215daTagWaterlevel5Act_cFv */ + void Act_c::bgm_proc() { + if (cLib_checkBit(get_state(), STATE_1)) { + if (get_now() > 0.95f && mAction != 1) { + mAction = 1; + mDoAud_stWaterLevelUp(); + } + } else { + if (get_now() < 0.05f && mAction != 2) { + mAction = 2; + mDoAud_stWaterLevelDown(); + } + } + } + + /* 000001D8-00000364 .text _execute__Q215daTagWaterlevel5Act_cFv */ + bool Act_c::_execute() { + f32 target; + u8 prm_sch = prm_get_sch(); + u8 sch_bit = dKy_get_schbit(); + cLib_offBit(M_state, STATE_2); + + if ((prm_sch & sch_bit & 0xFF)) { + target = 1.0f; + if (!cLib_checkBit(get_state(), STATE_1)) { + cLib_onBit(M_state, STATE_2); + cLib_onBit(M_state, STATE_1); + } + } else { + target = 0.0f; + if (cLib_checkBit(get_state(), STATE_1)) { + cLib_onBit(M_state, STATE_2); + cLib_offBit(M_state, STATE_1); + } + } + + if (dComIfGp_event_runCheck() && dComIfGp_event_chkEventFlag(2)) { + if (get_now() < 0.5f) { + M_now = 0.0f; + } else { + M_now = 1.0f; + } + } else { + if (fabsf(target - get_now()) < attr().field_0x0c) { + M_now = target; + field_0x290 = 0.0f; + } else { + field_0x290 += attr().field_0x00; + if (field_0x290 > attr().field_0x08) + field_0x290 = attr().field_0x08; + if (field_0x290 < attr().field_0x0c) + field_0x290 = attr().field_0x0c; + cLib_addCalc(&M_now, target, attr().field_0x04, field_0x290, attr().field_0x0c); + } + } + + bgm_proc(); + return true; + } + + /* 00000364-0000036C .text _draw__Q215daTagWaterlevel5Act_cFv */ + bool Act_c::_draw() { + return true; + } + + namespace { + s32 Mthd_Create(void* i_this) { + return ((Act_c*)i_this)->_create(); + } + + BOOL Mthd_Delete(void* i_this) { + return ((Act_c*)i_this)->_delete(); + } + + BOOL Mthd_Execute(void* i_this) { + return ((Act_c*)i_this)->_execute(); + } + + BOOL Mthd_Draw(void* i_this) { + return ((Act_c*)i_this)->_draw(); + } + + BOOL Mthd_IsDelete(void* i_this) { + return TRUE; + } + + static actor_method_class Mthd_Table = { + (process_method_func)Mthd_Create, + (process_method_func)Mthd_Delete, + (process_method_func)Mthd_Execute, + (process_method_func)Mthd_IsDelete, + (process_method_func)Mthd_Draw, + }; + }; +}; + +actor_process_profile_definition g_profile_Tag_Waterlevel = { + /* LayerID */ fpcLy_CURRENT_e, + /* ListID */ 9, + /* ListPrio */ fpcLy_CURRENT_e, + /* ProcName */ PROC_Tag_Waterlevel, + /* Proc SubMtd */ &g_fpcLf_Method.mBase, + /* Size */ sizeof(daTagWaterlevel::Act_c), + /* SizeOther */ 0, + /* Parameters */ 0, + /* Leaf SubMtd */ &g_fopAc_Method.base, + /* Priority */ 0x0128, + /* Actor SubMtd */ &daTagWaterlevel::Mthd_Table, + /* Status */ fopAcStts_UNK40000_e | fopAcStts_CULL_e, + /* Group */ fopAc_ACTOR_e, + /* CullType */ fopAc_CULLBOX_0_e, +}; diff --git a/src/d/d_com_static.cpp b/src/d/d_com_static.cpp index a151ee443..db47f5303 100644 --- a/src/d/d_com_static.cpp +++ b/src/d/d_com_static.cpp @@ -15,6 +15,7 @@ #include "d/actor/d_a_obj_movebox.h" #include "d/actor/d_a_tag_kb_item.h" #include "d/actor/d_a_item.h" +#include "d/actor/d_a_tag_waterlevel.h" #include "d/actor/d_a_title.h" #include "d/d_procname.h" #include "d/actor/d_a_npc_kamome.h" @@ -37,6 +38,9 @@ f32 daObjPirateship::getShipOffsetY(s16* param_1, s16* param_2, f32 param_3) { return param_3 * cM_ssin(*param_1); } +f32 daTagWaterlevel::Act_c::M_now; +u32 daTagWaterlevel::Act_c::M_state; + daAgb_c::daAgb_Flags daAgb_c::mFlags; u8 daAgbsw0_c::mFigureDispose; u8 daAgbsw0_c::mFigureBeat;