summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconfigure.py2
-rw-r--r--include/d/actor/d_a_lstair.h29
-rw-r--r--src/d/actor/d_a_lstair.cpp302
3 files changed, 305 insertions, 28 deletions
diff --git a/configure.py b/configure.py
index cbc38f33..a6a6ac34 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 5422a44c..5102daad 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 bb3b1b56..7e5060a5 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<daLStair_c*>(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, &current.angle);
+ dComIfGp_particle_set(dPa_name::ID_IT_SN_RSTAIRS_S00, &local_2c, &current.angle);
+ dComIfGp_particle_set(dPa_name::ID_IT_SN_RSTAIRS_S00, &local_38, &current.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<daLStair_c*>(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<daLStair_c*>(i_this)->_delete();
+}
+
+inline BOOL daLStair_c::_draw() {
+ g_env_light.settingTevStruct(TEV_TYPE_BG0, &current.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<daLStair_c*>(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<daLStair_c*>(i_this)->_execute();
}
/* 000012B0-000012B8 .text daLStair_IsDelete__FPv */