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

  1. #include "../../idlib/precompiled.h"
  2. #pragma hdrstop
  3.  
  4. #include "../Game_local.h"
  5. #include "../Weapon.h"
  6.  
  7. #define BLASTER_SPARM_CHARGEGLOW        6
  8.  
  9. class rvWeaponBlaster : public rvWeapon {
  10. public:
  11.  
  12.     CLASS_PROTOTYPE( rvWeaponBlaster );
  13.  
  14.     rvWeaponBlaster ( void );
  15.  
  16.     virtual void        Spawn                ( void );
  17.     void                Save                ( idSaveGame *savefile ) const;
  18.     void                Restore                ( idRestoreGame *savefile );
  19.     void                PreSave        ( void );
  20.     void                PostSave    ( void );
  21.  
  22. protected:
  23.  
  24.     bool                UpdateAttack        ( void );
  25.     bool                UpdateFlashlight    ( void );
  26.     void                Flashlight            ( bool on );
  27.  
  28. private:
  29.  
  30.     int                    chargeTime;
  31.     int                    chargeDelay;
  32.     idVec2                chargeGlow;
  33.     bool                fireForced;
  34.     int                    fireHeldTime;
  35.  
  36.     stateResult_t        State_Raise                ( const stateParms_t& parms );
  37.     stateResult_t        State_Lower                ( const stateParms_t& parms );
  38.     stateResult_t        State_Idle                ( const stateParms_t& parms );
  39.     stateResult_t        State_Charge            ( const stateParms_t& parms );
  40.     stateResult_t        State_Charged            ( const stateParms_t& parms );
  41.     stateResult_t        State_Fire                ( const stateParms_t& parms );
  42.     stateResult_t        State_Flashlight        ( const stateParms_t& parms );
  43.     
  44.     CLASS_STATES_PROTOTYPE ( rvWeaponBlaster );
  45. };
  46.  
  47. CLASS_DECLARATION( rvWeapon, rvWeaponBlaster )
  48. END_CLASS
  49.  
  50. /*
  51. ================
  52. rvWeaponBlaster::rvWeaponBlaster
  53. ================
  54. */
  55. rvWeaponBlaster::rvWeaponBlaster ( void ) {
  56. }
  57.  
  58. /*
  59. ================
  60. rvWeaponBlaster::UpdateFlashlight
  61. ================
  62. */
  63. bool rvWeaponBlaster::UpdateFlashlight ( void ) {
  64.     if ( !wsfl.flashlight ) {
  65.         return false;
  66.     }
  67.     
  68.     SetState ( "Flashlight", 0 );
  69.     return true;        
  70. }
  71.  
  72. /*
  73. ================
  74. rvWeaponBlaster::Flashlight
  75. ================
  76. */
  77. void rvWeaponBlaster::Flashlight ( bool on ) {
  78.     owner->Flashlight ( on );
  79.     
  80.     if ( on ) {
  81.         worldModel->ShowSurface ( "models/weapons/blaster/flare" );
  82.         viewModel->ShowSurface ( "models/weapons/blaster/flare" );
  83.     } else {
  84.         worldModel->HideSurface ( "models/weapons/blaster/flare" );
  85.         viewModel->HideSurface ( "models/weapons/blaster/flare" );
  86.     }
  87. }
  88.  
  89. /*
  90. ================
  91. rvWeaponBlaster::UpdateAttack
  92. ================
  93. */
  94. bool rvWeaponBlaster::UpdateAttack ( void ) {
  95.     // Clear fire forced
  96.     if ( fireForced ) {
  97.         if ( !wsfl.attack ) {
  98.             fireForced = false;
  99.         } else {
  100.             return false;
  101.         }
  102.     }
  103.  
  104.     // If the player is pressing the fire button and they have enough ammo for a shot
  105.     // then start the shooting process.
  106.     if ( wsfl.attack && gameLocal.time >= nextAttackTime ) {
  107.         // Save the time which the fire button was pressed
  108.         if ( fireHeldTime == 0 ) {        
  109.             nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE ));
  110.             fireHeldTime   = gameLocal.time;
  111.             viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, chargeGlow[0] );
  112.         }
  113.     }        
  114.  
  115.     // If they have the charge mod and they have overcome the initial charge 
  116.     // delay then transition to the charge state.
  117.     if ( fireHeldTime != 0 ) {
  118.         if ( gameLocal.time - fireHeldTime > chargeDelay ) {
  119.             SetState ( "Charge", 4 );
  120.             return true;
  121.         }
  122.  
  123.         // If the fire button was let go but was pressed at one point then 
  124.         // release the shot.
  125.         if ( !wsfl.attack ) {
  126.             idPlayer * player = gameLocal.GetLocalPlayer();
  127.             
  128.             if( player && player->GuiActive() )    {
  129.                 //make sure the player isn't looking at a gui first
  130.                 SetState ( "Lower", 0 );
  131.             } else {
  132.                 SetState ( "Fire", 0 );
  133.             }
  134.             return true;
  135.         }
  136.     }
  137.     
  138.     return false;
  139. }
  140.  
  141. /*
  142. ================
  143. rvWeaponBlaster::Spawn
  144. ================
  145. */
  146. void rvWeaponBlaster::Spawn ( void ) {
  147.     viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, 0 );
  148.     SetState ( "Raise", 0 );
  149.     
  150.     chargeGlow   = spawnArgs.GetVec2 ( "chargeGlow" );
  151.     chargeTime   = SEC2MS ( spawnArgs.GetFloat ( "chargeTime" ) );
  152.     chargeDelay  = SEC2MS ( spawnArgs.GetFloat ( "chargeDelay" ) );
  153.  
  154.     fireHeldTime        = 0;
  155.     fireForced            = false;
  156.             
  157.     Flashlight ( owner->IsFlashlightOn() );
  158. }
  159.  
  160. /*
  161. ================
  162. rvWeaponBlaster::Save
  163. ================
  164. */
  165. void rvWeaponBlaster::Save ( idSaveGame *savefile ) const {
  166.     savefile->WriteInt ( chargeTime );
  167.     savefile->WriteInt ( chargeDelay );
  168.     savefile->WriteVec2 ( chargeGlow );
  169.     savefile->WriteBool ( fireForced );
  170.     savefile->WriteInt ( fireHeldTime );
  171. }
  172.  
  173. /*
  174. ================
  175. rvWeaponBlaster::Restore
  176. ================
  177. */
  178. void rvWeaponBlaster::Restore ( idRestoreGame *savefile ) {
  179.     savefile->ReadInt ( chargeTime );
  180.     savefile->ReadInt ( chargeDelay );
  181.     savefile->ReadVec2 ( chargeGlow );
  182.     savefile->ReadBool ( fireForced );
  183.     savefile->ReadInt ( fireHeldTime );
  184. }
  185.  
  186. /*
  187. ================
  188. rvWeaponBlaster::PreSave
  189. ================
  190. */
  191. void rvWeaponBlaster::PreSave ( void ) {
  192.  
  193.     SetState ( "Idle", 4 );
  194.  
  195.     StopSound( SND_CHANNEL_WEAPON, 0);
  196.     StopSound( SND_CHANNEL_BODY, 0);
  197.     StopSound( SND_CHANNEL_ITEM, 0);
  198.     StopSound( SND_CHANNEL_ANY, false );
  199.     
  200. }
  201.  
  202. /*
  203. ================
  204. rvWeaponBlaster::PostSave
  205. ================
  206. */
  207. void rvWeaponBlaster::PostSave ( void ) {
  208. }
  209.  
  210. /*
  211. ===============================================================================
  212.  
  213.     States 
  214.  
  215. ===============================================================================
  216. */
  217.  
  218. CLASS_STATES_DECLARATION ( rvWeaponBlaster )
  219.     STATE ( "Raise",                        rvWeaponBlaster::State_Raise )
  220.     STATE ( "Lower",                        rvWeaponBlaster::State_Lower )
  221.     STATE ( "Idle",                            rvWeaponBlaster::State_Idle)
  222.     STATE ( "Charge",                        rvWeaponBlaster::State_Charge )
  223.     STATE ( "Charged",                        rvWeaponBlaster::State_Charged )
  224.     STATE ( "Fire",                            rvWeaponBlaster::State_Fire )
  225.     STATE ( "Flashlight",                    rvWeaponBlaster::State_Flashlight )
  226. END_CLASS_STATES
  227.  
  228. /*
  229. ================
  230. rvWeaponBlaster::State_Raise
  231. ================
  232. */
  233. stateResult_t rvWeaponBlaster::State_Raise( const stateParms_t& parms ) {
  234.     enum {
  235.         RAISE_INIT,
  236.         RAISE_WAIT,
  237.     };    
  238.     switch ( parms.stage ) {
  239.         case RAISE_INIT:            
  240.             SetStatus ( WP_RISING );
  241.             PlayAnim( ANIMCHANNEL_ALL, "raise", parms.blendFrames );
  242.             return SRESULT_STAGE(RAISE_WAIT);
  243.             
  244.         case RAISE_WAIT:
  245.             if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
  246.                 SetState ( "Idle", 4 );
  247.                 return SRESULT_DONE;
  248.             }
  249.             if ( wsfl.lowerWeapon ) {
  250.                 SetState ( "Lower", 4 );
  251.                 return SRESULT_DONE;
  252.             }
  253.             return SRESULT_WAIT;
  254.     }
  255.     return SRESULT_ERROR;    
  256. }
  257.  
  258. /*
  259. ================
  260. rvWeaponBlaster::State_Lower
  261. ================
  262. */
  263. stateResult_t rvWeaponBlaster::State_Lower ( const stateParms_t& parms ) {
  264.     enum {
  265.         LOWER_INIT,
  266.         LOWER_WAIT,
  267.         LOWER_WAITRAISE
  268.     };    
  269.     switch ( parms.stage ) {
  270.         case LOWER_INIT:
  271.             SetStatus ( WP_LOWERING );
  272.             PlayAnim( ANIMCHANNEL_ALL, "putaway", parms.blendFrames );
  273.             return SRESULT_STAGE(LOWER_WAIT);
  274.             
  275.         case LOWER_WAIT:
  276.             if ( AnimDone ( ANIMCHANNEL_ALL, 0 ) ) {
  277.                 SetStatus ( WP_HOLSTERED );
  278.                 return SRESULT_STAGE(LOWER_WAITRAISE);
  279.             }
  280.             return SRESULT_WAIT;
  281.     
  282.         case LOWER_WAITRAISE:
  283.             if ( wsfl.raiseWeapon ) {
  284.                 SetState ( "Raise", 0 );
  285.                 return SRESULT_DONE;
  286.             }
  287.             return SRESULT_WAIT;
  288.     }
  289.     return SRESULT_ERROR;
  290. }
  291.  
  292. /*
  293. ================
  294. rvWeaponBlaster::State_Idle
  295. ================
  296. */
  297. stateResult_t rvWeaponBlaster::State_Idle ( const stateParms_t& parms ) {    
  298.     enum {
  299.         IDLE_INIT,
  300.         IDLE_WAIT,
  301.     };    
  302.     switch ( parms.stage ) {
  303.         case IDLE_INIT:            
  304.             SetStatus ( WP_READY );
  305.             PlayCycle( ANIMCHANNEL_ALL, "idle", parms.blendFrames );
  306.             return SRESULT_STAGE ( IDLE_WAIT );
  307.             
  308.         case IDLE_WAIT:
  309.             if ( wsfl.lowerWeapon ) {
  310.                 SetState ( "Lower", 4 );
  311.                 return SRESULT_DONE;
  312.             }
  313.             
  314.             if ( UpdateFlashlight ( ) ) { 
  315.                 return SRESULT_DONE;
  316.             }
  317.             if ( UpdateAttack ( ) ) {
  318.                 return SRESULT_DONE;
  319.             }
  320.             return SRESULT_WAIT;
  321.     }
  322.     return SRESULT_ERROR;
  323. }
  324.  
  325. /*
  326. ================
  327. rvWeaponBlaster::State_Charge
  328. ================
  329. */
  330. stateResult_t rvWeaponBlaster::State_Charge ( const stateParms_t& parms ) {
  331.     enum {
  332.         CHARGE_INIT,
  333.         CHARGE_WAIT,
  334.     };    
  335.     switch ( parms.stage ) {
  336.         case CHARGE_INIT:
  337.             viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, chargeGlow[0] );
  338.             StartSound ( "snd_charge", SND_CHANNEL_ITEM, 0, false, NULL );
  339.             PlayCycle( ANIMCHANNEL_ALL, "charging", parms.blendFrames );
  340.             return SRESULT_STAGE ( CHARGE_WAIT );
  341.             
  342.         case CHARGE_WAIT:    
  343.             if ( gameLocal.time - fireHeldTime < chargeTime ) {
  344.                 float f;
  345.                 f = (float)(gameLocal.time - fireHeldTime) / (float)chargeTime;
  346.                 f = chargeGlow[0] + f * (chargeGlow[1] - chargeGlow[0]);
  347.                 f = idMath::ClampFloat ( chargeGlow[0], chargeGlow[1], f );
  348.                 viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, f );
  349.                 
  350.                 if ( !wsfl.attack ) {
  351.                     SetState ( "Fire", 0 );
  352.                     return SRESULT_DONE;
  353.                 }
  354.                 
  355.                 return SRESULT_WAIT;
  356.             } 
  357.             SetState ( "Charged", 4 );
  358.             return SRESULT_DONE;
  359.     }
  360.     return SRESULT_ERROR;    
  361. }
  362.  
  363. /*
  364. ================
  365. rvWeaponBlaster::State_Charged
  366. ================
  367. */
  368. stateResult_t rvWeaponBlaster::State_Charged ( const stateParms_t& parms ) {
  369.     enum {
  370.         CHARGED_INIT,
  371.         CHARGED_WAIT,
  372.     };    
  373.     switch ( parms.stage ) {
  374.         case CHARGED_INIT:        
  375.             viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, 1.0f  );
  376.  
  377.             StopSound ( SND_CHANNEL_ITEM, false );
  378.             StartSound ( "snd_charge_loop", SND_CHANNEL_ITEM, 0, false, NULL );
  379.             StartSound ( "snd_charge_click", SND_CHANNEL_BODY, 0, false, NULL );
  380.             return SRESULT_STAGE(CHARGED_WAIT);
  381.             
  382.         case CHARGED_WAIT:
  383.             if ( !wsfl.attack ) {
  384.                 fireForced = true;
  385.                 SetState ( "Fire", 0 );
  386.                 return SRESULT_DONE;
  387.             }
  388.             return SRESULT_WAIT;
  389.     }
  390.     return SRESULT_ERROR;
  391. }
  392.  
  393. /*
  394. ================
  395. rvWeaponBlaster::State_Fire
  396. ================
  397. */
  398. stateResult_t rvWeaponBlaster::State_Fire ( const stateParms_t& parms ) {
  399.     enum {
  400.         FIRE_INIT,
  401.         FIRE_WAIT,
  402.     };    
  403.     switch ( parms.stage ) {
  404.         case FIRE_INIT:    
  405.  
  406.             StopSound ( SND_CHANNEL_ITEM, false );
  407.             viewModel->SetShaderParm ( BLASTER_SPARM_CHARGEGLOW, 0 );
  408.             //don't fire if we're targeting a gui.
  409.             idPlayer* player;
  410.             player = gameLocal.GetLocalPlayer();
  411.  
  412.             //make sure the player isn't looking at a gui first
  413.             if( player && player->GuiActive() )    {
  414.                 fireHeldTime = 0;
  415.                 SetState ( "Lower", 0 );
  416.                 return SRESULT_DONE;
  417.             }
  418.     
  419.             if ( gameLocal.time - fireHeldTime > chargeTime ) {    
  420.                 Attack ( true, 1, spread, 0, 1.0f );
  421.                 PlayEffect ( "fx_chargedflash", barrelJointView, false );
  422.                 PlayAnim( ANIMCHANNEL_ALL, "chargedfire", parms.blendFrames );
  423.             } else {
  424.                 Attack ( false, 1, spread, 0, 1.0f );
  425.                 PlayEffect ( "fx_normalflash", barrelJointView, false );
  426.                 PlayAnim( ANIMCHANNEL_ALL, "fire", parms.blendFrames );
  427.             }
  428.             fireHeldTime = 0;
  429.             
  430.             return SRESULT_STAGE(FIRE_WAIT);
  431.         
  432.         case FIRE_WAIT:
  433.             if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
  434.                 SetState ( "Idle", 4 );
  435.                 return SRESULT_DONE;
  436.             }
  437.             if ( UpdateFlashlight ( ) || UpdateAttack ( ) ) {
  438.                 return SRESULT_DONE;
  439.             }
  440.             return SRESULT_WAIT;
  441.     }            
  442.     return SRESULT_ERROR;
  443. }
  444.  
  445. /*
  446. ================
  447. rvWeaponBlaster::State_Flashlight
  448. ================
  449. */
  450. stateResult_t rvWeaponBlaster::State_Flashlight ( const stateParms_t& parms ) {
  451.     enum {
  452.         FLASHLIGHT_INIT,
  453.         FLASHLIGHT_WAIT,
  454.     };    
  455.     switch ( parms.stage ) {
  456.         case FLASHLIGHT_INIT:            
  457.             SetStatus ( WP_FLASHLIGHT );
  458.             // Wait for the flashlight anim to play        
  459.             PlayAnim( ANIMCHANNEL_ALL, "flashlight", 0 );
  460.             return SRESULT_STAGE ( FLASHLIGHT_WAIT );
  461.             
  462.         case FLASHLIGHT_WAIT:
  463.             if ( !AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
  464.                 return SRESULT_WAIT;
  465.             }
  466.             
  467.             if ( owner->IsFlashlightOn() ) {
  468.                 Flashlight ( false );
  469.             } else {
  470.                 Flashlight ( true );
  471.             }
  472.             
  473.             SetState ( "Idle", 4 );
  474.             return SRESULT_DONE;
  475.     }
  476.     return SRESULT_ERROR;
  477. }
  478.