sin-2015/eonandpeon.cpp
1999-04-22 00:00:00 +00:00

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 );
}