186 lines
3.5 KiB
C++
186 lines
3.5 KiB
C++
// 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.
|
|
//
|
|
// DESCRIPTION:
|
|
// Eon and Peon
|
|
//
|
|
|
|
#include "g_local.h"
|
|
#include "actor.h"
|
|
#include "eonandpeon.h"
|
|
#include "specialfx.h"
|
|
#include "gibs.h"
|
|
|
|
|
|
|
|
|
|
class EXPORT_FROM_DLL EonBomb : public Projectile
|
|
{
|
|
public:
|
|
CLASS_PROTOTYPE( EonBomb );
|
|
|
|
virtual void Setup( Entity *owner, Vector pos, Vector vel );
|
|
virtual void EonBombTouch( Event *ev );
|
|
};
|
|
|
|
CLASS_DECLARATION( Projectile, EonBomb, NULL );
|
|
|
|
ResponseDef EonBomb::Responses[] =
|
|
{
|
|
{ &EV_Touch, ( Response )EonBomb::EonBombTouch },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
void EonBomb::EonBombTouch
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
if ( sv_gibs->value && !parentmode->value )
|
|
{
|
|
CreateGibs( this, health, 0.3, 10 );
|
|
}
|
|
PostEvent( EV_Remove, 0 );
|
|
}
|
|
|
|
void EonBomb::Setup
|
|
(
|
|
Entity *owner,
|
|
Vector pos,
|
|
Vector vel
|
|
)
|
|
|
|
{
|
|
// Flies like a grenade
|
|
setMoveType( MOVETYPE_TOSS );
|
|
setSolidType( SOLID_BBOX );
|
|
edict->clipmask = MASK_PROJECTILE;
|
|
setModel( "eon.def" );
|
|
RandomAnimate( "idle", NULL );
|
|
|
|
// Set the flying velocity
|
|
velocity = vel;
|
|
|
|
takedamage = DAMAGE_NO;
|
|
|
|
setSize( "-1 -1 -1", "1 1 1" );
|
|
setOrigin( pos );
|
|
worldorigin.copyTo(edict->s.old_origin);
|
|
|
|
// Remove the projectile in the future
|
|
PostEvent( EV_Remove, 30 );
|
|
}
|
|
|
|
|
|
CLASS_DECLARATION( Peon, EonAndPeon, "boss_eonandpeon" );
|
|
|
|
Event EV_EonAndPeon_SpawnGoo( "spawngoo" );
|
|
|
|
ResponseDef EonAndPeon::Responses[] =
|
|
{
|
|
{ &EV_EonAndPeon_SpawnGoo, ( Response )EonAndPeon::SpawnGoo },
|
|
{ &EV_Killed, ( Response )EonAndPeon::Killed },
|
|
{ &EV_FadeOut, NULL },
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
EonAndPeon::EonAndPeon()
|
|
{
|
|
eon = new Entity;
|
|
eon->setModel( "boss_eon.def" );
|
|
|
|
levelVars.SetVariable( "eon", eon );
|
|
|
|
setModel( "boss_peon.def" );
|
|
flags |= FL_POSTTHINK;
|
|
}
|
|
|
|
void EonAndPeon::Chatter
|
|
(
|
|
const char *snd,
|
|
float chance,
|
|
float volume,
|
|
int channel
|
|
)
|
|
|
|
{
|
|
if ( chattime > level.time )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if ( eon )
|
|
eon->RandomSound( snd, volume, channel, ATTN_NONE );
|
|
RandomSound( snd, volume, channel, ATTN_NONE );
|
|
|
|
chattime = level.time + 7 + G_Random( 5 );
|
|
}
|
|
|
|
void EonAndPeon::Postthink
|
|
(
|
|
void
|
|
)
|
|
{
|
|
if ( eon )
|
|
{
|
|
eon->setOrigin( worldorigin );
|
|
eon->setAngles( worldangles );
|
|
eon->edict->s.anim = edict->s.anim;
|
|
eon->edict->s.frame = edict->s.frame;
|
|
eon->edict->s.scale = edict->s.scale;
|
|
}
|
|
}
|
|
|
|
void EonAndPeon::Killed
|
|
(
|
|
Event *ev
|
|
)
|
|
|
|
{
|
|
EonBomb * eonbomb;
|
|
Vector vel;
|
|
Vector pos;
|
|
Vector target;
|
|
float speed;
|
|
|
|
pos = worldorigin;
|
|
pos.z = absmax.z;
|
|
|
|
speed = 250;
|
|
|
|
if ( currentEnemy )
|
|
{
|
|
target = G_PredictPosition( pos, currentEnemy->centroid, currentEnemy->velocity, speed );
|
|
|
|
vel = G_CalculateImpulse
|
|
(
|
|
pos,
|
|
target,
|
|
speed,
|
|
0.1f
|
|
);
|
|
}
|
|
else
|
|
{
|
|
vel.z = 200;
|
|
}
|
|
|
|
eonbomb = new EonBomb;
|
|
eonbomb->gravity = 0.1f;
|
|
eonbomb->Setup( this, pos, vel );
|
|
eonbomb->RandomSound( "snd_yell" );
|
|
|
|
// delete the real eon
|
|
eon->PostEvent( EV_Remove, 0 );
|
|
eon = NULL;
|
|
levelVars.SetVariable( "eon", 0 );
|
|
|
|
//
|
|
// call normal actor function
|
|
//
|
|
Actor::Killed( ev );
|
|
}
|