diff --git a/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt b/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt index 60a9efe1..a05f0b6a 100644 --- a/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_girahimu_floorNP/symbols.txt @@ -8,17 +8,17 @@ __dt__32sFState_c<19dAcOGirahimuFloor_c>Fv = .text:0x00000240; // type:function __dt__35sFStateFct_c<19dAcOGirahimuFloor_c>Fv = .text:0x000002A0; // type:function size:0x6C __dt__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000310; // type:function size:0xA0 __dt__58sFStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003B0; // type:function size:0xA4 -fn_604_460 = .text:0x00000460; // type:function size:0x64 -AcOGirahimuFloor__initModels = .text:0x000004D0; // type:function size:0x28C -AcOGirahimuFloor__init1 = .text:0x00000760; // type:function size:0x1D4 +__ct__Q23m3d11anmMatClr_cFv = .text:0x00000460; // type:function size:0x64 +createHeap__19dAcOGirahimuFloor_cFv = .text:0x000004D0; // type:function size:0x28C +actorCreate__19dAcOGirahimuFloor_cFv = .text:0x00000760; // type:function size:0x1D4 changeState__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000940; // type:function size:0x10 -AcOGirahimuFloor__init2 = .text:0x00000950; // type:function size:0x12C -fn_604_A80 = .text:0x00000A80; // type:function size:0x8 -AcOGirahimuFloor__update = .text:0x00000A90; // type:function size:0x39C +actorPostCreate__19dAcOGirahimuFloor_cFv = .text:0x00000950; // type:function size:0x12C +doDelete__19dAcOGirahimuFloor_cFv = .text:0x00000A80; // type:function size:0x8 +actorExecute__19dAcOGirahimuFloor_cFv = .text:0x00000A90; // type:function size:0x39C getStateID__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000E30; // type:function size:0x10 executeState__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000E40; // type:function size:0x10 -cLib_calcTimer = .text:0x00000E50; // type:function size:0x1C -AcOGirahimuFloor__draw = .text:0x00000E70; // type:function size:0x28 +calcTimer__4sLibFPUc_Uc = .text:0x00000E50; // type:function size:0x1C +draw__19dAcOGirahimuFloor_cFv = .text:0x00000E70; // type:function size:0x28 initializeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000EA0; // type:function size:0x60 executeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000F00; // type:function size:0x78 finalizeState_Wait__19dAcOGirahimuFloor_cFv = .text:0x00000F80; // type:function size:0x4 @@ -34,11 +34,11 @@ finalizeState_Broken__19dAcOGirahimuFloor_cFv = .text:0x000013A0; // type:functi initializeState_Move__19dAcOGirahimuFloor_cFv = .text:0x000013B0; // type:function size:0x4 executeState_Move__19dAcOGirahimuFloor_cFv = .text:0x000013C0; // type:function size:0xA0 finalizeState_Move__19dAcOGirahimuFloor_cFv = .text:0x00001460; // type:function size:0x4 -fn_604_1470 = .text:0x00001470; // type:function size:0x1A0 -AcOGirahimuFloor__checkNoOtherFloor = .text:0x00001610; // type:function size:0x28 -checksToSeeIfLinkIsInFinalBlow = .text:0x00001640; // type:function size:0xF0 -AcOGirahimuFloor__movePlatform = .text:0x00001730; // type:function size:0x54 -fn_604_1790 = .text:0x00001790; // type:function size:0x98 +isPlayerAndGhirahimOffFloor__19dAcOGirahimuFloor_cFv = .text:0x00001470; // type:function size:0x1A0 +isGenerateNoChild__19dAcOGirahimuFloor_cFv = .text:0x00001610; // type:function size:0x28 +isSuccessfulFinalBlow__19dAcOGirahimuFloor_cFv = .text:0x00001640; // type:function size:0xF0 +movePosition__19dAcOGirahimuFloor_cFv = .text:0x00001730; // type:function size:0x54 +doShatter__19dAcOGirahimuFloor_cFv = .text:0x00001790; // type:function size:0x98 __dt__19dAcOGirahimuFloor_cFv = .text:0x00001830; // type:function size:0x128 build__35sFStateFct_c<19dAcOGirahimuFloor_c>FRC12sStateIDIf_c = .text:0x00001960; // type:function size:0x60 dispose__35sFStateFct_c<19dAcOGirahimuFloor_c>FRP10sStateIf_c = .text:0x000019C0; // type:function size:0xC @@ -72,14 +72,16 @@ lbl_604_data_10 = .data:0x00000010; // type:object size:0xA data:string lbl_604_data_20 = .data:0x00000020; // type:object size:0x10 data:string lbl_604_data_30 = .data:0x00000030; // type:object size:0x40 lbl_604_data_70 = .data:0x00000070; // type:object size:0x21 data:string -AcOGirahimuFloor__vtable = .data:0x00000098; // type:object size:0x80 -lbl_604_data_118 = .data:0x00000118; // type:object size:0x30 -lbl_604_data_148 = .data:0x00000148; // type:object size:0x30 -lbl_604_data_178 = .data:0x00000178; // type:object size:0x18 -lbl_604_data_190 = .data:0x00000190; // type:object size:0x184 +__vt__19dAcOGirahimuFloor_c = .data:0x00000098; // type:object size:0x80 +__vt__58sFStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c> = .data:0x00000118; // type:object size:0x30 +__vt__88sStateMgr_c<19dAcOGirahimuFloor_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000148; // type:object size:0x30 +__vt__35sFStateFct_c<19dAcOGirahimuFloor_c> = .data:0x00000178; // type:object size:0x18 +__vt__32sFState_c<19dAcOGirahimuFloor_c> = .data:0x00000190; // type:object size:0x184 lbl_604_data_314 = .data:0x00000314; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global lbl_604_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -AcOGirahimuFloor__StateID_Wait = .bss:0x00000018; // type:object size:0x40 data:4byte -AcOGirahimuFloor__StateID_Return = .bss:0x00000058; // type:object size:0x40 data:4byte -AcOGirahimuFloor__StateID_Generate = .bss:0x00000098; // type:object size:0xB0 data:4byte +StateID_Wait__19dAcOGirahimuFloor_c = .bss:0x00000018; // type:object size:0x30 data:4byte +StateID_Return__19dAcOGirahimuFloor_c = .bss:0x00000058; // type:object size:0x30 data:4byte +StateID_Generate__19dAcOGirahimuFloor_c = .bss:0x00000098; // type:object size:0x30 data:4byte +StateID_Broken__19dAcOGirahimuFloor_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +StateID_Move__19dAcOGirahimuFloor_c = .bss:0x00000118; // type:object size:0x30 data:4byte diff --git a/configure.py b/configure.py index e7616299..a2b8919a 100644 --- a/configure.py +++ b/configure.py @@ -2521,7 +2521,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_fruit_tree", "REL/d/a/obj/d_a_obj_fruit_tree.cpp"), Rel(NonMatching, "d_a_obj_gear", "REL/d/a/obj/d_a_obj_gear.cpp"), Rel( - NonMatching, "d_a_obj_girahimu_floor", "REL/d/a/obj/d_a_obj_girahimu_floor.cpp" + Matching, "d_a_obj_girahimu_floor", "REL/d/a/obj/d_a_obj_girahimu_floor.cpp" ), Rel( NonMatching, "d_a_obj_girahimu_knife", "REL/d/a/obj/d_a_obj_girahimu_knife.cpp" diff --git a/include/d/a/obj/d_a_obj_girahimu_floor.h b/include/d/a/obj/d_a_obj_girahimu_floor.h index c1eee1c1..6d6def7b 100644 --- a/include/d/a/obj/d_a_obj_girahimu_floor.h +++ b/include/d/a/obj/d_a_obj_girahimu_floor.h @@ -1,22 +1,85 @@ #ifndef D_A_OBJ_GIRAHIMU_FLOOR_H #define D_A_OBJ_GIRAHIMU_FLOOR_H +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" +class dAcGirahimu3First_c; class dAcOGirahimuFloor_c : public dAcObjBase_c { public: dAcOGirahimuFloor_c() : mStateMgr(*this) {} virtual ~dAcOGirahimuFloor_c() {} + enum Type_e { + TYPE_Normal, + TYPE_Generate, + TYPE_Max + }; + + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Wait); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Return); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Generate); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Broken); STATE_FUNC_DECLARE(dAcOGirahimuFloor_c, Move); + STATE_MGR_DEFINE_UTIL_CHANGESTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_ISSTATE(dAcOGirahimuFloor_c); + STATE_MGR_DEFINE_UTIL_GETSTATEID(dAcOGirahimuFloor_c); + + // Used to request deletion upon both Player and Boss off the platform + bool isPlayerAndGhirahimOffFloor(); + + // If it is the generate type and there is no linked child + bool isGenerateNoChild(); + + // Checks if Link is in a final blow state and has connected + // with something other than the platform (like ghirahim) + bool isSuccessfulFinalBlow(); + + // Moves the position to the target destinaton + void movePosition(); + + // Breaks the platform, releases mBg and requests deletion + void doShatter(); + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOGirahimuFloor_c); + /* 0x330 */ nw4r::g3d::ResFile mRes; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dBgW mBg[3]; + /* 0x980 */ STATE_MGR_DECLARE(dAcOGirahimuFloor_c); + /* 0x9BC */ m3d::anmTexSrt_c mAnmTexSrt; + /* 0x9E8 */ m3d::anmMatClr_c mAnmMatClr[3]; + /* 0xA6C */ dAcRef_c mGhirahimRef; + /* 0xA78 */ dAcRef_c mChild; + /* 0xA64 */ mVec3_c mHomePos; + /* 0xA90 */ mVec3_c mTargetPos; + /* 0xA9C */ mVec3_c mScaleBg0; + /* 0xAA8 */ mVec3_c mScaleBg1; + /* 0xAB4 */ f32 mMoveRate; + /* 0xAB4 */ f32 mGndHeight; + /* 0xABC */ u8 mType; + /* 0xABD */ u8 field_0xABD; + /* 0xABE */ u8 field_0xABE; + /* 0xAC0 */ s32 field_0xAC0; + /* 0xAC4 */ bool mbIsHome; + /* 0xAC5 */ bool mbMediumSize; + /* 0xAC6 */ bool mbRequestShatter; + /* 0xAC7 */ bool mbRequestMove; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp b/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp index 4f9dce53..7761a827 100644 --- a/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp +++ b/src/REL/d/a/obj/d_a_obj_girahimu_floor.cpp @@ -1,5 +1,28 @@ #include "d/a/obj/d_a_obj_girahimu_floor.h" +#include "c/c_lib.h" +#include "common.h" +#include "d/a/b/d_a_b_girahimu3_first.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_plc.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_w.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resanmtexsrt.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(OBJ_GIRAHIMU_FLOOR, dAcOGirahimuFloor_c, fProfile::OBJ_GIRAHIMU_FLOOR, 0x25F, 0, 2); STATE_DEFINE(dAcOGirahimuFloor_c, Wait); @@ -8,18 +31,363 @@ STATE_DEFINE(dAcOGirahimuFloor_c, Generate); STATE_DEFINE(dAcOGirahimuFloor_c, Broken); STATE_DEFINE(dAcOGirahimuFloor_c, Move); -void dAcOGirahimuFloor_c::initializeState_Wait() {} -void dAcOGirahimuFloor_c::executeState_Wait() {} +static const char *sResAnmNames[3] = { + "F403Floor", + "F403FloorSpread", + "F403FloorSpread2", +}; + +struct dAcOGirahimuFloor_HIO_c { + const f32 field_0x00; + const f32 field_0x04; + const f32 field_0x08; + static const dAcOGirahimuFloor_HIO_c sHio; +}; +const dAcOGirahimuFloor_HIO_c dAcOGirahimuFloor_HIO_c::sHio = { + 1.0f, + 10.0f, + 0.4f, +}; + +bool dAcOGirahimuFloor_c::createHeap() { + mRes = nw4r::g3d::ResFile(getOarcFile("F403Floor", "g3d/model.brres")); + nw4r::g3d::ResMdl resMdl = mRes.GetResMdl("F403Floor"); + TRY_CREATE(mMdl.create(resMdl, &mAllocator, 0x324)); + + nw4r::g3d::ResAnmTexSrt resTexSrt = mRes.GetResAnmTexSrt(sResAnmNames[0]); + TRY_CREATE(mAnmTexSrt.create(resMdl, resTexSrt, &mAllocator, nullptr, 1)); + mMdl.setAnm(mAnmTexSrt); + mAnmTexSrt.setRate(1.0f, 0); + + for (int i = 0; i < 3; ++i) { + nw4r::g3d::ResAnmClr resAnmClr = mRes.GetResAnmClr(sResAnmNames[i]); + TRY_CREATE(mAnmMatClr[i].create(resMdl, resAnmClr, &mAllocator, nullptr, 1)); + + mAnmMatClr[i].setAnm(mMdl, resAnmClr, 0, m3d::PLAY_MODE_4); + mAnmMatClr[i].setRate(0.0f, 0); + mAnmMatClr[i].setFrame(mAnmTexSrt.getFrameMax(i) - 1.0f, 0); + mAnmMatClr[i].setPlayMode(m3d::PLAY_MODE_1, 0); + } + + cBgD_t *dzb = static_cast(getOarcDZB("F403Floor", "F403Floor")); + PLC *plc = static_cast(getOarcPLC("F403Floor", "F403Floor")); + updateMatrix(); + + mScaleBg0.set(0.5f, 0.5f, 0.5f); + mScaleBg1.set(0.735f, 0.735f, 0.735f); + TRY_CREATE(!mBg[0].Set(dzb, plc, 1, &mWorldMtx, &mScaleBg0)); + TRY_CREATE(!mBg[1].Set(dzb, plc, 1, &mWorldMtx, &mScaleBg1)); + TRY_CREATE(!mBg[2].Set(dzb, plc, 1, &mWorldMtx, &mScale)); + + return true; +} + +int dAcOGirahimuFloor_c::actorCreate() { + mType = getFromParams(0, 0x3); + if (mType >= TYPE_Max) { + mType = TYPE_Normal; + } + + CREATE_ALLOCATOR(dAcOGirahimuFloor_c); + for (int i = 0; i < 3; ++i) { + mBg[i].SetCrrFunc(dBgS_MoveBGProc_Typical); + } + dBgS::GetInstance()->Regist(&mBg[1], this); + + mAnmMatClr[2].setFrame(0.0f, 0); + + mAcceleration = 0.0f; + mMaxSpeed = -40.0f; + mMdl.setPriorityDraw(0x22, 9); + if (mType == TYPE_Generate) { + mMdl.setAnm(mAnmMatClr[0]); + changeState(StateID_Generate); + } else { + mMdl.setAnm(mAnmMatClr[1]); + changeState(StateID_Wait); + } + + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + + mBoundingBox.Set(mVec3_c(-2900.0f, -120.0f, -2900.0f), mVec3_c(3100.0f, 100.0f, 2900.0f)); + return true; +} + +int dAcOGirahimuFloor_c::actorPostCreate() { + fBase_c *pActor = nullptr; + dAcGirahimu3First_c *pGirahim; + while ( + (pGirahim = + static_cast(fManager_c::searchBaseByProfName(fProfile::B_GIRAHIMU3_FIRST, pActor)), + pActor = pGirahim) + ) { + if (mPosition.squareDistanceToXZ(pGirahim->getPosition()) < 9000000.0f) { + mGhirahimRef.link(pGirahim); + } + } + + if (mType == TYPE_Generate) { + while ((pActor = fManager_c::searchBaseByProfName(fProfile::OBJ_GIRAHIMU_FLOOR, pActor))) { + dAcOGirahimuFloor_c *pChild = static_cast(pActor); + if (pChild != this) { + mChild.link(pChild); + mHomePos = pChild->mHomePos; + } + } + } else { + mHomePos = mPosition; + } + + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::doDelete() { + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::actorExecute() { + if (!isState(StateID_Broken)) { + if (isSuccessfulFinalBlow()) { + changeState(StateID_Broken); + return SUCCEEDED; + } + + if (0 == sLib::calcTimer(&field_0xABE)) { + field_0xABE = 15; + if (isPlayerAndGhirahimOffFloor()) { + changeState(StateID_Broken); + return SUCCEEDED; + } + } + + if (mbRequestShatter) { + doShatter(); + return SUCCEEDED; + } + + if (mbMediumSize) { + mAnmMatClr[1].setRate(1.0f, 0); + dBgS::GetInstance()->Regist(&mBg[1], this); + dBgS::GetInstance()->Release(&mBg[0]); + + if (field_0xAC0 == 1 && mAnmMatClr[1].getFrame(0) == mAnmMatClr[1].getFrameMax(0) - 1.0f) { + mMdl.setAnm(mAnmMatClr[2]); + mAnmMatClr[2].setRate(1.0f, 0); + + dBgS::GetInstance()->Regist(&mBg[2], this); + dBgS::GetInstance()->Release(&mBg[1]); + } else { + mMdl.setAnm(mAnmMatClr[1]); + } + } + + if (!isState(StateID_Move) && mbRequestMove) { + changeState(StateID_Move); + movePosition(); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + return SUCCEEDED; + } + } + + executeState(); + mAnmTexSrt.play(); + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].play(); + } + if (!isState(StateID_Wait)) { + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + } else { + updateMatrix(); + mMdl.setScale(mScale); + mMdl.setLocalMtx(mWorldMtx); + for (int i = 0; i < 3; ++i) { + mBg[i].Move(); + } + } + return SUCCEEDED; +} + +int dAcOGirahimuFloor_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +} + +void dAcOGirahimuFloor_c::initializeState_Wait() { + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].setRate(0.0f, 0); + } +} +void dAcOGirahimuFloor_c::executeState_Wait() { + if (!mbIsHome && 0 == sLib::calcTimer(&field_0xABD)) { + field_0xABD = 15; + if (isGenerateNoChild()) { + changeState(StateID_Return); + } + } +} void dAcOGirahimuFloor_c::finalizeState_Wait() {} + void dAcOGirahimuFloor_c::initializeState_Return() {} -void dAcOGirahimuFloor_c::executeState_Return() {} -void dAcOGirahimuFloor_c::finalizeState_Return() {} -void dAcOGirahimuFloor_c::initializeState_Generate() {} -void dAcOGirahimuFloor_c::executeState_Generate() {} +void dAcOGirahimuFloor_c::executeState_Return() { + if (!mbRequestMove && cLib::chasePos(mPosition, mHomePos, 10.0f)) { + changeState(StateID_Wait); + } +} +void dAcOGirahimuFloor_c::finalizeState_Return() { + mbIsHome = true; +} + +void dAcOGirahimuFloor_c::initializeState_Generate() { + for (int i = 0; i < 3; ++i) { + mAnmMatClr[i].setFrame(0.0f, 0); + if (i != 0) { + mAnmMatClr[i].setRate(0.0f, 0); + } + } + mAnmMatClr[0].setRate(1.0f, 0); + mMdl.setAnm(mAnmMatClr[0]); +} +void dAcOGirahimuFloor_c::executeState_Generate() { + if (mAnmMatClr[0].getFrame(0) == mAnmMatClr[0].getFrameMax(0) - 1.0f) { + mAnmMatClr[0].setRate(0.0f, 0); + } + if (!mbMediumSize) { + dBgS::GetInstance()->Regist(&mBg[0], this); + dBgS::GetInstance()->Release(&mBg[1]); + dBgS::GetInstance()->Release(&mBg[2]); + } + if (mAnmMatClr[2].isStop(0)) { + if (mAnmMatClr[2].getFrame(0) == mAnmMatClr[2].getFrameMax(0) - 1.0f) { + changeState(StateID_Wait); + } + } +} void dAcOGirahimuFloor_c::finalizeState_Generate() {} -void dAcOGirahimuFloor_c::initializeState_Broken() {} -void dAcOGirahimuFloor_c::executeState_Broken() {} + +void dAcOGirahimuFloor_c::initializeState_Broken() { + mAnmMatClr[2].setRate(-1.0f, 0); + mScaleBg0.set(0.0f, 0.0f, 0.0f); + for (int i = 0; i < 3; ++i) { + dBgS::GetInstance()->Release(&mBg[i]); + } + mMdl.setAnm(mAnmMatClr[2]); +} +void dAcOGirahimuFloor_c::executeState_Broken() { + if (mAnmMatClr[2].getFrame(0) == 0.0f) { + mAnmMatClr[1].setRate(-1.0f, 0); + mAnmMatClr[2].setRate(0.0f, 0); + if (mAnmMatClr[1].getFrame(0) == 0.0f) { + mAnmMatClr[0].setRate(-1.0f, 0); + mAnmMatClr[1].setRate(0.0f, 0); + mMdl.setAnm(mAnmMatClr[0]); + } else { + mMdl.setAnm(mAnmMatClr[1]); + } + } + + if (mAnmMatClr[0].getFrame(0) == 0.0f) { + deleteRequest(); + } +} void dAcOGirahimuFloor_c::finalizeState_Broken() {} + void dAcOGirahimuFloor_c::initializeState_Move() {} -void dAcOGirahimuFloor_c::executeState_Move() {} +void dAcOGirahimuFloor_c::executeState_Move() { + movePosition(); + + if (dBgS_ObjGndChk::CheckPos(mPosition)) { + mGndHeight = dBgS_ObjGndChk::GetGroundHeight(); + if (mPosition.y <= mGndHeight) { + doShatter(); + return; + } + } else { + mPosition.y = mGndHeight; + doShatter(); + return; + } + + if (!mbRequestMove) { + changeState(StateID_Wait); + } +} void dAcOGirahimuFloor_c::finalizeState_Move() {} + +bool dAcOGirahimuFloor_c::isPlayerAndGhirahimOffFloor() { + const dAcObjBase_c *pObj = nullptr; + + if (dBgS_ObjGndChk::CheckPos(dAcPy_c::GetLink()->mPosition + mVec3_c::Ey * 50.0f)) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + if (pObj == this || !(pObj != nullptr && pObj->mProfileName == fProfile::OBJ_GIRAHIMU_FLOOR)) { + return false; + } + + pObj = nullptr; + bool bGetObj = mGhirahimRef.isLinked(); + if (bGetObj) { + bGetObj = dBgS_ObjGndChk::CheckPos(mGhirahimRef.get()->mPosition + mVec3_c::Ey * 50.0f); + } + if (bGetObj) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + + if (pObj == this || !(pObj != nullptr && pObj->mProfileName == fProfile::OBJ_GIRAHIMU_FLOOR)) { + return false; + } + + return true; +} + +bool dAcOGirahimuFloor_c::isGenerateNoChild() { + return mType == TYPE_Generate && !mChild.isLinked(); +} + +bool dAcOGirahimuFloor_c::isSuccessfulFinalBlow() { + if (dAcPy_c::GetLink()->checkCurrentAction(96 /* FINAL_BLOW */)) { + const dAcObjBase_c *pObj = nullptr; + bool bGetObj = mGhirahimRef.isLinked(); + if (bGetObj) { + bGetObj = dBgS_ObjGndChk::CheckPos(mGhirahimRef.get()->mPosition + mVec3_c::Ey * 50.0f); + } + if (bGetObj) { + pObj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + } + + if (pObj != this) { + return true; + } + } + return false; +} + +void dAcOGirahimuFloor_c::movePosition() { + if (mbRequestMove && cLib::chasePos(mPosition, mTargetPos, mMoveRate)) { + mbRequestMove = false; + } +} + +void dAcOGirahimuFloor_c::doShatter() { + dJEffManager_c::spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_876_, mPosition, nullptr, nullptr, nullptr, nullptr, 0, 0); + startSound(SE_BGh3_GIRAHIM_STAGE_BREAK); + for (int i = 0; i < 3; ++i) { + dBgS::GetInstance()->Release(&mBg[i]); + } + deleteRequest(); +} + +void something() { + static const f32 f = 9000000.0f; +}