diff options
| author | LagoLunatic <LagoLunatic@users.noreply.github.com> | 2023-11-22 19:31:49 -0500 |
|---|---|---|
| committer | LagoLunatic <LagoLunatic@users.noreply.github.com> | 2023-11-22 19:31:49 -0500 |
| commit | 0495b56636b971190e87e89cef7e7ea508fbb14c (patch) | |
| tree | ecae6e9e04c36ed9b39868b2e3b48785b16b839b /src | |
| parent | 469f243030912e02c7783384d5bfa58f432acabe (diff) | |
d_lib progress, d_a_rd documentation progress
Diffstat (limited to 'src')
| -rw-r--r-- | src/d/actor/d_a_mozo.cpp | 7 | ||||
| -rw-r--r-- | src/d/actor/d_a_rd.cpp | 377 | ||||
| -rw-r--r-- | src/d/d_lib.cpp | 109 |
3 files changed, 343 insertions, 150 deletions
diff --git a/src/d/actor/d_a_mozo.cpp b/src/d/actor/d_a_mozo.cpp index 2d4b4e10..45ce5701 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 30285bc7..5ced5a6b 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<daRd_c*>(i_this)->_searchNearDeadRd(static_cast<fopAc_ac_c*>(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<J3DAnmTevRegKey*>(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 542ae7fc..1dc96eee 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 */ |
