Merge branch 'zeldaret:main' into d_a_obj_bird_sp

This commit is contained in:
Seba244c
2025-05-27 17:57:29 +02:00
committed by GitHub
14 changed files with 357 additions and 54 deletions
@@ -2,11 +2,11 @@ _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
dAcOislandLOD_c_classInit__Fv = .text:0x00000070; // type:function size:0x5C
fn_426_D0 = .text:0x000000D0; // type:function size:0xAC
fn_426_180 = .text:0x00000180; // type:function size:0xB0
fn_426_230 = .text:0x00000230; // type:function size:0x8
fn_426_240 = .text:0x00000240; // type:function size:0x8
fn_426_250 = .text:0x00000250; // type:function size:0x78
createHeap__15dAcOislandLOD_cFv = .text:0x000000D0; // type:function size:0xAC
create__15dAcOislandLOD_cFv = .text:0x00000180; // type:function size:0xB0
doDelete__15dAcOislandLOD_cFv = .text:0x00000230; // type:function size:0x8
actorExecute__15dAcOislandLOD_cFv = .text:0x00000240; // type:function size:0x8
draw__15dAcOislandLOD_cFv = .text:0x00000250; // type:function size:0x78
__dt__15dAcOislandLOD_cFv = .text:0x000002D0; // type:function size:0x68
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
@@ -8,14 +8,14 @@ __dt__29sFState_c<16dAcOstreamLava_c>Fv = .text:0x00000230; // type:function siz
__dt__32sFStateFct_c<16dAcOstreamLava_c>Fv = .text:0x00000290; // type:function size:0x6C
__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
__dt__14dScnCallback_cFv = .text:0x00000450; // type:function size:0x40
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
@@ -24,11 +24,11 @@ executeState_Stream__16dAcOstreamLava_cFv = .text:0x00000B50; // type:function s
finalizeState_Stream__16dAcOstreamLava_cFv = .text:0x00000BE0; // type:function size:0x4
__dt__16dAcOstreamLava_cFv = .text:0x00000BF0; // type:function size:0xFC
getStateID__85sStateMgr_c<16dAcOstreamLava_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000CF0; // type:function size:0x10
fn_405_D00 = .text:0x00000D00; // type:function size:0x4
fn_405_D10 = .text:0x00000D10; // type:function size:0x4
fn_405_D20 = .text:0x00000D20; // type:function size:0x4
fn_405_D30 = .text:0x00000D30; // type:function size:0x4
fn_405_D40 = .text:0x00000D40; // type:function size:0x4
ExecCallback_DRAW_XLU__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D00; // type:function size:0x4
ExecCallback_DRAW_OPA__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D10; // type:function size:0x4
ExecCallback_CALC_MAT__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D20; // type:function size:0x4
ExecCallback_CALC_WORLD__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D30; // type:function size:0x4
ExecCallback_CALC_VIEW__Q34nw4r3g3d15IScnObjCallbackFQ44nw4r3g3d6ScnObj6TimingPQ34nw4r3g3d6ScnObjUlPv = .text:0x00000D40; // type:function size:0x4
build__32sFStateFct_c<16dAcOstreamLava_c>FRC12sStateIDIf_c = .text:0x00000D50; // type:function size:0x60
dispose__32sFStateFct_c<16dAcOstreamLava_c>FRP10sStateIf_c = .text:0x00000DB0; // type:function size:0xC
initialize__29sFState_c<16dAcOstreamLava_c>Fv = .text:0x00000DC0; // type:function size:0x1C
@@ -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
@@ -4,10 +4,10 @@ _unresolved = .text:0x00000060; // type:function size:0x4 scope:global
dTgShutterFenceForbiddance_c_classInit__Fv = .text:0x00000070; // type:function size:0x30
__ct__28dTgShutterFenceForbiddance_cFv = .text:0x000000A0; // type:function size:0x50
__dt__28dTgShutterFenceForbiddance_cFv = .text:0x000000F0; // type:function size:0x7C
TgShutterFenceForbiddance__init = .text:0x00000170; // type:function size:0x20
fn_631_190 = .text:0x00000190; // type:function size:0x60
create__28dTgShutterFenceForbiddance_cFv = .text:0x00000170; // type:function size:0x20
actorExecute__28dTgShutterFenceForbiddance_cFv = .text:0x00000190; // type:function size:0x60
_ctors = .ctors:0x00000000; // type:label scope:global
_dtors = .dtors:0x00000000; // type:label scope:global
g_profile_TAG_SHUTTER_FENCE_FORBIDDANCE = .data:0x00000000; // type:object size:0x10
lbl_631_section4_10 = .data:0x00000010; // type:object size:0x74
__vt__28dTgShutterFenceForbiddance_c = .data:0x00000010; // type:object size:0x74
TgShutterFenceForbiddance__FIRST_PTR = .bss:0x00000008; // type:object size:0x4 data:4byte
+2 -2
View File
@@ -852,8 +852,8 @@ fn_80024590 = .text:0x80024590; // type:function size:0xE4
__ct__3SffFv = .text:0x80024680; // type:function size:0x48
__dt__3SffFv = .text:0x800246D0; // type:function size:0x64
fn_80024740 = .text:0x80024740; // type:function size:0x24
fn_80024770 = .text:0x80024770; // type:function size:0x24
fn_800247A0 = .text:0x800247A0; // type:function size:0x30
fn_80024770__21BlurAndPaletteManagerFi = .text:0x80024770; // type:function size:0x24
fn_800247A0__21BlurAndPaletteManagerFi = .text:0x800247A0; // type:function size:0x30
fn_800247D0__21BlurAndPaletteManagerF7mVec3_cf = .text:0x800247D0; // type:function size:0x20
__ct__21BlurAndPaletteManagerFv = .text:0x800247F0; // type:function size:0xBB0
__ct__7mVec3_cFfff = .text:0x800253A0; // type:function size:0x10
+1 -1
View File
@@ -2108,7 +2108,7 @@ config.libs = [
Rel(NonMatching, "d_a_obj_insect_island", "REL/d/a/obj/d_a_obj_insect_island.cpp"),
Rel(NonMatching, "d_a_obj_into_hole", "REL/d/a/obj/d_a_obj_into_hole.cpp"),
Rel(Matching, "d_a_obj_iron_stage", "REL/d/a/obj/d_a_obj_iron_stage.cpp"),
Rel(NonMatching, "d_a_obj_island_LOD", "REL/d/a/obj/d_a_obj_island_LOD.cpp"),
Rel(Matching, "d_a_obj_island_LOD", "REL/d/a/obj/d_a_obj_island_LOD.cpp"),
Rel(Matching, "d_a_obj_island_nusi", "REL/d/a/obj/d_a_obj_island_nusi.cpp"),
Rel(
NonMatching,
+12
View File
@@ -8,7 +8,19 @@ public:
dAcOislandLOD_c() {}
virtual ~dAcOislandLOD_c() {}
virtual bool createHeap() override;
virtual int create() override;
virtual int doDelete() override;
virtual int actorExecute() override;
virtual int draw() override;
private:
static const char* const resFilenames[5];
static const char* const resMdlNames[5];
/* 0x330 */ nw4r::g3d::ResFile mResFile;
/* 0x334 */ m3d::smdl_c mMdl;
/* 0x350 */ u8 mMdlLodIdx;
};
#endif
+30 -3
View File
@@ -1,20 +1,47 @@
#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(this) {}
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;
/* 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
+5 -2
View File
@@ -1,13 +1,16 @@
#ifndef D_T_SHUTTER_FENCE_FORBIDDANCE_H
#define D_T_SHUTTER_FENCE_FORBIDDANCE_H
#include "d/a/d_a_base.h"
#include "d/t/d_tg.h"
class dTgShutterFenceForbiddance_c : public dAcBase_c {
class dTgShutterFenceForbiddance_c : public dTg_c {
public:
dTgShutterFenceForbiddance_c();
virtual ~dTgShutterFenceForbiddance_c();
virtual int create() override;
virtual int actorExecute() override;
private:
};
+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);
@@ -268,6 +268,8 @@ public:
void fn_800226E0(LightParams *);
// light pillar related
void fn_80024240(s16, s16, s16);
bool fn_80024770(int);
bool fn_800247A0(int);
u8 get0x2DE8() const {
return field_0x2DE0[8];
+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);
+59
View File
@@ -1,3 +1,62 @@
#include "d/a/obj/d_a_obj_island_LOD.h"
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/d_stage.h"
#include "f/f_base.h"
#include "toBeSorted/blur_and_palette_manager.h"
const char* const dAcOislandLOD_c::resFilenames[5] = {
"IslLODA",
"IslLODB",
"IslLODC",
"IslLODD",
"IslLODE",
};
const char* const dAcOislandLOD_c::resMdlNames[5] = {
"IslLODA",
"IslLODB",
"IslLODC",
"IslLODD",
"IslLODE",
};
SPECIAL_ACTOR_PROFILE(OBJ_ISLAND_LOD, dAcOislandLOD_c, fProfile::OBJ_ISLAND_LOD, 0x211, 0, 3);
bool dAcOislandLOD_c::createHeap() {
mMdlLodIdx = params & 0xf;
void* data = getOarcResFile(dAcOislandLOD_c::resFilenames[mMdlLodIdx]);
mResFile = nw4r::g3d::ResFile(data);
dStage_c::bindStageResToFile(&mResFile);
dStage_c::bindSkyCmnToResFile(&mResFile);
nw4r::g3d::ResMdl mdl = mResFile.GetResMdl(dAcOislandLOD_c::resMdlNames[mMdlLodIdx]);
TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120, 1, nullptr));
return true;
}
int dAcOislandLOD_c::create() {
CREATE_ALLOCATOR(dAcOislandLOD_c);
updateMatrix();
mMdl.setLocalMtx(mWorldMtx);
mVec3_c min, max;
mMdl.getBounds(&min, &max);
boundingBox.Set(min, max);
mCullingDistance = 500000.0;
return SUCCEEDED;
}
int dAcOislandLOD_c::doDelete() {
return SUCCEEDED;
}
int dAcOislandLOD_c::actorExecute() {
return SUCCEEDED;
}
int dAcOislandLOD_c::draw() {
BlurAndPaletteManager& blurAndPaletteManager = BlurAndPaletteManager::GetInstance();
if (blurAndPaletteManager.fn_80024770(7) && !blurAndPaletteManager.fn_800247A0(7)) {
return SUCCEEDED;
}
drawModelType1(&mMdl);
return SUCCEEDED;
}
+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, nullptr, 1));
mModel.setAnm(mAnmTexSrtWait);
anmClr = mResFile.GetResAnmClr(AcOstreamLava__AnmClrNames[mSubtype]);
TRY_CREATE(mAnmMatClr.create(mdl, anmClr, &heap_allocator, nullptr, 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)) {
setObjectProperty(0x200);
return SUCCEEDED;
} else {
clearObjectProperty(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() {}
+27 -2
View File
@@ -1,8 +1,33 @@
#include "d/t/d_t_shutter_fence_forbiddance.h"
#include "common.h"
#include "f/f_base.h"
SPECIAL_ACTOR_PROFILE(
TAG_SHUTTER_FENCE_FORBIDDANCE, dTgShutterFenceForbiddance_c, fProfile::TAG_SHUTTER_FENCE_FORBIDDANCE, 0x2A4, 0, 4
);
dTgShutterFenceForbiddance_c::dTgShutterFenceForbiddance_c() {}
dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() {}
static dTgShutterFenceForbiddance_c *FIRST_PTR;
dTgShutterFenceForbiddance_c::dTgShutterFenceForbiddance_c() {
if (!FIRST_PTR) {
FIRST_PTR = this;
}
}
dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() {
if (this == FIRST_PTR) {
FIRST_PTR = nullptr;
}
}
int dTgShutterFenceForbiddance_c::create() {
if (this != FIRST_PTR) {
return FAILED;
}
return SUCCEEDED;
}
// TODO after finding out more about d_a_obj_door_base
int dTgShutterFenceForbiddance_c::actorExecute() {
return SUCCEEDED;
}