From 7a2286565a57d38cbb9413e486495e388d652964 Mon Sep 17 00:00:00 2001 From: marian-m12l <50991156+marian-m12l@users.noreply.github.com> Date: Mon, 25 May 2026 23:54:31 +0200 Subject: [PATCH] d_a_obj_hlift (#1015) * first pass on d_a_obj_hlift * shuffle data + more matching functions * fix unnamed namespace + use resource enum * fix set_mtx demo * fix modes u_l_ and l_u * fix demo assert * vib_proc 98% demo * enum names * fixes after review --------- Co-authored-by: marian --- include/d/actor/d_a_obj_hlift.h | 74 +++++++++- src/d/actor/d_a_obj_hlift.cpp | 251 ++++++++++++++++++++++++++++---- 2 files changed, 292 insertions(+), 33 deletions(-) diff --git a/include/d/actor/d_a_obj_hlift.h b/include/d/actor/d_a_obj_hlift.h index 3d1b6fd1f..0c25dab93 100644 --- a/include/d/actor/d_a_obj_hlift.h +++ b/include/d/actor/d_a_obj_hlift.h @@ -4,16 +4,51 @@ #include "d/d_bg_s_movebg_actor.h" namespace daObjHlift { + struct Attr_c { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ s16 field_0x1C; + /* 0x1E */ s16 field_0x1E; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ u8 field_0x24[0x2C - 0x24]; + }; + class Act_c : public dBgS_MoveBgActor { public: + struct size_data { + /* 0x00 */ s16 field_0x00; + /* 0x01 */ s16 field_0x01; + /* 0x02 */ int field_0x02; + }; + enum Mode_e { - + Mode_L_U = 0x01, + Mode_U_L = 0x03, + Mode_UNK = 0x05, }; - void prm_get_dist() const {} - void prm_get_evId() const {} - void prm_get_size() const {} - void prm_get_swSave() const {} + enum Prm_e { + PRM_DIST_W = 3, + PRM_DIST_S = 0, + + PRM_EVENTID_W = 8, + PRM_EVENTID_S = 0x10, + + PRM_SIZE_W = 1, + PRM_SIZE_S = 4, + + PRM_SWSAVE_W = 8, + PRM_SWSAVE_S = 8, + }; + int prm_get_dist() const { return daObj::PrmAbstract(this, PRM_DIST_W, PRM_DIST_S); } + u8 prm_get_evId() const { return daObj::PrmAbstract(this, PRM_EVENTID_W, PRM_EVENTID_S); } + int prm_get_size() const { return daObj::PrmAbstract(this, PRM_SIZE_W, PRM_SIZE_S); } + int prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } virtual BOOL CreateHeap(); virtual BOOL Create(); @@ -35,14 +70,37 @@ namespace daObjHlift { void rot_set(); void vib_set(); void vib_proc(); - void chk_demo_end(); + BOOL chk_demo_end(); void se_whole(); virtual BOOL Execute(Mtx**); virtual BOOL Draw(); + static Mtx M_tmp_mtx; + static u8 M_lift_move_flag; + static fpc_ProcID M_control_id; + static const char M_arcname[]; + static const char M_evname[]; + static const s16 M_up_dist[8]; + static const size_data M_data_size[2]; + public: - /* Place member variables here */ - }; + /* 0x2C8 */ request_of_phase_process_class mPhase; + /* 0x2D0 */ J3DModel* mModel1; + /* 0x2D4 */ J3DModel* mModel2; + /* 0x2D8 */ int field_0x2D8; + /* 0x2DC */ int field_0x2DC; + /* 0x2E0 */ int field_0x2E0; + /* 0x2E4 */ Mode_e field_0x2E4; + /* 0x2E8 */ s16 field_0x2E8; + /* 0x2EA */ s16 field_0x2EA; + /* 0x2EC */ f32 field_0x2EC; + /* 0x2F0 */ f32 field_0x2F0; + /* 0x2F4 */ s16 field_0x2F4; + /* 0x2F6 */ u8 field_0x2F6; + /* 0x2F7 */ u8 field_0x2F7[0x2F8 - 0x2F7]; + /* 0x2F8 */ s16 mEventId; + /* 0x2FA */ u8 field_0x2FA[0x2FC - 0x2FA]; + }; // Size: 0x2FC }; #endif /* D_A_OBJ_HLIFT_H */ diff --git a/src/d/actor/d_a_obj_hlift.cpp b/src/d/actor/d_a_obj_hlift.cpp index 569791365..88900a046 100644 --- a/src/d/actor/d_a_obj_hlift.cpp +++ b/src/d/actor/d_a_obj_hlift.cpp @@ -7,125 +7,326 @@ #include "d/actor/d_a_obj_hlift.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_hlift.h" + +namespace daObjHlift { + +namespace { + int L_time_lag_num; + static const Attr_c L_attr = { 30.0f, 50.0f, 10.0f, 2.0f, 0.3f, 1.2f, 250.0f, 10, 16384, 2.5f, 0x00, 0x02, 0x0a, 0x08, 0x07, 0x00, 0x00, 0x00 }; +} +Mtx Act_c::M_tmp_mtx; +u8 Act_c::M_lift_move_flag; +fpc_ProcID Act_c::M_control_id = fpcM_ERROR_PROCESS_ID_e; +const char Act_c::M_arcname[] = "Hlift"; +const char Act_c::M_evname[] = "Hlift_up"; +const s16 Act_c::M_up_dist[] = { 125, 250, 375, 500, 625, 750, 875, 1000 }; +const Act_c::size_data Act_c::M_data_size[2] = { + { HLIFT_BDL_HLIFT, HLIFT_DZB_HLIFT, DEMO_SELECT(0x8000, 0x1700) }, + { HLIFT_BDL_HLIFTB, HLIFT_DZB_HLIFTB, DEMO_SELECT(0x8000, 0x1700) } +}; + +} /* 00000078-000001BC .text CreateHeap__Q210daObjHlift5Act_cFv */ BOOL daObjHlift::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, M_data_size[field_0x2DC].field_0x00); + JUT_ASSERT(288, model_data != NULL); + mModel1 = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022); + J3DModelData* model_data_c = (J3DModelData*)dComIfG_getObjectRes(M_arcname, HLIFT_BDL_HLIFTC); + JUT_ASSERT(298, model_data_c != NULL); + mModel2 = mDoExt_J3DModel__create(model_data_c, 0x80000, 0x11000022); + return mModel1 != NULL && mModel2 != NULL; } /* 000001BC-000002D0 .text Create__Q210daObjHlift5Act_cFv */ BOOL daObjHlift::Act_c::Create() { - /* Nonmatching */ + field_0x2EC = 0.0f; + int switchIndex = prm_get_swSave(); + if (fopAcM_isSwitch(const_cast(this), switchIndex)) { + mode_upper_init(); + } else { + mode_lower_init(); + } + field_0x2E4 = Mode_UNK; + field_0x2F6 = 0; + mEventId = dComIfGp_evmng_getEventIdx(M_evname, prm_get_evId()); + cullMtx = mModel1->getBaseTRMtx(); + init_mtx(); + fopAcM_setCullSizeBox( + this, + -151.0f, + -1005.0f, + -151.0f, + 151.0f, + 1.0f, + 151.0f + ); + if (M_control_id == fpcM_ERROR_PROCESS_ID_e) { + M_control_id = base.base.mBsPcId; + } + return TRUE; } /* 000002D0-00000408 .text Mthd_Create__Q210daObjHlift5Act_cFv */ cPhs_State daObjHlift::Act_c::Mthd_Create() { - /* Nonmatching */ + fopAcM_ct(this, daObjHlift::Act_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhase, M_arcname); + if (phase_state == cPhs_COMPLEATE_e) { + field_0x2D8 = prm_get_dist(); + field_0x2DC = prm_get_size(); + phase_state = MoveBGCreate( + M_arcname, + M_data_size[field_0x2DC].field_0x01, + dBgS_MoveBGProc_TypicalRotY, + *(int*)&M_data_size[field_0x2DC].field_0x02 + ); + JUT_ASSERT(366, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + return phase_state; } /* 00000408-00000430 .text Delete__Q210daObjHlift5Act_cFv */ BOOL daObjHlift::Act_c::Delete() { - /* Nonmatching */ + if (M_control_id == base.base.mBsPcId) { + M_control_id = fpcM_ERROR_PROCESS_ID_e; + } + return TRUE; } /* 00000430-0000047C .text Mthd_Delete__Q210daObjHlift5Act_cFv */ BOOL daObjHlift::Act_c::Mthd_Delete() { - /* Nonmatching */ + u32 result = MoveBGDelete(); + dComIfG_resDeleteDemo(&mPhase, M_arcname); + return result; } /* 0000047C-00000490 .text mode_lower_init__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_lower_init() { - /* Nonmatching */ + current.pos.y = home.pos.y; + field_0x2E0 = 0; } /* 00000490-000004F0 .text mode_lower__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_lower() { - /* Nonmatching */ + int switchIndex = prm_get_swSave(); + if (fopAcM_isSwitch(const_cast(this), switchIndex)) { + mode_demoreq_init(Mode_L_U); + } } /* 000004F0-000005B8 .text mode_l_u_init__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_l_u_init() { - /* Nonmatching */ + vib_set(); + field_0x2F0 = 0.0f; + field_0x2E0 = 1; + fopAcM_seStart(this, JA_SE_OBJ_PRT_LIFT_UD, 0); + field_0x2F4 = L_attr.field_0x24[L_time_lag_num]; + L_time_lag_num++; + L_time_lag_num %= 5; } /* 000005B8-00000724 .text mode_l_u__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_l_u() { /* Nonmatching */ + if (field_0x2F4 > 0) { + field_0x2F4--; + } else { + float fVar1 = current.pos.y - home.pos.y; + if (fVar1 < L_attr.field_0x04) { + cLib_chaseF(&field_0x2F0, L_attr.field_0x08, L_attr.field_0x10); + } else { + if (fVar1 < M_up_dist[field_0x2D8] - L_attr.field_0x04) { + field_0x2F0 = L_attr.field_0x08; + } else { + cLib_chaseF(&field_0x2F0, L_attr.field_0x0C, L_attr.field_0x14); + } + } + int iVar2 = cLib_chaseF(¤t.pos.y, home.pos.y + M_up_dist[field_0x2D8], field_0x2F0); + if (iVar2 != 0) { + vib_set(); + fopAcM_seStart(this, JA_SE_OBJ_PRT_LIFT_STOP, 0); + mode_upper_init(); + } + } } /* 00000724-00000778 .text mode_upper_init__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_upper_init() { - /* Nonmatching */ + current.pos.y = home.pos.y + M_up_dist[field_0x2D8]; + field_0x2E0 = 2; } /* 00000778-000007D8 .text mode_upper__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_upper() { - /* Nonmatching */ + int switchIndex = prm_get_swSave(); + if (!fopAcM_isSwitch(const_cast(this), switchIndex)) { + mode_demoreq_init(Mode_U_L); + } } /* 000007D8-000008A0 .text mode_u_l_init__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_u_l_init() { - /* Nonmatching */ + vib_set(); + field_0x2F0 = 0.0f; + fopAcM_seStart(this, JA_SE_OBJ_PRT_LIFT_UD, 0); + field_0x2F4 = L_attr.field_0x24[L_time_lag_num]; + L_time_lag_num++; + L_time_lag_num %= 5; + field_0x2E0 = 3; } /* 000008A0-000009DC .text mode_u_l__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_u_l() { /* Nonmatching */ + if (field_0x2F4 > 0) { + field_0x2F4--; + } else { + float fVar1 = current.pos.y - home.pos.y; + if (fVar1 < L_attr.field_0x04) { + cLib_chaseF(&field_0x2F0, L_attr.field_0x0C, L_attr.field_0x14); + } else { + if (fVar1 < M_up_dist[field_0x2D8] - L_attr.field_0x04) { + field_0x2F0 = L_attr.field_0x08; + } else { + cLib_chaseF(&field_0x2F0, L_attr.field_0x08, L_attr.field_0x10); + } + } + int iVar2 = cLib_chaseF(¤t.pos.y, home.pos.y, field_0x2F0); + if (iVar2 != 0) { + vib_set(); + fopAcM_seStart(this, JA_SE_OBJ_PRT_LIFT_STOP, 0); + mode_lower_init(); + } + } } /* 000009DC-00000AB0 .text mode_demoreq_init__Q210daObjHlift5Act_cFQ310daObjHlift5Act_c6Mode_e */ -void daObjHlift::Act_c::mode_demoreq_init(daObjHlift::Act_c::Mode_e) { - /* Nonmatching */ +void daObjHlift::Act_c::mode_demoreq_init(daObjHlift::Act_c::Mode_e next) { + JUT_ASSERT(DEMO_SELECT(573, 575), (next == Mode_U_L) || (next == Mode_L_U)); + field_0x2E4 = next; + field_0x2F6 = 0; + fopAcM_orderOtherEventId(this, mEventId, prm_get_evId()); + eventInfo.onCondition(dEvtCnd_UNK2_e); + field_0x2E0 = 4; } /* 00000AB0-00000B28 .text mode_demoreq__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::mode_demoreq() { - /* Nonmatching */ + if (dComIfGp_evmng_existence(mEventId) && eventInfo.checkCommandDemoAccrpt()) { + field_0x2F6 = 1; + } + if (field_0x2E4 == 3) { + mode_u_l_init(); + } else { + mode_l_u_init(); + } } /* 00000B28-00000BE8 .text set_mtx__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::set_mtx() { - /* Nonmatching */ + float z = current.pos.z; + float y1 = current.pos.y + field_0x2EC; + float y2 = y1 + L_attr.field_0x00; + mDoMtx_stack_c::transS(current.pos.x, y2, z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mModel1->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx); + mDoMtx_stack_c::transS(home.pos); + mModel2->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000BE8-00000C40 .text init_mtx__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::init_mtx() { - /* Nonmatching */ + mModel1->setBaseScale(scale); + mModel2->setBaseScale(scale); + set_mtx(); } /* 00000C40-00000C8C .text rot_set__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::rot_set() { - /* Nonmatching */ + float fVar1 = current.pos.y - home.pos.y; + float fVar2 = (65536.0f/L_attr.field_0x18); + shape_angle.y = -(s16)(int)(fVar1 * fVar2); } /* 00000C8C-00000CA8 .text vib_set__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::vib_set() { - /* Nonmatching */ + field_0x2E8 = L_attr.field_0x1C; + field_0x2EA = 16384; } /* 00000CA8-00000D70 .text vib_proc__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::vib_proc() { - /* Nonmatching */ + if (field_0x2E8 > 0) { + float fVar4 = L_attr.field_0x20; + float fVar2 = 0.5f; + float fVar1 = (L_attr.field_0x1C - field_0x2E8); + float fVar3 = (fVar2 / L_attr.field_0x1C); + float fVar5 = (fVar4 * (0.5f + fVar1 * fVar3)); + field_0x2EC = fVar5 * cM_ssin(field_0x2EA); + field_0x2EA += L_attr.field_0x1E; + field_0x2E8--; + } else { + field_0x2EC = 0.0f; + } } /* 00000D70-00000DE8 .text chk_demo_end__Q210daObjHlift5Act_cFv */ -void daObjHlift::Act_c::chk_demo_end() { +BOOL daObjHlift::Act_c::chk_demo_end() { /* Nonmatching */ + if (field_0x2F6 != 0 && dComIfGp_evmng_endCheck(mEventId)) { + dComIfGp_event_reset(); + field_0x2F6 = 0; + } + return field_0x2F6 == 0; } /* 00000DE8-00000E74 .text se_whole__Q210daObjHlift5Act_cFv */ void daObjHlift::Act_c::se_whole() { - /* Nonmatching */ + if (M_control_id == base.base.mBsPcId && M_lift_move_flag != 0) { + mDoAud_seStart(JA_SE_OBJ_PRT_LIFT_WORK); + M_lift_move_flag = 0; + } } /* 00000E74-00000FD4 .text Execute__Q210daObjHlift5Act_cFPPA3_A4_f */ -BOOL daObjHlift::Act_c::Execute(Mtx**) { +BOOL daObjHlift::Act_c::Execute(Mtx** param_1) { /* Nonmatching */ + typedef void (daObjHlift::Act_c::*procFunc)(); + static procFunc mode_proc[] = { + &daObjHlift::Act_c::mode_lower, + &daObjHlift::Act_c::mode_l_u, + &daObjHlift::Act_c::mode_upper, + &daObjHlift::Act_c::mode_u_l, + &daObjHlift::Act_c::mode_demoreq + }; + chk_demo_end(); + + (this->*mode_proc[field_0x2E0])(); + + if (field_0x2E0 == 1 || field_0x2E0 == 3 || field_0x2E0 == 4) { + M_lift_move_flag = 1; + } + rot_set(); + vib_proc(); + se_whole(); + eyePos = current.pos; + set_mtx(); + *param_1 = &M_tmp_mtx; + return TRUE; } /* 00000FD4-00001090 .text Draw__Q210daObjHlift5Act_cFv */ BOOL daObjHlift::Act_c::Draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mModel1, &tevStr); + g_env_light.setLightTevColorType(mModel2, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mModel1); + mDoExt_modelUpdateDL(mModel2); + dComIfGd_setList(); + return TRUE; } namespace daObjHlift { @@ -147,12 +348,12 @@ BOOL Mthd_Execute(void* i_this) { /* 000010F0-0000111C .text Mthd_Draw__Q210daObjHlift27@unnamed@d_a_obj_hlift_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { - return ((daObjHlift::Act_c*)i_this)->Draw(); + return ((daObjHlift::Act_c*)i_this)->MoveBGDraw(); } /* 0000111C-00001148 .text Mthd_IsDelete__Q210daObjHlift27@unnamed@d_a_obj_hlift_cpp@FPv */ BOOL Mthd_IsDelete(void* i_this) { - return ((daObjHlift::Act_c*)i_this)->IsDelete(); + return ((daObjHlift::Act_c*)i_this)->MoveBGIsDelete(); } static actor_method_class Mthd_Table = {