From 4fd686d56d3dc50d83406dd2c9c32e6546e427be Mon Sep 17 00:00:00 2001 From: CovenEsme <84377742+CovenEsme@users.noreply.github.com> Date: Fri, 14 Mar 2025 04:40:02 +0000 Subject: [PATCH] d_a_obj_pumpkin_bar ok --- .../rels/d_a_obj_pumpkin_barNP/splits.txt | 2 + .../rels/d_a_obj_pumpkin_barNP/symbols.txt | 32 +++++++--- configure.py | 2 +- include/d/a/obj/d_a_obj_pumpkin_bar.h | 14 +++- include/d/col/bg/d_bg_w_base.h | 3 + src/REL/d/a/obj/d_a_obj_pumpkin_bar.cpp | 64 +++++++++++++++++++ 6 files changed, 105 insertions(+), 12 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_pumpkin_barNP/splits.txt b/config/SOUE01/rels/d_a_obj_pumpkin_barNP/splits.txt index 55f8a961..0dab6b7a 100644 --- a/config/SOUE01/rels/d_a_obj_pumpkin_barNP/splits.txt +++ b/config/SOUE01/rels/d_a_obj_pumpkin_barNP/splits.txt @@ -11,3 +11,5 @@ REL/executor.c: REL/d/a/obj/d_a_obj_pumpkin_bar.cpp: .text start:0x00000070 end:0x00000490 + .rodata start:0x00000000 end:0x00000020 + .data start:0x00000000 end:0x00000100 diff --git a/config/SOUE01/rels/d_a_obj_pumpkin_barNP/symbols.txt b/config/SOUE01/rels/d_a_obj_pumpkin_barNP/symbols.txt index 7ed586a7..5363aeb5 100644 --- a/config/SOUE01/rels/d_a_obj_pumpkin_barNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_pumpkin_barNP/symbols.txt @@ -2,16 +2,28 @@ _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 dAcOpumpkinBar_c_classInit__Fv = .text:0x00000070; // type:function size:0x6C -fn_391_E0 = .text:0x000000E0; // type:function size:0x7C -AcOpumpkinBar__initModels = .text:0x00000160; // type:function size:0x158 -AcOpumpkinBar__init = .text:0x000002C0; // type:function size:0xF4 -fn_391_3C0 = .text:0x000003C0; // type:function size:0x8 -fn_391_3D0 = .text:0x000003D0; // type:function size:0x8 -AcOpumpkinBar__draw = .text:0x000003E0; // type:function size:0x28 +barCollisionRideCallback__16dAcOpumpkinBar_cFP4dBgWP12dAcObjBase_cP12dAcObjBase_c = .text:0x000000E0; // type:function size:0x7C +createHeap__16dAcOpumpkinBar_cFv = .text:0x00000160; // type:function size:0x158 +create__16dAcOpumpkinBar_cFv = .text:0x000002C0; // type:function size:0xF4 +doDelete__16dAcOpumpkinBar_cFv = .text:0x000003C0; // type:function size:0x8 +actorExecute__16dAcOpumpkinBar_cFv = .text:0x000003D0; // type:function size:0x8 +draw__16dAcOpumpkinBar_cFv = .text:0x000003E0; // type:function size:0x28 __dt__16dAcOpumpkinBar_cFv = .text:0x00000410; // type:function size:0x80 _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -lbl_391_rodata_0 = .rodata:0x00000000; // type:object size:0x20 data:float -g_profile_OBJ_PUMPKIN_BAR = .data:0x00000000; // type:object size:0x60 -lbl_391_data_60 = .data:0x00000060; // type:object size:0x20 -AcOpumpkinBar__vtable = .data:0x00000080; // type:object size:0x80 +lbl_391_rodata_00 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float +lbl_391_rodata_04 = .rodata:0x00000004; // type:object size:0x4 scope:local data:float +lbl_391_rodata_08 = .rodata:0x00000008; // type:object size:0x4 scope:local data:float +lbl_391_rodata_0C = .rodata:0x0000000C; // type:object size:0x4 scope:local data:float +lbl_391_rodata_10 = .rodata:0x00000010; // type:object size:0x4 scope:local data:float +lbl_391_rodata_14 = .rodata:0x00000014; // type:object size:0x4 scope:local data:float +lbl_391_rodata_18 = .rodata:0x00000018; // type:object size:0x4 scope:local data:float +lbl_391_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local data:float +g_profile_OBJ_PUMPKIN_BAR = .data:0x00000000; // type:object size:0x10 +lbl_391_data_10 = .data:0x00000010; // type:object size:0x7 scope:local data:string +lbl_391_data_18 = .data:0x00000018; // type:object size:0xE scope:local data:string +lbl_391_data_28 = .data:0x00000028; // type:object size:0xE scope:local data:string +lbl_391_data_28 = .data:0x00000038; // type:object size:0x14 scope:local data:string +lbl_391_data_4C = .data:0x0000004C; // type:object size:0x14 scope:local data:string +lbl_391_data_60 = .data:0x00000060; // type:object size:0x1F scope:local data:string +__vt__16dAcOpumpkinBar_c = .data:0x00000080; // type:object size:0x80 diff --git a/configure.py b/configure.py index 73d9b554..7b6b6359 100644 --- a/configure.py +++ b/configure.py @@ -1524,7 +1524,7 @@ config.libs = [ NonMatching, "d_a_obj_propeller_lift", "REL/d/a/obj/d_a_obj_propeller_lift.cpp" ), Rel(NonMatching, "d_a_obj_propera", "REL/d/a/obj/d_a_obj_propera.cpp"), - Rel(NonMatching, "d_a_obj_pumpkin_bar", "REL/d/a/obj/d_a_obj_pumpkin_bar.cpp"), + 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"), diff --git a/include/d/a/obj/d_a_obj_pumpkin_bar.h b/include/d/a/obj/d_a_obj_pumpkin_bar.h index c1c06e63..bf6a1765 100644 --- a/include/d/a/obj/d_a_obj_pumpkin_bar.h +++ b/include/d/a/obj/d_a_obj_pumpkin_bar.h @@ -2,11 +2,23 @@ #define D_A_OBJ_PUMPKIN_BAR_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" class dAcOpumpkinBar_c : public dAcObjBase_c { public: + static void barCollisionRideCallback(dBgW *collider, dAcObjBase_c *actor, dAcObjBase_c *interactor); dAcOpumpkinBar_c() {} - virtual ~dAcOpumpkinBar_c() {} + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual ~dAcOpumpkinBar_c() override; + virtual int actorExecute() override; + + /* 0x330 */ m3d::smdl_c mModel; + /* 0x34C */ nw4r::g3d::ResFile mResFile; + /* 0x350 */ dBgW mBarCollision; + /* 0x560 */ dBgW mBarBirdCollision; private: }; diff --git a/include/d/col/bg/d_bg_w_base.h b/include/d/col/bg/d_bg_w_base.h index 43e0b1ef..554cc17a 100644 --- a/include/d/col/bg/d_bg_w_base.h +++ b/include/d/col/bg/d_bg_w_base.h @@ -200,6 +200,9 @@ public: u16 GetField_0x22() const { return field_0x22; } + void SetField_0x22(u16 val) { + field_0x22 = val; + } bool ChkStickWall() const { return field_0x24 & 1; diff --git a/src/REL/d/a/obj/d_a_obj_pumpkin_bar.cpp b/src/REL/d/a/obj/d_a_obj_pumpkin_bar.cpp index 8dbecdbb..90f046c8 100644 --- a/src/REL/d/a/obj/d_a_obj_pumpkin_bar.cpp +++ b/src/REL/d/a/obj/d_a_obj_pumpkin_bar.cpp @@ -1,3 +1,67 @@ #include "d/a/obj/d_a_obj_pumpkin_bar.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" + SPECIAL_ACTOR_PROFILE(OBJ_PUMPKIN_BAR, dAcOpumpkinBar_c, fProfile::OBJ_PUMPKIN_BAR, 0x1ED, 0, 3); + +void dAcOpumpkinBar_c::barCollisionRideCallback(dBgW *collider, dAcObjBase_c *actor, dAcObjBase_c *interactor) { + if (interactor->isActorPlayer() && actor != 0 && !StoryflagManager::sInstance->getCounterOrFlag(282)) { + StoryflagManager::sInstance->setFlag(282); + } +} + +bool dAcOpumpkinBar_c::createHeap() { + mResFile = nw4r::g3d::ResFile(getOarcResFile("IslBar")); + dStage_c::bindStageResToFile(&mResFile); + dStage_c::bindSkyCmnToResFile(&mResFile); + + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("IslBar"); + TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x120)); + + void *dzb = getOarcFile("IslBar", "dzb/IslBar.dzb"); + void *plc = getOarcFile("IslBar", "dat/IslBar.plc"); + updateMatrix(); + mModel.setLocalMtx(mWorldMtx); + TRY_CREATE(!mBarCollision.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale)); + mBarCollision.Lock(); + + dzb = getOarcFile("IslBar", "dzb/IslBar_Bird.dzb"); + plc = getOarcFile("IslBar", "dat/IslBar_Bird.plc"); + TRY_CREATE(!mBarBirdCollision.Set((cBgD_t *)dzb, (PLC *)plc, cBgW::MOVE_BG_e, &mWorldMtx, &mScale)); + mBarBirdCollision.Lock(); + return true; +} + +int dAcOpumpkinBar_c::create() { + CREATE_ALLOCATOR(dAcOpumpkinBar_c); + dBgS::GetInstance()->Regist(&mBarCollision, this); + dBgS::GetInstance()->Regist(&mBarBirdCollision, this); + mBarBirdCollision.SetField_0x22(2); + mModel.setPriorityDraw(0x1C, 0x9); + // 100000.0 is in the rodata and the instructions need it. + // This also works if a separate variable is used but I + // think it's more likely that mCullingDistance got set twice. + mCullingDistance = 100000.0; + boundingBox.Set(mVec3_c(-2790.0f, -1450.0f, -8270.0f), mVec3_c(2880.0f, 2120.0f, 1370.0f)); + mCullingDistance = 500000.0; + mBarCollision.SetRideCallback(barCollisionRideCallback); + return SUCCEEDED; +} + +int dAcOpumpkinBar_c::doDelete() { + return SUCCEEDED; +} + +int dAcOpumpkinBar_c::actorExecute() { + return SUCCEEDED; +} + +int dAcOpumpkinBar_c::draw() { + drawModelType1(&mModel); + return SUCCEEDED; +} + +dAcOpumpkinBar_c::~dAcOpumpkinBar_c() {}