mirror of
https://github.com/PrimeDecomp/prime.git
synced 2026-07-12 18:18:56 -07:00
86 lines
2.7 KiB
C++
86 lines
2.7 KiB
C++
#ifndef _CSHOCKWAVE
|
|
#define _CSHOCKWAVE
|
|
|
|
#include "MetroidPrime/CActor.hpp"
|
|
#include "MetroidPrime/CDamageInfo.hpp"
|
|
|
|
#include <Kyoto/Particles/CElectricDescription.hpp>
|
|
#include <rstl/optional_object.hpp>
|
|
|
|
class CGenDescription;
|
|
class CElementGen;
|
|
|
|
class CShockWaveInfo {
|
|
public:
|
|
CShockWaveInfo(const CAssetId part, const CDamageInfo& dInfo, const float initialExpansionSpeed,
|
|
CAssetId weapon, ushort sfx)
|
|
: x0_(8)
|
|
, mParticleDesc(part)
|
|
, mDamageInfo(dInfo)
|
|
, mInitialRadius(0.f)
|
|
, mWidthPercent(0.5f)
|
|
, mInitialExpansionSpeed(initialExpansionSpeed)
|
|
, mSpeedIncrease(0.f)
|
|
, mWeaponDesc(weapon)
|
|
, mElectrocuteSfx(sfx) {}
|
|
|
|
const CAssetId GetParticleDescId() const { return mParticleDesc; }
|
|
const CDamageInfo& GetDamageInfo() const { return mDamageInfo; }
|
|
float GetInitialRadius() const { return mInitialRadius; }
|
|
float GetWidthPercent() const { return mWidthPercent; }
|
|
float GetInitialExpansionSpeed() const { return mInitialExpansionSpeed; }
|
|
float GetSpeedIncrease() const { return mSpeedIncrease; }
|
|
void SetSpeedIncrease(float speed) { mSpeedIncrease = speed; }
|
|
CAssetId GetWeaponDescId() const { return mWeaponDesc; }
|
|
ushort GetElectrocuteSfx() const { return mElectrocuteSfx; }
|
|
|
|
private:
|
|
uint x0_;
|
|
CAssetId mParticleDesc;
|
|
CDamageInfo mDamageInfo;
|
|
float mInitialRadius;
|
|
float mWidthPercent;
|
|
float mInitialExpansionSpeed;
|
|
float mSpeedIncrease;
|
|
CAssetId mWeaponDesc;
|
|
ushort mElectrocuteSfx;
|
|
};
|
|
class CShockWave : public CActor {
|
|
public:
|
|
CShockWave(const TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
|
|
const CTransform4f& xf, const TUniqueId parent, const CShockWaveInfo& data,
|
|
const float minActiveTime, const float knockback);
|
|
|
|
void Accept(IVisitor& visitor) override;
|
|
void Think(float dt, CStateManager& mgr) override;
|
|
void Render(const CStateManager& mgr) const override;
|
|
void AddToRenderer(const CFrustumPlanes& frustum, const CStateManager& mgr) const override;
|
|
void Touch(CActor& actor, CStateManager& mgr) override;
|
|
|
|
rstl::optional_object< CAABox > GetTouchBounds() const override;
|
|
|
|
bool WasAlreadyDamaged(const TUniqueId uid) const;
|
|
|
|
void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) override;
|
|
|
|
private:
|
|
TUniqueId mParentId;
|
|
CDamageInfo mDamageInfo;
|
|
TToken< CGenDescription > mElementGenDesc;
|
|
rstl::single_ptr< CElementGen > mElementGen;
|
|
CShockWaveInfo mShockWaveInfo;
|
|
float mRadius;
|
|
float mExpansionSpeed;
|
|
float mActiveTime;
|
|
float mMinActiveTime;
|
|
float mKnockBack;
|
|
float mTimeSinceHitPlayerInAir;
|
|
float mTimeSinceHitPlayer;
|
|
bool mHitPlayerInAir;
|
|
bool mHitPlayer;
|
|
TEntityList mHitIds;
|
|
rstl::optional_object< TToken< CElectricDescription > > mElectricDesc;
|
|
TUniqueId mLightId;
|
|
};
|
|
#endif // _CSHOCKWAVE
|