From 830635950df59bbda3dfc18e88d5d0eec7300782 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 15 Nov 2023 22:47:37 -0500 Subject: [PATCH] d_a_rd work --- include/SSystem/SComponent/c_cc_d.h | 1 + include/d/actor/d_a_rd.h | 10 +- include/d/d_detect.h | 6 +- include/d/d_npc.h | 24 +- src/d/actor/d_a_rd.cpp | 441 +++++++++++++++++++++++++++- src/d/d_npc.cpp | 26 +- 6 files changed, 465 insertions(+), 43 deletions(-) diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index 13caa88eb..87d14f9d8 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -518,6 +518,7 @@ public: void OffCoSetBit() { mObjCo.ClrSet(); } void SetTgType(u32 type) { mObjTg.SetType(type); } void OnTgSPrmBit(u32 flag) { mObjTg.OnSPrmBit(flag); } + void OffTgSPrmBit(u32 flag) { mObjTg.OffSPrmBit(flag); } void OffAtSetBit() { mObjAt.ClrSet(); } void OnAtHitBit() { mObjAt.OnHitBit(); } void OffAtHitBit() { mObjAt.OffHitBit(); } diff --git a/include/d/actor/d_a_rd.h b/include/d/actor/d_a_rd.h index c25feee00..c1cedfdd3 100644 --- a/include/d/actor/d_a_rd.h +++ b/include/d/actor/d_a_rd.h @@ -87,7 +87,7 @@ public: bool checkPlayerInAttack(); bool checkPlayerInCry(); void lookBack(); - void checkTgHit(); + bool checkTgHit(); void setCollision(); void setIceCollision(); void setAttention(); @@ -161,8 +161,8 @@ public: /* 0x6D8 */ s8 m6D8; /* 0x6D9 */ s8 m6D9; /* 0x6DA */ s8 m6DA; - /* 0x6DB */ u8 m6DB; - /* 0x6DC */ u8 m6DC; + /* 0x6DB */ s8 m6DB; + /* 0x6DC */ s8 m6DC; /* 0x6DD */ u8 m6DD[0x6E0 - 0x6DD]; /* 0x6E0 */ enemyice mEnemyIce; /* 0xA98 */ enemyfire mEnemyFire; @@ -178,7 +178,9 @@ public: /* 0xD1A */ s16 mD1A; /* 0xD1C */ s16 mD1C; /* 0xD1E */ s16 mD1E; - /* 0xD20 */ u8 mD20[0xD34 - 0xD20]; + /* 0xD20 */ u8 mD20[0xD2E - 0xD20]; + /* 0xD2E */ s16 mD2E; + /* 0xD30 */ u8 mD30[0xD34 - 0xD30]; /* 0xD34 */ bool mbIkari; /* 0xD35 */ u8 mD35[0xD38 - 0xD35]; /* 0xD38 */ f32 mD38; diff --git a/include/d/d_detect.h b/include/d/d_detect.h index 61d15dfa4..bb449da33 100644 --- a/include/d/d_detect.h +++ b/include/d/d_detect.h @@ -17,10 +17,10 @@ public: void proc(); bool chk_quake(const cXyz*) const; void set_quake(const cXyz*); - void chk_quake_area(const cXyz*) const; + bool chk_quake_area(const cXyz*) const; void search_tag_light(void*, void*); - void chk_light(const cXyz*) const; - void chk_attention(cXyz*) const; + bool chk_light(const cXyz*) const; + bool chk_attention(cXyz*) const; /* 0x00 */ dDetectPlace_c mPlace[1]; /* 0x10 */ s16 mTimer; diff --git a/include/d/d_npc.h b/include/d/d_npc.h index 1dc62cbda..ed283b4d6 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -42,9 +42,9 @@ public: // /* 0x06 */ s16 mBackboneLeftRightRot; /* 0x08 */ s8 mHeadJntNum; /* 0x09 */ s8 mBackboneJntNum; - /* 0x0A */ bool field_0x0A; - /* 0x0B */ u8 field_0x0B; - /* 0x0C */ u8 field_0x0C; + /* 0x0A */ bool mbTrn; + /* 0x0B */ bool mbHeadLock; + /* 0x0C */ bool mbBackBoneLock; /* 0x0D */ u8 field_0x0D; /* 0x0E */ s16 mMinAngles[2][2]; /* 0x16 */ s16 mMaxAngles[2][2]; @@ -65,8 +65,8 @@ public: public: dNpc_JntCtrl_c() { - field_0x0C = 0; - field_0x0B = 0; + mbBackBoneLock = false; + mbHeadLock = false; } s8 getHeadJntNum() { return mHeadJntNum; } @@ -81,13 +81,13 @@ public: void setHead_y(s16 angle) { mAngles[0][1] = angle; } void setBackBone_x(s16 angle) { mAngles[1][0] = angle; } void setBackBone_y(s16 angle) { mAngles[1][1] = angle; } - void onHeadLock() {} - void onBackBoneLock() {} - void offHeadLock() {} - void offBackBoneLock() {} - void setTrn() {} - void clrTrn() {} - void trnChk() {} + bool trnChk() { return mbTrn; } + void setTrn() { mbTrn = true; } + void clrTrn() { mbTrn = false; } + void onHeadLock() { mbHeadLock = true; } + void onBackBoneLock() { mbBackBoneLock = true; } + void offHeadLock() { mbHeadLock = false; } + void offBackBoneLock() { mbBackBoneLock = false; } bool angCalcS(s16*, s16, s16, s16); void limitter(s16*, s16, s16); diff --git a/src/d/actor/d_a_rd.cpp b/src/d/actor/d_a_rd.cpp index 007ff6a6a..36de53c26 100644 --- a/src/d/actor/d_a_rd.cpp +++ b/src/d/actor/d_a_rd.cpp @@ -12,6 +12,10 @@ #include "d/d_lib.h" #include "d/d_material.h" #include "d/d_snap.h" +#include "d/actor/d_a_player.h" +#include "d/d_cc_uty.h" +#include "d/d_s_play.h" +#include "d/d_item_data.h" // Needed for the .data section to match. static Vec dummy1 = {1.0f, 1.0f, 1.0f}; @@ -441,22 +445,287 @@ bool daRd_c::checkPlayerInCry() { /* 00000AA0-00000D78 .text lookBack__6daRd_cFv */ void daRd_c::lookBack() { - /* Nonmatching */ + daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); + bool r29 = false; + if (cLib_calcTimer(&mCE4) != 0 && mMode != 7 && mMode != 5 && mMode != 3) { + mJntCtrl.clrTrn(); + mJntCtrl.offHeadLock(); + mJntCtrl.offBackBoneLock(); + mCC4 = player->getHeadTopPos(); + } else { + switch (mMode) { + case 0: + case 3: + case 7: + r29 = false; + mJntCtrl.clrTrn(); + mJntCtrl.onHeadLock(); + mJntCtrl.onBackBoneLock(); + break; + case 4: + case 5: + case 8: + case 9: + mJntCtrl.setTrn(); + // Fall-through + default: + mJntCtrl.offHeadLock(); + mJntCtrl.offBackBoneLock(); + break; + } + + switch (m6D9) { + case 0x2: + case 0x9: + case 0xA: + r29 = false; + mJntCtrl.clrTrn(); + mJntCtrl.onHeadLock(); + mJntCtrl.onBackBoneLock(); + } + + switch (mMode) { + case 5: + if (dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m42, 150.0f, 100.0f)) { + mJntCtrl.clrTrn(); + mJntCtrl.onHeadLock(); + mJntCtrl.onBackBoneLock(); + } + mCC4 = player->getHeadTopPos(); + break; + case 8: + if (dLib_checkActorInCircle(m300, this, 100.0f, 1000.0f)) { + mJntCtrl.clrTrn(); + mJntCtrl.onHeadLock(); + mJntCtrl.onBackBoneLock(); + } + mCC4 = m300; + break; + case 9: + break; + default: + mCC4 = player->getHeadTopPos(); + break; + } + } + + if (mJntCtrl.trnChk()) { + cLib_addCalcAngleS2(&mCDC, l_HIO.m04.m1A, 4, 0x800); + } else { + mCDC = 0; + } + + mJntCtrl.lookAtTarget(&shape_angle.y, &mCC4, mCD0, shape_angle.y, mCDC, r29); } /* 00000D78-00001650 .text checkTgHit__6daRd_cFv */ -void daRd_c::checkTgHit() { - /* Nonmatching */ +bool daRd_c::checkTgHit() { + if (mMode == 3 || mMode == 0xB || mMode == 0xA) { + return false; + } + + cCcD_Obj* hitObj; + + if (mCyl.ChkTgHit()) { + hitObj = mCyl.GetTgHitObj(); + if (hitObj->GetAtType() == AT_TYPE_LIGHT) { + fopAcM_seStart(this, JA_SE_CM_PW_BECOME_SOLID, 0); + modeProcInit(2); + return true; + } + } + + daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); + mStts.Move(); + if (cLib_calcTimer(&m2C4) == 0 && mCyl.ChkTgHit()) { + bool r29 = true; + hitObj = mCyl.GetTgHitObj(); + m2C4 = l_HIO.m48; + if (hitObj == NULL) { + return false; + } + + + switch (hitObj->GetAtType()) { + case AT_TYPE_SWORD: + case AT_TYPE_MACHETE: + case AT_TYPE_UNK800: + case AT_TYPE_DARKNUT_SWORD: + case AT_TYPE_MOBLIN_SPEAR: + fopAcM_seStart(this, JA_SE_LK_SW_HIT_S, 0x20); + + switch (player->getCutType()) { + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case 0x09: + case 0x0A: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x10: + case 0x15: + case 0x19: + case 0x1A: + case 0x1B: + m2C5 = 1; + break; + default: + m2C5 = 0; + break; + } + break; + case AT_TYPE_LEAF_WIND: + r29 = false; + m2C5 = 3; + mCE0 = 40; + break; + case AT_TYPE_BOOMERANG: + case AT_TYPE_BOKO_STICK: + r29 = false; + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44); + m2C5 = 4; + mCE0 = 40; + break; + case AT_TYPE_HOOKSHOT: + fopAcM_seStart(this, JA_SE_LK_HS_SPIKE, 0x44); + r29 = false; + m2C5 = 12; + break; + case AT_TYPE_SKULL_HAMMER: + case AT_TYPE_STALFOS_MACE: + fopAcM_seStart(this, JA_SE_LK_HAMMER_HIT, 0x20); + m2C5 = 7; + if (player->getCutType() == 0x11) { + m2C5 = 8; + } + break; + case AT_TYPE_BOMB: + m2C5 = 6; + break; + case AT_TYPE_ICE_ARROW: + r29 = false; + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44); + mEnemyIce.mFreezeDuration = l_HIO.m4A; + enemy_fire_remove(&mEnemyFire); + mHealth += 4; + m2C5 = 9; + break; + case AT_TYPE_FIRE_ARROW: + r29 = false; + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44); + mEnemyFire.mFireDuration = l_HIO.m4C; + m2C5 = 0xA; + break; + case AT_TYPE_LIGHT_ARROW: + r29 = false; + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); + mEnemyIce.mLightShrinkTimer = 1; + m2C5 = 0xB; + break; + case AT_TYPE_NORMAL_ARROW: + m2C5 = 5; + if (!dLib_checkActorInCircle(current.pos, player, l_HIO.m38, 1000.0f)) { + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44); + mCE0 = 40; + r29 = false; + } else { + fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); + } + break; + case AT_TYPE_FIRE: + case AT_TYPE_UNK20000: + r29 = false; + if (mEnemyFire.mState == 0) { + mEnemyFire.mFireDuration = l_HIO.m4C; + } else { + m2C5 = 0xD; + } + break; + case AT_TYPE_GRAPPLING_HOOK: + dComIfGp_particle_set(0x27B, &mAttentionInfo.mPosition); + fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44); + m2C5 = 0xE; + r29 = false; + mCE0 = 40; + break; + } + + CcAtInfo atInfo; + atInfo.pParticlePos = NULL; + atInfo.mpObj = mCyl.GetTgHitObj(); + if (r29) { + cXyz* temp = mCyl.GetTgHitPosP(); + cc_at_check(this, &atInfo); + if (m2C5 == 1 || m2C5 == 7 || m2C5 == 8 || mHealth <= 0) { + dComIfGp_particle_set(0x10, mCyl.GetTgHitPosP()); + cXyz scale(2.0f, 2.0f, 2.0f); + dComIfGp_particle_set(0xF, temp, &player->shape_angle, &scale); + if (mHealth <= 0) { + modeProcInit(3); + } else { + modeProcInit(1); + } + } else { + dComIfGp_particle_set(0xD, temp, &player->shape_angle); + modeProcInit(1); + } + } else if (m2C5 == 0xE) { + s8 origHealth = mHealth; + mHealth = 0xA; + cc_at_check(this, &atInfo); + mHealth = origHealth; + } + + return true; + } + + if (dComIfGp_getDetect().chk_light(¤t.pos)) { + fopAcM_seStart(this, JA_SE_CM_PW_BECOME_SOLID, 0); + modeProcInit(2); + return true; + } + + return false; } /* 00001650-000017D0 .text setCollision__6daRd_cFv */ void daRd_c::setCollision() { - /* Nonmatching */ + if (mMode == 3) { + mCyl.OffCoSPrmBit(0x10); + mCyl.OffCoSPrmBit(0x02); + mCyl.OffTgSPrmBit(0x01); + mCyl.OffTgSPrmBit(0x08); + } else if (mMode == 7 || mMode == 5 || dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) { + mCyl.OffCoSPrmBit(0x10); + mCyl.OffCoSPrmBit(0x02); + } else { + mCyl.OnCoSPrmBit(0x10); + mCyl.OnCoSPrmBit(0x02); + } + + if (m6D9 == 2) { + mCyl.SetR(80.0f + g_regHIO.mChild[8].mFloatRegs[1]); + mCyl.SetH(170.0f + g_regHIO.mChild[8].mFloatRegs[0]); + } else { + mCyl.SetR(80.0f + g_regHIO.mChild[8].mFloatRegs[1]); + mCyl.SetH(250.0f + g_regHIO.mChild[8].mFloatRegs[0]); + } + + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); } /* 000017D0-0000180C .text setIceCollision__6daRd_cFv */ void daRd_c::setIceCollision() { - /* Nonmatching */ + if (m6D9 == 2) { + mEnemyIce.mWallRadius = 50.0f; + mEnemyIce.mCylHeight = 170.0f; + } else { + mEnemyIce.mWallRadius = 50.0f; + mEnemyIce.mCylHeight = 250.0f; + } } /* 0000180C-00001970 .text setAttention__6daRd_cFv */ @@ -466,7 +735,11 @@ void daRd_c::setAttention() { /* 00001970-000019F8 .text setMtx__6daRd_cFv */ void daRd_c::setMtx() { - /* Nonmatching */ + J3DModel* model = mpMorf->getModel(); + model->setBaseScale(mScale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + model->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 000019F8-00001A3C .text modeWaitInit__6daRd_cFv */ @@ -702,13 +975,63 @@ void daRd_c::modeProc(daRd_c::Proc_e proc, int newMode) { } /* 000038D4-000039AC .text setBrkAnm__6daRd_cFSc */ -void daRd_c::setBrkAnm(s8) { - /* Nonmatching */ +void daRd_c::setBrkAnm(s8 idx) { + static const int a_anm_idx_tbl[] = { + RD_BRK_NML, + RD_BRK_BEAM_HIT, + RD_BRK_BEAM, + RD_BRK_BEAM_END, + }; + static const int a_play_mod_tbl[] = { + 0, 0, 2, 0, + }; + + J3DModel* model = mpMorf->getModel(); + J3DAnmTevRegKey* brk = static_cast(dComIfG_getObjectRes(m_arc_name, a_anm_idx_tbl[idx])); + JUT_ASSERT(1890, brk != 0); + mBrkAnm.init(model->getModelData(), brk, true, a_play_mod_tbl[idx], 1.0f, 0, -1, true, 0); } /* 000039AC-00003B3C .text setBtkAnm__6daRd_cFSc */ -void daRd_c::setBtkAnm(s8) { - /* Nonmatching */ +void daRd_c::setBtkAnm(s8 idx) { + static const int a_anm_idx_tbl[] = { + RD_BTK_RD_IKARI, + RD_BTK_RD_NML, + RD_BTK_RD_OPEN, + RD_BTK_RD_CLOSE, + }; + struct play_prm_struct { + s8 m00; + s8 m01; + s32 m04; + }; + static const play_prm_struct a_play_prm_tbl[] = { + {0x01, -1, 0x00}, + {0x00, -1, 0x02}, + {0x01, -1, 0x02}, + {0x02, 0x01, 0x00}, + {0x03, 0x02, 0x00}, + }; + + if (idx != 5) { + m6DB = idx; + } + + int r5 = a_play_prm_tbl[m6DB].m00; + if (m6DC != m6DB && r5 != -1) { + J3DAnmTextureSRTKey* btk = static_cast(dComIfG_getObjectRes(m_arc_name, a_anm_idx_tbl[r5])); + JUT_ASSERT(1930, btk != 0); + J3DModelData* modelData = mpMorf->getModel()->getModelData(); + mBtkAnm.init(modelData, btk, true, a_play_prm_tbl[m6DB].m04, 1.0f, 0, -1, true, 0); + + if (mBtkAnm.isStop()) { + if (a_play_prm_tbl[m6DB].m01 != -1 && a_play_prm_tbl[m6DB].m04 == 0) { + m6DB = a_play_prm_tbl[m6DB].m01; + } + } + } + + m6DC = m6DB; } const int a_anm_bcks_tbl[] = { @@ -760,7 +1083,103 @@ void daRd_c::setAnm(s8 param_1, bool param_2) { /* 00003C48-000040A8 .text _execute__6daRd_cFv */ bool daRd_c::_execute() { - /* Nonmatching */ + if (mMode == 0xA) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mAcch.CrrPos(*dComIfG_Bgsp()); + setMtx(); + mpMorf->play(NULL, 0, 0); + mpMorf->calc(); + modeProc(PROC_EXEC, 0xC); + return true; + } + + fopAcM_setGbaName(this, MIRROR_SHIELD, 0x12, 0x30); + setIceCollision(); + if (mMode != 9 && mMode != 3 && mMode != 1 && mMode != 7 && mMode != 5 && mMode != 6) { + daRd_c* redead = (daRd_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)&searchNeadDeadRd_CB, this); + if (redead != NULL) { + m6D0 = fopAcM_GetID(redead); + modeProcInit(0x9); + } + } + if (mMode != 7 && mMode != 0 && mMode != 3 && mMode != 8) { + if (dComIfGp_evmng_startCheck("DEFAULT_RD_ATTACK")) { + modeProcInit(0x8); + } + } + current.angle = shape_angle; + + if (mEnemyFire.mState == 0) { // Not on fire (TODO enum) + mCyl.SetAtType(0); + m6D4 = l_HIO.m4E; + } else { + mCyl.SetAtType(AT_TYPE_FIRE); + if (mMode != 3 && mMode != 5 && mMode != 7) { + if (cLib_calcTimer(&m6D4) == 0) { + modeProcInit(0x3); + } + } + } + + if (enemy_ice(&mEnemyIce)) { + mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get()); + mpMorf->calc(); + speedF = 0.0f; + setAttention(); + return true; + } + + if (mCE0 == 1) { + mCE4 = 4*30; + } + + if (cLib_calcTimer(&mCE0) == 0) { + cLib_addCalcAngleS2(&mD1E, 0, 0xC, 0x100); + cLib_addCalcAngleS2(&mD2E, 0, 0xC, 0x100); + } else { + cLib_addCalcAngleS2(&mD1E, 0x2000, 0x4, 0x800); + cLib_addCalcAngleS2(&mD2E, 0x500, 0x4, 0x200); + } + + mJntCtrl.setParam( + l_HIO.m04.m0A, l_HIO.m04.m0E, l_HIO.m04.m12, l_HIO.m04.m16, + l_HIO.m04.m08, l_HIO.m04.m0C, l_HIO.m04.m10, l_HIO.m04.m14, l_HIO.m04.m18 + ); + + if (mMode != 2) { + lookBack(); + } + + if (mbIkari) { + cLib_addCalc2(&mD38, l_HIO.m60, 0.1f, l_HIO.m64); + } else { + cLib_addCalc2(&mD38, 0.0f, 0.1f, l_HIO.m64); + } + + if (m6D9 == 6) { + f32 temp = speedF * l_HIO.m70; + mpMorf->setPlaySpeed(temp < l_HIO.m74 ? l_HIO.m74 : temp); + if (mMode == 7) { + mpMorf->setPlaySpeed(3.0f); + } + } + + setAttention(); + setCollision(); + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + mAcch.CrrPos(*dComIfG_Bgsp()); + setMtx(); + mBtkAnm.play(); + mBrkAnm.play(); + mpMorf->play(¤t.pos, 0, 0); + mpMorf->calc(); + enemy_fire(&mEnemyFire); + modeProc(PROC_EXEC, 0xC); + setAnm(0xF, false); + setBtkAnm(0x5); + g_env_light.settingTevStruct(0, ¤t.pos, &mTevStr); + + return false; } /* 000040A8-000041A8 .text debugDraw__6daRd_cFv */ diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index 9a8eebfb3..980953705 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -71,7 +71,7 @@ bool dNpc_JntCtrl_c::move(s16 param_1, int param_2) { int i; for (i = 0; i < 2; i++) { - if ((i == 0 && field_0x0B == 1) || (i == 1 && field_0x0C == 1)) { + if ((i == 0 && mbHeadLock == true) || (i == 1 && mbBackBoneLock == true)) { angle = 0; } else { angle = param_1; @@ -120,8 +120,8 @@ void dNpc_JntCtrl_c::lookAtTarget(s16* outY, cXyz* param_2, cXyz param_3, s16 pa 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); + if ((mbTrn || ((deltaY >= maxY || deltaY <= minY) && r3)) && !param_6) { + mbTrn = follow(outY, targetY, maxVel, 1); } move(r23, 0); @@ -764,7 +764,7 @@ int dNpc_JntCtrl_c::chkLim(s16 angle, int param_2, int param_3) { /* 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) { + if(!mbBackBoneLock) { *param_3 = chkLim(param_1, 1, 1); if(field_0x32 && *param_3 < 0) { *param_3 = 0; @@ -772,7 +772,7 @@ void dNpc_JntCtrl_c::turn_fromBackbone2Head(s16 param_1, s16* param_2, s16* para } *param_2 = 0; - if(field_0x0B == 0) { + if(!mbHeadLock) { *param_2 = param_1 - *param_3; *param_2 = chkLim(*param_2, 0, 1); } @@ -780,13 +780,13 @@ void dNpc_JntCtrl_c::turn_fromBackbone2Head(s16 param_1, s16* param_2, s16* para void dNpc_JntCtrl_c::turn_fromHead2Backbone(s16 param_1, s16* param_2, s16* param_3) { *param_2 = 0; - if(field_0x0B == 0) { + if(!mbHeadLock) { *param_2 = param_1 - field_0x32; *param_2 = chkLim(*param_2, 0, 1); } *param_3 = 0; - if(field_0x0C == 0) { + if(!mbBackBoneLock) { *param_3 = param_1 - *param_2; *param_3 = chkLim(*param_3, 1, 1); } @@ -857,23 +857,23 @@ void dNpc_JntCtrl_c::lookAtTarget_2(s16* r26, cXyz* r29, cXyz r24, s16 r7, s16 r mAngles[0][1] = r1_10; mAngles[1][1] = r1_0C; - if (field_0x0A && !r28) { + if (mbTrn && !r28) { temp = *r26; cLib_addCalcAngleS(r26, targetY, 4, r27, 0x100); temp2 = *r26 - temp; - field_0x0A = temp2 != 0; - if (field_0x0C == 0) { + mbTrn = temp2 != 0; + if (!mbBackBoneLock) { temp2 = follow_current(&mAngles[1][1], temp2); } - if (field_0x0B == 0) { + if (!mbHeadLock) { follow_current(&mAngles[0][1], temp2); } } else { temp4 = field_0x2E + field_0x32; if (deltaY >= 0) { - field_0x0A = deltaY > temp4; + mbTrn = deltaY > temp4; } else { - field_0x0A = deltaY < temp4; + mbTrn = deltaY < temp4; } }