From 142380f587e9cbdf0eff993d41ed44d18b389968 Mon Sep 17 00:00:00 2001 From: Orstedra Date: Mon, 26 May 2025 01:52:45 +0200 Subject: [PATCH 1/9] Initial commit --- .../rels/d_t_gate_to_groundNP/symbols.txt | 2 +- include/d/t/d_t_shutter_fence_forbiddance.h | 7 ++++-- src/REL/d/t/d_t_shutter_fence_forbiddance.cpp | 22 ++++++++++++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/config/SOUE01/rels/d_t_gate_to_groundNP/symbols.txt b/config/SOUE01/rels/d_t_gate_to_groundNP/symbols.txt index 00eb2edf..49256b1d 100644 --- a/config/SOUE01/rels/d_t_gate_to_groundNP/symbols.txt +++ b/config/SOUE01/rels/d_t_gate_to_groundNP/symbols.txt @@ -10,7 +10,7 @@ draw__17dTgGateToGround_cFv = .text:0x000002F0; // type:function size:0x8 __dt__17dTgGateToGround_cFv = .text:0x00000300; // type:function size:0x70 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -@20562 = .rodata:0x00000000; // type:object size:0x4 data:float scope:local +@20562 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float g_profile_GATE2GND_TAG = .data:0x00000000; // type:object size:0x10 @20583 = .data:0x00000010; // type:object size:0xC scope:local __vt__17dTgGateToGround_c = .data:0x0000001C; // type:object size:0x74 diff --git a/include/d/t/d_t_shutter_fence_forbiddance.h b/include/d/t/d_t_shutter_fence_forbiddance.h index fed5dab1..5b4dd9b3 100644 --- a/include/d/t/d_t_shutter_fence_forbiddance.h +++ b/include/d/t/d_t_shutter_fence_forbiddance.h @@ -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: }; diff --git a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp index c85cbf98..71569519 100644 --- a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp +++ b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp @@ -1,8 +1,28 @@ #include "d/t/d_t_shutter_fence_forbiddance.h" +#include "common.h" +#include "d/a/d_a_base.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() {} +static dTgShutterFenceForbiddance_c *FIRST_PTR; + +dTgShutterFenceForbiddance_c::dTgShutterFenceForbiddance_c() { + if (!FIRST_PTR) { + FIRST_PTR = this; + } +} dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() {} + +int dTgShutterFenceForbiddance_c::create() { + return SUCCEEDED + ((reinterpret_cast(FIRST_PTR) - reinterpret_cast(this) | + reinterpret_cast(this) - reinterpret_cast(FIRST_PTR)) >> + 31); +} + +int dTgShutterFenceForbiddance_c::actorExecute() { + return SUCCEEDED; +} From 9c5ced64b7595083f0fe13051a3d60bda014cffd Mon Sep 17 00:00:00 2001 From: Orstedra Date: Mon, 26 May 2025 01:59:00 +0200 Subject: [PATCH 2/9] symbols --- .../SOUE01/rels/d_t_shutter_fence_forbiddanceNP/symbols.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/SOUE01/rels/d_t_shutter_fence_forbiddanceNP/symbols.txt b/config/SOUE01/rels/d_t_shutter_fence_forbiddanceNP/symbols.txt index 77e4f804..ae45b113 100644 --- a/config/SOUE01/rels/d_t_shutter_fence_forbiddanceNP/symbols.txt +++ b/config/SOUE01/rels/d_t_shutter_fence_forbiddanceNP/symbols.txt @@ -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 From 89f38598fa5f63310c02158a8069a813bbc4c615 Mon Sep 17 00:00:00 2001 From: Orstedra Date: Mon, 26 May 2025 02:06:50 +0200 Subject: [PATCH 3/9] create clean --- src/REL/d/t/d_t_shutter_fence_forbiddance.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp index 71569519..097edd56 100644 --- a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp +++ b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp @@ -18,9 +18,10 @@ dTgShutterFenceForbiddance_c::dTgShutterFenceForbiddance_c() { dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() {} int dTgShutterFenceForbiddance_c::create() { - return SUCCEEDED + ((reinterpret_cast(FIRST_PTR) - reinterpret_cast(this) | - reinterpret_cast(this) - reinterpret_cast(FIRST_PTR)) >> - 31); + if (this != FIRST_PTR) { + return FAILED; + } + return SUCCEEDED; } int dTgShutterFenceForbiddance_c::actorExecute() { From 059c7f3ca80123062aa2c8141ea5eb592ab24ee7 Mon Sep 17 00:00:00 2001 From: Orstedra Date: Mon, 26 May 2025 18:42:46 +0200 Subject: [PATCH 4/9] actorExecute missing --- src/REL/d/t/d_t_shutter_fence_forbiddance.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp index 097edd56..82f5c395 100644 --- a/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp +++ b/src/REL/d/t/d_t_shutter_fence_forbiddance.cpp @@ -1,7 +1,6 @@ #include "d/t/d_t_shutter_fence_forbiddance.h" #include "common.h" -#include "d/a/d_a_base.h" #include "f/f_base.h" SPECIAL_ACTOR_PROFILE( @@ -15,7 +14,11 @@ dTgShutterFenceForbiddance_c::dTgShutterFenceForbiddance_c() { FIRST_PTR = this; } } -dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() {} +dTgShutterFenceForbiddance_c::~dTgShutterFenceForbiddance_c() { + if (this == FIRST_PTR) { + FIRST_PTR = nullptr; + } +} int dTgShutterFenceForbiddance_c::create() { if (this != FIRST_PTR) { @@ -24,6 +27,7 @@ int dTgShutterFenceForbiddance_c::create() { return SUCCEEDED; } +// TODO after finding out more about d_a_obj_door_base int dTgShutterFenceForbiddance_c::actorExecute() { return SUCCEEDED; } From abe9ef4a51669b6451d803c81d311322abe3c902 Mon Sep 17 00:00:00 2001 From: CovenEsme <84377742+CovenEsme@users.noreply.github.com> Date: Mon, 26 May 2025 23:11:16 +0100 Subject: [PATCH 5/9] d_a_obj_stream_lava mostly done --- .../rels/d_a_obj_stream_lavaNP/symbols.txt | 51 ++--- include/d/a/obj/d_a_obj_stream_lava.h | 38 +++- include/f/f_base.h | 5 +- include/toBeSorted/event.h | 4 + src/REL/d/a/obj/d_a_obj_stream_lava.cpp | 175 +++++++++++++++++- 5 files changed, 240 insertions(+), 33 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt b/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt index 4e73ce44..8bd794ad 100644 --- a/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt @@ -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 diff --git a/include/d/a/obj/d_a_obj_stream_lava.h b/include/d/a/obj/d_a_obj_stream_lava.h index a4226a87..e4808e26 100644 --- a/include/d/a/obj/d_a_obj_stream_lava.h +++ b/include/d/a/obj/d_a_obj_stream_lava.h @@ -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 diff --git a/include/f/f_base.h b/include/f/f_base.h index c24095fe..34bc8bec 100644 --- a/include/f/f_base.h +++ b/include/f/f_base.h @@ -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); diff --git a/include/toBeSorted/event.h b/include/toBeSorted/event.h index f07f8aa6..68ff6e68 100644 --- a/include/toBeSorted/event.h +++ b/include/toBeSorted/event.h @@ -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); diff --git a/src/REL/d/a/obj/d_a_obj_stream_lava.cpp b/src/REL/d/a/obj/d_a_obj_stream_lava.cpp index 0de85e82..25715c5f 100644 --- a/src/REL/d/a/obj/d_a_obj_stream_lava.cpp +++ b/src/REL/d/a/obj/d_a_obj_stream_lava.cpp @@ -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() {} From 204e3495c52901db31982d75558bf21bc4403b0f Mon Sep 17 00:00:00 2001 From: Swekka Date: Tue, 27 May 2025 00:40:29 +0200 Subject: [PATCH 6/9] d_a_obj_island_LOD --- .../rels/d_a_obj_island_LODNP/symbols.txt | 10 ++-- config/SOUE01/symbols.txt | 4 +- include/d/a/obj/d_a_obj_island_LOD.h | 12 ++++ include/toBeSorted/blur_and_palette_manager.h | 2 + src/REL/d/a/obj/d_a_obj_island_LOD.cpp | 59 +++++++++++++++++++ 5 files changed, 80 insertions(+), 7 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_island_LODNP/symbols.txt b/config/SOUE01/rels/d_a_obj_island_LODNP/symbols.txt index f3922533..031f6615 100644 --- a/config/SOUE01/rels/d_a_obj_island_LODNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_island_LODNP/symbols.txt @@ -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 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 68878fa5..03921e55 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -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 diff --git a/include/d/a/obj/d_a_obj_island_LOD.h b/include/d/a/obj/d_a_obj_island_LOD.h index c6fb5449..3b2d7eb2 100644 --- a/include/d/a/obj/d_a_obj_island_LOD.h +++ b/include/d/a/obj/d_a_obj_island_LOD.h @@ -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 resFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ u8 lodModelIndex; }; #endif diff --git a/include/toBeSorted/blur_and_palette_manager.h b/include/toBeSorted/blur_and_palette_manager.h index 6f985709..1891a7e0 100644 --- a/include/toBeSorted/blur_and_palette_manager.h +++ b/include/toBeSorted/blur_and_palette_manager.h @@ -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]; diff --git a/src/REL/d/a/obj/d_a_obj_island_LOD.cpp b/src/REL/d/a/obj/d_a_obj_island_LOD.cpp index 56fe0d7b..31db1ce1 100644 --- a/src/REL/d/a/obj/d_a_obj_island_LOD.cpp +++ b/src/REL/d/a/obj/d_a_obj_island_LOD.cpp @@ -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() { + lodModelIndex = params & 0xf; + void* data = getOarcResFile(dAcOislandLOD_c::resFilenames[lodModelIndex]); + resFile = nw4r::g3d::ResFile(data); + dStage_c::bindStageResToFile(&resFile); + dStage_c::bindSkyCmnToResFile(&resFile); + nw4r::g3d::ResMdl mdl = resFile.GetResMdl(dAcOislandLOD_c::resMdlNames[lodModelIndex]); + 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; +} From 9fc41cae0813ebbe8d0cd8913a3ab276680d0a85 Mon Sep 17 00:00:00 2001 From: Swekka Date: Tue, 27 May 2025 00:49:13 +0200 Subject: [PATCH 7/9] configure.py --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 9abbc2b9..c0869eb4 100644 --- a/configure.py +++ b/configure.py @@ -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, From 792471426642fe41df53a5464e3ce357a0f11250 Mon Sep 17 00:00:00 2001 From: CovenEsme <84377742+CovenEsme@users.noreply.github.com> Date: Tue, 27 May 2025 03:47:39 +0100 Subject: [PATCH 8/9] Apply feedback --- config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt | 12 ++++++------ include/d/a/obj/d_a_obj_stream_lava.h | 7 +------ src/REL/d/a/obj/d_a_obj_stream_lava.cpp | 8 ++++---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt b/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt index 8bd794ad..f84ccac6 100644 --- a/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_stream_lavaNP/symbols.txt @@ -8,7 +8,7 @@ __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 +__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 @@ -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 diff --git a/include/d/a/obj/d_a_obj_stream_lava.h b/include/d/a/obj/d_a_obj_stream_lava.h index e4808e26..78857b24 100644 --- a/include/d/a/obj/d_a_obj_stream_lava.h +++ b/include/d/a/obj/d_a_obj_stream_lava.h @@ -13,7 +13,7 @@ class dAcOstreamLava_c : public dAcObjBase_c { public: - dAcOstreamLava_c() : mStateMgr(*this, sStateID::null), mEvent(*this, nullptr), mScnCallback(nullptr) {} + dAcOstreamLava_c() : mStateMgr(*this, sStateID::null), mEvent(*this, nullptr), mScnCallback(this) {} virtual int create() override; virtual int doDelete() override; virtual int draw() override; @@ -29,11 +29,6 @@ private: 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; diff --git a/src/REL/d/a/obj/d_a_obj_stream_lava.cpp b/src/REL/d/a/obj/d_a_obj_stream_lava.cpp index 25715c5f..8578a76f 100644 --- a/src/REL/d/a/obj/d_a_obj_stream_lava.cpp +++ b/src/REL/d/a/obj/d_a_obj_stream_lava.cpp @@ -46,11 +46,11 @@ bool dAcOstreamLava_c::createHeap() { TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x32C)); anmSrtWait = mResFile.GetResAnmTexSrt("Wait"); - TRY_CREATE(mAnmTexSrtWait.create(mdl, anmSrtWait, &heap_allocator, 0x0, 1)); + 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, 0x0, 1)); + 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]); @@ -109,10 +109,10 @@ int dAcOstreamLava_c::actorExecute() { dRoom_c *currentRoom = dStage_c::GetInstance()->getRoom(roomid); if (currentRoom->checkFlag(2)) { - mObjectActorFlags |= 0x200; + setObjectProperty(0x200); return SUCCEEDED; } else { - mObjectActorFlags &= ~0x200; + clearObjectProperty(0x200); return SUCCEEDED; } } From 3d4cc2cdf4497215a771508ceb7070b52414e5b3 Mon Sep 17 00:00:00 2001 From: Swekka Date: Tue, 27 May 2025 09:51:18 +0200 Subject: [PATCH 9/9] variable names --- include/d/a/obj/d_a_obj_island_LOD.h | 4 ++-- src/REL/d/a/obj/d_a_obj_island_LOD.cpp | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/d/a/obj/d_a_obj_island_LOD.h b/include/d/a/obj/d_a_obj_island_LOD.h index 3b2d7eb2..ce1cb0cc 100644 --- a/include/d/a/obj/d_a_obj_island_LOD.h +++ b/include/d/a/obj/d_a_obj_island_LOD.h @@ -18,9 +18,9 @@ private: static const char* const resFilenames[5]; static const char* const resMdlNames[5]; - /* 0x330 */ nw4r::g3d::ResFile resFile; + /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mMdl; - /* 0x350 */ u8 lodModelIndex; + /* 0x350 */ u8 mMdlLodIdx; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_island_LOD.cpp b/src/REL/d/a/obj/d_a_obj_island_LOD.cpp index 31db1ce1..54839dcf 100644 --- a/src/REL/d/a/obj/d_a_obj_island_LOD.cpp +++ b/src/REL/d/a/obj/d_a_obj_island_LOD.cpp @@ -24,12 +24,12 @@ const char* const dAcOislandLOD_c::resMdlNames[5] = { SPECIAL_ACTOR_PROFILE(OBJ_ISLAND_LOD, dAcOislandLOD_c, fProfile::OBJ_ISLAND_LOD, 0x211, 0, 3); bool dAcOislandLOD_c::createHeap() { - lodModelIndex = params & 0xf; - void* data = getOarcResFile(dAcOislandLOD_c::resFilenames[lodModelIndex]); - resFile = nw4r::g3d::ResFile(data); - dStage_c::bindStageResToFile(&resFile); - dStage_c::bindSkyCmnToResFile(&resFile); - nw4r::g3d::ResMdl mdl = resFile.GetResMdl(dAcOislandLOD_c::resMdlNames[lodModelIndex]); + 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; }