From 54c3f67bdfc7de117899055558024b40266202ea Mon Sep 17 00:00:00 2001 From: elijah-thomas774 Date: Sun, 16 Nov 2025 23:19:57 -0500 Subject: [PATCH] porgress --- .../SOUE01/rels/d_a_obj_barrelNP/symbols.txt | 4 +- config/SOUE01/symbols.txt | 2 +- include/d/a/d_a_base.h | 6 +- include/d/a/d_a_player.h | 7 + include/d/a/npc/d_a_npc_ce_friend.h | 1 + include/d/a/obj/d_a_obj_barrel.h | 40 +- include/d/a/obj/d_a_obj_base.h | 12 +- include/d/a/obj/d_a_obj_chair.h | 2 - include/d/col/bg/d_bg_s_acch.h | 6 + include/d/col/c/c_m3d_g_pla.h | 2 +- include/m/m_angle.h | 10 +- include/m/m_mtx.h | 8 +- include/toBeSorted/attention.h | 9 +- src/REL/d/a/obj/d_a_obj_barrel.cpp | 438 +++++++++++++++++- src/REL/d/a/obj/d_a_obj_chair.cpp | 14 +- src/REL/d/a/obj/d_a_obj_grave.cpp | 3 +- src/REL/d/a/obj/d_a_obj_tubo.cpp | 14 +- src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 9 +- src/d/a/obj/d_a_obj_fairy.cpp | 14 +- src/toBeSorted/attention.cpp | 2 +- 20 files changed, 526 insertions(+), 77 deletions(-) diff --git a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt index ded4524c..38de63d3 100644 --- a/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_barrelNP/symbols.txt @@ -52,13 +52,13 @@ executeState_KrakenBorn__12dAcOBarrel_cFv = .text:0x00002CF0; // type:function s finalizeState_KrakenBorn__12dAcOBarrel_cFv = .text:0x00002DB0; // type:function size:0x4 initializeState_Rebirth__12dAcOBarrel_cFv = .text:0x00002DC0; // type:function size:0x1AC executeState_Rebirth__12dAcOBarrel_cFv = .text:0x00002F70; // type:function size:0xE8 -fn_293_3060 = .text:0x00003060; // type:function size:0x1C +calcTimer__4sLibFPUs_Us = .text:0x00003060; // type:function size:0x1C finalizeState_Rebirth__12dAcOBarrel_cFv = .text:0x00003080; // type:function size:0x4C fn_293_30D0__12dAcOBarrel_cFv = .text:0x000030D0; // type:function size:0xE0 fn_293_31B0__12dAcOBarrel_cFv = .text:0x000031B0; // type:function size:0x3B0 fn_293_3560__12dAcOBarrel_cFv = .text:0x00003560; // type:function size:0x24C fn_293_37B0__12dAcOBarrel_cFv = .text:0x000037B0; // type:function size:0x26C -fn_293_3A20 = .text:0x00003A20; // type:function size:0x384 +updateMtx__12dAcOBarrel_cFv = .text:0x00003A20; // type:function size:0x384 fn_293_3DB0__12dAcOBarrel_cFv = .text:0x00003DB0; // type:function size:0x44C fn_293_4200__12dAcOBarrel_cFv = .text:0x00004200; // type:function size:0x39C fn_293_45A0__12dAcOBarrel_cFv = .text:0x000045A0; // type:function size:0x4E4 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 60f7ca4b..4e0f2986 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3370,7 +3370,7 @@ fn_80096A60 = .text:0x80096A60; // type:function size:0x50 targetScore__16AttentionManagerFP12dAcObjBase_cP12dAcObjBase_c = .text:0x80096AB0; // type:function size:0x88 fn_80096B40__16AttentionManagerFP12dAcObjBase_c = .text:0x80096B40; // type:function size:0x80 addPickUpTarget__16AttentionManagerFR12dAcObjBase_cf = .text:0x80096BC0; // type:function size:0x18 -addSitTarget__16AttentionManagerFR12dAcObjBase_cUlf = .text:0x80096BE0; // type:function size:0x20 +addSitTarget__16AttentionManagerFR12dAcObjBase_cfQ216AttentionManager7Flags_e = .text:0x80096BE0; // type:function size:0x20 addExamineTalkTarget__16AttentionManagerFR12dAcObjBase_cUlffff = .text:0x80096C00; // type:function size:0x28 addExamineTalkTarget__16AttentionManagerFR12dAcObjBase_cUlfff = .text:0x80096C30; // type:function size:0x28 addCatchTarget__16AttentionManagerFR12dAcObjBase_cUlfff = .text:0x80096C60; // type:function size:0x30 diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 559d7046..97e33e47 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -149,10 +149,14 @@ public: return mRotation; } - mVec3_c getPostionDifference(const dAcBase_c &other) { + mVec3_c getPostionDifference(const dAcBase_c &other) const { return mPosition - other.mPosition; } + f32 getHeightDifference(const dAcBase_c &b) const { + return mPosition.y - b.mPosition.y; + } + f32 getSquareDistanceTo(const mVec3_c &point) const { mVec3_c diff = mPosition - point; return diff.x * diff.x + diff.z * diff.z; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 786eabd6..04c95e2c 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -2,6 +2,7 @@ #define D_A_PLAYER_H #include "common.h" +#include "d/a/d_a_base.h" #include "d/a/d_a_item.h" #include "d/col/c/c_bg_s_poly_info.h" #include "d/d_player_mdl.h" @@ -93,6 +94,12 @@ public: return LINK; } + static dAcPy_c &GetLinkRM() { + return *LINK; + } + static const dAcPy_c &GetLinkR() { + return *LINK; + } static dAcPy_c *GetLinkM() { return LINK; } diff --git a/include/d/a/npc/d_a_npc_ce_friend.h b/include/d/a/npc/d_a_npc_ce_friend.h index 32d2b597..a5a5f5d6 100644 --- a/include/d/a/npc/d_a_npc_ce_friend.h +++ b/include/d/a/npc/d_a_npc_ce_friend.h @@ -12,6 +12,7 @@ public: virtual ~dAcNpcCeFriend_c() {} bool fn_11_17C0(dAcObjBase_c *); + bool fn_11_2A40(); private: /* 0x??? */ STATE_MGR_DECLARE(dAcNpcCeFriend_c); diff --git a/include/d/a/obj/d_a_obj_barrel.h b/include/d/a/obj/d_a_obj_barrel.h index 418670ba..b2f9e784 100644 --- a/include/d/a/obj/d_a_obj_barrel.h +++ b/include/d/a/obj/d_a_obj_barrel.h @@ -65,23 +65,29 @@ public: /** fn_293_4200 */ void fn_293_4200(); - /** fn_293_45A0 */ + /** Check to see if the Barrel should break */ bool fn_293_45A0(); /** fn_293_4A90 */ bool fn_293_4A90(const mAng &); - /** fn_293_4BC0 */ + /** Checks if On Lava or Sink Sand */ bool fn_293_4BC0(); + /** Checks if On Lava */ + bool fn_293_4C20() const; + /** fn_293_4C60 */ bool fn_293_4C60(); - /** fn_293_4D00 */ + /** Check to see if its below some range */ + bool fn_293_4CE0() const; + + /** Check to see if its being moved. (like Conveyor) */ bool fn_293_4D00(); - /** fn_293_4ED0 */ - bool fn_293_4ED0(); + /** Check to see if it is being moved upwards? */ + bool fn_293_4ED0() const; /** fn_293_4F80 */ bool fn_293_4F80(); @@ -89,12 +95,18 @@ public: /** fn_293_50B0 */ bool fn_293_50B0(); - /** fn_293_5150 */ - bool fn_293_5150(); + /** Perform Timeslip */ + void fn_293_5150(); /** fn_293_5360 */ void fn_293_5360(); + /** fn_293_5440 */ + void fn_293_5440(); + + /** fn_293_54D0 */ + void fn_293_54D0(); + /** fn_293_5850 */ void fn_293_5850(f32 *, bool); @@ -151,7 +163,7 @@ private: /* 0xD80 */ mQuat_c quat_0xD80; /* 0xD90 */ mQuat_c quat_0xD90; /* 0xDA0 */ mQuat_c quat_0xDA0; - /* 0xDB0 */ u8 _DB0[0xDBC - 0xDB0]; + /* 0xDB0 */ mVec3_c field_0xDB0; //< player direction vector /* 0xDBC */ mVec3_c field_0xDBC; /* 0xDC8 */ mVec3_c field_0xDC8; /* 0xDD4 */ f32 field_0xDD4; @@ -162,8 +174,12 @@ private: /* 0xDEE */ mAng field_0xDEE; /* 0xDF0 */ mAng field_0xDF0; /* 0xDF2 */ mAng field_0xDF2; - /* 0xDF4 */ u8 _DF4[0xDFE - 0xDF4]; - /* 0xDF4 */ u16 field_0xDFE; + /* 0xDF4 */ mAng field_0xDF4; + /* 0xDF6 */ mAng field_0xDF6; + /* 0xDF8 */ mAng field_0xDF8; + /* 0xDFA */ mAng field_0xDFA; + /* 0xDFC */ u16 field_0xDFC; + /* 0xDFE */ u16 field_0xDFE; /* 0xE00 */ bool field_0xE00; //< Can Damage ? /* 0xE01 */ bool field_0xE01; /* 0xE02 */ bool field_0xE02; @@ -176,8 +192,8 @@ private: /* 0xE09 */ bool field_0xE09; //< for OBJ_VSD Present /* 0xE0A */ bool field_0xE0A; /* 0xE0B */ bool field_0xE0B; - /* 0xE0C */ bool field_0xE0C; - /* 0xE0D */ bool field_0xE0D; + /* 0xE0C */ bool field_0xE0C; //< Timeslip Active + /* 0xE0D */ bool field_0xE0D; //< Timeslip_rev Active /* 0xE0E */ bool field_0xE0E; /* 0xE0F */ u8 mType; /* 0xE10 */ u8 field_0xE10; diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 5b678cec..f5137e84 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -113,14 +113,18 @@ public: return mYOffset; } - bool checkStopped() const { - return getVelocityMag() <= EGG::Math::epsilon(); + bool isFullyStopped(f32 speed = EGG::Math::epsilon()) const { + return getVelocityMag() <= speed; } - bool checkSlower(f32 speed) const { + bool isSpeedStopped(f32 speed = EGG::Math::epsilon()) const { return std::fabsf(mSpeed) <= speed; } + bool isVerticalSpeedStopped(f32 speed = EGG::Math::epsilon()) const { + return std::fabsf(mVelocity.y) <= speed; + } + bool checkYOffsetField_0x100() const { return mYOffset <= field_0x100; } @@ -205,7 +209,7 @@ public: u32 roomId ); void fn_8002efa0(); - bool fn_8002eff0(f32 *, s16 *, f32 *, f32 *, f32 *); + bool fn_8002eff0(const f32 &, const s16 &, cCcD_Obj *, const f32 &, const f32 &); void createChildAttached2( fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2, u32 roomId diff --git a/include/d/a/obj/d_a_obj_chair.h b/include/d/a/obj/d_a_obj_chair.h index 14890cd1..ab8a2d40 100644 --- a/include/d/a/obj/d_a_obj_chair.h +++ b/include/d/a/obj/d_a_obj_chair.h @@ -6,13 +6,11 @@ #include "d/col/bg/d_bg_w.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_angle.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dAcOChair_c : public dAcObjBase_c { public: diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index f41b5f80..0d12de5d 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -521,10 +521,16 @@ public: dBgS_GndChk &GetGnd() { return mGnd; } + const dBgS_GndChk &GetGnd() const { + return mGnd; + } dBgS_RoofChk &GetRoof() { return mRoof; } + const dBgS_RoofChk &GetRoof() const { + return mRoof; + } void SetField_0xD4(f32 v) { field_0x0D4 = v; diff --git a/include/d/col/c/c_m3d_g_pla.h b/include/d/col/c/c_m3d_g_pla.h index 77734b2f..2ead0cff 100644 --- a/include/d/col/c/c_m3d_g_pla.h +++ b/include/d/col/c/c_m3d_g_pla.h @@ -56,7 +56,7 @@ public: cM3d_CalcPla(v1, v2, v3, &mNormal, &mD); } f32 getCrossY_NonIsZero(const mVec3_c *param_1) { - return ((-mNormal.x * param_1->x - mNormal.z * param_1->z) - mD) / mNormal.y; + return -(mNormal.x * param_1->x + mNormal.z * param_1->z) / mNormal.y; } f32 GetXZDist() const { diff --git a/include/m/m_angle.h b/include/m/m_angle.h index f4625c8e..9913a15a 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -6,6 +6,7 @@ #include "m/m_vec.h" #include "math.h" #include "nw4r/math/math_triangular.h" +#include "s/s_Math.h" struct mAng { mAng() {} @@ -35,6 +36,9 @@ struct mAng { void set(s16 val) { mVal = val; } + void setF(const f32 &val) { + mVal = val; + } s16 *ref() { return &mVal; @@ -65,6 +69,10 @@ struct mAng { return *this; } + s32 absDiff(const mAng &other) const { + return sLib::absDiff(mVal, other.mVal); + } + static s32 abs(const mAng b) { return labs(b); } @@ -98,7 +106,7 @@ struct mAng { return mVal * sAngToRad; } - static s16 fromRad(f32 rad) { + static mAng fromRad(f32 rad) { return rad * sRadToAng; } diff --git a/include/m/m_mtx.h b/include/m/m_mtx.h index effe67e6..ac131169 100644 --- a/include/m/m_mtx.h +++ b/include/m/m_mtx.h @@ -147,11 +147,15 @@ public: MTXMultVecSR(*this, in, out); } mVec3_c multVecSR(const mVec3_c &v) const { - mVec3_c ret = v; - MTXMultVecSR(*this, ret, ret); + mVec3_c ret; + multVecSR(v, ret); return ret; } + void multVecSR(mVec3_c &v) const { + multVecSR(v, v); + } + mMtx_c &operator+=(const mMtx_c &rhs) { MTXConcat(*this, rhs, *this); return *this; diff --git a/include/toBeSorted/attention.h b/include/toBeSorted/attention.h index 309c1454..1fd3de94 100644 --- a/include/toBeSorted/attention.h +++ b/include/toBeSorted/attention.h @@ -174,7 +174,12 @@ private: public: static AttentionManager *sInstance; - + enum Flags_e { + FLAGS_0, + FLAGS_1, + FLAGS_2, + FLAGS_3, + }; bool create(); bool createHeap(); bool execute(); @@ -183,7 +188,7 @@ public: void addTarget(dAcObjBase_c &actor, const InteractionTargetDef &def, u32, mVec3_c *); void addPickUpTarget(dAcObjBase_c &actor, f32 field_0x14); - void addSitTarget(dAcObjBase_c &actor, u32 flags, f32 field_0x14); + void addSitTarget(dAcObjBase_c &actor, f32 field_0x14, Flags_e flags); void addTalkTarget_unused(dAcObjBase_c &actor); 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 6f2c41d2..98cd3f40 100644 --- a/src/REL/d/a/obj/d_a_obj_barrel.cpp +++ b/src/REL/d/a/obj/d_a_obj_barrel.cpp @@ -8,10 +8,12 @@ #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_pc.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_s_lin_chk.h" #include "d/col/c/c_cc_d.h" -#include "d/col/c/c_m3d_g_tri.h" +#include "d/col/c/c_m3d_g_pla.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_linkage.h" @@ -22,18 +24,45 @@ #include "f/f_base.h" #include "f/f_profile_name.h" #include "m/m_angle.h" +#include "m/m_mtx.h" #include "m/m_quat.h" #include "m/m_vec.h" +#include "math.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "nw4r/math/math_arithmetic.h" #include "rvl/MTX/mtxvec.h" -#include "rvl/MTX/vec.h" #include "s/s_Math.h" #include "toBeSorted/attention.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/special_item_drop_mgr.h" +// Begin HIO +// Pattern based on TP naming sceme class_HIOParam/class_Param_c +struct dAcOBarrel_c_HIOParam { + f32 _0; + f32 _1; + f32 _2; + f32 _3; + f32 _4; + f32 _5; + s16 _6; + f32 _7; + s16 _8; + f32 _9; + f32 _10; + s16 _12; + f32 _11; + f32 _13; +}; +struct dAcOBarrel_c_Param_c { + static const dAcOBarrel_c_HIOParam m; +}; +const dAcOBarrel_c_HIOParam dAcOBarrel_c_Param_c::m = {2.5f, 10.f, 7.f, 0.125f, 0.2f, 0.2f, 0x5A00, + 15.f, 0x0500, 0.8f, 10.f, 0x0300, 0.8f, 5.f}; +// End HIO + +// Data Floats f32 sFloats1(1.f); SPECIAL_ACTOR_PROFILE(OBJ_BARREL, dAcOBarrel_c, fProfile::OBJ_BARREL, 0x239, 0, 3); @@ -48,7 +77,7 @@ STATE_DEFINE(dAcOBarrel_c, Water2); STATE_DEFINE(dAcOBarrel_c, Explode); STATE_DEFINE(dAcOBarrel_c, KrakenBorn); STATE_DEFINE(dAcOBarrel_c, Rebirth); - +namespace { static dCcD_SrcCyl sSrcCyl = { { /* mObjAt */ {AT_TYPE_PHYSICS, 0x10013, {0, 0, 0}, 4, 0, 0, 0, 0, 0}, @@ -73,6 +102,7 @@ static dCcD_SrcSph sSrcSph = { }, {55.f} }; +} // namespace static const char *sBarrelResFile[] = { "Barrel", // Normal @@ -99,6 +129,12 @@ bool dAcOBarrel_c::createHeap() { return true; } +void dummy_func() { + struct f { + f32 a; + } a = {2.f}; +} + int dAcOBarrel_c::actorCreate() { field_0xE18 = getFromParams(12, 0xFF); mBrokenFlag = getFromParams(20, 0xFF); @@ -138,9 +174,9 @@ int dAcOBarrel_c::actorCreate() { field_0xDEC = mAng::Zero(); 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_0xD80.set(1.f, 0.f, 0.f, 0.f); + quat_0xD70.set(1.f, 0.f, 0.f, 0.f); quat_0xDA0.set(1.f, 0.f, 0.f, 0.f); if (isType_0()) { @@ -156,7 +192,7 @@ int dAcOBarrel_c::actorCreate() { field_0xE02 = true; mQuat_c qz, qx; qx.setAxisRotation(mVec3_c::Ex, mRotation.x.radian()); - qz.setAxisRotation(mVec3_c::Ez, mRotation.x.radian()); + qz.setAxisRotation(mVec3_c::Ez, mRotation.z.radian()); quat_0xD80 = qx * qz; mRotation.x = mAng::Zero(); @@ -168,13 +204,13 @@ int dAcOBarrel_c::actorCreate() { return FAILED; } - if (mType == 3) { + if (mType == Kraken) { mStateMgr.changeState(StateID_KrakenBorn); } else { mStateMgr.changeState(StateID_Wait); getLinkage().set(0x24, 51.f, 0.f, 0.f, nullptr); } - updateMatrix(); + updateMtx(); getLinkage().bushTpFunc(mObjAcch); mBoundingBox.Set(mVec3_c(-55.f, -10.f, -55.f), mVec3_c(55.f, 150.f, 55.f)); @@ -353,7 +389,7 @@ void dAcOBarrel_c::executeState_Wait() { 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); + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 0, 1.f, field_0x1B0); } if (field_0xE0A) { @@ -448,13 +484,16 @@ 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 rotX = mAng::fromRad(v.angle(mVec3_c::Ex)); mAng rotY = dAcPy_c::GetLink()->mRotation.y - mRotation.y; + bool z = rotX > 0x4000; + mQuat_c qy, qz; - qy.setAxisRotation(mVec3_c::Ey, mAng::short2rad(sLib::absDiff(rotY, 0) > 0x4000 ? rotY += 0x8000 : rotY)); + qy.setAxisRotation( + mVec3_c::Ey, mAng::short2rad(rotY.absDiff(0) > mAng::deg2short(90.f) ? rotY += mAng::deg2short(180.f) : rotY) + ); qz.setAxisRotation(mVec3_c::Ez, mAng::short2rad(z ? 0x4000 : -0x4000)); quat_0xD60 = qy * qz; @@ -525,6 +564,11 @@ void dAcOBarrel_c::executeState_GrabPut() { mStateMgr.changeState(StateID_Wait); } } +void dumb_rodata_ordering() { + struct { + f32 a; + } a = {-0.f}; +} void dAcOBarrel_c::finalizeState_GrabPut() { field_0xE02 = false; quat_0xD80 = quat_0xD50; @@ -535,13 +579,11 @@ void dAcOBarrel_c::finalizeState_GrabPut() { } mCyl.OnAtSet(); } - void dAcOBarrel_c::initializeState_Slope() { - mVec3_c vz_out; - cM3dGTri tri; + cM3dGPla tri; dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &tri); - if (checkSlower(EGG::Math::epsilon())) { + if (isSpeedStopped()) { mAngle.y = tri.GetAngleY(); mSpeed = 5.f; } @@ -551,8 +593,8 @@ void dAcOBarrel_c::initializeState_Slope() { mAng ang(mAng::abs(mAngle.y - field_0xDEE)); field_0xDF0 = nw4r::math::FSqrt(ang.degree2() / 180.f) * 910.f; - MTXMultVecSR(mWorldMtx, -mVec3_c::Ez, vz_out); - field_0xDEA = vz_out.atan2sX_Z(); + mVec3_c v = mWorldMtx.multVecSR(-mVec3_c::Ez); + field_0xDEA = mAng::fromVec(v); field_0xE09 = false; @@ -592,7 +634,7 @@ void dAcOBarrel_c::executeState_Slope() { fn_293_3560(); - if (checkSlower(EGG::Math::epsilon())) { + if (isSpeedStopped(EGG::Math::epsilon())) { field_0xE00 = false; } else if (field_0xE02) { field_0xE00 = fn_293_4F80(); @@ -809,3 +851,361 @@ void dAcOBarrel_c::finalizeState_Rebirth() { setActorProperty(AC_PROP_0x1); mStts.SetRank(9); } + +void dAcOBarrel_c::fn_293_30D0() { + if (isSpeedStopped() && field_0xDFC == 0) { + if (field_0xE05 && mCeFriend.isLinked()) { + dAcNpcCeFriend_c *pFriend = mCeFriend.get(); + if (pFriend && pFriend->fn_11_2A40()) { + return; + } + } + } + + AttentionManager *pAttnMgr = AttentionManager::GetInstance(); + if (mYOffset >= 0.f) { + pAttnMgr->addPickUpTarget(*this, 120.f); + pAttnMgr->addUnk3Target(*this, 1, 500.f, -200.f, 200.f); + } +} + +void dAcOBarrel_c::fn_293_31B0() { + cM3dGPla pla; + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla); + + mAng nrmAngle = mAng::fromRad(field_0xDBC.angle(pla.GetN())); + if (nrmAngle > mAng::deg2short(75)) { + field_0xE06 = true; + } + + field_0xDBC = pla.GetN(); + + mVelocity += pla.GetN() * 7.f; + mVelocity.y = pla.getCrossY_NonIsZero(&mVelocity); + + mSpeed = nw4r::math::FSqrt(mVelocity.squareMagXZ()); + mSpeed = cM::minMaxLimit(mSpeed, -20.f, 20.f); + + if (mAng::fromVec(pla.GetN()).absDiff(mAngle.y) < 0x2000) { + sLib::addCalcAngle(mAngle.y.ref(), pla.GetAngleY(), 5, 0x71C, 0x100); + } else { + mAngle.y = mAng::fromVec(mVelocity); + } + + if (!isSpeedStopped()) { + mAng ang = pla.GetAngleY(); + mAng target = ang - 0x8000; + mVec3_c v = mWorldMtx.multVecSR(-mVec3_c::Ez); + + field_0xDEA = mAng::fromVec(v); + if (target.absDiff(field_0xDEA) > 0x4000) { + target = ang; + } else { + target = ang - 0x8000; + } + if (field_0xE00 && field_0xE02) { + field_0xE01 = fn_293_4ED0(); + target -= field_0xDEA; + sLib::addCalcAngle(field_0xDEC.ref(), target, 10, mAng::deg2short(5), 0x100); + } + + mQuat_c q; + q.setAxisRotation(mVec3_c::Ey, field_0xDEC.radian()); + quat_0xD70.slerpTo(q, 0.3f, quat_0xD70); + } + if (field_0xE09) { + quat_0xD70.set(1.f, 0.f, 0.f, 0.f); + } +} + +void dAcOBarrel_c::fn_293_3560() { + f32 f = field_0xE11 == 3 ? 0.2f : 0.125f; + + cM3dGPla pla; + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla); + + mAng nrmAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN())); + + f *= nrmAngle.cos(); + if (nrmAngle < mAng::deg2short(5) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > 0x4000) { + if (!field_0xE00) { + f *= 8.f; + } + sLib::chase(&mSpeed, 0.f, f + getYOffset() * -0.05f); + } else { + if (!field_0xE00) { + if (mStateMgr.isState(StateID_Slope)) { + f = -f * 2.f - 1.5f; + } else { + f *= -8.f; + } + } + mSpeed = cM::minMaxLimit(mSpeed + f, 0.f, 30.f); + } +} + +void dAcOBarrel_c::fn_293_37B0() {} + +void dAcOBarrel_c::updateMtx() {} + +void dAcOBarrel_c::fn_293_3DB0() {} + +void dAcOBarrel_c::fn_293_4200() {} + +bool dAcOBarrel_c::fn_293_45A0() { + if (field_0xE06) { + return true; + } + + // Amos -> Armos. A Barrel hitting a Armos will break it + if (mCyl.ChkAtHit()) { + if (mCyl.GetAtFlag0x2() || mCyl.GetAtFlag0x4() || mCyl.GetAtActor()->mProfileName == fProfile::E_AM) { + return true; + } + } + + if (mObjAcch.ChkWallHit(nullptr)) { + if (mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70) && mSpeed > 5.f) { + return true; + } + if (mStateMgr.isState(StateID_GrabPut) && dAcPy_c::GetLink()->checkCurrentAction(/* PUT_DOWN_MEDIUM */ 0x42)) { + mVec3_c put = mVec3_c::Ez * 50.f; + put.rotY(mAcchCir.GetWallAngleY()); + + mVec3_c end = mPosition + put; + if (dBgS_ObjLinChk::LineCross(&mPosition, &end, this)) { + return true; + } + } + } + + if (mCyl.ChkTgHit() && + mCyl.ChkTgAtHitType(AT_TYPE_SWORD | AT_TYPE_BOMB | AT_TYPE_DAMAGE | AT_TYPE_BUBBLE | AT_TYPE_0x800000)) { + return true; + } + + if (mCyl.ChkTgHit() && mCyl.ChkTgAtHitType(AT_TYPE_PHYSICS)) { + if (mCyl.GetTgActor()->mProfileName == fProfile::OBJ_STEP_STATUE || + mCyl.GetTgActor()->mProfileName == fProfile::OBJ_PUSH_BLOCK) { + return true; + } + } + + // Unreachable condition due to first check + if (mCyl.ChkTgHit() && mCyl.ChkTgAtHitType(AT_TYPE_DAMAGE)) { + if (mCyl.GetTgActor()->mProfileName == fProfile::E_BC) { + return true; + } + } + + if (!mObjAcch.ChkGndHit()) { + if (mCyl.ChkCoHit() && !getLinkage().checkState(dLinkage_c::STATE_ACTIVE) && + mCyl.GetCoActor()->mTargetFiRelated == 4 && mSpeed > 0.f) { + return true; + } + } + + if (mType == Explode && (mStateMgr.isState(StateID_Water) || mStateMgr.isState(StateID_Water2))) { + if (mCyl.ChkCoHit()) { + dAcObjBase_c *pActor = mCyl.GetCoActor(); + if (pActor->isPlayer() || pActor->mProfileName == fProfile::OBJ_TIME_BOAT) { + return true; + } + } + } + + if (mObjAcch.ChkGndHit() && mYOffset >= 0.f) { + if ((!isType_0() && field_0xDD8.y < -500.f) || (isType_0() && field_0xDD8.y < -1000.f)) { + return true; + } + } + + return fn_293_4CE0(); +} + +bool dAcOBarrel_c::fn_293_4A90(const mAng &ang) { + f32 rad; + s32 diff; + cM3dGPla tri; + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &tri); + + rad = mVec3_c::Ey.angle(tri.GetN()); + return ang < mAng::fromRad(rad).absDiff(0); +} + +bool dAcOBarrel_c::fn_293_4BC0() { + int code = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd()); + return code == POLY_ATTR_LAVA || code == POLY_ATTR_SAND_MED || code == POLY_ATTR_SAND_DEEP_INSTANT || + code == POLY_ATTR_SAND_DEEP_SLOW; +} + +bool dAcOBarrel_c::fn_293_4C20() const { + int code = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd()); + return code == POLY_ATTR_LAVA; +} + +bool dAcOBarrel_c::fn_293_4C60() { + f32 f = mPosition.y - 51.f; + if (mType == Type2) { + f = mPosition.y + 51.f * mAng(0); // eh this works + } + + return mObjAcch.ChkWaterHit() && f < mObjAcch.GetWtrGroundH(); +} + +bool dAcOBarrel_c::fn_293_4CE0() const { + return field_0xDD8.y < -10000.f; +} + +bool dAcOBarrel_c::fn_293_4D00() { + return ( + !getLinkage().checkState(dLinkage_c::STATE_ACTIVE) // ensure not Linked + && mStateMgr.isState(StateID_Wait) // Must be on normal ground + && !field_0xE02 && !field_0xE08 // + && mYOffset >= 0.f // + && mObjAcch.ChkGndHit() && dBgS::GetInstance()->ChkMoveBG(mObjAcch.GetGnd(), true) // + && isSpeedStopped() && isVerticalSpeedStopped() // No Movement XZ or Y + && !fn_293_4A90(mAng::deg2short(0.09f)) // Perfectly Flat Ground + ); +} + +bool dAcOBarrel_c::fn_293_4ED0() const { + mVec3_c up = mVec3_c::Ey, v; + mWorldMtx.multVecSR(up); + + mQuat_c q; + q.setAxisRotation(up, DEG_TO_RAD(1)); + + mMtx_c m; + m.fromQuat(q); + + m.multVecSR(mVelocity, v); + return (v.y - mVelocity.y) > 0.f; +} + +bool dAcOBarrel_c::fn_293_4F80() { + mVec3_c up = mVec3_c::Ey; + mWorldMtx.multVecSR(up); + + f32 rad = up.angle(mVelocity); + mAng ang = mAng::fromRad(rad); + return mAng::deg2short(75.f) < ang && ang < (mAng::deg2short(105.005f)); +} + +bool dAcOBarrel_c::fn_293_50B0() { + return ( + field_0xE00 && field_0xE02 && mSpeed > 15.f && getXZAngleToPlayer().absDiff(mAngle.y) <= mAng::deg2short(60) + ); +} + +void dAcOBarrel_c::fn_293_5150() { + mVec3_c v = mPosition; + v.y += field_0xE02 ? 25.f : 50.f; + mVec3_c scale(0.75f, 0.75f, 0.75f); + + if (mType == Explode) { + mTimeArea.check(mRoomID, mPosition, 0, 0.f, 0.1f); + + f32 scaleTarget = getFromParams(8, 0x3) == 0 ? 2.5f : 1.f; + scale *= scaleTarget; + + if (isWithinPlayerRadius(5800.f)) { + if (mScale.y == 0.f) { + if (!field_0xE0C) { + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_465_, v, nullptr, &scale, nullptr, nullptr, 0, 0 + ); + startSound(SE_TIMESLIP_TIMESLIP); + field_0xE0C = true; + } + } else { + field_0xE0C = false; + } + sLib::chase(&mScale.y, scaleTarget, scaleTarget * 0.2f); + } else { + if (mScale.y == scaleTarget) { + if (!field_0xE0D) { + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_465_, v, nullptr, &scale, nullptr, nullptr, 0, 0 + ); + startSound(SE_TIMESLIP_TIMESLIP_REV); + field_0xE0D = true; + } + } else { + field_0xE0D = false; + } + sLib::chase(&mScale.y, 0.f, 0.2f); + } + + mScale.x = mScale.z = mScale.y; + } +} +void dAcOBarrel_c::fn_293_5360() { + if (!field_0xE03) { + static const s16 s = 0x2000; + field_0xE03 = fn_8002eff0(120.f, s, &mCyl, 10.f, -10.f); + } + + if (!field_0xE04 && !field_0xE05) { + fn_293_54D0(); + + if (field_0xE03 && dAcPy_c::GetLink()->checkFlags0x350(0x2000)) { + field_0xE03 = false; + + if (field_0xDFC != 0) { + fn_293_4200(); + } else if (mType == Explode) { + fn_293_4200(); + + } else { + fn_293_5440(); + } + } + } +} + +void dAcOBarrel_c::fn_293_5440() { + field_0xDB0 = dAcPy_c::GetLink()->mVelocity; + field_0xDB0.y = 0.f; + field_0xDB0.normalize(); + field_0xDF8.setF(1820.f); + field_0xDFA.setF(2730.f); + field_0xDFC = 90; +} + +void dAcOBarrel_c::fn_293_54D0() { + if (0 != sLib::calcTimer(&field_0xDFC)) { + mMtx_c m; + + mVec3_c vy = mVec3_c::Ey, vx = mVec3_c::Ex; + mQuat_c qplayer1, qplayer0; + + qplayer0.setAxisRotation(field_0xDB0, mAng(field_0xDF4.sin() * field_0xDF8).radian()); + field_0xDF4 += mAng::deg2short(12); + if (mAng::abs(field_0xDF4) < mAng::deg2short(12)) { + field_0xDF8 *= dAcOBarrel_c_Param_c::m._11; + } + + m.makeRotationFromVecs(mVec3_c::Ez, field_0xDB0, 1.f); + m.multVecSR(vx); + + qplayer1.setAxisRotation(vx, mAng(field_0xDF6.sin() * field_0xDFA).radian()); + field_0xDF6 += mAng::deg2short(20); + if (mAng::abs(field_0xDF6) < mAng::deg2short(20)) { + field_0xDFA *= dAcOBarrel_c_Param_c::m._9; + } + + quat_0xDA0 = qplayer0 * qplayer1; + + } else { + mQuat_c q; + q.set(1.f, 0.f, 0.f, 0.f); + quat_0xDA0.slerpTo(q, 0.2f, quat_0xDA0); + } +} + +void dAcOBarrel_c::fn_293_5850(f32 *, bool) {} + +void dAcOBarrel_c::fn_293_58C0() {} + +void dAcOBarrel_c::fn_293_5910() {} diff --git a/src/REL/d/a/obj/d_a_obj_chair.cpp b/src/REL/d/a/obj/d_a_obj_chair.cpp index cf3434ff..9c9f7c85 100644 --- a/src/REL/d/a/obj/d_a_obj_chair.cpp +++ b/src/REL/d/a/obj/d_a_obj_chair.cpp @@ -1,6 +1,7 @@ #include "d/a/obj/d_a_obj_chair.h" #include "common.h" +#include "d/a/d_a_base.h" #include "d/a/d_a_item.h" #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_base.h" @@ -160,7 +161,7 @@ int dAcOChair_c::actorExecute() { if (!isBench()) { if (isChairTypeIdk0() && !checkObjectProperty(OBJ_PROP_0x8000)) { - if (sLib::absDiff(getRotation().y, getXZAngleToPlayer()) > 910) { + if (mRotation.y.absDiff(getXZAngleToPlayer()) > mAng::deg2short(5)) { getRotation().y = getXZAngleToPlayer(); } } @@ -174,7 +175,7 @@ int dAcOChair_c::actorExecute() { mMdl.calc(false); } else { if (isChairTypeIdk0() && !checkObjectProperty(OBJ_PROP_0x8000)) { - if (sLib::absDiff(getRotation().y, getXZAngleToPlayer()) > 910) { + if (mRotation.y.absDiff(getXZAngleToPlayer()) > mAng::deg2short(5)) { getRotation().y = getXZAngleToPlayer(); } } @@ -197,7 +198,7 @@ int dAcOChair_c::draw() { void dAcOChair_c::initializeState_Wait() {} void dAcOChair_c::executeState_Wait() { - const f32 height_diff = mPosition.y - dAcPy_c::GetLink()->mPosition.y; + const f32 height_diff = getHeightDifference(dAcPy_c::GetLinkR()); if (!isBench() || (50.f < height_diff && height_diff < 60.f)) { if (field_0xB1A && field_0xB1B) { if (dAcPy_c::GetLink()->checkActionFlagsCont(0x1000)) { @@ -207,12 +208,13 @@ void dAcOChair_c::executeState_Wait() { return; } if (field_0xB1C && mChairType == CHAIR_E) { - const f32 mag = (mChairPos - mPositionCopy2).squareMagXZ(); - if (mag < 10000.f) { + if (mChairPos.squareDistanceToXZ(mPositionCopy2) < 10000.f) { return; } } - AttentionManager::GetInstance()->addSitTarget(*this, isBench() ? 0 : 3, 120.f); + AttentionManager::GetInstance()->addSitTarget( + *this, 120.f, isBench() ? AttentionManager::FLAGS_0 : AttentionManager::FLAGS_3 + ); } } } diff --git a/src/REL/d/a/obj/d_a_obj_grave.cpp b/src/REL/d/a/obj/d_a_obj_grave.cpp index 8c6bb452..89f2bd47 100644 --- a/src/REL/d/a/obj/d_a_obj_grave.cpp +++ b/src/REL/d/a/obj/d_a_obj_grave.cpp @@ -164,8 +164,7 @@ void dAcOGrave_c::executeState_Wait() { mAnmMatClr.setRate(1.f, 0); } } - mAng ang = getXZAngleToPlayer(); - s32 diff = sLib::absDiff(ang, mRotation.y); + s32 diff = getXZAngleToPlayer().absDiff(mRotation.y); if (field_0x7F6) { mOrigPos2 = mPosition; vecCylCalc(mOrigPos2, mAngle.y, dAcPy_c::sPushRelatedConstant); diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index 71864c03..a18bd066 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -626,7 +626,7 @@ void dAcOtubo_c::attemptDestroy() { return; } - if (mObjAcch.ChkWallHit(nullptr) && sLib::absDiff(mAcchCir.GetWallAngleY(), mAngle.y) > mAng::deg2short(70.f)) { + if (mObjAcch.ChkWallHit(nullptr) && mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70.f)) { attemptDestroyOnWall(); mAngle.y = mAcchCir.GetWallAngleY(); mSpeed *= 0.5f; @@ -672,7 +672,7 @@ void dAcOtubo_c::attemptDestroy() { } void dAcOtubo_c::attemptDestroyOnWall(const u32 ¶m0, const bool ¶m1) { - if (param1 && sLib::absDiff(mAcchCir.GetWallAngleY(), mAngle.y) > mAng::deg2short(70.f) && 15.f < mSpeed) { + if (param1 && mAng(mAcchCir.GetWallAngleY()).absDiff(mAngle.y) > mAng::deg2short(70.f) && 15.f < mSpeed) { destroy(); } } @@ -746,8 +746,7 @@ void dAcOtubo_c::adjustAngle() { mSpeed = nw4r::math::FSqrt(mVelocity.x * mVelocity.x + mVelocity.z * mVelocity.z); mSpeed = cM::minMaxLimit(mSpeed, -30.f, 30.f); - mAng a = mAng::fromVec(pla.GetN()); // Probably mean to be angle from Ey - if (sLib::absDiff(a, mAngle.y) < mAng::deg2short(90.f)) { + if (mAng::fromVec(pla.GetN()).absDiff(mAngle.y) < mAng::deg2short(90.f)) { sLib::addCalcAngle(mAngle.y.ref(), pla.GetAngleY(), 5, 0x71C, 0x100); } else { mAngle.y = mAng::fromVec(mVelocity); @@ -761,8 +760,7 @@ void dAcOtubo_c::adjustSpeed() { mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN())); step *= gndAngle.cos(); - if (gndAngle < mAng::deg2short(5) || - sLib::absDiff(cM::atan2s(pla.mNormal.x, pla.mNormal.z), mAngle.y) > mAng::deg2short(90)) { + if (gndAngle < mAng::deg2short(5) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > mAng::deg2short(90)) { f32 stepSize = mYOffset; sLib::chase(&mSpeed, 0.f, step + stepSize * -0.05f); } else { @@ -777,10 +775,10 @@ void dAcOtubo_c::adjustSpeed() { bool dAcOtubo_c::checkSlope() { cM3dGPla pla; - dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla); mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN())); - return sLib::absDiff(gndAngle, 0) > mAng::deg2short(5); + return gndAngle.absDiff(0) > mAng::deg2short(5); } bool dAcOtubo_c::fn_272_3660() { diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index aeb7fe6c..5a611d0d 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -94,7 +94,7 @@ int dAcOTumbleWeed_c::doDelete() { } int dAcOTumbleWeed_c::actorExecute() { - if (!field_0x98C && !checkStopped()) { + if (!field_0x98C && !isFullyStopped()) { field_0x968 = mVelocity; field_0x968.y = 0.0f; field_0x968.normalize(); @@ -246,7 +246,7 @@ bool dAcOTumbleWeed_c::checkSlope() { dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); mAng ang = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN())); - return sLib::absDiff(ang, 0) > mAng::deg2short(1); + return ang.absDiff(0) > mAng::deg2short(1); } bool dAcOTumbleWeed_c::checkCollect() { @@ -311,15 +311,14 @@ void dAcOTumbleWeed_c::adjustSpeed() { // Tumbleweed speeds to the target + 5.0f much quicker than intended mAng gndAngle = mAng::fromRad(mVec3_c::Ey.angle(pla.GetN())); - dBgS::GetInstance()->GetTriPla(mObjAcch.mGnd, &pla); + dBgS::GetInstance()->GetTriPla(mObjAcch.GetGnd(), &pla); f32 speedStep = 0.5f; f32 step = gndAngle.cos() * speedStep; // Flat Ground or not in the direction of the slope // Slows down - if (gndAngle < mAng::deg2short(1) || - sLib::absDiff(cM::atan2s(pla.GetN().x, pla.GetN().z), getAngle().y) > mAng::deg2short(90)) { + if (gndAngle < mAng::deg2short(1) || mAng::fromVec(pla.GetN()).absDiff(mAngle.y) > mAng::deg2short(90)) { sLib::chase(&mSpeed, mSpeedTarget, step); } // Sloped Ground and in the direction of the slope diff --git a/src/d/a/obj/d_a_obj_fairy.cpp b/src/d/a/obj/d_a_obj_fairy.cpp index 8ddfaf61..0cdb8c84 100644 --- a/src/d/a/obj/d_a_obj_fairy.cpp +++ b/src/d/a/obj/d_a_obj_fairy.cpp @@ -128,12 +128,9 @@ int dAcOFairy_c::create() { } mPreventCatchAfterSpawnTimer = 45; - if (isWithinPlayerRadius(200.0f)) { - s16 ang = mVelocity.atan2sX_Z(); - if (sLib::absDiff(getXZAngleToPlayer(), ang) < 0x2000) { - mVelocity.rotY(0x8000); - mAngle.y += 0x8000; - } + if (isWithinPlayerRadius(200.0f) && getXZAngleToPlayer().absDiff(mAng::fromVec(mVelocity)) < 0x2000) { + mVelocity.rotY(0x8000); + mAngle.y += 0x8000; } mModel.setAnm("PutFairy_fly", m3d::PLAY_MODE_4, 0.0f); @@ -461,7 +458,8 @@ void dAcOFairy_c::executeState_CureStart() { } } else { calcCurePosition(50.0f, 50.0f); - s32 diff = sLib::absDiff(mCureAngle, 0); + + s32 diff = mCureAngle.absDiff(0); if (diff < mCureAngularSpeed && mCurePosYOffset == 50.0f) { mStateMgr.changeState(StateID_Cure); } @@ -627,7 +625,7 @@ f32 dAcOFairy_c::randMaxSpeedY() const { } bool dAcOFairy_c::shouldAvoidLink() const { - return isWithinPlayerRadius(150.0f) && sLib::absDiff(mAngle.y, getXZAngleToPlayer()) < 0x2000; + return isWithinPlayerRadius(150.0f) && mAngle.y.absDiff(getXZAngleToPlayer()) < 0x2000; } bool dAcOFairy_c::isMovingAwayFromOrigY() const { diff --git a/src/toBeSorted/attention.cpp b/src/toBeSorted/attention.cpp index 8b898ffb..2d71fecf 100644 --- a/src/toBeSorted/attention.cpp +++ b/src/toBeSorted/attention.cpp @@ -443,7 +443,7 @@ void AttentionManager::addPickUpTarget(dAcObjBase_c &actor, f32 field_0x14) { addTarget(actor, pickUpTarget, 0, nullptr); } -void AttentionManager::addSitTarget(dAcObjBase_c &actor, u32 flags, f32 field_0x14) { +void AttentionManager::addSitTarget(dAcObjBase_c &actor, f32 field_0x14, AttentionManager::Flags_e flags) { static InteractionTargetDef sitTarget = {0, 2, 0, SIT, 2, 0.0f, 60.0f, 0.0f, -75.0f, 75.0f, 20.0f, 1.0f}; sitTarget.interactFlags = flags; sitTarget.field_0x14 = field_0x14;