From b24d8574cdef4f7e4521b2b0c72e0a8775706d9c Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sat, 9 Aug 2025 02:34:37 +0100 Subject: [PATCH] d_a_salvage (#841) * d_a_salvage * PR --- configure.py | 2 +- include/d/actor/d_a_oship.h | 11 +- include/d/actor/d_a_salvage.h | 115 +++--- include/d/actor/d_a_ship.h | 18 +- include/d/d_com_inf_game.h | 8 + include/d/d_salvage.h | 10 +- src/d/actor/d_a_salvage.cpp | 665 +++++++++++++++++++++++++++++++--- src/d/d_salvage.cpp | 11 +- 8 files changed, 736 insertions(+), 104 deletions(-) diff --git a/configure.py b/configure.py index c7df5e751..803e836f7 100755 --- a/configure.py +++ b/configure.py @@ -1439,7 +1439,7 @@ config.libs = [ ActorRel(Equivalent, "d_a_race_item", extra_cflags=['-pragma "nosyminline on"']), # weak func order ActorRel(Equivalent, "d_a_rd", extra_cflags=['-pragma "nosyminline on"']), # weak func order ActorRel(Matching, "d_a_rectangle"), - ActorRel(NonMatching, "d_a_salvage"), + ActorRel(Equivalent, "d_a_salvage"), ActorRel(NonMatching, "d_a_sbox"), ActorRel(NonMatching, "d_a_sk"), ActorRel(NonMatching, "d_a_sk2"), diff --git a/include/d/actor/d_a_oship.h b/include/d/actor/d_a_oship.h index d72092849..762517397 100644 --- a/include/d/actor/d_a_oship.h +++ b/include/d/actor/d_a_oship.h @@ -15,8 +15,11 @@ public: enum Proc_e { }; - - void getSw() {} +#if VERSION == VERSION_DEMO + u8 getSw() { return m295; } +#else + u8 getSw() { return mSwitchA; } +#endif void isSpecial() {} void modeProcInit(int) {} @@ -61,7 +64,9 @@ public: static const dCcD_SrcCyl m_cyl_src; public: - /* 0x290 */ u8 m290[0x2AC - 0x290]; + /* 0x290 */ u8 m290[0x295 - 0x290]; + /* 0x295 */ u8 m295; + /* 0x296 */ u8 m296[0x2AC - 0x296]; /* 0x2AC */ int mCurrentProc; /* 0x2B0 */ u8 mSubMode; /* 0x2B1 */ u8 mSwitchA; diff --git a/include/d/actor/d_a_salvage.h b/include/d/actor/d_a_salvage.h index a71d70c3b..ff9f6fd4f 100644 --- a/include/d/actor/d_a_salvage.h +++ b/include/d/actor/d_a_salvage.h @@ -3,73 +3,77 @@ #include "f_op/f_op_actor.h" #include "d/actor/d_a_oship.h" +#include "d/d_salvage.h" -class dSalvage_control_c; +class mDoExt_brkAnm; class daSalvage_c : public fopAc_ac_c { + typedef bool (daSalvage_c::*ModeProcFunc)(); + public: static int getSalvageId() { return mSalvageId; } - void setSalvageId(int) {} + void setSalvageId(int salvageId) { mSalvageId = salvageId; } static BOOL isValidSalvageId() { if (mSalvageId != -1) { return TRUE; - } else { - return FALSE; } + return FALSE; } void getSalvageKind() {} - void checkRegist(int) {} - void checkUsed(int) {} - void clrFlag(int, u8) {} + BOOL checkRegist(int arg1) { return mTagData_p->checkRegist(arg1); } + BOOL checkUsed(int arg1) { return mTagData_p->checkUsed(arg1); } + void clrFlag(int arg1, u8 arg2) { mTagData_p->clrFlag(arg1, arg2); } void debug_print() {} void debug_print_reg() {} - void getAlphaP(int) {} - void getDistance_sub(int) {} - void getDrawMode(int) {} - void getH(int) {} - void getItemNo(int) {} - void getKind(int) {} - void getPos(int) {} - void getPosP(int) {} - void getR(int) {} - void getRoomNo(int) {} - void getSRoomNo() {} - void getSaveNo(int) {} - void getScale(int) {} - void getSwitchNo(int) {} - void getType(int) {} - void init_one(int) {} - void setDrawMode(int, int) {} - void setFlag(int, u8) {} - void setNowAlpha(int, u8) {} - void setPos(int, cXyz) {} - void setSRoomNo(s8) {} + u8* getAlphaP(int arg1) { return mTagData_p->getAlphaPtr(arg1); } + f32 getDistance_sub(int arg1) { return mTagData_p->getDistance(arg1); } + s32 getDrawMode(int arg1) { return mTagData_p->getDrawMode(arg1); } + f32 getH(int arg1) { return mTagData_p->getH(arg1); } + u8 getItemNo(int arg1) { return mTagData_p->getItemNo(arg1); } + u8 getKind(int arg1) { return mTagData_p->getKind(arg1); } + cXyz getPos(int arg1) { return mTagData_p->getPos(arg1); } + cXyz* getPosP(int arg1) { return mTagData_p->getPosP(arg1); } + f32 getR(int arg1) { return mTagData_p->getR(arg1); } + s8 getRoomNo(int arg1) { return mTagData_p->getRoomNo(arg1); } + s8 getSRoomNo() { return mNowRoomNo; } + u8 getSaveNo(int arg1) { return mTagData_p->getSaveNo(arg1); } + cXyz getScale(int arg1) { return mTagData_p->getScale(arg1); } + s32 getSwitchNo(int arg1) { return mTagData_p->getSwitchNo(arg1); } + u8 getType(int arg1) { return mTagData_p->getType(arg1); } + void init_one(int arg1) { mTagData_p->init_one(arg1); } + void setDrawMode(int arg1, int arg2) { mTagData_p->setDrawMode(arg1, arg2); } + void setFlag(int arg1, u8 arg2) { mTagData_p->setFlag(arg1, arg2); } + void setNowAlpha(int arg1, u8 alpha) { mTagData_p->setNowAlpha(arg1, alpha); } + void setPos(int arg1, cXyz arg2) { mTagData_p->setPos(arg1,arg2); } + void setSRoomNo(s8 roomNo) { mNowRoomNo = roomNo; } - void CreateHeap(); - void CreateInit(); + f32 GetR(int arg1) { return getR(arg1); } + + BOOL CreateHeap(); + bool CreateInit(); cPhs_State _create(); bool _delete(); bool _execute(); void checkOrder(); void eventOrder(); - void proc_wait_init(); - void proc_wait(); - void proc_salvage_init(); - void proc_salvage(); + bool proc_wait_init(); + bool proc_wait(); + bool proc_salvage_init(); + bool proc_salvage(); void calcAlpha(); - void checkArea(cXyz, int); + BOOL checkArea(cXyz, int); void createEnemy(); - void onSalvageForOship(daOship_c*); - void end_salvage(); - void checkDistance(); - void checkXZDistance(); - void getDistance(int, f32*); + bool onSalvageForOship(daOship_c*); + bool end_salvage(); + int checkDistance(); + int checkXZDistance(); + BOOL getDistance(int, f32*); void send_agb(); void debug_print2(); bool _draw(); void set_mtx(J3DModel*, int); - void isEffectKind(int); + BOOL isEffectKind(int); void debugDraw(); static void init_room(s8); @@ -80,13 +84,38 @@ public: mSalvageId = -1; } + static char* m_arcname; + static const f32 m_outersea_near; + static const f32 m_inside_near; + static const f32 m_cmap_near; + static const u8 m_disappear_frame; static const u16 m_savelabel[]; static dSalvage_control_c* mTagData_p; static s8 mNowRoomNo; static int mSalvageId; public: - /* Place member variables here */ -}; + /* 0x290 */ request_of_phase_process_class mPhase; + /* 0x298 */ J3DModelData* mModelData; + /* 0x29C */ J3DModel* mModels[16]; + /* 0x2DC */ mDoExt_brkAnm* mpBrk; + /* 0x2E0 */ mDoExt_btkAnm* mpBtk; + /* 0x2E4 */ JPABaseEmitter* mEmitter; + /* 0x2E8 */ s8 m2E8; + /* 0x2E9 */ u8 m2E9; + /* 0x2EA */ bool m2EA; + /* 0x2EC */ u32 m2EC; + /* 0x2F0 */ s16 mSalvageGetItemEventIdx; + /* 0x2F2 */ s16 mSalvageHazureEventIdx; + /* 0x2F4 */ s16 mSlvgGetItemLeftEventIdx; + /* 0x2F6 */ s16 mEventIdx; + /* 0x2F8 */ s8 mStayNo; + /* 0x2FC */ s32 m2FC; + /* 0x300 */ u8 mRndDepthIdx; + /* 0x301 */ bool m301; + /* 0x302 */ u8 m302; + /* 0x304 */ fpc_ProcID m304; + /* 0x308 */ ModeProcFunc mProc; +}; // size = 0x314 #endif /* D_A_SALVAGE_H */ diff --git a/include/d/actor/d_a_ship.h b/include/d/actor/d_a_ship.h index eadb949f8..938c1c4fe 100644 --- a/include/d/actor/d_a_ship.h +++ b/include/d/actor/d_a_ship.h @@ -124,7 +124,15 @@ public: Mtx& getBodyMtx() { return mpBodyAnm->getModel()->getBaseTRMtx(); } - void checkCraneMode() const {} +#if VERSION <= VERSION_JPN + bool checkCraneMode() const { + return mCurMode == 10 && mNextMode == 10; + } +#else + bool checkCraneMode() const { + return mCurMode == 10 && mNextMode == 10 && speedF < 1.0f && !checkStateFlg(daSFLG_FLY_e) && !checkForceMove(); + } +#endif #if VERSION == VERSION_DEMO BOOL checkForceMove() { return getTornadoActor() || getWhirlActor(); } daTornado_c* getTornadoActor() { return mTornadoActor; } @@ -139,13 +147,13 @@ public: f32 getBeltSpeed() const { return m1044.absXZ(); } s16 getCannonAngleX() const { return shape_angle.x + m0396 - 0x4000; } s16 getCannonAngleY() const { return shape_angle.y + m0394; } - void getCraneAngle() const {} + s16 getCraneAngle() const { return m0398; } s16 getCraneBaseAngle() const { return mCraneBaseAngle; } void getCraneHookAngleY() const {} void getCraneRipplePosX() const {} void getCraneRipplePosY() const {} void getCraneRipplePosZ() const {} - void getCraneTop() {} + cXyz* getCraneTop() { return m0434; } MtxP getHeadJntMtx() { return mpHeadAnm->getModel()->getAnmMtx(8); } f32 getJumpRate() { return mJumpRate; } u8 getPart() const { return mPart; } @@ -156,7 +164,7 @@ public: void getTactJntMtx() {} f32 getTillerAngleRate() { return mTillerAngleRate; } cXyz* getTillerTopPosP() { return &mTillerTopPos; } - void offCraneHookFlg() {} + void offCraneHookFlg() { offStateFlg(daSFLG_UNK800_e);} void offFantomGanonBattle() {} void offStateFlg(daSHIP_SFLG flag) { mStateFlag &= ~flag;} void offTornadoFlg() { @@ -169,7 +177,7 @@ public: } void onCb1Ride() { mStateFlag |= 0x40000000; } - void onCraneHookFlg() {} + void onCraneHookFlg() { onStateFlg(daSFLG_UNK800_e); } void onCrashFlg() { onStateFlg(daSFLG_UNK4_e); } void onFantomGanonBattle() {} //TODO: Is this right? diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 21804ad95..caa6854d2 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1140,6 +1140,10 @@ inline BOOL dComIfGs_isGetCollectMap(int i_no) { return g_dComIfG_gameInfo.save.getPlayer().getMap().isGetMap(i_no - 1); } +inline void dComIfGs_onCompleteCollectMap(int i_no) { + g_dComIfG_gameInfo.save.getPlayer().getMap().onCompleteMap(i_no - 1); +} + inline void dComIfGs_onGetCollectMap(int i_no) { g_dComIfG_gameInfo.save.getPlayer().getMap().onGetMap(i_no - 1); } @@ -1264,6 +1268,10 @@ inline BOOL dComIfGs_isOceanSvBit(u8 i_grid, u16 i_bit) { return g_dComIfG_gameInfo.save.getOcean().isOceanSvBit(i_grid, i_bit); } +inline void dComIfGs_onOceanSvBit(u8 i_grid, u16 i_bit) { + g_dComIfG_gameInfo.save.getOcean().onOceanSvBit(i_grid, i_bit); +} + inline BOOL dComIfGs_isEventBit(u16 id) { return g_dComIfG_gameInfo.save.getEvent().isEventBit(id); } diff --git a/include/d/d_salvage.h b/include/d/d_salvage.h index ec00ae679..b5efb3784 100644 --- a/include/d/d_salvage.h +++ b/include/d/d_salvage.h @@ -32,7 +32,7 @@ public: /* 0x33 */ u8 mNowAlpha; /* 0x34 */ u8 mDrawMode; /* 0x35 */ u8 field_0x35; -}; +}; // size = 0x38 class dSalvage_control_c { public: @@ -48,7 +48,7 @@ public: cXyz getScale(int); f32 getR(int); f32 getH(int); - u8 getRoomNo(int); + s8 getRoomNo(int); u8 getItemNo(int); s32 getSwitchNo(int); u8 getSaveNo(int); @@ -56,9 +56,9 @@ public: u8 getKind(int); f32 getDistance(int); u8* getAlphaPtr(int); - u8 getDrawMode(int); + s32 getDrawMode(int); BOOL checkRegist(int); - bool checkUsed(int); + BOOL checkUsed(int); void setPos(int, cXyz); void setFlag(int, u8); void clrFlag(int, u8); @@ -75,6 +75,6 @@ public: /* 0x00 */ u8 mSeaNum; /* 0x01 */ u8 mRoomNum; /* 0x04 */ dSalvage_info_c mInfo[MAX_TOTAL]; -}; +}; // size = 0x2304 #endif /* D_SALVAGE_H */ diff --git a/src/d/actor/d_a_salvage.cpp b/src/d/actor/d_a_salvage.cpp index 4b2d7a6d6..01efb671e 100644 --- a/src/d/actor/d_a_salvage.cpp +++ b/src/d/actor/d_a_salvage.cpp @@ -4,137 +4,716 @@ // #include "d/actor/d_a_salvage.h" +#include "d/actor/d_a_ship.h" +#include "d/actor/d_a_sea.h" +#include "d/actor/d_a_player.h" +#include "d/actor/d_a_daiocta.h" +#include "d/res/res_yslvg00.h" +#include "d/d_bg_s_func.h" +#include "d/d_map.h" +#include "d/d_kankyo.h" +#include "d/d_kankyo_rain.h" +#include "d/d_item.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_com_inf_game.h" +#include "f_op/f_op_actor_mng.h" + +char* daSalvage_c::m_arcname = "Yslvg00"; + +const f32 daSalvage_c::m_outersea_near = 20.0f; +const f32 daSalvage_c::m_inside_near = 10.0f; +const f32 daSalvage_c::m_cmap_near = 80.0f; +const u8 daSalvage_c::m_disappear_frame = 20; /* 00000078-00000098 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* a_this) { + return ((daSalvage_c*)a_this)->CreateHeap(); } /* 00000098-0000039C .text CreateHeap__11daSalvage_cFv */ -void daSalvage_c::CreateHeap() { - /* Nonmatching */ +BOOL daSalvage_c::CreateHeap() { + mTagData_p = new dSalvage_control_c(); + if (mTagData_p == NULL) { + return false; + } + mTagData_p->init(); + + mModelData = (J3DModelData*)dComIfG_getObjectRes(m_arcname, YSLVG00_BDL_YSLVG00); + JUT_ASSERT(326, mModelData != NULL); + + for (s32 i = 0; i < 16; i++) { + mModels[i] = mDoExt_J3DModel__create(mModelData, 0x80000, 0x11000222); + if (mModels[i] == NULL) { + return false; + } + } + + J3DAnmTevRegKey* pbrk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arcname, YSLVG00_BRK_YSLVG00); + JUT_ASSERT(347, pbrk != NULL); + + mpBrk = new mDoExt_brkAnm(); + if (mpBrk == NULL || !mpBrk->init(mModelData, pbrk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE)) { + return false; + } + + J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(m_arcname, YSLVG00_BTK_YSLVG00); + JUT_ASSERT(361, pbtk != NULL); + + mpBtk = new mDoExt_btkAnm(); + if (mpBtk == NULL || !mpBtk->init(mModelData, pbtk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE)) { + return false; + } + return true; } /* 00000424-00000570 .text CreateInit__11daSalvage_cFv */ -void daSalvage_c::CreateInit() { - /* Nonmatching */ +bool daSalvage_c::CreateInit() { + setSRoomNo(fopAcM_GetRoomNo(this)); + m2E8 = getSRoomNo(); + mProc = &daSalvage_c::proc_wait_init; + fopAcM_setStageLayer(this); + m2EA = true; + mSalvageGetItemEventIdx = dComIfGp_evmng_getEventIdx("SALVAGE_GETITEM", 0xff); + mSalvageHazureEventIdx = dComIfGp_evmng_getEventIdx("SALVAGE_HAZURE", 0xff); + mSlvgGetItemLeftEventIdx = dComIfGp_evmng_getEventIdx("SLVG_GETITEM_LEFT", 0xff); + mEventIdx = dComIfGp_evmng_getEventIdx("SLVG_HAZURE_LEFT", 0xff); + mEmitter = dComIfGp_particle_set(dPa_name::ID_COMMON_0437, ¤t.pos); + if (mEmitter != NULL) { + mEmitter->setStatus(1); + } + return true; } /* 00000570-00000728 .text _create__11daSalvage_cFv */ cPhs_State daSalvage_c::_create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daSalvage_c); + + cPhs_State PVar3 = dComIfG_resLoad(&mPhase, m_arcname); + if (PVar3 == cPhs_COMPLEATE_e) { + if (mTagData_p == NULL) { + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0xB000)) { + return cPhs_ERROR_e; + } + CreateInit(); + mTagData_p->entry(this, NULL); + PVar3 = cPhs_COMPLEATE_e; + } else { + s8 bVar2 = getSRoomNo(); + s8 bVar1 = current.roomNo; + if (bVar2 != bVar1 && bVar1 != 0) { +#if VERSION > VERSION_DEMO + for (s32 i = 128; i < 160; i++) { + if (checkRegist(i) && isEffectKind(i) && checkUsed(i)) { + mDoAud_seDeleteObject(getPosP(i)); + } + } +#endif + mTagData_p->init_room(bVar2); + m2E8 = getSRoomNo(); + setSRoomNo(current.roomNo); + } + mTagData_p->entry(this, NULL); + PVar3 = cPhs_ERROR_e; + } + } + return PVar3; } /* 00000728-00000824 .text _delete__11daSalvage_cFv */ bool daSalvage_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhase, m_arcname); + + if (m2EA) { + if (mTagData_p != NULL) { + mTagData_p->init_end(); + } + + if (mEmitter != NULL) { + mEmitter->becomeInvalidEmitter(); + mEmitter = NULL; + } + +#if VERSION > VERSION_DEMO + for (s32 i = 0; i < 160; i++) { + if (isEffectKind(i) && checkUsed(i)) { + mDoAud_seDeleteObject(getPosP(i)); + } + } +#endif + } + return true; } /* 00000824-000008A4 .text _execute__11daSalvage_cFv */ bool daSalvage_c::_execute() { - /* Nonmatching */ + mTagData_p->calcDistanceXZ(); + checkOrder(); + + if (mProc) { + (this->*mProc)(); + } + eventOrder(); + mStayNo = dComIfGp_roomControl_getStayNo(); + debug_print2(); + return true; } /* 000008A4-000008B8 .text salvage_createCB__FPv */ -void salvage_createCB(void*) { - /* Nonmatching */ +cPhs_State salvage_createCB(void* v_this) { + fopAcM_OnStatus((fopAc_ac_c*)v_this, fopAcStts_FORCEMOVE_e); + return cPhs_COMPLEATE_e; } /* 000008B8-00000C58 .text checkOrder__11daSalvage_cFv */ void daSalvage_c::checkOrder() { - /* Nonmatching */ + daShip_c* ship = dComIfGp_getShipActor(); + u32 uVar2 = getType(getSalvageId()); + u8 uVar7 = getKind(getSalvageId()); + + if (!eventInfo.checkCommandDemoAccrpt()) { + return; + } + + if ((dComIfGp_evmng_startCheck(mSalvageGetItemEventIdx) && m2E9 == 2) || (dComIfGp_evmng_startCheck(mSlvgGetItemLeftEventIdx) && m2E9 == 1) || + (dComIfGp_evmng_startCheck(mSalvageHazureEventIdx) && m2E9 == 4) || (dComIfGp_evmng_startCheck(mEventIdx) && m2E9 == 3)) + { + ship->onCraneHookFlg(); + cXyz* pPos = ship->getCraneTop(); + m304 = fpcM_ERROR_PROCESS_ID_e; + uVar2 = 1; + if (m2E9 == 3 || m2E9 == 4) { + uVar2 = 0; + m301 = false; + } else { + m304 = fopAcM_create(PROC_SBOX, 0, pPos, getSRoomNo(), ¤t.angle, NULL, 0xff, salvage_createCB); + m301 = true; + if (uVar7 == 0) { + uVar2 = 2; + } + } + + u8 itemNo = getItemNo(getSalvageId()); + m2EC = fopAcM_create(PROC_SALVAGE_TBOX, (uVar2 << 8) | itemNo, pPos, getSRoomNo(), ¤t.angle, &scale, 0xff, salvage_createCB); + m2E9 = 0; + if (m2EC == fpcM_ERROR_PROCESS_ID_e || (m304 == fpcM_ERROR_PROCESS_ID_e && m301)) { + dComIfGp_event_reset(); + } else { + mProc = &daSalvage_c::proc_salvage_init; + m302 = 100; + } + } + + if (m302 == 0) { + fopAc_ac_c* actor1; + fopAc_ac_c* actor2; + BOOL tmp = fopAcM_SearchByID(m2EC, &actor1); + if (m301) { + tmp &= fopAcM_SearchByID(m304, &actor2); + } + + if (!tmp) { + fopAcM_delete(m2EC); + fopAcM_delete(m304); + m301 = 0; + dComIfGp_event_reset(); + } + } + + m302--; + + if (dComIfGp_evmng_endCheck(mSalvageGetItemEventIdx) || dComIfGp_evmng_endCheck(mSalvageHazureEventIdx) || + dComIfGp_evmng_endCheck(mSlvgGetItemLeftEventIdx) || dComIfGp_evmng_endCheck(mEventIdx)) + { + ship->offCraneHookFlg(); + fopAcM_delete(m2EC); + m301 = false; + end_salvage(); + dComIfGp_event_reset(); + + if ((dComIfGp_evmng_endCheck(mSalvageHazureEventIdx) || dComIfGp_evmng_endCheck(mEventIdx)) && (uVar2 == 2 || uVar7 == 5)) { + createEnemy(); + } + proc_wait_init(); + } } /* 00000C58-00000D64 .text eventOrder__11daSalvage_cFv */ void daSalvage_c::eventOrder() { - /* Nonmatching */ + if (dComIfGp_checkPlayerStatus0(0, 0x10000)) { + if (m2E9 == 2) { + fopAcM_orderOtherEventId(this, mSalvageGetItemEventIdx, 0xff, 0xffff, 0, 1); + eventInfo.onCondition(2); + } else if (m2E9 == 1) { + fopAcM_orderOtherEventId(this, mSlvgGetItemLeftEventIdx, 0xff, 0xffff, 0, 1); + eventInfo.onCondition(2); + } else if (m2E9 == 4) { + fopAcM_orderOtherEventId(this, mSalvageHazureEventIdx, 0xff, 0xffff, 0, 1); + eventInfo.onCondition(2); + } else if (m2E9 == 3) { + fopAcM_orderOtherEventId(this, mEventIdx, 0xff, 0xffff, 0, 1); + eventInfo.onCondition(2); + } + } } /* 00000D64-00000D94 .text proc_wait_init__11daSalvage_cFv */ -void daSalvage_c::proc_wait_init() { - /* Nonmatching */ +bool daSalvage_c::proc_wait_init() { + m2EC = fpcM_ERROR_PROCESS_ID_e; + mProc = &daSalvage_c::proc_wait; + return true; } /* 00000D94-0000132C .text proc_wait__11daSalvage_cFv */ -void daSalvage_c::proc_wait() { - /* Nonmatching */ +bool daSalvage_c::proc_wait() { + daShip_c* ship = dComIfGp_getShipActor(); + + if (dComIfGp_getShipActor() == NULL) { + return true; + } + + for (s32 i = 0; i < 160; i++) { + s32 switchIndex = getSwitchNo(i); + u8 uVar2 = getSaveNo(i); + u8 roomNo = getRoomNo(i); + + getPos(i); + u8 uVar6 = getKind(i); + + if (checkRegist(i)) { + f32 sp0C; + getDistance(i, &sp0C); + + if (uVar6 == 2) { + if (roomNo != 0xff && switchIndex != 0xff && !checkUsed(i) && dComIfGs_isSwitch(switchIndex, roomNo) && !dComIfGs_isOceanSvBit(roomNo, uVar2)) { + clrFlag(i, 1); + } + + if (roomNo != 0xff && switchIndex != 0xff && !dComIfGs_isSwitch(switchIndex, roomNo) && !dComIfGs_isOceanSvBit(roomNo, uVar2)) { + daDaiocta_c* bigOcto = (daDaiocta_c*)fopAcM_SearchByName(PROC_DAIOCTA); + + if (bigOcto != NULL && switchIndex == bigOcto->getSw()) { + cXyz sp40 = getPos(i); + sp40.x = bigOcto->current.pos.x; + sp40.z = bigOcto->current.pos.z; + + setPos(i, sp40); + } + } + } + + if (uVar6 == 0) { + if (dComIfGs_isOpenCollectMap(uVar2) && !dComIfGs_isCompleteCollectMap(uVar2)) { + u8 iVar3 = getItemNo(i); + bool bVar7 = true; + + if (isTriforce(iVar3)) { + iVar3 -= 0x60; + if (!dComIfGs_isCollectMapTriforce(iVar3)) { + bVar7 = false; + } + } + + if (bVar7) { + clrFlag(i, 1); + } + } + } + + if (uVar6 == 4) { + if (dKy_daynight_check() != dKy_TIME_DAY_e) { + if (!dComIfGs_isOceanSvBit(roomNo, uVar2)) { + clrFlag(i, 1); + } + } else if (dKy_daynight_check() == dKy_TIME_DAY_e) { + setFlag(i, 1); + } + } + + if (uVar6 == 6) { + if (!dKy_moon_type_chk() && dKyr_moon_arrival_check() && !dComIfGs_isEventBit(m_savelabel[uVar2])) { + clrFlag(i, 1); + } else { + setFlag(i, 1); + } + } + + if (isEffectKind(i) && checkUsed(i) && sp0C < 5000.0f) { + mDoAud_seStart(JA_SE_OBJ_SALVAGE_TAG, getPosP(i), 0, dComIfGp_getReverb(mStayNo)); + } + } + } + + if (checkXZDistance() == -1) { + s32 iVar10 = cM_rndF(10000.0f); + mRndDepthIdx = iVar10 % 3; + } + + setSalvageId(checkDistance()); + if (isValidSalvageId() && !dComIfGp_event_runCheck()) { + u8 cVar11 = getType(getSalvageId()); + u8 uVar6 = getKind(getSalvageId()); + attention_info.position = getPos(getSalvageId()); + + if (cVar11 == 1) { + if (ship->getCraneAngle() < 0) { + m2E9 = 1; + } else { + m2E9 = 2; + } + } else if (uVar6 == 5 || cVar11 == 0 || cVar11 == 2 || cVar11 == 3) { + if (ship->getCraneAngle() < 0) { + m2E9 = 3; + } else { + m2E9 = 4; + } + } + } + return true; } /* 0000132C-0000138C .text proc_salvage_init__11daSalvage_cFv */ -void daSalvage_c::proc_salvage_init() { - /* Nonmatching */ +bool daSalvage_c::proc_salvage_init() { + mProc = &daSalvage_c::proc_salvage; + setFlag(getSalvageId(), 1); + return true; } /* 0000138C-00001394 .text proc_salvage__11daSalvage_cFv */ -void daSalvage_c::proc_salvage() { - /* Nonmatching */ +bool daSalvage_c::proc_salvage() { + return true; } /* 00001394-00001650 .text calcAlpha__11daSalvage_cFv */ void daSalvage_c::calcAlpha() { - /* Nonmatching */ + f32 cmapNear = m_cmap_near; + daPy_py_c* player = daPy_getPlayerActorClass(); + + f32 fVar1; + if (daSea_ChkArea(player->current.pos.x, player->current.pos.z)) { + fVar1 = m_outersea_near; + } else { + fVar1 = m_inside_near; + } + + for (s32 i = 0; i < 160; i++) { + s32 disappearFrame = m_disappear_frame; + + if (!checkRegist(i)) { + continue; + } + + f32 sp08; + BOOL iVar3 = getDistance(i, &sp08); + f32 fVar2 = fVar1; + u8 uVar8 = getKind(i); + + if (uVar8 == 0) { + fVar2 = cmapNear; + } + + if (checkUsed(i) && iVar3 && sp08 <= 25000.0f && iVar3 && sp08 >= fVar2 * 100.0f) { + if (!dComIfGp_event_runCheck() && m2FC > 0) { + m2FC--; + } + + if (getKind(i) != 2 || m2FC == 0) { + cLib_chaseUC(getAlphaP(i), 0xff, 0xff / disappearFrame); + setDrawMode(i, 1); + if (getKind(i) == 0 && mEmitter != NULL) { + mEmitter->playCreateParticle(); + mEmitter->setGlobalTranslation(getPos(i)); + } + } + } else { + if (cLib_chaseUC(getAlphaP(i), 0, 0xff / disappearFrame)) { + setDrawMode(i, 0); + } else { + setDrawMode(i, 1); + } + + if (getKind(i) == 0 && mEmitter != NULL) { + mEmitter->stopCreateParticle(); + } + } + } } /* 00001650-00001814 .text checkArea__11daSalvage_cF4cXyzi */ -void daSalvage_c::checkArea(cXyz, int) { - /* Nonmatching */ +BOOL daSalvage_c::checkArea(cXyz crane_pos, int salvage_id) { + static const f32 l_salvage_depth[] = {1000.0f, 1500.0f, 2000.0f}; + + getH(salvage_id); + f32 dVar3 = GetR(salvage_id); + cXyz salvage_pos = getPos(salvage_id); + f32 abs = (crane_pos - salvage_pos).absXZ(); + if (abs < dVar3) { + daShip_c* ship = dComIfGp_getShipActor(); + if (daSea_ChkArea(crane_pos.x, crane_pos.z)) { + dVar3 = daSea_calcWave(crane_pos.x, crane_pos.z); + } else { + cXyz sp30(crane_pos.x, ship->current.pos.y + 100.0f, crane_pos.z); + dVar3 = dBgS_ObjGndChk_Wtr_Func(sp30); + } + + if (crane_pos.y < dVar3 - l_salvage_depth[mRndDepthIdx]) { + return TRUE; + } + } + return FALSE; } /* 00001814-00001860 .text createEnemy__11daSalvage_cFv */ void daSalvage_c::createEnemy() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + + fopAcM_create(PROC_OQ, 2, &player->current.pos); } /* 00001860-000019FC .text onSalvageForOship__11daSalvage_cFP9daOship_c */ -void daSalvage_c::onSalvageForOship(daOship_c*) { - /* Nonmatching */ +bool daSalvage_c::onSalvageForOship(daOship_c* oship) { + if (oship == NULL || oship->getSw() == 0xff) { + return false; + } + + for (s32 i = 128; i < 160; i++) { + if (checkRegist(i)) { + s32 uVar2 = getSwitchNo(i); + u8 uVar3 = getSaveNo(i); + u8 uVar4 = getRoomNo(i); + + getPos(i); + getKind(i); + + if (uVar2 != 0xff && uVar2 == oship->getSw() && !dComIfGs_isOceanSvBit(uVar4, uVar3)) { + cXyz sp14 = getPos(i); + sp14.x = oship->current.pos.x; + sp14.z = oship->current.pos.z; + + setPos(i, sp14); + setNowAlpha(i, 0xff); + m2FC = 0x5a; + return true; + } + } + } + return false; } /* 000019FC-00001B58 .text end_salvage__11daSalvage_cFv */ -void daSalvage_c::end_salvage() { - /* Nonmatching */ +bool daSalvage_c::end_salvage() { + u8 uVar4 = getRoomNo(getSalvageId()); + u8 uVar2 = getKind(getSalvageId()); + u16 uVar1 = getSaveNo(getSalvageId()); + + switch (uVar2) { + case 0: + dComIfGs_onCompleteCollectMap(uVar1); + dComIfGs_onEventBit(0x3e02); + break; + + case 2: + case 3: + case 4: + dComIfGs_onOceanSvBit(uVar4, uVar1); + break; + + case 6: + dComIfGs_onEventBit(m_savelabel[uVar1]); + break; + } + + if (uVar2 != 6) { + init_one(getSalvageId()); + } + + setSalvageId(-1); + return true; } /* 00001B58-00001CEC .text checkDistance__11daSalvage_cFv */ -void daSalvage_c::checkDistance() { - /* Nonmatching */ +int daSalvage_c::checkDistance() { + daShip_c* ship = dComIfGp_getShipActor(); + + if (ship == NULL) { + return -1; + } + + cXyz* pcVar6 = ship->getCraneTop(); + if (pcVar6 == NULL) { + return -1; + } + + if (!ship->checkCraneMode()) { + return -1; + } + + s32 iVar5 = -1; + for (s32 i = 0; i < 160; i++) { + if (checkRegist(i) && checkUsed(i)) { + if (checkArea(*pcVar6, i)) { + if (getKind(i) == 5) { + iVar5 = i; + } else { + return i; + } + } + } + } + + if (iVar5 == -1) { + return -1; + } + return iVar5; } /* 00001CEC-00001DD8 .text checkXZDistance__11daSalvage_cFv */ -void daSalvage_c::checkXZDistance() { - /* Nonmatching */ +int daSalvage_c::checkXZDistance() { + daShip_c* ship = dComIfGp_getShipActor(); + + if (ship == NULL) { + return -1; + } + + cXyz* pcVar6 = ship->getCraneTop(); + if (pcVar6 == NULL) { + return -1; + } + + for (s32 i = 0; i < 160; i++) { + if (checkRegist(i) && checkUsed(i)) { + f32 sp08; + if (getDistance(i, &sp08) && sp08 < GetR(i)) { + return i; + } + } + } + + return -1; } /* 00001DD8-00001E48 .text getDistance__11daSalvage_cFiPf */ -void daSalvage_c::getDistance(int, float*) { - /* Nonmatching */ +BOOL daSalvage_c::getDistance(int salvageId, float* outDist) { + if (!checkRegist(salvageId)) { + return FALSE; + } + + *outDist = getDistance_sub(salvageId); + return TRUE; } /* 00001E48-00001FA8 .text send_agb__11daSalvage_cFv */ void daSalvage_c::send_agb() { - /* Nonmatching */ + u8 bVar5 = 0; + fopAcM_setGbaName(this, dItem_GRAPPLING_HOOK_e, 0x40, 0x3f); + for (s32 i = 0; i < 160; i++) { + if (getKind(i) != 5 && getKind(i) && checkRegist(i) && checkUsed(i) && getRoomNo(i) == dComIfGp_roomControl_getStayNo()) { + cXyz sp14 = getPos(i); + dMap_drawPoint(0x10, sp14.x, sp14.y, sp14.z, getRoomNo(i), -0x8000, bVar5, gbaName, 0); + bVar5++; + } + } } /* 00001FA8-00001FAC .text debug_print2__11daSalvage_cFv */ void daSalvage_c::debug_print2() { - /* Nonmatching */ } /* 00001FAC-00002158 .text _draw__11daSalvage_cFv */ bool daSalvage_c::_draw() { - /* Nonmatching */ + static const GXColor unused_5277 = {255, 0, 0, 255}; + + debugDraw(); + calcAlpha(); + + s32 iVar10 = 0; + for (s32 i = 0; i < 160; i++) { + if (checkRegist(i) && checkUsed(i) && isEffectKind(i) && getDrawMode(i) != 0) { + J3DMaterial* material = mModelData->getMaterialNodePointer(0); + + u8 tmpAlpha = *getAlphaP(i); + if (material == NULL) { + break; + } + + u8 oldAlpha = material->getTevKColor(3)->mColor.a; + material->getTevKColor(3)->mColor.a = tmpAlpha; + + set_mtx(mModels[iVar10], i); + mpBrk->entry(mModelData); + mpBtk->entry(mModelData); + mDoExt_modelUpdateDL(mModels[iVar10]); + + material->getTevKColor(3)->mColor.a = oldAlpha; + + if (++iVar10 >= 16) { + break; + } + } + } + + mpBrk->play(); + mpBtk->play(); + send_agb(); + return true; } /* 00002158-000023B0 .text set_mtx__11daSalvage_cFP8J3DModeli */ -void daSalvage_c::set_mtx(J3DModel*, int) { - /* Nonmatching */ -} +void daSalvage_c::set_mtx(J3DModel* model, int arg2) { + cXyz sp58 = getPos(arg2); + JGeometry::TVec3 rot(0, 0, 0); + if (daSea_ChkArea(sp58.x, sp58.z)) { + f32 pcVar3 = daSea_calcWave(sp58.x - 50.0f, sp58.z - 50.0f); + f32 pnVar4 = daSea_calcWave(sp58.x - 50.0f, sp58.z + 50.0f); + f32 pnVar5 = daSea_calcWave(sp58.x + 50.0f, sp58.z - 50.0f); + + cXyz sp4C(sp58.x - 50.0f, pcVar3, sp58.z - 50.0f); + cXyz sp40(sp58.x - 50.0f, pnVar4, sp58.z + 50.0f); + cXyz sp34(sp58.x + 50.0f, pnVar5, sp58.z - 50.0f); + + cM3dGTri sp64(&sp4C, &sp40, &sp34); + cM3d_CalcVecAngle(sp64.mNormal, &rot.x, &rot.z); + if (mEmitter != NULL) { + mEmitter->setGlobalRotation(rot); + } + sp58.y = daSea_calcWave(sp58.x, sp58.z); + } else { + f32 dVar2 = dBgS_ObjGndChk_Wtr_Func(sp58); + if (dVar2 != -G_CM3D_F_INF) { + sp58.y = dVar2; + } + } +#if VERSION > VERSION_DEMO + setPos(arg2, sp58); +#endif + model->setBaseScale(getScale(arg2)); + mDoMtx_stack_c::transS(sp58.x, sp58.y, sp58.z); + mDoMtx_stack_c::XYZrotM(rot.x, rot.y, rot.z); + model->setBaseTRMtx(mDoMtx_stack_c::get()); +} +#if VERSION > VERSION_DEMO +static const f32 unused_5483[1] = {1000.0f}; +#endif /* 000023B0-0000240C .text isEffectKind__11daSalvage_cFi */ -void daSalvage_c::isEffectKind(int) { - /* Nonmatching */ +BOOL daSalvage_c::isEffectKind(int salvageId) { + u8 uVar1 = getKind(salvageId); + BOOL ret = FALSE; + + switch (uVar1) { + case 5: + break; + + case 0: + case 1: + case 2: + case 3: + case 4: + case 6: + ret = TRUE; + break; + } + return ret; } /* 0000240C-00002410 .text debugDraw__11daSalvage_cFv */ diff --git a/src/d/d_salvage.cpp b/src/d/d_salvage.cpp index 3d54bf20c..e8d78d045 100644 --- a/src/d/d_salvage.cpp +++ b/src/d/d_salvage.cpp @@ -211,7 +211,7 @@ f32 dSalvage_control_c::getH(int no) { } /* 800CCE28-800CCE38 .text getRoomNo__18dSalvage_control_cFi */ -u8 dSalvage_control_c::getRoomNo(int no) { +s8 dSalvage_control_c::getRoomNo(int no) { return mInfo[no].mRoomNo; } @@ -251,7 +251,7 @@ u8* dSalvage_control_c::getAlphaPtr(int no) { } /* 800CCEAC-800CCEBC .text getDrawMode__18dSalvage_control_cFi */ -u8 dSalvage_control_c::getDrawMode(int no) { +s32 dSalvage_control_c::getDrawMode(int no) { return mInfo[no].mNowAlpha; // ??? } @@ -261,8 +261,11 @@ BOOL dSalvage_control_c::checkRegist(int no) { } /* 800CCEDC-800CCEF8 .text checkUsed__18dSalvage_control_cFi */ -bool dSalvage_control_c::checkUsed(int no) { - return !mInfo[no].checkFlag(1); +BOOL dSalvage_control_c::checkUsed(int no) { + if (mInfo[no].checkFlag(1)) { + return FALSE; + } + return TRUE; } /* 800CCEF8-800CCF1C .text setPos__18dSalvage_control_cFi4cXyz */