This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Combat/vehicle.h

349 lines
11 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando *
* *
* $Archive:: /Commando/Code/Combat/vehicle.h $*
* *
* $Author:: Byon_g $*
* *
* $Modtime:: 3/25/02 2:18p $*
* *
* $Revision:: 120 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef VEHICLE_H
#define VEHICLE_H
#ifndef ALWAYS_H
#include "always.h"
#endif
#ifndef SMARTGAMEOBJ_H
#include "smartgameobj.h"
#endif
#ifndef VECTOR_H
#include "vector.h"
#endif
#ifndef TRANSITION_H
#include "transition.h"
#endif
#ifndef WWSTRING_H
#include "wwstring.h"
#endif
class Sound3DClass;
class VehiclePhysClass;
class SoldierGameObj;
class PersistantSurfaceEmitterClass;
class PersistantSurfaceSoundClass;
/*
**
*/
typedef enum {
VEHICLE_TYPE_CAR,
VEHICLE_TYPE_TANK,
VEHICLE_TYPE_BIKE,
VEHICLE_TYPE_FLYING,
VEHICLE_TYPE_TURRET,
} VehicleType;
enum
{
ENGINE_SOUND_STATE_STARTING = 0,
ENGINE_SOUND_STATE_RUNNING,
ENGINE_SOUND_STATE_STOPPING,
ENGINE_SOUND_STATE_OFF,
MAX_ENGINE_SOUND_STATES
};
/*
** VehicleGameObjDef - Defintion class for a VehicleGameObj
*/
class VehicleGameObjDef : public SmartGameObjDef
{
public:
VehicleGameObjDef( void );
virtual ~VehicleGameObjDef( void );
virtual uint32 Get_Class_ID( void ) const;
virtual PersistClass * Create( void ) const ;
virtual bool Save( ChunkSaveClass &csave );
virtual bool Load( ChunkLoadClass &cload );
virtual const PersistFactoryClass & Get_Factory( void ) const;
DECLARE_EDITABLE( VehicleGameObjDef, SmartGameObjDef );
TRANSITION_DATA_LIST * Get_Transition_List( void ) { return &Transitions; }
const TRANSITION_DATA_LIST & Get_Transition_List( void ) const { return Transitions; }
void Free_Transition_List( void );
int Get_Damage_Report(int team) const;
int Get_Destroy_Report(int team) const;
protected:
VehicleType Type;
StringClass TypeName;
StringClass Fire0Anim;
StringClass Fire1Anim;
StringClass Profile;
TRANSITION_DATA_LIST Transitions;
float TurnRadius;
bool OccupantsVisible;
bool SightDownMuzzle;
bool Aim2D;
float EngineSoundMaxPitchFactor;
int EngineSound[MAX_ENGINE_SOUND_STATES];
float SquishVelocity;
int VehicleNameID;
int NumSeats;
int GDIDamageReportID;
int NodDamageReportID;
int GDIDestroyReportID;
int NodDestroyReportID;
friend class VehicleGameObj;
};
/*
**
*/
class VehicleGameObj : public SmartGameObj {
public:
VehicleGameObj();
virtual ~VehicleGameObj();
// Definitions
virtual void Init( void );
void Init( const VehicleGameObjDef & definition );
const VehicleGameObjDef & Get_Definition( void ) const ;
// Save / Load / Construction Factory
virtual bool Save( ChunkSaveClass & csave );
virtual bool Load( ChunkLoadClass & cload );
virtual void On_Post_Load( void );
virtual const PersistFactoryClass & Get_Factory( void ) const;
virtual void Startup( void );
// Physics
VehiclePhysClass * Peek_Vehicle_Phys( void ) const;
// Think
virtual void Think( void );
virtual void Post_Think( void );
// Control
virtual void Apply_Control( void );
virtual int Get_Weapon_Control_Owner(void);
// Weapon
virtual bool Set_Targeting( const Vector3 & pos, bool do_tilt = true );
virtual bool Use_2D_Aiming( void ) { return Get_Definition().Aim2D; }
virtual Matrix3D Get_Look_Transform(void);
bool Has_Turret( void) { return TurretBone != 0; }
// Type ID
virtual VehicleGameObj *As_VehicleGameObj() { return this; }
virtual bool Is_Aircraft( void ) { return Get_Definition().Type == VEHICLE_TYPE_FLYING; }
virtual bool Is_Turret( void ) { return Get_Definition().Type == VEHICLE_TYPE_TURRET; }
virtual int Get_Player_Type(void) const;
// Occupants
void Add_Occupant( SoldierGameObj * occupant, int seat_id );
void Add_Occupant( SoldierGameObj * occupant );
void Remove_Occupant( SoldierGameObj * occupant );
bool Contains_Occupant( SoldierGameObj * occupant );
int Get_Occupant_Count(void);
int Find_Seat( SoldierGameObj * occupant );
SoldierGameObj * Get_Driver(void);
SoldierGameObj * Get_Gunner(void);
SoldierGameObj * Get_Actual_Gunner(void);
virtual bool Is_Entry_Permitted(SoldierGameObj * p_soldier);
void Passenger_Entering( void ); // used to begin animation
void Passenger_Exiting( void ); // used to begin animation
void Set_Vehicle_Delivered(void);
// State
virtual void Export_Creation( BitStreamClass & packet );
virtual void Import_Creation( BitStreamClass & packet );
virtual void Export_Rare( BitStreamClass &packet );
virtual void Import_Rare( BitStreamClass &packet );
virtual void Import_Frequent( BitStreamClass & packet );
virtual void Export_Frequent( BitStreamClass & packet );
virtual void Import_State_Cs( BitStreamClass & packet );
virtual void Export_State_Cs( BitStreamClass & packet );
// Profile
const char *Get_Profile( void ) { return Get_Definition().Profile; }
// Velocity
void Get_Velocity(Vector3 & vel);
void Set_Velocity(Vector3 & vel);
//virtual void Get_Extended_Information( StringClass & description );
virtual void Get_Description( StringClass & description );
// Pathfinding
float Get_Turn_Radius (void) const { return Get_Definition ().TurnRadius; }
// Engine control
bool Is_Engine_Enabled (void) const;
void Enable_Engine (bool onoff);
// Wheel Effects
void Init_Wheel_Effects( void );
void Shutdown_Wheel_Effects( void );
void Update_Wheel_Effects( void );
// Damage
virtual void Apply_Damage( const OffenseObjectClass & damager, float scale = 1.0f, int alternate_skin = -1 );
void Update_Damage_Meshes( void );
float Get_Squish_Velocity( void) { return Get_Definition().SquishVelocity; }
// Script enabling of transitions
void Script_Enable_Transitions( bool enable ) { TransitionsEnabled = enable; Create_And_Destroy_Transitions(); }
static void Set_Precision(void);
static bool Toggle_Target_Steering( void );
static void Set_Target_Steering( bool onoff );
static bool Is_Target_Steering( void );
const WCHAR * Get_Vehicle_Name( void );
// Vehicles expire when they are flipped.
virtual ExpirationReactionType Object_Expired( PhysClass * observed_obj );
// Vehicle locking. In network games, a vehicle can be locked for all but the
// owner for a certain amount of time.
// NOTE: for network play, locking a vehicle only works at creation time and only
// if the lock is set up prior to the creation packet being sent.
void Lock_Vehicle( ScriptableGameObj *lockowner, float locktime ) { LockOwner = lockowner, LockTimer = locktime; }
bool Is_Locked(void) { return ((LockOwner.Get_Ptr() != NULL) && (LockTimer > 0.0f)); }
ScriptableGameObj * Get_Lock_Owner(void) { return LockOwner.Get_Ptr(); }
static void Set_Default_Driver_Is_Gunner(bool flag) {DefaultDriverIsGunner = flag;}
bool Get_Driver_Is_Gunner(void) {return DriverIsGunner;}
void Toggle_Driver_Is_Gunner(void) { DriverIsGunner = !DriverIsGunner; }
static void Set_Camera_Locked_To_Turret(bool flag) {CameraLockedToTurret = flag;}
static bool Get_Camera_Locked_To_Turret(void) {return CameraLockedToTurret;}
// Stealth
virtual float Get_Stealth_Fade_Distance(void) const;
virtual float Get_Filter_Distance(void) const;
// Ignore occupants for raycasts
void Ignore_Occupants( void );
void Unignore_Occupants( void );
protected:
Sound3DClass *Sound;
int EngineSoundState;
AudibleSoundClass *CachedEngineSound;
int TurretBone;
int BarrelBone;
float TurretTurn;
float BarrelTilt;
float BarrelOffset; // For Vehicles with offset turrets
bool TransitionsEnabled;
bool HasEnterTransitions;
bool HasExitTransitions;
bool VehicleDelivered;
bool DriverIsGunner;
static bool DefaultDriverIsGunner;
static bool CameraLockedToTurret;
// Wheel Effects
VectorClass<PersistantSurfaceEmitterClass *> WheelSurfaceEmitters;
PersistantSurfaceSoundClass * WheelSurfaceSound;
// Occupants
enum {
DRIVER_SEAT = 0,
GUNNER_SEAT,
};
VectorClass<SoldierGameObj *> SeatOccupants;
int OccupiedSeats;
DynamicVectorClass<TransitionInstanceClass *> TransitionInstances;
// Lock feature. Vehicle can be locked to all but the purchaser for some number of seconds
GameObjReference LockOwner; // who owns the lock for this vehicle?
float LockTimer;
void Remove_Transitions( TransitionDataClass::StyleType transition_type );
void Create_New_Transitions( TransitionDataClass::StyleType transition_type );
void Destroy_Transitions( void );
void Update_Transitions( void );
void Create_And_Destroy_Transitions( void );
// Turrets
void Aquire_Turret_Bones( void );
void Release_Turret_Bones( void );
void Update_Turret( float weapon_turn, float weapon_tilt );
// Sound Effects (wheels, engine)
void Update_Sound_Effects( void );
void Change_Engine_Sound_State( int new_state );
void Update_Engine_Sound_Pitch( void );
};
#endif // VEHICLE_H