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

  1. #include "../../idlib/precompiled.h"
  2. #pragma hdrstop
  3.  
  4. #include "../Game_local.h"
  5. #include "../Weapon.h"
  6.  
  7. const int HYPERBLASTER_SPARM_BATTERY = 6;
  8. const int HYPERBLASTER_SPIN_SPEED     = 300;
  9.  
  10. class rvWeaponHyperblaster : public rvWeapon {
  11. public:
  12.  
  13.     CLASS_PROTOTYPE( rvWeaponHyperblaster );
  14.  
  15.     rvWeaponHyperblaster ( void );
  16.  
  17.     virtual void            Spawn                ( void );
  18.     void                    Save                ( idSaveGame *savefile ) const;
  19.     void                    Restore                ( idRestoreGame *savefile );
  20.     void                    PreSave                ( void );
  21.     void                    PostSave            ( void );
  22.  
  23. protected:
  24.  
  25.     jointHandle_t            jointBatteryView;
  26.     bool                    spinning;
  27.  
  28.     void                    SpinUp                ( void );
  29.     void                    SpinDown            ( void );
  30.  
  31. private:
  32.  
  33.     stateResult_t        State_Idle        ( const stateParms_t& parms );
  34.     stateResult_t        State_Fire        ( const stateParms_t& parms );
  35.     stateResult_t        State_Reload    ( const stateParms_t& parms );
  36.     
  37.     CLASS_STATES_PROTOTYPE ( rvWeaponHyperblaster );
  38. };
  39.  
  40. CLASS_DECLARATION( rvWeapon, rvWeaponHyperblaster )
  41. END_CLASS
  42.  
  43. /*
  44. ================
  45. rvWeaponHyperblaster::rvWeaponHyperblaster
  46. ================
  47. */
  48. rvWeaponHyperblaster::rvWeaponHyperblaster ( void ) {
  49. }
  50.  
  51. /*
  52. ================
  53. rvWeaponHyperblaster::Spawn
  54. ================
  55. */
  56. void rvWeaponHyperblaster::Spawn ( void ) {
  57.     jointBatteryView = viewAnimator->GetJointHandle ( spawnArgs.GetString ( "joint_view_battery" ) );
  58.     spinning         = false;
  59.     
  60.     SetState ( "Raise", 0 );    
  61. }
  62.  
  63. /*
  64. ================
  65. rvWeaponHyperblaster::Save
  66. ================
  67. */
  68. void rvWeaponHyperblaster::Save ( idSaveGame *savefile ) const {
  69.     savefile->WriteJoint ( jointBatteryView );
  70.     savefile->WriteBool ( spinning );
  71. }
  72.  
  73. /*
  74. ================
  75. rvWeaponHyperblaster::Restore
  76. ================
  77. */
  78. void rvWeaponHyperblaster::Restore ( idRestoreGame *savefile ) {
  79.     savefile->ReadJoint ( jointBatteryView );
  80.     savefile->ReadBool ( spinning );
  81. }
  82.  
  83. /*
  84. ================
  85. rvWeaponHyperBlaster::PreSave
  86. ================
  87. */
  88. void rvWeaponHyperblaster::PreSave ( void ) {
  89.  
  90.     SetState ( "Idle", 4 );
  91.  
  92.     StopSound( SND_CHANNEL_WEAPON, false );
  93.     StopSound( SND_CHANNEL_BODY, false );
  94.     StopSound( SND_CHANNEL_ITEM, false );
  95.     StopSound( SND_CHANNEL_ANY, false );
  96.     
  97. }
  98.  
  99. /*
  100. ================
  101. rvWeaponHyperBlaster::PostSave
  102. ================
  103. */
  104. void rvWeaponHyperblaster::PostSave ( void ) {
  105. }
  106.  
  107. /*
  108. ================
  109. rvWeaponHyperblaster::SpinUp
  110. ================
  111. */
  112. void rvWeaponHyperblaster::SpinUp ( void ) {
  113.     if ( spinning ) {
  114.         return;
  115.     }
  116.     
  117.     if ( jointBatteryView != INVALID_JOINT ) {
  118.         viewAnimator->SetJointAngularVelocity ( jointBatteryView, idAngles(0,HYPERBLASTER_SPIN_SPEED,0), gameLocal.time, 50 );
  119.     }
  120.  
  121.     StopSound ( SND_CHANNEL_BODY2, false );
  122.     StartSound ( "snd_battery_spin", SND_CHANNEL_BODY2, 0, false, NULL );
  123.     spinning = true;
  124. }
  125.  
  126. /*
  127. ================
  128. rvWeaponHyperblaster::SpinDown
  129. ================
  130. */
  131. void rvWeaponHyperblaster::SpinDown    ( void ) {
  132.     if ( !spinning ) {
  133.         return;
  134.     }
  135.     
  136.     StopSound ( SND_CHANNEL_BODY2, false );
  137.     StartSound ( "snd_battery_spindown", SND_CHANNEL_BODY2, 0, false, NULL );
  138.  
  139.     if ( jointBatteryView != INVALID_JOINT ) {
  140.         viewAnimator->SetJointAngularVelocity ( jointBatteryView, idAngles(0,0,0), gameLocal.time, 500 );
  141.     }
  142.  
  143.     spinning = false;
  144. }
  145.  
  146. /*
  147. ===============================================================================
  148.  
  149.     States 
  150.  
  151. ===============================================================================
  152. */
  153.  
  154. CLASS_STATES_DECLARATION ( rvWeaponHyperblaster )
  155.     STATE ( "Idle",                rvWeaponHyperblaster::State_Idle)
  156.     STATE ( "Fire",                rvWeaponHyperblaster::State_Fire )
  157.     STATE ( "Reload",            rvWeaponHyperblaster::State_Reload )
  158. END_CLASS_STATES
  159.  
  160. /*
  161. ================
  162. rvWeaponHyperblaster::State_Idle
  163. ================
  164. */
  165. stateResult_t rvWeaponHyperblaster::State_Idle( const stateParms_t& parms ) {
  166.     enum {
  167.         STAGE_INIT,
  168.         STAGE_WAIT,
  169.     };    
  170.     switch ( parms.stage ) {
  171.         case STAGE_INIT:
  172.             if ( !AmmoAvailable ( ) ) {
  173.                 SetStatus ( WP_OUTOFAMMO );
  174.             } else {
  175.                 SetStatus ( WP_READY );
  176.             }
  177.  
  178.             SpinDown ( );
  179.  
  180.             if ( ClipSize() ) {
  181.                 viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, (float)AmmoInClip()/ClipSize() );
  182.             } else {
  183.                 viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, 1.0f );        
  184.             }
  185.             PlayCycle( ANIMCHANNEL_ALL, "idle", parms.blendFrames );
  186.             return SRESULT_STAGE ( STAGE_WAIT );
  187.         
  188.         case STAGE_WAIT:            
  189.             if ( wsfl.lowerWeapon ) {
  190.                 SetState ( "Lower", 4 );
  191.                 return SRESULT_DONE;
  192.             }        
  193.             if ( !clipSize ) {
  194.                 if ( gameLocal.time > nextAttackTime && wsfl.attack && AmmoAvailable ( ) ) {
  195.                     SetState ( "Fire", 0 );
  196.                     return SRESULT_DONE;
  197.                 } 
  198.             } else {
  199.                 if ( gameLocal.time > nextAttackTime && wsfl.attack && AmmoInClip ( ) ) {
  200.                     SetState ( "Fire", 0 );
  201.                     return SRESULT_DONE;
  202.                 }  
  203.                 if ( wsfl.attack && AutoReload() && !AmmoInClip ( ) && AmmoAvailable () ) {
  204.                     SetState ( "Reload", 4 );
  205.                     return SRESULT_DONE;            
  206.                 }
  207.                 if ( wsfl.netReload || (wsfl.reload && AmmoInClip() < ClipSize() && AmmoAvailable()>AmmoInClip()) ) {
  208.                     SetState ( "Reload", 4 );
  209.                     return SRESULT_DONE;            
  210.                 }                
  211.             }
  212.  
  213.             return SRESULT_WAIT;
  214.     }
  215.     return SRESULT_ERROR;
  216. }
  217.  
  218. /*
  219. ================
  220. rvWeaponHyperblaster::State_Fire
  221. ================
  222. */
  223. stateResult_t rvWeaponHyperblaster::State_Fire ( const stateParms_t& parms ) {
  224.     enum {
  225.         STAGE_INIT,
  226.         STAGE_WAIT,
  227.     };    
  228.     switch ( parms.stage ) {
  229.         case STAGE_INIT:
  230.             SpinUp ( );
  231.             nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE ));
  232.             Attack ( false, 1, spread, 0, 1.0f );
  233.             if ( ClipSize() ) {
  234.                 viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, (float)AmmoInClip()/ClipSize() );
  235.             } else {
  236.                 viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, 1.0f );        
  237.             }
  238.             PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 );    
  239.             return SRESULT_STAGE ( STAGE_WAIT );
  240.     
  241.         case STAGE_WAIT:        
  242.             if ( wsfl.attack && gameLocal.time >= nextAttackTime && AmmoInClip() && !wsfl.lowerWeapon ) {
  243.                 SetState ( "Fire", 0 );
  244.                 return SRESULT_DONE;
  245.             }
  246.             if ( (!wsfl.attack || !AmmoInClip() || wsfl.lowerWeapon) && AnimDone ( ANIMCHANNEL_ALL, 0 ) ) {
  247.                 SetState ( "Idle", 0 );
  248.                 return SRESULT_DONE;
  249.             }        
  250.             return SRESULT_WAIT;
  251.     }
  252.     return SRESULT_ERROR;
  253. }
  254.  
  255. /*
  256. ================
  257. rvWeaponHyperblaster::State_Reload
  258. ================
  259. */
  260. stateResult_t rvWeaponHyperblaster::State_Reload ( const stateParms_t& parms ) {
  261.     enum {
  262.         STAGE_INIT,
  263.         STAGE_WAIT,
  264.     };    
  265.     switch ( parms.stage ) {
  266.         case STAGE_INIT:
  267.             if ( wsfl.netReload ) {
  268.                 wsfl.netReload = false;
  269.             } else {
  270.                 NetReload ( );
  271.             }
  272.             
  273.             SpinDown ( );
  274.  
  275.             viewModel->SetShaderParm ( HYPERBLASTER_SPARM_BATTERY, 0 );
  276.             
  277.             SetStatus ( WP_RELOAD );
  278.             PlayAnim ( ANIMCHANNEL_ALL, "reload", parms.blendFrames );
  279.             return SRESULT_STAGE ( STAGE_WAIT );
  280.             
  281.         case STAGE_WAIT:
  282.             if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
  283.                 AddToClip ( ClipSize() );
  284.                 SetState ( "Idle", 4 );
  285.                 return SRESULT_DONE;
  286.             }
  287.             if ( wsfl.lowerWeapon ) {
  288.                 SetState ( "Lower", 4 );
  289.                 return SRESULT_DONE;
  290.             }
  291.             return SRESULT_WAIT;
  292.     }
  293.     return SRESULT_ERROR;
  294. }
  295.             
  296.