From e696b17adbe5754a68262a63428a36680af50a66 Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sat, 15 Nov 2025 20:48:18 -0500 Subject: [PATCH] init --- .../SOUE01/rels/d_a_obj_barrelNP/symbols.txt | 31 +- include/d/a/d_a_base.h | 2 +- include/d/a/obj/d_a_obj_barrel.h | 156 +++++- include/d/col/c/c_bg_s_chk.h | 4 + include/d/col/c/c_cc_d.h | 10 +- include/f/f_manager.h | 4 +- include/m/m_angle.h | 4 + include/toBeSorted/attention.h | 44 +- include/toBeSorted/event_manager.h | 2 +- src/REL/d/a/obj/d_a_obj_barrel.cpp | 527 +++++++++++++++++- src/REL/d/a/obj/d_a_obj_seat_sword.cpp | 2 +- src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 2 +- src/d/a/d_a_base.cpp | 3 +- src/d/a/d_a_salbage_obj.cpp | 2 +- 14 files changed, 739 insertions(+), 54 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt index 2b753f7f..0f3f601b 100644 --- a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt @@ -10,7 +10,7 @@ __dt__28sFStateFct_c<12dAcOBarrel_c>Fv = .text:0x00000320; // type:function size __dt__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000390; // type:function size:0xA0 __dt__51sFStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000430; // type:function size:0xA4 fn_293_4E0 = .text:0x000004E0; // type:function size:0x5C -fn_293_540 = .text:0x00000540; // type:function size:0xAC +createHeap__12dAcOBarrel_cFv = .text:0x00000540; // type:function size:0xAC fn_293_5F0 = .text:0x000005F0; // type:function size:0x5B0 changeState__81sStateMgr_c<12dAcOBarrel_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000BA0; // type:function size:0x10 fn_293_BB0 = .text:0x00000BB0; // type:function size:0x248 @@ -138,15 +138,26 @@ lbl_293_data_200 = .data:0x00000200; // type:object size:0xC lbl_293_data_20C = .data:0x0000020C; // type:object size:0x2A8 lbl_293_data_4B4 = .data:0x000004B4; // type:object size:0x34 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_293_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -lbl_293_bss_18 = .bss:0x00000018; // type:object size:0x40 data:4byte -lbl_293_bss_58 = .bss:0x00000058; // type:object size:0x80 data:4byte -lbl_293_bss_D8 = .bss:0x000000D8; // type:object size:0x40 data:4byte -lbl_293_bss_118 = .bss:0x00000118; // type:object size:0x80 data:4byte -lbl_293_bss_198 = .bss:0x00000198; // type:object size:0x40 data:4byte -lbl_293_bss_1D8 = .bss:0x000001D8; // type:object size:0x40 data:4byte -lbl_293_bss_218 = .bss:0x00000218; // type:object size:0x40 data:4byte -lbl_293_bss_258 = .bss:0x00000258; // type:object size:0x30 data:4byte +@16558 = .bss:0x00000008; // type:object size:0xC scope:local data:4byte +StateID_Wait__12dAcOBarrel_c = .bss:0x00000018; // type:object size:0x30 data:4byte +@16562 = .bss:0x00000048; // type:object size:0xC scope:local data:4byte +StateID_Grab__12dAcOBarrel_c = .bss:0x00000058; // type:object size:0x30 data:4byte +@16566 = .bss:0x00000088; // type:object size:0xC scope:local data:4byte +StateID_GrabUp__12dAcOBarrel_c = .bss:0x00000098; // type:object size:0x30 data:4byte +@16570 = .bss:0x000000C8; // type:object size:0xC scope:local data:4byte +StateID_GrabPut__12dAcOBarrel_c = .bss:0x000000D8; // type:object size:0x30 data:4byte +@16574 = .bss:0x00000108; // type:object size:0xC scope:local data:4byte +StateID_Slope__12dAcOBarrel_c = .bss:0x00000118; // type:object size:0x30 data:4byte +@16578 = .bss:0x00000148; // type:object size:0xC scope:local data:4byte +StateID_Water__12dAcOBarrel_c = .bss:0x00000158; // type:object size:0x30 data:4byte +@16582 = .bss:0x00000188; // type:object size:0xC scope:local data:4byte +StateID_Water2__12dAcOBarrel_c = .bss:0x00000198; // type:object size:0x30 data:4byte +@16586 = .bss:0x000001C8; // type:object size:0xC scope:local data:4byte +StateID_Explode__12dAcOBarrel_c = .bss:0x000001D8; // type:object size:0x30 data:4byte +@16590 = .bss:0x00000208; // type:object size:0xC scope:local data:4byte +StateID_KrakenBorn__12dAcOBarrel_c = .bss:0x00000218; // type:object size:0x30 data:4byte +@16594 = .bss:0x00000248; // type:object size:0xC scope:local data:4byte +StateID_Rebirth__12dAcOBarrel_c = .bss:0x00000258; // type:object size:0x30 data:4byte lbl_293_bss_288 = .bss:0x00000288; // type:object size:0x8 data:byte lbl_293_bss_290 = .bss:0x00000290; // type:object size:0x10 align:4 data:float lbl_293_bss_2A0 = .bss:0x000002A0; // type:object size:0x1 data:byte diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 9c0c85cb..559d7046 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -120,7 +120,7 @@ public: /* vt 0x64 */ virtual bool restorePosRotFromCopy(); /* vt 0x68 */ virtual void registerInEvent(); /* vt 0x6C */ virtual void unkVirtFunc_0x6C(); - /* vt 0x70 */ virtual void doInteraction(s32); + /* vt 0x70 */ virtual void doInteraction(s32 /* InteractionType */); public: dAcBase_c(); diff --git a/include/d/a/obj/d_a_obj_barrel.h b/include/d/a/obj/d_a_obj_barrel.h index 67ecc6b6..40eb2cbf 100644 --- a/include/d/a/obj/d_a_obj_barrel.h +++ b/include/d/a/obj/d_a_obj_barrel.h @@ -1,15 +1,99 @@ #ifndef D_A_OBJ_BARREL_H #define D_A_OBJ_BARREL_H +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/c/c_bg_s_poly_info.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "d/flag/sceneflag_manager.h" +#include "m/m3d/m_smdl.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/time_area_mgr.h" + +class dAcNpcCeLady_c; +class dAcNpcCeFriend_c; class dAcOBarrel_c : public dAcObjBase_c { public: + enum Type { + Normal, + Explode, + Type2, + Kraken, + }; + dAcOBarrel_c() : mStateMgr(*this, sStateID::null) {} virtual ~dAcOBarrel_c() {} + virtual int doDelete() override; + virtual int draw() override; + virtual bool createHeap() override; + virtual int actorCreate() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + + virtual void registerInEvent() override; + virtual void unkVirtFunc_0x6C() override; + virtual void doInteraction(s32) override; + + /** fn_293_30D0 */ + void fn_293_30D0(); + + /** fn_293_3560 */ + void fn_293_3560(); + + /** fn_293_37B0 */ + void fn_293_37B0(); + + /** fn_293_3A20 */ + void updateMtx(); + + /** fn_293_3DB0 */ + void fn_293_3DB0(); + + /** fn_293_4200 */ + void fn_293_4200(); + + /** fn_293_45A0 */ + bool fn_293_45A0(); + + /** fn_293_4A90 */ + bool fn_293_4A90(const mAng &); + + /** fn_293_4BC0 */ + bool fn_293_4BC0(); + + /** fn_293_4C60 */ + bool fn_293_4C60(); + + /** fn_293_4D00 */ + bool fn_293_4D00(); + + /** fn_293_4ED0 */ + bool fn_293_4ED0(); + + /** fn_293_50B0 */ + bool fn_293_50B0(); + + /** fn_293_5150 */ + bool fn_293_5150(); + + /** fn_293_5360 */ + void fn_293_5360(); + + /** fn_293_58C0 */ + void fn_293_58C0(); + + /** fn_293_5910 */ + void fn_293_5910(); + STATE_FUNC_DECLARE(dAcOBarrel_c, Wait); STATE_FUNC_DECLARE(dAcOBarrel_c, Grab); STATE_FUNC_DECLARE(dAcOBarrel_c, GrabUp); @@ -21,8 +105,76 @@ public: STATE_FUNC_DECLARE(dAcOBarrel_c, KrakenBorn); STATE_FUNC_DECLARE(dAcOBarrel_c, Rebirth); +public: + bool isType_0() const { + return mType == Type2 || mType == Kraken; + } + + bool isTimeshiftableType() const { + return mType & 1; + } + + bool checkFlag_0xE18() { + return field_0xE18 < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, field_0xE18); + } + private: - /* 0x??? */ STATE_MGR_DECLARE(dAcOBarrel_c); + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mMdl; + /* 0x350 */ dShadowCircle_c mShadow; + /* 0x358 */ dBgS_AcchCir mAcchCir; + /* 0x3B4 */ dBgS_ObjAcch mObjAcch; + /* 0x764 */ cBgS_PolyInfo mPolyInfo; + /* 0x790 */ dBgW mBgW; + /* 0x9A0 */ dCcD_Cyl mCyl; + /* 0xAF0 */ dCcD_Sph mSph; + /* 0xC40 */ STATE_MGR_DECLARE(dAcOBarrel_c); + /* 0xC7C */ TimeAreaStruct mTimeArea; + /* 0xC88 */ dAcRef_c mCeLady; + /* 0xC94 */ dAcRef_c mCeFriend; + /* 0xCA0 */ u8 _CA0[0xD08 - 0xCA0]; + /* 0xD08 */ dWaterEffect_c mWaterEffect; + /* 0xD70 */ mQuat_c quat_0xD50; + /* 0xD70 */ mQuat_c quat_0xD60; + /* 0xD70 */ mQuat_c quat_0xD70; + /* 0xD80 */ mQuat_c quat_0xD80; + /* 0xD90 */ mQuat_c quat_0xD90; + /* 0xDA0 */ mQuat_c quat_0xDA0; + /* 0xDB0 */ u8 _DB0[0xDBC - 0xDB0]; + /* 0xDBC */ mVec3_c field_0xDBC; + /* 0xDC8 */ u8 _DC8[0xDD4 - 0xDC8]; + /* 0xDD4 */ f32 field_0xDD4; + /* 0xDD8 */ mVec3_c field_0xDD8; + /* 0xDE4 */ mAng3_c field_0xDE4; + /* 0xDEE */ u8 _DEA[0xDEC - 0xDEA]; + /* 0xDEC */ u16 field_0xDEC; + /* 0xDEE */ u8 _DEE[0xE00 - 0xDEE]; + /* 0xE00 */ bool field_0xE00; //< Can Damage ? + /* 0xE01 */ bool field_0xE01; + /* 0xE02 */ bool field_0xE02; + /* 0xE03 */ bool field_0xE03; + /* 0xE04 */ bool field_0xE04; + /* 0xE05 */ bool field_0xE05; + /* 0xE06 */ bool field_0xE06; + /* 0xE07 */ bool field_0xE07; + /* 0xE08 */ bool field_0xE08; + /* 0xE09 */ bool field_0xE09; + /* 0xE0A */ bool field_0xE0A; + /* 0xE0B */ bool field_0xE0B; + /* 0xE0C */ bool field_0xE0C; + /* 0xE0D */ bool field_0xE0D; + /* 0xE0E */ bool field_0xE0E; + /* 0xE0F */ u8 mType; + /* 0xE10 */ u8 field_0xE10; + /* 0xE11 */ u8 field_0xE11; + /* 0xE12 */ u8 field_0xE12; + /* 0xE13 */ u8 field_0xE13; + /* 0xE14 */ u8 field_0xE14; + /* 0xE15 */ u8 field_0xE15; + /* 0xE16 */ u8 field_0xE16; + /* 0xE17 */ u8 field_0xE17; + /* 0xE18 */ u8 field_0xE18; + /* 0xE19 */ u8 mBrokenFlag; }; #endif diff --git a/include/d/col/c/c_bg_s_chk.h b/include/d/col/c/c_bg_s_chk.h index d49b84a9..98460750 100644 --- a/include/d/col/c/c_bg_s_chk.h +++ b/include/d/col/c/c_bg_s_chk.h @@ -62,6 +62,10 @@ public: return field_0x0E & pBg->GetField_0x22(); } + void SetField_0xC(u16 v) { + field_0x0C = v; + } + void SetExtChk(const cBgS_Chk &other) { mPolyPassChk = other.mPolyPassChk; mGrpPassChk = other.mGrpPassChk; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 74dad81c..998fb161 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -830,6 +830,12 @@ public: void SetAtFlag(u32 flag) { mAt.SetSPrm(flag); } + void SetAtGrp(u32 grp) { + mAt.SetAtFlag(GetAtGrp() | grp); + } + void OffAtGrp(u32 grp) { + mAt.SetAtFlag(GetAtGrp() & ~grp); + } void SetTgFlag_0xA(u16 flag) { mTg.SetFlag_0xA(flag); @@ -907,6 +913,9 @@ public: void OnAtSet() { mAt.OnSPrm(1); } + void OffAtSet() { + mAt.OffSPrm(1); + } u32 ChkAtNoMass() const { return mAt.MskSPrm(0x400); } @@ -1000,7 +1009,6 @@ public: } // Co - void SetCoGrp(u32 grp) { mCo.SetGrp(grp << 4); } diff --git a/include/f/f_manager.h b/include/f/f_manager.h index f27fb3a7..91459e56 100644 --- a/include/f/f_manager.h +++ b/include/f/f_manager.h @@ -39,8 +39,8 @@ public: ~fManager_c() {} int getSearchTableNum(); static fBase_c *searchBaseByID(fBaseID_e id); - static fBase_c *searchBaseByProfName(ProfileName profID, const fBase_c *parent); - static fBase_c *searchBaseByGroupType(u8 groupType, const fBase_c *parent); + static fBase_c *searchBaseByProfName(ProfileName profID, const fBase_c *parent = nullptr); + static fBase_c *searchBaseByGroupType(u8 groupType, const fBase_c *parent = nullptr); static void mainLoop(); private: diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 310d8d61..f4625c8e 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -138,6 +138,10 @@ struct mAng { s16 mVal; + static const mAng Zero() { + return 0; + } + private: static const f32 sHalfCircleDeg; static const f32 sAngToDeg; diff --git a/include/toBeSorted/attention.h b/include/toBeSorted/attention.h index 570299f1..309c1454 100644 --- a/include/toBeSorted/attention.h +++ b/include/toBeSorted/attention.h @@ -32,27 +32,27 @@ public: }; enum InteractionType { - UNK_0, - PICK_UP, - OPEN, - UNK_3, - TALK, - EXAMINE_TALK, - EXAMINE_6, - UNK_7, - GET_IN, - READY_SWORD, - UNK_10, - UNK_11, - READ, - GRAB, - CATCH, - UNK_15, - UNK_16, - DIG, - UNK_18, - SIT, - UNK_20, + /* 0 */ UNK_0, + /* 1 */ PICK_UP, + /* 2 */ OPEN, + /* 3 */ UNK_3, + /* 4 */ TALK, + /* 5 */ EXAMINE_TALK, + /* 6 */ EXAMINE_6, + /* 7 */ UNK_7, + /* 8 */ GET_IN, + /* 9 */ READY_SWORD, + /* 10 */ UNK_10, + /* 11 */ UNK_11, + /* 12 */ READ, + /* 13 */ GRAB, + /* 14 */ CATCH, + /* 15 */ UNK_15, + /* 16 */ UNK_16, + /* 17 */ DIG, + /* 18 */ UNK_18, + /* 19 */ SIT, + /* 20 */ UNK_20, UNK_0x58 = 0x58, }; @@ -171,7 +171,7 @@ public: private: /* 0xBDC */ u8 field_0xBDC; - + public: static AttentionManager *sInstance; diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 6eda3f7d..d1c8bae8 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -50,7 +50,7 @@ public: static bool eventRelatedStateFlags_shift0x11_1(); // Something like isActorInEvent maybe? - static bool FUN_800a0570(dAcBase_c *actor); + static bool FUN_800a0570(const dAcBase_c *actor); static bool FUN_800a0ba0(); private: diff --git a/src/REL/d/a/obj/d_a_obj_barrel.cpp b/src/REL/d/a/obj/d_a_obj_barrel.cpp index ce38fbff..102cad5f 100644 --- a/src/REL/d/a/obj/d_a_obj_barrel.cpp +++ b/src/REL/d/a/obj/d_a_obj_barrel.cpp @@ -1,5 +1,35 @@ #include "d/a/obj/d_a_obj_barrel.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_player.h" +#include "d/a/npc/d_a_npc_ce_friend.h" +#include "d/a/npc/d_a_npc_ce_lady.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_linkage.h" +#include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_wzsound.h" +#include "f/f_base.h" +#include "f/f_profile_name.h" +#include "m/m_angle.h" +#include "m/m_quat.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/math/math_arithmetic.h" +#include "rvl/MTX/mtxvec.h" +#include "s/s_Math.h" +#include "toBeSorted/attention.h" +#include "toBeSorted/d_emitter.h" +#include "toBeSorted/event_manager.h" + +f32 sFloats1(1.f); + SPECIAL_ACTOR_PROFILE(OBJ_BARREL, dAcOBarrel_c, fProfile::OBJ_BARREL, 0x239, 0, 3); STATE_DEFINE(dAcOBarrel_c, Wait); @@ -13,18 +43,493 @@ STATE_DEFINE(dAcOBarrel_c, Explode); STATE_DEFINE(dAcOBarrel_c, KrakenBorn); STATE_DEFINE(dAcOBarrel_c, Rebirth); -void dAcOBarrel_c::initializeState_Wait() {} -void dAcOBarrel_c::executeState_Wait() {} +static dCcD_SrcCyl sSrcCyl = { + { + /* mObjAt */ {AT_TYPE_PHYSICS, 0x10013, {0, 0, 0}, 4, 0, 0, 0, 0, 0}, + /* mObjTg */ + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x2000111, {0, 0xF, 0x407}, 0, 0}, + /* mObjCo*/ {0xE9}, + }, + { + 55.f, 110.f, + } +}; +static dCcD_SrcSph sSrcSph = { + { + /* mObjAt */ {AT_TYPE_PHYSICS, 0x10003, {0, 0, 0}, 4, 0, 0, 0, 0, 0}, + /* mObjTg */ + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + 0x2000111, + {0, 0xF, 0x407}, + 0, + 0}, + /* mObjCo*/ {0xE9}, + }, + {55.f} +}; + +static const char *sBarrelResFile[] = { + "Barrel", // Normal + "BarrelBomb", // Explode + "Barrel", // Type2 + "Barrel", // Kraken +}; +static const char *sBarrelResMdl[] = { + "Barrel", // Normal + "BarrelBomb", // Explode + "Barrel", // Type2 + "Barrel", // Kraken +}; + +bool dAcOBarrel_c::createHeap() { + mType = getFromParams(0, 0xF); + if (mType == 0xF) { + mType = 0; + } + + mResFile = nw4r::g3d::ResFile(getOarcResFile(sBarrelResFile[mType])); + TRY_CREATE(mMdl.create(mResFile.GetResMdl(sBarrelResMdl[mType]), &mAllocator, 0x120, 1, nullptr)); + + return true; +} + +int dAcOBarrel_c::actorCreate() { + field_0xE18 = getFromParams(12, 0xFF); + mBrokenFlag = getFromParams(20, 0xFF); + field_0xE10 = getFromParams(4, 0x3); + + field_0xE04 = (int)getFromParams(6, 0x3) <= 1 && mType == Normal; + field_0xE05 = (int)getFromParams(6, 0x3) == 1 && mType == Normal; + + field_0xE07 = getFromParams(10, 0x3) == 0; + field_0xE0B = getFromParams(10, 0x3) == 1; + field_0xE08 = getFromParams(8, 0x3) == 0; + + CREATE_ALLOCATOR(dAcOBarrel_c); + + if (!field_0xE08 && !isType_0()) { + fn_8002EA30(-100.f, 0.f, 2.f, 1.f, 4.f, &mObjAcch); + } + + mObjAcch.Set(this, 1, &mAcchCir); + mAcchCir.SetWall(20.f, 55.f); + mObjAcch.SetField_0xC(4); + mStts.SetRank(9); + + mCyl.Set(sSrcCyl); + mCyl.SetStts(mStts); + if (!isType_0()) { + mCyl.ClrAtSet(); + } + mSph.Set(sSrcSph); + mSph.SetStts(mStts); + mObjAcch.OffClrSpeedY(); + + mAcceleration = -4.f; + mMaxSpeed = -40.f; + + field_0xDD8.y = 0.f; + field_0xDEC = 0; + quat_0xD50.set(1.f, 0.f, 0.f, 0.f); + mScale.set(1.f, 1.f, 1.f); + quat_0xD70.set(1.f, 0.f, 0.f, 0.f); + quat_0xD80.set(1.f, 0.f, 0.f, 0.f); + quat_0xD90.set(1.f, 0.f, 0.f, 0.f); + quat_0xDA0.set(1.f, 0.f, 0.f, 0.f); + + if (isType_0()) { + mRotation.z += 0x4000; + unsetActorProperty(AC_PROP_0x1); + mCyl.SetAtGrp(0x10); + } + + /* field_0xCC8 = this */ + /* field_0xCFC = this */ + + if (mRotation.x != 0 || mRotation.z != 0) { + field_0xE02 = true; + mQuat_c qz, qx; + qx.setAxisRotation(mVec3_c::Ex, mRotation.x.radian()); + qz.setAxisRotation(mVec3_c::Ez, mRotation.x.radian()); + quat_0xD80 = qx * qz; + + mRotation.x = mAng::Zero(); + mRotation.z = mAng::Zero(); + } + + mMdl.setPriorityDraw(0x7F, 0x7F); + if (mBrokenFlag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mBrokenFlag)) { + return FAILED; + } + + if (mType == 3) { + mStateMgr.changeState(StateID_KrakenBorn); + } else { + mStateMgr.changeState(StateID_Wait); + getLinkage().set(0x24, 51.f, 0.f, 0.f, nullptr); + } + updateMatrix(); + getLinkage().bushTpFunc(mObjAcch); + + mBoundingBox.Set(mVec3_c(-55.f, -10.f, -55.f), mVec3_c(55.f, 150.f, 55.f)); + + return SUCCEEDED; +} + +int dAcOBarrel_c::actorPostCreate() { + if (field_0xE04) { + mCeLady.link(static_cast(fManager_c::searchBaseByProfName(fProfile::NPC_CE_LADY))); + mCeFriend.link(static_cast(fManager_c::searchBaseByProfName(fProfile::NPC_CE_FRIEND))); + } + + if (field_0xE08) { + if (!isType_0()) { + if (dBgS_ObjGndChk::CheckPos(mPosition + 100.f * mVec3_c::Ey)) { + mPosition.y = dBgS_ObjGndChk::GetGroundHeight(); + } + } + } + + f32 scale; + if (getFromParams(8, 0x3) == 0) { + scale = 1.f; + } else { + scale = 2.5f; + } + + if (field_0xE10 == 0 && isTimeshiftableType()) { + (void)mTimeArea.check(mRoomID, mPosition, 0, 0.f, 0.1f); + if (0.f < mTimeArea.getDistMaybe()) { + field_0xE0C = true; + mScale.set(scale, scale, scale); + } else { + field_0xE0D = true; + mScale.set(0.f, 0.f, 0.f); + } + } + + mWaterEffect.init(this, 100.f, scale, 0.f); + mWaterEffect.setIsSmall(true); + + if (field_0xE05 || checkFlag_0xE18()) { + mStts.SetDefaultRank(); + } else if (field_0xE04) { + mStts.SetRank(0xC); + } + return SUCCEEDED; +} + +int dAcOBarrel_c::doDelete() { + return SUCCEEDED; +} + +int dAcOBarrel_c::actorExecute() { + bool b4D00 = fn_293_4D00(); + mStateMgr.executeState(); + + if (!getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + if (!b4D00) { + calcVelocity(); + mPosition += mVelocity; + mPosition += mStts.GetCcMove(); + fn_293_3DB0(); + } + + field_0xDD8.y += mPosition.y - mOldPosition.y; + } + + if (!b4D00) { + getLinkage().bushTpFunc(mObjAcch); + unsetActorProperty(AC_PROP_0x1); + } else { + setActorProperty(AC_PROP_0x1); + } + + if (!mStateMgr.isState(StateID_Explode) && fn_293_45A0()) { + fn_293_4200(); + } + + if (!mStateMgr.isState(StateID_Explode)) { + if (fn_293_50B0()) { + mCyl.SetAtGrp(0xC); + } else { + mCyl.OffAtGrp(0xC); + } + } + + if (field_0xE10 == 0 && isTimeshiftableType()) { + fn_293_5150(); + } + + if (!mStateMgr.isState(StateID_Explode)) { + if (!(field_0xE10 == 0 && isTimeshiftableType() && mScale.y < 1.f)) { + mCyl.SetAtVec(mVelocity); + mCyl.SetC(mPosition); + mCyl.SetR(mScale.x * 55.f); + mCyl.SetH(mScale.y * 110.f); + + dCcS::GetInstance()->Set(&mCyl); + } + } else { + f32 radius = getFromParams(8, 0x3) == 0 ? 800.f : 400.f; + mSph.SetR(radius); + mSph.SetC(mPosition); + mSph.SetAtType(AT_TYPE_BOMB); + mSph.SetAtGrp(0x1C); + mSph.SetAtDamage(10); + mSph.SetAtVec(mVec3_c::Zero); + + dCcS::GetInstance()->Set(&mSph); + dCcS::GetInstance()->GetMassMng().SetObj(&mSph, 1); + } + + if (!b4D00 || field_0xE02 == 0) { + updateMatrix(); + } + + mMdl.setLocalMtx(mWorldMtx); + mMdl.setScale(mScale); + + mPositionCopy3 = mPositionCopy2 = mPosition + mVec3_c(0.f, 51.f, 0.f); + mPositionCopy3.y += 71.f; + + return SUCCEEDED; +} + +void dAcOBarrel_c::registerInEvent() { + if (mStateMgr.isState(StateID_Wait) && mObjAcch.ChkGndHit()) { + const dAcObjBase_c *pObj = dBgS::GetInstance()->GetActorPointer(mObjAcch.GetGnd()); + if (pObj && EventManager::FUN_800a0570(pObj)) { + setActorProperty(AC_PROP_0x4); + } + } +} + +void dAcOBarrel_c::unkVirtFunc_0x6C() { + if (mStateMgr.isState(StateID_Wait)) { + unsetActorProperty(AC_PROP_0x4); + } +} + +void dAcOBarrel_c::doInteraction(s32 i) { + if (i != PICK_UP) { + return; + } + + if (checkFlag_0xE18()) { + SceneflagManager::sInstance->setFlag(mRoomID, field_0xE18); + } +} + +int dAcOBarrel_c::draw() { + drawModelType1(&mMdl); + + static mQuat_c shadow(0.f, 50.f, 0.f, 80.f); + + if (mYOffset >= 0.f) { + drawShadow(mShadow, nullptr, mWorldMtx, &shadow, -1, -1, -1, -1, -1, mPosition.y - mObjAcch.GetGroundH()); + } + + return SUCCEEDED; +} + +void dAcOBarrel_c::initializeState_Wait() { + mAcceleration = -4.f; + field_0xE0E = false; +} +void dAcOBarrel_c::executeState_Wait() { + fn_293_30D0(); + + if (field_0xE00 && field_0xE02) { + field_0xE01 = fn_293_4ED0(); + } + + if (mObjAcch.ChkGroundLanding() && !field_0xE0E) { + fn_293_37B0(); + if (mVelocity.y > 0.f) { + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, mVelocity, 0, 1.f, field_0x1B0); + } + + if (field_0xE0A) { + startSound(SE_Barrel_ROLL_GROUND); + } + field_0xE0A = true; + } else if (mObjAcch.ChkGndHit()) { + field_0xDD8.y = 0.f; + mVelocity.y = 0.f; + field_0xDBC = mVec3_c::Ey; + fn_293_5360(); + if (!field_0xE02) { + fn_293_58C0(); + mVec3_c v = field_0xDBC; + v.rotY(-mRotation.y); + quat_0xD70.Set(mVec3_c::Ey, v); + } + + if (fn_293_4A90(mAng::deg2short(1.f))) { + mStateMgr.changeState(StateID_Slope); + return; + } + + if (!field_0xE08 && !isType_0() && mYOffset < 0.f && fn_293_4BC0()) { + mSpeed = 0.f; + field_0xE00 = false; + fn_293_5910(); + } + + if (!field_0xE08 && !isType_0() && checkYOffsetField_0x100()) { + killNoItemDrop(); + return; + } + + fn_293_3560(); + + if (mSpeed < 0.2f) { + field_0xE00 = false; + sLib::chase(&mSpeed, 0.f, 0.05f); + } + + if (mSpeed > 0.f && field_0xE02) { + holdSoundWithFloatParam(SE_Barrel_ROLL_LV, mSpeed); + mCyl.OnAtSet(); + } else { + mCyl.OffAtSet(); + } + } + + if (fn_293_4C60()) { + mStateMgr.changeState(StateID_Water); + } else if (getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + mStateMgr.changeState(StateID_GrabUp); + } +} void dAcOBarrel_c::finalizeState_Wait() {} -void dAcOBarrel_c::initializeState_Grab() {} -void dAcOBarrel_c::executeState_Grab() {} -void dAcOBarrel_c::finalizeState_Grab() {} -void dAcOBarrel_c::initializeState_GrabUp() {} -void dAcOBarrel_c::executeState_GrabUp() {} -void dAcOBarrel_c::finalizeState_GrabUp() {} -void dAcOBarrel_c::initializeState_GrabPut() {} -void dAcOBarrel_c::executeState_GrabPut() {} -void dAcOBarrel_c::finalizeState_GrabPut() {} + +void dAcOBarrel_c::initializeState_Grab() { + mVelocity = mVec3_c::Zero; + mAngle = mAng3_c::Zero; + + field_0xE00 = false; + + mCyl.SetCo_0x400(); + mCyl.ClrAtSet(); +} +void dAcOBarrel_c::executeState_Grab() { + if (!getLinkage().checkState(dLinkage_c::STATE_DELETE)) { + field_0xE11 = getLinkage().getState(); + } + + if (dAcPy_c::GetLink()->checkCurrentAction(/* PUT_DOWN_MEDIUM */ 0x42)) { + field_0xE00 = false; + mStateMgr.changeState(StateID_GrabPut); + } else if (!getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + field_0xE00 = true; + field_0xE01 = fn_293_4ED0(); + mStateMgr.changeState(StateID_Wait); + } +} +void dAcOBarrel_c::finalizeState_Grab() { + field_0xDD8.y = 0.f; + field_0xDD4 = cM::rndF(40.f); + mCyl.ClrCo_0x400(); + u8 state = getLinkage().getState(); + if (state == dLinkage_c::STATE_2 || state == dLinkage_c::STATE_3) { + mCyl.OnAtSet(); + } +} + +void dAcOBarrel_c::initializeState_GrabUp() { + // This entire function seems goofy + mVec3_c v = mVec3_c::Ey; + MTXMultVecSR(mWorldMtx, v, v); + mAng rotX = mAng::fromRad(v.angle(mVec3_c::Ex)); + bool z = rotX > 0x4000; + + mAng rotY = dAcPy_c::GetLink()->mRotation.y - mRotation.y; + + mQuat_c qy, qz; + qy.setAxisRotation(mVec3_c::Ey, mAng::short2rad(sLib::absDiff(rotY, 0) > 0x4000 ? rotY += 0x8000 : rotY)); + qz.setAxisRotation(mVec3_c::Ez, mAng::short2rad(z ? 0x4000 : -0x4000)); + + quat_0xD60 = qy * qz; + if (!field_0xE02) { + quat_0xD70 = quat_0xD50; + } + + mCyl.SetCo_0x400(); + mCyl.OffAtSet(); + + if (field_0xE04) { + field_0xE15 = 10; + } + + mStts.SetRank(9); +} +void dAcOBarrel_c::executeState_GrabUp() { + if (field_0xE04 || field_0xE05) { + dAcNpcCeLady_c *pCeLady = mCeLady.get(); + dAcNpcCeFriend_c *pCeFriend = mCeFriend.get(); + if (0 == sLib::calcTimer(&field_0xE15)) { + if ((pCeLady && pCeLady->fn_12_1C20(this)) || (pCeFriend && pCeFriend->fn_11_17C0(this))) { + getLinkage().fn_80050EA0(this); + quat_0xD80 = quat_0xD60; + mStateMgr.changeState(StateID_Wait); + return; + } + field_0xDD8.y = 0.f; + } + } + + if (dAcPy_c::GetLink()->checkCurrentAction(/* PICK UP */ 0x40)) { + quat_0xD80.slerpTo(quat_0xD60, 0.2f, quat_0xD80); + quat_0xD80.normalise(); + quat_0xD70.slerpTo(quat_0xD50, 0.2f, quat_0xD70); + } else { + if (!getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + field_0xDD8.y = 0.f; + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_Grab); + } + } +} +void dAcOBarrel_c::finalizeState_GrabUp() { + mCyl.ClrCo_0x400(); + mCyl.OffAtSet(); + field_0xE02 = true; +} + +void dAcOBarrel_c::initializeState_GrabPut() { + field_0xE12 = 8; + + if (EventManager::isInEvent() && EventManager::isCurrentEvent("CarryReqCancel")) { + if (field_0xE05 || checkFlag_0xE18()) { + mStts.SetDefaultRank(); + } else if (field_0xE04) { + mStts.SetRank(0xC); + } + } +} +void dAcOBarrel_c::executeState_GrabPut() { + if (dAcPy_c::GetLink()->checkCurrentAction(/* PUT_DOWN_MEDIUM */ 0x42) && 0 == sLib::calcTimer(&field_0xE12)) { + quat_0xD80.slerpTo(quat_0xD50, 0.2f, quat_0xD80); + quat_0xD80.normalise(); + } + if (!getLinkage().checkConnection(dLinkage_c::CONNECTION_1)) { + mStateMgr.changeState(StateID_Wait); + } +} +void dAcOBarrel_c::finalizeState_GrabPut() { + field_0xE02 = false; + quat_0xD80 = quat_0xD50; + + if (dBgS_ObjGndChk::CheckPos(mPosition + mVec3_c::Ey * 10.f) && + nw4r::math::FAbs(mPosition.y - dBgS_ObjGndChk::GetGroundHeight()) < 100.f) { + return; + } + mCyl.OnAtSet(); +} + void dAcOBarrel_c::initializeState_Slope() {} void dAcOBarrel_c::executeState_Slope() {} void dAcOBarrel_c::finalizeState_Slope() {} diff --git a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp index dddaed88..83f194bd 100644 --- a/src/REL/d/a/obj/d_a_obj_seat_sword.cpp +++ b/src/REL/d/a/obj/d_a_obj_seat_sword.cpp @@ -152,7 +152,7 @@ int dAcOSeatSword_c::actorExecuteInEvent() { } void dAcOSeatSword_c::doInteraction(s32 param0) { - if (param0 == 5) { + if (param0 == EXAMINE_TALK) { field_0x7EA = true; Event evt((char *)sEventName, 0x190, 0x100001, nullptr, nullptr); mEvent.scheduleEvent(evt, 0); diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp index 9d8b36c9..6b651ba0 100644 --- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp +++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp @@ -130,7 +130,7 @@ bool dAcOtoD3StoneFigure_c::isStoneOfTrialsPlaced() const { } void dAcOtoD3StoneFigure_c::doInteraction(s32 arg) { - if (arg == 5) { + if (arg == EXAMINE_TALK) { Event event = Event("D3OpenStart", 100, 0x100001, nullptr, nullptr); EventManager::alsoSetAsCurrentEvent(this, &event, nullptr); } diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index ffe8a66b..f5588812 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -19,6 +19,7 @@ #include "m/m_heap.h" #include "m/m_vec.h" #include "toBeSorted/actor_info.h" +#include "toBeSorted/attention.h" #include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" @@ -676,7 +677,7 @@ void dAcBase_c::registerInEvent() {} void dAcBase_c::unkVirtFunc_0x6C() {} void dAcBase_c::doInteraction(s32 param) { - if (param == 4 || param == 5 || param == 12) { + if (param == TALK || param == EXAMINE_TALK || param == READ) { Event event = Event("DefaultTalk", 400, 0x100001, nullptr, nullptr); EventManager::alsoSetAsCurrentEvent(this, &event, nullptr); } diff --git a/src/d/a/d_a_salbage_obj.cpp b/src/d/a/d_a_salbage_obj.cpp index ceedf95c..73232f06 100644 --- a/src/d/a/d_a_salbage_obj.cpp +++ b/src/d/a/d_a_salbage_obj.cpp @@ -197,7 +197,7 @@ void dAcSalbageObj_c::initSalbageObj() { } void dAcSalbageObj_c::doInteraction(s32 arg) { - if (arg == 4 || arg == 5 || arg == 12) { + if (arg == TALK || arg == EXAMINE_TALK || arg == READ) { if (mStateMgr.isState(StateID_Wait) && dSalvageMgr_c::sInstance->hasObjAndSlb()) { dAcNpcTalkKensei_c::GetInstance()->triggerSalvageQuestion(this); }