Switched Doom 3 weapons to native.

This commit is contained in:
Justin Marshall
2026-05-19 08:28:43 -07:00
parent b841fcb33b
commit b97127f038
82 changed files with 20023 additions and 1371 deletions
+355
View File
@@ -0,0 +1,355 @@
// Weapon_BFG.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponBFG )
END_CLASS
#define BFG_MINRELEASETIME 0.05
#define BFG_FUSE 2.0
#define BFG_SHORTFUSE 0.5
#define BFG_MAXPOWER 4.0
#define BFG_FIRERATE 4
#define BFG_FIREDELAY 4
#define BFG_NUMPROJECTILES 1
// blend times
#define BFG_IDLE_TO_LOWER 4
#define BFG_IDLE_TO_FIRE 4
#define BFG_IDLE_TO_RELOAD 4
#define BFG_RAISE_TO_IDLE 4
#define BFG_FIRE_TO_IDLE 4
#define BFG_RELOAD_TO_IDLE 4
/*
===============
rvmWeaponBFG::Init
===============
*/
void rvmWeaponBFG::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
fuse_start = 0;
fuse_end = 0;
powerLevel = 0;
fire_time = 0;
spread = weapon->GetFloat( "spread" );
owner->Event_SetGuiFloat( "powerlevel", 0 );
owner->Event_SetGuiFloat( "overcharge", 0 );
}
/*
===============
rvmWeaponBFG::Raise
===============
*/
stateResult_t rvmWeaponBFG::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, BFG_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponBFG::Lower
===============
*/
stateResult_t rvmWeaponBFG::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;
}
/*
===============
rvmWeaponBFG::Idle
===============
*/
stateResult_t rvmWeaponBFG::Idle( stateParms_t* parms )
{
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
if( !owner->AmmoInClip() )
{
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle_empty" );
owner->Event_WeaponOutOfAmmo();
}
else
{
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle" );
owner->Event_WeaponReady();
}
parms->stage = IDLE_WAIT;
return SRESULT_WAIT;
case IDLE_WAIT:
// Do nothing.
return SRESULT_DONE;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponBFG::Fire
===============
*/
stateResult_t rvmWeaponBFG::Fire( stateParms_t* parms )
{
float time_held;
float power = 0.0f;
float intensity;
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_FUSING,
FIRE_SHORTFUSE,
FIRE_SHORTFUSEWAIT,
FIRE_FIRE,
FIRE_FIRE_ANIMWAIT,
FIRE_FIRE_COOLDOWN,
FIRE_DONE
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire_begin", false );
fuse_start = gameLocal.time;
fuse_end = gameLocal.time + SEC2MS( BFG_FUSE );
parms->stage = FIRE_FUSING;
return SRESULT_WAIT;
case FIRE_FUSING:
if( !owner->IsFiring() )
{
parms->stage = FIRE_FIRE;
}
else if( gameLocal.time > gameLocal.time + SEC2MS( BFG_MINRELEASETIME ) && !owner->IsFiring() )
{
parms->stage = FIRE_SHORTFUSE;
}
else if( gameLocal.time >= fuse_end )
{
parms->stage = FIRE_SHORTFUSE;
}
else
{
powerLevel = ( gameLocal.time - fuse_start ) / BFG_FUSE;
owner->Event_SetColor( powerLevel, powerLevel, powerLevel );
owner->Event_SetGuiFloat( "powerlevel", powerLevel );
}
return SRESULT_WAIT;
case FIRE_SHORTFUSE:
if( owner->IsFiring() )
{
fuse_end = gameLocal.time + SEC2MS( BFG_SHORTFUSE );
parms->stage = FIRE_SHORTFUSEWAIT;
}
else
{
parms->stage = FIRE_FIRE;
}
return SRESULT_WAIT;
case FIRE_SHORTFUSEWAIT:
if( !owner->IsFiring() || gameLocal.time >= fuse_end )
{
powerLevel = ( gameLocal.time - fuse_start ) / BFG_FUSE;
owner->Event_SetGuiFloat( "powerlevel", powerLevel );
parms->stage = FIRE_FIRE;
}
return SRESULT_WAIT;
case FIRE_FIRE:
if( gameLocal.time >= fuse_end )
{
OverCharge();
parms->stage = FIRE_DONE;
}
else
{
time_held = gameLocal.time - fuse_start;
if( power > BFG_MAXPOWER )
{
power = BFG_MAXPOWER;
}
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
fire_time = gameLocal.time;
owner->Event_LaunchProjectiles( BFG_NUMPROJECTILES, spread, 0, 1, 1 );
parms->stage = FIRE_FIRE_ANIMWAIT;
}
return SRESULT_WAIT;
case FIRE_FIRE_ANIMWAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, BFG_FIRE_TO_IDLE ) )
{
parms->stage = FIRE_FIRE_COOLDOWN;
}
else
{
intensity = 1 - ( ( gameLocal.time - fire_time ) / 0.5 );
if( intensity < 0 )
{
intensity = 0;
}
owner->Event_SetColor( intensity, intensity, intensity );
}
return SRESULT_WAIT;
case FIRE_FIRE_COOLDOWN:
if( powerLevel <= 0 )
{
parms->stage = FIRE_DONE;
}
else
{
powerLevel -= SEC2MS( 0.05 ); // TODO: DELTA TIME THIS!!
owner->Event_SetGuiFloat( "powerlevel", powerLevel );
}
return SRESULT_WAIT;
case FIRE_DONE:
owner->Event_SetGuiFloat( "powerlevel", 0 );
return SRESULT_DONE;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponBFG::OverCharge
===============
*/
void rvmWeaponBFG::OverCharge()
{
idStr entname;
idEntity* explosion;
idVec3 forward;
idAngles angles;
idPlayer* player;
player = owner->GetOwner();
owner->Event_AllowDrop( false );
owner->Event_UseAmmo( owner->ClipSize() );
angles = player->viewAngles;
forward = angles.ToForward();
entname = owner->GetKey( "def_overcharge" );
//explosion = sys.spawn(entname);
{
idDict spawnArgs;
spawnArgs.Set( "classname", entname );
gameLocal.SpawnEntityDef( spawnArgs, &explosion );
}
explosion->Event_SetOrigin( owner->GetOrigin() + forward * 16 );
explosion->Event_SetShaderParm( /*SHADERPARM_TIMEOFFSET*/4, -gameLocal.time );
gameLocal.DelayRemoveEntity( explosion, 2 );
owner->Event_StartSound( "snd_explode", SND_CHANNEL_ANY, false );
gameLocal.RadiusDamage( owner->GetOrigin(), owner, owner->GetOwner(), nullptr, nullptr, "damage_bfg_overcharge", 1.0 );
}
/*
===============
rvmWeaponBFG::Reload
===============
*/
stateResult_t rvmWeaponBFG::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
+27
View File
@@ -0,0 +1,27 @@
// Weapon_bfg.h
//
#pragma once
class rvmWeaponBFG : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponBFG );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void OverCharge();
float spread;
float fuse_start;
float fuse_end;
float powerLevel;
float fire_time;
};
+324
View File
@@ -0,0 +1,324 @@
// Weapon_chaingun.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponChainGun )
END_CLASS
#define CHAINGUN_FIRE_SKIPFRAMES 7 // 6 shots per second
#define CHAINGUN_LOWAMMO 10
#define CHAINGUN_NUMPROJECTILES 1
#define CHAINGUN_BARREL_SPEED ( 60 * ( USERCMD_HZ / CHAINGUN_FIRE_SKIPFRAMES ) )
#define CHAINGUN_BARREL_ACCEL_TIME 0.4
#define CHAINGUN_BARREL_DECCEL_TIME 1.0
#define CHAINGUN_BARREL_ACCEL ( CHAINGUN_BARREL_SPEED / CHAINGUN_BARREL_ACCEL_TIME )
#define CHAINGUN_BARREL_DECCEL ( CHAINGUN_BARREL_SPEED / CHAINGUN_BARREL_DECCEL_TIME )
// blend times
#define CHAINGUN_IDLE_TO_LOWER 4
#define CHAINGUN_IDLE_TO_FIRE 0
#define CHAINGUN_IDLE_TO_RELOAD 4
#define CHAINGUN_RAISE_TO_IDLE 0
#define CHAINGUN_WINDDOWN_TO_IDLE 0
#define CHAINGUN_RELOAD_TO_IDLE 0
/*
===============
rvmWeaponChainGun::Init
===============
*/
void rvmWeaponChainGun::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
world_model = ( idAnimatedEntity* )owner->GetWorldModel();
world_barrel_joint = owner->GetAnimator()->GetJointHandle( "toob" );
barrel_joint = owner->GetAnimator()->GetJointHandle( "spinner" );
barrel_angle = 0;
current_rate = 0;
start_rate = 0;
end_rate = 0;
spin_start = 0;
numSkipFrames = 0;
spin_end = 0;
spread = weapon->GetFloat( "spread" ); // weapon->GetFloat("spread")
snd_windup = FindSound( "snd_windup" );
snd_winddown = FindSound( "snd_winddown" );
}
/*
===============
rvmWeaponChainGun::UpdateBarrel
===============
*/
void rvmWeaponChainGun::UpdateBarrel()
{
float currentTime;
//float t;
idAngles ang;
currentTime = gameLocal.time;
//if (currentTime < spin_end) {
// t = (currentTime - spin_start) / (spin_end - spin_start);
// current_rate = start_rate + t * (end_rate - start_rate);
//}
//else {
current_rate = end_rate;
//}
if( current_rate )
{
barrel_angle = barrel_angle + current_rate * GAME_FRAMETIME;
ang.pitch = 0;
ang.yaw = 0;
ang.roll = barrel_angle;
owner->Event_SetJointAngle( barrel_joint, JOINTMOD_LOCAL, ang );
ang.yaw = barrel_angle;
ang.roll = 0;
world_model->Event_SetJointAngle( world_barrel_joint, JOINTMOD_LOCAL, ang );
}
}
/*
===============
rvmWeaponChainGun::SpinUp
===============
*/
void rvmWeaponChainGun::SpinUp()
{
start_rate = current_rate;
end_rate = CHAINGUN_BARREL_SPEED;
spin_start = gameLocal.time;
spin_end = spin_start + ( end_rate - current_rate ) / CHAINGUN_BARREL_ACCEL;
owner->Event_StartSound( "snd_windup", SND_CHANNEL_BODY3, false );
}
/*
===============
rvmWeaponChainGun::SpinDown
===============
*/
void rvmWeaponChainGun::SpinDown()
{
start_rate = current_rate;
end_rate = 0;
spin_start = gameLocal.time;
spin_end = spin_start + ( current_rate - end_rate ) / CHAINGUN_BARREL_DECCEL;
owner->Event_StartSound( "snd_winddown", SND_CHANNEL_BODY3, false );
}
/*
===============
rvmWeaponChainGun::Raise
===============
*/
stateResult_t rvmWeaponChainGun::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, CHAINGUN_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponChainGun::Lower
===============
*/
stateResult_t rvmWeaponChainGun::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;
}
/*
===============
rvmWeaponChainGun::Idle
===============
*/
stateResult_t rvmWeaponChainGun::Idle( stateParms_t* parms )
{
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
if( !owner->AmmoInClip() )
{
owner->Event_WeaponOutOfAmmo();
}
else
{
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;
}
/*
===============
rvmWeaponChainGun::Fire
===============
*/
stateResult_t rvmWeaponChainGun::Fire( stateParms_t* parms )
{
float ammoClip;
// float currentTime;
// float skip;
ammoClip = owner->AmmoInClip();
enum FireState
{
FIRE_NOTSET = 0,
FIRE_SPIN1,
FIRE_FIRE,
FIRE_SKIPFRAMES
};
switch( parms->stage )
{
case FIRE_NOTSET:
SpinUp();
UpdateBarrel();
if( current_rate >= end_rate )
{
if( ammoClip > 0 )
{
parms->stage = FIRE_SPIN1;
}
else
{
parms->stage = 0;
return SRESULT_DONE;
}
}
return SRESULT_WAIT;
case FIRE_SPIN1:
owner->Event_StartSound( "snd_spin", SND_CHANNEL_BODY3, false );
parms->stage = FIRE_FIRE;
return SRESULT_WAIT;
case FIRE_FIRE:
owner->Event_LaunchProjectiles( CHAINGUN_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_StartSound( "snd_fire", SND_CHANNEL_BODY3, false );
if( ammoClip == CHAINGUN_LOWAMMO )
{
owner->Event_StartSound( "snd_lowammo", SND_CHANNEL_ITEM, false );
}
numSkipFrames = 0;
parms->stage = FIRE_SKIPFRAMES;
return SRESULT_WAIT;
case FIRE_SKIPFRAMES:
UpdateBarrel();
numSkipFrames++;
if( numSkipFrames >= CHAINGUN_FIRE_SKIPFRAMES )
{
if( owner->IsFiring() )
{
parms->stage = FIRE_FIRE;
numSkipFrames = 0;
}
else
{
SpinDown();
return SRESULT_DONE;
}
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponChainGun::Reload
===============
*/
stateResult_t rvmWeaponChainGun::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
+37
View File
@@ -0,0 +1,37 @@
// Weapon_chaingun.h
//
#pragma once
class rvmWeaponChainGun : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponChainGun );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void UpdateBarrel();
void SpinUp();
void SpinDown();
private:
idAnimatedEntity* world_model;
jointHandle_t world_barrel_joint;
jointHandle_t barrel_joint;
float barrel_angle;
float current_rate;
float start_rate;
float end_rate;
float spin_start;
float spin_end;
float spread;
int numSkipFrames;
const idSoundShader* snd_windup;
const idSoundShader* snd_winddown;
};
+225
View File
@@ -0,0 +1,225 @@
// Weapon_chainsaw.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponChainsaw )
END_CLASS
#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;
}
+20
View File
@@ -0,0 +1,20 @@
// Weapon_chainsaw.h
//
#pragma once
class rvmWeaponChainsaw : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponChainsaw );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
bool side;
};
@@ -0,0 +1,252 @@
// Weapon_double_shotgun.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponDoubleShotgun )
END_CLASS
//#define SHOTGUN_DOUBLE_FIRERATE 1.333
#define SHOTGUN_DOUBLE_FIRERATE 2.2
#define SHOTGUN_DOUBLE_REQUIRED 2
// blend times
#define SHOTGUN_DOUBLE_IDLE_TO_IDLE 0
#define SHOTGUN_DOUBLE_IDLE_TO_LOWER 4
#define SHOTGUN_DOUBLE_IDLE_TO_FIRE 0
#define SHOTGUN_DOUBLE_IDLE_TO_RELOAD 4
#define SHOTGUN_DOUBLE_IDLE_TO_NOAMMO 4
#define SHOTGUN_DOUBLE_NOAMMO_TO_RELOAD 4
#define SHOTGUN_DOUBLE_NOAMMO_TO_IDLE 4
#define SHOTGUN_DOUBLE_RAISE_TO_IDLE 4
#define SHOTGUN_DOUBLE_FIRE_TO_IDLE 4
#define SHOTGUN_DOUBLE_RELOAD_TO_IDLE 4
#define SHOTGUN_DOUBLE_RELOAD_TO_FIRE 4
//Shotgun Projectile Information
#define SHOTGUN_CENTER_PROJECTILES 8
//#define SHOTGUN_CENTER_PROJECTILES 7
#define SHOTGUN_BIG_PROJECTILES 12
//#define SHOTGUN_BIG_PROJECTILES 13
#define SHOTGUN_CENTER_WIDTH 5
#define SHOTGUN_CENTER_HEIGHT 10
//#define SHOTGUN_CENTER_HEIGHT 12
#define SHOTGUN_BIG_WIDTH 22
//#define SHOTGUN_BIG_WIDTH 25
#define SHOTGUN_BIG_HEIGHT 15
/*
===============
rvmWeaponDoubleShotgun::Init
===============
*/
void rvmWeaponDoubleShotgun::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
}
/*
===============
rvmWeaponDoubleShotgun::Raise
===============
*/
stateResult_t rvmWeaponDoubleShotgun::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, SHOTGUN_DOUBLE_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponDoubleShotgun::Lower
===============
*/
stateResult_t rvmWeaponDoubleShotgun::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;
}
/*
===============
rvmWeaponDoubleShotgun::Idle
===============
*/
stateResult_t rvmWeaponDoubleShotgun::Idle( stateParms_t* parms )
{
//float currentTime = 0;
float clip_size;
clip_size = owner->ClipSize();
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
owner->Event_WeaponReady();
if( !owner->AmmoInClip() )
{
owner->Event_WeaponOutOfAmmo();
}
else
{
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;
}
/*
===============
rvmWeaponDoubleShotgun::Fire
===============
*/
stateResult_t rvmWeaponDoubleShotgun::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
//if (ammoClip == SHOTGUN_LOWAMMO) {
// int length;
// owner->StartSoundShader(snd_lowammo, SND_CHANNEL_ITEM, 0, false, &length);
//}
//owner->Event_LaunchProjectiles(SHOTGUN_NUMPROJECTILES, spread, 0, 1, 1);
owner->Event_LaunchProjectilesEllipse( SHOTGUN_CENTER_PROJECTILES, SHOTGUN_CENTER_WIDTH, SHOTGUN_CENTER_HEIGHT, 0, 1.0 );
owner->Event_LaunchProjectilesEllipse( SHOTGUN_BIG_PROJECTILES, SHOTGUN_BIG_WIDTH, SHOTGUN_BIG_HEIGHT, 0, 1.0 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, SHOTGUN_DOUBLE_FIRE_TO_IDLE ) )
{
owner->Event_WeaponReloading();
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponDoubleShotgun::Reload
===============
*/
stateResult_t rvmWeaponDoubleShotgun::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload_start", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponDoubleShotgun::EjectBrass
===============
*/
void rvmWeaponDoubleShotgun::EjectBrass( void )
{
}
@@ -0,0 +1,22 @@
// Weapon_double_shotgun.h
//
#pragma once
class rvmWeaponDoubleShotgun : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponDoubleShotgun );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
void EjectBrass( void );
private:
};
+185
View File
@@ -0,0 +1,185 @@
// weapon_fist.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponFist )
END_CLASS
#define RIFLE_NUMPROJECTILES 1
// blend times
#define FISTS_IDLE_TO_LOWER 4
#define FISTS_IDLE_TO_PUNCH 0
#define FISTS_RAISE_TO_IDLE 4
#define FISTS_PUNCH_TO_IDLE 1
/*
================
rvmWeaponFist::Init
================
*/
void rvmWeaponFist::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
}
/*
================
rvmWeaponFist::Raise
================
*/
stateResult_t rvmWeaponFist::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, FISTS_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
================
rvmWeaponFist::Lower
================
*/
stateResult_t rvmWeaponFist::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;
}
/*
================
rvmWeaponFist::Idle
================
*/
stateResult_t rvmWeaponFist::Idle( stateParms_t* parms )
{
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle" );
parms->stage = IDLE_WAIT;
return SRESULT_WAIT;
case IDLE_WAIT:
// Do nothing.
return SRESULT_DONE;
}
return SRESULT_ERROR;
}
/*
================
rvmWeaponFist::Fire
================
*/
stateResult_t rvmWeaponFist::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, GetFireAnim(), 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, 0 ) )
{
side = !side;
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
================
rvmWeaponFist::Reload
================
*/
stateResult_t rvmWeaponFist::Reload( stateParms_t* parms )
{
return SRESULT_DONE;
}
/*
================
rvmWeaponFist::GetFireAnim
================
*/
const char* rvmWeaponFist::GetFireAnim()
{
if( side )
{
return "punch_left";
}
else
{
return "punch_right";
}
}
+21
View File
@@ -0,0 +1,21 @@
// Weapon_fist.h
//
#pragma once
class rvmWeaponFist : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponFist );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
const char* GetFireAnim();
bool side;
};
@@ -0,0 +1,254 @@
// Weapon_flashlight.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponFlashlight )
END_CLASS
// 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;
}
@@ -0,0 +1,28 @@
// Weapon_flashlight.h
//
#pragma once
class rvmWeaponFlashlight : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponFlashlight );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void UpdateSkin( void );
void UpdateLightIntensity( void );
bool on;
float intensity;
idStr skin_on;
idStr skin_on_invis;
idStr skin_off;
idStr skin_off_invis;
};
+400
View File
@@ -0,0 +1,400 @@
// Weapon_grabber.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponGrabber )
END_CLASS
// blend times
#define GRABBER_IDLE_TO_LOWER 4
#define GRABBER_IDLE_TO_OPEN 4
#define GRABBER_IDLE_TO_OPENFIRE 4
#define GRABBER_OPEN_TO_CLOSE 4
#define GRABBER_OPEN_TO_FIRE 4
#define GRABBER_CLOSE_TO_OPEN 4
#define GRABBER_CLOSE_TO_IDLE 4
#define GRABBER_OPENFIRE_TO_FIRE 2
#define GRABBER_FIRE_TO_CLOSE 4
#define GRABBER_RAISE_TO_IDLE 4
#define WARNING_BEEP_1 1.5
#define WARNING_BEEP_2 2.25
#define WARNING_BEEP_3 2.50
#define WARNING_BEEP_4 2.75
/*
===============
rvmWeaponGrabber::Init
===============
*/
void rvmWeaponGrabber::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
snd_fireloop = FindSound( "snd_fireloop" );
snd_electroloop = FindSound( "snd_electroloop" );
snd_mainfire = FindSound( "snd_mainfire" );
snd_cangrab = FindSound( "snd_cangrab" );
snd_warning = FindSound( "snd_warning" );
snd_stopfire = FindSound( "snd_stopfire" );
owner->Event_Grabber( true );
grabberState = -1;
}
/*
===============
rvmWeaponGrabber::Raise
===============
*/
stateResult_t rvmWeaponGrabber::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, GRABBER_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponGrabber::Lower
===============
*/
stateResult_t rvmWeaponGrabber::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;
}
/*
===============
rvmWeaponGrabber::CanFire
Original grabber logic had this, so we prevent the fire action from going unless grabState is 1 or 2.
grabState = grabberHasTarget();
if ( grabState == 1 || grabState == 2 ) {
if(WEAPON_ATTACK) {
weaponState( "GrabberOpenFire", GRABBER_IDLE_TO_OPENFIRE );
}
}
===============
*/
//bool rvmWeaponGrabber::CanFire()
//{
// int grabState = owner->Event_GrabberHasTarget();
// return grabState == 1 || grabState == 2;
//}
/*
===============
rvmWeaponGrabber::Idle
===============
*/
stateResult_t rvmWeaponGrabber::Idle( stateParms_t* parms )
{
int grabState = 0;
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT,
IDLE_GRABBER_OPEN,
IDLE_GRABBER_OPEN_WAIT,
};
UpdateGuiLight();
grabState = owner->Event_GrabberHasTarget();
if( grabState == 1 || grabState == 2 )
{
parms->stage = IDLE_GRABBER_OPEN;
}
switch( parms->stage )
{
case IDLE_NOTSET:
owner->Event_WeaponReady();
if( !owner->AmmoInClip() )
{
owner->Event_WeaponOutOfAmmo();
}
else
{
owner->Event_WeaponReady();
}
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle" );
parms->stage = IDLE_WAIT;
return SRESULT_WAIT;
case IDLE_WAIT:
// Do nothing.
return SRESULT_WAIT;
case IDLE_GRABBER_OPEN:
owner->StartSoundShader( snd_fireloop, SND_CHANNEL_BODY3, 0, false, NULL );
owner->StartSoundShader( snd_electroloop, SND_CHANNEL_BODY2, 0, false, NULL );
owner->StartSoundShader( snd_mainfire, SND_CHANNEL_BODY, 0, false, NULL );
StartWarningSound();
StartActive();
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "open", false );
parms->stage = IDLE_GRABBER_OPEN_WAIT;
return SRESULT_WAIT;
case IDLE_GRABBER_OPEN_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
//owner->WeaponState( WP_FIRE, GRABBER_OPEN_TO_CLOSE );
owner->BeginAttack();
return SRESULT_DONE;
}
else
{
grabState = owner->Event_GrabberHasTarget();
if( grabState == 3 )
{
//owner->WeaponState( WP_FIRE, GRABBER_OPEN_TO_CLOSE );
owner->BeginAttack();
return SRESULT_DONE;
}
}
UpdateGuiLight();
UpdateWarningSound();
return SRESULT_WAIT;;
}
return SRESULT_DONE;
}
/*
=====================
rvmWeaponGrabber::StartWarningSound
=====================
*/
void rvmWeaponGrabber::StartWarningSound()
{
fireStartTime = gameLocal.realClientTime;
warningBeep1 = false;
warningBeep2 = false;
warningBeep3 = false;
warningBeep4 = false;
}
/*
=====================
rvmWeaponGrabber::StartActive
=====================
*/
void rvmWeaponGrabber::StartActive()
{
owner->Event_StartWeaponParticle( "barrel_upper" );
owner->Event_StartWeaponLight( "light_barrel_upper" );
owner->Event_StartWeaponLight( "light_barrel_lower" );
owner->Event_StartWeaponLight( "light_side" );
}
/*
=====================
rvmWeaponGrabber::StopActive
=====================
*/
void rvmWeaponGrabber::StopActive()
{
owner->Event_StopWeaponParticle( "barrel_upper" );
owner->Event_StopWeaponLight( "light_barrel_upper" );
owner->Event_StopWeaponLight( "light_barrel_lower" );
owner->Event_StopWeaponLight( "light_side" );
}
/*
==================== =
rvmWeaponGrabber::UpdateGuiLight
==================== =
*/
void rvmWeaponGrabber::UpdateGuiLight()
{
float newState = owner->Event_GrabberHasTarget();
if( newState != grabberState )
{
grabberState = newState;
if( grabberState == 0 )
{
owner->Event_StartWeaponLight( "gLightBlue" );
owner->Event_StopWeaponLight( "gLightYellow" );
owner->Event_StopWeaponLight( "gLightRed" );
}
else if( grabberState == 1 )
{
//startSound("snd_cangrab", SND_CHANNEL_ITEM, false);
owner->StartSoundShader( snd_cangrab, SND_CHANNEL_ITEM, 0, false, NULL );
owner->Event_StartWeaponLight( "gLightYellow" );
owner->Event_StopWeaponLight( "gLightBlue" );
owner->Event_StopWeaponLight( "gLightRed" );
}
else if( grabberState == 2 )
{
owner->Event_StartWeaponLight( "gLightRed" );
owner->Event_StopWeaponLight( "gLightBlue" );
owner->Event_StopWeaponLight( "gLightYellow" );
}
}
}
/*
=====================
rvmWeaponGrabber::UpdateWarningSound
=====================
*/
void rvmWeaponGrabber::UpdateWarningSound()
{
float currentTime;
float elapsed;
currentTime = gameLocal.realClientTime;
elapsed = currentTime - fireStartTime;
if( elapsed > WARNING_BEEP_1 && !warningBeep1 )
{
owner->StartSoundShader( snd_warning, SND_CHANNEL_ITEM, 0, false, NULL );
warningBeep1 = true;
}
if( elapsed > WARNING_BEEP_2 && !warningBeep2 )
{
owner->StartSoundShader( snd_warning, SND_CHANNEL_ITEM, 0, false, NULL );
warningBeep2 = true;
}
if( elapsed > WARNING_BEEP_3 && !warningBeep3 )
{
owner->StartSoundShader( snd_warning, SND_CHANNEL_ITEM, 0, false, NULL );
warningBeep3 = true;
}
if( elapsed > WARNING_BEEP_4 && !warningBeep4 )
{
owner->StartSoundShader( snd_warning, SND_CHANNEL_ITEM, 0, false, NULL );
warningBeep4 = true;
}
}
/*
===============
rvmWeaponGrabber::Fire
===============
*/
stateResult_t rvmWeaponGrabber::Fire( stateParms_t* parms )
{
//int grabState;
//
//grabState = owner->Event_GrabberHasTarget();
//
//enum FIRE_State
//{
// FIRE_NOTSET = 0,
// FIRE_WAIT_GRABSTATE,
// FIRE_ACTUALLY_FIRE,
// FIRE_WAIT
//};
//
//switch( parms->stage )
//{
// case FIRE_NOTSET:
// next_attack = MS2SEC( gameLocal.realClientTime );
// owner->Event_PlayAnim( ANIMCHANNEL_ALL, "idleopen", true );
// parms->stage = FIRE_WAIT_GRABSTATE;
// return SRESULT_WAIT;
//
// case FIRE_WAIT_GRABSTATE:
// if( grabState == 3 || grabState == 0 )
// {
// parms->stage = FIRE_ACTUALLY_FIRE;
// }
// return SRESULT_WAIT;
//
// case FIRE_ACTUALLY_FIRE:
// StopActive();
//
// // Stops fire loop sound
// owner->StartSoundShader( snd_stopfire, SND_CHANNEL_BODY3, 0, false, NULL );
// owner->StopSound( SND_CHANNEL_BODY2, false );
//
// owner->Event_StartWeaponSmoke();
// owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", true );
// break;
//
// case FIRE_WAIT:
// if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
// {
// owner->WeaponState( WP_IDLE, GRABBER_CLOSE_TO_IDLE );
// firingState = 0;
// }
// else
// {
// UpdateGuiLight();
// }
// break;
//}
return SRESULT_DONE;
}
/*
===============
rvmWeaponGrabber::Reload
===============
*/
stateResult_t rvmWeaponGrabber::Reload( stateParms_t* parms )
{
return SRESULT_DONE;
}
+43
View File
@@ -0,0 +1,43 @@
// Weapon_grabber.h
//
#pragma once
class rvmWeaponGrabber : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponGrabber );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void StartActive();
void StopActive();
void StartWarningSound();
void UpdateWarningSound();
void UpdateGuiLight();
const idSoundShader* snd_fireloop;
const idSoundShader* snd_electroloop;
const idSoundShader* snd_mainfire;
const idSoundShader* snd_cangrab;
const idSoundShader* snd_warning;
const idSoundShader* snd_stopfire;
private:
float next_attack;
float fireStartTime;
bool warningBeep1;
bool warningBeep2;
bool warningBeep3;
bool warningBeep4;
float grabberState;
};
@@ -0,0 +1,384 @@
// Weapon_handgrenade.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponHandgrenade )
END_CLASS
#define HANDGRENADE_MINRELEASETIME 0.05
#define HANDGRENADE_FUSE 3
#define HANDGRENADE_QUICKTHROWTIME .2
#define HANDGRENADE_MINPOWER 1.5
#define HANDGRENADE_MAXPOWER 6
#define HANDGRENADE_QUICKTHROWLAUNCH 0.55
#define HANDGRENADE_NORMALTHROWLAUNCH 0.3
#define HANDGRENADE_NUMPROJECTILES 1
// blend times
#define HANDGRENADE_IDLE_TO_LOWER 4
#define HANDGRENADE_IDLE_TO_FIRE 4
#define HANDGRENADE_RAISE_TO_IDLE 4
#define HANDGRENADE_FIRE_TO_IDLE 4
/*
===============
rvmWeaponHandgrenade::Init
===============
*/
void rvmWeaponHandgrenade::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
projectile = NULL;
spread = owner->GetFloatKey( "spread" );
skin_nade = owner->GetKey( "skin_nade" );
skin_nade_invis = owner->GetKey( "skin_nade_invis" );
skin_nonade = owner->GetKey( "skin_nonade" );
skin_nonade_invis = owner->GetKey( "skin_nonade_invis" );
GrenadeNade();
}
/*
===============
rvmWeaponHandgrenade::GrenadeNade
===============
*/
void rvmWeaponHandgrenade::GrenadeNade( void )
{
show_grenade = true;
UpdateSkin();
}
/*
===============
rvmWeaponHandgrenade::GrenadeNoNade
===============
*/
void rvmWeaponHandgrenade::GrenadeNoNade( void )
{
show_grenade = false;
UpdateSkin();
}
/*
===============
rvmWeaponHandgrenade::GrenadeNoNade
===============
*/
void rvmWeaponHandgrenade::UpdateSkin()
{
if( !show_grenade )
{
if( owner->Event_IsInvisible() )
{
owner->Event_SetSkin( skin_nonade_invis );
}
else
{
owner->Event_SetSkin( skin_nonade );
}
}
else
{
if( owner->Event_IsInvisible() )
{
owner->Event_SetSkin( skin_nade_invis );
}
else
{
owner->Event_SetSkin( skin_nade );
}
}
}
/*
===============
rvmWeaponHandgrenade::Raise
===============
*/
stateResult_t rvmWeaponHandgrenade::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, HANDGRENADE_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponHandgrenade::Lower
===============
*/
stateResult_t rvmWeaponHandgrenade::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;
}
/*
===============
rvmWeaponHandgrenade::Idle
===============
*/
stateResult_t rvmWeaponHandgrenade::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;
}
/*
===============
rvmWeaponHandgrenade::OwnerDied
===============
*/
void rvmWeaponHandgrenade::OwnerDied( void )
{
float time_held;
if( projectile )
{
time_held = gameLocal.SysScriptTime() - fuse_start;
projectile->Show();
projectile->Unbind();
// allow grenade to drop
owner->Event_LaunchProjectiles( HANDGRENADE_NUMPROJECTILES, spread, time_held, 0, 1.0 );
projectile = NULL;
}
}
/*
===============
rvmWeaponHandgrenade::Fire
===============
*/
stateResult_t rvmWeaponHandgrenade::Fire( stateParms_t* parms )
{
if( parms->stage == 0 )
{
projectile = ( idProjectile* )owner->CreateProjectile();
if( projectile )
{
projectile->Event_StartSound( "snd_throw", SND_CHANNEL_BODY, true );
}
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "throw_start", false );
current_time = gameLocal.SysScriptTime();
fuse_start = current_time;
fuse_end = current_time + HANDGRENADE_FUSE;
parms->stage = 1;
return SRESULT_WAIT;
}
if( parms->stage == 1 )
{
if( current_time < fuse_end )
{
if( ( current_time > fuse_start + HANDGRENADE_MINRELEASETIME ) )
{
parms->stage = 2;
return SRESULT_WAIT;
}
current_time = gameLocal.SysScriptTime();
return SRESULT_WAIT;
}
parms->stage = 2;
return SRESULT_WAIT;
}
if( parms->stage == 2 )
{
time_held = current_time - fuse_start;
power = time_held + HANDGRENADE_MINPOWER;
if( power > HANDGRENADE_MAXPOWER )
{
power = HANDGRENADE_MAXPOWER;
}
if( time_held < HANDGRENADE_QUICKTHROWTIME )
{
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "throw_quick", false );
parms->Wait( HANDGRENADE_QUICKTHROWLAUNCH );
exploded = false;
}
else if( time_held < HANDGRENADE_FUSE )
{
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "throw", false );
parms->Wait( HANDGRENADE_NORMALTHROWLAUNCH );
exploded = false;
}
else
{
// no anim. grenade just blows up
ExplodeInHand();
exploded = true;
}
parms->stage = 3;
return SRESULT_WAIT;
}
if( parms->stage == 3 )
{
if( !exploded )
{
GrenadeNoNade();
current_time = gameLocal.SysScriptTime();
if( projectile )
{
projectile->Show();
projectile->Unbind();
owner->Event_LaunchProjectiles( HANDGRENADE_NUMPROJECTILES, spread, current_time - fuse_start, power, 1.0 );
projectile = NULL;
}
parms->stage = 4;
return SRESULT_WAIT;
}
parms->stage = 5;
return SRESULT_WAIT;
}
if( parms->stage == 4 )
{
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, HANDGRENADE_FIRE_TO_IDLE ) )
{
parms->stage = 5;
return SRESULT_WAIT;
}
return SRESULT_WAIT;
}
if( !owner->AmmoAvailable() )
{
stateThread.Clear();
stateThread.SetState( "Holstered" );
owner->GetOwner()->NextWeapon();
}
else
{
GrenadeNade();
}
return SRESULT_DONE;
}
/*
===============
rvmWeaponHandgrenade::Reload
===============
*/
stateResult_t rvmWeaponHandgrenade::Reload( stateParms_t* parms )
{
return SRESULT_DONE;
}
/*
===============
rvmWeaponHandgrenade::ExplodeInHand
===============
*/
void rvmWeaponHandgrenade::ExplodeInHand()
{
idStr entname;
idEntity* explosion;
idVec3 forward;
idAngles angles;
idPlayer* owner;
if( projectile )
{
projectile->Event_Remove();
projectile = NULL;
}
owner = this->owner->GetOwner();
GrenadeNoNade();
this->owner->Event_StartSound( "snd_explode", SND_CHANNEL_ANY, false );
//if( !common->IsClient() )
{
this->owner->Event_UseAmmo( HANDGRENADE_NUMPROJECTILES );
angles = owner->viewAngles;
forward = angles.ToForward();
entname = this->owner->GetKey( "def_explode_inhand" );
explosion = gameLocal.Spawn( entname );
explosion->SetOrigin( this->owner->GetOrigin() + forward * 16 );
explosion->SetShaderParm( SHADERPARM_TIMEOFFSET, -gameLocal.SysScriptTime() );
gameLocal.DelayRemoveEntity( explosion, 2 );
// this should kill us
gameLocal.RadiusDamage( this->owner->GetOrigin(), this->owner, owner, NULL, NULL, this->owner->GetKey( "def_damage_inhand" ), 1.0f );
}
}
@@ -0,0 +1,44 @@
// Weapon_handgrenade.h
//
#pragma once
class rvmWeaponHandgrenade : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponHandgrenade );
virtual void Init( idWeapon* weapon );
virtual void OwnerDied( void ) override;
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void GrenadeNade( void );
void GrenadeNoNade( void );
void UpdateSkin();
void ExplodeInHand();
private:
float spread;
float fuse_start;
idStr skin_nade;
idStr skin_nade_invis;
idStr skin_nonade;
idStr skin_nonade_invis;
idProjectile* projectile;
boolean show_grenade;
private:
float fuse_end;
float current_time;
float time_held;
float power;
boolean exploded;
const idSoundShader* snd_lowammo;
};
@@ -0,0 +1,205 @@
// Weapon_machinegun.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponMachineGun )
END_CLASS
#define MACHINEGUN_FIRERATE 0.1 // ~10 per second
#define MACHINEGUN_LOWAMMO 10
#define MACHINEGUN_NUMPROJECTILES 1
// blend times
#define MACHINEGUN_IDLE_TO_LOWER 4
#define MACHINEGUN_IDLE_TO_FIRE 0
#define MACHINEGUN_IDLE_TO_RELOAD 4
#define MACHINEGUN_RAISE_TO_IDLE 4
#define MACHINEGUN_FIRE_TO_IDLE 0
#define MACHINEGUN_RELOAD_TO_IDLE 4
/*
===============
rvmWeaponMachineGun::Init
===============
*/
void rvmWeaponMachineGun::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
spread = weapon->GetFloat( "spread" );
snd_lowammo = FindSound( "snd_lowammo" );
}
/*
===============
rvmWeaponMachineGun::Raise
===============
*/
stateResult_t rvmWeaponMachineGun::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, MACHINEGUN_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponMachineGun::Lower
===============
*/
stateResult_t rvmWeaponMachineGun::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;
}
/*
===============
rvmWeaponMachineGun::Idle
===============
*/
stateResult_t rvmWeaponMachineGun::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;
}
/*
===============
rvmWeaponMachineGun::Fire
===============
*/
stateResult_t rvmWeaponMachineGun::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
next_attack = gameLocal.realClientTime + MS2SEC( MACHINEGUN_FIRERATE );
owner->Event_LaunchProjectiles( MACHINEGUN_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, MACHINEGUN_FIRE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponMachineGun::Reload
===============
*/
stateResult_t rvmWeaponMachineGun::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
@@ -0,0 +1,22 @@
// Weapon_machinegun.h
//
#pragma once
class rvmWeaponMachineGun : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponMachineGun );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
float spread;
const idSoundShader* snd_lowammo;
};
+133
View File
@@ -0,0 +1,133 @@
// Weapon_pda.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponPDA )
END_CLASS
/*
================
rvmWeaponPDA::Init
================
*/
void rvmWeaponPDA::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
}
/*
================
rvmWeaponPDA::Raise
================
*/
stateResult_t rvmWeaponPDA::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, 0 ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
================
rvmWeaponPDA::Lower
================
*/
stateResult_t rvmWeaponPDA::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;
}
/*
================
rvmWeaponPDA::Idle
================
*/
stateResult_t rvmWeaponPDA::Idle( stateParms_t* parms )
{
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
owner->GetOwner()->Event_OpenPDA();
parms->stage = IDLE_WAIT;
return SRESULT_WAIT;
case IDLE_WAIT:
if( !owner->GetOwner()->objectiveSystemOpen )
{
//owner->WeaponState( WP_LOWERING, 0 );
owner->LowerWeapon();
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
}
/*
================
rvmWeaponPDA::Fire
================
*/
stateResult_t rvmWeaponPDA::Fire( stateParms_t* parms )
{
return SRESULT_DONE;
}
/*
================
rvmWeaponPDA::Reload
================
*/
stateResult_t rvmWeaponPDA::Reload( stateParms_t* parms )
{
return SRESULT_DONE;
}
+18
View File
@@ -0,0 +1,18 @@
// Weapon_pda.h
//
#pragma once
class rvmWeaponPDA : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponPDA );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
};
+217
View File
@@ -0,0 +1,217 @@
// Weapon_pistol.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponPistol )
END_CLASS
#define PISTOL_FIRERATE 0.4
#define PISTOL_LOWAMMO 4
#define PISTOL_NUMPROJECTILES 1
// blend times
#define PISTOL_IDLE_TO_LOWER 2
#define PISTOL_IDLE_TO_FIRE 1
#define PISTOL_IDLE_TO_RELOAD 3
#define PISTOL_RAISE_TO_IDLE 3
#define PISTOL_FIRE_TO_IDLE 4
#define PISTOL_RELOAD_TO_IDLE 40
/*
===============
rvmWeaponPistol::Init
===============
*/
void rvmWeaponPistol::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
spread = weapon->GetFloat( "spread" );
snd_lowammo = FindSound( "snd_lowammo" );
}
/*
===============
rvmWeaponPistol::Raise
===============
*/
stateResult_t rvmWeaponPistol::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, PISTOL_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponPistol::Lower
===============
*/
stateResult_t rvmWeaponPistol::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;
}
/*
===============
rvmWeaponPistol::Idle
===============
*/
stateResult_t rvmWeaponPistol::Idle( stateParms_t* parms )
{
enum IdleState
{
IDLE_NOTSET = 0,
IDLE_WAIT
};
switch( parms->stage )
{
case IDLE_NOTSET:
owner->Event_WeaponReady();
if( !owner->AmmoInClip() )
{
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle_empty" );
}
else
{
owner->Event_PlayCycle( ANIMCHANNEL_ALL, "idle" );
}
parms->stage = IDLE_WAIT;
return SRESULT_WAIT;
case IDLE_WAIT:
// Do nothing.
return SRESULT_DONE;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponPistol::Fire
===============
*/
stateResult_t rvmWeaponPistol::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
next_attack = gameLocal.realClientTime + SEC2MS( PISTOL_FIRERATE );
if( ammoClip == PISTOL_LOWAMMO )
{
int length;
owner->StartSoundShader( snd_lowammo, SND_CHANNEL_ITEM, 0, false, &length );
}
owner->Event_LaunchProjectiles( PISTOL_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PISTOL_FIRE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponPistol::Reload
===============
*/
stateResult_t rvmWeaponPistol::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
+22
View File
@@ -0,0 +1,22 @@
// Weapon_pistol.h
//
#pragma once
class rvmWeaponPistol : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponPistol );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
float spread;
const idSoundShader* snd_lowammo;
};
+205
View File
@@ -0,0 +1,205 @@
// Weapon_plasmagun.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponPlasmaGun )
END_CLASS
#define PLASMAGUN_FIRERATE 0.125 //changed by Tim
#define PLASMAGUN_LOWAMMO 10
#define PLASMAGUN_NUMPROJECTILES 1
// blend times
#define PLASMAGUN_IDLE_TO_LOWER 4
#define PLASMAGUN_IDLE_TO_FIRE 1
#define PLASMAGUN_IDLE_TO_RELOAD 4
#define PLASMAGUN_RAISE_TO_IDLE 4
#define PLASMAGUN_FIRE_TO_IDLE 4
#define PLASMAGUN_RELOAD_TO_IDLE 4
/*
===============
rvmWeaponPlasmaGun::Init
===============
*/
void rvmWeaponPlasmaGun::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
spread = weapon->GetFloat( "spread" );
snd_lowammo = FindSound( "snd_lowammo" );
}
/*
===============
rvmWeaponPlasmaGun::Raise
===============
*/
stateResult_t rvmWeaponPlasmaGun::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, PLASMAGUN_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponPlasmaGun::Lower
===============
*/
stateResult_t rvmWeaponPlasmaGun::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;
}
/*
===============
rvmWeaponPlasmaGun::Idle
===============
*/
stateResult_t rvmWeaponPlasmaGun::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;
}
/*
===============
rvmWeaponPlasmaGun::Fire
===============
*/
stateResult_t rvmWeaponPlasmaGun::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
next_attack = gameLocal.time + SEC2MS( PLASMAGUN_FIRERATE );
owner->Event_LaunchProjectiles( PLASMAGUN_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PLASMAGUN_FIRE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponPlasmaGun::Reload
===============
*/
stateResult_t rvmWeaponPlasmaGun::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_WeaponReloading();
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, PLASMAGUN_RELOAD_TO_IDLE ) )
{
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
+22
View File
@@ -0,0 +1,22 @@
// Weapon_plasmagun.h
//
#pragma once
class rvmWeaponPlasmaGun : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponPlasmaGun );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
float spread;
const idSoundShader* snd_lowammo;
};
@@ -0,0 +1,235 @@
// Weapon_rocketlauncher.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponRocketLauncher )
END_CLASS
#define ROCKETLAUNCHER_LOWAMMO 1
#define ROCKETLAUNCHER_NUMPROJECTILES 1
#define ROCKETLAUNCHER_FIREDELAY 1 // was .75 changed again by Tim to 1
// blend times
#define ROCKETLAUNCHER_IDLE_TO_LOWER 4
#define ROCKETLAUNCHER_IDLE_TO_FIRE 0
#define ROCKETLAUNCHER_IDLE_TO_RELOAD 4
#define ROCKETLAUNCHER_RAISE_TO_IDLE 4
#define ROCKETLAUNCHER_FIRE_TO_IDLE 0
#define ROCKETLAUNCHER_RELOAD_TO_IDLE 4
#define ROCKETLAUNCHER_RELOAD_FRAME 34 // how many frames from the end of "reload" to fill the clip
/*
===============
rvmWeaponRocketLauncher::Init
===============
*/
void rvmWeaponRocketLauncher::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
spread = weapon->GetFloat( "spread" );
skin_invisible = weapon->GetKey( "skin_invisible" );
}
/*
===============
rvmWeaponRocketLauncher::UpdateSkin
===============
*/
void rvmWeaponRocketLauncher::UpdateSkin()
{
idStr skinname;
int ammoClip;
if( owner->Event_IsInvisible() )
{
skinname = skin_invisible;
}
else
{
ammoClip = owner->AmmoInClip();
if( ammoClip > 5 )
{
// can happen in MP - weapon Raising with slightly out-of-sync ammoClip
ammoClip = 5;
}
if( ammoClip < 0 )
{
ammoClip = 0;
}
skinname = va( "skins/models/weapons/%drox.skin", ammoClip );
}
owner->Event_SetSkin( skinname );
}
/*
===============
rvmWeaponRocketLauncher::Raise
===============
*/
stateResult_t rvmWeaponRocketLauncher::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, ROCKETLAUNCHER_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponRocketLauncher::Lower
===============
*/
stateResult_t rvmWeaponRocketLauncher::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;
}
/*
===============
rvmWeaponRocketLauncher::Idle
===============
*/
stateResult_t rvmWeaponRocketLauncher::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;
}
/*
===============
rvmWeaponRocketLauncher::Fire
===============
*/
stateResult_t rvmWeaponRocketLauncher::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
next_attack = gameLocal.realClientTime + SEC2MS( ROCKETLAUNCHER_FIREDELAY );
owner->Event_LaunchProjectiles( ROCKETLAUNCHER_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, ROCKETLAUNCHER_FIRE_TO_IDLE ) )
{
UpdateSkin();
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponRocketLauncher::Reload
===============
*/
stateResult_t rvmWeaponRocketLauncher::Reload( stateParms_t* parms )
{
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT
};
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
owner->Event_AddToClip( owner->ClipSize() );
UpdateSkin();
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
@@ -0,0 +1,23 @@
// Weapon_rocketlauncher.h
//
#pragma once
class rvmWeaponRocketLauncher : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponRocketLauncher );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
void UpdateSkin();
float spread;
idStr skin_invisible;
};
+245
View File
@@ -0,0 +1,245 @@
// Weapon_shotgun.cpp
//
#pragma hdrstop
#include "precompiled.h"
#include "../Game_local.h"
CLASS_DECLARATION( rvmWeaponObject, rvmWeaponShotgun )
END_CLASS
#define SHOTGUN_FIRERATE 1.333
#define SHOTGUN_LOWAMMO 2
#define SHOTGUN_RELOADRATE 2
#define SHOTGUN_NUMPROJECTILES 13
// blend times
#define SHOTGUN_IDLE_TO_IDLE 0
#define SHOTGUN_IDLE_TO_LOWER 4
#define SHOTGUN_IDLE_TO_FIRE 1
#define SHOTGUN_IDLE_TO_RELOAD 4
#define SHOTGUN_IDLE_TO_NOAMMO 4
#define SHOTGUN_NOAMMO_TO_RELOAD 4
#define SHOTGUN_NOAMMO_TO_IDLE 4
#define SHOTGUN_RAISE_TO_IDLE 1
#define SHOTGUN_FIRE_TO_IDLE 4
#define SHOTGUN_RELOAD_TO_IDLE 4
#define SHOTGUN_RELOAD_TO_FIRE 4
#define SHOTGUN_RELOAD_TO_LOWER 2
/*
===============
rvmWeaponShotgun::Init
===============
*/
void rvmWeaponShotgun::Init( idWeapon* weapon )
{
rvmWeaponObject::Init( weapon );
next_attack = 0;
spread = weapon->GetFloat( "spread" ); // weapon->GetFloat("spread")
snd_lowammo = FindSound( "snd_lowammo" );
}
/*
===============
rvmWeaponShotgun::Raise
===============
*/
stateResult_t rvmWeaponShotgun::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, SHOTGUN_RAISE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponShotgun::Lower
===============
*/
stateResult_t rvmWeaponShotgun::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;
}
/*
===============
rvmWeaponShotgun::Idle
===============
*/
stateResult_t rvmWeaponShotgun::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;
}
/*
===============
rvmWeaponShotgun::Fire
===============
*/
stateResult_t rvmWeaponShotgun::Fire( stateParms_t* parms )
{
int ammoClip = owner->AmmoInClip();
enum FIRE_State
{
FIRE_NOTSET = 0,
FIRE_WAIT
};
if( ammoClip == 0 && owner->AmmoAvailable() && parms->stage == 0 )
{
//owner->WeaponState( WP_RELOAD, PISTOL_IDLE_TO_RELOAD );
owner->Reload();
return SRESULT_DONE;
}
switch( parms->stage )
{
case FIRE_NOTSET:
next_attack = gameLocal.realClientTime + SEC2MS( SHOTGUN_FIRERATE );
if( ammoClip == SHOTGUN_LOWAMMO )
{
int length;
owner->StartSoundShader( snd_lowammo, SND_CHANNEL_ITEM, 0, false, &length );
}
owner->Event_LaunchProjectiles( SHOTGUN_NUMPROJECTILES, spread, 0, 1, 1 );
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "fire", false );
parms->stage = FIRE_WAIT;
return SRESULT_WAIT;
case FIRE_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, SHOTGUN_FIRE_TO_IDLE ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
/*
===============
rvmWeaponShotgun::Reload
===============
*/
stateResult_t rvmWeaponShotgun::Reload( stateParms_t* parms )
{
float ammoClip;
float ammoAvail;
float clip_size;
clip_size = owner->ClipSize();
enum RELOAD_State
{
RELOAD_NOTSET = 0,
RELOAD_WAIT,
RELOAD_END
};
ammoAvail = owner->AmmoAvailable();
ammoClip = owner->AmmoInClip();
switch( parms->stage )
{
case RELOAD_NOTSET:
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload_loop", false );
parms->stage = RELOAD_WAIT;
return SRESULT_WAIT;
case RELOAD_WAIT:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
if( ( ammoClip < clip_size ) && ( ammoClip < ammoAvail ) )
{
parms->stage = RELOAD_NOTSET;
owner->Event_AddToClip( SHOTGUN_RELOADRATE );
return SRESULT_WAIT;
}
else
{
parms->stage = RELOAD_END;
owner->Event_PlayAnim( ANIMCHANNEL_ALL, "reload_end", false );
return SRESULT_WAIT;
}
owner->Event_AddToClip( owner->ClipSize() );
return SRESULT_DONE;
}
return SRESULT_WAIT;
case RELOAD_END:
if( owner->Event_AnimDone( ANIMCHANNEL_ALL, 0 ) )
{
return SRESULT_DONE;
}
return SRESULT_WAIT;
}
return SRESULT_ERROR;
}
+22
View File
@@ -0,0 +1,22 @@
// Weapon_shotgun.h
//
#pragma once
class rvmWeaponShotgun : public rvmWeaponObject
{
public:
CLASS_PROTOTYPE( rvmWeaponShotgun );
virtual void Init( idWeapon* weapon );
stateResult_t Raise( stateParms_t* parms );
stateResult_t Lower( stateParms_t* parms );
stateResult_t Idle( stateParms_t* parms );
stateResult_t Fire( stateParms_t* parms );
stateResult_t Reload( stateParms_t* parms );
private:
float spread;
const idSoundShader* snd_lowammo;
};