From 65a63eea6929de9c459859a29bb8c7106f15e214 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Sun, 17 Sep 2023 14:44:16 -0400 Subject: [PATCH] Fill out fopNpc_npc_c (#48) * Fill out fopNpc_npc_c Start filling out the members * More Matches Still should/will get more cleanup --- .../JSystem/J3DGraphAnimator/J3DJointTree.h | 12 +- include/SSystem/SComponent/c_lib.h | 4 +- include/d/actor/d_a_player.h | 6 +- include/d/d_com_inf_game.h | 78 +- include/d/d_event.h | 5 +- include/d/d_event_manager.h | 17 +- include/d/d_npc.h | 186 ++- include/d/d_path.h | 2 +- include/d/d_save.h | 11 +- include/f_op/f_op_actor.h | 15 +- include/f_op/f_op_actor_mng.h | 3 +- src/d/d_npc.cpp | 1251 ++++++++++++++--- 12 files changed, 1392 insertions(+), 198 deletions(-) diff --git a/include/JSystem/J3DGraphAnimator/J3DJointTree.h b/include/JSystem/J3DGraphAnimator/J3DJointTree.h index 5c6edb033..9d5d3c3d3 100644 --- a/include/JSystem/J3DGraphAnimator/J3DJointTree.h +++ b/include/JSystem/J3DGraphAnimator/J3DJointTree.h @@ -39,7 +39,6 @@ public: u8 getWEvlpMixMtxNum(u16 idx) const { return mWEvlpMixMtxNum[idx]; } u16 * getWEvlpMixIndex() const { return mWEvlpMixIndex; } f32 * getWEvlpMixWeight() const { return mWEvlpMixWeight; } - u16 * getWEvlpImportantMtxIndex() const { return mWEvlpImportantMtxIdx; } u16 getDrawFullWgtMtxNum() const { return mDrawMtxData.mDrawFullWgtMtxNum; } u16 getJointNum() const { return mJointNum; } u16 getDrawMtxNum() const { return mDrawMtxData.mEntryNum; } @@ -61,12 +60,11 @@ private: /* 0x14 */ J3DMtxCalc* mBasicMtxCalc; /* 0x18 */ u16 mJointNum; /* 0x1C */ J3DJoint** mJointNodePointer; - /* 0x1E */ u16 mWEvlpMtxNum; - /* 0x20 */ u8* mWEvlpMixMtxNum; - /* 0x24 */ u16* mWEvlpMixIndex; - /* 0x28 */ f32* mWEvlpMixWeight; - /* 0x2C */ Mtx* mInvJointMtx; - /* 0x30 */ u16* mWEvlpImportantMtxIdx; + /* 0x20 */ u16 mWEvlpMtxNum; + /* 0x24 */ u8* mWEvlpMixMtxNum; + /* 0x28 */ u16* mWEvlpMixIndex; + /* 0x2C */ f32* mWEvlpMixWeight; + /* 0x30 */ Mtx* mInvJointMtx; /* 0x34 */ J3DDrawMtxData mDrawMtxData; /* 0x40 */ u32 field_0x40; /* 0x44 */ JUTNameTab* mJointName; diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index fc17d8bd7..883d092bc 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -28,8 +28,8 @@ int cLib_chasePos(cXyz* o_value, cXyz const& target, f32 step); int cLib_chasePosXZ(cXyz* o_value, cXyz const& target, f32 step); int cLib_chaseAngleS(s16* o_value, s16 target, s16 step); -s16 cLib_targetAngleY(const Vec* lhs, const Vec* rhs); -s16 cLib_targetAngleY(const Vec& lhs, const Vec& rhs); +s16 cLib_targetAngleY(cXyz* lhs, cXyz* rhs); +s16 cLib_targetAngleY(const cXyz& lhs, const cXyz& rhs); s16 cLib_targetAngleX(const cXyz*, const cXyz*); void cLib_offsetPos(cXyz* pDest, cXyz* pSrc, s16 angle, cXyz* vec); diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index 118af2b85..9ee182448 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -38,6 +38,8 @@ public: void setDemoMode(u32 mode) { mDemoMode = mode; } u32 getDemoMode() const { return mDemoMode; } int getParam1() const { return mParam1; } + void setTimer(s16 time) { mTimer = time; } + void decTimer() { mTimer--; } void setOriginalDemoType() { setDemoType(3); } void setSpecialDemoType() { setDemoType(5); } void setSystemDemoType() { setDemoType(2); } @@ -104,7 +106,7 @@ public: virtual void setTactZev(unsigned int, int, char*); virtual void onDekuSpReturnFlg(u8); virtual void checkComboCutTurn() const; - virtual void getBaseAnimeFrameRate(); + virtual f32 getBaseAnimeFrameRate(); virtual void getBaseAnimeFrame(); virtual void getItemID() const; virtual void getThrowBoomerangID() const; @@ -130,7 +132,7 @@ public: void getLeftHandPos() const; void getRopeJumpLand() const; void checkRopeForceEnd() const; - void getHeadTopPos() const; + cXyz getHeadTopPos() const; void changePlayer(fopAc_ac_c*); void objWindHitCheck(dCcD_Cyl*); void setDoButtonQuake(); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index fd9d354b1..a161f2190 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -366,10 +366,22 @@ inline void dComIfGs_init() { g_dComIfG_gameInfo.save.init(); } +inline dSv_player_bag_item_c* dComIfGs_getpBagItem() { + return g_dComIfG_gameInfo.save.getPlayer().getpBagItem(); +} + +inline BOOL dComIfGs_checkReserveItem(u8 i_itemNo) { + return dComIfGs_getpBagItem()->checkReserveItem(i_itemNo); +} + inline u8 dComIfGs_getSelectEquip(int param_0) { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getSelectEquip(param_0); } +inline u8 dComIfGs_getWalletSize() { + return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getWalletSize(); +} + inline u8 dComIfGs_getItem(int param_0) { return g_dComIfG_gameInfo.save.getPlayer().getItem().getItem(param_0); } @@ -386,6 +398,10 @@ inline u8 dComIfGs_getReserve(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItem().getReserve(i_idx); } +inline BOOL dComIfGs_isGetItemReserve(int i_No) { + return g_dComIfG_gameInfo.save.getPlayer().getGetBagItem().isReserve(i_No); +} + inline BOOL dComIfGs_isGetCollectMap(int i_itemNo) { return g_dComIfG_gameInfo.save.getPlayer().getMap().isGetMap(i_itemNo - 1); } @@ -422,6 +438,10 @@ inline BOOL dComIfGs_isEventBit(u16 id) { return g_dComIfG_gameInfo.save.getEvent().isEventBit(id); } +inline void dComIfGs_onEventBit(u16 id) { + g_dComIfG_gameInfo.save.getEvent().onEventBit(id); +} + inline void dComIfGs_setRestartRoomParam(u32 i_param) { g_dComIfG_gameInfo.save.getRestart().setRoomParam(i_param); } @@ -454,6 +474,8 @@ inline void dComIfGs_onSaveTbox(int i_stageNo, int i_no) { g_dComIfG_gameInfo.save.getSavedata().getSave(i_stageNo).getBit().onTbox(i_no); } +BOOL dComIfGs_isStageBossEnemy(int i_stageNo); + inline BOOL dComIfGs_isStageBossEnemy() { return g_dComIfG_gameInfo.save.getMemory().getBit().isStageBossEnemy(); } @@ -716,6 +738,14 @@ inline BOOL dComIfGp_checkCameraAttentionStatus(int idx, u32 flag) { /** * === EVENT ===*/ +inline u8 dComIfGp_event_getTalkXYBtn(void) { + return g_dComIfG_gameInfo.play.getEvent().getTalkXYBtn(); +} + +inline bool dComIfGp_event_chkTalkXY(void) { + return g_dComIfG_gameInfo.play.getEvent().chkTalkXY(); +} + inline void dComIfGp_event_onEventFlag(s16 flag) { return g_dComIfG_gameInfo.play.getEvent().onEventFlag(flag); } @@ -724,6 +754,10 @@ inline void dComIfGp_event_offEventFlag(s16 flag) { return g_dComIfG_gameInfo.play.getEvent().offEventFlag(flag); } +inline void dComIfGp_event_setItemPartnerId(u32 id) { + return g_dComIfG_gameInfo.play.getEvent().setPtI_Id(id); +} + inline dEvent_manager_c& dComIfGp_getEventManager() { return g_dComIfG_gameInfo.play.getEvtManager(); } @@ -732,8 +766,48 @@ inline u32 dComIfGp_evmng_getEventIdx(char* pName, u8 evNo) { return dComIfGp_getEventManager().getEventIdx(pName, evNo); } +inline u32 dComIfGp_evmng_getMyStaffId(char* pName, fopAc_ac_c* pActor, s32 param_3) { + return dComIfGp_getEventManager().getMyStaffId(pName, pActor, param_3); +} + +inline u32 dComIfGp_evmng_getMyActIdx(int staffIdx, const char* const* pActions, int actionCount, int force, int param_5) { + return dComIfGp_getEventManager().getMyActIdx(staffIdx, pActions, actionCount, force, param_5); +} + +inline f32* dComIfGp_evmng_getMyFloatP(int staffIdx, const char* name) { + return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 0)); //type 0 is float +} + +inline Vec* dComIfGp_evmng_getMyVec3dP(int staffIdx, const char* name) { + return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 1)); //type 1 is vec3f +} + +inline u32* dComIfGp_evmng_getMyIntegerP(int staffIdx, const char* name) { + return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 3)); //type 3 is int +} + +inline char* dComIfGp_evmng_getMyStringP(int staffIdx, const char* name) { + return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 4)); //type 4 is string +} + inline BOOL dComIfGp_evmng_endCheck(s16 eventID) { - return g_dComIfG_gameInfo.play.getEvtManager().endCheck(eventID); + return dComIfGp_getEventManager().endCheck(eventID); +} + +inline BOOL dComIfGp_evmng_ChkPresentEnd() { + return dComIfGp_getEventManager().ChkPresentEnd(); +} + +inline void dComIfGp_evmng_CancelPresent() { + return dComIfGp_getEventManager().CancelPresent(); +} + +inline BOOL dComIfGp_evmng_getIsAddvance(s32 staffIdx) { + return dComIfGp_getEventManager().getIsAddvance(staffIdx); +} + +inline void dComIfGp_evmng_cutEnd(s32 staffIdx) { + return dComIfGp_getEventManager().cutEnd(staffIdx); } inline void dComIfGp_evmng_execute() { @@ -759,6 +833,8 @@ inline int dComIfGd_setRealShadow2(u32 id, s8 param_2, J3DModel* pModel, cXyz* p pTevStr); } +int dComIfGd_setSimpleShadow2(cXyz* i_pos, f32 param_1, f32 param_2, cBgS_PolyInfo& i_floorPoly, s16 i_angle, f32 param_5, GXTexObj* i_tex); + /** * === RESOURCE === */ diff --git a/include/d/d_event.h b/include/d/d_event.h index 2aa81d18d..457610ad9 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -58,6 +58,9 @@ public: void getTactFreeMStick(int); void getTactFreeCStick(int); void giveItemCut(u8); + u8 getTalkXYBtn() { return mTalkButton; } + bool chkTalkXY() { return mTalkButton == 1 || mTalkButton == 2 || mTalkButton == 3; } + void setPtI_Id(u32 id) { mPtItem = id; } inline u16 chkEventFlag(u16 flag) { return flag & mEventFlag; } inline void onEventFlag(u16 flag) { mEventFlag |= flag; } @@ -71,7 +74,7 @@ public: /* 0xC4 */ u32 mPt1; /* 0xC8 */ u32 mPt2; /* 0xCC */ int mPtTalk; - /* 0xD0 */ int mPtItem; + /* 0xD0 */ u32 mPtItem; /* 0xD4 */ u8 mCurStaffId; /* 0xD5 */ u8 field_0xD5[0xD6 - 0xD5]; /* 0xD6 */ s16 field_0xd6; diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index c1c2df190..e58ebc6a2 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -3,6 +3,7 @@ #include "SSystem/SComponent/c_xyz.h" #include "d/d_event_data.h" +#include "MSL_C/string.h" class fopAc_ac_c; @@ -39,14 +40,14 @@ public: void startCheck(s16); void startCheckOld(const char*); BOOL endCheck(s16); - void endCheckOld(const char*); - void getMyStaffId(const char*, fopAc_ac_c*, int); - void getIsAddvance(int); - void getMyActIdx(int, const char* const*, int, int, int); + BOOL endCheckOld(const char*); + int getMyStaffId(const char*, fopAc_ac_c*, int); + BOOL getIsAddvance(int); + int getMyActIdx(int, const char* const*, int, int, int); void getMyActName(int); void getMyNowCutName(int); void getMyDataP(int, const char*, int); - void getMySubstanceP(int, const char*, int); + void* getMySubstanceP(int, const char*, int); void getMySubstanceNum(int, const char*); void cutEnd(int); void getEventPrio(s16); @@ -60,7 +61,7 @@ public: void specialCast(const char*, int); void setPrmStaff(void*, int); void getToolId(u8, int); - void ChkPresentEnd(); + BOOL ChkPresentEnd(); void CancelPresent(); void checkStartDemo(); @@ -71,4 +72,8 @@ public: /* 0x03C */ dEvDtFlag_c mFlag; }; +inline int dEvmng_strcmp(const char* s1, const char* s2) { + return strcmp(s1, s2); +} + #endif /* D_EVENT_D_EVENT_MANAGER_H */ \ No newline at end of file diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 80a876d4b..9bc4f684a 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -1,6 +1,155 @@ #ifndef D_NPC_H #define D_NPC_H +#include "f_op/f_op_actor.h" +#include "f_op/f_op_msg.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_path.h" +#include "m_Do/m_Do_ext.h" + +class fopNpc_npc_c; + +class dNpc_JntCtrl_c { + /* 0x00 */ s16 mHeadUpDownRot; + /* 0x02 */ s16 mHeadLeftRightRot; + /* 0x04 */ s16 mBackboneUpDownRot; + /* 0x06 */ s16 mBackboneLeftRightRot; + /* 0x08 */ u8 mHeadJntNum; + /* 0x09 */ u8 mBackboneJntNum; + /* 0x0A */ bool field_0x0A; + /* 0x0B */ u8 field_0x0B; + /* 0x0C */ u8 field_0x0C; + /* 0x0D */ u8 field_0x0D; + /* 0x0E */ s16 field_0x0E; + /* 0x10 */ s16 mMinHeadRot; + /* 0x12 */ s16 field_0x12; + /* 0x14 */ s16 mMinSpineRot; + /* 0x16 */ s16 field_0x16; + /* 0x18 */ s16 mMaxHeadRot; + /* 0x1A */ s16 field_0x1A; + /* 0x1C */ s16 mMaxSpineRot; + /* 0x1E */ s16 field_0x1E; + /* 0x20 */ s16 field_0x20; + /* 0x22 */ s16 field_0x22; + /* 0x24 */ s16 field_0x24; + /* 0x26 */ u8 pad_0x26[0x32 - 0x26]; + /* 0x32 */ s16 field_0x32; + +public: + bool angCalcS(s16*, s16, s16, s16); + void limitter(s16*, s16, s16); + void follow(s16*, s16, s16, int); + void move(s16, int); + void lookAtTarget(s16*, cXyz*, cXyz, s16, s16, bool); + void setParam(s16, s16, s16, s16, s16, s16, s16, s16, s16); + + s16 chkLim(s16, int, int); + void turn_fromBackbone2Head(s16, s16*, s16*, bool); + void turn_fromHead2Backbone(s16, s16*, s16*); + s16 follow_current(s16*, s16); + void lookAtTarget_2(s16*, cXyz*, cXyz, s16, s16, bool); +}; + +class dNpc_EventCut_c { + /* 0x00 */ char* mpEvtStaffName; + /* 0x04 */ s32 mEvtStaffId; + /* 0x08 */ fopAc_ac_c* mpActor; + /* 0x0C */ fopNpc_npc_c* mpTalkActor; + /* 0x10 */ s32 mCurActIdx; + /* 0x14 */ u32 field_0x14; + /* 0x18 */ int mTimer; + /* 0x1C */ char* mpActorName; + /* 0x20 */ u32 field_0x20; + /* 0x24 */ s32 mSetID; + /* 0x28 */ cXyz mOffsetPos; + /* 0x34 */ cXyz mTargetActorPos; + /* 0x40 */ fopAc_ac_c* mpTargetActor; + /* 0x44 */ s16 field_0x44; + /* 0x48 */ f32 mSpeed; + /* 0x4C */ f32 pDelDistance; + /* 0x50 */ s16 mAddAngle; + /* 0x52 */ u8 field_0x52; + /* 0x54 */ cXyz mPos; + /* 0x60 */ u8 mbAttention; + /* 0x61 */ u8 mbNoTurn; + /* 0x62 */ s16 mTurnSpeed; + /* 0x64 */ u32 mTurnType; + /* 0x68 */ u8* field_0x68; + +public: + void setActorInfo(char*, fopAc_ac_c*); + void setActorInfo2(char*, fopNpc_npc_c*); + + bool cutProc(); + void cutWaitStart(); + void cutWaitProc(); + void cutTurnToActorStart(); + void cutTurnToActorProc(); + void cutMoveToActorStart(); + void cutMoveToActorProc(); + void cutTurnToPosStart(); + void cutTurnToPosProc(); + void cutMoveToPosStart(); + void cutMoveToPosProc(); + void cutTalkMsgStart(); + void cutContinueTalkStart(); + void cutTalkMsgProc(); + + static fopAc_ac_c* findActorCallBack(fopAc_ac_c*, void*); +}; + +class dNpc_PathRun_c { +public: + bool setInfDrct(dPath* pPath); + bool setInf(u8 pathIdx, s8 roomNo, u8 forwards); + dPath* nextPath(s8 roomNo); + cXyz getPoint(u8 pointIdx); + void chkPointPass(cXyz, bool); + bool incIdx(); + bool incIdxLoop(); + bool incIdxAuto(); + bool decIdx(); + bool decIdxLoop(); + bool decIdxAuto(); + bool nextIdx(); + bool nextIdxAuto(); + s32 absIdx(u8, u8); + u8 maxPoint(); + u8 pointArg(u8 idx); + bool setNearPathIndx(cXyz*, f32); + f32 setNearPathIndxMk(cXyz*); + bool setNearPathIndxMk2(cXyz*, u8, u8); + bool chkInside(cXyz*); + + /* 0x00 */ dPath* mPath; + /* 0x04 */ u8 field_0x04; + /* 0x05 */ u8 mCurrPointIndex; + /* 0x06 */ u8 mbGoingForwards; + /* 0x07 */ u8 field_0x07; +}; + +class dNpc_HeadAnm_c { +public: + void swing_vertical_init(s16 param_1, s16 param_2, s16 param_3, int param_4); + void swing_vertical(); + void swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, int param_4); + void swing_horizone(); + void move(); + + typedef void (dNpc_HeadAnm_c::*swing_func)(void); + + /* 0x00 */ s16 field_0x00; + /* 0x02 */ s16 field_0x02; + /* 0x04 */ u32 field_0x04; + /* 0x08 */ swing_func mFunc; + /* 0x14 */ f32 field_0x14; + /* 0x18 */ f32 field_0x18; + /* 0x1C */ s16 field_0x1C; + /* 0x1E */ s16 field_0x1E; + /* 0x20 */ s16 field_0x20; +}; + enum dNpc_MessageStatus_e { dNpcMsgStts_MSG_PREPARING_e = 0x01, dNpcMsgStts_BOX_OPENING_e = 0x02, @@ -9,10 +158,43 @@ enum dNpc_MessageStatus_e { dNpcMsgStts_MSG_CONTINUES_e = 0x0F, dNpcMsgStts_MSG_ENDS_e = 0x10, - + dNpcMsgStts_BOX_CLOSING_e = 0x11, dNpcMsgStts_BOX_CLOSED_e = 0x12, dNpcMsgStts_MSG_DESTROYED_e = 0x13, }; -#endif // D_NPC_H +class fopNpc_npc_c : public fopAc_ac_c { +public: + /* 0x290 */ dNpc_JntCtrl_c mJntCtrl; + /* 0x2C4 */ dNpc_EventCut_c mEventCtrl; + /* 0x330 */ mDoExt_McaMorf* mpMcaMorf; + /* 0x334 */ dBgS_ObjAcch mObjAcch; + /* 0x4F8 */ dBgS_AcchCir mAcchCir; + /* 0x538 */ dCcD_Stts mStts; + /* 0x574 */ dCcD_Cyl mCyl; + /* 0x6A4 */ u32 mCurrMsgID; + /* 0x6A8 */ u32 mEndMsgID; + /* 0x6AC */ s32 mCurrMsgBsPcId; + /* 0x6B0 */ msg_class* mpCurrMsg; + /* 0x6B4 */ u8 pad_0x6B4[0x6C0 - 0x6B4]; + + virtual u32 next_msgStatus(u32*) { return 0x10; } + virtual u32 getMsg() { return 1; } + virtual void anmAtr(u16) {} + + void setCollision(float radius, float height); + u16 talk(int); +}; + +bool dNpc_setAnmIDRes(mDoExt_McaMorf* pMorf, int loopMode, float morf, float speed, int animResId, int soundResId, const char* arcName); +bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, char* soundFilename, const char* arcName); +bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName); +void dNpc_setShadowModel(J3DModel*, J3DModelData*, J3DModel*); +cXyz dNpc_playerEyePos(f32); +void dNpc_calc_DisXZ_AngY(cXyz, cXyz, float*, short*); +bool dNpc_chkArasoi(); +BOOL dNpc_chkLetterPassed(); +bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName); + +#endif /* D_NPC_H */ diff --git a/include/d/d_path.h b/include/d/d_path.h index 7e8632f75..459609fd6 100644 --- a/include/d/d_path.h +++ b/include/d/d_path.h @@ -24,7 +24,7 @@ struct dPath { dPath__Point* dPath_GetPnt(dPath*, int); dPath* dPath_GetRoomPath(int, int); -void dPath_GetNextRoomPath(dPath*, int); +dPath* dPath_GetNextRoomPath(dPath*, int); void dPath_GetPolyRoomPathVec(cBgS_PolyInfo&, cXyz*, int*); #endif /* D_PATH_H */ diff --git a/include/d/d_save.h b/include/d/d_save.h index 8d4382f75..274b3be96 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -10,6 +10,7 @@ public: u8 getSelectItemIndex(int i_no) const { return mSelectItem[i_no]; } u8 getSelectEquip(int i_no) const { return mSelectEquip[i_no]; } + u8 getWalletSize() const { return mWalletSize; } /* 0x00 */ u16 mMaxLife; /* 0x02 */ u16 mLife; @@ -141,8 +142,8 @@ public: /* 8005A7C0 */ void setReserveItemEmpty(u8); /* 8005A79C */ void setReserveItemEmpty(); /* 8005A7E4 */ void setReserveItem(u8); - /* 8005A854 */ u8 checkReserveItemEmpty(); - /* 8005A878 */ u8 checkReserveItem(u8); + /* 8005A854 */ bool checkReserveItemEmpty(); + /* 8005A878 */ bool checkReserveItem(u8); u8 getBeast(int i_idx) const { return mBeast[i_idx]; } u8 getBait(int i_idx) const { return mBait[i_idx]; } @@ -159,11 +160,11 @@ class dSv_player_get_bag_item_c { public: /* 8005A8B8 */ void init(); /* 8005A8CC */ void onBeast(u8); - /* 8005A960 */ bool isBeast(u8); + /* 8005A960 */ BOOL isBeast(u8); /* 8005A9F8 */ void onBait(u8); - /* 8005AA8C */ bool isBait(u8); + /* 8005AA8C */ BOOL isBait(u8); /* 8005AB24 */ void onReserve(u8); - /* 8005ABB4 */ bool isReserve(u8); + /* 8005ABB4 */ BOOL isReserve(u8); /* 0x0 */ u32 mReserveFlags; /* 0x4 */ u8 mBeastFlags; diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index d45434424..2325626a1 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -113,11 +113,6 @@ public: void setEventName(char*); char* getEventName(); void beforeProc(); - void onCondition(u16); - void offCondition(u16); - bool checkCommandCatch(); - BOOL checkCommandDoor(); - BOOL checkCommandDemoAccrpt() { return mCommand == 2; } void setCommand(u16 command) { mCommand = command; } void setMapToolId(u8 id) { mMapToolId = id; } @@ -131,14 +126,14 @@ public: void setIdx(u8 i_idx) { mIndex = i_idx; } char* getArchiveName() { return mArchiveName; } BOOL chkCondition(u16 condition) { return (mCondition & condition) == condition; } - void i_onCondition(u16 cond) { mCondition |= cond; } - void i_offCondition(u16 cond) { mCondition &= ~cond; } + void onCondition(u16 cond) { mCondition |= cond; } + void offCondition(u16 cond) { mCondition &= ~cond; } bool checkCommandTalk() { return mCommand == 1; } bool checkCommandItem() { return mCommand == 4; } - BOOL i_checkCommandDoor() { return mCommand == 3; } - bool i_checkCommandDemoAccrpt() { return mCommand == 2; } - bool i_checkCommandCatch() { return mCommand == 6; } + BOOL checkCommandDoor() { return mCommand == 3; } + bool checkCommandDemoAccrpt() { return mCommand == 2; } + bool checkCommandCatch() { return mCommand == 6; } void suspendProc(void* actor) { if (field_0x10 != NULL) { diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index afe880c70..f0905f4e7 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -416,11 +416,12 @@ s32 fopAcM_cullingCheck(fopAc_ac_c*); void* event_second_actor(u16); s32 fopAcM_orderTalkEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); s32 fopAcM_orderTalkItemBtnEvent(u16, fopAc_ac_c*, fopAc_ac_c*, u16, u16); -s32 fopAcM_orderSpeakEvent(fopAc_ac_c* i_actor, u16 i_priority, u16 i_flag); +s32 fopAcM_orderSpeakEvent(fopAc_ac_c* i_actor); s32 fopAcM_orderDoorEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); s32 fopAcM_orderCatchEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); s32 fopAcM_orderOtherEvent(fopAc_ac_c*, char*, u16, u16, u16); s32 fopAcM_orderOtherEvent(fopAc_ac_c*, fopAc_ac_c*, char*, u16, u16, u16); +s32 fopAcM_orderOtherEvent2(fopAc_ac_c*, char*, u16, u16); s32 fopAcM_orderChangeEventId(fopAc_ac_c*, s16, u16, u16); s32 fopAcM_orderOtherEventId(fopAc_ac_c* actor, s16 eventID, u8 mapToolID, u16 param_3, u16 priority, u16 flag); diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index 01be52a79..9883608d9 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -3,17 +3,36 @@ // Translation Unit: d_npc.cpp // -#include "d_npc.h" -#include "dolphin/types.h" +#include "d/d_npc.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_player.h" +#include "f_op/f_op_actor_mng.h" +#include "f_op/f_op_msg_mng.h" +#include "SSystem/SComponent/c_math.h" +#include "JSystem/JGeometry.h" +#include "m_Do/m_Do_mtx.h" -/* 8021A7B4-8021A858 .text angCalcS__14dNpc_JntCtrl_cFPssss */ -void dNpc_JntCtrl_c::angCalcS(short*, short, short, short) { - /* Nonmatching */ +bool dNpc_JntCtrl_c::angCalcS(s16* out, s16 targetY, s16 speed, s16 maxVel) { + s16 origY = *out; + s16 diff = origY - targetY; + cLib_addCalcAngleS(&diff, 0, speed, maxVel, 0x60); + if(abs(diff) > speed) { + *out += (diff - (origY - targetY)); + } + else { + *out = targetY; + } + + return (s16)targetY - *out == 0; } -/* 8021A858-8021A884 .text limitter__14dNpc_JntCtrl_cFPsss */ -void dNpc_JntCtrl_c::limitter(short*, short, short) { - /* Nonmatching */ +void dNpc_JntCtrl_c::limitter(s16* targetDiff, s16 maxDiff, s16 minDiff) { + if(*targetDiff > maxDiff) { + *targetDiff = maxDiff; + } + if(*targetDiff < minDiff) { + *targetDiff = minDiff; + } } /* 8021A884-8021A97C .text follow__14dNpc_JntCtrl_cFPsssi */ @@ -31,29 +50,61 @@ void dNpc_JntCtrl_c::lookAtTarget(short*, cXyz*, cXyz, short, short, bool) { /* Nonmatching */ } -/* 8021AC6C-8021ACA8 .text setParam__14dNpc_JntCtrl_cFsssssssss */ -void dNpc_JntCtrl_c::setParam(short, short, short, short, short, short, short, short, short) { - /* Nonmatching */ +void dNpc_JntCtrl_c::setParam(s16 param_1, s16 maxSpineRot, s16 param_3, s16 minSpineRot, s16 param_5, s16 maxHeadRot, s16 param_7, s16 minHeadRot, s16 param_9) { + field_0x1A = param_1; + mMaxSpineRot = maxSpineRot; + field_0x12 = param_3; + mMinSpineRot = minSpineRot; + field_0x16 = param_5; + mMaxHeadRot = maxHeadRot; + field_0x0E = param_7; + mMinHeadRot = minHeadRot; + field_0x22 = param_9; + field_0x24 = param_9; + field_0x1E = param_9; + field_0x20 = param_9; } -/* 8021ACA8-8021ACBC .text setInfDrct__14dNpc_PathRun_cFP5dPath */ -void dNpc_PathRun_c::setInfDrct(dPath*) { - /* Nonmatching */ +bool dNpc_PathRun_c::setInfDrct(dPath* pPath) { + mPath = pPath; + mCurrPointIndex = 0; + + return true; } -/* 8021ACBC-8021AD1C .text setInf__14dNpc_PathRun_cFUcScUc */ -void dNpc_PathRun_c::setInf(unsigned char, signed char, unsigned char) { - /* Nonmatching */ +bool dNpc_PathRun_c::setInf(u8 pathIdx, s8 roomNo, u8 forwards) { + bool setPath = false; + + mPath = 0; + mbGoingForwards = forwards; + if(pathIdx != 0xFF) { + mPath = dPath_GetRoomPath(pathIdx, roomNo); + mCurrPointIndex = 0; + + setPath = true; + } + + return setPath; } -/* 8021AD1C-8021AD58 .text nextPath__14dNpc_PathRun_cFSc */ -void dNpc_PathRun_c::nextPath(signed char) { - /* Nonmatching */ +dPath* dNpc_PathRun_c::nextPath(s8 roomNo) { + dPath* pPath = 0; + + if(mPath != 0) { + pPath = dPath_GetNextRoomPath(mPath, roomNo); + } + + return pPath; } -/* 8021AD58-8021ADD0 .text getPoint__14dNpc_PathRun_cFUc */ -void dNpc_PathRun_c::getPoint(unsigned char) { - /* Nonmatching */ +cXyz dNpc_PathRun_c::getPoint(u8 pointIdx) { + cXyz point(0.0f, 0.0f, 0.0f); + + if(mPath != 0 && pointIdx < mPath->mNum) { + point = mPath->mpPnt[pointIdx].mPos; + } + + return point; } /* 8021ADD0-8021AFA8 .text chkPointPass__14dNpc_PathRun_cF4cXyzb */ @@ -61,149 +112,476 @@ void dNpc_PathRun_c::chkPointPass(cXyz, bool) { /* Nonmatching */ } -/* 8021AFA8-8021AFEC .text incIdx__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::incIdx() { - /* Nonmatching */ +bool dNpc_PathRun_c::incIdx() { + bool ret = true; + + if(mPath != 0) { + mCurrPointIndex += 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = mPath->mNum - 1; + ret = false; + } + } + + return ret; } -/* 8021AFEC-8021B030 .text incIdxLoop__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::incIdxLoop() { - /* Nonmatching */ +bool dNpc_PathRun_c::incIdxLoop() { + bool ret = true; + + if(mPath != 0) { + mCurrPointIndex += 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = 0; + ret = false; + } + } + + return ret; } -/* 8021B030-8021B0AC .text incIdxAuto__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::incIdxAuto() { - /* Nonmatching */ +bool dNpc_PathRun_c::incIdxAuto() { + bool hitEnd = true; + + if(mPath != 0) { + if(mPath->mLoops & 1) { + mCurrPointIndex += 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = 0; + } + } + else { + mCurrPointIndex += 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = mPath->mNum - 1; + hitEnd = false; + } + } + } + + return hitEnd; } -/* 8021B0AC-8021B0F0 .text decIdx__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::decIdx() { - /* Nonmatching */ +bool dNpc_PathRun_c::decIdx() { + bool ret = true; + + if(mPath != 0) { + mCurrPointIndex -= 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = 0; + ret = false; + } + } + + return ret; } -/* 8021B0F0-8021B134 .text decIdxLoop__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::decIdxLoop() { - /* Nonmatching */ +bool dNpc_PathRun_c::decIdxLoop() { + bool ret = true; + + if(mPath != 0) { + mCurrPointIndex -= 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = mPath->mNum - 1; + ret = false; + } + } + + return ret; } -/* 8021B134-8021B1B0 .text decIdxAuto__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::decIdxAuto() { - /* Nonmatching */ +bool dNpc_PathRun_c::decIdxAuto() { + bool hitEnd = true; + + if(mPath != 0) { + if(mPath->mLoops & 1) { + mCurrPointIndex -= 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = mPath->mNum - 1; + } + } + else { + mCurrPointIndex -= 1; + if(mCurrPointIndex >= mPath->mNum) { + mCurrPointIndex = 0; + hitEnd = false; + } + } + } + + return hitEnd; } -/* 8021B1B0-8021B224 .text nextIdx__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::nextIdx() { - /* Nonmatching */ +bool dNpc_PathRun_c::nextIdx() { + bool hitEnd; + + if(mbGoingForwards) { + hitEnd = incIdx(); + if(hitEnd == false) { + decIdx(); + } + } + else { + hitEnd = decIdx(); + if(hitEnd == false) { + incIdx(); + } + } + + return hitEnd; } -/* 8021B224-8021B298 .text nextIdxAuto__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::nextIdxAuto() { - /* Nonmatching */ +bool dNpc_PathRun_c::nextIdxAuto() { + bool hitEnd; + + if(mbGoingForwards) { + hitEnd = incIdxAuto(); + if(hitEnd == 0) { + decIdx(); + } + } + else { + hitEnd = decIdxAuto(); + if(hitEnd == 0) { + incIdx(); + } + } + + return hitEnd; } -/* 8021B298-8021B328 .text absIdx__14dNpc_PathRun_cFUcUc */ -void dNpc_PathRun_c::absIdx(unsigned char, unsigned char) { - /* Nonmatching */ +s32 dNpc_PathRun_c::absIdx(u8 startIdx, u8 lastIdx) { + if(mPath == 0) { + return 0; + } + + s32 diff_1 = startIdx - lastIdx; + s32 diff_2 = lastIdx - startIdx; + + if(diff_1 < 0) { + diff_1 += maxPoint(); + } + if(diff_2 < 0) { + diff_2 += maxPoint(); + } + if(diff_1 > diff_2) { + return diff_2; + } + + return diff_1; } -/* 8021B328-8021B348 .text maxPoint__14dNpc_PathRun_cFv */ -void dNpc_PathRun_c::maxPoint() { - /* Nonmatching */ +u8 dNpc_PathRun_c::maxPoint() { + u8 max = 0xFF; + if(mPath != 0) { + max = mPath->mNum; + } + + return max; } -/* 8021B348-8021B384 .text pointArg__14dNpc_PathRun_cFUc */ -void dNpc_PathRun_c::pointArg(unsigned char) { - /* Nonmatching */ +u8 dNpc_PathRun_c::pointArg(u8 idx) { + u8 arg = 0; + if(mPath != 0 && idx < (u8)mPath->mNum) { + arg = mPath->mpPnt[idx].mArg3; + } + + return arg; } -/* 8021B384-8021B514 .text setNearPathIndx__14dNpc_PathRun_cFP4cXyzf */ -void dNpc_PathRun_c::setNearPathIndx(cXyz*, float) { - /* Nonmatching */ +bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, float param_2) { + bool set = false; + if(mPath != 0) { + f32 max_dist = 1000000000.0f; + u8 pointIdx = 0; + for(int i = 0; i < maxPoint(); i++) { + cXyz point = getPoint(i); + cXyz diff = (*param_1 - point); + f32 temp = diff.getMagXZ(); + f32 dist = sqrtf(param_2 * (diff.y * diff.y) + temp); + + if(max_dist > dist) { + max_dist = dist; + pointIdx = i; + } + } + + mCurrPointIndex = pointIdx; + set = true; + } + + return set; } -/* 8021B514-8021B670 .text setNearPathIndxMk__14dNpc_PathRun_cFP4cXyz */ -void dNpc_PathRun_c::setNearPathIndxMk(cXyz*) { - /* Nonmatching */ +f32 dNpc_PathRun_c::setNearPathIndxMk(cXyz* param_1) { + f32 max_dist; + if(mPath != 0) { + max_dist = 1000000000.0f; + u8 pointIdx = 0; + for(int i = 0; i < maxPoint(); i++) { + cXyz point = getPoint(i); + cXyz diff = (*param_1 - point); + f32 temp = diff.getSquareMag(); + f32 dist = sqrtf(temp); + if(max_dist > dist) { + max_dist = dist; + pointIdx = i; + } + } + + mCurrPointIndex = pointIdx; + } + + return max_dist; } -/* 8021B670-8021B818 .text setNearPathIndxMk2__14dNpc_PathRun_cFP4cXyzUcUc */ -void dNpc_PathRun_c::setNearPathIndxMk2(cXyz*, unsigned char, unsigned char) { - /* Nonmatching */ +bool dNpc_PathRun_c::setNearPathIndxMk2(cXyz* param_1, u8 param_2, u8 param_3) { + u8 pointIdx; + bool set = false; + if(mPath != 0) { + f32 max_dist = 1000000000.0f; + pointIdx = param_2; + for(int i = 0; i < maxPoint(); i++) { + cXyz point = getPoint(i); + cXyz diff = (*param_1 - point); + f32 temp = diff.getSquareMag(); + f32 dist = sqrtf(temp); + s32 idx = absIdx(param_2, i); + if(idx <= param_3 && param_2 != i && max_dist > dist) { + max_dist = dist; + pointIdx = i; + set = true; + } + } + + mCurrPointIndex = pointIdx; + } + + return set; } -/* 8021B818-8021B95C .text chkInside__14dNpc_PathRun_cFP4cXyz */ -void dNpc_PathRun_c::chkInside(cXyz*) { - /* Nonmatching */ +bool dNpc_PathRun_c::chkInside(cXyz* param_1) { + cXyz point, point2, point3; + + setNearPathIndx(param_1, 0.0f); + point2 = getPoint(mCurrPointIndex); + decIdxLoop(); + point = getPoint(mCurrPointIndex); + incIdxLoop(); + incIdxLoop(); + point3 = getPoint(mCurrPointIndex); + + s16 angle1 = cLib_targetAngleY(&point2, &point); + s16 angle2 = cLib_targetAngleY(&point2, param_1); + s16 angle3 = cLib_targetAngleY(&point2, &point3); + + s16 diff1 = angle2 - angle3; + s16 diff2 = angle1 - angle3; + if(diff1 > 0) { + if(diff2 < 0 || diff1 < diff2) { + return true; + } + } + else if(diff2 < 0 && diff1 < diff2) { + return true; + } + + return false; } -/* 8021B95C-8021B998 .text setActorInfo__15dNpc_EventCut_cFPcP10fopAc_ac_c */ -void dNpc_EventCut_c::setActorInfo(char*, fopAc_ac_c*) { - /* Nonmatching */ +void dNpc_EventCut_c::setActorInfo(char* staffName, fopAc_ac_c* pActor) { + mpEvtStaffName = staffName; + mpActor = pActor; + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + mOffsetPos.set(0.0f, 0.0f, 0.0f); + mPos.set(0.0f, 0.0f, 0.0f); + mCurActIdx = -1; } -/* 8021B998-8021B9D8 .text setActorInfo2__15dNpc_EventCut_cFPcP12fopNpc_npc_c */ -void dNpc_EventCut_c::setActorInfo2(char*, fopNpc_npc_c*) { - /* Nonmatching */ +void dNpc_EventCut_c::setActorInfo2(char* staffName, fopNpc_npc_c* pActor) { + mpEvtStaffName = staffName; + mpActor = pActor; + mpTalkActor = pActor; + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + mOffsetPos.set(0.0f, 0.0f, 0.0f); + mPos.set(0.0f, 0.0f, 0.0f); + mCurActIdx = -1; } -/* 8021B9D8-8021BABC .text dNpc_setAnmIDRes__FP14mDoExt_McaMorfiffiiPCc */ -void dNpc_setAnmIDRes(mDoExt_McaMorf*, int, float, float, int, int, const char*) { - /* Nonmatching */ +bool dNpc_setAnmIDRes(mDoExt_McaMorf* pMorf, int loopMode, float morf, float speed, int animResId, int soundResId, const char* arcName) { + void* pSoundAnimRes = 0; + bool ret = false; + + if(pMorf != 0) { + if(0 <= soundResId) { + pSoundAnimRes = dComIfG_getObjectIDRes(arcName, soundResId); + } + + void* pAnimRes = dComIfG_getObjectIDRes(arcName, animResId); + pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); + + ret = true; + } + + return ret; } -/* 8021BABC-8021BBA8 .text dNpc_setAnmFNDirect__FP14mDoExt_McaMorfiffPcPcPCc */ -void dNpc_setAnmFNDirect(mDoExt_McaMorf*, int, float, float, char*, char*, const char*) { - /* Nonmatching */ +bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, char* soundFilename, const char* arcName) { + bool ret = false; + + if(pMorf != 0 && animFilename != 0 && arcName != 0) { + void* pAnimRes = dComIfG_getObjectRes(arcName, animFilename); + + void* pSoundAnimRes = 0; + if(soundFilename != 0) { + pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFilename); + } + + pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); + + ret = true; + } + + return ret; } -/* 8021BBA8-8021BC8C .text dNpc_setAnm__FP14mDoExt_McaMorfiffiiPCc */ -void dNpc_setAnm(mDoExt_McaMorf*, int, float, float, int, int, const char*) { - /* Nonmatching */ +bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName) { + void* pSoundAnimRes = 0; + bool ret = false; + + if(pMorf != 0) { + if(0 <= soundFileIdx) { + pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFileIdx); + } + + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); + + ret = true; + } + + return ret; } -/* 8021BC8C-8021BD2C .text dNpc_setShadowModel__FP8J3DModelP12J3DModelDataP8J3DModel */ -void dNpc_setShadowModel(J3DModel*, J3DModelData*, J3DModel*) { - /* Nonmatching */ +void dNpc_setShadowModel(J3DModel* param_1, J3DModelData* param_2, J3DModel* param_3) { + for(int i = 0; i < param_2->getWEvlpMtxNum(); i++) { + mDoMtx_copy(param_3->mpWeightEnvMtx[i], param_1->mpWeightEnvMtx[i]); + } + for(int i = 0; i < param_2->getJointNum(); i++) { + mDoMtx_copy(param_3->mpNodeMtx[i], param_1->mpNodeMtx[i]); + } } -/* 8021BD2C-8021BDE8 .text dNpc_playerEyePos__Ff */ -void dNpc_playerEyePos(float) { - /* Nonmatching */ +cXyz dNpc_playerEyePos(f32 param_1) { + daPy_py_c* pPlayer = daPy_getPlayerActorClass(); + cXyz pos = pPlayer->getHeadTopPos(); + cXyz out; + + MtxTrans(pos.x, pos.y, pos.z, false); + pos.set(0.0f, param_1, 0.0f); + MtxPosition(&pos, &out); + + out.x = pPlayer->current.pos.x; + out.z = pPlayer->current.pos.z; + + return out; } -/* 8021BDE8-8021BEC4 .text dNpc_calc_DisXZ_AngY__F4cXyz4cXyzPfPs */ -void dNpc_calc_DisXZ_AngY(cXyz, cXyz, float*, short*) { - /* Nonmatching */ +void dNpc_calc_DisXZ_AngY(cXyz param_1, cXyz param_2, float* param_3, short* param_4) { + cXyz diff; + diff.x = param_2.getXDiff(¶m_1); + diff.z = param_2.getZDiff(¶m_1); + + if(param_3 != 0) { + f32 dist = sqrtf(diff.x * diff.x + diff.z * diff.z); + *param_3 = dist; + } + + if(param_4 != 0) { + *param_4 = cM_atan2s(diff.x, diff.z); + } } -/* 8021BEC4-8021BF30 .text dNpc_chkArasoi__Fv */ -void dNpc_chkArasoi() { - /* Nonmatching */ +bool dNpc_chkArasoi() { + return dComIfGs_isEventBit(0x1220) && !dComIfGs_isEventBit(0x1808); } -/* 8021BF30-8021BF98 .text dNpc_chkLetterPassed__Fv */ -void dNpc_chkLetterPassed() { - /* Nonmatching */ +BOOL dNpc_chkLetterPassed() { + BOOL ret = false; + if(dComIfGs_isGetItemReserve(0xC)) { + ret = dComIfGs_checkReserveItem(0x98) ? 0 : 1; + } + + return ret; } -/* 8021BF98-8021C010 .text setCollision__12fopNpc_npc_cFff */ -void fopNpc_npc_c::setCollision(float, float) { - /* Nonmatching */ +void fopNpc_npc_c::setCollision(f32 radius, f32 height) { + mCyl.SetC(current.pos); + mCyl.SetR(radius); + mCyl.SetH(height); + dComIfG_Ccsp()->Set(&mCyl); } -/* 8021C010-8021C120 .text talk__12fopNpc_npc_cFi */ -void fopNpc_npc_c::talk(int) { - /* Nonmatching */ +u16 fopNpc_npc_c::talk(int param_1) { + u16 mode = 0xFF; + + if(mCurrMsgBsPcId == 0xFFFFFFFF) { + if(param_1 == 1) { + mCurrMsgID = getMsg(); + } + + mCurrMsgBsPcId = fopMsgM_messageSet(mCurrMsgID, this); + mpCurrMsg = 0; + } + else { + if(mpCurrMsg) { + mode = mpCurrMsg->mMode; + if(mode == dNpcMsgStts_MSG_DISPLAYED_e) { + mpCurrMsg->mMode = next_msgStatus(&mCurrMsgID); + if(mpCurrMsg->mMode == dNpcMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(mCurrMsgID); + } + } + else if (mode == dNpcMsgStts_BOX_CLOSED_e) { + mpCurrMsg->mMode = dNpcMsgStts_MSG_DESTROYED_e; + mCurrMsgBsPcId = -1; + } + + anmAtr(mode); + } + else { + mpCurrMsg = fopMsgM_SearchByID(mCurrMsgBsPcId); + } + } + + return mode; } -/* 8021C120-8021C238 .text dNpc_setAnm_2__FP14mDoExt_McaMorfiffiiPCc */ -void dNpc_setAnm_2(mDoExt_McaMorf*, int, float, float, int, int, const char*) { - /* Nonmatching */ +bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileidx, int soundFileIdx, const char* arcName) { + if(0 <= soundFileIdx) { + void* pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFileIdx); + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + + pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); + } + else { + void* pAnimRes = dComIfG_getObjectRes(arcName, animFileidx); + + pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, 0); + } + + + return true; } -/* 8021C238-8021C2E8 .text swing_vertical_init__14dNpc_HeadAnm_cFsssi */ -void dNpc_HeadAnm_c::swing_vertical_init(short, short, short, int) { - /* Nonmatching */ +void dNpc_HeadAnm_c::swing_vertical_init(s16 param_1, s16 param_2, s16 param_3, int param_4) { + if(param_4 == 0 || mFunc != &swing_vertical) { + field_0x1C = 0; + field_0x20 = param_1; + field_0x1E = param_2; + field_0x14 = param_3; + mFunc = &swing_vertical; + } } /* 8021C2E8-8021C3C8 .text swing_vertical__14dNpc_HeadAnm_cFv */ @@ -212,8 +590,14 @@ void dNpc_HeadAnm_c::swing_vertical() { } /* 8021C3C8-8021C478 .text swing_horizone_init__14dNpc_HeadAnm_cFsssi */ -void dNpc_HeadAnm_c::swing_horizone_init(short, short, short, int) { - /* Nonmatching */ +void dNpc_HeadAnm_c::swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, int param_4) { + if(param_4 == 0 || mFunc != &swing_horizone) { + field_0x1C = 0; + field_0x20 = param_1; + field_0x1E = param_2; + field_0x18 = param_3; + mFunc = &swing_horizone; + } } /* 8021C478-8021C55C .text swing_horizone__14dNpc_HeadAnm_cFv */ @@ -221,29 +605,62 @@ void dNpc_HeadAnm_c::swing_horizone() { /* Nonmatching */ } -/* 8021C55C-8021C5D8 .text move__14dNpc_HeadAnm_cFv */ void dNpc_HeadAnm_c::move() { - /* Nonmatching */ + if(mFunc) { + (this->*mFunc)(); + } + else { + cLib_addCalcAngleS(&field_0x00, 0, 4, 0x1000, 0x100); + cLib_addCalcAngleS(&field_0x02, 0, 4, 0x1000, 0x100); + } } /* 8021C5D8-8021C620 .text chkLim__14dNpc_JntCtrl_cFsii */ -void dNpc_JntCtrl_c::chkLim(short, int, int) { +s16 dNpc_JntCtrl_c::chkLim(short, int, int) { /* Nonmatching */ } -/* 8021C620-8021C6D8 .text turn_fromBackbone2Head__14dNpc_JntCtrl_cFsPsPsb */ -void dNpc_JntCtrl_c::turn_fromBackbone2Head(short, short*, short*, bool) { - /* Nonmatching */ +void dNpc_JntCtrl_c::turn_fromBackbone2Head(s16 param_1, s16* param_2, s16* param_3, bool param_4) { + *param_3 = 0; + if(field_0x0C == 0) { + *param_3 = chkLim(param_1, 1, 1); + if(field_0x32 && *param_3 < 0) { + *param_3 = 0; + } + } + + *param_2 = 0; + if(field_0x0B == 0) { + *param_2 = param_1 - *param_3; + *param_2 = chkLim(*param_2, 0, 1); + } } -/* 8021C6D8-8021C780 .text turn_fromHead2Backbone__14dNpc_JntCtrl_cFsPsPs */ -void dNpc_JntCtrl_c::turn_fromHead2Backbone(short, short*, short*) { - /* Nonmatching */ +void dNpc_JntCtrl_c::turn_fromHead2Backbone(s16 param_1, s16* param_2, s16* param_3) { + *param_2 = 0; + if(field_0x0B == 0) { + *param_2 = param_1 - field_0x32; + *param_2 = chkLim(*param_2, 0, 1); + } + + *param_3 = 0; + if(field_0x0C == 0) { + *param_3 = param_1 - *param_2; + *param_3 = chkLim(*param_3, 1, 1); + } } -/* 8021C780-8021C7D0 .text follow_current__14dNpc_JntCtrl_cFPss */ -void dNpc_JntCtrl_c::follow_current(short*, short) { - /* Nonmatching */ +s16 dNpc_JntCtrl_c::follow_current(s16* orig, s16 diff) { + s16 angle = *orig; + *orig -= diff; + + s16 ret = 0; + if((angle > 0 && *orig < 0) || (angle < 0 && *orig > 0)) { + ret = -*orig; + *orig = 0; + } + + return ret; } /* 8021C7D0-8021CAB8 .text lookAtTarget_2__14dNpc_JntCtrl_cFPsP4cXyz4cXyzssb */ @@ -251,83 +668,597 @@ void dNpc_JntCtrl_c::lookAtTarget_2(short*, cXyz*, cXyz, short, short, bool) { /* Nonmatching */ } -/* 8021CAB8-8021CC4C .text dNpc_chkAttn__FP10fopAc_ac_c4cXyzfffb */ -void dNpc_chkAttn(fopAc_ac_c*, cXyz, float, float, float, bool) { - /* Nonmatching */ +bool dNpc_chkAttn(fopAc_ac_c* i_this, cXyz destPos, float param_3, float param_4, float param_5, bool param_6) { + s16 angle = cLib_targetAngleY(&i_this->current.pos, &destPos); + f32 dist = sqrtf((i_this->current.pos - destPos).getMagXZ()); //this is gross but I haven't found a better way (temp destroys stack) + s16 angle_diff = angle - i_this->current.angle.y; + + if(param_5 > 359.0f) { + param_5 = 359.0f; + } + if (param_5 < 0.0f) { + param_5 = 0.0f; + } + if(param_6) { + param_3 += param_4; + } + + bool ret = false; + if(dist <= param_3 && abs(angle_diff) <= cM_deg2s(param_5)) { + ret = true; + } + + return ret; } -/* 8021CC4C-8021CED0 .text cutProc__15dNpc_EventCut_cFv */ -void dNpc_EventCut_c::cutProc() { - /* Nonmatching */ +bool dNpc_EventCut_c::cutProc() { + static char* action_table[] = { + "WAIT", + "TURN_TO_ACTOR", + "MOVE_TO_ACTOR", + "TURN_TO_POS", + "MOVE_TO_POS", + "TALK_MSG", + "CONTINUE_TALK" + }; + + if(mpEvtStaffName == 0 || mpActor == 0) { + return false; + } + else { + mEvtStaffId = dComIfGp_evmng_getMyStaffId(mpEvtStaffName, 0, 0); + if(mEvtStaffId == -1) { + return false; + } + else { + typedef void(dNpc_EventCut_c::*cut_func_t)(void); + struct cut_entry_t { + cut_func_t start; + cut_func_t proc; + }; + + static cut_entry_t cut_tbl[] = { + { + &dNpc_EventCut_c::cutWaitStart, + &dNpc_EventCut_c::cutWaitProc, + }, + { + &dNpc_EventCut_c::cutTurnToActorStart, + &dNpc_EventCut_c::cutTurnToActorProc, + }, + { + &dNpc_EventCut_c::cutMoveToActorStart, + &dNpc_EventCut_c::cutMoveToActorProc, + }, + { + &dNpc_EventCut_c::cutTurnToPosStart, + &dNpc_EventCut_c::cutTurnToPosProc, + }, + { + &dNpc_EventCut_c::cutMoveToPosStart, + &dNpc_EventCut_c::cutMoveToPosProc, + }, + { + &dNpc_EventCut_c::cutTalkMsgStart, + &dNpc_EventCut_c::cutTalkMsgProc, + }, + { + &dNpc_EventCut_c::cutContinueTalkStart, + &dNpc_EventCut_c::cutTalkMsgProc, + }, + }; + + mCurActIdx = dComIfGp_evmng_getMyActIdx(mEvtStaffId, action_table, 7, 1, 0); + if(mCurActIdx == -1) { + return false; + } + else { + if(dComIfGp_evmng_getIsAddvance(mEvtStaffId)) { + mbAttention = 0; + (this->*cut_tbl[mCurActIdx].start)(); + } + + (this->*cut_tbl[mCurActIdx].proc)(); + return 1; + } + } + } } -/* 8021CED0-8021CF3C .text cutWaitStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutWaitStart() { - /* Nonmatching */ + u32* timer = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Timer"); + if(timer) { + mTimer = (s16)*timer; + } + else { + mTimer = 0; + } } -/* 8021CF3C-8021CF88 .text cutWaitProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutWaitProc() { - /* Nonmatching */ + if(cLib_calcTimer(&mTimer) == 0) { + dComIfGp_evmng_cutEnd(mEvtStaffId); + } } -/* 8021CF88-8021D1C8 .text cutTurnToActorStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTurnToActorStart() { - /* Nonmatching */ + mpActorName = dComIfGp_evmng_getMyStringP(mEvtStaffId, "ActorName"); + + u32* set = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "SetId"); + if(set) { + mSetID = *set; + } + else { + mSetID = 0; + } + + Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "OffsetPos"); + if(pos) { + mOffsetPos = *pos; + } + else { + mOffsetPos.set(0.0f, 0.0f, 0.0f); + } + + u32* turnType = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "TurnType"); + if(turnType) { + mTurnType = *turnType; + } + else { + mTurnType = 1; + } + + u32* timer = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Timer"); + if(timer) { + mTimer = (s16)*timer; + } + else { + mTimer = 1; + } + + u32* speed = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "TurnSpeed"); + if(speed) { + mTurnSpeed = *speed; + } + else { + mTurnSpeed = 0; + } + + u32* angle = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "AddAngle"); + if(angle == 0) { + mAddAngle = 0; + } + else { + mAddAngle = *angle; + } + + f32* dist = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "DelDistance"); + if(dist == 0) { + pDelDistance = 0.0f; + } + else { + pDelDistance = *dist; + } + + u32* noTurn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "NoTurn"); + if(noTurn) { + mbNoTurn = 1; + } + else { + mbNoTurn = 0; + } + + field_0x44 = 0; } -/* 8021D1C8-8021D51C .text cutTurnToActorProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTurnToActorProc() { - /* Nonmatching */ + if(mSetID != 0) { + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); + } + else { + if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + mpTargetActor = dComIfGp_getPlayer(0); + } + else { + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); + } + } + + if(field_0x68 != 0) { + switch(mTurnType) { + case 2: + field_0x68[0xA] = 1; + case 1: + field_0x68[0xC] = 0; + break; + case 0: + field_0x68[0xC] = 1; + break; + default: + field_0x68[0xC] = 0; + break; + } + } + + if(mpTargetActor == 0) { + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + mPos = dNpc_playerEyePos(0.0f) + mOffsetPos; + } + else { + s16 addAngle = mAddAngle; + if(addAngle && pDelDistance) { + u16 angle = mpTargetActor->shape_angle.y + addAngle; + mPos = mpTargetActor->current.pos; + mPos.x -= pDelDistance * JMASinShort(angle); + mPos.z -= pDelDistance * JMASCosShort(angle); + } + else { + mPos = mpTargetActor->current.pos + mOffsetPos; + } + } + + mbAttention = 1; + + s16 tAngle = cLib_targetAngleY(&mpActor->current.pos, &mPos); + u32 temp = abs(tAngle - fopAcM_GetAngle_p(mpActor).y); + if(fabsf2(field_0x44) == temp && temp < 5376.0f) { + cLib_calcTimer(&mTimer); + } + + if(mTimer == 0) { + mTurnSpeed = 0; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + + field_0x44 = fabsf2(tAngle - mpActor->current.angle.y); } -/* 8021D51C-8021D730 .text cutMoveToActorStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToActorStart() { - /* Nonmatching */ + mpActorName = dComIfGp_evmng_getMyStringP(mEvtStaffId, "ActorName"); + u32* set = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "SetId"); + f32* speed = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "Speed"); + f32* dist = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "DelDistance"); + Vec* offs = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "OffsetPos"); + u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); + u32* noTurn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "NoTurn"); + u32* angle = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "ShapeAngle"); + + if(noTurn == 0) { + mbNoTurn = 0; + } + else { + mbNoTurn = 1; + } + + if(attn == 0) { + mbAttention = 0; + } + else { + mbAttention = 1; + } + + if(offs == 0) { + mOffsetPos.set(0.0f, 0.0f, 0.0f); + } + else { + mOffsetPos = *offs; + } + + if(set == 0) { + mSetID = 0; + } + else { + mSetID = *set; + } + + if(speed == 0) { + mSpeed = 2.0f; + } + else { + mSpeed = *speed; + } + + if(dist == 0) { + pDelDistance = 0.0f; + } + else { + pDelDistance = *dist; + } + + if(angle == 0) { + mAddAngle = 0; + } + else { + mAddAngle = *angle; + } } -/* 8021D730-8021D9DC .text cutMoveToActorProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToActorProc() { - /* Nonmatching */ + if(mSetID != 0) { + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); + } + else { + if(mpActorName == 0 || dEvmng_strcmp(mpActorName, "Player") == 0) { + mpTargetActor = dComIfGp_getPlayer(0); + } + else { + mTargetActorPos.set(0.0f, 0.0f, 0.0f); + fopAcM_Search((fopAcIt_JudgeFunc)&findActorCallBack, this); + } + } + + if(mpTargetActor == 0) { + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + + cXyz temp = mpTargetActor->current.pos + mOffsetPos; + s16 angle = fopAcM_searchActorAngleY(mpActor, mpTargetActor); + if(mAddAngle != 0) { + angle = mpTargetActor->shape_angle.y + mAddAngle; + } + + temp.x -= pDelDistance * JMASinShort(angle); + temp.z -= pDelDistance * JMASCosShort(angle); + + if(mSpeed == 0.0f) { + mpActor->current.pos = temp; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + + cXyz diff = temp - mPos; + f32 tempf = diff.getSquareMag(); + f32 dist = sqrtf(tempf); + + cLib_addCalc2(&mpActor->current.pos.x, temp.x, 0.1f, mSpeed); + cLib_addCalc2(&mpActor->current.pos.z, temp.z, 0.1f, mSpeed); + if(dist < 5.0f) { + mSpeed = 0.0f; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } } -/* 8021D9DC-8021DC7C .text findActorCallBack__15dNpc_EventCut_cFP10fopAc_ac_cPv */ -void dNpc_EventCut_c::findActorCallBack(fopAc_ac_c*, void*) { - /* Nonmatching */ +fopAc_ac_c* dNpc_EventCut_c::findActorCallBack(fopAc_ac_c* pActor, void* pData) { + dNpc_EventCut_c* cut = static_cast(pData); + + if(cut == 0) { + pActor = 0; + } + else if(cut->mSetID == 0 || pActor->mSetID != cut->mSetID) { + if(cut->mpActorName == 0) { + pActor = 0; + } + else { + //if(dStage_searchName(cut->mpActorName) == 0) { + // pActor = 0; + //} + //else { + //} + } + } + else { + cut->mTargetActorPos = pActor->current.pos; + cut->mpTargetActor = pActor; + } + + return 0; } -/* 8021DC7C-8021DE2C .text cutTurnToPosStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTurnToPosStart() { - /* Nonmatching */ + Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "Pos"); + if(pos) { + mPos = *pos; + } + else { + mPos.set(0.0f, 0.0f, 0.0f); + } + + u32* turnType = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "TurnType"); + if(turnType) { + mTurnType = *turnType; + } + else { + mTurnType = 1; + } + + u32* timer = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Timer"); + if(timer) { + mTimer = (s16)*timer; + } + else { + mTimer = 1; + } + + u32* speed = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "TurnSpeed"); + if(speed) { + mTurnSpeed = *speed; + } + else { + mTurnSpeed = 0; + } + + u32* noTurn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "NoTurn"); + if(noTurn) { + mbNoTurn = 1; + } + else { + mbNoTurn = 0; + } + + u32* angle = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "AddAngle"); + if(angle == 0) { + mAddAngle = 0; + } + else { + mAddAngle = *angle; + } + + field_0x44 = 0; } -/* 8021DE2C-8021DFB0 .text cutTurnToPosProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTurnToPosProc() { - /* Nonmatching */ + s16 tAngle = cLib_targetAngleY(&mpActor->current.pos, &mPos); + mbAttention = 1; + + if(field_0x68 != 0) { + switch(mTurnType) { + case 2: + field_0x68[0xA] = 1; + case 1: + field_0x68[0xC] = 0; + break; + case 0: + field_0x68[0xC] = 1; + break; + default: + field_0x68[0xC] = 0; + break; + } + } + + //not sure what this section is doing + u32 temp = abs(tAngle - fopAcM_GetAngle_p(mpActor).y); + if(fabsf2(field_0x44) == temp && temp < 5376.0f) { + cLib_calcTimer(&mTimer); + } + + if(mTimer == 0) { + mTurnSpeed = 0; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + + field_0x44 = fabsf2(tAngle - mpActor->current.angle.y); } -/* 8021DFB0-8021E168 .text cutMoveToPosStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToPosStart() { - /* Nonmatching */ + Vec* pos = dComIfGp_evmng_getMyVec3dP(mEvtStaffId, "Pos"); + f32* speed = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "Speed"); + f32* dist = dComIfGp_evmng_getMyFloatP(mEvtStaffId, "DelDistance"); + u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); + u32* noTurn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "NoTurn"); + u32* angle = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "AddAngle"); + + if(noTurn == 0) { + mbNoTurn = 0; + } + else { + mbNoTurn = 1; + } + + if(pos == 0) { + mPos.set(0.0f, 0.0f, 0.0f); + } + else { + mPos = *pos; + } + + if(attn == 0) { + mbAttention = 0; + } + else { + mbAttention = 1; + } + + if(speed == 0) { + mSpeed = 2.0f; + } + else { + mSpeed = *speed; + } + + if(dist == 0) { + pDelDistance = 0.0f; + } + else { + pDelDistance = *dist; + } + + if(angle == 0) { + mAddAngle = 0; + } + else { + mAddAngle = *angle; + } } -/* 8021E168-8021E338 .text cutMoveToPosProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToPosProc() { - /* Nonmatching */ + s16 angle = cLib_targetAngleY(mpActor->current.pos, mPos); + + cXyz temp(pDelDistance * JMASinShort(angle), mPos.y, pDelDistance * JMASCosShort(angle)); + + if(mSpeed == 0.0f) { + mpActor->current.pos = temp; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + + f32 dist = sqrtf((temp - mpActor->current.pos).getMagXZ()); + + cLib_addCalc2(&mpActor->current.pos.x, temp.x, 0.1f, mSpeed); + cLib_addCalc2(&mpActor->current.pos.z, temp.z, 0.1f, mSpeed); + if(dist < 5.0f) { + mSpeed = 0.0f; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } } -/* 8021E338-8021E444 .text cutTalkMsgStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTalkMsgStart() { - /* Nonmatching */ + if(mpTalkActor != 0) { + u32* attn = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "Attention"); + if(attn == 0) { + mbAttention = 0; + } + else { + mbAttention = 1; + } + + u32* firstMsg = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "msg_num"); + u32* endMsg = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "end_msg"); + if(firstMsg == 0) { + mpTalkActor->mCurrMsgID = 0; + } + else { + mpTalkActor->mCurrMsgID = *firstMsg; + } + if(endMsg) { + mpTalkActor->mEndMsgID = *endMsg; + } + else { + mpTalkActor->mEndMsgID = -1; + } + + field_0x52 = 1; + } } -/* 8021E444-8021E4C0 .text cutContinueTalkStart__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutContinueTalkStart() { - /* Nonmatching */ + if(mpTalkActor != 0) { + u32* endMsg = dComIfGp_evmng_getMyIntegerP(mEvtStaffId, "end_num"); + if(endMsg) { + mpTalkActor->mEndMsgID = *endMsg; + } + else { + mpTalkActor->mEndMsgID = -1; + } + } } -/* 8021E4C0-8021E58C .text cutTalkMsgProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutTalkMsgProc() { - /* Nonmatching */ + if(mpTalkActor == 0 || field_0x52 == 0) { + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + else { + u16 status = mpTalkActor->talk(0); + if(status == dNpcMsgStts_BOX_CLOSED_e) { + field_0x52 = 0; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + else if((status == 2 || status == 6) && mpTalkActor->mEndMsgID == mpTalkActor->mCurrMsgID) { + mpTalkActor->mEndMsgID = -1; + dComIfGp_evmng_cutEnd(mEvtStaffId); + } + } } -