d_a_rd work

This commit is contained in:
LagoLunatic
2023-11-15 22:47:37 -05:00
parent 20aa2a94f0
commit 830635950d
6 changed files with 465 additions and 43 deletions
+1
View File
@@ -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(); }
+6 -4
View File
@@ -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;
+3 -3
View File
@@ -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;
+12 -12
View File
@@ -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);
+430 -11
View File
@@ -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(&current.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<J3DAnmTevRegKey*>(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<J3DAnmTextureSRTKey*>(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(&current.pos, 0, 0);
mpMorf->calc();
enemy_fire(&mEnemyFire);
modeProc(PROC_EXEC, 0xC);
setAnm(0xF, false);
setBtkAnm(0x5);
g_env_light.settingTevStruct(0, &current.pos, &mTevStr);
return false;
}
/* 000040A8-000041A8 .text debugDraw__6daRd_cFv */
+13 -13
View File
@@ -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;
}
}