diff --git a/config/SOUE01/rels/d_a_obj_block_undergroundNP/symbols.txt b/config/SOUE01/rels/d_a_obj_block_undergroundNP/symbols.txt index 737e84e1..e9e821e6 100644 --- a/config/SOUE01/rels/d_a_obj_block_undergroundNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_block_undergroundNP/symbols.txt @@ -2,47 +2,47 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x00000030; // type:function size:0x2C scope:global _unresolved = .text:0x00000060; // type:function size:0x4 scope:global dAcOBlockUnderground_classInit__Fv = .text:0x00000070; // type:function size:0x30 -fn_459_A0 = .text:0x000000A0; // type:function size:0xC -fn_459_B0 = .text:0x000000B0; // type:function size:0xC +getCylTgType__20dAcOBlockUndergroundFv = .text:0x000000A0; // type:function size:0xC +getOarcName__20dAcOBlockUndergroundFv = .text:0x000000B0; // type:function size:0xC __ct__20dAcOBlockUndergroundFv = .text:0x000000C0; // type:function size:0x74 __dt__20dAcOBlockUndergroundFv = .text:0x00000140; // type:function size:0xBC -AcOBlockUnderground__initModels = .text:0x00000200; // type:function size:0x184 -AcOBlockUnderground__init = .text:0x00000390; // type:function size:0x1E0 -AcOBlockUnderground__init2 = .text:0x00000570; // type:function size:0x54 -AcOBlockUnderground__update = .text:0x000005D0; // type:function size:0x16C -AcOBlockUnderground__draw = .text:0x00000740; // type:function size:0x3C -setUndergroundRef = .text:0x00000780; // type:function size:0x8 -fn_459_790 = .text:0x00000790; // type:function size:0x14 -fn_459_7B0 = .text:0x000007B0; // type:function size:0x84 -fn_459_840 = .text:0x00000840; // type:function size:0xC -fn_459_850 = .text:0x00000850; // type:function size:0x8 -fn_459_860 = .text:0x00000860; // type:function size:0x8 -fn_459_870 = .text:0x00000870; // type:function size:0x38 -fn_459_8B0 = .text:0x000008B0; // type:function size:0x34 -AcOBlockUnderground__setSubtype = .text:0x000008F0; // type:function size:0x8 -AcOBlockUnderground__getSubtype = .text:0x00000900; // type:function size:0xC -AcOBlockUnderground__getFirstSceneFlag = .text:0x00000910; // type:function size:0xC -AcOBlockUnderground__getSecondSceneflag = .text:0x00000920; // type:function size:0xC -fn_459_930 = .text:0x00000930; // type:function size:0x1C -fn_459_950 = .text:0x00000950; // type:function size:0x1C -fn_459_970 = .text:0x00000970; // type:function size:0x28 -fn_459_9A0 = .text:0x000009A0; // type:function size:0x2C -fn_459_9D0 = .text:0x000009D0; // type:function size:0x30 -fn_459_A00 = .text:0x00000A00; // type:function size:0x28 -fn_459_A30 = .text:0x00000A30; // type:function size:0x68 +createHeap__20dAcOBlockUndergroundFv = .text:0x00000200; // type:function size:0x184 +actorCreate__20dAcOBlockUndergroundFv = .text:0x00000390; // type:function size:0x1E0 +actorPostCreate__20dAcOBlockUndergroundFv = .text:0x00000570; // type:function size:0x54 +actorExecute__20dAcOBlockUndergroundFv = .text:0x000005D0; // type:function size:0x16C +draw__20dAcOBlockUndergroundFv = .text:0x00000740; // type:function size:0x3C +setUndergroundRef__20dAcOBlockUndergroundFP17dAcOUnderground_c = .text:0x00000780; // type:function size:0x8 +undergroundRefEquals__20dAcOBlockUndergroundFP17dAcOUnderground_c = .text:0x00000790; // type:function size:0x14 +setBlockUndergroundPosition__20dAcOBlockUndergroundFP7mVec3_c = .text:0x000007B0; // type:function size:0x84 +fn_459_840__20dAcOBlockUndergroundFUsUs = .text:0x00000840; // type:function size:0xC +getField_0x57C__20dAcOBlockUndergroundFv = .text:0x00000850; // type:function size:0x8 +getField_0x57E__20dAcOBlockUndergroundFv = .text:0x00000860; // type:function size:0x8 +registBg__20dAcOBlockUndergroundFv = .text:0x00000870; // type:function size:0x38 +releaseBg__20dAcOBlockUndergroundFv = .text:0x000008B0; // type:function size:0x34 +setSubtype__20dAcOBlockUndergroundFUl = .text:0x000008F0; // type:function size:0x8 +getSubtype__20dAcOBlockUndergroundFv = .text:0x00000900; // type:function size:0xC +getFirstSceneFlag__20dAcOBlockUndergroundFv = .text:0x00000910; // type:function size:0xC +getSecondSceneFlag__20dAcOBlockUndergroundFv = .text:0x00000920; // type:function size:0xC +fn_459_930__20dAcOBlockUndergroundFv = .text:0x00000930; // type:function size:0x1C +getSubtypeIdx__20dAcOBlockUndergroundFv = .text:0x00000950; // type:function size:0x1C +fn_459_970__20dAcOBlockUndergroundFv = .text:0x00000970; // type:function size:0x28 +fn_459_9A0__20dAcOBlockUndergroundFv = .text:0x000009A0; // type:function size:0x2C +getMdlName__20dAcOBlockUndergroundFv = .text:0x000009D0; // type:function size:0x30 +fn_459_A00__20dAcOBlockUndergroundFv = .text:0x00000A00; // type:function size:0x28 +spawnEffect__20dAcOBlockUndergroundCFUs = .text:0x00000A30; // type:function size:0x68 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -lbl_459_rodata_0 = .rodata:0x00000000; // type:object size:0x30 data:4byte -lbl_459_rodata_30 = .rodata:0x00000030; // type:object size:0x8 data:4byte -lbl_459_rodata_38 = .rodata:0x00000038; // type:object size:0x10 -lbl_459_rodata_48 = .rodata:0x00000048; // type:object size:0x10 -lbl_459_rodata_58 = .rodata:0x00000058; // type:object size:0x30 -lbl_459_rodata_88 = .rodata:0x00000088; // type:object size:0x4 align:4 data:float +lbl_459_rodata_0 = .rodata:0x00000000; // type:object size:0x30 scope:local data:4byte +lbl_459_rodata_30 = .rodata:0x00000030; // type:object size:0x8 scope:local data:4byte +lbl_459_rodata_38 = .rodata:0x00000038; // type:object size:0x10 scope:local +lbl_459_rodata_48 = .rodata:0x00000048; // type:object size:0x10 scope:local +lbl_459_rodata_58 = .rodata:0x00000058; // type:object size:0x30 scope:local +lbl_459_rodata_88 = .rodata:0x00000088; // type:object size:0x4 scope:local align:4 data:float g_profile_OBJ_BLOCK_UNDERGROUND = .data:0x00000000; // type:object size:0x10 -lbl_459_data_10 = .data:0x00000010; // type:object size:0xC -lbl_459_data_1C = .data:0x0000001C; // type:object size:0x10 -lbl_459_data_2C = .data:0x0000002C; // type:object size:0x10 -lbl_459_data_3C = .data:0x0000003C; // type:object size:0x10 -lbl_459_data_4C = .data:0x0000004C; // type:object size:0x10 -lbl_459_data_5C = .data:0x0000005C; // type:object size:0x24 -AcOBlockUnderground__vtable = .data:0x00000080; // type:object size:0x80 +lbl_459_data_10 = .data:0x00000010; // type:object size:0xC scope:local +lbl_459_data_1C = .data:0x0000001C; // type:object size:0x10 scope:local +lbl_459_data_2C = .data:0x0000002C; // type:object size:0x10 scope:local +lbl_459_data_3C = .data:0x0000003C; // type:object size:0x10 scope:local +lbl_459_data_4C = .data:0x0000004C; // type:object size:0x10 scope:local +lbl_459_data_5C = .data:0x0000005C; // type:object size:0x24 scope:local +__vt__20dAcOBlockUnderground = .data:0x00000080; // type:object size:0x80 diff --git a/config/SOUE01/rels/d_a_obj_undergroundNP/symbols.txt b/config/SOUE01/rels/d_a_obj_undergroundNP/symbols.txt index 1e9ff2cf..22f555b9 100644 --- a/config/SOUE01/rels/d_a_obj_undergroundNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_undergroundNP/symbols.txt @@ -9,7 +9,7 @@ AcOUnderground__init1 = .text:0x000002A0; // type:function size:0x198 AcOUnderground__init2 = .text:0x00000440; // type:function size:0x2B8 AcOUnderground__update = .text:0x00000700; // type:function size:0x288 AcOUnderground__draw = .text:0x00000990; // type:function size:0x3C -fn_458_9D0 = .text:0x000009D0; // type:function size:0x88 +fn_458_9D0__17dAcOUnderground_cFUsUs = .text:0x000009D0; // type:function size:0x88 AcOUnderground__getSubtype = .text:0x00000A60; // type:function size:0xC fn_458_A70 = .text:0x00000A70; // type:function size:0xF0 __dt__17dAcOUnderground_cFv = .text:0x00000B60; // type:function size:0x74 diff --git a/configure.py b/configure.py index 23612952..9333e697 100644 --- a/configure.py +++ b/configure.py @@ -2386,7 +2386,7 @@ config.libs = [ Rel(NonMatching, "d_a_obj_blast_rock", "REL/d/a/obj/d_a_obj_blast_rock.cpp"), Rel(NonMatching, "d_a_obj_block_rope", "REL/d/a/obj/d_a_obj_block_rope.cpp"), Rel( - NonMatching, + Matching, "d_a_obj_block_underground", "REL/d/a/obj/d_a_obj_block_underground.cpp", ), diff --git a/include/d/a/obj/d_a_obj_block_underground.h b/include/d/a/obj/d_a_obj_block_underground.h index 2acb43cd..c4c61eb6 100644 --- a/include/d/a/obj/d_a_obj_block_underground.h +++ b/include/d/a/obj/d_a_obj_block_underground.h @@ -1,14 +1,65 @@ #ifndef D_A_OBJ_BLOCK_UNDERGROUND_H #define D_A_OBJ_BLOCK_UNDERGROUND_H +#include "c/c_list.h" +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_underground.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/cc/d_cc_d.h" +#include "f/f_list_nd.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" class dAcOBlockUnderground : public dAcObjBase_c { public: dAcOBlockUnderground(); virtual ~dAcOBlockUnderground(); + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual int draw() override; + + void setUndergroundRef(dAcOUnderground_c *); + bool undergroundRefEquals(dAcOUnderground_c *); + void setBlockUndergroundPosition(mVec3_c *); + void fn_459_840(u16, u16); + u16 getField_0x57C(); + u16 getField_0x57E(); + void registBg(); + void releaseBg(); + private: + static u32 getCylTgType(); + static const char *getOarcName(); + void setSubtype(u32); + u8 getSubtype(); + u8 getFirstSceneFlag(); + u8 getSecondSceneFlag(); + u32 fn_459_930(); + u32 getSubtypeIdx(); + bool fn_459_970(); + bool fn_459_9A0(); + const char *getMdlName(); + bool fn_459_A00(); + void spawnEffect(u16) const; + + /* 0x330 */ m3d::smdl_c mMdl; + /* 0x34C */ fLiNdBa_c mRef; + /* 0x358 */ dAcRef_c mUndergroundRef; + /* 0x364 */ dBgW mBgW; + /* 0x574 */ dCcD_Cyl *mCyl; + /* 0x578 */ u32 mSubtype; + /* 0x57C */ u16 mField_0x57C; + /* 0x57E */ u16 mField_0x57E; + + static const s32 sSubtypeIdx[12]; + static const char *const sOarcName; + static const char *const sMdlNames[4]; + static const char *const sDzbPlcNames[4]; + static const dCcD_SrcCyl sCylSrc; }; #endif diff --git a/include/d/a/obj/d_a_obj_underground.h b/include/d/a/obj/d_a_obj_underground.h index 9b77beb5..74617bba 100644 --- a/include/d/a/obj/d_a_obj_underground.h +++ b/include/d/a/obj/d_a_obj_underground.h @@ -8,6 +8,8 @@ public: dAcOUnderground_c() {} virtual ~dAcOUnderground_c() {} + void fn_458_9D0(u16, u16); + private: }; diff --git a/src/REL/d/a/obj/d_a_obj_block_underground.cpp b/src/REL/d/a/obj/d_a_obj_block_underground.cpp index d458a862..9dfeae25 100644 --- a/src/REL/d/a/obj/d_a_obj_block_underground.cpp +++ b/src/REL/d/a/obj/d_a_obj_block_underground.cpp @@ -1,6 +1,292 @@ #include "d/a/obj/d_a_obj_block_underground.h" +#include "c/c_list.h" +#include "common.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/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "f/f_base.h" +#include "f/f_list_nd.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "toBeSorted/d_emitter.h" + SPECIAL_ACTOR_PROFILE(OBJ_BLOCK_UNDERGROUND, dAcOBlockUnderground, fProfile::OBJ_BLOCK_UNDERGROUND, 0x13F, 0, 3); -dAcOBlockUnderground::dAcOBlockUnderground() {} -dAcOBlockUnderground::~dAcOBlockUnderground() {} +const s32 dAcOBlockUnderground::sSubtypeIdx[12] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 1, 1}; + +const char *const dAcOBlockUnderground::sOarcName = "MoleBlock"; + +const char *const dAcOBlockUnderground::sMdlNames[4] = { + "MoleBlock", + "MoleBlockBomb", + "MoleBlockBreak", + "MoleBlockBreak", +}; + +const char *const dAcOBlockUnderground::sDzbPlcNames[4] = { + "MoleBlock_rock", + "MoleBlock_rock", + "MoleBlock_tuti", + "MoleBlock_tuti", +}; + +const dCcD_SrcCyl dAcOBlockUnderground::sCylSrc = { + /* mObjInf */ + {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ {AT_TYPE_BOMB, 0x11, {0, 8, 0x407}, 0x0, 0x0}, + /* mObjCo */ {0}}, + /* mCylInf */ + {50.f, 100.f} +}; + +u32 dAcOBlockUnderground::getCylTgType() { + return 0x20020; +} + +const char *dAcOBlockUnderground::getOarcName() { + return sOarcName; +} + +extern "C" cListMg_c *fn_8018B840(); // d_underground + +dAcOBlockUnderground::dAcOBlockUnderground() : mRef(this), mUndergroundRef(nullptr) { + fn_8018B840()->append(&mRef); +} + +dAcOBlockUnderground::~dAcOBlockUnderground() { + fn_8018B840()->remove(&mRef); + delete mCyl; +} + +bool dAcOBlockUnderground::createHeap() { + const char *oarcName = getOarcName(); + void *data = getOarcResFile(oarcName); + if (data == nullptr) { + return false; + } + + nw4r::g3d::ResFile resFile(data); + if (!resFile.IsValid()) { + return false; + } + + const char *mdlName = getMdlName(); + nw4r::g3d::ResMdl mdl = resFile.GetResMdl(mdlName); + if (!mdl.IsValid()) { + return false; + } + + if (!mMdl.create(mdl, &heap_allocator, 0x120, 1, nullptr)) { + return false; + } + + void *dzb = getOarcDZB(getOarcName(), sDzbPlcNames[getSubtypeIdx()]); + if (dzb == nullptr) { + return false; + } + + void *plc = getOarcPLC(getOarcName(), sDzbPlcNames[getSubtypeIdx()]); + if (plc == nullptr) { + return false; + } + + bool result = !mBgW.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale); + if (!result) { + return false; + } + + if (fn_459_A00()) { + dCcD_Cyl *cyl = new dCcD_Cyl(); + mCyl = cyl; + if (mCyl == nullptr) { + return false; + } + } + return true; +} + +int dAcOBlockUnderground::actorCreate() { + u8 sceneFlag = getSecondSceneFlag(); + if (sceneFlag < 0xff) { + bool flag = SceneflagManager::sInstance->checkFlag(roomid, sceneFlag); + if (flag) { + return FAILED; + } + } + + bool success = false; + s32 newSubtype = 0; + u8 currentSubtype = getSubtype(); + const s32 *subtype = &sSubtypeIdx[0]; + while ((!success && newSubtype <= 3)) { + if (currentSubtype == *subtype) { + success = true; + } else { + subtype += 3; + newSubtype++; + } + } + if (success) { + setSubtype(newSubtype); + } else { + return FAILED; + } + + updateMatrix(); + CREATE_ALLOCATOR(dAcOBlockUnderground); + mMdl.setLocalMtx(mWorldMtx); + mMdl.setPriorityDraw(0x82, 0x7f); + if (fn_459_A00()) { + mStts.SetRank(0xD); + mCyl->Set(sCylSrc); + mCyl->SetStts(mStts); + if (fn_459_9A0()) { + mCyl->mTg.mSrc.mType = getCylTgType(); + } + mCyl->SetC(position); + } + mBgW.Move(); + mVec3_c min, max; + mMdl.getBounds(&min, &max); + boundingBox.Set(min, max); + return SUCCEEDED; +} + +int dAcOBlockUnderground::actorPostCreate() { + if (mBgW.ChkUsed()) { + mBgW.Lock(); + return SUCCEEDED; + } + registBg(); + return NOT_READY; +} + +int dAcOBlockUnderground::actorExecute() { + if (fn_459_A00()) { + if (mCyl->ChkTgHit()) { + if (mUndergroundRef.p_owner != nullptr) { + mUndergroundRef.get()->fn_458_9D0(mField_0x57C, mField_0x57E); + } + + if (getSubtype() == 1) { + spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_461_); + dSndSmallEffectMgr_c::GetInstance()->playSoundAtPosition(0xaa6, position); + } else { + spawnEffect(PARTICLE_RESOURCE_ID_MAPPING_462_); + dSndSmallEffectMgr_c::GetInstance()->playSoundAtPosition(0xaa7, position); + } + + u8 firstSceneFlag = getFirstSceneFlag(); + if (firstSceneFlag < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, firstSceneFlag); + } + + u8 secondSceneFlag = getSecondSceneFlag(); + if (secondSceneFlag < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, secondSceneFlag); + } + + deleteRequest(); + } else if (dAcPy_c::GetLink()->checkActionFlagsCont(dAcPy_c::FLG0_SWING_ROPE)) { + dCcS::GetInstance()->Set(mCyl); + } + } + return SUCCEEDED; +} + +int dAcOBlockUnderground::draw() { + if (dAcPy_c::GetLink()->checkActionFlagsCont(dAcPy_c::FLG0_SWING_ROPE)) { + drawModelType1(&mMdl); + } + return SUCCEEDED; +} + +void dAcOBlockUnderground::setUndergroundRef(dAcOUnderground_c *underground) { + mUndergroundRef.link(underground); +} + +bool dAcOBlockUnderground::undergroundRefEquals(dAcOUnderground_c *underground) { + return underground == mUndergroundRef.p_owner; +} + +void dAcOBlockUnderground::setBlockUndergroundPosition(mVec3_c *pos) { + setPostion(*pos); + updateMatrix(); + mMdl.setLocalMtx(mWorldMtx); + if (fn_459_A00()) { + mCyl->SetC(*pos); + } + mBgW.Move(); +} + +void dAcOBlockUnderground::fn_459_840(u16 field_0x57c, u16 field_0x57e) { + mField_0x57C = field_0x57c; + mField_0x57E = field_0x57e; +} + +u16 dAcOBlockUnderground::getField_0x57C() { + return mField_0x57C; +} + +u16 dAcOBlockUnderground::getField_0x57E() { + return mField_0x57E; +} + +void dAcOBlockUnderground::registBg() { + dBgS::GetInstance()->Regist(&mBgW, this); +} + +void dAcOBlockUnderground::releaseBg() { + dBgS::GetInstance()->Release(&mBgW); +} + +void dAcOBlockUnderground::setSubtype(u32 subtype) { + mSubtype = subtype; +} + +u8 dAcOBlockUnderground::getSubtype() { + return getFromParams(0, 0xff); +} + +u8 dAcOBlockUnderground::getFirstSceneFlag() { + return getFromParams(8, 0xff); +} + +u8 dAcOBlockUnderground::getSecondSceneFlag() { + return getFromParams(16, 0xff); +} + +u32 dAcOBlockUnderground::fn_459_930() { + return sSubtypeIdx[mSubtype * 3 + 1]; +} + +u32 dAcOBlockUnderground::getSubtypeIdx() { + return sSubtypeIdx[mSubtype * 3 + 2]; +} + +bool dAcOBlockUnderground::fn_459_970() { + return fn_459_930() == 0; +} + +bool dAcOBlockUnderground::fn_459_9A0() { + return fn_459_930() == 2; +} + +const char *dAcOBlockUnderground::getMdlName() { + return sMdlNames[getSubtypeIdx()]; +} + +bool dAcOBlockUnderground::fn_459_A00() { + return !fn_459_970(); +} + +void dAcOBlockUnderground::spawnEffect(u16 effectResourceId) const { + mVec3_c pos(position.x, position.y + 50.f, position.z); + dJEffManager_c::spawnEffect(effectResourceId, pos, nullptr, nullptr, nullptr, nullptr, 0, 0); +}