@@ -0,0 +1,327 @@
#include "../../idlib/precompiled.h"
#pragma hdrstop

#include "../Game_local.h"
#include "../Weapon.h"

class rvWeaponFlashLight : public rvWeapon {
public:

CLASS_PROTOTYPE( rvWeaponFlashLight );

rvWeaponFlashLight ( void );

virtual void Spawn ( void );
virtual void Think ( void );
void Save ( idSaveGame *savefile ) const;
void Restore ( idRestoreGame *savefile );
void PreSave ( void );
void PostSave ( void );

protected:

float spreadZoom;
bool fireHeld;

bool UpdateFlashlight ( void );
void Flashlight ( bool on );

private:

stateResult_t State_Idle ( const stateParms_t& parms );
stateResult_t State_Fire ( const stateParms_t& parms );
stateResult_t State_Reload ( const stateParms_t& parms );
stateResult_t State_Flashlight ( const stateParms_t& parms );

CLASS_STATES_PROTOTYPE ( rvWeaponFlashLight );
};

CLASS_DECLARATION( rvWeapon, rvWeaponFlashLight )
END_CLASS

/*
================
rvWeaponFlashLight::rvWeaponFlashLight
================
*/
rvWeaponFlashLight::rvWeaponFlashLight ( void ) {
}

/*
================
rvWeaponFlashLight::Spawn
================
*/
void rvWeaponFlashLight::Spawn ( void ) {
spreadZoom = spawnArgs.GetFloat ( "spreadZoom" );
fireHeld = false;

SetState ( "Raise", 0 );

Flashlight ( owner->IsFlashlightOn() );
}

/*
================
rvWeaponFlashLight::Save
================
*/
void rvWeaponFlashLight::Save ( idSaveGame *savefile ) const {
savefile->WriteFloat ( spreadZoom );
savefile->WriteBool ( fireHeld );
}

/*
================
rvWeaponFlashLight::Restore
================
*/
void rvWeaponFlashLight::Restore ( idRestoreGame *savefile ) {
savefile->ReadFloat ( spreadZoom );
savefile->ReadBool ( fireHeld );
}

/*
================
rvWeaponFlashLight::PreSave
================
*/
void rvWeaponFlashLight::PreSave ( void ) {
}

/*
================
rvWeaponFlashLight::PostSave
================
*/
void rvWeaponFlashLight::PostSave ( void ) {
}


/*
================
rvWeaponFlashLight::Think
================
*/
void rvWeaponFlashLight::Think()
{
rvWeapon::Think();
if ( zoomGui && owner == gameLocal.GetLocalPlayer( ) ) {
zoomGui->SetStateFloat( "playerYaw", playerViewAxis.ToAngles().yaw );
}
}

/*
================
rvWeaponFlashLight::UpdateFlashlight
================
*/
bool rvWeaponFlashLight::UpdateFlashlight ( void ) {
if ( !wsfl.flashlight ) {
return false;
}

SetState ( "Flashlight", 0 );
return true;
}

/*
================
rvWeaponFlashLight::Flashlight
================
*/
void rvWeaponFlashLight::Flashlight ( bool on ) {
owner->Flashlight ( on );

if ( on ) {
viewModel->ShowSurface ( "models/weapons/blaster/flare" );
worldModel->ShowSurface ( "models/weapons/blaster/flare" );
} else {
viewModel->HideSurface ( "models/weapons/blaster/flare" );
worldModel->HideSurface ( "models/weapons/blaster/flare" );
}
}

/*
===============================================================================
States
===============================================================================
*/

CLASS_STATES_DECLARATION ( rvWeaponFlashLight )
STATE ( "Idle", rvWeaponFlashLight::State_Idle)
STATE ( "Fire", rvWeaponFlashLight::State_Fire )
STATE ( "Reload", rvWeaponFlashLight::State_Reload )
STATE ( "Flashlight", rvWeaponFlashLight::State_Flashlight )
END_CLASS_STATES

/*
================
rvWeaponFlashLight::State_Idle
================
*/
stateResult_t rvWeaponFlashLight::State_Idle( const stateParms_t& parms ) {
enum {
STAGE_INIT,
STAGE_WAIT,
};
switch ( parms.stage ) {
case STAGE_INIT:
if ( !AmmoAvailable ( ) ) {
SetStatus ( WP_OUTOFAMMO );
} else {
SetStatus ( WP_READY );
}

PlayCycle( ANIMCHANNEL_ALL, "idle", parms.blendFrames );
return SRESULT_STAGE ( STAGE_WAIT );

case STAGE_WAIT:
if ( wsfl.lowerWeapon ) {
SetState ( "Lower", 4 );
return SRESULT_DONE;
}
if ( UpdateFlashlight ( ) ) {
return SRESULT_DONE;
}

if ( fireHeld && !wsfl.attack ) {
fireHeld = false;
}
if ( !clipSize ) {
if ( !fireHeld && gameLocal.time > nextAttackTime && wsfl.attack && AmmoAvailable ( ) ) {
SetState ( "Fire", 0 );
return SRESULT_DONE;
}
} else {
if ( !fireHeld && gameLocal.time > nextAttackTime && wsfl.attack && AmmoInClip ( ) ) {
SetState ( "Fire", 0 );
return SRESULT_DONE;
}
if ( wsfl.attack && AutoReload() && !AmmoInClip ( ) && AmmoAvailable () ) {
SetState ( "Reload", 4 );
return SRESULT_DONE;
}
if ( wsfl.netReload || (wsfl.reload && AmmoInClip() < ClipSize() && AmmoAvailable()>AmmoInClip()) ) {
SetState ( "Reload", 4 );
return SRESULT_DONE;
}
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}

/*
================
rvWeaponFlashLight::State_Fire
================
*/
stateResult_t rvWeaponFlashLight::State_Fire ( const stateParms_t& parms ) {
enum {
STAGE_INIT,
STAGE_WAIT,
};
switch ( parms.stage ) {
case STAGE_INIT:
if ( wsfl.zoom ) {
nextAttackTime = gameLocal.time + (altFireRate * owner->PowerUpModifier ( PMOD_FIRERATE ));
Attack ( true, 1, spreadZoom, 0, 1.0f );
fireHeld = true;
} else {
nextAttackTime = gameLocal.time + (fireRate * owner->PowerUpModifier ( PMOD_FIRERATE ));
Attack ( false, 1, spread, 0, 1.0f );
}
PlayAnim ( ANIMCHANNEL_ALL, "fire", 0 );
return SRESULT_STAGE ( STAGE_WAIT );

case STAGE_WAIT:
if ( !fireHeld && wsfl.attack && gameLocal.time >= nextAttackTime && AmmoInClip() && !wsfl.lowerWeapon ) {
SetState ( "Fire", 0 );
return SRESULT_DONE;
}
if ( AnimDone ( ANIMCHANNEL_ALL, 0 ) ) {
SetState ( "Idle", 0 );
return SRESULT_DONE;
}
if ( UpdateFlashlight ( ) ) {
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}

/*
================
rvWeaponFlashLight::State_Reload
================
*/
stateResult_t rvWeaponFlashLight::State_Reload ( const stateParms_t& parms ) {
enum {
STAGE_INIT,
STAGE_WAIT,
};
switch ( parms.stage ) {
case STAGE_INIT:
if ( wsfl.netReload ) {
wsfl.netReload = false;
} else {
NetReload ( );
}

SetStatus ( WP_RELOAD );
PlayAnim ( ANIMCHANNEL_ALL, "reload", parms.blendFrames );
return SRESULT_STAGE ( STAGE_WAIT );

case STAGE_WAIT:
if ( AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
AddToClip ( ClipSize() );
SetState ( "Idle", 4 );
return SRESULT_DONE;
}
if ( wsfl.lowerWeapon ) {
SetState ( "Lower", 4 );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}


/*
================
rvWeaponFlashLight::State_Flashlight
================
*/
stateResult_t rvWeaponFlashLight::State_Flashlight ( const stateParms_t& parms ) {
enum {
FLASHLIGHT_INIT,
FLASHLIGHT_WAIT,
};
switch ( parms.stage ) {
case FLASHLIGHT_INIT:
SetStatus ( WP_FLASHLIGHT );
// Wait for the flashlight anim to play
PlayAnim( ANIMCHANNEL_ALL, "flashlight", 0 );
return SRESULT_STAGE ( FLASHLIGHT_WAIT );

case FLASHLIGHT_WAIT:
if ( !AnimDone ( ANIMCHANNEL_ALL, 4 ) ) {
return SRESULT_WAIT;
}

if ( owner->IsFlashlightOn() ) {
Flashlight ( false );
} else {
Flashlight ( true );
}

SetState ( "Idle", 4 );
return SRESULT_DONE;
}
return SRESULT_ERROR;
}
BIN +5.81 MB (110%) q4sdk.sdf
Binary file not shown.
BIN +28 KB (350%) q4sdk.suo
Binary file not shown.