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

223 lines
3.7 KiB
C++

// Weapon_chainsaw.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
#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
/*
===============
rvmWeaponChainsaw::Init
===============
*/
void rvmWeaponChainsaw::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
}
/*
===============
rvmWeaponChainsaw::Raise
===============
*/
stateResult_t rvmWeaponChainsaw::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, CHAINSAW_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponChainsaw::Lower
===============
*/
stateResult_t rvmWeaponChainsaw::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;
}
/*
===============
rvmWeaponChainsaw::Idle
===============
*/
stateResult_t rvmWeaponChainsaw::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;
}
/*
===============
rvmWeaponChainsaw::Reload
===============
*/
stateResult_t rvmWeaponChainsaw::Reload( stateParms_t* parms )
{
return SRESULT_DONE;
}
/*
===============
rvmWeaponChainsaw::Fire
===============
*/
stateResult_t rvmWeaponChainsaw::Fire( stateParms_t* parms )
{
float currentTime;
if( parms->stage == 0 )
{
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "melee_start", false );
owner->Event_Melee();
owner->Event_StartSound( "snd_startattack", SND_CHANNEL_WEAPON, false );
parms->stage = 1;
return SRESULT_WAIT;
}
if( parms->stage == 1 )
{
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 3 ) )
{
parms->stage = 2;
return SRESULT_WAIT;
}
return SRESULT_WAIT;
}
if( parms->stage == 2 )
{
owner->Event_StartSound( "snd_attack", SND_CHANNEL_WEAPON, false );
parms->stage = 3;
return SRESULT_WAIT;
}
if( parms->stage == 3 )
{
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
parms->stage = 4;
return SRESULT_WAIT;
}
return SRESULT_WAIT;
}
if( parms->stage == 4 )
{
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "melee_loop" );
next_attack = gameLocal.SysScriptTime();
parms->stage = 5;
return SRESULT_WAIT;
}
if( parms->stage == 5 )
{
if( owner->IsFiring() )
{
currentTime = gameLocal.SysScriptTime();
if( currentTime >= next_attack )
{
owner->Event_Melee();
next_attack = currentTime + CHAINSAW_FIRERATE;
}
return SRESULT_WAIT;
}
else
{
parms->stage = 6;
return SRESULT_WAIT;
}
}
if( parms->stage == 6 )
{
owner->Event_StartSound( "snd_stopattack", SND_CHANNEL_WEAPON, false );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "melee_end", false );
parms->stage = 7;
return SRESULT_WAIT;
}
if( !owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
return SRESULT_WAIT;
}
return SRESULT_DONE;
}