From d27ea6acebb26868fef20259634732eb2d307059 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Tue, 21 Nov 2023 01:43:18 -0500 Subject: [PATCH] d_a_rd, d_lib etc work --- include/d/actor/d_a_npc_md.h | 2 +- include/d/actor/d_a_player.h | 1 + include/d/actor/d_a_rd.h | 22 ++-- include/d/d_lib.h | 15 ++- include/d/d_npc.h | 10 +- src/d/actor/d_a_npc_md.cpp | 30 +++--- src/d/actor/d_a_player_main.cpp | 15 ++- src/d/actor/d_a_rd.cpp | 178 ++++++++++++++++---------------- src/d/d_lib.cpp | 25 +++-- src/d/d_npc.cpp | 29 +++--- 10 files changed, 184 insertions(+), 143 deletions(-) diff --git a/include/d/actor/d_a_npc_md.h b/include/d/actor/d_a_npc_md.h index 17f69c2f4..c96d1eaf1 100644 --- a/include/d/actor/d_a_npc_md.h +++ b/include/d/actor/d_a_npc_md.h @@ -100,7 +100,7 @@ public: /* 0x05C */ daNpc_Md_HIO4_c m05C; /* 0x068 */ daNpc_Md_HIO5_c m068; /* 0x074 */ daNpc_Md_HIO6_c m074; - /* 0x08C */ dNpc_HIO_c m08C; + /* 0x08C */ dNpc_HIO_c mNpc; /* 0x0B4 */ fopAc_ac_c* mpActor; /* 0x0B8 */ f32 m0B8; /* 0x0BC */ f32 m0BC; diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index b395d7ab4..4bf7ca58f 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -107,6 +107,7 @@ public: daPyFlg1_NPC_NOT_CHANGE = 0x00000040, daPyFlg1_UNK80 = 0x00000080, daPyFlg1_CONFUSE = 0x00000100, + daPyFlg1_UNK400 = 0x00000400, daPyFlg1_FREEZE_STATE = 0x00000800, daPyFlg1_SHIP_TACT = 0x00001000, daPyFlg1_USE_ARROW_EFFECT = 0x00002000, diff --git a/include/d/actor/d_a_rd.h b/include/d/actor/d_a_rd.h index ed01f0dfa..bec711452 100644 --- a/include/d/actor/d_a_rd.h +++ b/include/d/actor/d_a_rd.h @@ -12,16 +12,16 @@ public: daRd_HIO_c(); virtual ~daRd_HIO_c() {} - /* 0x04 */ dNpc_HIO_c m04; + /* 0x04 */ dNpc_HIO_c mNpc; /* 0x2C */ u8 m2C; /* 0x2D */ u8 m2D[0x30 - 0x2D]; /* 0x30 */ f32 m30; /* 0x34 */ f32 m34; /* 0x38 */ f32 m38; - /* 0x3C */ f32 m3C; + /* 0x3C */ f32 mAttackRadius; /* 0x40 */ s16 m40; /* 0x42 */ s16 m42; - /* 0x44 */ s16 m44; + /* 0x44 */ s16 mAttackSpreadAngle; /* 0x46 */ s16 m46; /* 0x48 */ s16 m48; /* 0x4A */ s16 m4A; @@ -40,7 +40,7 @@ public: /* 0x70 */ f32 m70; /* 0x74 */ f32 m74; /* 0x78 */ s16 m78; - /* 0x7A */ s16 m7A; + /* 0x7A */ s16 mParalysisDuration; /* 0x7C */ JntHit_HIO_c m7C; }; @@ -137,7 +137,7 @@ public: /* 0x2BC */ int m2BC; /* 0x2C0 */ int mSwNo; /* 0x2C4 */ u8 m2C4; - /* 0x2C5 */ u8 m2C5; + /* 0x2C5 */ u8 mHitType; // TODO enum /* 0x2C6 */ u8 m2C6[0x2C8 - 0x2C6]; /* 0x2C8 */ request_of_phase_process_class mPhs; /* 0x2D0 */ mDoExt_McaMorf* mpMorf; @@ -146,9 +146,9 @@ public: /* 0x300 */ cXyz m300; /* 0x30C */ s16 m30C; /* 0x30E */ u8 m30E[0x310 - 0x30E]; - /* 0x310 */ int m310; - /* 0x314 */ int m314; - /* 0x318 */ int m318; + /* 0x310 */ int mTimer1; + /* 0x314 */ int mTimer2; + /* 0x318 */ int mBreakFreeCounter; /* 0x31C */ dBgS_ObjAcch mAcch; /* 0x4E0 */ dBgS_AcchCir mAcchCir; /* 0x520 */ dCcD_Stts mStts; @@ -168,9 +168,9 @@ public: /* 0x6E0 */ enemyice mEnemyIce; /* 0xA98 */ enemyfire mEnemyFire; /* 0xCC0 */ JntHit_c* mpJntHit; - /* 0xCC4 */ cXyz mCC4; - /* 0xCD0 */ cXyz mCD0; - /* 0xCDC */ s16 mCDC; + /* 0xCC4 */ cXyz mAttPos; + /* 0xCD0 */ cXyz mRdEyePos; + /* 0xCDC */ s16 mMaxHeadTurnVel; /* 0xCDE */ u8 mCDE[0xCE0 - 0xCDE]; /* 0xCE0 */ int mCE0; /* 0xCE4 */ int mCE4; diff --git a/include/d/d_lib.h b/include/d/d_lib.h index f02b7beb2..b4c0db7ea 100644 --- a/include/d/d_lib.h +++ b/include/d/d_lib.h @@ -90,9 +90,18 @@ bool dLib_pathInfo(dPath**, u8); void dLib_pathMove(cXyz*, s8*, dPath*, f32, int (*)(cXyz*, cXyz*, cXyz*, void*), void*); void dLib_setNextStageBySclsNum(u8, s8); void dLib_setFirstMsg(u16, u32, u32); -bool dLib_checkPlayerInCircle(cXyz, f32, f32); -bool dLib_checkActorInCircle(cXyz, fopAc_ac_c*, f32, f32); -bool dLib_checkActorInFan(cXyz, fopAc_ac_c*, s16, s16, f32, f32); +/** + * Checks if Link is with a circular area. + */ +bool dLib_checkPlayerInCircle(cXyz center, f32 radius, f32 halfHeight); +/** + * Checks if an actor is with a circular area. + */ +bool dLib_checkActorInCircle(cXyz center, fopAc_ac_c* actor, f32 radius, f32 halfHeight); +/** + * Checks if an actor is with a fan-shaped area (sector of a circle). + */ +bool dLib_checkActorInFan(cXyz center, fopAc_ac_c* actor, s16 angleY, s16 fanSpreadAngle, f32 radius, f32 halfHeight); u32 dLib_getIplDaysFromSaveTime(); void dLib_get_QuatFromTriangle(cXyz*, cXyz*, cXyz*); void dLib_calc_QuatFromTriangle(Quaternion*, f32, cXyz*, cXyz*, cXyz*); diff --git a/include/d/d_npc.h b/include/d/d_npc.h index c9bdc4233..db92c7db5 100644 --- a/include/d/d_npc.h +++ b/include/d/d_npc.h @@ -18,14 +18,14 @@ public: /* 0x04 */ f32 m04; /* 0x08 */ s16 m08; /* 0x0A */ s16 m0A; - /* 0x0C */ s16 m0C; - /* 0x0E */ s16 m0E; + /* 0x0C */ s16 mMaxHeadRot; + /* 0x0E */ s16 mMaxBackBoneRot; /* 0x10 */ s16 m10; /* 0x12 */ s16 m12; - /* 0x14 */ s16 m14; - /* 0x16 */ s16 m16; + /* 0x14 */ s16 mMinHeadRot; + /* 0x16 */ s16 mMinBackBoneRot; /* 0x18 */ s16 m18; - /* 0x1A */ s16 m1A; + /* 0x1A */ s16 mMaxHeadTurnVel; /* 0x1C */ f32 m1C; /* 0x20 */ s16 m20; /* 0x22 */ u8 m22; diff --git a/src/d/actor/d_a_npc_md.cpp b/src/d/actor/d_a_npc_md.cpp index 1f18a3c1a..34d10459f 100644 --- a/src/d/actor/d_a_npc_md.cpp +++ b/src/d/actor/d_a_npc_md.cpp @@ -218,21 +218,21 @@ daNpc_Md_HIO2_c::daNpc_Md_HIO2_c() { /* 00000274-00000574 .text __ct__14daNpc_Md_HIO_cFv */ daNpc_Md_HIO_c::daNpc_Md_HIO_c() { - m08C.m04 = -25.0f; - m08C.m08 = 0x2328; - m08C.m0C = 0x2328; - m08C.m0A = 0x0; - m08C.m0E = 0x1F40; - m08C.m10 = -0x2328; - m08C.m14 = -0x2328; - m08C.m12 = 0x0; - m08C.m16 = -0x1F40; - m08C.m18 = 0x1000; - m08C.m1A = 0x800; - m08C.m1C = 130.0f; - m08C.m20 = 0x4000; - m08C.m22 = 0x0; - m08C.m24 = 150.0f; + mNpc.m04 = -25.0f; + mNpc.m08 = 0x2328; + mNpc.mMaxHeadRot = 0x2328; + mNpc.m0A = 0x0; + mNpc.mMaxBackBoneRot = 0x1F40; + mNpc.m10 = -0x2328; + mNpc.mMinHeadRot = -0x2328; + mNpc.m12 = 0x0; + mNpc.mMinBackBoneRot = -0x1F40; + mNpc.m18 = 0x1000; + mNpc.mMaxHeadTurnVel = 0x800; + mNpc.m1C = 130.0f; + mNpc.m20 = 0x4000; + mNpc.m22 = 0x0; + mNpc.m24 = 150.0f; mpActor = NULL; m0B8 = 770.0f; m0BC = 250.0f; diff --git a/src/d/actor/d_a_player_main.cpp b/src/d/actor/d_a_player_main.cpp index d63936a17..83e8a2229 100644 --- a/src/d/actor/d_a_player_main.cpp +++ b/src/d/actor/d_a_player_main.cpp @@ -3941,8 +3941,19 @@ void daPy_lk_c::autoGroundHit() { } /* 8011AD9C-8011AE20 .text checkAttentionPosAngle__9daPy_lk_cFP10fopAc_ac_cPP4cXyz */ -BOOL daPy_lk_c::checkAttentionPosAngle(fopAc_ac_c*, cXyz**) { - /* Nonmatching */ +BOOL daPy_lk_c::checkAttentionPosAngle(fopAc_ac_c* actor, cXyz** pOutPos) { + if (actor) { + s16 targetAngle = cLib_targetAngleY(¤t.pos, &actor->mEyePos); + int angleDiff = cLib_distanceAngleS(targetAngle, m34DE); + if (angleDiff <= 0x6000) { + *pOutPos = &actor->mEyePos; + if (actor->mGroup == fopAc_ENEMY_e) { + onNoResetFlg1(daPyFlg1_UNK400); + } + return TRUE; + } + } + return FALSE; } /* 8011AE20-8011BE08 .text setNeckAngle__9daPy_lk_cFv */ diff --git a/src/d/actor/d_a_rd.cpp b/src/d/actor/d_a_rd.cpp index 33be2b469..11991a54c 100644 --- a/src/d/actor/d_a_rd.cpp +++ b/src/d/actor/d_a_rd.cpp @@ -101,10 +101,10 @@ daRd_HIO_c::daRd_HIO_c() { m30 = 650.0f; m34 = 650.0f; m38 = 500.0f; - m3C = 125.0f; + mAttackRadius = 125.0f; m40 = 0x2000; m42 = 0x1B58; - m44 = 0x6000; + mAttackSpreadAngle = 0x6000; m46 = 0xA; m48 = 0x5; m4A = 0x3C; @@ -122,22 +122,22 @@ daRd_HIO_c::daRd_HIO_c() { m78 = 0x2D; m54 = 0x87; m52 = 0x96; - m7A = 0x3C; - m04.m04 = -20.0f; - m04.m08 = 0x1FFE; - m04.m0C = 0x4000; - m04.m0A = 0x0; - m04.m0E = 0x2000; - m04.m10 = -0x9C4; - m04.m14 = -0x4000; - m04.m12 = 0x0; - m04.m16 = -0x2000; - m04.m18 = 0x250; - m04.m1A = 0x150; - m04.m1C = 50.0f; - m04.m20 = 0x7FFF; - m04.m22 = 0x0; - m04.m24 = 400.0f; + mParalysisDuration = 2*30; + mNpc.m04 = -20.0f; + mNpc.m08 = 0x1FFE; + mNpc.mMaxHeadRot = 0x4000; + mNpc.m0A = 0x0; + mNpc.mMaxBackBoneRot = 0x2000; + mNpc.m10 = -0x9C4; + mNpc.mMinHeadRot = -0x4000; + mNpc.m12 = 0x0; + mNpc.mMinBackBoneRot = -0x2000; + mNpc.m18 = 0x250; + mNpc.mMaxHeadTurnVel = 0x150; + mNpc.m1C = 50.0f; + mNpc.m20 = 0x7FFF; + mNpc.m22 = 0x0; + mNpc.m24 = 400.0f; } /* 0000027C-000002A8 .text searchNeadDeadRd_CB__FPvPv */ @@ -179,10 +179,10 @@ BOOL daRd_c::_nodeControl(J3DNode* node, J3DModel* model) { if (mJntCtrl.getHeadJntNum() == jntNo) { static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f); static cXyz l_offsetEyePos(24.0f, -16.0f, 0.0f); - mDoMtx_stack_c::multVec(&l_offsetAttPos, &mCC4); + mDoMtx_stack_c::multVec(&l_offsetAttPos, &mAttPos); mDoMtx_stack_c::XrotM(mJntCtrl.getHead_y()); mDoMtx_stack_c::ZrotM(mJntCtrl.getHead_x()); - mDoMtx_stack_c::multVec(&l_offsetEyePos, &mCD0); + mDoMtx_stack_c::multVec(&l_offsetEyePos, &mRdEyePos); mDoMtx_stack_c::XrotM(mD1A); mDoMtx_stack_c::ZrotM(mD1C); mDoMtx_stack_c::YrotM(mD1E); @@ -218,7 +218,7 @@ BOOL daRd_c::_nodeHeadControl(J3DNode* node, J3DModel* model) { cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx); cXyz temp3(0.0f, 0.0f, 50.0f); - mDoMtx_stack_c::multVec(&temp3, &mCD0); + mDoMtx_stack_c::multVec(&temp3, &mRdEyePos); model->setAnmMtx(jntNo, mDoMtx_stack_c::get()); cMtx_copy(mDoMtx_stack_c::get(), mCE8); @@ -437,7 +437,7 @@ bool daRd_c::createArrowHeap() { /* 000009D0-00000A38 .text checkPlayerInAttack__6daRd_cFv */ bool daRd_c::checkPlayerInAttack() { - return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), shape_angle.y, l_HIO.m44, l_HIO.m3C, 100.0f); + return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), shape_angle.y, l_HIO.mAttackSpreadAngle, l_HIO.mAttackRadius, 100.0f); } /* 00000A38-00000AA0 .text checkPlayerInCry__6daRd_cFv */ @@ -453,7 +453,7 @@ void daRd_c::lookBack() { mJntCtrl.clrTrn(); mJntCtrl.offHeadLock(); mJntCtrl.offBackBoneLock(); - mCC4 = player->getHeadTopPos(); + mAttPos = player->getHeadTopPos(); } else { switch (mMode) { case MODE_WAIT: @@ -494,7 +494,7 @@ void daRd_c::lookBack() { mJntCtrl.onHeadLock(); mJntCtrl.onBackBoneLock(); } - mCC4 = player->getHeadTopPos(); + mAttPos = player->getHeadTopPos(); break; case MODE_RETURN: if (dLib_checkActorInCircle(m300, this, 100.0f, 1000.0f)) { @@ -502,23 +502,23 @@ void daRd_c::lookBack() { mJntCtrl.onHeadLock(); mJntCtrl.onBackBoneLock(); } - mCC4 = m300; + mAttPos = m300; break; case MODE_SILENT_PRAY: break; default: - mCC4 = player->getHeadTopPos(); + mAttPos = player->getHeadTopPos(); break; } } if (mJntCtrl.trnChk()) { - cLib_addCalcAngleS2(&mCDC, l_HIO.m04.m1A, 4, 0x800); + cLib_addCalcAngleS2(&mMaxHeadTurnVel, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800); } else { - mCDC = 0; + mMaxHeadTurnVel = 0; } - mJntCtrl.lookAtTarget(&shape_angle.y, &mCC4, mCD0, shape_angle.y, mCDC, r29); + mJntCtrl.lookAtTarget(&shape_angle.y, &mAttPos, mRdEyePos, shape_angle.y, mMaxHeadTurnVel, r29); } /* 00000D78-00001650 .text checkTgHit__6daRd_cFv */ @@ -572,40 +572,40 @@ bool daRd_c::checkTgHit() { case 0x19: case 0x1A: case 0x1B: - m2C5 = 1; + mHitType = 1; break; default: - m2C5 = 0; + mHitType = 0; break; } break; case AT_TYPE_LEAF_WIND: r29 = false; - m2C5 = 3; + mHitType = 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; + mHitType = 4; mCE0 = 40; break; case AT_TYPE_HOOKSHOT: fopAcM_seStart(this, JA_SE_LK_HS_SPIKE, 0x44); r29 = false; - m2C5 = 12; + mHitType = 12; break; case AT_TYPE_SKULL_HAMMER: case AT_TYPE_STALFOS_MACE: fopAcM_seStart(this, JA_SE_LK_HAMMER_HIT, 0x20); - m2C5 = 7; + mHitType = 7; if (player->getCutType() == 0x11) { - m2C5 = 8; + mHitType = 8; } break; case AT_TYPE_BOMB: - m2C5 = 6; + mHitType = 6; break; case AT_TYPE_ICE_ARROW: r29 = false; @@ -613,22 +613,22 @@ bool daRd_c::checkTgHit() { mEnemyIce.mFreezeDuration = l_HIO.m4A; enemy_fire_remove(&mEnemyFire); mHealth += 4; - m2C5 = 9; + mHitType = 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; + mHitType = 0xA; break; case AT_TYPE_LIGHT_ARROW: r29 = false; fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20); mEnemyIce.mLightShrinkTimer = 1; - m2C5 = 0xB; + mHitType = 0xB; break; case AT_TYPE_NORMAL_ARROW: - m2C5 = 5; + mHitType = 5; if (!dLib_checkActorInCircle(current.pos, player, l_HIO.m38, 1000.0f)) { fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44); mCE0 = 40; @@ -643,13 +643,13 @@ bool daRd_c::checkTgHit() { if (mEnemyFire.mState == 0) { mEnemyFire.mFireDuration = l_HIO.m4C; } else { - m2C5 = 0xD; + mHitType = 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; + mHitType = 0xE; r29 = false; mCE0 = 40; break; @@ -661,7 +661,7 @@ bool daRd_c::checkTgHit() { if (r29) { cXyz* temp = mCyl.GetTgHitPosP(); cc_at_check(this, &atInfo); - if (m2C5 == 1 || m2C5 == 7 || m2C5 == 8 || mHealth <= 0) { + if (mHitType == 1 || mHitType == 7 || mHitType == 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); @@ -674,7 +674,7 @@ bool daRd_c::checkTgHit() { dComIfGp_particle_set(0xD, temp, &player->shape_angle); modeProcInit(MODE_DAMAGE); } - } else if (m2C5 == 0xE) { + } else if (mHitType == 0xE) { s8 origHealth = mHealth; mHealth = 0xA; cc_at_check(this, &atInfo); @@ -821,7 +821,7 @@ void daRd_c::modeDeathInit() { fopAcM_monsSeStart(this, JA_SE_CV_RD_DIE, 0); setAnm(8, false); speedF = 0.0f; - m310 = 10*30; + mTimer1 = 10*30; } /* 00001E68-00001F14 .text modeDeath__6daRd_cFv */ @@ -840,7 +840,7 @@ void daRd_c::modeDeath() { // Do not consider the ReDead to be a living enemy while its death animation is playing out. mGroup = fopAc_ENV_e; - if (cLib_calcTimer(&m310) == 0) { + if (cLib_calcTimer(&mTimer1) == 0) { fopAcM_createDisappear(this, ¤t.pos, 5, 0, 0xFF); fopAcM_delete(this); } @@ -880,23 +880,26 @@ void daRd_c::modeParalysisInit() { if (!isAnm(0xC) && !isAnm(0xD)) { setAnm(0xC, false); } - m310 = l_HIO.m7A; + mTimer1 = l_HIO.mParalysisDuration; speedF = 0.0f; } /* 000020EC-000021F0 .text modeParalysis__6daRd_cFv */ void daRd_c::modeParalysis() { - /* Nonmatching: isStop inline regalloc + modeParalysis return value? */ + /* Nonmatching: isStop inline regalloc + checkTgHit() clrlwi. missing? */ if (isAnm(0xC) && mpMorf->isStop()) { setAnm(0xD, false); } else if (isAnm(0xD)) { - if (cLib_calcTimer(&m310) == 0) { + if (cLib_calcTimer(&mTimer1) == 0) { setAnm(0xE, false); } } else if (isAnm(0xE) && mpMorf->isStop()) { modeProcInit(MODE_WAIT); } - checkTgHit(); + + if (checkTgHit()) { + // Did something in here get optimized out weirdly? + } } /* 000021F0-0000223C .text modeMoveInit__6daRd_cFv */ @@ -958,8 +961,8 @@ void daRd_c::modeCryInit() { } fopAcM_orderOtherEvent2(this, "DEFAULT_RD_CRY", 1, -1); fopAcM_monsSeStart(this, JA_SE_CV_RD_SCREAM, 0); - m310 = l_HIO.m54; - m318 = l_HIO.m78; + mTimer1 = l_HIO.m54; + mBreakFreeCounter = l_HIO.m78; } /* 000025A8-000028B8 .text modeCry__6daRd_cFv */ @@ -992,25 +995,25 @@ void daRd_c::modeCry() { if (mD3C > 0 && stickPosX < 0.0f) { mD3C = -1; - m318--; + mBreakFreeCounter--; } else if (mD3C < 0 && stickPosX > 0.0f) { mD3C = 1; - m318--; + mBreakFreeCounter--; } if (mD40 > 0 && stickPosY < 0.0f) { mD40 = -1; - m318--; + mBreakFreeCounter--; } else if (mD40 < 0 && stickPosY > 0.0f) { mD40 = 1; - m318--; + mBreakFreeCounter--; } if (CPad_CHECK_TRIG_A(0) || CPad_CHECK_TRIG_B(0) || CPad_CHECK_TRIG_X(0) || CPad_CHECK_TRIG_Y(0)) { - m318--; + mBreakFreeCounter--; } - if (cLib_calcTimer(&m310) == 0 || m318 < 0) { + if (cLib_calcTimer(&mTimer1) == 0 || mBreakFreeCounter < 0) { dComIfGp_event_reset(); modeProcInit(MODE_CRY_WAIT); } else if (checkPlayerInAttack()) { @@ -1025,8 +1028,8 @@ void daRd_c::modeCry() { /* 000028B8-000028CC .text modeCryWaitInit__6daRd_cFv */ void daRd_c::modeCryWaitInit() { - m310 = 60; - m314 = 45; + mTimer1 = 60; + mTimer2 = 45; } /* 000028CC-000029E4 .text modeCryWait__6daRd_cFv */ @@ -1045,12 +1048,12 @@ void daRd_c::modeCryWait() { // The dComIfGp_event_runCheck inline breaks the codegen here. // if (dComIfGp_event_runCheck()) { if (g_dComIfG_gameInfo.play.getEvent().runCheck()) { - m310 = 60; - m314 = 45; + mTimer1 = 60; + mTimer2 = 45; } else if (m6D9 == 6) { - if (cLib_calcTimer(&m310) == 0) { + if (cLib_calcTimer(&mTimer1) == 0) { modeProcInit(MODE_MOVE); - } else if (cLib_calcTimer(&m314) == 0 && checkPlayerInAttack()) { + } else if (cLib_calcTimer(&mTimer2) == 0 && checkPlayerInAttack()) { modeProcInit(MODE_ATTACK); } } @@ -1059,9 +1062,9 @@ void daRd_c::modeCryWait() { /* 000029E4-00002A58 .text modeAttackInit__6daRd_cFv */ void daRd_c::modeAttackInit() { mAcchCir.SetWallR(70.0f); - m310 = l_HIO.m52; - m318 = l_HIO.m50; - m314 = 30; + mTimer1 = l_HIO.m52; + mBreakFreeCounter = l_HIO.m50; + mTimer2 = 30; setAnm(6, false); speedF = 0.0f; } @@ -1101,11 +1104,11 @@ void daRd_c::modeAttack() { } if (dist <= 20.0f + g_regHIO.mChild[12].mFloatRegs[2]) { cLib_addCalcPosXZ2(¤t.pos, player->current.pos, 0.3f, 1.0f); - if (cLib_calcTimer(&m314) == 0) { + if (cLib_calcTimer(&mTimer2) == 0) { if (!daPy_getPlayerLinkActorClass()->checkNoDamageMode()) { daPy_getPlayerLinkActorClass()->setDamagePoint(-1.0f); } - m314 = 30; + mTimer2 = 30; } } else if (mAcch.ChkWallHit()) { player->changeOriginalDemo(); @@ -1125,25 +1128,25 @@ void daRd_c::modeAttack() { if (mD3C > 0 && stickPosX < 0.0f) { mD3C = -1; - m318--; + mBreakFreeCounter--; } else if (mD3C < 0 && stickPosX > 0.0f) { mD3C = 1; - m318--; + mBreakFreeCounter--; } if (mD40 > 0 && stickPosY < 0.0f) { mD40 = -1; - m318--; + mBreakFreeCounter--; } else if (mD40 < 0 && stickPosY > 0.0f) { mD40 = 1; - m318--; + mBreakFreeCounter--; } if (CPad_CHECK_TRIG_A(0) || CPad_CHECK_TRIG_B(0) || CPad_CHECK_TRIG_X(0) || CPad_CHECK_TRIG_Y(0)) { - m318--; + mBreakFreeCounter--; } - if (cLib_calcTimer(&m310) == 0 || m318 < 0) { + if (cLib_calcTimer(&mTimer1) == 0 || mBreakFreeCounter < 0) { dComIfGp_event_reset(); setAnm(5, false); modeProcInit(MODE_CRY_WAIT); @@ -1213,8 +1216,8 @@ void daRd_c::modeSilentPray() { daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); fopAc_ac_c* dyingReDead; if (fopAcM_SearchByID(m6D0, &dyingReDead)) { - mCC4 = dyingReDead->current.pos; - if (dLib_checkActorInCircle(mCC4, this, 200.0f, 1000.0f)) { + mAttPos = dyingReDead->current.pos; + if (dLib_checkActorInCircle(mAttPos, this, 200.0f, 1000.0f)) { setAnm(1, false); speedF = 0.0f; } else { @@ -1255,7 +1258,7 @@ void daRd_c::modeSwWait() { /* 00003480-00003514 .text modeKanokeInit__6daRd_cFv */ void daRd_c::modeKanokeInit() { setAnm(0xB, false); - m310 = 90; + mTimer1 = 90; cXyz offset(0.0f, 0.0f, 150.0f); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); @@ -1264,7 +1267,7 @@ void daRd_c::modeKanokeInit() { /* 00003514-0000355C .text modeKanoke__6daRd_cFv */ void daRd_c::modeKanoke() { - if (cLib_calcTimer(&m310) == 0) { + if (cLib_calcTimer(&mTimer1) == 0) { modeProcInit(MODE_RETURN); } } @@ -1546,8 +1549,9 @@ bool daRd_c::_execute() { } 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 + 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 ); if (mMode != MODE_PARALYSIS) { @@ -1594,7 +1598,7 @@ void daRd_c::debugDraw() { pos.y += 10.0f; (GXColor){0x00, 0xFF, 0x00, 0x80}; // Unused color, needed for the .rodata section to match. dLib_debugDrawFan(pos, mD18, l_HIO.m42, l_HIO.m38, (GXColor){0xFF, 0xFF, 0x00, 0x80}); - dLib_debugDrawFan(pos, shape_angle.y, l_HIO.m44, l_HIO.m3C, (GXColor){0xFF, 0x00, 0x00, 0x80}); + dLib_debugDrawFan(pos, shape_angle.y, l_HIO.mAttackSpreadAngle, l_HIO.mAttackRadius, (GXColor){0xFF, 0x00, 0x00, 0x80}); dLib_debugDrawFan(pos, shape_angle.y, l_HIO.m40, l_HIO.m34, (GXColor){0xFF, 0x00, 0xFF, 0x80}); dLib_debugDrawAxis(mCE8, 50.0f); } @@ -1649,10 +1653,10 @@ void daRd_c::createInit() { mAcch.Set(&fopAcM_GetPosition_p(this), &fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, &fopAcM_GetSpeed_p(this), NULL, NULL); mAcch.SetRoofNone(); J3DModelData* modelData = mpMorf->getModel()->getModelData(); - mJntCtrl.setHeadJntNum(0x0A); - mJntCtrl.setBackboneJntNum(0x08); - modelData->getJointNodePointer(0x0A)->setCallBack(nodeControl_CB); - modelData->getJointNodePointer(0x08)->setCallBack(nodeControl_CB); + mJntCtrl.setHeadJntNum(0x0A); // ree_kubi_1 + mJntCtrl.setBackboneJntNum(0x08); // ree_mune_1 + modelData->getJointNodePointer(0x0A)->setCallBack(nodeControl_CB); // ree_kubi_1 + modelData->getJointNodePointer(0x08)->setCallBack(nodeControl_CB); // ree_mune_1 setBtkAnm(2); if (m2BC == 0) { diff --git a/src/d/d_lib.cpp b/src/d/d_lib.cpp index 32f352745..f28d2d99b 100644 --- a/src/d/d_lib.cpp +++ b/src/d/d_lib.cpp @@ -124,18 +124,31 @@ void dLib_setFirstMsg(u16, u32, u32) { } /* 80057F30-80057F78 .text dLib_checkPlayerInCircle__F4cXyzff */ -bool dLib_checkPlayerInCircle(cXyz, f32, f32) { - /* Nonmatching */ +bool dLib_checkPlayerInCircle(cXyz center, f32 radius, f32 halfHeight) { + fopAc_ac_c* link = dComIfGp_getLinkPlayer(); + dLib_checkActorInCircle(center, link, radius, halfHeight); } /* 80057F78-80058098 .text dLib_checkActorInCircle__F4cXyzP10fopAc_ac_cff */ -bool dLib_checkActorInCircle(cXyz, fopAc_ac_c*, f32, f32) { - /* Nonmatching */ +bool dLib_checkActorInCircle(cXyz center, fopAc_ac_c* actor, f32 radius, f32 halfHeight) { + f32 distXZ = (center - actor->current.pos).absXZ(); + f32 distY = fabsf(center.y - actor->current.pos.y); + if (distXZ < radius && distY < halfHeight) { + return true; + } + return false; } /* 80058098-8005820C .text dLib_checkActorInFan__F4cXyzP10fopAc_ac_cssff */ -bool dLib_checkActorInFan(cXyz, fopAc_ac_c*, s16, s16, f32, f32) { - /* Nonmatching */ +bool dLib_checkActorInFan(cXyz center, fopAc_ac_c* actor, s16 angleY, s16 fanSpreadAngle, f32 radius, f32 halfHeight) { + f32 distXZ = (center - actor->current.pos).absXZ(); + f32 distY = fabsf(center.y - actor->current.pos.y); + s16 targetY = cLib_targetAngleY(¢er, &actor->current.pos); + int angleDistY = cLib_distanceAngleS(angleY, targetY); + if (distXZ < radius && distY < halfHeight && angleDistY < fanSpreadAngle) { + return true; + } + return false; } /* 8005820C-80058250 .text __ct__9STControlFssssffss */ diff --git a/src/d/d_npc.cpp b/src/d/d_npc.cpp index b17dd3776..a09a38488 100644 --- a/src/d/d_npc.cpp +++ b/src/d/d_npc.cpp @@ -95,23 +95,23 @@ bool dNpc_JntCtrl_c::move(s16 param_1, int param_2) { } /* 8021AABC-8021AC6C .text lookAtTarget__14dNpc_JntCtrl_cFPsP4cXyz4cXyzssb */ -void dNpc_JntCtrl_c::lookAtTarget(s16* outY, cXyz* param_2, cXyz param_3, s16 param_4, s16 maxVel, bool param_6) { +void dNpc_JntCtrl_c::lookAtTarget(s16* outY, cXyz* pDstPos, cXyz srcPos, s16 defaultY, 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); + if (pDstPos) { + cXyz delta; + delta.x = pDstPos->x - srcPos.x; + delta.y = pDstPos->y - srcPos.y; + delta.z = pDstPos->z - srcPos.z; + f32 distXZ = sqrtf(delta.x * delta.x + delta.z * delta.z); + targetY = cM_atan2s(delta.x, delta.z); + r23 = cM_atan2s(delta.y, distXZ); } else { - targetY = param_4; + targetY = defaultY; r23 = 0; } @@ -129,11 +129,14 @@ void dNpc_JntCtrl_c::lookAtTarget(s16* outY, cXyz* param_2, cXyz param_3, s16 pa } /* 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) { +void dNpc_JntCtrl_c::setParam(s16 param_1, s16 maxBackBoneRot, s16 param_3, s16 minBackBoneRot, + s16 param_5, s16 maxHeadRot, s16 param_7, s16 minHeadRot, + s16 param_9) +{ mMaxAngles[1][0] = param_1; - mMaxAngles[1][1] = maxSpineRot; + mMaxAngles[1][1] = maxBackBoneRot; mMinAngles[1][0] = param_3; - mMinAngles[1][1] = minSpineRot; + mMinAngles[1][1] = minBackBoneRot; mMaxAngles[0][0] = param_5; mMaxAngles[0][1] = maxHeadRot; mMinAngles[0][0] = param_7;