summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelijah-thomas774 <elijahthomas774@gmail.com>2025-11-15 20:48:18 -0500
committerelijah-thomas774 <elijahthomas774@gmail.com>2025-11-22 14:53:35 -0500
commite696b17adbe5754a68262a63428a36680af50a66 (patch)
tree3a784b92e83957f7ea8f30be81cadb3503d5977a
parentb661da78b52958faffb589955df0453c5b0f6740 (diff)
init
-rw-r--r--config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt31
-rw-r--r--include/d/a/d_a_base.h2
-rw-r--r--include/d/a/obj/d_a_obj_barrel.h156
-rw-r--r--include/d/col/c/c_bg_s_chk.h4
-rw-r--r--include/d/col/c/c_cc_d.h10
-rw-r--r--include/f/f_manager.h4
-rw-r--r--include/m/m_angle.h4
-rw-r--r--include/toBeSorted/attention.h44
-rw-r--r--include/toBeSorted/event_manager.h2
-rw-r--r--src/REL/d/a/obj/d_a_obj_barrel.cpp527
-rw-r--r--src/REL/d/a/obj/d_a_obj_seat_sword.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp2
-rw-r--r--src/d/a/d_a_base.cpp3
-rw-r--r--src/d/a/d_a_salbage_obj.cpp2
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<dAcNpcCeLady_c> mCeLady;
+ /* 0xC94 */ dAcRef_c<dAcNpcCeFriend_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<dAcNpcCeLady_c *>(fManager_c::searchBaseByProfName(fProfile::NPC_CE_LADY)));
+ mCeFriend.link(static_cast<dAcNpcCeFriend_c *>(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);
}