#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* spline ); const idCurve_Spline* GetSpline() const { return spline; } idCurve_Spline* 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* spline; idEntityPtr 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* 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& 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 splineMoverNode; static idLinkList 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& list ) const; bool LookLeft( idList& list ) const; bool LookRight( idList& list ) const; bool LookLeftForTrackChange( idList& list ) const; bool LookRightForTrackChange( idList& list ) const; bool Look( const idFrustum& fov, idList& list ) const; virtual void LookAround(); virtual bool AdjustSpeed( idList& 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 driver; idList< idEntityPtr > occupants; idList< idEntityPtr > weapons; int numTracksOnMap; idEntityPtr leftDoor; idEntityPtr 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& list ); bool LookOverRightShoulder( idList& 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 > 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 target; rvStateThread targetSearchStateThread; CLASS_STATES_PROTOTYPE( rvTramCar_Strogg ); }; #endif