// Weapon_plasmagun.cpp // #pragma hdrstop #include "precompiled.h" #include "../Game_local.h" CLASS_DECLARATION( rvmWeaponObject, rvmWeaponPlasmaGun ) END_CLASS #define PLASMAGUN_FIRERATE 0.125 //changed by Tim #define PLASMAGUN_LOWAMMO 10 #define PLASMAGUN_NUMPROJECTILES 1 // blend times #define PLASMAGUN_IDLE_TO_LOWER 4 #define PLASMAGUN_IDLE_TO_FIRE 1 #define PLASMAGUN_IDLE_TO_RELOAD 4 #define PLASMAGUN_RAISE_TO_IDLE 4 #define PLASMAGUN_FIRE_TO_IDLE 4 #define PLASMAGUN_RELOAD_TO_IDLE 4 /* =============== rvmWeaponPlasmaGun::Init =============== */ void rvmWeaponPlasmaGun::Init( idWeapon* weapon ) { rvmWeaponObject::Init( weapon ); next_attack = 0; spread = weapon->GetFloat( "spread" ); snd_lowammo = FindSound( "snd_lowammo" ); } /* =============== rvmWeaponPlasmaGun::Raise =============== */ stateResult_t rvmWeaponPlasmaGun::Raise( stateParms_t* parms ) { enum RisingState { RISING_NOTSET = 0, RISING_WAIT }; switch( parms->stage ) { case RISING_NOTSET: owner->Event_PlayAnim( ANIMCHANNEL_ALL, "raise", false ); parms->stage = RISING_WAIT; return SRESULT_WAIT; case RISING_WAIT: if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PLASMAGUN_RAISE_TO_IDLE ) ) { return SRESULT_DONE; } return SRESULT_WAIT; } return SRESULT_ERROR; } /* =============== rvmWeaponPlasmaGun::Lower =============== */ stateResult_t rvmWeaponPlasmaGun::Lower( stateParms_t* parms ) { enum LoweringState { LOWERING_NOTSET = 0, LOWERING_WAIT }; switch( parms->stage ) { case LOWERING_NOTSET: owner->Event_PlayAnim( ANIMCHANNEL_ALL, "putaway", false ); parms->stage = LOWERING_WAIT; return SRESULT_WAIT; case LOWERING_WAIT: if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) ) { SetState( "Holstered" ); return SRESULT_DONE; } return SRESULT_WAIT; } return SRESULT_ERROR; } /* =============== rvmWeaponPlasmaGun::Idle =============== */ stateResult_t rvmWeaponPlasmaGun::Idle( stateParms_t* parms ) { enum IdleState { IDLE_NOTSET = 0, IDLE_WAIT }; switch( parms->stage ) { case IDLE_NOTSET: owner->Event_WeaponReady(); owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle" ); parms->stage = IDLE_WAIT; return SRESULT_WAIT; case IDLE_WAIT: // Do nothing. return SRESULT_DONE; } return SRESULT_ERROR; } /* =============== rvmWeaponPlasmaGun::Fire =============== */ stateResult_t rvmWeaponPlasmaGun::Fire( stateParms_t* parms ) { int ammoClip = owner->AmmoInClip(); enum FIRE_State { FIRE_NOTSET = 0, FIRE_WAIT }; if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 ) { //owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD ); owner->Reload(); return SRESULT_DONE; } switch( parms->stage ) { case FIRE_NOTSET: next_attack = gameLocal.time + SEC2MS( PLASMAGUN_FIRERATE ); owner->Event_LaunchProjectiles( PLASMAGUN_NUMPROJECTILES, spread, 0, 1, 1 ); owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false ); parms->stage = FIRE_WAIT; return SRESULT_WAIT; case FIRE_WAIT: if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PLASMAGUN_FIRE_TO_IDLE ) ) { return SRESULT_DONE; } return SRESULT_WAIT; } return SRESULT_ERROR; } /* =============== rvmWeaponPlasmaGun::Reload =============== */ stateResult_t rvmWeaponPlasmaGun::Reload( stateParms_t* parms ) { enum RELOAD_State { RELOAD_NOTSET = 0, RELOAD_WAIT }; switch( parms->stage ) { case RELOAD_NOTSET: owner->Event_WeaponReloading(); owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false ); parms->stage = RELOAD_WAIT; return SRESULT_WAIT; case RELOAD_WAIT: if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PLASMAGUN_RELOAD_TO_IDLE ) ) { owner->Event_AddToClip( owner->ClipSize() ); return SRESULT_DONE; } return SRESULT_WAIT; } return SRESULT_ERROR; }