From 814c70590c1fa0e1cfe98325092602b163fcf9f2 Mon Sep 17 00:00:00 2001 From: Zeclos Date: Sun, 10 May 2026 22:00:47 +0200 Subject: [PATCH] d_a_npc_jb1 matching (#991) --- configure.py | 2 +- include/d/actor/d_a_npc_jb1.h | 133 +++++--- src/d/actor/d_a_npc_jb1.cpp | 604 ++++++++++++++++++++++++++++++---- 3 files changed, 624 insertions(+), 115 deletions(-) diff --git a/configure.py b/configure.py index 7f28b267a..063f1ffeb 100755 --- a/configure.py +++ b/configure.py @@ -1640,7 +1640,7 @@ config.libs = [ ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_npc_hi1"), ActorRel(NonMatching, "d_a_npc_ho"), ActorRel(Matching, "d_a_npc_hr"), - ActorRel(NonMatching, "d_a_npc_jb1"), + ActorRel(Matching, "d_a_npc_jb1"), ActorRel(NonMatching, "d_a_npc_ji1"), ActorRel(Matching, "d_a_npc_kamome"), ActorRel(NonMatching, "d_a_npc_kf1"), diff --git a/include/d/actor/d_a_npc_jb1.h b/include/d/actor/d_a_npc_jb1.h index 9b4ec9295..a6c12f1b0 100644 --- a/include/d/actor/d_a_npc_jb1.h +++ b/include/d/actor/d_a_npc_jb1.h @@ -4,78 +4,117 @@ #include "f_op/f_op_actor.h" #include "m_Do/m_Do_ext.h" #include "SSystem/SComponent/c_phase.h" +#include "d/d_npc.h" -class daNpc_Jb1_c : public fopAc_ac_c { +class daNpc_Jb1_c : public fopNpc_npc_c { public: struct anm_prm_c { - + s8 field_0x0; + s8 field_0x1; + f32 mMorf; + f32 mPlaySpeed; + int mLoopMode; }; typedef BOOL (daNpc_Jb1_c::*ActionFunc)(void*); - void init_JB1_0(); - void createInit(); + daNpc_Jb1_c(); + bool init_JB1_0(); + bool createInit(); void setMtx(); - void playBrkAnm(J3DAnmTevRegKey*, short*); - void anmNum_toResID(int); - void setAnm_anm(anm_prm_c*); - void setAnm(); + void playBrkAnm(J3DAnmTevRegKey*, s16*); + int anmNum_toResID(int); + BOOL setAnm_anm(anm_prm_c*); + BOOL setAnm(); void chg_anmTag(); void control_anmTag(); - void chg_anmAtr(unsigned char); + void chg_anmAtr(u8); void control_anmAtr(); void setAnm_ATR(); - void anmAtr(unsigned short); + void anmAtr(u16); void eventOrder(); void checkOrder(); - void next_msgStatus(unsigned long*); - void getMsg_JB1_0(); - void getMsg(); - void chkAttention(); + u16 next_msgStatus(u32*); + u32 getMsg_JB1_0(); + u32 getMsg(); + bool chkAttention(); void setAttention(); - void charDecide(int); + bool charDecide(int); void event_actionInit(int); - void event_action(); + bool event_action(); void privateCut(int); - void isEventEntry(); + int isEventEntry(); void event_proc(int); - void set_action(int (daNpc_Jb1_c::*)(void*), void*); - void setStt(signed char); - void wait_1(); - void wait_action1(void*); - void demo(); + BOOL set_action(ActionFunc, void*); + void setStt(s8); + BOOL wait_1(); + BOOL wait_action1(void*); + bool demo(); BOOL _draw(); BOOL _execute(); BOOL _delete(); cPhs_State _create(); - void create_Anm(); - void create_lgt(); - void CreateHeap(); + J3DModelData* create_Anm(); + bool create_lgt(); + BOOL CreateHeap(); public: - /* 0x6C4 */ request_of_phase_process_class mReqPhaseProc; - /* 0x6CC */ s8 mCaseJointIndex; - /* 0x6CD */ u8 m6CD[0x818 - 0x6CD]; - /* 0x818 */ J3DAnmTevRegKey* mLampBrkAnim; - /* 0x81C */ mDoExt_brkAnm mBrkAnimator; - /* 0x834 */ u8 m834[0x838 - 0x834]; - /* 0x838 */ J3DModelData* mpModelData; - /* 0x83C */ u8 m83C[0x848 - 0x83C]; - /* 0x848 */ J3DAnmTevRegKey* mCurrentBrkAnim; - /* 0x84C */ u8 m84C[0x85C - 0x84C]; - /* 0x85C */ ActionFunc mCurStateFunc; - /* 0x868 */ u8 m868[0x8E0 - 0x868]; + /* 0x6C4 */ request_of_phase_process_class mPhs; + /* 0x6CC */ s8 m_cse_jnt_num; + /* 0x6CD */ u8 field_0x6CD[0x6D0 - 0x6CD]; + /* 0x6D0 */ cXyz field_0x6D0; + /* 0x6DC */ dKy_tevstr_c field_0x6DC; // not used + /* 0x78C */ u8 field_0x78C[0x7A8 - 0x78C]; + /* 0x7A8 */ mDoExt_bckAnm mBckAnm; // not used maybe related to the unused JUT_ASSERTS + /* 0x7B8 */ u8 field_0x7B8[0x7C0 - 0x7B8]; + /* 0x7C0 */ mDoExt_btkAnm mBtkAnm; // not used maybe related to the unused JUT_ASSERTS + /* 0x7D4 */ u8 field_0x7D4[0x7DC - 0x7D4]; + /* 0x7DC */ mDoExt_brkAnm mBrkAnm3; // not used maybe related to the unused JUT_ASSERTS + /* 0x7F4 */ u8 field_0x7F4[0x7F8 - 0x7F4]; + /* 0x7F8 */ LIGHT_INFLUENCE field_0x7F8; + /* 0x818 */ J3DAnmTevRegKey* m_lmp_brk; + /* 0x81C */ mDoExt_brkAnm mBrkAnm; + /* 0x834 */ s16 field_0x834; + /* 0x836 */ u8 field_0x836[0x838 - 0x836]; + /* 0x838 */ J3DModel* m_lgt_mdl; + /* 0x83C */ J3DAnmTevRegKey* m_lgt_brk; + /* 0x840 */ mDoExt_brkAnm mBrkAnm2; + /* 0x858 */ s16 field_0x858; + /* 0x85A */ u8 field_0x85A[0x85C - 0x85A]; + /* 0x85C */ ActionFunc mCurrActionFunc; + /* 0x868 */ u8 field_0x868[0x870 - 0x868]; + /* 0x870 */ dNpc_EventCut_c mEventCut; + /* 0x8DC */ u8 field_0x8DC[0x8E0 - 0x8DC]; /* 0x8E0 */ cXyz mCurrentPos; /* 0x8EC */ csXyz mCurrentRot; - /* 0x8F2 */ u8 m8F2[0x924 - 0x8F2]; -}; - -class daNpc_Jb1_HIO_c { -public: - daNpc_Jb1_HIO_c(); - -public: - /* Place member variables here */ -}; + /* 0x8F2 */ u8 field_0x8F2[0x8F4 - 0x8F2]; + /* 0x8F4 */ cXyz field_0x8F4; + /* 0x900 */ f32 mFrame; + /* 0x904 */ u8 field_0x904[0x908 - 0x904]; + /* 0x908 */ s8 field_0x908; + /* 0x909 */ bool field_0x909; + /* 0x90A */ u8 field_0x90A[0x90C - 0x90A]; + /* 0x90C */ bool field_0x90C; + /* 0x90D */ bool field_0x90D; + /* 0x90E */ bool field_0x90E; + /* 0x90F */ bool field_0x90F; + /* 0x910 */ BOOL field_0x910; + /* 0x914 */ bool mHasAttention; + /* 0x915 */ s8 field_0x915; + /* 0x916 */ u8 field_0x916[0x917 - 0x916]; + /* 0x917 */ bool field_0x917; + /* 0x918 */ s8 mActIdx; + /* 0x919 */ s8 mActNo; + /* 0x91A */ u8 field_0x91A; + /* 0x91B */ u8 field_0x91B; + /* 0x91C */ s8 field_0x91C; + /* 0x91D */ s8 field_0x91D; + /* 0x91E */ s8 field_0x91E; + /* 0x91F */ u8 field_0x91F[0x920 - 0x91F]; + /* 0x920 */ s8 field_0x920; + /* 0x921 */ s8 field_0x921; + /* 0x922 */ s8 field_0x922; + /* 0x923 */ s8 field_0x923; +}; // Size: 0x924 #endif /* D_A_NPC_JB1_H */ diff --git a/src/d/actor/d_a_npc_jb1.cpp b/src/d/actor/d_a_npc_jb1.cpp index a70f80c34..2b21481c3 100644 --- a/src/d/actor/d_a_npc_jb1.cpp +++ b/src/d/actor/d_a_npc_jb1.cpp @@ -7,205 +7,675 @@ #include "d/actor/d_a_npc_jb1.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/res/res_jb.h" + +class daNpc_Jb1_HIO_c : public JORReflexible{ +public: + struct hio_prm_c { + f32 field_0x00; + s16 field_0x04; + s16 field_0x06; + s16 field_0x08; + s16 field_0x0A; + f32 field_0x0C; + f32 field_0x10; + }; // Size: 0x14 + daNpc_Jb1_HIO_c(); + virtual ~daNpc_Jb1_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; +}; + +static daNpc_Jb1_HIO_c l_HIO; /* 000000EC-00000144 .text __ct__15daNpc_Jb1_HIO_cFv */ daNpc_Jb1_HIO_c::daNpc_Jb1_HIO_c() { - /* Nonmatching */ + static hio_prm_c a_prm_tbl = { + 100.0f, + 0, + 1000, + 1000, + 0, + VERSION_SELECT(2050.0f, 2050.0f, 1200.0f, 2050.0f), + 50.0f, + + }; + memcpy(&mPrmTbl, &a_prm_tbl, sizeof(hio_prm_c)); + mNo = -1; + field_0x8 = -1; } /* 00000144-00000190 .text init_JB1_0__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::init_JB1_0() { - /* Nonmatching */ +bool daNpc_Jb1_c::init_JB1_0() { + set_action(&daNpc_Jb1_c::wait_action1, NULL); + return true; } /* 00000190-00000264 .text createInit__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::createInit() { - /* Nonmatching */ +bool daNpc_Jb1_c::createInit() { + cXyz unused(0.0f, 0.0f, -400.0f); + gravity = 0.0f; + + mEventCut.setActorInfo2("Jb1", this); + field_0x91C = 2; + bool temp; + switch(field_0x921) { + case 0: + temp = init_JB1_0(); + break; + default: + temp = false; + break; + } + + if(temp) { + shape_angle = current.angle; + } else { + return false; + } + dKy_plight_set(&field_0x7F8); + mpMorf->setMorf(0.0f); + setMtx(); + return true; } /* 00000264-0000049C .text setMtx__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::setMtx() { - /* Nonmatching */ + cXyz temp(0.0f, -150.0f, 0.0f); + + playBrkAnm(m_lmp_brk, &field_0x834); + playBrkAnm(m_lgt_brk, &field_0x858); + + if (!field_0x917) { + field_0x908 = mpMorf->play(&eyePos, 0, 0); + if (mpMorf->getFrame() < mFrame) { + field_0x908 = true; + } + mFrame = mpMorf->getFrame(); + 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(current.angle.y); + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->calc(); + + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(m_cse_jnt_num)); + mDoMtx_stack_c::multVec(&temp, &field_0x6D0); + mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(m_cse_jnt_num)); + + mDoMtx_stack_c::transM(0.0f, -150.0f, 0.0f); + mDoMtx_stack_c::scaleM(2.0f, 2.0f, 2.0f); + m_lgt_mdl->setBaseTRMtx(mDoMtx_stack_c::get()); + m_lgt_mdl->calc(); + + field_0x7F8.mPos.set(field_0x6D0); + + field_0x7F8.mColor.r = l_HIO.mPrmTbl.field_0x06; + field_0x7F8.mColor.g = l_HIO.mPrmTbl.field_0x08; + field_0x7F8.mColor.b = l_HIO.mPrmTbl.field_0x0A; + field_0x7F8.mPower = l_HIO.mPrmTbl.field_0x0C; + field_0x7F8.mFluctuation = l_HIO.mPrmTbl.field_0x10; + setAttention(); } /* 0000049C-000004CC .text playBrkAnm__11daNpc_Jb1_cFP15J3DAnmTevRegKeyPs */ -void daNpc_Jb1_c::playBrkAnm(J3DAnmTevRegKey*, short*) { - /* Nonmatching */ +void daNpc_Jb1_c::playBrkAnm(J3DAnmTevRegKey* param_1, s16* param_2) { + if (param_1 == NULL) { + return; + } + *param_2 = *param_2 + 1; + if (*param_2 < param_1->getFrameMax()) { + return; + } + *param_2 = 0; } /* 000004CC-000004E0 .text anmNum_toResID__11daNpc_Jb1_cFi */ -void daNpc_Jb1_c::anmNum_toResID(int) { - /* Nonmatching */ +int daNpc_Jb1_c::anmNum_toResID(int param_1) { + static const int a_bck_resID_tbl[] = { + 1, + 0 + }; + return a_bck_resID_tbl[param_1]; } /* 000004E0-00000588 .text setAnm_anm__11daNpc_Jb1_cFPQ211daNpc_Jb1_c9anm_prm_c */ -void daNpc_Jb1_c::setAnm_anm(daNpc_Jb1_c::anm_prm_c*) { - /* Nonmatching */ +BOOL daNpc_Jb1_c::setAnm_anm(daNpc_Jb1_c::anm_prm_c* i_anmPrmP) { + if (field_0x91C == i_anmPrmP->field_0x0) { + return TRUE; + } + + field_0x91C = i_anmPrmP->field_0x0; + + dNpc_setAnmIDRes( + mpMorf, + i_anmPrmP->mLoopMode, + i_anmPrmP->mMorf, + i_anmPrmP->mPlaySpeed, + anmNum_toResID(field_0x91C), + -1, + "Jb" + ); + mFrame = 0.0f; + field_0x909 = 0; + field_0x908 = 0; + return TRUE; } /* 00000588-000005D0 .text setAnm__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::setAnm() { - /* Nonmatching */ +BOOL daNpc_Jb1_c::setAnm() { + static daNpc_Jb1_c::anm_prm_c a_anm_prm_tbl[2] = { + {-1, 0, 0.0f, 0.0f, J3DFrameCtrl::EMode_NULL}, + {0, 0, 8.0f, 1.0f, J3DFrameCtrl::EMode_LOOP}, + + }; + + if(a_anm_prm_tbl[field_0x91E].field_0x0 >= 0){ + setAnm_anm(&a_anm_prm_tbl[field_0x91E]); + } + return TRUE; } /* 000005D0-000005D4 .text chg_anmTag__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::chg_anmTag() { - /* Nonmatching */ } /* 000005D4-000005D8 .text control_anmTag__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::control_anmTag() { - /* Nonmatching */ } /* 000005D8-00000618 .text chg_anmAtr__11daNpc_Jb1_cFUc */ -void daNpc_Jb1_c::chg_anmAtr(unsigned char) { - /* Nonmatching */ +void daNpc_Jb1_c::chg_anmAtr(u8 param_1) { + if(param_1 >= 1 || param_1 == field_0x91A) { + return; + } + + field_0x91A = param_1; + setAnm_ATR(); } /* 00000618-00000624 .text control_anmAtr__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::control_anmAtr() { - /* Nonmatching */ + switch(field_0x91A) { + case 0: + break; + } } /* 00000624-00000658 .text setAnm_ATR__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::setAnm_ATR() { - /* Nonmatching */ + static daNpc_Jb1_c::anm_prm_c a_anm_prm_tbl[1] = { + {0, 0, 8.0f, 1.0f, J3DFrameCtrl::EMode_LOOP}, + }; + + setAnm_anm(&a_anm_prm_tbl[field_0x91A]); } /* 00000658-0000071C .text anmAtr__11daNpc_Jb1_cFUs */ -void daNpc_Jb1_c::anmAtr(unsigned short) { - /* Nonmatching */ +void daNpc_Jb1_c::anmAtr(u16 param_1) { + switch(param_1) { + case 6: + if (field_0x923 == 0) { + field_0x91A = 0xFF; + chg_anmAtr(dComIfGp_getMesgAnimeAttrInfo()); + field_0x923++; + } + + u8 mesgTagInfo = dComIfGp_getMesgAnimeTagInfo(); + dComIfGp_clearMesgAnimeTagInfo(); + if (mesgTagInfo != 0xFF && field_0x91B != mesgTagInfo) { + field_0x91B = mesgTagInfo; + chg_anmTag(); + } + break; + case 0xE: + field_0x923 = 0; + break; + } + + control_anmTag(); + control_anmAtr(); } /* 0000071C-0000076C .text eventOrder__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::eventOrder() { - /* Nonmatching */ + if ((field_0x91D == 1 || field_0x91D == 2)) { + eventInfo.onCondition(dEvtCnd_CANTALK_e); + if(field_0x91D == 1) { + fopAcM_orderSpeakEvent(this); + } + } } /* 0000076C-000007AC .text checkOrder__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::checkOrder() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + return; + } + + if (eventInfo.mCommand != dEvtCmd_INTALK_e) { + return; + } + + if (field_0x91D != 1 && field_0x91D != 2) { + return; + } + field_0x91D = 0; + field_0x915 = 1; } /* 000007AC-000007B4 .text next_msgStatus__11daNpc_Jb1_cFPUl */ -void daNpc_Jb1_c::next_msgStatus(unsigned long*) { - /* Nonmatching */ +u16 daNpc_Jb1_c::next_msgStatus(u32* pMsgNo) { + return 0x10; } /* 000007B4-000007BC .text getMsg_JB1_0__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::getMsg_JB1_0() { - /* Nonmatching */ +u32 daNpc_Jb1_c::getMsg_JB1_0() { + return 0; } /* 000007BC-000007F8 .text getMsg__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::getMsg() { - /* Nonmatching */ +u32 daNpc_Jb1_c::getMsg() { + u32 msg = 0; + switch(field_0x921) { + case 0: + msg = getMsg_JB1_0(); + break; + } + + return msg; } /* 000007F8-00000878 .text chkAttention__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::chkAttention() { - /* Nonmatching */ +bool daNpc_Jb1_c::chkAttention() { + dAttention_c& attention = dComIfGp_getAttention(); + + if(attention.LockonTruth()) { + return this == attention.LockonTarget(0); + } + + return this == attention.ActionTarget(0); } /* 00000878-0000093C .text setAttention__11daNpc_Jb1_cFv */ void daNpc_Jb1_c::setAttention() { - /* Nonmatching */ + cXyz temp(0.0f, 1100.0f, 700.0f); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(current.angle.y); + mDoMtx_stack_c::multVec(&temp, &field_0x8F4); + attention_info.position.set(field_0x8F4.x, field_0x8F4.y + l_HIO.mPrmTbl.field_0x00, field_0x8F4.z); + eyePos.set(field_0x8F4.x, field_0x8F4.y, field_0x8F4.z); } /* 0000093C-00000958 .text charDecide__11daNpc_Jb1_cFi */ -void daNpc_Jb1_c::charDecide(int) { - /* Nonmatching */ +bool daNpc_Jb1_c::charDecide(int) { + field_0x920 = 0; + field_0x921 = -1; + field_0x921 = 0; + return true; } /* 00000958-000009B0 .text event_actionInit__11daNpc_Jb1_cFi */ -void daNpc_Jb1_c::event_actionInit(int) { - /* Nonmatching */ +void daNpc_Jb1_c::event_actionInit(int staffIdx) { + int* actNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "ActNo"); + if(actNo != NULL){ + mActNo = *actNo; + } } /* 000009B0-000009D0 .text event_action__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::event_action() { - /* Nonmatching */ +bool daNpc_Jb1_c::event_action() { + switch(mActNo) { + case 0: + return true; + } + return true; } /* 000009D0-00000ABC .text privateCut__11daNpc_Jb1_cFi */ -void daNpc_Jb1_c::privateCut(int) { - /* Nonmatching */ +void daNpc_Jb1_c::privateCut(int staffIdx) { + static char* a_cut_tbl[] = { + "ACTION" + }; + + if(staffIdx != -1) { + mActIdx = dComIfGp_evmng_getMyActIdx(staffIdx, a_cut_tbl, ARRAY_SSIZE(a_cut_tbl), TRUE, 0); + if(mActIdx == -1) { + dComIfGp_evmng_cutEnd(staffIdx); + } else { + if(dComIfGp_evmng_getIsAddvance(staffIdx)) { + switch(mActIdx) { + case 0: + event_actionInit(staffIdx); + break; + } + } + bool temp; + switch(mActIdx) { + case 0: + temp = event_action(); + break; + default: + temp = true; + break; + } + if(temp) { + dComIfGp_evmng_cutEnd(staffIdx); + } + } + + } } /* 00000ABC-00000AF4 .text isEventEntry__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::isEventEntry() { - /* Nonmatching */ +int daNpc_Jb1_c::isEventEntry() { + return dComIfGp_evmng_getMyStaffId(mEventCut.getActorName()); } /* 00000AF4-00000B44 .text event_proc__11daNpc_Jb1_cFi */ -void daNpc_Jb1_c::event_proc(int) { - /* Nonmatching */ +void daNpc_Jb1_c::event_proc(int param_1) { + if (!mEventCut.cutProc()) { + privateCut(param_1); + } } /* 00000B44-00000BF0 .text set_action__11daNpc_Jb1_cFM11daNpc_Jb1_cFPCvPvPv_iPv */ -void daNpc_Jb1_c::set_action(ActionFunc, void*) { - /* Nonmatching */ +BOOL daNpc_Jb1_c::set_action(ActionFunc actionFunc, void* arg) { + if (mCurrActionFunc != actionFunc) { + if (mCurrActionFunc != NULL) { + field_0x922 = 9; + (this->*mCurrActionFunc)(arg); + } + mCurrActionFunc = actionFunc; + field_0x922 = 0; + (this->*mCurrActionFunc)(arg); + } + return TRUE; } /* 00000BF0-00000C20 .text setStt__11daNpc_Jb1_cFSc */ -void daNpc_Jb1_c::setStt(signed char) { - /* Nonmatching */ +void daNpc_Jb1_c::setStt(s8 param_1) { + field_0x91E = param_1; + switch (field_0x91E) { + case 0: + case 1: + break; + } + + setAnm(); } /* 00000C20-00000C28 .text wait_1__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::wait_1() { - /* Nonmatching */ +BOOL daNpc_Jb1_c::wait_1() { + return TRUE; } /* 00000C28-00000CBC .text wait_action1__11daNpc_Jb1_cFPv */ -void daNpc_Jb1_c::wait_action1(void*) { - /* Nonmatching */ +BOOL daNpc_Jb1_c::wait_action1(void*) { + switch(field_0x922) { + case 9: + break; + case 0: + setStt(1); + field_0x922++; + break; + case 1: + case 2: + case 3: + mHasAttention = chkAttention(); + switch(field_0x91E) { + case 1: + field_0x910 = wait_1(); + break; + } + break; + } + return TRUE; } /* 00000CBC-00000D58 .text demo__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::demo() { - /* Nonmatching */ +bool daNpc_Jb1_c::demo() { + if (demoActorID == 0) { + if (field_0x917) { + field_0x917 = false; + } + } else { + field_0x917 = true; + dComIfGp_demo_getActor(demoActorID); + 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, + "Jb" + ); + } + return field_0x917; } +static const u32 dummyColor[] = { + 0xFFFFFF80, + 0xFF000080, + 0x0000FF80, + 0x00000000, +}; + /* 00000D58-00000E74 .text _draw__11daNpc_Jb1_cFv */ BOOL daNpc_Jb1_c::_draw() { - /* Nonmatching */ + J3DModelData* lgtModelData; + J3DModel* pModel; + J3DModelData* modelData; + + lgtModelData = m_lgt_mdl->getModelData(); + pModel = mpMorf->getModel(); + modelData = pModel->getModelData(); + + if (field_0x90C || field_0x90E) { + return TRUE; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(pModel, &tevStr); + mBrkAnm.entry(modelData, field_0x834); + mpMorf->entryDL(); + mBrkAnm.remove(modelData); + mBrkAnm2.entry(lgtModelData, field_0x858); + mDoExt_modelEntryDL(m_lgt_mdl); + mBrkAnm2.remove(lgtModelData); + return TRUE; } /* 00000E74-00000FBC .text _execute__11daNpc_Jb1_cFv */ BOOL daNpc_Jb1_c::_execute() { - /* Nonmatching */ + if (!field_0x90F) { + mCurrentPos.set(current.pos); + mCurrentRot = current.angle; + field_0x90F = true; + } + + if (field_0x90C && demoActorID == 0) { + return TRUE; + } + + field_0x90C = false; + checkOrder(); + if (!demo()) { + int temp = -1; + if (dComIfGp_event_runCheck() && eventInfo.checkCommandTalk() == false) { + temp = isEventEntry(); + } + + if(temp >= 0) { + event_proc(temp); + } else { + (this->*mCurrActionFunc)(NULL); + } + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + if (!field_0x90D) { + shape_angle = current.angle; + } + } + eventOrder(); + setMtx(); + return TRUE; } /* 00000FBC-00001054 .text _delete__11daNpc_Jb1_cFv */ BOOL daNpc_Jb1_c::_delete() { - /* Nonmatching */ + // fopAcM_GetID(); mentioned in debug map + DEMO_SELECT(dComIfG_deleteObjectRes("Jb"), dComIfG_resDelete(&mPhs, "Jb")); + dKy_plight_cut(&field_0x7F8); + + if( +#if VERSION > VERSION_DEMO + heap != NULL && +#endif + mpMorf != NULL) { + mpMorf->stopZelAnime(); + } + + if(l_HIO.field_0x8 >= 0) { + l_HIO.field_0x8--; + if(l_HIO.field_0x8 < 0) { + mDoHIO_deleteChild(l_HIO.mNo); + } + } + return TRUE; } /* 00001054-00001074 .text CheckCreateHeap__FP10fopAc_ac_c */ -static BOOL CheckCreateHeap(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { + return ((daNpc_Jb1_c*)i_this)->CreateHeap(); } /* 00001074-000011B8 .text _create__11daNpc_Jb1_cFv */ cPhs_State daNpc_Jb1_c::_create() { - /* Nonmatching */ + static u32 a_size_tbl[] = { + 0x000272E0 + }; + +#if VERSION > VERSION_DEMO + fopAcM_SetupActor(this, daNpc_Jb1_c); +#endif + + cPhs_State phase_state = dComIfG_resLoad(&mPhs, "Jb"); + switch(phase_state) { + case cPhs_COMPLEATE_e: + u8 param = fopAcM_GetParam(this); + if (!charDecide(param)) { + return cPhs_ERROR_e; + } + + if(l_HIO.field_0x8 < 0) { + l_HIO.mNo = mDoHIO_createChild("γ‚Έγƒ£γƒ–βˆ’", &l_HIO); + } + l_HIO.field_0x8++; + +#if VERSION == VERSION_DEMO + fopAcM_SetupActor(this, daNpc_Jb1_c); +#endif + + if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, a_size_tbl[field_0x920])) { + return cPhs_ERROR_e; + } + fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); + if(createInit() == 0) { + return cPhs_ERROR_e; + } + return phase_state; + } + return phase_state; } +daNpc_Jb1_c::daNpc_Jb1_c() {} + /* 00001780-00001A0C .text create_Anm__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::create_Anm() { - /* Nonmatching */ +J3DModelData* daNpc_Jb1_c::create_Anm() { + J3DModelData* a_mdl_dat = (J3DModelData*)dComIfG_getObjectIDRes("Jb", JB_BDL_JB); + JUT_ASSERT(VERSION_SELECT(0x450, 0x45A, 0x45F, 0x45F), a_mdl_dat != NULL); + + mpMorf = new mDoExt_McaMorf( + a_mdl_dat, + NULL, NULL, + (J3DAnmTransformKey*)dComIfG_getObjectIDRes("Jb", JB_BCK_JB_WAIT01), + J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1, + NULL, + 0x80000, + 0x11020022 + ); + + if(mpMorf == NULL) { + return NULL; + } else if(mpMorf->getModel() == NULL) { + mpMorf = NULL; + return NULL; + } else { + m_lmp_brk = (J3DAnmTevRegKey*)dComIfG_getObjectIDRes("Jb", JB_BRK_JB_LAMP); + JUT_ASSERT(VERSION_SELECT(0x464, 0x46E, 0x473, 0x473), m_lmp_brk != NULL); + bool temp = mBrkAnm.init(mpMorf->getModel()->getModelData(), m_lmp_brk, true, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, 0); + if(temp == false) { + mpMorf = NULL; + return NULL; + } else { + field_0x834 = 0; + m_cse_jnt_num = mpMorf->getModel()->getModelData()->getJointName()->getIndex("jb_case"); + JUT_ASSERT(VERSION_SELECT(0x46F, 0x479, 0x47E, 0x47E), m_cse_jnt_num >= 0); + } + } + return a_mdl_dat; +} + +// Probably unused JUT_ASSERTS +static void dummy() { + OSReport("m_app_mdl != 0"); + OSReport("m_app_bck != 0"); + OSReport("m_app_btk != 0"); + OSReport("m_app_brk != 0"); + OSReport("splash"); + OSReport("m_spl_jnt_num >= 0"); } /* 00001A0C-00001B78 .text create_lgt__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::create_lgt() { - /* Nonmatching */ +bool daNpc_Jb1_c::create_lgt() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectIDRes("Jb", JB_BMD_LF); + m_lgt_mdl = mDoExt_J3DModel__create(modelData, 0, 0x11020203); + + JUT_ASSERT(VERSION_SELECT(0x4B6, 0x4C0, 0x4C5, 0x4C5), m_lgt_mdl != NULL); + + m_lgt_brk = (J3DAnmTevRegKey*)dComIfG_getObjectIDRes("Jb", JB_BRK_LF); + JUT_ASSERT(VERSION_SELECT(0x4BB, 0x4C5, 0x4CA, 0x4CA), m_lgt_brk != NULL); + bool temp = mBrkAnm2.init(m_lgt_mdl->getModelData(), m_lgt_brk, true, J3DFrameCtrl::EMode_LOOP); + + if (!temp) { + return temp; + } + + field_0x858 = 0; + return temp; } /* 00001B78-00001C20 .text CreateHeap__11daNpc_Jb1_cFv */ -void daNpc_Jb1_c::CreateHeap() { - /* Nonmatching */ +BOOL daNpc_Jb1_c::CreateHeap() { + if(create_Anm() == NULL) { + return false; + } + if(!create_lgt()) { + return false; + } + + mpMorf->getModel()->setUserArea(NULL); + mAcchCir.SetWall(0.0f, 0.0f); + mObjAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this)); + return true; } /* 00001C20-00001C40 .text daNpc_Jb1_Create__FP10fopAc_ac_c */