From dcf4862387fb9be67f7aff9fe4f986d129366662 Mon Sep 17 00:00:00 2001 From: Zeclos Date: Wed, 4 Mar 2026 19:25:59 +0100 Subject: [PATCH] D_a_npc_tc matching for retail (#930) * progress * code matching non-demo * cleanup for d_a_npc_tc and d_a_obj_smplbg --- configure.py | 2 +- include/d/actor/d_a_npc_tc.h | 272 +++- include/d/actor/d_a_obj_smplbg.h | 8 +- include/d/d_com_inf_game.h | 4 + include/d/d_npc.h | 12 + include/d/d_snap.h | 8 +- include/m_Do/m_Do_ext.h | 2 +- src/d/actor/d_a_npc_tc.cpp | 1958 +++++++++++++++++++++--- src/d/actor/d_a_npc_tc_cut.inc | 312 ++++ src/d/actor/d_a_npc_tc_msg_normal2.inc | 202 +++ src/d/actor/d_a_npc_tc_msg_red.inc | 248 +++ src/d/actor/d_a_npc_tc_msg_white.inc | 131 ++ src/d/actor/d_a_obj_smplbg.cpp | 2 +- 13 files changed, 2852 insertions(+), 309 deletions(-) create mode 100644 src/d/actor/d_a_npc_tc_cut.inc create mode 100644 src/d/actor/d_a_npc_tc_msg_normal2.inc create mode 100644 src/d/actor/d_a_npc_tc_msg_red.inc create mode 100644 src/d/actor/d_a_npc_tc_msg_white.inc diff --git a/configure.py b/configure.py index a57837acb..9ab337657 100755 --- a/configure.py +++ b/configure.py @@ -1667,7 +1667,7 @@ config.libs = [ ActorRel(Matching, "d_a_npc_rsh1"), ActorRel(NonMatching, "d_a_npc_sarace"), ActorRel(NonMatching, "d_a_npc_sv"), - ActorRel(NonMatching, "d_a_npc_tc"), + ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_tc"), ActorRel(NonMatching, "d_a_npc_tt"), ActorRel(NonMatching, "d_a_npc_uk"), ActorRel(NonMatching, "d_a_npc_ym1"), diff --git a/include/d/actor/d_a_npc_tc.h b/include/d/actor/d_a_npc_tc.h index e0ed05f78..0ea9ef3b1 100644 --- a/include/d/actor/d_a_npc_tc.h +++ b/include/d/actor/d_a_npc_tc.h @@ -2,37 +2,143 @@ #define D_A_NPC_TC_H #include "f_op/f_op_actor.h" +#include "d/d_npc.h" -class daNpc_Tc_c : public fopAc_ac_c { +namespace daObjSmplbg { class Act_c; }; + +class daNpc_Tc_c : public fopNpc_npc_c { public: - void getAttentionBasePos() {} - void getEyePos() {} - void incAttnSetCount() {} - void setAction(int (daNpc_Tc_c::*)(void*), void*) {} - void _searchTower(fopAc_ac_c*); - void initTexPatternAnm(bool); + enum Status { + STATUS_WAIT = 1, + STATUS_SIT = 2, + STATUS_TALK = 3, + STATUS_JUMP = 4, + STATUS_WALK_TO_JAIL = 5, + STATUS_TALK_NEAR_JAIL = 6, + STATUS_WAIT_NEAR_JAIL = 7, + STATUS_WALK_TO_STOOL = 8, + STATUS_SIT_TO_STOOL = 9, + STATUS_DEMO_JUMP = 10, + STATUS_DEMO_RESCUE = 11, + STATUS_DEMO_TALK = 12, + STATUS_PAY_RUPEE = 13, + STATUS_DEMO_PAY_RUPEE = 14, + STATUS_GET_RUPEE = 15, + STATUS_DEMO_GET_RUPEE = 16, + STATUS_MONUMENT_COMPLETE = 17, + STATUS_DEMO_MONUMENT_COMPLETE = 18, + }; + + enum ActionStatus { + ACTION_STARTING = 0, + ACTION_ONGOING = 1, + ACTION_ENDING = -1, + }; + + enum Type { + TYPE_NORMAL2 = 0, + TYPE_RED = 1, + TYPE_WHITE = 2, + TYPE_BLUE = 3, + TYPE_NORMAL = 4, + }; + + enum BckIdx { + BCK_IDX_WAIT01 = 0, + BCK_IDX_WAIT03 = 1, + BCK_IDX_WAIT02 = 2, + BCK_IDX_TALK01 = 3, + BCK_IDX_WALK01 = 4, + BCK_IDX_JAMP_A = 5, + BCK_IDX_JAMP_B = 6, + BCK_IDX_JAMP_C = 7, + BCK_IDX_GUARD = 8, + BCK_IDX_JTBT = 9, + BCK_IDX_HAPPY = 10, + BCK_IDX_DANCE01 = 11, + BCK_IDX_DANCE02 = 12, + BCK_IDX_GET = 13, + BCK_IDX_MAWASU = 14, + BCK_IDX_WAIT04 = 15, + BCK_IDX_TALK02 = 16, + }; + + enum AnmPrmIdx { + ANM_PRM_IDX_NONE = 0, + ANM_PRM_IDX_WAIT01 = 1, + ANM_PRM_IDX_WAIT03 = 2, + ANM_PRM_IDX_WAIT02 = 3, + ANM_PRM_IDX_TALK01 = 4, + ANM_PRM_IDX_WALK01 = 5, + ANM_PRM_IDX_JAMP_A = 6, + ANM_PRM_IDX_JAMP_B = 7, + ANM_PRM_IDX_JAMP_C1 = 8, + ANM_PRM_IDX_JAMP_C2 = 9, + ANM_PRM_IDX_GUARD = 10, + ANM_PRM_IDX_JTBT = 11, + ANM_PRM_IDX_HAPPY = 12, + ANM_PRM_IDX_DANCE01 = 13, + ANM_PRM_IDX_DANCE02 = 14, + ANM_PRM_IDX_GET = 15, + ANM_PRM_IDX_HAPPY2 = 16, // ANM_PRM_IDX_HAPPY gets set to this + ANM_PRM_IDX_DANCE01_TO_TALK01 = 17, + ANM_PRM_IDX_DANCE02_TO_WAIT03 = 18, + ANM_PRM_IDX_MAWASU = 19, + ANM_PRM_IDX_WAIT04 = 20, + ANM_PRM_IDX_TALK02 = 21, + ANM_PRM_IDX_TALK01_WAIT01 = 22, // loops 3x then -> WAIT01 + ANM_PRM_IDX_TALK01_TALK02 = 23, // loops 5x then -> TALK02 + }; + + typedef int (daNpc_Tc_c::*ActionFunc)(void*); + daNpc_Tc_c(); + + cXyz& getAttentionBasePos() { return mAttPos; } + cXyz& getEyePos() { return mEyePos; } + + void incAttnSetCount() { + if (mAttnSetCount != 0xff) { + mAttnSetCount++; + } + } + + BOOL setAction(ActionFunc actionFunc, void* arg) { + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + mActionStatus = ACTION_ENDING; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + mActionStatus = ACTION_STARTING; + (this->*mCurrActionFunc)(arg); + } + return TRUE; + } + + fopAc_ac_c* _searchTower(fopAc_ac_c*); + BOOL initTexPatternAnm(bool); void playTexPatternAnm(); - void smoke_set(float, float, float, float, float); + void smoke_set(f32, f32, f32, f32, f32); void setAnm(); void setTexAnm(); - void chkAttention(cXyz, short); + bool chkAttention(cXyz, s16); void eventOrder(); void checkOrder(); - void existTcMonument(); - void anmAtr(unsigned short); + bool existTcMonument(); + void anmAtr(u16); void stopTower(); void startTower(); - void next_msgStatusBlue(unsigned long*); - void next_msgStatusNormal(unsigned long*); - void next_msgStatus(unsigned long*); - void setFirstMsg(bool*, unsigned long, unsigned long); - void getMsgNormal(); - void getMsgBlue(); - void getMsg(); + u16 next_msgStatusBlue(u32*); + u16 next_msgStatusNormal(u32*); + u16 next_msgStatus(u32*); + u32 setFirstMsg(bool*, u32, u32); + u32 getMsgNormal(); + u32 getMsgBlue(); + u32 getMsg(); void getArg(); void createInit(); - void searchStoolPos(void*, void*); + static void* searchStoolPos(void*, void*); void setAttention(); void calcMove(); void lookBack(); @@ -54,32 +160,37 @@ public: void statusDemoJump(); void statusDemoRescue(); void statusDemoTalk(); - void help_action(void*); - void wait_action(void*); + BOOL help_action(void*); + BOOL wait_action(void*); void calc_sitpos(); void set_mtx(); BOOL _draw(); void setTower(); BOOL _execute(); BOOL _delete(); - void isCreate(); + bool isCreate(); cPhs_State _create(); - void _createHeap(); - void next_msgStatusNormal2(unsigned long*); - void getMsgNormal2(); - void setRupeeSizeMsg(); - void existUnknownCollectMap(); - void analysisCollectMap(); - void existKnownCollectMap(); - void next_msgStatusWhite(unsigned long*); - void getMsgWhite(); - void next_msgStatusRed(unsigned long*); - void setFinishMsg(); - void getMsgRed(); - void checkMonumentFee(unsigned short, unsigned short); - void checkAllMonumentFee(); - void checkAllMonumentPay(); - void checkMonumentPay(unsigned short, unsigned short); + BOOL _createHeap(); + u16 next_msgStatusNormal2(u32*); + u32 getMsgNormal2(); +#if VERSION != VERSION_DEMO + u32 setRupeeSizeMsg(); +#endif + bool existUnknownCollectMap(); + int analysisCollectMap(); + bool existKnownCollectMap(); + u16 next_msgStatusWhite(u32*); + u32 getMsgWhite(); + u16 next_msgStatusRed(u32*); + u32 setFinishMsg(); + u32 getMsgRed(); + bool checkMonumentFee(u16, u16); + bool checkAllMonumentFee(); +#if VERSION == VERSION_DEMO + bool checkOneMonumentGet(); +#endif + int checkAllMonumentPay(); + bool checkMonumentPay(u16, u16); void cutProc(); void cutSitToJumpStart(int); void cutSitToJumpProc(int); @@ -101,15 +212,78 @@ public: void cutPayProc(int); public: - /* Place member variables here */ -}; - -class daNpc_Tc_HIO_c { -public: - daNpc_Tc_HIO_c(); - -public: - /* Place member variables here */ -}; - + /* 0x6C4 */ u8 field_0x6C4[0x6C8 - 0x6C4]; + /* 0x6C8 */ BOOL field_0x6C8; + /* 0x6CC */ u8 mJtbtTimer; + /* 0x6CD */ u8 mTalk01Wait01Timer; + /* 0x6CE */ u8 mTalk01Talk02Timer; + /* 0x6CF */ s8 mStatus; + /* 0x6D0 */ ActionFunc mCurrActionFunc; + /* 0x6DC */ s8 mActionStatus; + /* 0x6DD */ u8 field_0x6DD[0x6E0 - 0x6DD]; + /* 0x6E0 */ cXyz mSmokePos; + /* 0x6EC */ csXyz mSmokeAngle; + /* 0x6F2 */ u8 field_0x6F2[0x6F4 - 0x6F2]; + /* 0x6F4 */ dPa_smokeEcallBack mSmokeCallBack; + /* 0x714 */ dPa_followEcallBack field_0x714; + /* 0x728 */ dPa_followEcallBack field_0x728; + /* 0x73C */ request_of_phase_process_class mPhs; + /* 0x744 */ u32 mShadowId; +#if VERSION == VERSION_DEMO + /* 0x748 */ J3DModel* mpModel; +#endif + /* 0x748 */ J3DAnmTexPattern* m_head_tex_pattern; + /* 0x74C */ mDoExt_btpAnm mBtpAnm; + /* 0x760 */ u8 mBlinkFrame; + /* 0x761 */ u8 field_0x761[0x762 - 0x761]; + /* 0x762 */ s16 mBlinkTimer; + /* 0x764 */ cXyz mEyePos; + /* 0x770 */ cXyz mAttPos; + /* 0x77C */ u8 mAttnSetCount; + /* 0x77D */ u8 field_0x77D[0x780 - 0x77D]; + /* 0x780 */ cXyz mStoolLookPos; + /* 0x78C */ s16 mMaxHeadTurnVelocity; + /* 0x78E */ u8 field_0x78E[0x790 - 0x78E]; + /* 0x790 */ csXyz field_0x790; + /* 0x796 */ u8 field_0x796[0x798 - 0x796]; + /* 0x798 */ s8 field_0x798; + /* 0x799 */ u8 field_0x799[0x79C - 0x799]; + /* 0x79C */ f32 mTargetSpeed; + /* 0x7A0 */ cXyz mStoolPos; + /* 0x7AC */ cXyz mSitPos; + /* 0x7B8 */ cXyz mWalkToStoolPos; + /* 0x7C4 */ cXyz mDeltaPos; + /* 0x7D0 */ u8 field_0x7D0[0x7DC - 0x7D0]; + /* 0x7DC */ cXyz mParticlePos; + /* 0x7E8 */ bool mHasAttention; + /* 0x7E9 */ bool mTalkingNearJail; + /* 0x7EA */ u8 field_0x7EA[0x7F1 - 0x7EA]; + /* 0x7F1 */ bool mHasTalkedNearJail; + /* 0x7F2 */ bool mHasEnteredSitRadius; + /* 0x7F3 */ s8 mJumpLandingTimer; + /* 0x7F4 */ u8 field_0x7F4[0x7F6 - 0x7F4]; + /* 0x7F6 */ s8 mTexPatternNum; + /* 0x7F7 */ s8 mTexPatternNumIdx; + /* 0x7F8 */ s8 mBckIdx; + /* 0x7F9 */ s8 mAnmPrmIdx; + /* 0x7FA */ s8 mOldAnmPrmIdx; + /* 0x7FB */ s8 mEventIdx; + /* 0x7FC */ u8 mType; + /* 0x7FD */ u8 field_0x7FD[0x804 - 0x7FD]; + /* 0x804 */ daObjSmplbg::Act_c* m_tower_actor; + /* 0x808 */ bool field_0x808; + /* 0x809 */ bool field_0x809; + /* 0x80A */ u8 field_0x80A[0x80B - 0x80A]; + /* 0x80B */ bool field_0x80B; + /* 0x80C */ u8 field_0x80C; + /* 0x80D */ bool field_0x80D; + /* 0x80E */ bool field_0x80E; + /* 0x80F */ bool field_0x80F; + /* 0x810 */ bool field_0x810; + /* 0x811 */ bool field_0x811; + /* 0x812 */ bool field_0x812; + /* 0x813 */ bool field_0x813; + /* 0x814 */ bool field_0x814; + /* 0x815 */ u8 field_0x815[0x81C - 0x815]; +}; // Size: 0x81C #endif /* D_A_NPC_TC_H */ diff --git a/include/d/actor/d_a_obj_smplbg.h b/include/d/actor/d_a_obj_smplbg.h index 138e71133..9fee21479 100644 --- a/include/d/actor/d_a_obj_smplbg.h +++ b/include/d/actor/d_a_obj_smplbg.h @@ -33,9 +33,9 @@ namespace daObjSmplbg { static const Attr_c M_attr[]; inline const Attr_c& attr() const { return M_attr[mType]; } - void isStop() {} - void offStop() {} - void onStop() {} + bool isStop() { return mIsStop; } + void offStop() { mIsStop = false; } + void onStop() { mIsStop = true; } int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W , PRM_TYPE_S);} virtual BOOL CreateHeap(); @@ -53,7 +53,7 @@ namespace daObjSmplbg { /* 0x2C8 */ request_of_phase_process_class mPhs; /* 0x2D0 */ J3DModel* mpModel; /* 0x2D4 */ int mType; - /* 0x2D8 */ u8 field_0x2D8; + /* 0x2D8 */ bool mIsStop; /* 0x2D9 */ u8 field_0x2D9[0x2DC - 0x2D9]; }; // Size: 0x2DC }; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 7209c51c6..69f2e1f8f 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1108,6 +1108,10 @@ inline BOOL dComIfGs_isCollectMapTriforce(int i_no) { return g_dComIfG_gameInfo.save.getPlayer().getMap().isTriforce(i_no - 1); } +inline void dComIfGs_onCollectMapTriforce(int i_no) { + g_dComIfG_gameInfo.save.getPlayer().getMap().onTriforce(i_no -1); +} + inline void dComIfGs_offCollectMapTriforce(int i_no) { g_dComIfG_gameInfo.save.getPlayer().getMap().offTriforce(i_no - 1); } diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 6db4ab716..be3d14419 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -161,6 +161,10 @@ public: return mpEvtStaffName; } + int getNowCut() { + return mCurActIdx; + } + bool getAttnFlag() { return mbAttention; } @@ -169,6 +173,14 @@ public: mbAttention = flag; } + void setAttnNoTurnFlag(bool flag) { + mbNoTurn = flag; + } + + f32 getMoveSpeed() { + return mSpeed; + } + cXyz getAttnPos() { return mPos; } diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 340fa1341..5f677ad68 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -126,10 +126,10 @@ enum { /* 0x76 */ DSNAP_TYPE_UNK76, /* 0x77 */ DSNAP_TYPE_UNK77, /* 0x78 */ DSNAP_TYPE_UNK78, - /* 0x79 */ DSNAP_TYPE_UNK79, - /* 0x7A */ DSNAP_TYPE_UNK7A, - /* 0x7B */ DSNAP_TYPE_UNK7B, - /* 0x7C */ DSNAP_TYPE_UNK7C, + /* 0x79 */ DSNAP_TYPE_TC_NORMAL, + /* 0x7A */ DSNAP_TYPE_TC_RED, + /* 0x7B */ DSNAP_TYPE_TC_BLUE, + /* 0x7C */ DSNAP_TYPE_TC_WHITE, /* 0x7D */ DSNAP_TYPE_UNK7D, /* 0x7E */ DSNAP_TYPE_ROTEN, /* 0x7F */ DSNAP_TYPE_UNK7F, diff --git a/include/m_Do/m_Do_ext.h b/include/m_Do/m_Do_ext.h index 012abe0d3..d0e433d55 100644 --- a/include/m_Do/m_Do_ext.h +++ b/include/m_Do/m_Do_ext.h @@ -370,7 +370,7 @@ public: void changeAnm(J3DAnmTransform* bckAnm) { mpAnm = bckAnm; } J3DAnmTransform* getAnm() { return mpAnm; } f32 getMorfRatio() { return mCurMorf; } - BOOL isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); } + bool isLoop() { return mFrameCtrl.checkState(J3DFrameCtrl::STATE_LOOP_E); } BOOL isMorf() { return mCurMorf < 1.0f; } private: diff --git a/src/d/actor/d_a_npc_tc.cpp b/src/d/actor/d_a_npc_tc.cpp index bdc2b59ab..9797facad 100644 --- a/src/d/actor/d_a_npc_tc.cpp +++ b/src/d/actor/d_a_npc_tc.cpp @@ -8,300 +8,1930 @@ #include "m_Do/m_Do_ext.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_tc.h" +#include "d/d_s_play.h" +#include "d/d_snap.h" +#include "d/actor/d_a_obj_smplbg.h" +#include "d/d_lib.h" + + +#if VERSION == VERSION_DEMO +static f32 lbl_285_data_1C[] = { + 0.0f, + 2.125f, + 0.0f, + 1.75f, + 0.0f +}; +#endif + +class daNpc_Tc_HIO_c : public mDoHIO_entry_c{ +public: + daNpc_Tc_HIO_c(); + virtual ~daNpc_Tc_HIO_c() {} + + void genMessage(JORMContext* ctx) {} + +public: + /* 0x04 */ dNpc_HIO_c mNpc; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ u8 field_0x34; + /* 0x35 */ u8 field_0x35[0x38 - 0x35]; + /* 0x38 */ f32 field_0x38; + /* 0x3C */ f32 field_0x3C; + /* 0x40 */ f32 field_0x40; + /* 0x44 */ bool field_0x44; + /* 0x45 */ u8 field_0x45[0x48 - 0x45]; + /* 0x48 */ f32 field_0x48; + /* 0x4C */ f32 field_0x4C; + /* 0x50 */ f32 field_0x50; + /* 0x54 */ f32 field_0x54; + /* 0x58 */ f32 field_0x58; + /* 0x5C */ f32 field_0x5C; + /* 0x60 */ cXyz field_0x60; + /* 0x6C */ cXyz field_0x6C; + /* 0x78 */ s16 field_0x78; + /* 0x7A */ s16 field_0x7A; + /* 0x7C */ u8 field_0x7C; + /* 0x7D */ u8 field_0x7D; + /* 0x7E */ u8 field_0x7E; + /* 0x7F */ u8 field_0x7F[8]; + /* 0x87 */ u8 field_0x87[8]; + /* 0x8F */ u8 field_0x8F; + /* 0x90 */ u8 field_0x90; + /* 0x91 */ u8 field_0x91; + /* 0x92 */ u8 field_0x92; + /* 0x93 */ u8 field_0x93; + /* 0x94 */ f32 field_0x94[24]; +}; // Size: 0xF4 + +static daNpc_Tc_HIO_c l_HIO; + +#include "d/actor/d_a_npc_tc_msg_normal2.inc" + +#include "d/actor/d_a_npc_tc_msg_white.inc" + +#include "d/actor/d_a_npc_tc_msg_red.inc" /* 000000EC-00000394 .text __ct__14daNpc_Tc_HIO_cFv */ daNpc_Tc_HIO_c::daNpc_Tc_HIO_c() { - /* Nonmatching */ + field_0x60.set(-100.0f, 1700.0f, -50.0f); + field_0x6C.set(100.0f, 1700.0f, 50.0f); + + field_0x7A = 0; + field_0x78 = -0x8000; + field_0x7C = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80); + field_0x7D = dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20); + field_0x7E = dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708); + + for (int i = 0; i < 8; i++) { + field_0x87[i] = dComIfGs_isGetCollectMap(i+1); + } + + for (int i = 0; i < 8; i++) { + field_0x7F[i] = dComIfGs_isCollectMapTriforce(i+1); + } + + field_0x8F = dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xf); + field_0x90 = dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xf); + field_0x91 = dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xf); + field_0x92 = dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xf); + field_0x93 = dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xf); + + mNpc.m04 = -20.0f; + mNpc.mMaxHeadX = 0x1FFE; + mNpc.mMaxHeadY = 10000; + mNpc.mMaxBackboneX = 0; + mNpc.mMaxBackboneY = 0x1C70; + mNpc.mMinHeadX = -0x9C4; + mNpc.mMinHeadY = -10000; + mNpc.mMinBackboneX = 0; + mNpc.mMinBackboneY = -0x1C70; + mNpc.mMaxTurnStep = 3000; + mNpc.mMaxHeadTurnVel = 0x800; + mNpc.mAttnYOffset = 65.0f; + mNpc.mMaxAttnAngleY = 0x4000; + mNpc.m22 = 0; + mNpc.mMaxAttnDistXZ = 400.0f; + + field_0x2C = 900.0f; + field_0x30 = 400.0f; + field_0x34 = 0; + field_0x38 = 20.0f; + field_0x40 = 14.0f; + field_0x3C = -2.5f; + field_0x48 = -25.0f; + field_0x50 = 8.0f; + field_0x4C = -2.5f; + field_0x54 = 0.35f; + field_0x58 = 4.0f; + field_0x5C = 8.0f; + field_0x94[0] = 0.0f; + field_0x94[1] = 8.0f; + field_0x94[2] = 8.0f; + field_0x94[3] = 5.0f; + field_0x94[4] = 8.0f; + field_0x94[5] = 4.0f; + field_0x94[6] = 0.0f; + field_0x94[7] = 6.0f; + field_0x94[8] = 6.0f; + field_0x94[9] = 0.0f; + field_0x94[10] = 8.0f; + field_0x94[11] = 8.0f; + field_0x94[12] = 8.0f; + field_0x94[13] = 8.0f; + field_0x94[14] = 8.0f; + field_0x94[15] = 8.0f; + field_0x94[16] = 8.0f; + field_0x94[17] = 8.0f; + field_0x94[18] = 8.0f; + field_0x94[19] = 8.0f; + field_0x94[20] = 8.0f; + field_0x94[21] = 8.0f; + field_0x94[23] = 8.0f; + field_0x94[22] = 8.0f; } +static const int l_btp_ix_tbl[] = { + TC_BTP_MABA01 +}; + /* 000003D0-0000059C .text nodeCallBack__FP7J3DNodei */ -static BOOL nodeCallBack(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack(J3DNode* node, int calcTiming) { + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)node; + daNpc_Tc_c* i_this = (daNpc_Tc_c*)model->getUserArea(); + + if(i_this != NULL) { + s32 jntNo = joint->getJntNo(); + mDoMtx_stack_c::copy(model->getAnmMtx(jntNo)); + if(jntNo == i_this->m_jnt.getHeadJntNum()) { + static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f); + static cXyz l_offsetEyePos(24.0f, -16.0f, 0.0f); + mDoMtx_stack_c::multVec(&l_offsetAttPos, &i_this->getAttentionBasePos()); + mDoMtx_stack_c::YrotM(-i_this->m_jnt.getHead_y()); + mDoMtx_stack_c::ZrotM(-i_this->m_jnt.getHead_x()); + mDoMtx_stack_c::multVec(&l_offsetEyePos, &i_this->getEyePos()); + i_this->incAttnSetCount(); + } else if(jntNo == i_this->m_jnt.getBackboneJntNum()) { + mDoMtx_stack_c::XrotM((int)i_this->m_jnt.getBackbone_y()); + mDoMtx_stack_c::ZrotM((int)i_this->m_jnt.getBackbone_x()); + } + cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); + } + } + return TRUE; } /* 0000059C-000005C8 .text searchTower_CB__FPvPv */ -void searchTower_CB(void*, void*) { - /* Nonmatching */ +static void* searchTower_CB(void* i_actor, void* i_this) { + return static_cast(i_this)->_searchTower(static_cast(i_actor)); } /* 000005C8-00000630 .text _searchTower__10daNpc_Tc_cFP10fopAc_ac_c */ -void daNpc_Tc_c::_searchTower(fopAc_ac_c*) { - /* Nonmatching */ +fopAc_ac_c* daNpc_Tc_c::_searchTower(fopAc_ac_c* i_actor) { + if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Obj_Smplbg && ((daObjSmplbg::Act_c*)i_actor)->prm_get_type() == 0) { + return i_actor; + } + return NULL; } + + /* 00000630-00000744 .text initTexPatternAnm__10daNpc_Tc_cFb */ -void daNpc_Tc_c::initTexPatternAnm(bool) { - /* Nonmatching */ +BOOL daNpc_Tc_c::initTexPatternAnm(bool param_1) { + J3DModelData* modeldata = mpMorf->getModel()->getModelData(); + + m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Tc", l_btp_ix_tbl[mTexPatternNum]); + JUT_ASSERT(0x188, m_head_tex_pattern != NULL); + + if(mBtpAnm.init(modeldata, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, param_1, FALSE) == FALSE) { + return FALSE; + } + mBlinkFrame = 0; + mBlinkTimer = 0; + return TRUE; } /* 00000744-000007D0 .text playTexPatternAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::playTexPatternAnm() { - /* Nonmatching */ + if (cLib_calcTimer(&mBlinkTimer) == 0) { + if (mBlinkFrame >= m_head_tex_pattern->getFrameMax()) { + mBlinkFrame -= m_head_tex_pattern->getFrameMax(); + mBlinkTimer = cM_rndF(100.0f) + 30.0f; + } else { + mBlinkFrame++; + } + } } /* 000007D0-00000948 .text smoke_set__10daNpc_Tc_cFfffff */ -void daNpc_Tc_c::smoke_set(float, float, float, float, float) { - /* Nonmatching */ +void daNpc_Tc_c::smoke_set(f32 i_rate, f32 i_spread, f32 i_initialVelOmni, f32 i_initialVelAxis, f32 i_initialVelDir) { + static JGeometry::TVec3 smoke_scale(1.0f, 1.0f, 1.0); + if(mSmokeCallBack.getEmitter() == NULL) { + dComIfGp_particle_setToon(dPa_name::ID_COMMON_2022, &mSmokePos, &mSmokeAngle, NULL, 0xB9, &mSmokeCallBack, fopAcM_GetRoomNo(this)); + } + + if(mSmokeCallBack.getEmitter() != NULL) { + mSmokeCallBack.getEmitter()->setRate(i_rate); + mSmokeCallBack.getEmitter()->setSpread(i_spread); + mSmokeCallBack.getEmitter()->setAwayFromCenterSpeed(i_initialVelOmni); + mSmokeCallBack.getEmitter()->setAwayFromAxisSpeed(i_initialVelAxis); + mSmokeCallBack.getEmitter()->setDirectionalSpeed(i_initialVelDir); + mSmokeCallBack.getEmitter()->setGlobalScale(smoke_scale); + } } /* 00000948-00001168 .text setAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::setAnm() { + static const int a_anm_bck_tbl[] = { + TC_BCK_WAIT01, + TC_BCK_WAIT03, + TC_BCK_WAIT02, + TC_BCK_TALK01, + TC_BCK_WALK01, + TC_BCK_JAMP_A, + TC_BCK_JAMP_B, + TC_BCK_JAMP_C, + TC_BCK_GUARD, + TC_BCK_JTBT, + TC_BCK_HAPPY, + TC_BCK_DANCE01, + TC_BCK_DANCE02, + TC_BCK_GET, + TC_BCK_MAWASU, + TC_BCK_WAIT04, + TC_BCK_TALK02, + }; + + dLib_anm_prm_c a_anm_prm_tbl[24] = { + { + /* mBckIdx */ -1, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 0.0f, + /* mPlaySpeed */ 0.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_WAIT01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT03, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_JAMP_A, + /* mNextPrmIdx */ ANM_PRM_IDX_JAMP_B, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_B, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 6.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_C, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 6.0f, + /* mPlaySpeed */ 0.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_JAMP_C, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_GUARD, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_JTBT, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_HAPPY, + /* mNextPrmIdx */ ANM_PRM_IDX_HAPPY2, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_GET, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_HAPPY, + /* mNextPrmIdx */ ANM_PRM_IDX_TALK01, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE01, + /* mNextPrmIdx */ ANM_PRM_IDX_TALK01, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_DANCE02, + /* mNextPrmIdx */ ANM_PRM_IDX_WAIT03, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_NONE + }, + { + /* mBckIdx */ BCK_IDX_MAWASU, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_WAIT04, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK02, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + { + /* mBckIdx */ BCK_IDX_TALK01, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::EMode_LOOP + }, + }; + + if (mAnmPrmIdx == ANM_PRM_IDX_TALK01_WAIT01) { + if (mpMorf->isLoop()) { + mTalk01Wait01Timer++; + if(mTalk01Wait01Timer >= 3) { + mTalk01Wait01Timer = 0; + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } + } else { + mTalk01Wait01Timer = 0; + } + + if (mAnmPrmIdx == ANM_PRM_IDX_TALK01_TALK02) { + if (mpMorf->isLoop()) { + mTalk01Talk02Timer++; + if(mTalk01Talk02Timer >= 5) { + mTalk01Talk02Timer = 0; + mAnmPrmIdx = ANM_PRM_IDX_TALK02; + } + } + } else { + mTalk01Talk02Timer = 0; + } + + if (mAnmPrmIdx == ANM_PRM_IDX_JTBT) { + if (mpMorf->isLoop()) { + mJtbtTimer++; + if(mJtbtTimer >= 4) { + mJtbtTimer = 0; + mAnmPrmIdx = ANM_PRM_IDX_TALK01; + } + } + } else { + mJtbtTimer = 0; + } + + for (int i = 0; i < 24; i++) { + a_anm_prm_tbl[i].mMorf = l_HIO.field_0x94[i]; + } + +#if VERSION != VERSION_DEMO + if (mBckIdx == BCK_IDX_MAWASU && (int)mpMorf->getFrame() == 1) { + if(mType == TYPE_RED) { + fopAcM_monsSeStart(this, JA_SE_CV_TC_B_PUSH_BAR, 0); + } else if(mType == TYPE_WHITE) { + fopAcM_monsSeStart(this, JA_SE_CV_TC_T_PUSH_BAR, 0); + } + } +#endif + + if (mBckIdx == BCK_IDX_JAMP_C) { + if (mpMorf->getFrame() == 1.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(10.0f, 0.25f, 0.0f, 2.0f, 15.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mBckIdx == BCK_IDX_DANCE01) { + mParticlePos.setall(0.0f); + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(11)); + mDoMtx_stack_c::multVec(&mParticlePos, &mParticlePos); + cXyz pos; + + pos.setall(1.0f); + + if (mpMorf->getFrame() == 1.0f) { + dComIfGp_particle_set(dPa_name::ID_SCENE_8189, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818A, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818B, ¤t.pos, ¤t.angle, &pos); + dComIfGp_particle_set(dPa_name::ID_SCENE_818C, &mParticlePos, NULL, NULL, 0xff, &field_0x714, fopAcM_GetRoomNo(this)); + dComIfGp_particle_set(dPa_name::ID_SCENE_818D, &mParticlePos, NULL, NULL, 0xff, &field_0x728, fopAcM_GetRoomNo(this)); + } + + if (mpMorf->getFrame() == 88.0f) { + f32 sin = cM_ssin(current.angle.y); + f32 cos = cM_scos(current.angle.y); + + cXyz tempPos(current.pos.x + sin * 10.0f, current.pos.y, current.pos.z + cos * 10.0f); + mSmokePos = tempPos; + mSmokeAngle = current.angle; + + smoke_set(5.0f, 0.25f, 0.0f, 10.0f, 1.0f); + } else if (mpMorf->getFrame() == 143.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(10.0f, 0.25f, 0.0f, 15.0f, 1.0f); + } else { + mSmokeCallBack.end(); + } + if (mpMorf->getFrame() == 178.0f) { + field_0x714.end(); + field_0x728.end(); + } + } + + if (mBckIdx == BCK_IDX_JTBT) { + if (mpMorf->getFrame() == 0.0f || mpMorf->getFrame() == 12.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 1.0f, 10.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mBckIdx == BCK_IDX_HAPPY) { + if (mpMorf->getFrame() == 24.0f) { + mSmokePos = current.pos; + mSmokeAngle = current.angle; + smoke_set(4.0f, 0.25f, 0.0f, 2.0f, 10.0f); + } else { + mSmokeCallBack.end(); + } + } + + if (mOldAnmPrmIdx != mAnmPrmIdx) { + if (mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + cXyz particlePos(current.pos); + particlePos.y -= 80.0f; + cXyz particleScale; + particleScale.setall(1.0f); + + JPABaseEmitter* pEmitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8152, &particlePos, NULL, &particleScale); + + pEmitter->setGlobalParticleScale(0.62f, 0.6f); + fopAcM_seStart(this, JA_SE_CM_CMN_NOTICE, 0); // regswap for demo likely happens here, daNpc_Tc_c::cutEffectStart also has a regswap with identical code + } + mSmokeCallBack.end(); + } + dLib_bcks_setAnm("Tc", mpMorf, &mBckIdx, &mAnmPrmIdx, &mOldAnmPrmIdx, a_anm_bck_tbl, a_anm_prm_tbl, false); /* Nonmatching */ } /* 00001168-000011C0 .text setTexAnm__10daNpc_Tc_cFv */ void daNpc_Tc_c::setTexAnm() { - /* Nonmatching */ + static s8 a_tex_pattern_num_tbl[2] = { + 0xFF, + 0x00, + }; + + s8 texPatternNum = a_tex_pattern_num_tbl[mTexPatternNumIdx]; + if (texPatternNum != mTexPatternNum && texPatternNum != -1) { + mTexPatternNum = texPatternNum; + initTexPatternAnm(true); + } } /* 000011C0-0000136C .text chkAttention__10daNpc_Tc_cF4cXyzs */ -void daNpc_Tc_c::chkAttention(cXyz, short) { - /* Nonmatching */ +bool daNpc_Tc_c::chkAttention(cXyz param_1, s16 param_2) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + f32 maxAttnDist = l_HIO.mNpc.mMaxAttnDistXZ; + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + maxAttnDist = l_HIO.mNpc.mMaxAttnDistXZ; + maxAttnDist *= 0.5f; + break; + } + + if (mStatus == STATUS_WALK_TO_JAIL || mStatus == STATUS_JUMP || mStatus == STATUS_SIT) { + maxAttnDist = l_HIO.field_0x2C; + } + + int maxAttnAngleY = l_HIO.mNpc.mMaxAttnAngleY; + cXyz temp; + temp.x = player->current.pos.x - param_1.x; + temp.z = player->current.pos.z - param_1.z; + f32 temp2 = std::sqrtf(temp.x * temp.x + temp.z * temp.z); + s16 temp3 = cM_atan2s(temp.x, temp.z); + + if (mHasAttention) { + maxAttnDist += 40.0f; + maxAttnAngleY += 0x71C; + } + + temp3 -= param_2; + return maxAttnAngleY > abs(temp3) && maxAttnDist > temp2; } +#include "d/actor/d_a_npc_tc_cut.inc" + /* 0000136C-00001424 .text eventOrder__10daNpc_Tc_cFv */ void daNpc_Tc_c::eventOrder() { - /* Nonmatching */ + static char* a_demo_name_tbl[] = { + "TC_JUMP_DEMO", + "TC_RESCUE", + "TC_TALK_NEAR_JAIL", + "TC_TALK_NEAR_JAIL_S", + "TC_TALK_NEAR_JAIL2", + "TC_GET_RUPEE", + "TC_PAY_RUPEE" + }; + + + if (mEventIdx == 1 || mEventIdx == 2) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if (mEventIdx == 1) { + fopAcM_orderSpeakEvent(this); + } + } else if (mEventIdx == 8 || mEventIdx == 9) { + fopAcM_orderOtherEvent(this, a_demo_name_tbl[mEventIdx - 3], 0x14F); + } + else if (mEventIdx >= 3) { + fopAcM_orderOtherEvent(this, a_demo_name_tbl[mEventIdx - 3]); + } } /* 00001424-00001470 .text checkOrder__10daNpc_Tc_cFv */ void daNpc_Tc_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + mEventIdx = 0; + return; + } + + if (eventInfo.mCommand != dEvtCmd_INTALK_e) { + return; + } + + if (mEventIdx != 1 && mEventIdx != 2) { + return; + } + mEventIdx = 0; + mTalkingNearJail = true; } /* 00001470-000014FC .text existTcMonument__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existTcMonument() { - /* Nonmatching */ +bool daNpc_Tc_c::existTcMonument() { + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) + || dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF) + || dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF)) { + return true; + } + return false; } /* 000014FC-0000156C .text anmAtr__10daNpc_Tc_cFUs */ -void daNpc_Tc_c::anmAtr(unsigned short) { - /* Nonmatching */ +void daNpc_Tc_c::anmAtr(u16 i_msgStatus) { + static const s8 anm_atr[] = { + ANM_PRM_IDX_WAIT01, + ANM_PRM_IDX_WAIT02, + ANM_PRM_IDX_WAIT03, + ANM_PRM_IDX_TALK01, + ANM_PRM_IDX_GUARD, + ANM_PRM_IDX_JTBT, + ANM_PRM_IDX_HAPPY, + ANM_PRM_IDX_DANCE01, + ANM_PRM_IDX_DANCE02, + ANM_PRM_IDX_HAPPY2, + ANM_PRM_IDX_DANCE02_TO_WAIT03, + ANM_PRM_IDX_DANCE01_TO_TALK01, + ANM_PRM_IDX_TALK01_WAIT01, + ANM_PRM_IDX_TALK01_TALK02, + ANM_PRM_IDX_TALK02, + ANM_PRM_IDX_WAIT04 + }; + + switch (i_msgStatus) { + case fopMsgStts_MSG_TYPING_e: + if(field_0x6C8) { + return; + } + u8 msgAnmAtr = dComIfGp_getMesgAnimeAttrInfo(); + field_0x6C8 = TRUE; + if(anm_atr[msgAnmAtr] == ANM_PRM_IDX_HAPPY2 && mAnmPrmIdx == ANM_PRM_IDX_TALK01) { + return; + } + mAnmPrmIdx = anm_atr[msgAnmAtr]; + break; + + case fopMsgStts_MSG_DISPLAYED_e: + field_0x6C8 = FALSE; + break; + } } /* 0000156C-00001618 .text stopTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::stopTower() { - /* Nonmatching */ + JUT_ASSERT(VERSION_SELECT(0x3F5, 0x3F4, 0x3F4, 0x3F4), m_tower_actor != NULL); + + daObjSmplbg::Act_c* tower = m_tower_actor; + switch (mType) { + case TYPE_RED: + case TYPE_WHITE: + m_jnt.offHeadLock(); + mAnmPrmIdx = ANM_PRM_IDX_WAIT04; + tower->onStop(); + break; + case TYPE_NORMAL2: + tower->onStop(); + break; + } } /* 00001618-000017A4 .text startTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::startTower() { - /* Nonmatching */ + JUT_ASSERT(VERSION_SELECT(0x408, 0x407, 0x407, 0x407), m_tower_actor != NULL); + daObjSmplbg::Act_c* tower = m_tower_actor; + + cXyz temp; + s16 temp2; + switch(mType) { + case TYPE_WHITE: + temp = l_HIO.field_0x60; + temp2 = l_HIO.field_0x7A; + break; + case TYPE_RED: + temp = l_HIO.field_0x6C; + temp2 = l_HIO.field_0x78; + break; + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + m_jnt.onHeadLock(); + mDoMtx_stack_c::transS(m_tower_actor->current.pos); + mDoMtx_stack_c::ZXYrotM(m_tower_actor->shape_angle); + temp2 = m_tower_actor->shape_angle.y + temp2; + cLib_addCalcAngleS2(¤t.angle.y, temp2, 4, 0x400); + if(cLib_distanceAngleS(current.angle.y, temp2) < 0x600) { + tower->offStop(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + } + break; + default: + tower->offStop(); + break; + } } /* 000017A4-00001900 .text next_msgStatusBlue__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusBlue(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatusBlue(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { + case 0xDDD: + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF) || dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF)) { + *pMsgNo = 0xDDE; + } else { + *pMsgNo = 0xDF9; + } + break; + case 0xDDE: + *pMsgNo = 0xDDF; + break; + case 0xDDF: + *pMsgNo = 0xDE0; + break; + case 0xDF9: + *pMsgNo = 0xDFA; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; } /* 00001900-00001AEC .text next_msgStatusNormal__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusNormal(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatusNormal(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch(*pMsgNo) { + case 0x10CD: + *pMsgNo = 0x10CE; + break; + case 0x10DF: + *pMsgNo = 0x10CE; + break; + case 0x10CE: + *pMsgNo = 0x10CF; + break; + case 0x10CF: + *pMsgNo = 0x10D0; + break; + case 0x10D0: + *pMsgNo = 0x10D1; + break; + case 0x10D1: + *pMsgNo = 0x10D2; + break; + case 0x10D3: + *pMsgNo = 0x10D2; + break; + case 0x10D4: + *pMsgNo = 0x10D5; + break; + case 0x10D5: + *pMsgNo = 0x10D6; + break; + case 0x10D6: + *pMsgNo = 0x10D7; + break; + case 0x10D7: + *pMsgNo = 0x10D8; + break; + case 0x10D9: + *pMsgNo = 0x10D8; + break; + case 0x10DA: + *pMsgNo = 0x10DB; + break; + case 0x10DB: + *pMsgNo = 0x10DC; + break; + case 0x10DD: + *pMsgNo = 0x10DE; + break; + case 0xDAD: + *pMsgNo = 0xDAE; + break; + case 0xDAF: + *pMsgNo = 0xDB0; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; } /* 00001AEC-00001B64 .text next_msgStatus__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tc_c::next_msgStatus(u32* pMsgNo) { + u16 msg; + switch(mType) { + case TYPE_NORMAL: + msg = next_msgStatusNormal(pMsgNo); + break; + case TYPE_NORMAL2: + msg = next_msgStatusNormal2(pMsgNo); + break; + case TYPE_BLUE: + msg = next_msgStatusBlue(pMsgNo); + break; + case TYPE_RED: + msg = next_msgStatusRed(pMsgNo); + break; + case TYPE_WHITE: + msg = next_msgStatusWhite(pMsgNo); + break; + default: + msg = fopMsgStts_MSG_ENDS_e; + break; + } + return msg; } /* 00001B64-00001B88 .text setFirstMsg__10daNpc_Tc_cFPbUlUl */ -void daNpc_Tc_c::setFirstMsg(bool*, unsigned long, unsigned long) { - /* Nonmatching */ +u32 daNpc_Tc_c::setFirstMsg(bool* param_1, u32 param_2, u32 param_3) { + if (!*param_1) { + *param_1 = true; + } else { + param_2 = param_3; + } + return param_2; } /* 00001B88-00001BE0 .text getMsgNormal__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgNormal() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsgNormal() { + u32 msg; + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40)) { + msg = 0x10D3; + mHasTalkedNearJail = true; + } else { + msg= 0x10D9; + } + return msg; } /* 00001BE0-00001BE8 .text getMsgBlue__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgBlue() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsgBlue() { + return 0xDDD; } /* 00001BE8-00001C74 .text getMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Tc_c::getMsg() { + u32 msg = 0; + switch(mType) { + case TYPE_NORMAL: + msg = getMsgNormal(); + break; + case TYPE_NORMAL2: + msg = getMsgNormal2(); + break; + case TYPE_BLUE: + msg = getMsgBlue(); + break; + case TYPE_RED: + msg = getMsgRed(); + break; + case TYPE_WHITE: + msg = getMsgWhite(); + break; + } + return msg; } /* 00001C74-00001C98 .text getArg__10daNpc_Tc_cFv */ void daNpc_Tc_c::getArg() { - /* Nonmatching */ + mType = fopAcM_GetParam(this) & 0xf; + if(mType != 0xF) { + return; + } + mType = TYPE_NORMAL; } +extern dCcD_SrcCyl dNpc_cyl_src; /* 00001C98-0000202C .text createInit__10daNpc_Tc_cFv */ void daNpc_Tc_c::createInit() { - /* Nonmatching */ +#if VERSION != VERSION_DEMO + if (mType == TYPE_NORMAL) { + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + } +#endif + field_0x790 = current.angle; + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + mAttPos.set(current.pos); + mEyePos.set(current.pos); +#if VERSION == VERSION_DEMO + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); +#endif + mStts.Init(0xFE, 0xFE, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + mHasTalkedNearJail = false; + mTexPatternNumIdx = 1; + switch (mType) { + case TYPE_NORMAL: + mAnmPrmIdx = ANM_PRM_IDX_WAIT02; + fopAcM_Search(&searchStoolPos, this); + if (setAction(&daNpc_Tc_c::help_action, NULL)) { + gravity = 0.0f; + mAcchCir.SetWall(60.0f, 50.0f); + } + + break; + case TYPE_BLUE: + case TYPE_NORMAL2: + gravity = -9.0f; + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + if (setAction(&daNpc_Tc_c::wait_action, NULL)) { + mAcchCir.SetWall(60.0f, 50.0f); + } + break; + case TYPE_RED: + case TYPE_WHITE: + gravity = -9.0f; + m_jnt.onHeadLock(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + if (setAction(&daNpc_Tc_c::wait_action, NULL)) { + mAcchCir.SetWall(60.0f, 10.0f); + } + break; + } +#if VERSION != VERSION_DEMO + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), ¤t.angle, &shape_angle); +#endif + mOldAnmPrmIdx = 0; + setTexAnm(); + setAnm(); + set_mtx(); + mpMorf->calc(); + mEventCut.setActorInfo2("Tc", this); } /* 0000202C-000020C4 .text searchStoolPos__10daNpc_Tc_cFPvPv */ -void daNpc_Tc_c::searchStoolPos(void*, void*) { - /* Nonmatching */ +void* daNpc_Tc_c::searchStoolPos(void* i_actor, void* i_this) { + fopAc_ac_c* actor = static_cast(i_actor); + daNpc_Tc_c* a_this = static_cast(i_this); + + dStage_objectNameInf* inf = dStage_searchName("Ostool"); + + if(inf == NULL) { + return NULL; + } + + if(inf->procname == fopAcM_GetProfName(i_actor) && inf->argument == actor->argument) { + a_this->mStoolPos.set(actor->current.pos); + } + return NULL; } /* 000020C4-00002148 .text setAttention__10daNpc_Tc_cFv */ void daNpc_Tc_c::setAttention() { - /* Nonmatching */ + s8 temp = mAnmPrmIdx; + if (temp != ANM_PRM_IDX_WAIT01 && temp != ANM_PRM_IDX_WALK01 && temp != ANM_PRM_IDX_TALK01 && temp != ANM_PRM_IDX_GUARD && + temp != ANM_PRM_IDX_MAWASU && temp != ANM_PRM_IDX_TALK02 && temp != ANM_PRM_IDX_WAIT04) { + return; + } + + eyePos.set(mEyePos.x, mEyePos.y, mEyePos.z); + attention_info.position.set(mAttPos.x, mAttPos.y + l_HIO.mNpc.mAttnYOffset, mAttPos.z); } /* 00002148-00002220 .text calcMove__10daNpc_Tc_cFv */ void daNpc_Tc_c::calcMove() { - /* Nonmatching */ + f32 speed; + if (mAnmPrmIdx != ANM_PRM_IDX_WALK01) { + return; + } + cLib_chaseF(&speedF, mTargetSpeed, 0.1f); + if (mEventCut.getMoveSpeed() != 0.0f) { + switch(mEventCut.getNowCut()) { + case 2: + case 4: + speed = l_HIO.field_0x54 * mEventCut.getMoveSpeed(); + break; + } + } else { + speed = speedF * l_HIO.field_0x54; + } + if(speed < 0.5f) { + speed = 0.5f; + } + mpMorf->setPlaySpeed(speed); } /* 00002220-000024C4 .text lookBack__10daNpc_Tc_cFv */ void daNpc_Tc_c::lookBack() { - /* Nonmatching */ + cXyz temp6; + cXyz temp3(0.0f, 0.0f, 0.0f); + cXyz* dstPos = NULL; + s16 desiredYRot = current.angle.y; + s16 target; + if (mStatus == STATUS_TALK) { + m_jnt.setTrn(); + } + if (mStatus == STATUS_WALK_TO_JAIL || mStatus == STATUS_WAIT_NEAR_JAIL || mStatus == STATUS_SIT) { + m_jnt.setTrn(); + mHasAttention = true; + } + + if (mType == TYPE_WHITE || mType == TYPE_RED) { + if (mStatus == STATUS_WAIT) { + if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + m_jnt.onBackBoneLock(); + m_jnt.clrTrn(); + } + } else if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + m_jnt.onBackBoneLock(); + m_jnt.clrTrn(); + } else { + m_jnt.offBackBoneLock(); + m_jnt.setTrn(); + mHasAttention = true; + } + } + + if (mStatus == 8) { + m_jnt.setTrn(); + temp6 = mStoolLookPos; + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + } else if (mEventCut.getAttnFlag()) { + m_jnt.setTrn(); + temp6 = mEventCut.getAttnPos(); + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + + } else if (mHasAttention){ + temp6 = dNpc_playerEyePos(l_HIO.mNpc.m04); + dstPos = &temp6; + temp3.set(current.pos); + temp3.y = eyePos.y; + } + + if (m_jnt.trnChk()) { + target = l_HIO.mNpc.mMaxHeadTurnVel; + + s16 temp4 = mEventCut.getTurnSpeed(); + if (temp4 != 0) { + target = temp4; + } + cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, target, 4, 0x800); + } else { + mMaxHeadTurnVelocity = 0; + } + m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp3, desiredYRot, mMaxHeadTurnVelocity, false); } /* 000024C4-00002594 .text statusWait__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWait() { - /* Nonmatching */ + if (mType == TYPE_WHITE || mType == TYPE_RED) { + JUT_ASSERT(VERSION_SELECT(0x5FE, 0x601, 0x601, 0x601), m_tower_actor != NULL); + + if (m_tower_actor->isStop()) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT04; + } else { + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + } + } + + if (mTalkingNearJail) { + mStatus = STATUS_TALK; + } else if (mHasAttention) { + mEventIdx = 2; + } } /* 00002594-000026E4 .text statusSit__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusSit() { - /* Nonmatching */ + mSmokeCallBack.end(); + calc_sitpos(); + current.pos.set(mSitPos); + gravity = 0.0f; + + if(mAnmPrmIdx != ANM_PRM_IDX_JAMP_A) { + if(dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x2C, 100.0f)) { + if (!mHasEnteredSitRadius) { + mHasEnteredSitRadius = true; + mEventIdx = 3; + mStatus = STATUS_DEMO_JUMP; + return; + } + mAnmPrmIdx = ANM_PRM_IDX_JAMP_A; + } + } + + if(mpMorf->isStop() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + speedF = l_HIO.field_0x38; + speed.y = l_HIO.field_0x40; + gravity = l_HIO.field_0x3C; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_B; + mStatus = STATUS_JUMP; + } } /* 000026E4-00002798 .text statusJump__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusJump() { - /* Nonmatching */ + if (speed.y <= 0.0f && mAnmPrmIdx == ANM_PRM_IDX_JAMP_B) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C1; + } + + if (mObjAcch.ChkGroundHit() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C1) { + speedF = 0.0f; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C2; + mJumpLandingTimer = 0x33; + return; + } + + if (cLib_calcTimer(&mJumpLandingTimer) == 0 && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C2) { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mStatus = STATUS_WALK_TO_JAIL; + } } /* 00002798-000029B0 .text statusWalkToJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWalkToJail() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + s16 angle = cLib_targetAngleY(¤t.pos, &player->current.pos); + if (mObjAcch.ChkWallHit()) { + if (mTalkingNearJail) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + + if (!mHasTalkedNearJail || l_HIO.field_0x44 != 0) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT03; + dComIfGp_event_reset(); + mStatus = STATUS_DEMO_TALK; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40) == 0) { + if (dComIfGs_getClearCount() != 0) { + mEventIdx = 6; + } else { + mEventIdx = 5; + } + } else { + mEventIdx = 7; + } + + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B40); + mHasTalkedNearJail = true; + return; + + } + mStatus = STATUS_TALK_NEAR_JAIL; + } else if (mHasAttention) { + mEventIdx = 2; + } + } + + if (mObjAcch.ChkWallHit() && std::fabsf(cM_scos(angle)) > 0.9f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + if (speedF == 0.0f) { + speedF = l_HIO.field_0x5C; + } + } + if (mObjAcch.ChkWallHit()) { + if(!dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x30, 100.0f)) { + mStatus = STATUS_WALK_TO_STOOL; + } + } } /* 000029B0-00002A20 .text statusTalkNearJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusTalkNearJail() { - /* Nonmatching */ + mTargetSpeed = 0.0f; + speedF = 0.0f; + if (talk(1) == 0x12) { + mStatus = STATUS_WAIT_NEAR_JAIL; + dComIfGp_event_reset(); + mTalkingNearJail = false; + } } /* 00002A20-00002BD4 .text statusWaitNearJail__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWaitNearJail() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + s16 angle = cLib_targetAngleY(¤t.pos, &player->current.pos); + if (mObjAcch.ChkWallHit()) { + if (mTalkingNearJail) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + + if (!mHasTalkedNearJail || l_HIO.field_0x44 != 0) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT03; + dComIfGp_event_reset(); + mStatus = STATUS_DEMO_TALK; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B40) == 0) { + mEventIdx = 5; + } else { + mEventIdx = 7; + } + + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B40); + mHasTalkedNearJail = true; + return; + + } + mStatus = STATUS_TALK_NEAR_JAIL; + } else if (mHasAttention) { + mEventIdx = 2; + } + } + + if (mObjAcch.ChkWallHit() && std::fabsf(cM_scos(angle)) > 0.9f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + if (speedF == 0.0f) { + speedF = l_HIO.field_0x5C; + } + } } /* 00002BD4-00002D80 .text statusWalkToStool__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusWalkToStool() { - /* Nonmatching */ + calc_sitpos(); + if(dLib_checkPlayerInCircle(current.pos, l_HIO.field_0x30, 100.0f)) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mStatus = STATUS_WALK_TO_JAIL; + } + + } else { + mStoolLookPos.set(mStoolPos); + cLib_targetAngleY(¤t.pos, &mWalkToStoolPos); + cLib_addCalcPosXZ2(¤t.pos, mWalkToStoolPos, 0.1f, speedF); + f32 temp = (mWalkToStoolPos - current.pos).absXZ(); + if(temp < 5.0f) { + mTargetSpeed = 0.0f; + if (speedF == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + mStatus = STATUS_SIT_TO_STOOL; + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + mTargetSpeed = l_HIO.field_0x58; + } + } } /* 00002D80-00002F94 .text statusSitToStool__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusSitToStool() { - /* Nonmatching */ + calc_sitpos(); + cLib_addCalcAngleS2(¤t.angle.y, field_0x790.y, 4, 0x800); + + if (std::fabsf(field_0x790.y - current.angle.y) < 16.0f) { + if (speed.y == 0.0f && mObjAcch.ChkGroundHit()) { + speed.y = 22.0f; + gravity = -2.5f; + } + + if (speed.y < 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT02; + } + + if (speed.y < 0.0f && current.pos.y < mSitPos.y) { + gravity = 0.0f; + speed.y = 0.0f; + current.pos.y = mSitPos.y; + } + + cLib_addCalcPosXZ2(¤t.pos, mSitPos, 0.1f, 4.0f); + f32 diff = (mSitPos - current.pos).absXZ(); + if (current.pos.y == mSitPos.y && diff < 5.0f) { + mSmokePos.set(current.pos); + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 5.0f, 20.0f); + mStatus = STATUS_SIT; + } + } } /* 00002F94-00003028 .text statusTalk__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusTalk() { - /* Nonmatching */ + if(talk(1) != 0x12) { + return; + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + startTower(); + mAnmPrmIdx = ANM_PRM_IDX_MAWASU; + // fallthrough + case TYPE_NORMAL2: + startTower(); + // fallthrough + default: + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + mStatus = STATUS_WAIT; + dComIfGp_event_reset(); + mTalkingNearJail = false; + break; + } } /* 00003028-00003088 .text statusPayRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusPayRupee() { - /* Nonmatching */ + if(talk(1) == 0x12) { + dComIfGp_event_reset(); + mEventIdx = 9; + mStatus = STATUS_DEMO_PAY_RUPEE; + } } /* 00003088-000030F8 .text statusDemoPayRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoPayRupee() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_PAY_RUPEE")) { + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000030F8-00003158 .text statusGetRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusGetRupee() { - /* Nonmatching */ + if(talk(1) == 0x12) { + dComIfGp_event_reset(); + mEventIdx = 8; + mStatus = STATUS_DEMO_GET_RUPEE; + } } /* 00003158-000031CC .text statusDemoGetRupee__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoGetRupee() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_GET_RUPEE")) { + field_0x812 = true; + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000031CC-0000322C .text statusMonumentComplete__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusMonumentComplete() { - /* Nonmatching */ + if(talk(1) == 0x12) { + dComIfGp_event_reset(); + mEventIdx = 8; + mStatus = STATUS_DEMO_MONUMENT_COMPLETE; + } } /* 0000322C-000032A0 .text statusDemoMonumentComplete__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoMonumentComplete() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_GET_RUPEE")) { + field_0x813 = true; + dComIfGp_event_reset(); + mEventIdx = 1; + mStatus = STATUS_TALK; + } } /* 000032A0-00003308 .text statusDemoJump__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoJump() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_JUMP_DEMO")) { + mStatus = STATUS_WALK_TO_JAIL; + dComIfGp_event_reset(); + } } /* 00003308-00003384 .text statusDemoRescue__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoRescue() { - /* Nonmatching */ + if(dComIfGp_evmng_endCheck("TC_RESCUE")) { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B80); + dComIfGp_event_reset(); + fopAcM_delete(this); + } } /* 00003384-00003430 .text statusDemoTalk__10daNpc_Tc_cFv */ void daNpc_Tc_c::statusDemoTalk() { - /* Nonmatching */ + if (dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL") || dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL_S") || dComIfGp_evmng_endCheck("TC_TALK_NEAR_JAIL2")) { + mStatus = STATUS_WAIT_NEAR_JAIL; + dComIfGp_event_reset(); + mTalkingNearJail = false; + } } /* 00003430-00003610 .text help_action__10daNpc_Tc_cFPv */ -void daNpc_Tc_c::help_action(void*) { - /* Nonmatching */ +BOOL daNpc_Tc_c::help_action(void*) { + if (mActionStatus == ACTION_STARTING) { + mStatus = STATUS_SIT; + mActionStatus++; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + fopAcM_delete(this); + } + if (dComIfGp_evmng_endCheck("OpenDoor")) { + mTargetSpeed = 0.0f; + speedF = 0.0f; + mEventIdx = 4; + mStatus = STATUS_DEMO_RESCUE; + return true; + } else { + s16 temp = m_jnt.getHead_y() + current.angle.y+ m_jnt.getBackbone_y(); + mHasAttention = chkAttention(current.pos, temp); + mEventIdx = 0; + switch(mStatus) { + case STATUS_WAIT: + statusWait(); + break; + case STATUS_TALK: + statusTalk(); + break; + case STATUS_SIT: + statusSit(); + break; + case STATUS_JUMP: + statusJump(); + break; + case STATUS_WALK_TO_JAIL: + statusWalkToJail(); + break; + case STATUS_TALK_NEAR_JAIL: + statusTalkNearJail(); + break; + case STATUS_WAIT_NEAR_JAIL: + statusWaitNearJail(); + break; + case STATUS_WALK_TO_STOOL: + statusWalkToStool(); + break; + case STATUS_SIT_TO_STOOL: + statusSitToStool(); + break; + case STATUS_DEMO_JUMP: + statusDemoJump(); + break; + case STATUS_DEMO_RESCUE: + statusDemoRescue(); + break; + case STATUS_DEMO_TALK: + statusDemoTalk(); + break; + } + calcMove(); + lookBack(); + setAttention(); + } + } + return true; } /* 00003610-0000374C .text wait_action__10daNpc_Tc_cFPv */ -void daNpc_Tc_c::wait_action(void*) { - /* Nonmatching */ +BOOL daNpc_Tc_c::wait_action(void*) { + if (mActionStatus == ACTION_STARTING) { + mStatus = STATUS_WAIT; + mActionStatus++; // ACTION_ONGOING + } else if (mActionStatus != ACTION_ENDING) { + s16 temp = m_jnt.getHead_y() + current.angle.y+ m_jnt.getBackbone_y(); + mHasAttention = chkAttention(current.pos, temp); + mEventIdx = 0; + switch(mStatus) { + case STATUS_WAIT: + statusWait(); + break; + case STATUS_TALK: + statusTalk(); + break; + case STATUS_PAY_RUPEE: + statusPayRupee(); + break; + case STATUS_DEMO_PAY_RUPEE: + statusDemoPayRupee(); + break; + case STATUS_GET_RUPEE: + statusGetRupee(); + break; + case STATUS_DEMO_GET_RUPEE: + statusDemoGetRupee(); + break; + case STATUS_MONUMENT_COMPLETE: + statusMonumentComplete(); + break; + case STATUS_DEMO_MONUMENT_COMPLETE: + statusDemoMonumentComplete(); + break; + } + calcMove(); + lookBack(); + setAttention(); + } + return TRUE; } /* 0000374C-00003830 .text calc_sitpos__10daNpc_Tc_cFv */ void daNpc_Tc_c::calc_sitpos() { - /* Nonmatching */ + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz temp3; + cXyz temp4; + + cXyz temp; + cXyz temp2; + + temp.set(0.0f, 80.0f, -25.0f); + temp3.set(0.0f, 80.0f, -25.0f); + + temp2.set(0.0f, 0.0f, -60.0f); + temp4.set(0.0f, 0.0f, -60.0f); + + s16 angle = cLib_targetAngleY(&player->current.pos, &mStoolPos); + mDoMtx_stack_c::transS(mStoolPos); + mDoMtx_stack_c::YrotM(angle); + mDoMtx_stack_c::multVec(&temp3, &mSitPos); + mDoMtx_stack_c::multVec(&temp4, &mWalkToStoolPos); } /* 00003830-000038A0 .text set_mtx__10daNpc_Tc_cFv */ void daNpc_Tc_c::set_mtx() { - /* Nonmatching */ + J3DModel* model = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000038A0-00003A40 .text _draw__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_draw() { - /* Nonmatching */ + static const int a_bmt_tbl[5] = { + -1, + TC_BMT_TCB, + TC_BMT_TCC, + TC_BMT_TCA, + -1 + }; + + static const u8 a_snap_tbl[] = { + DSNAP_TYPE_TC_NORMAL, + DSNAP_TYPE_TC_RED, + DSNAP_TYPE_TC_WHITE, + DSNAP_TYPE_TC_BLUE, + DSNAP_TYPE_TC_NORMAL, + }; + + static const u32 dummy[] = { + 0xFF000080, + 0x0000FF80, + 0xFF000080, + 0xFF000080, + 0xFF000080, + 0x00FF0080, + }; + + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* pModelData = pModel->getModelData(); + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + mBtpAnm.entry(pModelData, mBlinkFrame); + if (a_bmt_tbl[mType] != -1) { + J3DMaterialTable* bmt = (J3DMaterialTable*)dComIfG_getObjectRes("Tc", a_bmt_tbl[mType]); + mpMorf->entryDL(bmt); + } else { + mpMorf->entryDL(); + } + mBtpAnm.remove(pModelData); + +#if VERSION == VERSION_DEMO + dNpc_setShadowModel(mpModel, pModelData, pModel); + + cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z); + + mShadowId = dComIfGd_setRealShadow(mShadowId,1,mpModel,&shadowPos,800.0f,current.pos.y-mObjAcch.GetGroundH(),NULL); + if(mShadowId == 0){ + dComIfGd_setSimpleShadow( + ¤t.pos, + mObjAcch.GetGroundH(), + 40.0f, + dComIfG_Bgsp()->GetTriPla(mObjAcch.m_gnd)->GetNP() + ); + } +#else + cXyz shadowPos(current.pos.x, current.pos.y + 150.0f + REG8_F(18), current.pos.z); + mShadowId = dComIfGd_setShadow( + mShadowId, 1, mpMorf->getModel(), &shadowPos, REG8_F(19) + 800.0f, 20.0f, + current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex() + ); +#endif + +#if VERSION <= VERSION_JPN + dSnap_RegistFig(a_snap_tbl[mType], this, 1.0f, 1.0f, 1.0f); +#else + dSnap_RegistFig(a_snap_tbl[mType], this, current.pos, current.angle.y, 1.0f, 1.0f, 1.0f); +#endif + if (l_HIO.field_0x34 != 0) { + mEventCut.getAttnPos(); + } + return TRUE; } + /* 00003A40-00003BE0 .text setTower__10daNpc_Tc_cFv */ void daNpc_Tc_c::setTower() { - /* Nonmatching */ + m_tower_actor = (daObjSmplbg::Act_c*)fopAcM_Search(&searchTower_CB, this); + JUT_ASSERT(VERSION_SELECT(0x8EB, 0x8E9, 0x8E9, 0x8E9), m_tower_actor != NULL); + cXyz temp; + s16 temp2; + switch(mType) { + case TYPE_WHITE: + temp = l_HIO.field_0x60; + temp2 = l_HIO.field_0x7A; + break; + case TYPE_RED: + temp = l_HIO.field_0x6C; + temp2 = l_HIO.field_0x78; + break; + + } + + switch(mType) { + case TYPE_RED: + case TYPE_WHITE: + mDoMtx_stack_c::transS(m_tower_actor->current.pos); + mDoMtx_stack_c::ZXYrotM(m_tower_actor->shape_angle); + mDoMtx_stack_c::multVec(&temp, ¤t.pos); + + s16 temp3 = m_tower_actor->shape_angle.y + temp2; + if (m_tower_actor->isStop()) { + if (mAnmPrmIdx == ANM_PRM_IDX_MAWASU || mAnmPrmIdx == ANM_PRM_IDX_WAIT04) { + cLib_addCalcAngleS2(¤t.angle.y, temp3, 4, 0x800); + } + } else { + current.angle.y = temp3; + } + break; + } } /* 00003BE0-00003E90 .text _execute__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_execute() { - /* Nonmatching */ + // dComIfGs_onGetCollectMap mentioned in debug? + if (mType == TYPE_WHITE || mType == TYPE_RED || mType == TYPE_NORMAL2) { + setTower(); + } + + m_jnt.setParam( + l_HIO.mNpc.mMaxBackboneX, l_HIO.mNpc.mMaxBackboneY, l_HIO.mNpc.mMinBackboneX, + l_HIO.mNpc.mMinBackboneY, l_HIO.mNpc.mMaxHeadX, l_HIO.mNpc.mMaxHeadY, + l_HIO.mNpc.mMinHeadX, l_HIO.mNpc.mMinHeadY, l_HIO.mNpc.mMaxTurnStep); + + playTexPatternAnm(); + + s8 roomNo = fopAcM_GetRoomNo(this); + u32 mtrlSndId = mObjAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd) : 0; + + field_0x798 = mpMorf->play(&eyePos, mtrlSndId, dComIfGp_getReverb(roomNo)); + mpMorf->calc(); + checkOrder(); + + (this->*mCurrActionFunc)(NULL); + + if (mStatus != STATUS_WAIT) { + if (!mEventCut.cutProc()) { + cutProc(); + } else { + if (mEventCut.getNowCut() != -1) { + switch(mEventCut.getNowCut()) { + case 2: + case 4: + if (mEventCut.getMoveSpeed() == 0.0f) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } else { + mAnmPrmIdx = ANM_PRM_IDX_WALK01; + } + break; + case 0: + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + break; + + } + } else { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } + } + } + + if (!dComIfGp_event_runCheck()) { + mEventCut.setAttnNoTurnFlag(false); + mEventCut.setAttnFlag(false); + } + + eventOrder(); + setAnm(); + setTexAnm(); + + if (mStatus != STATUS_WALK_TO_STOOL) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + cXyz tempPos = current.pos; + + mObjAcch.CrrPos(*dComIfG_Bgsp()); + + mDeltaPos = current.pos - tempPos; + + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + + set_mtx(); + + if (mType == TYPE_NORMAL) { + if (mStatus == STATUS_DEMO_RESCUE) { + setCollision(60.0f, 150.0f); + } + } else { + setCollision(60.0f, 150.0f); + } + return TRUE; } /* 00003E90-00003F1C .text _delete__10daNpc_Tc_cFv */ BOOL daNpc_Tc_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Tc"); + mSmokeCallBack.remove(); + field_0x714.remove(); + field_0x728.remove(); +#if VERSION == VERSION_DEMO + if(mpMorf != NULL) { +#else + if(heap != NULL) { +#endif + mpMorf->stopZelAnime(); + } + return TRUE; } /* 00003F1C-00003F3C .text createHeap_CB__FP10fopAc_ac_c */ -static BOOL createHeap_CB(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL createHeap_CB(fopAc_ac_c*i_this) { + return static_cast(i_this)->_createHeap(); } /* 00003F3C-00003FC0 .text isCreate__10daNpc_Tc_cFv */ -void daNpc_Tc_c::isCreate() { - /* Nonmatching */ +bool daNpc_Tc_c::isCreate() { + switch(mType) { + case TYPE_BLUE: + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + return false; + } + break; + + case TYPE_NORMAL2: + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + return false; + } + break; + } + return true; } /* 00003FC0-00004090 .text _create__10daNpc_Tc_cFv */ cPhs_State daNpc_Tc_c::_create() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Tc"); + if(phase_state == cPhs_COMPLEATE_e) { + fopAcM_SetupActor(this, daNpc_Tc_c); + +#else + fopAcM_SetupActor(this, daNpc_Tc_c); + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Tc"); + if(phase_state == cPhs_COMPLEATE_e) { +#endif + getArg(); + + if(!isCreate()) { + return cPhs_ERROR_e; + } + + if(!fopAcM_entrySolidHeap(this, createHeap_CB, VERSION_SELECT(0xCDA0, 0x1C80, 0x1C80, 0x1C80))) { + return cPhs_ERROR_e; + } + + cullMtx = mpMorf->getModel()->getBaseTRMtx(); + createInit(); + } + return phase_state; } +daNpc_Tc_c::daNpc_Tc_c() {} /* 000045D0-000047DC .text _createHeap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::_createHeap() { - /* Nonmatching */ +BOOL daNpc_Tc_c::_createHeap() { + J3DModelData* modelData = static_cast(dComIfG_getObjectRes("Tc", TC_BDL_TC)); + JUT_ASSERT(VERSION_SELECT(0xA26, 0xA30, 0xA30, 0xA30), modelData != NULL); + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, NULL, + J3DFrameCtrl::EMode_NULL, 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x15021222 + ); + + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + m_jnt.setHeadJntNum(2); + + JUT_ASSERT(VERSION_SELECT(0xA36, 0xA40, 0xA40, 0xA40), m_jnt.getHeadJntNum() >= 0); + + m_jnt.setBackboneJntNum(1); + JUT_ASSERT(VERSION_SELECT(0xA38, 0xA42, 0xA42, 0xA42), m_jnt.getBackboneJntNum() >= 0); + modelData->getJointNodePointer(2)->setCallBack(nodeCallBack); + modelData->getJointNodePointer(1)->setCallBack(nodeCallBack); + mpMorf->getModel()->setUserArea(reinterpret_cast(this)); + + mTexPatternNum = 0; + if (!initTexPatternAnm(false)) { + return FALSE; + } + +#if VERSION == VERSION_DEMO + mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + return mpModel != NULL ? TRUE : FALSE; +#else + return TRUE; +#endif } /* 000047DC-000047FC .text daNpc_Tc_Create__FP10fopAc_ac_c */ @@ -329,176 +1959,6 @@ static BOOL daNpc_Tc_IsDelete(daNpc_Tc_c*) { return TRUE; } -/* 00004BAC-00004E6C .text next_msgStatusNormal2__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusNormal2(unsigned long*) { - /* Nonmatching */ -} - -/* 00004E6C-00004F68 .text getMsgNormal2__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgNormal2() { - /* Nonmatching */ -} - -/* 00004F68-00004FD8 .text setRupeeSizeMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::setRupeeSizeMsg() { - /* Nonmatching */ -} - -/* 00004FD8-00005054 .text existUnknownCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existUnknownCollectMap() { - /* Nonmatching */ -} - -/* 00005054-000050DC .text analysisCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::analysisCollectMap() { - /* Nonmatching */ -} - -/* 000050DC-00005158 .text existKnownCollectMap__10daNpc_Tc_cFv */ -void daNpc_Tc_c::existKnownCollectMap() { - /* Nonmatching */ -} - -/* 00005158-000053D4 .text next_msgStatusWhite__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusWhite(unsigned long*) { - /* Nonmatching */ -} - -/* 000053D4-00005498 .text getMsgWhite__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgWhite() { - /* Nonmatching */ -} - -/* 00005498-00005720 .text next_msgStatusRed__10daNpc_Tc_cFPUl */ -void daNpc_Tc_c::next_msgStatusRed(unsigned long*) { - /* Nonmatching */ -} - -/* 00005720-00005730 .text setFinishMsg__10daNpc_Tc_cFv */ -void daNpc_Tc_c::setFinishMsg() { - /* Nonmatching */ -} - -/* 00005730-00005944 .text getMsgRed__10daNpc_Tc_cFv */ -void daNpc_Tc_c::getMsgRed() { - /* Nonmatching */ -} - -/* 00005944-000059A8 .text checkMonumentFee__10daNpc_Tc_cFUsUs */ -void daNpc_Tc_c::checkMonumentFee(unsigned short, unsigned short) { - /* Nonmatching */ -} - -/* 000059A8-00005A50 .text checkAllMonumentFee__10daNpc_Tc_cFv */ -void daNpc_Tc_c::checkAllMonumentFee() { - /* Nonmatching */ -} - -/* 00005A50-00005B10 .text checkAllMonumentPay__10daNpc_Tc_cFv */ -void daNpc_Tc_c::checkAllMonumentPay() { - /* Nonmatching */ -} - -/* 00005B10-00005B98 .text checkMonumentPay__10daNpc_Tc_cFUsUs */ -void daNpc_Tc_c::checkMonumentPay(unsigned short, unsigned short) { - /* Nonmatching */ -} - -/* 00005C58-00005E60 .text cutProc__10daNpc_Tc_cFv */ -void daNpc_Tc_c::cutProc() { - /* Nonmatching */ -} - -/* 00005E60-00005E6C .text cutSitToJumpStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSitToJumpStart(int) { - /* Nonmatching */ -} - -/* 00005E6C-00005FA4 .text cutSitToJumpProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSitToJumpProc(int) { - /* Nonmatching */ -} - -/* 00005FA4-00005FA8 .text cutPresentStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPresentStart(int) { - /* Nonmatching */ -} - -/* 00005FA8-00006174 .text cutPresentProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPresentProc(int) { - /* Nonmatching */ -} - -/* 00006174-000061F0 .text cutSetAnmStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSetAnmStart(int) { - /* Nonmatching */ -} - -/* 000061F0-000062A0 .text cutSetAnmProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutSetAnmProc(int) { - /* Nonmatching */ -} - -/* 000062A0-000062D8 .text cutBackJumpStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutBackJumpStart(int) { - /* Nonmatching */ -} - -/* 000062D8-000063BC .text cutBackJumpProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutBackJumpProc(int) { - /* Nonmatching */ -} - -/* 000063BC-000064C8 .text cutEffectStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutEffectStart(int) { - /* Nonmatching */ -} - -/* 000064C8-000064F4 .text cutEffectProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutEffectProc(int) { - /* Nonmatching */ -} - -/* 000064F4-00006564 .text cutDoorOpenStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorOpenStart(int) { - /* Nonmatching */ -} - -/* 00006564-00006590 .text cutDoorOpenProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorOpenProc(int) { - /* Nonmatching */ -} - -/* 00006590-00006600 .text cutDoorCloseStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorCloseStart(int) { - /* Nonmatching */ -} - -/* 00006600-0000662C .text cutDoorCloseProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorCloseProc(int) { - /* Nonmatching */ -} - -/* 0000662C-0000669C .text cutDoorClose2Start__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorClose2Start(int) { - /* Nonmatching */ -} - -/* 0000669C-000066C8 .text cutDoorClose2Proc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutDoorClose2Proc(int) { - /* Nonmatching */ -} - -/* 000066C8-000066E0 .text cutPayStart__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPayStart(int) { - /* Nonmatching */ -} - -/* 000066E0-0000670C .text cutPayProc__10daNpc_Tc_cFi */ -void daNpc_Tc_c::cutPayProc(int) { - /* Nonmatching */ -} - static actor_method_class l_daNpc_Tc_Method = { (process_method_func)daNpc_Tc_Create, (process_method_func)daNpc_Tc_Delete, diff --git a/src/d/actor/d_a_npc_tc_cut.inc b/src/d/actor/d_a_npc_tc_cut.inc new file mode 100644 index 000000000..7f77bfed8 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_cut.inc @@ -0,0 +1,312 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "cut" functions +// are in a separate .text section from the rest of its functions. + +/* 00005C58-00005E60 .text cutProc__10daNpc_Tc_cFv */ +void daNpc_Tc_c::cutProc() { + static char* action_table[] = { + "SIT_TO_JUMP", + "PRESENT", + "SET_ANM", + "BACKJUMP", + "EFFECT", + "DOOR_OPEN", + "DOOR_CLOSE", + "DOOR_CLOSE2", + "PAY", + }; + + int staffIdx = dComIfGp_evmng_getMyStaffId("Tc"); + if (staffIdx != -1) { + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, action_table, ARRAY_SIZE(action_table), TRUE, 0); + + if (actIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if (dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(actIdx) { + case 0: + cutSitToJumpStart(staffIdx); + break; + case 1: + cutPresentStart(staffIdx); + break; + case 2: + cutSetAnmStart(staffIdx); + break; + case 3: + cutBackJumpStart(staffIdx); + break; + case 4: + cutEffectStart(staffIdx); + break; + case 5: + cutDoorOpenStart(staffIdx); + break; + case 6: + cutDoorCloseStart(staffIdx); + break; + case 7: + cutDoorClose2Start(staffIdx); + break; + case 8: + cutPayStart(staffIdx); + break; + } + } + switch(actIdx) { + case 0: + cutSitToJumpProc(staffIdx); + break; + case 1: + cutPresentProc(staffIdx); + break; + case 2: + cutSetAnmProc(staffIdx); + break; + case 3: + cutBackJumpProc(staffIdx); + break; + case 4: + cutEffectProc(staffIdx); + break; + case 5: + cutDoorOpenProc(staffIdx); + break; + case 6: + cutDoorCloseProc(staffIdx); + break; + case 7: + cutDoorClose2Proc(staffIdx); + break; + case 8: + cutPayProc(staffIdx); + } + } + } +} + +/* 00005E60-00005E6C .text cutSitToJumpStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSitToJumpStart(int) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_A; +} + +/* 00005E6C-00005FA4 .text cutSitToJumpProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSitToJumpProc(int i_staffIdx) { + if (mpMorf->isStop() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_A) { + speedF = l_HIO.field_0x38; + speed.y = l_HIO.field_0x40; + gravity = l_HIO.field_0x3C; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_B; + } + + if(speed.y <= 0.0f && mAnmPrmIdx == ANM_PRM_IDX_JAMP_B) { + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C1; + } + + if(mObjAcch.ChkGroundHit() && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C1) { + speedF = 0.0f; + mAnmPrmIdx = ANM_PRM_IDX_JAMP_C2; + mJumpLandingTimer = 0x33; + return; + } + if (cLib_calcTimer(&mJumpLandingTimer) == 0 && mAnmPrmIdx == ANM_PRM_IDX_JAMP_C2) { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 00005FA4-00005FA8 .text cutPresentStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPresentStart(int) { +} + +/* 00005FA8-00006174 .text cutPresentProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPresentProc(int i_staffIdx) { + int* pItemType = dComIfGp_evmng_getMyIntegerP(i_staffIdx, "ItemType"); + int temp; + if(pItemType == NULL) { + temp = 0; + } else { + temp = *pItemType; + } + int itemNo; + switch(temp) { + case 0: + itemNo = dItem_TINGLE_TUNER_e; + break; + + case 1: + itemNo = dItem_COLLECT_MAP_35_e; + break; + + case 2: + if (mType == TYPE_RED) { + if (checkAllMonumentFee()) { + itemNo = TINCLE_RUPEE6; + } else { + switch (checkAllMonumentPay()) { + case 1: + itemNo = TINCLE_RUPEE1; + break; + case 2: + itemNo = TINCLE_RUPEE2; + break; + case 3: + itemNo = TINCLE_RUPEE3; + break; + case 4: + itemNo = TINCLE_RUPEE4; + break; + case 5: + itemNo = TINCLE_RUPEE5; + break; + } + } + } else if (mType == TYPE_NORMAL2) { + switch (analysisCollectMap()) { + case 1: + itemNo = TRIFORCE_MAP1; + break; + case 2: + itemNo = TRIFORCE_MAP2; + break; + case 3: + itemNo = TRIFORCE_MAP3; + break; + case 4: + itemNo = TRIFORCE_MAP4; + break; + case 5: + itemNo = TRIFORCE_MAP5; + break; + case 6: + itemNo = TRIFORCE_MAP6; + break; + case 7: + itemNo = TRIFORCE_MAP7; + break; + case 8: + itemNo = TRIFORCE_MAP8; + break; + } + } + break; + } +#if VERSION == VERSION_DEMO + fpc_ProcID itemPID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1); +#else + fpc_ProcID itemPID = fopAcM_createItemForPresentDemo(¤t.pos, itemNo, 0, -1, current.roomNo); +#endif + if(itemPID != fpcM_ERROR_PROCESS_ID_e) { + dComIfGp_event_setItemPartnerId(itemPID); + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 00006174-000061F0 .text cutSetAnmStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSetAnmStart(int i_staffIdx) { + const char* pName = dComIfGp_evmng_getMyStringP(i_staffIdx, "Name"); + if(pName != NULL && strcmp(pName, "GET") == 0) { + mAnmPrmIdx = ANM_PRM_IDX_GET; + } else { + mAnmPrmIdx = ANM_PRM_IDX_WAIT01; + } +} + +/* 000061F0-000062A0 .text cutSetAnmProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutSetAnmProc(int i_staffIdx) { + dComIfGp_evmng_getMyStringP(i_staffIdx, "Name"); + if (mAnmPrmIdx == ANM_PRM_IDX_GET) { + dComIfGp_evmng_cutEnd(i_staffIdx); + } + if(mpMorf->isStop()) { + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 000062A0-000062D8 .text cutBackJumpStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutBackJumpStart(int) { + mTargetSpeed = 0.0f; + speedF = l_HIO.field_0x48; + speed.y = l_HIO.field_0x50; + gravity = l_HIO.field_0x4C; + mAnmPrmIdx = ANM_PRM_IDX_GUARD; +} + +/* 000062D8-000063BC .text cutBackJumpProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutBackJumpProc(int i_staffIdx) { + mSmokeCallBack.end(); + if (mObjAcch.ChkGroundLanding()) { + speedF = 0.0f; + speed.y = 0.0f; + mSmokePos.set(current.pos); + mSmokeAngle = current.angle; + smoke_set(2.0f, 0.25f, 0.0f, 5.0f, 20.0f); + } else if (mObjAcch.ChkGroundHit() && speed.y == 0.0f){ + speedF = 0.0f; + dComIfGp_evmng_cutEnd(i_staffIdx); + } +} + +/* 000063BC-000064C8 .text cutEffectStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutEffectStart(int) { + // regswap for demo daNpc_Tc_c::setAnm also has a regswap with identical code + cXyz pos; + pos.x = current.pos.x; + pos.y = current.pos.y; + pos.z = current.pos.z; + + pos.y -= 80.0f; + cXyz particleScale; + + particleScale.setall(1.0f); + + JPABaseEmitter* pEmitter = dComIfGp_particle_set(dPa_name::ID_SCENE_8152, &pos, NULL, &particleScale); + pEmitter->setGlobalParticleScale(0.62f, 0.6f); + fopAcM_seStart(this, JA_SE_CM_CMN_NOTICE, 0); + /* Nonmatching */ +} + +/* 000064C8-000064F4 .text cutEffectProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutEffectProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 000064F4-00006564 .text cutDoorOpenStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorOpenStart(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_OPEN, 0); +} + +/* 00006564-00006590 .text cutDoorOpenProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorOpenProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 00006590-00006600 .text cutDoorCloseStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorCloseStart(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_CLOSE_1, 0); +} + +/* 00006600-0000662C .text cutDoorCloseProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorCloseProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 0000662C-0000669C .text cutDoorClose2Start__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorClose2Start(int) { + fopAcM_seStart(this, JA_SE_OBJ_DOOR_N_CLOSE_2, 0); +} + +/* 0000669C-000066C8 .text cutDoorClose2Proc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutDoorClose2Proc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} + +/* 000066C8-000066E0 .text cutPayStart__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPayStart(int i_param) { + dComIfGp_setItemRupeeCount(-398); +} + +/* 000066E0-0000670C .text cutPayProc__10daNpc_Tc_cFi */ +void daNpc_Tc_c::cutPayProc(int i_staffIdx) { + dComIfGp_evmng_cutEnd(i_staffIdx); +} diff --git a/src/d/actor/d_a_npc_tc_msg_normal2.inc b/src/d/actor/d_a_npc_tc_msg_normal2.inc new file mode 100644 index 000000000..90b3a5206 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_normal2.inc @@ -0,0 +1,202 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "normal2's" functions +// are in a separate .text section from the rest of its functions. + +/* 00004BAC-00004E6C .text next_msgStatusNormal2__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusNormal2(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { +#if VERSION > VERSION_JPN + case 0x38AA: + case 0x38AB: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_3020)) { + *pMsgNo = 0x38AC; + } else { + *pMsgNo = 0x38AD; + } + break; + case 0x38AC: + case 0x38AD: + if (existKnownCollectMap()) { + *pMsgNo = 0xDBA; + } else { + *pMsgNo = 0xDB5; + } + break; +#endif + case 0xDB2: + case 0xDB3: + case 0xDFB: + *pMsgNo = 0xDB4; + break; + + case 0xDB4: + *pMsgNo = getMsgNormal2(); + break; + + case 0xDB5: + *pMsgNo = 0xDBA; + break; + + case 0xDBB: + *pMsgNo = 0xDBC; + break; + + case 0xDBC: + *pMsgNo = 0xDBD; + break; + + case 0xDBD: + *pMsgNo = 0xDBE; + break; + + case 0xDBE: + if (mpCurrMsg->mSelectNum == 0) { + if ((u16)dComIfGs_getRupee() >= 398) { + mStatus = STATUS_PAY_RUPEE; + field_0x80D = true; + field_0x80C = true; + msgStatus = fopMsgStts_MSG_ENDS_e; + } else { + *pMsgNo = 0xDC0; + } + } else { + *pMsgNo = 0xDBF; + } + break; + + case 0xDC0: + if (field_0x80B) { + *pMsgNo = 0xDC4; + } else { + *pMsgNo = 0xDC1; + } + break; + + case 0xDBF: + *pMsgNo = 0xDC1; + break; + + case 0xDC3: + if (mpCurrMsg->mSelectNum == 0) { + if ((u16)dComIfGs_getRupee() >= 398) { + mStatus = STATUS_PAY_RUPEE; + field_0x80D = true; + field_0x80C = true; + msgStatus = fopMsgStts_MSG_ENDS_e; + } else { + field_0x80B = true; + *pMsgNo = 0xDC0; + } + } else { + *pMsgNo = 0xDC4; + } + break; + case 0xDC4: + field_0x80D = false; + field_0x80B = false; + // fallthrough + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 00004E6C-00004F68 .text getMsgNormal2__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgNormal2() { + u32 msg; + stopTower(); + if (field_0x80D) { + if (existUnknownCollectMap()) { + msg = 0xDC3; + field_0x80D = false; + } else { + msg = 0xDC4; + + } + } else if (!field_0x808) { + field_0x808 = true; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + msg = 0xDB3; + } else { + msg = 0xDFB; + } + } else { + msg = 0xDB2; + } + } else if (existUnknownCollectMap()) { + if (!field_0x809) { + field_0x809 = true; + msg = 0xDBB; + } else { + msg = 0xDBE; + } + } else { +#if VERSION <= VERSION_JPN + if(existKnownCollectMap()) { + msg = 0xDBA; + } else { + msg = 0xDB5; + } +#else + msg = setRupeeSizeMsg(); +#endif + } + return msg; +} + +#if VERSION > VERSION_JPN +/* 00004F68-00004FD8 .text setRupeeSizeMsg__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::setRupeeSizeMsg() { + u32 msgNo = 0xDB5; + if (dComIfGs_getWalletSize() == 0) { + msgNo = 0x38AA; + } else if (dComIfGs_getWalletSize() == 1) { + msgNo = 0x38AB; + } + else if (dComIfGs_getWalletSize() == 2) { + if (existKnownCollectMap()) { + msgNo = 0xDBA; + } else { + msgNo = 0xDB5; + } + } + return msgNo; +} +#endif + +/* 00004FD8-00005054 .text existUnknownCollectMap__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::existUnknownCollectMap() { + for(int i = 1; i <= 8; i++) { + if(!dComIfGs_isCollectMapTriforce(i) && dComIfGs_isGetCollectMap(i)) { + return true; + } + } + return false; +} + +/* 00005054-000050DC .text analysisCollectMap__10daNpc_Tc_cFv */ +int daNpc_Tc_c::analysisCollectMap() { + for(int i = 1; i <= 8; i++) { + if(!dComIfGs_isCollectMapTriforce(i) && dComIfGs_isGetCollectMap(i)) { + dComIfGs_onCollectMapTriforce(i); + return i; + } + } + return 0; +} + +/* 000050DC-00005158 .text existKnownCollectMap__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::existKnownCollectMap() { + for(int i = 1; i <= 8; i++) { + if(dComIfGs_isGetCollectMap(i) && dComIfGs_isCollectMapTriforce(i)) { + return true; + } + } + return false; +} diff --git a/src/d/actor/d_a_npc_tc_msg_red.inc b/src/d/actor/d_a_npc_tc_msg_red.inc new file mode 100644 index 000000000..417d38320 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_red.inc @@ -0,0 +1,248 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "red's" functions +// are in a separate .text section from the rest of its functions. + +/* 00005498-00005720 .text next_msgStatusRed__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusRed(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch(*pMsgNo) { + case 0xDB7: + case 0xDE1: + *pMsgNo = 0xDE2; + break; + + case 0xDE2: + if (dComIfGs_getClearCount() != 0) { + *pMsgNo = 0xDB8; + } else { + *pMsgNo = 0xDE3; + } + break; + case 0xDB8: + case 0xDE3: + *pMsgNo = 0xDE4; + break; + case 0xDE4: + *pMsgNo = setFinishMsg(); + break; + case 0xDE5: + *pMsgNo = setFinishMsg(); + break; + case 0xDE6: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + *pMsgNo = 0xDEB; + } else { + *pMsgNo = 0xDE7; + } + field_0x814 = true; + break; + case 0xDEB: + if (field_0x814) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { + *pMsgNo = 0xDEC; + } else { + *pMsgNo = setFinishMsg(); + } + } else { + *pMsgNo = setFinishMsg(); + } + break; + case 0xDEC: + *pMsgNo = 0xDED; + break; + case 0xDED: + *pMsgNo = setFinishMsg(); + break; + case 0xDE7: + *pMsgNo = 0xDE8; + break; + case 0xDE8: + *pMsgNo = 0xDE9; + break; + case 0xDE9: + *pMsgNo = 0xDEA; + break; + case 0xDEA: + *pMsgNo = setFinishMsg(); + break; + case 0xDEE: + *pMsgNo = 0xDEF; + break; + case 0xDEF: + mStatus = STATUS_GET_RUPEE; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDF1: + *pMsgNo = 0xDF2; + break; + case 0xDF2: + mStatus = STATUS_MONUMENT_COMPLETE; + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDF3: + *pMsgNo = 0xDF4; + break; + case 0xDF4: + *pMsgNo = 0xDF5; + break; + case 0xDF5: + *pMsgNo = setFinishMsg(); + break; + case 0xDF0: + *pMsgNo = setFinishMsg(); + break; + case 0xDC7: + m_jnt.onHeadLock(); + msgStatus = fopMsgStts_MSG_ENDS_e; + field_0x814 = false; + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 00005720-00005730 .text setFinishMsg__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::setFinishMsg() { + m_jnt.onHeadLock(); + return 0xDC7; +} + +/* 00005730-00005944 .text getMsgRed__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgRed() { + stopTower(); + if (field_0x813) { + field_0x813 = false; + return 0xDF3; + } + + if (field_0x812) { + field_0x812 = false; + switch(checkAllMonumentFee()) { // fake? + default: + return 0xDF1; + case false: + return 0xDF0; + } + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + + if (!field_0x810) { + field_0x810 = true; +#if VERSION == VERSION_DEMO + if(checkAllMonumentFee() || !checkOneMonumentGet()) { + return 0xDE6; + } + return 0xDEE; +#else + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1240)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D08)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D04)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xF)&& !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D02)) { + return 0xDEE; + } + if (dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xF) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1D01)) { + return 0xDEE; + } + return 0xDE6; +#endif + } + + switch(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1A20)) { // fake? + default: + return 0xDEB; + case false: + return 0xDEA; + + } + } + + if (dComIfGs_getClearCount() != 0) { + return setFirstMsg(&field_0x811, 0xDB7U, 0xDE5); + } + return setFirstMsg(&field_0x811, 0xDE1U, 0xDE5); +} + +/* 00005944-000059A8 .text checkMonumentFee__10daNpc_Tc_cFUsUs */ +bool daNpc_Tc_c::checkMonumentFee(u16 i_stageNo, u16 i_eventId) { + if (dComIfGs_isStageTbox(i_stageNo, 0xf)) { + return dComIfGs_isEventBit(i_eventId); + } + return false; +} + +/* 000059A8-00005A50 .text checkAllMonumentFee__10daNpc_Tc_cFv */ +bool daNpc_Tc_c::checkAllMonumentFee() { + if(checkMonumentFee(dSv_save_c::STAGE_DRC, dSv_event_flag_c::UNK_1240) && + checkMonumentFee(dSv_save_c::STAGE_FW, dSv_event_flag_c::UNK_1D08) && + checkMonumentFee(dSv_save_c::STAGE_TOTG, dSv_event_flag_c::UNK_1D04) && + checkMonumentFee(dSv_save_c::STAGE_WT, dSv_event_flag_c::UNK_1D02) && + checkMonumentFee(dSv_save_c::STAGE_ET, dSv_event_flag_c::UNK_1D01)) { + return true; + } + return false; +} + +#if VERSION == VERSION_DEMO +bool daNpc_Tc_c::checkOneMonumentGet() { + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_DRC, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_FW, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_TOTG, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_WT, 0xf)) { + return true; + } + if(dComIfGs_isStageTbox(dSv_save_c::STAGE_ET, 0xf)) { + return true; + } + return false; +} +#endif +/* 00005A50-00005B10 .text checkAllMonumentPay__10daNpc_Tc_cFv */ +int daNpc_Tc_c::checkAllMonumentPay() { + int amountOfMonumentsPaid = 0; + if(checkMonumentPay(dSv_save_c::STAGE_DRC, dSv_event_flag_c::UNK_1240)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_FW, dSv_event_flag_c::UNK_1D08)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_TOTG, dSv_event_flag_c::UNK_1D04)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_WT, dSv_event_flag_c::UNK_1D02)) { + amountOfMonumentsPaid++; + } + if (checkMonumentPay(dSv_save_c::STAGE_ET, dSv_event_flag_c::UNK_1D01)) { + amountOfMonumentsPaid++; + } + return amountOfMonumentsPaid; +} + +/* 00005B10-00005B98 .text checkMonumentPay__10daNpc_Tc_cFUsUs */ +bool daNpc_Tc_c::checkMonumentPay(u16 i_stageNo, u16 i_eventId) { + if(dComIfGs_isEventBit(i_eventId)) { + return false; + } + if(dComIfGs_isStageTbox(i_stageNo, 0xF)) { + dComIfGs_onEventBit(i_eventId); + return true; + } + return false; +} diff --git a/src/d/actor/d_a_npc_tc_msg_white.inc b/src/d/actor/d_a_npc_tc_msg_white.inc new file mode 100644 index 000000000..1292743d3 --- /dev/null +++ b/src/d/actor/d_a_npc_tc_msg_white.inc @@ -0,0 +1,131 @@ +// The original name of this file is unknown, but it must exist because d_a_npc_tc's "white's" functions +// are in a separate .text section from the rest of its functions. + +/* 00005158-000053D4 .text next_msgStatusWhite__10daNpc_Tc_cFPUl */ +u16 daNpc_Tc_c::next_msgStatusWhite(u32* pMsgNo) { + m_jnt.offHeadLock(); + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + if ((mAnmPrmIdx == ANM_PRM_IDX_DANCE01_TO_TALK01 || mAnmPrmIdx == ANM_PRM_IDX_DANCE02_TO_WAIT03) && !mpMorf->isStop()) { + msgStatus = fopMsgStts_MSG_DISPLAYED_e; + } else { + switch (*pMsgNo) { + case 0xDC5: + *pMsgNo = 0xDC6; + break; + case 0xDC6: + *pMsgNo = setFinishMsg(); + break; + case 0xDC8: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + if (!field_0x80E) { + field_0x80E = true; + *pMsgNo = 0xDD7; + } + } else if (!field_0x80F) { + field_0x80F = true; + *pMsgNo = 0xDC9; + } + break; + case 0xDD7: + *pMsgNo = 0xDD8; + break; + case 0xDD8: + *pMsgNo = setFinishMsg(); + break; + case 0xDC9: + if (mpCurrMsg->mSelectNum == 0) { + *pMsgNo = 0xDCA; + } else { + *pMsgNo = 0xDD3; + } + break; + case 0xDCA: + *pMsgNo = 0xDCB; + break; + case 0xDCB: + *pMsgNo = 0xDCC; + break; + case 0xDCC: + *pMsgNo = 0xDCD; + break; + case 0xDCD: + *pMsgNo = 0xDCE; + break; + case 0xDCE: + *pMsgNo = 0xDCF; + break; + case 0xDCF: + *pMsgNo = 0xDD0; + break; + case 0xDD0: + *pMsgNo = 0xDD1; + break; + case 0xDD1: + *pMsgNo = 0xDD2; + break; + case 0xDD2: + *pMsgNo = setFinishMsg(); + break; + case 0xDD3: + *pMsgNo = 0xDD4; + break; + case 0xDD4: + *pMsgNo = 0xDD5; + break; + case 0xDD5: + *pMsgNo = setFinishMsg(); + break; + case 0xDC7: + m_jnt.onHeadLock(); + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + case 0xDD9: + *pMsgNo = 0xDDA; + break; + case 0xDDA: + if (existTcMonument()) { + *pMsgNo = setFinishMsg(); + } else { + *pMsgNo = 0xDDB; + } + break; + case 0xDDB: + *pMsgNo = 0xDDC; + break; + case 0xDDC: + *pMsgNo = setFinishMsg(); + break; + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + } + return msgStatus; +} + +/* 000053D4-00005498 .text getMsgWhite__10daNpc_Tc_cFv */ +u32 daNpc_Tc_c::getMsgWhite() { + u32 msg; + stopTower(); + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1708)) { + msg = 0xDD9; + m_jnt.onHeadLock(); + + } else { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B80)) { + if (!field_0x80E) { + msg = 0xDC8; + m_jnt.onHeadLock(); + } else { + msg = 0xDD6; + } + } else if (!field_0x80F) { + msg = 0xDC8; + m_jnt.onHeadLock(); + } else { + msg = 0xDC5; + m_jnt.onHeadLock(); + } + } + return msg; +} diff --git a/src/d/actor/d_a_obj_smplbg.cpp b/src/d/actor/d_a_obj_smplbg.cpp index 7e45302b0..18e880a2d 100644 --- a/src/d/actor/d_a_obj_smplbg.cpp +++ b/src/d/actor/d_a_obj_smplbg.cpp @@ -99,7 +99,7 @@ void daObjSmplbg::Act_c::init_mtx() { /* 00000594-0000061C .text exec_qtkhd__Q211daObjSmplbg5Act_cFv */ void daObjSmplbg::Act_c::exec_qtkhd() { - if(field_0x2D8 == 0){ + if(!mIsStop) { shape_angle.y += 0x5b; fopAcM_seStart(this, JA_SE_OBJ_TC_TOWER_ROUND, 0); }