From 7bf67612432d83975a9c632f4f11b4be4e165acc Mon Sep 17 00:00:00 2001 From: Anthony Rossi Date: Sat, 8 Aug 2026 21:01:29 +0200 Subject: [PATCH] D_a_npc_ba1 100% matching (#1144) * Ba1 matched 100% * last fixes * Proper interaction with actor_fa * Not matching 100% on JP * Matching on JPN * Forgot to update the configure file ... * 100% matching * Applied review suggestions --------- Co-authored-by: Anthony Rossi --- configure.py | 2 +- include/d/actor/d_a_npc_ba1.h | 212 ++-- include/d/d_save_event_flag.inc | 10 +- include/d/d_snap.h | 2 +- src/d/actor/d_a_npc_ba1.cpp | 1956 ++++++++++++++++++++++++++++--- src/d/d_kankyo_dayproc.inc | 2 +- 6 files changed, 1923 insertions(+), 261 deletions(-) diff --git a/configure.py b/configure.py index baace708e..e238659bb 100755 --- a/configure.py +++ b/configure.py @@ -1653,7 +1653,7 @@ config.libs = [ ActorRel(Matching, "d_a_npc_ah"), ActorRel(NonMatching, "d_a_npc_aj1"), ActorRel(NonMatching, "d_a_npc_auction"), - ActorRel(NonMatching, "d_a_npc_ba1"), + ActorRel(Matching, "d_a_npc_ba1"), ActorRel(NonMatching, "d_a_npc_bj1"), ActorRel(Matching, "d_a_npc_bm1"), ActorRel(NonMatching, "d_a_npc_bmcon1"), diff --git a/include/d/actor/d_a_npc_ba1.h b/include/d/actor/d_a_npc_ba1.h index 2a10bd377..071243f7d 100644 --- a/include/d/actor/d_a_npc_ba1.h +++ b/include/d/actor/d_a_npc_ba1.h @@ -1,37 +1,46 @@ #ifndef D_A_NPC_BA1_H #define D_A_NPC_BA1_H +#include "d/d_npc.h" #include "f_op/f_op_actor.h" class J3DNode; -class daNpc_Ba1_c : public fopAc_ac_c { +class daNpc_Ba1_c : public fopNpc_npc_c { public: + + typedef BOOL (daNpc_Ba1_c::*ProcFunc)(void*); struct anm_prm_c { - + // Borrowed from d_lib.h, fields seem to match + /* 0x00 */ s8 mAnmNum; + /* 0x01 */ s8 mBtpNum; + /* 0x02 */ s16 field_0x02; + /* 0x04 */ f32 mMorf; + /* 0x08 */ f32 mSpeed; + /* 0x0C */ int mLoopMode; }; - void holdEventOn() { mHoldEvent = 1; } + void holdEventOn() { mbHoldEvent = 1; } void nodeBa1Control(J3DNode*, J3DModel*); - void XyCheck_cB(int); - void XyEvent_cB(int); - void init_BA1_0(); - void init_BA1_1(); - void init_BA1_2(); - void init_BA1_3(); - void init_BA1_4(); - void createInit(); + bool XyCheck_cB(int); + s16 XyEvent_cB(int); + bool init_BA1_0(); + bool init_BA1_1(); + bool init_BA1_2(); + bool init_BA1_3(); + bool init_BA1_4(); + bool createInit(); void setMtx(bool); - void anmNum_toResID(int); - void btpNum_toResID(int); - void setBtp(bool, int); - void iniTexPttrnAnm(bool); + int anmNum_toResID(int); + int btpNum_toResID(int); + bool setBtp(bool, int); + bool iniTexPttrnAnm(bool); void plyTexPttrnAnm(); void setAnm_tex(signed char); - void setAnm_anm(anm_prm_c*); + BOOL setAnm_anm(anm_prm_c*); void setAnm_NUM(int, int); - void setAnm(); + bool setAnm(); void chg_anmTag(); void control_anmTag(); void chg_anmAtr(unsigned char); @@ -40,24 +49,24 @@ public: void anmAtr(unsigned short); void eventOrder(); void checkOrder(); - void chk_talk(); - void chk_drct(float); - void chk_partsNotMove(); + bool chk_talk(); + bool chk_drct(float); + bool chk_partsNotMove(); void lookBack(); - void next_msgStatus(unsigned long*); - void getMsg_BA1_0(); - void getMsg_BA1_1(); - void getMsg_BA1_3(); - void getMsg_BA1_4(); - void getMsg(); - void chkAttention(); + u16 next_msgStatus(unsigned long*); + u32 getMsg_BA1_0(); + u32 getMsg_BA1_1(); + u32 getMsg_BA1_3(); + u32 getMsg_BA1_4(); + u32 getMsg(); + bool chkAttention(); void setAttention(bool); - void searchByID(fpc_ProcID); - void partner_srch_sub(void* (*)(void*, void*)); + fopAc_ac_c* searchByID(fpc_ProcID); + bool partner_srch_sub(void* (*)(void*, void*)); void partner_srch(); - void check_useFairyArea(); - void checkCommandTalk(); - void charDecide(int); + bool check_useFairyArea(); + bool checkCommandTalk(); + bool charDecide(int); void eInit_SET_PLYER_GOL_(); void eInit_PLYER_INI_POS_(); void eInit_USE_FAIRY_END_(); @@ -66,61 +75,128 @@ public: void eInit_ACTOR_DRW_CONTROL_(int*, int*); void eInit_setEvTimer(int*); void eInit_CHK_FAIRY_(int*); - void eInit_prmFloat(float*, float); + f32 eInit_prmFloat(float*, float); void eInit_SET_EYE_OFF_(float*); void eInit_EYE_OFF_ZRO_(float*); void eInit_CHK_FAIRY_MOV_1(int*); void event_actionInit(int); - void eMove_MOV_POS_(); - void eMove_CHK_FAIRY_(); - void eMove_EYE_OFF_ZRO_(); - void eMove_CHK_FAIRY_MOV_1(); - void event_action(); + bool eMove_MOV_POS_(); + bool eMove_CHK_FAIRY_(); + bool eMove_EYE_OFF_ZRO_(); + bool eMove_CHK_FAIRY_MOV_1(); + bool event_action(); void cut_init_START_TALE1(int); - void cut_move_START_TALE1(); + bool cut_move_START_TALE1(); void privateCut(int); void endEvent(); - void isEventEntry(); + BOOL isEventEntry(); void event_proc(int); - void set_action(int (daNpc_Ba1_c::*)(void*), void*); + BOOL set_action(int (daNpc_Ba1_c::*)(void*), void*); void setStt(signed char); - void wait_0(); - void wait_1(); - void talk_1(); - void talk_2(); - void wait_2(); - void wait_3(); - void ZZZwai(); - void wait_action1(void*); - void wait_action2(void*); - void demo_action1(void*); - void wait_action3(void*); - void wait_action4(void*); - void demo(); + BOOL wait_0(); + BOOL wait_1(); + BOOL talk_1(); + BOOL talk_2(); + BOOL wait_2(); + BOOL wait_3(); + BOOL ZZZwai(); + BOOL wait_action1(void*); + BOOL wait_action2(void*); + BOOL demo_action1(void*); + BOOL wait_action3(void*); + BOOL wait_action4(void*); + bool demo(); void shadowDraw(); BOOL _draw(); BOOL _execute(); BOOL _delete(); cPhs_State _create(); - void create_Anm(); - void create_itm_Mdl(); - void CreateHeap(); + J3DModelData* create_Anm(); + bool create_itm_Mdl(); + BOOL CreateHeap(); public: - /* 0x290 */ u8 m290[0x7F8 - 0x290]; + + /* 0x6C4 */ request_of_phase_process_class mPhs; + /* 0x6CC */ s8 m_hed_jnt_num; + /* 0x6CD */ s8 m_bbone_jnt_num; + /* 0x6CE */ s8 m_footL_jnt_num; + /* 0x6CF */ u8 field_0x6CF[0x6D0 - 0x6CF]; + /* 0x6D0 */ J3DModel* mpClothModel; + /* 0x6D4 */ u32 mShadowID; + /* 0x6D8 */ J3DAnmTexPattern* m_hed_tex_pttrn; + /* 0x6DC */ mDoExt_btpAnm mHeadBtpAnm; + /* 0x6F0 */ u8 mBlinkFrame; + /* 0x6F1 */ u8 field_0x6F1[0x6F2 - 0x6F1]; + /* 0x6F2 */ s16 mBlinkTimer; + /* 0x6F4 */ ProcFunc mCurrProcFunc; + /* 0x700 */ u8 field_0x700[0x708 - 0x700]; + /* 0x708 */ dNpc_EventCut_c mEventCut; + /* 0x774 */ fpc_ProcID mPartnerProcID; + /* 0x778 */ cXyz mInitialPos; + /* 0x784 */ csXyz mInitialAngle; + /* 0x78A */ csXyz m78A; + /* 0x790 */ cXyz mTransformedEyePos; + /* 0x79C */ cXyz m79C; + /* 0x7A8 */ u8 field_0x7A8[0x7C0 - 0x7A8]; + /* 0x7C0 */ f32 mPrevMorfFrame; + /* 0x7C4 */ f32 mEyeOffset; + /* 0x7C8 */ f32 mEyeOffsetZero; + /* 0x7CC */ s16 mJointHeadY; + /* 0x7CE */ s16 mJointBackboneY; + /* 0x7D0 */ s16 mActorAngleY; + /* 0x7D2 */ s16 mEventIdTable[6]; + /* 0x7DE */ s16 mEventIdx; + /* 0x7E0 */ s16 mEvTimer; + /* 0x7E2 */ s16 mEvTimer2; + /* 0x7E4 */ u8 field_0x7E4[0x7E8 - 0x7E4]; + /* 0x7E8 */ s16 mLookAtMaxVel; + /* 0x7EA */ s16 mTargetYRot; + /* 0x7EC */ u8 field_0x7EC[0x7EE - 0x7EC]; + /* 0x7EE */ s8 mbMorfAnimStopped; + /* 0x7EF */ u8 m7EF; + /* 0x7F0 */ s8 m7F0; + /* 0x7F1 */ u8 mItemNo; #if VERSION > VERSION_JPN - /* 0x7F8 */ u8 m7F8; + /* 0x7F2 */ u8 m7F2; #endif - /* Offsets below are for USA/PAL */ - /* 0x7F9 */ u8 mHoldEvent; -}; + /* 0x7F3 */ u8 field_0x7F3[0x7F4 - 0x7F3]; + /* 0x7F4 */ bool mbInitGrandma0; + /* 0x7F5 */ bool m7F5; + /* 0x7F6 */ bool m7F6; + /* 0x7F7 */ bool m7F7; + /* 0x7F8 */ bool m7F8; + /* 0x7F9 */ bool mbHoldEvent; + /* 0x7FA */ bool m7FA; + /* 0x7FB */ bool m7FB; + /* 0x7FC */ bool mFairyUsed; + /* 0x7FD */ bool m7FD; + /* 0x7FE */ bool m7FE; + /* 0x7FF */ bool m7FF; + /* 0x800 */ bool mbRanExecute; + /* 0x804 */ BOOL mbSetEyePos; + /* 0x808 */ bool mbAttention; + /* 0x809 */ bool m809; + /* 0x80A */ bool mHeadOnlyFollow; + /* 0x80B */ bool mbInDemo; + /* 0x80C */ s8 mActionIndex; + /* 0x80D */ s8 mActNo; + /* 0x80E */ u8 m80E; + /* 0x80F */ u8 mMesgAnimeTagInfo; + /* 0x810 */ s8 mBtpNum; + /* 0x811 */ s8 mAnmNum; + /* 0x812 */ s8 m812; + /* 0x813 */ s8 mStatus; + /* 0x814 */ s8 mPrevStatus; + /* 0x815 */ s8 mLookBackState; + /* 0x816 */ s8 mType; + /* 0x817 */ s8 mSpecificType; + /* 0x818 */ s8 m818; + /* 0x819 */ s8 m819; + /* 0x81A */ u8 field_0x81A[0x81C - 0x81A]; +}; // Size: 0x81C + -class daNpc_Ba1_HIO_c { -public: - daNpc_Ba1_HIO_c(); -public: - /* Place member variables here */ -}; #endif /* D_A_NPC_BA1_H */ diff --git a/include/d/d_save_event_flag.inc b/include/d/d_save_event_flag.inc index 8297a0832..fd99336ce 100644 --- a/include/d/d_save_event_flag.inc +++ b/include/d/d_save_event_flag.inc @@ -45,12 +45,12 @@ public: /* 0x0502 */ UNK_0502 = 0x0502, /* 0x0501 */ UNK_0501 = 0x0501, /* 0x0640 */ UNK_0640 = 0x0640, - /* 0x0608 */ UNK_0608 = 0x0608, + /* 0x0608 */ UNK_0608 = 0x0608, // Set by an unused dialogue /* 0x0604 */ UNK_0604 = 0x0604, - /* 0x0602 */ UNK_0602 = 0x0602, - /* 0x0601 */ UNK_0601 = 0x0601, + /* 0x0602 */ UNK_0602 = 0x0602, // Grandma dialogue after sword obtained + /* 0x0601 */ UNK_0601 = 0x0601, // Grandma dialogue after Helmaroc cutscene (prologue) /* 0x0780 */ UNK_0780 = 0x0780, - /* 0x0740 */ UNK_0740 = 0x0740, + /* 0x0740 */ UNK_0740 = 0x0740, // Grandma dialogue after Aryll kidnapped /* 0x0720 */ UNK_0720 = 0x0720, /* 0x0710 */ UNK_0710 = 0x0710, /* 0x0704 */ UNK_0704 = 0x0704, @@ -317,7 +317,7 @@ public: /* 0x2901 */ UNK_2901 = 0x2901, /* 0x2A80 */ UNK_2A80 = 0x2A80, /* 0x2A40 */ UNK_2A40 = 0x2A40, - /* 0x2A20 */ UNK_2A20 = 0x2A20, + /* 0x2A20 */ GRANDMA_HEALED = 0x2A20, /* 0x2A10 */ UNK_2A10 = 0x2A10, /* 0x2A08 */ RODE_KORL = 0x2A08, /* 0x2A04 */ UNK_2A04 = 0x2A04, diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 7c0b90106..d581e2f0e 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -79,7 +79,7 @@ enum { /* 0x47 */ DSNAP_TYPE_UNK47, /* 0x48 */ DSNAP_TYPE_UNK48, /* 0x49 */ DSNAP_TYPE_NPC_LS1, - /* 0x4A */ DSNAP_TYPE_UNK4A, + /* 0x4A */ DSNAP_TYPE_NPC_BA1, /* 0x4B */ DSNAP_TYPE_UNK4B, /* 0x4C */ DSNAP_TYPE_UNK4C, /* 0x4D */ DSNAP_TYPE_NPC_JI1, diff --git a/src/d/actor/d_a_npc_ba1.cpp b/src/d/actor/d_a_npc_ba1.cpp index cf37081c4..b0833c0f4 100644 --- a/src/d/actor/d_a_npc_ba1.cpp +++ b/src/d/actor/d_a_npc_ba1.cpp @@ -1,499 +1,2085 @@ /** - * d_a_npc_ba1.cpp - * NPC - Link's Grandma - */ +* d_a_npc_ba1.cpp +* NPC - Link's Grandma +*/ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_ba1.h" +#include "d/actor/d_a_npc_fa1.h" +#include "d/actor/d_a_player_main.h" +#include "d/d_letter.h" +#include "d/d_snap.h" +#include "res/Object/Ba.h" + +class daNpc_Ba1_HIO_c : public mDoHIO_entry_c { +public: + struct hio_prm_c { + s16 mMaxHeadX; + s16 mMaxHeadY; + s16 mMinHeadX; + s16 mMinHeadY; + s16 mMaxBackboneX; + s16 mMaxBackboneY; + s16 mMinBackboneX; + s16 mMinBackboneY; + s16 mMaxTurnStep; + s16 mCalcAngleTarget; + f32 mAttPosOffsetY; + /* 0x18 */ u8 m18; + /* 0x1C */ f32 m1C; + /* 0x20 */ f32 m20; + }; // Size: 0x2C + + daNpc_Ba1_HIO_c(); + virtual ~daNpc_Ba1_HIO_c() {}; + + void genMessage(JORMContext* ctx) {} + +public: + /* 0x04 */ s8 mNo; + /* 0x05 */ s8 field_0x5; + /* 0x06 */ s8 field_0x6; + /* 0x07 */ s8 field_0x7; + /* 0x08 */ int field_0x8; + /* 0x0C */ hio_prm_c mPrmTbl; + +}; /* 000000EC-00000150 .text __ct__15daNpc_Ba1_HIO_cFv */ daNpc_Ba1_HIO_c::daNpc_Ba1_HIO_c() { - /* Nonmatching */ + static hio_prm_c a_prm_tbl = { + /* mMaxHeadX */ 0x1554, + /* mMaxHeadY */ 0x2000, + /* mMinHeadX */ 0xEC78, + /* mMinHeadY */ 0xE000, + /* mMaxBackboneX */ 0x0000, + /* mMaxBackboneY */ 0x1000, + /* mMinBackboneX */ 0X0000, + /* mMinBackboneY */ 0xF000, + /* mMaxTurnStep */ 0x0400, + /* mCalcAngleTarget */ 0x0400, + /* mAttPosOffsetY */ 115.0f, + /* m18 */ 0.0f, + /* m1C. */ 500.0f, + /* m20 */ 300.0f, + }; + memcpy(&mPrmTbl, &a_prm_tbl, sizeof(hio_prm_c)); + mNo = -1; + field_0x8 = -1; } + +static daNpc_Ba1_HIO_c l_HIO; +static fopAc_ac_c* l_check_inf[20]; +static int l_check_wrk; + + /* 00000198-00000210 .text searchActor_Fa__FPvPv */ -void searchActor_Fa(void*, void*) { - /* Nonmatching */ +static void* searchActor_Fa(void* i_param_1, void *) { + if(l_check_wrk < 0x14 && fopAcM_IsActor(i_param_1) && fopAcM_GetName(i_param_1) == fpcNm_NPC_FA1_e){ + l_check_inf[l_check_wrk] =(fopAc_ac_c*)i_param_1; + l_check_wrk += 1; + } + return NULL; } /* 00000210-0000025C .text nodeCallBack_Ba1__FP7J3DNodei */ -static BOOL nodeCallBack_Ba1(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack_Ba1(J3DNode* i_param_1, int i_param_2) { + if(i_param_2 == 0){ + if(j3dSys.getModel()->getUserArea() != NULL){ + reinterpret_cast(j3dSys.getModel()->getUserArea())->nodeBa1Control(i_param_1,j3dSys.getModel()); + } + } + return TRUE; } /* 0000025C-000003AC .text nodeBa1Control__11daNpc_Ba1_cFP7J3DNodeP8J3DModel */ -void daNpc_Ba1_c::nodeBa1Control(J3DNode*, J3DModel*) { - /* Nonmatching */ +void daNpc_Ba1_c::nodeBa1Control(J3DNode* i_node, J3DModel* i_model) { + + static cXyz a_eye_pos_off(20.0f, -16.0f, 0.0f); + s32 jointIdx = ((J3DJoint*)(i_node))->getJntNo(); + mDoMtx_stack_c::copy(i_model->getAnmMtx(jointIdx)); + if(jointIdx == m_hed_jnt_num){ + mDoMtx_stack_c::YrotM(-m_jnt.getHead_y()); + mDoMtx_stack_c::ZrotM(-m_jnt.getHead_x()); + mDoMtx_stack_c::multVec(&a_eye_pos_off, &mTransformedEyePos); + } + if(jointIdx == m_bbone_jnt_num) { + mDoMtx_stack_c::XrotM(m_jnt.getBackbone_y()); + mDoMtx_stack_c::ZrotM(m_jnt.getBackbone_x()); + } + cMtx_copy(mDoMtx_stack_c::get(),j3dSys.mCurrentMtx); + i_model->setAnmMtx(jointIdx,mDoMtx_stack_c::get()); } /* 000003E8-00000408 .text daNpc_Ba1_XyCheck_cB__FPvi */ -void daNpc_Ba1_XyCheck_cB(void*, int) { - /* Nonmatching */ +static bool daNpc_Ba1_XyCheck_cB(void* i_this, int i_itemBtn) { + return static_cast(i_this)->XyCheck_cB(i_itemBtn); } /* 00000408-00000428 .text XyCheck_cB__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::XyCheck_cB(int) { - /* Nonmatching */ +bool daNpc_Ba1_c::XyCheck_cB(int i_itemBtn) { + if (dComIfGp_getSelectItem(i_itemBtn) == dItemNo_FAIRY_BOTTLE_e) { + return TRUE; + } + return FALSE; } /* 00000428-00000448 .text daNpc_Ba1_XyEvent_cB__FPvi */ -void daNpc_Ba1_XyEvent_cB(void*, int) { - /* Nonmatching */ +static s16 daNpc_Ba1_XyEvent_cB(void* i_this, int param_1) { + return static_cast(i_this)->XyEvent_cB(param_1); } /* 00000448-00000450 .text XyEvent_cB__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::XyEvent_cB(int) { - /* Nonmatching */ +s16 daNpc_Ba1_c::XyEvent_cB(int param_1) { + UNUSED(param_1); + return mEventIdTable[0]; } +char* l_evn_tbl[] = { + "Use_Fairy","Ba1_Get_Itm","Ganbaru","tale_1", "None", "tale_2", +}; + /* 00000450-000004F8 .text init_BA1_0__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::init_BA1_0() { - /* Nonmatching */ +bool daNpc_Ba1_c::init_BA1_0() { + bool ret; + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0520) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_0001)) { + set_action(&daNpc_Ba1_c::wait_action1, NULL); + mpClothModel = 0; + ret = 1; + } else { + ret = 0; + } + return ret; } /* 000004F8-000005F4 .text init_BA1_1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::init_BA1_1() { - /* Nonmatching */ +bool daNpc_Ba1_c::init_BA1_1() { + BOOL res; + bool ret; + res = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0520); + ret = res == 0; + if(!ret) { + return ret; + } + res = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0001); + ret = res; + if(ret) { + if(dComIfGs_checkCollect(1)) { + current.pos.set(-290.f, 0.f, 110.f); + current.angle.y = 0; + } + set_action(&daNpc_Ba1_c::wait_action2, NULL); + fopAcM_OffStatus(this, fopAcStts_NOCULLEXEC_e); + mpClothModel = 0; + } + + return ret; } /* 000005F4-00000648 .text init_BA1_2__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::init_BA1_2() { - /* Nonmatching */ +bool daNpc_Ba1_c::init_BA1_2() { + mpClothModel = 0; + set_action(&daNpc_Ba1_c::demo_action1, NULL); + return true; } /* 00000648-00000734 .text init_BA1_3__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::init_BA1_3() { - /* Nonmatching */ +bool daNpc_Ba1_c::init_BA1_3() { + BOOL res; + bool ret; + res = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0520); + ret = res; + if(!ret) { + return ret; + } + res = dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED); + ret = res ==0; + if(ret) { + attention_info.distances[1] = 0x1B; + attention_info.distances[3] = 0x1C; + fopAcM_OffStatus(this, fopAcStts_CULL_e | fopAcStts_NOCULLEXEC_e); + set_action(&daNpc_Ba1_c::wait_action3, NULL); + gravity = 0.f; + eventInfo.setXyCheckCB((dEvt_info_c::CallbackFunc)&daNpc_Ba1_XyCheck_cB); + eventInfo.setXyEventCB(&daNpc_Ba1_XyEvent_cB); + } + + return ret; } /* 00000734-000007E8 .text init_BA1_4__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::init_BA1_4() { - /* Nonmatching */ +bool daNpc_Ba1_c::init_BA1_4() { + // Same as 1 and 3 + BOOL res; + bool ret; + res = dComIfGs_isEventBit(dSv_event_flag_c::UNK_0520); + ret = res; + if (!ret) { + return ret; + } + res = dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED); + ret = res; + if(ret) { + mpClothModel = 0; + set_action(&daNpc_Ba1_c::wait_action4, NULL); + } + + return ret; } /* 000007E8-000009DC .text createInit__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::createInit() { - /* Nonmatching */ +bool daNpc_Ba1_c::createInit() { + for(int i = 0; i < 6; i++){ + mEventIdTable[i] = dComIfGp_evmng_getEventIdx(l_evn_tbl[i]); + } + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + attention_info.distances[1] = 171; + attention_info.distances[3] = 171; + gravity = -4.5; + m79C = current.pos; + mEventCut.setActorInfo2("Ba1", this); + mAnmNum = 10; + bool init_success; + switch (mSpecificType) { + case 0: + init_success = init_BA1_0(); + break; + case 1: + init_success = init_BA1_1(); + break; + case 2: + init_success = init_BA1_2(); + break; + case 3: + init_success = init_BA1_3(); + break; + case 4: + init_success = init_BA1_4(); + break; + default: + init_success = false; + break; + } + if (init_success) { + m78A = current.angle; + shape_angle = m78A; + } else { + return false; + } +#if VERSION > VERSION_JPN + m7F2 = dComIfGs_getEventReg(dSv_event_flag_c::UNK_A60F); +#endif + mStts.Init(0xFF,0xFF,this); + mCyl.SetStts(&mStts); + mCyl.Set(dNpc_cyl_src); + mpMorf->setMorf(0.0f); + setMtx(true); + return true; + } /* 000009DC-00000B44 .text setMtx__11daNpc_Ba1_cFb */ -void daNpc_Ba1_c::setMtx(bool) { - /* Nonmatching */ +void daNpc_Ba1_c::setMtx(bool param_1) { + if(!mbInDemo) { + plyTexPttrnAnm(); + mbMorfAnimStopped = mpMorf->play(&eyePos, 0, 0); + if(mpMorf->getFrame() < mPrevMorfFrame){ + mbMorfAnimStopped = true; + } + mPrevMorfFrame = mpMorf->getFrame(); + if (mSpecificType != 3) { + mObjAcch.CrrPos(*dComIfG_Bgsp()); + } + } + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(m78A.y); + + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->calc(); + + if (mpClothModel != NULL) { + mpClothModel->setBaseTRMtx(mpMorf->getModel()->getAnmMtx(m_footL_jnt_num)); + mpClothModel->calc(); + } + setAttention(param_1); } /* 00000B44-00000B58 .text anmNum_toResID__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::anmNum_toResID(int) { - /* Nonmatching */ +int daNpc_Ba1_c::anmNum_toResID(int param_1) { + static const int a_bck_resID_tbl[] = { + dRes_ID_BA_BCK_WAIT01_e, + dRes_ID_BA_BCK_TALK01_e, + dRes_ID_BA_BCK_TALK02_e, + dRes_ID_BA_BCK_TALK03_e, + dRes_ID_BA_BCK_HOLD_e, + dRes_ID_BA_BCK_WAIT02_e, + dRes_ID_BA_BCK_TALK04_e, + dRes_ID_BA_BCK_SLEEP_e, + dRes_ID_BA_BCK_05_BA_CUT8_WAIT_e, + dRes_ID_BA_BCK_GETUP_e, + }; + return a_bck_resID_tbl[param_1]; + } /* 00000B58-00000B6C .text btpNum_toResID__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::btpNum_toResID(int) { - /* Nonmatching */ +int daNpc_Ba1_c::btpNum_toResID(int param_1) { + static const int a_btp_resID_tbl[] = { + dRes_ID_BA_BTP_MABA01_e, + dRes_ID_BA_BTP_BA_T01_e, + dRes_ID_BA_BTP_BA_T02_e, + dRes_ID_BA_BTP_BA_T03_e, + dRes_ID_BA_BTP_BA_T04_e, + dRes_ID_BA_BTP_BA_T05_e, + dRes_ID_BA_BTP_BA_T06_e, + dRes_ID_BA_BTP_BA_T07_e, + dRes_ID_BA_BTP_BA_T08_e, + dRes_ID_BA_BTP_BA_T09_e, + dRes_ID_BA_BTP_BA_T10_e, + dRes_ID_BA_BTP_BA_WAKE_e, + }; + return a_btp_resID_tbl[param_1]; } /* 00000B6C-00000C7C .text setBtp__11daNpc_Ba1_cFbi */ -void daNpc_Ba1_c::setBtp(bool, int) { - /* Nonmatching */ +bool daNpc_Ba1_c::setBtp(bool i_param_1, int i_btp_num) { + J3DModelData* model_data = mpMorf->getModel()->getModelData(); + int res_id = btpNum_toResID(i_btp_num); + m_hed_tex_pttrn = reinterpret_cast(dComIfG_getObjectIDRes("Ba",res_id)); + JUT_ASSERT(VERSION_SELECT(0x237, 0x237,0x239, 0x239),m_hed_tex_pttrn != NULL); + + int iVar1 = mHeadBtpAnm.init(model_data,m_hed_tex_pttrn,1,2,1.0f,0,-1,i_param_1,0); + bool o_retval = iVar1 == 1; + if(o_retval){ + mBlinkFrame = 0; + mBlinkTimer = 0; + } + return o_retval; } /* 00000C7C-00000CA4 .text iniTexPttrnAnm__11daNpc_Ba1_cFb */ -void daNpc_Ba1_c::iniTexPttrnAnm(bool) { - /* Nonmatching */ +bool daNpc_Ba1_c::iniTexPttrnAnm(bool i_param_1) { + return setBtp(i_param_1, mBtpNum); } /* 00000CA4-00000D50 .text plyTexPttrnAnm__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::plyTexPttrnAnm() { - /* Nonmatching */ + // 100% identical to the one in bm1 + if(mBtpNum != 0 || !cLib_calcTimer(&mBlinkTimer)){ + mBlinkFrame += 1; + if(mBlinkFrame >= m_hed_tex_pttrn->getFrameMax()){ + if(mBtpNum != 0){ + mBlinkFrame = m_hed_tex_pttrn->getFrameMax(); + }else{ + mBlinkTimer = cM_rndF(60.0f) + 30.0f; + mBlinkFrame = 0; + + } + } + } } /* 00000D50-00000D8C .text setAnm_tex__11daNpc_Ba1_cFSc */ -void daNpc_Ba1_c::setAnm_tex(signed char) { - /* Nonmatching */ +void daNpc_Ba1_c::setAnm_tex(s8 i_btp_num) { + if(mBtpNum != i_btp_num){ + mBtpNum = i_btp_num; + iniTexPttrnAnm(true); + } } /* 00000D8C-00000E34 .text setAnm_anm__11daNpc_Ba1_cFPQ211daNpc_Ba1_c9anm_prm_c */ -void daNpc_Ba1_c::setAnm_anm(daNpc_Ba1_c::anm_prm_c*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::setAnm_anm(daNpc_Ba1_c::anm_prm_c* i_anmPrmP) { + if(mAnmNum == i_anmPrmP->mAnmNum){ + return 1; + } + mAnmNum = i_anmPrmP->mAnmNum; + dNpc_setAnmIDRes( + mpMorf, + i_anmPrmP->mLoopMode, + i_anmPrmP->mMorf, + i_anmPrmP->mSpeed, + anmNum_toResID(mAnmNum), + -1, + "Ba" + ); + mPrevMorfFrame = 0; + m7EF = 0; + mbMorfAnimStopped = 0; + return TRUE; } /* 00000E34-00000EA0 .text setAnm_NUM__11daNpc_Ba1_cFii */ -void daNpc_Ba1_c::setAnm_NUM(int, int) { - /* Nonmatching */ +void daNpc_Ba1_c::setAnm_NUM(int i_param_1, int i_param_2) { + static anm_prm_c a_anm_prm_tbl[11] = { + {0, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {1, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {3, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {4, 0, 0, 8, 1, J3DFrameCtrl::EMode_NONE}, + {5, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {6, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {7, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {8, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {9, 0xB, 0, 8, 1, J3DFrameCtrl::EMode_NONE}, + {0, 9, 0, 0, 1, J3DFrameCtrl::EMode_LOOP}, + }; + if(i_param_2 != 0){ + setAnm_tex(a_anm_prm_tbl[i_param_1].mBtpNum); + } + setAnm_anm(&a_anm_prm_tbl[i_param_1]); } /* 00000EA0-00000F20 .text setAnm__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::setAnm() { - /* Nonmatching */ +bool daNpc_Ba1_c::setAnm() { + static anm_prm_c a_anm_prm_tbl[8] = { + {-1, -1, 0, 0, 0, -1}, + {0, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {-1, -1, 0, 0, 0, -1}, + {0, 2, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {7, 7, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {-1, -1, 0, 0, 0, -1}, + {0, 9, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {0, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + }; + if(a_anm_prm_tbl[mStatus].mBtpNum >= 0){ + setAnm_tex(a_anm_prm_tbl[mStatus].mBtpNum); + } + if(a_anm_prm_tbl[mStatus].mAnmNum >= 0){ + setAnm_anm(&a_anm_prm_tbl[mStatus]); + } + return true; } /* 00000F20-00000F24 .text chg_anmTag__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::chg_anmTag() { - /* Nonmatching */ -} +void daNpc_Ba1_c::chg_anmTag() {} /* 00000F24-00000F28 .text control_anmTag__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::control_anmTag() { - /* Nonmatching */ -} +void daNpc_Ba1_c::control_anmTag() {} /* 00000F28-00000F6C .text chg_anmAtr__11daNpc_Ba1_cFUc */ -void daNpc_Ba1_c::chg_anmAtr(unsigned char) { - /* Nonmatching */ +void daNpc_Ba1_c::chg_anmAtr(u8 i_param_1) { + if ((i_param_1 >= 0x15) || (i_param_1 == m80E)) { + return; + } + m80E = i_param_1; + setAnm_ATR(1); } /* 00000F6C-00000FA4 .text control_anmAtr__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::control_anmAtr() { - /* Nonmatching */ + switch(m80E) { + case 5: + case 6: + switch (mLookBackState) { + case 1: + break; + default: + mLookBackState = 1; + m_jnt.setTrn(); + break; + } + break; + case 7: + case 8: + default: + return; + } } /* 00000FA4-0000100C .text setAnm_ATR__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::setAnm_ATR(int) { - /* Nonmatching */ +void daNpc_Ba1_c::setAnm_ATR(int i_param_1) { + static anm_prm_c a_anm_prm_tbl[21] = { + {0, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {1, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {3, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {0, 1, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2, 2, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {1, 3, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {3, 2, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2, 3, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2,4, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {2, 6, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {3, 5, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {3, 6, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {7, 7, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {6, 8, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {6, 1, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {5, 0XA, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {5, 1, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {5, 9, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {5, 0, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + {0, 8, 0, 8, 1, J3DFrameCtrl::EMode_LOOP}, + }; + if (i_param_1 != 0) { + setAnm_tex(a_anm_prm_tbl[m80E].mBtpNum); + } + setAnm_anm(&a_anm_prm_tbl[m80E]); + } /* 0000100C-000010D0 .text anmAtr__11daNpc_Ba1_cFUs */ -void daNpc_Ba1_c::anmAtr(unsigned short) { - /* Nonmatching */ +void daNpc_Ba1_c::anmAtr(u16 i_param_1) { + u32 mesgAnimeTagInfo; + switch(i_param_1) { + case 6: + if (m819 == 0) { + m80E = 0xFF; + chg_anmAtr(dComIfGp_getMesgAnimeAttrInfo()); + m819++; + } + mesgAnimeTagInfo = dComIfGp_getMesgAnimeTagInfo(); + dComIfGp_clearMesgAnimeTagInfo(); + if(mesgAnimeTagInfo != 0xFF && mMesgAnimeTagInfo != mesgAnimeTagInfo){ + mMesgAnimeTagInfo = mesgAnimeTagInfo; + chg_anmTag(); + } + break; + case 0xE: + m819 = 0; + break; + default: + break; + } + control_anmTag(); + control_anmAtr(); } /* 000010D0-000011A0 .text eventOrder__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eventOrder() { - /* Nonmatching */ + s8 condition = m812; + if(condition == 1 || condition == 2){ + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if(mSpecificType == 3 && !dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)){ + eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); + } + if(m812 == 1){ + fopAcM_orderSpeakEvent(this); + } + }else if(condition >= 3){ + mEventIdx = condition - 3; + fopAcM_orderOtherEventId(this,mEventIdTable[mEventIdx]); + } } /* 000011A0-0000123C .text checkOrder__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::checkOrder() { - /* Nonmatching */ + if(eventInfo.checkCommandDemoAccrpt()){ + if(dComIfGp_evmng_startCheck(mEventIdTable[mEventIdx])){ + m812 = 0; + } + }else if(checkCommandTalk() && (m812 == 1 || m812 == 2)){ + m812 = 0; + m809 = true; + } } /* 0000123C-000012E8 .text chk_talk__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::chk_talk() { - /* Nonmatching */ +bool daNpc_Ba1_c::chk_talk() { + bool ret = true; + mItemNo = 0xFF; + if(dComIfGp_event_chkTalkXY()){ + if(dComIfGp_evmng_ChkPresentEnd()){ + mItemNo = dComIfGp_event_getPreItemNo(); + + } else { + ret = false; + } + mItemNo = dComIfGp_event_getPreItemNo(); + + } + + return ret; } /* 000012E8-0000137C .text chk_drct__11daNpc_Ba1_cFf */ -void daNpc_Ba1_c::chk_drct(float) { - /* Nonmatching */ +bool daNpc_Ba1_c::chk_drct(float i_param_1) { + s16 target = cLib_targetAngleY( + ¤t.pos, + &dComIfGp_getPlayer(0)->current.pos + ) - current.angle.y; + int cmp = abs(target); + return cmp < cM_deg2s(i_param_1); } /* 0000137C-000013BC .text chk_partsNotMove__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::chk_partsNotMove() { - /* Nonmatching */ +bool daNpc_Ba1_c::chk_partsNotMove() { + return mJointHeadY == m_jnt.getHead_y() && + mJointBackboneY == m_jnt.getBackbone_y() && + mActorAngleY == current.angle.y; } /* 000013BC-0000155C .text lookBack__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::lookBack() { - /* Nonmatching */ + cXyz dstPos; + cXyz* dstPos_p; + cXyz src_pos; + s16 desiredYrot; + mJointHeadY = m_jnt.getHead_y(); + mJointBackboneY = m_jnt.getBackbone_y(); + mActorAngleY = current.angle.y; + src_pos.x = current.pos.x; + src_pos.y = current.pos.y; + src_pos.z = current.pos.z; + src_pos.y = eyePos.y; + dstPos.set(0.0f,0.0f,0.0f); + dstPos_p = NULL; + desiredYrot = current.angle.y; + bool headOnlyFollow = mHeadOnlyFollow; + + switch(mLookBackState){ + case 1: + dstPos = dNpc_playerEyePos(-20.0f); + dstPos_p = &dstPos; + src_pos.x = current.pos.x; + src_pos.y = current.pos.y; + src_pos.z = current.pos.z; + src_pos.y = eyePos.y; + break; + case 2: + dstPos.set(m79C); + dstPos_p = &dstPos; + src_pos.x = current.pos.x; + src_pos.y = current.pos.y; + src_pos.z = current.pos.z; + src_pos.y = eyePos.y; + break; + case 3: + desiredYrot = mTargetYRot; + break; + } + cLib_addCalcAngleS2(&mLookAtMaxVel,l_HIO.mPrmTbl.mCalcAngleTarget,4,0x800); + if(!m_jnt.trnChk()){ + mLookAtMaxVel = 0; + } + m_jnt.lookAtTarget(¤t.angle.y,dstPos_p,src_pos,desiredYrot,mLookAtMaxVel,headOnlyFollow); } /* 0000155C-000016C8 .text next_msgStatus__11daNpc_Ba1_cFPUl */ -void daNpc_Ba1_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Ba1_c::next_msgStatus(unsigned long* i_msg_no) { + u16 ret = 0xF; + switch(*i_msg_no) { + case 0x7EB: + *i_msg_no = 0x7EC; + break; + case 0x7EF: + *i_msg_no = 0x7F0; + break; + case 0x7F3: + *i_msg_no = 0x7F4; + break; + case 0x7F4: + neverGotSoup: + if(dComIfGs_checkEmptyBottle()) { + *i_msg_no = 0x7F5; + } else { + *i_msg_no = 0x7F9; + } + break; + case 0x7F6: + *i_msg_no = 0x7F7; + break; + case 0x7FB: + case 0x7FC: + case 0x7FD: + case 0x7FA: + if(dComIfGs_isGetBottleItem(dItemNo_SOUP_BOTTLE_e)) { + if(!dComIfGs_checkEmptyBottle()) { + *i_msg_no = 0x803; + } + else if(dComIfGs_checkBottle(dItemNo_SOUP_BOTTLE_e)) { + *i_msg_no = 0x7FE; + } else { + *i_msg_no = 0x7FF; + } + break; + } + goto neverGotSoup; // I don't like this ... + case 0x7FF: + switch(mpCurrMsg->mSelectNum) { + case 0: + *i_msg_no = 0x800; + break; + case 1: + *i_msg_no = 0x802; + break; + } + break; + default: + ret = 0x10; + break; + } + return ret; } /* 000016C8-00001738 .text getMsg_BA1_0__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::getMsg_BA1_0() { - /* Nonmatching */ +u32 daNpc_Ba1_c::getMsg_BA1_0() { + if (m7FA) { + return 0x7d8; + } + if (mbHoldEvent) { + return dComIfGs_isEventBit(dSv_event_flag_c::UNK_0608) ? 0x7e7 : 0x7e6; + } + return m7FB ? 0x7e5 : 0x7e4; } /* 00001738-00001818 .text getMsg_BA1_1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::getMsg_BA1_1() { - /* Nonmatching */ +u32 daNpc_Ba1_c::getMsg_BA1_1() { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0E20)) { + if (dComIfGs_checkCollect(1)) { + return 0x80b; + } + return dComIfGs_isEventBit(dSv_event_flag_c::UNK_0740) ? 0x7ee : 0x7ef; + + } + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0780)) { + return 0x7ed; + } + if (dComIfGs_checkCollect(0)) { + return dComIfGs_isEventBit(dSv_event_flag_c::UNK_0602) ? 0x7ea : 0x7eb; + } + return dComIfGs_isEventBit(dSv_event_flag_c::UNK_0601) ? 0x7e9 : 0x7e8; + } /* 00001818-00001908 .text getMsg_BA1_3__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::getMsg_BA1_3() { - /* Nonmatching */ +u32 daNpc_Ba1_c::getMsg_BA1_3() { + + if (m7F0) { + if (dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)) { + return 0x801; + } + return 0x7f6; + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)) { + +#if VERSION > VERSION_JPN + dComIfGs_setEventReg(dSv_event_flag_c::UNK_A60F, 0); + if(m7F2 >= 3) { +#else + if(dComIfGs_getEventReg(dSv_event_flag_c::UNK_A60F) >= 3) { +#endif + if (m7FA) { + return 0x7fd; + } + m7FA = true; + return 0x7fc; + } + if (m7FA) { + return 0x7fa; + } + m7FA = true; + return 0x7fb; + } + return 0x7f1; } /* 00001908-00001928 .text getMsg_BA1_4__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::getMsg_BA1_4() { - /* Nonmatching */ +u32 daNpc_Ba1_c::getMsg_BA1_4() { + return getMsg_BA1_3(); } /* 00001928-000019AC .text getMsg__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Ba1_c::getMsg() { + u32 ret = 0; + switch ((mSpecificType)) { + case 0: + ret = getMsg_BA1_0(); + break; + case 1: + ret = getMsg_BA1_1(); + break; + case 3: + ret = getMsg_BA1_3(); + break; + case 4: + ret = getMsg_BA1_4(); + break; + } + return ret; } /* 000019AC-00001A2C .text chkAttention__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::chkAttention() { - /* Nonmatching */ +bool daNpc_Ba1_c::chkAttention() { + dAttention_c& attention = dComIfGp_getAttention(); + if (attention.LockonTruth()) { + return this == attention.LockonTarget(0); + } + return this == attention.ActionTarget(0); } /* 00001A2C-00001A94 .text setAttention__11daNpc_Ba1_cFb */ -void daNpc_Ba1_c::setAttention(bool) { - /* Nonmatching */ +void daNpc_Ba1_c::setAttention(bool i_setEyePos) { + + f32 offset = l_HIO.mPrmTbl.mAttPosOffsetY; + attention_info.position.set( + current.pos.x, + current.pos.y + offset, + current.pos.z + ); + + + if (!mbSetEyePos && !i_setEyePos) { + return; + } + + eyePos.set( + mTransformedEyePos.x, + mTransformedEyePos.y, + mTransformedEyePos.z + ); + eyePos.y += mEyeOffset; } /* 00001A94-00001AC8 .text searchByID__11daNpc_Ba1_cFUi */ -void daNpc_Ba1_c::searchByID(fpc_ProcID) { - /* Nonmatching */ +fopAc_ac_c* daNpc_Ba1_c::searchByID(fpc_ProcID i_procID) { + fopAc_ac_c* o_actor = NULL; + fopAcM_SearchByID(i_procID,&o_actor); + return o_actor; } /* 00001AC8-00001B78 .text partner_srch_sub__11daNpc_Ba1_cFPFPvPv_Pv */ -void daNpc_Ba1_c::partner_srch_sub(void* (*)(void*, void*)) { - /* Nonmatching */ +bool daNpc_Ba1_c::partner_srch_sub(void* (*i_searchFunc)(void*, void*)) { + bool o_retval = false; + mPartnerProcID = -1; + l_check_wrk = 0; + for(int i = 0; i < 20; i++){ + l_check_inf[i] = 0; + } + fpcM_Search(i_searchFunc,this); + if(l_check_wrk != 0){ + mPartnerProcID = fopAcM_GetID(l_check_inf[0]); + o_retval = true; + } + return o_retval; } /* 00001B78-00001B90 .text partner_srch__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::partner_srch() { - /* Nonmatching */ + if (m818 == 1) { +#if VERSION == VERSION_DEMO + bool found_partner = 1; + if(found_partner) { + m818++; + } +#else + m818++; +#endif + } } /* 00001B90-00001CA8 .text check_useFairyArea__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::check_useFairyArea() { - /* Nonmatching */ +bool daNpc_Ba1_c::check_useFairyArea() { + bool ret; + f32 mag = std::sqrtf((dComIfGp_getPlayer(0)->current.pos - current.pos).abs2XZ()); + ret = FALSE; + if ( + std::abs(dComIfGp_getPlayer(0)->current.pos.y - current.pos.y) < 100.0f + && mag < l_HIO.mPrmTbl.m1C + ) { + ret = TRUE; + } + return ret; } /* 00001CA8-00001CF8 .text checkCommandTalk__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::checkCommandTalk() { - /* Nonmatching */ +bool daNpc_Ba1_c::checkCommandTalk() { + bool ret; + ret = false; + + if (eventInfo.checkCommandTalk()) { + ret = dComIfGp_event_chkTalkXY() == 0; + } + return ret; } /* 00001CF8-00001D7C .text charDecide__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::charDecide(int) { - /* Nonmatching */ +bool daNpc_Ba1_c::charDecide(int i_param_1) { + mType = 0; + mSpecificType = -1; + switch (i_param_1) { + case 0: + mSpecificType = 0; + break; + case 1: + mSpecificType = 1; + break; + case 2: + mSpecificType = 2; + break; + case 3: + mSpecificType = 3; + break; + case 4: + mSpecificType = 4; + break; + default: + return false; + } + return true; } /* 00001D7C-00001E10 .text eInit_SET_PLYER_GOL___11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eInit_SET_PLYER_GOL_() { - /* Nonmatching */ + cXyz tmp, target; + tmp.set(0, 0, 50); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&tmp, &target); + dComIfGp_evmng_setGoal(&target); } /* 00001E10-00001ECC .text eInit_PLYER_INI_POS___11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eInit_PLYER_INI_POS_() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz tmp, target; + tmp.set(0, 0, 180); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&tmp, &target); + player->setPlayerPosAndAngle( + &target, + cLib_targetAngleY(&target, ¤t.pos) + ); } /* 00001ECC-00001EE8 .text eInit_USE_FAIRY_END___11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eInit_USE_FAIRY_END_() { - /* Nonmatching */ + attention_info.distances[1] = 0x5B; + attention_info.distances[3] = 0x59; + mFairyUsed = true; + } /* 00001EE8-00001F04 .text eInit_MOV_POS___11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eInit_MOV_POS_() { - /* Nonmatching */ + m7F5 = true; + mpClothModel = NULL; + m7F7 = true; + m7FE = true; } /* 00001F04-00001F48 .text eInit_SET_PLYER_TRN_ANG___11daNpc_Ba1_cFv */ void daNpc_Ba1_c::eInit_SET_PLYER_TRN_ANG_() { - /* Nonmatching */ -} + daPy_py_c* player = daPy_getPlayerActorClass(); + player->mDemo.setMoveAngle( + cLib_targetAngleY( + &dComIfGp_getPlayer(0)->current.pos, + ¤t.pos) + ); + } /* 00001F48-000020AC .text eInit_ACTOR_DRW_CONTROL___11daNpc_Ba1_cFPiPi */ -void daNpc_Ba1_c::eInit_ACTOR_DRW_CONTROL_(int*, int*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_ACTOR_DRW_CONTROL_(int* i_param_1, int* i_param_2) { + if(i_param_1 != NULL) { + daPy_py_c* player = daPy_getPlayerActorClass(); + switch (*i_param_1) { + case 0: + player->onNoResetFlg0(daPy_py_c::daPyFlg0_NO_DRAW); + break; + case 1: + player->offNoResetFlg0(daPy_py_c::daPyFlg0_NO_DRAW); + break; + } + + } + if(i_param_2 != NULL) { + cXyz tmp; + switch (*i_param_2) { + case 0: + m7F7 = 1; + break; + case 1: + m7F7 = 0; + break; + case 2: + setAnm_NUM( 10, 1); + m7F7 = 1; + return; + case 3: + current.angle.y = cLib_targetAngleY(¤t.pos, &dComIfGp_getPlayer(0)->current.pos); + attention_info.distances[1] = 0xAB; + attention_info.distances[3] = 0xAB; + tmp.set(0, 0, 90); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&tmp, ¤t.pos); + m7F7 = 0; + break; + } + } } /* 000020AC-000020C8 .text eInit_setEvTimer__11daNpc_Ba1_cFPi */ -void daNpc_Ba1_c::eInit_setEvTimer(int*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_setEvTimer(int* i_param_1) { + mEvTimer = 0; + if (i_param_1 != NULL) { + mEvTimer = *i_param_1; + } } /* 000020C8-000020E8 .text eInit_CHK_FAIRY___11daNpc_Ba1_cFPi */ -void daNpc_Ba1_c::eInit_CHK_FAIRY_(int*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_CHK_FAIRY_(int* i_param_1) { + eInit_setEvTimer(i_param_1); } /* 000020E8-000020F8 .text eInit_prmFloat__11daNpc_Ba1_cFPff */ -void daNpc_Ba1_c::eInit_prmFloat(float*, float) { - /* Nonmatching */ +f32 daNpc_Ba1_c::eInit_prmFloat(float* i_param_1, float i_param_2) { + if (i_param_1 != NULL) { + return *i_param_1; + } + return i_param_2; } /* 000020F8-00002130 .text eInit_SET_EYE_OFF___11daNpc_Ba1_cFPf */ -void daNpc_Ba1_c::eInit_SET_EYE_OFF_(float*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_SET_EYE_OFF_(float* i_param_1) { + mEyeOffset = eInit_prmFloat(i_param_1, 0.0f); } /* 00002130-00002168 .text eInit_EYE_OFF_ZRO___11daNpc_Ba1_cFPf */ -void daNpc_Ba1_c::eInit_EYE_OFF_ZRO_(float*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_EYE_OFF_ZRO_(float* i_param_1) { + mEyeOffsetZero = eInit_prmFloat(i_param_1, 0.0f); } /* 00002168-00002188 .text eInit_CHK_FAIRY_MOV_1__11daNpc_Ba1_cFPi */ -void daNpc_Ba1_c::eInit_CHK_FAIRY_MOV_1(int*) { - /* Nonmatching */ +void daNpc_Ba1_c::eInit_CHK_FAIRY_MOV_1(int* i_param_1) { + eInit_setEvTimer(i_param_1); } /* 00002188-00002358 .text event_actionInit__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::event_actionInit(int) { - /* Nonmatching */ +void daNpc_Ba1_c::event_actionInit(int i_staff_idx) { + int *act_no_p; + int *prm_0_p; + int *prm_1_p; + int *timer_p; + float *atten_p; + float *speed_p; + act_no_p = dComIfGp_evmng_getMyIntegerP(i_staff_idx,"ActNo"); + prm_0_p = dComIfGp_evmng_getMyIntegerP(i_staff_idx,"prm_0"); + prm_1_p = dComIfGp_evmng_getMyIntegerP(i_staff_idx,"prm_1"); + timer_p = dComIfGp_evmng_getMyIntegerP(i_staff_idx,"Timer"); + atten_p = dComIfGp_evmng_getMyFloatP(i_staff_idx,"Atten"); + speed_p = dComIfGp_evmng_getMyFloatP(i_staff_idx,"Speed"); + if (act_no_p != NULL) { + mActNo = *act_no_p; + switch (mActNo) { + case 0: + setAnm_NUM(9, 1); + break; + case 1: + eInit_SET_PLYER_GOL_(); + break; + case 2: + eInit_PLYER_INI_POS_(); + break; + case 3: + eInit_USE_FAIRY_END_(); + break; + case 4: + eInit_MOV_POS_(); + break; + case 5: + eInit_SET_PLYER_TRN_ANG_(); + break; + case 6: + eInit_ACTOR_DRW_CONTROL_(prm_0_p,prm_1_p); + break; + case 7: + eInit_CHK_FAIRY_(timer_p); + break; + case 8: + eInit_SET_EYE_OFF_(atten_p); + break; + case 9: + eInit_EYE_OFF_ZRO_(speed_p); + break; + case 10: + eInit_CHK_FAIRY_MOV_1(timer_p); + break; + } + } } /* 00002358-00002518 .text eMove_MOV_POS___11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::eMove_MOV_POS_() { - /* Nonmatching */ +bool daNpc_Ba1_c::eMove_MOV_POS_() { + bool ret; + cXyz temp; + + temp.set(503, 0, -91); + if(cLib_calcTimer(&mEvTimer)) { + return FALSE; + } + if((int)mEyeOffset != 0) { + cLib_chaseF(&mEyeOffset, 0.0f, 2.0f); + return FALSE; + + } + f32 mag = std::sqrtf((temp - current.pos).abs2XZ()); + ret = mag < 4.0f; + m78A.y = cLib_targetAngleY(¤t.pos, &dComIfGp_getPlayer(0)->current.pos); + m7F5 = true; + if(ret != 0) { + current.angle.y = m78A.y; + m7F5 = false; + speedF = 0.0; + mEyeOffset = 0.0; + } else { + cLib_addCalcAngleS( + ¤t.angle.y, + cLib_targetAngleY(¤t.pos, &temp), + 4, + 0x400, + 0 + ); + cLib_chaseF(&speedF, 4.0f, 0.4f); + } + return ret; } /* 00002518-00002574 .text eMove_CHK_FAIRY___11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::eMove_CHK_FAIRY_() { - /* Nonmatching */ +bool daNpc_Ba1_c::eMove_CHK_FAIRY_() { + if(cLib_calcTimer(&mEvTimer) == 0) { + return !partner_srch_sub(searchActor_Fa); + } + return false; } /* 00002574-00002608 .text eMove_EYE_OFF_ZRO___11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::eMove_EYE_OFF_ZRO_() { - /* Nonmatching */ +bool daNpc_Ba1_c::eMove_EYE_OFF_ZRO_() { + bool ret; + + ret = (int) mEyeOffsetZero == 0; + + if (ret) { + mEyeOffset = 0.0; + } else { + cLib_chaseF(&mEyeOffset,0.0,mEyeOffsetZero); + ret = (int) mEyeOffset == 0; + if (ret) { + mEyeOffset = 0.0; + } + } + return ret; } /* 00002608-0000269C .text eMove_CHK_FAIRY_MOV_1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::eMove_CHK_FAIRY_MOV_1() { - /* Nonmatching */ +bool daNpc_Ba1_c::eMove_CHK_FAIRY_MOV_1() { + bool ret = false; + if(!cLib_calcTimer(&mEvTimer)) { + if(partner_srch_sub(searchActor_Fa)) { + daNpc_Fa1_c * actor_fa; + actor_fa = (daNpc_Fa1_c*) searchByID(mPartnerProcID); + if(actor_fa != NULL) { + u32 res = (actor_fa->getMode() == daNpc_Fa1_c::Mode_BOTTLE_BABA_MOVE_e); + ret = res !=0; + } + } + } + if(ret) { + eInit_PLYER_INI_POS_(); + } + return ret; } /* 0000269C-00002704 .text event_action__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::event_action() { - /* Nonmatching */ +bool daNpc_Ba1_c::event_action() { + bool ret; + switch(mActNo) { + case 4: + ret = eMove_MOV_POS_(); + break; + case 7: + ret = eMove_CHK_FAIRY_(); + break; + case 9: + ret = eMove_EYE_OFF_ZRO_(); + break; + case 10: + ret = eMove_CHK_FAIRY_MOV_1(); + break; + case 1: + case 2: + case 3: + case 5: + case 6: + case 8: + case 0: + default: + ret = true; + break; + } + return ret; } /* 00002704-00002764 .text cut_init_START_TALE1__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::cut_init_START_TALE1(int) { - /* Nonmatching */ +void daNpc_Ba1_c::cut_init_START_TALE1(int i_staff_idx) { + int *timer_p; + timer_p = dComIfGp_evmng_getMyIntegerP(i_staff_idx,"Timer"); + mEvTimer = 0; + if(timer_p != NULL) { + mEvTimer = *timer_p; + } } /* 00002764-00002820 .text cut_move_START_TALE1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::cut_move_START_TALE1() { - /* Nonmatching */ +bool daNpc_Ba1_c::cut_move_START_TALE1() { + if(cLib_calcTimer(&mEvTimer) == 0) { + if(dComIfGs_getClearCount() != 0) { + dComIfGp_setNextStage( + "LinkRM", + 202, + 0, + 8, + 0.0, + 0, + 1, + 0 + ); + } else { + dComIfGp_setNextStage( + "LinkRM", + 200, + 0, + 8, + 0.0, + 0, + 1, + 0 + ); + + } + } + return mEvTimer == 0; } /* 00002820-00002948 .text privateCut__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::privateCut(int) { - /* Nonmatching */ +void daNpc_Ba1_c::privateCut(int i_staff_idx) { + static char* a_cut_tbl[] = { + "ACTION", + "START_TALE1" + }; + + if(i_staff_idx != -1) { + mActionIndex = dComIfGp_evmng_getMyActIdx(i_staff_idx,a_cut_tbl,ARRAY_SIZE(a_cut_tbl),1,0); + if (mActionIndex == -1) { + dComIfGp_evmng_cutEnd(i_staff_idx); + } else { + if (dComIfGp_evmng_getIsAddvance(i_staff_idx)) { + switch(mActionIndex){ + case 0: + event_actionInit(i_staff_idx); + break; + case 1: + cut_init_START_TALE1(i_staff_idx); + } + } + bool endCut; + switch (mActionIndex) { + case 0: + endCut = event_action(); + break; + case 1: + endCut = cut_move_START_TALE1(); + break; + default: + endCut = true; + break; + } + if(endCut) { + dComIfGp_evmng_cutEnd(i_staff_idx); + } + } + } } /* 00002948-00002968 .text endEvent__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::endEvent() { - /* Nonmatching */ + dComIfGp_event_reset(); + m80E = 0xFF; } /* 00002968-000029A0 .text isEventEntry__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::isEventEntry() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::isEventEntry() { + return dComIfGp_evmng_getMyStaffId(mEventCut.getActorName(),NULL); + } /* 000029A0-00002B50 .text event_proc__11daNpc_Ba1_cFi */ -void daNpc_Ba1_c::event_proc(int) { - /* Nonmatching */ +void daNpc_Ba1_c::event_proc(int i_staff_idx) { + if (dComIfGp_evmng_endCheck(mEventIdTable[mEventIdx])) { + switch(mEventIdx){ + case 0: + break; + case 1: + if(dComIfGs_checkBottle(dItemNo_HALF_SOUP_BOTTLE_e)) { + dComIfGs_setBottleItemIn(dItemNo_HALF_SOUP_BOTTLE_e, dItemNo_SOUP_BOTTLE_e); + } else { + dComIfGs_setEmptyBottleItemIn(dItemNo_SOUP_BOTTLE_e); + } + if(dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)) { + m812 = 1; + m7F0 = 1; + } else { + m812 = 5; + } + break; + case 2: + dLetter_send(0x9D03); + dComIfGs_onEventBit(dSv_event_flag_c::GRANDMA_HEALED); + set_action(&daNpc_Ba1_c::wait_action4, NULL); + mInitialPos = current.pos; + mInitialAngle = current.angle; + m7FE = 0; + break; + case 3: + break; + } + endEvent(); + return; + } + else { + if (!mEventCut.cutProc()) { + privateCut(i_staff_idx); + } + lookBack(); + } } /* 00002B50-00002BFC .text set_action__11daNpc_Ba1_cFM11daNpc_Ba1_cFPCvPvPv_iPv */ -void daNpc_Ba1_c::set_action(int (daNpc_Ba1_c::*)(void*), void*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::set_action(ProcFunc i_newProcFunc, void* i_argsP) { + if (mCurrProcFunc != i_newProcFunc) { + if (mCurrProcFunc) { + m818 = 9; + (this->*mCurrProcFunc)(i_argsP); + } + mCurrProcFunc = i_newProcFunc; + m818 = 0; + (this->*mCurrProcFunc)(i_argsP); + } + return TRUE; } /* 00002BFC-00002CA8 .text setStt__11daNpc_Ba1_cFSc */ -void daNpc_Ba1_c::setStt(signed char) { - /* Nonmatching */ +void daNpc_Ba1_c::setStt(s8 i_status) { + s8 temp = mStatus; + mEvTimer2 = 0; + mStatus = i_status; + switch(mStatus) { + case 2: +#if VERSION <= VERSION_JPN + dComIfGs_setEventReg(dSv_event_flag_c::UNK_A60F, 0); +#endif + m80E = 0xFF; + if(mAnmNum != 4) { + mLookBackState = 1; + m_jnt.setTrn(); + } + mPrevStatus = temp; + return; + case 0: + break; + case 5: + m80E = 0xFF; + mPrevStatus = temp; + return; + case 1: + case 3: + case 4: + case 6: + case 7: + mHeadOnlyFollow = true; + break; + } + + setAnm(); + } /* 00002CA8-00002E30 .text wait_0__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::wait_0() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_0() { + cLib_addCalcAngleS( + ¤t.angle.y, + mInitialAngle.y, + 4, + 0x800, + 0 + ); + if(m812 == 1 || m812 >= 3) { + return 1; + } + m812 = 0; + if(!dComIfGs_isTmpBit(dSv_event_flag_c::UNK_0310)) { + f32 dist = std::sqrtf((dComIfGp_getPlayer(0)->current.pos - current.pos).abs2XZ()); + if( + std::fabsf(dComIfGp_getPlayer(0)->current.pos.y - current.pos.y) < 100.0f + && dist < l_HIO.mPrmTbl.m20 + ) { + dComIfGs_onTmpBit(dSv_event_flag_c::UNK_0310); + m812 = 6; + } + } + return 1; } /* 00002E30-00002F70 .text wait_1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::wait_1() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_1() { + cLib_addCalcAngleS( + ¤t.angle.y, + mInitialAngle.y, + 4, + 0x800, + 0 + ); + if(m812 == 1 || m812 >= 3) { + return 1; + } + if (m809) { + if (chk_talk()) { + setStt(2); + mHeadOnlyFollow = false; + } + return 1; + } + else if (mbHoldEvent) { + setAnm_NUM(4,1); + m812 = 1; + mLookBackState = 0; + mTargetYRot = current.angle.y + -0x638e; + } + else { + m812 = 2; + if (mbAttention != 0) { + mEvTimer2 = 60; + } + if (cLib_calcTimer(&mEvTimer2) && chk_drct(61.0)) { + mLookBackState = 1; + } + else { + mLookBackState = 3; + mTargetYRot = (mInitialAngle).y; + m_jnt.setTrn(); + } + } + + return 1; } /* 00002F70-00003110 .text talk_1__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::talk_1() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::talk_1() { + u8 ret; + + ret = chk_partsNotMove(); + if (mAnmNum == 4) { + cLib_addCalcAngleS( + ¤t.angle.y, + mTargetYRot, + 2, + 0x1000, + 1); + if(!mbMorfAnimStopped) { + return 1; + } + } + talk(1); + if (mpCurrMsg != NULL) { + switch(mpCurrMsg->mStatus) { + case fopMsgStts_MSG_TYPING_e: + case fopMsgStts_BOX_OPENING_e: + break; + case fopMsgStts_MSG_DESTROYED_e: + switch (mCurrMsgNo) { + case 0x7e4: + m7FB = true; + break; + case 0x7e6: + // Unused + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0608); + break; + case 0x7e8: + // After Helmaroc cutscene (prologue) + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0601); + break; + case 0x7ec: + // Sword got + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0602); + break; + case 0x7f0: + // Aryll kidnapped + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0740); + break; + case 0x800: + if (mCurrMsgNo != 0x7f9) { + m812 = 4; + } + mFairyUsed = false; + break; + case 0x801: + m7F0 = 0; + break; + } + mItemNo = 0xff; + m809 = false; + setStt(mPrevStatus); + mEvTimer2 = 60; + endEvent(); + mbHoldEvent = false; + } + } + return ret; } /* 00003110-00003130 .text talk_2__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::talk_2() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::talk_2() { + talk_1(); } /* 00003130-00003348 .text wait_2__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::wait_2() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_2() { + cLib_addCalcAngleS( + ¤t.angle.y, + mInitialAngle.y, + 4, + 0x800, + 0 + ); + if(m812 == 1 || m812 >= 3) { + return 1; + } + if (m809) { + if (m7FF) { + dComIfGp_setNextStage("LinkRM",201,0,9,0.0,0,1,0); + return 1; + } + + if (chk_talk()) { + setStt(2); + mHeadOnlyFollow = false; + } + return 1; + } else if (!dComIfGs_checkCollect(1) && dComIfGs_isEventBit(dSv_event_flag_c::UNK_3202)) { + current.pos.x = -290.0; + current.pos.y = 0.0; + current.pos.z = 110.0; + current.angle.y = -0x8000; + mInitialPos.set(current.pos); + + mInitialAngle = current.angle; + if ((dComIfGp_getPlayer(0)->current.pos.y - current.pos.y) < 1.0f) { + m812 = 1; + m7FF = 1; + } + mLookBackState = 3; + mTargetYRot = mInitialAngle.y; + m_jnt.setTrn(); + return 1; + } + m812 = 2; + if (mbAttention) { + mEvTimer2 = 60; + } + if (cLib_calcTimer(&mEvTimer2) && chk_drct(61.0)) { + mLookBackState = 1; + } else { + mLookBackState = 3; + mTargetYRot = mInitialAngle.y; + m_jnt.setTrn(); + } + return 1; } /* 00003348-00003368 .text wait_3__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::wait_3() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_3() { + wait_2(); } /* 00003368-000034AC .text ZZZwai__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::ZZZwai() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::ZZZwai() { + if(m812 == 1 || m812 >= 3) { + return 1; + } + if (mFairyUsed) { + mFairyUsed = false; + m812 = 4; + return 1; + } + if (m809) { + if (chk_talk()) { + setStt(5); + } + return 1; + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)) { + m812 = 2; + if (mbAttention) { + mEvTimer2 = 60; + } + if (cLib_calcTimer(&mEvTimer2) && chk_drct(61.0)) { + mLookBackState = 1; + } else { + mLookBackState = 3; + mTargetYRot = mInitialAngle.y; + m_jnt.setTrn(); + } + } + else { + m812 = 0; + if (check_useFairyArea()) { + m812 = 2; + } + } + return 1; } /* 000034AC-0000363C .text wait_action1__11daNpc_Ba1_cFPv */ -void daNpc_Ba1_c::wait_action1(void*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_action1(void*) { + switch(m818) { + case 0: + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2A80)) { + m7FA = dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0310); + + if (m7FA) { + dComIfGs_offTmpBit(dSv_event_tmp_flag_c::UNK_0310); + } + setStt(1); + m818++; + } + else { + if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0310)) { + setStt(1); + m818++; + } + else { + setStt(7); + m818++; + } + } + break; + case 1: + case 2: + case 3: + mbAttention = chkAttention(); + switch(mStatus) { + case 7: + mbSetEyePos = wait_0(); + break; + case 1: + mbSetEyePos = wait_1(); + break; + case 2: + mbSetEyePos = talk_1(); + break; + } + lookBack(); + default: + case 9: + break; + + + } + return 1; + } /* 0000363C-000036F8 .text wait_action2__11daNpc_Ba1_cFPv */ -void daNpc_Ba1_c::wait_action2(void*) { - /* Nonmatching */ -} +BOOL daNpc_Ba1_c::wait_action2(void*) { + switch(m818) { + case 0: + setStt(3); + m818++; + break; + case 1: + case 2: + case 3: + mbAttention = chkAttention(); + switch(mStatus) { + case 3: + mbSetEyePos =wait_2(); + break; + case 2: + mbSetEyePos = talk_1(); + break; + } + lookBack(); + break; + default: + case 9: + break; + } + return 1; + } /* 000036F8-00003730 .text demo_action1__11daNpc_Ba1_cFPv */ -void daNpc_Ba1_c::demo_action1(void*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::demo_action1(void*) { + switch (m818) { + case 9: + break; + case 0: + m818++; + case 1: + case 2: + case 3: + break; + } + return 1; } /* 00003730-000037EC .text wait_action3__11daNpc_Ba1_cFPv */ -void daNpc_Ba1_c::wait_action3(void*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_action3(void*) { + switch(m818) { + case 0: + setStt(4); + m818++; + break; + case 1: + case 2: + case 3: + mbAttention = chkAttention(); + switch(mStatus) { + case 4: + mbSetEyePos = ZZZwai(); + break; + case 5: + mbSetEyePos =talk_2(); + break; + } + lookBack(); + break; + default: + case 9: + break; + } + return 1; } /* 000037EC-000038A8 .text wait_action4__11daNpc_Ba1_cFPv */ -void daNpc_Ba1_c::wait_action4(void*) { - /* Nonmatching */ +BOOL daNpc_Ba1_c::wait_action4(void*) { + switch(m818) { + case 0: + setStt(6); + m818++; + break; + case 1: + case 2: + case 3: + mbAttention = chkAttention(); + switch(mStatus) { + case 6: + mbSetEyePos = wait_3(); + break; + case 2: + mbSetEyePos =talk_1(); + break; + } + lookBack(); + break; + default: + case 9: + break; + } + return 1; } /* 000038A8-00003A18 .text demo__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::demo() { - /* Nonmatching */ +bool daNpc_Ba1_c::demo() { + if(demoActorID == 0){ + if(mbInDemo != 0){ + mbInDemo = 0; + } + }else{ + mbInDemo = 1; + dDemo_actor_c* demo_actor = dComIfGp_demo_getActor(demoActorID); + if(m_hed_tex_pttrn){ + mBlinkFrame += 1; + if (mBlinkFrame >= m_hed_tex_pttrn->getFrameMax()) { + mBlinkFrame = m_hed_tex_pttrn->getFrameMax(); + } + } + J3DAnmTexPattern* demopattern = demo_actor->getP_BtpData("Ba"); + if(demopattern){ + m_hed_tex_pttrn = demopattern; + if(mHeadBtpAnm.init(mpMorf->getModel()->getModelData(),m_hed_tex_pttrn,1,2,1.0f,0,-1,true,FALSE)){ + mBtpNum = dRes_ID_BA_BTP_BA_T02_e; + mBlinkFrame = 0; + } + } + dDemo_setDemoData(this,0x6A, mpMorf,"Ba"); + m78A.x = current.angle.x; + m78A.y = current.angle.y; + m78A.z = current.angle.z; + + shape_angle.x = m78A.x; + shape_angle.y = m78A.y; + shape_angle.z = m78A.z; + + } + return mbInDemo; } /* 00003A18-00003AA8 .text shadowDraw__11daNpc_Ba1_cFv */ void daNpc_Ba1_c::shadowDraw() { - /* Nonmatching */ + cXyz temp(current.pos.x,current.pos.y + 150.0f, current.pos.z); + + mShadowID = dComIfGd_setShadow( + mShadowID, + 1, + mpMorf->getModel(), + &temp, + 800.0f, + 40.0f, + current.pos.y, + mObjAcch.GetGroundH(), + mObjAcch.m_gnd, + &tevStr, + 0, + 1.0, + dDlst_shadowControl_c::getSimpleTex() + ); + +} + +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 }; } /* 00003AA8-00003C0C .text _draw__11daNpc_Ba1_cFv */ BOOL daNpc_Ba1_c::_draw() { - /* Nonmatching */ + + J3DModel* morf_model = mpMorf->getModel(); + J3DModelData* model_data = morf_model->getModelData(); + + if(mbInitGrandma0 || m7F7) { + return TRUE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR,¤t.pos,&tevStr); + g_env_light.setLightTevColorType(morf_model,&tevStr); + + mHeadBtpAnm.entry(model_data,mBlinkFrame); + mpMorf->entryDL(); + mHeadBtpAnm.remove(model_data); + if(mpClothModel != NULL) { + g_env_light.setLightTevColorType(mpClothModel, &tevStr); + mDoExt_modelEntryDL(mpClothModel); + } + shadowDraw(); + dSnap_RegistFig(DSNAP_TYPE_NPC_BA1, this, 1.0f, 1.0f, 1.0f); + + if((u8)l_HIO.mPrmTbl.m18 != 0){ + cXyz somevec; + if(mSpecificType == 0) { + somevec = current.pos; + somevec.y = eyePos.y; + } + if(mSpecificType == 3) { + somevec = current.pos; + somevec.y = eyePos.y; + } + + } + return 1; } /* 00003C0C-00003E1C .text _execute__11daNpc_Ba1_cFv */ BOOL daNpc_Ba1_c::_execute() { - /* Nonmatching */ + if(!mbRanExecute) { + mInitialPos = current.pos; + mInitialAngle = current.angle; + mbRanExecute = true; + } + m_jnt.setParam(l_HIO.mPrmTbl.mMaxBackboneX ,l_HIO.mPrmTbl.mMaxBackboneY, + l_HIO.mPrmTbl.mMinBackboneX,l_HIO.mPrmTbl.mMinBackboneY, + l_HIO.mPrmTbl.mMaxHeadX,l_HIO.mPrmTbl.mMaxHeadY, + l_HIO.mPrmTbl.mMinHeadX,l_HIO.mPrmTbl.mMinHeadY, + l_HIO.mPrmTbl.mMaxTurnStep); + if(mbInitGrandma0 && demoActorID == 0) { + return TRUE; + } + m7F6 = false; + mbInitGrandma0 = false; + partner_srch(); + checkOrder(); + if(!demo()) { + s32 cond = -1; + if(dComIfGp_event_runCheck() && checkCommandTalk() == false){ + cond = isEventEntry(); + } + if(cond >= 0){ + mbSetEyePos = 1; + event_proc(cond); + }else{ + (this->*mCurrProcFunc)(NULL); + } + if(!m7F6) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + if(!m7F5) { + m78A = current.angle; + shape_angle = m78A; + } + } + eventOrder(); + setMtx(false); + + if(!mbInDemo && !m7FE){ + f32 radius = 50; + f32 height = 110.0; + if(m7FD) { + radius = 30; + } + setCollision( + radius, + height + ); + } + + return TRUE; } /* 00003E1C-00003E78 .text _delete__11daNpc_Ba1_cFv */ BOOL daNpc_Ba1_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs,"Ba"); +#if VERSION > VERSION_DEMO + if(heap != NULL && mpMorf != NULL) +#else + if(mpMorf != NULL) +#endif + { + mpMorf->stopZelAnime(); + } +#if VERSION == VERSION_DEMO + l_HIO.removeHIO(); +#endif + return 1; + } /* 00003E78-00003E98 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + static_cast(i_this)->CreateHeap(); } /* 00003E98-00003FB8 .text _create__11daNpc_Ba1_cFv */ cPhs_State daNpc_Ba1_c::_create() { - /* Nonmatching */ + static int a_size_tbl[] = { + 0x272E0 + }; + + fopAcM_ct_Retail(this, daNpc_Ba1_c); + cPhs_State state = dComIfG_resLoad(&mPhs,"Ba"); + if(state != cPhs_COMPLEATE_e) { + return state; + } + u32 tmp = fopAcM_GetParam(this) & 0xFF; + if(!charDecide(tmp)) { + return cPhs_ERROR_e; + } + #if VERSION == VERSION_DEMO + l_HIO.entryHIO("おばあちゃん"); + fopAcM_ct(this, daNpc_Ba1_c); + #endif + if(!fopAcM_entrySolidHeap(this,CheckCreateHeap,a_size_tbl[mType])){ + return cPhs_ERROR_e; + } + fopAcM_SetMtx(this,mpMorf->getModel()->getBaseTRMtx()); + fopAcM_setCullSizeBox(this,-50.0,-20.0,-50.0,50.0,120.0,50.0); + if(!createInit()){ + return cPhs_ERROR_e; + } + + return state; } /* 000043E8-00004658 .text create_Anm__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::create_Anm() { - /* Nonmatching */ +J3DModelData* daNpc_Ba1_c::create_Anm() { + J3DModelData* a_mdl_dat = (J3DModelData*)dComIfG_getObjectIDRes("Ba",dRes_ID_BA_BDL_BA_e); + JUT_ASSERT(VERSION_SELECT(0xB0C, 0xB0B, 0xB0C, 0xB0C),a_mdl_dat != NULL); + mpMorf = new mDoExt_McaMorf( + a_mdl_dat, + NULL, + NULL, + (J3DAnmTransform*)dComIfG_getObjectIDRes( + "Ba", + dRes_ID_BA_BCK_WAIT01_e + ), + J3DFrameCtrl::EMode_LOOP, + 1.0f, + 0, + -1, + 1, + NULL, + 0x80000, + 0x11020022 + ); + if(mpMorf == NULL ){ + return NULL; + } + if(mpMorf->getModel() == NULL){ + mpMorf = NULL; + return NULL; + } + + m_hed_jnt_num = a_mdl_dat->getJointName()->getIndex("head"); + JUT_ASSERT(VERSION_SELECT(0xB20, 0xB1F, 0xB20, 0xB20),m_hed_jnt_num >= 0); + m_bbone_jnt_num = a_mdl_dat->getJointName()->getIndex("backbone"); + JUT_ASSERT(VERSION_SELECT(0xB23, 0xB22, 0xB23, 0xB23),m_bbone_jnt_num >= 0); + m_footL_jnt_num = a_mdl_dat->getJointName()->getIndex("footL"); + JUT_ASSERT(VERSION_SELECT(0xB26, 0xB25, 0xB26, 0xB26),m_footL_jnt_num >= 0); + + return a_mdl_dat; } /* 00004658-00004714 .text create_itm_Mdl__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::create_itm_Mdl() { - /* Nonmatching */ +bool daNpc_Ba1_c::create_itm_Mdl() { + mpClothModel = NULL; + J3DModelData* a_mdl_dat = (J3DModelData*)dComIfG_getObjectIDRes("Ba",dRes_ID_BA_BDL_BA_CLOTH_e); + JUT_ASSERT(VERSION_SELECT(0xB38, 0xB37, 0xB38, 0xB38),a_mdl_dat != NULL); + mpClothModel = mDoExt_J3DModel__create(a_mdl_dat,0x80000,0x11000002); + return true; } /* 00004714-0000485C .text CreateHeap__11daNpc_Ba1_cFv */ -void daNpc_Ba1_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_Ba1_c::CreateHeap() { + J3DModelData* modeldat; + J3DModelData* anm_model = create_Anm(); + if(!anm_model) { + return 0; + } + mBtpNum = 1; + if(!iniTexPttrnAnm(false)) { + mpMorf = NULL; + return 0; + } + if(create_itm_Mdl()) { + for(u16 i = 0; i < anm_model->getJointNum(); i++){ + if((i == m_hed_jnt_num) ||( i == m_bbone_jnt_num)){ + mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Ba1); + } + } + mpMorf->getModel()->setUserArea((u32)this); + mAcchCir.SetWall(30.0f,50.0f); + mObjAcch.Set( + fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, + 1, + &mAcchCir, + fopAcM_GetSpeed_p(this), + NULL, + NULL + ); + return 1; + } + mpMorf = NULL; + return 0; } /* 0000485C-0000487C .text daNpc_Ba1_Create__FP10fopAc_ac_c */ diff --git a/src/d/d_kankyo_dayproc.inc b/src/d/d_kankyo_dayproc.inc index 8c7e5a20d..a7822ed81 100644 --- a/src/d/d_kankyo_dayproc.inc +++ b/src/d/d_kankyo_dayproc.inc @@ -73,7 +73,7 @@ static void dKankyo_DayProc() { dComIfGs_offEventBit(dSv_event_flag_c::UNK_2680); #if VERSION > VERSION_JPN - if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_2A20)) + if (dComIfGs_isEventBit(dSv_event_flag_c::GRANDMA_HEALED)) #endif { clamped = cLib_maxLimit(dComIfGs_getEventReg(dSv_event_flag_c::UNK_A60F) + 1, 3);