d_a_obj_stream_lava mostly done

This commit is contained in:
CovenEsme
2025-05-26 23:11:16 +01:00
parent 4b2c78578e
commit abe9ef4a51
5 changed files with 240 additions and 33 deletions
@@ -9,13 +9,13 @@ __dt__32sFStateFct_c<16dAcOstreamLava_c>Fv = .text:0x00000290; // type:function
__dt__85sStateMgr_c<16dAcOstreamLava_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000300; // type:function size:0xA0
__dt__55sFStateMgr_c<16dAcOstreamLava_c,20sStateMethodUsr_FI_c>Fv = .text:0x000003A0; // type:function size:0xA4
fn_405_450 = .text:0x00000450; // type:function size:0x40
AcOstreamLava__initModels = .text:0x00000490; // type:function size:0x200
AcOstreamLava__init = .text:0x00000690; // type:function size:0x1A4
createHeap__16dAcOstreamLava_cFv = .text:0x00000490; // type:function size:0x200
create__16dAcOstreamLava_cFv = .text:0x00000690; // type:function size:0x1A4
changeState__85sStateMgr_c<16dAcOstreamLava_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000840; // type:function size:0x10
AcOstreamLava__destroy = .text:0x00000850; // type:function size:0x40
AcOstreamLava__update = .text:0x00000890; // type:function size:0x94
doDelete__16dAcOstreamLava_cFv = .text:0x00000850; // type:function size:0x40
actorExecute__16dAcOstreamLava_cFv = .text:0x00000890; // type:function size:0x94
executeState__85sStateMgr_c<16dAcOstreamLava_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000930; // type:function size:0x10
AcOstreamLava__draw = .text:0x00000940; // type:function size:0x34
draw__16dAcOstreamLava_cFv = .text:0x00000940; // type:function size:0x34
initializeState_Wait__16dAcOstreamLava_cFv = .text:0x00000980; // type:function size:0x54
executeState_Wait__16dAcOstreamLava_cFv = .text:0x000009E0; // type:function size:0x88
finalizeState_Wait__16dAcOstreamLava_cFv = .text:0x00000A70; // type:function size:0x7C
@@ -49,32 +49,37 @@ isSameName__31sFStateID_c<16dAcOstreamLava_c>CFPCc = .text:0x00001130; // type:f
_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_405_rodata_0 = .rodata:0x00000000; // type:object size:0x68
lbl_405_rodata_68 = .rodata:0x00000068; // type:object size:0x4 align:4 data:float
lbl_405_data_0 = .data:0x00000000; // type:object size:0xC data:4byte
lbl_405_data_C = .data:0x0000000C; // type:object size:0x10
lbl_405_data_1C = .data:0x0000001C; // type:object size:0x10
lbl_405_data_2C = .data:0x0000002C; // type:object size:0x14
lbl_405_rodata_00 = .rodata:0x00000000; // type:object size:0x4 data:float
lbl_405_rodata_04 = .rodata:0x00000004; // type:object size:0x14 scope:local
lbl_405_rodata_18 = .rodata:0x00000018; // type:object size:0x14 scope:local
lbl_405_rodata_2C = .rodata:0x0000002C; // type:object size:0x14 scope:local
lbl_405_rodata_40 = .rodata:0x00000040; // type:object size:0x14 scope:local
lbl_405_rodata_54 = .rodata:0x00000054; // type:object size:0x14 scope:local
lbl_405_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local align:4 data:float
lbl_405_data_00 = .data:0x00000000; // type:object size:0xC data:string
lbl_405_data_0C = .data:0x0000000C; // type:object size:0x10 data:string
lbl_405_data_1C = .data:0x0000001C; // type:object size:0x10 data:string
lbl_405_data_2C = .data:0x0000002C; // type:object size:0x14 data:string
lbl_405_data_40 = .data:0x00000040; // type:object size:0x10 data:string
lbl_405_data_50 = .data:0x00000050; // type:object size:0x10 data:string
lbl_405_data_60 = .data:0x00000060; // type:object size:0x10 data:string
lbl_405_data_70 = .data:0x00000070; // type:object size:0x18
lbl_405_data_88 = .data:0x00000088; // type:object size:0x18
lbl_405_data_70 = .data:0x00000070; // type:object size:0x18 data:string
lbl_405_data_88 = .data:0x00000088; // type:object size:0x18 data:string
lbl_405_data_A0 = .data:0x000000A0; // type:object size:0x18 data:string
lbl_405_data_B8 = .data:0x000000B8; // type:object size:0x18 data:string
lbl_405_data_D0 = .data:0x000000D0; // type:object size:0x18 data:string
lbl_405_data_E8 = .data:0x000000E8; // type:object size:0x18
lbl_405_data_100 = .data:0x00000100; // type:object size:0x18
lbl_405_data_E8 = .data:0x000000E8; // type:object size:0x18 data:string
lbl_405_data_100 = .data:0x00000100; // type:object size:0x18 data:string
lbl_405_data_118 = .data:0x00000118; // type:object size:0x18 data:string
lbl_405_data_130 = .data:0x00000130; // type:object size:0x18 data:string
lbl_405_data_148 = .data:0x00000148; // type:object size:0x18 data:string
g_profile_OBJ_STREAM_LAVA = .data:0x00000160; // type:object size:0x10
lbl_405_data_170 = .data:0x00000170; // type:object size:0x8
lbl_405_data_178 = .data:0x00000178; // type:object size:0x20
lbl_405_data_198 = .data:0x00000198; // type:object size:0x4 data:4byte
lbl_405_data_19C = .data:0x0000019C; // type:object size:0x4 data:4byte
lbl_405_data_1A0 = .data:0x000001A0; // type:object size:0x8
AcOstreamLava__vtable = .data:0x000001A8; // type:object size:0x80
lbl_405_data_170 = .data:0x00000170; // type:object size:0x8 data:string
lbl_405_data_178 = .data:0x00000178; // type:object size:0x20 data:string
lbl_405_data_198 = .data:0x00000198; // type:object size:0x4 data:int
lbl_405_data_19C = .data:0x0000019C; // type:object size:0x4 data:int
lbl_405_data_1A0 = .data:0x000001A0; // type:object size:0x8 data:string
__vt__16dAcOstreamLava_c = .data:0x000001A8; // type:object size:0x80
lbl_405_data_228 = .data:0x00000228; // type:object size:0x30
lbl_405_data_258 = .data:0x00000258; // type:object size:0x30
lbl_405_data_288 = .data:0x00000288; // type:object size:0x18
@@ -82,5 +87,5 @@ lbl_405_data_2A0 = .data:0x000002A0; // type:object size:0xC4
lbl_405_data_364 = .data:0x00000364; // type:object size:0x34
__global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global
lbl_405_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte
AcOstreamLava__STATE_WAIT = .bss:0x00000018; // type:object size:0x40 data:4byte
AcOstreamLava__STATE_STREAM = .bss:0x00000058; // type:object size:0x30 data:4byte
StateID_Wait__16dAcOstreamLava_c = .bss:0x00000018; // type:object size:0x40 data:4byte
StateID_Stream__16dAcOstreamLava_c = .bss:0x00000058; // type:object size:0x30 data:4byte
+35 -3
View File
@@ -1,20 +1,52 @@
#ifndef D_A_OBJ_STREAM_LAVA_H
#define D_A_OBJ_STREAM_LAVA_H
#include "common.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 "nw4r/g3d/res/g3d_resfile.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
#include "toBeSorted/actor_event.h"
#include "toBeSorted/stage_render_stuff.h"
class dAcOstreamLava_c : public dAcObjBase_c {
public:
dAcOstreamLava_c() : mStateMgr(*this, sStateID::null) {}
dAcOstreamLava_c() : mStateMgr(*this, sStateID::null), mEvent(*this, nullptr), mScnCallback(nullptr) {}
virtual int create() override;
virtual int doDelete() override;
virtual int draw() override;
virtual bool createHeap() override;
virtual ~dAcOstreamLava_c() {}
virtual int actorExecute() override;
STATE_FUNC_DECLARE(dAcOstreamLava_c, Wait);
STATE_FUNC_DECLARE(dAcOstreamLava_c, Stream);
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcOstreamLava_c);
const static f32 unkFloat0;
static u32 eventFlags1;
static u32 eventFlags2;
static void eventIn_Wrapper(void *arg);
void eventIn();
static void eventEnd_Wrapper(void *arg);
void eventEnd();
/* 0x330 */ nw4r::g3d::ResFile mResFile;
/* 0x334 */ m3d::smdl_c mModel;
/* 0x350 */ m3d::anmTexSrt_c mAnmTexSrtWait;
/* 0x37C */ m3d::anmMatClr_c mAnmMatClr;
/* 0x3A8 */ dBgW mCollision;
/* 0x5B8 */ STATE_MGR_DECLARE(dAcOstreamLava_c);
/* 0x5F4 */ ActorEventRelated mEvent;
/* 0x644 */ dScnCallback_c mScnCallback;
/* 0x650 */ u8 mSubtype;
/* 0x651 */ u8 mShouldStreamSceneflag;
/* 0x652 */ u8 mEventId;
/* 0x653 */ bool mHideActor;
};
#endif
+4 -1
View File
@@ -15,7 +15,6 @@
#include "f/f_manager.h"
#include "f/f_profile.h"
// Ghidra: fBase
// size: 0x64
// official name
@@ -91,6 +90,10 @@ public:
group_type = m_tmpCtData.group_type;
}
inline u32 getFromParams(u8 shift, u32 mask) {
return (params >> shift) & mask;
}
public:
/* 802e12f0 */ fBase_c();
/* 802e23b0 */ static void *operator new(size_t);
+4
View File
@@ -15,6 +15,10 @@ public:
void *callback2;
public:
static u32 makeEventFlag(const u32 &clearMask, const u32 &unsetBits) {
return clearMask & ~unsetBits;
}
/** 0x800A0C40 */
Event(const char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2);
Event(u32 eventId, s32 roomId, u32 eventFlags, void *callback1, void *callback2);
+169 -6
View File
@@ -1,13 +1,176 @@
#include "d/a/obj/d_a_obj_stream_lava.h"
SPECIAL_ACTOR_PROFILE(OBJ_STREAM_LAVA, dAcOstreamLava_c, fProfile::OBJ_STREAM_LAVA, 0x1FA, 0, 6);
#include "common.h"
#include "d/col/bg/d_bg_s.h"
#include "d/d_room.h"
#include "d/d_stage.h"
#include "d/flag/sceneflag_manager.h"
#include "m/m3d/m_fanm.h"
#include "nw4r/g3d/res/g3d_resfile.h"
STATE_DEFINE(dAcOstreamLava_c, Wait);
STATE_DEFINE(dAcOstreamLava_c, Stream);
void dAcOstreamLava_c::initializeState_Wait() {}
void dAcOstreamLava_c::executeState_Wait() {}
void dAcOstreamLava_c::finalizeState_Wait() {}
void dAcOstreamLava_c::initializeState_Stream() {}
void dAcOstreamLava_c::executeState_Stream() {}
const f32 dAcOstreamLava_c::unkFloat0 = 0.0f;
static const char *const AcOstreamLava__OarcNames[] = {
"FlowLavaD2", "FlowLavaD2", "FlowLavaLast_2", "FlowLavaLast_2", "FlowLavaLast_2",
};
static const char *const AcOstreamLava__ModelNames[] = {
"FlowLavaD2_A", "FlowLavaD2_B", "FlowLavaLast_2A", "FlowLavaLast_2B", "FlowLavaLast_2C",
};
static const char *const AcOstreamLava__DbzNames[] = {
"dzb/FlowLavaD2_A.dzb", "dzb/FlowLavaD2_B.dzb", "dzb/FlowLavaLast_2A.dzb",
"dzb/FlowLavaLast_2B.dzb", "dzb/FlowLavaLast_2C.dzb",
};
static const char *const AcOstreamLava__PlcNames[] = {
"dat/FlowLavaD2_A.plc", "dat/FlowLavaD2_B.plc", "dat/FlowLavaLast_2A.plc",
"dat/FlowLavaLast_2B.plc", "dat/FlowLavaLast_2C.plc",
};
static const char *const AcOstreamLava__AnmClrNames[] = {
"FlowLavaD2", "FlowLavaD2", "FlowLavaLast_2", "FlowLavaLast_2", "FlowLavaLast_2",
};
SPECIAL_ACTOR_PROFILE(OBJ_STREAM_LAVA, dAcOstreamLava_c, fProfile::OBJ_STREAM_LAVA, 0x1FA, 0, 6);
bool dAcOstreamLava_c::createHeap() {
mSubtype = params & 0xF;
mResFile = nw4r::g3d::ResFile(getOarcResFile(AcOstreamLava__OarcNames[mSubtype]));
dStage_c::bindStageResToFile(&mResFile);
nw4r::g3d::ResMdl mdl;
nw4r::g3d::ResAnmTexSrt anmSrtWait;
nw4r::g3d::ResAnmClr anmClr;
mdl = mResFile.GetResMdl(AcOstreamLava__ModelNames[mSubtype]);
TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x32C));
anmSrtWait = mResFile.GetResAnmTexSrt("Wait");
TRY_CREATE(mAnmTexSrtWait.create(mdl, anmSrtWait, &heap_allocator, 0x0, 1));
mModel.setAnm(mAnmTexSrtWait);
anmClr = mResFile.GetResAnmClr(AcOstreamLava__AnmClrNames[mSubtype]);
TRY_CREATE(mAnmMatClr.create(mdl, anmClr, &heap_allocator, 0x0, 1));
void *dzb = getOarcFile(AcOstreamLava__OarcNames[mSubtype], AcOstreamLava__DbzNames[mSubtype]);
void *plc = getOarcFile(AcOstreamLava__OarcNames[mSubtype], AcOstreamLava__PlcNames[mSubtype]);
updateMatrix();
mModel.setLocalMtx(mWorldMtx);
TRY_CREATE(!mCollision.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale));
mCollision.Lock();
TRY_CREATE(mCollision.InitMapStuff(&heap_allocator));
return true;
}
int dAcOstreamLava_c::create() {
CREATE_ALLOCATOR(dAcOstreamLava_c);
dBgS::GetInstance()->Regist(&mCollision, this);
dBgS::GetInstance()->RegistBg(&mCollision, this);
mShouldStreamSceneflag = getFromParams(4, 0xFF); // (params >> 4) & 0xFF;
mEventId = getFromParams(0xC, 0xFF); // params >> 0xC;
mHideActor = !getFromParams(0x14, 1); // (params >> 0x14 & 1) == 0;
mModel.setAnm(mAnmMatClr);
bool shouldStream = SceneflagManager::sInstance->checkFlag(roomid, mShouldStreamSceneflag);
if (shouldStream) {
mStateMgr.changeState(StateID_Stream);
} else {
mStateMgr.changeState(StateID_Wait);
}
mModel.setPriorityDraw(0x1C, 0x9);
mVec3_c min, max;
mModel.getBounds(&min, &max);
boundingBox.Set(min, max);
mCullingDistance = 50000.0f;
int roomId_tmp = roomid;
if (addActorToRoom(-1)) {
roomid = roomId_tmp;
changeLoadedEntitiesWithSet();
}
return SUCCEEDED;
}
int dAcOstreamLava_c::doDelete() {
dBgS::GetInstance()->UnRegist(&mCollision);
changeLoadedEntitiesNoSet();
return SUCCEEDED;
}
int dAcOstreamLava_c::actorExecute() {
mStateMgr.executeState();
mAnmMatClr.play();
dRoom_c *currentRoom = dStage_c::GetInstance()->getRoom(roomid);
if (currentRoom->checkFlag(2)) {
mObjectActorFlags |= 0x200;
return SUCCEEDED;
} else {
mObjectActorFlags &= ~0x200;
return SUCCEEDED;
}
}
int dAcOstreamLava_c::draw() {
if (!mHideActor) {
drawModelType1(&mModel);
}
return SUCCEEDED;
}
void dAcOstreamLava_c::initializeState_Wait() {
mAnmTexSrtWait.setAnm(mModel, mResFile.GetResAnmTexSrt("Wait"), 0, m3d::PLAY_MODE_4);
}
void dAcOstreamLava_c::executeState_Wait() {
mAnmTexSrtWait.play();
bool shouldStream = SceneflagManager::sInstance->checkFlag(roomid, mShouldStreamSceneflag);
if (shouldStream) {
mStateMgr.changeState(StateID_Stream);
}
}
// BADLY MATCHING
// Using the potential improvement causes issues with the andc instruction
// Should be: andc r6, r0, r9
// Currently: andc r6, r9, r0
// https://decomp.me/scratch/3PKdt
void dAcOstreamLava_c::finalizeState_Wait() {
if (mEventId != 0xFF) {
// Hacky solution:
static volatile u32 FLAGS_1 = 0x00000001;
static u32 FLAGS_2 = 0x00100001;
u32 f1 = FLAGS_1;
u32 f2 = FLAGS_2;
u32 eventFlag = f2 & ~f1;
// Potential improvement:
// Swaps the numbers in .data and swaps the operands in andc
// u32 eventFlag = Event::makeEventFlag(0x100001, 0x1);
Event ev(mEventId, roomid, eventFlag, nullptr, nullptr);
mEvent.scheduleEvent(ev, 0);
}
}
void dAcOstreamLava_c::initializeState_Stream() {
mAnmTexSrtWait.setAnm(mModel, mResFile.GetResAnmTexSrt("Flow"), 0, m3d::PLAY_MODE_4);
}
void dAcOstreamLava_c::executeState_Stream() {
mAnmTexSrtWait.play();
bool shouldStream = SceneflagManager::sInstance->checkFlag(roomid, mShouldStreamSceneflag);
if (!shouldStream) {
mStateMgr.changeState(StateID_Wait);
}
}
void dAcOstreamLava_c::finalizeState_Stream() {}