diff --git a/configure.py b/configure.py index 987a0fb79..0eac1193a 100644 --- a/configure.py +++ b/configure.py @@ -1551,7 +1551,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_iceisland"), ActorRel(NonMatching, "d_a_obj_jump"), ActorRel(NonMatching, "d_a_obj_kanoke"), - ActorRel(NonMatching, "d_a_obj_ladder"), + ActorRel(NonMatching, "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"), diff --git a/include/d/actor/d_a_obj_ladder.h b/include/d/actor/d_a_obj_ladder.h index 1be60b9df..1f4cc497f 100644 --- a/include/d/actor/d_a_obj_ladder.h +++ b/include/d/actor/d_a_obj_ladder.h @@ -1,20 +1,50 @@ #ifndef D_A_OBJ_LADDER_H #define D_A_OBJ_LADDER_H +#include "d/d_a_obj.h" +#include "d/d_bg_s_gnd_chk.h" +#include "d/d_bg_s_movebg_actor.h" #include "f_op/f_op_actor.h" namespace daObjLadder { - class Act_c : public fopAc_ac_c { + enum Type_e { + MHSG6_e, + MHSG9_e, + MHSG12_e, + MHSG15_e, + MHSG4H_e, + }; + + class Act_c : public dBgS_MoveBgActor { public: - void prm_get_evId() const {} - void prm_get_swSave() const {} - void prm_get_type() const {} - - void CreateHeap(); - s32 Create(); - void Mthd_Create(); + enum Mode_e { + Mode_WAIT_e, + Mode_DEMOREQ_e, + Mode_VIB_e, + Mode_DROP_e, + Mode_FELL_e, + }; + + enum Prm_e { + PRM_EV_ID_W = 0x08, + PRM_EV_ID_S = 0x10, + + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x08, + + PRM_TYPE_W = 0x03, + PRM_TYPE_S = 0x00, + }; + + u8 prm_get_evId() const { return daObj::PrmAbstract(this, PRM_EV_ID_W, PRM_EV_ID_S); } + s32 prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); } + Type_e prm_get_type() const { return (Type_e)daObj::PrmAbstract(this, PRM_TYPE_W, PRM_TYPE_S); } + + BOOL CreateHeap(); + int Create(); + s32 Mthd_Create(); BOOL Delete(); - void Mthd_Delete(); + BOOL Mthd_Delete(); void demo_end_reset(); void mode_wait_init(); void mode_wait(); @@ -28,11 +58,27 @@ namespace daObjLadder { void mode_fell(); void set_mtx(); void init_mtx(); - void Execute(float(**)[3][4]); + int Execute(Mtx**); BOOL Draw(); - + + static Mtx M_tmp_mtx; + static const char M_arcname[]; + public: - /* Place member variables here */ + /* 0x2C8 */ request_of_phase_process_class mPhs; + /* 0x2D0 */ J3DModel* mpModel; + /* 0x2D4 */ Type_e mType; + /* 0x2D8 */ Mode_e mMode; + /* 0x2DC */ s16 unk2DC; + /* 0x2DE */ s16 unk2DE; + /* 0x2E0 */ f32 mGndY; + /* 0x2E4 */ dBgS_ObjGndChk mGndChk; + /* 0x338 */ s16 unk338; + /* 0x33A */ s16 unk33A; + /* 0x33C */ f32 unk33C; + /* 0x340 */ f32 unk340; + /* 0x344 */ s16 mEventIdx; + /* 0x346 */ u8 unk346; }; }; diff --git a/src/d/actor/d_a_obj_ladder.cpp b/src/d/actor/d_a_obj_ladder.cpp index 4e86bec8e..8e923bd05 100644 --- a/src/d/actor/d_a_obj_ladder.cpp +++ b/src/d/actor/d_a_obj_ladder.cpp @@ -4,133 +4,332 @@ // #include "d/actor/d_a_obj_ladder.h" +#include "d/res/res_mhsg.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" +// Needed for .data to match. +static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; +static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[4] = {0x02, 0x00, 0x02, 0x01}; +static f64 dummy4[2] = {3.0, 0.5}; + +Mtx daObjLadder::Act_c::M_tmp_mtx; + +namespace daObjLadder { + namespace { + struct Attr_c { + /* 0x00 */ f32 field_0x00; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 field_0x0C; + /* 0x10 */ u8 field_0x10; + /* 0x11 */ u8 field_0x11; + /* 0x12 */ u8 field_0x12; + /* 0x13 */ u8 field_0x13; + /* 0x14 */ u8 field_0x14; + /* 0x16 */ s16 field_0x16; + /* 0x18 */ s16 field_0x18; + /* 0x1A */ s16 field_0x1A; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + }; + + static const Attr_c L_attr = { // TODO: Figure out what these are + -3.0f, 0.005f, 0.0005f, 0.5f, + 3, 75, 50, 45, 40, + 20000, 0x3CC3, 0x000F, + 2.0f, 1.0f, + }; + + inline const Attr_c & attr() { return L_attr; } + + struct AttrType { + s16 modelId; + s16 dzbId; + f32 field_0x04; + }; + + static AttrType L_attr_type[] = { + {MHSG_BDL_MHSG6, MHSG_DZB_MHSG6, 600.0f}, + {MHSG_BDL_MHSG9, MHSG_DZB_MHSG9, 900.0f}, + {MHSG_BDL_MHSG12, MHSG_DZB_MHSG12, 1200.0f}, + {MHSG_BDL_MHSG15, MHSG_DZB_MHSG15, 1500.0f}, + {MHSG_BDL_MHSG4H, MHSG_DZB_MHSG4H, 450.0f}, + }; + + inline const AttrType& attr_type(Type_e type) { return L_attr_type[type]; } + } +} + +const char daObjLadder::Act_c::M_arcname[] = "Mhsg"; + /* 00000078-0000013C .text CreateHeap__Q211daObjLadder5Act_cFv */ -void daObjLadder::Act_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjLadder::Act_c::CreateHeap() { + J3DModelData* model_data = static_cast(dComIfG_getObjectRes(M_arcname, attr_type(mType).modelId)); + JUT_ASSERT(0x17E, model_data != 0); + + mpModel = mDoExt_J3DModel__create(model_data, 0x80000U, 0x11000022U); + + return mpModel != NULL; } /* 0000013C-000002F0 .text Create__Q211daObjLadder5Act_cFv */ -s32 daObjLadder::Act_c::Create() { - /* Nonmatching */ +int daObjLadder::Act_c::Create() { + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + init_mtx(); + + fopAcM_setCullSizeBox(this, -55.0f, -1.0f, -10.0f, 55.0f, attr_type(mType).field_0x04 + 41.0f, 10.0f); + + cXyz pos; + mDoMtx_stack_c::push(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::transM(0.0f, 10.0f, 5.0f); + mDoMtx_stack_c::multVec(&cXyz::Zero, &pos); + mDoMtx_stack_c::pop(); + + mGndChk.SetPos(&pos); + mGndChk.SetActorPid(base.mBsPcId); + mGndY = dComIfG_Bgsp()->GroundCross(&mGndChk); + unk346 = 0; + + mEventIdx = dComIfGp_evmng_getEventIdx(NULL, prm_get_evId()); + + if (prm_get_swSave() == 0xFF || fopAcM_isSwitch(this, prm_get_swSave())) { + current.pos.y = mGndY; + set_mtx(); + mode_fell_init(); + } else { + mode_wait_init(); + } + + return TRUE; } /* 000002F0-000004F8 .text Mthd_Create__Q211daObjLadder5Act_cFv */ -void daObjLadder::Act_c::Mthd_Create() { - /* Nonmatching */ +s32 daObjLadder::Act_c::Mthd_Create() { + fopAcM_SetupActor(this, Act_c); + s32 phase_state = dComIfG_resLoad(&mPhs, M_arcname); + + if (phase_state == cPhs_COMPLEATE_e) { + mType = prm_get_type(); + phase_state = MoveBGCreate(M_arcname, attr_type(mType).dzbId, dBgS_MoveBGProc_Trans, 0x900); + + JUT_ASSERT(0x1DE, (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + + return phase_state; } /* 000009B8-000009C0 .text Delete__Q211daObjLadder5Act_cFv */ BOOL daObjLadder::Act_c::Delete() { - /* Nonmatching */ + return TRUE; } /* 000009C0-00000A0C .text Mthd_Delete__Q211daObjLadder5Act_cFv */ -void daObjLadder::Act_c::Mthd_Delete() { - /* Nonmatching */ +BOOL daObjLadder::Act_c::Mthd_Delete() { + BOOL res = MoveBGDelete(); + + dComIfG_resDelete(&mPhs, M_arcname); + + return res; } /* 00000A0C-00000A78 .text demo_end_reset__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::demo_end_reset() { - /* Nonmatching */ + if (unk346 && dComIfGp_evmng_endCheck(mEventIdx)) { + dComIfGp_event_reset(); + unk346 = 0; + } } /* 00000A78-00000A84 .text mode_wait_init__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_wait_init() { - /* Nonmatching */ + mMode = Mode_WAIT_e; } /* 00000A84-00000AE0 .text mode_wait__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_wait() { - /* Nonmatching */ + if (fopAcM_isSwitch(this, prm_get_swSave())) { + mode_demoreq_init(); + } } /* 00000AE0-00000AF4 .text mode_demoreq_init__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_demoreq_init() { - /* Nonmatching */ + mMode = Mode_DEMOREQ_e; + unk346 = 0; } /* 00000AF4-00000BB4 .text mode_demoreq__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_demoreq() { - /* Nonmatching */ + bool ret = false; + if (dComIfGp_evmng_existence(mEventIdx)) { + if (eventInfo.checkCommandDemoAccrpt()) { + ret = true; + unk346 = 1; + } else { + fopAcM_orderOtherEventId(this, mEventIdx, prm_get_evId()); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } + } else { + ret = true; + } + + if (ret) { + mode_vib_init(); + } } /* 00000BB4-00000BDC .text mode_vib_init__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_vib_init() { - /* Nonmatching */ + unk2DC = attr().field_0x1A; + unk338 = 0; + unk33A = 0; + mMode = Mode_VIB_e; } /* 00000BDC-00000C98 .text mode_vib__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_vib() { - /* Nonmatching */ + unk338 += attr().field_0x16; + unk33A += attr().field_0x18; + + unk33C = cM_scos(unk338) * attr().field_0x1C; + unk340 = cM_scos(unk33A) * attr().field_0x20; + + if (--unk2DC <= 0) { + mode_drop_init(); + } } /* 00000C98-00000CDC .text mode_drop_init__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_drop_init() { - /* Nonmatching */ + gravity = -5.0f; + speed.set(cXyz::Zero); + unk2DE = attr().field_0x10; + mMode = Mode_DROP_e; } /* 00000CDC-00000EA8 .text mode_drop__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_drop() { - /* Nonmatching */ + daObj::posMoveF_stream(this, NULL, &cXyz::Zero, attr().field_0x04, attr().field_0x08); + + if (current.pos.y < mGndY) { + if (unk2DE == attr().field_0x10) { + fopAcM_seStart(this, JA_SE_OBJ_LADDER_FALL_1, dComIfG_Bgsp()->GetMtrlSndId(mGndChk)); + + dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + } else { + s32 tmp = attr().field_0x10 - unk2DE; + s32 param_2; + + if (tmp == 1) { + param_2 = attr().field_0x11; + } else if (tmp == 2) { + param_2 = attr().field_0x12; + } else if (tmp == 3) { + param_2 = attr().field_0x13; + } else { + param_2 = attr().field_0x14; + } + + fopAcM_seStart(this, JA_SE_OBJ_LADDER_FALL_2, param_2); + } + + if (unk2DE >= 0) { + unk2DE--; + + current.pos.y = mGndY - (current.pos.y - mGndY) * 0.5f; + speed.y *= -0.5f; + } else { + current.pos.y = mGndY; + mode_fell_init(); + } + } } /* 00000EA8-00000EB4 .text mode_fell_init__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::mode_fell_init() { - /* Nonmatching */ + mMode = Mode_FELL_e; } /* 00000EB4-00000EB8 .text mode_fell__Q211daObjLadder5Act_cFv */ -void daObjLadder::Act_c::mode_fell() { - /* Nonmatching */ -} +void daObjLadder::Act_c::mode_fell() {} /* 00000EB8-00000F4C .text set_mtx__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(shape_angle); + cMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx); + + mDoMtx_stack_c::transM(unk33C, unk340, 0.0f); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000F4C-00000F88 .text init_mtx__Q211daObjLadder5Act_cFv */ void daObjLadder::Act_c::init_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + set_mtx(); } /* 00000F88-000010A0 .text Execute__Q211daObjLadder5Act_cFPPA3_A4_f */ -void daObjLadder::Act_c::Execute(float(**)[3][4]) { - /* Nonmatching */ +int daObjLadder::Act_c::Execute(Mtx** ppMtx) { + typedef void (Act_c::*ModeFunc)(); + static const ModeFunc mode_proc[] = { + mode_wait, + mode_demoreq, + mode_vib, + mode_drop, + mode_fell, + }; + + demo_end_reset(); + (this->*mode_proc[mMode])(); + eyePos.y = current.pos.y; + set_mtx(); + *ppMtx = &M_tmp_mtx; + + return TRUE; } /* 000010A0-00001140 .text Draw__Q211daObjLadder5Act_cFv */ BOOL daObjLadder::Act_c::Draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + + return TRUE; } namespace daObjLadder { namespace { /* 00001140-00001160 .text Mthd_Create__Q211daObjLadder28@unnamed@d_a_obj_ladder_cpp@FPv */ -void Mthd_Create(void*) { - /* Nonmatching */ +static s32 Mthd_Create(void* i_this) { + return static_cast(i_this)->Mthd_Create(); } /* 00001160-00001180 .text Mthd_Delete__Q211daObjLadder28@unnamed@d_a_obj_ladder_cpp@FPv */ -void Mthd_Delete(void*) { - /* Nonmatching */ +static BOOL Mthd_Delete(void* i_this) { + return static_cast(i_this)->Mthd_Delete(); } /* 00001180-000011A0 .text Mthd_Execute__Q211daObjLadder28@unnamed@d_a_obj_ladder_cpp@FPv */ -void Mthd_Execute(void*) { - /* Nonmatching */ +static BOOL Mthd_Execute(void* i_this) { + return static_cast(i_this)->MoveBGExecute(); } /* 000011A0-000011CC .text Mthd_Draw__Q211daObjLadder28@unnamed@d_a_obj_ladder_cpp@FPv */ -void Mthd_Draw(void*) { - /* Nonmatching */ +static BOOL Mthd_Draw(void* i_this) { + return static_cast(i_this)->MoveBGDraw(); } /* 000011CC-000011F8 .text Mthd_IsDelete__Q211daObjLadder28@unnamed@d_a_obj_ladder_cpp@FPv */ -void Mthd_IsDelete(void*) { - /* Nonmatching */ +static BOOL Mthd_IsDelete(void* i_this) { + return static_cast(i_this)->MoveBGIsDelete(); } static actor_method_class Mthd_Table = {