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

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