diff --git a/include/d/actor/d_a_rd.h b/include/d/actor/d_a_rd.h index bec711452..7bc503f18 100644 --- a/include/d/actor/d_a_rd.h +++ b/include/d/actor/d_a_rd.h @@ -17,10 +17,10 @@ public: /* 0x2D */ u8 m2D[0x30 - 0x2D]; /* 0x30 */ f32 m30; /* 0x34 */ f32 m34; - /* 0x38 */ f32 m38; + /* 0x38 */ f32 mCryRadius; /* 0x3C */ f32 mAttackRadius; /* 0x40 */ s16 m40; - /* 0x42 */ s16 m42; + /* 0x42 */ s16 mCrySpreadAngle; /* 0x44 */ s16 mAttackSpreadAngle; /* 0x46 */ s16 m46; /* 0x48 */ s16 m48; @@ -36,7 +36,7 @@ public: /* 0x60 */ f32 m60; /* 0x64 */ f32 m64; /* 0x68 */ f32 m68; - /* 0x6C */ f32 m6C; + /* 0x6C */ f32 mReturnWalkSpeed; /* 0x70 */ f32 m70; /* 0x74 */ f32 m74; /* 0x78 */ s16 m78; @@ -67,6 +67,42 @@ public: MODE_NULL, }; + enum BckIdx { + BckIdx_TACHIP = 0x0, + BckIdx_SUWARIP = 0x1, + BckIdx_WALK2ATACK = 0x2, + BckIdx_ATACK = 0x3, + BckIdx_ATACK2WALK = 0x4, + BckIdx_WALK = 0x5, + BckIdx_DAMAGE = 0x6, + BckIdx_DEAD = 0x7, + BckIdx_TATSU = 0x8, + BckIdx_SUWARU = 0x9, + BckIdx_KANOKEP = 0xA, + BckIdx_BEAM_HIT = 0xB, + BckIdx_BEAM = 0xC, + BckIdx_BEAM_END = 0xD, + }; + + enum AnmPrm { + AnmPrm_TACHIP0 = 0x0, + AnmPrm_TACHIP1 = 0x1, + AnmPrm_SUWARIP = 0x2, + AnmPrm_WALK2ATACK = 0x3, + AnmPrm_ATACK = 0x4, + AnmPrm_ATACK2WALK = 0x5, + AnmPrm_WALK = 0x6, + AnmPrm_DAMAGE = 0x7, + AnmPrm_DEAD = 0x8, + AnmPrm_TATSU = 0x9, + AnmPrm_SUWARU = 0xA, + AnmPrm_KANOKEP = 0xB, + AnmPrm_BEAM_HIT = 0xC, + AnmPrm_BEAM = 0xD, + AnmPrm_BEAM_END = 0xE, + AnmPrm_NULL, + }; + typedef void (daRd_c::*ModeFunc)(); static const u32 m_heapsize; @@ -74,7 +110,7 @@ public: static const dCcD_SrcCyl m_cyl_src; daRd_c() {} - bool isAnm(s8 idx) { return m6D9 == idx; } + bool isAnm(s8 idx) { return mAnmPrmIdx == idx; } bool isIkari() { return mbIkari; } void modeProcInit(int newMode) { modeProc(PROC_INIT, newMode); } void offIkari() { mbIkari = false; } @@ -132,9 +168,9 @@ public: /* 0x2AC */ int mMode; /* 0x2B0 */ u8 m2B0[0x2B4 - 0x2B0]; - /* 0x2B4 */ int m2B4; + /* 0x2B4 */ int mWhichIdleAnm; /* 0x2B8 */ int mAreaRadius; - /* 0x2BC */ int m2BC; + /* 0x2BC */ int mChecksSwitch; /* 0x2C0 */ int mSwNo; /* 0x2C4 */ u8 m2C4; /* 0x2C5 */ u8 mHitType; // TODO enum @@ -143,8 +179,8 @@ public: /* 0x2D0 */ mDoExt_McaMorf* mpMorf; /* 0x2D4 */ mDoExt_btkAnm mBtkAnm; /* 0x2E8 */ mDoExt_brkAnm mBrkAnm; - /* 0x300 */ cXyz m300; - /* 0x30C */ s16 m30C; + /* 0x300 */ cXyz mSpawnPos; + /* 0x30C */ s16 mSpawnAngle; /* 0x30E */ u8 m30E[0x310 - 0x30E]; /* 0x310 */ int mTimer1; /* 0x314 */ int mTimer2; @@ -157,10 +193,10 @@ public: /* 0x690 */ s32 mShadowId; /* 0x694 */ mDoExt_invisibleModel mInvisModel; /* 0x69C */ dNpc_JntCtrl_c mJntCtrl; - /* 0x6D0 */ u32 m6D0; + /* 0x6D0 */ u32 mCorpseID; /* 0x6D4 */ int m6D4; - /* 0x6D8 */ s8 m6D8; - /* 0x6D9 */ s8 m6D9; + /* 0x6D8 */ s8 mBckIdx; + /* 0x6D9 */ s8 mAnmPrmIdx; /* 0x6DA */ s8 m6DA; /* 0x6DB */ s8 m6DB; /* 0x6DC */ s8 m6DC; @@ -168,14 +204,14 @@ public: /* 0x6E0 */ enemyice mEnemyIce; /* 0xA98 */ enemyfire mEnemyFire; /* 0xCC0 */ JntHit_c* mpJntHit; - /* 0xCC4 */ cXyz mAttPos; + /* 0xCC4 */ cXyz mTargetPos; /* 0xCD0 */ cXyz mRdEyePos; /* 0xCDC */ s16 mMaxHeadTurnVel; /* 0xCDE */ u8 mCDE[0xCE0 - 0xCDE]; /* 0xCE0 */ int mCE0; /* 0xCE4 */ int mCE4; /* 0xCE8 */ Mtx mCE8; - /* 0xD18 */ s16 mD18; + /* 0xD18 */ s16 mHeadAngle; /* 0xD1A */ s16 mD1A; /* 0xD1C */ s16 mD1C; /* 0xD1E */ s16 mD1E; diff --git a/include/d/d_lib.h b/include/d/d_lib.h index 3d174f218..c55e3ece3 100644 --- a/include/d/d_lib.h +++ b/include/d/d_lib.h @@ -10,6 +10,8 @@ #include "m_Do/m_Do_ext.h" #include "d/d_path.h" +extern Quaternion ZeroQuat; + class STControl { public: STControl(s16, s16, s16, s16, f32, f32, s16, s16); @@ -17,48 +19,47 @@ public: void init(); void Xinit(); void Yinit(); - void getValueStick(); - void getAngleStick(); + virtual f32 getValueStick(); + virtual s16 getAngleStick(); bool checkTrigger(); bool checkLeftTrigger(); bool checkRightTrigger(); bool checkUpTrigger(); bool checkDownTrigger(); - /* 0x00 */ void* vtbl; /* 0x04 */ f32 field_0x04; /* 0x08 */ f32 field_0x08; /* 0x0C */ u8 field_0x0c; /* 0x0D */ u8 field_0x0d; - /* 0x0E */ u16 field_0x0e; - /* 0x10 */ u16 field_0x10; - /* 0x12 */ u16 field_0x12; + /* 0x0E */ s16 field_0x0e; + /* 0x10 */ s16 field_0x10; + /* 0x12 */ s16 field_0x12; /* 0x14 */ s16 field_0x14; /* 0x16 */ s16 field_0x16; - /* 0x18 */ u16 field_0x18; - /* 0x1A */ u16 field_0x1a; - /* 0x1C */ u16 field_0x1c; - /* 0x1E */ u16 field_0x1e; - /* 0x20 */ u16 field_0x20; - /* 0x22 */ u16 field_0x22; + /* 0x18 */ s16 field_0x18; + /* 0x1A */ s16 field_0x1a; + /* 0x1C */ s16 field_0x1c; + /* 0x1E */ s16 field_0x1e; + /* 0x20 */ s16 field_0x20; + /* 0x22 */ s16 field_0x22; /* 0x24 */ s16 field_0x24; /* 0x26 */ s16 field_0x26; }; -class CSTControl { +class CSTControl : public STControl { public: - void getValueStick(); - void getAngleStick(); + virtual f32 getValueStick(); + virtual s16 getAngleStick(); }; class dLib_anm_prm_c { public: - /* 0x00 */ s8 field_0x00; - /* 0x01 */ s8 field_0x01; + /* 0x00 */ s8 mBckIdx; + /* 0x01 */ s8 mNextPrmIdx; /* 0x02 */ s16 field_0x02; - /* 0x04 */ f32 field_0x04; - /* 0x08 */ f32 field_0x08; - /* 0x0C */ u32 loopMode; + /* 0x04 */ f32 mMorf; + /* 0x08 */ f32 mPlaySpeed; + /* 0x0C */ int mLoopMode; }; class dLib_circle_path_c { @@ -76,14 +77,15 @@ class dLib_wave_c; class dLib_anm_idx_c; void dLib_setCirclePath(dLib_circle_path_c*); -void dLib_getWaterY(cXyz&, dBgS_ObjAcch&); +f32 dLib_getWaterY(cXyz& pos, dBgS_ObjAcch& acch); void dLib_waveRot(Vec*, f32, dLib_wave_c*); -void dLib_debugDrawAxis(Mtx&, f32); -void dLib_debugDrawFan(cXyz&, s16, s16, f32, const GXColor&); +void dLib_debugDrawAxis(Mtx& mtx, f32 length); +void dLib_debugDrawFan(cXyz& center, s16 angleY, s16 fanSpreadAngle, f32 radius, const GXColor& color); bool dLib_brkInit(J3DModelData*, mDoExt_brkAnm*, const char*, int); bool dLib_btkInit(J3DModelData*, mDoExt_btkAnm*, const char*, int); void dLib_setAnm(const char*, mDoExt_McaMorf*, s8*, s8*, s8*, const dLib_anm_idx_c*, const dLib_anm_prm_c*, bool); -void dLib_bcks_setAnm(const char*, mDoExt_McaMorf*, s8*, s8*, s8*, const int*, const dLib_anm_prm_c*, bool); +void dLib_bcks_setAnm(const char* arcName, mDoExt_McaMorf* morf, s8* pBckIdx, s8* pPrmIdx, + s8* param_5, const int* bcksTbl, const dLib_anm_prm_c* anmPrmTbl, bool param_8); void dLib_scaleAnime(f32* o_value, f32* p_targets, int targetNum, int* p_targetIdx, f32 scale, f32 maxStep, f32 minStep); void dLib_getPosFromMtx(f32(*)[4], cXyz*); bool dLib_pathInfo(dPath**, u8); diff --git a/src/d/actor/d_a_mozo.cpp b/src/d/actor/d_a_mozo.cpp index 2d4b4e10a..45ce57010 100644 --- a/src/d/actor/d_a_mozo.cpp +++ b/src/d/actor/d_a_mozo.cpp @@ -10,9 +10,9 @@ #include "d/d_kankyo.h" #include "d/d_procname.h" #include "d/d_cc_d.h" +#include "d/d_lib.h" #include "m_do/m_Do_mtx.h" #include "m_Do/m_Do_ext.h" -#include "dolphin/types.h" /*** HIO ***/ @@ -77,6 +77,8 @@ public: // TODO: insert missing members + Quaternion mQuatRotation; + dCcD_Stts mColStatus; dCcD_Cps mCapsuleCol; }; @@ -245,8 +247,7 @@ s32 daMozo_c::CreateInit() { } } - // TODO: find out where d_lib::ZeroQuat lives - //mQuatRotation = ZeroQuat; + mQuatRotation = ZeroQuat; fopAcM_setCullSizeBox(this, -1000.f, -1000.f, -1000.f, 1000.0f, 1000.0f, 1000.0f); mCullMtx = mAnimMorf->getModel()->getBaseTRMtx(); diff --git a/src/d/actor/d_a_rd.cpp b/src/d/actor/d_a_rd.cpp index 30285bc7a..5ced5a6bb 100644 --- a/src/d/actor/d_a_rd.cpp +++ b/src/d/actor/d_a_rd.cpp @@ -100,10 +100,10 @@ daRd_HIO_c::daRd_HIO_c() { m2C = 0x0; m30 = 650.0f; m34 = 650.0f; - m38 = 500.0f; + mCryRadius = 500.0f; mAttackRadius = 125.0f; m40 = 0x2000; - m42 = 0x1B58; + mCrySpreadAngle = 0x1B58; mAttackSpreadAngle = 0x6000; m46 = 0xA; m48 = 0x5; @@ -115,7 +115,7 @@ daRd_HIO_c::daRd_HIO_c() { m60 = 50.0f; m64 = 30.0f; m68 = 1.8; - m6C = 2.0f; + mReturnWalkSpeed = 2.0f; m70 = 1.25; m74 = 0.9; m50 = 0x28; @@ -141,7 +141,7 @@ daRd_HIO_c::daRd_HIO_c() { } /* 0000027C-000002A8 .text searchNeadDeadRd_CB__FPvPv */ -static fopAc_ac_c* searchNeadDeadRd_CB(void* i_actor, void* i_this) { +static void* searchNeadDeadRd_CB(void* i_actor, void* i_this) { return static_cast(i_this)->_searchNearDeadRd(static_cast(i_actor)); } @@ -179,7 +179,7 @@ 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, &mAttPos); + mDoMtx_stack_c::multVec(&l_offsetAttPos, &mTargetPos); mDoMtx_stack_c::XrotM(mJntCtrl.getHead_y()); mDoMtx_stack_c::ZrotM(mJntCtrl.getHead_x()); mDoMtx_stack_c::multVec(&l_offsetEyePos, &mRdEyePos); @@ -226,7 +226,7 @@ BOOL daRd_c::_nodeHeadControl(J3DNode* node, J3DModel* model) { csXyz angle; mDoMtx_inverseTranspose(mDoMtx_stack_c::get(), mtx); mDoMtx_MtxToRot(mtx, &angle); - mD18 = angle.y; + mHeadAngle = angle.y; } /* 000006A0-000006C0 .text createHeap_CB__FP10fopAc_ac_c */ @@ -263,7 +263,7 @@ BOOL daRd_c::_createHeap() { return FALSE; } - modelData->getJointNodePointer(0x0C)->setCallBack(nodeHeadControl_CB); + modelData->getJointNodePointer(0x0C)->setCallBack(nodeHeadControl_CB); // ree_atama_1 J3DAnmTevRegKey* brk = static_cast(dComIfG_getObjectRes(m_arc_name, RD_BRK_NML)); JUT_ASSERT(550, brk != 0); @@ -442,7 +442,7 @@ bool daRd_c::checkPlayerInAttack() { /* 00000A38-00000AA0 .text checkPlayerInCry__6daRd_cFv */ bool daRd_c::checkPlayerInCry() { - return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), mD18, l_HIO.m42, l_HIO.m38, 100.0f); + return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), mHeadAngle, l_HIO.mCrySpreadAngle, l_HIO.mCryRadius, 100.0f); } /* 00000AA0-00000D78 .text lookBack__6daRd_cFv */ @@ -453,7 +453,7 @@ void daRd_c::lookBack() { mJntCtrl.clrTrn(); mJntCtrl.offHeadLock(); mJntCtrl.offBackBoneLock(); - mAttPos = player->getHeadTopPos(); + mTargetPos = player->getHeadTopPos(); } else { switch (mMode) { case MODE_WAIT: @@ -476,10 +476,10 @@ void daRd_c::lookBack() { break; } - switch (m6D9) { - case 0x2: - case 0x9: - case 0xA: + switch (mAnmPrmIdx) { + case AnmPrm_SUWARIP: + case AnmPrm_TATSU: + case AnmPrm_SUWARU: r29 = false; mJntCtrl.clrTrn(); mJntCtrl.onHeadLock(); @@ -489,25 +489,25 @@ void daRd_c::lookBack() { switch (mMode) { case MODE_CRY: - if (dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m42, 150.0f, 100.0f)) { + if (dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.mCrySpreadAngle, 150.0f, 100.0f)) { mJntCtrl.clrTrn(); mJntCtrl.onHeadLock(); mJntCtrl.onBackBoneLock(); } - mAttPos = player->getHeadTopPos(); + mTargetPos = player->getHeadTopPos(); break; case MODE_RETURN: - if (dLib_checkActorInCircle(m300, this, 100.0f, 1000.0f)) { + if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) { mJntCtrl.clrTrn(); mJntCtrl.onHeadLock(); mJntCtrl.onBackBoneLock(); } - mAttPos = m300; + mTargetPos = mSpawnPos; break; case MODE_SILENT_PRAY: break; default: - mAttPos = player->getHeadTopPos(); + mTargetPos = player->getHeadTopPos(); break; } } @@ -518,7 +518,7 @@ void daRd_c::lookBack() { mMaxHeadTurnVel = 0; } - mJntCtrl.lookAtTarget(&shape_angle.y, &mAttPos, mRdEyePos, shape_angle.y, mMaxHeadTurnVel, r29); + mJntCtrl.lookAtTarget(&shape_angle.y, &mTargetPos, mRdEyePos, shape_angle.y, mMaxHeadTurnVel, r29); } /* 00000D78-00001650 .text checkTgHit__6daRd_cFv */ @@ -548,7 +548,6 @@ bool daRd_c::checkTgHit() { return false; } - switch (hitObj->GetAtType()) { case AT_TYPE_SWORD: case AT_TYPE_MACHETE: @@ -629,7 +628,7 @@ bool daRd_c::checkTgHit() { break; case AT_TYPE_NORMAL_ARROW: mHitType = 5; - if (!dLib_checkActorInCircle(current.pos, player, l_HIO.m38, 1000.0f)) { + if (!dLib_checkActorInCircle(current.pos, player, l_HIO.mCryRadius, 1000.0f)) { fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44); mCE0 = 40; r29 = false; @@ -708,7 +707,7 @@ void daRd_c::setCollision() { mCyl.OnCoSPrmBit(0x02); } - if (m6D9 == 2) { + if (isAnm(AnmPrm_SUWARIP)) { mCyl.SetR(80.0f + g_regHIO.mChild[8].mFloatRegs[1]); mCyl.SetH(170.0f + g_regHIO.mChild[8].mFloatRegs[0]); } else { @@ -722,7 +721,7 @@ void daRd_c::setCollision() { /* 000017D0-0000180C .text setIceCollision__6daRd_cFv */ void daRd_c::setIceCollision() { - if (m6D9 == 2) { + if (isAnm(AnmPrm_SUWARIP)) { mEnemyIce.mWallRadius = 50.0f; mEnemyIce.mCylHeight = 170.0f; } else { @@ -781,9 +780,12 @@ void daRd_c::modeWait() { fopAc_ac_c* player = dComIfGp_getLinkPlayer(); BOOL isOto = fopAcM_otoCheck(this, mAreaRadius); if (!isLinkControl()) { - if (dLib_checkActorInCircle(m300, this, mAreaRadius, 1000.0f)) { - if (dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f)) { - if ((dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + g_regHIO.mChild[12].mFloatRegs[4]) || + if (dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f)) { + // The ReDead will only wake up if the player is in a 200-unit-tall cylinder around its spawn point. + // Bug: If the ReDead spawned high up in the air, its spawn point will remain there even after the ReDead + // itself has fallen down to ground level. This means it will not be able to notice the player properly. + if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) { + if ((dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + g_regHIO.mChild[12].mFloatRegs[4]) || isOto || dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m40, l_HIO.m34, 100.0f) ) { @@ -794,24 +796,24 @@ void daRd_c::modeWait() { } } - if (dLib_checkActorInCircle(m300, this, 100.0f, 1000.0f)) { - cLib_addCalcAngleS2(&shape_angle.y, m30C, 0x4, 0x200); - if (cLib_distanceAngleS(shape_angle.y, m30C) <= 0x200) { - shape_angle.y = m30C; - if (m2B4 == 1 && !isAnm(2)) { - setAnm(0xA, false); + if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) { + cLib_addCalcAngleS2(&shape_angle.y, mSpawnAngle, 0x4, 0x200); + if (cLib_distanceAngleS(shape_angle.y, mSpawnAngle) <= 0x200) { + shape_angle.y = mSpawnAngle; + if (mWhichIdleAnm == 1 && !isAnm(AnmPrm_SUWARIP)) { + setAnm(AnmPrm_SUWARU, false); } - if (m2B4 == 0) { - setAnm(0x1, false); + if (mWhichIdleAnm == 0) { + setAnm(AnmPrm_TACHIP1, false); } } - } else if (!dLib_checkActorInCircle(m300, this, mAreaRadius, 1000.0f) || - !dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f) + } else if (!dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f) || + !dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f) ) { modeProcInit(MODE_RETURN); return; } - if (!isLinkControl() && checkPlayerInAttack() && isAnm(1)) { + if (!isLinkControl() && checkPlayerInAttack() && isAnm(AnmPrm_TACHIP1)) { modeProcInit(MODE_ATTACK); } } @@ -819,7 +821,7 @@ void daRd_c::modeWait() { /* 00001DDC-00001E68 .text modeDeathInit__6daRd_cFv */ void daRd_c::modeDeathInit() { fopAcM_monsSeStart(this, JA_SE_CV_RD_DIE, 0); - setAnm(8, false); + setAnm(AnmPrm_DEAD, false); speedF = 0.0f; mTimer1 = 10*30; } @@ -849,7 +851,7 @@ void daRd_c::modeDeath() { /* 00001F14-00001F98 .text modeDamageInit__6daRd_cFv */ void daRd_c::modeDamageInit() { fopAcM_monsSeStart(this, JA_SE_CV_RD_DAMAGE, 0); - setAnm(7, true); + setAnm(AnmPrm_DAMAGE, true); speedF = 0.0f; } @@ -868,7 +870,7 @@ void daRd_c::modeDamage() { return; } - if (dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f)) { + if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) { modeProcInit(MODE_MOVE); } else { modeProcInit(MODE_WAIT); @@ -877,8 +879,8 @@ void daRd_c::modeDamage() { /* 00002084-000020EC .text modeParalysisInit__6daRd_cFv */ void daRd_c::modeParalysisInit() { - if (!isAnm(0xC) && !isAnm(0xD)) { - setAnm(0xC, false); + if (!isAnm(AnmPrm_BEAM_HIT) && !isAnm(AnmPrm_BEAM)) { + setAnm(AnmPrm_BEAM_HIT, false); } mTimer1 = l_HIO.mParalysisDuration; speedF = 0.0f; @@ -887,13 +889,13 @@ void daRd_c::modeParalysisInit() { /* 000020EC-000021F0 .text modeParalysis__6daRd_cFv */ void daRd_c::modeParalysis() { /* Nonmatching: isStop inline regalloc + checkTgHit() clrlwi. missing? */ - if (isAnm(0xC) && mpMorf->isStop()) { - setAnm(0xD, false); - } else if (isAnm(0xD)) { + if (isAnm(AnmPrm_BEAM_HIT) && mpMorf->isStop()) { + setAnm(AnmPrm_BEAM, false); + } else if (isAnm(AnmPrm_BEAM)) { if (cLib_calcTimer(&mTimer1) == 0) { - setAnm(0xE, false); + setAnm(AnmPrm_BEAM_END, false); } - } else if (isAnm(0xE) && mpMorf->isStop()) { + } else if (isAnm(AnmPrm_BEAM_END) && mpMorf->isStop()) { modeProcInit(MODE_WAIT); } @@ -904,24 +906,24 @@ void daRd_c::modeParalysis() { /* 000021F0-0000223C .text modeMoveInit__6daRd_cFv */ void daRd_c::modeMoveInit() { - if (m2B4 == 1 && (m6D9 == 2 || m6D9 == 0xA)) { - setAnm(9, false); + if (mWhichIdleAnm == 1 && (isAnm(AnmPrm_SUWARIP) || isAnm(AnmPrm_SUWARU))) { + setAnm(AnmPrm_TATSU, false); } } /* 0000223C-000024B0 .text modeMove__6daRd_cFv */ void daRd_c::modeMove() { - if (!checkTgHit() && !isAnm(9)) { + if (!checkTgHit() && !isAnm(AnmPrm_TATSU)) { if (!isLinkControl() && checkPlayerInCry()) { modeProcInit(MODE_CRY); return; } daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); - if (!dLib_checkActorInCircle(m300, this, mAreaRadius, 1000.0f) || !dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f)) { + if (!dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f) || !dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) { modeProcInit(MODE_RETURN); return; } - int angle = cLib_distanceAngleS(fopAcM_searchPlayerAngleY(this), mD18); + int angle = cLib_distanceAngleS(fopAcM_searchPlayerAngleY(this), mHeadAngle); if (angle < 0x50) { f32 dist = fopAcM_searchPlayerDistanceXZ(this); f32 temp = (dist / 100.0f) + g_regHIO.mChild[12].mFloatRegs[3]; @@ -940,9 +942,9 @@ void daRd_c::modeMove() { cLib_addCalc2(&speedF, 0.0f, 0.1f, 0.1f + g_regHIO.mChild[12].mFloatRegs[0]); } if (speedF < 0.1f) { - setAnm(1, false); + setAnm(AnmPrm_TACHIP1, false); } else { - setAnm(6, false); + setAnm(AnmPrm_WALK, false); } if (!isLinkControl() && checkPlayerInAttack()) { modeProcInit(MODE_ATTACK); @@ -967,7 +969,7 @@ void daRd_c::modeCryInit() { /* 000025A8-000028B8 .text modeCry__6daRd_cFv */ void daRd_c::modeCry() { - setAnm(6, false); + setAnm(AnmPrm_WALK, false); f32 stickPosX = g_mDoCPd_cpadInfo[0].mMainStickPosX; f32 stickPosY = g_mDoCPd_cpadInfo[0].mMainStickPosY; @@ -1050,7 +1052,7 @@ void daRd_c::modeCryWait() { if (g_dComIfG_gameInfo.play.getEvent().runCheck()) { mTimer1 = 60; mTimer2 = 45; - } else if (m6D9 == 6) { + } else if (isAnm(AnmPrm_WALK)) { if (cLib_calcTimer(&mTimer1) == 0) { modeProcInit(MODE_MOVE); } else if (cLib_calcTimer(&mTimer2) == 0 && checkPlayerInAttack()) { @@ -1065,7 +1067,7 @@ void daRd_c::modeAttackInit() { mTimer1 = l_HIO.m52; mBreakFreeCounter = l_HIO.m50; mTimer2 = 30; - setAnm(6, false); + setAnm(AnmPrm_WALK, false); speedF = 0.0f; } @@ -1084,7 +1086,7 @@ void daRd_c::modeAttack() { f32 stickPosY = g_mDoCPd_cpadInfo[0].mMainStickPosY; if (mEvtInfo.checkCommandDemoAccrpt()) { daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); - if (m6D9 == 4) { + if (isAnm(AnmPrm_ATACK)) { f32 frame = player->getBaseAnimeFrame(); mpMorf->setFrame(frame); cLib_addCalcAngleS2(&shape_angle.y, player->shape_angle.y, 0x4, 0x2000); @@ -1098,9 +1100,9 @@ void daRd_c::modeAttack() { return; } f32 dist = fopAcM_searchPlayerDistanceXZ(this); - if (dist <= 50.0f + g_regHIO.mChild[12].mFloatRegs[5] && m6D9 != 4) { + if (dist <= 50.0f + g_regHIO.mChild[12].mFloatRegs[5] && !isAnm(AnmPrm_ATACK)) { offIkari(); - setAnm(3, false); + setAnm(AnmPrm_WALK2ATACK, false); } if (dist <= 20.0f + g_regHIO.mChild[12].mFloatRegs[2]) { cLib_addCalcPosXZ2(¤t.pos, player->current.pos, 0.3f, 1.0f); @@ -1121,7 +1123,7 @@ void daRd_c::modeAttack() { if (dComIfGs_getLife() == 0) { dComIfGp_event_reset(); - setAnm(5, false); + setAnm(AnmPrm_ATACK2WALK, false); modeProcInit(MODE_WAIT); return; } @@ -1148,7 +1150,7 @@ void daRd_c::modeAttack() { if (cLib_calcTimer(&mTimer1) == 0 || mBreakFreeCounter < 0) { dComIfGp_event_reset(); - setAnm(5, false); + setAnm(AnmPrm_ATACK2WALK, false); modeProcInit(MODE_CRY_WAIT); } } else if (!checkTgHit()) { @@ -1166,18 +1168,18 @@ void daRd_c::modeReturn() { return; } - setAnm(6, false); + setAnm(AnmPrm_WALK, false); - if (dLib_checkActorInCircle(m300, this, 100.0f, 1000.0f)) { + if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) { speedF = 0.0f; - cLib_addCalcAngleS2(&shape_angle.y, m30C, 0xA, 0x200); - if (cLib_distanceAngleS(shape_angle.y, m30C) <= 0x200) { - shape_angle.y = m30C; + cLib_addCalcAngleS2(&shape_angle.y, mSpawnAngle, 0xA, 0x200); + if (cLib_distanceAngleS(shape_angle.y, mSpawnAngle) <= 0x200) { + shape_angle.y = mSpawnAngle; modeProcInit(MODE_WAIT); return; } } else { - cLib_addCalc2(&speedF, l_HIO.m6C, 0.1f, 0.1f + g_regHIO.mChild[12].mFloatRegs[0]); + cLib_addCalc2(&speedF, l_HIO.mReturnWalkSpeed, 0.1f, 0.1f + g_regHIO.mChild[12].mFloatRegs[0]); } if (dComIfGp_evmng_startCheck("DEFAULT_RD_ATTACK")) { @@ -1187,9 +1189,9 @@ void daRd_c::modeReturn() { daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); BOOL isOto = fopAcM_otoCheck(this, mAreaRadius); if (!isLinkControl()) { - if (dLib_checkActorInCircle(m300, this, mAreaRadius, 1000.0f)) { - if (dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f)) { - if ((dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + g_regHIO.mChild[12].mFloatRegs[4]) || + if (dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f)) { + if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) { + if ((dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + g_regHIO.mChild[12].mFloatRegs[4]) || isOto || dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m40, l_HIO.m34, 100.0f) ) { @@ -1211,20 +1213,20 @@ void daRd_c::modeSilentPray() { return; } - setAnm(6, false); + setAnm(AnmPrm_WALK, false); daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer(); - fopAc_ac_c* dyingReDead; - if (fopAcM_SearchByID(m6D0, &dyingReDead)) { - mAttPos = dyingReDead->current.pos; - if (dLib_checkActorInCircle(mAttPos, this, 200.0f, 1000.0f)) { - setAnm(1, false); + fopAc_ac_c* corpse; + if (fopAcM_SearchByID(mCorpseID, &corpse)) { + mTargetPos = corpse->current.pos; + if (dLib_checkActorInCircle(mTargetPos, this, 200.0f, 1000.0f)) { + setAnm(AnmPrm_TACHIP1, false); speedF = 0.0f; } else { - cLib_addCalc2(&speedF, l_HIO.m6C, 0.1f, 0.1f + g_regHIO.mChild[12].mFloatRegs[0]); + cLib_addCalc2(&speedF, l_HIO.mReturnWalkSpeed, 0.1f, 0.1f + g_regHIO.mChild[12].mFloatRegs[0]); } } else if (!isLinkControl()) { - if (dLib_checkActorInCircle(m300, player, mAreaRadius, 100.0f)) { + if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) { modeProcInit(MODE_MOVE); } else { modeProcInit(MODE_WAIT); @@ -1245,7 +1247,7 @@ void daRd_c::modeSilentPray() { /* 00003400-00003428 .text modeSwWaitInit__6daRd_cFv */ void daRd_c::modeSwWaitInit() { - setAnm(0xB, false); + setAnm(AnmPrm_KANOKEP, false); } /* 00003428-00003480 .text modeSwWait__6daRd_cFv */ @@ -1257,12 +1259,12 @@ void daRd_c::modeSwWait() { /* 00003480-00003514 .text modeKanokeInit__6daRd_cFv */ void daRd_c::modeKanokeInit() { - setAnm(0xB, false); + setAnm(AnmPrm_KANOKEP, false); mTimer1 = 90; cXyz offset(0.0f, 0.0f, 150.0f); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y); - mDoMtx_stack_c::multVec(&offset, &m300); + mDoMtx_stack_c::multVec(&offset, &mSpawnPos); } /* 00003514-0000355C .text modeKanoke__6daRd_cFv */ @@ -1428,7 +1430,7 @@ void daRd_c::setBtkAnm(s8 idx) { } /* 00003B3C-00003C48 .text setAnm__6daRd_cFScb */ -void daRd_c::setAnm(s8 param_1, bool param_2) { +void daRd_c::setAnm(s8 anmIdx, bool param_2) { static const int a_anm_bcks_tbl[] = { RD_BCK_TACHIP, RD_BCK_SUWARIP, @@ -1446,44 +1448,164 @@ void daRd_c::setAnm(s8 param_1, bool param_2) { RD_BCK_BEAM_END, }; static const dLib_anm_prm_c a_anm_prm_tbl[] = { - {0x0, -1, 0, 8.0f, 1.0f, 2}, - {0x0, -1, 0, 8.0f, 1.0f, 2}, - {0x1, -1, 0, 8.0f, 1.0f, 2}, - {0x2, 4, 0, 8.0f, 1.0f, 0}, - {0x3, -1, 0, 8.0f, 1.0f, 2}, - {0x4, 6, 0, 8.0f, 1.0f, 0}, - {0x5, -1, 0, 8.0f, 1.0f, 2}, - {0x6, 1, 0, 2.0f, 1.0f, 0}, - {0x7, -1, 0, 2.0f, 1.0f, 0}, - {0x8, 1, 0, 8.0f, 0.5f, 0}, - {0x9, 2, 0, 8.0f, 0.5f, 0}, - {0xA, -1, 0, 8.0f, 1.0f, 2}, - {0xB, -1, 0, 2.0f, 1.0f, 0}, - {0xC, -1, 0, 2.0f, 1.0f, 2}, - {0xD, -1, 0, 2.0f, 1.0f, 0}, + { + // AnmPrm_TACHIP0 + /* mBckIdx */ BckIdx_TACHIP, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_TACHIP1 + /* mBckIdx */ BckIdx_TACHIP, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_SUWARIP + /* mBckIdx */ BckIdx_SUWARIP, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_WALK2ATACK + /* mBckIdx */ BckIdx_WALK2ATACK, + /* mNextPrmIdx */ AnmPrm_ATACK, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_ATACK + /* mBckIdx */ BckIdx_ATACK, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_ATACK2WALK + /* mBckIdx */ BckIdx_ATACK2WALK, + /* mNextPrmIdx */ AnmPrm_WALK, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_WALK + /* mBckIdx */ BckIdx_WALK, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_DAMAGE + /* mBckIdx */ BckIdx_DAMAGE, + /* mNextPrmIdx */ AnmPrm_TACHIP1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_DEAD + /* mBckIdx */ BckIdx_DEAD, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_TATSU + /* mBckIdx */ BckIdx_TATSU, + /* mNextPrmIdx */ AnmPrm_TACHIP1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 0.5f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_SUWARU + /* mBckIdx */ BckIdx_SUWARU, + /* mNextPrmIdx */ AnmPrm_SUWARIP, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 0.5f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_KANOKEP + /* mBckIdx */ BckIdx_KANOKEP, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 8.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_BEAM_HIT + /* mBckIdx */ BckIdx_BEAM_HIT, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, + { + // AnmPrm_BEAM + /* mBckIdx */ BckIdx_BEAM, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e + }, + { + // AnmPrm_BEAM_END + /* mBckIdx */ BckIdx_BEAM_END, + /* mNextPrmIdx */ -1, + /* field_0x02 */ 0, + /* mMorf */ 2.0f, + /* mPlaySpeed */ 1.0f, + /* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e + }, }; - if (param_1 != 0xF) { - m6D9 = param_1; + if (anmIdx != AnmPrm_NULL) { + mAnmPrmIdx = anmIdx; } - if (m6DA != m6D9) { - if (m6D9 == 0xC) { + if (m6DA != mAnmPrmIdx) { + if (isAnm(AnmPrm_BEAM_HIT)) { setBrkAnm(0x1); - } else if (m6D9 == 0xD) { + } else if (isAnm(AnmPrm_BEAM)) { setBrkAnm(0x2); - } else if (m6D9 == 0xE) { + } else if (isAnm(AnmPrm_BEAM_END)) { setBrkAnm(0x3); } else { setBrkAnm(0x0); } } - if (m6D8 == 0xB || m6D8 == 0xC || m6D8 == 0xD) { + if (mBckIdx == RD_BCK_DAMAGE || mBckIdx == RD_BCK_DEAD || mBckIdx == RD_BCK_IKARI_SAMPLE) { mBrkAnm.setFrame(mpMorf->getFrame()); } - dLib_bcks_setAnm(m_arc_name, mpMorf, &m6D8, &m6D9, &m6DA, a_anm_bcks_tbl, a_anm_prm_tbl, param_2); + dLib_bcks_setAnm(m_arc_name, mpMorf, &mBckIdx, &mAnmPrmIdx, &m6DA, a_anm_bcks_tbl, a_anm_prm_tbl, param_2); } /* 00003C48-000040A8 .text _execute__6daRd_cFv */ @@ -1503,9 +1625,9 @@ bool daRd_c::_execute() { if (mMode != MODE_SILENT_PRAY && mMode != MODE_DEATH && mMode != MODE_DAMAGE && mMode != MODE_ATTACK && mMode != MODE_CRY && mMode != MODE_CRY_WAIT) { - daRd_c* dyingReDead = (daRd_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)&searchNeadDeadRd_CB, this); - if (dyingReDead != NULL) { - m6D0 = fopAcM_GetID(dyingReDead); + daRd_c* corpse = (daRd_c*)fopAcIt_Judge(&searchNeadDeadRd_CB, this); + if (corpse != NULL) { + mCorpseID = fopAcM_GetID(corpse); modeProcInit(MODE_SILENT_PRAY); } } @@ -1564,7 +1686,7 @@ bool daRd_c::_execute() { cLib_addCalc2(&mD38, 0.0f, 0.1f, l_HIO.m64); } - if (isAnm(6)) { + if (isAnm(AnmPrm_WALK)) { f32 temp = speedF * l_HIO.m70; mpMorf->setPlaySpeed(temp < l_HIO.m74 ? l_HIO.m74 : temp); if (mMode == MODE_ATTACK) { @@ -1583,7 +1705,7 @@ bool daRd_c::_execute() { mpMorf->calc(); enemy_fire(&mEnemyFire); modeProc(PROC_EXEC, MODE_NULL); - setAnm(0xF, false); + setAnm(AnmPrm_NULL, false); setBtkAnm(0x5); g_env_light.settingTevStruct(0, ¤t.pos, &mTevStr); @@ -1592,12 +1714,12 @@ bool daRd_c::_execute() { /* 000040A8-000041A8 .text debugDraw__6daRd_cFv */ void daRd_c::debugDraw() { - cXyz temp = m300; - temp.y += 10.0f; + cXyz spawnPos = mSpawnPos; + spawnPos.y += 10.0f; cXyz pos = current.pos; 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, mHeadAngle, l_HIO.mCrySpreadAngle, l_HIO.mCryRadius, (GXColor){0xFF, 0xFF, 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); @@ -1659,7 +1781,7 @@ void daRd_c::createInit() { modelData->getJointNodePointer(0x08)->setCallBack(nodeControl_CB); // ree_mune_1 setBtkAnm(2); - if (m2BC == 0) { + if (mChecksSwitch == 0) { modeProcInit(MODE_SW_WAIT); cXyz offset(0.0f, 40.0f, 10.0f); mDoMtx_stack_c::transS(current.pos); @@ -1667,12 +1789,12 @@ void daRd_c::createInit() { mDoMtx_stack_c::multVec(&offset, ¤t.pos); } else { modeProcInit(MODE_WAIT); - switch (m2B4) { + switch (mWhichIdleAnm) { case 0: - setAnm(1, false); + setAnm(AnmPrm_TACHIP1, false); break; case 1: - setAnm(2, false); + setAnm(AnmPrm_SUWARIP, false); break; } } @@ -1712,14 +1834,15 @@ void daRd_c::createInit() { mMaxHealth = l_HIO.m46; mHealth = mMaxHealth; - m300 = current.pos; - m30C = shape_angle.y; + mSpawnPos = current.pos; + mSpawnAngle = shape_angle.y; mGravity = -4.5f; - if (m2B4 == 0) { + // TODO: figure out if 1 and 2 actually drop different items + if (mWhichIdleAnm == 0) { mItemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Rdead1", 0); } - if (m2B4 == 1) { + if (mWhichIdleAnm == 1) { mItemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Rdead2", 0); } } @@ -1727,12 +1850,12 @@ void daRd_c::createInit() { /* 000046A4-00004720 .text getArg__6daRd_cFv */ void daRd_c::getArg() { u32 params = fopAcM_GetParam(this); - m2B4 = fopAcM_GetParamBit(params, 0x00, 1); - u8 param = fopAcM_GetParamBit(params, 0x01, 7); - s32 areaRadius = param; - m2BC = fopAcM_GetParamBit(params, 0x08, 8); + mWhichIdleAnm = fopAcM_GetParamBit(params, 0x00, 1); + u8 radiusParam = fopAcM_GetParamBit(params, 0x01, 7); + s32 areaRadius = radiusParam; + mChecksSwitch = fopAcM_GetParamBit(params, 0x08, 8); mSwNo = fopAcM_GetParamBit(params, 0x18, 8); - if ((s32)param == 0x7F) { + if ((s32)radiusParam == 0x7F) { areaRadius = 0; } mAreaRadius = l_HIO.m30 + areaRadius; diff --git a/src/d/d_lib.cpp b/src/d/d_lib.cpp index 542ae7fc9..1dc96eee3 100644 --- a/src/d/d_lib.cpp +++ b/src/d/d_lib.cpp @@ -5,8 +5,12 @@ #include "d/d_lib.h" #include "d/d_com_inf_game.h" +#include "d/actor/d_a_sea.h" #include "m_Do/m_Do_mtx.h" #include "SSystem/SComponent/c_math.h" +#include "m_Do/m_Do_controller_pad.h" + +Quaternion ZeroQuat = {0.0f, 0.0f, 0.0f, 1.0f}; /* 80057000-800570CC .text dLib_setCirclePath__FP18dLib_circle_path_c */ void dLib_setCirclePath(dLib_circle_path_c* path) { @@ -22,8 +26,16 @@ void dLib_setCirclePath(dLib_circle_path_c* path) { } /* 800570CC-8005716C .text dLib_getWaterY__FR4cXyzR12dBgS_ObjAcch */ -void dLib_getWaterY(cXyz&, dBgS_ObjAcch&) { - /* Nonmatching */ +f32 dLib_getWaterY(cXyz& pos, dBgS_ObjAcch& acch) { + BOOL waterHit = acch.ChkWaterHit(); + f32 waterHeight = waterHit ? acch.m_wtr.GetHeight() : -1e+09f; + if (daSea_ChkArea(pos.x, pos.z)) { + f32 seaHeight = daSea_calcWave(pos.x, pos.z); + if (!waterHit || seaHeight > waterHeight) { + return seaHeight; + } + } + return waterHit ? waterHeight : 0.0f; } /* 8005716C-80057368 .text dLib_waveRot__FP3VecfP11dLib_wave_c */ @@ -32,19 +44,52 @@ void dLib_waveRot(Vec*, f32, dLib_wave_c*) { } /* 80057368-8005746C .text dLib_debugDrawAxis__FRA3_A4_ff */ -void dLib_debugDrawAxis(Mtx&, f32) { - /* Nonmatching */ +void dLib_debugDrawAxis(Mtx& mtx, f32 length) { + cXyz r1_98(length, 0.0f, 0.0f); + cXyz r1_8c(0.0f, length, 0.0f); + cXyz r1_80(0.0f, 0.0f, length); + cXyz r1_74(0.0f, 0.0f, 0.0f); + cXyz r1_68(0.0f, 0.0f, 0.0f); + cXyz r1_5c(0.0f, 0.0f, 0.0f); + cXyz r1_50; + cXyz r1_4c; + cXyz r1_40; + cXyz r1_34; + cXyz r1_28; + cXyz r1_1c; + cXyz r1_14; + cXyz r1_08; + mDoMtx_stack_c::copy(mtx); + mDoMtx_stack_c::multVecZero(&r1_08); + mDoMtx_stack_c::multVec(&r1_98, &r1_50); + mDoMtx_stack_c::multVec(&r1_8c, &r1_40); + mDoMtx_stack_c::multVec(&r1_80, &r1_34); + mDoMtx_stack_c::multVec(&r1_74, &r1_28); + mDoMtx_stack_c::multVec(&r1_68, &r1_1c); + mDoMtx_stack_c::multVec(&r1_5c, &r1_14); + + // The rest of this function may have been commented out for release builds. } /* 8005746C-80057510 .text dLib_debugDrawFan__FR4cXyzssfRC8_GXColor */ -void dLib_debugDrawFan(cXyz&, s16, s16, f32, const GXColor&) { - /* Nonmatching */ +void dLib_debugDrawFan(cXyz& center, s16 angleY, s16 fanSpreadAngle, f32 radius, const GXColor& color) { + int angle1 = angleY + fanSpreadAngle; + cXyz corner1(center); + corner1.z += cM_scos(angle1) * radius; + corner1.x += cM_ssin(angle1) * radius; + + int angle2 = angleY - fanSpreadAngle; + cXyz corner2(center); + corner2.z += cM_scos(angle2) * radius; + corner2.x += cM_ssin(angle2) * radius; + + // The rest of this function may have been commented out for release builds. } /* 80057510-800575E0 .text dLib_brkInit__FP12J3DModelDataP13mDoExt_brkAnmPCci */ bool dLib_brkInit(J3DModelData* modelData, mDoExt_brkAnm* anm, const char* arcName, int fileno) { J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(arcName, fileno); - JUT_ASSERT(0xae, brk != NULL); + JUT_ASSERT(0xae, brk != 0); if (anm->init(modelData, brk, 1, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0) == 0) return false; return true; @@ -53,20 +98,36 @@ bool dLib_brkInit(J3DModelData* modelData, mDoExt_brkAnm* anm, const char* arcNa /* 800575E0-800576B0 .text dLib_btkInit__FP12J3DModelDataP13mDoExt_btkAnmPCci */ bool dLib_btkInit(J3DModelData* modelData, mDoExt_btkAnm* anm, const char* arcName, int fileno) { J3DAnmTextureSRTKey* btk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(arcName, fileno); - JUT_ASSERT(0xbb, btk != NULL); + JUT_ASSERT(0xbb, btk != 0); if (anm->init(modelData, btk, 1, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0) == 0) return false; return true; } /* 800576B0-80057844 .text dLib_setAnm__FPCcP14mDoExt_McaMorfPScPScPScPC14dLib_anm_idx_cPC14dLib_anm_prm_cb */ -void dLib_setAnm(const char*, mDoExt_McaMorf*, s8*, s8*, s8*, const dLib_anm_idx_c*, const dLib_anm_prm_c*, bool) { +void dLib_setAnm(const char* arcName, mDoExt_McaMorf* morf, s8*, s8*, + s8*, const dLib_anm_idx_c*, const dLib_anm_prm_c* anmPrmTbl, bool param_8) +{ /* Nonmatching */ } /* 80057844-80057988 .text dLib_bcks_setAnm__FPCcP14mDoExt_McaMorfPScPScPScPCiPC14dLib_anm_prm_cb */ -void dLib_bcks_setAnm(const char*, mDoExt_McaMorf*, s8*, s8*, s8*, const int*, const dLib_anm_prm_c*, bool) { - /* Nonmatching */ +void dLib_bcks_setAnm(const char* arcName, mDoExt_McaMorf* morf, s8* pBckIdx, s8* pPrmIdx, + s8* param_5, const int* bcksTbl, const dLib_anm_prm_c* anmPrmTbl, bool param_8) +{ + if ((*param_5 != *pPrmIdx && anmPrmTbl[*pPrmIdx].mBckIdx != -1) || param_8 == true) { + *pBckIdx = anmPrmTbl[*pPrmIdx].mBckIdx; + J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(arcName, bcksTbl[*pBckIdx]); + morf->setAnm(bck, anmPrmTbl[*pPrmIdx].mLoopMode, anmPrmTbl[*pPrmIdx].mMorf, anmPrmTbl[*pPrmIdx].mPlaySpeed, 0.0f, -1.0f, NULL); + } + + *param_5 = *pPrmIdx; + + if (morf->isStop()) { + if (anmPrmTbl[*pPrmIdx].mNextPrmIdx != -1 && anmPrmTbl[*pPrmIdx].mLoopMode == J3DFrameCtrl::LOOP_ONCE_e) { + *pPrmIdx = anmPrmTbl[*pPrmIdx].mNextPrmIdx; + } + } } /* 80057988-80057A14 .text dLib_scaleAnime__FPfPfiPifff */ @@ -197,7 +258,15 @@ void STControl::setWaitParm(s16, s16, s16, s16, f32, f32, s16, s16) { /* 80058274-800582B0 .text init__9STControlFv */ void STControl::init() { - /* Nonmatching */ + field_0x0e = 0; + field_0x10 = 0; + field_0x0d = 0; + field_0x0c = 0; + field_0x22 = 0; + field_0x18 = field_0x12; + field_0x1a = field_0x12; + field_0x1e = field_0x1c; + field_0x20 = field_0x1c; } /* 800582B0-800582D8 .text Xinit__9STControlFv */ @@ -211,23 +280,23 @@ void STControl::Yinit() { } /* 80058300-80058310 .text getValueStick__9STControlFv */ -void STControl::getValueStick() { - /* Nonmatching */ +f32 STControl::getValueStick() { + return g_mDoCPd_cpadInfo[0].mMainStickValue; } /* 80058310-80058320 .text getAngleStick__9STControlFv */ -void STControl::getAngleStick() { - /* Nonmatching */ +s16 STControl::getAngleStick() { + return g_mDoCPd_cpadInfo[0].mMainStickAngle; } /* 80058320-80058330 .text getValueStick__10CSTControlFv */ -void CSTControl::getValueStick() { - /* Nonmatching */ +f32 CSTControl::getValueStick() { + return g_mDoCPd_cpadInfo[0].mCStickValue; } /* 80058330-80058340 .text getAngleStick__10CSTControlFv */ -void CSTControl::getAngleStick() { - /* Nonmatching */ +s16 CSTControl::getAngleStick() { + return g_mDoCPd_cpadInfo[0].mCStickAngle; } /* 80058340-800585D0 .text checkTrigger__9STControlFv */