home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 March / Gamestar_82_2006-03_dvd.iso / DVDStar / Editace / quake4_sdkv10.exe / source / game / SplineMover.h < prev    next >
C/C++ Source or Header  |  2005-11-14  |  15KB  |  495 lines

  1. #ifndef __RV_SPLINE_MOVER_H
  2. #define __RV_SPLINE_MOVER_H
  3.  
  4. extern const idEventDef EV_SetSpline;
  5.  
  6. struct splinePState_t {
  7.     idVec3                    origin;
  8.     idVec3                    localOrigin;
  9.     idMat3                    axis;
  10.     idMat3                    localAxis;
  11.  
  12.     float                    speed;
  13.     float                    idealSpeed;
  14.     float                    dist;
  15.  
  16.     float                    acceleration;
  17.     float                    deceleration;
  18.  
  19.     bool                    ShouldAccelerate() const;
  20.     bool                    ShouldDecelerate() const;
  21.     
  22.     void                    ApplyAccelerationDelta( float timeStepSec );
  23.  
  24.     void                    ApplyDecelerationDelta( float timeStepSec );
  25.  
  26.     void                    UpdateDist( float timeStepSec );
  27.     void                    Clear();
  28.     void                    WriteToSnapshot( idBitMsgDelta &msg ) const;
  29.     void                    ReadFromSnapshot( const idBitMsgDelta &msg );
  30.     void                    Save( idSaveGame *savefile ) const;
  31.     void                    Restore( idRestoreGame *savefile );
  32.  
  33.     splinePState_t&            Assign( const splinePState_t* state );
  34.     splinePState_t&            operator=( const splinePState_t& state );
  35.     splinePState_t&            operator=( const splinePState_t* state );
  36. };
  37.  
  38. //=======================================================
  39. //
  40. //    rvPhysics_Spline
  41. //
  42. //=======================================================
  43. class rvPhysics_Spline : public idPhysics_Base {
  44.  
  45. public:
  46.  
  47.     CLASS_PROTOTYPE( rvPhysics_Spline );
  48.  
  49.                             rvPhysics_Spline( void );
  50.     virtual                    ~rvPhysics_Spline( void );
  51.  
  52.     void                    Save( idSaveGame *savefile ) const;
  53.     void                    Event_PostRestore( void );
  54.     void                    Restore( idRestoreGame *savefile );
  55.  
  56.     void                    SetSpline( idCurve_Spline<idVec3>* spline );
  57.     const idCurve_Spline<idVec3>* GetSpline() const { return spline; }
  58.     idCurve_Spline<idVec3>* GetSpline() { return spline; }
  59.  
  60.     void                    SetSplineEntity( idSplinePath* spline );
  61.     const idSplinePath*        GetSplineEntity() const { return splineEntity; }
  62.     idSplinePath*            GetSplineEntity() { return splineEntity; }
  63.  
  64.     void                    SetLinearAcceleration( const float accel );
  65.     void                    SetLinearDeceleration( const float decel );
  66.  
  67.     void                    SetSpeed( float speed );
  68.     float                    GetSpeed( void ) const;
  69.  
  70.     virtual bool            StartingToMove( void ) const;
  71.     virtual bool            StoppedMoving( void ) const;
  72.  
  73.     float                    ComputeDecelFromSpline( void ) const;
  74.  
  75. public:    // common physics interface
  76.     void                    SetClipModel( idClipModel *model, float density, int id = 0, bool freeOld = true );
  77.     idClipModel *            GetClipModel( int id = 0 ) const;
  78.  
  79.     void                    SetContents( int contents, int id = -1 );
  80.     int                        GetContents( int id = -1 ) const;
  81.  
  82.     const idBounds &        GetBounds( int id = -1 ) const;
  83.     const idBounds &        GetAbsBounds( int id = -1 ) const;
  84.  
  85.     bool                    Evaluate( int timeStepMSec, int endTimeMSec );
  86.     bool                    EvaluateSpline( idVec3& newOrigin, idMat3& newAxis, const splinePState_t& previous );
  87.     bool                    EvaluateMaster( idVec3& newOrigin, idMat3& newAxis, const splinePState_t& previous );
  88.  
  89.     void                    Activate( void );
  90.     void                    Rest( void );
  91.  
  92.     bool                    IsAtRest( void ) const;
  93.     bool                    IsAtEndOfSpline( void ) const;
  94.     bool                    IsAtBeginningOfSpline( void ) const;
  95.  
  96.     virtual bool            IsPushable( void ) const;
  97.  
  98.     bool                    HasValidSpline( void ) const;
  99.  
  100.     void                    SaveState( void );
  101.     void                    RestoreState( void );
  102.  
  103.     void                    SetOrigin( const idVec3 &newOrigin, int id = -1 );
  104.     void                    SetAxis( const idMat3 &newAxis, int id = -1 );
  105.  
  106.     void                    Translate( const idVec3 &translation, int id = -1 );
  107.     void                    Rotate( const idRotation &rotation, int id = -1 );
  108.  
  109.     const idVec3 &            GetOrigin( int id = 0 ) const;
  110.     const idMat3 &            GetAxis( int id = 0 ) const;
  111.  
  112.     idVec3 &                GetOrigin( int id = 0 );
  113.     idMat3 &                GetAxis( int id = 0 );
  114.  
  115.     void                    SetMaster( idEntity *master, const bool orientated );
  116.  
  117.     void                    ClipTranslation( trace_t &results, const idVec3 &translation, const idClipModel *model ) const;
  118.     void                    ClipRotation( trace_t &results, const idRotation &rotation, const idClipModel *model ) const;
  119.     int                        ClipContents( const idClipModel *model ) const;
  120.  
  121.     void                    DisableClip( void );
  122.     void                    EnableClip( void );
  123.  
  124.     void                    UnlinkClip( void );
  125.     void                    LinkClip( void );
  126.  
  127.     void                    WriteToSnapshot( idBitMsgDelta &msg ) const;
  128.     void                    ReadFromSnapshot( const idBitMsgDelta &msg );
  129.  
  130.     virtual const trace_t*    GetBlockingInfo( void ) const;
  131.     virtual idEntity*        GetBlockingEntity( void ) const;
  132.  
  133. public:
  134.     stateResult_t            State_Accelerating( const stateParms_t& parms );
  135.     stateResult_t            State_Decelerating( const stateParms_t& parms );
  136.     stateResult_t            State_Cruising( const stateParms_t& parms );
  137.  
  138. protected:
  139.     const idVec3 &            GetLocalOrigin( int id = 0 ) const;
  140.     const idMat3 &            GetLocalAxis( int id = 0 ) const;
  141.  
  142.     idVec3 &                GetLocalOrigin( int id = 0 );
  143.     idMat3 &                GetLocalAxis( int id = 0 );
  144.  
  145. protected:
  146.     splinePState_t            current;
  147.     splinePState_t            saved;
  148.  
  149.     float                    splineLength;
  150.     idCurve_Spline<idVec3>*    spline;
  151.     idEntityPtr<idSplinePath> splineEntity;
  152.  
  153.     trace_t                    pushResults;
  154.  
  155.     idClipModel*            clipModel;
  156.  
  157.     rvStateThread            accelDecelStateThread;
  158.  
  159.     CLASS_STATES_PROTOTYPE( rvPhysics_Spline );
  160. };
  161.  
  162. extern const idEventDef EV_DoneMoving;
  163.  
  164. //=======================================================
  165. //
  166. //    rvSplineMover
  167. //
  168. //=======================================================
  169. class rvSplineMover : public idAnimatedEntity {
  170.     CLASS_PROTOTYPE( rvSplineMover );
  171.  
  172. public:
  173.     void                    Spawn();
  174.     virtual                    ~rvSplineMover();
  175.  
  176.     virtual void            SetSpeed( float newSpeed );
  177.     virtual float            GetSpeed() const;
  178.     virtual void            SetIdealSpeed( float newIdealSpeed );
  179.     virtual float            GetIdealSpeed() const;
  180.  
  181.     virtual void            SetSpline( idSplinePath* spline );
  182.     virtual const idSplinePath*    GetSpline() const;
  183.     virtual idSplinePath*    GetSpline();
  184.  
  185.     virtual void            SetAcceleration( float accel );
  186.     virtual void            SetDeceleration( float decel );
  187.  
  188.     virtual void            CheckSplineForOverrides( const idCurve_Spline<idVec3>* spline, const idDict* args );
  189.     virtual void            RestoreFromOverrides( const idDict* args );
  190.  
  191.     int                        PlayAnim( int channel, const char* animName, int blendFrames );
  192.     void                    CycleAnim( int channel, const char* animName, int blendFrames );
  193.     void                    ClearChannel( int channel, int clearFrame );
  194.  
  195.     void                    Save( idSaveGame *savefile ) const;
  196.     void                    Restore( idRestoreGame *savefile );
  197.  
  198.     void                    WriteToSnapshot( idBitMsgDelta &msg ) const;
  199.     void                    ReadFromSnapshot( const idBitMsgDelta &msg );
  200.  
  201. protected:// TramCar utility functions
  202.     void                    AddSelfToGlobalList();
  203.     void                    RemoveSelfFromGlobalList();
  204.     bool                    InGlobalList() const;
  205.     bool                    WhosVisible( const idFrustum& frustum, idList<rvSplineMover*>& list ) const;
  206.  
  207. protected:
  208.     virtual idStr            GetTrackInfo( const idSplinePath* track ) const;
  209.     rvSplineMover*            ConvertToMover( idEntity* mover ) const;
  210.     idSplinePath*            ConvertToSplinePath( idEntity* spline ) const;
  211.  
  212.     void                    CallScriptEvents( const idSplinePath* spline, const char* prefixKey, idEntity* parm );
  213.     virtual    void            PreBind();
  214.  
  215.     virtual void            PreDoneMoving();
  216.     virtual void            PostDoneMoving();
  217.  
  218. protected:
  219.     void                    Event_PostSpawn();
  220.  
  221.     void                    Event_SetSpline( idEntity* spline );
  222.     void                    Event_GetSpline();
  223.  
  224.     void                    Event_SetAcceleration( float accel );
  225.     void                    Event_SetDeceleration( float decel );
  226.  
  227.     void                    Event_OnAcceleration();
  228.     void                    Event_OnDeceleration();
  229.     void                    Event_OnCruising();
  230.  
  231.     void                    Event_OnStopMoving();
  232.     void                    Event_OnStartMoving();
  233.  
  234.     void                    Event_SetSpeed( float speed );
  235.     void                    Event_GetSpeed();
  236.     void                    Event_SetIdealSpeed( float speed );
  237.     void                    Event_GetIdealSpeed();
  238.     void                    Event_ApplySpeedScale( float scale );
  239.  
  240.     void                    Event_SetCallBack();
  241.     void                    Event_DoneMoving();
  242.  
  243.     void                    Event_GetCurrentTrackInfo();
  244.     void                    Event_GetTrackInfo( idEntity* track );
  245.  
  246.     void                    Event_Activate( idEntity* activator );
  247.  
  248.     void                    Event_StartSoundPeriodic( const char* sndKey, const s_channelType channel, int minDelay, int maxDelay );
  249.     void                    Event_PartBlocked( idEntity *blockingEntity );
  250.  
  251. protected:
  252.     rvPhysics_Spline        physicsObj;
  253.  
  254.     float                    idealSpeed;
  255.  
  256.     int                        waitThreadId;
  257.  
  258. private:
  259.     idLinkList<rvSplineMover>    splineMoverNode;
  260.     static idLinkList<rvSplineMover>    splineMovers;
  261. };
  262.  
  263. //=======================================================
  264. //
  265. //    rvTramCar
  266. //
  267. //=======================================================
  268. class rvTramCar : public rvSplineMover {
  269.     CLASS_PROTOTYPE( rvTramCar );
  270.  
  271. public:
  272.     void                Spawn();
  273.     virtual                ~rvTramCar();
  274.  
  275.     virtual void        Think();
  276.     virtual void        MidThink();
  277.  
  278.     virtual float        GetNormalSpeed() const { return spawnArgs.GetFloat("normalSpeed"); }
  279.  
  280.     virtual void        SetIdealTrack( int track );
  281.     virtual int            GetIdealTrack() const;
  282.  
  283.     virtual void        AddDamageEffect( const trace_t &collision, const idVec3 &velocity, const char *damageDefName, idEntity* inflictor );
  284.     virtual void        Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
  285.     virtual void        Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
  286.  
  287.     virtual float        GetDamageScale() const;
  288.     virtual float        GetHealthScale() const;
  289.  
  290.     void                Save( idSaveGame *savefile ) const;
  291.     void                Restore( idRestoreGame *savefile );
  292.  
  293.     void                WriteToSnapshot( idBitMsgDelta &msg ) const;
  294.     void                ReadFromSnapshot( const idBitMsgDelta &msg );
  295.  
  296. public:
  297.     stateResult_t        State_Idle( const stateParms_t& parms );
  298.     stateResult_t        State_NormalSpeed( const stateParms_t& parms );
  299.     stateResult_t        State_ExcessiveSpeed( const stateParms_t& parms );
  300.  
  301.     stateResult_t        State_RandomTrack( const stateParms_t& parms );
  302.     stateResult_t        State_AssignedTrack( const stateParms_t& parms );
  303.  
  304. protected:
  305.     void                SpawnDriver( const char* driverKey );
  306.     void                SpawnWeapons( const char* partKey );
  307.     void                SpawnOccupants( const char* partKey );
  308.     idEntity*            SpawnPart( const char* partDefName, const char* subPartDefName );
  309.     void                SpawnDoors();
  310.     idMover*            SpawnDoor( const char* key );
  311.  
  312.     int                    SortSplineTargets( idSplinePath* spline ) const;
  313.     idEntity*            GetSplineTarget( idSplinePath* spline, int index ) const;
  314.  
  315.     void                HeadTowardsIdealTrack();
  316.     idSplinePath*        FindSplineToTrack( idSplinePath* spline, const idStr& track ) const;
  317.     idSplinePath*        FindSplineToIdealTrack( idSplinePath* spline ) const;
  318.     idSplinePath*        GetRandomSpline( idSplinePath* spline ) const;
  319.  
  320.     char                ConvertToTrackLetter( int trackNum ) const { return trackNum + 'A'; }
  321.     int                    ConvertToTrackNumber( char trackLetter ) const { return trackLetter - 'A'; }
  322.     int                    ConvertToTrackNumber( const idStr& trackInfo ) const { return ConvertToTrackNumber(idStr::ToUpper(trackInfo.Right(1)[0])); }
  323.     int                    GetCurrentTrack() const;
  324.  
  325.     virtual void        UpdateChannel( const s_channelType channel, const soundShaderParms_t& parms );
  326.     virtual void        AttenuateTrackChannel( float attenuation );
  327.     virtual void        AttenuateTramCarChannel( float attenuation );
  328.  
  329.     virtual void        RegisterStateThread( rvStateThread& stateThread, const char* name );
  330.  
  331.     bool                LookForward( idList<rvSplineMover*>& list ) const;
  332.     bool                LookLeft( idList<rvSplineMover*>& list ) const;
  333.     bool                LookRight( idList<rvSplineMover*>& list ) const;
  334.  
  335.     bool                LookLeftForTrackChange( idList<rvSplineMover*>& list ) const;
  336.     bool                LookRightForTrackChange( idList<rvSplineMover*>& list ) const;
  337.  
  338.     bool                Look( const idFrustum& fov, idList<rvSplineMover*>& list ) const;
  339.  
  340.     virtual void        LookAround();
  341.     virtual bool        AdjustSpeed( idList<rvSplineMover*>& moverList );
  342.  
  343.     virtual bool        OnSameTrackAs( const rvSplineMover* tram ) const;
  344.     virtual bool        SameIdealTrackAs( const rvSplineMover* tram ) const;
  345.  
  346.     virtual idEntity*    DriverSpeak( const char *speechDecl, bool random = false );
  347.     virtual idEntity*    OccupantSpeak( const char *speechDecl, bool random = false );
  348.  
  349.     virtual void        PostDoneMoving();
  350.  
  351.     virtual void        DeployRamp();
  352.     virtual void        RetractRamp();
  353.     void                OperateRamp( const char* operation );
  354.     void                OperateRamp( const char* operation, idMover* door );
  355.  
  356. protected:
  357.     void                Event_DriverSpeak( const char* voKey );
  358.     void                Event_GetDriver();
  359.     void                Event_Activate( idEntity* activator );
  360.     void                Event_RadiusDamage( const idVec3& origin, const char* damageDefName );
  361.     void                Event_SetIdealTrack( const char* track );
  362.  
  363.     void                Event_OnStopMoving();
  364.     void                Event_OnStartMoving();
  365.  
  366.     void                Event_OpenDoors();
  367.     void                Event_CloseDoors();
  368.  
  369.     void                Event_SetHealth( float health );
  370.  
  371. protected:
  372.     int                    idealTrack;
  373.     idStr                idealTrackTag;// HACK
  374.  
  375.     mutable idFrustum    collisionFov;
  376.  
  377.     rvStateThread        idealTrackStateThread;
  378.     rvStateThread        speedSoundEffectsStateThread;
  379.  
  380.     idEntityPtr<idAI>                    driver;
  381.     idList< idEntityPtr<idAI> >            occupants;
  382.     idList< idEntityPtr<rvVehicle> >    weapons;
  383.  
  384.     int                                    numTracksOnMap;
  385.  
  386.     idEntityPtr<idMover>                leftDoor;
  387.     idEntityPtr<idMover>                rightDoor;
  388.  
  389.     CLASS_STATES_PROTOTYPE( rvTramCar );
  390. };
  391.  
  392. //=======================================================
  393. //
  394. //    rvTramCar_Marine
  395. //
  396. //=======================================================
  397. class rvTramCar_Marine : public rvTramCar {
  398.     CLASS_PROTOTYPE( rvTramCar_Marine );
  399.  
  400. public:
  401.     void                Spawn();
  402.  
  403.     virtual void        MidThink();
  404.  
  405.     void                Save( idSaveGame *savefile ) const;
  406.     void                Restore( idRestoreGame *savefile );
  407.  
  408. public:
  409.     stateResult_t        State_Occupied( const stateParms_t& parms );
  410.     stateResult_t        State_NotOccupied( const stateParms_t& parms );
  411.  
  412.     stateResult_t        State_UsingMountedGun( const stateParms_t& parms );
  413.     stateResult_t        State_NotUsingMountedGun( const stateParms_t& parms );
  414.  
  415. protected:
  416.     virtual void        Damage( idEntity *inflictor, idEntity *attacker, const idVec3 &dir, const char *damageDefName, const float damageScale, const int location );
  417.     virtual void        Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location );
  418.  
  419.     virtual void        LookAround();
  420.  
  421.     bool                LookOverLeftShoulder( idList<rvSplineMover*>& list );
  422.     bool                LookOverRightShoulder( idList<rvSplineMover*>& list );
  423.  
  424.     bool                EntityIsInside( const idEntity* entity ) const;
  425.     bool                PlayerIsInside() const { return EntityIsInside(gameLocal.GetLocalPlayer()); }
  426.  
  427.     void                ActivateTramHud( idPlayer* player );
  428.     void                DeactivateTramHud( idPlayer* player );
  429.     void                UpdateTramHud( idPlayer* player );
  430.  
  431.     virtual void        DeployRamp();
  432.     virtual void        RetractRamp();
  433.  
  434.     void                UseMountedGun( idPlayer* player );
  435.  
  436.     void                Event_UseMountedGun( idEntity* ent );
  437.     void                Event_SetPlayerDamageEntity(float f);    
  438.  
  439. protected:
  440.     idList< idEntityPtr<rvSplineMover> > visibleEnemies;
  441.  
  442.     rvStateThread        playerOccupationStateThread;
  443.     rvStateThread        playerUsingMountedGunStateThread;
  444.  
  445.     int                        maxHealth;
  446.     int                        lastHeal;
  447.     int                        healDelay;
  448.     int                        healAmount;
  449.  
  450.     CLASS_STATES_PROTOTYPE( rvTramCar_Marine );
  451. };
  452.  
  453. //=======================================================
  454. //
  455. //    rvTramCar_Strogg
  456. //
  457. //=======================================================
  458. class rvTramCar_Strogg : public rvTramCar {
  459.     CLASS_PROTOTYPE( rvTramCar_Strogg );
  460.  
  461. public:
  462.     void                Spawn();
  463.  
  464.     virtual void        SetTarget( idEntity* newTarget );
  465.     virtual const rvSplineMover*    GetTarget() const;
  466.  
  467.     void                Save( idSaveGame *savefile ) const;
  468.     void                Restore( idRestoreGame *savefile );
  469.  
  470.     void                WriteToSnapshot( idBitMsgDelta &msg ) const;
  471.     void                ReadFromSnapshot( const idBitMsgDelta &msg );
  472.  
  473. public:
  474.     stateResult_t        State_LookingForTarget( const stateParms_t& parms );
  475.     stateResult_t        State_TargetInSight( const stateParms_t& parms );
  476.  
  477. protected:    
  478.     bool                TargetIsToLeft();
  479.     bool                TargetIsToRight();
  480.  
  481.     virtual void        LookAround();
  482.  
  483. protected:
  484.     void                Event_PostSpawn();
  485.  
  486. protected:
  487.     idEntityPtr<rvSplineMover> target;
  488.  
  489.     rvStateThread        targetSearchStateThread;
  490.  
  491.     CLASS_STATES_PROTOTYPE( rvTramCar_Strogg );
  492. };
  493.  
  494. #endif
  495.