/** * @file d_a_npc_knj.cpp * */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_npc_knj.h" const daNpc_Knj_HIOParam daNpc_Knj_Param_c::m = { 0.0f, // attention_offset 0.0f, // gravity 1.0f, // scale 4000.0f, // real_shadow_size 0.0f, // weight 0.0f, // height 0.0f, // knee_length 0.0f, // width 0.0f, // body_angleX_max 0.0f, // body_angleX_min 0.0f, // body_angleY_max 0.0f, // body_angleY_min 0.0f, // head_angleX_max 0.0f, // head_angleX_min 0.0f, // head_angleY_max 0.0f, // head_angleY_min 0.0f, // neck_rotation_ratio 0.0f, // morf_frame 0, // talk_distance 0, // talk_angle 0, // attention_distance 0, // attention_angle 0.0f, // fov 0.0f, // search_distance 0.0f, // search_height 0.0f, // search_depth 0, // attention_time 0, // damage_time 0, // face_expression 0, // motion 0, // look_mode 0, // debug_mode_ON 0, // debug_info_ON 0.0f, // expression_morf_frame 0.0f, // box_min_x 0.0f, // box_min_y 0.0f, // box_min_z 0.0f, // box_max_x 0.0f, // box_max_y 0.0f, // box_max_z 0.0f, // box_offset }; #if DEBUG daNpc_Knj_HIO_c::daNpc_Knj_HIO_c() { m = daNpc_Knj_Param_c::m; } void daNpc_Knj_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) { // TODO } void daNpc_Knj_HIO_c::genMessage(JORMContext* ctext) { // TODO } #endif enum Type { /* 0x0 */ TYPE_0, /* 0x1 */ TYPE_1, /* 0x2 */ TYPE_2, /* 0x3 */ TYPE_3, /* 0x4 */ TYPE_4, /* 0x5 */ TYPE_5, }; enum FaceMotion { /* 0x00 */ FACE_MOT_UNK_0 = 0, }; enum Motion { /* 0x00 */ MOT_UNK_0 = 0, }; /* 80A455F0-80A455F8 000020 0008+00 1/1 0/0 0/0 .data l_bmdData */ static int l_bmdData[1][2] = { {9, 1}, }; /* 80A455F8-80A45608 -00001 0010+00 0/1 0/0 0/0 .data l_evtList */ static daNpcT_evtData_c l_evtList[2] = { {"", 0}, {"NO_RESPONSE", 0}, }; /* 80A45608-80A45610 -00001 0008+00 2/4 0/0 0/0 .data l_resNameList */ static char* l_resNameList[2] = { "", "Knj", }; /* 80A45610-80A45614 000040 0002+02 1/0 0/0 0/0 .data l_loadResPtrn0 */ static s8 l_loadResPtrn0[2] = {1, -1}; /* 80A45614-80A4562C -00001 0018+00 1/2 0/0 0/0 .data l_loadResPtrnList */ static s8* l_loadResPtrnList[6] = { l_loadResPtrn0, l_loadResPtrn0, l_loadResPtrn0, l_loadResPtrn0, l_loadResPtrn0, l_loadResPtrn0, }; /* 80A4562C-80A45648 00005C 001C+00 0/1 0/0 0/0 .data l_faceMotionAnmData */ static daNpcT_faceMotionAnmData_c l_faceMotionAnmData[1] = { {-1, 0, 0, -1, 0, 0, 0}, }; /* 80A45648-80A45664 000078 001C+00 0/1 0/0 0/0 .data l_motionAnmData */ static daNpcT_motionAnmData_c l_motionAnmData[1] = { {6, 2, 1, -1, 0, 0, 0, 0}, }; /* 80A45664-80A45674 000094 0010+00 0/1 0/0 0/0 .data l_faceMotionSequenceData */ static daNpcT_MotionSeqMngr_c::sequenceStepData_c l_faceMotionSequenceData[4] = { {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, }; /* 80A45674-80A45684 0000A4 0010+00 0/1 0/0 0/0 .data l_motionSequenceData */ static daNpcT_MotionSeqMngr_c::sequenceStepData_c l_motionSequenceData[4] = { {0, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, {-1, 0, 0}, }; /* 80A45684-80A45688 -00001 0004+00 1/1 0/0 0/0 .data mCutNameList__11daNpc_Knj_c */ char* daNpc_Knj_c::mCutNameList[1] = {""}; /* 80A45688-80A45694 0000B8 000C+00 2/2 0/0 0/0 .data mCutList__11daNpc_Knj_c */ daNpc_Knj_c::cutFunc daNpc_Knj_c::mCutList[1] = { NULL, }; /* 80A4589C-80A458A0 000014 0004+00 1/1 0/0 0/0 .bss l_HIO */ NPC_KNJ_HIO_CLASS l_HIO; /* 80A4356C-80A43608 0000EC 009C+00 1/0 0/0 0/0 .text __dt__11daNpc_Knj_cFv */ daNpc_Knj_c::~daNpc_Knj_c() { if (heap != NULL) { mpMorf[0]->stopZelAnime(); } deleteRes(l_loadResPtrnList[mType], (const char**)l_resNameList); } /* 80A43608-80A43848 000188 0240+00 1/1 0/0 0/0 .text create__11daNpc_Knj_cFv */ int daNpc_Knj_c::create() { daNpcT_ct(this, daNpc_Knj_c, l_faceMotionAnmData, l_motionAnmData, l_faceMotionSequenceData, 4, l_motionSequenceData, 4, l_evtList, l_resNameList); mType = getType(); mFlowNodeNo = getFlowNodeNo(); mTwilight = 0; int rv = loadRes(l_loadResPtrnList[mType], (const char**)l_resNameList); if (rv == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0)) { return cPhs_ERROR_e; } if (isDelete()) { return cPhs_ERROR_e; } J3DModelData* modelData = mpMorf[0]->getModel()->getModelData(); fopAcM_SetMtx(this, mpMorf[0]->getModel()->getBaseTRMtx()); mSound.init(¤t.pos, &eyePos, 3, 1); mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this), fopAcM_GetAngle_p(this), fopAcM_GetShapeAngle_p(this)); mAcch.CrrPos(dComIfG_Bgsp()); mGndChk = mAcch.m_gnd; mGroundH = mAcch.GetGroundH(); setEnvTevColor(); setRoomNo(); mCcStts.Init(mpHIO->m.common.weight, 0, this); reset(); mCreating = true; Execute(); mCreating = false; } return rv; } /* 80A43848-80A439A0 0003C8 0158+00 1/1 0/0 0/0 .text CreateHeap__11daNpc_Knj_cFv */ int daNpc_Knj_c::CreateHeap() { J3DModelData* modelData = static_cast( dComIfG_getObjectRes(l_resNameList[l_bmdData[0][1]], l_bmdData[0][0])); mpMorf[0] = new mDoExt_McaMorfSO(modelData, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, 0x11020084); if (mpMorf[0] != NULL && mpMorf[0]->getModel() == NULL) { mpMorf[0]->stopZelAnime(); mpMorf[0] = NULL; } if (mpMorf[0] == NULL) { return 0; } J3DModel* model = mpMorf[0]->getModel(); model->setUserArea((uintptr_t)this); if (setFaceMotionAnm(0, false) && setMotionAnm(0, 0.0f, 0)) { return 1; } return 0; } /* 80A439A0-80A439D4 000520 0034+00 1/1 0/0 0/0 .text Delete__11daNpc_Knj_cFv */ int daNpc_Knj_c::Delete() { fopAcM_GetID(this); this->~daNpc_Knj_c(); return 1; } /* 80A439D4-80A439F4 000554 0020+00 2/2 0/0 0/0 .text Execute__11daNpc_Knj_cFv */ int daNpc_Knj_c::Execute() { return daNpcT_c::execute(); } /* 80A439F4-80A43A88 000574 0094+00 1/1 0/0 0/0 .text Draw__11daNpc_Knj_cFv */ int daNpc_Knj_c::Draw() { if (mpMatAnm[0] != NULL) { J3DModelData* modelData = mpMorf[0]->getModel()->getModelData(); modelData->getMaterialNodePointer(getEyeballMaterialNo())->setMaterialAnm(mpMatAnm[0]); } return daNpcT_c::draw(0, 0, mRealShadowSize, NULL, 0.0f, 1, 0, 0); } /* 80A43A88-80A43AA8 000608 0020+00 1/1 0/0 0/0 .text * createHeapCallBack__11daNpc_Knj_cFP10fopAc_ac_c */ int daNpc_Knj_c::createHeapCallBack(fopAc_ac_c* i_this) { return static_cast(i_this)->CreateHeap(); } /* 80A43AA8-80A43B1C 000628 0074+00 1/1 0/0 0/0 .text getType__11daNpc_Knj_cFv */ u8 daNpc_Knj_c::getType() { switch (fopAcM_GetParam(this) & 0xFF) { case 0: return TYPE_0; case 1: return TYPE_1; case 2: return TYPE_2; case 3: return TYPE_3; case 4: return TYPE_4; case 5: return TYPE_5; } return TYPE_0; } /* 80A43B1C-80A43B38 00069C 001C+00 1/1 0/0 0/0 .text getFlowNodeNo__11daNpc_Knj_cFv */ int daNpc_Knj_c::getFlowNodeNo() { u16 nodeNo = home.angle.x; if (nodeNo == 0xffff) { return -1; } return nodeNo; } /* 80A43B38-80A43B40 0006B8 0008+00 1/1 0/0 0/0 .text isDelete__11daNpc_Knj_cFv */ BOOL daNpc_Knj_c::isDelete() { return FALSE; } /* 80A43B40-80A43C64 0006C0 0124+00 1/1 0/0 0/0 .text reset__11daNpc_Knj_cFv */ void daNpc_Knj_c::reset() { initialize(); memset(&mNextAction, 0, (u8*)&field_0xe64 - (u8*)&mNextAction); if (mpMatAnm[0] != NULL) { mpMatAnm[0]->initialize(); } setAngle(home.angle.y); } /* 80A43C64-80A43D58 0007E4 00F4+00 1/0 0/0 0/0 .text setParam__11daNpc_Knj_cFv */ void daNpc_Knj_c::setParam() { selectAction(); srchActors(); s16 talk_distance = mpHIO->m.common.talk_distance; s16 talk_angle = mpHIO->m.common.talk_angle; s16 attention_distance = mpHIO->m.common.attention_distance; s16 attention_angle = mpHIO->m.common.attention_angle; attention_info.distances[fopAc_attn_LOCK_e] = daNpcT_getDistTableIdx(attention_distance, attention_angle); attention_info.distances[fopAc_attn_TALK_e] = attention_info.distances[fopAc_attn_LOCK_e]; attention_info.distances[fopAc_attn_SPEAK_e] = daNpcT_getDistTableIdx(talk_distance, talk_angle); attention_info.flags = fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e; scale.set(mpHIO->m.common.scale, mpHIO->m.common.scale, mpHIO->m.common.scale); mCcStts.SetWeight(mpHIO->m.common.weight); mCylH = mpHIO->m.common.height; mWallR = mpHIO->m.common.width; mAcchCir.SetWallR(mWallR); mAcchCir.SetWallH(mpHIO->m.common.knee_length); mRealShadowSize = mpHIO->m.common.real_shadow_size; gravity = mpHIO->m.common.gravity; mExpressionMorfFrame = mpHIO->m.common.expression_morf_frame; mMorfFrames = mpHIO->m.common.morf_frame; } /* 80A43D58-80A43D5C 0008D8 0004+00 1/1 0/0 0/0 .text srchActors__11daNpc_Knj_cFv */ void daNpc_Knj_c::srchActors() {} /* 80A43D5C-80A43E5C 0008DC 0100+00 1/0 0/0 0/0 .text evtTalk__11daNpc_Knj_cFv */ BOOL daNpc_Knj_c::evtTalk() { if (chkAction(&daNpc_Knj_c::talk)) { (this->*mAction)(NULL); } else { mPreItemNo = 0; if (dComIfGp_event_chkTalkXY()) { if (!dComIfGp_evmng_ChkPresentEnd()) { return TRUE; } mEvtNo = 1; evtChange(); return TRUE; } setAction(&daNpc_Knj_c::talk); } return TRUE; } /* 80A43E5C-80A43F24 0009DC 00C8+00 1/0 0/0 0/0 .text evtCutProc__11daNpc_Knj_cFv */ BOOL daNpc_Knj_c::evtCutProc() { BOOL rv = FALSE; int staffId = dComIfGp_getEventManager().getMyStaffId("Knj", this, -1); if (staffId != -1) { mStaffId = staffId; int actIdx = dComIfGp_getEventManager().getMyActIdx(mStaffId, (char**)mCutNameList, 1, 0, 0); if ((this->*(mCutList[actIdx]))(mStaffId) != 0) { dComIfGp_getEventManager().cutEnd(mStaffId); } rv = TRUE; } return rv; } /* 80A43F24-80A43FAC 000AA4 0088+00 1/0 0/0 0/0 .text action__11daNpc_Knj_cFv */ void daNpc_Knj_c::action() { if (mNextAction != NULL) { if (mAction == mNextAction) { (this->*mAction)(NULL); } else { setAction(mNextAction); } } } /* 80A43FAC-80A44024 000B2C 0078+00 1/0 0/0 0/0 .text beforeMove__11daNpc_Knj_cFv */ void daNpc_Knj_c::beforeMove() { if (checkHide() || mNoDraw != 0) { attention_info.flags = 0; } } /* 80A44024-80A44080 000BA4 005C+00 1/0 0/0 0/0 .text setAttnPos__11daNpc_Knj_cFv */ void daNpc_Knj_c::setAttnPos() { setMtx(); eyePos = current.pos; attention_info.position = current.pos; } /* 80A44080-80A44088 000C00 0008+00 1/0 0/0 0/0 .text drawDbgInfo__11daNpc_Knj_cFv */ BOOL daNpc_Knj_c::drawDbgInfo() { return FALSE; } /* 80A44088-80A44264 000C08 01DC+00 1/0 0/0 0/0 .text afterSetMotionAnm__11daNpc_Knj_cFiifi */ bool daNpc_Knj_c::afterSetMotionAnm(int param_1, int param_2, f32 param_3, int param_4) { static struct { int field_0x0; u32 field_0x4; } btpAnmData[6] = { {15, 1}, {16, 1}, {17, 1}, {18, 1}, {19, 1}, {20, 1}, }; static struct { int field_0x0; u32 field_0x4; } brkAnmData[1] = { {12, 1}, }; J3DAnmTexPattern* anm_text = NULL; J3DAnmTevRegKey* anm_tev = NULL; if (btpAnmData[mType].field_0x0 != -1) { anm_text = getTexPtrnAnmP(l_resNameList[btpAnmData[mType].field_0x4], btpAnmData[mType].field_0x0); } if (anm_text) { if (mBtpAnm.getBtpAnm() == anm_text) { mAnmFlags |= 0x800; } else if (setBtpAnm(anm_text, mpMorf[0]->getModel()->getModelData(), 1.0f, param_2)) { mAnmFlags |= 0x820; } } if (anm_text == NULL && btpAnmData[mType].field_0x0 != -1) { return 0; } if (brkAnmData[param_1].field_0x0 != -1) { anm_tev = getTevRegKeyAnmP(l_resNameList[brkAnmData[param_1].field_0x4], brkAnmData[param_1].field_0x0); } if (anm_tev) { if (mBrkAnm.getBrkAnm() == anm_tev) { mAnmFlags |= 0x100; } else if (setBrkAnm(anm_tev, mpMorf[0]->getModel()->getModelData(), 1.0f, param_2)) { mBrkAnm.setFrame(mType * 10); mAnmFlags |= 0x104; } } if (anm_tev == NULL && brkAnmData[param_1].field_0x0 != -1) { return 0; } return 1; } /* 80A44264-80A442D0 000DE4 006C+00 1/0 0/0 0/0 .text drawGhost__11daNpc_Knj_cFv */ void daNpc_Knj_c::drawGhost() { J3DModel* model = mpMorf[0]->getModel(); g_env_light.settingTevStruct(5, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(model, &tevStr); mpMorf[0]->entryDL(); } /* 80A442D0-80A44318 000E50 0048+00 1/1 0/0 0/0 .text selectAction__11daNpc_Knj_cFv */ int daNpc_Knj_c::selectAction() { mNextAction = NULL; mNextAction = &daNpc_Knj_c::wait; return 1; } /* 80A44318-80A44344 000E98 002C+00 1/1 0/0 0/0 .text * chkAction__11daNpc_Knj_cFM11daNpc_Knj_cFPCvPvPv_i */ BOOL daNpc_Knj_c::chkAction(actionFunc param_0) { return mAction == param_0; } /* 80A44344-80A443EC 000EC4 00A8+00 2/2 0/0 0/0 .text * setAction__11daNpc_Knj_cFM11daNpc_Knj_cFPCvPvPv_i */ int daNpc_Knj_c::setAction(actionFunc param_0) { mMode = MODE_EXIT; if (mAction != NULL) { (this->*(mAction))(NULL); } mMode = MODE_ENTER; mAction = param_0; if (mAction != NULL) { (this->*(mAction))(NULL); } return 1; } /* 80A443EC-80A44598 000F6C 01AC+00 1/0 0/0 0/0 .text wait__11daNpc_Knj_cFPv */ int daNpc_Knj_c::wait(void* param_0) { BOOL uVar2; switch (mMode) { case 0: case 1: mFaceMotionSeqMngr.setNo(FACE_MOT_UNK_0, -1.0f, 0, 0); mMotionSeqMngr.setNo(MOT_UNK_0, -1.0f, 0, 0); mMode = 2; case 2: if (!mStagger.checkStagger()) { if (srchPlayerActor()) { mJntAnm.lookPlayer(0); uVar2 = checkStep(); } else { mJntAnm.lookNone(0); uVar2 = home.angle.y != mCurAngle.y; } if (uVar2 != 0 && step(home.angle.y, -1, -1, 15, 0)) { mMode = 1; } } break; case 3: break; } return 1; } /* 80A44598-80A446FC 001118 0164+00 2/0 0/0 0/0 .text talk__11daNpc_Knj_cFPv */ int daNpc_Knj_c::talk(void* param_0) { BOOL bVar1 = FALSE; switch (mMode) { case 0: case 1: initTalk(mFlowNodeNo, NULL); mMode = 2; case 2: if (mTwilight) { bVar1 = TRUE; } else { mJntAnm.lookPlayer(0); if (mCurAngle.y != fopAcM_searchPlayerAngleY(this)) { step(fopAcM_searchPlayerAngleY(this), -1, -1, 15, 0); } else { bVar1 = TRUE; } } if (bVar1 && talkProc(NULL, FALSE, NULL, FALSE)) { mPlayerActorMngr.entry(daPy_getPlayerActorClass()); dComIfGp_event_reset(); mMode = 3; } break; case 3: break; } return 0; } /* 80A446FC-80A4471C 00127C 0020+00 1/0 0/0 0/0 .text daNpc_Knj_Create__FPv */ static int daNpc_Knj_Create(void* i_this) { return static_cast(i_this)->create(); } /* 80A4471C-80A4473C 00129C 0020+00 1/0 0/0 0/0 .text daNpc_Knj_Delete__FPv */ static int daNpc_Knj_Delete(void* i_this) { return static_cast(i_this)->Delete(); } /* 80A4473C-80A4475C 0012BC 0020+00 1/0 0/0 0/0 .text daNpc_Knj_Execute__FPv */ static int daNpc_Knj_Execute(void* i_this) { return static_cast(i_this)->Execute(); } /* 80A4475C-80A4477C 0012DC 0020+00 1/0 0/0 0/0 .text daNpc_Knj_Draw__FPv */ static int daNpc_Knj_Draw(void* i_this) { return static_cast(i_this)->Draw(); } /* 80A4477C-80A44784 0012FC 0008+00 1/0 0/0 0/0 .text daNpc_Knj_IsDelete__FPv */ static int daNpc_Knj_IsDelete(void* i_this) { return 1; } /* 80A456F0-80A45710 -00001 0020+00 1/0 0/0 0/0 .data daNpc_Knj_MethodTable */ static actor_method_class daNpc_Knj_MethodTable = { (process_method_func)daNpc_Knj_Create, (process_method_func)daNpc_Knj_Delete, (process_method_func)daNpc_Knj_Execute, (process_method_func)daNpc_Knj_IsDelete, (process_method_func)daNpc_Knj_Draw, }; /* 80A45710-80A45740 -00001 0030+00 0/0 0/0 1/0 .data g_profile_NPC_KNJ */ extern actor_process_profile_definition g_profile_NPC_KNJ = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_NPC_KNJ, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daNpc_Knj_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 349, // mPriority &daNpc_Knj_MethodTable, // sub_method 0x00044000, // mStatus fopAc_ACTOR_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType };