summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_npc_btsw2.cpp
diff options
context:
space:
mode:
authorLagoLunatic <LagoLunatic@users.noreply.github.com>2024-01-19 15:33:38 -0500
committerLagoLunatic <LagoLunatic@users.noreply.github.com>2024-01-19 15:33:38 -0500
commit433fe7c48686aa9ec200cc20acd0eb7fdd7ef516 (patch)
tree43da34c4691c86829a21052aed0800ddc33b89b8 /src/d/actor/d_a_npc_btsw2.cpp
parentfa5010b1dd87628d8ade65425ac2f24367585121 (diff)
d_a_npc_btsw2 100%, weak order not matching
Diffstat (limited to 'src/d/actor/d_a_npc_btsw2.cpp')
-rw-r--r--src/d/actor/d_a_npc_btsw2.cpp349
1 files changed, 328 insertions, 21 deletions
diff --git a/src/d/actor/d_a_npc_btsw2.cpp b/src/d/actor/d_a_npc_btsw2.cpp
index 70e32ab7..c3500745 100644
--- a/src/d/actor/d_a_npc_btsw2.cpp
+++ b/src/d/actor/d_a_npc_btsw2.cpp
@@ -7,8 +7,10 @@
#include "d/d_com_inf_game.h"
#include "d/d_item.h"
#include "d/d_procname.h"
+#include "d/d_snap.h"
#include "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_ext.h"
+#include "m_Do/m_Do_mtx.h"
enum BTSW_RES_FILE_ID {
/* BCKS */
@@ -163,8 +165,39 @@ static const int l_btp_ix_tbl[] = {
};
/* 000001A8-000003E0 .text nodeCallBack__FP7J3DNodei */
-static BOOL nodeCallBack(J3DNode*, int) {
- /* Nonmatching */
+static BOOL nodeCallBack(J3DNode* node, int param_1) {
+ if (!param_1) {
+ J3DModel* model = j3dSys.getModel();
+ J3DJoint* joint = (J3DJoint*)node;
+ daNpc_Btsw2_c* i_this = (daNpc_Btsw2_c*)model->getUserArea();
+ if (i_this) {
+ static cXyz a_att_pos_offst(0.0f, 0.0f, 0.0f);
+ static cXyz a_eye_pos_offst(10.0f, 20.0f, 0.0f);
+ u16 jointNo = joint->getJntNo();
+ mDoMtx_stack_c::copy(model->getAnmMtx(jointNo));
+ if (jointNo == i_this->m_jnt.getHeadJntNum()) {
+ mDoMtx_stack_c::multVec(&a_att_pos_offst, &i_this->m704);
+ Mtx sp14;
+ cMtx_copy(mDoMtx_stack_c::get(), sp14);
+ cXyz sp8;
+ mDoMtx_multVecZero(sp14, &sp8);
+ sp14[0][3] = sp14[1][3] = sp14[2][3] = 0.0f;
+ mDoMtx_stack_c::transS(sp8);
+ mDoMtx_stack_c::YrotM(i_this->current.angle.y + i_this->m_jnt.getHead_y());
+ mDoMtx_stack_c::XrotM(-i_this->m_jnt.getHead_x());
+ mDoMtx_stack_c::YrotM(-i_this->current.angle.y);
+ mDoMtx_stack_c::concat(sp14);
+ mDoMtx_stack_c::multVec(&a_eye_pos_offst, &i_this->mEyePos);
+ } else if (jointNo == i_this->m_jnt.getBackboneJntNum()) {
+ int backboneY = i_this->m_jnt.getBackbone_y();
+ mDoMtx_stack_c::XrotM(backboneY);
+ mDoMtx_stack_c::ZrotM(-i_this->m_jnt.getBackbone_x());
+ }
+ cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
+ model->setAnmMtx(jointNo, mDoMtx_stack_c::get());
+ }
+ }
+ return TRUE;
}
/* 0000041C-00000524 .text initTexPatternAnm__13daNpc_Btsw2_cFb */
@@ -182,42 +215,155 @@ BOOL daNpc_Btsw2_c::initTexPatternAnm(bool r31) {
/* 00000524-000005B0 .text playTexPatternAnm__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::playTexPatternAnm() {
- /* Nonmatching */
+ if (cLib_calcTimer(&m6F4) == 0) {
+ if (m6F0 >= m_btp->getFrameMax()) {
+ m6F0 -= m_btp->getFrameMax();
+ m6F4 = 30 + cM_rndF(100.0f);
+ } else {
+ m6F0++;
+ }
+ }
}
/* 000005B0-0000067C .text setAnm__13daNpc_Btsw2_cFSc */
-void daNpc_Btsw2_c::setAnm(s8) {
- /* Nonmatching */
+void daNpc_Btsw2_c::setAnm(s8 param_0) {
+ static int a_play_mode_tbl[] = {
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_ONCE_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_ONCE_e,
+ J3DFrameCtrl::LOOP_REPEAT_e,
+ J3DFrameCtrl::LOOP_ONCE_e,
+ };
+ static f32 a_morf_frame_tbl[] = {
+ 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
+ };
+ static f32 a_play_speed_tbl[] = {
+ 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
+ };
+
+ if (param_0 == m745) {
+ return;
+ }
+ if (m745 == -1) {
+ return;
+ }
+
+ m745 = param_0;
+
+ dNpc_setAnm(
+ mpMcaMorf, a_play_mode_tbl[m747],
+ a_morf_frame_tbl[m747], a_play_speed_tbl[m747],
+ l_bck_ix_tbl[m745], -1,
+ m_arc_name
+ );
+
+ if (m745 == 7 || m745 == 8) {
+ m_jnt.onHeadLock();
+ } else {
+ m_jnt.offHeadLock();
+ }
}
/* 0000067C-000007D0 .text chkAttention__13daNpc_Btsw2_cF4cXyzs */
-void daNpc_Btsw2_c::chkAttention(cXyz, s16) {
- /* Nonmatching */
+bool daNpc_Btsw2_c::chkAttention(cXyz pos, s16 r29) {
+ fopAc_ac_c* player = dComIfGp_getPlayer(0);
+ f32 f30 = l_HIO.mNpc.m24;
+ int r30 = l_HIO.mNpc.m20;
+ cXyz delta;
+ delta.x = player->current.pos.x - pos.x;
+ delta.z = player->current.pos.z - pos.z;
+ f32 f31 = sqrtf(delta.x*delta.x + delta.z*delta.z);
+ s16 r3 = cM_atan2s(delta.x, delta.z);
+ if (m71D) {
+ f30 += 40.0f;
+ r30 += 0x071C;
+ }
+ r3 -= r29;
+ return r30 > abs(r3) && f30 > f31;
}
/* 000007D0-00000820 .text eventOrder__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::eventOrder() {
- /* Nonmatching */
+ if (m746 == 1 || m746 == 2) {
+ mEvtInfo.onCondition(dEvtCmd_INTALK_e);
+ if (m746 == 1) {
+ fopAcM_orderSpeakEvent(this);
+ }
+ }
}
/* 00000820-00000860 .text checkOrder__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::checkOrder() {
- /* Nonmatching */
+ if (mEvtInfo.checkCommandDemoAccrpt()) {
+ return;
+ }
+ if (mEvtInfo.checkCommandTalk()) {
+ if (m746 == 1 || m746 == 2) {
+ m746 = 0;
+ m71E = true;
+ }
+ }
}
/* 00000860-0000097C .text anmAtr__13daNpc_Btsw2_cFUs */
void daNpc_Btsw2_c::anmAtr(u16) {
- /* Nonmatching */
+ switch (dComIfGp_getMesgAnimeAttrInfo()) {
+ case 0:
+ setAnm(0);
+ break;
+ case 1:
+ setAnm(1);
+ break;
+ case 2:
+ setAnm(2);
+ break;
+ case 3:
+ setAnm(3);
+ break;
+ case 4:
+ setAnm(4);
+ break;
+ case 5:
+ setAnm(5);
+ break;
+ case 6:
+ setAnm(6);
+ break;
+ }
+
+ if (mpMcaMorf->checkFrame(mpMcaMorf->getEndFrame()-1.0f)) {
+ if (m745 == 4 || m745 == 6) {
+ setAnm(1);
+ }
+ }
+
+ dComIfGp_clearMesgAnimeAttrInfo();
}
/* 0000097C-000009EC .text getMsg__13daNpc_Btsw2_cFv */
u32 daNpc_Btsw2_c::getMsg() {
- /* Nonmatching */
+ if (!dComIfGs_isEventBit(0x3102)) {
+ dComIfGs_onEventBit(0x3102);
+ return 0x1AB0;
+ }
+
+ // Fakematch? Need to force the compiler to use a branch here, but it optimizes an if statement away.
+ switch (dKy_daynight_check()) {
+ default:
+ return 0x1AB2;
+ case FALSE:
+ return 0x1AB1;
+ }
}
/* 000009EC-000009F4 .text next_msgStatus__13daNpc_Btsw2_cFPUl */
u16 daNpc_Btsw2_c::next_msgStatus(u32*) {
- /* Nonmatching */
return fopMsgStts_MSG_ENDS_e;
}
@@ -228,7 +374,35 @@ void daNpc_Btsw2_c::setAttention() {
/* 00000A20-00000B94 .text lookBack__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::lookBack() {
- /* Nonmatching */
+ cXyz sp38;
+ cXyz sp2c;
+ sp2c.setall(0.0f);
+ cXyz* r31 = NULL;
+ s16 r30 = current.angle.y;
+ bool r29 = true;
+
+ switch (m747) {
+ case 1:
+ case 2:
+ if (m747 == 2) {
+ r29 = false;
+ m_jnt.setTrn();
+ if (m71D == 0) {
+ sp38 = dNpc_playerEyePos(l_HIO.mNpc.m04);
+ s16 r4 = cLib_targetAngleY(&current.pos, &sp38);
+ cLib_addCalcAngleS2(&current.angle.y, r4, 4, 0x1800);
+ }
+ }
+ if (m71D) {
+ sp38 = dNpc_playerEyePos(l_HIO.mNpc.m04);
+ r31 = &sp38;
+ sp2c = current.pos;
+ sp2c.y = mEyePos.y;
+ }
+ break;
+ }
+
+ m_jnt.lookAtTarget(&current.angle.y, r31, sp2c, r30, l_HIO.mNpc.mMaxHeadTurnVel, r29);
}
/* 00000B94-00000BB4 .text CallbackCreateHeap__FP10fopAc_ac_c */
@@ -238,7 +412,6 @@ static BOOL CallbackCreateHeap(fopAc_ac_c* i_this) {
/* 00000BB4-00000EFC .text CreateHeap__13daNpc_Btsw2_cFv */
BOOL daNpc_Btsw2_c::CreateHeap() {
- /* Nonmatching */
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, BTSW_INDEX_BDL_BN));
JUT_ASSERT(616, modelData != 0);
mpMcaMorf = new mDoExt_McaMorf(
@@ -258,12 +431,12 @@ BOOL daNpc_Btsw2_c::CreateHeap() {
m6F1 = modelData->getJointName()->getIndex("handL");
m6F2 = modelData->getJointName()->getIndex("handR");
- modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, BTSW_INDEX_BDL_BN_KABAN));
+ modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("Btsw", BTSW_INDEX_BDL_BN_KABAN));
m6D0 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (m6D0 == NULL) {
return FALSE;
}
- modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, BTSW_INDEX_BDL_BN_TIRASI));
+ modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("Btsw", BTSW_INDEX_BDL_BN_TIRASI));
m6D4 = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
if (m6D4 == NULL) {
return FALSE;
@@ -321,17 +494,103 @@ void daNpc_Btsw2_c::wait01() {
/* 0000111C-000011A8 .text talk01__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::talk01() {
- /* Nonmatching */
+ if (talk(1) == fopMsgStts_BOX_CLOSED_e) {
+ m747 = 1;
+ dComIfGp_event_reset();
+ m71E = false;
+ if (m742 == 0) {
+ m736 = 1;
+ setAnm(0);
+ } else {
+ setAnm(0);
+ }
+ }
}
/* 000011A8-00001574 .text pathMove__13daNpc_Btsw2_cFv */
void daNpc_Btsw2_c::pathMove() {
- /* Nonmatching */
+ if (m742 > 0) {
+ m742--;
+ if (m742 == 0) {
+ setAnm(7);
+ m73E = 1.0f + cM_rndF(3.0f);
+ }
+ if (m745 == 8 && mpMcaMorf->checkFrame(mpMcaMorf->getEndFrame()-1.0f)) {
+ setAnm(0);
+ }
+ return;
+ }
+
+ cXyz sp54;
+ int r30 = m740 < m73C ? (s16)(m740+1) : 0; // fakematch?
+ dPath__Point* pnt = &mpPath->mpPnt[(s16)r30];
+ sp54.set(pnt->mPos.x, pnt->mPos.y, pnt->mPos.z);
+ s16 r29 = cLib_targetAngleY(&current.pos, &sp54);
+ cLib_addCalcAngleS2(&current.angle.y, r29, l_HIO.m32, l_HIO.m30);
+ cXyz sp48 = sp54 - current.pos;
+ speedF = l_HIO.m34;
+ if (sp48.normalizeRS()) {
+ cXyz sp3c(
+ cM_ssin(current.angle.y),
+ 0.0f,
+ cM_scos(current.angle.y)
+ );
+ speedF += l_HIO.m38 * sp48.inprod(sp3c);
+ }
+
+ if (m736 != 0) {
+ speedF = 0.0f;
+ s16 r27 = cLib_distanceAngleS(current.angle.y, r29);
+ cLib_addCalcAngleS2(&current.angle.y, r29, 4, 0x1800);
+ if (r27 < 0x10) {
+ m736 = 0;
+ setAnm(7);
+ }
+ }
+
+ fopAcM_posMoveF(this, mStts.GetCCMoveP());
+
+ cXyz sp30 = sp54 - current.pos;
+ if (sp30.absXZ() < 10.0f) {
+ m740 = r30;
+ if (m73E > 0) {
+ m73E--;
+ return;
+ }
+ if (cM_rndF(1.0f) < 0.5f) {
+ setAnm(0);
+ } else {
+ setAnm(8);
+ }
+ m742 = l_HIO.m3C + cM_rndF(l_HIO.m3E);
+ }
}
/* 00001574-00001660 .text wait_action__13daNpc_Btsw2_cFPv */
BOOL daNpc_Btsw2_c::wait_action(void*) {
- /* Nonmatching */
+ if (m74A == 0) {
+ m747 = 1;
+ m74A++;
+ } else if (m74A != -1) {
+ s16 angleY = current.angle.y + m_jnt.getHead_y() + m_jnt.getBackbone_y();
+ m71D = chkAttention(current.pos, angleY);
+ m746 = 0;
+
+ switch (m747) {
+ case 1:
+ wait01();
+ pathMove();
+ break;
+ case 2:
+ talk01();
+ break;
+ }
+
+ lookBack();
+ setAttention();
+ }
+
+ return TRUE;
}
/* 00001660-00001884 .text _create__13daNpc_Btsw2_cFv */
@@ -370,12 +629,60 @@ BOOL daNpc_Btsw2_c::_delete() {
/* 00001C8C-00001DDC .text _execute__13daNpc_Btsw2_cFv */
BOOL daNpc_Btsw2_c::_execute() {
- /* Nonmatching */
+ m_jnt.setParam(
+ l_HIO.mNpc.m0A, l_HIO.mNpc.mMaxBackBoneRot, l_HIO.mNpc.m12, l_HIO.mNpc.mMinBackBoneRot,
+ l_HIO.mNpc.m08, l_HIO.mNpc.mMaxHeadRot, l_HIO.mNpc.m10, l_HIO.mNpc.mMinHeadRot,
+ l_HIO.mNpc.m18
+ );
+ playTexPatternAnm();
+ mpMcaMorf->play(&mEyePos, 0, 0);
+ checkOrder();
+ if (!mEventCut.cutProc()) {
+ (this->*mCurrActionFunc)(NULL);
+ }
+ eventOrder();
+ mObjAcch.CrrPos(*dComIfG_Bgsp());
+ mTevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mObjAcch.m_gnd);
+ mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mObjAcch.m_gnd);
+
+ J3DModel* model = mpMcaMorf->getModel();
+ mDoMtx_stack_c::transS(current.pos);
+ mDoMtx_stack_c::YrotM(current.angle.y);
+ model->setBaseTRMtx(mDoMtx_stack_c::get());
+
+ setCollision(60.0f, 150.0f);
+
+ return TRUE;
}
/* 00001DDC-00001F6C .text _draw__13daNpc_Btsw2_cFv */
BOOL daNpc_Btsw2_c::_draw() {
- /* Nonmatching */
+ J3DModel* model = mpMcaMorf->getModel();
+ J3DModelData* modelData = model->getModelData();
+
+ g_env_light.settingTevStruct(TEV_TYPE_ACTOR, &current.pos, &mTevStr);
+ g_env_light.setLightTevColorType(model, &mTevStr);
+ g_env_light.setLightTevColorType(m6D0, &mTevStr);
+ g_env_light.setLightTevColorType(m6D4, &mTevStr);
+
+ mBtpAnm.entry(modelData, m6F0);
+ mpMcaMorf->updateDL();
+ m6D0->setBaseTRMtx(model->getAnmMtx(m6F1));
+ m6D4->setBaseTRMtx(model->getAnmMtx(m6F2));
+ mDoExt_modelUpdateDL(m6D0);
+ mDoExt_modelUpdateDL(m6D4);
+ mBtpAnm.remove(modelData);
+
+ cXyz sp8(current.pos.x, current.pos.y + 130.0f, current.pos.z);
+ mShadowId = dComIfGd_setShadow(
+ mShadowId, 1, mpMcaMorf->getModel(), &sp8, 800.0f, 20.0f,
+ current.pos.y, mObjAcch.GetGroundH(), mObjAcch.m_gnd, &mTevStr,
+ 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()
+ );
+
+ dSnap_RegistFig(DSNAP_TYPE_BTSW, this, current.pos, current.angle.y, 1.0f, 1.0f, 1.0f);
+
+ return TRUE;
}
/* 00001F6C-00001F8C .text daNpc_Btsw2_Create__FP10fopAc_ac_c */