From 847a5e98bff4f3c270a490d5f222ebdb5f57fd94 Mon Sep 17 00:00:00 2001 From: TetrisGG Date: Sun, 15 Feb 2026 16:23:06 +0100 Subject: [PATCH] d_a_obj_mkie - matching retail (#931) * d_a_obj_mkie - matching * review changes --- configure.py | 2 +- include/d/actor/d_a_obj_mkie.h | 129 +++++++---- src/d/actor/d_a_obj_mkie.cpp | 379 ++++++++++++++++++++++++++++++--- 3 files changed, 436 insertions(+), 74 deletions(-) diff --git a/configure.py b/configure.py index 0026b4910..917587c3d 100755 --- a/configure.py +++ b/configure.py @@ -1725,7 +1725,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_kanoke"), ActorRel(Matching, "d_a_obj_ladder"), ActorRel(NonMatching, "d_a_obj_light"), - ActorRel(NonMatching, "d_a_obj_mkie"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mkie"), ActorRel(Matching, "d_a_obj_mkiek"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_mknjd"), ActorRel(NonMatching, "d_a_obj_mmrr"), diff --git a/include/d/actor/d_a_obj_mkie.h b/include/d/actor/d_a_obj_mkie.h index 410b2b2bb..25e7ab247 100644 --- a/include/d/actor/d_a_obj_mkie.h +++ b/include/d/actor/d_a_obj_mkie.h @@ -2,52 +2,93 @@ #define D_A_OBJ_MKIE_H #include "d/d_bg_s_movebg_actor.h" +#include "m_Do/m_Do_ext.h" namespace daObjMkie { - class Act_c : public dBgS_MoveBgActor { - public: - static u32 prm_make(u8 eventId, int swNo) { - return swNo << 0x10 | (eventId | 0x3000); - } - - void setup(const cXyz* pos) { - current.pos = *pos; - mF58 = 1; - } - void attr() const {} - void prm_get_correct() const {} - void prm_get_evId() const {} - void prm_get_swSave() const {} - void prm_get_type() const {} - - virtual BOOL CreateHeap(); - void init_cc(); - void set_cc_pos(); - virtual BOOL Create(); - cPhs_State Mthd_Create(); - virtual BOOL Delete(); - BOOL Mthd_Delete(); - void set_mtx(); - void init_mtx(); - void chk_light(); - void eff_break(); - void sound_melt(); - void sound_break(); - void vib_break(); - void mode_wait(); - void mode_demoWait_init(); - void mode_demoWait(); - void mode_demo_init(); - void mode_demo(); - void mode_proc_call(); - virtual BOOL Execute(Mtx**); - virtual BOOL Draw(); - - public: - /* 0x2C8 */ u8 m2C8[0xF58 - 0x2C8]; - /* 0xF58 */ u8 mF58; - /* 0xF59 */ u8 mF59[0xF64 - 0xF59]; +class Act_c : public dBgS_MoveBgActor { +public: + static Mtx M_tmp_mtx; + static u32 prm_make(u8 eventId, int swNo) { return swNo << 0x10 | (eventId | 0x3000); }; + + void setup(const cXyz* pos) { + current.pos = *pos; + mCcInit = 1; }; -}; + + struct Attr_c { + const char* name; + float mScale; + Vec table[8][3]; + }; + + enum Prm_e { + PRM_CORRECT_W = 0x01, + PRM_CORRECT_S = 0xc, + + PRM_EVID_W = 0x08, + PRM_EVID_S = 0x0, + + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x10, + + PRM_TYPE_W = 0x01, + PRM_TYPE_S = 0x08, + + PRM_FLAG_W = 0x01, + PRM_FLAG_S = 0x0d, + }; + + BOOL prm_get_correct() const { return daObj::PrmAbstract(this, PRM_CORRECT_W, PRM_CORRECT_S); } + u8 prm_get_evId() const { return daObj::PrmAbstract(this, PRM_EVID_W, PRM_EVID_S); } + int prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } + int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W, PRM_TYPE_S); } + + virtual BOOL CreateHeap(); + void init_cc(); + void set_cc_pos(); + virtual BOOL Create(); + cPhs_State Mthd_Create(); + virtual BOOL Delete(); + BOOL Mthd_Delete(); + void set_mtx(); + void init_mtx(); + BOOL chk_light(); + void eff_break(); + void sound_melt(); + void sound_break(); + void vib_break(); + void mode_wait(); + void mode_demoWait_init(); + void mode_demoWait(); + void mode_demo_init(); + void mode_demo(); + void mode_proc_call(); + virtual BOOL Execute(Mtx**); + virtual BOOL Draw(); + + static const char M_arcname[]; + static const dCcD_SrcTri M_tri_src; + static const Attr_c M_attr[]; + +public: + /* 0x2C8 */ request_of_phase_process_class mPhs; + /* 0x2D0 */ J3DModel* mModelBase; + /* 0x2D4 */ J3DModel* mModelVan; + /* 0x2D8 */ mDoExt_brkAnm mBrkVan; + /* 0x2F0 */ dCcD_Tri mTri[8]; + /* 0xD70 */ dCcD_Stts mStts[8]; + /* 0xF50 */ int mModeProc; + /* 0xF54 */ int mType; + /* 0xF58 */ bool mCcInit; + /* 0xF59 */ bool mStatueDelete; + /* 0xF5A */ bool mEvtPlaying; + /* 0xF5B */ bool mBaseAnmPlaying; + /* 0xF5C */ s16 mState; + /* 0xF5E */ s16 mLightCnt; + /* 0xF60 */ s16 mEvtIdx; + /* 0xF62 */ bool mSwitch; + /* 0xF63 */ bool mBroken; +}; // Size: 0xF64 +}; // namespace daObjMkie #endif /* D_A_OBJ_MKIE_H */ diff --git a/src/d/actor/d_a_obj_mkie.cpp b/src/d/actor/d_a_obj_mkie.cpp index c6381b8da..674d7079f 100644 --- a/src/d/actor/d_a_obj_mkie.cpp +++ b/src/d/actor/d_a_obj_mkie.cpp @@ -1,121 +1,442 @@ -// -// Generated by dtk -// Translation Unit: d_a_obj_mkie.cpp -// +/** + * d_a_obj_mkie.cpp + * Elephant statue in Earth Temple, that dissolves when hit with light. + */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_mkie.h" +#include "d/res/res_mkieb.h" #include "d/d_procname.h" #include "d/d_priority.h" +Mtx daObjMkie::Act_c::M_tmp_mtx; +const char daObjMkie::Act_c::M_arcname[] = "MkieB"; +const dCcD_SrcTri daObjMkie::Act_c::M_tri_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_LIGHT, + /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_ShieldFrontRange_e, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt SPrm */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg SPrm */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGTriS + {{ + /* a */ {0.0f, 0.0f, 0.0f}, + /* b */ {0.0f, 0.0f, 0.0f}, + /* c */ {0.0f, 0.0f, 0.0f}, + }}, +}; +const daObjMkie::Act_c::Attr_c daObjMkie::Act_c::M_attr[2] = { + { + "MkieB_die", + 1.0f, + { + { + {-30.0f, 190.0f, 40.0f}, + {-65.0f, 50.0f, 75.0f}, + {65.0f, 50.0f, 75.0f}, + }, + { + {-30.0f, 190.0f, 40.0f}, + {65.0f, 50.0f, 75.0f}, + {30.0f, 190.0f, 40.0f}, + }, + { + {38.0f, 190.0f, 20.0f}, + {75.0f, 50.0f, 65.0f}, + {75.0f, 50.0f, -65.0f}, + }, + { + {38.0f, 190.0f, 20.0f}, + {75.0f, 50.0f, -65.0f}, + {38.0f, 190.0f, -40.0f}, + }, + { + {30.0f, 190.0f, -60.0f}, + {65.0f, 50.0f, -75.0f}, + {-65.0f, 50.0f, -75.0f}, + }, + { + {30.0f, 190.0f, -60.0f}, + {-65.0f, 50.0f, -75.0f}, + {-30.0f, 190.0f, -60.0f}, + }, + { + {-38.0f, 190.0f, -40.0f}, + {-75.0f, 50.0f, -65.0f}, + {-75.0f, 50.0f, 65.0f}, + }, + {{-38.0f, 190.0f, -40.0f}, {-75.0f, 50.0f, 65.0f}, {-38.0f, 190.0f, 20.0f}}, + }, + }, + {"MkieBAB_die", + 3.0f, + {{ + {-90.0f, 570.0f, 170.0f}, + {-195.0f, 150.0f, 225.0f}, + {195.0f, 150.0f, 225.0f}, + }, + { + {-90.0f, 570.0f, 170.0f}, + {195.0f, 150.0f, 225.0f}, + {90.0f, 570.0f, 170.0f}, + }, + { + {120.0f, 570.0f, 60.0f}, + {225.f, 150.0f, 195.0f}, + {225.0f, 150.0f, -195.0f}, + }, + { + {120.0f, 570.0f, 60.0f}, + {225.0f, 150.0f, -195.0f}, + {120.0f, 570.0f, -120.0f}, + }, + { + {90.0f, 570.0f, -180.0f}, + {195.0f, 150.0f, -225.0f}, + {-195.0f, 150.0f, -225.0f}, + }, + { + {90.0f, 570.0f, -180.0f}, + {-195.0f, 150.0f, -225.0f}, + {-90.0f, 570.0f, -180.0f}, + }, + { + {-120.0f, 570.0f, -120.0f}, + {-225.0f, 150.0f, -195.0f}, + {-225.0f, 150.0f, 195.0f}, + }, + {{-120.0f, 570.0f, -120.0f}, {-225.0f, 150.0f, 195.0f}, {-120.0f, 570.0f, 60.0f}}}} +}; + /* 00000078-00000250 .text CreateHeap__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEB_BDL_MKIEB); + JUT_ASSERT(0x192, model_data != NULL); + mModelBase = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022); + + J3DModelData* model_data_van = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MKIEB_BDL_YLSMF00); + JUT_ASSERT(0x19b, model_data_van != NULL); + mModelVan = mDoExt_J3DModel__create(model_data_van, 0x80000, 0x11000022); + + J3DAnmTevRegKey* brk_van = (J3DAnmTevRegKey*)dComIfG_getObjectRes(M_arcname, MKIEB_BRK_YLSMF00); + JUT_ASSERT(0x1a5, brk_van != NULL); + int init = mBrkVan.init(model_data_van, brk_van, true, 0, 1.0f, 0, -1, false, 0); + + bool ret = false; + if (mModelBase != NULL && mModelVan != NULL && init != 0) { + ret = true; + } + return ret; } /* 00000250-000002EC .text init_cc__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_cc() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + mStts[i].Init(0xff, 0xff, this); + mTri[i].Set(M_tri_src); + mTri[i].SetStts(&mStts[i]); + mTri[i].OnTgNoHitMark(); + } + set_cc_pos(); } /* 000002EC-00000420 .text set_cc_pos__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_cc_pos() { - /* Nonmatching */ + for (int i = 0; i < 8; i++) { + Vec src[3]; + Vec dst[3]; + src[0] = M_attr[mType].table[i][0]; + src[1] = M_attr[mType].table[i][1]; + src[2] = M_attr[mType].table[i][2]; + mDoMtx_multVecArray(mModelBase->getBaseTRMtx(), src, dst, 3); + mTri[i].setPos(&dst[0], &dst[1], &dst[2]); + } } /* 00000420-00000568 .text Create__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Create() { - /* Nonmatching */ + fopAcM_SetMtx(this, mModelBase->getBaseTRMtx()); + init_mtx(); + { + const Attr_c* mAttrPtr = M_attr + mType; + float initialScale = mAttrPtr->mScale; + fopAcM_setCullSizeBox( + this, initialScale * -80.0f, initialScale * -1.0f, initialScale * -80.0f, initialScale * 80.0f, initialScale * 230.0f, initialScale * 80.0f + ); + } + init_cc(); + + if (daObj::PrmAbstract(this, PRM_FLAG_W, PRM_FLAG_S) != 0) { + actor_status &= ~0x3F; + gbaName = 0; + } + + mCcInit = false; + mBaseAnmPlaying = false; + + { + const Attr_c* mAttrPtr = M_attr + mType; + attention_info.position.y = current.pos.y + mAttrPtr->mScale * 130.0f; + } + eyePos = attention_info.position; + mEvtIdx = dComIfGp_evmng_getEventIdx(M_attr[mType].name, prm_get_evId()); + return true; } /* 00000568-00000754 .text Mthd_Create__Q29daObjMkie5Act_cFv */ cPhs_State daObjMkie::Act_c::Mthd_Create() { - /* Nonmatching */ + cPhs_State phase_state = cPhs_ERROR_e; + fopAcM_SetupActor(this, daObjMkie::Act_c); + mSwitch = !fopAcM_isSwitch(this, prm_get_swSave()); + if (mSwitch && (phase_state = dComIfG_resLoad(&mPhs, M_arcname), phase_state == cPhs_COMPLEATE_e)) { + mType = prm_get_type(); + const Attr_c* mAttrPtr = M_attr + mType; + float initialScale = mAttrPtr->mScale; + scale.setall(initialScale); + phase_state = MoveBGCreate(M_arcname, MKIEB_DZB_MKIEB, dBgS_MoveBGProc_Trans, 0x1b20); + JUT_ASSERT(0x216, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + return phase_state; } /* 00000BF0-00000BF8 .text Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Delete() { - /* Nonmatching */ + return true; } /* 00000BF8-00000C54 .text Mthd_Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Mthd_Delete() { - /* Nonmatching */ + BOOL ret = true; + if (mSwitch != false) { + ret = MoveBGDelete(); + dComIfG_resDelete(&mPhs, M_arcname); + } + return ret; } /* 00000C54-00000CF8 .text set_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mModelBase->setBaseTRMtx(mDoMtx_stack_c::get()); + mModelVan->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::scaleM(scale); + cMtx_copy(mDoMtx_stack_c::now, M_tmp_mtx); } /* 00000CF8-00000D50 .text init_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_mtx() { - /* Nonmatching */ + mModelBase->setBaseScale(scale); + mModelVan->setBaseScale(scale); + set_mtx(); } /* 00000D50-00000DF4 .text chk_light__Q29daObjMkie5Act_cFv */ -void daObjMkie::Act_c::chk_light() { - /* Nonmatching */ +BOOL daObjMkie::Act_c::chk_light() { + BOOL ret = false; + + if (dComIfGp_getDetect().chk_light(&eyePos)) { + ret = true; + } else { + for (int i = 0; i < 8; i++) { + if (mTri[i].ChkTgHit()) { + mTri[i].ClrTgHit(); + ret = true; + } + } + } + return ret; } /* 00000DF4-00000E84 .text eff_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::eff_break() { - /* Nonmatching */ + _GXColor envColor; + envColor.r = (u8)tevStr.mColorC0.r; + envColor.g = (u8)tevStr.mColorC0.g; + envColor.b = (u8)tevStr.mColorC0.b; + envColor.a = (u8)tevStr.mColorC0.a; + + dComIfGp_particle_set(dPa_name::ID_SCENE_81A0, ¤t.pos, &shape_angle, &scale, 0xff, NULL, -1, &tevStr.mColorK0, &envColor, NULL); } /* 00000E84-00000EF4 .text sound_melt__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_melt() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_L_OBJ_BRK_TAME, 0); } /* 00000EF4-00000F7C .text sound_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_break() { - /* Nonmatching */ + static const u32 se_break[] = { + JA_SE_OBJ_L_STATUE_BREAK, + JA_SE_OBJ_L_STATUE_L_BREAK, + }; + fopAcM_seStart(this, se_break[mType], 0); } /* 00000F7C-00000FD0 .text vib_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::vib_break() { - /* Nonmatching */ + dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } /* 00000FD0-00001094 .text mode_wait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_wait() { - /* Nonmatching */ + if (chk_light() & 0xff) { + mLightCnt += 1; + } else { + mLightCnt = 0; + } + + if (mLightCnt > 20) { + mode_demoWait_init(); + } else { + if (mCcInit != false) { + set_cc_pos(); + } + if (!fopAcM_cullingCheck(this)) { + for (int i = 0; i < 8; i++) { + dComIfG_Ccsp()->Set(&mTri[i]); + } + } + } } /* 00001094-000010A8 .text mode_demoWait_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait_init() { - /* Nonmatching */ + mEvtPlaying = false; + mModeProc = 1; } /* 000010A8-00001168 .text mode_demoWait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait() { - /* Nonmatching */ + bool demo = false; + + if (dComIfGp_evmng_existence(mEvtIdx)) { + if (eventInfo.checkCommandDemoAccrpt()) { + demo = true; + mEvtPlaying = true; + } else { + fopAcM_orderOtherEventId(this, mEvtIdx, prm_get_evId()); + eventInfo.onCondition(2); + } + } else { + demo = true; + } + + if (demo) { + mode_demo_init(); + } } /* 00001168-000011FC .text mode_demo_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo_init() { - /* Nonmatching */ + mModeProc = 2; + mState = 10; + if (!prm_get_correct()) { + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + } + mBroken = false; + mBaseAnmPlaying = false; } /* 000011FC-00001338 .text mode_demo__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo() { - /* Nonmatching */ + if (mState > 0 && (mState -= 1, mState == 0)) { + eff_break(); + sound_melt(); + fopAcM_onSwitch(this, prm_get_swSave()); + } + + if (mState == 0) { + mBaseAnmPlaying = mBrkVan.play(); + if (!mBroken && mBaseAnmPlaying) { + sound_break(); + vib_break(); + mBroken = true; + } + } + + if (mEvtPlaying && dComIfGp_evmng_endCheck(mEvtIdx)) { + dComIfGp_event_reset(); + mEvtPlaying = false; + } + + if (!mEvtPlaying && mState == 0 && mBaseAnmPlaying) { + mStatueDelete = true; + } } /* 00001338-000013DC .text mode_proc_call__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_proc_call() { - /* Nonmatching */ + static void (Act_c::* mode_proc[])() = { + &Act_c::mode_wait, + &Act_c::mode_demoWait, + &Act_c::mode_demo, + }; + + (this->*mode_proc[mModeProc])(); } /* 000013DC-000014A0 .text Execute__Q29daObjMkie5Act_cFPPA3_A4_f */ -BOOL daObjMkie::Act_c::Execute(Mtx**) { - /* Nonmatching */ +BOOL daObjMkie::Act_c::Execute(Mtx** pMtx) { + attention_info.position.x = current.pos.x; + const Attr_c* mAttrPtr = M_attr + mType; + attention_info.position.y = current.pos.y + mAttrPtr->mScale * 130.0f; + attention_info.position.z = current.pos.z; + + eyePos = attention_info.position; + mode_proc_call(); + if (mStatueDelete) { + fopAcM_delete(this); + } + mCcInit = false; + set_mtx(); + *pMtx = &M_tmp_mtx; + return true; } /* 000014A0-000015B8 .text Draw__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Draw() { - /* Nonmatching */ + if (!mBaseAnmPlaying) { + bool flagVan = false; + if (mModeProc == 2) { + if (mState == 0) { + flagVan = true; + } + } + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + if (flagVan) { + g_env_light.setLightTevColorType(mModelVan, &tevStr); + J3DModelData* modelData = mModelVan->getModelData(); + mBrkVan.entry(modelData, mBrkVan.getFrame()); + } else { + g_env_light.setLightTevColorType(mModelBase, &tevStr); + } + + dComIfGd_setListBG(); + if (flagVan) { + mDoExt_modelUpdateDL(mModelVan); + } else { + mDoExt_modelUpdateDL(mModelBase); + } + dComIfGd_setList(); + } + + return true; } namespace daObjMkie { @@ -137,7 +458,7 @@ BOOL Mthd_Execute(void* i_this) { /* 00001618-00001644 .text Mthd_Draw__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { - return ((daObjMkie::Act_c*)i_this)->Draw(); + return ((daObjMkie::Act_c*)i_this)->MoveBGDraw(); } /* 00001644-00001670 .text Mthd_IsDelete__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */