home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 September / GSSH0904CD2.iso / Doom3 / Mods / Chaingunfix / Chaingunfix.exe / pak005.pk4 / script / weapon_chaingun.script
Text File  |  2004-08-06  |  6KB  |  229 lines

  1. /***********************************************************************
  2.  
  3. weapon_chaingun.script
  4.  
  5. ***********************************************************************/
  6.  
  7. #define CHAINGUN_FIRE_SKIPFRAMES    0.35        // 6 shots per second
  8. #define CHAINGUN_LOWAMMO            50
  9. #define CHAINGUN_NUMPROJECTILES        2
  10. #define    CHAINGUN_BARREL_SPEED        ( 60 * ( GAME_FPS / CHAINGUN_FIRE_SKIPFRAMES ) )
  11. #define    CHAINGUN_BARREL_ACCEL_TIME    1.0
  12. #define CHAINGUN_BARREL_DECCEL_TIME    1.0
  13. #define    CHAINGUN_BARREL_ACCEL        ( CHAINGUN_BARREL_SPEED / CHAINGUN_BARREL_ACCEL_TIME )
  14. #define CHAINGUN_BARREL_DECCEL        ( CHAINGUN_BARREL_SPEED / CHAINGUN_BARREL_DECCEL_TIME )
  15.  
  16. // blend times
  17. #define CHAINGUN_IDLE_TO_LOWER        4
  18. #define CHAINGUN_IDLE_TO_FIRE        0
  19. #define    CHAINGUN_IDLE_TO_RELOAD        4
  20. #define CHAINGUN_RAISE_TO_IDLE        0
  21. #define CHAINGUN_WINDDOWN_TO_IDLE    0
  22. #define CHAINGUN_RELOAD_TO_IDLE        0
  23.  
  24. object weapon_chaingun : weapon_base {
  25.     entity        world_model;
  26.     float        world_barrel_joint;
  27.     float        barrel_joint;
  28.     float        barrel_angle;
  29.     float        current_rate;
  30.     float        start_rate;
  31.     float        end_rate;
  32.     float        spin_start;
  33.     float        spin_end;
  34.     float        spread;
  35.     
  36.     void        init();
  37.     
  38.     void        UpdateBarrel();
  39.     void        SpinUp();
  40.     void        SpinDown();
  41.     
  42.     void        Lower();
  43.     void        Raise();
  44.     void        Idle();
  45.     void        Fire();
  46.     void        Reload();
  47.     void        ExitCinematic();
  48. };
  49.  
  50. void weapon_chaingun::init() {
  51.     world_model        = getWorldModel();
  52.     world_barrel_joint = world_model.getJointHandle( "toob" );
  53.     barrel_joint    = getJointHandle( "spinner" );
  54.     barrel_angle    = 0;
  55.     current_rate    = 0;
  56.     start_rate        = 0;
  57.     end_rate        = 0;
  58.     spin_start        = 0;
  59.     spin_end        = 0;
  60.     spread            = getFloatKey( "spread" );
  61.  
  62.     weaponState( "Raise", 0 );
  63. }
  64.  
  65. void weapon_chaingun::destroy() {
  66.     stopSound( SND_CHANNEL_BODY3, false );
  67. }
  68.  
  69. void weapon_chaingun::UpdateBarrel() {
  70.     float currentTime;
  71.     float t;
  72.     vector ang;
  73.     
  74.     currentTime = sys.getTime();
  75.     if ( currentTime < spin_end ) {
  76.         t = ( currentTime - spin_start ) / ( spin_end - spin_start );
  77.         current_rate = start_rate + t * ( end_rate - start_rate );
  78.     } else {
  79.         current_rate = end_rate;
  80.     }
  81.     
  82.     if ( current_rate ) {
  83.         barrel_angle = barrel_angle + current_rate * GAME_FRAMETIME;
  84.         
  85.         ang_x = 0;
  86.         ang_y = 0;
  87.         ang_z = barrel_angle;    
  88.         setJointAngle( barrel_joint, JOINTMOD_LOCAL, ang );
  89.  
  90.         ang_y = barrel_angle;
  91.         ang_z = 0;
  92.         world_model.setJointAngle( world_barrel_joint, JOINTMOD_LOCAL, ang );    
  93.     }
  94. }
  95.  
  96. void weapon_chaingun::SpinUp() {
  97.     start_rate = current_rate;
  98.     end_rate = CHAINGUN_BARREL_SPEED;
  99.     spin_start = sys.getTime();
  100.     spin_end = spin_start + ( end_rate - current_rate ) / CHAINGUN_BARREL_ACCEL;
  101.     startSound( "snd_windup", SND_CHANNEL_BODY3, false );
  102. }
  103.  
  104. void weapon_chaingun::SpinDown() {
  105.     start_rate = current_rate;
  106.     end_rate = 0;
  107.     spin_start = sys.getTime();
  108.     spin_end = spin_start + ( current_rate - end_rate ) / CHAINGUN_BARREL_DECCEL;
  109.     startSound( "snd_winddown", SND_CHANNEL_BODY3, false );
  110. }
  111.  
  112. void weapon_chaingun::Raise() {
  113.     weaponRising();
  114.     playAnim( ANIMCHANNEL_ALL, "raise" );
  115.     waitUntil( animDone( ANIMCHANNEL_ALL, CHAINGUN_RAISE_TO_IDLE ) );
  116.     playCycle( ANIMCHANNEL_ALL, "idle" );
  117.     weaponState( "Idle", CHAINGUN_RAISE_TO_IDLE );
  118. }
  119.  
  120. void weapon_chaingun::Lower() {
  121.     weaponLowering();
  122.     playAnim( ANIMCHANNEL_ALL, "putaway" );
  123.     
  124.     while( !animDone( ANIMCHANNEL_ALL, 0 ) ) {
  125.         UpdateBarrel();
  126.         waitFrame();
  127.     }
  128.     
  129.     weaponHolstered();
  130.     waitUntil( WEAPON_RAISEWEAPON );
  131.     weaponState( "Raise", 0 );
  132. }
  133.  
  134. void weapon_chaingun::Idle() {
  135.     float ammoClip;
  136.     float avail;
  137.     float clip_size;
  138.     
  139.     clip_size = clipSize();    
  140.     
  141.     if ( !ammoInClip() ) {
  142.         weaponOutOfAmmo();
  143.     } else {
  144.         weaponReady();
  145.     }
  146.  
  147.     while( 1 ) {
  148.         if ( WEAPON_LOWERWEAPON ) {
  149.             weaponState( "Lower", CHAINGUN_IDLE_TO_LOWER );
  150.         }
  151.         ammoClip = ammoInClip();
  152.         if ( WEAPON_ATTACK ) {
  153.             if ( ammoClip > 0 ) {
  154.                 weaponState( "Fire", CHAINGUN_IDLE_TO_FIRE );
  155.             } else if ( ammoAvailable() > 0 ) {
  156.                 if ( autoReload() ) {
  157.                     netReload();
  158.                     weaponState( "Reload", CHAINGUN_IDLE_TO_RELOAD );
  159.                 }
  160.             }
  161.         }
  162.         if ( WEAPON_RELOAD && ( ammoAvailable() > ammoClip ) && ( ammoClip < clip_size ) ) {
  163.             netReload();
  164.             weaponState( "Reload", CHAINGUN_IDLE_TO_RELOAD );
  165.         }
  166.         if ( WEAPON_NETRELOAD ) {
  167.             WEAPON_NETRELOAD = false;
  168.             weaponState( "Reload", CHAINGUN_IDLE_TO_RELOAD );
  169.         }
  170.         UpdateBarrel();
  171.         waitFrame();
  172.     }
  173. }
  174.  
  175. void weapon_chaingun::Fire() {
  176.     float ammoClip;
  177.     float currentTime;
  178.     float skip;
  179.     SpinUp();
  180.     ammoClip = ammoInClip();
  181.     while( ( current_rate < end_rate ) && WEAPON_ATTACK && !WEAPON_RELOAD && ( ammoClip > 0 ) ) {
  182.         UpdateBarrel();
  183.         waitFrame();
  184.         ammoClip = ammoInClip();
  185.     }
  186.         
  187.     startSound( "snd_spin", SND_CHANNEL_BODY3, false );
  188.     ammoClip = ammoInClip();
  189.     while( WEAPON_ATTACK && !WEAPON_RELOAD && ( ammoClip > 0 ) ) {
  190.         launchProjectiles( CHAINGUN_NUMPROJECTILES, spread, 0, 1.0, 1.0 );
  191.         startSound( "snd_fire", SND_CHANNEL_WEAPON, false );
  192.         ammoClip = ammoInClip();
  193.         if ( ammoClip == CHAINGUN_LOWAMMO ) {
  194.             startSound( "snd_lowammo", SND_CHANNEL_ITEM, false );
  195.         }
  196.  
  197.         // skip frames
  198.         for( skip = 0; skip < CHAINGUN_FIRE_SKIPFRAMES; skip++ ) {
  199.             UpdateBarrel();
  200.             waitFrame();
  201.         }
  202.     }
  203.  
  204.     SpinDown();
  205.     weaponState( "Idle", CHAINGUN_WINDDOWN_TO_IDLE );
  206. }
  207.  
  208. void weapon_chaingun::Reload() {
  209.     weaponReloading();
  210.     playAnim( ANIMCHANNEL_ALL, "reload" );
  211.     while( !animDone( ANIMCHANNEL_ALL, CHAINGUN_RELOAD_TO_IDLE ) ) {
  212.         UpdateBarrel();
  213.         waitFrame();
  214.     }
  215.     addToClip( clipSize() );
  216.     playCycle( ANIMCHANNEL_ALL, "idle" );
  217.     weaponState( "Idle", CHAINGUN_RELOAD_TO_IDLE );
  218. }
  219.  
  220. void weapon_chaingun::ExitCinematic() {
  221.     current_rate    = 0;
  222.     start_rate        = 0;
  223.     end_rate        = 0;
  224.     spin_start        = 0;
  225.     spin_end        = 0;
  226.  
  227.     weaponState( "Idle", 0 );
  228. }
  229.