diff --git a/configure.py b/configure.py index 7ba94d1f3..54cf2f0c5 100644 --- a/configure.py +++ b/configure.py @@ -276,7 +276,7 @@ config.libs = [ Object(NonMatching, "f_ap/f_ap_game.cpp"), # f_op - Object(NonMatching, "f_op/f_op_actor.cpp"), + Object(Matching, "f_op/f_op_actor.cpp", extra_cflags=["-sym off"]), Object(Matching, "f_op/f_op_actor_iter.cpp"), Object(Matching, "f_op/f_op_actor_tag.cpp"), Object(NonMatching, "f_op/f_op_actor_mng.cpp"), diff --git a/include/JSystem/J3DGraphBase/J3DStruct.h b/include/JSystem/J3DGraphBase/J3DStruct.h index 9232eccc2..285fa0687 100644 --- a/include/JSystem/J3DGraphBase/J3DStruct.h +++ b/include/JSystem/J3DGraphBase/J3DStruct.h @@ -8,7 +8,13 @@ class J3DLightInfo { public: - void operator=(J3DLightInfo const&); + void operator=(J3DLightInfo const& other) { + mLightPosition = other.mLightPosition; + mLightDirection = other.mLightDirection; + mColor = other.mColor; + mCosAtten = other.mCosAtten; + mDistAtten = other.mDistAtten; + } /* 0x00 */ Vec mLightPosition; /* 0x0C */ Vec mLightDirection; diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index 5c32e9481..9a0d87fee 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -137,6 +137,7 @@ struct TVec3 { x = b.x; y = b.y; z = b.z; + return *this; } f32 squared() const { diff --git a/include/d/actor/d_a_player_npc.h b/include/d/actor/d_a_player_npc.h new file mode 100644 index 000000000..003ffd439 --- /dev/null +++ b/include/d/actor/d_a_player_npc.h @@ -0,0 +1,46 @@ +#ifndef D_A_PLAYER_NPC_H +#define D_A_PLAYER_NPC_H + +#include "d/actor/d_a_player.h" +#include "d/d_bg_s_acch.h" + +class daPy_npc_c : public daPy_py_c { +public: + /* 0x320 */ dBgS_Acch mAcch; + /* 0x4E4 */ u32 m4E4; + /* 0x4E8 */ u8 m4E8; + /* 0x4E9 */ u8 mDamageFogTimer; + /* 0x4EA */ u8 field_4EA[0x4EC - 0x4EA]; + + void returnLink() { m4E4 |= 1; } + void offReturnLink() { m4E4 &= ~1; } + bool isReturnLink() { return m4E4 & 1; } + void onEventAccept() { m4E4 |= 2; } + void offEventAccept() { m4E4 &= ~2; } + bool isEventAccept() { return m4E4 & 2; } + + u8 getDamageFogTimer() { return mDamageFogTimer; } + void setDamageFogTimer(u8 timer) { mDamageFogTimer = timer; } + void executeDamageFog() { cLib_calcTimer(&mDamageFogTimer); } + + virtual void restartPoint(s16) {} + virtual void isTagCheckOK() {} + virtual void setMessageAnimation(u8) {} + + int check_initialRoom(); + BOOL check_moveStop(); + void setRestart(s8); + void unconditionalSetRestart(s8); + void setOffsetHomePos(); + void setPointRestart(s16, s8); + BOOL checkRestart(s8); + BOOL initialRestartOption(s8, int); + BOOL checkNowPosMove(const char*); + void drawDamageFog(); + int chkMoveBlock(cXyz*); +}; + +void* daPy_npc_JudgeForPNameAndDistance(void* i_actor, void* i_prm); +fopAc_ac_c* daPy_npc_SearchAreaByName(fopAc_ac_c* i_this, s16 procName, f32 areaRadius, cXyz* outActorOffset); + +#endif /* D_A_PLAYER_NPC_H */ diff --git a/include/d/d_bg_s.h b/include/d/d_bg_s.h index 2646e3f73..6069943c3 100644 --- a/include/d/d_bg_s.h +++ b/include/d/d_bg_s.h @@ -106,7 +106,7 @@ public: int GetSpecialCode(cBgS_PolyInfo&); s32 GetAttributeCodeDirect(cBgS_PolyInfo&); s32 GetAttributeCode(cBgS_PolyInfo&); - void GetGroundCode(cBgS_PolyInfo&); + int GetGroundCode(cBgS_PolyInfo&); void GetPolyId2(int, int, int, u32, u32); int GetCamMoveBG(cBgS_PolyInfo&); int GetRoomCamId(cBgS_PolyInfo&); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index e1df1580a..a0077e585 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -39,7 +39,7 @@ class camera_class; class J2DOrthoGraph; class dDemo_actor_c; -enum ALWAYS_RES_FILE_IDS { +enum ALWAYS_RES_FILE_ID { // IDs and indexes are synced /* BCK */ ALWAYS_BCK_FA=0xC, ALWAYS_BCK_OBM_SYOUGEKISW=0xD, @@ -331,6 +331,7 @@ public: fopAc_ac_c* getPlayerPtr(int idx) { return (fopAc_ac_c*)mpPlayerPtr[idx]; } fopAc_ac_c* getPlayer(int idx) { return (fopAc_ac_c*)mpPlayer[idx]; } void setPlayer(int idx, fopAc_ac_c* player) { mpPlayer[idx] = (daPy_py_c*)player; } + void setPlayerPtr(int idx, fopAc_ac_c* playerPtr) { mpPlayerPtr[idx] = playerPtr; } s8 getPlayerCameraID(int idx) { return mCurCamera[idx]; } int getItemRupeeCount() { return mItemRupeeCount; } @@ -703,14 +704,82 @@ inline s8 dComIfGs_getRestartRoomNo() { return g_dComIfG_gameInfo.save.getRestart().getRoomNo(); } -inline s8 dComIfGs_getTurnRestartRoomNo() { - return g_dComIfG_gameInfo.save.getTurnRestart().getRoomNo(); +inline s8 dComIfGs_getRestartOption() { + return g_dComIfG_gameInfo.save.getRestart().getRestartOption(); +} + +inline s16 dComIfGs_getRestartOptionPoint() { + return g_dComIfG_gameInfo.save.getRestart().getRestartOptionPoint(); +} + +inline s8 dComIfGs_getRestartOptionRoomNo() { + return g_dComIfG_gameInfo.save.getRestart().getRestartOptionRoomNo(); +} + +inline cXyz& dComIfGs_getRestartOptionPos() { + return g_dComIfG_gameInfo.save.getRestart().getRestartOptionPos(); +} + +inline s16 dComIfGs_getRestartOptionAngleY() { + return g_dComIfG_gameInfo.save.getRestart().getRestartOptionAngleY(); +} + +inline void dComIfGs_setRestartOption(s8 i_option) { + g_dComIfG_gameInfo.save.getRestart().setRestartOption(i_option); +} + +inline void dComIfGs_setRestartOption(cXyz* i_pos, s16 i_angle, s8 i_roomNo, s8 i_option) { + g_dComIfG_gameInfo.save.getRestart().setRestartOption(i_option, i_pos, i_angle, i_roomNo); +} + +inline u32 dComIfGs_getRestartRoomParam() { + return g_dComIfG_gameInfo.save.getRestart().getRoomParam(); +} + +inline cXyz& dComIfGs_getRestartRoomPos() { + return g_dComIfG_gameInfo.save.getRestart().getRoomPos(); +} + +inline s16 dComIfGs_getRestartRoomAngleY() { + return g_dComIfG_gameInfo.save.getRestart().getRoomAngleY(); } inline void dComIfGs_setStartPoint(s16 i_point) { g_dComIfG_gameInfo.save.getRestart().setStartPoint(i_point); } +inline s8 dComIfGs_getTurnRestartRoomNo() { + return g_dComIfG_gameInfo.save.getTurnRestart().getRoomNo(); +} + +inline u32 dComIfGs_getTurnRestartParam() { + return g_dComIfG_gameInfo.save.getTurnRestart().getParam(); +} + +inline cXyz& dComIfGs_getTurnRestartPos() { + return g_dComIfG_gameInfo.save.getTurnRestart().getPos(); +} + +inline cXyz& dComIfGs_getTurnRestartShipPos() { + return g_dComIfG_gameInfo.save.getTurnRestart().getShipPos(); +} + +inline s16 dComIfGs_getTurnRestartAngleY() { + return g_dComIfG_gameInfo.save.getTurnRestart().getAngleY(); +} + +inline s16 dComIfGs_getTurnRestartShipAngleY() { + return g_dComIfG_gameInfo.save.getTurnRestart().getShipAngleY(); +} + +inline void dComIfGs_setTurnRestart(const cXyz& i_pos, s16 i_angle, s8 i_roomNo, u32 i_param) { + g_dComIfG_gameInfo.save.getTurnRestart().set(i_pos, i_angle, i_roomNo, i_param, i_pos, i_angle, 0); +} + +inline void dComIfGs_setPlayerPriest(u8 i_option, cXyz& i_pos, s16 i_angle, s8 i_roomNo) { + g_dComIfG_gameInfo.save.getPlayer().getPriest().set(i_option, i_pos, i_angle, i_roomNo); +} + inline int dComIfGs_getTriforceNum() { return g_dComIfG_gameInfo.save.getPlayer().getCollect().getTriforceNum(); } @@ -812,38 +881,6 @@ inline void dComIfGs_removeZone(int i_zoneNo) { g_dComIfG_gameInfo.save.removeZone(i_zoneNo); } -inline u32 dComIfGs_getTurnRestartParam() { - return g_dComIfG_gameInfo.save.getTurnRestart().getParam(); -} - -inline cXyz& dComIfGs_getTurnRestartPos() { - return g_dComIfG_gameInfo.save.getTurnRestart().getPos(); -} - -inline cXyz& dComIfGs_getTurnRestartShipPos() { - return g_dComIfG_gameInfo.save.getTurnRestart().getShipPos(); -} - -inline s16 dComIfGs_getTurnRestartAngleY() { - return g_dComIfG_gameInfo.save.getTurnRestart().getAngleY(); -} - -inline s16 dComIfGs_getTurnRestartShipAngleY() { - return g_dComIfG_gameInfo.save.getTurnRestart().getShipAngleY(); -} - -inline u32 dComIfGs_getRestartRoomParam() { - return g_dComIfG_gameInfo.save.getRestart().getRoomParam(); -} - -inline cXyz& dComIfGs_getRestartRoomPos() { - return g_dComIfG_gameInfo.save.getRestart().getRoomPos(); -} - -inline s16 dComIfGs_getRestartRoomAngleY() { - return g_dComIfG_gameInfo.save.getRestart().getRoomAngleY(); -} - inline void dComIfGs_putSave(int i_stageNo) { g_dComIfG_gameInfo.save.putSave(i_stageNo); } @@ -864,10 +901,6 @@ inline BOOL dComIfGs_isActor(int i_no, int i_roomNo) { return g_dComIfG_gameInfo.save.isActor(i_no, i_roomNo); } -inline void dComIfGs_setTurnRestart(const cXyz& i_pos, s16 i_angle, s8 i_roomNo, u32 i_param) { - g_dComIfG_gameInfo.save.getTurnRestart().set(i_pos, i_angle, i_roomNo, i_param, i_pos, i_angle, 0); -} - inline u16 dComIfGs_getDate() { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusB().getDate(); } @@ -1050,6 +1083,10 @@ inline fopAc_ac_c* dComIfGp_getCb1Player() { return g_dComIfG_gameInfo.play.getPlayerPtr(1); } +inline void dComIfGp_setCb1Player(fopAc_ac_c* player) { + g_dComIfG_gameInfo.play.setPlayerPtr(1, player); +} + inline roomRead_class* dComIfGp_getStageRoom() { return g_dComIfG_gameInfo.play.getStage().getRoom(); } @@ -1086,6 +1123,14 @@ inline int dComIfGp_getStagePlightNumInfo() { return g_dComIfG_gameInfo.play.getStage().getPlightNumInfo(); } +inline stage_actor_class* dComIfGp_getStagePlayer() { + return g_dComIfG_gameInfo.play.getStage().getPlayer(); +} + +inline u16 dComIfGp_getStagePlayerNum() { + return g_dComIfG_gameInfo.play.getStage().getPlayerNum(); +} + inline s32 dComIfGp_roomControl_getTimePass() { return g_dComIfG_gameInfo.play.getRoomControl()->GetTimePass(); } @@ -1114,6 +1159,10 @@ inline void dComIfGp_roomControl_setStatusFlag(int i_roomNo, u8 i_flag) { g_dComIfG_gameInfo.play.getRoomControl()->setStatusFlag(i_roomNo, i_flag); } +inline BOOL dComIfGp_roomControl_checkStatusFlag(int i_roomNo, u8 i_flag) { + return g_dComIfG_gameInfo.play.getRoomControl()->checkStatusFlag(i_roomNo, i_flag); +} + inline void dComIfGp_roomControl_zoneCountCheck(int i_roomNo) { g_dComIfG_gameInfo.play.getRoomControl()->zoneCountCheck(i_roomNo); } @@ -1473,7 +1522,7 @@ inline s16 dComIfGp_evmng_getEventIdx(const char* pName, u8 evNo) { return dComIfGp_getEventManager().getEventIdx(pName, evNo); } -inline int dComIfGp_evmng_getMyStaffId(char* pName, fopAc_ac_c* pActor, s32 param_3) { +inline int dComIfGp_evmng_getMyStaffId(const char* pName, fopAc_ac_c* pActor, s32 param_3) { return dComIfGp_getEventManager().getMyStaffId(pName, pActor, param_3); } diff --git a/include/d/d_demo.h b/include/d/d_demo.h index fa3f7066a..d8cec07c7 100644 --- a/include/d/d_demo.h +++ b/include/d/d_demo.h @@ -94,6 +94,7 @@ public: /* 0xDC */ int mState; }; +class mDoExt_McaMorf; void dDemo_setDemoData(fopAc_ac_c*, u8, mDoExt_McaMorf*, const char*, int, u16*, u32, s8); #endif /* D_DEMO_H */ \ No newline at end of file diff --git a/include/d/d_save.h b/include/d/d_save.h index c75f0548f..96233ede7 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -566,19 +566,25 @@ public: mLastMode = mode; } - s16 getStartPoint() const { return mStartCode; } - u32 getLastMode() const { return mLastMode; } - s8 getRoomNo() const { return mRestartRoom; } - u32 getRoomParam() const { return mRestartParam; } + s16 getStartPoint() { return mStartCode; } + u32 getLastMode() { return mLastMode; } + f32 getLastSpeedF() { return mLastSpeedF; } + s8 getRoomNo() { return mRestartRoom; } + u32 getRoomParam() { return mRestartParam; } cXyz& getRoomPos() { return mRestartPos; } - s16 getRoomAngleY() const { return mRestartAngle; } + s16 getRoomAngleY() { return mRestartAngle; } + s8 getRestartOption() { return mOption; } + s8 getRestartOptionRoomNo() { return mOptionRoomNo; } + s16 getRestartOptionPoint() { return mOptionPoint; } + s16 getRestartOptionAngleY() { return mOptionRoomAngleY; } + cXyz& getRestartOptionPos() { return mOptionRoomPos; } /* 0x00 */ s8 mRestartRoom; - /* 0x01 */ u8 field_0x1; - /* 0x02 */ s8 mRoomNo; - /* 0x04 */ s16 field_0x4; - /* 0x06 */ s16 mRoomAngleY; - /* 0x08 */ cXyz mRoomPos; + /* 0x01 */ u8 mOption; + /* 0x02 */ s8 mOptionRoomNo; + /* 0x04 */ s16 mOptionPoint; + /* 0x06 */ s16 mOptionRoomAngleY; + /* 0x08 */ cXyz mOptionRoomPos; /* 0x14 */ s16 mStartCode; /* 0x16 */ s16 mRestartAngle; /* 0x18 */ cXyz mRestartPos; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index eb6a51178..82dce90d1 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -832,7 +832,7 @@ public: static void setBgW(int param_0, dBgW_base* i_bgw) { mStatus[param_0].mpBgW = i_bgw; } - bool checkStatusFlag(int i_roomNo, u8 flag) const { + BOOL checkStatusFlag(int i_roomNo, u8 flag) const { return cLib_checkBit(mStatus[i_roomNo].mFlags, flag); } diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 52959b612..c5b5da6ff 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -94,6 +94,7 @@ enum dEvt_Command_e { dEvtCmd_INDEMO_e, dEvtCmd_INDOOR_e, dEvtCmd_INGETITEM_e, + dEvtCmd_INCATCH_e = 6, dEvtCmd_DUMMY = 0xFFFF, }; @@ -129,11 +130,11 @@ public: void onCondition(u16 cond) { mCondition |= cond; } void offCondition(u16 cond) { mCondition &= ~cond; } - bool checkCommandTalk() { return mCommand == 1; } - bool checkCommandItem() { return mCommand == 4; } - BOOL checkCommandDoor() { return mCommand == 3; } - bool checkCommandDemoAccrpt() { return mCommand == 2; } - bool checkCommandCatch() { return mCommand == 6; } + bool checkCommandTalk() { return mCommand == dEvtCmd_INTALK_e; } + bool checkCommandItem() { return mCommand == dEvtCmd_INGETITEM_e; } + BOOL checkCommandDoor() { return mCommand == dEvtCmd_INDOOR_e; } + bool checkCommandDemoAccrpt() { return mCommand == dEvtCmd_INDEMO_e; } + bool checkCommandCatch() { return mCommand == dEvtCmd_INCATCH_e; } /* 0x04 */ u16 mCommand; /* 0x06 */ u16 mCondition; @@ -169,6 +170,7 @@ public: #ifndef __INTELLISENSE__ fopAc_cullSizeSphere() {} fopAc_cullSizeSphere(cXyz, float); + ~fopAc_cullSizeSphere() {} #endif /* 0x0 */ Vec mCenter; @@ -181,6 +183,7 @@ public: fopAc_cullSizeBox() {} fopAc_cullSizeBox(const fopAc_cullSizeBox&); fopAc_cullSizeBox(cXyz, cXyz); + ~fopAc_cullSizeBox() {} #endif /* 0x0 */ Vec mMin; diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 3e84e7bda..b97ec0042 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -82,7 +82,7 @@ inline MtxP fopAcM_GetMtx(fopAc_ac_c* pActor) { return pActor->mCullMtx; } -inline u32 fopAcM_checkStatus(fopAc_ac_c* pActor, u32 status) { +inline bool fopAcM_checkStatus(fopAc_ac_c* pActor, u32 status) { return pActor->mStatus & status; } diff --git a/src/d/actor/d_a_am.cpp b/src/d/actor/d_a_am.cpp index 42196bb94..90f4947cd 100644 --- a/src/d/actor/d_a_am.cpp +++ b/src/d/actor/d_a_am.cpp @@ -82,7 +82,7 @@ enum Action { ACTION_ITAI_MOVE = 0x3, }; -enum AM_RES_FILE_IDS { +enum AM_RES_FILE_ID { // IDs and indexes are synced /* BAS */ AM_BAS_BOM_NOMI=0x5, AM_BAS_BOM_NOMI2=0x6, diff --git a/src/d/actor/d_a_player_npc.cpp b/src/d/actor/d_a_player_npc.cpp index 48cb3e605..369085e58 100644 --- a/src/d/actor/d_a_player_npc.cpp +++ b/src/d/actor/d_a_player_npc.cpp @@ -3,71 +3,277 @@ // Translation Unit: d_a_player_npc.cpp // -#include "d_a_player_npc.h" +#include "d/actor/d_a_player_npc.h" #include "dolphin/types.h" +#include "m_Do/m_Do_lib.h" +#include "SSystem/SComponent/c_counter.h" +#include "d/d_procname.h" /* 8015A37C-8015A448 .text check_initialRoom__10daPy_npc_cFv */ -void daPy_npc_c::check_initialRoom() { - /* Nonmatching */ +int daPy_npc_c::check_initialRoom() { + if (orig.roomNo < 0) { + mAcch.CrrPos(*dComIfG_Bgsp()); + if (mAcch.GetGroundH() == -1000000000.0f || dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4) { + return 0; + } else { + int roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + if (roomNo < 0 || !dComIfGp_roomControl_checkStatusFlag(roomNo, 0x10)) { + return 0; + } else { + orig.roomNo = roomNo; + current.roomNo = roomNo; + return -1; + } + } + } + return 1; } /* 8015A448-8015A524 .text check_moveStop__10daPy_npc_cFv */ -void daPy_npc_c::check_moveStop() { - /* Nonmatching */ +BOOL daPy_npc_c::check_moveStop() { + int roomNo = current.roomNo; + BOOL hasBgW = dComIfGp_roomControl_checkStatusFlag(roomNo, 0x10); + if ((roomNo < 0 || !hasBgW)) { + if (!hasBgW || m4E8 >= 30) { + current = orig; + shape_angle = orig.angle; + speedF = 0.0f; + m4E8 = 0; + } + if (dComIfGp_getPlayer(0)->mEvtInfo.mCommand != dEvtCmd_INDOOR_e) { + offNpcCallCommand(); + } + return TRUE; + } + return FALSE; } /* 8015A524-8015A590 .text setRestart__10daPy_npc_cFSc */ -void daPy_npc_c::setRestart(signed char) { - /* Nonmatching */ +void daPy_npc_c::setRestart(s8 option) { + if (option == dComIfGs_getRestartOption()) { + bool playerInDoor = dComIfGp_getPlayer(0)->mEvtInfo.checkCommandDoor(); + s8 roomNo = current.roomNo; + s8 optionRoomNo = dComIfGs_getRestartOptionRoomNo(); + if (!playerInDoor && roomNo != optionRoomNo) { + unconditionalSetRestart(option); + } + } } /* 8015A590-8015A624 .text unconditionalSetRestart__10daPy_npc_cFSc */ -void daPy_npc_c::unconditionalSetRestart(signed char) { - /* Nonmatching */ +void daPy_npc_c::unconditionalSetRestart(s8 option) { + dComIfGs_setRestartOption(option); + dComIfGs_setPlayerPriest(option, dComIfGs_getRestartOptionPos(), dComIfGs_getRestartOptionAngleY(), dComIfGs_getRestartOptionRoomNo()); + orig.pos = dComIfGs_getRestartOptionPos(); + orig.angle.y = dComIfGs_getRestartOptionAngleY(); + orig.roomNo = dComIfGs_getRestartOptionRoomNo(); } /* 8015A624-8015A6A4 .text setOffsetHomePos__10daPy_npc_cFv */ void daPy_npc_c::setOffsetHomePos() { - /* Nonmatching */ + static cXyz l_offsetPos(100.0f, 0.0f, 0.0f); + cLib_offsetPos(&orig.pos, &orig.pos, orig.angle.y, &l_offsetPos); } /* 8015A6A4-8015AA0C .text setPointRestart__10daPy_npc_cFsSc */ -void daPy_npc_c::setPointRestart(short, signed char) { - /* Nonmatching */ +void daPy_npc_c::setPointRestart(s16 i_point, s8 option) { + /* Nonmatching (regswaps) */ + JUT_ASSERT(157, dComIfGp_getStagePlayer() != 0); + stage_scls_info_dummy_class* sclsinfo = dComIfGp_getStageSclsInfo(); + JUT_ASSERT(159, sclsinfo != 0); + + JUT_ASSERT(161, 0 <= i_point && i_point < sclsinfo->num); + stage_scls_info_class* scls_data = sclsinfo->m_entries; + JUT_ASSERT(163, scls_data != 0); + + stage_actor_data_class* player_data = dComIfGp_getStagePlayer()->m_entries; + int scls_start_code = scls_data[i_point].mStart; + int i; + for (i = 0; i < dComIfGp_getStagePlayerNum(); i++) { + u8 plyr_start_code = player_data->mAngle.z & 0xFF; + if (plyr_start_code == scls_start_code) { + break; + } + player_data++; + } + JUT_ASSERT(174, i != dComIfGp_getStagePlayerNum()); + + orig.pos = player_data->mSpawnPos; + orig.angle.y = player_data->mAngle.y; + orig.roomNo = -1; + setOffsetHomePos(); + current = orig; + next = orig; + shape_angle = orig.angle; + + s16 rotY = orig.angle.y; + s8 roomNo = -1; + dComIfGs_setRestartOption(&orig.pos, rotY, roomNo, option); + dComIfGs_setPlayerPriest(option, orig.pos, rotY, roomNo); + dComIfGs_setPlayerPriest(option, dComIfGs_getRestartOptionPos(), dComIfGs_getRestartOptionAngleY(), dComIfGs_getRestartOptionRoomNo()); + fopAcM_setStageLayer(this); } /* 8015AA0C-8015AB28 .text checkRestart__10daPy_npc_cFSc */ -void daPy_npc_c::checkRestart(signed char) { - /* Nonmatching */ +BOOL daPy_npc_c::checkRestart(s8 option) { + if (option == dComIfGs_getRestartOption()) { + s16 option_point = dComIfGs_getRestartOptionPoint(); + if (option_point < 0) { + orig.pos = dComIfGs_getRestartOptionPos(); + orig.angle.y = dComIfGs_getRestartOptionAngleY(); + orig.roomNo = dComIfGs_getRestartOptionRoomNo(); + current = orig; + next = orig; + shape_angle = orig.angle; + } else { + setPointRestart(option_point, 1); + } + return TRUE; + } + return FALSE; } /* 8015AB28-8015ABD8 .text initialRestartOption__10daPy_npc_cFSci */ -void daPy_npc_c::initialRestartOption(signed char, int) { - /* Nonmatching */ +BOOL daPy_npc_c::initialRestartOption(s8 option, int save) { + fopAc_ac_c* partner = dComIfGp_getCb1Player(); + if (!partner) { + dComIfGp_setCb1Player(this); + if (save && option != dComIfGs_getRestartOption()) { + s16 rotY; + s8 roomNo = current.roomNo; + rotY = orig.angle.y; + dComIfGs_setRestartOption(&orig.pos, rotY, roomNo, option); + dComIfGs_setPlayerPriest(option, orig.pos, rotY, roomNo); + } + return TRUE; + } + return FALSE; } /* 8015ABD8-8015AC74 .text checkNowPosMove__10daPy_npc_cFPCc */ -void daPy_npc_c::checkNowPosMove(const char*) { - /* Nonmatching */ +BOOL daPy_npc_c::checkNowPosMove(const char* pName) { + /* Nonmatching (regalloc) */ + if (!dComIfGp_event_runCheck()) { + return TRUE; + } + if (mEvtInfo.checkCommandTalk()) { + return TRUE; + } + if (isEventAccept() && !isReturnLink()) { + return TRUE; + } + + int evtStaffId = dComIfGp_evmng_getMyStaffId(pName, NULL, 0); + if (evtStaffId != -1) { + return TRUE; + } + + return fopAcM_checkStatus(this, fopAcStts_UNK800_e); } /* 8015AC74-8015AD20 .text drawDamageFog__10daPy_npc_cFv */ void daPy_npc_c::drawDamageFog() { - /* Nonmatching */ + if (mDamageFogTimer == 0) { + return; + } + + cXyz temp; + f32 temp_f1; + f32 temp_f2; + mDoLib_pos2camera(¤t.pos, &temp); + temp_f2 = fabs(cM_ssin(g_Counter.mTimer * 0x800)); + mTevStr.mFogColor.r = 255; + mTevStr.mFogColor.g = 60; + mTevStr.mFogColor.b = 60; + + temp_f1 = -temp.z; + temp_f1 -= 200.0f; + temp_f2 = 200.0f * temp_f2; + mTevStr.mFogStartZ = temp_f1 + temp_f2; + mTevStr.mFogEndZ = mTevStr.mFogStartZ + 300.0f; } /* 8015AD20-8015AEF8 .text chkMoveBlock__10daPy_npc_cFP4cXyz */ -void daPy_npc_c::chkMoveBlock(cXyz*) { - /* Nonmatching */ +int daPy_npc_c::chkMoveBlock(cXyz* outBlockVel) { + cXyz blockRelPos; + fopAc_ac_c* block = daPy_npc_SearchAreaByName(this, PROC_Obj_Movebox, 300.0f, &blockRelPos); + if (block) { + cXyz blockVel = block->current.pos - block->next.pos; + if (blockVel.abs() > 0.001f) { + if (outBlockVel) { + *outBlockVel = blockVel; + } + + blockRelPos.normalizeZP(); + blockVel.normalizeZP(); + f32 dot = blockRelPos.getDotProduct(blockVel); + + blockVel.y = 0.0f; + blockRelPos.y = 0.0f; + cXyz cross = blockRelPos.outprod(blockVel); + + if (dot < -0.707099974155426f) { + if (cross.y < 0.0f) { + return -1; + } else { + return 1; + } + } + + if (block->current.pos.y > current.pos.y + 100.0f) { + if (cross.y < 0.0f) { + return -1; + } else { + return 1; + } + } + } + } + + return 0; } +struct judge_parm_c { + /* 0x00 */ s16 mProcName; + /* 0x04 */ cXyz mAreaCenter; + /* 0x10 */ cXyz mActorRelPos; + /* 0x1C */ f32 mAreaRadius; + /* 0x20 */ f32 mMinDist; + /* 0x24 */ fopAc_ac_c* mpActor; +}; + /* 8015AEF8-8015B00C .text daPy_npc_JudgeForPNameAndDistance__FPvPv */ -void daPy_npc_JudgeForPNameAndDistance(void*, void*) { - /* Nonmatching */ +void* daPy_npc_JudgeForPNameAndDistance(void* i_actor, void* i_prm) { + fopAc_ac_c* actor = (fopAc_ac_c*)i_actor; + judge_parm_c* prm = (judge_parm_c*)i_prm; + + if (fopAcM_GetName(actor) == prm->mProcName) { + cXyz actorOffset = actor->current.pos - prm->mAreaCenter; + f32 dist = actorOffset.abs(); + if (dist < prm->mAreaRadius && dist < prm->mMinDist) { + prm->mMinDist = dist; + prm->mpActor = actor; + prm->mActorRelPos = actorOffset; + } + } + + return NULL; } /* 8015B00C-8015B0A4 .text daPy_npc_SearchAreaByName__FP10fopAc_ac_csfP4cXyz */ -void daPy_npc_SearchAreaByName(fopAc_ac_c*, short, float, cXyz*) { - /* Nonmatching */ +fopAc_ac_c* daPy_npc_SearchAreaByName(fopAc_ac_c* i_this, s16 procName, f32 areaRadius, cXyz* outActorRelPos) { + judge_parm_c prm; + prm.mProcName = procName; + prm.mAreaCenter = i_this->current.pos; + prm.mAreaRadius = areaRadius; + prm.mMinDist = areaRadius; + prm.mpActor = NULL; + prm.mActorRelPos.x = 0.0f; + prm.mActorRelPos.y = 0.0f; + prm.mActorRelPos.z = 0.0f; + fopAcIt_Judge(daPy_npc_JudgeForPNameAndDistance, &prm); + if (outActorRelPos) { + *outActorRelPos = prm.mActorRelPos; + } + return prm.mpActor; } - diff --git a/src/f_op/f_op_actor.cpp b/src/f_op/f_op_actor.cpp index 1b3f540f2..be93ce842 100644 --- a/src/f_op/f_op_actor.cpp +++ b/src/f_op/f_op_actor.cpp @@ -18,6 +18,9 @@ fopAc_ac_c::fopAc_ac_c() { } +fopAc_ac_c::~fopAc_ac_c() { +} + int g_fopAc_type; u32 fopAc_ac_c::stopStatus; @@ -34,7 +37,18 @@ s32 fopAc_Draw(void* pProc) { if (!dMenu_flag()) { s32 moveApproval = dComIfGp_event_moveApproval(actor); - if ((moveApproval == 2 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && (!(fopAcM_checkStatus(actor, fopAcStts_CULL_e) && !fopAcM_cullingCheck(actor)) || !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e))) { + if ( + ( + moveApproval == 2 + || ( + !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus) + && !( + fopAcM_checkStatus(actor, fopAcStts_CULL_e) + && fopAcM_cullingCheck(actor) + ) + ) + ) && !fopAcM_checkStatus(actor, fopAcStts_NODRAW_e) + ) { fopAcM_OffCondition(actor, fopAcCnd_NODRAW_e); ret = fpcLf_DrawMethod((leafdraw_method_class*)actor->mSubMtd, actor); } else { @@ -68,7 +82,21 @@ s32 fopAc_Execute(void* pProc) { s32 moveApproval = dComIfGp_event_moveApproval(actor); - if ((moveApproval == 2 || moveApproval != 0 || !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus)) && (!fopAcM_checkStatus(actor, fopAcStts_NOCULLEXEC_e) || !fopAcM_CheckCondition(actor, fopAcCnd_NODRAW_e))) { + if ( + ( + moveApproval == 2 + || ( + ( + moveApproval != 0 + && !fopAcM_checkStatus(actor, fopAc_ac_c::stopStatus) + ) + && ( + !fopAcM_checkStatus(actor, fopAcStts_NOCULLEXEC_e) + || !fopAcM_CheckCondition(actor, fopAcCnd_NODRAW_e) + ) + ) + ) + ) { fopAcM_OffCondition(actor, fopAcCnd_NOEXEC_e); actor->next = actor->current; ret = fpcMtd_Execute((process_method_class*)actor->mSubMtd, actor);