From d7aba8e7dfb978aea5708defa698ca5e313bb963 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 11 Nov 2023 02:08:52 -0500 Subject: [PATCH] d_npc OK --- configure.py | 2 +- include/d/d_npc.h | 34 ++++-- src/d/d_npc.cpp | 247 ++++++++++++++++++++++++++++++++------ src/d/d_npc_event_cut.inc | 23 ++-- 4 files changed, 252 insertions(+), 54 deletions(-) diff --git a/configure.py b/configure.py index d83bacf49..0e586cb3e 100644 --- a/configure.py +++ b/configure.py @@ -470,7 +470,7 @@ config.libs = [ Object(NonMatching, "d/d_minigame_terminater.cpp"), Object(NonMatching, "d/d_msg.cpp"), Object(NonMatching, "d/d_name.cpp"), - Object(NonMatching, "d/d_npc.cpp"), + Object(Matching, "d/d_npc.cpp"), Object(NonMatching, "d/d_operate_wind.cpp"), Object(Matching, "d/d_metronome.cpp"), Object(Matching, "d/d_ovlp_fade.cpp"), diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 772ff65ca..ed26cf10a 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -55,11 +55,11 @@ class dNpc_JntCtrl_c { // /* 0x18 */ s16 mMaxHeadRot; // /* 0x1A */ s16 field_0x1A; // /* 0x1C */ s16 mMaxSpineRot; - /* 0x1E */ s16 field_0x1E; - /* 0x20 */ s16 field_0x20; - /* 0x22 */ s16 field_0x22; - /* 0x24 */ s16 field_0x24; - /* 0x26 */ u8 pad_0x26[0x32 - 0x26]; + /* 0x1E */ s16 field_0x1E[2][2]; + /* 0x26 */ u8 pad_0x26[0x2C - 0x26]; + /* 0x2C */ s16 field_0x2C; + /* 0x2E */ s16 field_0x2E; + /* 0x30 */ s16 field_0x30; /* 0x32 */ s16 field_0x32; public: @@ -68,14 +68,34 @@ public: field_0x0B = 0; } + void clrTrn() {} + void getBackboneJntNum() {} + void getBackbone_x() {} + void getBackbone_y() {} + void getHeadJntNum() {} + void getHead_x() {} + void getHead_y() {} + void offBackBoneLock() {} + void offHeadLock() {} + void onBackBoneLock() {} + void onHeadLock() {} + void setBackBone_x(s16) {} + void setBackBone_y(s16) {} + void setBackboneJntNum(s8) {} + void setHeadJntNum(s8) {} + void setHead_x(s16) {} + void setHead_y(s16) {} + void setTrn() {} + void trnChk() {} + bool angCalcS(s16*, s16, s16, s16); void limitter(s16*, s16, s16); bool follow(s16*, s16, s16, int); - void move(s16, int); + bool move(s16, int); void lookAtTarget(s16*, cXyz*, cXyz, s16, s16, bool); void setParam(s16, s16, s16, s16, s16, s16, s16, s16, s16); - s32 chkLim(s16, int, int); + int chkLim(s16, int, int); void turn_fromBackbone2Head(s16, s16*, s16*, bool); void turn_fromHead2Backbone(s16, s16*, s16*); s16 follow_current(s16*, s16); diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index fe2d19e2b..f2fabcb15 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -16,6 +16,7 @@ static Vec dummy_2100 = {1.0f, 1.0f, 1.0f}; static Vec dummy_2080 = {1.0f, 1.0f, 1.0f}; +/* 8021A7B4-8021A858 .text angCalcS__14dNpc_JntCtrl_cFPssss */ bool dNpc_JntCtrl_c::angCalcS(s16* out, s16 targetY, s16 speed, s16 maxVel) { s16 diff = *out - targetY; int origDiff = diff; @@ -30,6 +31,7 @@ bool dNpc_JntCtrl_c::angCalcS(s16* out, s16 targetY, s16 speed, s16 maxVel) { return (s16)targetY - *out == 0; } +/* 8021A858-8021A884 .text limitter__14dNpc_JntCtrl_cFPsss */ void dNpc_JntCtrl_c::limitter(s16* targetDiff, s16 maxDiff, s16 minDiff) { if(*targetDiff > maxDiff) { *targetDiff = maxDiff; @@ -61,15 +63,71 @@ bool dNpc_JntCtrl_c::follow(s16* outY, s16 targetY, s16 maxVel, int param_4) { } /* 8021A97C-8021AABC .text move__14dNpc_JntCtrl_cFsi */ -void dNpc_JntCtrl_c::move(short, int) { - /* Nonmatching */ +bool dNpc_JntCtrl_c::move(s16 param_1, int param_2) { + s16 angle; + s32 angleL; + s16 angles[2]; + int r25; + int i; + + for (i = 0; i < 2; i++) { + if ((i == 0 && field_0x0B == 1) || (i == 1 && field_0x0C == 1)) { + angle = 0; + } else { + angle = param_1; + } + limitter(&angle, mMaxAngles[i][param_2], mMinAngles[i][param_2]); + param_1 -= (int)angle; + angles[i] = angle; + angleL = mAngles[i][param_2]; + cLib_addCalcAngleL(&angleL, angle, 4, field_0x1E[i][param_2], 1); + mAngles[i][param_2] = angleL; + } + + for (i = 0, r25 = 0; i < 2; i++) { + if (cLib_distanceAngleS(angles[i], mAngles[i][param_2]) <= field_0x1E[i][param_2]/2) { + r25++; + } + } + + return r25 == i; } /* 8021AABC-8021AC6C .text lookAtTarget__14dNpc_JntCtrl_cFPsP4cXyz4cXyzssb */ -void dNpc_JntCtrl_c::lookAtTarget(short*, cXyz*, cXyz, short, short, bool) { - /* Nonmatching */ +void dNpc_JntCtrl_c::lookAtTarget(s16* outY, cXyz* param_2, cXyz param_3, s16 param_4, s16 maxVel, bool param_6) { + s16 deltaY; + s32 maxY; + s32 minY; + s16 r23; + s16 targetY; + + if (param_2) { + cXyz temp; + temp.x = param_2->x - param_3.x; + temp.y = param_2->y - param_3.y; + temp.z = param_2->z - param_3.z; + f32 temp2 = sqrtf(temp.x * temp.x + temp.z * temp.z); + targetY = cM_atan2s(temp.x, temp.z); + r23 = cM_atan2s(temp.y, temp2); + } else { + targetY = param_4; + r23 = 0; + } + + deltaY = targetY - (s32)*outY; + maxY = mMaxAngles[1][1]; + maxY += mMaxAngles[0][1]; + minY = mMinAngles[1][1]; + minY += mMinAngles[0][1]; + bool r3 = move(deltaY, 1); + if ((field_0x0A || ((deltaY >= maxY || deltaY <= minY) && r3)) && !param_6) { + field_0x0A = follow(outY, targetY, maxVel, 1); + } + + move(r23, 0); } +/* 8021AC6C-8021ACA8 .text setParam__14dNpc_JntCtrl_cFsssssssss */ void dNpc_JntCtrl_c::setParam(s16 param_1, s16 maxSpineRot, s16 param_3, s16 minSpineRot, s16 param_5, s16 maxHeadRot, s16 param_7, s16 minHeadRot, s16 param_9) { mMaxAngles[1][0] = param_1; mMaxAngles[1][1] = maxSpineRot; @@ -79,12 +137,13 @@ void dNpc_JntCtrl_c::setParam(s16 param_1, s16 maxSpineRot, s16 param_3, s16 min mMaxAngles[0][1] = maxHeadRot; mMinAngles[0][0] = param_7; mMinAngles[0][1] = minHeadRot; - field_0x22 = param_9; - field_0x24 = param_9; - field_0x1E = param_9; - field_0x20 = param_9; + field_0x1E[1][0] = param_9; + field_0x1E[1][1] = param_9; + field_0x1E[0][0] = param_9; + field_0x1E[0][1] = param_9; } +/* 8021ACA8-8021ACBC .text setInfDrct__14dNpc_PathRun_cFP5dPath */ bool dNpc_PathRun_c::setInfDrct(dPath* pPath) { mPath = pPath; mCurrPointIndex = 0; @@ -92,6 +151,7 @@ bool dNpc_PathRun_c::setInfDrct(dPath* pPath) { return true; } +/* 8021ACBC-8021AD1C .text setInf__14dNpc_PathRun_cFUcScUc */ bool dNpc_PathRun_c::setInf(u8 pathIdx, s8 roomNo, u8 forwards) { bool setPath = false; @@ -107,6 +167,7 @@ bool dNpc_PathRun_c::setInf(u8 pathIdx, s8 roomNo, u8 forwards) { return setPath; } +/* 8021AD1C-8021AD58 .text nextPath__14dNpc_PathRun_cFSc */ dPath* dNpc_PathRun_c::nextPath(s8 roomNo) { dPath* pPath = 0; @@ -117,6 +178,7 @@ dPath* dNpc_PathRun_c::nextPath(s8 roomNo) { return pPath; } +/* 8021AD58-8021ADD0 .text getPoint__14dNpc_PathRun_cFUc */ cXyz dNpc_PathRun_c::getPoint(u8 pointIdx) { cXyz point(0.0f, 0.0f, 0.0f); @@ -160,6 +222,7 @@ bool dNpc_PathRun_c::chkPointPass(cXyz currPos, bool goingForwards) { return passed; } +/* 8021AFA8-8021AFEC .text incIdx__14dNpc_PathRun_cFv */ bool dNpc_PathRun_c::incIdx() { bool ret = true; @@ -174,6 +237,7 @@ bool dNpc_PathRun_c::incIdx() { return ret; } +/* 8021AFEC-8021B030 .text incIdxLoop__14dNpc_PathRun_cFv */ bool dNpc_PathRun_c::incIdxLoop() { bool ret = true; @@ -188,6 +252,7 @@ bool dNpc_PathRun_c::incIdxLoop() { return ret; } +/* 8021B030-8021B0AC .text incIdxAuto__14dNpc_PathRun_cFv */ bool dNpc_PathRun_c::incIdxAuto() { bool hitEnd = true; @@ -210,6 +275,7 @@ bool dNpc_PathRun_c::incIdxAuto() { return hitEnd; } +/* 8021B0AC-8021B0F0 .text decIdx__14dNpc_PathRun_cFv */ bool dNpc_PathRun_c::decIdx() { bool ret = true; @@ -337,6 +403,7 @@ u8 dNpc_PathRun_c::pointArg(u8 idx) { return arg; } +/* 8021B384-8021B514 .text setNearPathIndx__14dNpc_PathRun_cFP4cXyzf */ bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, f32 param_2) { bool set = false; if(mPath != 0) { @@ -346,7 +413,7 @@ bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, f32 param_2) { cXyz point = getPoint(i); cXyz diff = (*param_1 - point); - f32 xz_mag = diff.getMagXZ(); + f32 xz_mag = diff.abs2XZ(); f32 y_mag = param_2 * (diff.y * diff.y); f32 dist = sqrtf(y_mag + xz_mag); @@ -363,6 +430,7 @@ bool dNpc_PathRun_c::setNearPathIndx(cXyz* param_1, f32 param_2) { return set; } +/* 8021B514-8021B670 .text setNearPathIndxMk__14dNpc_PathRun_cFP4cXyz */ f32 dNpc_PathRun_c::setNearPathIndxMk(cXyz* param_1) { f32 max_dist; if(mPath != 0) { @@ -371,8 +439,7 @@ f32 dNpc_PathRun_c::setNearPathIndxMk(cXyz* param_1) { for(int i = 0; i < maxPoint(); i++) { cXyz point = getPoint(i); cXyz diff = (*param_1 - point); - f32 temp = diff.getSquareMag(); - f32 dist = sqrtf(temp); + f32 dist = diff.abs(); if(max_dist > dist) { max_dist = dist; pointIdx = i; @@ -385,6 +452,7 @@ f32 dNpc_PathRun_c::setNearPathIndxMk(cXyz* param_1) { return max_dist; } +/* 8021B670-8021B818 .text setNearPathIndxMk2__14dNpc_PathRun_cFP4cXyzUcUc */ bool dNpc_PathRun_c::setNearPathIndxMk2(cXyz* param_1, u8 param_2, u8 param_3) { u8 pointIdx; bool set = false; @@ -394,8 +462,7 @@ bool dNpc_PathRun_c::setNearPathIndxMk2(cXyz* param_1, u8 param_2, u8 param_3) { for(int i = 0; i < maxPoint(); i++) { cXyz point = getPoint(i); cXyz diff = (*param_1 - point); - f32 temp = diff.getSquareMag(); - f32 dist = sqrtf(temp); + f32 dist = diff.abs(); s32 idx = absIdx(param_2, i); if(idx <= param_3 && param_2 != i && max_dist > dist) { max_dist = dist; @@ -410,6 +477,7 @@ bool dNpc_PathRun_c::setNearPathIndxMk2(cXyz* param_1, u8 param_2, u8 param_3) { return set; } +/* 8021B818-8021B95C .text chkInside__14dNpc_PathRun_cFP4cXyz */ bool dNpc_PathRun_c::chkInside(cXyz* param_1) { cXyz point, point2, point3; @@ -478,18 +546,19 @@ bool dNpc_setAnmIDRes(mDoExt_McaMorf* pMorf, int loopMode, float morf, float spe return ret; } +/* 8021BABC-8021BBA8 .text dNpc_setAnmFNDirect__FP14mDoExt_McaMorfiffPcPcPCc */ bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, char* soundFilename, const char* arcName) { bool ret = false; if(pMorf != 0 && animFilename != 0 && arcName != 0) { - void* pAnimRes = dComIfG_getObjectRes(arcName, animFilename); + J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes(arcName, animFilename); void* pSoundAnimRes = 0; if(soundFilename != 0) { pSoundAnimRes = dComIfG_getObjectRes(arcName, soundFilename); } - pMorf->setAnm((J3DAnmTransform*)pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); + pMorf->setAnm(pAnimRes, loopMode, morf, speed, 0.0f, -1.0f, pSoundAnimRes); ret = true; } @@ -539,7 +608,8 @@ cXyz dNpc_playerEyePos(f32 param_1) { return out; } -void dNpc_calc_DisXZ_AngY(cXyz param_1, cXyz param_2, float* param_3, short* param_4) { +/* 8021BDE8-8021BEC4 .text dNpc_calc_DisXZ_AngY__F4cXyz4cXyzPfPs */ +void dNpc_calc_DisXZ_AngY(cXyz param_1, cXyz param_2, float* param_3, s16* param_4) { cXyz diff; diff.x = param_2.x - param_1.x; diff.z = param_2.z - param_1.z; @@ -626,8 +696,9 @@ bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int return true; } +/* 8021C238-8021C2E8 .text swing_vertical_init__14dNpc_HeadAnm_cFsssi */ void dNpc_HeadAnm_c::swing_vertical_init(s16 param_1, s16 param_2, s16 param_3, int param_4) { - if(param_4 == 0 || mFunc != &swing_horizone) { + if(param_4 == 0 || mFunc != &swing_vertical) { field_0x1C = 0; field_0x20 = param_1; field_0x1E = param_2; @@ -638,9 +709,18 @@ void dNpc_HeadAnm_c::swing_vertical_init(s16 param_1, s16 param_2, s16 param_3, /* 8021C2E8-8021C3C8 .text swing_vertical__14dNpc_HeadAnm_cFv */ void dNpc_HeadAnm_c::swing_vertical() { - /* Nonmatching */ + s16 temp2 = field_0x1C; + field_0x1C += field_0x1E; + s16 temp = cM_ssin(field_0x1C) * field_0x14; + cLib_addCalcAngleS(&field_0x00, temp, 4, 0x1000, 0x100); + cLib_addCalcAngleS(&field_0x02, 0, 4, 0x1000, 0x100); + + if (temp2 < 0 && field_0x1C >= 0 && --field_0x20 <= 0) { + mFunc = NULL; + } } +/* 8021C3C8-8021C478 .text swing_horizone_init__14dNpc_HeadAnm_cFsssi */ void dNpc_HeadAnm_c::swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, int param_4) { if(param_4 == 0 || mFunc != &swing_vertical) { field_0x1C = 0; @@ -653,7 +733,15 @@ void dNpc_HeadAnm_c::swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, /* 8021C478-8021C55C .text swing_horizone__14dNpc_HeadAnm_cFv */ void dNpc_HeadAnm_c::swing_horizone() { - /* Nonmatching */ + s16 temp2 = field_0x1C; + field_0x1C += field_0x1E; + s16 temp = cM_ssin(field_0x1C) * field_0x18; + cLib_addCalcAngleS(&field_0x00, 0, 4, 0x1000, 0x100); + cLib_addCalcAngleS(&field_0x02, temp, 4, 0x1000, 0x100); + + if (temp2 < 0 && field_0x1C >= 0 && --field_0x20 <= 0) { + mFunc = NULL; + } } void dNpc_HeadAnm_c::move() { @@ -667,13 +755,13 @@ void dNpc_HeadAnm_c::move() { } /* 8021C5D8-8021C620 .text chkLim__14dNpc_JntCtrl_cFsii */ -s32 dNpc_JntCtrl_c::chkLim(s16 param_1, int param_2, int param_3) { - param_1 = cLib_maxLimit(param_1, mMaxAngles[param_2][param_3]); - param_1 = cLib_minLimit(param_1, mMinAngles[param_2][param_3]); - - return param_1; +int dNpc_JntCtrl_c::chkLim(s16 angle, int param_2, int param_3) { + angle = cLib_maxLimit(angle, mMaxAngles[param_2][param_3]); + angle = cLib_minLimit(angle, mMinAngles[param_2][param_3]); + return angle; } +/* 8021C620-8021C6D8 .text turn_fromBackbone2Head__14dNpc_JntCtrl_cFsPsPsb */ void dNpc_JntCtrl_c::turn_fromBackbone2Head(s16 param_1, s16* param_2, s16* param_3, bool param_4) { *param_3 = 0; if(field_0x0C == 0) { @@ -718,33 +806,120 @@ s16 dNpc_JntCtrl_c::follow_current(s16* orig, s16 diff) { } /* 8021C7D0-8021CAB8 .text lookAtTarget_2__14dNpc_JntCtrl_cFPsP4cXyz4cXyzssb */ -void dNpc_JntCtrl_c::lookAtTarget_2(short*, cXyz*, cXyz, short, short, bool) { - /* Nonmatching */ +void dNpc_JntCtrl_c::lookAtTarget_2(s16* r26, cXyz* r29, cXyz r24, s16 r7, s16 r27, bool r28) { + s16 targetY; + s16 targetX; + s32 r1_10; + s32 temp6; + s16 temp; + s16 temp2; + s32 temp4; + s32 r1_0C; + s16 r1_08[2]; + s16 deltaY; + s32 temp10; + s32 temp11; + s32 temp5; + int temp9; + s32 temp7; + + if (r29) { + targetY = cLib_targetAngleY(&r24, r29); + targetX = cLib_targetAngleX(&r24, r29); + } else { + targetY = r7; + targetX = 0; + } + + deltaY = targetY - *r26; + if (0 <= field_0x32) { + if (deltaY >= field_0x32 || field_0x32 == 0) { + turn_fromHead2Backbone(deltaY, &r1_08[1], &r1_08[0]); + } else { + turn_fromBackbone2Head(deltaY, &r1_08[1], &r1_08[0], 0 <= field_0x32); + } + } else { + if (deltaY <= field_0x32 || field_0x32 == 0) { + turn_fromHead2Backbone(deltaY, &r1_08[1], &r1_08[0]); + } else { + turn_fromBackbone2Head(deltaY, &r1_08[1], &r1_08[0], 0 <= field_0x32); + } + } + + field_0x2E = r1_08[1]; + field_0x32 = r1_08[0]; + temp10 = field_0x2E; + temp11 = field_0x32; + r1_10 = mAngles[0][1]; + r1_0C = mAngles[1][1]; + cLib_addCalcAngleL(&r1_10, temp10, 4, field_0x1E[0][0], 4); + cLib_addCalcAngleL(&r1_0C, temp11, 4, field_0x1E[0][0], 4); + mAngles[0][1] = r1_10; + mAngles[1][1] = r1_0C; + + if (field_0x0A && !r28) { + temp = *r26; + cLib_addCalcAngleS(r26, targetY, 4, r27, 0x100); + temp2 = *r26 - temp; + field_0x0A = temp2 != 0; + if (field_0x0C == 0) { + temp2 = follow_current(&mAngles[1][1], temp2); + } + if (field_0x0B == 0) { + follow_current(&mAngles[0][1], temp2); + } + } else { + temp4 = field_0x2E + field_0x32; + if (deltaY >= 0) { + field_0x0A = deltaY > temp4; + } else { + field_0x0A = deltaY < temp4; + } + } + + temp5 = targetX; + temp5 = chkLim(temp5, 0, 0); + targetX = targetX - (int)temp5; + temp9 = chkLim(targetX, 1, 0); + field_0x2C = temp5; + field_0x30 = temp9; + targetX = field_0x30; + temp7 = field_0x2C; + temp6 = field_0x30; + r1_10 = mAngles[0][0]; + r1_0C = mAngles[1][0]; + cLib_addCalcAngleL(&r1_10, temp7, 4, field_0x1E[0][0], 4); + cLib_addCalcAngleL(&r1_0C, temp6, 4, field_0x1E[0][0], 4); + mAngles[0][0] = r1_10; + mAngles[1][0] = r1_0C; } -bool dNpc_chkAttn(fopAc_ac_c* i_this, cXyz destPos, float param_3, float param_4, float param_5, bool param_6) { +/* 8021CAB8-8021CC4C .text dNpc_chkAttn__FP10fopAc_ac_c4cXyzfffb */ +bool dNpc_chkAttn(fopAc_ac_c* i_this, cXyz destPos, f32 param_3, f32 param_4, f32 param_5, bool param_6) { s16 angle = cLib_targetAngleY(&i_this->current.pos, &destPos); - f32 dist = sqrtf((i_this->current.pos - destPos).getMagXZ()); //this is gross but I haven't found a better way (temp destroys stack) + f32 dist = (i_this->current.pos - destPos).absXZ(); + f32 temp = param_3; s16 angle_diff = angle - i_this->current.angle.y; - if(param_5 > 359.0f) { - param_5 = 359.0f; - } - if (param_5 < 0.0f) { - param_5 = 0.0f; - } + param_5 = cLib_maxLimit(param_5, 359.0f); + param_5 = cLib_minLimit(param_5, 0.0f); + if(param_6) { - param_3 += param_4; + temp += param_4; } bool ret = false; - if(dist <= param_3 && abs(angle_diff) <= cM_deg2s(param_5)) { + if(dist <= temp && abs(angle_diff) <= cM_deg2s(param_5)) { ret = true; } return ret; } +static void dummyfunc(int i_pathInf) { + JUT_ASSERT(0, i_pathInf != 0); +} + dCcD_SrcCyl dNpc_cyl_src = { // dCcD_SrcGObjInf { diff --git a/src/d/d_npc_event_cut.inc b/src/d/d_npc_event_cut.inc index ebe032a33..b4a96d983 100644 --- a/src/d/d_npc_event_cut.inc +++ b/src/d/d_npc_event_cut.inc @@ -291,6 +291,7 @@ void dNpc_EventCut_c::cutMoveToActorStart() { } } +/* 8021D730-8021D9DC .text cutMoveToActorProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToActorProc() { if(mSetId != 0) { mTargetActorPos.set(0.0f, 0.0f, 0.0f); @@ -324,9 +325,7 @@ void dNpc_EventCut_c::cutMoveToActorProc() { dComIfGp_evmng_cutEnd(mEvtStaffId); } - cXyz diff = temp - mPos; - f32 tempf = diff.getSquareMag(); - f32 dist = sqrtf(tempf); + f32 dist = (temp - mpActor->current.pos).absXZ(); cLib_addCalc2(&mpActor->current.pos.x, temp.x, 0.1f, mSpeed); cLib_addCalc2(&mpActor->current.pos.z, temp.z, 0.1f, mSpeed); @@ -360,15 +359,13 @@ fopAc_ac_c* dNpc_EventCut_c::findActorCallBack(fopAc_ac_c* pActor, void* pData) } else { if(obj->mProcName == fopAcM_GetProfName(pActor) && obj->mSubtype == pActor->mSubtype) { - f32 mag = sqrtf(cut->mTargetActorPos.getSquareMag()); - - if(mag == 0.0f) { + if(cut->mTargetActorPos.abs() == 0.0f) { cut->mTargetActorPos = pActor->current.pos; cut->mpTargetActor = pActor; } else { - f32 mag1 = sqrtf((cut->mTargetActorPos - cut->mpActor->current.pos).getSquareMag()); - f32 mag2 = sqrtf((pActor->current.pos - cut->mpActor->current.pos).getSquareMag()); + f32 mag1 = (cut->mTargetActorPos - cut->mpActor->current.pos).abs(); + f32 mag2 = (pActor->current.pos - cut->mpActor->current.pos).abs(); if(mag2 < mag1) { cut->mTargetActorPos = pActor->current.pos; cut->mpTargetActor = pActor; @@ -519,17 +516,23 @@ void dNpc_EventCut_c::cutMoveToPosStart() { } } +/* 8021E168-8021E338 .text cutMoveToPosProc__15dNpc_EventCut_cFv */ void dNpc_EventCut_c::cutMoveToPosProc() { s16 angle = cLib_targetAngleY(&mpActor->current.pos, &mPos); - cXyz temp(pDelDistance * cM_ssin(angle), mPos.y, pDelDistance * cM_scos(angle)); + cXyz temp; + temp.x = mPos.x; + temp.y = mPos.y; + temp.z = mPos.z; + temp.x -= pDelDistance * cM_ssin(angle); + temp.z -= pDelDistance * cM_scos(angle); if(mSpeed == 0.0f) { mpActor->current.pos = temp; dComIfGp_evmng_cutEnd(mEvtStaffId); } - f32 dist = sqrtf((temp - mpActor->current.pos).getMagXZ()); + f32 dist = sqrtf((temp - mpActor->current.pos).abs2XZ()); cLib_addCalc2(&mpActor->current.pos.x, temp.x, 0.1f, mSpeed); cLib_addCalc2(&mpActor->current.pos.z, temp.z, 0.1f, mSpeed);