From 3ca82f7e9cc4cd549ecd7b16fb660fdd4f4f5301 Mon Sep 17 00:00:00 2001 From: Swekka Date: Mon, 7 Jul 2025 12:26:55 +0200 Subject: [PATCH] d_a_obj_cloud_dive 93% --- .../rels/d_a_obj_cloud_diveNP/symbols.txt | 42 +++---- config/SOUE01/symbols.txt | 2 +- include/d/a/d_a_item.h | 1 + include/d/a/obj/d_a_obj_cloud_dive.h | 26 ++++- src/REL/d/a/obj/d_a_obj_cloud_dive.cpp | 107 +++++++++++++++++- 5 files changed, 152 insertions(+), 26 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_cloud_diveNP/symbols.txt b/config/SOUE01/rels/d_a_obj_cloud_diveNP/symbols.txt index 539b47fb..cbb28fc2 100644 --- a/config/SOUE01/rels/d_a_obj_cloud_diveNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_cloud_diveNP/symbols.txt @@ -8,21 +8,21 @@ __dt__28sFState_c<15dAcOcloudDive_c>Fv = .text:0x000001C0; // type:function size __dt__31sFStateFct_c<15dAcOcloudDive_c>Fv = .text:0x00000220; // type:function size:0x6C __dt__84sStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000290; // type:function size:0xA0 __dt__54sFStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000330; // type:function size:0xA4 -fn_350_3E0 = .text:0x000003E0; // type:function size:0x8 -fn_350_3F0 = .text:0x000003F0; // type:function size:0x120 +createHeap__15dAcOcloudDive_cFv = .text:0x000003E0; // type:function size:0x8 +create__15dAcOcloudDive_cFv = .text:0x000003F0; // type:function size:0x120 changeState__84sStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000510; // type:function size:0x10 -fn_350_520 = .text:0x00000520; // type:function size:0x8 -fn_350_530 = .text:0x00000530; // type:function size:0xB8 +doDelete__15dAcOcloudDive_cFv = .text:0x00000520; // type:function size:0x8 +actorExecute__15dAcOcloudDive_cFv = .text:0x00000530; // type:function size:0xB8 executeState__84sStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000005F0; // type:function size:0x10 -fn_350_600 = .text:0x00000600; // type:function size:0x8 +draw__15dAcOcloudDive_cFv = .text:0x00000600; // type:function size:0x8 initializeState_Wait__15dAcOcloudDive_cFv = .text:0x00000610; // type:function size:0x4 executeState_Wait__15dAcOcloudDive_cFv = .text:0x00000620; // type:function size:0x8C finalizeState_Wait__15dAcOcloudDive_cFv = .text:0x000006B0; // type:function size:0x4 initializeState_Dead__15dAcOcloudDive_cFv = .text:0x000006C0; // type:function size:0x4 executeState_Dead__15dAcOcloudDive_cFv = .text:0x000006D0; // type:function size:0x4 finalizeState_Dead__15dAcOcloudDive_cFv = .text:0x000006E0; // type:function size:0x4 -fn_350_6F0 = .text:0x000006F0; // type:function size:0x6C -fn_350_760 = .text:0x00000760; // type:function size:0xDC +fn_350_6F0__15dAcOcloudDive_cFv = .text:0x000006F0; // type:function size:0x6C +fn_350_760__15dAcOcloudDive_cFv = .text:0x00000760; // type:function size:0xDC __dt__15dAcOcloudDive_cFv = .text:0x00000840; // type:function size:0xD8 getStateID__84sStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000920; // type:function size:0x10 build__31sFStateFct_c<15dAcOcloudDive_c>FRC12sStateIDIf_c = .text:0x00000930; // type:function size:0x60 @@ -45,19 +45,19 @@ isSameName__30sFStateID_c<15dAcOcloudDive_c>CFPCc = .text:0x00000D10; // type:fu _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_350_rodata_0 = .rodata:0x00000000; // type:object size:0x20 data:float -lbl_350_rodata_20 = .rodata:0x00000020; // type:object size:0x4 align:4 data:float -lbl_350_rodata_24 = .rodata:0x00000024; // type:object size:0x4 align:4 data:float +lbl_350_rodata_0 = .rodata:0x00000000; // type:object size:0x20 scope:local data:float +lbl_350_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local align:4 data:float +lbl_350_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local align:4 data:float g_profile_OBJ_CLOUD_DIVE = .data:0x00000000; // type:object size:0x10 data:4byte -lbl_350_data_10 = .data:0x00000010; // type:object size:0x30 -lbl_350_data_40 = .data:0x00000040; // type:object size:0x20 -lbl_350_data_60 = .data:0x00000060; // type:object size:0x80 -lbl_350_data_E0 = .data:0x000000E0; // type:object size:0x30 -lbl_350_data_110 = .data:0x00000110; // type:object size:0x30 -lbl_350_data_140 = .data:0x00000140; // type:object size:0x18 -lbl_350_data_158 = .data:0x00000158; // type:object size:0xA0 -lbl_350_data_1F8 = .data:0x000001F8; // type:object size:0x34 +lbl_350_data_10 = .data:0x00000010; // type:object size:0x30 scope:local +lbl_350_data_40 = .data:0x00000040; // type:object size:0x20 scope:local +__vt__15dAcOcloudDive_c = .data:0x00000060; // type:object size:0x80 +__vt__54sFStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c> = .data:0x000000E0; // type:object size:0x30 +__vt__84sStateMgr_c<15dAcOcloudDive_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000110; // type:object size:0x30 +lbl_350_data_140 = .data:0x00000140; // type:object size:0x18 scope:local +lbl_350_data_158 = .data:0x00000158; // type:object size:0xA0 scope:local +__vt__30sFStateID_c<15dAcOcloudDive_c> = .data:0x000001F8; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_350_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_350_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_350_bss_58 = .bss:0x00000058; // type:object size:0x30 data:4byte +lbl_350_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte +lbl_350_bss_18 = .bss:0x00000018; // type:object size:0x40 scope:local data:4byte +lbl_350_bss_58 = .bss:0x00000058; // type:object size:0x30 scope:local data:4byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index b148b49f..bf8eb231 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13365,7 +13365,7 @@ spawnItem2 = .text:0x80248930; // type:function size:0xBC fn_802489F0 = .text:0x802489F0; // type:function size:0x298 spawnDrop = .text:0x80248C90; // type:function size:0x3D0 giveItem2 = .text:0x80249060; // type:function size:0x84 -giveItem22 = .text:0x802490F0; // type:function size:0x4 +giveItem22__9dAcItem_cF7ITEM_IDll = .text:0x802490F0; // type:function size:0x4 fn_80249100 = .text:0x80249100; // type:function size:0x44 giveItem3 = .text:0x80249150; // type:function size:0x60 fn_802491B0 = .text:0x802491B0; // type:function size:0x54 diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 00349711..25bdf8f5 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -46,6 +46,7 @@ public: static void spawnItem(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot, u32 params, u32 arg); static void spawnDrop(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot); + static void giveItem22(ITEM_ID, s32, s32); static void giveItem(ITEM_ID, s32, s32); static u32 checkFlag(u32 flag); static bool hasItem(u32 flag) { diff --git a/include/d/a/obj/d_a_obj_cloud_dive.h b/include/d/a/obj/d_a_obj_cloud_dive.h index c13b75f9..419a9ad7 100644 --- a/include/d/a/obj/d_a_obj_cloud_dive.h +++ b/include/d/a/obj/d_a_obj_cloud_dive.h @@ -2,19 +2,41 @@ #define D_A_OBJ_CLOUD_DIVE_H #include "d/a/obj/d_a_obj_base.h" +#include "d/col/cc/d_cc_d.h" +#include "m/m3d/m_smdl.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dAcOcloudDive_c : public dAcObjBase_c { public: dAcOcloudDive_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOcloudDive_c() {} + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; + STATE_FUNC_DECLARE(dAcOcloudDive_c, Wait); STATE_FUNC_DECLARE(dAcOcloudDive_c, Dead); private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOcloudDive_c); + bool fn_350_6F0(); + bool fn_350_760(); + + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dCcD_Cyl mCollider; + /* 0x4A0 */ STATE_MGR_DECLARE(dAcOcloudDive_c); + /* 0x4DC */ u8 field_0x4DC; + /* 0x4DD */ u8 mItemID; + /* 0x4E0 */ f32 mRadius; + + static const f32 mRadius1; + static const f32 mRadius2; + static const f32 lbl_350_rodata_8; + static dCcD_SrcCyl sCylSrc; }; #endif diff --git a/src/REL/d/a/obj/d_a_obj_cloud_dive.cpp b/src/REL/d/a/obj/d_a_obj_cloud_dive.cpp index df3e3ac6..598918fa 100644 --- a/src/REL/d/a/obj/d_a_obj_cloud_dive.cpp +++ b/src/REL/d/a/obj/d_a_obj_cloud_dive.cpp @@ -1,13 +1,116 @@ #include "d/a/obj/d_a_obj_cloud_dive.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/cc/d_cc_s.h" +#include "egg/math/eggMath.h" +#include "f/f_base.h" +#include "m/m_vec.h" + SPECIAL_ACTOR_PROFILE(OBJ_CLOUD_DIVE, dAcOcloudDive_c, fProfile::OBJ_CLOUD_DIVE, 0x1C2, 0, 0); +const f32 dAcOcloudDive_c::mRadius1 = 100.0f; +const f32 dAcOcloudDive_c::mRadius2 = 200.0f; +const f32 dAcOcloudDive_c::lbl_350_rodata_8 = 40.0f; + +dCcD_SrcCyl dAcOcloudDive_c::sCylSrc = { + /* mObjInf */ + {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ + {AT_TYPE_BOMB, 0x111, {0, 0, 0x407}, 0, 0}, + /* mObjCo */ {0}}, + /* mCylInf */ + {100.f, 10.f} +}; + STATE_DEFINE(dAcOcloudDive_c, Wait); STATE_DEFINE(dAcOcloudDive_c, Dead); +bool dAcOcloudDive_c::createHeap() { + return true; +} + +int dAcOcloudDive_c::create() { + CREATE_ALLOCATOR(dAcOcloudDive_c); + mStts.mRank = 0xD; + mCollider.Set(sCylSrc); + mCollider.mStts = &mStts; + field_0x4DC = getFromParams(0, 3); + mItemID = getFromParams(2, 0xFF); + if ((u16)getFromParams(2, 0xFF) == 0xFF) { + mItemID = 0; + } + if (field_0x4DC == 1) { + mRadius = mRadius2; + } else { + mRadius = mRadius1; + } + updateMatrix(); + mStateMgr.changeState(StateID_Wait); + boundingBox.Set(mVec3_c(-0.0f, -0.0f, -0.0f), mVec3_c(0.0f, 0.0f, 0.0f)); + return SUCCEEDED; +} + +int dAcOcloudDive_c::doDelete() { + return SUCCEEDED; +} + +int dAcOcloudDive_c::actorExecute() { + mStateMgr.executeState(); + mCollider.SetR(mRadius); + mCollider.SetH(40.0f); + mVec3_c fStack = position - mVec3_c(0.0f, 20.0f, 0.0f); + mCollider.SetC(fStack); + dCcS::GetInstance()->Set(&mCollider); + return SUCCEEDED; +} + +int dAcOcloudDive_c::draw() { + return SUCCEEDED; +} + void dAcOcloudDive_c::initializeState_Wait() {} -void dAcOcloudDive_c::executeState_Wait() {} + +void dAcOcloudDive_c::executeState_Wait() { + if (fn_350_6F0()) { + mStateMgr.changeState(StateID_Wait); + } + if (fn_350_760()) { + dAcItem_c::giveItem22((ITEM_ID)mItemID, 0, -1); + mStateMgr.changeState(StateID_Wait); + } +} + void dAcOcloudDive_c::finalizeState_Wait() {} -void dAcOcloudDive_c::initializeState_Dead() {} + +void dAcOcloudDive_c::initializeState_Dead() { + deleteRequest(); +} + void dAcOcloudDive_c::executeState_Dead() {} void dAcOcloudDive_c::finalizeState_Dead() {} + +bool dAcOcloudDive_c::fn_350_6F0() { + return mCollider.mTg.mRPrm & 1 && mCollider.mTg.GetActor() != nullptr && mCollider.ChkTgAtHitType(0x20); +} + +bool dAcOcloudDive_c::fn_350_760() { + mVec3_c deltaPosition = dAcPy_c::GetLink()->position - position; + f32 distance = EGG::Math::sqrt(deltaPosition.squareMagXZ()); + + // return distance <= mRadius && deltaPosition.y <= 20.0f && deltaPosition.y >= -20.0f; + + bool temp = false; + if (distance <= mRadius) { + if (deltaPosition.y <= 20.0f) { + temp = true; + } + } + if (temp) { + if (deltaPosition.y >= -20.0f) { + return true; + } + } + return false; +}