mirror of
https://github.com/zeldaret/tp
synced 2026-05-28 00:16:11 -04:00
1221 lines
36 KiB
C++
1221 lines
36 KiB
C++
/**
|
|
* @file d_a_npc_soldierA.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_npc_soldierA.h"
|
|
#include "d/d_debug_viewer.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
|
|
enum chtSolA_RES_File_ID {
|
|
/* BCK */
|
|
/* 0x05 */ BCK_SOLA_FEAR_TALK = 0x5,
|
|
/* 0x06 */ BCK_SOLA_FEAR_WAIT,
|
|
/* 0x07 */ BCK_SOLA_TALK_A,
|
|
/* 0x08 */ BCK_SOLA_TALK_B,
|
|
/* 0x09 */ BCK_SOLA_WAIT,
|
|
/* 0x0A */ BCK_SOLA_WAIT_A,
|
|
|
|
/* BMDR */
|
|
/* 0x0D */ BMDR_SOLA_SPEAR = 0xD,
|
|
/* 0x0E */ BMDR_SOLA_TW,
|
|
|
|
/* EVT */
|
|
/* 0x11 */ EVT_CHTSOLA_EVENT_LIST = 0x11,
|
|
};
|
|
|
|
enum RES_Name {
|
|
/* 0x0 */ CHTSOLA,
|
|
};
|
|
|
|
enum Joint {
|
|
/* 0x00 */ JNT_CENTER,
|
|
/* 0x01 */ JNT_BACKBONE1,
|
|
/* 0x02 */ JNT_BACKBONE2,
|
|
/* 0x03 */ JNT_NECK,
|
|
/* 0x04 */ JNT_HEAD,
|
|
/* 0x05 */ JNT_SHOULDERL,
|
|
/* 0x06 */ JNT_ARM1L,
|
|
/* 0x07 */ JNT_ARM2L,
|
|
/* 0x08 */ JNT_HANDL,
|
|
/* 0x09 */ JNT_FINGERL,
|
|
/* 0x0A */ JNT_THUMBL,
|
|
/* 0x0B */ JNT_SHOULDERR,
|
|
/* 0x0C */ JNT_ARM1R,
|
|
/* 0x0D */ JNT_ARM2R,
|
|
/* 0x0E */ JNT_HANDR,
|
|
/* 0x0F */ JNT_FINGERR,
|
|
/* 0x10 */ JNT_THUMBR,
|
|
/* 0x11 */ JNT_WAIST,
|
|
/* 0x12 */ JNT_LEG1L,
|
|
/* 0x13 */ JNT_LEG2L,
|
|
/* 0x14 */ JNT_FOOTL,
|
|
/* 0x15 */ JNT_LEG1R,
|
|
/* 0x16 */ JNT_LEG2R,
|
|
/* 0x17 */ JNT_FOOTR,
|
|
/* 0x18 */ JNT_SAYA
|
|
};
|
|
|
|
enum Animation {
|
|
/* 0x0 */ ANM_NONE,
|
|
/* 0x1 */ ANM_WAIT_A,
|
|
/* 0x2 */ ANM_FEAR_WAIT,
|
|
/* 0x3 */ ANM_FEAR_TALK,
|
|
/* 0x4 */ ANM_WAIT,
|
|
/* 0x5 */ ANM_TALK_A,
|
|
/* 0x6 */ ANM_TALK_B,
|
|
};
|
|
|
|
enum Motion {
|
|
/* 0x0 */ MOT_WAIT,
|
|
/* 0x1 */ MOT_TALK_B,
|
|
/* 0x2 */ MOT_TALK_A,
|
|
/* 0x3 */ MOT_FEAR_WAIT,
|
|
/* 0x4 */ MOT_FEAR_TALK,
|
|
/* 0x5 */ MOT_WAIT_A,
|
|
};
|
|
|
|
enum Event {
|
|
/* 0x0 */ EVT_NONE,
|
|
/* 0x1 */ EVT_TALK_LAKE,
|
|
};
|
|
|
|
enum Event_Cut_Nums {
|
|
/* 0x3 */ NUM_EVT_CUTS_e = 0x3,
|
|
};
|
|
|
|
/* 80AF2B3C-80AF2B40 000054 0004+00 1/1 0/0 0/0 .bss l_HIO */
|
|
static NPC_SOLDIERA_HIO_CLASS l_HIO;
|
|
|
|
/* 80AF28A8-80AF28B8 000020 0010+00 1/1 0/0 0/0 .data l_bmdGetParamList */
|
|
static daNpc_GetParam1 l_bmdGetParamList[2] = {
|
|
{BMDR_SOLA_TW, CHTSOLA},
|
|
{BMDR_SOLA_SPEAR, CHTSOLA},
|
|
};
|
|
|
|
/* 80AF28B8-80AF28F0 000030 0038+00 1/1 0/0 0/0 .data l_bckGetParamList */
|
|
static daNpc_GetParam1 l_bckGetParamList[7] = {
|
|
{-1, CHTSOLA},
|
|
{BCK_SOLA_WAIT_A, CHTSOLA},
|
|
{BCK_SOLA_FEAR_WAIT, CHTSOLA},
|
|
{BCK_SOLA_FEAR_TALK, CHTSOLA},
|
|
{BCK_SOLA_WAIT, CHTSOLA},
|
|
{BCK_SOLA_TALK_A, CHTSOLA},
|
|
{BCK_SOLA_TALK_B, CHTSOLA},
|
|
};
|
|
|
|
/* 80AF28F0-80AF2900 000068 0010+00 0/2 0/0 0/0 .data l_evtGetParamList */
|
|
static daNpc_GetParam1 l_evtGetParamList[2] = {
|
|
{0, CHTSOLA},
|
|
{1, CHTSOLA},
|
|
};
|
|
|
|
/* 80AF2900-80AF2908 -00001 0008+00 0/2 0/0 0/0 .data l_evtNames */
|
|
static char* l_evtNames[2] = {
|
|
NULL,
|
|
"TALK_LAKE",
|
|
};
|
|
|
|
/* 80AF2908-80AF2914 000080 000C+00 1/0 0/0 0/0 .data l_loadRes_SOLDIERaa */
|
|
static int l_loadRes_SOLDIERaa[3] = {
|
|
CHTSOLA, -1, -1,
|
|
};
|
|
|
|
/* 80AF2914-80AF2920 00008C 000C+00 1/0 0/0 0/0 .data l_loadRes_SOLDIERa0 */
|
|
static int l_loadRes_SOLDIERa0[3] = {
|
|
CHTSOLA, -1, -1,
|
|
};
|
|
|
|
/* 80AF2920-80AF2930 -00001 0010+00 2/2 0/0 0/0 .data l_loadRes_list */
|
|
static int* l_loadRes_list[4] = {
|
|
l_loadRes_SOLDIERaa,
|
|
l_loadRes_SOLDIERaa,
|
|
l_loadRes_SOLDIERaa,
|
|
l_loadRes_SOLDIERa0,
|
|
};
|
|
|
|
/* 80AF2930-80AF2934 -00001 0004+00 4/6 0/0 0/0 .data l_resNames */
|
|
static char* l_resNames[1] = {"chtSolA"};
|
|
|
|
/* 80AF2934-80AF2938 -00001 0004+00 0/1 0/0 0/0 .data l_myName */
|
|
static char* l_myName = "chtSolA";
|
|
|
|
/* 80AF2938-80AF2944 -00001 000C+00 0/1 0/0 0/0 .data mEvtCutNameList__16daNpc_SoldierA_c */
|
|
char* daNpc_SoldierA_c::mEvtCutNameList[3] = {
|
|
"",
|
|
"TALK_LAKE",
|
|
"LISTEN_LAKE",
|
|
};
|
|
|
|
/* 80AF295C-80AF2980 0000D4 0024+00 0/2 0/0 0/0 .data mEvtCutList__16daNpc_SoldierA_c */
|
|
daNpc_SoldierA_c::cutFunc daNpc_SoldierA_c::mEvtCutList[3] = {
|
|
NULL,
|
|
&daNpc_SoldierA_c::ECut_talkLake,
|
|
&daNpc_SoldierA_c::ECut_listenLake,
|
|
};
|
|
|
|
/* 80AEF58C-80AEF710 0000EC 0184+00 1/1 0/0 0/0 .text __ct__16daNpc_SoldierA_cFv */
|
|
daNpc_SoldierA_c::daNpc_SoldierA_c() {}
|
|
|
|
/* 80AEF7A0-80AEF9A0 000300 0200+00 1/0 0/0 0/0 .text __dt__16daNpc_SoldierA_cFv */
|
|
daNpc_SoldierA_c::~daNpc_SoldierA_c() {
|
|
for (int i = 0; l_loadRes_list[mType][i] >= 0; i++) {
|
|
dComIfG_resDelete(&mPhases[i], l_resNames[l_loadRes_list[mType][i]]);
|
|
}
|
|
|
|
if (heap != NULL) {
|
|
mAnm_p->stopZelAnime();
|
|
}
|
|
|
|
#if DEBUG
|
|
if (mHIO != NULL) {
|
|
mHIO->removeHIO();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/* 80AF26E8-80AF2754 000000 006C+00 12/12 0/0 0/0 .rodata m__22daNpc_SoldierA_Param_c */
|
|
daNpc_SoldierA_HIOParam const daNpc_SoldierA_Param_c::m = {
|
|
30.0f,
|
|
-4.0f,
|
|
1.0f,
|
|
600.0f,
|
|
255.0f,
|
|
240.0f,
|
|
35.0f,
|
|
45.0f,
|
|
0.0f,
|
|
0.0f,
|
|
10.0f,
|
|
-10.0f,
|
|
30.0f,
|
|
-30.0f,
|
|
45.0f,
|
|
-45.0f,
|
|
0.6f,
|
|
12.0f,
|
|
5,
|
|
6,
|
|
7,
|
|
6,
|
|
180.0f,
|
|
500.0f,
|
|
300.0f,
|
|
-300.0f,
|
|
60,
|
|
8,
|
|
0,
|
|
0,
|
|
0,
|
|
false,
|
|
false,
|
|
};
|
|
|
|
/* 80AEF9A0-80AEFC80 000500 02E0+00 1/1 0/0 0/0 .text create__16daNpc_SoldierA_cFv */
|
|
cPhs__Step daNpc_SoldierA_c::create() {
|
|
mTwilight = dKy_darkworld_check();
|
|
|
|
fopAcM_ct(this, daNpc_SoldierA_c);
|
|
|
|
mType = getTypeFromParam();
|
|
|
|
if (home.angle.x != 0xFFFF) {
|
|
mMsgNo = home.angle.x;
|
|
} else {
|
|
mMsgNo = -1;
|
|
}
|
|
|
|
if (isDelete()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
int res_count = 0;
|
|
int i = 0;
|
|
for (; l_loadRes_list[mType][i] >= 0; i++) {
|
|
cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&mPhases[i], l_resNames[l_loadRes_list[mType][i]]);
|
|
if (phase == cPhs_ERROR_e || phase == cPhs_UNK3_e) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
res_count++;
|
|
}
|
|
}
|
|
|
|
if (res_count == i) {
|
|
if (!fopAcM_entrySolidHeap(this, createHeapCallBack, 0x2B20)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
J3DModelData* modelData = mAnm_p->getModel()->getModelData();
|
|
fopAcM_SetMtx(this, mAnm_p->getModel()->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox(this, -300.0f, -50.0f, -300.0f, 300.0f, 450.0f, 300.0f);
|
|
mSound.init(¤t.pos, &eyePos, 3, 1);
|
|
|
|
#if DEBUG
|
|
mHIO = &l_HIO;
|
|
mHIO->entryHIO("多人数会話兵士A");
|
|
#endif
|
|
|
|
mAcchCir.SetWall(mHIO->m.common.width, mHIO->m.common.knee_length);
|
|
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));
|
|
mCcStts.Init(mHIO->m.common.weight, 0, this);
|
|
mCyl.Set(mCcDCyl);
|
|
mCyl.SetStts(&mCcStts);
|
|
mCyl.SetTgHitCallback(tgHitCallBack);
|
|
mAcch.CrrPos(dComIfG_Bgsp());
|
|
mGndChk = mAcch.m_gnd;
|
|
mGroundH = mAcch.GetGroundH();
|
|
|
|
setEnvTevColor();
|
|
setRoomNo();
|
|
reset();
|
|
Execute();
|
|
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
return cPhs_INIT_e;
|
|
}
|
|
|
|
/* 80AEFC80-80AEFE4C 0007E0 01CC+00 1/1 0/0 0/0 .text CreateHeap__16daNpc_SoldierA_cFv */
|
|
int daNpc_SoldierA_c::CreateHeap() {
|
|
J3DModelData* mdlData_p = NULL;
|
|
J3DModel* model = NULL;
|
|
|
|
if (l_bmdGetParamList[0].fileIdx >= 0) {
|
|
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNames[l_bmdGetParamList[0].arcIdx], l_bmdGetParamList[0].fileIdx);
|
|
}
|
|
|
|
JUT_ASSERT(413, NULL != mdlData_p);
|
|
|
|
u32 uVar1 = 0x11020284;
|
|
mAnm_p = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, J3DMdlFlag_DifferedDLBuffer, uVar1);
|
|
if (mAnm_p != NULL && mAnm_p->getModel() == NULL) {
|
|
mAnm_p->stopZelAnime();
|
|
mAnm_p = NULL;
|
|
}
|
|
|
|
if (mAnm_p == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
model = mAnm_p->getModel();
|
|
for (u16 i = 0; i < mdlData_p->getJointNum(); i++) {
|
|
mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack);
|
|
}
|
|
model->setUserArea((uintptr_t)this);
|
|
|
|
setMotionAnm(ANM_WAIT, 0.0f);
|
|
|
|
int arcIdx = 0;
|
|
arcIdx = l_bmdGetParamList[1].arcIdx;
|
|
mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resNames[arcIdx], l_bmdGetParamList[1].fileIdx);
|
|
if (mdlData_p != NULL) {
|
|
mSpearModel = mDoExt_J3DModel__create(mdlData_p, J3DMdlFlag_DifferedDLBuffer, 0x11000084);
|
|
if (mSpearModel == NULL) {
|
|
return 0;
|
|
}
|
|
} else {
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80AEFE4C-80AEFE80 0009AC 0034+00 1/1 0/0 0/0 .text Delete__16daNpc_SoldierA_cFv */
|
|
int daNpc_SoldierA_c::Delete() {
|
|
fpc_ProcID id = fopAcM_GetID(this);
|
|
this->~daNpc_SoldierA_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 80AEFE80-80AEFEA0 0009E0 0020+00 2/2 0/0 0/0 .text Execute__16daNpc_SoldierA_cFv */
|
|
int daNpc_SoldierA_c::Execute() {
|
|
return execute();
|
|
}
|
|
|
|
/* 80AEFEA0-80AEFF14 000A00 0074+00 1/1 0/0 0/0 .text Draw__16daNpc_SoldierA_cFv */
|
|
int daNpc_SoldierA_c::Draw() {
|
|
return draw(chkAction(&daNpc_SoldierA_c::test), FALSE, mHIO->m.common.real_shadow_size, NULL, FALSE);
|
|
}
|
|
|
|
/* 80AEFF14-80AF0110 000A74 01FC+00 1/1 0/0 0/0 .text ctrlJoint__16daNpc_SoldierA_cFP8J3DJointP8J3DModel */
|
|
int daNpc_SoldierA_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
|
|
int jntNo = i_joint->getJntNo();
|
|
int i_jointList[3] = {JNT_BACKBONE1, JNT_NECK, JNT_HEAD};
|
|
|
|
if (jntNo == JNT_CENTER) {
|
|
mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_BACKBONE1));
|
|
mDoMtx_stack_c::multVecZero(&mLookatPos[0]);
|
|
mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_NECK));
|
|
mDoMtx_stack_c::multVecZero(&mLookatPos[1]);
|
|
mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_HEAD));
|
|
mDoMtx_stack_c::multVecZero(&mLookatPos[2]);
|
|
}
|
|
|
|
mDoMtx_stack_c::copy(i_model->getAnmMtx(jntNo));
|
|
|
|
switch (jntNo) {
|
|
case JNT_BACKBONE1:
|
|
case JNT_NECK:
|
|
case JNT_HEAD:
|
|
setLookatMtx(jntNo, i_jointList, mHIO->m.common.neck_rotation_ratio);
|
|
break;
|
|
}
|
|
|
|
if (jntNo == JNT_BACKBONE1) {
|
|
mDoMtx_stack_c::YrotM(-field_0x908[0].z);
|
|
mDoMtx_stack_c::ZrotM(field_0x908[0].x);
|
|
} else if (jntNo == JNT_HEAD) {
|
|
mDoMtx_stack_c::YrotM(-field_0x908[2].z);
|
|
mDoMtx_stack_c::ZrotM(field_0x908[2].x);
|
|
}
|
|
|
|
i_model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80AF0110-80AF0130 000C70 0020+00 1/1 0/0 0/0 .text createHeapCallBack__16daNpc_SoldierA_cFP10fopAc_ac_c */
|
|
int daNpc_SoldierA_c::createHeapCallBack(fopAc_ac_c* i_this) {
|
|
daNpc_SoldierA_c* actor = (daNpc_SoldierA_c*)i_this;
|
|
return actor->CreateHeap();
|
|
}
|
|
|
|
/* 80AF0130-80AF017C 000C90 004C+00 1/1 0/0 0/0 .text ctrlJointCallBack__16daNpc_SoldierA_cFP8J3DJointi */
|
|
int daNpc_SoldierA_c::ctrlJointCallBack(J3DJoint* i_joint, int param_2) {
|
|
if (param_2 == 0) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daNpc_SoldierA_c* actor = (daNpc_SoldierA_c*)model->getUserArea();
|
|
if (actor != NULL) {
|
|
actor->ctrlJoint(i_joint, model);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80AF017C-80AF02B0 000CDC 0134+00 1/0 0/0 0/0 .text setParam__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::setParam() {
|
|
actionFunc action = mNextAction;
|
|
u32 flags = fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e;
|
|
|
|
selectAction();
|
|
|
|
if (mNextAction != action) {
|
|
/* Bug??? - Loop never actually runs */
|
|
for (int i = 3; i < 3; i++) {
|
|
mActorMngrs[i].initialize();
|
|
}
|
|
}
|
|
|
|
field_0xe00 = 0;
|
|
field_0xe04 = 0;
|
|
|
|
s16 talk_distance, talk_angle, attention_distance, attention_angle;
|
|
attention_distance = 3;
|
|
attention_angle = 6;
|
|
talk_distance = 5;
|
|
talk_angle = 6;
|
|
|
|
if (mType == 1 || mType == 2) {
|
|
flags = 0;
|
|
}
|
|
|
|
attention_info.distances[fopAc_attn_LOCK_e] = getDistTableIdx(talk_distance, talk_angle);
|
|
attention_info.distances[fopAc_attn_TALK_e] = attention_info.distances[fopAc_attn_LOCK_e];
|
|
attention_info.distances[fopAc_attn_SPEAK_e] = getDistTableIdx(attention_distance, attention_angle);
|
|
attention_info.flags = flags;
|
|
scale.set(mHIO->m.common.scale, mHIO->m.common.scale, mHIO->m.common.scale);
|
|
mAcchCir.SetWallR(mHIO->m.common.width);
|
|
mAcchCir.SetWallH(mHIO->m.common.knee_length);
|
|
|
|
if (!dComIfGp_event_runCheck()) {
|
|
gravity = mHIO->m.common.gravity;
|
|
}
|
|
}
|
|
|
|
/* 80AF02B0-80AF0428 000E10 0178+00 1/0 0/0 0/0 .text main__16daNpc_SoldierA_cFv */
|
|
BOOL daNpc_SoldierA_c::main() {
|
|
if (!doEvent()) {
|
|
doNormalAction(1);
|
|
}
|
|
|
|
if (checkHide()) {
|
|
attention_info.flags = 0;
|
|
}
|
|
|
|
if (!mHIO->m.common.debug_mode_ON) {
|
|
if (!dComIfGp_event_runCheck() || (mOrderNewEvt && dComIfGp_getEvent().isOrderOK())) {
|
|
if (mOrderEvtNo != EVT_NONE) {
|
|
eventInfo.setArchiveName(l_resNames[l_evtGetParamList[mOrderEvtNo].arcIdx]);
|
|
}
|
|
|
|
orderEvent(mOrderSpeakEvt, l_evtNames[l_evtGetParamList[mOrderEvtNo].fileIdx], 0xFFFF, 0x28, 0xFF, 1);
|
|
}
|
|
}
|
|
|
|
if (field_0x9ee) {
|
|
mExpressionMorfOverride = 0.0f;
|
|
mMotionMorfOverride = 0.0f;
|
|
field_0x9ee = false;
|
|
}
|
|
|
|
playMotion();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80AF0428-80AF0430 000F88 0008+00 1/0 0/0 0/0 .text ctrlBtk__16daNpc_SoldierA_cFv */
|
|
BOOL daNpc_SoldierA_c::ctrlBtk() {
|
|
return FALSE;
|
|
}
|
|
|
|
/* 80AF0430-80AF0928 000F90 04F8+00 1/0 0/0 0/0 .text setAttnPos__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::setAttnPos() {
|
|
static cXyz eyeOffset(0.0f, 20.0f, 0.0f);
|
|
cXyz sp74, sp80, sp8c, sp98;
|
|
f32 attn_offset = mHIO->m.common.attention_offset;
|
|
|
|
mDoMtx_stack_c::YrotS(field_0x990);
|
|
cLib_addCalc2(&field_0x984[0], 0.0f, 0.1f, 125.0f);
|
|
cLib_addCalc2(&field_0x984[2], 0.0f, 0.1f, 125.0f);
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
sp8c.set(0.0f, 0.0f, field_0x984[i] * cM_ssin(field_0x992));
|
|
mDoMtx_stack_c::multVec(&sp8c, &sp98);
|
|
field_0x908[i].x = -sp98.z;
|
|
field_0x908[i].z = -sp98.x;
|
|
}
|
|
|
|
cLib_chaseS(&field_0x992, 0, 0x555);
|
|
|
|
if (mLookMode == LOOK_RESET) {
|
|
for (int i = 0; i < 3; i++) {
|
|
mLookatAngle[i].setall(0);
|
|
}
|
|
}
|
|
|
|
setMtx();
|
|
lookat();
|
|
|
|
mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_HEAD));
|
|
mDoMtx_stack_c::multVecZero(&mHeadPos);
|
|
mDoMtx_stack_c::multVec(&eyeOffset, &eyePos);
|
|
mDoMtx_stack_c::multVec(&eyeOffset, &sp8c);
|
|
mHeadAngle.x = cLib_targetAngleX(&mHeadPos, &sp8c);
|
|
mHeadAngle.y = cLib_targetAngleY(&mHeadPos, &sp8c);
|
|
|
|
cXyz* attn_pos = mLookat.getAttnPos();
|
|
if (attn_pos != NULL) {
|
|
sp80 = *attn_pos - eyePos;
|
|
mEyeAngle.y = -(mLookatAngle[2].y + mCurAngle.y);
|
|
mEyeAngle.y += cM_atan2s(sp80.x, sp80.z);
|
|
mEyeAngle.x = -cM_atan2s(sp80.y, sp80.absXZ());
|
|
mEyeAngle.x += mHeadAngle.x;
|
|
} else {
|
|
mEyeAngle.y = 0;
|
|
mEyeAngle.x = 0;
|
|
}
|
|
|
|
f32 fVar2 = 0.0f;
|
|
f32 fVar3 = 0.0f;
|
|
f32 fVar4 = 0.0f;
|
|
sp80.set(0.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(mCurAngle.x, mCurAngle.y, mCurAngle.z);
|
|
mDoMtx_stack_c::multVec(&sp80, &sp74);
|
|
attention_info.position.set(mHeadPos.x, mHeadPos.y + attn_offset, mHeadPos.z);
|
|
|
|
if (!mHide) {
|
|
if (!mIsDamaged) {
|
|
mCyl.SetTgType(0xD8FBFDFF);
|
|
mCyl.SetTgSPrm(0x1F);
|
|
mCyl.OnTgNoHitMark();
|
|
} else {
|
|
mCyl.SetTgType(0);
|
|
mCyl.SetTgSPrm(0);
|
|
}
|
|
|
|
mCyl.SetC(sp74);
|
|
mCyl.SetH(mHIO->m.common.height + fVar3);
|
|
mCyl.SetR(mHIO->m.common.width + fVar4);
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
mCyl.ClrTgHit();
|
|
}
|
|
|
|
/* 80AF0928-80AF0A38 001488 0110+00 1/0 0/0 0/0 .text setMotionAnm__16daNpc_SoldierA_cFif */
|
|
void daNpc_SoldierA_c::setMotionAnm(int i_idx, f32 i_morf) {
|
|
J3DAnmTransformKey* anm = NULL;
|
|
int attr = J3DFrameCtrl::EMode_LOOP;
|
|
|
|
mAnmFlags &= ~ANM_MOTION_FLAGS;
|
|
|
|
if (l_bckGetParamList[i_idx].fileIdx >= 0) {
|
|
anm = getTrnsfrmKeyAnmP(l_resNames[l_bckGetParamList[i_idx].arcIdx], l_bckGetParamList[i_idx].fileIdx);
|
|
}
|
|
|
|
mAnm = i_idx;
|
|
|
|
switch (i_idx) {
|
|
case ANM_WAIT_A:
|
|
case ANM_FEAR_WAIT:
|
|
break;
|
|
|
|
case ANM_FEAR_TALK:
|
|
case ANM_TALK_A:
|
|
case ANM_TALK_B:
|
|
attr = J3DFrameCtrl::EMode_NONE;
|
|
break;
|
|
|
|
case ANM_WAIT:
|
|
break;
|
|
|
|
default:
|
|
anm = NULL;
|
|
break;
|
|
}
|
|
|
|
if (anm != NULL && setMcaMorfAnm(anm, 1.0f, i_morf, attr, 0, -1)) {
|
|
mAnmFlags |= ANM_PLAY_MORF | ANM_PAUSE_MORF;
|
|
mMotionLoops = 0;
|
|
}
|
|
}
|
|
|
|
/* 80AF0A38-80AF0A7C 001598 0044+00 1/0 0/0 0/0 .text setMotion__16daNpc_SoldierA_cFifi */
|
|
void daNpc_SoldierA_c::setMotion(int i_motion, f32 i_morf, int param_3) {
|
|
s16 motion = i_motion;
|
|
if ((param_3 != 0 || mMotion != motion) && i_motion >= 0 && i_motion < 6) {
|
|
mMotion = motion;
|
|
mMotionMorfOverride = i_morf;
|
|
mMotionPrevPhase = -1;
|
|
mMotionPhase = 0;
|
|
}
|
|
}
|
|
|
|
/* 80AF0A7C-80AF0A84 0015DC 0008+00 1/0 0/0 0/0 .text drawDbgInfo__16daNpc_SoldierA_cFv */
|
|
int daNpc_SoldierA_c::drawDbgInfo() {
|
|
#if DEBUG
|
|
if (mHIO->m.common.debug_info_ON) {
|
|
cXyz i_end;
|
|
f32 i_radius1 = dComIfGp_getAttention()->getDistTable(attention_info.distances[fopAc_attn_SPEAK_e]).mDistMax;
|
|
f32 i_radius2 = dComIfGp_getAttention()->getDistTable(attention_info.distances[fopAc_attn_TALK_e]).mDistMax;
|
|
s16 angle_x = cLib_targetAngleX(¤t.pos, &eyePos);
|
|
s16 angle_y = cLib_targetAngleY(¤t.pos, &eyePos);
|
|
|
|
dDbVw_drawCircleOpa(attention_info.position, i_radius1, (GXColor){0x00, 0xC8, 0x00, 0xFF}, 1, 12);
|
|
dDbVw_drawCircleOpa(attention_info.position, i_radius2, (GXColor){0xC8, 0x00, 0x00, 0xFF}, 1, 12);
|
|
|
|
if (mHIO->m.common.fov != 180.0f) {
|
|
cXyz work(0.0f, 0.0f, mHIO->m.common.search_distance);
|
|
mDoMtx_stack_c::transS(attention_info.position);
|
|
mDoMtx_stack_c::YrotM(mHeadAngle.y);
|
|
mDoMtx_stack_c::YrotM(cM_deg2s(-mHIO->m.common.fov));
|
|
mDoMtx_stack_c::multVec(&work, &i_end);
|
|
|
|
dDbVw_drawLineOpa(attention_info.position, i_end, (GXColor){0x00, 0x00, 0xC8, 0xFF}, 1, 12);
|
|
|
|
mDoMtx_stack_c::transS(attention_info.position);
|
|
mDoMtx_stack_c::YrotM(mHeadAngle.y);
|
|
mDoMtx_stack_c::YrotM(cM_deg2s(mHIO->m.common.fov));
|
|
mDoMtx_stack_c::multVec(&work, &i_end);
|
|
|
|
dDbVw_drawLineOpa(attention_info.position, i_end, (GXColor){0x00, 0x00, 0xC8, 0xFF}, 1, 12);
|
|
}
|
|
|
|
dDbVw_drawCircleOpa(attention_info.position, mHIO->m.common.search_distance, (GXColor){0x00, 0x00, 0xC8, 0xFF}, 1, 12);
|
|
dDbVw_drawSphereXlu(eyePos, 18.0f, (GXColor){0x80, 0x80, 0x80, 0xA0}, 1);
|
|
dDbVw_drawSphereXlu(mLookPos, 18.0f, (GXColor){0x80, 0x80, 0x80, 0xA0}, 1);
|
|
|
|
int idx = getDistTableIdx(field_0xe00, field_0xe04);
|
|
dist_entry& entry = dComIfGp_getAttention()->getDistTable(idx);
|
|
dDbVw_drawCircleOpa(attention_info.position, entry.mDistMax, (GXColor){0xC8, 0xC8, 0xC8, 0xFF}, 1, 12);
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 80AF0A84-80AF0B30 0015E4 00AC+00 1/0 0/0 0/0 .text drawOtherMdls__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::drawOtherMdls() {
|
|
g_env_light.setLightTevColorType_MAJI(mSpearModel, &tevStr);
|
|
mDoMtx_stack_c::copy(mAnm_p->getModel()->getAnmMtx(JNT_HANDR));
|
|
mDoMtx_stack_c::scaleM(scale);
|
|
mSpearModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
J3DModelData* mdlData_p = mSpearModel->getModelData();
|
|
fopAcM_setEffectMtx(this, mdlData_p);
|
|
mDoExt_modelUpdateDL(mSpearModel);
|
|
dComIfGd_addRealShadow(mShadowKey, mSpearModel);
|
|
}
|
|
|
|
/* 80AF0B30-80AF0B7C 001690 004C+00 1/1 0/0 0/0 .text getTypeFromParam__16daNpc_SoldierA_cFv */
|
|
u8 daNpc_SoldierA_c::getTypeFromParam() {
|
|
u8 param = fopAcM_GetParam(this) & 0xFF;
|
|
switch (param) {
|
|
case 0:
|
|
return 0;
|
|
|
|
case 1:
|
|
return 1;
|
|
|
|
case 2:
|
|
return 2;
|
|
|
|
default:
|
|
return 3;
|
|
}
|
|
}
|
|
|
|
/* 80AF0B7C-80AF0BB0 0016DC 0034+00 1/1 0/0 0/0 .text isDelete__16daNpc_SoldierA_cFv */
|
|
BOOL daNpc_SoldierA_c::isDelete() {
|
|
if (mType == 0 || mType == 1 || mType == 2 || mType == 3) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80AF0BB0-80AF0D34 001710 0184+00 1/1 0/0 0/0 .text reset__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::reset() {
|
|
initialize();
|
|
mLookat.initialize();
|
|
for (int i = 0; i < 3; i++) {
|
|
mActorMngrs[i].initialize();
|
|
}
|
|
|
|
mNextAction = NULL;
|
|
mAction = NULL;
|
|
field_0xe00 = 0;
|
|
field_0xe04 = 0;
|
|
field_0xe08 = 0;
|
|
field_0xe0c = 0;
|
|
mLookMode = -1;
|
|
mMode = 0;
|
|
current.pos = home.pos;
|
|
old.pos = current.pos;
|
|
current.angle.set(0, home.angle.y, 0);
|
|
old.angle = current.angle;
|
|
shape_angle = current.angle;
|
|
mCurAngle = current.angle;
|
|
mOldAngle = mCurAngle;
|
|
speedF = 0.0f;
|
|
speed.setall(0.0f);
|
|
eventInfo.setIdx(mType + 1);
|
|
field_0x9ee = true;
|
|
}
|
|
|
|
/* 80AF0D34-80AF0F50 001894 021C+00 1/1 0/0 0/0 .text playMotion__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::playMotion() {
|
|
daNpcF_anmPlayData dat0 = {ANM_WAIT, mHIO->m.common.morf_frame, 0};
|
|
daNpcF_anmPlayData* pDat0[1] = {&dat0};
|
|
daNpcF_anmPlayData dat1a = {ANM_TALK_B, mHIO->m.common.morf_frame, 1};
|
|
daNpcF_anmPlayData dat1b = {ANM_WAIT, 0.0f, 0};
|
|
daNpcF_anmPlayData* pDat1[2] = {&dat1a, &dat1b};
|
|
daNpcF_anmPlayData dat2a = {ANM_TALK_A, mHIO->m.common.morf_frame, 1};
|
|
daNpcF_anmPlayData dat2b = {ANM_WAIT, 0.0f, 0};
|
|
daNpcF_anmPlayData* pDat2[2] = {&dat2a, &dat2b};
|
|
daNpcF_anmPlayData dat3 = {ANM_FEAR_WAIT, mHIO->m.common.morf_frame, 0};
|
|
daNpcF_anmPlayData* pDat3[1] = {&dat3};
|
|
daNpcF_anmPlayData dat4a = {ANM_FEAR_TALK, mHIO->m.common.morf_frame, 1};
|
|
daNpcF_anmPlayData dat4b = {ANM_FEAR_WAIT, 0.0f, 0};
|
|
daNpcF_anmPlayData* pDat4[2] = {&dat4a, &dat4b};
|
|
daNpcF_anmPlayData dat5 = {ANM_WAIT_A, mHIO->m.common.morf_frame, 0};
|
|
daNpcF_anmPlayData* pDat5[1] = {&dat5};
|
|
|
|
daNpcF_anmPlayData** ppDat[6] = {
|
|
pDat0,
|
|
pDat1,
|
|
pDat2,
|
|
pDat3,
|
|
pDat4,
|
|
pDat5
|
|
};
|
|
|
|
if (mMotion >= 0 && mMotion < 6) {
|
|
playMotionAnm(ppDat);
|
|
}
|
|
}
|
|
|
|
/* 80AF0F50-80AF0F7C 001AB0 002C+00 2/2 0/0 0/0 .text chkAction__16daNpc_SoldierA_cFM16daNpc_SoldierA_cFPCvPvPv_i */
|
|
BOOL daNpc_SoldierA_c::chkAction(actionFunc action) {
|
|
return mAction == action;
|
|
}
|
|
|
|
/* 80AF0F7C-80AF1024 001ADC 00A8+00 2/2 0/0 0/0 .text setAction__16daNpc_SoldierA_cFM16daNpc_SoldierA_cFPCvPvPv_i */
|
|
BOOL daNpc_SoldierA_c::setAction(actionFunc action) {
|
|
mMode = 3;
|
|
|
|
if (mAction) {
|
|
(this->*mAction)(NULL);
|
|
}
|
|
|
|
mMode = 0;
|
|
mAction = action;
|
|
|
|
if (mAction) {
|
|
(this->*mAction)(NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80AF1024-80AF10A4 001B84 0080+00 1/1 0/0 0/0 .text selectAction__16daNpc_SoldierA_cFv */
|
|
BOOL daNpc_SoldierA_c::selectAction() {
|
|
mNextAction = NULL;
|
|
|
|
if (mHIO->m.common.debug_mode_ON) {
|
|
mNextAction = &daNpc_SoldierA_c::test;
|
|
} else {
|
|
mNextAction = &daNpc_SoldierA_c::wait;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80AF10A4-80AF11B8 001C04 0114+00 1/1 0/0 0/0 .text doNormalAction__16daNpc_SoldierA_cFi */
|
|
void daNpc_SoldierA_c::doNormalAction(int param_1) {
|
|
if (param_1 != 0 && hitChk2(&mCyl, TRUE, FALSE)) {
|
|
int damage_time = mCutType == daPy_py_c::CUT_TYPE_TURN_RIGHT ? 20 : mHIO->m.common.damage_time;
|
|
setDamage(damage_time, -1, 0);
|
|
setLookMode(LOOK_RESET);
|
|
} else if (mIsDamaged && mDamageTimer == 0) {
|
|
mMode = 0;
|
|
mIsDamaged = false;
|
|
}
|
|
|
|
mOrderEvtNo = EVT_NONE;
|
|
if (mNextAction) {
|
|
if (mAction == mNextAction) {
|
|
(this->*mAction)(NULL);
|
|
} else {
|
|
setAction(mNextAction);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80AF11B8-80AF1488 001D18 02D0+00 1/1 0/0 0/0 .text doEvent__16daNpc_SoldierA_cFv */
|
|
BOOL daNpc_SoldierA_c::doEvent() {
|
|
int unused = 0;
|
|
BOOL rv = FALSE;
|
|
|
|
if (dComIfGp_event_runCheck() != FALSE) {
|
|
dEvent_manager_c& event_manager = dComIfGp_getEventManager();
|
|
|
|
if (eventInfo.checkCommandTalk() || eventInfo.checkCommandDemoAccrpt()) {
|
|
mOrderNewEvt = false;
|
|
}
|
|
|
|
if (eventInfo.checkCommandTalk()) {
|
|
if (chkAction(&daNpc_SoldierA_c::talk)) {
|
|
(this->*mAction)(NULL);
|
|
} else if (dComIfGp_event_chkTalkXY() == FALSE || dComIfGp_evmng_ChkPresentEnd()) {
|
|
if (mType == 0) {
|
|
mOrderEvtNo = EVT_TALK_LAKE;
|
|
changeEvent(l_resNames[l_evtGetParamList[mOrderEvtNo].arcIdx], l_evtNames[l_evtGetParamList[mOrderEvtNo].fileIdx], 2, 0xFFFF);
|
|
} else {
|
|
setAction(&daNpc_SoldierA_c::talk);
|
|
}
|
|
}
|
|
|
|
rv = TRUE;
|
|
} else {
|
|
int staffId = event_manager.getMyStaffId(l_myName, this, 0);
|
|
if (staffId != -1) {
|
|
mStaffID = staffId;
|
|
int evtCutNo = event_manager.getMyActIdx(staffId, mEvtCutNameList, 3, FALSE, FALSE);
|
|
JUT_ASSERT(1410, (0 <= evtCutNo) && (evtCutNo < NUM_EVT_CUTS_e));
|
|
JUT_ASSERT(1411, NULL != mEvtCutList[evtCutNo]);
|
|
|
|
if ((this->*mEvtCutList[evtCutNo])(staffId)) {
|
|
event_manager.cutEnd(staffId);
|
|
}
|
|
|
|
rv = TRUE;
|
|
}
|
|
|
|
if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && event_manager.endCheck(mEventIdx)) {
|
|
dComIfGp_event_reset();
|
|
mOrderEvtNo = EVT_NONE;
|
|
mEventIdx = -1;
|
|
}
|
|
}
|
|
|
|
int i_expression, i_motion;
|
|
int msgTimer = mMsgTimer;
|
|
if (ctrlMsgAnm(i_expression, i_motion, this, FALSE)) {
|
|
if (!field_0x9eb) {
|
|
setMotion(i_motion, -1.0f, 0);
|
|
}
|
|
}
|
|
#if DEBUG
|
|
else if (msgTimer != 0) {
|
|
rv = ((field_0x9eb & 0xFF) == false);
|
|
}
|
|
#endif
|
|
} else {
|
|
mMsgTimer = 0;
|
|
|
|
if (mStaffID != -1) {
|
|
mAction = NULL;
|
|
mStaffID = -1;
|
|
}
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80AF1488-80AF14AC 001FE8 0024+00 4/4 0/0 0/0 .text setLookMode__16daNpc_SoldierA_cFi */
|
|
void daNpc_SoldierA_c::setLookMode(int i_lookMode) {
|
|
if (i_lookMode >= 0 && i_lookMode < 5 && i_lookMode != mLookMode) {
|
|
mLookMode = i_lookMode;
|
|
}
|
|
}
|
|
|
|
/* 80AF14AC-80AF1734 00200C 0288+00 1/1 0/0 0/0 .text lookat__16daNpc_SoldierA_cFv */
|
|
void daNpc_SoldierA_c::lookat() {
|
|
daPy_py_c* player = NULL;
|
|
J3DModel* model = mAnm_p->getModel();
|
|
BOOL i_snap = FALSE;
|
|
f32 body_angleX_min = mHIO->m.common.body_angleX_min;
|
|
f32 body_angleX_max = mHIO->m.common.body_angleX_max;
|
|
f32 body_angleY_min = mHIO->m.common.body_angleY_min;
|
|
f32 body_angleY_max = mHIO->m.common.body_angleY_max;
|
|
f32 head_angleX_min = mHIO->m.common.head_angleX_min;
|
|
f32 head_angleX_max = mHIO->m.common.head_angleX_max;
|
|
f32 head_angleY_min = mHIO->m.common.head_angleY_min;
|
|
f32 head_angleY_max = mHIO->m.common.head_angleY_max;
|
|
s16 angle_delta = mCurAngle.y - mOldAngle.y;
|
|
cXyz lookatPos[3] = {mLookatPos[0], mLookatPos[1], mLookatPos[2]};
|
|
csXyz* lookatAngle[3] = {&mLookatAngle[0], &mLookatAngle[1], &mLookatAngle[2]};
|
|
cXyz spe8;
|
|
|
|
switch (mLookMode) {
|
|
case LOOK_NONE:
|
|
break;
|
|
|
|
case LOOK_RESET:
|
|
i_snap = TRUE;
|
|
break;
|
|
|
|
case LOOK_PLAYER:
|
|
case LOOK_PLAYER_TALK:
|
|
player = daPy_getPlayerActorClass();
|
|
|
|
if (mLookMode == LOOK_PLAYER_TALK) {
|
|
head_angleY_min = -80.0f;
|
|
head_angleY_max = 80.0f;
|
|
}
|
|
break;
|
|
|
|
case LOOK_ACTOR:
|
|
player = (daPy_py_c*)mActorMngrs[1].getActorP();
|
|
break;
|
|
}
|
|
|
|
if (player != NULL) {
|
|
mLookPos = player->attention_info.position;
|
|
|
|
if (mLookMode != LOOK_PLAYER && mLookMode != LOOK_PLAYER_TALK && mLookMode != LOOK_ACTOR) {
|
|
mLookPos.y -= 40.0f;
|
|
}
|
|
|
|
mLookat.setAttnPos(&mLookPos);
|
|
} else {
|
|
mLookat.setAttnPos(NULL);
|
|
}
|
|
|
|
mLookat.setParam(body_angleX_min, body_angleX_max, body_angleY_min, body_angleY_max,
|
|
0.0f, 0.0f, 0.0f, 0.0f,
|
|
head_angleX_min, head_angleX_max, head_angleY_min, head_angleY_max,
|
|
mCurAngle.y, lookatPos);
|
|
mLookat.calc(this, model->getBaseTRMtx(), lookatAngle, i_snap, angle_delta, FALSE);
|
|
}
|
|
|
|
/* 80AF1734-80AF18B0 002294 017C+00 1/0 0/0 0/0 .text wait__16daNpc_SoldierA_cFPv */
|
|
int daNpc_SoldierA_c::wait(void* param_1) {
|
|
switch (mMode) {
|
|
case 0:
|
|
setMotion(MOT_WAIT, -1.0f, 0);
|
|
setLookMode(LOOK_NONE);
|
|
mTurnMode = 0;
|
|
field_0x9ea = true;
|
|
mMode = 2;
|
|
// fallthrough
|
|
case 2:
|
|
if (!mIsDamaged) {
|
|
if (mActorMngrs[0].getActorP() != NULL) {
|
|
setLookMode(LOOK_PLAYER);
|
|
} else {
|
|
setLookMode(LOOK_NONE);
|
|
|
|
if (home.angle.y != mCurAngle.y && step(home.angle.y, -1, -1, 15)) {
|
|
mMode = 0;
|
|
}
|
|
}
|
|
|
|
if (home.angle.y == mCurAngle.y) {
|
|
BOOL player_attn = mActorMngrs[0].getActorP() != NULL;
|
|
fopAc_ac_c* actor = getAttnActorP(player_attn, srchAttnActor1, mHIO->m.common.search_distance, mHIO->m.common.search_height,
|
|
mHIO->m.common.search_depth, mHIO->m.common.fov, shape_angle.y, 120, TRUE);
|
|
if (actor != NULL) {
|
|
mActorMngrs[1].entry(actor);
|
|
setLookMode(LOOK_ACTOR);
|
|
}
|
|
} else {
|
|
mAttnChangeTimer = 0;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80AF18B0-80AF1A48 002410 0198+00 2/0 0/0 0/0 .text talk__16daNpc_SoldierA_cFPv */
|
|
int daNpc_SoldierA_c::talk(void* param_1) {
|
|
int rv = 0;
|
|
BOOL unkFlag = FALSE;
|
|
|
|
switch (mMode) {
|
|
case 0: {
|
|
if (mIsDamaged) {
|
|
break;
|
|
}
|
|
|
|
int msgNo = mMsgNo;
|
|
mOrderSpeakEvt = false;
|
|
initTalk(msgNo, NULL);
|
|
mTurnMode = 0;
|
|
mMode = 2;
|
|
// fallthrough
|
|
}
|
|
case 2:
|
|
if (field_0x9ea) {
|
|
unkFlag = TRUE;
|
|
} else {
|
|
setLookMode(LOOK_PLAYER_TALK);
|
|
mActorMngrs[0].entry(daPy_getPlayerActorClass());
|
|
|
|
if (mCurAngle.y == fopAcM_searchPlayerAngleY(this)) {
|
|
unkFlag = TRUE;
|
|
} else if (step(fopAcM_searchPlayerAngleY(this), -1, -1, 15)) {
|
|
setMotion(MOT_WAIT, -1.0f, 0);
|
|
mTurnMode = 0;
|
|
}
|
|
}
|
|
|
|
if (unkFlag && talkProc(NULL, TRUE, NULL)) {
|
|
rv = 1;
|
|
}
|
|
|
|
if (rv) {
|
|
mMode = 3;
|
|
|
|
if (!field_0x9ec) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
|
|
field_0x9ec = false;
|
|
}
|
|
break;
|
|
|
|
case 3:
|
|
break;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80AF1A48-80AF1B8C 0025A8 0144+00 1/0 0/0 0/0 .text ECut_talkLake__16daNpc_SoldierA_cFi */
|
|
int daNpc_SoldierA_c::ECut_talkLake(int i_staffId) {
|
|
dEvent_manager_c& eventManager = dComIfGp_getEventManager();
|
|
int unused = 0;
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
int rv = 0;
|
|
int* piVar1 = NULL;
|
|
int prm = -1;
|
|
int unused2 = 0;
|
|
|
|
piVar1 = dComIfGp_evmng_getMyIntegerP(i_staffId, "prm");
|
|
if (piVar1 != NULL) {
|
|
prm = *piVar1;
|
|
}
|
|
|
|
if (eventManager.getIsAddvance(i_staffId)) {
|
|
switch (prm) {
|
|
case 0:
|
|
break;
|
|
|
|
case 10:
|
|
initTalk(mMsgNo, NULL);
|
|
break;
|
|
|
|
case 20:
|
|
initTalk(mMsgNo, NULL);
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (prm) {
|
|
case 0:
|
|
rv = 1;
|
|
break;
|
|
|
|
case 10:
|
|
if (talkProc(NULL, TRUE, NULL)) {
|
|
rv = 1;
|
|
}
|
|
break;
|
|
|
|
case 20:
|
|
if (talkProc(NULL, TRUE, NULL)) {
|
|
rv = 1;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
rv = 1;
|
|
break;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80AF1B8C-80AF1CA4 0026EC 0118+00 1/0 0/0 0/0 .text ECut_listenLake__16daNpc_SoldierA_cFi */
|
|
int daNpc_SoldierA_c::ECut_listenLake(int i_staffId) {
|
|
dEvent_manager_c& eventManager = dComIfGp_getEventManager();
|
|
int unused = 0;
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
int rv = 0;
|
|
int* piVar1 = NULL;
|
|
int prm = -1;
|
|
int unused2 = 0;
|
|
|
|
piVar1 = dComIfGp_evmng_getMyIntegerP(i_staffId, "prm");
|
|
if (piVar1 != NULL) {
|
|
prm = *piVar1;
|
|
}
|
|
|
|
if (eventManager.getIsAddvance(i_staffId)) {
|
|
switch (prm) {
|
|
case 0:
|
|
break;
|
|
|
|
case 10:
|
|
setMotion(MOT_TALK_A, -1.0f, 0);
|
|
break;
|
|
|
|
case 20:
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (prm) {
|
|
case 0:
|
|
rv = 1;
|
|
break;
|
|
|
|
case 10:
|
|
if (mMotionPhase > 0) {
|
|
rv = 1;
|
|
}
|
|
break;
|
|
|
|
case 20:
|
|
rv = 1;
|
|
break;
|
|
|
|
default:
|
|
rv = 1;
|
|
break;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80AF1CA4-80AF1D58 002804 00B4+00 2/0 0/0 0/0 .text test__16daNpc_SoldierA_cFPv */
|
|
int daNpc_SoldierA_c::test(void* param_1) {
|
|
switch (mMode) {
|
|
case 0:
|
|
speedF = 0.0f;
|
|
speed.setall(0.0f);
|
|
mMode = 2;
|
|
// fallthrough
|
|
case 2:
|
|
setMotion(mHIO->m.common.motion, mHIO->m.common.morf_frame, 0);
|
|
setLookMode(mHIO->m.common.look_mode);
|
|
mOrderEvtNo = EVT_NONE;
|
|
attention_info.flags = 0;
|
|
break;
|
|
|
|
case 3:
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80AF1D58-80AF1D78 0028B8 0020+00 1/0 0/0 0/0 .text daNpc_SoldierA_Create__FPv */
|
|
static int daNpc_SoldierA_Create(void* i_this) {
|
|
return static_cast<daNpc_SoldierA_c*>(i_this)->create();
|
|
}
|
|
|
|
/* 80AF1D78-80AF1D98 0028D8 0020+00 1/0 0/0 0/0 .text daNpc_SoldierA_Delete__FPv */
|
|
static int daNpc_SoldierA_Delete(void* i_this) {
|
|
return static_cast<daNpc_SoldierA_c*>(i_this)->Delete();
|
|
}
|
|
|
|
/* 80AF1D98-80AF1DB8 0028F8 0020+00 1/0 0/0 0/0 .text daNpc_SoldierA_Execute__FPv */
|
|
static int daNpc_SoldierA_Execute(void* i_this) {
|
|
return static_cast<daNpc_SoldierA_c*>(i_this)->Execute();
|
|
}
|
|
|
|
/* 80AF1DB8-80AF1DD8 002918 0020+00 1/0 0/0 0/0 .text daNpc_SoldierA_Draw__FPv */
|
|
static int daNpc_SoldierA_Draw(void* i_this) {
|
|
return static_cast<daNpc_SoldierA_c*>(i_this)->Draw();
|
|
}
|
|
|
|
/* 80AF1DD8-80AF1DE0 002938 0008+00 1/0 0/0 0/0 .text daNpc_SoldierA_IsDelete__FPv */
|
|
static int daNpc_SoldierA_IsDelete(void* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
AUDIO_INSTANCES;
|
|
|
|
/* 80AF29BC-80AF29DC -00001 0020+00 1/0 0/0 0/0 .data daNpc_SoldierA_MethodTable */
|
|
static actor_method_class daNpc_SoldierA_MethodTable = {
|
|
(process_method_func)daNpc_SoldierA_Create,
|
|
(process_method_func)daNpc_SoldierA_Delete,
|
|
(process_method_func)daNpc_SoldierA_Execute,
|
|
(process_method_func)daNpc_SoldierA_IsDelete,
|
|
(process_method_func)daNpc_SoldierA_Draw,
|
|
};
|
|
|
|
/* 80AF29DC-80AF2A0C -00001 0030+00 0/0 0/0 1/0 .data g_profile_NPC_SOLDIERa */
|
|
extern actor_process_profile_definition g_profile_NPC_SOLDIERa = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_NPC_SOLDIERa, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daNpc_SoldierA_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
399, // mPriority
|
|
&daNpc_SoldierA_MethodTable, // sub_method
|
|
0x00044100, // mStatus
|
|
fopAc_NPC_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|