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 3b2c0ed3..29556192 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_fence_boko.h b/include/d/a/obj/d_a_obj_fence_boko.h index 9bc69e21..f44432ed 100644 --- a/include/d/a/obj/d_a_obj_fence_boko.h +++ b/include/d/a/obj/d_a_obj_fence_boko.h @@ -14,12 +14,11 @@ public: virtual ~dAcOfenceBoko_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; /* 0x350 */ dBgW mCollision; /* 0x560 */ bool field_0x560; - -private: }; #endif diff --git a/include/d/a/obj/d_a_obj_fence_boko2.h b/include/d/a/obj/d_a_obj_fence_boko2.h index f270c1b9..2c638ba2 100644 --- a/include/d/a/obj/d_a_obj_fence_boko2.h +++ b/include/d/a/obj/d_a_obj_fence_boko2.h @@ -14,11 +14,10 @@ public: virtual ~dAcOfenceBoko2_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; /* 0x350 */ dBgW mCollision; - -private: }; #endif diff --git a/include/d/a/obj/d_a_obj_fence_konsai.h b/include/d/a/obj/d_a_obj_fence_konsai.h index a72fc500..b2c69670 100644 --- a/include/d/a/obj/d_a_obj_fence_konsai.h +++ b/include/d/a/obj/d_a_obj_fence_konsai.h @@ -14,11 +14,10 @@ public: virtual ~dAcOfenceKonsai_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; /* 0x350 */ dBgW mCollision; - -private: }; #endif diff --git a/include/d/a/obj/d_a_obj_iron_stage.h b/include/d/a/obj/d_a_obj_iron_stage.h index a27a5758..bc2a4933 100644 --- a/include/d/a/obj/d_a_obj_iron_stage.h +++ b/include/d/a/obj/d_a_obj_iron_stage.h @@ -16,11 +16,10 @@ public: virtual ~dAcOironStage_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; /* 0x350 */ dBgW mCollision; - -private: }; #endif 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..083342b1 100644 --- a/include/d/a/obj/d_a_obj_pumpkin_bar.h +++ b/include/d/a/obj/d_a_obj_pumpkin_bar.h @@ -2,13 +2,24 @@ #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; private: + /* 0x330 */ m3d::smdl_c mModel; + /* 0x34C */ nw4r::g3d::ResFile mResFile; + /* 0x350 */ dBgW mBarCollision; + /* 0x560 */ dBgW mBarBirdCollision; }; #endif diff --git a/include/d/a/obj/d_a_obj_shrine_after.h b/include/d/a/obj/d_a_obj_shrine_after.h index 3b20746e..38bda595 100644 --- a/include/d/a/obj/d_a_obj_shrine_after.h +++ b/include/d/a/obj/d_a_obj_shrine_after.h @@ -13,10 +13,9 @@ public: virtual ~dAcOshrineAfter_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; - -private: }; #endif diff --git a/include/d/a/obj/d_a_obj_shrine_bef_inside.h b/include/d/a/obj/d_a_obj_shrine_bef_inside.h index c6d9f64c..18b1b3c6 100644 --- a/include/d/a/obj/d_a_obj_shrine_bef_inside.h +++ b/include/d/a/obj/d_a_obj_shrine_bef_inside.h @@ -14,11 +14,10 @@ public: virtual ~dAcOshrineBefInside_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel[2]; /* 0x36C */ dBgW mCollision; - -private: }; #endif diff --git a/include/d/a/obj/d_a_obj_shrine_before.h b/include/d/a/obj/d_a_obj_shrine_before.h index 6930e772..4c470a69 100644 --- a/include/d/a/obj/d_a_obj_shrine_before.h +++ b/include/d/a/obj/d_a_obj_shrine_before.h @@ -13,10 +13,9 @@ public: virtual ~dAcOshrineBefore_c() {} virtual int actorExecute() override; +private: /* 0x330 */ nw4r::g3d::ResFile mResFile; /* 0x334 */ m3d::smdl_c mModel; - -private: }; #endif 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_fence_boko.cpp b/src/REL/d/a/obj/d_a_obj_fence_boko.cpp index 854552be..2ac61e55 100644 --- a/src/REL/d/a/obj/d_a_obj_fence_boko.cpp +++ b/src/REL/d/a/obj/d_a_obj_fence_boko.cpp @@ -27,7 +27,7 @@ int dAcOfenceBoko_c::create() { roomid = mCollision.mRoomId; mModel.setPriorityDraw(0x1C, 0x9); boundingBox.Set(mVec3_c(-210.0f, -10.0f, -20.0f), mVec3_c(210.0f, 340.0f, 20.0f)); - mCullingDistance = 50000.0; + mCullingDistance = 50000.0f; return SUCCEEDED; } diff --git a/src/REL/d/a/obj/d_a_obj_fence_boko2.cpp b/src/REL/d/a/obj/d_a_obj_fence_boko2.cpp index 8792f07a..f55c87b1 100644 --- a/src/REL/d/a/obj/d_a_obj_fence_boko2.cpp +++ b/src/REL/d/a/obj/d_a_obj_fence_boko2.cpp @@ -23,7 +23,7 @@ int dAcOfenceBoko2_c::create() { dBgS::GetInstance()->RegistBg(&mCollision, this); mModel.setPriorityDraw(0x1C, 0x9); boundingBox.Set(mVec3_c(-160.0f, -40.0f, -70.0f), mVec3_c(180.0f, 300.0f, 60.0f)); - mCullingDistance = 50000.0; + mCullingDistance = 50000.0f; return SUCCEEDED; } diff --git a/src/REL/d/a/obj/d_a_obj_iron_stage.cpp b/src/REL/d/a/obj/d_a_obj_iron_stage.cpp index 9ee35a1f..e4f2b57e 100644 --- a/src/REL/d/a/obj/d_a_obj_iron_stage.cpp +++ b/src/REL/d/a/obj/d_a_obj_iron_stage.cpp @@ -23,7 +23,7 @@ int dAcOironStage_c::create() { dBgS::GetInstance()->Regist(&mCollision, this); mModel.setPriorityDraw(0x1C, 0x9); boundingBox.Set(mVec3_c(-460.0f, -210.0f, -260.0f), mVec3_c(460.0f, 210.0f, 260.0f)); - mCullingDistance = 15000.0; + mCullingDistance = 15000.0f; return SUCCEEDED; } 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..42d95a42 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.0f; + boundingBox.Set(mVec3_c(-2790.0f, -1450.0f, -8270.0f), mVec3_c(2880.0f, 2120.0f, 1370.0f)); + mCullingDistance = 500000.0f; + 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() {} diff --git a/src/REL/d/a/obj/d_a_obj_shrine_after.cpp b/src/REL/d/a/obj/d_a_obj_shrine_after.cpp index 4796600c..782c3883 100644 --- a/src/REL/d/a/obj/d_a_obj_shrine_after.cpp +++ b/src/REL/d/a/obj/d_a_obj_shrine_after.cpp @@ -15,7 +15,7 @@ int dAcOshrineAfter_c::create() { mModel.setLocalMtx(mWorldMtx); mModel.setPriorityDraw(0x1C, 0x9); boundingBox.Set(mVec3_c(-4000.0f, 7000.0f, 5000.0f), mVec3_c(5000.0f, 15000.0f, 14000.0f)); - mCullingDistance = 50000.0; + mCullingDistance = 50000.0f; return SUCCEEDED; } diff --git a/src/REL/d/a/obj/d_a_obj_shrine_before.cpp b/src/REL/d/a/obj/d_a_obj_shrine_before.cpp index 9bca3319..441a93fd 100644 --- a/src/REL/d/a/obj/d_a_obj_shrine_before.cpp +++ b/src/REL/d/a/obj/d_a_obj_shrine_before.cpp @@ -15,7 +15,7 @@ int dAcOshrineBefore_c::create() { mModel.setLocalMtx(mWorldMtx); mModel.setPriorityDraw(0x1C, 0x9); boundingBox.Set(mVec3_c(-4000.0f, 7000.0f, 5000.0f), mVec3_c(4000.0f, 13000.0f, 14000.0f)); - mCullingDistance = 50000.0; + mCullingDistance = 50000.0f; return SUCCEEDED; } diff --git a/src/egg/core/eggController.cpp b/src/egg/core/eggController.cpp index b73a02a4..bcc0c551 100644 --- a/src/egg/core/eggController.cpp +++ b/src/egg/core/eggController.cpp @@ -8,7 +8,6 @@ #include "rvl/VI.h" // IWYU pragma: export #include "string.h" - EGG::NullController null_controller; namespace EGG { @@ -63,8 +62,8 @@ CoreController::CoreController() : mDpdPos(), mAccel(), mAccelFlags(), mFlag(0) void CoreController::sceneReset() { mAccel.set(0.0, 0.0, 0.0); - mDpdPos.x = 0.0; - mDpdPos.y = 0.0; + mDpdPos.x = 0.0f; + mDpdPos.y = 0.0f; mIdleTime = 0; mPostureMatrixPrev.makeIdentity(); mPostureMatrix.makeIdentity(); @@ -286,7 +285,7 @@ void CoreController::endFrame() { /* 0x80499AC0 */ f32 CoreController::getFreeStickX() const { if (mCoreStatus->getDevType() == WPAD_DEV_CORE) { - return 0.0; + return 0.0f; } return mCoreStatus[0].getFSStickX(); } @@ -294,7 +293,7 @@ f32 CoreController::getFreeStickX() const { /* 0x80499AE0 */ f32 CoreController::getFreeStickY() const { if (mCoreStatus->getDevType() == WPAD_DEV_CORE) { - return 0.0; + return 0.0f; } return mCoreStatus[0].getFSStickY(); } @@ -429,8 +428,8 @@ void ControllerRumbleUnit::init() { mPattern = nullptr; mPatternPos = nullptr; mTimer = 0; - mIntensity = 0.0; - mRampUp = 0.0; + mIntensity = 0.0f; + mRampUp = 0.0f; mFlag.makeAllZero(); }