/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team

This file is part of OpenMoHAA source code.

OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

OpenMoHAA source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

// spawners.h: Various spawning entities

#pragma once

#include "g_local.h"
#include "scriptslave.h"

class SpawnArgs;

class Spawn : public ScriptSlave
	{
   private:
  		str      modelname;
      str      spawntargetname;
      str      spawntarget;
      str      pickup_thread;
      str      spawnitem;
      float    spawnchance;
      int      attackmode;
   
		void           SetAngleEvent( Event *ev );
      void           SetPickupThread( Event *ev );
      void           ModelName( Event *ev );
      void           SpawnTargetName( Event *ev );
      void           SpawnTarget( Event *ev );
      void           AttackMode( Event *ev );
      void           SetSpawnItem( Event *ev );
      void           SetSpawnChance( Event *ev );

   protected:
      void           SetArgs( SpawnArgs &args );
      virtual void DoSpawn( Event *ev );

	public:
      CLASS_PROTOTYPE( Spawn );


							Spawn();
	   void Archive( Archiver &arc ) override;
	};

inline void Spawn::Archive
	(
	Archiver &arc
	)
   {
   ScriptSlave::Archive( arc );

   arc.ArchiveString( &modelname );
   arc.ArchiveString( &spawntargetname );
   arc.ArchiveString( &spawntarget );
   arc.ArchiveString( &pickup_thread );
   arc.ArchiveString( &spawnitem );
   arc.ArchiveFloat( &spawnchance );
   arc.ArchiveInteger( &attackmode );
   }

class RandomSpawn : public Spawn
	{
   private:
      float    min_time;
      float    max_time;

      void           MinTime( Event *ev );
      void           MaxTime( Event *ev );
      void           ToggleSpawn( Event *ev );
      void           Think( Event *ev );

	public:
      CLASS_PROTOTYPE( RandomSpawn );


							RandomSpawn();
	   void Archive( Archiver &arc ) override;
	};

inline void RandomSpawn::Archive
	(
	Archiver &arc
	)
   {
   Spawn::Archive( arc );

   arc.ArchiveFloat( &min_time );
   arc.ArchiveFloat( &max_time );
   }

class ReSpawn : public Spawn
	{
   protected:
		void DoSpawn( Event *ev ) override;
 	public:
      CLASS_PROTOTYPE( ReSpawn );
	};

class SpawnOutOfSight : public Spawn
	{
   protected:
		void DoSpawn( Event *ev ) override;
 	public:
      CLASS_PROTOTYPE( SpawnOutOfSight );
	};

class SpawnChain : public Spawn
	{
   protected:
		void DoSpawn( Event *ev ) override;
 	public:
      CLASS_PROTOTYPE( SpawnChain );
	};
