diff --git a/include/d/actor/d_a_salvage.h b/include/d/actor/d_a_salvage.h index a7a0197da..aeeb1d1a4 100644 --- a/include/d/actor/d_a_salvage.h +++ b/include/d/actor/d_a_salvage.h @@ -8,6 +8,11 @@ class dSalvage_control_c; class daSalvage_c : public fopAc_ac_c { public: + static int getSalvageId() { return mSalvageId; } + void setSalvageId(int) {} + static BOOL isValidSalvageId() { return mSalvageId != -1 ? TRUE : FALSE; } + void getSalvageKind() {} + void checkRegist(int) {} void checkUsed(int) {} void clrFlag(int, u8) {} @@ -24,20 +29,16 @@ public: void getR(int) {} void getRoomNo(int) {} void getSRoomNo() {} - void getSalvageId() {} - void getSalvageKind() {} void getSaveNo(int) {} void getScale(int) {} void getSwitchNo(int) {} void getType(int) {} void init_one(int) {} - void isValidSalvageId() {} void setDrawMode(int, int) {} void setFlag(int, u8) {} void setNowAlpha(int, u8) {} void setPos(int, cXyz) {} void setSRoomNo(s8) {} - void setSalvageId(int) {} void CreateHeap(); void CreateInit(); @@ -76,7 +77,7 @@ public: static const u16 m_savelabel[]; static dSalvage_control_c* mTagData_p; static s8 mNowRoomNo; - static s32 mSalvageId; + static int mSalvageId; public: /* Place member variables here */ diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index c9b8a71ed..47d54ceeb 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -35,7 +35,7 @@ public: daSFLG_UNK8000_e = 0x00008000, daSFLG_UNK10000_e = 0x00010000, daSFLG_SHOOT_CANNON_e = 0x00020000, - daSFLG_UNK40000_e = 0x00040000, + daSFLG_CRANE_UP_END_e = 0x00040000, daSFLG_UNK80000_e = 0x00080000, daSFLG_UNK100000_e = 0x00100000, daSFLG_HEAD_NO_DRAW_e = 0x00200000, @@ -75,6 +75,21 @@ public: PART_CRANE_e = 3, }; + enum DemoMode_e { + DEMO_INIT_e = 0, + DEMO_MOVE_e = 1, + DEMO_SALVAGE_e = 2, + DEMO_UNK03_e = 3, + DEMO_RACE_FAIL_e = 4, + DEMO_KEEP_e = 5, + DEMO_NECK_e = 6, + DEMO_THROW_e = 7, + DEMO_OPEN_e = 8, + DEMO_TORNADO_S_e = 9, + DEMO_HWARP_UP_e = 10, + DEMO_HWARP_DOWN_e = 11, + }; + typedef BOOL (daShip_c::*ProcFunc)(); u32 checkStateFlg(daSHIP_SFLG flag) const { return mStateFlag & flag; } @@ -85,6 +100,7 @@ public: void onJumpRideFlg() { onStateFlg(daSFLG_JUMP_RIDE_e); } BOOL checkJumpOkFlg() const { return checkStateFlg(daSFLG_JUMP_OK_e); } BOOL checkShootCannon() const { return checkStateFlg(daSFLG_SHOOT_CANNON_e); } + BOOL checkCraneUpEnd() const { return checkStateFlg(daSFLG_CRANE_UP_END_e); } BOOL checkHeadNoDraw() const { return checkStateFlg(daSFLG_HEAD_NO_DRAW_e); } void setSteerMove() { mNextMode = MODE_STEER_MOVE_e; } @@ -99,6 +115,8 @@ public: void setTactWarp() { mNextMode = MODE_TACT_WARP_e; } void setStartModeThrow() { mNextMode = MODE_START_MODE_THROW_e; } + BOOL checkSalvageDemo() const { return m0351 == DEMO_SALVAGE_e; } + int getTactWarpPosNum() const { return mTactWarpPosNum; } void setTactWarpPosNum(int num) { mTactWarpPosNum = num; } u32 getTactWarpID() { return mTactWarpID; } @@ -107,7 +125,6 @@ public: Mtx& getBodyMtx() { return mpBodyAnm->getModel()->getBaseTRMtx(); } void checkCraneMode() const {} - void checkCraneUpEnd() const {} #if VERSION == VERSION_DEMO BOOL checkForceMove() { return getTornadoActor() || getWhirlActor(); } daTornado_c* getTornadoActor() { return mTornadoActor; } @@ -117,9 +134,6 @@ public: daTornado_c* getTornadoActor() const { return mTornadoActor; } fopAc_ac_c* getWhirlActor() const { return mWhirlActor; } #endif - void checkRopeCntMax() const {} - void checkRopeDownStart() const {} - void checkSalvageDemo() const {} void checkTornadoFlg() const {} void checkTornadoUp() const {} f32 getBeltSpeed() const { return m1044.absXZ(); } @@ -136,6 +150,8 @@ public: f32 getJumpRate() { return mJumpRate; } u8 getPart() const { return mPart; } s16 getRopeCnt() const { return mRopeCnt; } + BOOL checkRopeDownStart() const { return mRopeCnt > 20; } + BOOL checkRopeCntMax() const { return mRopeCnt == 250; } s16 getSailAngle() { return mSailAngle; } void getTactJntMtx() {} f32 getTillerAngleRate() { return mTillerAngleRate; } @@ -304,7 +320,7 @@ public: /* 0x0392 */ u16 m0392; // file idx /* 0x0394 */ s16 m0394; /* 0x0396 */ s16 m0396; - /* 0x0398 */ s16 m0398; + /* 0x0398 */ s16 m0398; // CraneAngle /* 0x039A */ s16 mCraneBaseAngle; /* 0x039C */ s16 m039C; /* 0x039E */ s16 mRopeCnt; diff --git a/src/d/actor/d_a_player_ship.inc b/src/d/actor/d_a_player_ship.inc index 78e602c6c..ca1c65252 100644 --- a/src/d/actor/d_a_player_ship.inc +++ b/src/d/actor/d_a_player_ship.inc @@ -15,10 +15,12 @@ #include "d/actor/d_a_player_HIO.h" #include "d/actor/d_a_player_main.h" #include "d/actor/d_a_player_main_data.h" +#include "d/actor/d_a_salvage.h" #include "d/actor/d_a_ship.h" #include "d/d_com_inf_game.h" #include "d/d_kankyo_wether.h" #include "d/d_procname.h" +#include "d/d_salvage.h" #include "f_op/f_op_camera_mng.h" /* 8013F848-8013F8AC .text shipSpecialDemoStart__9daPy_lk_cFv */ @@ -1020,12 +1022,134 @@ BOOL daPy_lk_c::procShipCrane_init() { /* 80142458-80142920 .text procShipCrane__9daPy_lk_cFv */ BOOL daPy_lk_c::procShipCrane() { - /* Nonmatching */ - // The following daShip_c inlines are used in this function: - // checkRopeDownStart - // checkRopeCntMax - // checkCraneUpEnd - // checkSalvageDemo + daShip_c* ship = dComIfGp_getShipActor(); + if (ship == NULL) { + return checkNextMode(0); + } + + dComIfGp_setRStatus(dActStts_CRUISE_e); + +#if VERSION == VERSION_DEMO + if (dComIfGp_getDoStatus() == dActStts_BLANK_e && ship->speedF >= 3.0f) { + dComIfGp_setDoStatus(dActStts_STOP_e); + } +#endif + + if (!checkNoUpperAnime()) { + if (changeShipEndProc()) { + return TRUE; + } + if (ship->getRopeCnt() != 0) { + resetActAnimeUpper(UPPER_MOVE2_e, -1.0f); + initShipCraneAnime(); + } +#if VERSION > VERSION_DEMO + if (dComIfGp_getDoStatus() == dActStts_BLANK_e && ship->speedF >= 3.0f) { + dComIfGp_setDoStatus(dActStts_STOP_e); + } +#endif + } else if (ship->checkSalvageDemo()) { + if (m34D4 == 0 && ship->checkCraneUpEnd()) { + m34D4 = 1; + daPy_ANM anm; + if (ship->getCraneBaseAngle() > 0) { + // TODO: is this salvage type stuff an inline? + int type; + if (daSalvage_c::isValidSalvageId()) { + type = daSalvage_c::mTagData_p->getType(daSalvage_c::getSalvageId()); + } else { + type = -1; + } + if (type == 1) { + anm = ANM_SALVRGOOD; + } else { + anm = ANM_SALVRBAD; + } + } else { + int type; + if (daSalvage_c::isValidSalvageId()) { + type = daSalvage_c::mTagData_p->getType(daSalvage_c::getSalvageId()); + } else { + type = -1; + } + if (type == 1) { + anm = ANM_SALVLGOOD; + } else { + anm = ANM_SALVLBAD; + } + } + offModeFlg(ModeFlg_00000100); + onModeFlg(ModeFlg_00000400); + setSingleMoveAnime(anm, 1.0f, 0.0f, -1, 5.0f); + } else if (mProcVar0.m3570 == 0) { + if (ship->getCraneBaseAngle() > 0) { + setSingleMoveAnime(ANM_SALVRWAIT, 1.0f, 0.0f, -1, 5.0f); + mProcVar0.m3570 = 3; + } else { + setSingleMoveAnime(ANM_SALVLWAIT, 1.0f, 0.0f, -1, 5.0f); + mProcVar0.m3570 = 2; + } + } + } else { + if (changeShipEndProc()) { + return TRUE; + } +#if VERSION > VERSION_DEMO + if (dComIfGp_getDoStatus() == dActStts_BLANK_e && ship->speedF >= 3.0f) { + dComIfGp_setDoStatus(dActStts_STOP_e); + } +#endif + if (mProcVar0.m3570 == 3 && ship->getCraneBaseAngle() < 0) { + mProcVar0.m3570 = 0; + setSingleMoveAnime(ANM_SALVLR, 1.0f, 0.0f, -1, 5.0f); + offModeFlg(ModeFlg_00000100); + onModeFlg(ModeFlg_00000400); + m3574 = 2; + } else if (mProcVar0.m3570 == 2 && ship->getCraneBaseAngle() > 0) { + mProcVar0.m3570 = 0; + setSingleMoveAnime(ANM_SALVLR, -1.0f, 0.0f, -1, 5.0f); + offModeFlg(ModeFlg_00000100); + onModeFlg(ModeFlg_00000400); + m3574 = 3; + } else if (mProcVar0.m3570 == 0) { + if (std::fabsf(mFrameCtrlUnder[UNDER_MOVE0_e].getRate()) < 0.01f) { + if (m3574 == 3) { + setSingleMoveAnime(ANM_SALVRWAIT, 1.0f, 0.0f, -1, 5.0f); + mProcVar0.m3570 = 3; + onModeFlg(ModeFlg_00000100); + offModeFlg(ModeFlg_00000400); + } else { + setSingleMoveAnime(ANM_SALVLWAIT, 1.0f, 0.0f, -1, 5.0f); + mProcVar0.m3570 = 2; + onModeFlg(ModeFlg_00000100); + offModeFlg(ModeFlg_00000400); + } + } else if ((m3574 == 3 && ship->getCraneBaseAngle() < 0) || (m3574 == 2 && ship->getCraneBaseAngle() > 0)) { + mFrameCtrlUnder[UNDER_MOVE0_e].setRate(-1.0f * mFrameCtrlUnder[UNDER_MOVE0_e].getRate()); + if (m3574 == 3) { + m3574 = 2; + } else { + m3574 = 3; + } + } + } else if (ship->checkRopeCntMax()) { + setTextureAnime(9, 0); + } else if (ship->checkRopeDownStart()) { + setTextureAnime(6, 0); + } else { + setTextureAnime(0, 0); + } + } + + if (checkModeFlg(ModeFlg_00000100) || mProcVar0.m3570 == 0) { + onModeFlg(ModeFlg_00000080 | ModeFlg_08000000); + } else { + offModeFlg(ModeFlg_00000080 | ModeFlg_08000000); + } + + setShipRidePos(1); + + return TRUE; } /* 80142920-80142A5C .text procShipGetOff_init__9daPy_lk_cFv */ diff --git a/src/d/actor/d_a_ship.cpp b/src/d/actor/d_a_ship.cpp index d0a085115..0b8cd891d 100644 --- a/src/d/actor/d_a_ship.cpp +++ b/src/d/actor/d_a_ship.cpp @@ -872,7 +872,7 @@ void daShip_c::setYPos() { m03F4 = getWaterY(); if (!checkStateFlg(daSFLG_UNK10_e)) { onStateFlg(daSFLG_UNK10_e); - if (mCurMode != MODE_START_MODE_WARP_e && mCurMode != MODE_START_MODE_THROW_e && m0351 != 11) { + if (mCurMode != MODE_START_MODE_WARP_e && mCurMode != MODE_START_MODE_THROW_e && m0351 != DEMO_HWARP_DOWN_e) { current.pos.y = m03F4; } } @@ -1124,7 +1124,7 @@ void daShip_c::changeDemoEndProc() { mpHeadAnm->setPlaySpeed(-1.0f); offStateFlg(daSFLG_UNK80000_e); } - if ((m0351 == 8) || checkStateFlg(daSFLG_UNK4000000_e)) { + if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) { m0366 = 0; offStateFlg(daSFLG_UNK4000000_e); } @@ -1952,7 +1952,7 @@ BOOL daShip_c::procCraneUp_init() { mRipple.setRate(1.0f); - offStateFlg(daSFLG_UNK40000_e); + offStateFlg(daSFLG_CRANE_UP_END_e); dComIfGp_getVibration().StartShock(7, -0x31, cXyz(0.0f, 1.0f, 0.0f)); dComIfGp_getVibration().StartQuake(4, 1, cXyz(0.0f, 1.0f, 0.0f)); @@ -1977,7 +1977,7 @@ BOOL daShip_c::procCraneUp() { cLib_addCalcAngleS(&m039C, sVar1, 5, 0x1800, 0x100); if (mRipple.getEmitter() == NULL) { setControllAngle(0); - onStateFlg(daSFLG_UNK40000_e); + onStateFlg(daSFLG_CRANE_UP_END_e); dComIfGp_getVibration().StopQuake(-1); } else { @@ -2095,7 +2095,7 @@ BOOL daShip_c::procZevDemo() { m0428 = dComIfGp_evmng_getMyXyzP(mEvtStaffId, "atn_pos"); } - if (m0351 && partP && (m0350 == 4 || m0350 != *partP)) { + if (m0351 != DEMO_INIT_e && partP && (m0350 == 4 || m0350 != *partP)) { m0350 = *partP; setPartAnimeInit(*partP); } @@ -2119,7 +2119,7 @@ BOOL daShip_c::procZevDemo() { daPy_getPlayerLinkActorClass()->offNoResetFlg1(daPy_py_c::daPyFlg1_SHIP_TACT); } - if (m0351 == 0 || m0351 == 8) { + if (m0351 == DEMO_INIT_e || m0351 == DEMO_OPEN_e) { if (angleP) { sVar15 = (s16)*angleP; } @@ -2138,8 +2138,8 @@ BOOL daShip_c::procZevDemo() { speedF = *speedP; } - if (partP || m0351 == 8) { - if (m0351 == 8) { + if (partP || m0351 == DEMO_OPEN_e) { + if (m0351 == DEMO_OPEN_e) { m0350 = 0; } else { @@ -2168,12 +2168,12 @@ BOOL daShip_c::procZevDemo() { setControllAngle(0); dComIfGp_evmng_cutEnd(mEvtStaffId); } - else if (m0351 == 1 || m0351 == 3) { + else if (m0351 == DEMO_MOVE_e || m0351 == DEMO_UNK03_e) { if (posP == NULL) { posP = dComIfGp_evmng_getGoal(); } - if (m0351 == 1) { + if (m0351 == DEMO_MOVE_e) { local_7c = *posP - current.pos; } else { @@ -2257,7 +2257,7 @@ BOOL daShip_c::procZevDemo() { setControllAngle(0); } } - else if (m0351 == 4) { + else if (m0351 == DEMO_RACE_FAIL_e) { if (!checkStateFlg(daSFLG_UNK10000_e)) { mpHeadAnm->setAnm((J3DAnmTransform *)dComIfG_getObjectRes(l_arcName, SHIP_BCK_FN_LOSE1), J3DFrameCtrl::EMode_NONE, 5.0f, 1.0f, 0.0f, -1.0f, NULL); onStateFlg(daSFLG_UNK10000_e); @@ -2271,14 +2271,14 @@ BOOL daShip_c::procZevDemo() { dComIfGp_evmng_cutEnd(mEvtStaffId); } } - else if (m0351 == 5) { + else if (m0351 == DEMO_KEEP_e) { if (speedP) { firstDecrementShipSpeed(*speedP); } setControllAngle(0); dComIfGp_evmng_cutEnd(mEvtStaffId); } - else if (m0351 == 6) { + else if (m0351 == DEMO_NECK_e) { partP = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "prm0"); u16 fileIndex; @@ -2312,7 +2312,7 @@ BOOL daShip_c::procZevDemo() { dComIfGp_evmng_cutEnd(mEvtStaffId); } } - else if (m0351 == 7) { + else if (m0351 == DEMO_THROW_e) { speedF = 150.0f; speedP = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "gravity"); if (speedP) { @@ -2329,7 +2329,7 @@ BOOL daShip_c::procZevDemo() { shape_angle.y += 4500; dComIfGp_evmng_cutEnd(mEvtStaffId); } - else if (m0351 == 10) { + else if (m0351 == DEMO_HWARP_UP_e) { cLib_addCalcAngleS(&m0370, 0, 10, 0x1000, 0x200); cLib_addCalcAngleS(&m0372, 0, 10, 0x1000, 0x200); cLib_addCalcAngleS(&m0384, 0, 10, 0x1000, 0x200); @@ -2351,7 +2351,7 @@ BOOL daShip_c::procZevDemo() { dComIfGp_evmng_cutEnd(mEvtStaffId); } else { - if (m0351 == 11) { + if (m0351 == DEMO_HWARP_DOWN_e) { if (m03F4 > current.pos.y && gravity >= 0.0f) { offStateFlg(daSFLG_FLY_e); m03F4 = current.pos.y; @@ -3520,7 +3520,7 @@ BOOL daShip_c::execute() { f32 prev_fwdvel = mFwdVel; f32 prev_speedF = speedF; - m0351 = 0xFF; + m0351 = -1; m0404 = 0.0f; m0428 = NULL; @@ -3624,10 +3624,10 @@ BOOL daShip_c::execute() { if (demoActor) { procToolDemo_init(); } - else if(mEvtStaffId != -1 && m0351 != 2 && m0351 != 9) { + else if(mEvtStaffId != -1 && m0351 != DEMO_SALVAGE_e && m0351 != DEMO_TORNADO_S_e) { procZevDemo_init(); } - else if (m0351 == 2) { + else if (m0351 == DEMO_SALVAGE_e) { procCraneUp_init(); } @@ -3643,7 +3643,7 @@ BOOL daShip_c::execute() { } BOOL r24; - if (m0351 == 8 || checkStateFlg(daSFLG_UNK4000000_e)) { + if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) { r24 = TRUE; } else { @@ -3654,7 +3654,7 @@ BOOL daShip_c::execute() { (this->*mProc)(); } - if (m0351 == 8 || checkStateFlg(daSFLG_UNK4000000_e)) { + if (m0351 == DEMO_OPEN_e || checkStateFlg(daSFLG_UNK4000000_e)) { m0366 = -0x2000; sVar26 = m0366; } @@ -3869,7 +3869,7 @@ BOOL daShip_c::execute() { } else { speed.x = (speedF * cM_ssin(current.angle.y)) * cM_scos(m0370); - if (m0351 != 7 && m0351 != 10 && m0351 != 11) { + if (m0351 != DEMO_THROW_e && m0351 != DEMO_HWARP_UP_e && m0351 != DEMO_HWARP_DOWN_e) { speed.y = -speedF * cM_ssin(m0370); } speed.z = (speedF * cM_scos(current.angle.y)) * cM_scos(m0370); diff --git a/src/d/d_com_static.cpp b/src/d/d_com_static.cpp index 9db000a18..13da495c2 100644 --- a/src/d/d_com_static.cpp +++ b/src/d/d_com_static.cpp @@ -125,7 +125,7 @@ const u16 daSalvage_c::m_savelabel[] = { }; dSalvage_control_c* daSalvage_c::mTagData_p; s8 daSalvage_c::mNowRoomNo; -s32 daSalvage_c::mSalvageId; +int daSalvage_c::mSalvageId; /* 80056760-80056790 .text init_room__11daSalvage_cFSc */ void daSalvage_c::init_room(s8 roomNo) {