tp/src/d/actor/d_a_npc_knj.cpp

599 lines
18 KiB
C++

/**
* @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(&current.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<J3DModelData*>(
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<daNpc_Knj_c*>(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, &current.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<daNpc_Knj_c*>(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<daNpc_Knj_c*>(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<daNpc_Knj_c*>(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<daNpc_Knj_c*>(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
};