//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/worldspawn.h                     $
// $Revision:: 21                                                             $
//   $Author:: Jimdose                                                        $
//     $Date:: 10/27/98 5:43a                                                 $
//
// 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/worldspawn.h                          $
//
// 21    10/27/98 5:43a Jimdose
// World wasn't calling Entity::Archive or Unarchive!
// Added FreeTargetList
//
// 20    10/25/98 11:53p Jimdose
// added EXPORT_TEMPLATE
//
// 19    10/10/98 1:34a Jimdose
// moved LoadAndExecScript to g_utils as G_LoadAndExecScript
//
// 18    9/21/98 4:21p Markd
// Put in archive functions and rewrote all archive routines
//
// 17    9/20/98 8:57p Jimdose
// Instanciated SafePtr for World.
//
// 16    9/02/98 7:49p Aldie
// Added support for multiple global scripts
//
// 15    8/17/98 4:36p Markd
// Added skipthread
//
// 14    8/08/98 7:52p Jimdose
// changed realWorld to world
//
// 13    5/26/98 4:20p Markd
// Added TargetList stuff
//
// 12    5/04/98 8:32p Markd
// Removed Setlightstyle stuff
//
// 11    5/04/98 12:28p Markd
// Moved lightstyles to global.scr
//
// 10    5/01/98 5:06p Jimdose
// Moved definition of world * to g_local.h so that it can be used more
// generally
//
// 9     3/23/98 1:33p Jimdose
// Revamped event and command system
//
// 8     3/02/98 8:49p Jimdose
// Changed CLASS_PROTOTYPE to only take the classname
//
// 7     2/06/98 5:48p Jimdose
// Moved sined header to .cpp file.
// Prepended "maps/" to script file name
//
// 6     2/03/98 10:56a Jimdose
// Updated to work with Quake 2 engine
// Moved initialization to constructor and removed Init function
// Removed precache stuff (it was all out of date anyway).
//
// 4     11/10/97 8:38p Jimdose
// Removed getMapTitle.  Map name is now stored in netname.
// Made StartFrame get called indirectly through EVENT_PRETHINK.
// Added event function.
//
// 3     10/27/97 2:59p Jimdose
// Removed dependency on quakedef.h
//
// 2     9/26/97 6:14p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// Base class for worldspawn objects.  This should be subclassed whenever
// a DLL has new game behaviour that needs to be initialized before any other
// entities are created, or before any entity thinks each frame.  Also controls
// spawning of clients.
//

#ifndef __WORLDSPAWN_H__
#define __WORLDSPAWN_H__

#include "entity.h"

class TargetList : public Class
{
public:
	CLASS_PROTOTYPE( TargetList );
	Container<Entity*>  list;
	str targetname;

	TargetList();
	TargetList( const str& tname );
	~TargetList();
	void     AddEntity( Entity* ent );
	void     RemoveEntity( Entity* ent );
	Entity*   GetNextEntity( Entity* ent );
};


class World : public Entity
{
private:
	Container<TargetList*> targetList;
public:
	CLASS_PROTOTYPE( World );

	World();
	~World();
	str skipthread;

	void        FreeTargetList( void );
	TargetList*  GetTargetList( const str& targetname );
	void        AddTargetEntity( const str& targetname, Entity* ent );
	void        RemoveTargetEntity( const str& targetname, Entity* ent );
	Entity*      GetNextEntity( const str& targetname, Entity* ent );
	void        ActivateTarget( const str& targetname ); //###
	virtual void Archive( Archiver& arc );
	virtual void Unarchive( Archiver& arc );
};


typedef SafePtr<World> WorldPtr;
extern WorldPtr world;

#endif /* worldspawn.h */
