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

  1. #include "../../idlib/precompiled.h"
  2. #pragma hdrstop
  3.  
  4. #include "../Game_local.h"
  5. #include "../Weapon.h"
  6.  
  7. const idEventDef EV_Railgun_RestoreHum( "<railgunRestoreHum>", "" );
  8.  
  9. class rvWeaponRailgun : public rvWeapon {
  10. public:
  11.  
  12.     CLASS_PROTOTYPE( rvWeaponRailgun );
  13.  
  14.     rvWeaponRailgun ( void );
  15.  
  16.     virtual void            Spawn                ( void );
  17.     virtual void            Think                ( void );
  18.     void                    Save                ( idSaveGame *savefile ) const;
  19.     void                    Restore                ( idRestoreGame *savefile );
  20.     void                    PreSave                ( void );
  21.     void                    PostSave            ( void );
  22.  
  23. protected:
  24.     jointHandle_t            jointBatteryView;
  25.  
  26. private:
  27.  
  28.     stateResult_t        State_Idle        ( const stateParms_t& parms );
  29.     stateResult_t        State_Fire        ( const stateParms_t& parms );
  30.     stateResult_t        State_Reload    ( const stateParms_t& parms );
  31.  
  32.     void                Event_RestoreHum    ( void );
  33.  
  34.     CLASS_STATES_PROTOTYPE ( rvWeaponRailgun );
  35. };
  36.  
  37. CLASS_DECLARATION( rvWeapon, rvWeaponRailgun )
  38.     EVENT( EV_Railgun_RestoreHum,            rvWeaponRailgun::Event_RestoreHum )
  39. END_CLASS
  40.  
  41. /*
  42. ================
  43. rvWeaponRailgun::rvWeaponRailgun
  44. ================
  45. */
  46. rvWeaponRailgun::rvWeaponRailgun ( void ) {
  47. }
  48.  
  49. /*
  50. ================
  51. rvWeaponRailgun::Spawn
  52. ================
  53. */
  54. void rvWeaponRailgun::Spawn ( void ) {
  55.     SetState ( "Raise", 0 );    
  56. }
  57.  
  58. /*
  59. ================
  60. rvWeaponRailgun::Save
  61. ================
  62. */
  63. void rvWeaponRailgun::Save ( idSaveGame *savefile ) const {
  64.     savefile->WriteJoint( jointBatteryView );
  65. }
  66.  
  67. /*
  68. ================
  69. rvWeaponRailgun::Restore
  70. ================
  71. */
  72. void rvWeaponRailgun::Restore ( idRestoreGame *savefile ) {
  73.     savefile->ReadJoint( jointBatteryView );
  74. }
  75.  
  76. /*
  77. ================
  78. rvWeaponRailgun::PreSave
  79. ================
  80. */
  81. void rvWeaponRailgun::PreSave ( void ) {
  82.  
  83.     //this should shoosh the humming but not the shooting sound.
  84.     StopSound( SND_CHANNEL_BODY2, 0);
  85. }
  86.  
  87. /*
  88. ================
  89. rvWeaponRailgun::PostSave
  90. ================
  91. */
  92. void rvWeaponRailgun::PostSave ( void ) {
  93.  
  94.     //restore the humming
  95.     PostEventMS( &EV_Railgun_RestoreHum, 10);
  96. }
  97.  
  98. /*
  99. ================
  100. rvWeaponRailgun::Think
  101. ================
  102. */
  103. void rvWeaponRailgun::Think ( void ) {
  104.  
  105.     // Let the real weapon think first
  106.     rvWeapon::Think ( );
  107.  
  108.     if ( zoomGui && wsfl.zoom && !gameLocal.isMultiplayer ) {
  109.         int ammo = AmmoInClip();
  110.         if ( ammo >= 0 ) {
  111.             zoomGui->SetStateInt( "player_ammo", ammo );
  112.         }            
  113.     }
  114. }
  115.  
  116. /*
  117. ===============================================================================
  118.  
  119.     States 
  120.  
  121. ===============================================================================
  122. */
  123.  
  124. CLASS_STATES_DECLARATION ( rvWeaponRailgun )
  125.     STATE ( "Idle",                rvWeaponRailgun::State_Idle)
  126.     STATE ( "Fire",                rvWeaponRailgun::State_Fire )
  127.     STATE ( "Reload",            rvWeaponRailgun::State_Reload )
  128. END_CLASS_STATES
  129.  
  130. /*
  131. ================
  132. rvWeaponRailgun::State_Idle
  133. ================
  134. */
  135. stateResult_t rvWeaponRailgun::State_Idle( const stateParms_t& parms ) {
  136.     enum {
  137.         STAGE_INIT,
  138.         STAGE_WAIT,
  139.     };    
  140.     switch ( parms.stage ) {
  141.         case STAGE_INIT:
  142.             if ( !AmmoAvailable ( ) ) {
  143.                 SetStatus ( WP_OUTOFAMMO );
  144.             } else {
  145.                 StopSound( SND_CHANNEL_BODY2, false );
  146.                 StartSound( "snd_idle_hum", SND_CHANNEL_BODY2, 0, false, NULL );
  147.                 SetStatus ( WP_READY );
  148.             }
  149.             PlayCycle( ANIMCHANNEL_ALL, "idle", parms.blendFrames );
  150.             return SRESULT_STAGE ( STAGE_WAIT );
  151.         
  152.         case STAGE_WAIT:            
  153.             if ( wsfl.lowerWeapon ) {
  154.                 StopSound( SND_CHANNEL_BODY2, false );
  155.                 SetState ( "Lower", 4 );
  156.                 return SRESULT_DONE;
  157.             }        
  158.             if ( gameLocal.time > nextAttackTime && wsfl.attack && AmmoInClip ( ) ) {
  159.                 SetState ( "Fire", 0 );
  160.                 return SRESULT_DONE;
  161.             }  
  162.             // Auto reload?
  163.             if ( AutoReload() && !AmmoInClip ( ) && AmmoAvailable () ) {
  164.                 SetState ( "reload", 2 );
  165.                 return SRESULT_DONE;
  166.             }
  167.             if ( wsfl.netReload || (wsfl.reload && AmmoInClip() < ClipSize() && AmmoAvailable()>AmmoInClip()) ) {
  168.                 SetState ( "Reload", 4 );
  169.                 return SRESULT_DONE;            
  170.             }
  171.             return SRESULT_WAIT;
  172.     }
  173.     return SRESULT_ERROR;
  174. }
  175.  
  176. /*
  177. ================
  178. rvWeaponRailgun::State_Fire
  179. ================
  180. */
  181. stateResult_t rvWeaponRailgun::State_Fire ( const stateParms_t& parms ) {
  182.     enum {
  183.         STAGE_INIT,
  184.         STAGE_WAIT,
  185.     };    
  186.     switch ( parms.stage ) {
  187.         case STAGE_INIT:
  188.             nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE ));
  189.             Attack ( false, 1, spread, 0, 1.0f );
  190.             PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 );    
  191.             return SRESULT_STAGE ( STAGE_WAIT );
  192.     
  193.         case STAGE_WAIT:        
  194.             if ( ( gameLocal.isMultiplayer && gameLocal.time >= nextAttackTime ) || 
  195.                  ( !gameLocal.isMultiplayer && ( AnimDone ( ANIMCHANNEL_ALL, 2 ) ) ) ) {
  196.                 SetState ( "Idle", 0 );
  197.                 return SRESULT_DONE;
  198.             }        
  199.             return SRESULT_WAIT;
  200.     }
  201.     return SRESULT_ERROR;
  202. }
  203.  
  204.  
  205. /*
  206. ================
  207. rvWeaponRailgun::State_Reload
  208. ================
  209. */
  210. stateResult_t rvWeaponRailgun::State_Reload ( const stateParms_t& parms ) {
  211.     enum {
  212.         STAGE_INIT,
  213.         STAGE_WAIT,
  214.     };    
  215.     switch ( parms.stage ) {
  216.         case STAGE_INIT:
  217.             if ( wsfl.netReload ) {
  218.                 wsfl.netReload = false;
  219.             } else {
  220.                 NetReload ( );
  221.             }
  222.                         
  223.             SetStatus ( WP_RELOAD );
  224.             PlayAnim ( ANIMCHANNEL_ALL, "reload", parms.blendFrames );
  225.             return SRESULT_STAGE ( STAGE_WAIT );
  226.             
  227.         case STAGE_WAIT:
  228.             if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
  229.                 AddToClip ( ClipSize() );
  230.                 SetState ( "Idle", 4 );
  231.                 return SRESULT_DONE;
  232.             }
  233.             if ( wsfl.lowerWeapon ) {
  234.                 StopSound( SND_CHANNEL_BODY2, false );
  235.                 SetState ( "Lower", 4 );
  236.                 return SRESULT_DONE;
  237.             }
  238.             return SRESULT_WAIT;
  239.     }
  240.     return SRESULT_ERROR;
  241. }
  242.  
  243. /*
  244. ===============================================================================
  245.  
  246.     Event 
  247.  
  248. ===============================================================================
  249. */
  250.  
  251. /*
  252. ================
  253. rvWeaponRailgun::State_Reload
  254. ================
  255. */
  256. void rvWeaponRailgun::Event_RestoreHum ( void ) {
  257.     StopSound( SND_CHANNEL_BODY2, false );
  258.     StartSound( "snd_idle_hum", SND_CHANNEL_BODY2, 0, false, NULL );
  259. }
  260.