//     ____                _       __               
//    / __ )____  _____   | |     / /___ ___________
//   / __  / __ \/ ___/   | | /| / / __ `/ ___/ ___/
//  / /_/ / /_/ (__  )    | |/ |/ / /_/ / /  (__  ) 
// /_____/\____/____/     |__/|__/\__,_/_/  /____/  
//                                              
//       A futuristic real-time strategy game.
//          This file is part of Bos Wars.
//
/**@name trigger.h - The game trigger headerfile. */
//
//      (c) Copyright 2002-2007 by Lutz Sammer and Jimmy Salmon
//
//      This program 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; only version 2 of the License.
//
//      This program 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 this program; if not, write to the Free Software
//      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
//      02111-1307, USA.

#ifndef __TRIGGER_H__
#define __TRIGGER_H__

//@{

/*----------------------------------------------------------------------------
--  Declarations
----------------------------------------------------------------------------*/

class CUnit;
class CUnitType;
struct lua_State;
class CFile;

/**
**  Timer structure
*/
class CTimer {
public:
	CTimer() : Init(false), Running(false), Increasing(false), Cycles(0),
		LastUpdate(0) {}

	void Reset() {
		Init = false;
		Running = false;
		Increasing = false;
		Cycles = 0;
		LastUpdate = 0;
	}

	bool Init;                  /// timer is initialized
	bool Running;               /// timer is running
	bool Increasing;            /// increasing or decreasing
	long Cycles;                /// current value in game cycles
	unsigned long LastUpdate;   /// GameCycle of last update
};

#define ANY_UNIT ((const CUnitType *)0)
#define ALL_UNITS ((const CUnitType *)-1)
#define ALL_FOODUNITS ((const CUnitType *)-2)
#define ALL_BUILDINGS ((const CUnitType *)-3)


/**
**  Data to referer game info when game running.
*/
typedef struct {
	CUnit *Attacker;  /// Unit which send the missile.
	CUnit *Defender;  /// Unit which is hit by missile.
	CUnit *Active;    /// Unit which is selected or else under cursor unit.
} TriggerDataType;

/*----------------------------------------------------------------------------
--  Variables
----------------------------------------------------------------------------*/

extern CTimer GameTimer; /// the game timer

/// Some data accessible for script during the game.
extern TriggerDataType TriggerData;


/*----------------------------------------------------------------------------
--  Functions
----------------------------------------------------------------------------*/

extern int TriggerGetPlayer(lua_State *l);/// get player number.
extern const CUnitType *TriggerGetUnitType(lua_State *l); /// get the unit-type
extern bool TriggerMatchUnitType(const CUnit *unit, const CUnitType *triggerUnitType);
extern void TriggersEachCycle(void);    /// test triggers

extern void TriggerCclRegister(void);   /// Register ccl features
extern void SaveTriggers(CFile *file); /// Save the trigger module
extern void InitTriggers(void);         /// Setup triggers
extern void CleanTriggers(void);        /// Cleanup the trigger module

//@}

#endif // !__TRIGGER_H__
