From 11f4940d74993a87348291cebcd0cae678793dfe Mon Sep 17 00:00:00 2001 From: WilliamArnett <149556961+WilliamArnett@users.noreply.github.com> Date: Mon, 3 Aug 2026 00:40:12 -0500 Subject: [PATCH] d_a_npc_p1 100% Matching (#1098) * 99% match * Rewrote _execute to increase accuracy. Only issue in .text is a label not loading correctly. I have no idea how to fix this. * Equivalent. Weak func ordering. * 7% text * 28% text * 41% text * 65% text * Rewrote _execute to increase accuracy. Only issue in .text is a label not loading correctly. I have no idea how to fix this. * Equivalent. Weak func ordering. * 82% text * Equivalent. A lot of work is needed to name variables and clean up functions. Weak function ordering is wrong. * Cleaned some functions, named several variables, and began documenting dialog tree. * Naming a couple more variables * 21% text * change out getMySubstanceP for getMyIntegerP inline * 100% text * Refactor to use JUT_ASSERT macro * #181: d_a_tag_attention matching; TODO: implement chk_inside and dComIfGp_att_Look2RequestF * #181: continue working on d_a_tag_attention, matching almost complete * #181: revert naming class member (not certain enough) * #181: preliminary changes to resolve #784 comments regarding usage of debug maps * #181: commit suggestion by @WilliamArnett, fixing regalloc error Co-authored-by: WilliamArnett <149556961+WilliamArnett@users.noreply.github.com> * #181: fix missing curly bracket * #181: resolve #784 comments with the kind help of @WilliamArnett; move `daTagAttention::Act_c::chk_inside` to header file; split `plyrToObjVec` definition to match assembly; remove temp variable, use values directly and swap operands; implement `Look2RequestF` in `include/d/d_attention.h`; remove non-matching use of temp variable `iVar1` and replace `current.pos` with uninitialized variable in `daTagAttention::Act_c::_execute` * Update fork to match upstream * some changes * 73% text * 100% Matching minus kaji_anm * Delete debug/m2cdecomp * revert unnecessary file changes * remove d_a_npc_p2_cut.inc * Match kaji_anm * swap declaration order of l_msg and l_msgId * Naming many fields * Implement GetKajiID inline * Enum and variable names * Remove virtual genMessage function * Implement @LagoLunatic 's suggested changes * Revert array changes in d_camera.h (@LagoLunatic suggested change) * Whitespace * Rename dSnap enum --------- Co-authored-by: Skelp Co-authored-by: Skelp <59535863+Skelp@users.noreply.github.com> --- configure.py | 2 +- include/d/actor/d_a_kaji.h | 31 +- include/d/actor/d_a_npc_p1.h | 133 ++- include/d/actor/d_a_obj_pirateship.h | 2 +- include/d/d_camera.h | 1 + include/d/d_snap.h | 6 +- src/d/actor/d_a_npc_p1.cpp | 1340 ++++++++++++++++++++++++-- 7 files changed, 1415 insertions(+), 100 deletions(-) diff --git a/configure.py b/configure.py index 148b5bd12..dfa4fa4c3 100755 --- a/configure.py +++ b/configure.py @@ -1687,7 +1687,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_nz"), ActorRel(NonMatching, "d_a_npc_ob1"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_os"), - ActorRel(NonMatching, "d_a_npc_p1"), + ActorRel(Matching, "d_a_npc_p1"), ActorRel(NonMatching, "d_a_npc_p2"), ActorRel(EquivalentFor("GZLJ01", "GZLE01", "GZLP01") or MatchingFor("D44J01"), "d_a_npc_people"), # regalloc ActorRel(NonMatching, "d_a_npc_pf1"), diff --git a/include/d/actor/d_a_kaji.h b/include/d/actor/d_a_kaji.h index 618aca3ed..6fe8850f2 100644 --- a/include/d/actor/d_a_kaji.h +++ b/include/d/actor/d_a_kaji.h @@ -1,10 +1,12 @@ #ifndef D_A_KAJI_H #define D_A_KAJI_H +#include "d/d_com_inf_game.h" #include "f_op/f_op_actor.h" #include "SSystem/SComponent/c_phase.h" #include "m_Do/m_Do_ext.h" #include "m_Do/m_Do_mtx.h" +#include "res/Object/Kaji.h" class mDoExt_McaMorf; @@ -19,7 +21,34 @@ public: mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); MTXCopy(mDoMtx_stack_c::get(), mMtx); } - void setAnm(int, f32) {} + void setAnm(int i_m668, f32 frame) { + J3DAnmTransform* pAnimRes; + void* pSoundAnimRes; + switch(i_m668){ + case 0: + pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BCK_KJ_WAIT_e); + pSoundAnimRes = dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BAS_KJ_WAIT_e); + break; + case 1: + pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BCK_KJ_OMO_e); + pSoundAnimRes = dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BAS_KJ_OMO_e); + break; + case 2: + pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BCK_KJ_TORI_e); + pSoundAnimRes = dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BAS_KJ_TORI_e); + break; + case 3: + pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BCK_KJ_ANG_e); + pSoundAnimRes = dComIfG_getObjectRes("Kaji",dRes_INDEX_KAJI_BAS_KJ_ANG_e); + break; + default: + return; + } + mpMorf->setAnm(pAnimRes,J3DFrameCtrl::EMode_LOOP,0.0,1.0,0.0,-1.0,pSoundAnimRes); + if(frame >= 0.0f){ + mpMorf->setFrame(frame); + } + } inline cPhs_State _create(); inline bool _delete(); diff --git a/include/d/actor/d_a_npc_p1.h b/include/d/actor/d_a_npc_p1.h index 7f338c804..4620b7089 100644 --- a/include/d/actor/d_a_npc_p1.h +++ b/include/d/actor/d_a_npc_p1.h @@ -1,59 +1,114 @@ #ifndef D_A_NPC_P1_H #define D_A_NPC_P1_H +#include "SSystem/SComponent/c_bg_s_poly_info.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_npc.h" #include "f_op/f_op_actor.h" +#include "m_Do/m_Do_hostIO.h" class daNpc_P1_c : public fopAc_ac_c { + + typedef BOOL (daNpc_P1_c::*ActionFunc)(void*); + + enum ActionStatus { + ACTION_STARTING_e = 0, + ACTION_ONGOING_e = 1, + ACTION_UNK_2_e = 2, + ACTION_ENDING_e = -1, + }; + + typedef u8 Type; + enum { + TYPE_P1A_e, + TYPE_P1B_e, + TYPE_P1C_e + }; + public: - void checkAction(int (daNpc_P1_c::*)(void*)) {} - void setAction(int (daNpc_P1_c::*)(void*), void*, int) {} + + bool checkAction(ActionFunc action) { return mActionFunc == action;} + void setAction(ActionFunc action, void* i_param_2, int i_param_3) { + if(mActionFunc != action){ + if(mActionFunc != NULL){ + mActionStatus = ACTION_ENDING_e; + (this->*mActionFunc)(i_param_2); + } + mPrevAction = mActionFunc; + mActionFunc = action; + mActionStatus = ACTION_STARTING_e; + (this->*mActionFunc)(NULL); + } + } void setAnimFromMsg(); - void setAnm(int, float); - void normalAction(void*); - void confuseAction(void*); - void talkAction(void*); - void p1c_speakAction(void*); - void speakAction(void*); - void explainAction(void*); - void getNextMsgNo(int); - void playTexPatternAnm(); + BOOL setAnm(int, float); + BOOL normalAction(void*); + BOOL confuseAction(void*); + BOOL talkAction(void*); + BOOL p1c_speakAction(void*); + BOOL speakAction(void*); + BOOL explainAction(void*); + u32 getNextMsgNo(int); + BOOL playTexPatternAnm(); void demo_end_init(); - void demo_move(); - void event_move(); - void evn_setAnm_init(int); - void evn_talk_init(int); - void evn_talk(); - void minigameExplainCut(); - void privateCut(); - void setAttentionPos(cXyz*); + BOOL demo_move(); + BOOL event_move(); + BOOL evn_setAnm_init(int); + BOOL evn_talk_init(int); + BOOL evn_talk(); + BOOL minigameExplainCut(); + BOOL privateCut(); + BOOL setAttentionPos(cXyz*); cPhs_State _create(); - void CreateHeap(); + BOOL CreateHeap(); BOOL _delete(); - void getKajiID(); - void kaji_anm(); + fpc_ProcID getKajiID(); + BOOL kaji_anm(); BOOL _execute(); BOOL _draw(); - void lookBack(); + BOOL lookBack(); public: - /* Place member variables here */ -}; + /* 0x290 */ ActionFunc mActionFunc; + /* 0x29C */ ActionFunc mPrevAction; + /* 0x2A8 */ request_of_phase_process_class mPhs; + /* 0x2B0 */ mDoExt_McaMorf* mpMorf; + /* 0x2B4 */ u8 pad2B4[0x2C0-0x2B4]; + /* 0x2C0 */ J3DModel* mpHeadModel; + /* 0x2C4 */ J3DModel* mpDoraModel; + /* 0x2C8 */ J3DAnmTexPattern* mpTexture; + /* 0x2CC */ mDoExt_btpAnm mBtp; + /* 0x2E0 */ u8 mBlinkFrame; + /* 0x2E2 */ s16 mBlinkTimer; + /* 0x2E4 */ u32 mShadowId; + /* 0x2E8 */ dBgS_ObjAcch mObjAcch; + /* 0x4A8 */ dBgS_AcchCir mAcchCir; + /* 0x4EC */ dCcD_Stts mStts; + /* 0x528 */ dCcD_Cyl mCyl; + /* 0x658 */ u8 pad658; + /* 0x659 */ s8 mActionStatus; + /* 0x65A */ s8 m65A; + /* 0x65B */ Type mType; + /* 0x65C */ u8 mParam; + /* 0x65D */ char pad65D[3]; + /* 0x660 */ u32 mCurrMesg; + /* 0x664 */ u32 mPrevMesg; + /* 0x668 */ s32 mAnmNum; + /* 0x66C */ s32 m66C; + /* 0x670 */ u8 m670; + /* 0x671 */ u8 m671; + /* 0x674 */ u32 mKajiId; + /* 0x678 */ s16 mKajiTimer; + /* 0x67A */ s16 filler; + /* 0x67C */ dNpc_JntCtrl_c m_jnt; + /* 0x6B0 */ dNpc_EventCut_c mEventCut6B0; + /* 0x71C */ dNpc_HeadAnm_c mHeadAnm; + /* 0x740 */ s8 m_handR_jnt_num; + /* 0x741 */ bool mbAttentionFlag; + /* 0x742 */ s16 mMaxLookVel; -class daNpc_P1_HIO_c { -public: - daNpc_P1_HIO_c(); - -public: - /* Place member variables here */ -}; - -class daNpc_P1_childHIO_c { -public: - daNpc_P1_childHIO_c(); - -public: - /* Place member variables here */ }; #endif /* D_A_NPC_P1_H */ diff --git a/include/d/actor/d_a_obj_pirateship.h b/include/d/actor/d_a_obj_pirateship.h index 8b91fcedc..0261f5c1d 100644 --- a/include/d/actor/d_a_obj_pirateship.h +++ b/include/d/actor/d_a_obj_pirateship.h @@ -30,7 +30,7 @@ namespace daObjPirateship { inline bool _delete(); inline bool _draw(); inline bool _execute(); - void getKajiID() {} + fpc_ProcID getKajiID() {return m300;} void set_mtx(); void pirateCreate(int*); diff --git a/include/d/d_camera.h b/include/d/d_camera.h index 483d15acc..1b502e492 100644 --- a/include/d/d_camera.h +++ b/include/d/d_camera.h @@ -615,6 +615,7 @@ public: void CStickUseless() { setFlag(0x800000); } void StickUse() { clrFlag(0x1000000); } void StickUseless() { setFlag(0x1000000); } + void SkipSmoother(){m102 = 1; m101 = 1; m100 = 1;} bool Active() { return mActive; } bool Pause() { return mPause; } diff --git a/include/d/d_snap.h b/include/d/d_snap.h index 601d752c1..7c0b90106 100644 --- a/include/d/d_snap.h +++ b/include/d/d_snap.h @@ -120,9 +120,9 @@ enum { /* 0x70 */ DSNAP_TYPE_NPC_SA5, /* 0x71 */ DSNAP_TYPE_NPC_SA4, /* 0x72 */ DSNAP_TYPE_NPC_ZL1, - /* 0x73 */ DSNAP_TYPE_UNK73, - /* 0x74 */ DSNAP_TYPE_UNK74, - /* 0x75 */ DSNAP_TYPE_UNK75, + /* 0x73 */ DSNAP_TYPE_NPC_P1A, + /* 0x74 */ DSNAP_TYPE_NPC_P1B, + /* 0x75 */ DSNAP_TYPE_NPC_P1C, /* 0x76 */ DSNAP_TYPE_UNK76, /* 0x77 */ DSNAP_TYPE_UNK77, /* 0x78 */ DSNAP_TYPE_UNK78, diff --git a/src/d/actor/d_a_npc_p1.cpp b/src/d/actor/d_a_npc_p1.cpp index 980afaf7a..68b46b5ab 100644 --- a/src/d/actor/d_a_npc_p1.cpp +++ b/src/d/actor/d_a_npc_p1.cpp @@ -5,8 +5,55 @@ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_p1.h" -#include "m_Do/m_Do_ext.h" +#include "d/actor/d_a_kaji.h" +#include "d/actor/d_a_obj_pirateship.h" +#include "f_op/f_op_camera.h" +#if VERSION > VERSION_DEMO +#include "d/d_bg_s_func.h" +#endif #include "d/d_cc_d.h" +#include "d/d_s_play.h" +#include "d/d_snap.h" +#include "res/Object/P1.h" + + +class daNpc_P1_childHIO_c{ +public: + daNpc_P1_childHIO_c(); + virtual ~daNpc_P1_childHIO_c(){}; + +public: + + /* 0x04 */ s8 unk4; + /* 0x08 */ f32 mAttnYPosOffset; + /* 0x0C */ s16 mMaxHeadX; + /* 0x0E */ s16 mMinHeadX; + /* 0x10 */ s16 mMaxBackboneX; + /* 0x12 */ s16 mMinBackboneX; + /* 0x14 */ s16 mMaxHeadY; + /* 0x16 */ s16 mMinHeadY; + /* 0x18 */ s16 mMaxBackboneY; + /* 0x1A */ s16 mMinBackboneY; + /* 0x1C */ s16 mMaxTurnStep; + /* 0x1E */ s16 mLookBackTargetY; + /* 0x20 */ s8 mUnused20; + /* 0x24 */ f32 mMaxTalkDist; + /* 0x28 */ f32 mMorfBackup; + /* 0x2C */ f32 mUnused2C; +}; + + + +class daNpc_P1_HIO_c : public JORReflexible{ +public: + daNpc_P1_HIO_c(); + virtual ~daNpc_P1_HIO_c(){}; +public: + s8 mNo; + s32 m8; + daNpc_P1_childHIO_c children[3]; +}; + static dCcD_SrcCyl l_cyl_src = { // dCcD_SrcGObjInf @@ -38,110 +85,908 @@ static dCcD_SrcCyl l_cyl_src = { }}, }; +static daNpc_P1_HIO_c l_HIO; +static fpc_ProcID l_msgId; +static msg_class* l_msg; + /* 000000EC-00000264 .text __ct__14daNpc_P1_HIO_cFv */ daNpc_P1_HIO_c::daNpc_P1_HIO_c() { - /* Nonmatching */ + + children[0].mAttnYPosOffset = 50.0f; + children[0].mMaxHeadX = 0x9C4; + children[0].mMinHeadX = 0xF63C; + children[0].mMaxBackboneX = 2000; + children[0].mMinBackboneX = 0xF830; + children[0].mMaxHeadY = 5000; + children[0].mMinHeadY = 0xEC78; + children[0].mMaxBackboneY = 8000; + children[0].mMinBackboneY = 0xE0C0; + children[0].mMaxTurnStep = 1000; + children[0].mLookBackTargetY = 0x708; + children[0].mUnused20 = 0; + children[0].mMaxTalkDist = 300.0f; + children[0].mMorfBackup = 8.0f; + children[0].mUnused2C = 8.0f; + children[1].mAttnYPosOffset = 45.0f; + children[1].mMaxHeadX = 0x9C4; + children[1].mMinHeadX = 0xF63C; + children[1].mMaxBackboneX = 2000; + children[1].mMinBackboneX = 0xF830; + children[1].mMaxHeadY = 10000; + children[1].mMinHeadY = 0xD8F0; + children[1].mMaxBackboneY = 8000; + children[1].mMinBackboneY = 0xE0C0; + children[1].mMaxTurnStep = 1000; + children[1].mLookBackTargetY = 0x708; + children[1].mUnused20 = 0; + children[1].mMaxTalkDist = 250.0f; + children[1].mMorfBackup = 8.0f; + children[1].mUnused2C = 8.0f; + children[2].mAttnYPosOffset = 45.0f; + children[2].mMaxHeadX = 0x9C4; + children[2].mMinHeadX = 0xF63C; + children[2].mMaxBackboneX = 2000; + children[2].mMinBackboneX = 0xF830; + children[2].mMaxHeadY = 5000; + children[2].mMinHeadY = 0xEC78; + children[2].mMaxBackboneY = 8000; + children[2].mMinBackboneY = 0xE0C0; + children[2].mMaxTurnStep = 1000; + children[2].mLookBackTargetY = 0x708; + children[2].mUnused20 = 0; + children[2].mMaxTalkDist = 250.0f; + children[2].mMorfBackup = 7.0f; + children[2].mUnused2C = 16.0f; + mNo = -1; + m8 = -1; + } + /* 000002AC-000002BC .text __ct__19daNpc_P1_childHIO_cFv */ daNpc_P1_childHIO_c::daNpc_P1_childHIO_c() { - /* Nonmatching */ + } /* 000002BC-0000051C .text setAnimFromMsg__10daNpc_P1_cFv */ void daNpc_P1_c::setAnimFromMsg() { - /* Nonmatching */ + + if ((mAnmNum == 10 || mAnmNum == 11) && !mpMorf->checkFrame(mpMorf->getEndFrame() - 1.0f)){ + return; + } + + if (mAnmNum == 8 && mpMorf->checkFrame( + mpMorf->getEndFrame() - 1.0f + )) { + if (--m66C <= 0) { + setAnm(4, 15.0f); + } + } else if (mAnmNum == 12 && mpMorf->checkFrame( + mpMorf->getEndFrame() - 1.0f + )) { + if (--m66C <= 0) { + setAnm(9, 8.0f); + } + } + int iVar1; + switch(dComIfGp_getMesgAnimeAttrInfo()) { + case 0: + if (mType != TYPE_P1C_e) { + iVar1 = 0; + } + else { + iVar1 = 4; + } + break; + case 1: + iVar1 = 1; + break; + case 2: + iVar1 = 2; + break; + case 3: + iVar1 = 3; + break; + case 4: + if (mType != TYPE_P1C_e) { + iVar1 = 9; + } + else { + iVar1 = 4; + } + break; + case 5: + iVar1 = 10; + break; + case 6: + iVar1 = 0xb; + break; + case 7: + iVar1 = 0xc; + m66C = 4; + break; + case 8: + iVar1 = 0xd; + break; + case 9: + iVar1 = 0xe; + break; + case 10: + iVar1 = 0xf; + break; + case 0xb: + iVar1 = 0x10; + break; + case 0xc: + iVar1 = 4; + break; + case 0xd: + iVar1 = 5; + break; + case 0xe: + iVar1 = 6; + break; + case 0xf: + iVar1 = 7; + break; + case 0x10: + iVar1 = 8; + m66C= 6; + break; + default: + return; + } + dComIfGp_setMesgAnimeAttrInfo(0xFF); + setAnm(iVar1,-1.0); } /* 0000051C-00000AD0 .text setAnm__10daNpc_P1_cFif */ -void daNpc_P1_c::setAnm(int, float) { - /* Nonmatching */ +BOOL daNpc_P1_c::setAnm(int i_anm, f32 i_morf) { + + if (mAnmNum == i_anm) { + return false; + } + + mAnmNum = i_anm; + + if (i_morf < 0.0f) { + i_morf = l_HIO.children[mType].mMorfBackup; + } + + J3DAnmTransform* anm = NULL; + int attr = J3DFrameCtrl::EMode_LOOP; + + switch (i_anm) { + case 0: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_WAIT_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 1: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_TALK_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 2: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_TALK02_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 3: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_TALK03_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 9: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_WAIT02_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 10: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_OMOKJ_e); + attr = J3DFrameCtrl::EMode_NONE; + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 11: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_TORIKJ_e); + attr = J3DFrameCtrl::EMode_NONE; + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 12: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_ANGRY_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 13: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_TALK04_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 14: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_CHECK01_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 15: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_CHECK02_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 16: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_LOOK_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 4: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_C_WAIT_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 5: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_C_TALK01_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 6: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_C_TALK02_e); + attr = J3DFrameCtrl::EMode_NONE; + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 7: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_C_STOP_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + case 8: + anm = (J3DAnmTransform*)dComIfG_getObjectRes("P1", dRes_INDEX_P1_BCK_C_TALK01_e); + mpMorf->setAnm(anm, attr, i_morf, 1.0f, 0.0f, -1.0f, NULL); + break; + } + return TRUE; } /* 00000AD0-00000DEC .text normalAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::normalAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::normalAction(void*) { + + cXyz posdiff =(dComIfGp_getPlayer(0)->current.pos - current.pos); + f32 fVar4 = posdiff.absXZ(); + if(mActionStatus == ACTION_STARTING_e){ + if(mType == TYPE_P1A_e){ + if(m671 == 1){ + if(mpMorf->checkFrame(mpMorf->getEndFrame()-1.0f)){ + setAnm(9,-1.0); + }else{ + return FALSE; + } + }else{ + setAnm(0,-1.0); + } + }else if(mType == TYPE_P1B_e){ + if(mParam == 2){ + setAnm(0xE,-1.0); + }else if(mParam == 3){ + setAnm(0x10,-1.0); + }else{ + setAnm(0,-1.0); + } + }else{ + setAnm(4,-1.0); + } + mActionStatus += 1; + } + else if(mActionStatus != ACTION_ENDING_e){ + if(eventInfo.checkCommandTalk()){ + setAction(&daNpc_P1_c::talkAction,NULL,0); + } + if(fVar4 < l_HIO.children[mType].mMaxTalkDist){ + eventInfo.onCondition(dEvtMode_TALK_e); + } + if(mType == TYPE_P1C_e){ + cLib_addCalcAngleS2(¤t.angle.y,home.angle.y,8,0x400); + } + } + return TRUE; } /* 00000DEC-00000F40 .text confuseAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::confuseAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::confuseAction(void*) { + + if(mActionStatus == ACTION_STARTING_e){ + if(mType == TYPE_P1A_e){ + setAnm(1,-1.0); + mpMorf->setPlaySpeed(2.0f); + }else{ + setAnm(2,-1.0); + mpMorf->setPlaySpeed(2.0f); + } + mActionStatus += 1; + } else if(mpMorf->checkFrame(mpMorf->getEndFrame()-2.0f)){ + m66C += 1; + if(m66C > 3){ + if(mAnmNum == 1){ + setAnm(2,-1.0f); + mpMorf->setPlaySpeed(2.0f); + }else{ + setAnm(1,-1.0f); + mpMorf->setPlaySpeed(2.0f); + } + m66C = 0; + } + } + return TRUE; } /* 00000F40-000013A4 .text talkAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::talkAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::talkAction(void*) { + + if (mActionStatus == ACTION_STARTING_e) { + if (mAnmNum == 10 || mAnmNum == 11) { + return 0; + } + mPrevMesg = mCurrMesg; + if (mType == TYPE_P1A_e) { + if (mParam == 1) { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0910)) { + mCurrMesg = 0xC95; + + } else { + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0910); + mCurrMesg = 0xC94; + } + } else if (mParam == 3) { + mCurrMesg = 0x100A; + } else { + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0880)) { + mCurrMesg = 0x1007; + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0880); + } else { + mCurrMesg = 0x1009; + } + } + } else if (mType == TYPE_P1B_e) { + if (mParam == 1) { + mCurrMesg = 0xFA1; + } else if (mParam == 3) { + mCurrMesg = 0x100D; + } else { + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0840)) { + mCurrMesg = 0x100B; + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0840); + } else if (dComIfGs_getClearCount() == 0) { + mCurrMesg = 0x100C; + } else { + mCurrMesg = 0x1034; + } + } + if (mParam == 2) { + m_jnt.offHeadLock(); + } + } else { + if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_0808)) { + mCurrMesg = 0x1017; + + } else { + if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_0820)) { + mCurrMesg = 0x1014; + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0820); + } else { + mCurrMesg = 0x1015; + } + } + } + mActionStatus++; + l_msgId = fpcM_ERROR_PROCESS_ID_e; + } + else if (mActionStatus != ACTION_ENDING_e) { + if (l_msgId == fpcM_ERROR_PROCESS_ID_e) { + l_msgId = fopMsgM_messageSet(mCurrMesg, &eyePos); + } + else { + if (mType == TYPE_P1B_e) { + if (mParam != 2 && mParam != 3) { + m_jnt.setTrn(); + } + } else if (mType == TYPE_P1A_e) { + if (mParam != 2) { + m_jnt.setTrn(); + } + } else { + m_jnt.setTrn(); + } + setAnimFromMsg(); + if (mActionStatus == ACTION_ONGOING_e) { + l_msg = fopMsgM_SearchByID(l_msgId); + + if (l_msg != NULL) { + mActionStatus++; + } + } + else if (l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + if (getNextMsgNo(1) != -1) { + l_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + fopMsgM_messageSet(mCurrMesg); + + } else { + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + } + } + else if (l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { + if (mParam == 2) { + m_jnt.onHeadLock(); + } + + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + setAction(mPrevAction,NULL,0); + dComIfGp_event_reset(); + } + } + } + return TRUE; } /* 000013A4-000017A0 .text p1c_speakAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::p1c_speakAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::p1c_speakAction(void*) { + + if(mActionStatus == ACTION_STARTING_e){ + if(!eventInfo.checkCommandTalk()){ + cXyz temp1 = (dComIfGp_getPlayer(0)->current.pos - home.pos); + if(temp1.absXZ() < 200.0f){ + fopAcM_orderSpeakEvent(this); + eventInfo.onCondition(dEvtCnd_CANTALK_e); + } + return FALSE; + } + mCurrMesg = 0x1014; + mPrevMesg = 0; + mActionStatus += 1; + l_msg = NULL; + l_msgId = -1; + }else if(mActionStatus != ACTION_ENDING_e){ + if(l_msgId == fpcM_ERROR_PROCESS_ID_e){ + l_msgId = fopMsgM_messageSet(mCurrMesg,&eyePos); + }else{ + setAnimFromMsg(); + if(l_msg == NULL){ + l_msg = fopMsgM_SearchByID(l_msgId); + }else if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e){ + if(getNextMsgNo(1) != -1){ + l_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + fopMsgM_messageSet(mCurrMesg); + + }else{ + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + } + }else if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e){ + setAnm(4,8.0f); + cLib_addCalcPos2(¤t.pos,home.pos,0.75f,5.0f); + cXyz posdiff = home.pos - current.pos; + f32 dist_xz = posdiff.absXZ(); + if( dist_xz < 1.0f){ + dComIfGs_onEventBit(dSv_event_flag_c::UNK_0820); + mCyl.SetR(100.0f); + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + setAction(&daNpc_P1_c::normalAction,NULL,0); + dComIfGp_event_reset(); + } + } + } + } + return TRUE; } /* 000017A0-00001C60 .text speakAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::speakAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::speakAction(void*) { + + if(mActionStatus == ACTION_STARTING_e){ + if(mPrevMesg == 0xFAE){ + dComIfGp_getCamera(0)->mCamera.SkipSmoother(); + } + if(!eventInfo.checkCommandTalk()){ + cXyz temp1 = (dComIfGp_getPlayer(0)->current.pos - current.pos); + if(temp1.absXZ() < 400.0f){ + fopAcM_orderSpeakEvent(this); + eventInfo.onCondition(dEvtCnd_CANTALK_e); + } + return FALSE; + } + if(mPrevMesg == 0xFAE){ + mPrevMesg = mCurrMesg; + mCurrMesg = 0xFA5; + }else if(dComIfGp_getStartStage()->getPoint() == 2){ + mPrevMesg = mCurrMesg; + mCurrMesg = 0xFAA; + }else{ + mPrevMesg = mCurrMesg; + mCurrMesg = 0xFA1; + } + mActionStatus += 1; + l_msgId = fpcM_ERROR_PROCESS_ID_e; + }else if(mActionStatus != ACTION_ENDING_e){ + if(l_msgId == fpcM_ERROR_PROCESS_ID_e){ + l_msgId = fopMsgM_messageSet(mCurrMesg,&eyePos); + }else{ + m_jnt.setTrn(); + setAnimFromMsg(); + if(mActionStatus == ACTION_ONGOING_e){ + if(mCurrMesg == 0xFA5){ + dComIfGp_getCamera(0)->mCamera.SkipSmoother(); + } + l_msg = fopMsgM_SearchByID(l_msgId); + if(l_msg != NULL){ + mActionStatus += 1; + } + }else if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e){ + if(getNextMsgNo(1) != -1){ + l_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + fopMsgM_messageSet(mCurrMesg); + }else{ + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + } + }else if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e){ + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + setAction(&daNpc_P1_c::normalAction,NULL,0); + if(mPrevMesg == 0xFA4){ + dComIfGp_event_reset(); + fopAcM_orderOtherEvent2(this,"sea_exp_cam",dEvtFlag_NOPARTNER_e); + eventInfo.onCondition(dEvtCnd_UNK2_e); + setAction(&daNpc_P1_c::explainAction,NULL,0); + }else{ + dComIfGp_setNextStage("Ocean",1,fopAcM_GetRoomNo(this)); + } + } + } + } + return TRUE; } /* 00001C60-00001CD4 .text explainAction__10daNpc_P1_cFPv */ -void daNpc_P1_c::explainAction(void*) { - /* Nonmatching */ +BOOL daNpc_P1_c::explainAction(void*) { + + if(mActionStatus == ACTION_STARTING_e){ + mActionStatus += 1; + }else if(mActionStatus == ACTION_ENDING_e && !eventInfo.checkCommandTalk()){ + fopAcM_orderSpeakEvent(this); + eventInfo.onCondition(dEvtCnd_CANTALK_e); + return FALSE; + } + return TRUE; } /* 00001CD4-00001DE8 .text getNextMsgNo__10daNpc_P1_cFi */ -void daNpc_P1_c::getNextMsgNo(int) { - /* Nonmatching */ +u32 daNpc_P1_c::getNextMsgNo(int i_param_1) { + + u32 o_retval; + switch (mCurrMesg) { + case 0xC94: + o_retval = 0xC99; + break; + case 0xFA1: + case 0xFA2: + case 0xFA5: + case 0xFA6: + case 0xFA7: + case 0xFAA: + case 0xFAB: + case 0x1015: + case 0x1007: + o_retval = mCurrMesg + 1; + break; + case 0x1009: + o_retval = 0x102E; + break; + case 0x1016: + o_retval = 0x1033; + break; + case 0xFAE: + o_retval = 0xFA5; + break; + case 0xFA8: + case 0xFAC: + o_retval = 0xFA2; + break; + case 0xFA3: + if (l_msg->mSelectNum == 0) { + o_retval = 0xFA4; + } else if (l_msg->mSelectNum == 1) { + o_retval = 0xFB0; + } else { + o_retval = -1; + } + break; + case 0xFA4: + case 0xFA9: + default: + o_retval = -1; + break; + } + if (i_param_1 == 1) { + mPrevMesg = mCurrMesg; + mCurrMesg = o_retval; + } + return o_retval; } /* 00001DE8-00001E70 .text playTexPatternAnm__10daNpc_P1_cFv */ -void daNpc_P1_c::playTexPatternAnm() { - /* Nonmatching */ +BOOL daNpc_P1_c::playTexPatternAnm() { + + if(!cLib_calcTimer(&mBlinkTimer)){ + mBlinkFrame += 1; + if(mBlinkFrame >= mpTexture->getFrameMax()){ + mBlinkFrame -= mpTexture->getFrameMax(); + s16 rng = cM_rndF(100.0f); + mBlinkTimer = rng + 0x1E; + } + } + return TRUE; } /* 00001E70-00002098 .text demo_end_init__10daNpc_P1_cFv */ void daNpc_P1_c::demo_end_init() { - /* Nonmatching */ + + if(mParam == 0){ + mAnmNum = -1; + ActionFunc local_48 = &daNpc_P1_c::confuseAction; + bool compare = mActionFunc == local_48; //TODO: unused comparison? + if(mActionFunc != NULL){ + mActionStatus = ACTION_ENDING_e; + (this->*mActionFunc)(0); + } + mPrevAction = mActionFunc; + mActionFunc = local_48; + mActionStatus = ACTION_STARTING_e; + (this->*mActionFunc)(NULL); + fopAc_ac_c* actor = fopAcM_SearchByName(fpcNm_Obj_Pirateship_e); + if(actor){ + current.pos = actor->current.pos; + current.pos.y += 700.0f; + current.pos.x += cM_ssin(actor->current.angle.y) * 950.0f; + current.pos.z += cM_scos(actor->current.angle.y) * 950.0f; + current.pos.x += cM_scos(actor->current.angle.y) * 150.0f; + current.pos.z -= cM_ssin(actor->current.angle.y) * 150.0f; + s16 sVar2 = actor->current.angle.y - 0x4000; + actor->current.angle.y = sVar2; + current.angle.y = sVar2; + } + } + m_jnt.offHeadLock(); + m_jnt.offBackBoneLock(); + m670 = 0; } /* 00002098-000021E0 .text demo_move__10daNpc_P1_cFv */ -void daNpc_P1_c::demo_move() { - /* Nonmatching */ +BOOL daNpc_P1_c::demo_move() { + + dDemo_actor_c* actor = dComIfGp_demo_getActor(this->demoActorID); + if(!actor){ + if(m670 == 1){ + demo_end_init(); + } + return FALSE; + } + m_jnt.onHeadLock(); + m_jnt.onBackBoneLock(); + m670 = 1; + J3DAnmTexPattern* btp = actor->getP_BtpData("P1"); + if(btp){ + mBtp.init(mpHeadModel->getModelData(),btp,1,J3DFrameCtrl::EMode_LOOP,1.0f,0,-1,true,FALSE); + mBlinkFrame = 0; + } + if(mBtp.getBtpAnm()){ + u8 uVar1 = mBtp.getBtpAnm()->getFrameMax(); + mBlinkFrame += 1; + if(mBlinkFrame >= uVar1){ + mBlinkFrame = uVar1; + } + } +#if VERSION > VERSION_DEMO + dDemo_setDemoData(this, + dDemo_actor_c::ENABLE_TRANS_e | dDemo_actor_c::ENABLE_ROTATE_e | dDemo_actor_c::ENABLE_ANM_e | dDemo_actor_c::ENABLE_ANM_FRAME_e, + mpMorf,"P1",NULL,NULL,dBgS_GetGndMtrlSndId_Func(current.pos,10.0f)); +#else + dDemo_setDemoData(this, + dDemo_actor_c::ENABLE_TRANS_e | dDemo_actor_c::ENABLE_ROTATE_e | dDemo_actor_c::ENABLE_ANM_e | dDemo_actor_c::ENABLE_ANM_FRAME_e, + mpMorf,"P1"); +#endif + return TRUE; } /* 000021E0-00002244 .text event_move__10daNpc_P1_cFv */ -void daNpc_P1_c::event_move() { - /* Nonmatching */ +BOOL daNpc_P1_c::event_move() { + + if(mEventCut6B0.cutProc()){ + mbAttentionFlag = mEventCut6B0.getAttnFlag(); + if(mEventCut6B0.getAttnFlag() == 0){ + mEventCut6B0.setAttnFlag(mbAttentionFlag); + } + return TRUE; + }else{ + return privateCut(); + } } /* 00002244-000022E8 .text evn_setAnm_init__10daNpc_P1_cFi */ -void daNpc_P1_c::evn_setAnm_init(int) { - /* Nonmatching */ +BOOL daNpc_P1_c::evn_setAnm_init(int i_staff_id) { + + int* idx_p = dComIfGp_evmng_getMyIntegerP(i_staff_id, "idx"); + if (idx_p != NULL) { + setAnm(*idx_p, -1.0f); + } else if (mType == TYPE_P1C_e) { + setAnm(4, -1.0f); + } else { + setAnm(0, -1.0f); + } + return TRUE; } /* 000022E8-00002364 .text evn_talk_init__10daNpc_P1_cFi */ -void daNpc_P1_c::evn_talk_init(int) { - /* Nonmatching */ +BOOL daNpc_P1_c::evn_talk_init(int i_staff_id) { + + int* mesg_no_p = dComIfGp_evmng_getMyIntegerP(i_staff_id, "MsgNo"); + l_msgId = fpcM_ERROR_PROCESS_ID_e; + l_msg = NULL; + if(mesg_no_p != NULL){ + mCurrMesg = *mesg_no_p; + }else{ + mCurrMesg = 0; + } + return TRUE; } /* 00002364-00002464 .text evn_talk__10daNpc_P1_cFv */ -void daNpc_P1_c::evn_talk() { - /* Nonmatching */ +BOOL daNpc_P1_c::evn_talk() { + + if (l_msgId == fpcM_ERROR_PROCESS_ID_e) { + l_msgId = fopMsgM_messageSet(mCurrMesg,&eyePos); + } + else if (l_msg == NULL) { + l_msg = fopMsgM_SearchByID(l_msgId); + } + else if (l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) { + if (getNextMsgNo(true) != -1) { + l_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + fopMsgM_messageSet(mCurrMesg); + } + else { + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + } + } + else if (l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) { + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + l_msg = NULL; + l_msgId = fpcM_ERROR_PROCESS_ID_e; + return TRUE; + } + return FALSE; } + /* 00002464-000027AC .text minigameExplainCut__10daNpc_P1_cFv */ -void daNpc_P1_c::minigameExplainCut() { - /* Nonmatching */ +BOOL daNpc_P1_c::minigameExplainCut() { + + static char* ActionNames[] = {"4013_msg","4014_msg"}; + int staffId = dComIfGp_evmng_getMyStaffId(mEventCut6B0.getActorName(), NULL); + int actIdx = dComIfGp_evmng_getMyActIdx(staffId,ActionNames,ARRAY_SSIZE(ActionNames),1,0); + + if (staffId == -1) { + mbAttentionFlag = 0; + return 0; + } + if(m65A == 0){ + l_msgId = fpcM_ERROR_PROCESS_ID_e; + dComIfGp_onCameraAttentionStatus(0,4); + mPrevMesg = mCurrMesg; + mCurrMesg = 0xFAD; + m65A++; + }else if(m65A != -1){ + if (l_msgId == fpcM_ERROR_PROCESS_ID_e) { + l_msgId = fopMsgM_messageSet(mCurrMesg, &eyePos); + + }else{ + if (m65A == 1){ + l_msg = fopMsgM_SearchByID(l_msgId); + if (l_msg != NULL) { + m65A++; + } + } else{ + if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e){ + if (mCurrMesg == 0xFAD) { + l_msg->mStatus = fopMsgStts_MSG_CONTINUES_e; + + mPrevMesg = mCurrMesg; + mCurrMesg = 0xFAE; + fopMsgM_messageSet(mCurrMesg); + } else { + mPrevMesg = mCurrMesg; + mCurrMesg = -1; + l_msg->mStatus = fopMsgStts_MSG_ENDS_e; + } + }else if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e){ + if (actIdx == 1) { + dComIfGp_evmng_cutEnd(staffId); + } + l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e; + dComIfGp_offCameraAttentionStatus(0,4); + + }else if (dComIfGp_checkMesgSendButton() && actIdx == 0) { + dComIfGp_evmng_cutEnd(staffId); + } + } + if(checkAction(&daNpc_P1_c::explainAction)){ + if(dComIfGp_evmng_endCheck("sea_exp_cam")){ + + setAction(&daNpc_P1_c::speakAction,NULL,0); + dComIfGp_event_reset(); + dComIfGp_getCamera(0)->mCamera.SkipSmoother(); + fopAcM_orderSpeakEvent(this); + eventInfo.onCondition(dEvtCnd_CANTALK_e); + } + } + } + } + return TRUE; } /* 000027AC-00002920 .text privateCut__10daNpc_P1_cFv */ -void daNpc_P1_c::privateCut() { - /* Nonmatching */ +BOOL daNpc_P1_c::privateCut() { + + static char* cut_name_tbl[] = {"4013_msg","4014_msg","SETANM","HEADSWING","TALKMSG"}; + int staffIdx = dComIfGp_evmng_getMyStaffId(mEventCut6B0.getActorName()); + if(staffIdx == -1){ + return FALSE; + } + int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx,cut_name_tbl,ARRAY_SSIZE(cut_name_tbl),true,0); + if(actIdx == -1){ + dComIfGp_evmng_cutEnd(staffIdx); + }else{ + int iVar4 = 0; + if(dComIfGp_evmng_getIsAddvance(staffIdx)){ + switch(actIdx){ + case 2: + evn_setAnm_init(staffIdx); + + break; + case 3: + mHeadAnm.swing_vertical_init(2,0x1000,0x800,1); + break; + case 4: + evn_talk_init(staffIdx); + } + } + switch(actIdx){ + case 0: + case 1: + minigameExplainCut(); + break; + + case 4: + iVar4 = evn_talk(); + setAnimFromMsg(); + break; + default: + iVar4 = 1; + break; + } + if(iVar4 != 0){ + dComIfGp_evmng_cutEnd(staffIdx); + } + } + return TRUE; } /* 00002920-00002A7C .text nodeCallBack1__FP7J3DNodei */ -static BOOL nodeCallBack1(J3DNode*, int) { - /* Nonmatching */ +static BOOL nodeCallBack1(J3DNode* i_node, int i_param_2) { + + if(i_param_2 == J3DNodeCBCalcTiming_In){ + J3DModel* model = j3dSys.getModel(); + J3DJoint* joint = (J3DJoint*)i_node; + daNpc_P1_c* i_this = (daNpc_P1_c*)model->getUserArea(); + s32 jntNo = joint->getJntNo(); + if(i_this){ + MTXCopy(model->getAnmMtx(jntNo),*calc_mtx); + if(jntNo == i_this->m_jnt.getHeadJntNum()){ + cXyz local_28(REG10_F(0),REG10_F(1),REG10_F(2)); + cMtx_YrotM(*calc_mtx,-i_this->m_jnt.getHead_y() - i_this->mHeadAnm.field_0x02); + cMtx_ZrotM(*calc_mtx,-i_this->m_jnt.getHead_x() - i_this->mHeadAnm.field_0x00); + MtxPosition(&local_28,&i_this->eyePos); + } + if(jntNo == i_this->m_jnt.getBackboneJntNum()){ + mDoMtx_XrotM(*calc_mtx,i_this->m_jnt.getBackbone_y()); + mDoMtx_ZrotM(*calc_mtx,i_this->m_jnt.getBackbone_x()); + } + + model->setAnmMtx(jntNo,*calc_mtx); + cMtx_copy(*calc_mtx,J3DSys::mCurrentMtx); + } + } + return TRUE; } /* 00002A7C-00002A9C .text daNpc_P1_Draw__FP10daNpc_P1_c */ @@ -150,53 +995,438 @@ static BOOL daNpc_P1_Draw(daNpc_P1_c* i_this) { } /* 00002A9C-00002ABC .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + + return ((daNpc_P1_c*)i_this)->CreateHeap(); } /* 00002ABC-00002B00 .text setAttentionPos__10daNpc_P1_cFP4cXyz */ -void daNpc_P1_c::setAttentionPos(cXyz*) { - /* Nonmatching */ +BOOL daNpc_P1_c::setAttentionPos(cXyz* i_param_1) { + i_param_1->set(eyePos); + i_param_1->y += l_HIO.children[mType].mAttnYPosOffset; + return TRUE; } /* 00002B00-00003484 .text _create__10daNpc_P1_cFv */ cPhs_State daNpc_P1_c::_create() { - /* Nonmatching */ + + fopAcM_ct_Retail(this, daNpc_P1_c); + cPhs_State state = dComIfG_resLoad(&mPhs, "P1"); + if (state == cPhs_COMPLEATE_e) { + fopAcM_ct_Demo(this, daNpc_P1_c) + u32 param_bit = fopAcM_GetParamBit(fopAcM_GetParam(this),0x14,4); + mParam = fopAcM_GetParam(this); + if(param_bit == 0){ + mType = TYPE_P1A_e; + if(mParam == 2){ + m671 = 1; + m_jnt.onBackBoneLock(); + mKajiId = getKajiID(); + }else{ + m671 = 0; + } + mEventCut6B0.setActorInfo("P1a",this); + }else if( param_bit == 1){ + mType = TYPE_P1B_e; + m671 = 0; + mEventCut6B0.setActorInfo("P1b",this); + }else{ + mType = TYPE_P1C_e; + m671 = 0; + mEventCut6B0.setActorInfo("P1c",this); + } + mEventCut6B0.setJntCtrlPtr(&m_jnt); + u32 max_heap_size; + switch(mType){ + case TYPE_P1A_e: + max_heap_size = 0x25C0; + break; + case TYPE_P1B_e: + if(strcmp(dComIfGp_getStartStageName(), "sea") == 0 && + fopAcM_GetRoomNo(this) == dIsleRoom_OutsetIsland_e && + dComIfGp_getStartStageLayer() == 0xA){ + max_heap_size = 0x25C0; + }else{ + max_heap_size = 0x2120; + } + break; + case TYPE_P1C_e: + max_heap_size = 0x2120; + break; + default: + max_heap_size = 0x15000; + break; + } + if(!fopAcM_entrySolidHeap(this,CheckCreateHeap,max_heap_size)){ + return cPhs_ERROR_e; + } + cullMtx = mpMorf->getModel()->getBaseTRMtx(); + gravity = -9.0f; + attention_info.flags = fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e; + if(l_HIO.m8 < 0){ + l_HIO.mNo = mDoHIO_createChild("海賊下っ端",&l_HIO); //Pirate underlings + } + l_HIO.m8 += 1; + mStts.Init(0xFF,0xFF,this); + mCyl.Set(l_cyl_src); + mCyl.SetStts(&mStts); + mAnmNum = -1; + m66C = 0; + m670 = 0; + mKajiTimer = 300; + + if(mType == TYPE_P1B_e){ + attention_info.distances[1] = 0xAA; + attention_info.distances[3] = 0xAA; + u8 type = mParam; + if(mParam == 1){ + if(dComIfGp_getStartStagePoint() == 0 || dComIfGp_getStartStagePoint() == 2){ + setAction(&daNpc_P1_c::speakAction,NULL,0); + } + }else if(type == 0){ + setAction(&daNpc_P1_c::confuseAction,NULL,0); + }else { + if(type == 2){ + m_jnt.onBackBoneLock(); + m_jnt.onHeadLock(); + mCyl.SetR(90.0f); + }else if(type == 3){ + m_jnt.onBackBoneLock(); + m_jnt.onHeadLock(); + } + setAction(&daNpc_P1_c::normalAction,NULL,0); + } + }else if(mType == TYPE_P1C_e){ + attention_info.distances[1] = 0xAA; + attention_info.distances[3] = 0xAA; + if(!dComIfGs_isEventBit(0x820) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_0808)){ + current.pos.x -= cM_scos(current.angle.y) * 40.0f; + current.pos.z += cM_ssin(current.angle.y) * 40.0f; + setAnm(4,-1.0f); + setAction(&daNpc_P1_c::p1c_speakAction,NULL,0); + }else{ + setAction(&daNpc_P1_c::normalAction,NULL,0); + } + mCyl.SetR(100.0f); + }else{ + attention_info.distances[1] = 0xAB; + attention_info.distances[3] = 0xAB; + if(m671 != 0){ + setAnm(9,0.0f); + mCyl.SetR(REG10_F(5) + 90.0f); + } + setAction(&daNpc_P1_c::normalAction,NULL,0); + } + if(mType == TYPE_P1B_e && mParam == 1 && dComIfGp_getStartStagePoint() == 1){ + return cPhs_ERROR_e; + } + } + return state; } /* 00003834-00003D6C .text CreateHeap__10daNpc_P1_cFv */ -void daNpc_P1_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_P1_c::CreateHeap() { + + J3DModelData* model_data_p = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BDL_P1_e)); + mpMorf = new mDoExt_McaMorf(model_data_p,NULL,NULL,static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BCK_WAIT_e)),J3DFrameCtrl::EMode_LOOP,1.0f,0,-1,1,NULL,0x80000,0x11020002);; + if (!mpMorf || !mpMorf->getModel()) { + return FALSE; + } + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + m_jnt.setHeadJntNum(model_data_p->getJointName()->getIndex("head")); + JUT_ASSERT(DEMO_SELECT(0x634,0x639),m_jnt.getHeadJntNum() >= 0); + m_jnt.setBackboneJntNum(model_data_p->getJointName()->getIndex("backbone")); + JUT_ASSERT(DEMO_SELECT(0x639,0x63E),m_jnt.getBackboneJntNum() >= 0); + m_handR_jnt_num = model_data_p->getJointName()->getIndex("handR"); + JUT_ASSERT(DEMO_SELECT(0x63C,0x641),m_handR_jnt_num >= 0); + J3DModelData* head_model_data_p; + if(mType == TYPE_P1A_e){ + head_model_data_p = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BDL_P1A_HEAD_e)); + mpTexture = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BTP_MABA_A_e)); + }else if(mType == TYPE_P1B_e){ + head_model_data_p = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BDL_P1B_HEAD_e)); + mpTexture = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BTP_MABA_B_e)); + }else{ + head_model_data_p = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BDL_P1C_HEAD_e)); + mpTexture = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BTP_MABA_C_e)); + } + J3DAnmTexPattern* dummy_tex_all_p = static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BTP_P1A_DUMMY_TEX_ALL_e)); + mpHeadModel = mDoExt_J3DModel__create(head_model_data_p,0x80000,0x11020002); + if(mpTexture == NULL){ + return FALSE; + } +#if VERSION == VERSION_DEMO + mBtp.init(head_model_data_p,dummy_tex_all_p,TRUE,J3DFrameCtrl::EMode_LOOP); +#else + if(!mBtp.init(head_model_data_p,dummy_tex_all_p,TRUE,J3DFrameCtrl::EMode_LOOP)){ + return FALSE; + } +#endif + mBtp.init(head_model_data_p,mpTexture,TRUE,J3DFrameCtrl::EMode_LOOP, 1.0f,0,-1,true,FALSE); + if(mType == TYPE_P1B_e && strcmp(dComIfGp_getStartStageName(), "sea") == 0 && + fopAcM_GetRoomNo(this) == dIsleRoom_OutsetIsland_e && dComIfGp_getStartStageLayer() == 0xA){ + mpDoraModel = mDoExt_J3DModel__create(static_cast(dComIfG_getObjectRes("P1",dRes_INDEX_P1_BDL_DORA_STICK_e)),0x80000,0x11000002); + if(mpDoraModel == NULL){ + return FALSE; + } + }else{ + mpDoraModel = NULL; + } + J3DJointTree& tree = model_data_p->getJointTree(); + for (u16 i = 0; i < tree.getJointNum(); i += 1) { + if ((i == m_jnt.getHeadJntNum()) || (i == m_jnt.getBackboneJntNum())) { + model_data_p->getJointNodePointer(i)->setCallBack(nodeCallBack1); + } + } + mpMorf->getModel()->setUserArea((u32)this); + mAcchCir.SetWall(30.0f,0.0f); + mObjAcch.Set( + fopAcM_GetPosition_p(this), + fopAcM_GetOldPosition_p(this), + this, + 1, //ARRAY_SSIZE(mAcchCir) + &mAcchCir, + fopAcM_GetSpeed_p(this), + fopAcM_GetAngle_p(this), + fopAcM_GetShapeAngle_p(this)); + if(mType == TYPE_P1B_e){ + if(mParam == 3){ + mObjAcch.SetWallNone(); + + } + } + return TRUE; } /* 00003D6C-00003DF8 .text _delete__10daNpc_P1_cFv */ BOOL daNpc_P1_c::_delete() { - /* Nonmatching */ + + dComIfG_resDeleteDemo(&mPhs, "P1"); + if (DEMO_SELECT(TRUE, heap) && mpMorf) { + mpMorf->stopZelAnime(); + } + if(l_HIO.m8 >= 0){ + l_HIO.m8 -= 1; + if(l_HIO.m8 < 0){ + mDoHIO_deleteChild(l_HIO.mNo); + } + } + return TRUE; } /* 00003DF8-00003E70 .text getKajiID__10daNpc_P1_cFv */ -void daNpc_P1_c::getKajiID() { - /* Nonmatching */ +fpc_ProcID daNpc_P1_c::getKajiID() { + + fpc_ProcID kaji_id = 0xFFFFFFFF; + fpc_ProcID parent_id = parentActorID; + if(parent_id != fpcM_ERROR_PROCESS_ID_e){ + daObjPirateship::Act_c* actor = (daObjPirateship::Act_c*)fopAcM_SearchByID(parent_id); + if(fopAc_IsActor(actor) && fopAcM_GetName(actor) == fpcNm_Obj_Pirateship_e){ + kaji_id = actor->getKajiID(); + } + } + return kaji_id; } /* 00003E70-000043CC .text kaji_anm__10daNpc_P1_cFv */ -void daNpc_P1_c::kaji_anm() { - /* Nonmatching */ +BOOL daNpc_P1_c::kaji_anm() { + + if(m671 != 0){ + if(mAnmNum == 0xA || mAnmNum == 0xB){ + if(mpMorf->checkFrame(mpMorf->getEndFrame()-1.0f)){ + setAnm(9,-1.0f); + mKajiTimer = 300; + }else if(mpMorf->checkFrame(30.0f)){ + fopAcM_seStart(this,JA_SE_OBJ_PIRATE_WHEEL,0); + } + }else if(mKajiTimer-- < 0){ + if(mpMorf->checkFrame(mpMorf->getEndFrame()-1.0f)){ + if(!checkAction(&daNpc_P1_c::talkAction)){ + if(cM_rndF(1.0f) > 0.5f){ + setAnm(0xA,-1.0f); + + }else{ + setAnm(0xB,-1.0f); + } + } + } + } + if(mKajiId != fpcM_ERROR_PROCESS_ID_e){ + daKaji_c* wheel = (daKaji_c*)fopAcM_SearchByID(mKajiId); + if(fopAc_IsActor(wheel) && fopAcM_GetName(wheel) == fpcNm_Kaji_e){ + wheel->setAnm(mAnmNum-9,mpMorf->getFrame()); + } + } + return TRUE; + } + if(mType == TYPE_P1B_e && mParam == 2){ + if(!checkAction(&daNpc_P1_c::talkAction)){ + if(mAnmNum == 0xE && mpMorf->checkFrame(mpMorf->getEndFrame()-1.0f) && --m66C <= 0){ + setAnm(0xF,-1.0f); + if(cM_rndF(1.0f) > 0.5f){ + m66C = 1; + }else{ + m66C = 2; + } + }else if(mAnmNum == 0xF){ + if(mpMorf->checkFrame(mpMorf->getEndFrame()-1.0f)){ + if(--m66C <= 0){ + setAnm(0xE,-1.0f); + m66C = 4; + } + } + + } + } + } + return FALSE; } /* 000043CC-0000458C .text _execute__10daNpc_P1_cFv */ BOOL daNpc_P1_c::_execute() { - /* Nonmatching */ + + mHeadAnm.move(); + if(!demo_move()){ + playTexPatternAnm(); + s8 room_no = fopAcM_GetRoomNo(this); + mpMorf->play( + ¤t.pos, + mObjAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mObjAcch.m_gnd) : 0, + (s16)dComIfGp_getReverb(room_no)); //TODO: cast to s16 needed? + + if(dComIfGp_event_getMode() == 0 || eventInfo.checkCommandTalk()){ + (this->*mActionFunc)(NULL); + m65A = 0; + mbAttentionFlag = 0; + }else{ + event_move(); + } + } + kaji_anm(); + lookBack(); + setAttentionPos(&attention_info.position); + if(m670 == 0){ + fopAcM_posMoveF(this,mStts.GetCCMoveP()); + mObjAcch.CrrPos(*dComIfG_Bgsp()); + } + tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd); + tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd); + J3DModel* model = mpMorf->getModel(); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + return TRUE; } /* 0000458C-00004814 .text _draw__10daNpc_P1_cFv */ BOOL daNpc_P1_c::_draw() { - /* Nonmatching */ + + static u8 l_snap_idx_tbl[] = {DSNAP_TYPE_NPC_P1A,DSNAP_TYPE_NPC_P1B,DSNAP_TYPE_NPC_P1C}; + if(mType == TYPE_P1A_e && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_0310)){ + return TRUE; + } + J3DModel* pJVar7 = mpMorf->getModel(); + J3DModelData* mat_table_p = mpMorf->getModel()->getModelData(); + J3DModelData* head_model_data = mpHeadModel->getModelData(); + g_env_light.settingTevStruct(TEV_TYPE_ACTOR,¤t.pos,&tevStr); + g_env_light.setLightTevColorType(pJVar7,&tevStr); + g_env_light.setLightTevColorType(mpHeadModel,&tevStr); + mBtp.entry(head_model_data,mBlinkFrame); + if(mType == TYPE_P1A_e){ + mpMorf->updateDL(); + mpHeadModel->setBaseTRMtx(pJVar7->getAnmMtx(m_jnt.getHeadJntNum())); + mDoExt_modelUpdateDL(mpHeadModel); + }else{ + J3DMaterialTable* pJVar2; + J3DTexture* texture_p = mat_table_p->getTexture(); + JUTNameTab* texture_name_p = mat_table_p->getTextureName(); + if(mType == TYPE_P1B_e){ + pJVar2 = (J3DMaterialTable*)dComIfG_getObjectRes("P1",dRes_INDEX_P1_BMT_P1B_BODY_e); + }else{ + pJVar2 = (J3DMaterialTable*)dComIfG_getObjectRes("P1",dRes_INDEX_P1_BMT_P1C_BODY_e); + } + mat_table_p->setMaterialTable(pJVar2,J3DMatCopyFlag_Texture); + mpMorf->updateDL(); + mpHeadModel->setBaseTRMtx(pJVar7->getAnmMtx(m_jnt.getHeadJntNum())); + mDoExt_modelUpdateDL(mpHeadModel); + mat_table_p->setTexture(texture_p); + mat_table_p->setTextureName(texture_name_p); + if(mpDoraModel){ + g_env_light.setLightTevColorType(mpDoraModel,&tevStr); + mpDoraModel->setBaseTRMtx(pJVar7->getAnmMtx(m_handR_jnt_num)); + mDoExt_modelUpdateDL(mpDoraModel); + } + } + cXyz local_28(current.pos.x,current.pos.y + 130.0f, current.pos.z); + mShadowId = dComIfGd_setShadow(mShadowId,true,mpMorf->getModel(),&local_28,800.0f,20.0f,current.pos.y,mObjAcch.GetGroundH(),mObjAcch.m_gnd,&tevStr); + dSnap_RegistFig(l_snap_idx_tbl[mType],this,current.pos,current.angle.y,1.0f,1.0f,1.0f); + return TRUE; } /* 00004814-00004BA0 .text lookBack__10daNpc_P1_cFv */ -void daNpc_P1_c::lookBack() { - /* Nonmatching */ +BOOL daNpc_P1_c::lookBack() { + + u32 o_retval = false; + cXyz posdiff =(dComIfGp_getPlayer(0)->current.pos - current.pos); + cXyz dstPos; + cXyz* dstPos_p; + f32 fVar4 = posdiff.absXZ(); + bool look_at_target = true; + + if(m671 == 1){ + if(mAnmNum == 9 && checkAction(&daNpc_P1_c::talkAction)){ + + dstPos = dNpc_playerEyePos(0.0f); + dstPos_p = &dstPos; + }else{ + dstPos_p = NULL; + } + + }else if(mbAttentionFlag != 0){ + dstPos = mEventCut6B0.getAttnPos(); + dstPos_p = &dstPos; + }else if(fVar4 < l_HIO.children[mType].mMaxTalkDist || + checkAction(&daNpc_P1_c::talkAction) || + checkAction(&daNpc_P1_c::explainAction) || + checkAction(&daNpc_P1_c::speakAction) || + checkAction(&daNpc_P1_c::p1c_speakAction)){ + + dstPos = dNpc_playerEyePos(0.0f); + dstPos_p = &dstPos; + }else{ + dstPos_p = NULL; + } + m_jnt.setParam( + l_HIO.children[mType].mMaxBackboneX, + l_HIO.children[mType].mMaxBackboneY, + l_HIO.children[mType].mMinBackboneX, + l_HIO.children[mType].mMinBackboneY, + l_HIO.children[mType].mMaxHeadX, + l_HIO.children[mType].mMaxHeadY, + l_HIO.children[mType].mMinHeadX, + l_HIO.children[mType].mMinHeadY, + l_HIO.children[mType].mMaxTurnStep + ); + if(m_jnt.trnChk()){ + cLib_addCalcAngleS2(&mMaxLookVel,l_HIO.children[mType].mLookBackTargetY,4,0x800); + look_at_target = false; + o_retval = true; + }else{ + mMaxLookVel = 0; + } + cXyz srcpos; + srcpos.x = current.pos.x; + srcpos.y = current.pos.y; + srcpos.z = current.pos.z; + srcpos.y += 190.0f; + m_jnt.lookAtTarget(¤t.angle.y,dstPos_p,srcpos,current.angle.y,mMaxLookVel,look_at_target); + return o_retval; + + } /* 00004BA0-00004BC4 .text daNpc_P1_Execute__FP10daNpc_P1_c */