230 lines
6.2 KiB
C++
230 lines
6.2 KiB
C++
//========= Copyright © 1996-2008, Valve LLC, All rights reserved. ============
|
|
//
|
|
// Purpose: Class for rendering the player ships
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
|
|
#ifndef SHIP_H
|
|
#define SHIP_H
|
|
|
|
#include <list>
|
|
#include "GameEngine.h"
|
|
#include "SpaceWarEntity.h"
|
|
#include "PhotonBeam.h"
|
|
#include "SpaceWar.h"
|
|
|
|
#define MAXIMUM_SHIP_THRUST 150
|
|
|
|
#define SHIP_DEBRIS_PIECES 6
|
|
|
|
// Forward declaration
|
|
class CShip;
|
|
class CSpaceWarServer;
|
|
class CStatsAndAchievements;
|
|
|
|
// Simple class for the ship thrusters
|
|
class CForwardThrusters : public CVectorEntity
|
|
{
|
|
public:
|
|
CForwardThrusters( IGameEngine *pGameEngine, CShip *pShip );
|
|
|
|
// Run Frame
|
|
void RunFrame();
|
|
|
|
private:
|
|
CShip *m_pShip;
|
|
};
|
|
|
|
// Again, but in reverse
|
|
class CReverseThrusters : public CVectorEntity
|
|
{
|
|
public:
|
|
CReverseThrusters( IGameEngine *pGameEngine, CShip *pShip );
|
|
|
|
// Run Frame
|
|
void RunFrame();
|
|
|
|
private:
|
|
CShip *m_pShip;
|
|
};
|
|
|
|
// Class to represent debris after explosion
|
|
class CShipDebris : public CSpaceWarEntity
|
|
{
|
|
public:
|
|
CShipDebris( IGameEngine *pGameEngine, float xPos, float yPos, DWORD dwDebrisColor );
|
|
|
|
// Run Frame
|
|
void RunFrame();
|
|
private:
|
|
|
|
// We keep the debris spinning
|
|
float m_flRotationPerInterval;
|
|
};
|
|
|
|
class CShip : public CSpaceWarEntity
|
|
{
|
|
public:
|
|
// Constructor
|
|
CShip( IGameEngine *pGameEngine, bool bIsServerInstance, float xPos, float yPos, DWORD dwShipColor );
|
|
|
|
// Destructor
|
|
~CShip();
|
|
|
|
// Run a frame
|
|
void RunFrame();
|
|
|
|
// Render a frame
|
|
void Render();
|
|
|
|
// Update ship with data from server
|
|
void OnReceiveServerUpdate( ServerShipUpdateData_t *pUpdateData );
|
|
|
|
// Update the ship with data from a client
|
|
void OnReceiveClientUpdate( ClientSpaceWarUpdateData_t *pUpdateData );
|
|
|
|
// Get the update data for this ship client side (copying into memory passed in)
|
|
bool BGetClientUpdateData( ClientSpaceWarUpdateData_t *pUpdatedata );
|
|
|
|
// Build update data for the ship to send to clients
|
|
void BuildServerUpdate( ServerShipUpdateData_t *pUpdateData );
|
|
|
|
// Build update data for photon beams to send to clients
|
|
void BuildServerPhotonBeamUpdate( ServerShipUpdateData_t *pUpdateData );
|
|
|
|
// Reset vertex data for our object
|
|
void ResetVertexData();
|
|
|
|
// Set whether the ship is exploding
|
|
void SetExploding( bool bExploding );
|
|
|
|
// Rebuild the geometry when we change decoration
|
|
void BuildGeometry();
|
|
|
|
// Set whether the ship is disabled
|
|
void SetDisabled( bool bDisabled ) { m_bDisabled = bDisabled; }
|
|
|
|
// Set the initial rotation for the ship
|
|
void SetInitialRotation( float flRotation ) { SetAccumulatedRotation( flRotation ); }
|
|
|
|
// Setters for key bindings
|
|
void SetVKBindingLeft( DWORD dwVKLeft ) { m_dwVKLeft = dwVKLeft; }
|
|
void SetVKBindingRight( DWORD dwVKRight ) { m_dwVKRight = dwVKRight; }
|
|
void SetVKBindingForwardThrusters( DWORD dwVKForward ) { m_dwVKForwardThrusters = dwVKForward; }
|
|
void SetVKBindingReverseThrusters( DWORD dwVKReverse ) { m_dwVKReverseThrusters = dwVKReverse; }
|
|
void SetVKBindingFire( DWORD dwVKFire ) { m_dwVKFire = dwVKFire; }
|
|
|
|
// Check for photons which have hit the entity and destroy the photons
|
|
void DestroyPhotonsColldingWith( CVectorEntity *pTarget );
|
|
|
|
// Check whether any of the photons this ship has fired are colliding with the target
|
|
bool BCheckForPhotonsCollidingWith( CVectorEntity *pTarget );
|
|
|
|
// Check if the ship is currently exploding
|
|
bool BIsExploding() { return m_bExploding; }
|
|
|
|
// Check if the ship is currently disabled
|
|
bool BIsDisabled() { return m_bDisabled; }
|
|
|
|
// Set whether this ship instance is for the local player
|
|
// (meaning it should pay attention to key input and such)
|
|
void SetIsLocalPlayer( bool bValue ) { m_bIsLocalPlayer = bValue; }
|
|
bool BIsLocalPlayer() { return m_bIsLocalPlayer; }
|
|
|
|
// Accumulate stats for this ship
|
|
void AccumulateStats( CStatsAndAchievements *pStats );
|
|
|
|
// Get the name for this ship (only really works server side)
|
|
const char* GetPlayerName();
|
|
|
|
int GetShieldStrength() { return m_nShipShieldStrength; }
|
|
void SetShieldStrength( int strength ) { m_nShipShieldStrength = strength; }
|
|
|
|
// Update the vibration effects for the ship
|
|
void UpdateVibrationEffects();
|
|
|
|
private:
|
|
|
|
// Last time we sent an update on our local data to the server
|
|
uint64 m_ulLastClientUpdateTick;
|
|
|
|
// Last time we detected the thrust key go down
|
|
uint64 m_ulLastThrustStartedTickCount;
|
|
|
|
// Last time we fired a photon
|
|
uint64 m_ulLastPhotonTickCount;
|
|
|
|
// When we exploded
|
|
uint64 m_ulExplosionTickCount;
|
|
|
|
// Current trigger effect state
|
|
bool m_bTriggerEffectEnabled;
|
|
|
|
// is this ship our local ship, or a remote player?
|
|
bool m_bIsLocalPlayer;
|
|
|
|
// Is this ship instance running inside the server (otherwise its a client...)
|
|
bool m_bIsServerInstance;
|
|
|
|
// is the ship exploding?
|
|
bool m_bExploding;
|
|
|
|
// is the ship disabled for now?
|
|
bool m_bDisabled;
|
|
|
|
// cloak fade out
|
|
int m_nFade;
|
|
|
|
// vector of beams we have fired (in order of firing time)
|
|
CPhotonBeam * m_rgPhotonBeams[MAX_PHOTON_BEAMS_PER_SHIP];
|
|
|
|
// vector of debris to draw after an explosion
|
|
std::list< CShipDebris *> m_ListDebris;
|
|
|
|
// Color for this ship
|
|
DWORD m_dwShipColor;
|
|
|
|
// Decoration for this ship
|
|
int m_nShipDecoration;
|
|
|
|
// Weapon for this ship
|
|
int m_nShipWeapon;
|
|
|
|
// Power for this ship
|
|
int m_nShipPower;
|
|
|
|
// Power for this ship
|
|
int m_nShipShieldStrength;
|
|
|
|
HGAMETEXTURE m_hTextureWhite;
|
|
|
|
// Thrusters for this ship
|
|
CForwardThrusters m_ForwardThrusters;
|
|
|
|
// Track whether to draw the thrusters next render call
|
|
bool m_bForwardThrustersActive;
|
|
|
|
// Thrusters for this ship
|
|
CReverseThrusters m_ReverseThrusters;
|
|
|
|
// Thrust and rotation speed can be anlog when using a Steam Controller
|
|
float m_fThrusterLevel;
|
|
float m_fTurnSpeed;
|
|
|
|
// Track whether to draw the thrusters next render call
|
|
bool m_bReverseThrustersActive;
|
|
|
|
// This will get populated only if we are the local instance, and then
|
|
// sent to the server in response to each server update
|
|
ClientSpaceWarUpdateData_t m_SpaceWarClientUpdateData;
|
|
|
|
// key bindings
|
|
DWORD m_dwVKLeft;
|
|
DWORD m_dwVKRight;
|
|
DWORD m_dwVKForwardThrusters;
|
|
DWORD m_dwVKReverseThrusters;
|
|
DWORD m_dwVKFire;
|
|
};
|
|
|
|
#endif // SHIP_H
|