From 129b6047094c90aa64c56702f2a60b4bfd421192 Mon Sep 17 00:00:00 2001 From: LihMeh Date: Mon, 14 Jul 2025 18:40:32 +0300 Subject: [PATCH] match d_a_obj_mkiek (#806) * match d_a_obj_mkiek - main batch * move alignment byte * match 100% * add nosyminline * introduce a state enum * review changes * Apply suggestions from code review applying suggested changes Co-authored-by: LagoLunatic --------- Co-authored-by: LagoLunatic --- configure.py | 2 +- include/d/actor/d_a_obj_mkiek.h | 37 ++++++- src/d/actor/d_a_obj_mkiek.cpp | 168 +++++++++++++++++++++++++++++--- 3 files changed, 190 insertions(+), 17 deletions(-) diff --git a/configure.py b/configure.py index 8b0a838c8..e299c2e51 100755 --- a/configure.py +++ b/configure.py @@ -1693,7 +1693,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_ladder", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_light"), ActorRel(NonMatching, "d_a_obj_mkie"), - ActorRel(NonMatching, "d_a_obj_mkiek"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mkiek", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mknjd", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_mmrr"), ActorRel(NonMatching, "d_a_obj_msdan"), diff --git a/include/d/actor/d_a_obj_mkiek.h b/include/d/actor/d_a_obj_mkiek.h index 6dd494003..dc1bc656f 100644 --- a/include/d/actor/d_a_obj_mkiek.h +++ b/include/d/actor/d_a_obj_mkiek.h @@ -2,12 +2,28 @@ #define D_A_OBJ_MKIEK_H #include "d/d_bg_s_movebg_actor.h" +#include "m_Do/m_Do_ext.h" namespace daObjMkiek { + + enum daObjMkiek_State { + STATE_0 = 0, + STATE_1 = 1, + STATE_2 = 2, + }; + class Act_c : public dBgS_MoveBgActor { public: - void prm_get_sound() const {} - void prm_get_swSave() const {} + enum Prm_e { + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x00, + + PRM_SOUND_W = 0x01, + PRM_SOUND_S = 0x08 + }; + + int prm_get_sound() const { return daObj::PrmAbstract(this, PRM_SOUND_W, PRM_SOUND_S); } + int prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } virtual BOOL CreateHeap(); virtual BOOL Create(); @@ -21,9 +37,24 @@ namespace daObjMkiek { void demo(); virtual BOOL Execute(Mtx**); virtual BOOL Draw(); + + static const char M_arcname[]; + static const char M_envname[]; + + private: + static Mtx M_tmp_mtx; public: - /* Place member variables here */ + /* 0x2C8 */ request_of_phase_process_class mPhs; + /* 0x2D0 */ J3DModel* mpModel; + /* 0x2D4 */ J3DModel* mpModelV; + /* 0x2D8 */ mDoExt_brkAnm mBrkAnm; + /* 0x2F0 */ dCcD_Stts mStts; + /* 0x32C */ dCcD_Sph mSph; + /* 0x458 */ bool m458; + /* 0x45A */ s16 mDieEventIdx; + /* 0x45C */ daObjMkiek_State mState; + /* 0x460 */ s32 m460; }; }; diff --git a/src/d/actor/d_a_obj_mkiek.cpp b/src/d/actor/d_a_obj_mkiek.cpp index e3e55bb62..cee4a23cf 100644 --- a/src/d/actor/d_a_obj_mkiek.cpp +++ b/src/d/actor/d_a_obj_mkiek.cpp @@ -4,9 +4,14 @@ // #include "d/actor/d_a_obj_mkiek.h" +#include "d/d_com_inf_game.h" +#include "d/d_a_obj.h" +#include "d/d_particle_name.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" +#include "d/res/res_mkiek.h" +#include "f_op/f_op_actor_mng.h" static dCcD_SrcSph sph_check_src = { // dCcD_SrcGObjInf @@ -37,65 +42,202 @@ static dCcD_SrcSph sph_check_src = { }, }; +const char daObjMkiek::Act_c::M_arcname[] = "MkieK"; +const char daObjMkiek::Act_c::M_envname[] = "MkieK"; + +Mtx daObjMkiek::Act_c::M_tmp_mtx; /* 00000078-00000240 .text CreateHeap__Q210daObjMkiek5Act_cFv */ BOOL daObjMkiek::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEK_BDL_MKIEK); + JUT_ASSERT(0x96, model_data != NULL); + mpModel = mDoExt_J3DModel__create(model_data, 0, 0x11020203); + + J3DModelData* model_data_v = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEK_BDL_YLSMK00); + JUT_ASSERT(0x9C, model_data_v != NULL); + mpModelV = mDoExt_J3DModel__create(model_data_v, 0, 0x11020203); + + J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(M_arcname, MKIEK_BRK_YLSMK00); + JUT_ASSERT(0xA2, brk != NULL); + + int result = mBrkAnm.init(model_data_v, brk, true, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, FALSE); + return result == 0 ? FALSE : mpModel != NULL && mpModelV != NULL; } /* 00000240-00000314 .text Create__Q210daObjMkiek5Act_cFv */ BOOL daObjMkiek::Act_c::Create() { - /* Nonmatching */ + mStts.Init(0xFF, 0xFF, this); + + mSph.Set(sph_check_src); + mSph.SetStts(&mStts); + + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + fopAcM_setCullSizeBox(this, -200.0f, -100.0f, -200.0f, 200.0f, 305.0f, 200.0f); + + m458 = false; + mDieEventIdx = dComIfGp_evmng_getEventIdx("MkieK_die"); + mState = STATE_0; + m460 = 0; + + return TRUE; } /* 00000314-000004F8 .text Mthd_Create__Q210daObjMkiek5Act_cFv */ cPhs_State daObjMkiek::Act_c::Mthd_Create() { - /* Nonmatching */ + fopAcM_SetupActor(this, Act_c); + + int switch_index = daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); + if (fopAcM_isSwitch(this, switch_index)) { + return cPhs_STOP_e; + } + + cPhs_State phase_state = dComIfG_resLoad(&mPhs, M_arcname); + if (phase_state == cPhs_COMPLEATE_e) { + phase_state = MoveBGCreate(M_arcname, MKIEK_DZB_MKIEK, NULL, 0x1220); + JUT_ASSERT(0xD9, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)) + } + return phase_state; } /* 00000754-0000075C .text Delete__Q210daObjMkiek5Act_cFv */ BOOL daObjMkiek::Act_c::Delete() { - /* Nonmatching */ + return TRUE; } /* 0000075C-000007B4 .text Mthd_Delete__Q210daObjMkiek5Act_cFv */ BOOL daObjMkiek::Act_c::Mthd_Delete() { - /* Nonmatching */ + BOOL result = this->MoveBGDelete(); + if (fpcM_CreateResult(this) != cPhs_STOP_e) { + dComIfG_resDelete(&mPhs, M_arcname); + } + return result; } /* 000007B4-00000848 .text set_mtx__Q210daObjMkiek5Act_cFv */ void daObjMkiek::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx); + mpModelV->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000848-000008A0 .text init_mtx__Q210daObjMkiek5Act_cFv */ void daObjMkiek::Act_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + mpModelV->setBaseScale(scale); + set_mtx(); } /* 000008A0-00000940 .text check__Q210daObjMkiek5Act_cFv */ void daObjMkiek::Act_c::check() { - /* Nonmatching */ + if (!(!dComIfGp_getDetect().chk_light(¤t.pos) && !mSph.ChkTgHit())) { + m460++; + if (m460 >= 0x14) { + fopAcM_orderOtherEventId(this,mDieEventIdx); + mState = STATE_1; + } + } else { + m460 = 0; + } } /* 00000940-00000B28 .text demo_wait__Q210daObjMkiek5Act_cFv */ void daObjMkiek::Act_c::demo_wait() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + if (prm_get_sound() == 0) { + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + if (m460 < 0x14) { + m460++; + } else { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + + GXColor color; + color.r = tevStr.mColorC0.r; + color.g = tevStr.mColorC0.g; + color.b = tevStr.mColorC0.b; + color.a = tevStr.mColorC0.a; + dComIfGp_particle_setProjection(dPa_name::ID_SCENE_819F, + ¤t.pos, ¤t.angle, NULL, + 0xFF, NULL, + current.roomNo, + &tevStr.mColorK0, &color, + NULL); + + fopAcM_onSwitch(this, prm_get_swSave()); + + fopAcM_seStartCurrent(this, JA_SE_OBJ_L_OBJ_BRK_TAME, 0); + m458 = true; + mState = STATE_2; + } + } else { + fopAcM_orderOtherEventId(this, mDieEventIdx); + } } /* 00000B28-00000C1C .text demo__Q210daObjMkiek5Act_cFv */ void daObjMkiek::Act_c::demo() { - /* Nonmatching */ + mBrkAnm.play(); + if (!mBrkAnm.isStop()) { + return; + } + + dComIfGp_event_onEventFlag(8); + fopAcM_seStartCurrent(this, JA_SE_OBJ_L_WALL_BREAK, 0); + dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + fopAcM_delete(this); } /* 00000C1C-00000D00 .text Execute__Q210daObjMkiek5Act_cFPPA3_A4_f */ -BOOL daObjMkiek::Act_c::Execute(Mtx**) { - /* Nonmatching */ +BOOL daObjMkiek::Act_c::Execute(Mtx** o_mtx) { + cXyz sph_pos_offset; + sph_pos_offset.setall(0.0f); + sph_pos_offset.y = 150.f; + mSph.SetC(current.pos + sph_pos_offset); + dComIfG_Ccsp()->Set(&mSph); + + switch(mState) { + case STATE_0: + check(); + break; + case STATE_1: + demo_wait(); + break; + case STATE_2: + demo(); + break; + } + + set_mtx(); + *o_mtx = &M_tmp_mtx; + + return TRUE; } /* 00000D00-00000E1C .text Draw__Q210daObjMkiek5Act_cFv */ BOOL daObjMkiek::Act_c::Draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + + if (m458) { + g_env_light.setLightTevColorType(mpModelV, &tevStr); + J3DModelData* model_v_data = mpModelV->getModelData(); + mBrkAnm.entry(model_v_data, mBrkAnm.getFrameCtrl()->getFrame()); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModelV); + dComIfGd_setList(); + } else { + g_env_light.setLightTevColorType(mpModel, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + } + + return TRUE; } namespace daObjMkiek {