495 lines
15 KiB
C
495 lines
15 KiB
C
|
#ifndef __RV_SPLINE_MOVER_H
|
||
|
#define __RV_SPLINE_MOVER_H
|
||
|
|
||
|
extern const idEventDef EV_SetSpline;
|
||
|
|
||
|
struct splinePState_t {
|
||
|
idVec3 origin;
|
||
|
idVec3 localOrigin;
|
||
|
idMat3 axis;
|
||
|
idMat3 localAxis;
|
||
|
|
||
|
float speed;
|
||
|
float idealSpeed;
|
||
|
float dist;
|
||
|
|
||
|
float acceleration;
|
||
|
float deceleration;
|
||
|
|
||
|
bool ShouldAccelerate() const;
|
||
|
bool ShouldDecelerate() const;
|
||
|
|
||
|
void ApplyAccelerationDelta( float timeStepSec );
|
||
|
|
||
|
void ApplyDecelerationDelta( float timeStepSec );
|
||
|
|
||
|
void UpdateDist( float timeStepSec );
|
||
|
void Clear();
|
||
|
void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
||
|
void ReadFromSnapshot( const idBitMsgDelta &msg );
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
splinePState_t& Assign( const splinePState_t* state );
|
||
|
splinePState_t& operator=( const splinePState_t& state );
|
||
|
splinePState_t& operator=( const splinePState_t* state );
|
||
|
};
|
||
|
|
||
|
//=======================================================
|
||
|
//
|
||
|
// rvPhysics_Spline
|
||
|
//
|
||
|
//=======================================================
|
||
|
class rvPhysics_Spline : public idPhysics_Base {
|
||
|
|
||
|
public:
|
||
|
|
||
|
CLASS_PROTOTYPE( rvPhysics_Spline );
|
||
|
|
||
|
rvPhysics_Spline( void );
|
||
|
virtual ~rvPhysics_Spline( void );
|
||
|
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Event_PostRestore( void );
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
void SetSpline( idCurve_Spline<idVec3>* spline );
|
||
|
const idCurve_Spline<idVec3>* GetSpline() const { return spline; }
|
||
|
idCurve_Spline<idVec3>* GetSpline() { return spline; }
|
||
|
|
||
|
void SetSplineEntity( idSplinePath* spline );
|
||
|
const idSplinePath* GetSplineEntity() const { return splineEntity; }
|
||
|
idSplinePath* GetSplineEntity() { return splineEntity; }
|
||
|
|
||
|
void SetLinearAcceleration( const float accel );
|
||
|
void SetLinearDeceleration( const float decel );
|
||
|
|
||
|
void SetSpeed( float speed );
|
||
|
float GetSpeed( void ) const;
|
||
|
|
||
|
virtual bool StartingToMove( void ) const;
|
||
|
virtual bool StoppedMoving( void ) const;
|
||
|
|
||
|
float ComputeDecelFromSpline( void ) const;
|
||
|
|
||
|
public: // common physics interface
|
||
|
void SetClipModel( idClipModel *model, float density, int id = 0, bool freeOld = true );
|
||
|
idClipModel * GetClipModel( int id = 0 ) const;
|
||
|
|
||
|
void SetContents( int contents, int id = -1 );
|
||
|
int GetContents( int id = -1 ) const;
|
||
|
|
||
|
const idBounds & GetBounds( int id = -1 ) const;
|
||
|
const idBounds & GetAbsBounds( int id = -1 ) const;
|
||
|
|
||
|
bool Evaluate( int timeStepMSec, int endTimeMSec );
|
||
|
bool EvaluateSpline( idVec3& newOrigin, idMat3& newAxis, const splinePState_t& previous );
|
||
|
bool EvaluateMaster( idVec3& newOrigin, idMat3& newAxis, const splinePState_t& previous );
|
||
|
|
||
|
void Activate( void );
|
||
|
void Rest( void );
|
||
|
|
||
|
bool IsAtRest( void ) const;
|
||
|
bool IsAtEndOfSpline( void ) const;
|
||
|
bool IsAtBeginningOfSpline( void ) const;
|
||
|
|
||
|
virtual bool IsPushable( void ) const;
|
||
|
|
||
|
bool HasValidSpline( void ) const;
|
||
|
|
||
|
void SaveState( void );
|
||
|
void RestoreState( void );
|
||
|
|
||
|
void SetOrigin( const idVec3 &newOrigin, int id = -1 );
|
||
|
void SetAxis( const idMat3 &newAxis, int id = -1 );
|
||
|
|
||
|
void Translate( const idVec3 &translation, int id = -1 );
|
||
|
void Rotate( const idRotation &rotation, int id = -1 );
|
||
|
|
||
|
const idVec3 & GetOrigin( int id = 0 ) const;
|
||
|
const idMat3 & GetAxis( int id = 0 ) const;
|
||
|
|
||
|
idVec3 & GetOrigin( int id = 0 );
|
||
|
idMat3 & GetAxis( int id = 0 );
|
||
|
|
||
|
void SetMaster( idEntity *master, const bool orientated );
|
||
|
|
||
|
void ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const;
|
||
|
void ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const;
|
||
|
int ClipContents( const idClipModel *model ) const;
|
||
|
|
||
|
void DisableClip( void );
|
||
|
void EnableClip( void );
|
||
|
|
||
|
void UnlinkClip( void );
|
||
|
void LinkClip( void );
|
||
|
|
||
|
void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
||
|
void ReadFromSnapshot( const idBitMsgDelta &msg );
|
||
|
|
||
|
virtual const trace_t* GetBlockingInfo( void ) const;
|
||
|
virtual idEntity* GetBlockingEntity( void ) const;
|
||
|
|
||
|
public:
|
||
|
stateResult_t State_Accelerating( const stateParms_t& parms );
|
||
|
stateResult_t State_Decelerating( const stateParms_t& parms );
|
||
|
stateResult_t State_Cruising( const stateParms_t& parms );
|
||
|
|
||
|
protected:
|
||
|
const idVec3 & GetLocalOrigin( int id = 0 ) const;
|
||
|
const idMat3 & GetLocalAxis( int id = 0 ) const;
|
||
|
|
||
|
idVec3 & GetLocalOrigin( int id = 0 );
|
||
|
idMat3 & GetLocalAxis( int id = 0 );
|
||
|
|
||
|
protected:
|
||
|
splinePState_t current;
|
||
|
splinePState_t saved;
|
||
|
|
||
|
float splineLength;
|
||
|
idCurve_Spline<idVec3>* spline;
|
||
|
idEntityPtr<idSplinePath> splineEntity;
|
||
|
|
||
|
trace_t pushResults;
|
||
|
|
||
|
idClipModel* clipModel;
|
||
|
|
||
|
rvStateThread accelDecelStateThread;
|
||
|
|
||
|
CLASS_STATES_PROTOTYPE( rvPhysics_Spline );
|
||
|
};
|
||
|
|
||
|
extern const idEventDef EV_DoneMoving;
|
||
|
|
||
|
//=======================================================
|
||
|
//
|
||
|
// rvSplineMover
|
||
|
//
|
||
|
//=======================================================
|
||
|
class rvSplineMover : public idAnimatedEntity {
|
||
|
CLASS_PROTOTYPE( rvSplineMover );
|
||
|
|
||
|
public:
|
||
|
void Spawn();
|
||
|
virtual ~rvSplineMover();
|
||
|
|
||
|
virtual void SetSpeed( float newSpeed );
|
||
|
virtual float GetSpeed() const;
|
||
|
virtual void SetIdealSpeed( float newIdealSpeed );
|
||
|
virtual float GetIdealSpeed() const;
|
||
|
|
||
|
virtual void SetSpline( idSplinePath* spline );
|
||
|
virtual const idSplinePath* GetSpline() const;
|
||
|
virtual idSplinePath* GetSpline();
|
||
|
|
||
|
virtual void SetAcceleration( float accel );
|
||
|
virtual void SetDeceleration( float decel );
|
||
|
|
||
|
virtual void CheckSplineForOverrides( const idCurve_Spline<idVec3>* spline, const idDict* args );
|
||
|
virtual void RestoreFromOverrides( const idDict* args );
|
||
|
|
||
|
int PlayAnim( int channel, const char* animName, int blendFrames );
|
||
|
void CycleAnim( int channel, const char* animName, int blendFrames );
|
||
|
void ClearChannel( int channel, int clearFrame );
|
||
|
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
||
|
void ReadFromSnapshot( const idBitMsgDelta &msg );
|
||
|
|
||
|
protected:// TramCar utility functions
|
||
|
void AddSelfToGlobalList();
|
||
|
void RemoveSelfFromGlobalList();
|
||
|
bool InGlobalList() const;
|
||
|
bool WhosVisible( const idFrustum& frustum, idList<rvSplineMover*>& list ) const;
|
||
|
|
||
|
protected:
|
||
|
virtual idStr GetTrackInfo( const idSplinePath* track ) const;
|
||
|
rvSplineMover* ConvertToMover( idEntity* mover ) const;
|
||
|
idSplinePath* ConvertToSplinePath( idEntity* spline ) const;
|
||
|
|
||
|
void CallScriptEvents( const idSplinePath* spline, const char* prefixKey, idEntity* parm );
|
||
|
virtual void PreBind();
|
||
|
|
||
|
virtual void PreDoneMoving();
|
||
|
virtual void PostDoneMoving();
|
||
|
|
||
|
protected:
|
||
|
void Event_PostSpawn();
|
||
|
|
||
|
void Event_SetSpline( idEntity* spline );
|
||
|
void Event_GetSpline();
|
||
|
|
||
|
void Event_SetAcceleration( float accel );
|
||
|
void Event_SetDeceleration( float decel );
|
||
|
|
||
|
void Event_OnAcceleration();
|
||
|
void Event_OnDeceleration();
|
||
|
void Event_OnCruising();
|
||
|
|
||
|
void Event_OnStopMoving();
|
||
|
void Event_OnStartMoving();
|
||
|
|
||
|
void Event_SetSpeed( float speed );
|
||
|
void Event_GetSpeed();
|
||
|
void Event_SetIdealSpeed( float speed );
|
||
|
void Event_GetIdealSpeed();
|
||
|
void Event_ApplySpeedScale( float scale );
|
||
|
|
||
|
void Event_SetCallBack();
|
||
|
void Event_DoneMoving();
|
||
|
|
||
|
void Event_GetCurrentTrackInfo();
|
||
|
void Event_GetTrackInfo( idEntity* track );
|
||
|
|
||
|
void Event_Activate( idEntity* activator );
|
||
|
|
||
|
void Event_StartSoundPeriodic( const char* sndKey, const s_channelType channel, int minDelay, int maxDelay );
|
||
|
void Event_PartBlocked( idEntity *blockingEntity );
|
||
|
|
||
|
protected:
|
||
|
rvPhysics_Spline physicsObj;
|
||
|
|
||
|
float idealSpeed;
|
||
|
|
||
|
int waitThreadId;
|
||
|
|
||
|
private:
|
||
|
idLinkList<rvSplineMover> splineMoverNode;
|
||
|
static idLinkList<rvSplineMover> splineMovers;
|
||
|
};
|
||
|
|
||
|
//=======================================================
|
||
|
//
|
||
|
// rvTramCar
|
||
|
//
|
||
|
//=======================================================
|
||
|
class rvTramCar : public rvSplineMover {
|
||
|
CLASS_PROTOTYPE( rvTramCar );
|
||
|
|
||
|
public:
|
||
|
void Spawn();
|
||
|
virtual ~rvTramCar();
|
||
|
|
||
|
virtual void Think();
|
||
|
virtual void MidThink();
|
||
|
|
||
|
virtual float GetNormalSpeed() const { return spawnArgs.GetFloat("normalSpeed"); }
|
||
|
|
||
|
virtual void SetIdealTrack( int track );
|
||
|
virtual int GetIdealTrack() const;
|
||
|
|
||
|
virtual void AddDamageEffect( const trace_t &collision, const idVec3 &velocity, const char *damageDefName, idEntity* inflictor );
|
||
|
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
|
||
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
||
|
|
||
|
virtual float GetDamageScale() const;
|
||
|
virtual float GetHealthScale() const;
|
||
|
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
||
|
void ReadFromSnapshot( const idBitMsgDelta &msg );
|
||
|
|
||
|
public:
|
||
|
stateResult_t State_Idle( const stateParms_t& parms );
|
||
|
stateResult_t State_NormalSpeed( const stateParms_t& parms );
|
||
|
stateResult_t State_ExcessiveSpeed( const stateParms_t& parms );
|
||
|
|
||
|
stateResult_t State_RandomTrack( const stateParms_t& parms );
|
||
|
stateResult_t State_AssignedTrack( const stateParms_t& parms );
|
||
|
|
||
|
protected:
|
||
|
void SpawnDriver( const char* driverKey );
|
||
|
void SpawnWeapons( const char* partKey );
|
||
|
void SpawnOccupants( const char* partKey );
|
||
|
idEntity* SpawnPart( const char* partDefName, const char* subPartDefName );
|
||
|
void SpawnDoors();
|
||
|
idMover* SpawnDoor( const char* key );
|
||
|
|
||
|
int SortSplineTargets( idSplinePath* spline ) const;
|
||
|
idEntity* GetSplineTarget( idSplinePath* spline, int index ) const;
|
||
|
|
||
|
void HeadTowardsIdealTrack();
|
||
|
idSplinePath* FindSplineToTrack( idSplinePath* spline, const idStr& track ) const;
|
||
|
idSplinePath* FindSplineToIdealTrack( idSplinePath* spline ) const;
|
||
|
idSplinePath* GetRandomSpline( idSplinePath* spline ) const;
|
||
|
|
||
|
char ConvertToTrackLetter( int trackNum ) const { return trackNum + 'A'; }
|
||
|
int ConvertToTrackNumber( char trackLetter ) const { return trackLetter - 'A'; }
|
||
|
int ConvertToTrackNumber( const idStr& trackInfo ) const { return ConvertToTrackNumber(idStr::ToUpper(trackInfo.Right(1)[0])); }
|
||
|
int GetCurrentTrack() const;
|
||
|
|
||
|
virtual void UpdateChannel( const s_channelType channel, const soundShaderParms_t& parms );
|
||
|
virtual void AttenuateTrackChannel( float attenuation );
|
||
|
virtual void AttenuateTramCarChannel( float attenuation );
|
||
|
|
||
|
virtual void RegisterStateThread( rvStateThread& stateThread, const char* name );
|
||
|
|
||
|
bool LookForward( idList<rvSplineMover*>& list ) const;
|
||
|
bool LookLeft( idList<rvSplineMover*>& list ) const;
|
||
|
bool LookRight( idList<rvSplineMover*>& list ) const;
|
||
|
|
||
|
bool LookLeftForTrackChange( idList<rvSplineMover*>& list ) const;
|
||
|
bool LookRightForTrackChange( idList<rvSplineMover*>& list ) const;
|
||
|
|
||
|
bool Look( const idFrustum& fov, idList<rvSplineMover*>& list ) const;
|
||
|
|
||
|
virtual void LookAround();
|
||
|
virtual bool AdjustSpeed( idList<rvSplineMover*>& moverList );
|
||
|
|
||
|
virtual bool OnSameTrackAs( const rvSplineMover* tram ) const;
|
||
|
virtual bool SameIdealTrackAs( const rvSplineMover* tram ) const;
|
||
|
|
||
|
virtual idEntity* DriverSpeak( const char *speechDecl, bool random = false );
|
||
|
virtual idEntity* OccupantSpeak( const char *speechDecl, bool random = false );
|
||
|
|
||
|
virtual void PostDoneMoving();
|
||
|
|
||
|
virtual void DeployRamp();
|
||
|
virtual void RetractRamp();
|
||
|
void OperateRamp( const char* operation );
|
||
|
void OperateRamp( const char* operation, idMover* door );
|
||
|
|
||
|
protected:
|
||
|
void Event_DriverSpeak( const char* voKey );
|
||
|
void Event_GetDriver();
|
||
|
void Event_Activate( idEntity* activator );
|
||
|
void Event_RadiusDamage( const idVec3& origin, const char* damageDefName );
|
||
|
void Event_SetIdealTrack( const char* track );
|
||
|
|
||
|
void Event_OnStopMoving();
|
||
|
void Event_OnStartMoving();
|
||
|
|
||
|
void Event_OpenDoors();
|
||
|
void Event_CloseDoors();
|
||
|
|
||
|
void Event_SetHealth( float health );
|
||
|
|
||
|
protected:
|
||
|
int idealTrack;
|
||
|
idStr idealTrackTag;// HACK
|
||
|
|
||
|
mutable idFrustum collisionFov;
|
||
|
|
||
|
rvStateThread idealTrackStateThread;
|
||
|
rvStateThread speedSoundEffectsStateThread;
|
||
|
|
||
|
idEntityPtr<idAI> driver;
|
||
|
idList< idEntityPtr<idAI> > occupants;
|
||
|
idList< idEntityPtr<rvVehicle> > weapons;
|
||
|
|
||
|
int numTracksOnMap;
|
||
|
|
||
|
idEntityPtr<idMover> leftDoor;
|
||
|
idEntityPtr<idMover> rightDoor;
|
||
|
|
||
|
CLASS_STATES_PROTOTYPE( rvTramCar );
|
||
|
};
|
||
|
|
||
|
//=======================================================
|
||
|
//
|
||
|
// rvTramCar_Marine
|
||
|
//
|
||
|
//=======================================================
|
||
|
class rvTramCar_Marine : public rvTramCar {
|
||
|
CLASS_PROTOTYPE( rvTramCar_Marine );
|
||
|
|
||
|
public:
|
||
|
void Spawn();
|
||
|
|
||
|
virtual void MidThink();
|
||
|
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
public:
|
||
|
stateResult_t State_Occupied( const stateParms_t& parms );
|
||
|
stateResult_t State_NotOccupied( const stateParms_t& parms );
|
||
|
|
||
|
stateResult_t State_UsingMountedGun( const stateParms_t& parms );
|
||
|
stateResult_t State_NotUsingMountedGun( const stateParms_t& parms );
|
||
|
|
||
|
protected:
|
||
|
virtual void Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
|
||
|
virtual void Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
|
||
|
|
||
|
virtual void LookAround();
|
||
|
|
||
|
bool LookOverLeftShoulder( idList<rvSplineMover*>& list );
|
||
|
bool LookOverRightShoulder( idList<rvSplineMover*>& list );
|
||
|
|
||
|
bool EntityIsInside( const idEntity* entity ) const;
|
||
|
bool PlayerIsInside() const { return EntityIsInside(gameLocal.GetLocalPlayer()); }
|
||
|
|
||
|
void ActivateTramHud( idPlayer* player );
|
||
|
void DeactivateTramHud( idPlayer* player );
|
||
|
void UpdateTramHud( idPlayer* player );
|
||
|
|
||
|
virtual void DeployRamp();
|
||
|
virtual void RetractRamp();
|
||
|
|
||
|
void UseMountedGun( idPlayer* player );
|
||
|
|
||
|
void Event_UseMountedGun( idEntity* ent );
|
||
|
void Event_SetPlayerDamageEntity(float f);
|
||
|
|
||
|
protected:
|
||
|
idList< idEntityPtr<rvSplineMover> > visibleEnemies;
|
||
|
|
||
|
rvStateThread playerOccupationStateThread;
|
||
|
rvStateThread playerUsingMountedGunStateThread;
|
||
|
|
||
|
int maxHealth;
|
||
|
int lastHeal;
|
||
|
int healDelay;
|
||
|
int healAmount;
|
||
|
|
||
|
CLASS_STATES_PROTOTYPE( rvTramCar_Marine );
|
||
|
};
|
||
|
|
||
|
//=======================================================
|
||
|
//
|
||
|
// rvTramCar_Strogg
|
||
|
//
|
||
|
//=======================================================
|
||
|
class rvTramCar_Strogg : public rvTramCar {
|
||
|
CLASS_PROTOTYPE( rvTramCar_Strogg );
|
||
|
|
||
|
public:
|
||
|
void Spawn();
|
||
|
|
||
|
virtual void SetTarget( idEntity* newTarget );
|
||
|
virtual const rvSplineMover* GetTarget() const;
|
||
|
|
||
|
void Save( idSaveGame *savefile ) const;
|
||
|
void Restore( idRestoreGame *savefile );
|
||
|
|
||
|
void WriteToSnapshot( idBitMsgDelta &msg ) const;
|
||
|
void ReadFromSnapshot( const idBitMsgDelta &msg );
|
||
|
|
||
|
public:
|
||
|
stateResult_t State_LookingForTarget( const stateParms_t& parms );
|
||
|
stateResult_t State_TargetInSight( const stateParms_t& parms );
|
||
|
|
||
|
protected:
|
||
|
bool TargetIsToLeft();
|
||
|
bool TargetIsToRight();
|
||
|
|
||
|
virtual void LookAround();
|
||
|
|
||
|
protected:
|
||
|
void Event_PostSpawn();
|
||
|
|
||
|
protected:
|
||
|
idEntityPtr<rvSplineMover> target;
|
||
|
|
||
|
rvStateThread targetSearchStateThread;
|
||
|
|
||
|
CLASS_STATES_PROTOTYPE( rvTramCar_Strogg );
|
||
|
};
|
||
|
|
||
|
#endif
|