247 lines
No EOL
5.8 KiB
C++
247 lines
No EOL
5.8 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /Quake 2 Engine/Sin/code/game/rocket_turret.cpp $
|
|
// $Revision:: 14 $
|
|
// $Author:: Aldie $
|
|
// $Date:: 9/22/98 4:56p $
|
|
//
|
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source is may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
// $Log:: /Quake 2 Engine/Sin/code/game/rocket_turret.cpp $
|
|
//
|
|
// 14 9/22/98 4:56p Aldie
|
|
// Moved lagtime check right before firing
|
|
//
|
|
// 13 9/20/98 9:10p Aldie
|
|
// Added lagtime
|
|
//
|
|
// 12 9/19/98 6:12p Aldie
|
|
// Made wakeupdistance and firingdistance spawn args
|
|
//
|
|
// 11 8/27/98 9:02p Jimdose
|
|
// Changed centroid to a variable
|
|
//
|
|
// 10 7/24/98 10:04p Aldie
|
|
// More commands to control rockets
|
|
//
|
|
// 9 7/23/98 2:32p Aldie
|
|
// Made speed of rocket a tweak cvar
|
|
//
|
|
// 8 7/14/98 5:50p Aldie
|
|
// Tweaked the aiming of the turret
|
|
//
|
|
// 7 7/10/98 5:38p Aldie
|
|
// Updated turret damage
|
|
//
|
|
// 6 7/10/98 2:49p Aldie
|
|
// Put in some basic rocket shooting prediction.
|
|
//
|
|
// 5 7/09/98 10:40p Aldie
|
|
// Updated to new model
|
|
//
|
|
// 4 7/07/98 4:10p Aldie
|
|
// Updated to new class hierarchy
|
|
//
|
|
// 3 7/06/98 5:10p Aldie
|
|
// Tweaking behavior and changed modelname
|
|
//
|
|
// 2 7/06/98 4:08p Aldie
|
|
// First version of rocket_turret
|
|
//
|
|
// DESCRIPTION:
|
|
// Rocket Turret - Shoots slow moving shootable rockets at the player
|
|
|
|
#include "turret.h"
|
|
#include "rocket_turret.h"
|
|
#include "shotrocketlauncher.h"
|
|
|
|
CLASS_DECLARATION( Turret, RocketTurret, "trap_rocketturret" );
|
|
|
|
Event EV_RocketTurret_Rate( "rocketrate" );
|
|
Event EV_RocketTurret_Speed( "rocketspeed" );
|
|
|
|
ResponseDef RocketTurret::Responses[] =
|
|
{
|
|
{ &EV_RocketTurret_Rate, ( Response )RocketTurret::SetRate },
|
|
{ &EV_RocketTurret_Speed, ( Response )RocketTurret::SetSpeed },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
RocketTurret::RocketTurret
|
|
(
|
|
void
|
|
)
|
|
|
|
{
|
|
Entity *base;
|
|
|
|
setModel( "launcher_top.def" );
|
|
RandomAnimate( "down_idle", NULL );
|
|
neworientation = angles.yaw();
|
|
setMoveType( MOVETYPE_NONE );
|
|
setSolidType( SOLID_BBOX );
|
|
flags |= FL_SPARKS;
|
|
enemy_oldorigin = vec_zero;
|
|
edict->svflags |= SVF_USEBBOX;
|
|
|
|
base = new Entity;
|
|
base->setModel( "launcher_base.def" );
|
|
base->setMoveType( MOVETYPE_NONE );
|
|
base->setSolidType( SOLID_BBOX );
|
|
base->setOrigin( worldorigin );
|
|
|
|
health = 150;
|
|
takedamage = DAMAGE_YES;
|
|
wakeupdistance = G_GetFloatArg( "wakeupdistance", 1950 );
|
|
firingdistance = G_GetFloatArg( "firingdistance", 2000 );
|
|
rate = 8.0;
|
|
speed = 300;
|
|
}
|
|
|
|
void RocketTurret::Seek
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
Entity *ent;
|
|
Vector v;
|
|
Vector s;
|
|
int range;
|
|
Vector f;
|
|
Vector enemy_velocity;
|
|
|
|
active = true;
|
|
ent = NULL;
|
|
if ( enemy )
|
|
{
|
|
ent = G_GetEntity( enemy );
|
|
if ( ( !ent ) || ( ent->health <= 0 ) || ( ent->flags & FL_NOTARGET ) || ( ent == this ) )
|
|
{
|
|
enemy = 0;
|
|
enemy_oldorigin = vec_zero;
|
|
ent = NULL;
|
|
}
|
|
else
|
|
{
|
|
float delta_t;
|
|
|
|
// Have an enemy locked on, get the range and calculate velocity
|
|
// based on the old origin and the time difference since last locked
|
|
// onto him.
|
|
range = Range( Distance( ent ) );
|
|
|
|
delta_t = level.time - lastSightTime;
|
|
|
|
if ( delta_t )
|
|
enemy_velocity = ( ent->worldorigin - enemy_oldorigin ) * (1.0f / delta_t);
|
|
else
|
|
enemy_velocity = vec_zero;
|
|
// Update the enemy's origin and the time we last saw him
|
|
enemy_oldorigin = ent->worldorigin;
|
|
}
|
|
}
|
|
|
|
if ( ( lastSightTime ) && ( ( lastSightTime + patience ) < level.time ) )
|
|
{
|
|
ProcessEvent( EV_Turret_GoDown );
|
|
}
|
|
|
|
if ( !enemy )
|
|
{
|
|
FindTarget();
|
|
PostEvent( EV_Turret_Seek, FRAMETIME * 2 );
|
|
return;
|
|
}
|
|
|
|
if ( ( range != TURRET_OUTOFRANGE ) && ent && CanSee( ent ) )
|
|
{
|
|
Vector targ, src, d;
|
|
|
|
float dist;
|
|
|
|
lastSightTime = level.time;
|
|
|
|
// Get distance and orientation to target
|
|
targ = ent->centroid;
|
|
currentWeapon->GetMuzzlePosition(&src);
|
|
d = targ-src;
|
|
dist = d.length();
|
|
|
|
targ += ( enemy_velocity * (dist/sv_rocketspeed->value));
|
|
|
|
v = targ - src;
|
|
v.normalize();
|
|
|
|
new_orientation = v.toAngles();
|
|
}
|
|
|
|
if ( ( angles[ YAW ] != new_orientation[ YAW ] ) && !turning)
|
|
{
|
|
Event *event;
|
|
event = new Event( EV_Turret_Turn );
|
|
event->AddVector( new_orientation );
|
|
ProcessEvent( event );
|
|
}
|
|
|
|
if ( range == TURRET_FIRERANGE )
|
|
{
|
|
// Allow some freetime to let player get somewhere before turret fires on him
|
|
if ( level.time < firetime )
|
|
{
|
|
PostEvent( EV_Turret_Seek, FRAMETIME );
|
|
return;
|
|
}
|
|
ProcessEvent( EV_Turret_Attack );
|
|
}
|
|
|
|
PostEvent( EV_Turret_Seek, FRAMETIME );
|
|
}
|
|
|
|
void RocketTurret::Turn
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
Vector new_angle = ev->GetVector( 1 );
|
|
|
|
if ( angles[ YAW ] != new_angle[ YAW ] )
|
|
{
|
|
turntime = level.time + 0.2;
|
|
turning = true;
|
|
}
|
|
else if ( turntime < level.time )
|
|
{
|
|
turning = false;
|
|
angles[ PITCH ] = -new_angle[ PITCH ];
|
|
return;
|
|
}
|
|
|
|
angles[ PITCH ] = -new_angle[ PITCH ];
|
|
angles[ YAW ] = AdjustAngle( 32, angles[ YAW ], new_angle[ YAW ] );
|
|
setAngles( angles );
|
|
PostEvent( ev, FRAMETIME );
|
|
}
|
|
|
|
void RocketTurret::SetRate
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
rate = ev->GetFloat( 1 );
|
|
}
|
|
|
|
void RocketTurret::SetSpeed
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
speed = ev->GetFloat( 1 );
|
|
} |