diff --git a/config/SOUE01/rels/d_a_obj_graveNP/symbols.txt b/config/SOUE01/rels/d_a_obj_graveNP/symbols.txt index 0b5b75a6..58bcdd47 100644 --- a/config/SOUE01/rels/d_a_obj_graveNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_graveNP/symbols.txt @@ -4,22 +4,22 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global __register_global_object = .text:0x00000070; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x00000090; // type:function size:0x54 scope:global dAcOGrave_c_classInit__Fv = .text:0x000000F0; // type:function size:0x10C -fn_580_200 = .text:0x00000200; // type:function size:0x58 +__dt__15dShadowCircle_cFv = .text:0x00000200; // type:function size:0x58 __dt__24sFState_c<11dAcOGrave_c>Fv = .text:0x00000260; // type:function size:0x58 __dt__27sFStateFct_c<11dAcOGrave_c>Fv = .text:0x000002C0; // type:function size:0x6C __dt__80sStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000330; // type:function size:0xA0 __dt__50sFStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003D0; // type:function size:0xA4 -fn_580_480 = .text:0x00000480; // type:function size:0x60 -fn_580_4E0 = .text:0x000004E0; // type:function size:0x4 -fn_580_4F0 = .text:0x000004F0; // type:function size:0x58 -fn_580_550 = .text:0x00000550; // type:function size:0x140 -fn_580_690 = .text:0x00000690; // type:function size:0x26C +fn_580_480__11dAcOGrave_cFP12dAcObjBase_cQ29dBgW_Base13PushPullLabel = .text:0x00000480; // type:function size:0x60 +pushPullCb__11dAcOGrave_cFP12dAcObjBase_cP12dAcObjBase_cQ29dBgW_Base13PushPullLabel = .text:0x000004E0; // type:function size:0x4 +unkCb__11dAcOGrave_cFP4dBgWP12dAcObjBase_cP12dAcObjBase_c = .text:0x000004F0; // type:function size:0x58 +createHeap__11dAcOGrave_cFv = .text:0x00000550; // type:function size:0x140 +create__11dAcOGrave_cFv = .text:0x00000690; // type:function size:0x26C changeState__80sStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000900; // type:function size:0x10 -fn_580_910 = .text:0x00000910; // type:function size:0x8 -fn_580_920 = .text:0x00000920; // type:function size:0x1B4 +doDelete__11dAcOGrave_cFv = .text:0x00000910; // type:function size:0x8 +actorExecute__11dAcOGrave_cFv = .text:0x00000920; // type:function size:0x1B4 executeState__80sStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000AE0; // type:function size:0x10 -fn_580_AF0 = .text:0x00000AF0; // type:function size:0x1C -fn_580_B10 = .text:0x00000B10; // type:function size:0xC4 +calcTimer__4sLibFPUs_Us = .text:0x00000AF0; // type:function size:0x1C +draw__11dAcOGrave_cFv = .text:0x00000B10; // type:function size:0xC4 initializeState_Wait__11dAcOGrave_cFv = .text:0x00000BE0; // type:function size:0x4 executeState_Wait__11dAcOGrave_cFv = .text:0x00000BF0; // type:function size:0x254 finalizeState_Wait__11dAcOGrave_cFv = .text:0x00000E50; // type:function size:0x4 @@ -48,24 +48,24 @@ isSameName__26sFStateID_c<11dAcOGrave_c>CFPCc = .text:0x000014A0; // type:functi _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_580_rodata_0 = .rodata:0x00000000; // type:object size:0x8 data:float -lbl_580_rodata_8 = .rodata:0x00000008; // type:object size:0x1C align:4 data:float -lbl_580_rodata_24 = .rodata:0x00000024; // type:object size:0x4 align:4 data:float -lbl_580_rodata_28 = .rodata:0x00000028; // type:object size:0x8 align:4 data:float -lbl_580_rodata_30 = .rodata:0x00000030; // type:object size:0x4 align:4 data:float +lbl_580_rodata_0 = .rodata:0x00000000; // type:object size:0x8 scope:local data:float +lbl_580_rodata_8 = .rodata:0x00000008; // type:object size:0x1C scope:local align:4 data:float +lbl_580_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local align:4 data:float +lbl_580_rodata_28 = .rodata:0x00000028; // type:object size:0x8 scope:local align:4 data:float +lbl_580_rodata_30 = .rodata:0x00000030; // type:object size:0x4 scope:local align:4 data:float g_profile_OBJ_GRAVE = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_580_data_10 = .data:0x00000010; // type:object size:0x90 -lbl_580_data_A0 = .data:0x000000A0; // type:object size:0x20 -AcOGrave__vtable = .data:0x000000C0; // type:object size:0x80 -lbl_580_data_140 = .data:0x00000140; // type:object size:0x30 -lbl_580_data_170 = .data:0x00000170; // type:object size:0x30 -lbl_580_data_1A0 = .data:0x000001A0; // type:object size:0x18 -lbl_580_data_1B8 = .data:0x000001B8; // type:object size:0x18 -lbl_580_data_1D0 = .data:0x000001D0; // type:object size:0x8C -lbl_580_data_25C = .data:0x0000025C; // type:object size:0x34 +lbl_580_data_10 = .data:0x00000010; // type:object size:0x90 scope:local +lbl_580_data_A0 = .data:0x000000A0; // type:object size:0x20 scope:local +__vt__11dAcOGrave_c = .data:0x000000C0; // type:object size:0x80 +__vt__50sFStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c> = .data:0x00000140; // type:object size:0x30 +__vt__80sStateMgr_c<11dAcOGrave_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000170; // type:object size:0x30 +lbl_580_data_1A0 = .data:0x000001A0; // type:object size:0x18 scope:local +lbl_580_data_1B8 = .data:0x000001B8; // type:object size:0x18 scope:local +lbl_580_data_1D0 = .data:0x000001D0; // type:object size:0x8C scope:local +lbl_580_data_25C = .data:0x0000025C; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_580_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_580_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_580_bss_58 = .bss:0x00000058; // type:object size:0x30 data:4byte -lbl_580_bss_88 = .bss:0x00000088; // type:object size:0x8 data:byte -lbl_580_bss_90 = .bss:0x00000090; // type:object size:0x10 align:4 data:float +lbl_580_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte +lbl_580_bss_18 = .bss:0x00000018; // type:object size:0x40 scope:local data:4byte +lbl_580_bss_58 = .bss:0x00000058; // type:object size:0x30 scope:local data:4byte +lbl_580_bss_88 = .bss:0x00000088; // type:object size:0x8 scope:local data:byte +lbl_580_bss_90 = .bss:0x00000090; // type:object size:0x10 scope:local align:4 data:float diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f4521c86..60eae4d3 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -17274,7 +17274,7 @@ addCalcPosXZ__4cLibFP7mVec3_cRC7mVec3_cfff = .text:0x802DFFD0; // type:function cLib__addCalcPos2 = .text:0x802E0190; // type:function size:0x13C cLib__addCalcPosXZ2 = .text:0x802E02D0; // type:function size:0xF8 cLib__chasePos = .text:0x802E03D0; // type:function size:0x174 -cLib__chasePosXZ = .text:0x802E0550; // type:function size:0x124 +chasePosXZ__4cLibFR7mVec3_cR7mVec3_cf = .text:0x802E0550; // type:function size:0x124 targetAngleY__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E0680; // type:function size:0x1C targetAngleX__4cLibFRC7mVec3_cRC7mVec3_c = .text:0x802E06A0; // type:function size:0x68 cLib__offsetPos = .text:0x802E0710; // type:function size:0xD8 @@ -43413,7 +43413,7 @@ lbl_80576FFC = .sdata2:0x80576FFC; // type:object size:0x4 align:4 data:float lbl_80577000 = .sdata2:0x80577000; // type:object size:0x4 align:4 data:float lbl_80577004 = .sdata2:0x80577004; // type:object size:0x4 align:4 data:float @11566 = .sdata2:0x80577008; // type:object size:0x4 scope:local align:4 data:float -lbl_80577010 = .sdata2:0x80577010; // type:object size:0x4 align:4 data:float +sPushRelatedConstant__17daPlayerActBase_c = .sdata2:0x80577010; // type:object size:0x4 align:4 data:float lbl_80577014 = .sdata2:0x80577014; // type:object size:0x4 align:4 data:float lbl_80577018 = .sdata2:0x80577018; // type:object size:0x4 align:4 data:float @26291 = .sdata2:0x80577020; // type:object size:0x8 scope:local data:string diff --git a/configure.py b/configure.py index 20c59ade..086b1e71 100644 --- a/configure.py +++ b/configure.py @@ -2514,7 +2514,7 @@ config.libs = [ ), Rel(NonMatching, "d_a_obj_god_mark", "REL/d/a/obj/d_a_obj_god_mark.cpp"), Rel(NonMatching, "d_a_obj_grass_coil", "REL/d/a/obj/d_a_obj_grass_coil.cpp"), - Rel(NonMatching, "d_a_obj_grave", "REL/d/a/obj/d_a_obj_grave.cpp"), + Rel(Matching, "d_a_obj_grave", "REL/d/a/obj/d_a_obj_grave.cpp"), Rel(NonMatching, "d_a_obj_ground_cover", "REL/d/a/obj/d_a_obj_ground_cover.cpp"), Rel(NonMatching, "d_a_obj_guard_log", "REL/d/a/obj/d_a_obj_guard_log.cpp"), Rel(NonMatching, "d_a_obj_harp_hint", "REL/d/a/obj/d_a_obj_harp_hint.cpp"), diff --git a/include/c/c_lib.h b/include/c/c_lib.h index 6cba820d..04829ddd 100644 --- a/include/c/c_lib.h +++ b/include/c/c_lib.h @@ -11,6 +11,7 @@ s16 targetAngleX(const mVec3_c &target, const mVec3_c &source); void addCalcPos2(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep); f32 addCalcPosXZ(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep); f32 addCalcPos(mVec3_c *src, const mVec3_c &target, f32 scale, f32 maxStep, f32 minStep); +bool chasePosXZ(mVec3_c &, mVec3_c &, f32); // made up name f32 easeIn(f32 value, f32 exponent); diff --git a/include/d/a/obj/d_a_obj_grave.h b/include/d/a/obj/d_a_obj_grave.h index 153e8d28..1cd82c67 100644 --- a/include/d/a/obj/d_a_obj_grave.h +++ b/include/d/a/obj/d_a_obj_grave.h @@ -2,6 +2,13 @@ #define D_A_OBJ_GRAVE_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" @@ -10,11 +17,45 @@ public: dAcOGrave_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOGrave_c() {} + virtual bool createHeap(); + virtual int create(); + virtual int doDelete(); + virtual int actorExecute(); + virtual int draw(); + + void fn_580_480(dAcObjBase_c *link, dBgW_Base::PushPullLabel label); + + void executeState() { + mStateMgr.executeState(); + } + STATE_FUNC_DECLARE(dAcOGrave_c, Wait); STATE_FUNC_DECLARE(dAcOGrave_c, Move); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOGrave_c); + static dAcObjBase_c *pushPullCb(dAcObjBase_c *grave, dAcObjBase_c *link, dBgW_Base::PushPullLabel label); + static bool unkCb(dBgW *bgW, dAcObjBase_c *grave, dAcObjBase_c *link); + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShadow; + /* 0x358 */ dBgW mBgW; + /* 0x568 */ STATE_MGR_DECLARE(dAcOGrave_c); + /* 0x5A4 */ dCcD_Unk mCollider; + /* 0x7AC */ m3d::anmMatClr_c mAnmMatClr; + /* 0x7D8 */ mVec3_c mOrigPos1; + /* 0x7E4 */ mVec3_c mOrigPos2; + /* 0x7F0 */ u16 mTimer; + /* 0x7F2 */ u8 mSceneflag; + /* 0x7F3 */ bool mShouldGlow; + /* 0x7F4 */ bool mPush; + /* 0x7F5 */ bool mPull; + /* 0x7F6 */ bool field_0x7F6; + /* 0x7F7 */ bool field_0x7F7; + + static dCcD_SrcUnk sUnkSrc; + static const u8 lbl_580_rodata_0; + static const f32 lbl_580_rodata_30; }; #endif diff --git a/include/d/col/bg/d_bg_w.h b/include/d/col/bg/d_bg_w.h index a61d78f0..6c8424df 100644 --- a/include/d/col/bg/d_bg_w.h +++ b/include/d/col/bg/d_bg_w.h @@ -386,6 +386,9 @@ public: void SetRideCallback(dBgW_RideCallback func) { mpRide_cb = func; } + void SetUnkCallback(dBgW_UnkCallback func) { + mpUnk_cb = func; + } void OnMoveFlag() { mFlags |= 1; } diff --git a/include/d/d_player_act.h b/include/d/d_player_act.h index 3da4e570..b358835f 100644 --- a/include/d/d_player_act.h +++ b/include/d/d_player_act.h @@ -556,6 +556,10 @@ public: field_0x360 |= mask; } + inline void offFlags_0x360(u32 mask) { + field_0x360 &= ~mask; + } + inline void onForceOrPreventActionFlags(u32 mask) { mForceOrPreventActionFlags |= mask; } 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(); +}