//---------------------------------------------------------------- // VehicleParts.h // // Copyright 2002-2004 Raven Software //---------------------------------------------------------------- #ifndef __GAME_VEHICLEPARTS_H__ #define __GAME_VEHICLEPARTS_H__ class idWeapon; class rvVehicle; class rvVehiclePosition; class rvEffect; //---------------------------------------------------------------- // Base Part //---------------------------------------------------------------- class rvVehiclePart : public idClass { public: ABSTRACT_PROTOTYPE( rvVehiclePart ); virtual ~rvVehiclePart( void ) { } void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual bool Init ( rvVehiclePosition* position, const idDict& args, s_channelType soundChannel ); virtual void RunPrePhysics ( void ) { } virtual void RunPhysics ( void ) { } virtual void RunPostPhysics ( void ) { } bool IsLeft ( void ) const; bool IsFront ( void ) const; bool IsUsingCenterMass ( void ) const; bool IsActive ( void ) const; virtual void Activate ( bool activate ) { fl.active = activate; } virtual void Impulse ( int impulse ) { } virtual rvVehiclePosition* GetPosition ( void ) const; const idVec3& GetOrigin ( void ) const; const idMat3& GetAxis ( void ) const; protected: void UpdateOrigin ( void ); typedef struct partFlags_s { bool active : 1; // Is part active bool left : 1; // Is part on left side of vehicle bool front : 1; // Is part on right side of vehicle bool useCenterMass : 1; // Use center of mass for origin bool useViewAxis : 1; // Uses parent->viewAxis instead of the physics axis (::UpdateOrigin()) } partFlags_t; partFlags_t fl; idDict spawnArgs; idEntityPtr parent; jointHandle_t joint; s_channelType soundChannel; rvVehiclePosition* position; idVec3 worldOrigin; idMat3 worldAxis; idVec3 localOffset; }; ID_INLINE rvVehiclePosition* rvVehiclePart::GetPosition ( void ) const { return position; } ID_INLINE const idVec3& rvVehiclePart::GetOrigin ( void ) const { return worldOrigin; } ID_INLINE const idMat3& rvVehiclePart::GetAxis ( void ) const { return worldAxis; } ID_INLINE bool rvVehiclePart::IsLeft ( void ) const { return fl.left; } ID_INLINE bool rvVehiclePart::IsFront ( void ) const { return fl.front; } ID_INLINE bool rvVehiclePart::IsUsingCenterMass ( void ) const { return fl.useCenterMass; } ID_INLINE bool rvVehiclePart::IsActive ( void ) const { return fl.active; } //---------------------------------------------------------------- // Sound //---------------------------------------------------------------- class rvVehicleSound : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleSound ); rvVehicleSound ( void ); ~rvVehicleSound ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPostPhysics ( void ); virtual void Activate ( bool active ); bool IsPlaying ( void ) const; void Play ( void ); void Stop ( void ); void Update ( bool force = false ); void Fade ( int time, float toVolume, float toFreq ); void Attenuate ( float volumeAttenuate, float freqAttenuate ); void SetAutoActivate ( bool activate ); protected: idVec2 volume; idVec2 freqShift; idStr soundName; refSound_t refSound; idInterpolate currentVolume; idInterpolate currentFreqShift; bool fade; bool autoActivate; }; ID_INLINE bool rvVehicleSound::IsPlaying ( void ) const { idSoundEmitter *emitter = soundSystem->EmitterForIndex( SOUNDWORLD_GAME, refSound.referenceSoundHandle ); if( emitter ) { return ( emitter->CurrentlyPlaying ( ) ); } return( false ); } ID_INLINE void rvVehicleSound::SetAutoActivate ( bool activate ){ autoActivate = activate; } //---------------------------------------------------------------- // Hoverpad //---------------------------------------------------------------- class rvVehicleHoverpad : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleHoverpad ); rvVehicleHoverpad ( void ); ~rvVehicleHoverpad ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPrePhysics ( void ); virtual void RunPhysics ( void ); virtual void Activate ( bool active ); protected: void UpdateDustEffect ( const idVec3& origin, const idMat3& axis, float attenuation, const rvDeclMatType* mtype ); float height; float dampen; bool atRest; idClipModel* clipModel; idInterpolate currentForce; float force; const idDeclTable* forceTable; float forceRandom; float fadeTime; idVec3 velocity; float thrustForward; float thrustLeft; float maxRestAngle; int soundPart; int forceUpTime; int forceDownTime; // Dust effects rvClientEntityPtr effectDust; const rvDeclMatType* effectDustMaterialType; }; //---------------------------------------------------------------- // Thruster //---------------------------------------------------------------- class rvVehicleThruster : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleThruster ); rvVehicleThruster ( void ); ~rvVehicleThruster ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPhysics ( void ); protected: enum EThrusterKey { KEY_FORWARD, KEY_RIGHT, KEY_UP }; float force; int forceAxis; EThrusterKey key; }; //---------------------------------------------------------------- // Light //---------------------------------------------------------------- class rvVehicleLight : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleLight ); rvVehicleLight ( void ); ~rvVehicleLight ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPostPhysics ( void ); virtual void Activate ( bool active ); virtual void Impulse ( int impulse ); protected: void TurnOff ( void ); void TurnOn ( void ); void UpdateLightDef ( void ); renderLight_t renderLight; int lightHandle; bool lightOn; idStr soundOn; idStr soundOff; }; //---------------------------------------------------------------- // Weapon //---------------------------------------------------------------- class rvVehicleWeapon : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleWeapon ); rvVehicleWeapon ( void ); ~rvVehicleWeapon ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPostPhysics ( void ); virtual void Activate ( bool activate ); int GetCurrentAmmo ( void ) const; float GetCurrentCharge ( void ) const; void UpdateCursorGUI ( idUserInterface* gui ) const; bool Fire (); int GetZoomFov ( void ) const; idUserInterface * GetZoomGui ( void ) const; float GetZoomTime ( void ) const; bool CanZoom ( void ) const; void StopTargetEffect ( void ); protected: #ifdef _XENON idActor* bestEnemy; void AutoAim( idPlayer* player, const idVec3& origin, idVec3& dir ); #endif void LaunchHitScan ( const idVec3& origin, const idVec3& dir, const idVec3& jointOrigin ); void LaunchProjectile ( const idVec3& origin, const idVec3& dir, const idVec3& pushVelocity ); void LaunchProjectiles (); void UpdateLock ( void ); void GetLockInfo ( const idVec3& eyeOrigin, const idMat3& eyeAxis ); void EjectBrass ( void ); void MuzzleFlashLight ( const idVec3& origin, const idMat3& axis ); void WeaponFeedback ( const idDict* dict ); int nextFireTime; int fireDelay; int count; const idDict* projectileDef; const idDict* hitScanDef; float spread; bool launchFromJoint; bool lockScanning; int lastLockTime; float lockRange; idEntityPtr targetEnt; jointHandle_t targetJoint; idVec3 targetPos; rvClientEntityPtr targetEffect; idList joints; int jointIndex; idVec3 force; int ammoPerCharge; int chargeTime; int currentAmmo; idInterpolate currentCharge; renderLight_t muzzleFlash; int muzzleFlashHandle; int muzzleFlashEnd; int muzzleFlashTime; idVec3 muzzleFlashOffset; int animNum; int animChannel; const idSoundShader* shaderFire; const idSoundShader* shaderReload; const idDict* brassDict; jointHandle_t brassEjectJoint; idVec3 brassEjectOffset; int brassEjectNext; int brassEjectDelay; int zoomFov; idUserInterface * zoomGui; float zoomTime; }; ID_INLINE int rvVehicleWeapon::GetCurrentAmmo ( void ) const { return currentAmmo; } ID_INLINE float rvVehicleWeapon::GetCurrentCharge ( void ) const { return currentCharge.IsDone(gameLocal.time) ? 1.0f : currentCharge.GetCurrentValue(gameLocal.time); } ID_INLINE int rvVehicleWeapon::GetZoomFov ( void ) const { return zoomFov; } ID_INLINE idUserInterface* rvVehicleWeapon::GetZoomGui ( void ) const { return zoomGui; } ID_INLINE float rvVehicleWeapon::GetZoomTime ( void ) const { return zoomTime; } ID_INLINE bool rvVehicleWeapon::CanZoom ( void ) const { return zoomFov != -1; } //---------------------------------------------------------------- // Turret //---------------------------------------------------------------- class rvVehicleTurret : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleTurret ); rvVehicleTurret ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPrePhysics ( void ); virtual void RunPostPhysics ( void ); virtual void Activate ( bool active ); protected: idBounds angles; int axisMap[3]; float invert[3]; idAngles currentAngles; int moveTime; float turnRate; int soundPart; bool parentStuck; }; //---------------------------------------------------------------- // Animated Vehicle Part //---------------------------------------------------------------- class rvVehicleUserAnimated : public rvVehiclePart { public: CLASS_PROTOTYPE( rvVehicleUserAnimated ); rvVehicleUserAnimated ( void ); void Spawn ( void ); void Save ( idSaveGame* saveFile ) const; void Restore ( idRestoreGame* saveFile ); virtual void RunPrePhysics ( void ); void Event_PostSpawn ( void ); protected: typedef struct rvUserAnimatedAnim_s { int index; float frame; short length; short channel; float rate; bool loop; } rvUserAnimatedAnim_t; enum { VUAA_Forward, VUAA_Strafe, VUAA_Crouch, VUAA_Attack, VUAA_Count }; enum { VUAF_Forward, VUAF_Strafe, VUAF_Crouch, VUAF_Attack, VUAF_Count }; rvUserAnimatedAnim_t anims[ VUAA_Count ]; rvScriptFuncUtility funcs[ VUAF_Count ]; void InitAnim( const char * action, rvUserAnimatedAnim_t & anim ); void InitFunc( const char * action, rvScriptFuncUtility & func ); void SetFrame( const rvUserAnimatedAnim_t & anim ); void LateralMove( signed char input, int anim, int func ); }; typedef idList rvVehiclePartList_t; #endif // __GAME_VEHICLEPARTS_H__