From a7a5b5d6364e06e439d53a095ef6fd1ef25d7a68 Mon Sep 17 00:00:00 2001 From: Zeclos Date: Sun, 5 Jul 2026 19:11:40 +0200 Subject: [PATCH] D_a_npc_tt (#1099) * matching * cleanup * d_a_npc_tt matching outside of _create and rodata * matching * cleanup --- configure.py | 2 +- include/d/actor/d_a_npc_tt.h | 179 +++++-- include/d/d_snap.h | 2 +- src/d/actor/d_a_npc_tt.cpp | 856 ++++++++++++++++++++++++++++++--- src/d/actor/d_a_npc_tt_anm.inc | 204 +++++++- 5 files changed, 1118 insertions(+), 125 deletions(-) diff --git a/configure.py b/configure.py index a446479af..06a4090f3 100755 --- a/configure.py +++ b/configure.py @@ -1699,7 +1699,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_npc_sarace"), ActorRel(NonMatching, "d_a_npc_sv"), ActorRel(Matching, "d_a_npc_tc"), - ActorRel(NonMatching, "d_a_npc_tt"), + ActorRel(Matching, "d_a_npc_tt"), ActorRel(NonMatching, "d_a_npc_uk"), ActorRel(NonMatching, "d_a_npc_ym1"), ActorRel(NonMatching, "d_a_npc_yw1"), diff --git a/include/d/actor/d_a_npc_tt.h b/include/d/actor/d_a_npc_tt.h index 0177cf9d5..07b3c7908 100644 --- a/include/d/actor/d_a_npc_tt.h +++ b/include/d/actor/d_a_npc_tt.h @@ -2,82 +2,177 @@ #define D_A_NPC_TT_H #include "f_op/f_op_actor.h" +#include "d/d_npc.h" struct tt_ke_s { - void ke_control(float); + /* 0x00 */ cXyz field_0x00[10]; + /* 0x78 */ cXyz field_0x78[10]; + void ke_control(f32); void ke_pos_set(cXyz*); }; +struct lineKe { + tt_ke_s field_0x6C8[8]; + mDoExt_3DlineMat0_c mLineMat; +}; + class daNpc_Tt_c : public fopAc_ac_c { public: - void ChkOrder(unsigned char) {} - void ClrOrder() {} - void SetOrder(unsigned char) {} - void chkEvFlag(unsigned short) {} - void chkFlag(unsigned short) {} - void clrEvFlag(unsigned short) {} - void clrFlag(unsigned short) {} - void getBackboneJntNum() {} - void getBackbone_x() {} - void getBackbone_y() {} - void getHeadJntNum() {} - void getHead_x() {} - void getHead_y() {} - void incAttnSetCount() {} - void setAction(int (daNpc_Tt_c::*)(void*), void*) {} - void setAttentionBasePos(cXyz) {} - void setEvFlag(unsigned short) {} - void setEyePos(cXyz) {} - void setFlag(unsigned short) {} - void XyCheckCB(int); + enum ActionStatus { + ACTION_ENDING = -1, + ACTION_STARTING = 0, + ACTION_ONGOING = 1 + }; + + enum TalkStates { + TALK_FINISHED = -1, + TALK_INIT = 0, + TALK_MSG_CREATE = 1, + TALK_ACTIVE = 2 + }; + + typedef BOOL (daNpc_Tt_c::*ActionFunc)(void*); + + bool ChkOrder(u8 flag) { return mOrderFlags & flag; } + void ClrOrder() { mOrderFlags = 0; } + void SetOrder(u8 flag) { mOrderFlags |= flag; } + bool chkEvFlag(u16 evFlag) { return (mEvFlags & evFlag) == evFlag; } + bool chkFlag(u16 flag) { return (mFlags & flag) == flag; } + void clrEvFlag(u16 evFlag) { mEvFlags &= ~evFlag; } + void clrFlag(u16 flag) { mFlags &= ~flag; } + + s8 getBackboneJntNum() { return m_jnt.getBackboneJntNum(); } + s16 getBackbone_y() { return m_jnt.getBackbone_y(); } + s8 getHeadJntNum() { return m_jnt.getHeadJntNum(); } + s16 getHead_x() { return m_jnt.getHead_x(); } + s16 getHead_y() { return m_jnt.getHead_y(); } + + void incAttnSetCount() { + if (mAttnSetCount != 0xff) { + mAttnSetCount++; + } + } + + BOOL setAction(ActionFunc actionFunc, void* arg) { + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + mActionStatus = ACTION_ENDING; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + mActionStatus = ACTION_STARTING; + (this->*mCurrActionFunc)(arg); + } + return TRUE; + } + + void setAttentionBasePos(cXyz i_attnBasePos) { mAttnBasePos = i_attnBasePos; } + void setEvFlag(u16 evFlag) { mEvFlags |= evFlag;} + void setEyePos(cXyz i_eyePos) { mEyePos = i_eyePos; } + void setFlag(u16 flag) { mFlags |= flag; } + + s16 XyCheckCB(int); void setAnmStatus(); void eventOrder(); void checkOrder(); - void next_msgStatus(unsigned long*); - void getMsg(); + u16 next_msgStatus(u32*); + u32 getMsg(); void setCollision(); void talkInit(); void msgAnm(); void msgPushButton(); void msgContinue(); - void talk(); + u16 talk(); void demoInitChange(); - void demoProcTact1(); + bool demoProcTact1(); void demoInitPatten(); - void demoProcPatten(); + bool demoProcPatten(); void demoInitSpeak(); - void demoProcSpeak(); + bool demoProcSpeak(); void demoInitWait(); - void demoProcWait(); + bool demoProcWait(); void demoInitCom(); void demoProcCom(); - void getNowEventAction(); - void demoProc(); - void init(); + s32 getNowEventAction(); + bool demoProc(); + BOOL init(); void setAttention(bool); void lookBack(); - void wait01(); - void talk01(); - void tact00(); - void wait_action(void*); + bool wait01(); + bool talk01(); + bool tact00(); + BOOL wait_action(void*); void set_ke_root(int, int, int); void ke_execute(); BOOL _draw(); BOOL _execute(); BOOL _delete(); cPhs_State _create(); - void CreateHeap(); + BOOL CreateHeap(); - void initTexPatternAnm(bool); + BOOL initTexPatternAnm(bool); void playTexPatternAnm(); void setAnm(int); void danceInit(int); - void danceProc(); - void danceNext(); - + BOOL danceProc(); + BOOL danceNext(); public: - /* Place member variables here */ -}; + /* 0x290 */ dNpc_HeadAnm_c mHeadAnm; + /* 0x2B4 */ s16 mEventIdx; + /* 0x2B6 */ u8 field_0x2B6[0x2B8 - 0x2B6]; + /* 0x2B8 */ request_of_phase_process_class mPhs; + /* 0x2C0 */ mDoExt_McaMorf* mpMorf; + /* 0x2C4 */ u32 mShadowId; + /* 0x2C8 */ J3DAnmTexPattern* m_head_tex_pattern; + /* 0x2CC */ mDoExt_btpAnm mBtpAnm; + /* 0x2E0 */ u8 mBlinkFrame; + /* 0x2E1 */ u8 field_0x2E1[0x2E2 - 0x2E1]; + /* 0x2E2 */ s16 mBlinkTimer; + /* 0x2E4 */ dBgS_ObjAcch mObjAcch; + /* 0x4A8 */ dBgS_AcchCir mAcchCir; + /* 0x4E8 */ dCcD_Stts mStts; + /* 0x524 */ dCcD_Cyl mCyl; + /* 0x654 */ s8 m_head_jnt_num; + /* 0x655 */ s8 m_backbone_jnt_num; + /* 0x656 */ u8 field_0x656[0x658 - 0x656]; + /* 0x658 */ dNpc_JntCtrl_c m_jnt; + /* 0x68C */ cXyz mEyePos; + /* 0x698 */ cXyz mAttnBasePos; + /* 0x6A4 */ s16 mMaxHeadTurnVelocity; + /* 0x6A6 */ u8 field_0x6A6[0x6A8 - 0x6A6]; + /* 0x6A8 */ s8 mAnmEnded; + /* 0x6A9 */ u8 mAttnSetCount; + /* 0x6AA */ u8 field_0x6AA[0x6AC - 0x6AA]; + /* 0x6AC */ f32 mAnmTimer; + /* 0x6B0 */ u32 mCurrMsgNo; + /* 0x6B4 */ u16 mFlags; + /* 0x6B6 */ s16 mNoticeLinkTimer; + /* 0x6B8 */ ActionFunc mCurrActionFunc; + /* 0x6C4 */ u8 mDanceStep; + /* 0x6C5 */ u8 mDanceStepTimer; + /* 0x6C6 */ u8 field_0x6C6[0x6C8 - 0x6C6]; + /* 0x6C8 */ lineKe mLineKe; + /* 0xE64 */ s8 mTexPatternIdx; + /* 0xE65 */ s8 mCurrAnmIdx; + /* 0xE66 */ s8 mAnmLoopCount; + /* 0xE67 */ u8 mOrderFlags; + /* 0xE68 */ s8 mState; + /* 0xE69 */ s8 mReturnToState; + /* 0xE6A */ u8 mType; + /* 0xE6B */ s8 mActionStatus; + /* 0xE6C */ s8 mTalkState; + /* 0xE6D */ u8 mMsgAnmIdx; + /* 0xE6E */ u8 field_0xE6E[0xE70 - 0xE6E]; + /* 0xE70 */ u32 mMtrlSndId; + /* 0xE74 */ s8 mReverb; + /* 0xE75 */ u8 mEvFlags; + /* 0xE76 */ s16 mSoundTimer; + /* 0xE78 */ s16 mTimer; + /* 0xE7A */ u8 field_0xE7A; + /* 0xE7B */ u8 field_0xE7B[0xE7C - 0xE7B]; + /* 0xE7C */ u32 mMsgNo; + /* 0xE80 */ int mStaffIdx; +}; // Size: 0xE84 #endif /* D_A_NPC_TT_H */ diff --git a/include/d/d_snap.h b/include/d/d_snap.h index e3a522b64..a5e0a54c1 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -92,7 +92,7 @@ enum { /* 0x54 */ DSNAP_TYPE_KB, /* 0x55 */ DSNAP_TYPE_KAMOME, /* 0x56 */ DSNAP_TYPE_KN, - /* 0x57 */ DSNAP_TYPE_UNK57, + /* 0x57 */ DSNAP_TYPE_TT, /* 0x58 */ DSNAP_TYPE_KM1, /* 0x59 */ DSNAP_TYPE_UNK59, /* 0x5A */ DSNAP_TYPE_UNK5A, diff --git a/src/d/actor/d_a_npc_tt.cpp b/src/d/actor/d_a_npc_tt.cpp index 39016019f..455b344f3 100644 --- a/src/d/actor/d_a_npc_tt.cpp +++ b/src/d/actor/d_a_npc_tt.cpp @@ -6,225 +6,944 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_tt.h" #include "m_Do/m_Do_ext.h" +#include "res/Object/Tt.h" +#include "d/d_snap.h" +#include "d/actor/d_a_player_main.h" + +static fpc_ProcID l_msgId; +static msg_class* l_msg; /* 00000078-00000098 .text daNpc_tt_XyCheckCB__FPvi */ -static s16 daNpc_tt_XyCheckCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_tt_XyCheckCB(void* i_this, int i_itemBtn) { + return ((daNpc_Tt_c*)i_this)->XyCheckCB(i_itemBtn); } /* 00000098-000000BC .text XyCheckCB__10daNpc_Tt_cFi */ -void daNpc_Tt_c::XyCheckCB(int) { - /* Nonmatching */ +s16 daNpc_Tt_c::XyCheckCB(int i_itemBtn) { + return dComIfGp_getSelectItem(i_itemBtn) == dItemNo_WIND_WAKER_e ? TRUE : FALSE; } /* 000000BC-00000108 .text daNpc_tt_XyEventCB__FPvi */ -static s16 daNpc_tt_XyEventCB(void*, int) { - /* Nonmatching */ +static s16 daNpc_tt_XyEventCB(void* i_this, int i_itemBtn) { + daNpc_Tt_c* a_this = (daNpc_Tt_c*)i_this; + a_this->mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT10"); + return a_this->mEventIdx; } /* 00000108-000002D8 .text nodeCallBack_Tt__FP7J3DNodei */ -static BOOL nodeCallBack_Tt(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack_Tt(J3DNode* node, int calcTiming) { + cXyz temp; + cXyz temp2; + if (calcTiming == J3DNodeCBCalcTiming_In) { + J3DModel* model = j3dSys.getModel(); + daNpc_Tt_c* i_this = (daNpc_Tt_c*)model->getUserArea(); + J3DJoint* joint = (J3DJoint*)node; + int jntNo = joint->getJntNo(); + + if(i_this != NULL) { + MTXCopy(model->getAnmMtx(jntNo), *calc_mtx); + if (jntNo == i_this->m_head_jnt_num) { + temp.setall(0.0f); + cMtx_YrotM(*calc_mtx, -i_this->getHead_y()); + cMtx_ZrotM(*calc_mtx, -i_this->getHead_x() - i_this->mHeadAnm.field_0x00); + MtxPosition(&temp, &temp2); + i_this->setAttentionBasePos(temp2); + temp.set(20.0f, -20.0f, 0.0f); + + MtxPosition(&temp, &temp2); + i_this->setEyePos(temp2); + i_this->incAttnSetCount(); + + } else if (jntNo == i_this->m_backbone_jnt_num) { + mDoMtx_XrotM(*calc_mtx, i_this->getBackbone_y()); + mDoMtx_ZrotM(*calc_mtx, i_this->m_jnt.getBackbone_x()); + } + cMtx_copy(*calc_mtx, J3DSys::mCurrentMtx); + model->setAnmMtx(jntNo, *calc_mtx); + } + } + return TRUE; } /* 000002D8-00000368 .text setAnmStatus__10daNpc_Tt_cFv */ void daNpc_Tt_c::setAnmStatus() { - /* Nonmatching */ + switch(mState) { + case 1: + case 2: + if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40)) { + danceInit(0); + } else { + setAnm(4); + } + break; + case 3: + break; + default: + setAnm(0); + break; + } } +//probably unused JUT_ASSERT +static void dummy() { + OSReport("Tt"); + OSReport("d_a_npc_tt.cpp"); + OSReport("0"); + OSReport("Halt"); +} + +#include "d/actor/d_a_npc_tt_anm.inc" + /* 00000368-000003DC .text eventOrder__10daNpc_Tt_cFv */ void daNpc_Tt_c::eventOrder() { - /* Nonmatching */ + if (ChkOrder(1)) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + fopAcM_orderSpeakEvent(this); + } + if (ChkOrder(2)) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + } + if (ChkOrder(4)) { + eventInfo.onCondition(dEvtCnd_CANTALKITEM_e); + } } /* 000003DC-00000484 .text checkOrder__10daNpc_Tt_cFv */ void daNpc_Tt_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.mCommand != dEvtCmd_INDEMO_e) { + if (eventInfo.mCommand == dEvtCmd_INTALK_e && ChkOrder(7)) { + if (dComIfGp_event_chkTalkXY()) { + setFlag(0x4); + } else { + setFlag(0x2); + } + talkInit(); + } + } + ClrOrder(); } /* 00000484-000004F4 .text next_msgStatus__10daNpc_Tt_cFPUl */ -void daNpc_Tt_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Tt_c::next_msgStatus(u32* pMsgNo) { + u16 msgStatus = fopMsgStts_MSG_CONTINUES_e; + + switch (*pMsgNo) { + case 0x22C5: + case 0x22C7: + case 0x22C8: + case 0x22D5: + case 0x22D6: + (*pMsgNo)++; + break; + + case 0x22C6: + *pMsgNo = 0x22D5; + break; + case 0x22D7: + *pMsgNo = 0x22C7; + break; + + default: + msgStatus = fopMsgStts_MSG_ENDS_e; + break; + } + return msgStatus; } + /* 000004F4-000005D0 .text getMsg__10daNpc_Tt_cFv */ -void daNpc_Tt_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Tt_c::getMsg() { + u32 msgNo; + clrFlag(0x20); + switch(mState) { + case 2: + if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40)) { + msgNo = 0x22CB; + } else { + if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B08)) { + msgNo = 0x22CA; + setFlag(0x20); + } else { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0B08); + msgNo = 0x22C5; + setFlag(0x20); + } + } + break; + default: + msgNo = mMsgNo; + switch(msgNo) { + case 0x5B3: + dComIfGp_setMelodyNum(5); + break; + } + } + return msgNo; } /* 000005D0-00000650 .text setCollision__10daNpc_Tt_cFv */ void daNpc_Tt_c::setCollision() { - /* Nonmatching */ + + cXyz centerPos(current.pos); + f32 cylCollisionRadius = 48.0f; + f32 height = 140.0f; + mCyl.SetC(centerPos); + mCyl.SetR(cylCollisionRadius); + mCyl.SetH(height); + dComIfG_Ccsp()->Set(&mCyl); } /* 00000650-00000664 .text talkInit__10daNpc_Tt_cFv */ void daNpc_Tt_c::talkInit() { - /* Nonmatching */ + mTalkState = TALK_INIT;; + mMsgAnmIdx = 0xFF; } /* 00000664-00000718 .text msgAnm__10daNpc_Tt_cFv */ void daNpc_Tt_c::msgAnm() { - /* Nonmatching */ + if(mMsgAnmIdx != dComIfGp_getMesgAnimeAttrInfo()) { + mMsgAnmIdx = dComIfGp_getMesgAnimeAttrInfo(); + switch(mMsgAnmIdx) { + case 0: + setAnm(0); + break; + case 1: + setAnm(1); + break; + case 2: + setAnm(3); + break; + case 3: + setAnm(4); + break; + case 4: + danceInit(0); + break; + case 5: + setAnm(2); + break; + } + } } /* 00000718-00000730 .text msgPushButton__10daNpc_Tt_cFv */ void daNpc_Tt_c::msgPushButton() { - /* Nonmatching */ + if ((s32)mCurrMsgNo != 0x22C6) { + return; + } + mNoticeLinkTimer = 0xF; } /* 00000730-00000778 .text msgContinue__10daNpc_Tt_cFv */ void daNpc_Tt_c::msgContinue() { - /* Nonmatching */ + switch(mCurrMsgNo) { + case 0x22D5: + if (mNoticeLinkTimer > 0) { + mNoticeLinkTimer--; + } else { + fopMsgM_messageSendOn(); + } + break; + } } /* 00000778-00000900 .text talk__10daNpc_Tt_cFv */ -void daNpc_Tt_c::talk() { - /* Nonmatching */ +u16 daNpc_Tt_c::talk() { + u16 msgStatus = 0xFF; + if (mTalkState == TALK_INIT) { + l_msgId = fpcM_ERROR_PROCESS_ID_e; + mCurrMsgNo = getMsg(); + mTalkState = TALK_MSG_CREATE; + } else if (mTalkState != TALK_FINISHED) { + if(l_msgId == fpcM_ERROR_PROCESS_ID_e) { + l_msgId = fopMsgM_messageSet(mCurrMsgNo, this); + } else { + msgAnm(); + switch(mTalkState) { + case TALK_MSG_CREATE: + l_msg = fopMsgM_SearchByID(l_msgId); + if (l_msg != NULL) { + mTalkState = TALK_ACTIVE; + } + break; + + case TALK_ACTIVE: + if(l_msg != NULL) { + msgStatus = l_msg->mStatus; + if(msgStatus == fopMsgStts_MSG_CONTINUES_e) { + msgContinue(); + } else if(msgStatus == fopMsgStts_MSG_DISPLAYED_e) { + msgPushButton(); + l_msg->mStatus = next_msgStatus(&mCurrMsgNo); + if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) { + fopMsgM_messageSet(mCurrMsgNo); + } + } else if(msgStatus == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + l_msgId = fpcM_ERROR_PROCESS_ID_e; + l_msg = NULL; + } + } + break; + } + } + } + return msgStatus; } /* 00000900-000009EC .text demoInitChange__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoInitChange() { - /* Nonmatching */ + int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "prm0"); + JUT_ASSERT(DEMO_SELECT(758, 758), a_intP); + + if(a_intP != NULL) { + mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT11"); + setEvFlag(0x1); + fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF); + } } /* 000009EC-00000B1C .text demoProcTact1__10daNpc_Tt_cFv */ -void daNpc_Tt_c::demoProcTact1() { - /* Nonmatching */ +bool daNpc_Tt_c::demoProcTact1() { + switch(daPy_getPlayerLinkActorClass()->getTactTimerCancel()) { + case 1: + mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT12"); + setEvFlag(0x1); + fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF); + break; + case 2: + mEventIdx = dComIfGp_evmng_getEventIdx("TACT_TT13"); + setEvFlag(0x1); + fopAcM_orderChangeEventId(daPy_getPlayerLinkActorClass(), this, mEventIdx, 0, 0xFFFF); + break; + default: + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0C40); + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + } + + return TRUE; } /* 00000B1C-00000BA0 .text demoInitPatten__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoInitPatten() { - /* Nonmatching */ + setEvFlag(0x4); + mSoundTimer = 0; + danceInit(0); + int* cnt = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Cnt"); + if(cnt != NULL) { + field_0xE7A = *cnt; + } else { + field_0xE7A = 2; + } } /* 00000BA0-00000D40 .text demoProcPatten__10daNpc_Tt_cFv */ -void daNpc_Tt_c::demoProcPatten() { - /* Nonmatching */ +bool daNpc_Tt_c::demoProcPatten() { + if (field_0xE7A == 0) { + dComIfGp_evmng_cutEnd(mStaffIdx); + clrEvFlag(0x4); + } else { + if(danceProc()) { + field_0xE7A--; + } + if(mSoundTimer > 0) { + mSoundTimer--; + if(mSoundTimer == 0) { + switch(mCurrAnmIdx) { + case 8: + fopAcM_seStart(this, JA_SE_CV_TT_DANCE_FIN, 0); + break; + case 9: + fopAcM_seStart(this, JA_SE_CV_TT_DANCE_2, 0); + break; + case 10: + fopAcM_seStart(this, JA_SE_CV_TT_DANCE_1, 0); + break; + } + + } + } + } + return FALSE; } /* 00000D40-00000E04 .text demoInitSpeak__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoInitSpeak() { - /* Nonmatching */ + talkInit(); + int* a_intP = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "MsgNo"); + JUT_ASSERT(882, a_intP); + mMsgNo = *a_intP; + switch(mMsgNo) { + case 0x22CE: + if(dKy_daynight_check() == dKy_TIME_NIGHT_e) { + mMsgNo = 0x22CF; + } + break; + } } /* 00000E04-00000E5C .text demoProcSpeak__10daNpc_Tt_cFv */ -void daNpc_Tt_c::demoProcSpeak() { - /* Nonmatching */ +bool daNpc_Tt_c::demoProcSpeak() { + u16 temp = talk(); + if (temp == fopMsgStts_BOX_CLOSED_e || temp == 0xFE) { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + return false; } /* 00000E5C-00000EC4 .text demoInitWait__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoInitWait() { - /* Nonmatching */ + int* pTimer = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "Timer"); + if (pTimer != NULL) { + mTimer = *pTimer; + } else { + mTimer = 0; + } } /* 00000EC4-00000F14 .text demoProcWait__10daNpc_Tt_cFv */ -void daNpc_Tt_c::demoProcWait() { - /* Nonmatching */ +bool daNpc_Tt_c::demoProcWait() { + if (mTimer > 0) { + mTimer--; + } else { + dComIfGp_evmng_cutEnd(mStaffIdx); + } + return FALSE; } /* 00000F14-00001020 .text demoInitCom__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoInitCom() { - /* Nonmatching */ + daPy_lk_c* pLink = (daPy_lk_c*)daPy_getPlayerLinkActorClass(); + int* hidePl = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "HIDE_PL"); + if (hidePl != NULL) { + if (*hidePl != 0) { + pLink->onPlayerNoDraw(); + } else { + pLink->offPlayerNoDraw(); + } + } + + int* disp = dComIfGp_evmng_getMyIntegerP(mStaffIdx, "DISP"); + if (disp != NULL) { + if (*disp != 0) { + clrEvFlag(0x2); + } else { + setEvFlag(0x2); + } + } + + int* anm = dComIfGp_evmng_getMyIntegerP(mStaffIdx,"Anm"); + if (anm != NULL) { + setAnm(*anm & 0xff); + } } /* 00001020-00001040 .text demoProcCom__10daNpc_Tt_cFv */ void daNpc_Tt_c::demoProcCom() { - /* Nonmatching */ + if (chkEvFlag(0x2)) { + setFlag(0x8); + } } /* 00001040-00001088 .text getNowEventAction__10daNpc_Tt_cFv */ -void daNpc_Tt_c::getNowEventAction() { - /* Nonmatching */ +s32 daNpc_Tt_c::getNowEventAction() { + static char* action_table[] = { + "WAIT", + "SPEAK", + "PATTEN", + "CHANGE", + "TACT0", + "TACT1", + }; + + return dComIfGp_evmng_getMyActIdx(mStaffIdx, action_table, ARRAY_SIZE(action_table), FALSE, 1); } /* 00001088-00001238 .text demoProc__10daNpc_Tt_cFv */ -void daNpc_Tt_c::demoProc() { - /* Nonmatching */ +bool daNpc_Tt_c::demoProc() { + bool temp = false; + + if(chkEvFlag(0x1)) { + mStaffIdx = dComIfGp_evmng_getMyStaffId("Tt"); + clrEvFlag(0x1); + } + s32 eventAction = getNowEventAction(); + if(dComIfGp_evmng_getIsAddvance(mStaffIdx)) { + demoInitCom(); + setFlag(0x80); + switch(eventAction) { + case 1: + demoInitSpeak(); + break; + case 0: + demoInitWait(); + break; + case 2: + demoInitPatten(); + temp = true; + break; + case 3: + demoInitChange(); + break; + } + } + + switch(eventAction) { + case 1: + temp = demoProcSpeak(); + break; + case 0: + demoProcWait(); + break; + case 2: + demoProcPatten(); + break; + case 3: + break; + case 4: + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + case 5: + demoProcTact1(); + break; + default: + dComIfGp_evmng_cutEnd(mStaffIdx); + break; + } + + demoProcCom(); + if(eventAction != 2) { + danceProc(); + } + return temp; } /* 00001238-00001420 .text init__10daNpc_Tt_cFv */ -void daNpc_Tt_c::init() { - /* Nonmatching */ +BOOL daNpc_Tt_c::init() { + attention_info.flags = fopAc_Attn_ACTION_SPEAK_e|fopAc_Attn_LOCKON_TALK_e; + attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAB; + attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAB; + gravity = -30.0f; + fopAcM_SetStatusMap(this, 0x27); + fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); + + switch(mType) { + case 0: + if(setAction(&daNpc_Tt_c::wait_action, NULL)) { + // nothing? + } + break; + } + + mAttnBasePos.set(current.pos); + mEyePos.set(current.pos); + + J3DModel* model = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + ke_execute(); + mStts.Init(0xFF, 0xFF, this); + mCyl.Set(dNpc_cyl_src); + mCyl.SetStts(&mStts); + eventInfo.setXyCheckCB(daNpc_tt_XyCheckCB); + eventInfo.setXyEventCB(daNpc_tt_XyEventCB); + mMtrlSndId = 0; + mReverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this)); + return TRUE; } /* 00001420-00001474 .text setAttention__10daNpc_Tt_cFb */ -void daNpc_Tt_c::setAttention(bool) { - /* Nonmatching */ +void daNpc_Tt_c::setAttention(bool param_1) { + if (!param_1 && mAttnSetCount >= 2) { + return; + } + + eyePos.set(mEyePos.x, mEyePos.y, mEyePos.z); + attention_info.position.set(mAttnBasePos.x, mAttnBasePos.y + 65.0f, mAttnBasePos.z); } /* 00001474-000015D8 .text lookBack__10daNpc_Tt_cFv */ void daNpc_Tt_c::lookBack() { - /* Nonmatching */ + cXyz temp2; + cXyz temp(0.0f, 0.0f, 0.0f); + cXyz* dstPos = NULL; + s16 desiredYRot = current.angle.y; + bool headOnlyFollow = false; + + switch(mState) { + case 1: + desiredYRot = home.angle.y; + if(desiredYRot != current.angle.y) { + m_jnt.setTrn(); + } else { + m_jnt.clrTrn(); + } + break; + + default: + if (chkFlag(0x20)) { + desiredYRot = home.angle.y; + m_jnt.clrTrn(); + } else { + m_jnt.setTrn(); + temp2 = dNpc_playerEyePos(-20.0f); + dstPos = &temp2; + temp.set(current.pos); + temp.y = eyePos.y; + } + break; + } + + if (m_jnt.trnChk()) { + cLib_addCalcAngleS2(&mMaxHeadTurnVelocity, 0x800, 4, 0x800); + } else { + mMaxHeadTurnVelocity = 0; + } + + m_jnt.lookAtTarget(¤t.angle.y, dstPos, temp, desiredYRot, mMaxHeadTurnVelocity, headOnlyFollow); + shape_angle.y = current.angle.y; } /* 000015D8-00001734 .text wait01__10daNpc_Tt_cFv */ -void daNpc_Tt_c::wait01() { - /* Nonmatching */ +bool daNpc_Tt_c::wait01() { + if(chkFlag(0x4)) { + mReturnToState = mState; + mState = 3; + setAnmStatus(); + mTimer = 0x14; + setEvFlag(0x1); + fopAcM_seStart(this, JA_SE_PRE_TAKT, 0); + return demoProc(); + + } else if(chkFlag(0x2)) { + mReturnToState = mState; + mState = 2; + setAnmStatus(); + } else { + SetOrder(0x2); + if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0C40) && dComIfGs_isEventBit(dSv_event_flag_c::UNK_0B08)) { + SetOrder(0x4); + } + } + danceProc(); + return mpMorf->isMorf(); } /* 00001734-00001804 .text talk01__10daNpc_Tt_cFv */ -void daNpc_Tt_c::talk01() { - /* Nonmatching */ +bool daNpc_Tt_c::talk01() { + u16 temp = talk(); + if(mCurrMsgNo == 0x22C6 && dComIfGp_checkMesgSendButton()) { + clrFlag(0x20); + } + + if(temp == fopMsgStts_BOX_CLOSED_e) { + mState = mReturnToState; + setAnmStatus(); + dComIfGp_event_reset(); + clrFlag(0x2); + clrFlag(0x4); + } + danceProc(); + return mpMorf->isMorf(); } /* 00001804-00001894 .text tact00__10daNpc_Tt_cFv */ -void daNpc_Tt_c::tact00() { - /* Nonmatching */ +bool daNpc_Tt_c::tact00() { + if(dComIfGp_evmng_endCheck(mEventIdx)) { + mState = mReturnToState; + setAnmStatus(); + dComIfGp_event_reset(); + clrFlag(0x2); + clrFlag(0x4); + return true; + } + return demoProc(); } /* 00001894-00001970 .text wait_action__10daNpc_Tt_cFPv */ -void daNpc_Tt_c::wait_action(void*) { - /* Nonmatching */ +BOOL daNpc_Tt_c::wait_action(void*) { + if(mActionStatus == ACTION_STARTING) { + mState = 1; + setAnmStatus(); + mActionStatus++; // set to ACTION_ONGOING + } else if(mActionStatus != ACTION_ENDING) { + bool temp; + clrFlag(0x8); + switch(mState) { + case 1: + temp = wait01(); + break; + case 2: + temp = talk01(); + break; + case 3: + temp = tact00(); + break; + default: + temp = false; + break; + } + lookBack(); + setAttention(temp); + } + return TRUE; } /* 00001970-00001BAC .text ke_control__7tt_ke_sFf */ -void tt_ke_s::ke_control(float) { - /* Nonmatching */ +void tt_ke_s::ke_control(f32 param_1) { + int i; + cXyz* temp2 = &field_0x00[1]; + cXyz* temp3 = &field_0x78[1]; + cXyz temp; + cXyz temp6; + cXyz temp4; + temp.set(0.0f, 0.0f, 7.875f); + + f32 _065 = 0.65f; + + for(i = 1; i < 10; i++, temp2++, temp3++) { + temp4.x = temp3->x + (temp2->x - (temp2 - 1)->x); + temp4.z = temp3->z + (temp2->z - (temp2 - 1)->z); + + f32 temp7 = temp2->y + temp3->y +-3.0f; + + if(temp7 < param_1) { + temp7 = param_1; + } + + temp4.y = temp7 - (temp2-1)->y; + mDoMtx_XrotS(*calc_mtx, -cM_atan2s(temp4.y, temp4.z)); + mDoMtx_YrotM(*calc_mtx, (s16)cM_atan2s(temp4.x, std::sqrtf(temp4.y * temp4.y + temp4.z * temp4.z))); + MtxPosition(&temp, &temp6); + *temp3 = *temp2; + *temp2 = *(temp2-1) + temp6; + temp3->x = (temp2->x - temp3->x) * _065; + temp3->y = (temp2->y - temp3->y) * _065; + temp3->z = (temp2->z - temp3->z) * _065; + } } /* 00001BAC-00001BE4 .text ke_pos_set__7tt_ke_sFP4cXyz */ -void tt_ke_s::ke_pos_set(cXyz*) { - /* Nonmatching */ +void tt_ke_s::ke_pos_set(cXyz* i_param) { + for(int i = 0; i < 10; i_param++) { + *i_param = field_0x00[i]; + i++; + } } /* 00001BE4-00001D48 .text set_ke_root__10daNpc_Tt_cFiii */ -void daNpc_Tt_c::set_ke_root(int, int, int) { - /* Nonmatching */ +void daNpc_Tt_c::set_ke_root(int param_1, int param_2, int param_3) { + cXyz temp(0.0f, 0.0f, 0.0f); + MTXCopy(mpMorf->getModel()->getAnmMtx(param_1), *calc_mtx); + MtxPosition(&temp, &mLineKe.field_0x6C8[param_3].field_0x00[0]); + + MTXCopy(mpMorf->getModel()->getAnmMtx(param_2), *calc_mtx); + MtxPosition(&temp, &mLineKe.field_0x6C8[param_3 + 3].field_0x00[0]); + + mLineKe.field_0x6C8[param_3+1].field_0x00[0] = (mLineKe.field_0x6C8[param_3 + 3].field_0x00[0] - mLineKe.field_0x6C8[param_3].field_0x00[0]) * 0.3333f + mLineKe.field_0x6C8[param_3].field_0x00[0]; + + mLineKe.field_0x6C8[param_3+2].field_0x00[0] = (mLineKe.field_0x6C8[param_3 + 3].field_0x00[0] - mLineKe.field_0x6C8[param_3].field_0x00[0]) * 0.6667f + mLineKe.field_0x6C8[param_3].field_0x00[0]; } /* 00001D48-00001E04 .text ke_execute__10daNpc_Tt_cFv */ void daNpc_Tt_c::ke_execute() { - /* Nonmatching */ + mpMorf->calc(); + + set_ke_root(6, 7, 0); + set_ke_root(10, 11, 4); + int i; + tt_ke_s* ke = mLineKe.field_0x6C8; + f32 y = current.pos.y + 3.0f; + + for (i = 0; i < 8; i++, ke++) { + ke->ke_control(y); + ke->ke_pos_set(mLineKe.mLineMat.getPos(i)); + } } /* 00001E04-00001F84 .text _draw__10daNpc_Tt_cFv */ BOOL daNpc_Tt_c::_draw() { - /* Nonmatching */ + J3DModel* pModel = mpMorf->getModel(); + J3DModelData* pModelData = pModel->getModelData(); + if (chkFlag(0x8)) { + return TRUE; + } + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + mBtpAnm.entry(pModelData, mBlinkFrame); + mpMorf->entryDL(); + mBtpAnm.remove(pModelData); + f32 _100 = 100.0f; + f32 _450 = 450.0f; + cXyz shadowPos(current.pos.x, current.pos.y + _100, current.pos.z); + + mShadowId = dComIfGd_setShadow( + mShadowId, 1, pModel, &shadowPos, _450, 20.0f, + current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &tevStr + ); + + mLineKe.mLineMat.update(10, 0.8f, (GXColor){0xC9, 0xCA, 0xE4, 0xFF}, 0, &tevStr); + dComIfGd_set3DlineMat(&mLineKe.mLineMat); + + dSnap_RegistFig(DSNAP_TYPE_TT, this, 1.0f, 1.0f, 1.0f); + return TRUE; } /* 00001F84-00002158 .text _execute__10daNpc_Tt_cFv */ BOOL daNpc_Tt_c::_execute() { - /* Nonmatching */ + m_jnt.setParam( + /* mMaxBackboneX */ 0, + /* mMaxBackboneY */ 0x1C70, + /* mMinBackboneX */ 0, + /* mMinBackboneY */ -0x1C70, + /* mMaxHeadX */ 0x1FFE, + /* mMaxHeadY */ 9000, + /* mMinHeadX */ -0x1FFE, + /* mMinHeadY */ -9000, + /* mMaxTurnStep */ 0x1000 + ); + + playTexPatternAnm(); + + mAnmEnded = mpMorf->play(&eyePos, mMtrlSndId, mReverb); + if(mpMorf->getFrame() < mAnmTimer) { + mAnmEnded = 1; + } + + mAnmTimer = mpMorf->getFrame(); + if (mAnmEnded != 0) { + switch(mCurrAnmIdx) { + case 3: + if (mAnmLoopCount > 0) { + setAnm(0); + } else { + mAnmLoopCount++; + } + break; + } + } + mHeadAnm.move(); + checkOrder(); + (this->*mCurrActionFunc)(NULL); + eventOrder(); + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mObjAcch.CrrPos(*dComIfG_Bgsp()); + mMtrlSndId = 0; + + if (!mObjAcch.ChkGroundHit()) { + mMtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd); + } + + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + + J3DModel* pModel = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); + setCollision(); + ke_execute(); + return TRUE; } /* 00002158-000021A8 .text _delete__10daNpc_Tt_cFv */ BOOL daNpc_Tt_c::_delete() { - /* Nonmatching */ + dComIfG_resDelete(&mPhs, "Tt"); + if (mpMorf != NULL) { + mpMorf->stopZelAnime(); + } + return TRUE; } /* 000021A8-000021C8 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daNpc_Tt_c*)i_this)->CreateHeap(); } /* 000021C8-0000241C .text _create__10daNpc_Tt_cFv */ cPhs_State daNpc_Tt_c::_create() { - /* Nonmatching */ + fopAcM_ct_Retail(this, daNpc_Tt_c); + cPhs_State state = dComIfG_resLoad(&mPhs, "Tt"); + if (state == cPhs_COMPLEATE_e) { + fopAcM_ct_Demo(this, daNpc_Tt_c); + switch(fopAcM_GetName(this)) { + case fpcNm_NPC_TT_e: + mType = 0; + break; + default: + return cPhs_ERROR_e; + } + + if (!fopAcM_entrySolidHeap(this, &CheckCreateHeap, 0xE880)) { +#if VERSION > VERSION_DEMO + mpMorf = NULL; +#endif + return cPhs_ERROR_e; + } + + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + if(!init()) { +#if VERSION > VERSION_DEMO + mpMorf = NULL; +#endif + return cPhs_ERROR_e; + } + } + return state; } /* 000027D0-00002AB0 .text CreateHeap__10daNpc_Tt_cFv */ -void daNpc_Tt_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_Tt_c::CreateHeap() { + + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BDL_TT_e); + + mpMorf = new mDoExt_McaMorf( + modelData, + NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BCK_WAIT01_e), + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + dComIfG_getObjectRes("Tt", dRes_INDEX_TT_BAS_WAIT01_e), + 0x80000, + 0x11020022 + ); + + if (mpMorf == NULL || mpMorf->getModel() == NULL) { + return FALSE; + } + + m_head_jnt_num = modelData->getJointName()->getIndex("head"); + JUT_ASSERT(DEMO_SELECT(1706, 1708), m_head_jnt_num >= 0); + + m_backbone_jnt_num = modelData->getJointName()->getIndex("backbone1"); + JUT_ASSERT(DEMO_SELECT(1708, 1710), m_backbone_jnt_num >= 0); + + switch(mType) { + case 0: + mTexPatternIdx = false; + break; + } + +#if VERSION == VERSION_DEMO + initTexPatternAnm(false); +#else + if (!initTexPatternAnm(false)) { + return FALSE; + } +#endif + + for(u16 i = 0; i < modelData->getJointNum(); i++) { + if(i == m_head_jnt_num || i == m_backbone_jnt_num) { + mpMorf->getModel()->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack_Tt); + } + } + + mpMorf->getModel()->setUserArea((u32)(this)); + + mAcchCir.SetWall(30.0f, 0.0f); + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); + return mLineKe.mLineMat.init(8, 10, 0) == FALSE ? FALSE : TRUE; } /* 00002AB0-00002AD0 .text daNpc_Tt_Create__FP10fopAc_ac_c */ @@ -252,7 +971,6 @@ static BOOL daNpc_Tt_IsDelete(daNpc_Tt_c*) { return TRUE; } -#include "d/actor/d_a_npc_tt_anm.inc" static actor_method_class l_daNpc_Tt_Method = { (process_method_func)daNpc_Tt_Create, diff --git a/src/d/actor/d_a_npc_tt_anm.inc b/src/d/actor/d_a_npc_tt_anm.inc index 8f63442c6..52e2fd067 100644 --- a/src/d/actor/d_a_npc_tt_anm.inc +++ b/src/d/actor/d_a_npc_tt_anm.inc @@ -1,33 +1,213 @@ // The name of this .inc file is known because of an assert contained in it. - #include "d/actor/d_a_npc_tt.h" +static const s16 l_bck_ix_tbl[] = { + dRes_INDEX_TT_BCK_WAIT01_e, + dRes_INDEX_TT_BCK_TALK01_e, + dRes_INDEX_TT_BCK_TALK01_e, + dRes_INDEX_TT_BCK_TALK02_e, + dRes_INDEX_TT_BCK_STEP01_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_TURN_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_ND_e, + dRes_INDEX_TT_BCK_POSE_NL_e, + dRes_INDEX_TT_BCK_POSE_NR_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, + dRes_INDEX_TT_BCK_POSE_CC_e, +}; + +static const s16 l_bas_ix_tbl[] = { + dRes_INDEX_TT_BAS_WAIT01_e, + dRes_INDEX_TT_BAS_TALK01_e, + dRes_INDEX_TT_BAS_TALK01_e, + dRes_INDEX_TT_BAS_TALK01_e, + dRes_INDEX_TT_BAS_STEP01_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_TURN_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_ND_e, + dRes_INDEX_TT_BAS_POSE_NL_e, + dRes_INDEX_TT_BAS_POSE_NR_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, + dRes_INDEX_TT_BAS_POSE_CC_e, +}; + +static const int l_btp_ix_tbl[] = { + dRes_INDEX_TT_BTP_MABA01_e +}; + /* 00002CD4-00002DEC .text initTexPatternAnm__10daNpc_Tt_cFb */ -void daNpc_Tt_c::initTexPatternAnm(bool) { - /* Nonmatching */ +BOOL daNpc_Tt_c::initTexPatternAnm(bool i_modify) { + + J3DModelData* modelData = mpMorf->getModel()->getModelData(); + + m_head_tex_pattern = (J3DAnmTexPattern*)dComIfG_getObjectRes("Tt", l_btp_ix_tbl[mTexPatternIdx]); + JUT_ASSERT(130, m_head_tex_pattern != NULL); + + if (!mBtpAnm.init(modelData, m_head_tex_pattern, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, i_modify, FALSE)) { + return FALSE; + } + + mBlinkFrame = 0; + mBlinkTimer = 0; + return TRUE; } /* 00002DEC-00002E78 .text playTexPatternAnm__10daNpc_Tt_cFv */ void daNpc_Tt_c::playTexPatternAnm() { - /* Nonmatching */ + if (cLib_calcTimer(&mBlinkTimer) == 0) { + if (mBlinkFrame >= m_head_tex_pattern->getFrameMax()) { + mBlinkFrame -= m_head_tex_pattern->getFrameMax(); + mBlinkTimer = cM_rndF(100.0f) + 30.0f; + } else { + mBlinkFrame++; + } + } } /* 00002E78-00002F94 .text setAnm__10daNpc_Tt_cFi */ -void daNpc_Tt_c::setAnm(int) { - /* Nonmatching */ +void daNpc_Tt_c::setAnm(int newAnmIdx) { + if (mTexPatternIdx != 0) { + mTexPatternIdx = 0; + initTexPatternAnm(true); + } + s8 anmIdx = newAnmIdx; + f32 morf = 8.0f; + f32 speed = 1.0f; + s32 loopMode = J3DFrameCtrl::EMode_LOOP; + + if(newAnmIdx >= 7 && newAnmIdx <= 31) { + morf = 7.0f; + mSoundTimer = morf; + } + + if (newAnmIdx == 6) { + speed = 0.9f; + } + + if (newAnmIdx < 5) { + clrFlag(0x40); + } else { + loopMode = J3DFrameCtrl::EMode_NONE; + } + + if(newAnmIdx == 2) { + speed = 0.0f; + } + + if (anmIdx != mCurrAnmIdx && anmIdx != -1) { + mCurrAnmIdx = anmIdx; + mAnmLoopCount = 0; + mAnmTimer = 0.0f; + dNpc_setAnm(mpMorf, loopMode, morf, speed, l_bck_ix_tbl[mCurrAnmIdx], l_bas_ix_tbl[mCurrAnmIdx], "Tt"); + } } /* 00002F94-00002FFC .text danceInit__10daNpc_Tt_cFi */ -void daNpc_Tt_c::danceInit(int) { - /* Nonmatching */ +void daNpc_Tt_c::danceInit(int param_1) { + if (param_1 != 0 || !chkFlag(0x40)) { + mDanceStep = 0; + mDanceStepTimer = 8; + setAnm(5); + setFlag(0x40); + } } /* 00002FFC-000030B0 .text danceProc__10daNpc_Tt_cFv */ -void daNpc_Tt_c::danceProc() { - /* Nonmatching */ +BOOL daNpc_Tt_c::danceProc() { + if (!chkFlag(0x40)) { + return FALSE; + + } + if (mpMorf->isMorf()) { + return FALSE; + } + + if (mDanceStep == 5 && mDanceStepTimer == 0x19) { + mHeadAnm.swing_vertical_init(2, 0x1194, -1000, 1); + } + + if(mDanceStepTimer != 0) { + mDanceStepTimer--; + return FALSE; + } + return danceNext(); } /* 000030B0-00003210 .text danceNext__10daNpc_Tt_cFv */ -void daNpc_Tt_c::danceNext() { - /* Nonmatching */ +BOOL daNpc_Tt_c::danceNext() { + if (mDanceStep < 6) { + mDanceStep++; + } else { + mDanceStep = 0; + } + + switch(mDanceStep) { + case 0: + case 2: + setAnm(5); + mDanceStepTimer = 8; + break; + case 1: + setAnm(10); + mDanceStepTimer = 8; + break; + + case 3: + setAnm(9); + mDanceStepTimer = 8; + break; + case 4: + setAnm(6); + mDanceStepTimer = 58; + break; + case 5: + if(chkFlag(0x100)) { + clrFlag(0x100); + fopAcM_seStart(this, JA_SE_CV_TT_DANCE_FIN, 0); + } + setAnm(8); + mDanceStepTimer = 53; + break; + } + return mDanceStep == 0; }