diff --git a/configure.py b/configure.py index 543fa01ab..980f6ded3 100755 --- a/configure.py +++ b/configure.py @@ -1697,7 +1697,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_ospbox"), ActorRel(Matching, "d_a_obj_paper", extra_cflags=['-pragma "nosyminline on"']), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_pbka"), - ActorRel(NonMatching, "d_a_obj_pfall"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_pfall", extra_cflags=['-pragma "nosyminline on"']), ActorRel(NonMatching, "d_a_obj_plant"), ActorRel(NonMatching, "d_a_obj_rflw"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_rforce"), diff --git a/include/d/actor/d_a_obj_pfall.h b/include/d/actor/d_a_obj_pfall.h index a3d8849c1..71f9d8120 100644 --- a/include/d/actor/d_a_obj_pfall.h +++ b/include/d/actor/d_a_obj_pfall.h @@ -4,6 +4,7 @@ #include "f_op/f_op_actor.h" #include "d/d_bg_w.h" #include "SSystem/SComponent/c_phase.h" +#include "m_Do/m_Do_ext.h" class mDoExt_McaMorf; @@ -11,7 +12,7 @@ class daObj_Pfall_c : public fopAc_ac_c { public: void setAnm(); void set_mtx(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); cPhs_State _create(); bool _delete(); @@ -30,43 +31,51 @@ public: bool _execute(); void nz_draw(); bool _draw(); + + public: - /* 0x290 */ void* m290; - /* 0x294 */ cXyz m294[10]; - /* 0x30C */ cXyz m30C[10]; - /* 0x384 */ cXyz m384[2]; - /* 0x39C */ void* m39C; - /* 0x3A0 */ void* m3A0; - /* 0x3A4 */ void* m3A4; - /* 0x3A8 */ void* m3A8; - /* 0x3AC */ void* m3AC; - /* 0x3B0 */ void* m3B0; - /* 0x3B4 */ void* m3B4; - /* 0x3B8 */ u8 m3B8[0x3BC - 0x3B8]; + /* 0x290 */ void* field_0x290; + /* 0x294 */ cXyz field_0x294[10]; + /* 0x30C */ cXyz field_0x30C[10]; + /* 0x384 */ cXyz field_0x384[2]; + /* 0x39C */ u8 field_0x39C[0x3A8 - 0x39C]; + /* 0x3A8 */ int field_0x3A8; + /* 0x3AC */ int mTimer; + /* 0x3B0 */ int field_0x3B0; + /* 0x3B4 */ s16 field_0x3B4; + /* 0x3B6 */ u8 field_0x3B6[0x3B8 - 0x3B6]; + /* 0x3B8 */ int field_0x3B8; /* 0x3BC */ request_of_phase_process_class mPhsPfall; - /* 0x3C4 */ J3DModel* m3C4; - /* 0x3C8 */ dBgW* m3C8; - /* 0x3CC */ Mtx m3CC; - /* 0x3FC */ J3DModel* m3FC; - /* 0x400 */ dBgW* m400; - /* 0x404 */ Mtx m404; - /* 0x434 */ J3DModel* m434; - /* 0x438 */ u8 m438[0x43C - 0x438]; - /* 0x43C */ mDoExt_McaMorf* m43C; - /* 0x440 */ u8 m440[0x444 - 0x440]; - /* 0x444 */ void* vtbl; - /* 0x448 */ u8 m448[0x481 - 0x448]; - /* 0x481 */ u8 mState; - /* 0x482 */ u8 m482[0x484 - 0x482]; -}; + /* 0x3C4 */ J3DModel* field_0x3C4; + /* 0x3C8 */ dBgW* mpBgW; + /* 0x3CC */ Mtx field_0x3CC; + /* 0x3FC */ J3DModel* field_0x3FC; + /* 0x400 */ dBgW* mpBgW2; + /* 0x404 */ Mtx field_0x404; + /* 0x434 */ J3DModel* mpHimoModel; + /* 0x438 */ f32 field_0x438; + /* 0x43C */ mDoExt_McaMorf* mpMorf; + /* 0x440 */ u8 field_0x440[0x444 - 0x440]; + /* 0x444 */ mDoExt_3DlineMat1_c field_0x444; + /* 0x480 */ s8 mBckIdx; + /* 0x481 */ s8 field_0x481; + /* 0x482 */ s8 mOldAnmPrmIdx; + /* 0x483 */ bool field_0x483; +}; // Size: 0x484 class daObj_PfallHIO_c { public: daObj_PfallHIO_c(); + virtual ~daObj_PfallHIO_c() {mNo = -1;} public: - /* Place member variables here */ + /* 0x04 */ s8 mNo; + /* 0x05 */ bool field_0x05; + /* 0x06 */ u8 field_0x06; + /* 0x07 */ u8 field_0x07; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ s16 field_0x0C; }; #endif /* D_A_OBJ_PFALL_H */ diff --git a/src/d/actor/d_a_obj_pfall.cpp b/src/d/actor/d_a_obj_pfall.cpp index 8e9db4eb1..a83b5c4e9 100644 --- a/src/d/actor/d_a_obj_pfall.cpp +++ b/src/d/actor/d_a_obj_pfall.cpp @@ -5,146 +5,476 @@ #include "d/actor/d_a_obj_pfall.h" #include "d/d_procname.h" +#include "d/d_com_inf_game.h" +#include "d/res/res_pfall.h" +#include "d/d_lib.h" +#include "d/actor/d_a_player_main.h" #include "d/d_priority.h" +#include "weak_data_1811.h" // IWYU pragma: keep +#include "weak_bss_936_to_1036.h" // IWYU pragma: keep + +static const int l_bck_ix_tbl[] = { + PFALL_BCK_NZ_WAIT, + PFALL_BCK_HIKU, +}; + +static daObj_PfallHIO_c l_HIO; + /* 000000EC-0000010C .text CallbackCreateHeap__FP10fopAc_ac_c */ -static BOOL CallbackCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CallbackCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 0000010C-00000140 .text __ct__16daObj_PfallHIO_cFv */ daObj_PfallHIO_c::daObj_PfallHIO_c() { - /* Nonmatching */ + mNo = -1; + field_0x05 = false; + field_0x06 = 0; + field_0x08 = 3.0f; + field_0x0C = 0; } /* 00000140-00000190 .text setAnm__13daObj_Pfall_cFv */ void daObj_Pfall_c::setAnm() { - /* Nonmatching */ + static const int a_anm_bcks_tbl[] = { + PFALL_BCK_NZ_WAIT, + PFALL_BCK_HIKU, + }; + + static const dLib_anm_prm_c a_anm_prm_tbl[] = { + { + /* mAnmIdx */ -1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mAnmIdx */ 0, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mAnmIdx */ 1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + }; + + dLib_bcks_setAnm("Pfall", mpMorf, &mBckIdx, &field_0x481, &mOldAnmPrmIdx, a_anm_bcks_tbl, a_anm_prm_tbl, false); } /* 00000190-000004DC .text set_mtx__13daObj_Pfall_cFv */ void daObj_Pfall_c::set_mtx() { - /* Nonmatching */ + + static cXyz offset_pos_left(-35.0f, 0.0f, 105.0f); + static cXyz offset_pos_right(35.0f, 0.0f, -105.0f); + + field_0x3C4->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::transM(offset_pos_left); + mDoMtx_stack_c::transM(0.0f, -10.0f, 0.0f); + mDoMtx_stack_c::ZrotM(field_0x3B4); + mDoMtx_stack_c::transM(0.0f, 10.0f, 0.0f); + field_0x3C4->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), field_0x3CC); + + field_0x3FC->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::transM(offset_pos_right); + mDoMtx_stack_c::YrotM( -0x8000); + mDoMtx_stack_c::transM(0.0f, -10.0f, 0.0f); + mDoMtx_stack_c::ZrotM(field_0x3B4); + mDoMtx_stack_c::transM(0.0f, 10.0f, 0.0f); + field_0x3FC->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), field_0x404); + + J3DModel* pModel = mpMorf->getModel(); + static cXyz offset_pos(0.0f, 0.0f, -130.0f); + static cXyz scale(0.5f, 0.5f, 0.5f); + + pModel->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + + mDoMtx_stack_c::transM(offset_pos); + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_stack_c::transM(0.0f, field_0x438 + l_HIO.field_0x08, 0.0f); + mDoMtx_stack_c::YrotM(-0x8000); + mpHimoModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000518-00000858 .text CreateHeap__13daObj_Pfall_cFv */ -void daObj_Pfall_c::CreateHeap() { - /* Nonmatching */ +BOOL daObj_Pfall_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Pfall", PFALL_BDL_AOTSI); + JUT_ASSERT(0xD1, modelData != NULL); + field_0x3C4 = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + field_0x3FC = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + + if(field_0x3C4 == NULL || field_0x3FC == NULL) { + return FALSE; + } + + J3DModelData* himoModelData = (J3DModelData*)dComIfG_getObjectRes("Pfall", PFALL_BDL_PSUZU); + JUT_ASSERT(0xD9, himoModelData != NULL); + mpHimoModel = mDoExt_J3DModel__create(himoModelData, 0, 0x11020203); + + if (mpHimoModel == NULL) { + return FALSE; + } + + J3DModelData* nzModelData = (J3DModelData*)dComIfG_getObjectRes("Pfall", PFALL_BDL_NZ); + JUT_ASSERT(0xE0, nzModelData != NULL); + mpMorf = new mDoExt_McaMorf( + nzModelData, + NULL, NULL, + NULL, + -1, 1.0f, 0, -1, 1, + NULL, + 0x00080000, + 0x11000002 + ); + + if(mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + mpMorf->getModel()->setUserArea((u32)this); + set_mtx(); + mpMorf->calc(); + mpBgW = new dBgW(); + + if(mpBgW == NULL) { + return FALSE; + } + cBgD_t* pData = (cBgD_t*)dComIfG_getObjectRes("Pfall", PFALL_DZB_AOTOSI); + + if (mpBgW->Set(pData, cBgW::MOVE_BG_e, &field_0x3CC) == true) { + return FALSE; + } + mpBgW2 = new dBgW(); + + if(mpBgW2 == NULL) { + return FALSE; + } + + pData = (cBgD_t*)dComIfG_getObjectRes("Pfall", PFALL_DZB_AOTOSI); + + if (mpBgW2->Set(pData, cBgW::MOVE_BG_e, &field_0x404) == true) { + return FALSE; + } + return TRUE; } /* 00000858-000008CC .text CreateInit__13daObj_Pfall_cFv */ void daObj_Pfall_c::CreateInit() { - /* Nonmatching */ + dComIfG_Bgsp()->Regist(mpBgW, this); + dComIfG_Bgsp()->Regist(mpBgW2, this); + set_mtx(); + field_0x481 = 1; + mode_wait_init(); } /* 000008CC-000009E8 .text _create__13daObj_Pfall_cFv */ cPhs_State daObj_Pfall_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObj_Pfall_c); + cPhs_State phase = dComIfG_resLoad(&mPhsPfall, "Pfall"); + + if (phase == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CallbackCreateHeap, 0x38E0)) { + return cPhs_ERROR_e; + } else { + CreateInit(); + } + } + return phase; } /* 000009EC-00000AB0 .text _delete__13daObj_Pfall_cFv */ bool daObj_Pfall_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhsPfall, "Pfall"); + if(mpBgW && mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + if(mpBgW2 && mpBgW2->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW2); + } + return true; } /* 00000AB0-00000C04 .text cutProc__13daObj_Pfall_cFv */ void daObj_Pfall_c::cutProc() { - /* Nonmatching */ + static char* action_table[3] = { + "WAIT", + "OPEN", + "HIKU" + }; + int staffIdx = dComIfGp_evmng_getMyStaffId("Nzfall"); + if(staffIdx != -1) { + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), NULL, 0); + if(actIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if(dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(actIdx) { + case 0: + cutWaitStart(staffIdx); + break; + case 1: + cutOpenStart(staffIdx); + break; + case 2: + cutHikuStart(staffIdx); + break; + } + } + switch(actIdx) { + case 0: + cutWaitProc(staffIdx); + break; + case 1: + cutOpenProc(staffIdx); + break; + case 2: + cutHikuProc(staffIdx); + break; + } + } + } } /* 00000C04-00000C6C .text cutWaitStart__13daObj_Pfall_cFi */ -void daObj_Pfall_c::cutWaitStart(int) { - /* Nonmatching */ +void daObj_Pfall_c::cutWaitStart(int staffIdx) { + int* pTimerData = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer"); + if (pTimerData == NULL) { + mTimer = 0; + } + else { + mTimer = (s16)*pTimerData; + } } /* 00000C6C-00000D18 .text cutWaitProc__13daObj_Pfall_cFi */ -void daObj_Pfall_c::cutWaitProc(int) { - /* Nonmatching */ +void daObj_Pfall_c::cutWaitProc(int staffIdx) { + if(cLib_calcTimer(&mTimer) == 0) { + if(!field_0x483) { + field_0x483 = true; + fopAcM_monsSeStart(this, JA_SE_CV_NZ_LAUGH, 0); + } + dComIfGp_evmng_cutEnd(staffIdx); + } } /* 00000D18-00000D94 .text cutOpenStart__13daObj_Pfall_cFi */ void daObj_Pfall_c::cutOpenStart(int) { - /* Nonmatching */ + field_0x3B4 = 0; + field_0x3B0 = 0; + fopAcM_seStart(this, JA_SE_OBJ_TC_JAIL_FLR_BRK, 0); } /* 00000D94-00000E74 .text cutOpenProc__13daObj_Pfall_cFi */ -void daObj_Pfall_c::cutOpenProc(int) { - /* Nonmatching */ +void daObj_Pfall_c::cutOpenProc(int staffIdx) { + if (field_0x3B0 >= 7) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + const s16 temp[] = { + 0xC568, + 0xD508, + 0xC950, + 0xD120, + 0xCD38, + 0xCF2C, + 0xCE32 + }; + s16 temp2 = cLib_addCalcAngleS(&field_0x3B4, temp[field_0x3B0], 4, 0x2000, 0x100); + if ((s16)std::fabsf(temp2) <= 0x100) { + field_0x3B0++; + } + } } /* 00000E74-00000E80 .text cutHikuStart__13daObj_Pfall_cFi */ void daObj_Pfall_c::cutHikuStart(int) { - /* Nonmatching */ + field_0x481 = 2; } /* 00000E80-00000F00 .text cutHikuProc__13daObj_Pfall_cFi */ -void daObj_Pfall_c::cutHikuProc(int) { - /* Nonmatching */ +void daObj_Pfall_c::cutHikuProc(int staffIdx) { + if(field_0x481 == 2){ + if(mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(staffIdx); + field_0x481 = 1; + } + } } /* 00000F00-00000F1C .text mode_wait_init__13daObj_Pfall_cFv */ void daObj_Pfall_c::mode_wait_init() { - /* Nonmatching */ -} + field_0x3B8 = l_HIO.field_0x0C; + field_0x3A8 = NULL; +} /* 00000F1C-00000FC0 .text mode_wait__13daObj_Pfall_cFv */ void daObj_Pfall_c::mode_wait() { - /* Nonmatching */ + + if(dLib_checkPlayerInCircle(current.pos, 100.0f, 100.0f) + && dComIfGp_getPlayer(0)->speedF == 0.0f + && cLib_calcTimer(&field_0x3B8) == 0) { + mode_event_init(); + } + mpBgW->Move(); + mpBgW2->Move(); } /* 00000FC0-00000FCC .text mode_event_init__13daObj_Pfall_cFv */ void daObj_Pfall_c::mode_event_init() { - /* Nonmatching */ + field_0x3A8 = 1; } /* 00000FCC-000010A4 .text mode_event__13daObj_Pfall_cFv */ void daObj_Pfall_c::mode_event() { - /* Nonmatching */ + if(eventInfo.checkCommandDemoAccrpt()) { + if(dComIfGp_evmng_endCheck("NZFALL")) { + if(l_HIO.field_0x06 != 0) { + mode_wait_init(); + } else { + dComIfGp_setNextStage("sea", 15, 11); + } + } + } else { + fopAcM_orderOtherEvent(this, "NZFALL"); + } + mpBgW->Move(); + mpBgW2->Move(); } /* 000010A4-00001130 .text mode_proc_call__13daObj_Pfall_cFv */ void daObj_Pfall_c::mode_proc_call() { - /* Nonmatching */ + typedef void(daObj_Pfall_c::*ProcFunc)(void); + static const ProcFunc mode_proc[] = { + &daObj_Pfall_c::mode_wait, + &daObj_Pfall_c::mode_event, + }; + + (this->*mode_proc[field_0x3A8])(); } /* 00001130-000012F4 .text _execute__13daObj_Pfall_cFv */ bool daObj_Pfall_c::_execute() { - /* Nonmatching */ + + attention_info.position = current.pos; + eyePos = current.pos; + + if(dComIfGp_event_runCheck()) { + cutProc(); + } + + if(field_0x481 == 2) { + if(mpMorf->getFrame() == 6.0f) { + fopAcM_seStart(this, JA_SE_OBJ_TC_JAIL_STRING, 0); + } + f32 frame = mpMorf->getFrame(); + if (!(frame > 0.0f && frame <= 6.0f)) { + if (frame > 6.0f && frame <= 10.0f) { + field_0x438 += 1.0f; + } + else { + if (!(frame > 10.0f && frame <= 23.0f) && frame > 23.0f && frame <= 29.0f) { + field_0x438 -= 3.0f; + } + } + } + } else { + field_0x438 = 0.0f; + } + mpMorf->play(NULL, 0, 0); + fopAcM_posMoveF(this, NULL); + set_mtx(); + mode_proc_call(); + setAnm(); + return false; } /* 000012F4-0000142C .text nz_draw__13daObj_Pfall_cFv */ void daObj_Pfall_c::nz_draw() { - /* Nonmatching */ + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* pModelData = pModel->getModelData(); + + J3DJoint* rootJoint = pModelData->getJointNodePointer(0); + + J3DShape* matShape = pModelData->getMaterialNodePointer(0)->getShape(); + J3DShape* matShape2 = pModelData->getMaterialNodePointer(1)->getShape(); + J3DShape* matShape3 = pModelData->getMaterialNodePointer(2)->getShape(); + + matShape->hide(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + + mpMorf->updateDL(); + dComIfGd_setListMaskOff(); + + matShape->show(); + pModel->getMatPacket(0)->unlock(); + matShape2->hide(); + matShape3->hide(); + rootJoint->entryIn(); + matShape2->show(); + matShape3->show(); + + dComIfGd_setList(); } /* 0000142C-000014E4 .text _draw__13daObj_Pfall_cFv */ bool daObj_Pfall_c::_draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(field_0x3C4, &tevStr); + + g_env_light.setLightTevColorType(field_0x3FC, &tevStr); + mDoExt_modelUpdateDL(field_0x3C4); + mDoExt_modelUpdateDL(field_0x3FC); + nz_draw(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpHimoModel, &tevStr); + mDoExt_modelUpdateDL(mpHimoModel); + return true; } +// to match .rodata +static const int dummy[] = {0x00FF0080}; + /* 000014E4-00001504 .text daObj_PfallCreate__FPv */ -static s32 daObj_PfallCreate(void*) { - /* Nonmatching */ +static cPhs_State daObj_PfallCreate(void* i_this) { + return static_cast(i_this)->_create(); } /* 00001504-00001528 .text daObj_PfallDelete__FPv */ -static BOOL daObj_PfallDelete(void*) { - /* Nonmatching */ +static BOOL daObj_PfallDelete(void* i_this) { + return static_cast(i_this)->_delete(); } /* 00001528-0000154C .text daObj_PfallExecute__FPv */ -static BOOL daObj_PfallExecute(void*) { - /* Nonmatching */ +static BOOL daObj_PfallExecute(void* i_this) { + return static_cast(i_this)->_execute(); } /* 0000154C-00001570 .text daObj_PfallDraw__FPv */ -static BOOL daObj_PfallDraw(void*) { - /* Nonmatching */ +static BOOL daObj_PfallDraw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 00001570-00001578 .text daObj_PfallIsDelete__FPv */ static BOOL daObj_PfallIsDelete(void*) { - /* Nonmatching */ + return TRUE; } static actor_method_class daObj_PfallMethodTable = {