d_a_obj_block_underground OK

This commit is contained in:
swekka
2025-09-14 21:25:22 +02:00
parent 67c9e3346c
commit d8b8fdf622
6 changed files with 382 additions and 43 deletions
@@ -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
@@ -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
+1 -1
View File
@@ -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",
),
@@ -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<dAcOUnderground_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
+2
View File
@@ -8,6 +8,8 @@ public:
dAcOUnderground_c() {}
virtual ~dAcOUnderground_c() {}
void fn_458_9D0(u16, u16);
private:
};
+288 -2
View File
@@ -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);
}