metaforce/Runtime/Weapon/CPlayerGun.hpp

269 lines
8.1 KiB
C++
Raw Normal View History

#ifndef __URDE_CPLAYERGUN_HPP__
#define __URDE_CPLAYERGUN_HPP__
#include "RetroTypes.hpp"
#include "Character/CActorLights.hpp"
#include "CFidget.hpp"
#include "zeus/CTransform.hpp"
#include "zeus/CAABox.hpp"
2016-11-22 20:43:16 +00:00
#include "World/CPlayerCameraBob.hpp"
#include "CGunMotion.hpp"
#include "CGrappleArm.hpp"
#include "CAuxWeapon.hpp"
#include "CPowerBeam.hpp"
#include "CIceBeam.hpp"
#include "CWaveBeam.hpp"
#include "CPlasmaBeam.hpp"
#include "CPhazonBeam.hpp"
#include "Particle/CElementGen.hpp"
#include "Character/CModelData.hpp"
2016-11-22 20:43:16 +00:00
#include "World/CWorldShadow.hpp"
2017-06-12 04:23:34 +00:00
#include "World/ScriptObjectSupport.hpp"
#include "Graphics/CRainSplashGenerator.hpp"
namespace urde
{
2017-07-16 06:13:37 +00:00
class CFinalInput;
class CPlayerGun
{
2017-04-04 05:48:13 +00:00
public:
enum class EMissleMode
{
Inactive,
Active
};
2017-08-16 05:34:02 +00:00
enum class EBWeapon
{
};
2017-04-04 05:48:13 +00:00
private:
2017-08-16 05:34:02 +00:00
class CGunMorph
{
float x0_ = 0.f;
float x4_gunTransformTime;
float x8_ = 0.f;
float xc_ = 0.1f;
float x10_holoHoldTime;
float x14_ = 2.f;
2017-08-16 05:34:02 +00:00
float x18_transitionFactor = 1.f;
u32 x1c_ = 2;
u32 x20_ = 1;
union
{
struct
{
bool x24_24_ : 1;
bool x24_25_ : 1;
};
2017-08-16 05:34:02 +00:00
u32 _dummy = 0;
};
2017-08-16 05:34:02 +00:00
public:
CGunMorph(float gunTransformTime, float holoHoldTime)
: x4_gunTransformTime(gunTransformTime), x10_holoHoldTime(std::fabs(holoHoldTime)) {}
2017-08-16 05:34:02 +00:00
float GetTransitionFactor() const { return x18_transitionFactor; }
};
class CMotionState
{
static float gGunExtendDistance;
public:
static void SetExtendDistance(float d) { gGunExtendDistance = d; }
};
CActorLights x0_lights;
u32 x2e0_ = 0;
u32 x2e4_ = 0;
u32 x2e8_ = 0;
2017-08-16 05:34:02 +00:00
u32 x2ec_firing = 0;
u32 x2f0_ = 0;
u32 x2f4_ = 0;
u32 x2f8_ = 1;
u32 x2fc_ = 0;
u32 x300_ = 0;
u32 x304_ = 0;
2017-02-18 02:19:50 +00:00
u32 x308_bombCount = 3;
u32 x30c_ = 0;
2017-04-09 06:14:22 +00:00
u32 x310_selectedBeam = 0;
u32 x314_pendingSelectedBeam = 0;
u32 x318_ = 0;
2017-04-04 05:48:13 +00:00
EMissleMode x31c_missileMode = EMissleMode::Inactive;
u32 x320_ = 0;
u32 x324_ = 4;
u32 x328_ = 0x2000;
u32 x32c_ = 0;
2017-07-23 23:45:04 +00:00
u32 x330_chargeWeaponIdx = 0;
u32 x334_ = 0;
u32 x338_ = 0;
u32 x33c_ = 0;
2017-04-04 05:48:13 +00:00
float x340_chargeBeamFactor = 0.f;
float x344_ = 0.f;
float x348_ = 0.f;
float x34c_ = 0.f;
float x350_ = 0.f;
float x354_bombFuseTime;
float x358_bombDropDelayTime;
2017-02-18 02:19:50 +00:00
float x35c_bombTime = 0.f;
float x360_ = 0.f;
float x364_ = 0.f;
float x368_ = 0.f;
float x36c_ = 1.f;
float x370_ = 1.f;
float x374_ = 0.f;
float x378_ = 0.f;
float x37c_ = 0.f;
float x380_ = 0.f;
float x384_ = 0.f;
float x388_ = 0.f;
float x38c_ = 0.f;
float x390_ = 0.f;
float x394_ = 0.f;
float x398_damageAmt = 0.f;
float x39c_ = 0.f;
float x3a0_ = 0.f;
CFidget x3a4_fidget;
zeus::CVector3f x3dc_damageLocation;
2017-07-19 17:47:57 +00:00
zeus::CTransform x3e8_xf;
zeus::CTransform x418_;
zeus::CTransform x448_;
2017-07-23 23:45:04 +00:00
zeus::CTransform x478_assistAimXf;
zeus::CTransform x4a8_;
zeus::CTransform x4d8_;
zeus::CTransform x508_;
TUniqueId x538_thisId;
TUniqueId x53a_ = kInvalidUniqueId;
TUniqueId x53c_ = kInvalidUniqueId;
std::vector<CToken> x540_handAnimTokens;
CPlayerCameraBob x550_camBob;
u32 x658_ = 1;
float x65c_ = 0.f;
float x660_ = 0.f;
float x664_ = 0.f;
float x668_aimVerticalSpeed;
float x66c_aimHorizontalSpeed;
TUniqueId x670_ = kInvalidUniqueId;
u32 x674_ = 0;
CGunMorph x678_morph;
bool x6a0_24_ = true;
float x6a4_ = 0.f;
float x6a8_ = 0.f;
float x6ac_ = 0.f;
float x6b0_ = 0.f;
float x6b4_ = 0.f;
float x6b8_ = 0.f;
float x6bc_ = 0.f;
u32 x6c0_ = 0;
u32 x6c4_ = 0;
zeus::CAABox x6c8_;
CModelData x6e0_rightHandModel;
CGunWeapon* x72c_currentBeam = nullptr;
u32 x730_ = 0;
u32 x734_ = 0;
CGunWeapon* x738_nextBeam = nullptr;
std::unique_ptr<CGunMotion> x73c_gunMotion;
std::unique_ptr<CGrappleArm> x740_grappleArm;
std::unique_ptr<CAuxWeapon> x744_auxWeapon;
std::unique_ptr<CRainSplashGenerator> x748_rainSplashGenerator;
std::unique_ptr<CPowerBeam> x74c_powerBeam;
std::unique_ptr<CIceBeam> x750_iceBeam;
std::unique_ptr<CWaveBeam> x754_waveBeam;
std::unique_ptr<CPlasmaBeam> x758_plasmaBeam;
std::unique_ptr<CPhazonBeam> x75c_phazonBeam;
CGunWeapon* x760_selectableBeams[4] = {}; // Used to be reserved_vector
std::unique_ptr<CElementGen> x774_holoTransitionGen;
std::unique_ptr<u32> x77c_;
rstl::reserved_vector<rstl::reserved_vector<TLockedToken<CGenDescription>, 2>, 2> x784_bombEffects;
rstl::reserved_vector<TLockedToken<CGenDescription>, 5> x7c0_auxMuzzleEffects;
rstl::reserved_vector<std::unique_ptr<CElementGen>, 5> x800_auxMuzzleGenerators;
std::unique_ptr<CWorldShadow> x82c_shadow;
s16 x830 = -1;
union
{
struct
{
bool x832_24_ : 1;
bool x832_25_ : 1;
bool x832_26_ : 1;
bool x832_27_ : 1;
bool x832_28_ : 1;
bool x832_29_ : 1;
bool x832_30_ : 1;
bool x832_31_ : 1;
2017-07-20 06:04:40 +00:00
bool x833_24_isFidgeting : 1;
bool x833_25_ : 1;
bool x833_26_ : 1;
bool x833_27_ : 1;
bool x833_28_ : 1;
bool x833_29_ : 1;
bool x833_30_ : 1;
bool x833_31_ : 1;
2017-04-04 05:48:13 +00:00
bool x834_24_charging : 1;
bool x834_25_ : 1;
bool x834_26_ : 1;
bool x834_27_ : 1;
bool x834_28_ : 1;
bool x834_29_ : 1;
bool x834_30_ : 1;
bool x834_31_ : 1;
bool x835_24_ : 1;
bool x835_25_ : 1;
bool x835_26_ : 1;
bool x835_27_ : 1;
2017-04-08 20:40:36 +00:00
bool x835_28_bombReady : 1;
bool x835_29_powerBombReady : 1;
bool x835_30_ : 1;
2017-08-19 06:52:13 +00:00
bool x835_31_actorAttached : 1;
};
u32 _dummy = 0;
};
void InitBeamData();
void InitBombData();
void InitMuzzleData();
void InitCTData();
void LoadHandAnimTokens();
public:
explicit CPlayerGun(TUniqueId playerId);
2017-08-13 05:26:14 +00:00
void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&);
void AsyncLoadSuit(CStateManager& mgr);
2017-07-31 05:19:05 +00:00
void TouchModel(const CStateManager& stateMgr);
2017-04-04 05:48:13 +00:00
EMissleMode GetMissleMode() const { return x31c_missileMode; }
2017-07-20 06:04:40 +00:00
bool IsFidgeting() const { return x833_24_isFidgeting; }
2017-04-08 20:40:36 +00:00
bool IsCharging() const { return x834_24_charging; }
float GetChargeBeamFactor() const { return x340_chargeBeamFactor; }
bool IsBombReady() const { return x835_28_bombReady; }
u32 GetBombCount() const { return x308_bombCount; }
bool IsPowerBombReady() const { return x835_29_powerBombReady; }
2017-04-09 06:14:22 +00:00
u32 GetSelectedBeam() const { return x310_selectedBeam; }
u32 GetPendingSelectedBeam() const { return x314_pendingSelectedBeam; }
const CGunMorph& GetGunMorph() const { return x678_morph; }
2017-08-16 05:34:02 +00:00
float GetHoloTransitionFactor() const { return x678_morph.GetTransitionFactor(); }
2017-07-19 17:47:57 +00:00
void SetTransform(const zeus::CTransform& xf) { x3e8_xf = xf; }
2017-07-23 23:45:04 +00:00
void SetAssistAimTransform(const zeus::CTransform& xf) { x478_assistAimXf = xf; }
CGrappleArm& GetGrappleArm() { return *x740_grappleArm; }
void DamageRumble(const zeus::CVector3f& location, float damage, const CStateManager& mgr);
2017-07-16 06:13:37 +00:00
void ProcessInput(const CFinalInput& input, CStateManager& mgr);
2017-07-17 03:04:14 +00:00
void ResetIdle(CStateManager& mgr);
void CancelFiring(CStateManager& mgr);
2017-07-23 23:45:04 +00:00
float GetBeamVelocity() const;
2017-08-16 05:34:02 +00:00
void Update(float grappleSwingT, float cameraBobT, float dt, CStateManager& mgr);
2017-07-31 05:19:05 +00:00
void PreRender(const CStateManager& mgr, const zeus::CFrustum& frustum, const zeus::CVector3f& camPos);
void Render(const CStateManager& mgr, const zeus::CVector3f& pos, const CModelFlags& flags) const;
void AddToRenderer(const zeus::CFrustum& frustum, const CStateManager& mgr) const;
2017-08-16 05:34:02 +00:00
bool GetFiring() const { return x2ec_firing != 0; }
TUniqueId DropPowerBomb(CStateManager& mgr);
2017-08-19 06:52:13 +00:00
void SetActorAttached(bool b) { x835_31_actorAttached = b; }
};
}
#endif // __URDE_CPLAYERGUN_HPP__