2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-05-13 21:11:21 +00:00

CFlyingPirate: First draft almost done

This commit is contained in:
Luke Street 2020-03-13 04:11:17 -04:00
parent 11ea9d3aa6
commit 13d8c3fdd1
9 changed files with 1049 additions and 135 deletions

View File

@ -77,13 +77,13 @@ public:
explicit operator bool() const { return HasReference(); } explicit operator bool() const { return HasReference(); }
bool HasReference() const { return x0_objRef != nullptr; } bool HasReference() const { return x0_objRef != nullptr; }
virtual void Unlock(); void Unlock();
void Lock(); void Lock();
bool IsLocked() const { return x4_lockHeld; } bool IsLocked() const { return x4_lockHeld; }
bool IsLoaded() const; bool IsLoaded() const;
IObj* GetObj(); IObj* GetObj();
const IObj* GetObj() const { return const_cast<CToken*>(this)->GetObj(); } const IObj* GetObj() const { return const_cast<CToken*>(this)->GetObj(); }
virtual CToken& operator=(const CToken& other); CToken& operator=(const CToken& other);
CToken& operator=(CToken&& other); CToken& operator=(CToken&& other);
CToken() = default; CToken() = default;
CToken(const CToken& other); CToken(const CToken& other);
@ -101,6 +101,7 @@ public:
return TObjOwnerDerivedFromIObj<T>::GetNewDerivedObject(std::move(obj)); return TObjOwnerDerivedFromIObj<T>::GetNewDerivedObject(std::move(obj));
} }
TToken() = default; TToken() = default;
virtual ~TToken() = default;
TToken(const CToken& other) : CToken(other) {} TToken(const CToken& other) : CToken(other) {}
TToken(CToken&& other) : CToken(std::move(other)) {} TToken(CToken&& other) : CToken(std::move(other)) {}
TToken(std::unique_ptr<T>&& obj) : CToken(GetIObjObjectFor(std::move(obj))) {} TToken(std::unique_ptr<T>&& obj) : CToken(GetIObjObjectFor(std::move(obj))) {}
@ -108,6 +109,8 @@ public:
*this = CToken(GetIObjObjectFor(std::move(obj))); *this = CToken(GetIObjObjectFor(std::move(obj)));
return this; return this;
} }
virtual void Unlock() { CToken::Unlock(); }
virtual void Lock() { CToken::Lock(); }
virtual T* GetObj() { virtual T* GetObj() {
TObjOwnerDerivedFromIObj<T>* owner = static_cast<TObjOwnerDerivedFromIObj<T>*>(CToken::GetObj()); TObjOwnerDerivedFromIObj<T>* owner = static_cast<TObjOwnerDerivedFromIObj<T>*>(CToken::GetObj());
if (owner) if (owner)
@ -115,6 +118,10 @@ public:
return nullptr; return nullptr;
} }
virtual const T* GetObj() const { return const_cast<TToken<T>*>(this)->GetObj(); } virtual const T* GetObj() const { return const_cast<TToken<T>*>(this)->GetObj(); }
virtual TToken& operator=(const CToken& other) {
CToken::operator=(other);
return *this;
}
T* operator->() { return GetObj(); } T* operator->() { return GetObj(); }
const T* operator->() const { return GetObj(); } const T* operator->() const { return GetObj(); }
T& operator*() { return *GetObj(); } T& operator*() { return *GetObj(); }
@ -142,12 +149,12 @@ public:
} }
TCachedToken& operator=(const TCachedToken& other) { TCachedToken& operator=(const TCachedToken& other) {
CToken::operator=(other); TToken<T>::operator=(other);
m_obj = nullptr; m_obj = nullptr;
return *this; return *this;
} }
TCachedToken& operator=(const CToken& other) { TCachedToken& operator=(const CToken& other) {
CToken::operator=(other); TToken<T>::operator=(other);
m_obj = nullptr; m_obj = nullptr;
return *this; return *this;
} }

View File

@ -29,9 +29,9 @@ public:
CAnimFormatUnion(CInputStream& in, IObjectStore& store); CAnimFormatUnion(CInputStream& in, IObjectStore& store);
~CAnimFormatUnion(); ~CAnimFormatUnion();
EAnimFormat GetFormat() const { return x0_format; } EAnimFormat GetFormat() const { return x0_format; }
const CAnimSource& GetAsCAnimSource() const { return *reinterpret_cast<const CAnimSource*>(x4_storage); } CAnimSource& GetAsCAnimSource() { return *reinterpret_cast<CAnimSource*>(x4_storage); }
const CFBStreamedCompression& GetAsCFBStreamedCompression() const { CFBStreamedCompression& GetAsCFBStreamedCompression() {
return *reinterpret_cast<const CFBStreamedCompression*>(x4_storage); return *reinterpret_cast<CFBStreamedCompression*>(x4_storage);
} }
}; };

View File

@ -71,31 +71,35 @@ template <class T>
class TSubAnimTypeToken : public TLockedToken<CAllFormatsAnimSource> {}; class TSubAnimTypeToken : public TLockedToken<CAllFormatsAnimSource> {};
template <> template <>
class TSubAnimTypeToken<CAnimSource> : public TLockedToken<CAllFormatsAnimSource> { class TSubAnimTypeToken<CAnimSource> : public TLockedToken<CAnimSource> {
public: public:
TSubAnimTypeToken<CAnimSource>(const TLockedToken<CAllFormatsAnimSource>& token) TSubAnimTypeToken<CAnimSource>(const TLockedToken<CAllFormatsAnimSource>& token) : TLockedToken<CAnimSource>(token) {}
: TLockedToken<CAllFormatsAnimSource>(token) {}
const CAnimSource* GetObj() const { CAnimSource* GetObj() {
const CAllFormatsAnimSource* source = TLockedToken<CAllFormatsAnimSource>::GetObj(); CAllFormatsAnimSource* source = reinterpret_cast<CAllFormatsAnimSource*>(TLockedToken<CAnimSource>::GetObj());
return &source->GetAsCAnimSource(); return &source->GetAsCAnimSource();
} }
const CAnimSource* operator->() const { return GetObj(); }
const CAnimSource& operator*() const { return *GetObj(); } const CAnimSource* GetObj() const {
return const_cast<TSubAnimTypeToken<CAnimSource>*>(this)->GetObj();
}
}; };
template <> template <>
class TSubAnimTypeToken<CFBStreamedCompression> : public TLockedToken<CAllFormatsAnimSource> { class TSubAnimTypeToken<CFBStreamedCompression> : public TLockedToken<CFBStreamedCompression> {
public: public:
TSubAnimTypeToken<CFBStreamedCompression>(const TLockedToken<CAllFormatsAnimSource>& token) TSubAnimTypeToken<CFBStreamedCompression>(const TLockedToken<CAllFormatsAnimSource>& token)
: TLockedToken<CAllFormatsAnimSource>(token) {} : TLockedToken<CFBStreamedCompression>(token) {}
const CFBStreamedCompression* GetObj() const { CFBStreamedCompression* GetObj() {
const CAllFormatsAnimSource* source = TLockedToken<CAllFormatsAnimSource>::GetObj(); CAllFormatsAnimSource* source =
reinterpret_cast<CAllFormatsAnimSource*>(TLockedToken<CFBStreamedCompression>::GetObj());
return &source->GetAsCFBStreamedCompression(); return &source->GetAsCFBStreamedCompression();
} }
const CFBStreamedCompression* operator->() const { return GetObj(); }
const CFBStreamedCompression& operator*() const { return *GetObj(); } const CFBStreamedCompression* GetObj() const {
return const_cast<TSubAnimTypeToken<CFBStreamedCompression>*>(this)->GetObj();
}
}; };
class IAnimReader { class IAnimReader {

File diff suppressed because it is too large Load Diff

View File

@ -17,34 +17,34 @@ public:
private: private:
class CFlyingPirateData { class CFlyingPirateData {
friend class CFlyingPirate; friend class CFlyingPirate;
float x0_; float x0_maxCoverDistance;
float x4_; float x4_hearingDistance;
int x8_; u32 x8_;
CProjectileInfo xc_projInfo1; CProjectileInfo xc_gunProjectileInfo;
u16 x34_sfx1; u16 x34_gunSfx;
CProjectileInfo x38_projInfo2; CProjectileInfo x38_altProjectileInfo1;
CProjectileInfo x60_projInfo3; CProjectileInfo x60_altProjectileInfo2;
float x88_; float x88_knockBackDelay;
float x8c_; float x8c_flyingHeight;
TCachedToken<CGenDescription> x90_particleGenDesc; TCachedToken<CGenDescription> x90_particleGenDesc;
CDamageInfo x9c_dInfo; CDamageInfo x9c_dInfo;
float xb8_; float xb8_;
float xbc_; float xbc_;
float xc0_; float xc0_;
float xc4_; float xc4_;
u16 xc8_sfx2; u16 xc8_ragDollSfx1;
u16 xca_sfx3; u16 xca_ragDollSfx2;
float xcc_; float xcc_coverCheckChance;
float xd0_; float xd0_;
float xd4_; float xd4_;
CAssetId xd8_; CAssetId xd8_particleGen1;
CAssetId xdc_; CAssetId xdc_particleGen2;
CAssetId xe0_; CAssetId xe0_particleGen3;
u16 xe4_sfx4; u16 xe4_knockBackSfx;
u16 xe6_sfx5; u16 xe6_deathSfx;
float xe8_; float xe8_aggressionChance;
float xec_; float xec_;
float xf0_; float xf0_projectileHomingDistance;
public: public:
CFlyingPirateData(CInputStream& in, u32 propCount); CFlyingPirateData(CInputStream& in, u32 propCount);
@ -63,7 +63,7 @@ private:
u16 x9c_; u16 x9c_;
int xa0_ = 0; int xa0_ = 0;
zeus::CVector3f xa4_; zeus::CVector3f xa4_;
char xb0_; // TODO flags bool xb0_24_ : 1;
public: public:
CFlyingPirateRagDoll(CStateManager& mgr, CFlyingPirate* actor, u16 w1, u16 w2); CFlyingPirateRagDoll(CStateManager& mgr, CFlyingPirate* actor, u16 w1, u16 w2);
@ -84,13 +84,13 @@ public:
void CalculateRenderBounds() override; void CalculateRenderBounds() override;
void DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) override; void DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, EUserEventType type, float dt) override;
void MassiveDeath(CStateManager& mgr) override; void MassiveDeath(CStateManager& mgr) override;
float GetGravityConstant() const override { return 50.f; /* TODO check flags */ } float GetGravityConstant() const override { return x6a0_25_isUnderwater ? 5.f : 50.f; }
CPathFindSearch* GetSearchPath() override { return &x6a8_pathFindSearch; } CPathFindSearch* GetSearchPath() override { return &x6a8_pathFindSearch; }
bool IsListening() const override { return true; } bool IsListening() const override { return true; }
bool KnockbackWhenFrozen() const override { return false; } bool KnockbackWhenFrozen() const override { return false; }
bool Listen(const zeus::CVector3f& pos, EListenNoiseType type) override; bool Listen(const zeus::CVector3f& pos, EListenNoiseType type) override;
void PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) override; void PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) override;
CProjectileInfo* GetProjectileInfo() override { return &x568_data.xc_projInfo1; } CProjectileInfo* GetProjectileInfo() override { return &x568_data.xc_gunProjectileInfo; }
void Think(float dt, CStateManager& mgr) override; void Think(float dt, CStateManager& mgr) override;
void Attack(CStateManager& mgr, EStateMsg msg, float arg) override; void Attack(CStateManager& mgr, EStateMsg msg, float arg) override;
@ -137,39 +137,50 @@ public:
private: private:
CFlyingPirateData x568_data; CFlyingPirateData x568_data;
rstl::reserved_vector<TCachedToken<CGenDescription>, 4> x65c_particleGenDescs; rstl::reserved_vector<TCachedToken<CGenDescription>, 3> x65c_particleGenDescs;
rstl::reserved_vector<std::unique_ptr<CElementGen>, 16> x684_particleGens; // was rstl::reserved_vector<rstl::optional_object<CElementGen *>, 3>
rstl::reserved_vector<std::unique_ptr<CElementGen>, 3> x684_particleGens;
bool x6a0_24_ : 1; bool x6a0_24_ : 1;
bool x6a0_25_ : 1; bool x6a0_25_isUnderwater : 1;
bool x6a0_27_ : 1; bool x6a0_26_hearShot : 1;
bool x6a0_29_ : 1; bool x6a0_27_canPatrol : 1;
bool x6a0_28_ : 1;
bool x6a0_29_checkForProjectiles : 1;
bool x6a0_30_ : 1; bool x6a0_30_ : 1;
bool x6a1_26_ : 1; bool x6a0_31_ : 1;
bool x6a1_24_ : 1;
bool x6a1_25_ : 1;
bool x6a1_26_isAttackingObject : 1;
bool x6a1_27_ : 1;
bool x6a1_28_ : 1; bool x6a1_28_ : 1;
bool x6a1_29_isMoving : 1;
bool x6a1_30_ : 1; bool x6a1_30_ : 1;
bool x6a1_31_ : 1; bool x6a1_31_ : 1;
bool x6a2_24_ : 1; bool x6a2_24_aggressive : 1;
bool x6a2_25_ : 1; bool x6a2_25_aggressionChecked : 1;
bool x6a2_26_jetpackActive : 1;
bool x6a2_27_sparksActive : 1;
bool x6a2_28_ : 1; bool x6a2_28_ : 1;
TUniqueId x6a4_id1 = kInvalidUniqueId; TUniqueId x6a4_currentCoverPoint = kInvalidUniqueId;
TUniqueId x6a6_id2 = kInvalidUniqueId; TUniqueId x6a6_id2 = kInvalidUniqueId;
CPathFindSearch x6a8_pathFindSearch; CPathFindSearch x6a8_pathFindSearch;
float x78c_ = 0.f; // not initialized in constructor?
int x790_ = 0; int x790_ = 0;
int x794_health; int x794_health;
CSegId x798_; CSegId x798_headSegId;
int x79c_ = -1; int x79c_ = -1;
CBoneTracking x7a0_boneTracking; CBoneTracking x7a0_boneTracking;
float x7d8_ = 0.f; float x7d8_ = 0.f;
int x7dc_ = 0; int x7dc_ = 0;
CSegId x7e0_; CSegId x7e0_gunSegId;
float x7e4_ = 1.f; float x7e4_ = 1.f;
TUniqueId x7e8_id3 = kInvalidUniqueId; TUniqueId x7e8_targetId = kInvalidUniqueId;
CBurstFire x7ec_burstFire; CBurstFire x7ec_burstFire;
pas::EStepDirection x84c_ = pas::EStepDirection::Invalid; pas::EStepDirection x84c_dodgeDirection = pas::EStepDirection::Invalid;
float x850_ = 3.f; float x850_height = 3.f;
float x854_ = FLT_MAX; float x854_ = FLT_MAX;
float x858_ = FLT_MAX; float x858_ = FLT_MAX;
TUniqueId x85c_ = kInvalidUniqueId; TUniqueId x85c_attackObjectId = kInvalidUniqueId;
float x860_ = 15.f; float x860_ = 15.f;
rstl::reserved_vector<CSegId, 4> x864_missileSegments; rstl::reserved_vector<CSegId, 4> x864_missileSegments;
float x86c_ = 0.f; float x86c_ = 0.f;
@ -181,18 +192,19 @@ private:
float x894_ = 1.f; float x894_ = 1.f;
float x898_ = 1.f; float x898_ = 1.f;
std::unique_ptr<CFlyingPirateRagDoll> x89c_ragDoll; std::unique_ptr<CFlyingPirateRagDoll> x89c_ragDoll;
TUniqueId x8a0_ = kInvalidUniqueId; TUniqueId x8a0_patrolTarget = kInvalidUniqueId;
float x8a4_ = 0.f; float x8a4_ = 0.f;
zeus::CVector3f AvoidActors(CStateManager& mgr); zeus::CVector3f AvoidActors(CStateManager& mgr);
bool CanFireMissiles(CStateManager& mgr); bool CanFireMissiles(CStateManager& mgr);
void CheckForProjectiles(CStateManager& mgr); void CheckForProjectiles(CStateManager& mgr);
void FireProjectile(CStateManager& mgr, const zeus::CVector3f& pos, float dt); void FireProjectile(CStateManager& mgr, float dt);
pas::EStepDirection GetDodgeDirection(CStateManager& mgr, float arg); pas::EStepDirection GetDodgeDirection(CStateManager& mgr, float arg);
zeus::CVector3f GetTargetPos(CStateManager& mgr); zeus::CVector3f GetTargetPos(CStateManager& mgr);
bool LineOfSightTest(CStateManager& mgr, const zeus::CVector3f& pos, const zeus::CVector3f& dir, CMaterialList materials); bool LineOfSightTest(CStateManager& mgr, const zeus::CVector3f& start, const zeus::CVector3f& end,
CMaterialList exclude);
void UpdateLandingSmoke(CStateManager& mgr, bool active); void UpdateLandingSmoke(CStateManager& mgr, bool active);
void UpdateParticleEffects(CStateManager& mgr, float f1, bool b1); void UpdateParticleEffects(CStateManager& mgr, float intensity, bool active);
void DeliverGetUp(); void DeliverGetUp();
void UpdateCantSeePlayer(CStateManager& mgr); void UpdateCantSeePlayer(CStateManager& mgr);
void AddToTeam(CStateManager& mgr); void AddToTeam(CStateManager& mgr);

View File

@ -333,5 +333,6 @@ public:
u8 GetModelAlphau8(const CStateManager& mgr) const override; u8 GetModelAlphau8(const CStateManager& mgr) const override;
float GetGravityConstant() const override; float GetGravityConstant() const override;
CProjectileInfo* GetProjectileInfo() override; CProjectileInfo* GetProjectileInfo() override;
bool GetEnableAim() const { return x637_25_enableAim; }
}; };
} // namespace urde::MP1 } // namespace urde::MP1

View File

@ -44,8 +44,8 @@ public:
s32 GetBurstType() const { return x0_burstType; } s32 GetBurstType() const { return x0_burstType; }
void Start(CStateManager& mgr); void Start(CStateManager& mgr);
void Update(CStateManager& mgr, float dt); void Update(CStateManager& mgr, float dt);
static zeus::CVector3f GetError(float xMag, float zMag); zeus::CVector3f GetError(float xMag, float zMag) const;
static zeus::CVector3f GetDistanceCompensatedError(float dist, float maxErrDist); zeus::CVector3f GetDistanceCompensatedError(float dist, float maxErrDist) const;
float GetMaxXError() const; float GetMaxXError() const;
float GetMaxZError() const; float GetMaxZError() const;
void SetFirstBurstIndex(s32 idx) { xc_firstBurstIdx = idx; } void SetFirstBurstIndex(s32 idx) { xc_firstBurstIdx = idx; }

View File

@ -130,6 +130,7 @@ public:
void Update(float dt, CStateManager& mgr, CPatterned& parent); void Update(float dt, CStateManager& mgr, CPatterned& parent);
void KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, const CDamageInfo& info, void KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, const CDamageInfo& info,
EKnockBackType type, float magnitude); EKnockBackType type, float magnitude);
void SetSeverity(pas::ESeverity v) { x7c_severity = v; }
void SetEnableFreeze(bool b) { x81_25_enableFreeze = b; } void SetEnableFreeze(bool b) { x81_25_enableFreeze = b; }
void SetEnableShock(bool b) { x81_26_enableShock = b; } void SetEnableShock(bool b) { x81_26_enableShock = b; }
void SetEnableBurn(bool b) { x81_27_enableBurn = b; } void SetEnableBurn(bool b) { x81_27_enableBurn = b; }
@ -146,4 +147,4 @@ public:
bool TestAvailableState(EKnockBackAnimationState s) const { return x80_availableStates.test(size_t(s)); } bool TestAvailableState(EKnockBackAnimationState s) const { return x80_availableStates.test(size_t(s)); }
}; };
} // namespace urde } // namespace urde

View File

@ -1365,7 +1365,7 @@ CEntity* ScriptLoader::LoadFlyingPirate(CStateManager& mgr, CInputStream& in, in
SScaledActorHead actHead = LoadScaledActorHead(in, mgr); SScaledActorHead actHead = LoadScaledActorHead(in, mgr);
auto pair = CPatternedInfo::HasCorrectParameterCount(in); auto pair = CPatternedInfo::HasCorrectParameterCount(in);
if (pair.first) if (!pair.first)
return nullptr; return nullptr;
CPatternedInfo pInfo(in, pair.second); CPatternedInfo pInfo(in, pair.second);