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

102 lines
2.4 KiB
Text

/***********************************************************************
weapon_chainsaw.script
***********************************************************************/
#define CHAINSAW_FIRERATE 0.1
// blend times
#define CHAINSAW_IDLE_TO_LOWER 4
#define CHAINSAW_IDLE_TO_FIRE 4
#define CHAINSAW_RAISE_TO_IDLE 4
#define CHAINSAW_FIRE_TO_IDLE 4
object weapon_chainsaw : weapon_base {
float next_attack;
void init();
void Lower();
void Raise();
void Idle();
void Fire();
void ExitCinematic();
};
void weapon_chainsaw::init() {
next_attack = 0;
weaponState( "Raise", 0 );
}
void weapon_chainsaw::destroy() {
stopSound( SND_CHANNEL_WEAPON, false );
startSound( "snd_putaway", SND_CHANNEL_ITEM, false );
}
void weapon_chainsaw::Raise() {
weaponRising();
playAnim( ANIMCHANNEL_ALL, "raise" );
waitUntil( animDone( ANIMCHANNEL_ALL, CHAINSAW_RAISE_TO_IDLE ) );
weaponState( "Idle", CHAINSAW_RAISE_TO_IDLE );
}
void weapon_chainsaw::Lower() {
weaponLowering();
playAnim( ANIMCHANNEL_ALL, "putaway" );
waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
weaponHolstered();
waitUntil( WEAPON_RAISEWEAPON );
weaponState( "Raise", 0 );
}
void weapon_chainsaw::Idle() {
float currentTime;
float ammoClip;
float avail;
float clip_size;
clip_size = clipSize();
weaponReady();
playCycle( ANIMCHANNEL_ALL, "idle" );
while( 1 ) {
if ( WEAPON_LOWERWEAPON ) {
weaponState( "Lower", CHAINSAW_IDLE_TO_LOWER );
}
currentTime = sys.getTime();
if ( ( currentTime >= next_attack ) && WEAPON_ATTACK ) {
weaponState( "Fire", CHAINSAW_IDLE_TO_FIRE );
}
waitFrame();
}
}
void weapon_chainsaw::Fire() {
float currentTime;
playAnim( ANIMCHANNEL_ALL, "melee_start" );
melee();
startSound( "snd_startattack", SND_CHANNEL_WEAPON, false );
waitUntil( animDone( ANIMCHANNEL_ALL, 3 ) );
startSound( "snd_attack", SND_CHANNEL_WEAPON, false );
waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
playCycle( ANIMCHANNEL_ALL, "melee_loop" );
next_attack = sys.getTime();
while ( WEAPON_ATTACK ) {
currentTime = sys.getTime();
if ( currentTime >= next_attack ) {
melee();
next_attack = currentTime + CHAINSAW_FIRERATE;
}
waitFrame();
}
startSound( "snd_stopattack", SND_CHANNEL_WEAPON, false );
playAnim( ANIMCHANNEL_ALL, "melee_end" );
waitUntil( animDone( ANIMCHANNEL_ALL, 0 ) );
weaponState( "Idle", CHAINSAW_FIRE_TO_IDLE );
}
void weapon_chainsaw::ExitCinematic() {
next_attack = 0;
weaponState( "Idle", 0 );
}