From c79fa65efd8da81cd88665f08620073ab999523d Mon Sep 17 00:00:00 2001 From: Roland Date: Wed, 11 Feb 2026 21:31:05 -0600 Subject: [PATCH] d_a_npc_ls1 matching (#925) * Match daNpc_Ls1_c::create, decideType, and ctor * 16% matching in .text -Match daNpc_Ls1_c::CreateHeap -Match daNpc_Ls1_c::itemCreateHeap -Match daNpc_Ls1_c::handCreateHeap -Match daNpc_Ls1_c::_delete -Match other trivial functions * Add hio_prm_c * 27% matching in .text -Add some static data -Match daNpc_Ls1_c::endEvent -Match daNpc_Ls1_c::isEventEntry -Match daNpc_Ls1_c::execute -Match daNpc_Ls1_c::bodyCreateHeap -Match some more trivial funcs * 33% matching in .text -Match daNpc_Ls1_c::create_init -Match daNpc_Ls1_c::chngAnmTag -Match daNpc_Ls1_c::ctrlAnmTag -Match init_LS1_#n() funcs -Match searchActor funcs * Add daNpc_Ls1_c::anm_prm_c struct and associated static data * 39% matching in .text - Matched daNpc_Ls1_matAnm_c::calc - Matched static node callbacks - Matched daNpc_Ls1_c::setAnm_anm - Matched daNpc_Ls1_c::setAnm_NUM - Matched daNpc_Ls1_c::chngAnmAtr - Misc code formatting changes * 52% matching in .text - Match daNpc_Ls1_c::play_animation - Match daNpc_Ls1_c::set_mtx - Match ResID funcs - Match daNpc_Ls1_c::setBtp - Match daNpc_Ls1_c::setMat - Match daNpc_Ls1_c::setBtk - Match daNpc_Ls1_c::init_texPttrnAnm - Match daNpc_Ls1_c::play_btp_anm - Match daNpc_Ls1_c::play_btk_anm - Match daNpc_Ls1_c::ctrlAnmAtr - Match daNpc_Ls1_c::setAnm_ATR - Match daNpc_Ls1_c::chk_parts_notMov - Match daNpc_Ls1_c::cut_init_LOK_PLYER - Match daNpc_Ls1_c::cut_move_WAI - Match daNpc_Ls1_c::cut_init_ANM_CHG - Match daNpc_Ls1_c::set_action * Update comments * Match daNpc_Ls1_c::_draw * 63% matching in .text - Match member J3D node callbacks - Match daNpc_Ls1_c::eye_ctrl - Match daNpc_Ls1_c::next_msgStatus - Match daNpc_Ls1_c::getMsg - Match daNpc_Ls1_c::chk_talk - Match daNpc_Ls1_c::setEyeCtrl - Match daNpc_Ls1_c::clrEyeCtrl - Match daNpc_Ls1_c::setAttention - Add misc enums - Add a_cut_tbl * 66% matching in .text - Matched daNpc_Ls1_c::searchByID - Matched daNpc_Ls1_c::partner_search_sub - Matched daNpc_Ls1_c::partner_search - Matched daNpc_Ls1_c::chkAttention - Marched daNpc_Ls1_c::shadowDraw * 75% matching in .text - Match daNpc_Ls1_c::anmAtr - Match daNpc_Ls1_c::getMsg_LS1_0 - Match daNpc_Ls1_c::chk_talk - Match daNpc_Ls1_c::setStt - Match daNpc_Ls1_c::get_playerEvnPos - Match daNpc_Ls1_c::chkTelescope - Match daNpc_Ls1_c::wait_1 - Match daNpc_Ls1_c::wait_4 - Match daNpc_Ls1_c::talk_1 - Match daNpc_Ls1_c::demo_action1 * Match daNpc_Ls1_c::wait_3 * 100% matching for both demo and retail * Update comments * Initial refactoring work * Renaming work & declaring functions in f_op_msg_mng header * Refactoring continued * Last bit of renaming work * Add missing include --- configure.py | 2 +- include/d/actor/d_a_npc_bm1.h | 16 +- include/d/actor/d_a_npc_ls1.h | 254 +++- include/f_op/f_op_msg_mng.h | 4 + src/d/actor/d_a_npc_bm1.cpp | 4 +- src/d/actor/d_a_npc_ls1.cpp | 2237 ++++++++++++++++++++++++++++++--- 6 files changed, 2268 insertions(+), 249 deletions(-) diff --git a/configure.py b/configure.py index 97e4df0b1..ab9944115 100755 --- a/configure.py +++ b/configure.py @@ -1650,7 +1650,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_km1"), ActorRel(NonMatching, "d_a_npc_ko1"), ActorRel(NonMatching, "d_a_npc_kp1"), - ActorRel(NonMatching, "d_a_npc_ls1"), + ActorRel(Matching, "d_a_npc_ls1"), ActorRel(NonMatching, "d_a_npc_mk"), ActorRel(NonMatching, "d_a_npc_mn"), ActorRel(NonMatching, "d_a_npc_mt"), diff --git a/include/d/actor/d_a_npc_bm1.h b/include/d/actor/d_a_npc_bm1.h index a49f40a21..78e812e99 100644 --- a/include/d/actor/d_a_npc_bm1.h +++ b/include/d/actor/d_a_npc_bm1.h @@ -1,11 +1,12 @@ #ifndef D_A_NPC_BM1_H #define D_A_NPC_BM1_H +#include "d/d_npc.h" #include "f_op/f_op_actor.h" class J3DNode; -class daNpc_Bm1_c : public fopAc_ac_c { +class daNpc_Bm1_c : public fopNpc_npc_c { public: struct anm_prm_c { @@ -67,7 +68,7 @@ public: void chk_talk(); void chk_partsNotMove(); void lookBack(); - void next_msgStatus(unsigned long*); + u16 next_msgStatus(unsigned long*); void getBitMask(); void getMsg_PST_1(); void getMsg_PST_3(); @@ -81,7 +82,7 @@ public: void getMsg_BMC_3(); void getMsg_BMD_0(); void getMsg_BMD_1(); - void getMsg(); + u32 getMsg(); void chkAttention(); void setAttention(bool); void searchByID(fpc_ProcID); @@ -194,9 +195,11 @@ public: /* 0x870 */ u8 m870[0x874 - 0x870]; /* 0x874 */ s16 m874; /* 0x876 */ s16 m876; - /* 0x878 */ u8 m878[0x881 - 0x878]; + /* 0x878 */ u8 m878[0x880 - 0x878]; + /* 0x880 */ u8 m880; /* 0x881 */ u8 m881; - /* 0x882 */ u8 m882[0x884 - 0x882]; + /* 0x882 */ u8 m882; + /* 0x883 */ u8 m883[0x884 - 0x883]; /* 0x884 */ u8 m884; /* 0x885 */ u8 m885[0x887 - 0x885]; /* 0x887 */ u8 m887; @@ -212,7 +215,8 @@ public: /* 0x902 */ u8 mSpecificType; /* 0x903 */ u8 mSpawnCondition; /* 0x904 */ u8 m904[0x908 - 0x904]; -}; +}; +STATIC_ASSERT(sizeof(daNpc_Bm1_c) == 0x908); class daNpc_Bm1_childHIO_c { public: diff --git a/include/d/actor/d_a_npc_ls1.h b/include/d/actor/d_a_npc_ls1.h index 61bad7f62..8074e2317 100644 --- a/include/d/actor/d_a_npc_ls1.h +++ b/include/d/actor/d_a_npc_ls1.h @@ -1,30 +1,43 @@ #ifndef D_A_NPC_LS1_H #define D_A_NPC_LS1_H +#include "d/d_npc.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" class J3DMaterial; class J3DNode; -class daNpc_Ls1_matAnm_c { +class daNpc_Ls1_matAnm_c : public J3DMaterialAnm { public: daNpc_Ls1_matAnm_c(); - void clrMoveFlag() {} - void getNowOffsetX() {} - void getNowOffsetY() {} - void setMoveFlag() {} + void clrMoveFlag() { mbMove = 0; } + f32& getNowOffsetX() { return mOffset.x; } + f32& getNowOffsetY() { return mOffset.y; } + void setMoveFlag() { mbMove = 1; } void calc(J3DMaterial*) const; public: - /* Place member variables here */ -}; + /* 0x6C */ cXy mOffset; + /* 0x74 */ u8 m74[0x7C - 0x74]; + /* 0x7C */ u8 mbMove; + /* 0x7D */ u8 m7D[0x80 - 0x7D]; +}; // Size: 0x80 -class daNpc_Ls1_c : public fopAc_ac_c { +class daNpc_Ls1_c : public fopNpc_npc_c { public: + typedef BOOL (daNpc_Ls1_c::*ProcFunc)(void*); + struct anm_prm_c { - - }; + /* 0x00 */ s8 mBckResIndex; + /* 0x01 */ s8 mResIndex; + /* 0x04 */ f32 mMorf; + /* 0x08 */ f32 mSpeed; + /* 0x0C */ int mLoopMode; + }; // Size: 0x10 + + inline daNpc_Ls1_c(); void _nodeCB_Head(J3DNode*, J3DModel*); void _nodeCB_BackBone(J3DNode*, J3DModel*); @@ -32,21 +45,21 @@ public: void _nodeCB_Hand_R(J3DNode*, J3DModel*); void _Ls_hand_nodeCB_Hand_L(J3DNode*, J3DModel*); void _Ls_hand_nodeCB_Hand_R(J3DNode*, J3DModel*); - void init_LS1_0(); - void init_LS1_1(); - void init_LS1_2(); - void init_LS1_3(); - void init_LS1_4(); - void createInit(); + bool init_LS1_0(); + bool init_LS1_1(); + bool init_LS1_2(); + bool init_LS1_3(); + bool init_LS1_4(); + bool createInit(); void play_animation(); void setMtx(bool); - void bckResID(int); - void btpResID(int); - void btkResID(int); - void setBtp(signed char, bool); + int bckResID(int); + int btpResID(int); + int btkResID(int); + bool setBtp(s8, bool); void setMat(); - void setBtk(signed char, bool); - void init_texPttrnAnm(signed char, bool); + bool setBtk(s8, bool); + bool init_texPttrnAnm(s8, bool); void play_btp_anm(); void eye_ctrl(); void play_btk_anm(); @@ -55,74 +68,187 @@ public: void setAnm(); void chngAnmTag(); void ctrlAnmTag(); - void chngAnmAtr(unsigned char); + void chngAnmAtr(u8); void ctrlAnmAtr(); void setAnm_ATR(int); - void anmAtr(unsigned short); - void next_msgStatus(unsigned long*); - void getMsg_LS1_0(); - void getMsg_LS1_3(); - void getMsg(); + void anmAtr(u16); + u16 next_msgStatus(u32*); + u32 getMsg_LS1_0(); + u32 getMsg_LS1_3(); + u32 getMsg(); void eventOrder(); void checkOrder(); - void chk_talk(); - void chk_parts_notMov(); - void searchByID(fpc_ProcID, int*); - void partner_search_sub(void* (*)(void*, void*)); + bool chk_talk(); + bool chk_parts_notMov(); + fopAc_ac_c* searchByID(fpc_ProcID, int*); + bool partner_search_sub(void* (*)(void*, void*)); void partner_search(); void setEyeCtrl(); void clrEyeCtrl(); void lookBack(); - void chkAttention(); + bool chkAttention(); void setAttention(bool); - void decideType(int); + bool decideType(int); void cut_init_LOK_PLYER(int); - void cut_move_LOK_PLYER(); + bool cut_move_LOK_PLYER(); void cut_init_PLYER_MOV(int); - void cut_move_PLYER_MOV(); + bool cut_move_PLYER_MOV(); void cut_init_WAI(int); - void cut_move_WAI(); + bool cut_move_WAI(); void cut_init_ANM_CHG(int); - void cut_move_ANM_CHG(); + bool cut_move_ANM_CHG(); void privateCut(int); void endEvent(); - void isEventEntry(); + int isEventEntry(); void event_proc(int); - void set_action(int (daNpc_Ls1_c::*)(void*), void*); - void setStt(signed char); - void chk_areaIN(float, float, short, cXyz); - void get_playerEvnPos(int); - void chkTelescope_sph(cXyz, float, float); - void chkTelescope(cXyz, float, float); - void telescope_proc(); - void wait_1(); - void wait_2(); - void wait_3(); - void wait_4(); - void talk_1(); - void wait_action1(void*); - void demo_action1(void*); - void demo(); + BOOL set_action(ProcFunc, void*); + void setStt(s8); + bool chk_areaIN(f32, f32, s16, cXyz); + cXyz get_playerEvnPos(int); + bool chkTelescope_sph(cXyz, f32, f32); + bool chkTelescope(cXyz, f32, f32); + bool telescope_proc(); + BOOL wait_1(); + BOOL wait_2(); + BOOL wait_3(); + BOOL wait_4(); + BOOL talk_1(); + BOOL wait_action1(void*); + BOOL demo_action1(void*); + bool demo(); void shadowDraw(); BOOL _draw(); BOOL _execute(); BOOL _delete(); cPhs_State _create(); - void bodyCreateHeap(); - void handCreateHeap(); - void itemCreateHeap(); - void CreateHeap(); + BOOL bodyCreateHeap(); + BOOL handCreateHeap(); + BOOL itemCreateHeap(); + BOOL CreateHeap(); public: - /* Place member variables here */ -}; + /* 0x6C4 */ request_of_phase_process_class mPhs; + /* 0x6CC */ s8 m_hed_jnt_num; + /* 0x6CD */ s8 m_bbone_jnt_num; + /* 0x6CE */ s8 m_hnd_L_jnt_num; + /* 0x6CF */ s8 m_hnd_R_jnt_num; + /* 0x6D0 */ J3DModel* mpTelescopeModel; + /* 0x6D4 */ f32 mTelescopeScale; + /* 0x6D8 */ daNpc_Ls1_matAnm_c* mpMatAnms[2]; + /* 0x6E0 */ char mArcName[3]; + /* 0x6E3 */ u8 m6E3[0x6E4 - 0x6E3]; + /* 0x6E4 */ u32 mShadowID; + /* 0x6E8 */ J3DModel* mpLsHandModel; + /* 0x6EC */ s8 m_lsHnd_L_jnt_num; + /* 0x6ED */ s8 m_lsHnd_R_jnt_num; + /* 0x6EE */ u8 m6EE[0x6F0 - 0x6EE]; + /* 0x6F0 */ mDoExt_btkAnm mBtkAnm; + /* 0x704 */ u8 mBtkFrame; + /* 0x705 */ u8 m705[0x708 - 0x705]; + /* 0x708 */ mDoExt_btpAnm mBtpAnm; + /* 0x71C */ u8 mBtpFrame; + /* 0x71D */ u8 m71D[0x71E - 0x71D]; + /* 0x71E */ s16 mTimer1; + /* 0x720 */ ProcFunc mCurrProcFunc; + /* 0x72C */ Mtx mHand_L_Mtx; + /* 0x75C */ Mtx mHand_R_Mtx; + /* 0x78C */ fpc_ProcID mBm1ProcID; + /* 0x790 */ fpc_ProcID m790; + /* 0x794 */ cXyz m794; + /* 0x7A0 */ csXyz m7A0; + /* 0x7A6 */ csXyz mAngle; + /* 0x7AC */ u8 m7AC[0x7B4 - 0x7AC]; + /* 0x7B4 */ cXyz mTransformedEyePos; + /* 0x7C0 */ cXyz mPlayerEyePos; + /* 0x7CC */ cXyz m7CC[2]; + /* 0x7E4 */ cXyz m7E4; + /* 0x7F0 */ u8 m7F0[0x800 - 0x7F0]; + /* 0x800 */ f32 mPrevMorfFrame; + /* 0x804 */ s16 mActorAngleY; + /* 0x806 */ s16 mJointHeadY; + /* 0x808 */ s16 mJointBackboneY; + /* 0x80A */ u8 m80A[0x80C - 0x80A]; + /* 0x80C */ BOOL mbSetEyePos; + /* 0x810 */ u32 m810; + /* 0x814 */ s16 mEventIDTbl[4]; + /* 0x81C */ s16 mEventIndex; + /* 0x81E */ s16 mTimer2; + /* 0x820 */ u8 m820[0x822 - 0x820]; + /* 0x822 */ s16 mTimer3; + /* 0x824 */ s16 mTimer4; + /* 0x826 */ s16 mTimer5; + /* 0x828 */ u8 m828[0x82E - 0x828]; + /* 0x82E */ s16 m82E; + /* 0x830 */ s8 mbMorfAnimStopped; // Not typed as bool, but used like one + /* 0x831 */ u8 m831; + /* 0x832 */ u8 mItemNo; + /* 0x833 */ u8 m833; + /* 0x834 */ bool m834; + /* 0x835 */ bool m835; + /* 0x836 */ bool m836; + /* 0x837 */ bool mbResLoadIsComplete; + /* 0x838 */ bool m838; + /* 0x839 */ u8 mbEyeCtrlSet; + /* 0x83A */ bool m83A; + /* 0x83B */ u8 m83B; + /* 0x83C */ u8 m83C; + /* 0x83D */ bool m83D; + /* 0x83E */ bool mbAttention; + /* 0x83F */ bool m83F; + /* 0x840 */ bool m840; + /* 0x841 */ bool m841; + /* 0x842 */ s16 mHalfHeadAngleY; + /* 0x844 */ s16 mHalfHeadAngleX; + /* 0x846 */ s16 m846; + /* 0x848 */ s16 m848; + /* 0x84A */ s8 mActionIndex; + /* 0x84B */ u8 m84B; + /* 0x84C */ u8 mMesgAnimeTag; + /* 0x84D */ s8 mBtpResIDIndex; + /* 0x84E */ s8 mBtkResIDIndex; + /* 0x84F */ s8 mBckResIndex; + /* 0x850 */ s8 m850; + /* 0x851 */ s8 m851; + /* 0x852 */ s8 m852; + /* 0x853 */ s8 m853; + /* 0x854 */ s8 m854; + /* 0x855 */ s8 mType; + /* 0x856 */ s8 m856; + /* 0x857 */ s8 m857; +}; // Size: 0x858 -class daNpc_Ls1_HIO_c { +class daNpc_Ls1_HIO_c : public mDoHIO_entry_c { public: + struct hio_prm_c { + /* 0x00 */ s16 mMaxHeadX; + /* 0x02 */ s16 mMaxHeadY; + /* 0x04 */ s16 mMinHeadX; + /* 0x06 */ s16 mMinHeadY; + /* 0x08 */ s16 mMaxBackBoneX; + /* 0x0A */ s16 mMaxBackBoneY; + /* 0x0C */ s16 mMinBackBoneX; + /* 0x0E */ s16 mMinBackBoneY; + /* 0x10 */ s16 mMaxTurnStep; + /* 0x12 */ s16 m12; + /* 0x14 */ f32 mAttPosOffsetY; + /* 0x18 */ bool m18; + /* 0x19 */ // 3 bytes of alignment padding + /* 0x1C */ f32 m1C; + /* 0x20 */ f32 m29; + /* 0x24 */ f32 m24; + /* 0x28 */ f32 m28; + /* 0x2C */ f32 m2C; + /* 0x30 */ s16 m30; + /* 0x32 */ // 2 bytes of alignment padding + /* 0x34 */ f32 mPlayerEyePosOffsetY; + }; // Size: 0x38 daNpc_Ls1_HIO_c(); - + inline virtual ~daNpc_Ls1_HIO_c(); public: - /* Place member variables here */ -}; + /* 0x04 */ s8 m04; + /* 0x05 */ // 3 bytes of alignment padding + /* 0x08 */ s32 m08; + /* 0x0C */ hio_prm_c mPrm; +}; // Size: 0x44 #endif /* D_A_NPC_LS1_H */ diff --git a/include/f_op/f_op_msg_mng.h b/include/f_op/f_op_msg_mng.h index a6bd7d326..b56e29324 100644 --- a/include/f_op/f_op_msg_mng.h +++ b/include/f_op/f_op_msg_mng.h @@ -374,12 +374,16 @@ void fopMsgM_setNowAlpha(fopMsgM_pane_alpha_class*, f32); void fopMsgM_setAlpha(fopMsgM_pane_alpha_class*); u32 fopMsgM_searchMessageNumber(u32); +bool fopMsgM_forceSendOn(); void fopMsgM_messageSendOn(); void fopMsgM_messageSendOff(); bool fopMsgM_checkMessageSend(); u32 fopMsgM_tactMessageSet(); void fopMsgM_demoMsgFlagOn(); +bool fopMsgM_getScopeMode(); +bool fopMsgM_releaseScopeMode(); + void fopMsgM_demoMsgFlagOn(); void fopMsgM_demoMsgFlagOff(); bool fopMsgM_demoMsgFlagCheck(); diff --git a/src/d/actor/d_a_npc_bm1.cpp b/src/d/actor/d_a_npc_bm1.cpp index 719a65302..e23e13953 100644 --- a/src/d/actor/d_a_npc_bm1.cpp +++ b/src/d/actor/d_a_npc_bm1.cpp @@ -284,7 +284,7 @@ void daNpc_Bm1_c::lookBack() { } /* 00002590-00002A58 .text next_msgStatus__11daNpc_Bm1_cFPUl */ -void daNpc_Bm1_c::next_msgStatus(unsigned long*) { +u16 daNpc_Bm1_c::next_msgStatus(unsigned long*) { /* Nonmatching */ } @@ -354,7 +354,7 @@ void daNpc_Bm1_c::getMsg_BMD_1() { } /* 00003470-00003548 .text getMsg__11daNpc_Bm1_cFv */ -void daNpc_Bm1_c::getMsg() { +u32 daNpc_Bm1_c::getMsg() { /* Nonmatching */ } diff --git a/src/d/actor/d_a_npc_ls1.cpp b/src/d/actor/d_a_npc_ls1.cpp index 9a91de305..75bdc7452 100644 --- a/src/d/actor/d_a_npc_ls1.cpp +++ b/src/d/actor/d_a_npc_ls1.cpp @@ -5,502 +5,2387 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_ls1.h" +#include "d/actor/d_a_npc_bm1.h" +#include "d/actor/d_a_player_main.h" +#if VERSION > VERSION_DEMO +#include "d/d_bg_s_func.h" +#endif +#include "f_op/f_op_camera.h" +#include "d/res/res_link.h" +#include "d/res/res_ls.h" +#include "SSystem/SComponent/c_counter.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_snap.h" +#include "m_Do/m_Do_lib.h" + +static daNpc_Ls1_HIO_c l_HIO; +static fopAc_ac_c* l_check_inf[20]; +static int l_check_wrk; /* 000000EC-00000150 .text __ct__15daNpc_Ls1_HIO_cFv */ daNpc_Ls1_HIO_c::daNpc_Ls1_HIO_c() { - /* Nonmatching */ + static hio_prm_c a_prm_tbl = { + 0x2EE0, + 0x4650, + 0xFC18, + 0xB9B0, + 0x0BB8, + 0x1B58, + 0x0000, + 0xE4A8, + 0x1000, + 0x0960, + 110.0f, + 0, + 700.0f, + 200.0f, + 2.0f, + 9.0f, + 50.0f, + 0x1A2C, + 9.0f + }; + memcpy(&mPrm, &a_prm_tbl, 0x38); + m04 = -1; + m08 = -1; } +daNpc_Ls1_HIO_c::~daNpc_Ls1_HIO_c() {} + +static const char* l_evn_tbl[] = { + "zelda_fly", + "omedeto", + "get_telescope", + "eTalk" +}; + /* 00000198-000001F8 .text __ct__18daNpc_Ls1_matAnm_cFv */ daNpc_Ls1_matAnm_c::daNpc_Ls1_matAnm_c() { - /* Nonmatching */ + mbMove = 0; + mOffset.y = 0.0f; + mOffset.x = 0.0f; } /* 000001F8-0000028C .text calc__18daNpc_Ls1_matAnm_cCFP11J3DMaterial */ -void daNpc_Ls1_matAnm_c::calc(J3DMaterial*) const { - /* Nonmatching */ +void daNpc_Ls1_matAnm_c::calc(J3DMaterial* i_material) const { + J3DMaterialAnm::calc(i_material); + for (u32 i = 0; i < 8; i++) { + if (getTexMtxAnm(i)) { + J3DTexMtx* tex_mtx_p = i_material->getTexMtx(i); + if (mbMove != 0) { + tex_mtx_p->getTextureSRT().mTranslationX = mOffset.x; + tex_mtx_p->getTextureSRT().mTranslationY = mOffset.y; + } + } + } } /* 0000028C-000002D8 .text nodeCB_Head__FP7J3DNodei */ -static BOOL nodeCB_Head(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCB_Head(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* actor_p = (daNpc_Ls1_c*) j3dSys.getModel()->getUserArea(); + actor_p->_nodeCB_Head(i_node, j3dSys.getModel()); + } + return TRUE; } /* 000002D8-000003F8 .text _nodeCB_Head__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_nodeCB_Head(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_nodeCB_Head(J3DNode* i_bode, J3DModel* i_model) { + static cXyz a_eye_pos_off(14.0f, 18.0f, 0.0f); + + J3DJoint* jnt_p = (J3DJoint *) i_bode; + s32 jnt_no = jnt_p->getJntNo(); + + mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); + + m7E4.x = mDoMtx_stack_c::get()[0][3]; + m7E4.y = mDoMtx_stack_c::get()[1][3]; + m7E4.z = mDoMtx_stack_c::get()[2][3]; + + mDoMtx_stack_c::XrotM(mHalfHeadAngleY); + mDoMtx_stack_c::ZrotM(-mHalfHeadAngleX); + mDoMtx_stack_c::multVec(&a_eye_pos_off, &mTransformedEyePos); + + mDoMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); + i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 00000434-00000480 .text nodeCB_BackBone__FP7J3DNodei */ -static BOOL nodeCB_BackBone(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCB_BackBone(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* actor_p = (daNpc_Ls1_c*) j3dSys.getModel()->getUserArea(); + actor_p->_nodeCB_BackBone(i_node, j3dSys.getModel()); + } + return TRUE; } /* 00000480-00000520 .text _nodeCB_BackBone__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_nodeCB_BackBone(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_nodeCB_BackBone(J3DNode* i_node, J3DModel* i_model) { + J3DJoint* jnt_p = (J3DJoint *) i_node; + s32 jnt_no = jnt_p->getJntNo(); + + mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); + mDoMtx_stack_c::XrotM(m_jnt.getBackbone_y()); + mDoMtx_stack_c::ZrotM(-m_jnt.getBackbone_x()); + + mDoMtx_copy(mDoMtx_stack_c::get(), j3dSys.mCurrentMtx); + i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 00000520-0000056C .text nodeCB_Hand_L__FP7J3DNodei */ -static BOOL nodeCB_Hand_L(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCB_Hand_L(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* actor_p = (daNpc_Ls1_c *) j3dSys.getModel()->getUserArea(); + actor_p->_nodeCB_Hand_L(i_node, j3dSys.getModel()); + } + return TRUE; } /* 0000056C-000005F4 .text _nodeCB_Hand_L__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_nodeCB_Hand_L(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_nodeCB_Hand_L(J3DNode* i_node, J3DModel* i_model) { + J3DJoint* jnt_p = (J3DJoint *) i_node; + s32 jnt_no = jnt_p->getJntNo(); + + mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); + + mDoMtx_copy(mDoMtx_stack_c::get(), mHand_L_Mtx); + mDoMtx_copy(mDoMtx_stack_c::get(), j3dSys.mCurrentMtx); + i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 000005F4-00000640 .text nodeCB_Hand_R__FP7J3DNodei */ -static BOOL nodeCB_Hand_R(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCB_Hand_R(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* actor_p = (daNpc_Ls1_c *) j3dSys.getModel()->getUserArea(); + actor_p->_nodeCB_Hand_R(i_node, j3dSys.getModel()); + } + return TRUE; } /* 00000640-000006C8 .text _nodeCB_Hand_R__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_nodeCB_Hand_R(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_nodeCB_Hand_R(J3DNode* i_node, J3DModel* i_model) { + J3DJoint* jnt_p = (J3DJoint *) i_node; + s32 jnt_no = jnt_p->getJntNo(); + + mDoMtx_stack_c::copy(i_model->getAnmMtx(jnt_no)); + + mDoMtx_copy(mDoMtx_stack_c::get(), mHand_R_Mtx); + mDoMtx_copy(mDoMtx_stack_c::get(), j3dSys.mCurrentMtx); + i_model->setAnmMtx(jnt_no, mDoMtx_stack_c::get()); } /* 000006C8-00000714 .text Ls_hand_nodeCB_Hand_L__FP7J3DNodei */ -static BOOL Ls_hand_nodeCB_Hand_L(J3DNode*, int) { - /* Nonmatching */ +static BOOL Ls_hand_nodeCB_Hand_L(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* actor_p = (daNpc_Ls1_c *) j3dSys.getModel()->getUserArea(); + actor_p->_Ls_hand_nodeCB_Hand_L(i_node, j3dSys.getModel()); + } + return TRUE; } /* 00000714-00000770 .text _Ls_hand_nodeCB_Hand_L__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_Ls_hand_nodeCB_Hand_L(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_Ls_hand_nodeCB_Hand_L(J3DNode* i_node, J3DModel* i_model) { + J3DJoint* jnt_p = (J3DJoint *) i_node; + int jnt_no = jnt_p->getJntNo(); + + mDoMtx_copy(mHand_L_Mtx, j3dSys.mCurrentMtx); + i_model->setAnmMtx(jnt_no, mHand_L_Mtx); } /* 00000770-000007BC .text Ls_hand_nodeCB_Hand_R__FP7J3DNodei */ -static BOOL Ls_hand_nodeCB_Hand_R(J3DNode*, int) { - /* Nonmatching */ +static BOOL Ls_hand_nodeCB_Hand_R(J3DNode* i_node, int i_calcTiming) { + if (i_calcTiming == J3DNodeCBCalcTiming_In && j3dSys.getModel()->getUserArea() != 0) { + daNpc_Ls1_c* a_actor = (daNpc_Ls1_c *) j3dSys.getModel()->getUserArea(); + a_actor->_Ls_hand_nodeCB_Hand_R(i_node, j3dSys.getModel()); + } + return TRUE; } /* 000007BC-00000818 .text _Ls_hand_nodeCB_Hand_R__11daNpc_Ls1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ls1_c::_Ls_hand_nodeCB_Hand_R(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ls1_c::_Ls_hand_nodeCB_Hand_R(J3DNode* i_node, J3DModel* i_model) { + J3DJoint* jnt_p = (J3DJoint *) i_node; + int jnt_no = jnt_p->getJntNo(); + + mDoMtx_copy(mHand_R_Mtx, j3dSys.mCurrentMtx); + i_model->setAnmMtx(jnt_no, mHand_R_Mtx); } /* 00000818-00000838 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daNpc_Ls1_c*)i_this)->CreateHeap(); } /* 00000838-000008B0 .text searchActor_Bm1__FPvPv */ -void searchActor_Bm1(void*, void*) { - /* Nonmatching */ +void* searchActor_Bm1(void* i_actorP, void* i_unusedP) { + UNUSED(i_unusedP); + + if ( + l_check_wrk < ARRAY_SSIZE(l_check_inf) && + fopAc_IsActor(i_actorP) && + fpcM_GetName(i_actorP) == PROC_NPC_BM1 + ) { + l_check_inf[l_check_wrk] = (fopAc_ac_c*)i_actorP; + l_check_wrk++; + } + + return NULL; } /* 000008B0-00000900 .text searchActor_kamome_Set_NOSTOP_DEMO__FPvPv */ -void searchActor_kamome_Set_NOSTOP_DEMO(void*, void*) { - /* Nonmatching */ +void* searchActor_kamome_Set_NOSTOP_DEMO(void* i_actorP, void* i_unusedP) { + UNUSED(i_unusedP); + + if (fopAc_IsActor(i_actorP) && fpcM_GetName(i_actorP) == PROC_KAMOME) { + fopAcM_OnStatus((fopAc_ac_c*)i_actorP, fopAcStts_UNK4000_e); + } + + return NULL; } /* 00000900-00000950 .text searchActor_kamome_Clr_NOSTOP_DEMO__FPvPv */ -void searchActor_kamome_Clr_NOSTOP_DEMO(void*, void*) { - /* Nonmatching */ +void* searchActor_kamome_Clr_NOSTOP_DEMO(void* i_actorP, void* i_unused) { + UNUSED(i_unused); + + if (fopAc_IsActor(i_actorP) && fpcM_GetName(i_actorP) == PROC_KAMOME) { + fopAcM_OffStatus((fopAc_ac_c*) i_actorP, fopAcStts_UNK4000_e); + } + + return NULL; } /* 00000950-000009B4 .text init_LS1_0__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::init_LS1_0() { - /* Nonmatching */ +bool daNpc_Ls1_c::init_LS1_0() { + set_action(&daNpc_Ls1_c::wait_action1, NULL); + fopAcM_OffStatus(this, fopAcStts_NOCULLEXEC_e); + return true; } /* 000009B4-00000A00 .text init_LS1_1__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::init_LS1_1() { - /* Nonmatching */ +bool daNpc_Ls1_c::init_LS1_1() { + set_action(&daNpc_Ls1_c::demo_action1, NULL); + return true; } /* 00000A00-00000A20 .text init_LS1_2__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::init_LS1_2() { - /* Nonmatching */ +bool daNpc_Ls1_c::init_LS1_2() { + return init_LS1_1(); } /* 00000A20-00000A40 .text init_LS1_3__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::init_LS1_3() { - /* Nonmatching */ +bool daNpc_Ls1_c::init_LS1_3() { + return init_LS1_0(); } /* 00000A40-00000A60 .text init_LS1_4__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::init_LS1_4() { - /* Nonmatching */ +bool daNpc_Ls1_c::init_LS1_4() { + return init_LS1_1(); } +extern dCcD_SrcCyl dNpc_cyl_src; /* 00000A60-00000C6C .text createInit__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::createInit() { - /* Nonmatching */ +bool daNpc_Ls1_c::createInit() { + for (int i = 0; i < ARRAY_SSIZE(mEventIDTbl); i++) { + mEventIDTbl[i] = dComIfGp_evmng_getEventIdx(l_evn_tbl[i]); + } + mEventCut.setActorInfo2("Ls1", this); + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + + switch (mType) { + case 3: + case 4: + break; + } + + attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xA9; + attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xA9; + gravity = 0.0f; + mBckResIndex = 0xE; + + bool init_result; + switch (mType) { + case 0: + init_result = init_LS1_0(); + break; + case 1: + init_result = init_LS1_1(); + break; + case 2: + init_result = init_LS1_2(); + break; + case 3: + init_result = init_LS1_3(); + break; + case 4: + init_result = init_LS1_4(); + break; + default: + init_result = 0; + break; + } + + if (!init_result) { + return false; + } + + mAngle = current.angle; + shape_angle = mAngle; + + mStts.Init(0xFF, 0xFF, this); + mCyl.SetStts(&mStts); + mCyl.Set(dNpc_cyl_src); + + play_animation(); + + if (mType) { + mObjAcch.CrrPos(*dComIfG_Bgsp()); + } + + tevStr.mRoomNo =dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + mpMorf->setMorf(0.0f); + setMtx(true); + + return true; } /* 00000C6C-00000D48 .text play_animation__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::play_animation() { - /* Nonmatching */ + u32 snd_id = 0; + if (mBtkResIDIndex == 0 && m838 == true) { + setEyeCtrl(); + } else { + clrEyeCtrl(); + } + + play_btp_anm(); + play_btk_anm(); + + if (mObjAcch.ChkGroundHit()) { + snd_id = dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd); + } + + mbMorfAnimStopped = mpMorf->play(&eyePos, snd_id, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + + if (mpMorf->getFrame() < mPrevMorfFrame) { + mbMorfAnimStopped = true; + } + + mPrevMorfFrame = mpMorf->getFrame(); } /* 00000D48-00000EF0 .text setMtx__11daNpc_Ls1_cFb */ -void daNpc_Ls1_c::setMtx(bool) { - /* Nonmatching */ +void daNpc_Ls1_c::setMtx(bool i_setEyePos) { + mpMorf->getModel()->setBaseScale(scale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(mAngle); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + + mpMorf->calc(); + mpLsHandModel->calc(); + + if (mpTelescopeModel) { + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(m_hnd_R_jnt_num)); + if (m841) { + mDoMtx_stack_c::transM(5.7f, -17.5f, -1.0f); + mDoMtx_stack_c::scaleM(mTelescopeScale, mTelescopeScale, mTelescopeScale); + mDoMtx_stack_c::XYZrotM(-0x1D27, 0x3B05, -0x5C71); + } else { + mDoMtx_stack_c::transM(5.5f, -3.0f, -2.0f); + mDoMtx_stack_c::scaleM(mTelescopeScale, mTelescopeScale, mTelescopeScale); + mDoMtx_stack_c::XYZrotM(-0x1D27, 0x3B05, -0x5C71); + } + mpTelescopeModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mpTelescopeModel->calc(); + } + setAttention(i_setEyePos); } /* 00000EF0-00000F04 .text bckResID__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::bckResID(int) { - /* Nonmatching */ +int daNpc_Ls1_c::bckResID(int i_bckResIDIndex) { + static const int a_resID_tbl[] = { + LS_BCK_LS_WAIT01, + LS_BCK_LS_WAIT02, + LS_BCK_LS_WAIT03, + LS_BCK_LS_WAIT04, + LS_BCK_LS_WAIT05, + LS_BCK_LS_WAIT06, + LS_BCK_LS_WATASU, + LS_BCK_LS_FURIMUKI, + LS_BCK_LS_NOZOKU, + LS_BCK_LS_GET, + LS_BCK_LS_WAIT07, + LS_BCK_LS_TALK01, + LS_BCK_LS_DEMOWAIT, + LS_BCK_LS_DEMOLOOK + }; + return a_resID_tbl[i_bckResIDIndex]; } /* 00000F04-00000F18 .text btpResID__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::btpResID(int) { - /* Nonmatching */ +int daNpc_Ls1_c::btpResID(int i_btpResIDIndex) { + static const int a_resID_tbl[] = { + LS_BTP_FUAN, + LS_BTP_MABA, + LS_BTP_FUAN02, + LS_BTP_KIZUKU, + LS_BTP_LS_GET, + LS_BTP_NGWARAI, + LS_BTP_NOZOKU, + LS_BTP_OKORI, + LS_BTP_WARAI, + LS_BTP_LS_DEMOLOOK, + LS_BTP_LS_DEMOWAIT + }; + return a_resID_tbl[i_btpResIDIndex]; } /* 00000F18-00000F2C .text btkResID__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::btkResID(int) { - /* Nonmatching */ +int daNpc_Ls1_c::btkResID(int i_btkResIDIndex) { + static const int a_resID_tbl[] = { + LS_BTK_LS, + LS_BTK_LS_DEMOLOOK, + LS_BTK_LS_DEMOWAIT + }; + return a_resID_tbl[i_btkResIDIndex]; } /* 00000F2C-00001030 .text setBtp__11daNpc_Ls1_cFScb */ -void daNpc_Ls1_c::setBtp(signed char, bool) { - /* Nonmatching */ +bool daNpc_Ls1_c::setBtp(s8 i_btpResIDIndex, bool i_bModify) { + J3DModel* morf_model_p = mpMorf->getModel(); + + if (i_btpResIDIndex < 0) { + return false; + } + + J3DAnmTexPattern* a_btp = (J3DAnmTexPattern*) dComIfG_getObjectIDRes(mArcName, btpResID(i_btpResIDIndex)); + JUT_ASSERT(DEMO_SELECT(0x301, 0x302), a_btp != NULL); + mBtpResIDIndex = i_btpResIDIndex; + mBtpFrame = 0; + mTimer1 = 0; + + return mBtpAnm.init( + morf_model_p->getModelData(), + a_btp, TRUE, + 0, 1.0f, 0, -1, + i_bModify, 0 + ) != 0; } /* 00001030-000010B0 .text setMat__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::setMat() { - /* Nonmatching */ + J3DModel* model_p = mpMorf->getModel(); + u16 material_num = mBtkAnm.getBtkAnm()->getUpdateMaterialNum(); + for (u16 i = 0; i < material_num; i++) { + u16 material_id = mBtkAnm.getBtkAnm()->getUpdateMaterialID(i); + mpMatAnms[i] = (daNpc_Ls1_matAnm_c *) model_p->getModelData()->getMaterialNodePointer(material_id)->getMaterialAnm(); + } } /* 000010B0-000011CC .text setBtk__11daNpc_Ls1_cFScb */ -void daNpc_Ls1_c::setBtk(signed char, bool) { - /* Nonmatching */ +bool daNpc_Ls1_c::setBtk(s8 i_btkResIDIndex, bool i_bModify) { + J3DModel* morf_model_p = mpMorf->getModel(); + + if (i_btkResIDIndex < 0) { + return false; + } + + J3DAnmTextureSRTKey* a_btk = (J3DAnmTextureSRTKey *) dComIfG_getObjectIDRes(mArcName, btkResID(i_btkResIDIndex)); + JUT_ASSERT(DEMO_SELECT(0x32B, 0x32C), a_btk != NULL); + + mBtkResIDIndex = i_btkResIDIndex; + mBtkFrame = 0; + + if (mBtkAnm.init( + morf_model_p->getModelData(), + a_btk, TRUE, + 0, 1.0f, 0, -1, + i_bModify, 0 + ) != 0) { + if (!i_bModify) { + setMat(); + } + return true; + } + + return false; } /* 000011CC-00001238 .text init_texPttrnAnm__11daNpc_Ls1_cFScb */ -void daNpc_Ls1_c::init_texPttrnAnm(signed char, bool) { - /* Nonmatching */ +bool daNpc_Ls1_c::init_texPttrnAnm(s8 i_resIndex, bool i_bModify) { + static const u8 a_btk_num_tbl[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2 + }; + + if (setBtp(i_resIndex, i_bModify) == false) { + return false; + } + + return setBtk(a_btk_num_tbl[i_resIndex], i_bModify); } /* 00001238-000012D4 .text play_btp_anm__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::play_btp_anm() { - /* Nonmatching */ + u8 frame_max = mBtpAnm.getBtpAnm()->getFrameMax(); + if (mBtpResIDIndex != 1 || cLib_calcTimer(&mTimer1) == 0) { + mBtpFrame++; + if (mBtpFrame >= frame_max) { + if (mBtpResIDIndex != 1) { + mBtpFrame = frame_max; + } else { + mTimer1 = cLib_getRndValue(60, 90); + mBtpFrame = 0; + } + } + } } /* 000012D4-00001490 .text eye_ctrl__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::eye_ctrl() { - /* Nonmatching */ + f32 mult, fVar2, fVar1, min, max; + if (mbEyeCtrlSet) { + fVar1 = ((f32)m848 / (f32)l_HIO.mPrm.m30); + fVar2 = ((f32)m846 / (f32)l_HIO.mPrm.m30); + + min = -1.0f; + max = 1.0f; + mult = 0.1f; + + fVar1 = mult * fVar1; + fVar2 = mult * fVar2; + + fVar1 = cLib_minMaxLimit(fVar1, min, max); + fVar2 = cLib_minMaxLimit(fVar2, min, max); + } else { + fVar1 = 0.0f; + fVar2 = fVar1; + } + + if (mpMatAnms[0]) { + cLib_addCalc(&mpMatAnms[0]->getNowOffsetX(), fVar2, 0.5f, 0.1f, 0.03f); + cLib_addCalc(&mpMatAnms[0]->getNowOffsetY(), fVar1, 0.5f, 0.1f, 0.03f); + } + + fVar2 *= -1.0f; + if (mpMatAnms[1]) { + cLib_addCalc(&mpMatAnms[1]->getNowOffsetX(), fVar2, 0.5f, 0.1f, 0.03f); + cLib_addCalc(&mpMatAnms[1]->getNowOffsetY(), fVar1, 0.5f, 0.1f, 0.03f); + } } /* 00001490-000014E8 .text play_btk_anm__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::play_btk_anm() { - /* Nonmatching */ + u8 frame_max = mBtkAnm.getBtkAnm()->getFrameMax(); + if (m838) { + eye_ctrl(); + } else { + mBtkFrame++; + if (mBtkFrame >= frame_max) { + mBtkFrame = frame_max; + } + } } /* 000014E8-00001584 .text setAnm_anm__11daNpc_Ls1_cFPQ211daNpc_Ls1_c9anm_prm_c */ -void daNpc_Ls1_c::setAnm_anm(daNpc_Ls1_c::anm_prm_c*) { - /* Nonmatching */ +void daNpc_Ls1_c::setAnm_anm(daNpc_Ls1_c::anm_prm_c* i_anmPrmP) { + if (i_anmPrmP->mBckResIndex < 0 || mBckResIndex == i_anmPrmP->mBckResIndex) { + return; + } else { + int id = bckResID(i_anmPrmP->mBckResIndex); + dNpc_setAnmIDRes( + mpMorf, + i_anmPrmP->mLoopMode, + i_anmPrmP->mMorf, i_anmPrmP->mSpeed, + id, -1, + mArcName + ); + mBckResIndex = i_anmPrmP->mBckResIndex; + mbMorfAnimStopped = false; + m831 = 0; + mPrevMorfFrame = 0.0f; + } } /* 00001584-000015F4 .text setAnm_NUM__11daNpc_Ls1_cFii */ -void daNpc_Ls1_c::setAnm_NUM(int, int) { - /* Nonmatching */ +void daNpc_Ls1_c::setAnm_NUM(int i_anmPrmIndex, int param_2) { + static anm_prm_c a_anm_prm_tbl[14] = { + { 0, 1, 8.0f, 1.0f, 2 }, + { 1, 1, 8.0f, 1.0f, 0 }, + { 2, 1, 8.0f, 1.0f, 2 }, + { 3, 1, 8.0f, 1.0f, 2 }, + { 4, 1, 8.0f, 1.0f, 2 }, + { 5, 1, 8.0f, 1.0f, 2 }, + { 6, 1, 8.0f, 1.0f, 0 }, + { 7, 1, 8.0f, 1.0f, 0 }, + { 8, 6, 8.0f, 1.0f, 2 }, + { 9, 4, 8.0f, 1.0f, 0 }, + { 10, 1, 8.0f, 1.0f, 2 }, + { 11, 1, 8.0f, 1.0f, 2 }, + { 12, 10, 8.0f, 1.0f, 2 }, + { 13, 10, 8.0f, 1.0f, 0 } + }; + + if (param_2 != 0) { + init_texPttrnAnm(a_anm_prm_tbl[i_anmPrmIndex].mResIndex, true); + } + + setAnm_anm(&a_anm_prm_tbl[i_anmPrmIndex]); } /* 000015F4-00001660 .text setAnm__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::setAnm() { - /* Nonmatching */ + static anm_prm_c a_anm_prm_tbl[6] = { + { -1, -1, 0.0f, 0.0f, -1 }, + { 0, 1, 8.0f, 1.0f, 2 }, + { 5, 1, 8.0f, 1.0f, 2 }, + { 10, 2, 8.0f, 1.0f, 2 }, + { 5, 1, 8.0f, 1.0f, 2 }, + { -1, -1, 0.0f, 0.0f, -1 } + }; + + init_texPttrnAnm(a_anm_prm_tbl[m851].mResIndex, true); + setAnm_anm(&a_anm_prm_tbl[m851]); } /* 00001660-000016F8 .text chngAnmTag__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::chngAnmTag() { - /* Nonmatching */ + switch (mMesgAnimeTag) { + case 0: + init_texPttrnAnm(8, 1); + return; + case 11: + init_texPttrnAnm(3, 1); + return; + case 12: + init_texPttrnAnm(5, 1); + return; + case 13: + init_texPttrnAnm(0, 1); + case 0xFF: + return; + } } /* 000016F8-0000171C .text ctrlAnmTag__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::ctrlAnmTag() { - /* Nonmatching */ + if ((s32)mMesgAnimeTag < 0xE) { + if ((s32)mMesgAnimeTag == 0) { + return; + } else if ((s32)mMesgAnimeTag < 0) { + return; + } + return; + } + + switch (mMesgAnimeTag) { + case 0xFF: + break; + } + + return; } /* 0000171C-00001820 .text chngAnmAtr__11daNpc_Ls1_cFUc */ -void daNpc_Ls1_c::chngAnmAtr(unsigned char) { - /* Nonmatching */ +void daNpc_Ls1_c::chngAnmAtr(u8 param_1) { + if ((m84B == 3 || m84B == 5) && (param_1 == 3 || param_1 == 5)) { + init_texPttrnAnm(8, true); + m84B = param_1; + return; + } + + if (param_1 == m84B || param_1 > 17) { + return; + } + + m84B = param_1; + setAnm_ATR(1); + + switch (param_1) { + case 1: + mTimer2 = cLib_getRndValue(60, 90); + break; + case 3: + case 5: + mTimer2 = (g_Counter.mCounter0 & 3) + 3; + break; + case 7: + mTelescopeScale = 0.0f; + break; + case 12: + case 14: + case 15: + case 16: + mTimer2 = 2; + break; + default: + break; + } + + return; } /* 00001820-00001A60 .text ctrlAnmAtr__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::ctrlAnmAtr() { - /* Nonmatching */ +void daNpc_Ls1_c::ctrlAnmAtr() { + switch(m84B) { + case 1: + if (cLib_calcTimer(&mTimer2) == 0) { + m84B = 2; + setAnm_ATR(1); + } + break; + case 2: + if (mbMorfAnimStopped) { + m84B = 1; + setAnm_ATR(1); + } + break; + case 3: + case 5: + if (mbMorfAnimStopped && cLib_calcTimer(&mTimer2) == 0) { + mTimer2 = (g_Counter.mCounter0 & 3) + 3; + switch (m84B) { + case 3: + m84B = 5; + break; + case 4: + break; + case 5: + m84B = 3; + break; + default: + break; + } + setAnm_ATR(0); + } + break; + case 7: + if (mpMorf->checkFrame(23.0f) != 0) { + mTelescopeScale = 1.0f; + } + break; + case 12: + case 14: + case 15: + case 16: + if (mbMorfAnimStopped && (cLib_calcTimer(&mTimer2) == 0)) { + switch (m84B) { + case 12: + if (mBckResIndex != 10) { + setAnm_NUM(10,1); + init_texPttrnAnm(2,true); + } + break; + case 14: + if (mBckResIndex != 5) { + setAnm_NUM(5,1); + init_texPttrnAnm(8, true); + } + break; + case 15: + if(mBckResIndex != 11) { + setAnm_NUM(0xB,1); + init_texPttrnAnm(8, true); + } + break; + case 16: + if (mBckResIndex != 4) { + setAnm_NUM(4,1); + init_texPttrnAnm(8, true); + } + break; + default: + break; + } + } + break; + default: + break; + } } /* 00001A60-00001ACC .text setAnm_ATR__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::setAnm_ATR(int) { - /* Nonmatching */ +void daNpc_Ls1_c::setAnm_ATR(int param_1) { + static anm_prm_c a_anm_prm_tbl[17] = { + { 5, 1, 8.0f, 1.0f, 2 }, + { 0, 1, 8.0f, 1.0f, 2 }, + { 1, 1, 8.0f, 1.0f, 0 }, + { 2, 8, 8.0f, 1.0f, 2 }, + { 3, 2, 8.0f, 1.0f, 2 }, + { 4, 8, 8.0f, 1.0f, 2 }, + { 7, 1, 8.0f, 1.0f, 0 }, + { 6, 8, 8.0f, 1.0f, 0 }, + { 8, 6, 8.0f, 1.0f, 2 }, + { 9, 4, 8.0f, 1.0f, 0 }, + { 10, 0, 8.0f, 1.0f, 2 }, + { 10, 2, 8.0f, 1.0f, 2 }, + { 3, 2, 8.0f, 1.0f, 2 }, + { 5, 8, 8.0f, 1.0f, 2 }, + { 11, 8, 8.0f, 1.0f, 2 }, + { 3, 8, 8.0f, 1.0f, 2 }, + { 11, 8, 8.0f, 1.0f, 2 } + }; + + if (param_1 != 0) { + init_texPttrnAnm(a_anm_prm_tbl[m84B].mResIndex, true); + } + + setAnm_anm(&a_anm_prm_tbl[m84B]); } /* 00001ACC-00001B88 .text anmAtr__11daNpc_Ls1_cFUs */ -void daNpc_Ls1_c::anmAtr(unsigned short) { - /* Nonmatching */ +void daNpc_Ls1_c::anmAtr(u16 param_1) { + u8 mesg_anime_tag; + switch (param_1) { + case 6: + if (m857 == 0) { + chngAnmAtr(dComIfGp_getMesgAnimeAttrInfo()); + m857++; + } + mesg_anime_tag = dComIfGp_getMesgAnimeTagInfo(); + if (mesg_anime_tag!= 0xFF && mesg_anime_tag != mMesgAnimeTag) { + dComIfGp_setMesgAnimeTagInfo(0xFF); + mMesgAnimeTag = mesg_anime_tag; + chngAnmTag(); + } + break; + case 14: + m857 = 0; + break; + default: + break; + } + ctrlAnmAtr(); + ctrlAnmTag(); } /* 00001B88-00001C30 .text next_msgStatus__11daNpc_Ls1_cFPUl */ -void daNpc_Ls1_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Ls1_c::next_msgStatus(u32* o_msgNoP) { + u16 msg_status = fopMsgStts_MSG_CONTINUES_e; + switch (*o_msgNoP) { + case 0xBB9: + if (dComIfGs_getClearCount()) { + *o_msgNoP = 0xBDA; + break; + } + *o_msgNoP = 0xBBA; + break; + case 0xBBA: +#if VERSION > VERSION_DEMO + case 0xBDA: +#endif + *o_msgNoP = 0xBBB; + break; + case 0xBBB: + *o_msgNoP = 0xBBC; + break; + case 0xBBC: + *o_msgNoP = 0xBBD; + break; + case 0xBBD: + *o_msgNoP = 0xBDC; + break; + case 0xBBE: + *o_msgNoP = 0xBBF; + break; + case 0xBC5: + *o_msgNoP = 0xBC6; + break; + default: + msg_status = fopMsgStts_MSG_ENDS_e; + break; + } + return msg_status; } /* 00001C30-00001D48 .text getMsg_LS1_0__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::getMsg_LS1_0() { - /* Nonmatching */ +u32 daNpc_Ls1_c::getMsg_LS1_0() { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0001)) { + if (m835) { + m835 = false; + return dComIfGs_getpCollect()->checkCollect(0) != 0 ? 0xBC4 : 0xBC5; + } + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0280)) { + return 0xBC9; + } else { + return dComIfGs_getpCollect()->checkCollect(0) != 0 ? 0xBC8 : 0xBC7; + } + } + + if (m836) { + m836 = false; + return 0xBBE; + } + + + if (dComIfGp_getSelectItem(dItemBtn_X_e) == dItem_TELESCOPE_e) { + return 0xBCB; + } + + if (dComIfGp_getSelectItem(dItemBtn_Y_e) == dItem_TELESCOPE_e) { + return 0xBCC; + } + + if (dComIfGp_getSelectItem(dItemBtn_Z_e) == dItem_TELESCOPE_e) { + return 0xBCD; + } + + return 0xBC0; } /* 00001D48-00001D50 .text getMsg_LS1_3__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::getMsg_LS1_3() { - /* Nonmatching */ +u32 daNpc_Ls1_c::getMsg_LS1_3() { + return 0xBD9; } /* 00001D50-00001DAC .text getMsg__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Ls1_c::getMsg() { + u32 result = 0; + switch (mType) { + case 0: + result = getMsg_LS1_0(); + break; + case 3: + result = getMsg_LS1_3(); + break; + case 4: + default: + break; + } + + return result; } /* 00001DAC-00001E38 .text eventOrder__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::eventOrder() { - /* Nonmatching */ + if (m850 == 1 || m850 == 2) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if (m850 == 1) { + fopAcM_orderSpeakEvent(this); + } + } else if (m850 >= 3) { + mEventIndex = m850 - 3; + fopAcM_orderOtherEventId(this, mEventIDTbl[mEventIndex]); + } } /* 00001E38-00001F78 .text checkOrder__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.checkCommandDemoAccrpt()) { + if (dComIfGp_evmng_startCheck(mEventIDTbl[mEventIndex]) && m850 >= 3) { + switch (mEventIndex) { + case 0: + dComIfGp_getCamera(0)->mCamera.Stop(); + mDoAud_bgmStreamPlay(); + m834 = true; + break; + case 1: + cLib_targetAngleY(&m7CC[0], ¤t.pos); + m83B = true; + break; + case 2: + mTelescopeScale = 0.0f; + setAnm_NUM(9, 1); + break; + } + m850 = 0; + m84B = 0xFF; + mMesgAnimeTag = 0xFF; + } + } else if (eventInfo.checkCommandTalk()) { + if (m850 == 1 || m850 == 2) { + m850 = 0; + m83F = true; + } + } } /* 00001F78-00002010 .text chk_talk__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::chk_talk() { - /* Nonmatching */ +bool daNpc_Ls1_c::chk_talk() { + if (dComIfGp_event_chkTalkXY()) { + if (dComIfGp_evmng_ChkPresentEnd()) { + mItemNo = dComIfGp_event_getPreItemNo(); + return true; + } + return false; + } + + mItemNo = 0xFF; + return true; } /* 00002010-00002050 .text chk_parts_notMov__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::chk_parts_notMov() { - /* Nonmatching */ +bool daNpc_Ls1_c::chk_parts_notMov() { + return mJointHeadY != m_jnt.getHead_y() || + mJointBackboneY != m_jnt.getBackbone_y() || + mActorAngleY != current.angle.y; } /* 00002050-000020A4 .text searchByID__11daNpc_Ls1_cFUiPi */ -void daNpc_Ls1_c::searchByID(fpc_ProcID, int*) { - /* Nonmatching */ +fopAc_ac_c* daNpc_Ls1_c::searchByID(fpc_ProcID i_PID, int* param_2) { + fopAc_ac_c* actor_p; + + actor_p = NULL; + *param_2 = 0; + if (!fopAcM_SearchByID(i_PID, &actor_p)) { + *param_2 = 1; + } + + return actor_p; } /* 000020A4-00002154 .text partner_search_sub__11daNpc_Ls1_cFPFPvPv_Pv */ -void daNpc_Ls1_c::partner_search_sub(void* (*)(void*, void*)) { - /* Nonmatching */ +bool daNpc_Ls1_c::partner_search_sub(void* (*i_funcP)(void*, void*)) { + bool result = false; + mBm1ProcID = fpcM_ERROR_PROCESS_ID_e; + + l_check_wrk = 0; + for (int i = 0; i < ARRAY_SSIZE(l_check_inf); i++) { + l_check_inf[i] = NULL; + } + + fpcEx_Search(i_funcP, this); + + if (l_check_wrk != 0) { + mBm1ProcID = fpcM_GetID(l_check_inf[0]); + result = true; + } + + return result; } /* 00002154-000021D4 .text partner_search__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::partner_search() { - /* Nonmatching */ + bool temp = false; + if (m856 == 1) { + switch (mType) { + case 0: + temp = partner_search_sub(searchActor_Bm1); + break; + case 1: + case 2: + case 3: + case 4: + temp = true; + break; + default: + break; + } + if (temp) { + m856++; + } + } } /* 000021D4-0000220C .text setEyeCtrl__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::setEyeCtrl() { - /* Nonmatching */ + for (int i = 0; i < ARRAY_SSIZE(mpMatAnms); i++) { + daNpc_Ls1_matAnm_c* mat_anm_p = mpMatAnms[i]; + if (mat_anm_p) { + mat_anm_p->setMoveFlag(); + } + } + mbEyeCtrlSet = true; } /* 0000220C-00002244 .text clrEyeCtrl__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::clrEyeCtrl() { - /* Nonmatching */ + for (int i = 0; i < ARRAY_SSIZE(mpMatAnms); i++) { + daNpc_Ls1_matAnm_c* mat_anm_p = mpMatAnms[i]; + if (mat_anm_p) { + mat_anm_p->clrMoveFlag(); + } + } + mbEyeCtrlSet = false; } /* 00002244-00002464 .text lookBack__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::lookBack() { - /* Nonmatching */ + cXyz player_eye_pos; + cXyz current_pos; + + mJointHeadY = m_jnt.getHead_y(); + mJointBackboneY = m_jnt.getBackbone_y(); + mActorAngleY = current.angle.y; + + current_pos = current.pos; + current_pos.y = eyePos.y; + + player_eye_pos.set(0.0f, 0.0f, 0.0f); + + cXyz* player_eye_pos_p = NULL; + s16 target_y = current.angle.y; + bool temp_m840 = m840; + + switch (m853) { + case 1: + mPlayerEyePos = dNpc_playerEyePos(l_HIO.mPrm.mPlayerEyePosOffsetY); + player_eye_pos = mPlayerEyePos; + player_eye_pos_p = &player_eye_pos; + m838 = true; + break; + case 2: + player_eye_pos = mPlayerEyePos; + player_eye_pos_p = &player_eye_pos; + break; + case 3: + target_y = m82E; + m838 = false; + break; + case 4: + { + int param; + fopAc_ac_c* actor_p = searchByID(m790, ¶m); + if (actor_p && param == 0) { + mPlayerEyePos = actor_p->current.pos; + mPlayerEyePos.y = actor_p->eyePos.y; + player_eye_pos = mPlayerEyePos; + player_eye_pos_p = &player_eye_pos; + m838 = true; + } + } + break; + default: + m838 = false; + break; + } + + m_jnt.lookAtTarget_2(¤t.angle.y, player_eye_pos_p, current_pos, target_y, l_HIO.mPrm.m12, temp_m840); + mHalfHeadAngleX = m_jnt.getHead_x() / 2; + mHalfHeadAngleY = m_jnt.getHead_y() / 2; + m848 = mHalfHeadAngleX; + m846 = -mHalfHeadAngleY; } /* 00002464-000024E4 .text chkAttention__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::chkAttention() { - /* Nonmatching */ +bool daNpc_Ls1_c::chkAttention() { + dAttention_c& attention = dComIfGp_getAttention(); + if (attention.LockonTruth()) { + return this == attention.LockonTarget(0); + } else { + return this == attention.ActionTarget(0); + } } /* 000024E4-0000253C .text setAttention__11daNpc_Ls1_cFb */ -void daNpc_Ls1_c::setAttention(bool) { - /* Nonmatching */ +void daNpc_Ls1_c::setAttention(bool i_setEyePos) { + attention_info.position.set( + current.pos.x, + current.pos.y + l_HIO.mPrm.mAttPosOffsetY, + current.pos.z + ); + + if (!mbSetEyePos && !i_setEyePos) { + return; + } + + eyePos.set( + mTransformedEyePos.x, + mTransformedEyePos.y, + mTransformedEyePos.z + ); } /* 0000253C-00002670 .text decideType__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::decideType(int) { - /* Nonmatching */ +bool daNpc_Ls1_c::decideType(int i_type) { + if (m854 > 0) { + return true; + } + + m854 = 1; + mType = -1; + + switch (i_type) { + case 0: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2A80)) { + mType = 0; + } + break; + case 1: + mType = 1; + break; + case 2: + mType = 2; + break; + case 3: + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2A80)) { + mType = 3; + } + break; + case 4: + mType = 4; + break; + } + + if (mType < 0) { + return 0; + } + + strcpy(mArcName, "Ls"); + return m854 != -1 && mType != -1; } /* 00002670-00002724 .text cut_init_LOK_PLYER__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::cut_init_LOK_PLYER(int) { - /* Nonmatching */ +void daNpc_Ls1_c::cut_init_LOK_PLYER(int param_1) { + int* prm_p = (int*)dComIfGp_evmng_getMyIntegerP(param_1, "prm_0"); + int prm = 0; + + m853 = 1; + m840 = 0; + + m_jnt.offBackBoneLock(); + m_jnt.offHeadLock(); + + if (prm_p) { + prm = *prm_p; + } + + if (cLib_checkBit(prm, 1 << 3) != 0) { + m_jnt.setTrn(); + } else { + if (cLib_checkBit(prm, 1)) { + m840 = 1; + } + if (cLib_checkBit(prm, 1 << 1)) { + m_jnt.onBackBoneLock(); + } + if (cLib_checkBit(prm, 1 << 2)) { + m_jnt.onHeadLock(); + } + } } /* 00002724-0000272C .text cut_move_LOK_PLYER__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::cut_move_LOK_PLYER() { - /* Nonmatching */ +bool daNpc_Ls1_c::cut_move_LOK_PLYER() { + return TRUE; } /* 0000272C-00002760 .text cut_init_PLYER_MOV__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::cut_init_PLYER_MOV(int) { - /* Nonmatching */ +void daNpc_Ls1_c::cut_init_PLYER_MOV(int param_1) { + UNUSED(param_1); + dComIfGp_evmng_setGoal(&m7CC[1]); } /* 00002760-00002768 .text cut_move_PLYER_MOV__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::cut_move_PLYER_MOV() { - /* Nonmatching */ +bool daNpc_Ls1_c::cut_move_PLYER_MOV() { + return TRUE; } /* 00002768-0000276C .text cut_init_WAI__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::cut_init_WAI(int) { - /* Nonmatching */ +void daNpc_Ls1_c::cut_init_WAI(int param_1) { + UNUSED(param_1); } /* 0000276C-000027C0 .text cut_move_WAI__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::cut_move_WAI() { - /* Nonmatching */ +bool daNpc_Ls1_c::cut_move_WAI() { + if (mBckResIndex != 1) { + return TRUE; + } + + if (mbMorfAnimStopped) { + setAnm_NUM(0, 1); + return TRUE; + } + + return FALSE; } /* 000027C0-00002828 .text cut_init_ANM_CHG__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::cut_init_ANM_CHG(int) { - /* Nonmatching */ +void daNpc_Ls1_c::cut_init_ANM_CHG(int param_1) { + int* anm_no_p = (int*)dComIfGp_evmng_getMyIntegerP(param_1, "AnmNo"); + int anm_no = mBckResIndex; + + if (anm_no_p) { + anm_no = *anm_no_p; + } + + setAnm_NUM(anm_no, 1); } /* 00002828-00002830 .text cut_move_ANM_CHG__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::cut_move_ANM_CHG() { - /* Nonmatching */ +bool daNpc_Ls1_c::cut_move_ANM_CHG() { + return TRUE; } /* 00002830-000029B0 .text privateCut__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::privateCut(int) { - /* Nonmatching */ +void daNpc_Ls1_c::privateCut(int i_staffIdx) { + static char* a_cut_tbl[] = { + "LOK_PLYER", + "PLYER_MOV", + "WAI", + "ANM_CHG" + }; + + if (i_staffIdx == -1) { + return; + } + + mActionIndex = dComIfGp_evmng_getMyActIdx(i_staffIdx, a_cut_tbl, ARRAY_SSIZE(a_cut_tbl), TRUE, 0); + + if (mActionIndex == -1) { + dComIfGp_evmng_cutEnd(i_staffIdx); + return; + } + + if (dComIfGp_evmng_getIsAddvance(i_staffIdx)) { + switch (mActionIndex) { + case 0: + cut_init_LOK_PLYER(i_staffIdx); + break; + case 1: + cut_init_PLYER_MOV(i_staffIdx); + break; + case 2: + cut_init_WAI(i_staffIdx); + break; + case 3: + cut_init_ANM_CHG(i_staffIdx); + break; + } + } + + bool cut_end; + switch (mActionIndex) { + case 0: + cut_end = cut_move_LOK_PLYER(); + break; + case 1: + cut_end = cut_move_PLYER_MOV(); + break; + case 2: + cut_end = cut_move_WAI(); + break; + case 3: + cut_end = cut_move_ANM_CHG(); + break; + default: + cut_end = TRUE; + } + if (cut_end) { + dComIfGp_evmng_cutEnd(i_staffIdx); + } } /* 000029B0-000029D4 .text endEvent__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::endEvent() { - /* Nonmatching */ + dComIfGp_event_reset(); + m84B = 0xFF; + mMesgAnimeTag = 0xFF; } /* 000029D4-00002A0C .text isEventEntry__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::isEventEntry() { - /* Nonmatching */ +int daNpc_Ls1_c::isEventEntry() { + return dComIfGp_evmng_getMyStaffId(mEventCut.getActorName()); } /* 00002A0C-00002BD0 .text event_proc__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::event_proc(int) { - /* Nonmatching */ +void daNpc_Ls1_c::event_proc(int i_staffIdx) { + if (dComIfGp_evmng_endCheck(mEventIDTbl[mEventIndex])) { + switch (mEventIndex) { + case 0: + if (m835) { + if (dComIfGp_getScopeMesgStatus() == 0) { + dComIfGs_onEventBit(1); + setStt(3); + m850 = 1; + mEventIndex = 3; + eventInfo.setEventId(mEventIDTbl[mEventIndex]); + m_jnt.offBackBoneLock(); + m834 = false; + m840 = 0; + m83B = false; + } else { + return; + } + } else { + if (!fopMsgM_releaseScopeMode()) { + return; + } + dComIfGp_getCamera(0)->mCamera.Start(); + daPy_getPlayerLinkActorClass()->onNoResetFlg0(daPy_py_c::daPyFlg0_SCOPE_CANCEL); + mDoAud_bgmStop(4); + mDoAud_bgmStart(0x8000000E); + m835 = true; + return; + } + break; + case 1: + m850 = 5; + break; + case 2: + setStt(2); + m850 = 1; + m836 = true; + break; + } + endEvent(); + } else { + if (mEventCut.cutProc()) { + return; + } + privateCut(i_staffIdx); + } + return; } /* 00002BD0-00002C7C .text set_action__11daNpc_Ls1_cFM11daNpc_Ls1_cFPCvPvPv_iPv */ -void daNpc_Ls1_c::set_action(int (daNpc_Ls1_c::*)(void*), void*) { - /* Nonmatching */ +BOOL daNpc_Ls1_c::set_action(ProcFunc i_newProcFunc, void* i_argsP) { + if (mCurrProcFunc != i_newProcFunc) { + if (mCurrProcFunc) { + m856 = 9; + (this->*mCurrProcFunc)(i_argsP); + } + mCurrProcFunc = i_newProcFunc; + m856 = 0; + (this->*mCurrProcFunc)(i_argsP); + } + return TRUE; } /* 00002C7C-00002D70 .text setStt__11daNpc_Ls1_cFSc */ -void daNpc_Ls1_c::setStt(signed char) { - /* Nonmatching */ +void daNpc_Ls1_c::setStt(s8 param_1) { + u8 prev_m851 = m851; + m851 = param_1; + switch (m851) { + case 1: + m850 = 0; + mTimer5 = cLib_getRndValue(60, 90); + break; + case 2: + m850 = 0; + m833 = 0; + mTimer3 = 0; + break; + case 3: + m850 = 0; + break; + case 4: + m850 = 0; + mTelescopeScale = 1.0f; + break; + case 5: + fpcEx_Search(searchActor_kamome_Set_NOSTOP_DEMO, this); + m850 = 0; + m84B = 0xFF; + mMesgAnimeTag = 0xFF; + m857 = 0; + m852 = prev_m851; + break; + } + setAnm(); } /* 00002D70-00002EF8 .text chk_areaIN__11daNpc_Ls1_cFffs4cXyz */ -void daNpc_Ls1_c::chk_areaIN(float, float, short, cXyz) { - /* Nonmatching */ +bool daNpc_Ls1_c::chk_areaIN(f32 param_1, f32 param_2, s16 param_3, cXyz param_4) { + f32 abs_xz = (dComIfGp_getLinkPlayer()->current.pos - param_4).absXZ(); + f32 fVar1 = dComIfGp_getLinkPlayer()->current.pos.y - param_4.y; + s16 sVar = cLib_targetAngleY(¶m_4, &dComIfGp_getLinkPlayer()->current.pos) - current.angle.y; + + if (abs_xz < param_1 && std::fabsf(fVar1) < param_2 && abs(sVar) < param_3) { + return true; + } else { + return false; + } } /* 00002EF8-00002FD8 .text get_playerEvnPos__11daNpc_Ls1_cFi */ -void daNpc_Ls1_c::get_playerEvnPos(int) { - /* Nonmatching */ +cXyz daNpc_Ls1_c::get_playerEvnPos(int param_1) { + const Vec pos[] = { + { 200.0f, 0.0f, -200.0f }, + { 100.0f, 0.0f, -80.0f }, + }; + + cXyz sp14; + cXyz sp08; + + sp14.set(pos[param_1].x, pos[param_1].y, pos[param_1].z); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&pos[param_1], &sp08); + + return sp08; } /* 00002FD8-00003154 .text chkTelescope_sph__11daNpc_Ls1_cF4cXyzff */ -void daNpc_Ls1_c::chkTelescope_sph(cXyz, float, float) { - /* Nonmatching */ +bool daNpc_Ls1_c::chkTelescope_sph(cXyz param_1, float param_2, float param_3) { + bool chk; + cXyz sp24; + cXyz sp18; + cXyz sp0C; + + sp24.set(319.5, 0.0f, 186.5f); + + mDoLib_project(¶m_1, &sp18); + + sp18.z = sp18.y; + sp18.y = 0.0f; + + sp0C.x = sp18.x - sp24.x; + sp0C.y = 0.0f; + sp0C.z = sp18.z - sp24.z; + + chk = false; + if (sp0C.normalizeRS()) { + sp0C *= param_2; + sp18 += sp0C; + chk = param_3 > std::sqrtf((sp18.x - sp24.x) * (sp18.x - sp24.x) + (sp18.z - sp24.z) * (sp18.z - sp24.z)); + } + return chk; } /* 00003154-00003258 .text chkTelescope__11daNpc_Ls1_cF4cXyzff */ -void daNpc_Ls1_c::chkTelescope(cXyz, float, float) { - /* Nonmatching */ +bool daNpc_Ls1_c::chkTelescope(cXyz param_1, float param_2, float param_3) { + cXyz sp20; + cXyz sp14; + cXyz sp08; + + sp20.set(319.5f, 0.0f, 186.5f); + + f32 fov_y = dComIfGd_getView()->mFovy / 40.0f; + if (fov_y > 1.0f) { + fov_y = 1.0f; + } + + mDoLib_project(¶m_1, &sp14); + + sp14.z = sp14.y; + sp14.y = 0.0f; + + sp08.x = fov_y * (sp14.x - sp20.x); + sp08.y = 0.0f; + sp08.z = fov_y * (sp14.z - sp20.z); + + return fabs(sp08.x) < param_2 && (sp08.z > param_3); } /* 00003258-000036B0 .text telescope_proc__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::telescope_proc() { - /* Nonmatching */ +bool daNpc_Ls1_c::telescope_proc() { + int param; + daNpc_Bm1_c* bm1_npc_p = (daNpc_Bm1_c *) searchByID(mBm1ProcID, ¶m); + if (!bm1_npc_p || param == 1) { + return false; + } + + u8 scope_mesg_status = dComIfGp_getScopeMesgStatus(); + if (scope_mesg_status == 0) { + if (dComIfGp_checkPlayerStatus0(0, daPyStts0_TELESCOPE_LOOK_e) != 0) { + if (g_dComIfG_gameInfo.play.field_0x4978) { + daPy_getPlayerLinkActorClass()->setPlayerPosAndAngle(&m7CC[1], 0xCC70); + } + dComIfGp_setScopeType(1); + return true; + } + return false; + } + + if (m833 == 0) { + mDoAud_bgmStreamPrepare(JA_STRM_DEMO_TETRA_FLY); + bm1_npc_p->m881 = 1; + mTimer5 = 150; + m810 = -1; + m833 = 1; + fopMsgM_getScopeMode(); + return true; + } + + switch(dComIfGp_getScopeMesgStatus()) { + case fopMsgStts_BOX_CLOSED_e: + dComIfGp_setScopeMesgStatus(fopMsgStts_BOX_CLOSING_e); + switch (m833) { + case 3: + if (m810 != 0) { + dComIfGp_getCamera(0)->mCamera.clrFlag(0x800000); + dComIfGp_getCamera(0)->mCamera.SubjectLockOff(); + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0310); + mTimer5 = 0; + m833 = 4; + fopMsgM_getScopeMode(); + return true; + } + } + // fallthrough + case fopMsgStts_CLOSE_WAIT_e: + case fopMsgStts_UNKD_e: + { + u32 temp_msg_no; + switch (m833) { + case 1: + temp_msg_no = m810; + m810 = 0xBC1; + if (chkTelescope_sph(bm1_npc_p->attention_info.position, 0.0f, l_HIO.mPrm.m2C)) { + u32 temp; + if (dComIfGp_getCameraZoomScale(0) >= l_HIO.mPrm.m24) { + temp = 0xBCB; + } else { + temp = 0xBCA; + } + m810 = temp; + } + break; + case 2: + m810 = 0xBCA; + if (dComIfGp_getCameraZoomScale(0) >= l_HIO.mPrm.m28) { + if (scope_mesg_status == fopMsgStts_CLOSE_WAIT_e) { + fopMsgM_forceSendOn(); + } + dComIfGp_getCamera(0)->mCamera.setFlag(0x800000); + bm1_npc_p->m882 = 1; + mTimer5 = 0; + m810 = 0; + m833 = 3; + fopMsgM_getScopeMode(); + return true; + } + break; + case 3: + if (m810 == 0 && bm1_npc_p->m880 != 0) { + if (scope_mesg_status == fopMsgStts_CLOSE_WAIT_e) { + fopMsgM_forceSendOn(); + } else if (fopMsgM_releaseScopeMode()) { + m810 = 0xBC2; + fopMsgM_scopeMessageSet(m810); + } + } + fopMsgM_getScopeMode(); + return true; + case 4: + { + cXyz bmp1_npc_att_pos = bm1_npc_p->attention_info.position; + bmp1_npc_att_pos.y += 2000.0f; + if (chkTelescope(bmp1_npc_att_pos, 60.0f, -30.0f)) { + if (scope_mesg_status == fopMsgStts_CLOSE_WAIT_e) { + fopMsgM_forceSendOn(); + break; + } + if (fopMsgM_releaseScopeMode()) { + m850 = 3; + } + } + m810 = 0xBC3; + } + break; + } + if ((m833 == 1 && temp_msg_no != m810) || cLib_calcTimer(&mTimer5) == 0) { + if (scope_mesg_status == fopMsgStts_CLOSE_WAIT_e) { + fopMsgM_forceSendOn(); + mTimer5 = 0; + } else if (fopMsgM_releaseScopeMode()) { + mTimer5 = 150; + if (m833 == 1 && m810 == 0xBCB) { + dComIfGp_getCamera(0)->mCamera.SubjectLockOn(bm1_npc_p); + m810 = 0xBCA; + mTimer5 = 150; + m833 = 2; + } + if (m810 == 0xBC3) { + mTimer3 = cLib_getRndValue(30, 30); + } + fopMsgM_scopeMessageSet(m810); + } + } + } + break; + default: + break; + } + fopMsgM_getScopeMode(); + return true; } /* 000036B0-000037A4 .text wait_1__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::wait_1() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::wait_1() { + if (m850 < 3) { + m850 = 0; + if (chk_areaIN(l_HIO.mPrm.m29, 100.0f, 0x7FFF, current.pos)) { + m850 = 4; + } + } + + m853 = 0; + + if (mBckResIndex == 0) { + if (cLib_calcTimer(&mTimer5) == 0) { + setAnm_NUM(1, 1); + } + return true; + } + + if (mbMorfAnimStopped) { + mTimer5 = cLib_getRndValue(60, 90); + setAnm_NUM(0, 1); + } + + return true; } /* 000037A4-00003A0C .text wait_2__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::wait_2() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::wait_2() { + bool telescope_proc_result = false; + + cLib_addCalcAngleS(¤t.angle.y, m7A0.y, 4, 0x800, 0x80); + + if (current.angle.y == m7A0.y && mBckResIndex != 0) { + setAnm_NUM(0, 1); + } + + if (m83F) { + if (chk_talk()) { + setStt(5); + setAnm_NUM(5,1); + m853 = 1; + m_jnt.offBackBoneLock(); + m840 = 0; + m_jnt.setTrn(); + } + return TRUE; + } else { + if (m850 != 1 && m850 < 3) { + m850 = 0; + if ( + chk_areaIN(l_HIO.mPrm.m1C, 100.0f, 0x7FFF, current.pos) +#if VERSION > VERSION_DEMO + && dComIfGp_checkPlayerStatus0(0, daPyStts0_TELESCOPE_LOOK_e) +#endif + ) { + telescope_proc_result = telescope_proc(); + } + + if (!telescope_proc_result) { + m850 = 2; + } + } + m_jnt.onBackBoneLock(); + m840 = 1; + if (m833 != 0) { + cXyz base_pos(20.0f, 0.0f, 50.0f); + if (m833 >= 4) { + if (mBtpResIDIndex != 2) { + init_texPttrnAnm(2, true); + } + if (cLib_calcTimer(&mTimer3) != 0) { + m853 = 1; + return TRUE; + } + base_pos.y = 120.0f; + } + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&base_pos, &mPlayerEyePos); + m853 = 2; + m838 = true; + return TRUE; + } else { + if (mbAttention && mBckResIndex == 0) { + m853 = 1; + return TRUE; + } else { + m853 = 0; + return TRUE; + } + } + } } /* 00003A0C-00003B24 .text wait_3__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::wait_3() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::wait_3() { + cXyz local_18; + + local_18.set(40.0f, 140.0f, 100.0f); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(m7A0.y); + mDoMtx_stack_c::multVec(&local_18, &mPlayerEyePos); + + cLib_addCalcAngleS( + ¤t.angle.y, + cLib_targetAngleY(¤t.pos, &mPlayerEyePos), + 4, 0x800, 0x80 + ); + + if (m83F) { + if (chk_talk()) { + setStt(5); + m853 = 1; + m840 = 0; + m_jnt.setTrn();; + } + return true; + } + + if (m850 != 1) { + m850 = 2; + } + + m840 = 1; + m853 = 2; + m838 = true; + + return true; } /* 00003B24-00003BE4 .text wait_4__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::wait_4() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::wait_4() { + if (m83F) { + if (chk_talk()) { + setStt(5); + m853 = 1; + m840 = 0; + m_jnt.setTrn(); + } + return true; + } + + m850 = 2; + m840 = 1; + + if (mbAttention) { + mTimer4 = cLib_getRndValue(15, 30); + } + + if (cLib_calcTimer(&mTimer4) != 0) { + m853 = 1; + return true; + } + + m853 = 0; + + return true; } /* 00003BE4-00003CD8 .text talk_1__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::talk_1() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::talk_1() { + BOOL res = chk_parts_notMov(); + fopNpc_npc_c::talk(1); + if (mpCurrMsg == NULL) { + return res; + } + switch (mpCurrMsg->mStatus) { + case fopMsgStts_BOX_OPENING_e: + case fopMsgStts_MSG_TYPING_e: + break; + case fopMsgStts_MSG_DESTROYED_e: + switch (mCurrMsgNo) { + case 0xBC2: + case 0xBC3: + case 0xBC5: + break; + case 0xBC4: + case 0xBC6: + eventInfo.mEventId = -1; + break; + } + fpcEx_Search(searchActor_kamome_Clr_NOSTOP_DEMO, this); + mItemNo = 0xFF; + m83F = false; + setStt(m852); + mTimer4 = cLib_getRndValue(15, 30); + endEvent(); + break; + } + return res; } /* 00003CD8-00003EA8 .text wait_action1__11daNpc_Ls1_cFPv */ -void daNpc_Ls1_c::wait_action1(void*) { - /* Nonmatching */ +BOOL daNpc_Ls1_c::wait_action1(void* param_1) { + UNUSED(param_1); + switch (m856) { + case 0: + m7CC[0] = get_playerEvnPos(0); + m7CC[1] = get_playerEvnPos(1); + m856++; + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2A80)) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0001)) { + setStt(3); + } else { + if (dComIfGs_checkGetItem(dItem_TELESCOPE_e)) { + m7A0.y = current.angle.y; + setStt(2); + } else { + setStt(1); + } + } + } else { + setStt(4); + } + break; + case 9: + break; + case 1: + case 2: + case 3: + mbAttention = chkAttention(); + switch (m851) { + case 1: + mbSetEyePos = wait_1(); + break; + case 2: + mbSetEyePos = wait_2(); + break; + case 3: + mbSetEyePos = wait_3(); + break; + case 4: + mbSetEyePos = wait_4(); + break; + case 5: + mbSetEyePos = talk_1(); + break; + } + break; + default: + break; + } + return TRUE; } /* 00003EA8-00003F30 .text demo_action1__11daNpc_Ls1_cFPv */ -void daNpc_Ls1_c::demo_action1(void*) { - /* Nonmatching */ +BOOL daNpc_Ls1_c::demo_action1(void* param_1) { + UNUSED(param_1); + switch (m856) { + case 0: + if (mType == 1) { + setAnm_NUM(12, 1); + } else { + setAnm_NUM(5, 1); + } + m856++; + break; + case 1: + case 2: + case 3: + case 9: + break; + default: + break; + } + return TRUE; } /* 00003F30-000041B8 .text demo__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::demo() { - /* Nonmatching */ +bool daNpc_Ls1_c::demo() { + if (demoActorID == 0) { + if (m841) { + if (mType == 3) { + mBckResIndex = 14; + setAnm_NUM(5, 1); + } + m841 = false; + } + } else { + if (!m841) { + for (int i = 0; i < ARRAY_SSIZE(mpMatAnms); i++) { + if (mpMatAnms[i]) { + mpMatAnms[i]->clrMoveFlag(); + } + } + m841 = true; + m83B = false; + m_jnt.setHead_y(0); + m_jnt.setHead_x(0); + m_jnt.setBackBone_y(0); + m_jnt.setBackBone_x(0); + } + + dDemo_actor_c* demo_actor_p = dComIfGp_demo_getActor(demoActorID); + J3DAnmTexPattern* anm_pattern_p = mBtpAnm.getBtpAnm(); + if (anm_pattern_p) { + u8 frame_max = anm_pattern_p->getFrameMax(); + mBtpFrame++; + if (mBtpFrame >= frame_max) { + mBtpFrame = frame_max; + } + } + + J3DAnmTexPattern* demo_btp_p = demo_actor_p->getP_BtpData(mArcName); + if (demo_btp_p) { + mBtpAnm.init( + mpMorf->getModel()->getModelData(), + demo_btp_p, 1, + J3DFrameCtrl::EMode_NONE, + 1.0f, 0, -1, + true, 0 + ); + mBtpResIDIndex = 11; + mBtpFrame = 0; + } + + J3DAnmTextureSRTKey* anm_srt_p = mBtkAnm.getBtkAnm(); + if (anm_srt_p) { + u8 frame_max = anm_srt_p->getFrameMax(); + mBtkFrame++; + if (mBtkFrame >= frame_max) { + mBtkFrame = frame_max; + } + } + + J3DAnmTextureSRTKey* demo_btk_p = demo_actor_p->getP_BtkData(mArcName); + if (demo_btk_p) { + mBtkAnm.init( + mpMorf->getModel()->getModelData(), + demo_btk_p, true, + J3DFrameCtrl::EMode_NONE, + 1.0f, 0, -1, + true, 0 + ); + mBtkResIDIndex = 3; + mBtkFrame = 0; + } + + if (demo_actor_p->checkEnable(dDemo_actor_c::ENABLE_SHAPE_e)) { + if (demo_actor_p->getShapeId() == 1) { + mTelescopeScale = 1.0f; + } else { + mTelescopeScale = 0.0f; + } + } +#if VERSION > VERSION_DEMO + dDemo_setDemoData(this, 106, mpMorf, mArcName, 0, NULL, dBgS_GetGndMtrlSndId_Func(current.pos, 10.0f), dComIfGp_getReverb(fopAcM_GetRoomNo(this))); +#else + dDemo_setDemoData(this, 106, mpMorf, mArcName, 0, NULL); +#endif + } + + return m841; } /* 000041B8-00004288 .text shadowDraw__11daNpc_Ls1_cFv */ void daNpc_Ls1_c::shadowDraw() { - /* Nonmatching */ + cXyz pos( + current.pos.x, + current.pos.y + 150.0f, + current.pos.z + ); + + mShadowID = dComIfGd_setShadow( + mShadowID, 1, + mpMorf->getModel(), &pos, + 800.0f, 40.0f, + current.pos.y, mObjAcch.GetGroundH(), + mObjAcch.m_gnd, &tevStr + ); + + if (mShadowID != 0) { + if (mpTelescopeModel) { + dComIfGd_addRealShadow(mShadowID, mpTelescopeModel); + } + dComIfGd_addRealShadow(mShadowID, mpLsHandModel); + } +} + +static void dummy() { + const GXColor dummy1 = { 0xFF, 0x00, 0x00, 0x80 }; + const GXColor dummy2 = { 0x00, 0x00, 0xFF, 0x80 }; + const GXColor dummy3 = { 0xFF, 0xFF, 0x00, 0x80 }; + const GXColor dummy4 = { 0xFF, 0xFF, 0x00, 0x80 }; + const GXColor dummy5 = { 0x00, 0xFF, 0x00, 0x80 }; } /* 00004288-00004418 .text _draw__11daNpc_Ls1_cFv */ BOOL daNpc_Ls1_c::_draw() { - /* Nonmatching */ + J3DModel* model_p = mpLsHandModel; + J3DModel* morf_model_p = mpMorf->getModel(); + J3DModelData* morf_model_info_p = morf_model_p->getModelData(); + + if (m83A || m83C != 0) { + return TRUE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(morf_model_p, &tevStr); + g_env_light.setLightTevColorType(model_p, &tevStr); + + mBtpAnm.entry(morf_model_info_p, mBtpFrame); + mBtkAnm.entry(morf_model_info_p, (f32)mBtkFrame); + mpMorf->entryDL(); + + mBtkAnm.remove(morf_model_info_p); + mBtpAnm.remove(morf_model_info_p); + + mDoExt_modelEntryDL(model_p); + + if (mpTelescopeModel) { + g_env_light.setLightTevColorType(mpTelescopeModel, &tevStr); + mDoExt_modelEntryDL(mpTelescopeModel); + } + + shadowDraw(); + dSnap_RegistFig(DSNAP_TYPE_UNK49, this, 1.0f, 1.0f, 1.0f); + + // Does nothing + if (l_HIO.mPrm.m18) { + cXyz dummy = current.pos; + dummy.y = dComIfGp_getLinkPlayer()->current.pos.y; + } + + return TRUE; } /* 00004418-00004654 .text _execute__11daNpc_Ls1_cFv */ BOOL daNpc_Ls1_c::_execute() { - /* Nonmatching */ + if (!m83D) { + m794 = current.pos; + m7A0 = current.angle; + m83D = true; + } + m_jnt.setParam( + l_HIO.mPrm.mMaxBackBoneX, + l_HIO.mPrm.mMaxBackBoneY, + l_HIO.mPrm.mMinBackBoneX, + l_HIO.mPrm.mMinBackBoneY, + l_HIO.mPrm.mMaxHeadX, + l_HIO.mPrm.mMaxHeadY, + l_HIO.mPrm.mMinHeadX, + l_HIO.mPrm.mMinHeadY, + l_HIO.mPrm.mMaxTurnStep + ); + + if (m83A && demoActorID == 0) { + return TRUE; + } else { + partner_search(); + checkOrder(); + if (!demo()) { + int staff_id = -1; + dBgS* bgs_p = dComIfG_Bgsp(); + if (dComIfGp_event_getMode() != 0 && eventInfo.checkCommandTalk() == false) { + staff_id = isEventEntry(); + } + + if (staff_id >= 0 || m834) { + event_proc(staff_id); + } else { + (this->*mCurrProcFunc)(NULL); + } + + lookBack(); + + if (mType != 0) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mObjAcch.CrrPos(*bgs_p); + } + + play_animation(); + } else { + m83A = false; + } + + eventOrder(); + mAngle = current.angle; + if (!m83B) { + shape_angle = current.angle; + } + + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + setMtx(false); + + if (!m841) { + setCollision(40.0f, 100.0f); + } + } + + return TRUE; } /* 00004654-000046A8 .text _delete__11daNpc_Ls1_cFv */ BOOL daNpc_Ls1_c::_delete() { - /* Nonmatching */ +#if VERSION == VERSION_DEMO + if (mbResLoadIsComplete) { + l_HIO.removeHIO(); +#endif + dComIfG_resDelete(&mPhs, mArcName); + + if (DEMO_SELECT(mpMorf, heap && mpMorf)) { + mpMorf->stopZelAnime(); + } +#if VERSION == VERSION_DEMO + } +#endif + return TRUE; } /* 000046A8-000047D4 .text _create__11daNpc_Ls1_cFv */ cPhs_State daNpc_Ls1_c::_create() { - /* Nonmatching */ + static int a_siz_tbl[] = { + 0, + 0 + }; + + cPhs_State state; + +#if VERSION > VERSION_DEMO + fopAcM_SetupActor(this, daNpc_Ls1_c); +#endif + + if (!decideType(fopAcM_GetParam(this) & 0xFF)) { + return cPhs_ERROR_e; + } + + state = dComIfG_resLoad(&mPhs, mArcName); + mbResLoadIsComplete = state == cPhs_COMPLEATE_e; + if (!mbResLoadIsComplete) { + return state; + } + +#if VERSION == VERSION_DEMO + l_HIO.entryHIO("アリル"); // Aryll + fopAcM_SetupActor(this, daNpc_Ls1_c); +#endif + + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, a_siz_tbl[m854])) { + return cPhs_ERROR_e; + } + + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this, -50.0f, -20.0f, -50.0f, 50.0f, 140.0f, 50.0f); + + if (!createInit()) { + return cPhs_ERROR_e; + } + + return state; } +daNpc_Ls1_c::daNpc_Ls1_c() {} + /* 00004C98-00005250 .text bodyCreateHeap__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::bodyCreateHeap() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::bodyCreateHeap() { + J3DModelData* a_mdl_dat = (J3DModelData*) dComIfG_getObjectIDRes(mArcName, LS_BDL_LS); + JUT_ASSERT(DEMO_SELECT(0xBB3, 0xBC9), a_mdl_dat != NULL); + + for (u16 i = 0; i < a_mdl_dat->getMaterialNum(); i++) { + J3DMaterial* mat = a_mdl_dat->getMaterialNodePointer(i); + mat->setMaterialAnm(new daNpc_Ls1_matAnm_c()); + } + + mpMorf = new mDoExt_McaMorf( + a_mdl_dat, + NULL, NULL, + NULL, + J3DFrameCtrl::EMode_NULL, + 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x11020222 + ); + + if (!mpMorf) { + return FALSE; + } else if (!mpMorf->getModel()) { + mpMorf = NULL; + return FALSE; + } + + if (mType == 4 || dComIfGs_getClearCount() != 0) { + ResTIMG* tex_info_p = (ResTIMG*) dComIfG_getObjectIDRes(mArcName, LS_BTI_LSBODY02); + + J3DTexture* a_texture = a_mdl_dat->getTexture(); + JUT_ASSERT(DEMO_SELECT(0xBD1, 0xBE7), a_texture != NULL); + + JUTNameTab* a_textureName = a_mdl_dat->getTextureName(); + JUT_ASSERT(DEMO_SELECT(0xBD3, 0xBE9), a_textureName != NULL); + + for (u16 i = 0; i < a_texture->getNum(); i++) { + const char* name = a_textureName->getName(i); + if (strcmp(name, "lsbody01") == 0) { + a_texture->setResTIMG(i, *tex_info_p); + } + } + } + + if (!init_texPttrnAnm(0, false)) { + mpMorf = NULL; + return FALSE; + } + + m_hed_jnt_num = a_mdl_dat->getJointName()->getIndex("head"); + JUT_ASSERT(DEMO_SELECT(0xBE4, 0xBFA), m_hed_jnt_num >= 0); + + m_bbone_jnt_num = a_mdl_dat->getJointName()->getIndex("backbone"); + JUT_ASSERT(DEMO_SELECT(0xBE6, 0xBFC), m_bbone_jnt_num >= 0); + + m_hnd_L_jnt_num = a_mdl_dat->getJointName()->getIndex("handL"); + JUT_ASSERT(DEMO_SELECT(0xBE8, 0xBFE), m_hnd_L_jnt_num >= 0); + + m_hnd_R_jnt_num = a_mdl_dat->getJointName()->getIndex("handR"); + JUT_ASSERT(DEMO_SELECT(0xBEA, 0xC00), m_hnd_R_jnt_num >= 0); + + mpMorf->getModel()->getModelData()->getJointNodePointer(m_hed_jnt_num)->setCallBack(nodeCB_Head); + mpMorf->getModel()->getModelData()->getJointNodePointer(m_bbone_jnt_num)->setCallBack(nodeCB_BackBone); + mpMorf->getModel()->getModelData()->getJointNodePointer(m_hnd_L_jnt_num)->setCallBack(nodeCB_Hand_L); + mpMorf->getModel()->getModelData()->getJointNodePointer(m_hnd_R_jnt_num)->setCallBack(nodeCB_Hand_R); + mpMorf->getModel()->setUserArea((u32)this); + + return TRUE; } /* 00005250-00005428 .text handCreateHeap__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::handCreateHeap() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::handCreateHeap() { + mpLsHandModel = NULL; + J3DModelData* a_mdl_dat = (J3DModelData*) dComIfG_getObjectIDRes(mArcName, LS_BDL_LSHAND); + JUT_ASSERT(DEMO_SELECT(0xC09, 0xC1F), a_mdl_dat != NULL); + mpLsHandModel = mDoExt_J3DModel__create(a_mdl_dat, 0x80000, 0x11000022); + + if (!mpLsHandModel) { + return FALSE; + } + + m_lsHnd_L_jnt_num = a_mdl_dat->getJointName()->getIndex("ls_handL"); + JUT_ASSERT(DEMO_SELECT(0xC11, 0xC27), m_lsHnd_L_jnt_num >= 0); + + m_lsHnd_R_jnt_num = a_mdl_dat->getJointName()->getIndex("ls_handR"); + JUT_ASSERT(DEMO_SELECT(0xC13, 0xC29), m_lsHnd_R_jnt_num >= 0); + + mpLsHandModel->getModelData()->getJointNodePointer(m_lsHnd_L_jnt_num)->setCallBack(Ls_hand_nodeCB_Hand_L); + mpLsHandModel->getModelData()->getJointNodePointer(m_lsHnd_R_jnt_num)->setCallBack(Ls_hand_nodeCB_Hand_R); + mpLsHandModel->setUserArea((u32)this); + return TRUE; } /* 00005428-000054F8 .text itemCreateHeap__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::itemCreateHeap() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::itemCreateHeap() { + mpTelescopeModel = NULL; + + J3DModelData* a_mdl_dat = (J3DModelData *) +#if VERSION > VERSION_DEMO + dComIfG_getObjectRes("Link", LINK_BDL_TELESCOPE); +#else + dComIfG_getObjectIDRes("Link", LINK_BDL_TELESCOPE); +#endif + + JUT_ASSERT(DEMO_SELECT(0xC2D, 0xC43), a_mdl_dat != NULL); + + mpTelescopeModel = mDoExt_J3DModel__create(a_mdl_dat, 0x80000, 0x11000022); + + if (!mpTelescopeModel) { + return FALSE; + } + + return TRUE; } /* 000054F8-000055BC .text CreateHeap__11daNpc_Ls1_cFv */ -void daNpc_Ls1_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_Ls1_c::CreateHeap() { + if (!bodyCreateHeap()) { + return FALSE; + } + + if (!handCreateHeap()) { + this->mpMorf = NULL; + return FALSE; + } + + if (!itemCreateHeap()) { + this->mpMorf = NULL; + return FALSE; + } + + mAcchCir.SetWall(30.0f, 40.0f); + cXyz* speed_p = &speed; + cXyz* old_pos_p = &old.pos; + cXyz* current_pos_p = ¤t.pos; + mObjAcch.Set(current_pos_p, old_pos_p, this, 1, &mAcchCir, speed_p, NULL, NULL); + + return TRUE; } /* 000055BC-000055DC .text daNpc_Ls1_Create__FP10fopAc_ac_c */