diff --git a/config/SOUE01/rels/d_a_obj_puzzle_islandNP/symbols.txt b/config/SOUE01/rels/d_a_obj_puzzle_islandNP/symbols.txt index 6e30c79a..739e8b01 100644 --- a/config/SOUE01/rels/d_a_obj_puzzle_islandNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_puzzle_islandNP/symbols.txt @@ -2,16 +2,16 @@ _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 dAcOpuzzleIsland_c_classInit__Fv = .text:0x00000070; // type:function size:0x64 -AcOpuzzleIsland__bgInteractFunc = .text:0x000000E0; // type:function size:0x7C -AcOpuzzleIsland__initModels = .text:0x00000160; // type:function size:0x10C -AcOpuzzleIsland__init = .text:0x00000270; // type:function size:0xD4 -fn_369_350 = .text:0x00000350; // type:function size:0x8 -AcOpuzzleIsland__update = .text:0x00000360; // type:function size:0x28 -fn_369_390 = .text:0x00000390; // type:function size:0x28 +rideCallback__18dAcOpuzzleIsland_cFP4dBgWP12dAcObjBase_cP12dAcObjBase_c = .text:0x000000E0; // type:function size:0x7C +createHeap__18dAcOpuzzleIsland_cFv = .text:0x00000160; // type:function size:0x10C +create__18dAcOpuzzleIsland_cFv = .text:0x00000270; // type:function size:0xD4 +doDelete__18dAcOpuzzleIsland_cFv = .text:0x00000350; // type:function size:0x8 +actorExecute__18dAcOpuzzleIsland_cFv = .text:0x00000360; // type:function size:0x28 +draw__18dAcOpuzzleIsland_cFv = .text:0x00000390; // type:function size:0x28 __dt__18dAcOpuzzleIsland_cFv = .text:0x000003C0; // type:function size:0x74 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global lbl_369_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float g_profile_OBJ_PUZZLE_ISLAND = .data:0x00000000; // type:object size:0x38 lbl_369_data_38 = .data:0x00000038; // type:object size:0x20 data:string -AcOpuzzleIsland__vtable = .data:0x00000058; // type:object size:0x80 +__vt__18dAcOpuzzleIsland_c = .data:0x00000058; // type:object size:0x80 diff --git a/configure.py b/configure.py index f923d459..17ee0140 100644 --- a/configure.py +++ b/configure.py @@ -2180,7 +2180,7 @@ config.libs = [ Rel(Matching, "d_a_obj_pumpkin_bar", "REL/d/a/obj/d_a_obj_pumpkin_bar.cpp"), Rel(Matching, "d_a_obj_pumpkin_leaf", "REL/d/a/obj/d_a_obj_pumpkin_leaf.cpp"), Rel(NonMatching, "d_a_obj_push_block", "REL/d/a/obj/d_a_obj_push_block.cpp"), - Rel(NonMatching, "d_a_obj_puzzle_island", "REL/d/a/obj/d_a_obj_puzzle_island.cpp"), + Rel(Matching, "d_a_obj_puzzle_island", "REL/d/a/obj/d_a_obj_puzzle_island.cpp"), Rel(NonMatching, "d_a_obj_rail_end", "REL/d/a/obj/d_a_obj_rail_end.cpp"), Rel(Matching, "d_a_obj_rail_post", "REL/d/a/obj/d_a_obj_rail_post.cpp"), Rel(NonMatching, "d_a_obj_ride_rock", "REL/d/a/obj/d_a_obj_ride_rock.cpp"), diff --git a/include/d/a/obj/d_a_obj_puzzle_island.h b/include/d/a/obj/d_a_obj_puzzle_island.h index 9300e35f..480712b9 100644 --- a/include/d/a/obj/d_a_obj_puzzle_island.h +++ b/include/d/a/obj/d_a_obj_puzzle_island.h @@ -2,13 +2,26 @@ #define D_A_OBJ_PUZZLE_ISLAND_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "m/m3d/m_smdl.h" class dAcOpuzzleIsland_c : public dAcObjBase_c { public: dAcOpuzzleIsland_c() {} virtual ~dAcOpuzzleIsland_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + + static void rideCallback(dBgW *, dAcObjBase_c *, dAcObjBase_c *); + private: + /* 0x330 */ m3d::smdl_c mMdl; + /* 0x34C */ nw4r::g3d::ResFile mResFile; + /* 0x350 */ dBgW mBgW; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_puzzle_island.cpp b/src/REL/d/a/obj/d_a_obj_puzzle_island.cpp index c823a141..0a5a9264 100644 --- a/src/REL/d/a/obj/d_a_obj_puzzle_island.cpp +++ b/src/REL/d/a/obj/d_a_obj_puzzle_island.cpp @@ -1,3 +1,63 @@ #include "d/a/obj/d_a_obj_puzzle_island.h" +#include "common.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/d_stage.h" +#include "d/flag/storyflag_manager.h" +#include "f/f_base.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" + SPECIAL_ACTOR_PROFILE(OBJ_PUZZLE_ISLAND, dAcOpuzzleIsland_c, fProfile::OBJ_PUZZLE_ISLAND, 0x1D6, 0, 3); + +void dAcOpuzzleIsland_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *interactor) { + if (interactor->isActorPlayer() && actor != nullptr && StoryflagManager::sInstance->getCounterOrFlag(0x11d) == 0) { + StoryflagManager::sInstance->setFlag(0x11d); + } + return; +} + +bool dAcOpuzzleIsland_c::createHeap() { + void *data = getOarcResFile("IslPuz"); + mResFile = nw4r::g3d::ResFile(data); + dStage_c::bindStageResToFile(&mResFile); + dStage_c::bindSkyCmnToResFile(&mResFile); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("IslPuz"); + TRY_CREATE(mMdl.create(mdl, &heap_allocator, 0x120, 1, nullptr)); + void *dzb = dAcObjBase_c::getOarcFile("IslPuz", "dzb/IslPuz.dzb"); + void *plc = dAcObjBase_c::getOarcFile("IslPuz", "dat/IslPuz.plc"); + updateMatrix(); + mMdl.setScale(mScale); + mMdl.setLocalMtx(mWorldMtx); + TRY_CREATE(!mBgW.Set((cBgD_t *)dzb, (PLC *)plc, 1, &mWorldMtx, &mScale)); + mBgW.Lock(); + return true; +} + +int dAcOpuzzleIsland_c::create() { + CREATE_ALLOCATOR(dAcOpuzzleIsland_c); + mBgW.SetCrrFunc(dBgS_MoveBGProc_Typical); + dBgS::GetInstance()->Regist(&mBgW, this); + mMdl.setPriorityDraw(0x1c, 9); + mVec3_c min, max; + mMdl.getBounds(&min, &max); + boundingBox.Set(min, max); + mCullingDistance = 500000.0; + mBgW.SetRideCallback(rideCallback); + return SUCCEEDED; +} + +int dAcOpuzzleIsland_c::doDelete() { + return SUCCEEDED; +} + +int dAcOpuzzleIsland_c::actorExecute() { + mBgW.Move(); + return SUCCEEDED; +} + +int dAcOpuzzleIsland_c::draw() { + drawModelType1(&mMdl); + return SUCCEEDED; +}