diff --git a/configure.py b/configure.py index 01d063dd1..6b67a2391 100755 --- a/configure.py +++ b/configure.py @@ -1677,7 +1677,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_gtaki"), ActorRel(NonMatching, "d_a_obj_hami2"), ActorRel(NonMatching, "d_a_obj_hami3"), - ActorRel(NonMatching, "d_a_obj_hami4"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_hami4"), ActorRel(Equivalent, "d_a_obj_hat"), # weak func order ActorRel(Matching, "d_a_obj_hbrf1"), ActorRel(NonMatching, "d_a_obj_hcbh"), diff --git a/include/d/actor/d_a_obj_hami4.h b/include/d/actor/d_a_obj_hami4.h index 815347af6..8abf4d956 100644 --- a/include/d/actor/d_a_obj_hami4.h +++ b/include/d/actor/d_a_obj_hami4.h @@ -1,17 +1,26 @@ #ifndef D_A_OBJ_HAMI4_H #define D_A_OBJ_HAMI4_H +#include "d/d_a_obj.h" +#include "d/d_bg_w.h" #include "f_op/f_op_actor.h" class daObjHami4_c : public fopAc_ac_c { public: + + enum Prm_e { + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x00, + }; + + inline cPhs_State _create(); inline bool _delete(); inline bool _draw(); inline bool _execute(); - void prm_get_swSave() const {} + int prm_get_swSave() const {return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S);} - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); void set_mtx(); void daObjHami4_close_stop(); @@ -20,7 +29,12 @@ public: void daObjHami4_open_stop(); public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel * mpModels[4]; + /* 0x2A8 */ dBgW* mdBgW[4]; + /* 0x2B8 */ Mtx field_0x2B8[4]; + /* 0x378 */ int field_0x378; + /* 0x37C */ f32 field_0x37C; +}; // Size: 0x380 #endif /* D_A_OBJ_HAMI4_H */ diff --git a/src/d/actor/d_a_obj_hami4.cpp b/src/d/actor/d_a_obj_hami4.cpp index ca1204107..10fdfb25a 100644 --- a/src/d/actor/d_a_obj_hami4.cpp +++ b/src/d/actor/d_a_obj_hami4.cpp @@ -4,67 +4,191 @@ // #include "d/actor/d_a_obj_hami4.h" +#include "JSystem/J3DGraphAnimator/J3DModel.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_hami4.h" /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* actor) { + return ((daObjHami4_c*)actor)->CreateHeap(); } /* 00000098-00000374 .text CreateHeap__12daObjHami4_cFv */ -void daObjHami4_c::CreateHeap() { - /* Nonmatching */ +BOOL daObjHami4_c::CreateHeap() { + J3DModelData * modelData = (J3DModelData *)dComIfG_getObjectRes("Hami4", HAMI4_BDL_HAMI4); + JUT_ASSERT(0x5f, modelData != NULL); + + if (fopAcM_isSwitch(this, prm_get_swSave())) { + this->field_0x378 = 3; + this->field_0x37C = 1500.0f; + } + else { + this->field_0x378 = 0; + this->field_0x37C = 0.0f; + } + for (int i = 0; i < 4; i++){ + mpModels[i] = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + if (mpModels[i] == NULL){ + return false; + } + short var = current.angle.y + i*0x4000; + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(var ); + mDoMtx_stack_c::transM((short)(-field_0x37C * cM_ssin(0x2000)), 0.0f, (short)(-field_0x37C * cM_scos(0x2000))); + mDoMtx_stack_c::scaleM(scale); + MTXCopy(mDoMtx_stack_c::get(), field_0x2B8[i]); + mpModels[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + mdBgW[i] = new dBgW(); + if (mdBgW[i] != NULL) { + cBgD_t* bgp = (cBgD_t*)dComIfG_getObjectRes("Hami4", HAMI4_DZB_HAMI4); + if(!mdBgW[i]->Set(bgp, dBgW::MOVE_BG_e, &field_0x2B8[i])){ + continue; + } + } + return false; + } + return true; } /* 00000374-00000420 .text CreateInit__12daObjHami4_cFv */ void daObjHami4_c::CreateInit() { - /* Nonmatching */ + fopAcM_SetMtx(this, mpModels[0]->getBaseTRMtx()); + for (int i = 0; i < 4; i++){ + dComIfG_Bgsp()->Regist(mdBgW[i],this); + } + fopAcM_setCullSizeBox + (this, -10000.0f,-100.0f,-10000.0f,10000.0f,100.0f,10000.0f); + fopAcM_setCullSizeFar(this, 1.0f); + set_mtx(); } /* 00000420-000005B8 .text set_mtx__12daObjHami4_cFv */ void daObjHami4_c::set_mtx() { - /* Nonmatching */ + for (int i = 0; i < 4; i++){ + short var = current.angle.y + i*0x4000; + mpModels[i]->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(var ); + mDoMtx_stack_c::transM((short)(-field_0x37C * cM_ssin(0x2000)), 0.0f, (short)(-field_0x37C * cM_scos(0x2000))); + mpModels[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), field_0x2B8[i]); + mdBgW[i]->Move(); + } } /* 000005B8-00000634 .text daObjHami4_close_stop__12daObjHami4_cFv */ void daObjHami4_c::daObjHami4_close_stop() { - /* Nonmatching */ + int switchIndex = prm_get_swSave(); + if (fopAcM_isSwitch(this, switchIndex)) { + fopAcM_orderOtherEvent2(this,"AMI4_OPEN",dEvtFlag_NOPARTNER_e); + field_0x378 = 1; + } } /* 00000634-00000714 .text daObjHami4_open_demo_wait__12daObjHami4_cFv */ void daObjHami4_c::daObjHami4_open_demo_wait() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + field_0x378 = 2; + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + fopAcM_seStartCurrent(this, JA_SE_OBJ_SLIDE_AMI_OPEN, 0); + } else { + fopAcM_orderOtherEvent2(this,"AMI4_OPEN",dEvtFlag_NOPARTNER_e); + } } /* 00000714-000007AC .text daObjHami4_open_demo__12daObjHami4_cFv */ void daObjHami4_c::daObjHami4_open_demo() { - /* Nonmatching */ + + field_0x37C += 10; + if (field_0x37C >= 1500.0f) { + field_0x37C = 1500.0f; + field_0x378 = 3; + dComIfGp_getVibration().StartShock(4,-0x21,cXyz(0.0f, 1.0f, 0.0f)); + dComIfGp_event_reset(); + } } /* 000007AC-000007B0 .text daObjHami4_open_stop__12daObjHami4_cFv */ -void daObjHami4_c::daObjHami4_open_stop() { - /* Nonmatching */ +void daObjHami4_c::daObjHami4_open_stop() {} + +cPhs_State daObjHami4_c::_create() { + fopAcM_SetupActor(this, daObjHami4_c); + for (int i = 0; i < 4; i++){ + mdBgW[i] = NULL; + } + cPhs_State status = dComIfG_resLoad(&mPhs, "Hami4"); + if (status == cPhs_COMPLEATE_e) { + if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x4900)) { + status = cPhs_ERROR_e; + } else { + CreateInit(); + } + } + return status; } /* 000007B0-00000870 .text daObjHami4_Create__FPv */ -static cPhs_State daObjHami4_Create(void*) { - /* Nonmatching */ +static cPhs_State daObjHami4_Create(void* i_this) { + return ((daObjHami4_c*)i_this)->_create(); +} + + +bool daObjHami4_c::_delete() { + for (int i = 0; i < 4; i++){ + if (mdBgW[i] != NULL && mdBgW[i]->ChkUsed()) { + dComIfG_Bgsp()->Release(mdBgW[i]); + } + } + dComIfG_resDeleteDemo(&mPhs,"Hami4"); + return TRUE; } /* 00000870-00000918 .text daObjHami4_Delete__FPv */ -static BOOL daObjHami4_Delete(void*) { - /* Nonmatching */ +static BOOL daObjHami4_Delete(void* i_this) { + return ((daObjHami4_c*)i_this)->_delete(); +} + +bool daObjHami4_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + dComIfGd_setListBG(); + for (int i = 0; i < 4; i++){ + g_env_light.setLightTevColorType(mpModels[i], &tevStr); + mDoExt_modelUpdateDL(mpModels[i]); + } + dComIfGd_setList(); + return TRUE; } /* 00000918-000009DC .text daObjHami4_Draw__FPv */ -static BOOL daObjHami4_Draw(void*) { - /* Nonmatching */ +static BOOL daObjHami4_Draw(void* i_this) { + return ((daObjHami4_c*)i_this)->_draw(); +} + +bool daObjHami4_c::_execute() { + switch (field_0x378) { + case 0: + daObjHami4_close_stop(); + break; + case 1: + daObjHami4_open_demo_wait(); + break; + case 2: + daObjHami4_open_demo(); + break; + case 3: + daObjHami4_open_stop(); + break; + } + set_mtx(); + return true; + } /* 000009DC-00000A58 .text daObjHami4_Execute__FPv */ -static BOOL daObjHami4_Execute(void*) { - /* Nonmatching */ +static BOOL daObjHami4_Execute(void* i_this) { + return ((daObjHami4_c*)i_this)->_execute(); } /* 00000A58-00000A60 .text daObjHami4_IsDelete__FPv */