From 54a8ffbe372c826b048f4cb3399e61623ea55748 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Tue, 19 Sep 2023 19:49:23 -0400 Subject: [PATCH] daObjTpost_c Nearly OK (#60) * daObjTpost_c Nearly OK Also a little bit more work on fopNpc_npc_c * Remove Duplicate Struct --- include/d/d_bg_s_acch.h | 14 +- include/d/d_com_inf_game.h | 36 +- include/d/d_event.h | 1 + include/d/d_letter.h | 15 + include/d/d_lib.h | 16 +- include/d/d_npc.h | 29 +- include/d/d_save.h | 3 +- include/d/d_stage.h | 2 + include/f_op/f_op_actor_mng.h | 2 +- include/m_Do/m_Do_ext.h | 16 + src/d/actor/d_a_obj_toripost.cpp | 1282 +++++++++++++++++++++++------- src/d/d_com_inf_game.cpp | 2 +- src/d/d_npc.cpp | 112 ++- 13 files changed, 1177 insertions(+), 353 deletions(-) create mode 100644 include/d/d_letter.h diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 801ccba21..a79861f78 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -29,14 +29,14 @@ public: /* 0x4 */ WALL_H_DIRECT = 4, }; - /* 80075EAC */ dBgS_AcchCir(); - /* 80075F14 */ void ClrWallHit(); - /* 80075F40 */ void SetWallR(f32); - /* 80075F48 */ void CalcWallRR(); - /* 80075F58 */ void SetWall(f32, f32); - /* 80075F80 */ void SetWallHDirect(f32); + dBgS_AcchCir(); + void ClrWallHit(); + void SetWallR(f32); + void CalcWallRR(); + void SetWall(f32, f32); + void SetWallHDirect(f32); - /* 80077414 */ virtual ~dBgS_AcchCir() {} + virtual ~dBgS_AcchCir() {} f32 GetWallH() { return m_wall_h; } f32 GetWallR() { return m_wall_r; } diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 62ac1113a..6b63209bb 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -164,6 +164,10 @@ public: fopAc_ac_c* getPlayer(int idx) { return (fopAc_ac_c*)mpPlayer[idx]; } s8 getPlayerCameraID(int idx) { return mCurCamera[idx]; } + int getItemRupeeCount() { return mItemRupeeCount; } + void setItemRupeeCount(int count) { mItemRupeeCount += count; } + void setMessageCountNumber(s16 num) { mMsgCountNumber = num; } + void setLkDemoAnmArchive(JKRArchive* i_arc) { mpLkDArc = i_arc; } void setStatus(u16 status) { mStatus = status; } @@ -263,7 +267,7 @@ public: /* 0x48E8 */ u8 field_0x48E8[0x48F6 - 0x48E8]; /* 0x48F6 */ s16 mItemPendantNumCount; /* 0x48F8 */ u8 field_0x48F8[0x4918 - 0x48F8]; - /* 0x4918 */ u16 mCurrAuctionItemNameMsgID; + /* 0x4918 */ u16 mMsgCountNumber; /* 0x491A */ s16 field_0x491a; /* 0x491C */ s16 field_0x491c; /* 0x491E */ s16 field_0x491e; @@ -406,6 +410,10 @@ inline u8 dComIfGs_getWalletSize() { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getWalletSize(); } +inline int dComIfGs_getRupee() { + return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getRupee(); +} + inline u8 dComIfGs_getMagic() { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusA().getMagic(); } @@ -454,6 +462,10 @@ inline u8 dComIfGs_getReserveNum(int i_idx) { return g_dComIfG_gameInfo.save.getPlayer().getBagItemRecord().getReserveNum(i_idx); } +inline void dComIfGs_setReserveItemEmpty() { + g_dComIfG_gameInfo.save.getPlayer().getBagItem().setReserveItemEmpty(); +} + inline void dComIfGs_setEventReg(u16 i_reg, u8 i_no) { g_dComIfG_gameInfo.save.getEvent().setEventReg(i_reg, i_no); } @@ -960,6 +972,18 @@ inline BOOL dComIfGp_checkCameraAttentionStatus(int idx, u32 flag) { return g_dComIfG_gameInfo.play.checkCameraAttentionStatus(idx, flag); } +inline int dComIfGp_getItemRupeeCount() { + return g_dComIfG_gameInfo.play.getItemRupeeCount(); +} + +inline void dComIfGp_setItemRupeeCount(int count) { + g_dComIfG_gameInfo.play.setItemRupeeCount(count); +} + +inline void dComIfGp_setMessageCountNumber(s16 num) { + g_dComIfG_gameInfo.play.setMessageCountNumber(num); +} + /** * === EVENT ===*/ @@ -983,6 +1007,10 @@ inline void dComIfGp_event_offEventFlag(s16 flag) { return g_dComIfG_gameInfo.play.getEvent().offEventFlag(flag); } +inline u8 dComIfGp_event_getPreItemNo() { + return g_dComIfG_gameInfo.play.getEvent().getPreItemNo(); +} + inline void dComIfGp_event_setItemPartnerId(u32 id) { return g_dComIfG_gameInfo.play.getEvent().setPtI_Id(id); } @@ -995,11 +1023,11 @@ 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) { +inline int 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) { +inline int 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); } @@ -1035,7 +1063,7 @@ inline BOOL dComIfGp_evmng_getIsAddvance(s32 staffIdx) { return dComIfGp_getEventManager().getIsAddvance(staffIdx); } -inline void dComIfGp_evmng_cutEnd(s32 staffIdx) { +inline void dComIfGp_evmng_cutEnd(int staffIdx) { return dComIfGp_getEventManager().cutEnd(staffIdx); } diff --git a/include/d/d_event.h b/include/d/d_event.h index 380b9ddb7..acf7f1ae8 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -62,6 +62,7 @@ public: u8 getTalkXYBtn() { return mTalkButton; } bool chkTalkXY() { return mTalkButton == 1 || mTalkButton == 2 || mTalkButton == 3; } void setPtI_Id(u32 id) { mPtItem = id; } + u8 getPreItemNo() { return mItemNo; } u16 chkEventFlag(u16 flag) { return flag & mEventFlag; } void onEventFlag(u16 flag) { mEventFlag |= flag; } diff --git a/include/d/d_letter.h b/include/d/d_letter.h new file mode 100644 index 000000000..92b3cce7d --- /dev/null +++ b/include/d/d_letter.h @@ -0,0 +1,15 @@ +#ifndef D_LETTER_H +#define D_LETTER_H + +bool dLetter_isNoSend(u16); +void dLetter_send(u16); +bool dLetter_isSend(u16); +bool dLetter_stock(u16); +bool dLetter_isStock(u16); +void dLetter_read(u16); +bool dLetter_isRead(u16); +void dLetter_delivery(u16); +void dLetter_autoStock(u16); +bool dLetter_isDelivery(u16); + +#endif /* D_LETTER_H */ diff --git a/include/d/d_lib.h b/include/d/d_lib.h index 994947108..b528816e0 100644 --- a/include/d/d_lib.h +++ b/include/d/d_lib.h @@ -5,7 +5,7 @@ class STControl { public: - void STControl(s16, s16, s16, s16, f32, f32, s16, s16); + STControl(s16, s16, s16, s16, f32, f32, s16, s16); void setWaitParm(s16, s16, s16, s16, f32, f32, s16, s16); void init(); void Xinit(); @@ -38,4 +38,16 @@ public: /* 0x26 */ s16 field_0x26; }; -#endif /* D_LIB_H */ \ No newline at end of file +class dLib_anm_prm_c { +public: + /* 0x00 */ s8 field_0x00; + /* 0x01 */ s8 field_0x01; + /* 0x02 */ s16 field_0x02; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ u32 loopMode; +}; + +void dLib_bcks_setAnm(const char*, mDoExt_McaMorf*, s8*, s8*, s8*, const int*, const dLib_anm_prm_c*, bool); + +#endif /* D_LIB_H */ diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 9bc4f684a..6081215e7 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -37,14 +37,19 @@ class dNpc_JntCtrl_c { /* 0x32 */ s16 field_0x32; public: + dNpc_JntCtrl_c() { + field_0x0C = 0; + field_0x0B = 0; + } + bool angCalcS(s16*, s16, s16, s16); void limitter(s16*, s16, s16); - void follow(s16*, s16, s16, int); + bool 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); + s32 chkLim(s16, int, int); void turn_fromBackbone2Head(s16, s16*, s16*, bool); void turn_fromHead2Backbone(s16, s16*, s16*); s16 follow_current(s16*, s16); @@ -53,10 +58,10 @@ public: class dNpc_EventCut_c { /* 0x00 */ char* mpEvtStaffName; - /* 0x04 */ s32 mEvtStaffId; + /* 0x04 */ int mEvtStaffId; /* 0x08 */ fopAc_ac_c* mpActor; /* 0x0C */ fopNpc_npc_c* mpTalkActor; - /* 0x10 */ s32 mCurActIdx; + /* 0x10 */ int mCurActIdx; /* 0x14 */ u32 field_0x14; /* 0x18 */ int mTimer; /* 0x1C */ char* mpActorName; @@ -78,6 +83,12 @@ class dNpc_EventCut_c { /* 0x68 */ u8* field_0x68; public: + dNpc_EventCut_c() { + mpActor = 0; + mpTalkActor = 0; + field_0x68 = 0; + } + void setActorInfo(char*, fopAc_ac_c*); void setActorInfo2(char*, fopNpc_npc_c*); @@ -166,8 +177,12 @@ enum dNpc_MessageStatus_e { class fopNpc_npc_c : public fopAc_ac_c { public: + fopNpc_npc_c() { + mCurrMsgBsPcId = -1; + mpCurrMsg = 0; + } /* 0x290 */ dNpc_JntCtrl_c mJntCtrl; - /* 0x2C4 */ dNpc_EventCut_c mEventCtrl; + /* 0x2C4 */ dNpc_EventCut_c mEventCut; /* 0x330 */ mDoExt_McaMorf* mpMcaMorf; /* 0x334 */ dBgS_ObjAcch mObjAcch; /* 0x4F8 */ dBgS_AcchCir mAcchCir; @@ -179,8 +194,8 @@ public: /* 0x6B0 */ msg_class* mpCurrMsg; /* 0x6B4 */ u8 pad_0x6B4[0x6C0 - 0x6B4]; - virtual u32 next_msgStatus(u32*) { return 0x10; } - virtual u32 getMsg() { return 1; } + virtual u16 next_msgStatus(u32* msgId) { return dNpcMsgStts_MSG_ENDS_e; } + virtual u32 getMsg() { return 0; } virtual void anmAtr(u16) {} void setCollision(float radius, float height); diff --git a/include/d/d_save.h b/include/d/d_save.h index c58e95862..30f2a6670 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -7,9 +7,10 @@ class dSv_player_status_a_c { public: /* 800589A8 */ void init(); - + u8 getSelectEquip(int i_no) { return mSelectEquip[i_no]; } u8 getWalletSize() { return mWalletSize; } + int getRupee() const { return mRupee; } u8 getMagic() { return mMagic; } /* 0x00 */ u16 mMaxLife; diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 50b2abcda..4e145ffd0 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -918,6 +918,8 @@ int dStage_mapInfo_GetOceanZ(stage_map_info_class*); int dStage_mapInfo_GetOceanX(stage_map_info_class*); void dStage_infoCreate(); +dStage_objectNameInf* dStage_searchName(const char*); + inline s32 dStage_stagInfo_GetSaveTbl(stage_stag_info_class* i_stagInfo) { return (i_stagInfo->field_0x09 >> 1) & 0x7F; } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index cca5b9328..cf98a4cad 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -411,7 +411,7 @@ f32 fopAcM_searchActorDistanceXZ(fopAc_ac_c* p_actorA, fopAc_ac_c* p_actorB); f32 fopAcM_searchActorDistanceXZ2(fopAc_ac_c* p_actorA, fopAc_ac_c* p_actorB); -s32 fopAcM_rollPlayerCrash(fopAc_ac_c*, f32, u32, f32, f32, int, f32); +s32 fopAcM_rollPlayerCrash(fopAc_ac_c*, f32, u32); s32 fopAcM_checkCullingBox(f32[3][4], f32, f32, f32, f32, f32, f32); s32 fopAcM_cullingCheck(fopAc_ac_c*); void* event_second_actor(u16); diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 3aec03ece..089c1128a 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -248,11 +248,27 @@ public: mDoExt_McaMorf(J3DModelData*, mDoExt_McaMorfCallBack1_c*, mDoExt_McaMorfCallBack2_c*, J3DAnmTransform*, int, float, int, int, int, void*, unsigned long, unsigned long); virtual ~mDoExt_McaMorf(); + void calc(); + void calc(u16); void setAnm(J3DAnmTransform*, int, f32, f32, f32, f32, void*); + void setMorf(f32); J3DModel* getModel() { return mpModel; } void setFrame(f32 frame) { mFrameCtrl.setFrame(frame); } + f32 getFrame() { return mFrameCtrl.getFrame(); } + bool isStop() const { //regswap somewhere here + bool stopped = true; + if (!mFrameCtrl.checkState(1) && mFrameCtrl.getRate() != 0.0f) { + stopped = false; + } + + return stopped; + } + void update(); void updateDL(); + void entry(); + void entryDL(); + void entryDL(J3DMaterialTable*); void play(Vec *, u32, s8); void stopZelAnime(); diff --git a/src/d/actor/d_a_obj_toripost.cpp b/src/d/actor/d_a_obj_toripost.cpp index 1e38a03f0..3ef8ce3b8 100644 --- a/src/d/actor/d_a_obj_toripost.cpp +++ b/src/d/actor/d_a_obj_toripost.cpp @@ -3,421 +3,1099 @@ // Translation Unit: d_a_obj_toripost.cpp // -#include "d_a_obj_toripost.h" -#include "dolphin/types.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "f_op/f_op_actor_mng.h" +#include "d/actor/d_a_player.h" +#include "d/d_com_inf_game.h" +#include "d/d_lib.h" +#include "d/d_npc.h" +#include "d/d_letter.h" +#include "d/d_item_data.h" +#include "d/d_s_play.h" +#include "d/d_a_obj.h" +#include "d/d_procname.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_mtx.h" -/* 000000EC-0000010C .text createHeap_CB__FP10fopAc_ac_c */ -void createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +extern dScnPly_reg_HIO_c g_regHIO; + +struct daObjTpost_c__letter_data { + /* 0x00 */ bool field_0x00; + /* 0x04 */ u32 mMsgId; + /* 0x08 */ u8 mItemId; + /* 0x0A */ u16 mEventReg; +}; + +class daObjTpost_c : public fopNpc_npc_c { +public: + enum Proc_e { + PROC_INIT = 0, + PROC_EXEC = 1 + }; + + bool _createHeap(); + bool cutProc(); + void cutPresentStart(int staffIdx); + void cutPresentProc(int staffIdx); + void cutSetAnmStart(int staffIdx); + void cutSetAnmProc(int staffIdx); + void cutDispLetterStart(int staffIdx); + void cutDispLetterProc(int staffIdx); + void deliverLetter(); + s16 getReceiveLetterNum(); + s32 getReadableLetterNum(); + u8 checkSendPrice(); + int getMsgXY(); + int getMsgNormal(); + u32 getMsg(); + u16 next_msgStatus(u32* msgId); + void anmAtr(u16); + bool checkTalk(); + void eventOrder(); + void checkOrder(); + void setAttention(); + void setAnm(s8 param_1, bool param_2); + void setMtx(); + void modeWaitInit(); + void modeWait(); + void modeTalkInit(); + void modeTalk(); + void modeTalkXYInit(); + void modeTalkXY(); + void modeReceiveInit(); + void modeReceive(); + void modeReceiveDemoInit(); + void modeReceiveDemo(); + void modeProc(Proc_e proc, int newMode); + bool _execute(); + void debugDraw(); + bool _draw(); + void createInit(); + void getArg(); + int _create(); + bool _delete(); + + inline s32 getSendPrice() { return m_send_price[mPayType]; } + + static const char m_arc_name[]; + static const daObjTpost_c__letter_data m_letter[]; + static const dCcD_SrcCyl m_cyl_src; + +private: + static const s32 m_send_price[]; + + /* 0x6C4 */ u32 mCurMode; + /* 0x6C8 */ s8 field_0x6C8; + /* 0x6C9 */ s8 field_0x6C9; + /* 0x6CA */ s8 field_0x6CA; + /* 0x6CC */ request_of_phase_process_class mPhs; + /* 0x6D4 */ mDoExt_McaMorf* mMorf; + /* 0x6D8 */ dBgS_ObjAcch mAcch; + /* 0x89C */ dBgS_AcchCir mAcchCir; + /* 0x8DC */ int field_0x8DC; + /* 0x8E0 */ int field_0x8E0; + /* 0x8E4 */ int field_0x8E4; + /* 0x8E8 */ u8 mPayType; + /* 0x8E9 */ u8 field_0x8E9; + /* 0x8EA */ u8 field_0x8EA; + /* 0x8EB */ u8 field_0x8EB; + /* 0x8EC */ s32 mNumReadable; + /* 0x8F0 */ u32 field_0x8F0; + /* 0x8F4 */ u8 field_0x8F4; + /* 0x8F5 */ u8 field_0x8F5; + /* 0x8F6 */ u8 field_0x8F6; + /* 0x8F7 */ s8 field_0x8F7; +}; + +const char daObjTpost_c::m_arc_name[] = "Toripost"; +const daObjTpost_c__letter_data daObjTpost_c::m_letter[] = { + {false, 0x1AAF, 0x07, 0xAC03}, + {false, 0x0CF9, 0x07, 0xB503}, + {false, 0x0CFA, 0xC3, 0x7D03}, + {false, 0x0CFC, 0x04, 0x7B03}, + {false, 0x0805, 0x04, 0x9D03}, + {false, 0x0CFD, 0x01, 0x7A03}, + {true, 0x0DB6, 0xCB, 0xB203}, + {false, 0x1148, 0x04, 0x8B03}, + {false, 0x1AAF, 0x07, 0xAC03}, + {true, 0x0F76, 0x9D, 0xB003}, + {false, 0x19A6, 0x3F, 0xAE03}, + {true, 0x0CFB, 0x04, 0x7C03}, + {true, 0x0F77, 0x9E, 0xAF03} +}; +const dCcD_SrcCyl daObjTpost_c::m_cyl_src = { + 0, + 0, + 0, + 0, + 0xFFFFFFBF, // Tg damage types + 0xF, + 0x79, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 0, + + // Cylinder + 0.0, // X + 0.0, // Y + 0.0, // Z + 0.0, // Radius + 0.0, // Height +}; +static const s32 daObjTpost_c::m_send_price[] = { + 0x05, + 0x0A, + 0x14 +}; + +class daObjTpost_HIO_c { +public: + daObjTpost_HIO_c(); + virtual ~daObjTpost_HIO_c() {} + + /* 0x04 */ s8 field_0x04; + /* 0x05 */ bool debug_draw; + /* 0x06 */ s8 field_0x06; + /* 0x07 */ u8 field_0x07; + /* 0x08 */ f32 attn_pos_offset; + /* 0x0C */ f32 eye_pos_offset; + /* 0x10 */ f32 talk_distance; + /* 0x14 */ s16 field_0x14; + /* 0x16 */ s16 field_0x16; +}; + +static daObjTpost_HIO_c l_HIO; + +// need to figure out what's putting this data in front of a bunch of rels with the compiler-generated symbol names +static Vec dummy = {1.0f, 1.0f, 1.0f}; +static Vec dummy2 = {1.0f, 1.0f, 1.0f}; +static u8 dummy3[] = { + 2, + 0, + 2, + 1, + 0, + 0, + 0, + 0, + 0x40, + 8, + 0, + 0, + 0, + 0, + 0, + 0, + 0x3F, + 0xE0, + 0, + 0, + 0, + 0, + 0 +}; + +static int createHeap_CB(fopAc_ac_c* i_this) { + static_cast(i_this)->_createHeap(); } -/* 0000010C-0000022C .text _createHeap__12daObjTpost_cFv */ -void daObjTpost_c::_createHeap() { - /* Nonmatching */ +bool daObjTpost_c::_createHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arc_name, 9); + JUT_ASSERT(132, modelData != 0); + + mMorf = new mDoExt_McaMorf(modelData, 0, 0, 0, -1, 1.0f, 0, -1, 1, 0, 0x80000, 0x11000022); + + if(mMorf == 0 || mMorf->getModel() == 0) { + return 0; + } + else { + mMorf->getModel()->setUserArea((u32)this); + + return 1; + } } -/* 0000022C-00000280 .text __ct__16daObjTpost_HIO_cFv */ daObjTpost_HIO_c::daObjTpost_HIO_c() { - /* Nonmatching */ + field_0x04 = -1; + debug_draw = false; + field_0x06 = 0; + field_0x07 = 0; + attn_pos_offset = 140.0f; + eye_pos_offset = 100.0f; + talk_distance = 300.0f; + field_0x14 = 30; + field_0x16 = 30; } -/* 00000280-000003D4 .text cutProc__12daObjTpost_cFv */ -void daObjTpost_c::cutProc() { - /* Nonmatching */ +bool daObjTpost_c::cutProc() { + static const char* action_table[3] = { + "PRESENT", + "SET_ANM", + "DISP_LETTER" + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId("Tpost", 0, 0); + if(staffIdx != -1) { + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, 3, 1, 0); + if(actIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } + else { + if(dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(actIdx) { + case 0: + cutPresentStart(staffIdx); + break; + case 1: + cutSetAnmStart(staffIdx); + break; + case 2: + cutDispLetterStart(staffIdx); + break; + } + } + + switch(actIdx) { + case 0: + cutPresentProc(staffIdx); + break; + case 1: + cutSetAnmProc(staffIdx); + break; + case 2: + cutDispLetterProc(staffIdx); + break; + } + } + } } -/* 000003D4-000003D8 .text cutPresentStart__12daObjTpost_cFi */ -void daObjTpost_c::cutPresentStart(int) { - /* Nonmatching */ +void daObjTpost_c::cutPresentStart(int staffIdx) { + return; } -/* 000003D8-00000474 .text cutPresentProc__12daObjTpost_cFi */ -void daObjTpost_c::cutPresentProc(int) { - /* Nonmatching */ +void daObjTpost_c::cutPresentProc(int staffIdx) { + u32 item = fopAcM_createItemForPresentDemo(¤t.pos, m_letter[mNumReadable].mItemId, 0, -1, -1, 0, 0); + if(item != 0xFFFFFFFF) { + dComIfGp_event_setItemPartnerId(item); + dComIfGp_evmng_cutEnd(staffIdx); + } + else { + dComIfGp_evmng_cutEnd(staffIdx); + } } -/* 00000474-00000500 .text cutSetAnmStart__12daObjTpost_cFi */ -void daObjTpost_c::cutSetAnmStart(int) { - /* Nonmatching */ +void daObjTpost_c::cutSetAnmStart(int staffIdx) { + const char* name = dComIfGp_evmng_getMyStringP(staffIdx, "Name"); + if(name != 0 && dEvmng_strcmp(name, "HAKIDASU") == 0) { + setAnm(3, false); + } + else { + setAnm(1, false); + } } -/* 00000500-00000560 .text cutSetAnmProc__12daObjTpost_cFi */ -void daObjTpost_c::cutSetAnmProc(int) { - /* Nonmatching */ +void daObjTpost_c::cutSetAnmProc(int staffIdx) { + if(mMorf->isStop()) { //probably regswap in isStop() + dComIfGp_evmng_cutEnd(staffIdx); + } } -/* 00000560-00000580 .text cutDispLetterStart__12daObjTpost_cFi */ -void daObjTpost_c::cutDispLetterStart(int) { - /* Nonmatching */ +void daObjTpost_c::cutDispLetterStart(int staffIdx) { + mCurrMsgID = m_letter[mNumReadable].mMsgId; } -/* 00000580-000005F4 .text cutDispLetterProc__12daObjTpost_cFi */ -void daObjTpost_c::cutDispLetterProc(int) { - /* Nonmatching */ +void daObjTpost_c::cutDispLetterProc(int staffIdx) { + u16 mode = talk(0); + if(mode == 5) { + daPy_getPlayerActorClass()->field_0x2a0 |= 0x4000; // may be a onLetterReadEyeMove__9daPy_py_cFv inline based on debug map + } + if(mode == dNpcMsgStts_BOX_CLOSED_e) { + dComIfGp_evmng_cutEnd(staffIdx); + } } -/* 000005F4-00000650 .text deliverLetter__12daObjTpost_cFv */ void daObjTpost_c::deliverLetter() { - /* Nonmatching */ + switch(field_0x8F6) { + case 0x9A: + dComIfGs_onEventBit(0x1220); + break; + case 0x99: + dLetter_send(0xAC03); + break; + } } -/* 00000650-000006C0 .text getReceiveLetterNum__12daObjTpost_cFv */ -void daObjTpost_c::getReceiveLetterNum() { - /* Nonmatching */ +s16 daObjTpost_c::getReceiveLetterNum() { + s16 num = 0; + for(int i = 1; i < 0xD; i++) { + if(dLetter_isStock(m_letter[i].mEventReg)) { + num = num + 1; + } + } + + return num; } -/* 000006C0-00000750 .text getReadableLetterNum__12daObjTpost_cFv */ -void daObjTpost_c::getReadableLetterNum() { - /* Nonmatching */ +s32 daObjTpost_c::getReadableLetterNum() { + s32 num = 0; + s32 startIdx = mNumReadable ? mNumReadable : 1; + s32 readable = mNumReadable; + + if(readable < 0xD) { + for(int i = startIdx; i < 0xD; i++) { + if(dLetter_isStock(m_letter[i].mEventReg) == 0) { + continue; + } + + num = i; + break; + } + } + + return num; } -/* 00000750-000007B8 .text checkSendPrice__12daObjTpost_cFv */ -void daObjTpost_c::checkSendPrice() { - /* Nonmatching */ +u8 daObjTpost_c::checkSendPrice() { + static const u8 pay_type[49] = { + 02, + 01, + 01, + 00, + 00, + 00, + 00, + 02, + 01, + 01, + 00, + 00, + 00, + 00, + 02, + 01, + 01, + 00, + 00, + 00, + 00, + 02, + 01, + 01, + 00, + 00, + 00, + 00, + 02, + 01, + 01, + 01, + 01, + 01, + 01, + 02, + 01, + 01, + 01, + 01, + 01, + 01, + 02, + 02, + 02, + 02, + 02, + 02, + 02 + }; + + if(strcmp(dComIfGp_getStartStageName(), "sea") != 0) { + return 0; + } + else { + return pay_type[fopAcM_GetRoomNo(this)]; + } } -/* 000007B8-0000092C .text getMsgXY__12daObjTpost_cFv */ -void daObjTpost_c::getMsgXY() { - /* Nonmatching */ +int daObjTpost_c::getMsgXY() { + s32 msgId; + GXColor col = {0x00, 0x00, 0x00, 0x80}; + cXyz pos(g_regHIO.mChild[12].mFloatRegs[0], g_regHIO.mChild[12].mFloatRegs[1], g_regHIO.mChild[12].mFloatRegs[2]); + cXyz scale(2.0f, 2.0f, 2.0f); + + switch(field_0x8F6) { + case 0x99: + case 0x9A: + msgId = 0xCE8; + col.r = g_regHIO.mChild[12].mShortRegs[0] + 0x80; + col.g = g_regHIO.mChild[12].mShortRegs[1] + 0x80; + col.b = g_regHIO.mChild[12].mShortRegs[2] + 0x80; + mDoMtx_stack_c::copy(mMorf->getModel()->mpNodeMtx[2]); + mDoMtx_stack_c::multVec(&pos, &pos); + dComIfGp_particle_set(0x57, &pos, &shape_angle, &scale, 0xFF, 0, -1, &col, 0, 0); + + break; + case 0x98: + case 0x9B: + setAnm(3, false); + field_0x8EA = 1; + msgId = 0xCEA; + + break; + default: + setAnm(3, false); + field_0x8EA = 1; + msgId = 0xCE9; + + break; + } + + return msgId; } -/* 0000092C-00000990 .text getMsgNormal__12daObjTpost_cFv */ -void daObjTpost_c::getMsgNormal() { - /* Nonmatching */ +int daObjTpost_c::getMsgNormal() { + s32 msgId; + if(field_0x8EB) { + dComIfGp_setMessageCountNumber(field_0x8F0); + msgId = 0xCF7; + field_0x8EB = 0; + } + else { + if(dKy_daynight_check() == false) { + msgId = 0xCE5; + } + else { + msgId = 0xCE6; + } + } + + return msgId; } -/* 00000990-000009EC .text getMsg__12daObjTpost_cFv */ -void daObjTpost_c::getMsg() { - /* Nonmatching */ +u32 daObjTpost_c::getMsg() { + if(dComIfGp_event_chkTalkXY()) { + return getMsgXY(); + } + else { + return getMsgNormal(); + } } -/* 000009EC-00000CF4 .text next_msgStatus__12daObjTpost_cFPUl */ -void daObjTpost_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daObjTpost_c::next_msgStatus(u32* msgId) { + static const u32 pay_msg_num[3] = { + 0x0CEC, + 0x0CED, + 0x0CEE + }; + + u16 status = dNpcMsgStts_MSG_CONTINUES_e; + switch(*msgId) { + case 0xCE5: + case 0xCE6: + if(mNumReadable) { + dComIfGp_setMessageCountNumber(getReceiveLetterNum()); + *msgId = 0xCEB; + } + else { + *msgId = 0xCE7; + } + + break; + case 0xCEB: + dComIfGp_setMessageCountNumber(field_0x8F0); + *msgId = 0xCF7; + break; + case 0xCF7: + if(l_HIO.field_0x07 != 0 || m_letter[mNumReadable].field_0x00 != 0) { + *msgId = 0xCF3; + } + else { + field_0x8E9 = 1; + status = dNpcMsgStts_MSG_ENDS_e; + } + + break; + case 0xCE8: + *msgId = pay_msg_num[mPayType]; + + break; + case 0xCEC: + case 0xCED: + case 0xCEE: + *msgId = 0xCEF; + + break; + case 0xCEF: + if(mpCurrMsg->mSelectedChoiceIdx == 0) { + if(dComIfGs_getRupee() >= getSendPrice()) { + dComIfGp_setItemRupeeCount(-getSendPrice()); + dComIfGs_setReserveItemEmpty(); + deliverLetter(); + *msgId = 0xCF2; + } + else { + setAnm(3, false); + field_0x8EA = 1; + *msgId = 0xCF1; + } + } + else { + setAnm(3, false); + field_0x8EA = 1; + *msgId = 0xCF0; + } + + break; + case 0xCF3: + if(m_letter[mNumReadable].mEventReg == 0xB203) { + *msgId = 0xCF8; + } + else { + *msgId = 0xCF4; + } + + break; + case 0xCF4: + case 0xCF8: + if(mpCurrMsg->mSelectedChoiceIdx == 0) { + s32 price = 0x0A; + if(m_letter[mNumReadable].mEventReg == 0xB203) { + price = 0xC9; + } + if(dComIfGs_getRupee() >= price) { + dComIfGp_setItemRupeeCount(-price); + field_0x8E9 = 1; + status = dNpcMsgStts_MSG_ENDS_e; + } + else { + *msgId = 0xCF6; + } + } + else { + *msgId = 0xCF5; + } + + break; + case 0xCF5: + case 0xCF6: + mNumReadable += 1; + field_0x8F0 += 1; + mNumReadable = getReadableLetterNum(); + if(mNumReadable) { + dComIfGp_setMessageCountNumber(field_0x8F0); + *msgId = 0xCF7; + } + else { + status = dNpcMsgStts_MSG_ENDS_e; + } + + break; + default: + status = dNpcMsgStts_MSG_ENDS_e; + break; + } + + if(mCurrMsgID == m_letter[mNumReadable].mMsgId && status == dNpcMsgStts_MSG_ENDS_e) { + status = dNpcMsgStts_MSG_DISPLAYED_e; + } + + return status; } -/* 00000CF4-00000D38 .text checkTalk__12daObjTpost_cFv */ -void daObjTpost_c::checkTalk() { - /* Nonmatching */ +bool daObjTpost_c::checkTalk() { + return fopAcM_searchPlayerDistanceXZ(this) < l_HIO.talk_distance; } -/* 00000D38-00000DC0 .text eventOrder__12daObjTpost_cFv */ void daObjTpost_c::eventOrder() { - /* Nonmatching */ + static char* a_demo_name_tbl[] = { + "DEFAULT_POST" + }; + + if(field_0x8F7 == 1 || field_0x8F7 == 2) { + mEvtInfo.onCondition(1); + mEvtInfo.onCondition(0x20); + + if(field_0x8F7 == 1) { + fopAcM_orderSpeakEvent(this); + } + } + else if(field_0x8F7 >= 3) { + fopAcM_orderOtherEvent2(this, a_demo_name_tbl[field_0x8F7 - 3], 1, 0x14F); + } } -/* 00000DC0-00000E48 .text checkOrder__12daObjTpost_cFv */ void daObjTpost_c::checkOrder() { - /* Nonmatching */ + if(mEvtInfo.checkCommandDemoAccrpt()) { + field_0x8F7 = 0; + return; + } + + if(mEvtInfo.checkCommandTalk()) { + if(field_0x8F7 == 1 || field_0x8F7 == 2) { + field_0x8F7 = 0; + if(dComIfGp_event_chkTalkXY()) { + field_0x8F5 = 1; + } + else { + field_0x8F4 = 1; + } + } + } + + return; } -/* 00000E48-00000EA4 .text setAttention__12daObjTpost_cFv */ void daObjTpost_c::setAttention() { - /* Nonmatching */ + mAttentionInfo.mPosition = current.pos; + mAttentionInfo.mPosition.y += l_HIO.attn_pos_offset; + mEyePos = current.pos; + mEyePos.y += l_HIO.eye_pos_offset; } -/* 00000EA4-0000100C .text setAnm__12daObjTpost_cFScb */ -void daObjTpost_c::setAnm(signed char, bool) { - /* Nonmatching */ +void daObjTpost_c::setAnm(s8 param_1, bool param_2) { + static const int a_anm_bcks_tbl[] = { + 0x04, + 0x05, + 0x06, + }; + static const dLib_anm_prm_c a_anm_prm_tbl[] = { + { + -1, + -1, + 0, + 8.0f, + 1.0f, + 2 + }, + { + 0, + -1, + 0, + 8.0f, + 0.0f, + 0 + }, + { + 0, + -1, + 0, + 8.0f, + 1.0f, + 0 + }, + { + 1, + -1, + 0, + 8.0f, + 1.0f, + 0 + }, + { + 2, + -1, + 0, + 8.0f, + 1.0f, + 2 + }, + }; + + if(param_1 != 5) { + field_0x6C9 = param_1; + } + + if(field_0x6C8 == 0 && mMorf->getFrame() == 1.0f) { + mDoAud_seStart(0x6973, 0, 0, 0); + } + + if(field_0x6C8 == 1) { + cXyz scale; + scale.setAll(1.0f); + if(mMorf->getFrame() == 1.0f) { + dComIfGp_particle_set(0x8190, ¤t.pos, ¤t.angle, &scale, 0xFF, 0, -1, 0, 0, 0); + mDoAud_seStart(0x6974, 0, 0, 0); + } + } + + dLib_bcks_setAnm(m_arc_name, mMorf, &field_0x6C8, &field_0x6C9, &field_0x6CA, a_anm_bcks_tbl, a_anm_prm_tbl, param_2); } -/* 0000100C-00001094 .text setMtx__12daObjTpost_cFv */ void daObjTpost_c::setMtx() { - /* Nonmatching */ + J3DModel* pModel = mMorf->getModel(); + pModel->setBaseScale(mScale); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + MTXCopy(mDoMtx_stack_c::get(), pModel->getBaseTRMtx()); } -/* 00001094-000010E0 .text modeWaitInit__12daObjTpost_cFv */ void daObjTpost_c::modeWaitInit() { - /* Nonmatching */ + field_0x8F0 = 1; + if(mNumReadable) { + setAnm(4, false); + } + else { + setAnm(1, false); + } } -/* 000010E0-00001188 .text modeWait__12daObjTpost_cFv */ void daObjTpost_c::modeWait() { - /* Nonmatching */ + if(mNumReadable) { + setAnm(4, false); + } + else { + setAnm(1, false); + } + + if(field_0x8F4) { + modeProc(PROC_INIT, 1); + } + else { + if(field_0x8F5) { + modeProc(PROC_INIT, 2); + } + else { + if(checkTalk()) { + field_0x8F7 = 2; + } + } + } } -/* 00001188-000011B0 .text modeTalkInit__12daObjTpost_cFv */ void daObjTpost_c::modeTalkInit() { - /* Nonmatching */ + setAnm(1, false); } -/* 000011B0-00001240 .text modeTalk__12daObjTpost_cFv */ void daObjTpost_c::modeTalk() { - /* Nonmatching */ + if(talk(1) == dNpcMsgStts_BOX_CLOSED_e) { + if(field_0x8E9) { + modeProc(PROC_INIT, 3); + field_0x8E9 = 0; + } + else { + modeProc(PROC_INIT, 0); + } + + dComIfGp_event_onEventFlag(8); + field_0x8F4 = 0; + } } -/* 00001240-0000129C .text modeTalkXYInit__12daObjTpost_cFv */ void daObjTpost_c::modeTalkXYInit() { - /* Nonmatching */ + setAnm(1, false); + field_0x8F6 = dComIfGp_event_getPreItemNo(); + field_0x8DC = l_HIO.field_0x14; + field_0x8E0 = l_HIO.field_0x16; } -/* 0000129C-00001490 .text modeTalkXY__12daObjTpost_cFv */ void daObjTpost_c::modeTalkXY() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + if(field_0x6C9 == 3) { + if(field_0x8EA != 0) { + field_0x8E4 = 10; + field_0x8EA = 0; + } + + if(field_0x8E4 != -1 && cLib_calcTimer(&field_0x8E4) == 0) { + player->mDemo.setOriginalDemoType(); + player->mDemo.setParam0(0); + player->mDemo.setDemoMode(0x18); + + field_0x8E4 = -1; + } + + switch(mCurrMsgID) { + case 0xCE9: + case 0xCEA: + case 0xCF0: + case 0xCF1: + if(player->getBaseAnimeFrameRate() == 0.0f) { + player->mDemo.setOriginalDemoType(); + player->mDemo.setParam0(0); + player->mDemo.setDemoMode(1); + } + + break; + } + } + + if(field_0x6C9 == 1 && dComIfGp_evmng_ChkPresentEnd() && cLib_calcTimer(&field_0x8E0) == 0) { + dComIfGp_evmng_CancelPresent(); + setAnm(2, false); + } + + if(field_0x6C9 == 2 || field_0x6C9 == 3) { + if(mMorf->isStop()) { //probably regswap in isStop() + if(cLib_calcTimer(&field_0x8DC) == 0 && talk(1) == dNpcMsgStts_BOX_CLOSED_e) { + modeProc(PROC_INIT, 0); + dComIfGp_event_onEventFlag(8); + field_0x8F5 = 0; + } + } + } } -/* 00001490-000014D4 .text modeReceiveInit__12daObjTpost_cFv */ void daObjTpost_c::modeReceiveInit() { - /* Nonmatching */ + dComIfGp_event_onEventFlag(8); + field_0x8F7 = 3; + setAnm(1, false); } -/* 000014D4-000014FC .text modeReceive__12daObjTpost_cFv */ void daObjTpost_c::modeReceive() { - /* Nonmatching */ + modeProc(PROC_INIT, 4); } -/* 000014FC-00001500 .text modeReceiveDemoInit__12daObjTpost_cFv */ void daObjTpost_c::modeReceiveDemoInit() { - /* Nonmatching */ + return; } -/* 00001500-000015D8 .text modeReceiveDemo__12daObjTpost_cFv */ void daObjTpost_c::modeReceiveDemo() { - /* Nonmatching */ + if(dComIfGp_getEventManager().endCheckOld("DEFAULT_POST")) { + dLetter_read(m_letter[mNumReadable].mEventReg); + mNumReadable = getReadableLetterNum(); + dComIfGp_event_onEventFlag(8); + + if(mNumReadable != 0) { + modeProc(PROC_INIT, 1); + field_0x8F7 = 1; + field_0x8EB = 1; + field_0x8F0 += 1; + } + else { + modeProc(PROC_INIT, 0); + field_0x8F0 = 1; + } + } } -/* 000015D8-00001758 .text modeProc__12daObjTpost_cFQ212daObjTpost_c6Proc_ei */ -void daObjTpost_c::modeProc(daObjTpost_c::Proc_e, int) { - /* Nonmatching */ +void daObjTpost_c::modeProc(daObjTpost_c::Proc_e proc, int newMode) { + typedef void(daObjTpost_c::*mode_func_t)(void); + struct mode_entry_t { + mode_func_t init; + mode_func_t run; + const char* name; + }; + + static mode_entry_t mode_tbl[] = { + { + &daObjTpost_c::modeWaitInit, + &daObjTpost_c::modeWait, + "WAIT", + }, + { + &daObjTpost_c::modeTalkInit, + &daObjTpost_c::modeTalk, + "TALK", + }, + { + &daObjTpost_c::modeTalkXYInit, + &daObjTpost_c::modeTalkXY, + "TALK_XY", + }, + { + &daObjTpost_c::modeReceiveInit, + &daObjTpost_c::modeReceive, + "RECEIVE", + }, + { + &daObjTpost_c::modeReceiveDemoInit, + &daObjTpost_c::modeReceiveDemo, + "RECEIVE_DEMO", + } + }; + + if(proc == PROC_INIT) { + mCurMode = newMode; + (this->*mode_tbl[mCurMode].init)(); + } + else if(proc == PROC_EXEC) { + (this->*mode_tbl[mCurMode].run)(); + } } -/* 00001758-000018CC .text _execute__12daObjTpost_cFv */ -void daObjTpost_c::_execute() { - /* Nonmatching */ +bool daObjTpost_c::_execute() { + if(dComIfGs_isSymbol(1)) { + mNumReadable = getReadableLetterNum(); + } + else { + mNumReadable = 0; + } + + checkOrder(); + setAttention(); + setCollision(40.0f, 140.0f); + modeProc(PROC_EXEC, 5); + dBgS* bgs = dComIfG_Bgsp(); + + if(g_dComIfG_gameInfo.play.mEvtCtrl.mMode != 0 && mEventCut.cutProc() == false) { + cutProc(); + } + eventOrder(); + + fopAcM_posMoveF(this, 0); + mAcch.CrrPos(*bgs); + mStts.Move(); + if(mCyl.ChkTgHit()) { + daObj::HitSeStart(&mEyePos, current.roomNo, &mCyl, 0x0B); + } + daObj::HitEff_kikuzu(this, &mCyl); + fopAcM_rollPlayerCrash(this, 40.0f, 7); + + mMorf->play(0, 0, 0); + mMorf->calc(); + setMtx(); + setAnm(5, false); + + return 0; } -/* 000018CC-000018D0 .text debugDraw__12daObjTpost_cFv */ void daObjTpost_c::debugDraw() { - /* Nonmatching */ + GXColor col = {0xFF, 0x00, 0x00, 0x80}; } -/* 000018D0-00001980 .text _draw__12daObjTpost_cFv */ -void daObjTpost_c::_draw() { - /* Nonmatching */ +bool daObjTpost_c::_draw() { + if(l_HIO.debug_draw) { + debugDraw(); + } + + J3DModel* pModel = mMorf->getModel(); + g_env_light.settingTevStruct(TEV_TYPE_BG0, getPositionP(), &mTevStr); + g_env_light.setLightTevColorType(pModel, &mTevStr); + mMorf->entryDL(); + dComIfGd_setSimpleShadow2(getPositionP(), mAcch.GetGroundH(), 40.0f, mAcch.m_gnd, shape_angle.y, 1.0f, 0); + + return 1; } -/* 00001980-00001BA4 .text createInit__12daObjTpost_cFv */ void daObjTpost_c::createInit() { - /* Nonmatching */ + if(dComIfGs_isSymbol(2)) { + dLetter_autoStock(0xB503); + } + + if(dComIfGs_checkGetItem(BOMB_BAG)) { + dLetter_autoStock(0x7D03); + } + + if(dLetter_isDelivery(0xAC03) && dComIfGs_isStageBossEnemy(6)) { + dLetter_autoStock(0x7C03); + } + + if(dComIfGs_isEventBit(0x1E80)) { + dLetter_autoStock(0x7B03); + } + + if(dComIfGs_getWalletSize() == 1 || dComIfGs_getWalletSize() == 2) { + dLetter_autoStock(0x7A03); + } + + field_0x8F0 = 1; + mCurrMsgBsPcId = -1; + mpCurrMsg = 0; + + mAttentionInfo.mDistances[1] = 5; + mAttentionInfo.mDistances[3] = 6; + mAttentionInfo.mFlags = 0x2000000A; + + setAnm(1, false); + setMtx(); + mMorf->calc(); + + mCullMtx = mMorf->getModel()->getBaseTRMtx(); + fopAcM_setCullSizeBox(this, -50.0f, 0.0f, -50.0f, 70.0f, 200.0f, 70.0f); + mCullSizeFar = 10.0f; + + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(m_cyl_src); + mCyl.SetStts(&mStts); + + mPayType = checkSendPrice(); + modeProc(PROC_INIT, 0); + + mAcchCir.SetWall(30.0f, 30.0f); + mAcch.Set(¤t.pos, &next.pos, this, 1, &mAcchCir, &speed, 0, 0); + mAcch.SetRoofNone(); + mGravity = -4.5f; + + mEventCut.setActorInfo2("Tpost", this); } -/* 00001BA4-00001BA8 .text getArg__12daObjTpost_cFv */ void daObjTpost_c::getArg() { - /* Nonmatching */ + return; } -/* 00001BA8-00001D88 .text _create__12daObjTpost_cFv */ -void daObjTpost_c::_create() { - /* Nonmatching */ +int daObjTpost_c::_create() { + fopAcM_SetupActor(this, daObjTpost_c); + + getArg(); + int step = dComIfG_resLoad(&mPhs, m_arc_name); + if(step == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(this, &createHeap_CB, 0x7E0) == 0) { + return cPhs_ERROR_e; + } + + createInit(); + } + + return step; } -/* 00001D88-00001E54 .text __dt__8dCcD_CylFv */ -dCcD_Cyl::~dCcD_Cyl() { - /* Nonmatching */ +bool daObjTpost_c::_delete() { + dComIfG_resDelete(&mPhs, m_arc_name); + return true; } -/* 00001E54-00001E9C .text __dt__8cM3dGCylFv */ -cM3dGCyl::~cM3dGCyl() { - /* Nonmatching */ +static int daObjTpostCreate(void* i_this) { + return static_cast(i_this)->_create(); } -/* 00001E9C-00001EF8 .text __dt__14cCcD_ShapeAttrFv */ -cCcD_ShapeAttr::~cCcD_ShapeAttr() { - /* Nonmatching */ +static BOOL daObjTpostDelete(void* i_this) { + return static_cast(i_this)->_delete(); } -/* 00001EF8-00001F40 .text __dt__8cM3dGAabFv */ -cM3dGAab::~cM3dGAab() { - /* Nonmatching */ +static BOOL daObjTpostExecute(void* i_this) { + return static_cast(i_this)->_execute(); } -/* 00001F40-00001F9C .text __dt__10dCcD_GSttsFv */ -dCcD_GStts::~dCcD_GStts() { - /* Nonmatching */ +static BOOL daObjTpostDraw(void* i_this) { + return static_cast(i_this)->_draw(); } -/* 00001F9C-00002024 .text __dt__12dBgS_AcchCirFv */ -dBgS_AcchCir::~dBgS_AcchCir() { - /* Nonmatching */ +static bool daObjTpostIsDelete(void*) { + return true; } -/* 00002024-00002094 .text __dt__12dBgS_ObjAcchFv */ -dBgS_ObjAcch::~dBgS_ObjAcch() { - /* Nonmatching */ -} -/* 00002094-000020C4 .text _delete__12daObjTpost_cFv */ -void daObjTpost_c::_delete() { - /* Nonmatching */ -} - -/* 000020C4-000020E4 .text daObjTpostCreate__FPv */ -void daObjTpostCreate(void*) { - /* Nonmatching */ -} - -/* 000020E4-00002108 .text daObjTpostDelete__FPv */ -void daObjTpostDelete(void*) { - /* Nonmatching */ -} - -/* 00002108-0000212C .text daObjTpostExecute__FPv */ -void daObjTpostExecute(void*) { - /* Nonmatching */ -} - -/* 0000212C-00002150 .text daObjTpostDraw__FPv */ -void daObjTpostDraw(void*) { - /* Nonmatching */ -} - -/* 00002150-00002158 .text daObjTpostIsDelete__FPv */ -void daObjTpostIsDelete(void*) { - /* Nonmatching */ -} - -/* 00002158-000021A0 .text __dt__13cBgS_PolyInfoFv */ -cBgS_PolyInfo::~cBgS_PolyInfo() { - /* Nonmatching */ -} - -/* 000021A0-000021E8 .text __dt__8cM2dGCirFv */ -cM2dGCir::~cM2dGCir() { - /* Nonmatching */ -} - -/* 000021E8-00002244 .text __dt__8cM3dGCirFv */ -cM3dGCir::~cM3dGCir() { - /* Nonmatching */ -} - -/* 00002244-0000228C .text __dt__10cCcD_GSttsFv */ -cCcD_GStts::~cCcD_GStts() { - /* Nonmatching */ -} - -/* 0000228C-0000229C .text GetShapeAttr__8dCcD_CylFv */ -void dCcD_Cyl::GetShapeAttr() { - /* Nonmatching */ -} - -/* 0000229C-000022A4 .text GetCoCP__12cCcD_CylAttrFv */ -void cCcD_CylAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 000022A4-000022AC .text GetCoCP__12cCcD_CylAttrCFv */ -void cCcD_CylAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 000022AC-000022B4 .text CrossAtTg__12cCcD_CylAttrCFRC12cCcD_AabAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_AabAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 000022B4-000022BC .text CrossAtTg__12cCcD_CylAttrCFRC12cCcD_PntAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_PntAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 000022BC-000022F4 .text CrossAtTg__12cCcD_CylAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_CylAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 000022F4-000022FC .text CrossCo__12cCcD_CylAttrCFRC12cCcD_AabAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_AabAttr&, float*) const { - /* Nonmatching */ -} - -/* 000022FC-00002304 .text CrossCo__12cCcD_CylAttrCFRC12cCcD_TriAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_TriAttr&, float*) const { - /* Nonmatching */ -} - -/* 00002304-0000230C .text CrossCo__12cCcD_CylAttrCFRC12cCcD_PntAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_PntAttr&, float*) const { - /* Nonmatching */ -} - -/* 0000230C-00002344 .text CrossCo__12cCcD_CylAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_CylAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00002344-00002348 .text GetGObjInf__12cCcD_GObjInfCFv */ -void cCcD_GObjInf::GetGObjInf() const { - /* Nonmatching */ -} - -/* 00002348-00002350 .text GetShapeAttr__8cCcD_ObjCFv */ -void cCcD_Obj::GetShapeAttr() const { - /* Nonmatching */ -} - -/* 00002350-00002358 .text CrossAtTg__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrP4cXyz */ -void cCcD_ShapeAttr::CrossAtTg(const cCcD_ShapeAttr&, cXyz*) const { - /* Nonmatching */ -} - -/* 00002358-00002360 .text CrossCo__14cCcD_ShapeAttrCFRC14cCcD_ShapeAttrPf */ -void cCcD_ShapeAttr::CrossCo(const cCcD_ShapeAttr&, float*) const { - /* Nonmatching */ -} - -/* 00002360-0000236C .text GetCoCP__14cCcD_ShapeAttrFv */ -void cCcD_ShapeAttr::GetCoCP() { - /* Nonmatching */ -} - -/* 0000236C-00002378 .text GetCoCP__14cCcD_ShapeAttrCFv */ -void cCcD_ShapeAttr::GetCoCP() const { - /* Nonmatching */ -} - -/* 00002378-000023C0 .text __dt__16daObjTpost_HIO_cFv */ -daObjTpost_HIO_c::~daObjTpost_HIO_c() { - /* Nonmatching */ -} - -/* 000023C0-000023DC .text cLib_calcTimer__FPi */ -void cLib_calcTimer(int*) { - /* Nonmatching */ -} - -/* 00002418-00002420 .text @32@__dt__12dBgS_ObjAcchFv */ -void @32@__dt__12dBgS_ObjAcchFv { - /* Nonmatching */ -} - -/* 00002420-00002428 .text @20@__dt__12dBgS_ObjAcchFv */ -void @20@__dt__12dBgS_ObjAcchFv { - /* Nonmatching */ -} - -/* 00002428-00002430 .text @280@__dt__8dCcD_CylFv */ -void @280@__dt__8dCcD_CylFv { - /* Nonmatching */ -} - -/* 00002430-00002438 .text @248@__dt__8dCcD_CylFv */ -void @248@__dt__8dCcD_CylFv { - /* Nonmatching */ -} - -/* 00002438-00002440 .text next_msgStatus__12fopNpc_npc_cFPUl */ -void fopNpc_npc_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ -} - -/* 00002440-00002448 .text getMsg__12fopNpc_npc_cFv */ -void fopNpc_npc_c::getMsg() { - /* Nonmatching */ -} - -/* 00002448-0000244C .text anmAtr__12fopNpc_npc_cFUs */ -void fopNpc_npc_c::anmAtr(unsigned short) { - /* Nonmatching */ -} +static actor_method_class daObjTpostMethodTable = { + (process_method_func)daObjTpostCreate, + (process_method_func)daObjTpostDelete, + (process_method_func)daObjTpostExecute, + (process_method_func)daObjTpostIsDelete, + (process_method_func)daObjTpostDraw, +}; +extern actor_process_profile_definition g_profile_OBJ_TORIPOST = { + fpcLy_CURRENT_e, + 3, + fpcPi_CURRENT_e, + PROC_OBJ_TORIPOST, + &g_fpcLf_Method.mBase, + sizeof(daObjTpost_c), + 0, + 0, + &g_fopAc_Method.base, + 0x01B3, + &daObjTpostMethodTable, + 0x00240138, + fopAc_ACTOR_e, + fopAc_CULLBOX_4_e, +}; diff --git a/src/d/d_com_inf_game.cpp b/src/d/d_com_inf_game.cpp index ad4681cc6..13f011723 100644 --- a/src/d/d_com_inf_game.cpp +++ b/src/d/d_com_inf_game.cpp @@ -87,7 +87,7 @@ void dComIfG_play_c::itemInit() { for (int i = 0; i < 4; i++) { } - mCurrAuctionItemNameMsgID = 0; + mMsgCountNumber = 0; field_0x491a = 0; field_0x491c = 0; field_0x491e = 0; diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index 7572f67e8..beaa58772 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -35,9 +35,10 @@ void dNpc_JntCtrl_c::limitter(s16* targetDiff, s16 maxDiff, s16 minDiff) { } } -/* 8021A884-8021A97C .text follow__14dNpc_JntCtrl_cFPsssi */ -void dNpc_JntCtrl_c::follow(short*, short, short, int) { - /* Nonmatching */ +bool dNpc_JntCtrl_c::follow(s16* outY, s16 targetY, s16 maxVel, int param_4) { + angCalcS(outY, targetY, 4, maxVel); + + return *outY != targetY; } /* 8021A97C-8021AABC .text move__14dNpc_JntCtrl_cFsi */ @@ -289,16 +290,18 @@ u8 dNpc_PathRun_c::pointArg(u8 idx) { return arg; } -bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, float param_2) { +bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, f32 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); + f32 xz_mag = diff.getMagXZ(); + f32 y_mag = param_2 * (diff.y * diff.y); + f32 dist = sqrtf(y_mag + xz_mag); if(max_dist > dist) { max_dist = dist; @@ -575,12 +578,12 @@ bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int } 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) { + if(param_4 == 0 || mFunc != &swing_horizone) { //these ptmfs should be going in rodata instead of data field_0x1C = 0; field_0x20 = param_1; field_0x1E = param_2; field_0x14 = param_3; - mFunc = &swing_vertical; + mFunc = &swing_vertical; //these ptmfs should be going in rodata instead of data } } @@ -589,14 +592,13 @@ void dNpc_HeadAnm_c::swing_vertical() { /* Nonmatching */ } -/* 8021C3C8-8021C478 .text swing_horizone_init__14dNpc_HeadAnm_cFsssi */ 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) { + if(param_4 == 0 || mFunc != &swing_vertical) { //these ptmfs should be going in rodata instead of data field_0x1C = 0; field_0x20 = param_1; field_0x1E = param_2; field_0x18 = param_3; - mFunc = &swing_horizone; + mFunc = &swing_horizone; //these ptmfs should be going in rodata instead of data } } @@ -615,9 +617,15 @@ void dNpc_HeadAnm_c::move() { } } -/* 8021C5D8-8021C620 .text chkLim__14dNpc_JntCtrl_cFsii */ -s16 dNpc_JntCtrl_c::chkLim(short, int, int) { - /* Nonmatching */ +s32 dNpc_JntCtrl_c::chkLim(s16 param_1, int param_2, int param_3) { + //if(maxRotations[param_2][param_3] > param_1) { + // param_1 = maxRotations[param_2][param_3]; + //} + //if(param_1 < minRotations[param_2][param_3]) { + // param_1 = minRotations[param_2][param_3]; + //} + + //return param_1; } void dNpc_JntCtrl_c::turn_fromBackbone2Head(s16 param_1, s16* param_2, s16* param_3, bool param_4) { @@ -1026,23 +1034,43 @@ 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; + return 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 { + + if(cut->mSetID != 0 && pActor->mSetID == cut->mSetID) { cut->mTargetActorPos = pActor->current.pos; cut->mpTargetActor = pActor; + + return pActor; + } + else { + if(cut->mpActorName == 0) { + return 0; + } + else { + dStage_objectNameInf* obj = dStage_searchName(cut->mpActorName); + if(obj == 0) { + return 0; + } + else { + if(obj->mProcName == fopAcM_GetProfName(pActor) && obj->mSubtype == pActor->mSubtype) { + f32 mag = sqrtf(cut->mTargetActorPos.getSquareMag()); + + if(mag == 0.0f) { + cut->mTargetActorPos = pActor->current.pos; + cut->mpTargetActor = pActor; + } + else { + f32 mag1 = sqrtf((cut->mTargetActorPos - cut->mpActor->current.pos).getSquareMag()); + f32 mag2 = sqrtf((pActor->current.pos - cut->mpActor->current.pos).getSquareMag()); + if(mag2 < mag1) { + cut->mTargetActorPos = pActor->current.pos; + cut->mpTargetActor = pActor; + } + } + } + } + } } return 0; @@ -1262,3 +1290,31 @@ void dNpc_EventCut_c::cutTalkMsgProc() { } } } + +dCcD_SrcCyl dNpc_cyl_src = { + 0, + 0, + 0, + 0, + 0xFFFFFFBF, // Tg damage types + 3, + 0x75, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4, + 0, + + // Cylinder + 0.0, // X + 0.0, // Y + 0.0, // Z + 0.0, // Radius + 0.0, // Height +};