npc_kn almost matching + dbg work (#2802)

* npc_kn almost matching + dbg work

* more npc_kn dbg work

* fix npc_kn select action functions

* Z2AudioMgr dbg change for taka
This commit is contained in:
YunataSavior 2025-11-15 18:40:47 -08:00 committed by GitHub
parent e7a610c5e2
commit d21e22f9ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 584 additions and 375 deletions

View File

@ -34,6 +34,9 @@ public:
static Z2AudioMgr* getInterface() { return mAudioMgrPtr; }
static Z2AudioMgr* mAudioMgrPtr;
#if DEBUG
u8 padding[0xC];
#endif
/* 0x0514 */ virtual bool startSound(JAISoundID, JAISoundHandle*, JGeometry::TVec3<f32> const*);
/* 0x0518 */ bool mResettingFlag;
/* 0x0519 */ bool field_0x519;

View File

@ -109,6 +109,9 @@ private:
/* 0x3CA */ u8 field_0x3ca;
/* 0x3CB */ u8 field_0x3cb;
/* 0x3CC */ u8 mCrowdSize;
#if DEBUG
u8 semgr_pad[0x14];
#endif
}; // Size = 0x3D0
inline Z2SeMgr* Z2GetSeMgr() {

View File

@ -3,6 +3,46 @@
#include "d/actor/d_a_npc.h"
struct daNpc_Kn_HIOParam {
/* 0x00 */ daNpcT_HIOParam common;
/* 0x8C */ s16 alpha;
/* 0x8E */ s16 attack_wait_time;
/* 0x90 */ s16 followup_wait_time; // ?
/* 0x94 */ f32 small_slide_distance;
/* 0x98 */ f32 big_slide_distance;
/* 0x9C */ f32 warp_distance;
/* 0xA0 */ f32 attack_disappear_speed_h; // ?
/* 0xA4 */ f32 attack_disappear_speed_v; // ?
/* 0xA8 */ s16 rotation_num;
/* 0xAA */ s16 rotation_speed;
/* 0xAC */ s16 attack_start_min_time;
/* 0xAE */ s16 attack_start_time_range;
/* 0xB0 */ f32 move_speed;
};
class daNpc_Kn_Param_c {
public:
/* 80A3C124 */ virtual ~daNpc_Kn_Param_c() {}
static const daNpc_Kn_HIOParam m;
};
#if DEBUG
class daNpc_Kn_HIO_c : public mDoHIO_entry_c {
public:
daNpc_Kn_HIO_c();
void listenPropertyEvent(const JORPropertyEvent*);
void genMessage(JORMContext*);
daNpc_Kn_HIOParam m;
};
#define NPC_KN_HIO_CLASS daNpc_Kn_HIO_c
#else
#define NPC_KN_HIO_CLASS daNpc_Kn_Param_c
#endif
/**
* @ingroup actors-npcs
* @class daNpc_Kn_c
@ -36,9 +76,6 @@ public:
class daNpc_Kn_prtclMngr_c {
public:
/* 80A2AF98 */ ~daNpc_Kn_prtclMngr_c() {};
/* 80A3C1C4 */ daNpc_Kn_prtclMngr_c() {};
/* 0x00 */ bool mpModel;
/* 0x04 */ cXyz mPos;
/* 0x10 */ csXyz mAngle;
@ -373,10 +410,10 @@ public:
/* 80A2D060 */ virtual bool afterSetMotionAnm(int, int, f32, int);
static const dCcD_SrcGObjInf mCcDObjData;
static dCcD_SrcCyl mCcDCyl;
static dCcD_SrcSph mCcDSph;
static char* mCutNameList[21];
static cutFunc mCutList[21];
static dCcD_SrcCyl mCcDCyl;
static dCcD_SrcSph mCcDSph;
static s16 mSrchName;
static fopAc_ac_c* mFindActorPtrs[50];
static u8 mFindCount[4];
@ -385,7 +422,7 @@ private:
/* 0x0E44 */ J3DModel* mpPodModel;
/* 0x0E48 */ mDoExt_invisibleModel mInvisModel;
/* 0x0E50 */ dKy_tevstr_c mTevStr;
/* 0x11D8 */ u8 field_0x11D8[0x11DC - 0x11D8];
/* 0x11D8 */ NPC_KN_HIO_CLASS* mpHIO;
/* 0x11DC */ dCcD_Cyl mCylCc;
/* 0x1318 */ dCcD_Sph mSphCc[2];
/* 0x1588 */ mDoExt_bckAnm mPodBck;
@ -423,28 +460,4 @@ private:
STATIC_ASSERT(sizeof(daNpc_Kn_c) == 0x1758);
struct daNpc_Kn_HIOParam {
/* 0x00 */ daNpcT_HIOParam common;
/* 0x8C */ s16 alpha;
/* 0x8E */ s16 attack_wait_time;
/* 0x90 */ s16 followup_wait_time; // ?
/* 0x94 */ f32 small_slide_distance;
/* 0x98 */ f32 big_slide_distance;
/* 0x9C */ f32 warp_distance;
/* 0xA0 */ f32 attack_disappear_speed_h; // ?
/* 0xA4 */ f32 attack_disappear_speed_v; // ?
/* 0xA8 */ s16 rotation_num;
/* 0xAA */ s16 rotation_speed;
/* 0xAC */ s16 attack_start_min_time;
/* 0xAE */ s16 attack_start_time_range;
/* 0xB0 */ f32 move_speed;
};
class daNpc_Kn_Param_c {
public:
/* 80A3C124 */ virtual ~daNpc_Kn_Param_c() {}
static const daNpc_Kn_HIOParam m;
};
#endif /* D_A_NPC_KN_H */

View File

@ -927,7 +927,7 @@ public:
bool checkWolfAttackReverse() const { return checkResetFlg1(RFLG1_WOLF_ATTACK_REVERSE); }
bool checkFreezeDamage() const { return checkNoResetFlg1(FLG1_ICE_FREEZE); }
bool checkWolfTagLockJumpReady() const { return checkResetFlg0(RFLG0_UNK_20000); }
bool checkDamageImpact() const { return checkResetFlg1(RFLG1_DAMAGE_IMPACT); }
BOOL checkDamageImpact() const { return checkResetFlg1(RFLG1_DAMAGE_IMPACT); }
bool getGrabUpEnd() const { return checkResetFlg0(RFLG0_GRAB_UP_END); }
bool getGrabPutStart() const { return checkResetFlg0(RFLG0_GRAB_PUT_START); }
bool checkSwimUp() const { return checkNoResetFlg0(FLG0_SWIM_UP); }

View File

@ -110,6 +110,8 @@ void Z2AudioMgr::init(JKRSolidHeap* param_0, u32 param_1, void* param_2, JKRArch
seMgr->setSeqDataMgr(sectionHeap->getSeSeqDataMgr());
seqMgr->setSeqDataMgr(sectionHeap->getSeqSeqDataMgr());
if (sectionHeap->getStreamDataMgr()) {
// The following is to force stack reg to be r31 in dbg:
int unused;
streamMgr->setStreamDataMgr(sectionHeap->getStreamDataMgr());
} else {
streamMgr->setStreamDataMgr(&mSoundInfo);

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@
* tgHitCallBack__10daNpc_Kn_cFP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */
void daNpc_Kn_c::tgHitCallBack(fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf,
fopAc_ac_c* i_atActor, dCcD_GObjInf* i_atObjInf) {
daNpc_Kn_c* kn_actor = (daNpc_Kn_c*)i_tgActor;
u8 cut_type = 0;
if (i_atActor != NULL) {
if (fopAcM_GetProfName(i_atActor) == PROC_ALINK) {
@ -15,7 +16,7 @@ void daNpc_Kn_c::tgHitCallBack(fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf,
}
}
((daNpc_Kn_c*)i_tgActor)->setCutType(cut_type);
kn_actor->setCutType(cut_type);
}
/* 80A38550-80A3858C 00DC30 003C+00 1/1 0/0 0/0 .text getTrnsfrmAnmP__10daNpc_Kn_cFPCci
@ -45,7 +46,9 @@ J3DAnmTextureSRTKey* daNpc_Kn_c::getTexSRTKeyAnmP(char const* i_arcName, int i_r
* setBckAnm__10daNpc_Kn_cFP15J3DAnmTransformfiiib */
BOOL daNpc_Kn_c::setBckAnm(J3DAnmTransform* i_bck, f32 i_speed, int i_mode, int i_startF,
int i_endF, bool i_modify) {
return mBckAnm.init(i_bck, TRUE, i_mode, i_speed, i_startF, i_endF, i_modify);
s16 start_f = i_startF;
s16 end_f = i_endF;
return mBckAnm.init(i_bck, TRUE, i_mode, i_speed, start_f, end_f, i_modify);
}
/* 80A38684-80A3877C 00DD64 00F8+00 1/1 0/0 0/0 .text
@ -114,9 +117,11 @@ void daNpc_Kn_c::deleteRes(const s8* i_ptrn_list, const char** i_arcname_list) {
/* 80A38930-80A38BB8 00E010 0288+00 1/1 0/0 0/0 .text execute__10daNpc_Kn_cFv */
int daNpc_Kn_c::execute() {
BOOL evt_proc = FALSE;
setParam();
if (!evtProc()) {
evt_proc = evtProc();
if (evt_proc == FALSE) {
action();
}
@ -271,7 +276,7 @@ void daNpc_Kn_c::setEnvTevColor() {
/* 80A39008-80A3904C 00E6E8 0044+00 2/2 0/0 0/0 .text setRoomNo__10daNpc_Kn_cFv */
void daNpc_Kn_c::setRoomNo() {
s32 room_id = dComIfG_Bgsp().GetRoomId(mGndChk);
s8 room_id = dComIfG_Bgsp().GetRoomId(mGndChk);
fopAcM_SetRoomNo(this, room_id);
mCcStts.SetRoomId(room_id);
}
@ -425,17 +430,20 @@ void daNpc_Kn_c::playAllAnm() {
/* 80A3949C-80A39558 00EB7C 00BC+00 1/0 0/0 0/0 .text ctrlBtk__10daNpc_Kn_cFv */
int daNpc_Kn_c::ctrlBtk() {
if (mpMatAnm != NULL) {
if (field_0xe30 != 0 && mBtkAnm.getBtkAnm()) {
mpMatAnm->setNowOffsetX(cM_ssin(mJntAnm.getEyeAngleY()) * 0.2f);
mpMatAnm->setNowOffsetY(cM_ssin(mJntAnm.getEyeAngleX()) * 0.2f);
if (field_0xe30 != 0) {
J3DAnmTextureSRTKey* btk_anm = mBtkAnm.getBtkAnm();
if (btk_anm) {
mpMatAnm->setNowOffsetX(cM_ssin(mJntAnm.getEyeAngleY()) * 0.2f);
mpMatAnm->setNowOffsetY(cM_ssin(mJntAnm.getEyeAngleX()) * 0.2f);
if (field_0xe31 != 0) {
mpMatAnm->setMorfFrm(field_0xe31);
field_0xe31 = 0;
if (field_0xe31 != 0) {
mpMatAnm->setMorfFrm(field_0xe31);
field_0xe31 = 0;
}
mpMatAnm->onEyeMoveFlag();
return 1;
}
mpMatAnm->onEyeMoveFlag();
return 1;
}
if (field_0xe31 != 0) {
@ -564,7 +572,8 @@ int daNpc_Kn_c::ctrlMsgAnm(int* o_faceAnmAttr_p, int* o_anmAttr_p, fopAc_ac_c* i
/* 80A3989C-80A39BBC 00EF7C 0320+00 1/0 0/0 0/0 .text ctrlJoint__10daNpc_Kn_cFP8J3DJointP8J3DModel
*/
int daNpc_Kn_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
int joint_no = i_joint->getJntNo();
J3DJoint* my_joint = i_joint;
int joint_no = my_joint->getJntNo();
cXyz pos;
csXyz angle;
mDoMtx_stack_c::copy(i_model->getAnmMtx(joint_no));
@ -626,11 +635,17 @@ int daNpc_Kn_c::ctrlJoint(J3DJoint* i_joint, J3DModel* i_model) {
}
/* 80A39BBC-80A39DBC 00F29C 0200+00 1/0 0/0 0/0 .text evtProc__10daNpc_Kn_cFv */
// NONMATCHING - gameinfo load issues
int daNpc_Kn_c::evtProc() {
BOOL ret = FALSE;
if (dComIfGp_event_runCheck() != 0) {
#if VERSION != VERSION_SHIELD_DEBUG
// TODO: gameInfo fake match to force reuse of pointer
dComIfG_play_c* play = &g_dComIfG_gameInfo.play;
if (play->getEvent().runCheck())
#else
if (dComIfGp_event_runCheck())
#endif
{
if (eventInfo.checkCommandTalk()) {
if (!checkChangeEvt()) {
evtTalk();
@ -638,7 +653,11 @@ int daNpc_Kn_c::evtProc() {
ret = TRUE;
} else if (eventInfo.checkCommandDemoAccrpt() && dComIfGp_getEventManager().endCheck(mEvtId)) {
if (evtEndProc()) {
#if VERSION != VERSION_SHIELD_DEBUG
play->getEvent().reset();
#else
dComIfGp_event_reset();
#endif
mEvtId = -1;
}
} else {
@ -763,7 +782,8 @@ void daNpc_Kn_c::setFootPrtcl(cXyz* param_0, f32 param_1) {
/* 80A3A254-80A3A25C 00F934 0008+00 1/0 0/0 0/0 .text checkCullDraw__10daNpc_Kn_cFv */
bool daNpc_Kn_c::checkCullDraw() {
return false;
bool ret = false;
return ret;
}
/* 80A3A25C-80A3A2A8 00F93C 004C+00 1/0 0/0 0/0 .text twilight__10daNpc_Kn_cFv */
@ -788,8 +808,7 @@ void daNpc_Kn_c::evtOrder() {
fopAcM_orderOtherEventId(this, mEvtId, 0xff, 0xffff, 6, 1);
} else {
u32 flag_check = attention_info.flags;
if (flag_check & fopAc_AttnFlag_SPEAK_e || flag_check & fopAc_AttnFlag_TALK_e) {
if (attention_info.flags & fopAc_AttnFlag_SPEAK_e || attention_info.flags & fopAc_AttnFlag_TALK_e) {
eventInfo.onCondition(dEvtCnd_CANTALK_e);
if (chkXYItems()) {
@ -939,6 +958,7 @@ void daNpc_Kn_c::setPos(cXyz i_pos) {
i_pos.y += 500.0f;
mGndChk.SetPos(&i_pos);
i_pos.y = dComIfG_Bgsp().GroundCross(&mGndChk);
JUT_ASSERT(1841, -(1000000000.0f) != i_pos.y);
current.pos = i_pos;
old.pos = current.pos;
@ -977,9 +997,9 @@ BOOL daNpc_Kn_c::chkActorInSight(fopAc_ac_c* actor, f32 i_fovY, s16 i_angleY) {
BOOL daNpc_Kn_c::chkPointInArea(cXyz i_pos, cXyz i_center, f32 i_boundXZ, f32 i_boundY1, f32 i_boundY2,
s16 i_angle) {
cXyz bounds, center;
f32 min_y = i_boundY2;
f32 max_y = i_boundY1;
if (i_boundY1 < i_boundY2) {
f32 min_y = i_boundY2;
if (max_y < min_y) {
min_y = i_boundY1;
max_y = i_boundY2;
}
@ -1000,7 +1020,8 @@ BOOL daNpc_Kn_c::chkPointInArea(cXyz i_pos, cXyz i_center, cXyz i_bounds, s16 i_
int daNpc_Kn_c::chkFindPlayer(BOOL i_release, s16 i_angleY) {
cXyz attn_pos = getAttnPos(daPy_getPlayerActorClass());
int dist_index = i_release == FALSE ? attention_info.distances[3] : attention_info.distances[1];
int dist_index = i_release == FALSE ? attention_info.distances[fopAc_attn_SPEAK_e]
: attention_info.distances[fopAc_attn_TALK_e];
f32 dist_max = i_release == FALSE ? dComIfGp_getAttention()->getDistTable(dist_index).mDistMax :
dComIfGp_getAttention()->getDistTable(dist_index).mDistMaxRelease;
f32 lower_y = -1.0f * dComIfGp_getAttention()->getDistTable(dist_index).mLowerY;
@ -1022,8 +1043,10 @@ int daNpc_Kn_c::chkFindPlayer(BOOL i_release, s16 i_angleY) {
fov = 135.0f;
}
int pnt_chk = chkPointInArea(attn_pos, attention_info.position, dist_max, lower_y, upper_y, 0);
if (pnt_chk && chkActorInSight(daPy_getPlayerActorClass(), fov, i_angleY)) {
// writing like the following may be a fakematch, but it fixes dbg asm:
int pnt_chk[1];
pnt_chk[0] = chkPointInArea(attn_pos, attention_info.position, dist_max, lower_y, upper_y, 0);
if (pnt_chk[0] && chkActorInSight(daPy_getPlayerActorClass(), fov, i_angleY)) {
return TRUE;
}
@ -1050,8 +1073,7 @@ cXyz daNpc_Kn_c::getAttnPos(fopAc_ac_c* i_actor) {
cXyz attn_pos(i_actor->attention_info.position);
if (fopAcM_GetName(i_actor) == PROC_ALINK) {
f32 offset = static_cast<daPy_py_c*>(i_actor)->getAttentionOffsetY();
attn_pos.y -= offset;
attn_pos.y -= static_cast<daPy_py_c*>(i_actor)->getAttentionOffsetY();
}
return attn_pos;
@ -1182,6 +1204,7 @@ BOOL daNpc_Kn_c::talkProc(int* param_0, int param_1, fopAc_ac_c** i_partnerList_
}
// FIXME: dummy functions to get rodata to align.
#if !DEBUG
static f64 dummy_lits_00(int sel) {
switch (sel) {
case 0:
@ -1192,6 +1215,7 @@ static f64 dummy_lits_00(int sel) {
return 0.0;
}
}
#endif
static f32 dummy_lits_01(int sel) {
switch (sel) {
@ -1206,22 +1230,16 @@ static f32 dummy_lits_01(int sel) {
/* 80A3B5EC-80A3B708 010CCC 011C+00 1/1 0/0 0/0 .text setHitodamaPrtcl__10daNpc_Kn_cFv */
void daNpc_Kn_c::setHitodamaPrtcl() {
JPABaseEmitter* emitter = NULL;
cXyz pos(eyePos);
for (int i = 0; i < 2; i++) {
static const u16 id[2] = {0x8497,0x8498};
mHitodamaPrtclKey[i] = dComIfGp_particle_set(mHitodamaPrtclKey[i], id[i], &pos, &mCurAngle, 0);
JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(mHitodamaPrtclKey[i]);
emitter = dComIfGp_particle_getEmitter(mHitodamaPrtclKey[i]);
if (emitter != NULL) {
u8 alpha;
if (dComIfGs_wolfeye_effect_check() == FALSE) {
alpha = 0xFF;
} else {
alpha = 0;
}
u8 alpha = (dComIfGs_wolfeye_effect_check() == FALSE) ? 0xFF : 0;
emitter->setGlobalTranslation(pos.x, pos.y, pos.z);
emitter->setGlobalAlpha(alpha);
}
@ -1234,3 +1252,10 @@ void daNpc_Kn_c::decTmr() {
mTimer--;
}
}
#if DEBUG
void dummy_lit_125958() {
OS_REPORT("name:%s\n");
OS_REPORT("JNT_%s_e,\t// (%2d)%s\n");
}
#endif

View File

@ -2,10 +2,10 @@
/* 80A3C998-80A3CB14 012078 017C+00 1/1 0/0 0/0 .text setParamTeach01__10daNpc_Kn_cFv */
u32 daNpc_Kn_c::setParamTeach01() {
s16 talk_distance = daNpc_Kn_Param_c::m.common.talk_distance;
s16 talk_angle = daNpc_Kn_Param_c::m.common.talk_angle;
s16 attention_distance = daNpc_Kn_Param_c::m.common.attention_distance;
s16 attention_angle = daNpc_Kn_Param_c::m.common.attention_angle;
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;
switch (mActionMode) {
case 0:
@ -23,8 +23,8 @@ u32 daNpc_Kn_c::setParamTeach01() {
attention_info.distances[fopAc_attn_BATTLE_e] = 0xe4;
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);
mAcchCir.SetWallR(daNpc_Kn_Param_c::m.common.width);
mAcchCir.SetWallH(daNpc_Kn_Param_c::m.common.knee_length);
mAcchCir.SetWallR(mpHIO->m.common.width);
mAcchCir.SetWallH(mpHIO->m.common.knee_length);
return fopAc_AttnFlag_BATTLE_e;
case 3:
attention_info.distances[fopAc_attn_LOCK_e] = daNpcT_getDistTableIdx(attention_distance, attention_angle);
@ -32,7 +32,7 @@ u32 daNpc_Kn_c::setParamTeach01() {
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);
mAcchCir.SetWallR(135.0f);
mAcchCir.SetWallH(daNpc_Kn_Param_c::m.common.knee_length);
mAcchCir.SetWallH(mpHIO->m.common.knee_length);
return fopAc_AttnFlag_BATTLE_e;
}
@ -150,10 +150,10 @@ int daNpc_Kn_c::teach01_swordAttackWait(void* param_0) {
mFaceMotionSeqMngr.setNo(1, -1.0f, 0, 0);
mMotionSeqMngr.setNo(9, -1.0f, 0, 0);
mJntAnm.lookPlayer(0);
field_0xdec = daNpc_Kn_Param_c::m.attack_wait_time;
field_0xdec = mpHIO->m.attack_wait_time;
mTargetPos = current.pos;
field_0x15bc = 0;
field_0x15d0 = cLib_getRndValue(daNpc_Kn_Param_c::m.attack_start_min_time, daNpc_Kn_Param_c::m.attack_start_time_range);
field_0x15d0 = cLib_getRndValue(mpHIO->m.attack_start_min_time, mpHIO->m.attack_start_time_range);
speedF = 0.0f;
speed.zero();
mMode = 2;
@ -170,13 +170,15 @@ int daNpc_Kn_c::teach01_swordAttackWait(void* param_0) {
{
mActionMode = 3;
setAngle(fopAcM_searchPlayerAngleY(this));
speedF = -daNpc_Kn_Param_c::m.attack_disappear_speed_h;
speed.y = daNpc_Kn_Param_c::m.attack_disappear_speed_v;
speedF = -mpHIO->m.attack_disappear_speed_h;
speed.y = mpHIO->m.attack_disappear_speed_v;
mSound.startCollisionSE(Z2SE_HIT_SWORD, 0x1f);
break;
} else {
fopAc_ac_c* aTgHitActor_p = mCylCc.GetTgHitAc();
JUT_ASSERT(303, NULL != aTgHitActor_p);
s16 angle = cLib_targetAngleY(&aTgHitActor_p->current.pos, &current.pos);
cXyz pos(0.0f, 0.0f, daNpc_Kn_Param_c::m.small_slide_distance);
cXyz pos(0.0f, 0.0f, mpHIO->m.small_slide_distance);
mDoMtx_stack_c::YrotS(angle);
mDoMtx_stack_c::multVec(&pos, &mTargetPos);
mTargetPos += current.pos;
@ -190,24 +192,40 @@ int daNpc_Kn_c::teach01_swordAttackWait(void* param_0) {
mTargetPos = current.pos;
int is_lockon = FALSE;
if (dComIfGp_getAttention()->LockonTruth()) {
dAttention_c* attention_p = dComIfGp_getAttention();
if (attention_p->LockonTruth()) {
is_lockon = TRUE;
}
checkCollisionSword() ? mEvtNo = 4 : mEvtNo = 1;
if (checkCollisionSword()) {
mEvtNo = 4;
} else {
mEvtNo = 1;
}
mFaceMotionSeqMngr.setNo(1, -1.0f, 0, 0);
mMotionSeqMngr.setNo(0, -1.0f, 1, 0);
is_lockon ? mFlowNodeNo = 0x2da : mFlowNodeNo = 0x2db;
if (is_lockon) {
mFlowNodeNo = 0x2da;
} else {
mFlowNodeNo = 0x2db;
}
break;
} else {
calcSwordAttackMove(1);
}
}
break;
case 3:
default:
return 1;
break;
}
return 1;
}
/* 80A3D32C-80A3D6D8 012A0C 03AC+00 1/0 0/0 0/0 .text teach01_swordFinishWait__10daNpc_Kn_cFPv */
@ -219,7 +237,7 @@ int daNpc_Kn_c::teach01_swordFinishWait(void* param_0) {
mMotionSeqMngr.setNo(0x12, -1.0f, 0, 0);
mSound.startCreatureVoice(Z2SE_KN_V_DAMAGE_L, -1);
mJntAnm.lookNone(0);
field_0xdec = daNpc_Kn_Param_c::m.attack_wait_time;
field_0xdec = mpHIO->m.attack_wait_time;
mMode = 2;
case 2: {
mTargetPos = current.pos;
@ -242,9 +260,8 @@ int daNpc_Kn_c::teach01_swordFinishWait(void* param_0) {
cXyz pos(10.0f, 0.0f, 0.0f);
onDownFlg();
u8 backbone_joint = getBackboneJointNo();
J3DModel* model = mpModelMorf[0]->getModel();
mDoMtx_stack_c::copy(model->getAnmMtx(backbone_joint));
int backbone_joint = getBackboneJointNo();
mDoMtx_stack_c::copy(mpModelMorf[0]->getModel()->getAnmMtx(backbone_joint));
mDoMtx_stack_c::multVec(&pos, &field_0x15c0);
setDownPos(&field_0x15c0);
} else if (checkCutDownHitFlg()) {
@ -290,7 +307,7 @@ int daNpc_Kn_c::ctrlWarp() {
case 0: {
cXyz spEC(daPy_getPlayerActorClass()->current.pos);
bool sp8 = (daPy_getPlayerActorClass()->current.pos - current.pos).absXZ() > daNpc_Kn_Param_c::m.warp_distance;
bool sp8 = (daPy_getPlayerActorClass()->current.pos - current.pos).absXZ() > mpHIO->m.warp_distance;
if (sp8) {
sp28 = 1;
cXyz spE0(0.0f, 0.0f, 600.0f);
@ -409,10 +426,12 @@ int daNpc_Kn_c::ctrlWarp() {
int daNpc_Kn_c::ECut_firstEncount(int i_idx) {
dEvent_manager_c* event_manager = &dComIfGp_getEventManager();
int reg_r24 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}
@ -425,7 +444,11 @@ int daNpc_Kn_c::ECut_firstEncount(int i_idx) {
break;
case 10:
daPy_getPlayerActorClass()->changeDemoMoveAngle(fopAcM_searchPlayerAngleY(this) + 0x8000);
#if VERSION == VERSION_SHIELD_DEBUG
field_0xdec = 50;
#else
field_0xdec = 52;
#endif
break;
case 20:
break;
@ -466,9 +489,10 @@ int daNpc_Kn_c::ECut_attackFailed(int i_idx) {
int sp8 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}
@ -602,9 +626,10 @@ int daNpc_Kn_c::ECut_firstSkillGet(int i_idx) {
int sp8 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}

View File

@ -3,12 +3,10 @@
/* 80A3EB84-80A3EE38 014264 02B4+00 1/1 0/0 0/0 .text setParamTeach02__10daNpc_Kn_cFv */
u32 daNpc_Kn_c::setParamTeach02() {
s16 talk_distance = daNpc_Kn_Param_c::m.common.talk_distance;
s16 talk_angle = daNpc_Kn_Param_c::m.common.talk_angle;
s16 attention_distance = daNpc_Kn_Param_c::m.common.attention_distance;
s16 attention_angle = daNpc_Kn_Param_c::m.common.attention_angle;
f32 radius = daNpc_Kn_Param_c::m.common.attention_offset;
f32 height = daNpc_Kn_Param_c::m.common.height;
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;
switch (mActionMode) {
case 7:
@ -27,9 +25,7 @@ u32 daNpc_Kn_c::setParamTeach02() {
mDoMtx_stack_c::copy(mpModelMorf[0]->getModel()->getAnmMtx(getBackboneJointNo()));
mDoMtx_stack_c::multVecZero(&pos);
f32 absxz = (daPy_getPlayerActorClass()->current.pos - pos).absXZ();
if (absxz < 255.0f) {
if ((daPy_getPlayerActorClass()->current.pos - pos).absXZ() < 255.0f) {
return fopAc_AttnFlag_UNK_0x200000 | fopAc_AttnFlag_BATTLE_e;
} else {
return fopAc_AttnFlag_BATTLE_e;
@ -40,8 +36,8 @@ u32 daNpc_Kn_c::setParamTeach02() {
attention_info.distances[fopAc_attn_BATTLE_e] = 0xe4;
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);
mAcchCir.SetWallR(daNpc_Kn_Param_c::m.common.width);
mAcchCir.SetWallH(daNpc_Kn_Param_c::m.common.knee_length);
mAcchCir.SetWallR(mpHIO->m.common.width);
mAcchCir.SetWallH(mpHIO->m.common.knee_length);
return 0;
}
@ -109,11 +105,11 @@ int daNpc_Kn_c::teach02_shieldBashWait(void* param_0) {
mFaceMotionSeqMngr.setNo(1, -1.0f, 0, 0);
mMotionSeqMngr.setNo(9, -1.0f, 0, 0);
mJntAnm.lookPlayer(0);
field_0xdec = daNpc_Kn_Param_c::m.attack_wait_time;
field_0xdec = mpHIO->m.attack_wait_time;
mTargetPos = current.pos;
field_0x15bc = 0;
field_0x15d0 =
cLib_getRndValue(daNpc_Kn_Param_c::m.attack_start_min_time, daNpc_Kn_Param_c::m.attack_start_time_range);
cLib_getRndValue(mpHIO->m.attack_start_min_time, mpHIO->m.attack_start_time_range);
speedF = 0.0f;
speed.zero();
mMode = 2;
@ -121,12 +117,10 @@ int daNpc_Kn_c::teach02_shieldBashWait(void* param_0) {
mCcStts.Move();
if (mCylCc.ChkTgShieldHit()) {
u8 cut_type = daPy_getPlayerActorClass()->getCutType();
if (cut_type == daPy_py_c::CUT_TYPE_GUARD_ATTACK) {
if (daPy_getPlayerActorClass()->getCutType() == daPy_py_c::CUT_TYPE_GUARD_ATTACK) {
s16 angle = cLib_targetAngleY(&daPy_getPlayerActorClass()->current.pos,
&attention_info.position);
cXyz pos(0.0f, 0.0f, daNpc_Kn_Param_c::m.small_slide_distance);
cXyz pos(0.0f, 0.0f, mpHIO->m.small_slide_distance);
mDoMtx_stack_c::YrotS(angle);
mDoMtx_stack_c::multVec(&pos, &mTargetPos);
@ -141,7 +135,8 @@ int daNpc_Kn_c::teach02_shieldBashWait(void* param_0) {
if (!cLib_calcTimer(&field_0xdec) || checkCollisionSword()) {
BOOL is_lockon = FALSE;
if (dComIfGp_getAttention()->LockonTruth()) {
dAttention_c* attention_p = dComIfGp_getAttention();
if (attention_p->LockonTruth()) {
is_lockon = TRUE;
}
@ -159,6 +154,8 @@ int daNpc_Kn_c::teach02_shieldBashWait(void* param_0) {
} else {
mFlowNodeNo = 0x2bf;
}
break;
} else {
if (mCylCc.ChkTgHit()) {
if (!mCylCc.GetTgHitObj()->ChkAtType(0x10)) {
@ -188,25 +185,24 @@ int daNpc_Kn_c::teach02_finishWait(void* param_0) {
mFaceMotionSeqMngr.setNo(1, -1.0f, 0, 0);
mMotionSeqMngr.setNo(11, -1.0f, 1, 0);
mJntAnm.lookPlayer(0);
field_0xdec = daNpc_Kn_Param_c::m.followup_wait_time;
field_0xdec = mpHIO->m.followup_wait_time;
mMode = 2;
case 2:
calcSlip();
mCcStts.Move();
if (mCylCc.ChkTgHit()) {
u8 cut_type = daPy_getPlayerActorClass()->getCutType();
if (cut_type != daPy_py_c::CUT_TYPE_GUARD_ATTACK) {
if (daPy_getPlayerActorClass()->getCutType() != daPy_py_c::CUT_TYPE_GUARD_ATTACK) {
if (mType == 1) {
mEvtNo = 10;
} else if (mType == 2) {
mEvtNo = 12;
}
cXyz pos(0.0f, 0.0f, daNpc_Kn_Param_c::m.big_slide_distance);
mDoMtx_stack_c::YrotS(cLib_targetAngleY(&daPy_getPlayerActorClass()->current.pos,
&attention_info.position));
cXyz pos(0.0f, 0.0f, mpHIO->m.big_slide_distance);
s16 tgt_ang = cLib_targetAngleY(&daPy_getPlayerActorClass()->current.pos,
&attention_info.position);
mDoMtx_stack_c::YrotS(tgt_ang);
mDoMtx_stack_c::multVec(&pos, &mTargetPos);
mTargetPos += current.pos;
field_0x15bc = 1;
@ -287,7 +283,7 @@ int daNpc_Kn_c::teach02_shieldReflectWait(void* param_0) {
mEvtNo = 0xB;
s16 var_r27 = cLib_targetAngleY(&aTgHitActor_p->current.pos, &current.pos);
cXyz sp14(0.0f, 0.0f, daNpc_Kn_Param_c::m.big_slide_distance);
cXyz sp14(0.0f, 0.0f, mpHIO->m.big_slide_distance);
mDoMtx_stack_c::YrotS(var_r27);
mDoMtx_stack_c::multVec(&sp14, &mTargetPos);
mTargetPos += current.pos;
@ -313,9 +309,10 @@ int daNpc_Kn_c::ECut_secondSkillExplain(int i_idx) {
int sp8 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}
@ -451,9 +448,10 @@ int daNpc_Kn_c::ECut_reflectExplain(int i_idx) {
int sp8 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}
@ -542,9 +540,10 @@ int daNpc_Kn_c::ECut_secondSkillGet(int i_idx) {
int sp8 = 0;
int rt = 0;
int* prm_p = NULL;
int prm = -1;
int* prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
prm_p = dComIfGp_evmng_getMyIntegerP(i_idx, "prm");
if (prm_p != NULL) {
prm = *prm_p;
}