Files
2026-05-23 20:50:12 -07:00

253 lines
4.4 KiB
C++

// Weapon_flashlight.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
// blend times
#define FLASHLIGHT_IDLE_TO_LOWER 4
#define FLASHLIGHT_IDLE_TO_FIRE 2
#define FLASHLIGHT_IDLE_TO_RELOAD 4
#define FLASHLIGHT_RAISE_TO_IDLE 4
#define FLASHLIGHT_FIRE_TO_IDLE 4
#define FLASHLIGHT_RELOAD_TO_IDLE 4
#define FLASHLIGHT_MIN_SKIN_INTENSITY 0.2
/*
================
rvmWeaponFlashlight::Init
================
*/
void rvmWeaponFlashlight::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
skin_on = owner->GetKey( "skin_on" );
skin_on_invis = owner->GetKey( "skin_on_invis" );
skin_off = owner->GetKey( "skin_off" );
skin_off_invis = owner->GetKey( "skin_off_invis" );
intensity = 1.0;
owner->Event_SetLightParm( 3, 1.0 );
owner->Event_SetShaderParm( 3, 1.0 );
on = true;
UpdateSkin();
}
/*
================
rvmWeaponFlashlight::UpdateLightIntensity
================
*/
void rvmWeaponFlashlight::UpdateLightIntensity( void )
{
// TODO this has to interact with scripts somehow
}
/*
================
rvmWeaponFlashlight::UpdateSkin
================
*/
void rvmWeaponFlashlight::UpdateSkin( void )
{
if( on && ( intensity > FLASHLIGHT_MIN_SKIN_INTENSITY ) )
{
if( !owner->Event_IsInvisible() )
{
owner->Event_SetSkin( skin_on );
}
else
{
owner->Event_SetSkin( skin_on_invis );
}
}
else
{
if( !owner->Event_IsInvisible() )
{
owner->Event_SetSkin( skin_off );
}
else
{
owner->Event_SetSkin( skin_off_invis );
}
}
}
/*
================
rvmWeaponFlashlight::Raise
================
*/
stateResult_t rvmWeaponFlashlight::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, FLASHLIGHT_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
================
rvmWeaponFlashlight::Lower
================
*/
stateResult_t rvmWeaponFlashlight::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;
}
/*
================
rvmWeaponFlashlight::Idle
================
*/
stateResult_t rvmWeaponFlashlight::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;
}
/*
================
rvmWeaponFlashlight::Fire
================
*/
stateResult_t rvmWeaponFlashlight::Fire( stateParms_t* parms )
{
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_MELEE,
FIRE_WAIT
};
switch( parms->stage )
{
case FIRE_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_MELEE;
parms->Wait( 0.1f );
return SRESULT_WAIT;
case FIRE_MELEE:
owner->Event_Melee();
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, FLASHLIGHT_FIRE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_DONE;
}
/*
================
rvmWeaponFlashlight::Reload
================
*/
stateResult_t rvmWeaponFlashlight::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_TOGGLEFLASHLIGHT,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_TOGGLEFLASHLIGHT;
parms->Wait( 0.2f );
return SRESULT_WAIT;
case RELOAD_TOGGLEFLASHLIGHT:
on = !on;
UpdateSkin();
owner->Event_Flashlight( on );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, FLASHLIGHT_RELOAD_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}