diff --git a/configure.py b/configure.py index 25c8a8771..612cf9372 100755 --- a/configure.py +++ b/configure.py @@ -1730,7 +1730,7 @@ def EquivalentFor(*versions): ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mknjd"), ActorRel(NonMatching, "d_a_obj_mmrr"), ActorRel(NonMatching, "d_a_obj_msdan"), - ActorRel(NonMatching, "d_a_obj_msdan2"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"),"d_a_obj_msdan2"), ActorRel(NonMatching, "d_a_obj_msdan_sub"), ActorRel(NonMatching, "d_a_obj_msdan_sub2"), ActorRel(Matching, "d_a_obj_mtest"), diff --git a/include/d/actor/d_a_obj_msdan2.h b/include/d/actor/d_a_obj_msdan2.h index 131c27f3c..9eece44e7 100644 --- a/include/d/actor/d_a_obj_msdan2.h +++ b/include/d/actor/d_a_obj_msdan2.h @@ -1,19 +1,44 @@ #ifndef D_A_OBJ_MSDAN2_H #define D_A_OBJ_MSDAN2_H -#include "f_op/f_op_actor.h" +#include "d/d_procname.h" +#include "d/d_priority.h" +#include "d/d_a_obj.h" namespace daObjMsdan2 { class Act_c : public fopAc_ac_c { public: - void prm_get_swSave() const {} - + + enum Prm_e { + PRM_SWSAVE_W = 8, + PRM_SWSAVE_S = 0, + }; + + enum Mode_e { + MODE_WAIT = 0, + MODE_EVENT = 1, + MODE_EVENT_RUNNING= 2, + MODE_DONE = 3, + }; + + int prm_get_swSave() const { + return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); + } + cPhs_State Mthd_Create(); BOOL Mthd_Execute(); BOOL Mthd_Delete(); - - public: - /* Place member variables here */ + + /* 0x1C8 */ u8 field_0x1c8[0x1E2 - sizeof(fopAc_ac_c)]; + /* 0x1E2 */ s8 mSwitchBit; + /* 0x1E3 */ u8 field_0x1e3[0x204 - 0x1E3]; + /* 0x204 */ csXyz mSavedAngle; + /* 0x20A */ s8 mType; + /* 0x20B */ u8 field_0x20b[0x290 - 0x20B]; + /* 0x290 */ u8 field_0x290[0x8]; + /* 0x298 */ s16 mEventIdx; + /* 0x29A */ u8 field_0x29A[0x2]; + /* 0x29C */ s32 mMode; }; }; diff --git a/src/d/actor/d_a_obj_msdan2.cpp b/src/d/actor/d_a_obj_msdan2.cpp index 43db98a2c..9bc11dd40 100644 --- a/src/d/actor/d_a_obj_msdan2.cpp +++ b/src/d/actor/d_a_obj_msdan2.cpp @@ -2,29 +2,90 @@ // Generated by dtk // Translation Unit: d_a_obj_msdan2.cpp // - #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_msdan2.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_a_obj.h" -/* 00000078-0000024C .text Mthd_Create__Q211daObjMsdan25Act_cFv */ +/* 00000078-000003D4 .text Mthd_Create__Q211daObjMsdan25Act_cFv */ cPhs_State daObjMsdan2::Act_c::Mthd_Create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObjMsdan2::Act_c); + + cXyz pos = current.pos; + csXyz angle = current.angle; + + angle.y += 0x8000; + pos.y += 400.0f; + + for (int i = 0; i < 16; i++) { + pos.x += 50.0f * cM_ssin(current.angle.y); + pos.z += 50.0f * cM_scos(current.angle.y); + + fopAcM_create( + PROC_Obj_MsdanSub2, + prm_get_swSave() + (i << 8), + &pos, + mType, + &angle, + NULL, + -1, + NULL + ); + } + + mEventIdx = dComIfGp_evmng_getEventIdx("Msdan2", 0xff); + + u32 prmCheck = prm_get_swSave(); + if (dComIfGs_isSwitch(prmCheck, mSwitchBit)) { + mMode = MODE_DONE; + } else { + mMode = MODE_WAIT; + } + + return cPhs_COMPLEATE_e; } /* 0000024C-00000344 .text Mthd_Execute__Q211daObjMsdan25Act_cFv */ BOOL daObjMsdan2::Act_c::Mthd_Execute() { - /* Nonmatching */ + int swIdx; + switch (mMode) { + case MODE_WAIT: + swIdx = prm_get_swSave(); + if (fopAcM_isSwitch(this,swIdx)) { + fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 0, 1); + mMode = MODE_EVENT; + } + break; + + case MODE_EVENT: + if (eventInfo.checkCommandDemoAccrpt()) { + mMode = MODE_EVENT_RUNNING; + } + break; + + case MODE_EVENT_RUNNING: + if (dComIfGp_evmng_endCheck(mEventIdx)) { + dComIfGp_event_reset(); + mMode = MODE_DONE; + } + break; + + case MODE_DONE: break; + + } + + return TRUE; } /* 00000344-0000034C .text Mthd_Delete__Q211daObjMsdan25Act_cFv */ BOOL daObjMsdan2::Act_c::Mthd_Delete() { - /* Nonmatching */ + return TRUE; } namespace daObjMsdan2 { namespace { + /* 0000034C-0000036C .text Mthd_Create__Q211daObjMsdan228@unnamed@d_a_obj_msdan2_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daObjMsdan2::Act_c*)i_this)->Mthd_Create();