This commit is contained in:
elijah-thomas774
2025-11-15 20:48:18 -05:00
parent b661da78b5
commit e696b17adb
14 changed files with 739 additions and 54 deletions
+21 -10
View File
@@ -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
+1 -1
View File
@@ -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();
+154 -2
View File
@@ -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
+4
View File
@@ -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;
+9 -1
View File
@@ -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);
}
+2 -2
View File
@@ -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:
+4
View File
@@ -138,6 +138,10 @@ struct mAng {
s16 mVal;
static const mAng Zero() {
return 0;
}
private:
static const f32 sHalfCircleDeg;
static const f32 sAngToDeg;
+22 -22
View File
@@ -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;
+1 -1
View File
@@ -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:
+516 -11
View File
@@ -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() {}
+1 -1
View File
@@ -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);
@@ -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);
}
+2 -1
View File
@@ -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);
}
+1 -1
View File
@@ -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);
}