diff --git a/include/d/actor/d_a_obj_msdan_sub.h b/include/d/actor/d_a_obj_msdan_sub.h index 10677295f..910935651 100644 --- a/include/d/actor/d_a_obj_msdan_sub.h +++ b/include/d/actor/d_a_obj_msdan_sub.h @@ -6,9 +6,20 @@ namespace daObjMsdanSub { class Act_c : public dBgS_MoveBgActor { public: - void prm_get_objNo() const {} - void prm_get_size() const {} - void prm_get_swSave() const {} + enum Prm_e { + PRM_SIZE_W = 0x1, + PRM_SIZE_H = 0x10, + + PRM_SWSAVE_W = 0x8, + PRM_SWSAVE_S = 0x0, + + PRM_OBJNO_W = 0x8, + PRM_OBJNO_S = 0x8, + }; + + s32 prm_get_objNo() const { return daObj::PrmAbstract(this, PRM_OBJNO_W, PRM_OBJNO_S); } + s32 prm_get_size() const { return daObj::PrmAbstract(this, PRM_SIZE_W, PRM_SIZE_H); } + s32 prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } virtual BOOL CreateHeap(); virtual BOOL Create(); @@ -20,8 +31,17 @@ namespace daObjMsdanSub { virtual BOOL Execute(Mtx**); virtual BOOL Draw(); + static const char M_arcname[]; + static Mtx M_tmp_mtx; + public: - /* Place member variables here */ + /* 0x2C8 */ request_of_phase_process_class mPhs; + /* 0x2D0 */ J3DModel *mModel; + /* 0x2D4 */ s32 m2D4; + /* 0x2D8 */ s32 mCurObjNo; + /* 0x2DC */ f32 m2DC; + /* 0x2E0 */ f32 m2E0; + /* 0x2E4 */ bool m2E4; }; }; diff --git a/src/d/actor/d_a_obj_msdan_sub.cpp b/src/d/actor/d_a_obj_msdan_sub.cpp index 7b92f0887..f010748bc 100644 --- a/src/d/actor/d_a_obj_msdan_sub.cpp +++ b/src/d/actor/d_a_obj_msdan_sub.cpp @@ -7,50 +7,194 @@ #include "d/actor/d_a_obj_msdan_sub.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_msdan.h" + +const char daObjMsdanSub::Act_c::M_arcname[] = "Msdan"; +Mtx daObjMsdanSub::Act_c::M_tmp_mtx; /* 00000078-0000012C .text CreateHeap__Q213daObjMsdanSub5Act_cFv */ BOOL daObjMsdanSub::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, MSDAN_BDL_MSDAN); + JUT_ASSERT(93, model_data != NULL); + mModel = mDoExt_J3DModel__create(model_data, 0, 0x11020203); + return mModel != NULL; } /* 0000012C-00000304 .text Create__Q213daObjMsdanSub5Act_cFv */ BOOL daObjMsdanSub::Act_c::Create() { - /* Nonmatching */ + fopAcM_SetMtx(this, mModel->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -1000.0f, -1000.0f, -1000.0f, 1000.0f, 1000.0f, 1000.0f); + if (prm_get_size()) { + if (fopAcM_isSwitch(this, prm_get_swSave())) { + mCurObjNo = 31; + current.pos.y = (home.pos.y - 800.0f) + (prm_get_objNo() + 1) * 25.0f; + } else { + mCurObjNo = 0; + } + m2D4 = 0; + } else { + if (fopAcM_isSwitch(this, prm_get_swSave())) { + mCurObjNo = 31; + current.pos.y = (home.pos.y - 800.0f) + (prm_get_objNo() + 1) * 25.0f; + } else { + mCurObjNo = 16; + } + m2D4 = 16; + } + m2DC = home.pos.y; + m2E0 = 0.0f; + init_mtx(); + mpBgW->Move(); + m2E4 = false; + return TRUE; } /* 00000304-00000400 .text Mthd_Create__Q213daObjMsdanSub5Act_cFv */ cPhs_State daObjMsdanSub::Act_c::Mthd_Create() { - /* Nonmatching */ + fopAcM_SetupActor(this, Act_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, M_arcname); + + if (phase_state == cPhs_COMPLEATE_e) { + phase_state = MoveBGCreate(M_arcname, MSDAN_DZB_MSDAN, dBgS_MoveBGProc_Trans, 0x9A0); + JUT_ASSERT(155, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + return phase_state; } /* 00000400-00000408 .text Delete__Q213daObjMsdanSub5Act_cFv */ BOOL daObjMsdanSub::Act_c::Delete() { - /* Nonmatching */ + return TRUE; } /* 00000408-00000454 .text Mthd_Delete__Q213daObjMsdanSub5Act_cFv */ BOOL daObjMsdanSub::Act_c::Mthd_Delete() { - /* Nonmatching */ + BOOL move_bg_delete_val = MoveBGDelete(); + dComIfG_resDeleteDemo(&mPhs, M_arcname); + return move_bg_delete_val; } /* 00000454-000004D4 .text set_mtx__Q213daObjMsdanSub5Act_cFv */ void daObjMsdanSub::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mModel->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx); } /* 000004D4-00000534 .text init_mtx__Q213daObjMsdanSub5Act_cFv */ void daObjMsdanSub::Act_c::init_mtx() { - /* Nonmatching */ + scale *= 1.01f; + mModel->setBaseScale(scale); + set_mtx(); } /* 00000534-00000BB4 .text Execute__Q213daObjMsdanSub5Act_cFPPA3_A4_f */ -BOOL daObjMsdanSub::Act_c::Execute(Mtx**) { +BOOL daObjMsdanSub::Act_c::Execute(Mtx** pMtx) { + //https://decomp.me/scratch/OWEBm /* Nonmatching */ + if (prm_get_size()) { + if (fopAcM_isSwitch(this, prm_get_swSave())) { + if (m2E0 > 0.0f) { + m2E0 = 0.0f; + } + if (mCurObjNo < 31) { + m2E0 -= 10.0f; + m2DC += m2E0; + + if (mCurObjNo == prm_get_objNo()) { + current.pos.y = m2DC; + if (m2DC <= home.pos.y - 800.0f + (mCurObjNo + 1) * 25.0f) { + current.pos.y = home.pos.y - 800.0f + (mCurObjNo + 1) * 25.0f; + mCurObjNo++; + if (!m2E4) { + if (m2DC <= (((home.pos.y * 25.0f) - 800.0f) + (mCurObjNo + 1) * 0.5f) && (mCurObjNo <= 20 || (mCurObjNo & 1) == 1)) { + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + m2E4 = true; + } + } + } + fopAcM_seStartCurrent(this, JA_SE_OBJ_SW_STAIR_ON_1, 0); + m2E0 = 0.0f; + } else { + if (m2DC <= ((home.pos.y * 2.0f - 800.0f) + (mCurObjNo + 1) * 25.0f) * 0.5f) { + mCurObjNo++; + m2E0 = 0.0f; + m2DC = home.pos.y; + } + } + } + } + } else if (fopAcM_isSwitch(this, prm_get_swSave())) { + if (m2E0 > 0.0f) { + m2E0 = 0.0f; + } + + if (mCurObjNo < 31) { + m2E0 -= 10.0f; + m2DC += m2E0; + + if (mCurObjNo == prm_get_objNo()) { + current.pos.y = m2DC; + } + if (m2DC <= (home.pos.y - 800.0f) + (mCurObjNo + 1) * 25.0f) { + if (mCurObjNo == prm_get_objNo()) { + current.pos.y = (home.pos.y - 800.0f) + (mCurObjNo + 1) * 25.0f; + fopAcM_seStartCurrent(this, JA_SE_OBJ_SW_STAIR_ON_1, 0); + } + mCurObjNo++; + m2E0 = 0.0f; + m2DC = home.pos.y; + } + if (mCurObjNo == prm_get_objNo() && !m2E4) { + if (m2DC <= (((home.pos.y * 25.0f) - 800.0f) + (mCurObjNo + 1) * 0.5f) && (mCurObjNo <= 20 || (mCurObjNo & 1) == 1)) { + dComIfGp_getVibration().StartShock(1, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + m2E4 = true; + } + } + } + } else { + if (m2E0 < 0.0f) { + m2E0 = 0.0f; + } + + if (mCurObjNo >= m2D4) { + m2E0 += 15.0f; + m2DC += m2E0; + if (mCurObjNo == prm_get_objNo()) { + current.pos.y = m2DC; + } + if (this->m2DC >= home.pos.y) { + if (mCurObjNo == prm_get_objNo()) { + current.pos.y = home.pos.y; + } + + if (mCurObjNo > m2D4) { + if (mCurObjNo == prm_get_objNo()) { + fopAcM_seStartCurrent(this, JA_SE_OBJ_SW_STAIR_OFF_1, 0); + m2E4 = false; + } + mCurObjNo--; + m2DC = home.pos.y - 800.0f + (mCurObjNo + 1) * 25.0f; + } else { + m2DC = home.pos.y; + } + m2E0 = 0.0f; + } + } + } + set_mtx(); + *pMtx = &M_tmp_mtx; + return TRUE; } /* 00000BB4-00000C54 .text Draw__Q213daObjMsdanSub5Act_cFv */ BOOL daObjMsdanSub::Act_c::Draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mModel, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mModel); + dComIfGd_setList(); + return TRUE; } namespace daObjMsdanSub {