diff options
| author | robojumper <robojumper@gmail.com> | 2025-11-09 14:56:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-09 14:56:31 +0100 |
| commit | cd4f0d74de1e285ed9dbc37bca4cb32bba5b12cb (patch) | |
| tree | 3f544bde578447e4a967d7c79ae3598d45f3dc05 /src | |
| parent | 9711767bf78c050cef43a053a685538b26a4f2ea (diff) | |
| parent | e911d7ce67b7877768ef5fcd43f60c065f2fe52e (diff) | |
Merge pull request #261 from swekka/d_a_obj_grave
d_a_obj_grave OK
Diffstat (limited to 'src')
| -rw-r--r-- | src/REL/d/a/obj/d_a_obj_grave.cpp | 202 |
1 files changed, 198 insertions, 4 deletions
diff --git a/src/REL/d/a/obj/d_a_obj_grave.cpp b/src/REL/d/a/obj/d_a_obj_grave.cpp index d4dd4e8a..8c6bb452 100644 --- a/src/REL/d/a/obj/d_a_obj_grave.cpp +++ b/src/REL/d/a/obj/d_a_obj_grave.cpp @@ -1,13 +1,207 @@ #include "d/a/obj/d_a_obj_grave.h" +#include "c/c_lib.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_w_base.h" +#include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_sc_game.h" +#include "d/d_stage.h" +#include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "m/m_vec.h" +#include "m/types_m.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/arc_managers/current_stage_arc_manager.h" + SPECIAL_ACTOR_PROFILE(OBJ_GRAVE, dAcOGrave_c, fProfile::OBJ_GRAVE, 0x255, 0, 2); STATE_DEFINE(dAcOGrave_c, Wait); STATE_DEFINE(dAcOGrave_c, Move); +dCcD_SrcUnk dAcOGrave_c::sUnkSrc = { + {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 6, 0x407}, 0, 0}, + /* mObjCo */ {0}}, + {-65.0f, 0.0f, -25.0f, 65.0f, 156.0f, 25.0f}, +}; + +const u8 dAcOGrave_c::lbl_580_rodata_0 = 0xA; +const f32 dAcOGrave_c::lbl_580_rodata_30 = 10.f; + +void dAcOGrave_c::fn_580_480(dAcObjBase_c *link, dBgW_Base::PushPullLabel label) { + if (label & dBgW_Base::PPLABEL_PUSH) { + mAngle.y = link->mRotation.y; + if (link == dAcPy_c::GetLink()) { + this->mPush = true; + } + } else if (label & dBgW_Base::PPLABEL_PULL) { + mAngle.y = link->mRotation.y.mVal + 0x8000; + if (link == dAcPy_c::GetLink()) { + this->mPull = true; + } + } +} + +dAcObjBase_c *dAcOGrave_c::pushPullCb(dAcObjBase_c *grave, dAcObjBase_c *link, dBgW_Base::PushPullLabel label) { + ((dAcOGrave_c *)grave)->fn_580_480(link, label); +} + +bool dAcOGrave_c::unkCb(dBgW *bgW, dAcObjBase_c *grave, dAcObjBase_c *link) { + if (link->isActorPlayer() && dScGame_c::currentSpawnInfo.isNight()) { + ((dAcOGrave_c *)grave)->field_0x7F7 = true; + } + return true; +} + +bool dAcOGrave_c::createHeap() { + void *data = CurrentStageArcManager::GetInstance()->getData("g3d/stage.brres"); + mResFile = nw4r::g3d::ResFile(data); + dStage_c::bindSkyCmnToResFile(&mResFile); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("StageF000Grave"); + TRY_CREATE(mMdl.create(mdl, &mAllocator, 0x128)); + nw4r::g3d::ResAnmClr anmClr = mResFile.GetResAnmClr("StageF000Grave"); + TRY_CREATE(mAnmMatClr.create(mdl, anmClr, &mAllocator, nullptr, 1)); + mMdl.setAnm(mAnmMatClr); + void *dzb = CurrentStageArcManager::GetInstance()->getData("dzb/StageF000Grave.dzb"); + void *plc = CurrentStageArcManager::GetInstance()->getData("dat/StageF000Grave.plc"); + updateMatrix(); + return !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale); +} + +// copy from d_a_obj_fairy - TODO move it to a shared file +inline static void vecCylCalc(mVec3_c &target, const mAng &rot, f32 factor) { + target.x += factor * rot.sin(); + target.z += factor * rot.cos(); +} + +int dAcOGrave_c::create() { + mShouldGlow = getFromParams(0, 3) == 0; + mSceneflag = getFromParams(2, 0xFF); + CREATE_ALLOCATOR(dAcOGrave_c); + mStts.SetRank(0xD); + mCollider.Set(sUnkSrc); + mCollider.SetStts(mStts); + mBgW.SetCrrFunc(dBgS_MoveBGProc_Typical); + mBgW.SetPushPullCallback(pushPullCb); + mBgW.SetUnkCallback(unkCb); + dBgS::GetInstance()->Regist(&mBgW, this); + mAcceleration = 0.f; + mMaxSpeed = -40.f; + mOrigPos1 = mPosition; + field_0x7F6 = true; + if (mSceneflag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + if (dScGame_c::currentSpawnInfo.isNight()) { + mTimer = 1; + } + field_0x7F6 = false; + mOrigPos2 = mPosition; + vecCylCalc(mOrigPos2, mRotation.y.mVal + 0x8000, dAcPy_c::sPushRelatedConstant); + mPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z); + mOldPosition.set(mOrigPos2.x, mOrigPos2.y, mOrigPos2.z); + } + mStateMgr.changeState(StateID_Wait); + mBoundingBox.Set(mVec3_c(-100.f, -0.f, -100.f), mVec3_c(100.f, 200.f, 100.f)); + return SUCCEEDED; +} + +int dAcOGrave_c::doDelete() { + return SUCCEEDED; +} + +int dAcOGrave_c::actorExecute() { + if (mTimer != 0 && mShouldGlow) { + if (mAnmMatClr.getFrame(0) == 0.f || mAnmMatClr.getFrame(0) == 75.f) { + startSound(SE_Grave_AKU_MARK); + } + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + sLib::calcTimer(&mTimer); + } + mAnmMatClr.play(); + } + if ((mObjectActorFlags & 1) == 0) { + mStateMgr.executeState(); + calcVelocity(); + mPosition += mVelocity; + mPosition += mStts.GetCcMove(); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + if (mShouldGlow && dScGame_c::currentSpawnInfo.isNight()) { + mCollider.Set(mPosition, mRotation.y); + dCcS::GetInstance()->Set(&mCollider); + } + mBgW.Move(); + mPush = false; + mPull = false; + field_0x7F7 = false; + } + return SUCCEEDED; +} + +int dAcOGrave_c::draw() { + drawModelType1(&mMdl); + static mQuat_c shadowRot(0.f, 50.f, 0.f, 50.f); + drawShadow(mShadow, nullptr, mWorldMtx, &shadowRot, -1, -1, -1, -1, -1, 0.f); + return SUCCEEDED; +} + void dAcOGrave_c::initializeState_Wait() {} -void dAcOGrave_c::executeState_Wait() {} + +void dAcOGrave_c::executeState_Wait() { + if (mShouldGlow && mTimer == 0) { + if ((mCollider.ChkTgHit() && + (mCollider.ChkTgAtHitType(AT_TYPE_SWORD) || mCollider.ChkTgAtHitType(AT_TYPE_BOMB)) || + field_0x7F7)) { + mTimer = 300; + mAnmMatClr.setFrame(0.f, 0); + mAnmMatClr.setRate(1.f, 0); + } + } + mAng ang = getXZAngleToPlayer(); + s32 diff = sLib::absDiff(ang, mRotation.y); + if (field_0x7F6) { + mOrigPos2 = mPosition; + vecCylCalc(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant); + if ((mPush && (s16)diff < 0x2000) || (mPull && (s16)diff > 0x6000)) { + field_0x7F6 = false; + mStateMgr.changeState(StateID_Move); + } + } else { + mOrigPos2 = mOrigPos1; + if ((mPush && (s16)diff > 0x6000) || (mPull && (s16)diff < 0x2000)) { + field_0x7F6 = true; + mStateMgr.changeState(StateID_Move); + } + } +} + void dAcOGrave_c::finalizeState_Wait() {} -void dAcOGrave_c::initializeState_Move() {} -void dAcOGrave_c::executeState_Move() {} -void dAcOGrave_c::finalizeState_Move() {} + +void dAcOGrave_c::initializeState_Move() { + dAcPy_c::LINK->onFlags_0x360(0x10000); + startSound(SE_Grave_MOVE); +} + +void dAcOGrave_c::executeState_Move() { + if (cLib::chasePosXZ(mPosition, mOrigPos2, lbl_580_rodata_30)) { + mStateMgr.changeState(StateID_Wait); + } +} + +void dAcOGrave_c::finalizeState_Move() { + dAcPy_c::LINK->offFlags_0x360(0x10000); + if (mShouldGlow && mTimer != 0) { + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } + itemDroppingAndGivingRelated(&mOrigPos1, 0); + fillUpperParams2Byte(); +} |
