diff --git a/configure.py b/configure.py index cbc38f338..a6a6ac34d 100755 --- a/configure.py +++ b/configure.py @@ -1618,7 +1618,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_komore"), ActorRel(Matching, "d_a_lbridge"), ActorRel(Matching, "d_a_leaflift"), - ActorRel(NonMatching, "d_a_lstair"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_lstair"), ActorRel(Matching, "d_a_machine"), ActorRel(NonMatching, "d_a_mant"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_mbdoor"), diff --git a/include/d/actor/d_a_lstair.h b/include/d/actor/d_a_lstair.h index 5422a44c5..5102daadd 100644 --- a/include/d/actor/d_a_lstair.h +++ b/include/d/actor/d_a_lstair.h @@ -2,13 +2,15 @@ #define D_A_LSTAIR_H #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_ext.h" +#include "d/d_kankyo.h" +#include "d/d_com_inf_game.h" class daLStair_c : public fopAc_ac_c { public: - inline bool _draw(); - + inline BOOL _draw(); bool _delete(); - void CreateHeap(); + BOOL CreateHeap(); void CreateInit(); cPhs_State _create(); void set_mtx(); @@ -22,8 +24,25 @@ public: void set_on_se(); void set_off_se(); -public: - /* Place member variables here */ + static const char m_arcname[]; + + /* 0x290 */ request_of_phase_process_class mPhase; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ dBgW* mpBgW; + /* 0x2A0 */ Mtx mBgMtx; + /* 0x2D0 */ mDoExt_bckAnm mBckAnm; + /* 0x2E0 */ mDoExt_btkAnm mBtkAnm; + /* 0x2F4 */ mDoExt_bpkAnm mBpkAnm0; + /* 0x308 */ mDoExt_bpkAnm mBpkAnm1; + /* 0x31C */ mDoExt_brkAnm mBrkAnm; + /* 0x334 */ f32 mStairYOffset; + /* 0x338 */ s32 mSwitchNo; + /* 0x33C */ u16 mEventState; + /* 0x33E */ s16 mEventIdx; + /* 0x340 */ u8 mTimer; + /* 0x341 */ s8 mAppearTimer; + /* 0x342 */ bool mSwitchStatus; + /* 0x343 */ bool mEnemyGone; }; #endif /* D_A_LSTAIR_H */ diff --git a/src/d/actor/d_a_lstair.cpp b/src/d/actor/d_a_lstair.cpp index bb3b1b565..7e5060a51 100644 --- a/src/d/actor/d_a_lstair.cpp +++ b/src/d/actor/d_a_lstair.cpp @@ -5,100 +5,358 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_lstair.h" +#include "d/d_stage.h" +#include "res/Object/Gkai00.h" + +const char daLStair_c::m_arcname[] = "Gkai00"; /* 00000078-000000D4 .text _delete__10daLStair_cFv */ bool daLStair_c::_delete() { - /* Nonmatching */ + if (heap != NULL) { + dComIfG_Bgsp()->Release(mpBgW); + } + + dComIfG_resDelete(&mPhase, m_arcname); + + return TRUE; } /* 000000D4-000000F4 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->CreateHeap(); } /* 000000F4-000004F8 .text CreateHeap__10daLStair_cFv */ -void daLStair_c::CreateHeap() { - /* Nonmatching */ +BOOL daLStair_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BDL_GKAI00_e); + JUT_ASSERT(0xD8, modelData != NULL); + + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000223); + if (mpModel == NULL) { + return FALSE; + } + + J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BCK_GKAI00_e); + JUT_ASSERT(0xE9, pbck != NULL); + + if (!mBckAnm.init(modelData, pbck, true, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false)) { + return FALSE; + } + + J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BTK_GKAI00_e); + JUT_ASSERT(0xF4, pbtk != NULL); + + if (!mBtkAnm.init(modelData, pbtk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + J3DAnmColor* pbpk = (J3DAnmColor*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BPK_GKAI00_01_e); + JUT_ASSERT(0xFF, pbpk != NULL); + + if (!mBpkAnm0.init(modelData, pbpk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + pbpk = (J3DAnmColor*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BPK_GKAI00_02_e); + JUT_ASSERT(0x10A, pbpk != NULL); + + if (!mBpkAnm1.init(modelData, pbpk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_BRK_GKAI00_e); + JUT_ASSERT(0x116, pbrk != NULL); + + if (!mBrkAnm.init(modelData, pbrk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0)) { + return FALSE; + } + + mpBgW = new dBgW(); + if (mpBgW != NULL) { + cBgD_t* bgd_data = (cBgD_t*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_GKAI00_DZB_GKAI00_e); + + if (mpBgW->Set(bgd_data, cBgW::MOVE_BG_e, &mBgMtx) == true) { + return FALSE; + } else { + return TRUE; + } + } + + return FALSE; } /* 000004F8-00000638 .text CreateInit__10daLStair_cFv */ void daLStair_c::CreateInit() { - /* Nonmatching */ + cullMtx = mpModel->getBaseTRMtx(); + fopAcM_setCullSizeBox(this, -200.0f, -300.0f, -100.0f, 200.0f, 100.0f, 700.0f); + cullSizeFar = 1.5f; + mSwitchNo = fopAcM_GetParam(this) & 0xFF; + mSwitchStatus = dComIfGs_isSwitch(mSwitchNo, fopAcM_GetHomeRoomNo(this)) != 0; + mEnemyGone = fopAcM_myRoomSearchEnemy(fopAcM_GetRoomNo(this)) == NULL; + mEventIdx = dComIfGp_evmng_getEventIdx("STAIRAPPEAR", 0xFF); + mStairYOffset = -330.0f; + mAppearTimer = -1; + + if ((mSwitchNo == 0xFF && mEnemyGone) || (mSwitchNo != 0xFF && mSwitchStatus)) { + mStairYOffset = 0.0f; + } + + setMoveBGMtx(); + dComIfG_Bgsp()->Regist(mpBgW, this); + mpBgW->Move(); + set_mtx(); } /* 00000638-00000758 .text _create__10daLStair_cFv */ cPhs_State daLStair_c::_create() { - /* Nonmatching */ + fopAcM_ct(this, daLStair_c); + + cPhs_State phase_state = dComIfG_resLoad(&mPhase, m_arcname); + + if (phase_state == cPhs_COMPLEATE_e) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2960)) { + return cPhs_ERROR_e; + } + + CreateInit(); + } + + return phase_state; } /* 00000910-00000998 .text set_mtx__10daLStair_cFv */ void daLStair_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(scale); + + mDoMtx_stack_c::transS( + current.pos.x, + current.pos.y + mStairYOffset, + current.pos.z + ); + mDoMtx_stack_c::YrotM(current.angle.y); + + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000998-00000A1C .text setMoveBGMtx__10daLStair_cFv */ void daLStair_c::setMoveBGMtx() { - /* Nonmatching */ + f32 y = current.pos.y; + f32 h = mStairYOffset; + f32 c = -300.0f; + + mDoMtx_stack_c::transS( + current.pos.x, + h + (y + c), + current.pos.z + ); + + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::scaleM(scale.x, scale.y, scale.z); + mDoMtx_copy(mDoMtx_stack_c::get(), mBgMtx); } /* 00000A1C-00000ACC .text _execute__10daLStair_cFv */ bool daLStair_c::_execute() { - /* Nonmatching */ + bool switch_status = dComIfGs_isSwitch(mSwitchNo, fopAcM_GetHomeRoomNo(this)); + bool enemy_gone = fopAcM_myRoomSearchEnemy(fopAcM_GetRoomNo(this)) == NULL; + + checkAppear(); + demoMove(); + moveBG(); + + mBtkAnm.play(); + mBpkAnm0.play(); + mBpkAnm1.play(); + mBrkAnm.play(); + + set_mtx(); + + mSwitchStatus = switch_status; + mEnemyGone = enemy_gone; + + return 1; } /* 00000ACC-00000B8C .text demoMove__10daLStair_cFv */ void daLStair_c::demoMove() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + if (dComIfGp_evmng_endCheck(mEventIdx)) { + dComIfGp_event_reset(); + } + } else if (mEventState == 1) { + fopAcM_orderOtherEventId(this, mEventIdx, 0xFF, 0xFFFF, 0, 1); + eventInfo.onCondition(dEvtCnd_UNK2_e); + } + + if (dComIfGp_evmng_startCheck(mEventIdx)) { + mEventState = 0; + } } /* 00000B8C-00000C88 .text checkAppear__10daLStair_cFv */ void daLStair_c::checkAppear() { - /* Nonmatching */ + bool switch_status = dComIfGs_isSwitch( + mSwitchNo, + fopAcM_GetHomeRoomNo(this) + ); + bool enemy_gone = fopAcM_myRoomSearchEnemy(current.roomNo) == NULL; + + if (mSwitchNo != 0xFF) { + if (switch_status != mSwitchStatus) { + if (switch_status) { + appear_stair(); + } else { + disappear_stair(); + } + } + } else { + if (enemy_gone != mEnemyGone) { + if (enemy_gone) { + mAppearTimer = 0x33; + } else { + disappear_stair(); + } + } + + s8 timer = mAppearTimer; + if (timer > 0) { + mAppearTimer = timer - 1; + } else if (timer == 0) { + appear_stair(); + mAppearTimer = mAppearTimer - 1; + } + } } /* 00000C88-00000D78 .text moveBG__10daLStair_cFv */ void daLStair_c::moveBG() { - /* Nonmatching */ + bool switch_status = dComIfGs_isSwitch(mSwitchNo, home.roomNo); + bool enemy_gone = fopAcM_myRoomSearchEnemy(current.roomNo) == NULL; + + f32 target; + if ((mSwitchNo != 0xFF && switch_status) || + (mSwitchNo == 0xFF && enemy_gone)) { + target = 0.0f; + } else { + target = -300.0f; + } + + if (mAppearTimer < 0) { + if (cLib_calcTimer(&mTimer) == 0) { + cLib_addCalc(&mStairYOffset, target, 1.0f / 60.0f, 10.0f, 5.0f); + } + } + + setMoveBGMtx(); + mpBgW->Move(); } /* 00000D78-00000F74 .text appear_stair__10daLStair_cFv */ void daLStair_c::appear_stair() { - /* Nonmatching */ + cXyz local_20 = home.pos; + cXyz local_2c(-148.0f, 0.0f, 0.0f); + cXyz local_38(148.0f, 0.0f, 0.0f); + + mDoMtx_stack_c::transS( + current.pos.x, + home.pos.y - 300.0f, + current.pos.z + ); + mDoMtx_stack_c::YrotM(current.angle.y); + + PSMTXMultVec(mDoMtx_stack_c::get(), &local_2c, &local_2c); + PSMTXMultVec(mDoMtx_stack_c::get(), &local_38, &local_38); + + local_20.y -= 300.0f; + + dComIfGp_particle_set(dPa_name::ID_IT_SN_RSTAIRS_F00, &local_20, ¤t.angle); + dComIfGp_particle_set(dPa_name::ID_IT_SN_RSTAIRS_S00, &local_2c, ¤t.angle); + dComIfGp_particle_set(dPa_name::ID_IT_SN_RSTAIRS_S00, &local_38, ¤t.angle); + + set_on_se(); + + mBpkAnm0.setFrame(0.0f); + mBpkAnm0.setPlaySpeed(1.0f); + mBpkAnm1.setFrame(0.0f); + mBpkAnm1.setPlaySpeed(1.0f); + mBtkAnm.setFrame(0.0f); + mBtkAnm.setPlaySpeed(1.0f); + mBrkAnm.setPlaySpeed(1.0f); + + mTimer = 0x28; + mEventState = 1; } /* 00000F74-0000103C .text disappear_stair__10daLStair_cFv */ void daLStair_c::disappear_stair() { - /* Nonmatching */ + set_off_se(); + + mBpkAnm0.setFrame(mBpkAnm0.getEndFrame()); + mBpkAnm0.setPlaySpeed(-1.0f); + + mBpkAnm1.setFrame(mBpkAnm1.getEndFrame()); + mBpkAnm1.setPlaySpeed(-1.0f); + + mBtkAnm.setFrame(mBtkAnm.getEndFrame()); + mBtkAnm.setPlaySpeed(-1.0f); + + mBrkAnm.setPlaySpeed(-1.0f); + + mTimer = 0x28; } /* 0000103C-000010D4 .text set_on_se__10daLStair_cFv */ void daLStair_c::set_on_se() { - /* Nonmatching */ + stage_stag_info_class* stage_info = dComIfGp_getStage().getStagInfo(); + + if ((dStage_stagInfo_GetSaveTbl(stage_info)) == dStageType_FF1_e) { + fopAcM_seStart(this, JA_SE_OBJ_R_STAIR_APPEAR, 0); + } } /* 000010D4-00001144 .text set_off_se__10daLStair_cFv */ void daLStair_c::set_off_se() { - /* Nonmatching */ + fopAcM_seStart(this, JA_SE_OBJ_L_BRIDGE_OFF, 0); } /* 00001144-00001164 .text daLStair_Create__FPv */ static cPhs_State daLStair_Create(void* i_this) { - return ((daLStair_c*)i_this)->_create(); + return static_cast(i_this)->_create(); } /* 00001164-00001188 .text daLStair_Delete__FPv */ static BOOL daLStair_Delete(void* i_this) { - return ((daLStair_c*)i_this)->_delete(); + return static_cast(i_this)->_delete(); +} + +inline BOOL daLStair_c::_draw() { + g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(mpModel, &tevStr); + + J3DModelData* modelData = mpModel->getModelData(); + mBtkAnm.entry(modelData, mBtkAnm.getFrame()); + modelData = mpModel->getModelData(); + mBpkAnm0.entry(modelData, mBpkAnm0.getFrame()); + modelData = mpModel->getModelData(); + mBpkAnm1.entry(modelData, mBpkAnm1.getFrame()); + modelData = mpModel->getModelData(); + mBrkAnm.entry(modelData, mBrkAnm.getFrame()); + + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + + return TRUE; } /* 00001188-0000128C .text daLStair_Draw__FPv */ -static BOOL daLStair_Draw(void*) { - /* Nonmatching */ +static BOOL daLStair_Draw(void* i_this) { + return static_cast(i_this)->_draw(); } /* 0000128C-000012B0 .text daLStair_Execute__FPv */ static BOOL daLStair_Execute(void* i_this) { - return ((daLStair_c*)i_this)->_execute(); + return static_cast(i_this)->_execute(); } /* 000012B0-000012B8 .text daLStair_IsDelete__FPv */