0
0
Fork 0
mirror of https://github.com/id-Software/DOOM-3-BFG.git synced 2025-03-15 23:21:35 +00:00
doom3-bfg/base/script/weapon_flashlight.script
2022-08-27 13:19:00 +02:00

189 lines
3.9 KiB
Text

/***********************************************************************
weapon_flashlight.script
***********************************************************************/
// 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
// for dimming flashlight during plasma discharges in alphalabs2
float global_flashlight_intensity = 1.0;
object weapon_flashlight : weapon_base {
boolean on;
boolean onBeforeCinematic;
float intensity;
string skin_on;
string skin_on_invis;
string skin_off;
string skin_off_invis;
void init();
void Lower();
void Raise();
void Idle();
void Fire();
void SetLight( boolean lightOn );
void ToggleOnOff();
void TurnOn();
void TurnOff();
void EnterCinematic();
void ExitCinematic();
void updateLightIntensity();
// called by the game
void UpdateSkin();
};
void weapon_flashlight::init() {
skin_on = getKey( "skin_on" );
skin_on_invis = getKey( "skin_on_invis" );
skin_off = getKey( "skin_off" );
skin_off_invis = getKey( "skin_off_invis" );
global_flashlight_intensity = 1.0;
intensity = 1.0;
setLightParm( 3, 1.0 );
setShaderParm( 3, 1.0 );
weaponState( "Raise", 0 );
}
void weapon_flashlight::updateLightIntensity() {
if ( global_flashlight_intensity != intensity ) {
intensity = global_flashlight_intensity;
setLightParm( 3, intensity );
setShaderParm( 3, intensity );
UpdateSkin();
}
}
void weapon_flashlight::Raise() {
weaponRising();
playAnim( ANIMCHANNEL_ALL, "raise" );
SetLight( !getIntKey( "start_off" ) );
while( !animDone( ANIMCHANNEL_ALL, FLASHLIGHT_RAISE_TO_IDLE ) ) {
updateLightIntensity();
waitFrame();
}
weaponState( "Idle", FLASHLIGHT_RAISE_TO_IDLE );
}
void weapon_flashlight::Lower() {
weaponLowering();
playAnim( ANIMCHANNEL_ALL, "putaway" );
waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
weaponHolstered();
while( !WEAPON_RAISEWEAPON ) {
updateLightIntensity();
waitFrame();
}
weaponState( "Raise", 0 );
}
void weapon_flashlight::Idle() {
weaponReady();
playCycle( ANIMCHANNEL_ALL, "idle" );
while( 1 ) {
updateLightIntensity();
if ( WEAPON_LOWERWEAPON ) {
weaponState( "Lower", FLASHLIGHT_IDLE_TO_LOWER );
}
if ( WEAPON_ATTACK ) {
weaponState( "Fire", FLASHLIGHT_IDLE_TO_FIRE );
}
if ( WEAPON_RELOAD ) {
if ( sys.isMultiplayer() ) {
weaponState( "ToggleOnOff", FLASHLIGHT_IDLE_TO_RELOAD );
}
}
waitFrame();
}
}
void weapon_flashlight::Fire() {
float waitTime;
playAnim( ANIMCHANNEL_ALL, "fire" );
waitTime = sys.getTime() + 0.1;
while( sys.getTime() < waitTime ) {
updateLightIntensity();
waitFrame();
}
melee();
while( !animDone( ANIMCHANNEL_ALL, FLASHLIGHT_FIRE_TO_IDLE ) ) {
updateLightIntensity();
waitFrame();
}
weaponState( "Idle", FLASHLIGHT_FIRE_TO_IDLE );
}
void weapon_flashlight::SetLight( boolean lightOn ) {
on = lightOn;
UpdateSkin();
flashlight( on );
}
void weapon_flashlight::ToggleOnOff() {
float waitTime;
playAnim( ANIMCHANNEL_ALL, "reload" );
updateLightIntensity();
SetLight( !on );
while( !animDone( ANIMCHANNEL_ALL, FLASHLIGHT_RELOAD_TO_IDLE ) ) {
updateLightIntensity();
waitFrame();
}
//weaponState( "Idle", FLASHLIGHT_RELOAD_TO_IDLE );
}
void weapon_flashlight::TurnOn() {
SetLight( true );
}
void weapon_flashlight::TurnOff() {
SetLight( false );
}
void weapon_flashlight::EnterCinematic() {
onBeforeCinematic = on;
SetLight( false );
weaponState( "Idle", 0 );
}
void weapon_flashlight::ExitCinematic() {
SetLight( onBeforeCinematic );
intensity = 1.0;
updateLightIntensity();
weaponState( "Idle", 0 );
}
void weapon_flashlight::UpdateSkin() {
if ( on && ( global_flashlight_intensity > 0 ) ) {
if ( !isInvisible() ) {
setSkin( skin_on );
} else {
setSkin( skin_on_invis );
}
} else {
if ( !isInvisible() ) {
setSkin( skin_off );
} else {
setSkin( skin_off_invis );
}
}
}