d_a_obj_tumble_weed mostly done (#88)

* mostly done

* Update d_t_tumble_weed.cpp

* remove cM::calcTimer

* just regswap on adjustSpeed

* Create inlines for angle between vectors

* name data symbols

---------

Co-authored-by: robojumper <robojumper@gmail.com>
This commit is contained in:
Elijah Thomas
2024-11-06 16:36:17 -05:00
committed by GitHub
parent f509c053e5
commit c235e32d95
34 changed files with 804 additions and 214 deletions
+1 -1
View File
@@ -179,7 +179,7 @@ public:
/* vt 0x284 */ virtual bool isUsingBugnet() const;
/* vt 0x288 */ virtual const mVec3_c &getBugNetPos() const;
/* vt 0x28C */ virtual void isUsingBugnet1();
/* vt 0x290 */ virtual void bugNetCollectTreasure();
/* vt 0x290 */ virtual void bugNetCollectTreasure(u32 itemId);
/* vt 0x294 */ virtual void somethingSwitchDials();
/* vt 0x298 */ virtual void vt_0x298();
/* vt 0x29C */ virtual void getDieLargeDamageDir();
+9 -1
View File
@@ -4,6 +4,7 @@
#include "d/a/d_a_base.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/c/c_m3d_g_aab.h"
#include "egg/math/eggMath.h"
#include "m/m3d/m_shadow.h"
#include "m/m3d/m_smdl.h"
#include "m/m_angle.h"
@@ -11,7 +12,6 @@
#include "m/m_vec.h"
#include "m/types_m.h"
// Size: 0xA8
struct ActorCarryStruct {
/* 0x00 */ fLiNdBa_c actorLink;
@@ -89,6 +89,14 @@ public:
return angle;
}
f32 getVelocityMag() const {
return fabsf(nw4r::math::VEC3LenSq(velocity));
}
bool isStopped() const {
return getVelocityMag() <= EGG::Math<f32>::epsilon();
}
// could be their own thing?
/* 8002de40 */ static void *getOarcFile(const char *oarcName, const char *fileName);
/* 8002de60 */ static void *getOarcSubEntry(const char *oarcName, const char *fileName);
+73 -3
View File
@@ -1,20 +1,90 @@
#ifndef D_A_OBJ_TUMBLE_WEED_H
#define D_A_OBJ_TUMBLE_WEED_H
#include "common.h"
#include "d/a/obj/d_a_obj_base.h"
#include "d/col/bg/d_bg_s_acch.h"
#include "d/col/cc/d_cc_d.h"
#include "d/d_shadow.h"
#include "m/m3d/m_smdl.h"
#include "m/m_mtx.h"
#include "m/m_quat.h"
#include "m/m_vec.h"
#include "nw4r/g3d/g3d_resfile.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
#include "toBeSorted/dowsing_target.h"
#include "toBeSorted/time_area_mgr.h"
class dAcOTumbleWeed_c : public dAcObjBase_c {
public:
dAcOTumbleWeed_c() : mStateMgr(*this, sStateID::null) {}
dAcOTumbleWeed_c() : mDowsingTarget(this, DowsingTarget::SLOT_NONE), mStateMgr(*this, sStateID::null) {}
virtual ~dAcOTumbleWeed_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;
bool checkCollect();
bool checkBreak();
void doBreak();
void adjustTimeScale();
void adjustTumble(const mVec3_c &dir);
void calcWind();
mVec3_c getPosition() const;
void calcMatrix();
void adjustAngle();
void adjustSpeed();
void tumbleBounceMaybe();
void setWind(const mVec3_c &);
bool checkSlope();
bool fn_475_E40() const;
bool checkInvalidGround() const;
// Look at `isStopped` in dAcObjBase. This may be a diff inline
f32 getWindMag() const {
return fabsf(nw4r::math::VEC3LenSq(mWind));
}
bool isWindStop() const {
return getWindMag() <= EGG::Math<f32>::epsilon();
}
STATE_FUNC_DECLARE(dAcOTumbleWeed_c, Wait);
STATE_FUNC_DECLARE(dAcOTumbleWeed_c, Slope);
private:
/* 0x??? */ STATE_MGR_DECLARE(dAcOTumbleWeed_c);
/* 0x330 */ nw4r::g3d::ResFile mResFile;
/* 0x334 */ m3d::smdl_c mMdl;
/* 0x350 */ dShadowCircle_c mShdw;
/* 0x358 */ dCcD_Sph mSph;
/* 0x4A8 */ dBgS_AcchCir mAcchCir;
/* 0x504 */ dBgS_ObjAcch mObjAcch;
/* 0x8B4 */ DowsingTarget mDowsingTarget;
/* 0x8D4 */ STATE_MGR_DECLARE(dAcOTumbleWeed_c);
/* 0x910 */ mQuat_c mField_0x910;
/* 0x920 */ TimeAreaStruct mTimeArea;
/* 0x92C */ mMtx_c mShadowMtx;
/* 0x95C */ mVec3_c mWind;
/* 0x968 */ mVec3_c mField_0x968;
/* 0x974 */ f32 mField_0x974;
/* 0x978 */ f32 mField_0x978;
/* 0x97C */ f32 mField_0x97C;
/* 0x980 */ f32 mField_0x980;
/* 0x984 */ f32 mSpeedTarget;
/* 0x988 */ u16 mTumbleTimer;
/* 0x98A */ u8 mWindTimer;
/* 0x98B */ u8 mField_0x98B;
/* 0x98C */ u8 mField_0x98C;
/* 0x98D */ bool mbOnGround;
static dCcD_SrcSph sSphSrc;
};
#endif
+12
View File
@@ -27,6 +27,18 @@ enum dBgPc_ECode {
/* 0x80000000 */ CODE_UNUSED_8000_0000 = 0x80000000,
};
enum dBgPc_Attribute {
POLY_ATTR_NORMAL = 0,
POLY_ATTR_SLOPE = 1,
POLY_ATTR_LAVA = 7,
POLY_ATTR_SAND_SHALLOW = 9,
POLY_ATTR_SAND_MED = 10,
POLY_ATTR_SAND_DEEP_INSTANT = 11,
POLY_ATTR_WATER = 12,
POLY_ATTR_DAMAGE = 13,
POLY_ATTR_SLOPE_RUN = 15,
POLY_ATTR_SAND_DEEP_SLOW = 16,
};
class dBgPc {
public:
void setCode(sBgPc &);
+4
View File
@@ -488,6 +488,10 @@ public:
return mFlags & GROUND_HIT;
}
dBgS_GndChk &GetGnd() {
return mGnd;
}
public:
/* 0x040 */ u32 mFlags;
/* 0x044 */ mVec3_c *mpPos;
+37 -3
View File
@@ -308,6 +308,10 @@ public:
dAcObjBase_c *GetAc() {
return mpActor;
}
const mVec3_c &GetCcMove() const {
return mCcMove;
}
};
struct cCcD_SrcGObjTgInfo {
@@ -323,6 +327,36 @@ struct cCcD_SrcGObjTg {
/* 0x0E */ u16 mField_0x0E;
};
enum cCcD_AtType_e {
/* 0x 0000 0001 */ AT_TYPE_0x1 = (1 << 0),
/* 0x 0000 0002 */ AT_TYPE_0x2 = (1 << 1),
/* 0x 0000 0004 */ AT_TYPE_0x4 = (1 << 2),
/* 0x 0000 0008 */ AT_TYPE_0x8 = (1 << 3),
/* 0x 0000 0010 */ AT_TYPE_0x10 = (1 << 4),
/* 0x 0000 0020 */ AT_TYPE_0x20 = (1 << 5),
/* 0x 0000 0040 */ AT_TYPE_0x40 = (1 << 6),
/* 0x 0000 0080 */ AT_TYPE_0x80 = (1 << 7),
/* 0x 0000 0100 */ AT_TYPE_0x100 = (1 << 8),
/* 0x 0000 0200 */ AT_TYPE_0x200 = (1 << 9),
/* 0x 0000 0400 */ AT_TYPE_0x400 = (1 << 10),
/* 0x 0000 0800 */ AT_TYPE_0x800 = (1 << 11),
/* 0x 0000 1000 */ AT_TYPE_0x1000 = (1 << 12),
/* 0x 0000 2000 */ AT_TYPE_0x2000 = (1 << 13),
/* 0x 0000 4000 */ AT_TYPE_0x4000 = (1 << 14),
/* 0x 0000 8000 */ AT_TYPE_0x8000 = (1 << 15),
/* 0x 0001 0000 */ AT_TYPE_0x10000 = (1 << 16),
/* 0x 0002 0000 */ AT_TYPE_0x20000 = (1 << 17),
/* 0x 0004 0000 */ AT_TYPE_0x40000 = (1 << 18),
/* 0x 0008 0000 */ AT_TYPE_0x80000 = (1 << 19),
/* 0x 0010 0000 */ AT_TYPE_0x100000 = (1 << 20),
/* 0x 0020 0000 */ AT_TYPE_0x200000 = (1 << 21),
/* 0x 0040 0000 */ AT_TYPE_0x400000 = (1 << 22),
/* 0x 0080 0000 */ AT_TYPE_0x800000 = (1 << 23),
/* 0x 0100 0000 */ AT_TYPE_BUGNET = (1 << 24),
/* 0x 0200 0000 */ AT_TYPE_0x2000000 = (1 << 25),
/* 0x 0400 0000 */ AT_TYPE_0x4000000 = (1 << 26),
/* 0x 0800 0000 */ AT_TYPE_0x8000000 = (1 << 27),
};
enum cCcD_AtModifiers_e {
/* 0x 0000 0001 */ AT_MOD_FIRE = (1 << 0),
/* 0x 0000 0002 */ AT_MOD_0x2 = (1 << 1),
@@ -758,13 +792,13 @@ public:
}
bool ChkTgHit() {
return mTg.MskSPrm(1) != 0 && mTg.GetActor() != nullptr;
return mTg.MskRPrm(1) != 0 && mTg.GetActor() != nullptr;
}
bool ChkAtHit() {
return mAt.MskSPrm(1) != 0 && mAt.GetActor() != nullptr;
return mAt.MskRPrm(1) != 0 && mAt.GetActor() != nullptr;
}
bool ChkCoHit() {
return mCo.MskSPrm(1) != 0 && mCo.GetActor() != nullptr;
return mCo.MskRPrm(1) != 0 && mCo.GetActor() != nullptr;
}
dAcObjBase_c *GetAc() {
+2 -2
View File
@@ -57,8 +57,8 @@ public:
return EGG::Math<f32>::sqrt(mNormal.x * mNormal.x + mNormal.z * mNormal.z);
}
mAng GetAngleY() const {
return cM::atan2s(mNormal.x, mNormal.z);
s32 GetAngleY() const {
return mAng(cM::atan2s(mNormal.x, mNormal.z));
}
};
+4
View File
@@ -16,6 +16,10 @@ public:
void SetR(f32);
void SetC(f32, f32, f32);
void SetC(const mVec3_c &p) {
SetC(&p);
}
f32 GetYDist(f32) const;
bool Cross(const cM3dGTri *, f32 *, mVec3_c *);
void Clamp(const mVec3_c &, mVec3_c &) const;
+2 -4
View File
@@ -1,10 +1,9 @@
#ifndef D_T_TUMBLE_WEED_H
#define D_T_TUMBLE_WEED_H
#include "d/a/obj/d_a_obj_tumble_weed.h"
#include "d/t/d_tg.h"
#include "f/f_list_nd.h"
#include "s/s_State.hpp"
#include "s/s_StateMgr.hpp"
class dTgTumbleWeed_c : public dTg_c {
public:
@@ -29,8 +28,7 @@ private:
u16 tumbleweedTimer;
u16 padding;
u16 windTimer;
// TODO dAcObjTumbleWeed
dAcRef_c<dAcBase_c> childTumbleweed;
dAcRef_c<dAcOTumbleWeed_c> childTumbleweed;
u16 someField;
};