mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2025-03-16 15:41:16 +00:00
102 lines
2.4 KiB
Text
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 );
|
|
}
|