//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/explosion.h                      $
// $Revision:: 14                                                             $
//   $Author:: Aldie                                                          $
//     $Date:: 10/02/98 7:20p                                                 $
//
// Copyright (C) 1997 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/explosion.h                           $
//
// 14    10/02/98 7:20p Aldie
// Added flashplayers to do blinding flashes
//
// 13    9/28/98 9:12p Markd
// Put in archive and unarchive functions
//
// 12    9/05/98 12:13p Aldie
// externed RadiusDamage
//
// 11    9/01/98 3:05p Markd
// Rewrote explosion code
//
// 10    6/15/98 10:39a Aldie
// Updated explosion
//
// 9     5/25/98 7:08p Markd
// commented out some stuff
//
// 8     4/05/98 6:42p Jimdose
// Added Exploders and MultiExploders
//
// 7     3/23/98 1:33p Jimdose
// Revamped event and command system
//
// 6     3/18/98 2:27p Jimdose
// Converted to work with new sin
//
// 4     12/06/97 4:48p Markd
// Added interpretCommands.
// Added GetArgs as commands for future processing
// Removed dmg,attentuatioin and volume, moved these to Trigger
//
// 3     10/27/97 2:59p Jimdose
// Removed dependency on quakedef.h
//
// 2     9/26/97 5:23p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// Standard explosion object that is spawned by other entites and not map designers.
// Explosion is used by many of the weapons for the blast effect, but is also used
// by the Exploder and MultiExploder triggers.  These triggers create one or more
// explosions each time they are activated.
//

#ifndef __EXPLOSION_H__
#define __EXPLOSION_H__

#include "g_local.h"
#include "entity.h"
#include "trigger.h"

class EXPORT_FROM_DLL Exploder : public Trigger
{
private:
	int damage;
	float attenuation;
	float volume;

	virtual void MakeExplosion( Event *ev );

public:
	CLASS_PROTOTYPE( Exploder ) Exploder();
	virtual void      Archive( Archiver &arc );
	virtual void      Unarchive( Archiver &arc );
};

inline EXPORT_FROM_DLL void Exploder::Archive( Archiver &arc )
{
	Trigger::Archive( arc );

	arc.WriteInteger( damage );
	arc.WriteFloat( attenuation );
	arc.WriteFloat( volume );
}

inline EXPORT_FROM_DLL void Exploder::Unarchive( Archiver &arc )
{
	Trigger::Unarchive( arc );

	arc.ReadInteger( &damage );
	arc.ReadFloat( &attenuation );
	arc.ReadFloat( &volume );
}


class EXPORT_FROM_DLL MultiExploder : public Trigger
{
private:
	float explodewait;
	float explode_time;
	float duration;
	int damage;
	float attenuation;
	float volume;
	float randomness;

	virtual void MakeExplosion( Event *ev );

public:
	CLASS_PROTOTYPE( MultiExploder );

	MultiExploder();
	virtual void Archive( Archiver &arc );
	virtual void Unarchive( Archiver &arc );
};

inline EXPORT_FROM_DLL void MultiExploder::Archive( Archiver &arc )
{
	Trigger::Archive( arc );

	arc.WriteFloat( explodewait );
	arc.WriteFloat( explode_time );
	arc.WriteFloat( duration );
	arc.WriteInteger( damage );
	arc.WriteFloat( attenuation );
	arc.WriteFloat( volume );
	arc.WriteFloat( randomness );
}

inline EXPORT_FROM_DLL void MultiExploder::Unarchive( Archiver &arc )
{
	Trigger::Unarchive( arc );

	arc.ReadFloat( &explodewait );
	arc.ReadFloat( &explode_time );
	arc.ReadFloat( &duration );
	arc.ReadInteger( &damage );
	arc.ReadFloat( &attenuation );
	arc.ReadFloat( &volume );
	arc.ReadFloat( &randomness );
}

void CreateExplosion( Vector pos,float damage = 120,float scale = 1.0f,qboolean bigexplosion = true,Entity *inflictor = NULL,Entity *attacker = NULL,Entity *ignore = NULL,
                      //### added variable MOD and falloff rate
                      int mod = MOD_ROCKETSPLASH,float falloff_rate = 0.5,
                      //###
                      float volume = 1.0f,float attenuation = ATTN_NORM,float r = 1.0f,float g = 0.2f,float b = 0.0f,float light_radius = 240,float life = 1,float decay = 0.95 );

void RadiusDamage( Entity *inflictorent,Entity *attackerent,int damage,Entity *ignoreent,
                   //### added variable MOD and falloff rate
                   int mod = MOD_ROCKETSPLASH,float falloff_rate = 0.5
                                                                   //###
                   );

void FlashPlayers( Vector org,float r,float g,float b,float a,float rad );

void FlashGogglesPlayers( Vector org, float rad ); //###

#endif /* explosion.h */
