summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-11-09 14:56:31 +0100
committerGitHub <noreply@github.com>2025-11-09 14:56:31 +0100
commitcd4f0d74de1e285ed9dbc37bca4cb32bba5b12cb (patch)
tree3f544bde578447e4a967d7c79ae3598d45f3dc05 /src
parent9711767bf78c050cef43a053a685538b26a4f2ea (diff)
parente911d7ce67b7877768ef5fcd43f60c065f2fe52e (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.cpp202
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();
+}