metaforce/Runtime/Weapon/CProjectileWeapon.hpp

103 lines
3.9 KiB
C++
Raw Normal View History

2017-03-24 05:30:16 +00:00
#ifndef __URDE_CPROJECTILEWEAPON_HPP__
#define __URDE_CPROJECTILEWEAPON_HPP__
#include "RetroTypes.hpp"
#include "CRandom16.hpp"
#include "CToken.hpp"
#include "zeus/CVector3f.hpp"
#include "Particle/CElementGen.hpp"
#include "Particle/CParticleSwoosh.hpp"
#include "Particle/CGenDescription.hpp"
#include "Particle/CSwooshDescription.hpp"
#include "Particle/CWeaponDescription.hpp"
2018-02-10 06:26:12 +00:00
#include "Collision/CCollisionResponseData.hpp"
2017-03-24 05:30:16 +00:00
namespace urde
{
class CModel;
2018-02-10 06:26:12 +00:00
class CDecalDescription;
class CGenDescription;
2017-03-24 05:30:16 +00:00
class CProjectileWeapon
{
2017-06-11 02:57:35 +00:00
static u16 g_GlobalSeed;
TLockedToken<CWeaponDescription> x4_weaponDesc;
CRandom16 x10_random;
2018-02-09 07:12:26 +00:00
zeus::CTransform x14_localToWorldXf;
zeus::CTransform x44_localXf;
2018-02-10 06:26:12 +00:00
zeus::CVector3f x74_worldOffset;
zeus::CVector3f x80_localOffset = zeus::CVector3f::skZero;
zeus::CVector3f x8c_projOffset = zeus::CVector3f::skZero;
zeus::CVector3f x98_scale = zeus::CVector3f::skOne;
zeus::CVector3f xa4_localOffset2 = zeus::CVector3f::skZero;
zeus::CVector3f xb0_velocity = zeus::CVector3f::skZero;
zeus::CVector3f xbc_gravity = zeus::CVector3f::skZero;
zeus::CColor xc8_ambientLightColor = zeus::CColor::skWhite;
double xd0_curTime = 0.0;
double xd8_remainderTime = 0.0;
float xe0_maxTurnRate = 0.f;
int xe4_flags;
int xe8_lifetime = 0;
int xec_childSystemUpdateRate = 0;
int xf0_ = 0;
int xf4_curFrame = 0;
int xf8_lastParticleFrame = -1;
std::unique_ptr<CElementGen> xfc_APSMGen;
std::unique_ptr<CElementGen> x100_APS2Gen;
std::unique_ptr<CElementGen> x104_;
rstl::optional_object<TLockedToken<CModel>> x108_model;
std::unique_ptr<CParticleSwoosh> x118_swoosh1;
std::unique_ptr<CParticleSwoosh> x11c_swoosh2;
std::unique_ptr<CParticleSwoosh> x120_swoosh3;
union
{
struct
{
2018-02-09 07:12:26 +00:00
bool x124_24_active : 1;
2018-02-10 06:26:12 +00:00
bool x124_25_APSO : 1;
bool x124_26_AP11 : 1;
bool x124_27_AP21 : 1;
bool x124_28_AS11 : 1;
bool x124_29_AS12 : 1;
bool x124_30_AS13 : 1;
bool x124_31_VMD2 : 1;
};
u32 _dummy = 0;
};
2017-03-24 05:30:16 +00:00
public:
2018-02-10 06:26:12 +00:00
CProjectileWeapon(const TToken<CWeaponDescription>& wDesc, const zeus::CVector3f& worldOffset,
2018-02-09 07:12:26 +00:00
const zeus::CTransform& orient, const zeus::CVector3f& scale, s32);
virtual ~CProjectileWeapon() = default;
bool IsProjectileActive() const { return x124_24_active; }
2018-02-10 06:26:12 +00:00
const zeus::CVector3f& GetVelocity() const { return xb0_velocity; }
void SetVelocity(const zeus::CVector3f& vel) { xb0_velocity = vel; }
2018-02-09 07:12:26 +00:00
float GetMaxTurnRate() const { return xe0_maxTurnRate; }
2018-02-10 06:26:12 +00:00
float GetAudibleFallOff() const;
float GetAudibleRange() const;
rstl::optional_object<TLockedToken<CDecalDescription>>
GetDecalForCollision(EWeaponCollisionResponseTypes type) const;
u16 GetSoundIdForCollision(EWeaponCollisionResponseTypes type) const;
rstl::optional_object<TLockedToken<CGenDescription>>
CollisionOccured(EWeaponCollisionResponseTypes type, bool alive, bool b2, const zeus::CVector3f& v1,
const zeus::CVector3f& v2, const zeus::CVector3f& target);
2018-02-09 07:12:26 +00:00
TLockedToken<CWeaponDescription> GetWeaponDescription() const { return x4_weaponDesc; }
2018-02-10 06:26:12 +00:00
void RenderParticles() const;
virtual void UpdateParticles(double dt);
virtual void Render() const;
bool IsSystemDeletable() const;
void UpdateChildParticleSystems(float);
2018-02-10 06:26:12 +00:00
void UpdatePSTranslationAndOrientation();
2018-02-09 07:12:26 +00:00
void SetWorldSpaceOrientation(const zeus::CTransform& xf);
void SetRelativeOrientation(const zeus::CTransform& xf) { x44_localXf = xf; }
2018-02-10 06:26:12 +00:00
virtual zeus::CVector3f GetTranslation() const;
virtual zeus::CTransform GetTransform() const;
void UpdateParticleFX();
virtual void Update(float dt);
void SetGravity(const zeus::CVector3f& grav) { xbc_gravity = grav; }
2017-06-11 02:57:35 +00:00
static void SetGlobalSeed(u16 seed) { g_GlobalSeed = seed; }
2017-03-24 05:30:16 +00:00
};
}
#endif // __URDE_CPROJECTILEWEAPON_HPP__