mirror of
https://github.com/zeldaret/ss
synced 2026-10-07 21:30:59 -04:00
unrelated Bomb Changes
This commit is contained in:
@@ -2507,7 +2507,7 @@ isBottleOut__17daPlayerActBase_cFv = .text:0x8005C640; // type:function size:0x8
|
||||
isHealingShield__17daPlayerActBase_cFv = .text:0x8005C650; // type:function size:0x8
|
||||
isDrinkingPotion__17daPlayerActBase_cFv = .text:0x8005C660; // type:function size:0x8
|
||||
isRecovering__17daPlayerActBase_cCFv = .text:0x8005C670; // type:function size:0x8
|
||||
lookTowardItem__17daPlayerActBase_cFv = .text:0x8005C680; // type:function size:0x4
|
||||
lookTowardItem__17daPlayerActBase_cFRC7mVec3_cUl4mAngfff = .text:0x8005C680; // type:function size:0x4
|
||||
isRunningUpWall__17daPlayerActBase_cFv = .text:0x8005C690; // type:function size:0x8
|
||||
doGameOver__17daPlayerActBase_cFv = .text:0x8005C6A0; // type:function size:0x4
|
||||
getDieLargeDamageDir__17daPlayerActBase_cFv = .text:0x8005C6B0; // type:function size:0x8
|
||||
@@ -2561,7 +2561,7 @@ ifHasHealthAndSomethingElse__17daPlayerActBase_cFv = .text:0x8005C9A0; // type:f
|
||||
unlinkActorRef1__17daPlayerActBase_cFv = .text:0x8005C9B0; // type:function size:0x4
|
||||
doesActorRef1Exist__17daPlayerActBase_cFv = .text:0x8005C9C0; // type:function size:0x8
|
||||
getActorInActorRef1__17daPlayerActBase_cFv = .text:0x8005C9D0; // type:function size:0x8
|
||||
vt_0x1BC__17daPlayerActBase_cFv = .text:0x8005C9E0; // type:function size:0x8
|
||||
getBeetleHeldActor__17daPlayerActBase_cFv = .text:0x8005C9E0; // type:function size:0x8
|
||||
canHandleGameOver__17daPlayerActBase_cFv = .text:0x8005C9F0; // type:function size:0x4
|
||||
isByte0x434eEqual7__17daPlayerActBase_cFv = .text:0x8005CA00; // type:function size:0x8
|
||||
isItemFairyFromBugnet__17daPlayerActBase_cFv = .text:0x8005CA10; // type:function size:0x8
|
||||
@@ -12361,7 +12361,7 @@ fn_80202270 = .text:0x80202270; // type:function size:0x170
|
||||
ActorLink__pushingLog = .text:0x802023E0; // type:function size:0x12C
|
||||
fn_80202510 = .text:0x80202510; // type:function size:0x1A8
|
||||
ActorLink__logPushed = .text:0x802026C0; // type:function size:0x298
|
||||
isObjectFromBeetle = .text:0x80202960; // type:function size:0x13C
|
||||
insert__Q27dAcPy_c11ObjectArrayFP12dAcObjBase_c = .text:0x80202960; // type:function size:0x13C
|
||||
fn_80202AA0 = .text:0x80202AA0; // type:function size:0x13C
|
||||
fn_80202BE0 = .text:0x80202BE0; // type:function size:0x10
|
||||
ActorLink__checkBeetleActorReferenceAtIndex = .text:0x80202BF0; // type:function size:0x20
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/d_a_item.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/col/c/c_bg_s_poly_info.h"
|
||||
#include "d/d_player_mdl.h"
|
||||
#include "m/m_angle.h"
|
||||
@@ -32,8 +33,22 @@ public:
|
||||
/* vt 0x314 */ virtual void vt_0x314();
|
||||
/* vt 0x318 */ virtual void vt_0x318();
|
||||
|
||||
struct ObjectArray {
|
||||
static const size_t sNumObjects = 16;
|
||||
|
||||
bool insert(dAcObjBase_c *);
|
||||
void execute();
|
||||
dAcObjBase_c *get(s32 index);
|
||||
void removeBombs();
|
||||
|
||||
dAcObjRef_c mObjs[sNumObjects];
|
||||
u32 mCounter[sNumObjects];
|
||||
};
|
||||
|
||||
protected:
|
||||
/* 0x137C */ u8 _0x137C[0x16F0 - 0x137C];
|
||||
/* 0x137C */ ObjectArray mOwnedObjects;
|
||||
/* 0x147C */ ObjectArray mOwnedProjectiles;
|
||||
/* 0x157C */ u8 _0x157C[0x16F0 - 0x157C];
|
||||
/* 0x16F0 */ nw4r::g3d::ResFile mHeldResFile;
|
||||
/* 0x16F4 */ u8 _0x16F4[0x4564 - 0x16F4];
|
||||
/* 0x4564 */ f32 field_0x4564;
|
||||
@@ -58,6 +73,7 @@ public:
|
||||
void setBeetleFlashClr(const mColor &);
|
||||
void setBeetleBackAnim();
|
||||
s32 getBeetleWarningTimeLeft();
|
||||
void setBeetleReleasedObject(dAcObjBase_c *pObj);
|
||||
|
||||
// Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ?
|
||||
static s32 calcItemWheelSelection(bool reset, s32 numOptions);
|
||||
@@ -117,6 +133,14 @@ public:
|
||||
return LINK2;
|
||||
}
|
||||
|
||||
static bool insertOwnedObject(dAcObjBase_c *pObj) {
|
||||
return LINK2->mOwnedObjects.insert(pObj);
|
||||
}
|
||||
|
||||
ObjectArray &getOwnedObjects() {
|
||||
return mOwnedObjects;
|
||||
}
|
||||
|
||||
void onShieldUpdate();
|
||||
|
||||
static dAcPy_c *LINK;
|
||||
|
||||
@@ -86,6 +86,7 @@ public:
|
||||
bool fn_80030570(m3d::mdl_c &, u8, f32); // lighting related
|
||||
void fn_800306D0();
|
||||
void fn_80030700();
|
||||
static void fn_800307E0(mVec3_c *pPos, s32);
|
||||
dAcObjBase_c *targetPlayerOrScrapper(f32 biasToScrapper);
|
||||
static void fn_80030980(m3d::mdl_c &, s32, bool markDirty);
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#ifndef D_A_OBJ_BASE_H
|
||||
#define D_A_OBJ_BASE_H
|
||||
|
||||
#include "c/c_math.h"
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/d_a_salbage_if.h"
|
||||
@@ -14,11 +13,9 @@
|
||||
#include "m/m3d/m_shadow.h"
|
||||
#include "m/m3d/m_smdl.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_color.h"
|
||||
#include "m/m_mtx.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "m/types_m.h"
|
||||
#include "nw4r/math/math_arithmetic.h"
|
||||
|
||||
// Ghidra: ActorObjectBase
|
||||
// size: 0x330
|
||||
|
||||
@@ -61,6 +61,7 @@ enum dBgPc_Attribute {
|
||||
POLY_ATTR_DAMAGE = 13,
|
||||
POLY_ATTR_SLOPE_RUN = 15,
|
||||
POLY_ATTR_SAND_DEEP_SLOW = 16,
|
||||
POLY_ATTR_CURSED_WATER = 17,
|
||||
};
|
||||
class dBgPc {
|
||||
public:
|
||||
|
||||
@@ -532,8 +532,17 @@ public:
|
||||
return mRoof;
|
||||
}
|
||||
|
||||
void SetField_0xD4(f32 v) {
|
||||
field_0x0D4 = v;
|
||||
void SetGndChkOffset(f32 v) {
|
||||
mGndChkOffset = v;
|
||||
}
|
||||
void SetRoofCrrHeight(f32 v) {
|
||||
mRoofCrrHeight = v;
|
||||
}
|
||||
void SetWaterCheckOffset(f32 v) {
|
||||
mWtrCheckOffset = v;
|
||||
}
|
||||
void SetWtrChkMode(u8 v) {
|
||||
mWtrMode = v;
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -555,12 +564,12 @@ public:
|
||||
/* 0x0A8 */ f32 field_0x0A8;
|
||||
/* 0x0AC */ f32 field_0x0AC;
|
||||
/* 0x0B0 */ f32 mGroundHeight;
|
||||
/* 0x0B4 */ f32 field_0x0B4;
|
||||
/* 0x0B4 */ f32 mGndChkOffset;
|
||||
/* 0x0B8 */ cM3dGPla mPlane_0x0B8;
|
||||
/* 0x0C8 */ f32 field_0x0C8;
|
||||
/* 0x0CC */ f32 field_0x0CC;
|
||||
/* 0x0D0 */ f32 mRoofHeight;
|
||||
/* 0x0D4 */ f32 field_0x0D4;
|
||||
/* 0x0D4 */ f32 mRoofCrrHeight;
|
||||
/* 0x0D8 */ f32 field_0x0D8;
|
||||
/* 0x0DC */ cBgS_PolyInfo *mpOutPolyInfo;
|
||||
/* 0x0E0 */ f32 mRoofH_0x0E0;
|
||||
@@ -572,9 +581,9 @@ public:
|
||||
/* 0x1D0 */ f32 field_0x1D0;
|
||||
/* 0x1D4 */ dBgS_GndChk mGnd;
|
||||
/* 0x264 */ dBgS_RoofChk mRoof;
|
||||
/* 0x2F4 */ f32 field_0x2F4;
|
||||
/* 0x2F4 */ f32 mWtrCheckOffset;
|
||||
/* 0x2F8 */ dBgS_WtrChk mWtr;
|
||||
/* 0x390 */ u8 field_0x390;
|
||||
/* 0x390 */ u8 mWtrMode;
|
||||
/* 0x394 */ s32 field_0x394;
|
||||
/* 0x398 */ mVec3_c field_0x398;
|
||||
/* 0x3A4 */ mVec3_c field_0x3A4;
|
||||
|
||||
@@ -526,6 +526,9 @@ public:
|
||||
void SetSrcModifer(u32 modifier) {
|
||||
mSrc.mInfo.mModifier = modifier;
|
||||
}
|
||||
u32 GetSrcModifer() const {
|
||||
return mSrc.mInfo.mModifier;
|
||||
}
|
||||
void OnSrcModifer(u32 m) {
|
||||
mSrc.mInfo.mModifier |= m;
|
||||
}
|
||||
@@ -949,6 +952,10 @@ public:
|
||||
mAt.SetCallback(cb);
|
||||
}
|
||||
|
||||
void SetTgCallback(cCcD_HitCallback cb) {
|
||||
mTg.SetCallback(cb);
|
||||
}
|
||||
|
||||
void SetCoCallback(cCcD_HitCallback cb) {
|
||||
mCo.SetCallback(cb);
|
||||
}
|
||||
@@ -1006,6 +1013,13 @@ public:
|
||||
void OnAt_0x4000() {
|
||||
mAt.OnSPrm(0x4000);
|
||||
}
|
||||
// Related to Beetle (no hook)
|
||||
u32 ChkAt_0x4000() {
|
||||
return mAt.MskSPrm(0x4000);
|
||||
}
|
||||
u32 GetAtSrcModifier() const {
|
||||
return mAt.GetSrcModifer();
|
||||
}
|
||||
|
||||
|
||||
void SetAtInfo_0x0(u8 amount) {
|
||||
@@ -1115,6 +1129,9 @@ public:
|
||||
void ClrCo_0x400() {
|
||||
mCo.OffSPrm(0x400);
|
||||
}
|
||||
u32 ChkCo_0x8000() {
|
||||
return mCo.MskSPrm(0x8000);
|
||||
}
|
||||
void OnCo_0x8000() {
|
||||
mCo.OnSPrm(0x8000);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "d/col/c/c_m3d.h"
|
||||
#include "m/m_angle.h"
|
||||
#include "m/m_vec.h"
|
||||
#include "nw4r/math/math_types.h"
|
||||
#include "rvl/MTX/vec.h"
|
||||
|
||||
// Plane with a normal
|
||||
@@ -29,8 +30,12 @@ public:
|
||||
mD = -VECDotProduct(mNormal, point);
|
||||
}
|
||||
|
||||
void SetupNP(const mVec3_c &normal, const mVec3_c &point) {
|
||||
mNormal = normal;
|
||||
mD = -nw4r::math::VEC3Dot(mNormal, point);
|
||||
}
|
||||
|
||||
// Unused
|
||||
// void SetupNP(const mVec3_c &, const mVec3_c &);
|
||||
// bool getCrossY(const mVec3_c &, f32 *) const;
|
||||
// void Set(const cM3dGPla *);
|
||||
|
||||
|
||||
@@ -41,6 +41,9 @@ public:
|
||||
dCcMassS_Mng &GetMassMng() {
|
||||
return mMassMng;
|
||||
}
|
||||
void SetMass(cCcD_Obj *p_obj, u8 priority) {
|
||||
mMassMng.SetObj(p_obj, priority);
|
||||
}
|
||||
|
||||
void Ct();
|
||||
void Dt();
|
||||
|
||||
+20
-7
@@ -19,15 +19,15 @@ public:
|
||||
public:
|
||||
enum ConnectionType_e {
|
||||
CONNECTION_0 = 0,
|
||||
CONNECTION_1 = 1,
|
||||
CONNECTION_1 = 1, // Standard
|
||||
CONNECTION_2 = 2,
|
||||
CONNECTION_3 = 3,
|
||||
CONNECTION_4 = 4,
|
||||
CONNECTION_5 = 5,
|
||||
CONNECTION_6 = 6,
|
||||
CONNECTION_7 = 7,
|
||||
CONNECTION_8 = 8,
|
||||
CONNECTION_9 = 9,
|
||||
CONNECTION_4 = 4, // clawshot
|
||||
CONNECTION_5 = 5, // Beetle
|
||||
CONNECTION_6 = 6, // From Sword Swing?
|
||||
CONNECTION_7 = 7, // Whip
|
||||
CONNECTION_8 = 8, // Arrow/Heartf
|
||||
CONNECTION_9 = 9, // Chandelier/lotus flower
|
||||
};
|
||||
enum State_e {
|
||||
STATE_0 = 0,
|
||||
@@ -87,6 +87,19 @@ public:
|
||||
return field_0xA0->getArrowOffsetPosAndAngle(param_1, param_2, param_3, param_4, param_5);
|
||||
}
|
||||
|
||||
dAcBase_c *getControllingActor() {
|
||||
return static_cast<dAcBase_c *>(mControllingActor.p_owner);
|
||||
}
|
||||
|
||||
void setField_0x8C_0x90(f32 f0, f32 f1) {
|
||||
field_0x8C = f0;
|
||||
field_0x90 = f1;
|
||||
}
|
||||
void setField_0x94_0x98(f32 f0, f32 f1) {
|
||||
field_0x94 = f0;
|
||||
field_0x98 = f1;
|
||||
}
|
||||
|
||||
public:
|
||||
void set(u32 flags, f32, f32, f32, void *unk);
|
||||
bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool);
|
||||
|
||||
@@ -2,10 +2,11 @@
|
||||
#define D_A_PLAYER_ACT_H
|
||||
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/obj/d_a_obj_bomb.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/d_player_base.h"
|
||||
#include "m/m_vec.h"
|
||||
|
||||
|
||||
class dAcEnBase_c;
|
||||
class dAcOFairy_c;
|
||||
|
||||
@@ -247,7 +248,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
/* vt 0x1B8 */ virtual void canHandleGameOver() {}
|
||||
/* vt 0x1BC */ virtual UNKWORD vt_0x1BC() {
|
||||
/* vt 0x1BC */ virtual dAcObjBase_c *getBeetleHeldActor() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -414,7 +415,7 @@ public:
|
||||
/* vt 0x2A4 */ virtual bool isRunningUpWall() {
|
||||
return false;
|
||||
}
|
||||
/* vt 0x2A8 */ virtual void lookTowardItem() {}
|
||||
/* vt 0x2A8 */ virtual void lookTowardItem(const mVec3_c &, u32, mAng, f32, f32, f32) {}
|
||||
/* vt 0x2AC */ virtual void vt_0x2AC() {}
|
||||
/* vt 0x2B0 */ virtual void vt_0x2B0() {}
|
||||
/* vt 0x2B4 */ virtual void triggerMoveEventMaybe(u32, u32, u32, const mVec3_c *, const mAng &, u32, u32) {}
|
||||
|
||||
@@ -48,11 +48,21 @@
|
||||
return *mStateMgr.getStateID() == value; \
|
||||
}
|
||||
|
||||
#define STATE_MGR_DEFINE_UTIL_GETSTATEID(class_name) \
|
||||
const sFStateID_c<class_name> &getStateID() const { \
|
||||
return (sFStateID_c<class_name> &)*mStateMgr.getStateID(); \
|
||||
}
|
||||
|
||||
#define STATE_MGR_DEFINE_UTIL_GETOLDSTATEID(class_name) \
|
||||
const sFStateID_c<class_name> &getOldStateID() const { \
|
||||
return (sFStateID_c<class_name> &)*mStateMgr.getOldStateID(); \
|
||||
}
|
||||
|
||||
#define STATE_MGR_DEFINE_UTIL_GETNEWSTATEID(class_name) \
|
||||
const sFStateID_c<class_name> &getNewStateID() const { \
|
||||
return (sFStateID_c<class_name> &)*mStateMgr.getNewStateID(); \
|
||||
}
|
||||
|
||||
// Use this when you need need sFStateID_c vtables to appear in a different order
|
||||
#define STATE_MGR_DEFINE_UTIL_INSTANCIATE_STATE(class_name) \
|
||||
bool dummy_need_state_instanciation(const sFStateID_c<class_name> &value) const { \
|
||||
|
||||
@@ -187,7 +187,7 @@ void dAcEKs_c::setStartingState() {
|
||||
changeState(StateID_Move);
|
||||
mCurrentState = mStartingState;
|
||||
mAcch.ClrRoofNone();
|
||||
mAcch.SetField_0xD4(55.f);
|
||||
mAcch.SetRoofCrrHeight(55.f);
|
||||
mAcch.SetGroundUpY(30.f);
|
||||
mAcchCir.SetWall(20.f, 60.f);
|
||||
} break;
|
||||
@@ -199,14 +199,14 @@ void dAcEKs_c::setStartingState() {
|
||||
}
|
||||
mAcch.ClrRoofHit();
|
||||
mAcch.SetGroundUpY(0.f);
|
||||
mAcch.SetField_0xD4(0.f);
|
||||
mAcch.SetRoofCrrHeight(0.f);
|
||||
mAcchCir.SetWall(0.f, 5.f);
|
||||
|
||||
} break;
|
||||
case EKS_STARTSTATE_PathMove: {
|
||||
mCurrentState = mStartingState;
|
||||
mAcch.ClrRoofNone();
|
||||
mAcch.SetField_0xD4(55.f);
|
||||
mAcch.SetRoofCrrHeight(55.f);
|
||||
mAcch.SetGroundUpY(30.f);
|
||||
mAcchCir.SetWall(20.f, 60.f);
|
||||
changeState(StateID_PathMove);
|
||||
@@ -1789,7 +1789,7 @@ void dAcEKs_c::initializeState_Wait() {
|
||||
mRotation.y = field_0xD8A;
|
||||
mRotation.x = mAng(0);
|
||||
mAcch.ClrRoofHit();
|
||||
mAcch.SetField_0xD4(0);
|
||||
mAcch.SetRoofCrrHeight(0);
|
||||
mAcch.SetGroundUpY(0);
|
||||
setBattleBgmRelated(0);
|
||||
|
||||
@@ -2042,7 +2042,7 @@ void dAcEKs_c::finalizeState_WakeUp() {
|
||||
mAngle.y = mRotation.y;
|
||||
mAcch.ClrRoofNone();
|
||||
mAcchCir.SetWall(20, 60);
|
||||
mAcch.SetField_0xD4(55);
|
||||
mAcch.SetRoofCrrHeight(55);
|
||||
mAcch.SetGroundUpY(30);
|
||||
}
|
||||
|
||||
@@ -2116,7 +2116,7 @@ void dAcEKs_c::initializeState_WaitReady() {
|
||||
field_0xDA5 = 0;
|
||||
field_0xD50 = 30;
|
||||
mAcch.ClrRoofHit();
|
||||
mAcch.SetField_0xD4(0.f);
|
||||
mAcch.SetRoofCrrHeight(0.f);
|
||||
mAcch.SetGroundUpY(0.f);
|
||||
field_0xDAD = 0;
|
||||
field_0xDAE = 0;
|
||||
@@ -2853,7 +2853,7 @@ void dAcEKs_c::initializeState_WindBlow() {
|
||||
mAcceleration = -0.5f;
|
||||
mAcch.ClrRoofNone();
|
||||
mAcchCir.SetWall(20, 60);
|
||||
mAcch.SetField_0xD4(55);
|
||||
mAcch.SetRoofCrrHeight(55);
|
||||
mAcch.SetGroundUpY(30);
|
||||
}
|
||||
void dAcEKs_c::executeState_WindBlow() {
|
||||
|
||||
@@ -208,7 +208,7 @@ int dAcEremly_c::actorCreate() {
|
||||
field_0xA50.z = mPosition.z;
|
||||
mAcchCir.SetWall(mScaleF * 10.f, mScaleF * 60.f);
|
||||
|
||||
mAcch.SetField_0xD4(100.f + _weird_zero);
|
||||
mAcch.SetRoofCrrHeight(100.f + _weird_zero);
|
||||
field_0xB04 = 60.f;
|
||||
|
||||
if (mIsHorwellsPet == 0) {
|
||||
@@ -1113,7 +1113,7 @@ void dAcEremly_c::initializeState_Fly() {
|
||||
mYOffset = 0.f;
|
||||
mAnmStep = 0;
|
||||
|
||||
mAcch.SetField_0xD4(f);
|
||||
mAcch.SetRoofCrrHeight(f);
|
||||
|
||||
mVelocity.x = mVelocity.z = 0.f;
|
||||
mSpeed = 0.f;
|
||||
|
||||
@@ -164,7 +164,7 @@ int dAcEsm_c::actorCreate() {
|
||||
mAcchCir.SetWall(mScaleTarget.y * 100.f, mScaleTarget.x * 100.f);
|
||||
mStts.SetRank(10);
|
||||
mObjAcch.SetGndThinCellingOff();
|
||||
mObjAcch.field_0x390 = 1;
|
||||
mObjAcch.SetWtrChkMode(1);
|
||||
|
||||
mMaxSpeed = -40.f;
|
||||
|
||||
|
||||
@@ -320,7 +320,7 @@ void dAcOtubo_c::finalizeState_Grab() {
|
||||
mSph.OnAtSet();
|
||||
}
|
||||
mObjAcch.ClrRoofNone();
|
||||
mObjAcch.field_0x0D4 = 50.f;
|
||||
mObjAcch.SetRoofCrrHeight(50.f);
|
||||
}
|
||||
|
||||
void dAcOtubo_c::initializeState_Put() {}
|
||||
|
||||
@@ -774,7 +774,7 @@ int dAcItem_c::create() {
|
||||
getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f
|
||||
);
|
||||
mObjAcch.Set(this, 1, &mAcchCir);
|
||||
mObjAcch.field_0x0D4 = 50.0f;
|
||||
mObjAcch.SetRoofCrrHeight(50.0f);
|
||||
mObjAcch.SetClrSpeedY();
|
||||
mObjAcch.SetField_0xC(4);
|
||||
mAcceleration = -2.0f;
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
#include "d/a/d_a_player.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "d/a/d_a_base.h"
|
||||
#include "d/a/obj/d_a_obj_base.h"
|
||||
#include "d/a/obj/d_a_obj_bomb.h"
|
||||
#include "f/f_profile.h"
|
||||
#include "f/f_profile_name.h"
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
dAcPy_c *dAcPy_c::LINK;
|
||||
|
||||
// TODO: Disable this pragma when the ctors are matching
|
||||
@@ -8,3 +17,99 @@ dAcPy_c::dAcPy_c() {}
|
||||
#pragma dont_inline reset
|
||||
|
||||
dAcPy_c::~dAcPy_c() {}
|
||||
|
||||
namespace {
|
||||
bool isProfile(dAcBase_c *pActor, ProfileName profile) {
|
||||
return pActor && pActor->mProfileName == profile;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
bool dAcPy_c::ObjectArray::insert(dAcObjBase_c *pObj) {
|
||||
for (size_t i = 0; i < sNumObjects; ++i) {
|
||||
if (mObjs[i].get() != pObj) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isProfile(pObj, fProfile::BOMB)) {
|
||||
mCounter[i] = MAX(0, static_cast<dAcBomb_c *>(pObj)->get0xA44()) + 3;
|
||||
} else {
|
||||
mCounter[i] = 90;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sNumObjects; ++i) {
|
||||
if (mObjs[i].get() != nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
mObjs[i].link(pObj);
|
||||
|
||||
if (isProfile(pObj, fProfile::BOMB)) {
|
||||
mCounter[i] = MAX(0, static_cast<dAcBomb_c *>(pObj)->get0xA44()) + 3;
|
||||
} else {
|
||||
mCounter[i] = 90;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void dAcPy_c::ObjectArray::execute() {
|
||||
// Unlink Object as needed
|
||||
for (int i = 0; i < sNumObjects; ++i) {
|
||||
dAcObjBase_c *pObj = mObjs[i].get();
|
||||
if (isProfile(pObj, fProfile::BOMB)) {
|
||||
if (static_cast<dAcBomb_c *>(pObj)->isState(dAcBomb_c::StateID_Explode)) {
|
||||
mObjs[i].unlink();
|
||||
mCounter[i] = 0;
|
||||
}
|
||||
} else {
|
||||
if (--mCounter[i] == 0) {
|
||||
mObjs[i].unlink();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Try to bubble objects left
|
||||
// This seems buggy if multiple objects arent link consecutively
|
||||
int lastOccupiedObject = sNumObjects;
|
||||
for (int i = sNumObjects - 1; i >= 0; --i) {
|
||||
// Skip Occupied objects
|
||||
if (mObjs[i].isLinked()) {
|
||||
lastOccupiedObject = i;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lastOccupiedObject != sNumObjects) {
|
||||
mObjs[i].link(mObjs[lastOccupiedObject].get());
|
||||
mCounter[i] = mCounter[lastOccupiedObject];
|
||||
mObjs[lastOccupiedObject].unlink();
|
||||
|
||||
lastOccupiedObject = sNumObjects;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dAcObjBase_c *dAcPy_c::ObjectArray::get(s32 index) {
|
||||
if (index >= sNumObjects) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return mObjs[index].get();
|
||||
}
|
||||
|
||||
void dAcPy_c::ObjectArray::removeBombs() {
|
||||
for (int i = 0; i < sNumObjects; ++i) {
|
||||
dAcObjBase_c *pObj = get(i);
|
||||
if (pObj != nullptr) {
|
||||
if (pObj->mProfileName == fProfile::BOMB) {
|
||||
dAcBomb_c *pBomb = static_cast<dAcBomb_c *>(pObj);
|
||||
pBomb->deleteRequest();
|
||||
pBomb->mEffect1.remove(true);
|
||||
pBomb->mEffect2.remove(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ int dAcBoomerang_c::create() {
|
||||
|
||||
mAcch.Set(this, 1, &mAcchCir);
|
||||
mAcch.SetGroundUpY(20.f);
|
||||
mAcch.SetField_0xD4(30.f);
|
||||
mAcch.SetRoofCrrHeight(30.f);
|
||||
mAcch.ClrRoofNone();
|
||||
mAcch.SetBeetle();
|
||||
mAcch.OnWaterGrp();
|
||||
|
||||
@@ -53,19 +53,19 @@ dBgS_Acch::dBgS_Acch()
|
||||
field_0x0A8(0.0f),
|
||||
field_0x0AC(0.0f),
|
||||
mGroundHeight(-1e9f),
|
||||
field_0x0B4(120.0f),
|
||||
mGndChkOffset(120.0f),
|
||||
field_0x0C8(0.0f),
|
||||
field_0x0CC(0.0f),
|
||||
mRoofHeight(1e9f),
|
||||
field_0x0D4(1.0f),
|
||||
mRoofCrrHeight(1.0f),
|
||||
field_0x0D8(0.0f),
|
||||
mpOutPolyInfo(nullptr),
|
||||
mRoofH_0x0E0(0.0f),
|
||||
mGroundH_0x0E4(0.0f),
|
||||
field_0x0E8(1e9f),
|
||||
field_0x1D0(-1.0f),
|
||||
field_0x2F4(1000.0f),
|
||||
field_0x390(0),
|
||||
mWtrCheckOffset(1000.0f),
|
||||
mWtrMode(0),
|
||||
field_0x394(0) {
|
||||
SetPolyPassChk(GetPolyPassChkInfo());
|
||||
SetGrpPassChk(GetGrpPassChkInfo());
|
||||
@@ -159,7 +159,7 @@ void dBgS_Acch::GroundCheck(dBgS &bgs, bool param2) {
|
||||
mVec3_c gnd_pos = *GetPos();
|
||||
|
||||
// This Ordering is weird
|
||||
f32 temp = (field_0x0B4 - field_0x0A8) + field_0x0AC;
|
||||
f32 temp = (mGndChkOffset - field_0x0A8) + field_0x0AC;
|
||||
if (mFlags & ACCH_FLAG_0x20000) {
|
||||
if (temp <= 1.1f) {
|
||||
temp = 1.1f;
|
||||
@@ -199,7 +199,7 @@ void dBgS_Acch::GroundCheck(dBgS &bgs, bool param2) {
|
||||
}
|
||||
|
||||
if (gnd_pos.y < mpPos->y + field_0x0E8 &&
|
||||
mpPos->y + field_0x0E8 < (field_0x0B4 - field_0x0A8) + field_0x0AC + mpPos->y) {
|
||||
mpPos->y + field_0x0E8 < (mGndChkOffset - field_0x0A8) + field_0x0AC + mpPos->y) {
|
||||
gnd_pos.y = mpPos->y + field_0x0E8;
|
||||
}
|
||||
|
||||
@@ -277,11 +277,11 @@ void dBgS_Acch::GroundRoofProc(dBgS &bgs, bool param2) {
|
||||
mRoofHeight = bgs.RoofChk(&mRoof);
|
||||
|
||||
if (mRoofHeight != 1e9f) {
|
||||
if (mpPos->y + field_0x0D4 > mRoofHeight) {
|
||||
field_0x0D8 = mRoofHeight - field_0x0D4;
|
||||
if (mpPos->y + mRoofCrrHeight > mRoofHeight) {
|
||||
field_0x0D8 = mRoofHeight - mRoofCrrHeight;
|
||||
SetRoofHit();
|
||||
} else if (field_0x0C8 + field_0x0D4 > mRoofHeight) {
|
||||
field_0x0D8 = mRoofHeight - field_0x0D4;
|
||||
} else if (field_0x0C8 + mRoofCrrHeight > mRoofHeight) {
|
||||
field_0x0D8 = mRoofHeight - mRoofCrrHeight;
|
||||
SetRoofHit();
|
||||
}
|
||||
}
|
||||
@@ -414,8 +414,8 @@ void dBgS_Acch::SphCheck() {
|
||||
if (height > field_0x0A8 && field_0x0A8 > 0.0f) {
|
||||
height = field_0x0A8;
|
||||
}
|
||||
if (height > field_0x0D4 && field_0x0D4 > 1.0f) {
|
||||
height = field_0x0D4;
|
||||
if (height > mRoofCrrHeight && mRoofCrrHeight > 1.0f) {
|
||||
height = mRoofCrrHeight;
|
||||
}
|
||||
height *= 0.8f;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user