//-----------------------------------------------------------------------------
//
//  $Logfile:: /game/eonandpeon.cpp                                           $
// $Revision:: 2                                                              $
//   $Author:: Burgermac                                                      $
//     $Date:: 12/27/00 6:53 PM                                               $
//
// 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 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( Vector( -1, -1, -1 ), Vector( 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 );
}
