//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#ifndef TFC_MAPITEMS_H
#define TFC_MAPITEMS_H
#ifdef _WIN32
#pragma once
#endif


#include "tfc_shareddefs.h"


class CTFCPlayer;


/*==================================================*/
/* CTF Support defines 								*/
/*==================================================*/
#define CTF_FLAG1 		1
#define CTF_FLAG2 		2
#define CTF_DROPOFF1 	3
#define CTF_DROPOFF2 	4
#define CTF_SCORE1   	5
#define CTF_SCORE2   	6


// Defines for GoalItem Removing from Player Methods
#define GI_DROP_PLAYERDEATH	  0		// Dropped by a dying player
#define GI_DROP_REMOVEGOAL	  1		// Removed by a Goal
#define GI_DROP_PLAYERDROP	  2		// Dropped by a player


// Defines for methods of GoalItem returning
#define GI_RET_DROP_DEAD 	0		// Dropped by a dead player
#define GI_RET_DROP_LIVING 	1		// Dropped by a living player
#define GI_RET_GOAL			2		// Returned by a Goal
#define GI_RET_TIME			3		// Returned due to timeout


// Defines for Goal States
#define TFGS_ACTIVE		1 
#define TFGS_INACTIVE	2 
#define TFGS_REMOVED	3 
#define TFGS_DELAYED	4


// Defines for Goal Result types : goal_result
#define TFGR_SINGLE				1  // Goal can only be activated once
#define TFGR_ADD_BONUSES		2 	// Any Goals activated by this one give their bonuses
#define TFGR_ENDGAME			4 	// Goal fires Intermission, displays scores, and ends level
#define TFGR_NO_ITEM_RESULTS	8	// GoalItems given by this Goal don't do results
#define TFGR_REMOVE_DISGUISE	16 // Prevent/Remove undercover from any Spy
#define TFGR_FORCE_RESPAWN		32 // Forces the player to teleport to a respawn point
#define TFGR_DESTROY_BUILDINGS	64 // Destroys this player's buildings, if anys


// Defines for Goal Item types, : goal_activation (in items)
#define TFGI_GLOW			1   // Players carrying this GoalItem will glow
#define TFGI_SLOW			2   // Players carrying this GoalItem will move at half-speed
#define TFGI_DROP			4   // Players dying with this item will drop it
#define TFGI_RETURN_DROP	8   // Return if a player with it dies
#define TFGI_RETURN_GOAL	16  // Return if a player with it has it removed by a goal's activation
#define TFGI_RETURN_REMOVE	32  // Return if it is removed by TFGI_REMOVE
#define TFGI_REVERSE_AP		64  // Only pickup if the player _doesn't_ match AP Details
#define TFGI_REMOVE			128 // Remove if left untouched for 2 minutes after being dropped
#define TFGI_KEEP			256 // Players keep this item even when they die
#define TFGI_ITEMGLOWS		512	// Item glows when on the ground
#define TFGI_DONTREMOVERES	1024 // Don't remove results when the item is removed
#define TFGI_DROPTOGROUND	2048 // Drop To Ground when spawning
#define TFGI_CANBEDROPPED	4096 // Can be voluntarily dropped by players
#define TFGI_SOLID			8192 // Is solid... blocks bullets, etc


// For all these defines, see the tfortmap.txt that came with the zip
// for complete descriptions.
// Defines for Goal Activation types : goal_activation (in goals)
#define TFGA_TOUCH			1  // Activated when touched
#define TFGA_TOUCH_DETPACK	2  // Activated when touched by a detpack explosion
#define TFGA_REVERSE_AP		4  // Activated when AP details are _not_ met
#define TFGA_SPANNER		8  // Activated when hit by an engineer's spanner
#define TFGA_DROPTOGROUND	2048 // Drop to Ground when spawning


// Defines for Goal Effects types : goal_effect
#define TFGE_AP				  1  // AP is affected. Default.
#define TFGE_AP_TEAM		  2  // All of the AP's team.
#define TFGE_NOT_AP_TEAM	  4  // All except AP's team.
#define TFGE_NOT_AP			  8  // All except AP.
#define TFGE_WALL			  16 // If set, walls stop the Radius effects
#define TFGE_SAME_ENVIRONMENT 32 // If set, players in a different environment to the Goal are not affected
#define TFGE_TIMER_CHECK_AP	  64 // If set, Timer Goals check their critera for all players fitting their effects


class CTFBaseItem : public CBaseAnimating
{
public:

	bool	CheckExistence();


public:

	int group_no;
	int goal_no;
	int goal_state;		// TFGS_
	// Goal/Timer/GoalItem/Trigger existence checking
	int		ex_skill_min;			// Exists when the skill is >= this value
	int		ex_skill_max;			// Exists when the skill is <= this value
	string_t teamcheck;			 // TeamCheck entity that should be checked
};


class CTFGoal : public CTFBaseItem
{
public:
	DECLARE_CLASS( CTFGoal, CBaseAnimating );
	DECLARE_DATADESC();

	void	Spawn( void );
	void	StartGoal( void );
	void	PlaceGoal( void );
	void	Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
	void	tfgoal_touch( CBaseEntity *pOther );

	void	DelayedResult();

	Class_T	Classify ( void ) { return CLASS_TFGOAL; }

	void	SetObjectCollisionBox( void );

	void tfgoal_timer_tick();
	void DoRespawn();


public:
	//TFCTODO: lots of these variables need to be put in the FGD file.
	int goal_effects;	// TFGE_
	int goal_result;	// TFGR_

	int playerclass; // One of the PC_ defines.

	float	t_length;			// Goal Criteria radius check

	// NOTE: In CTFGoal, these are overridden to mean: if they're not zero, then this goal only
	// affects players...
	int maxammo_shells;	// ... with that team number
	int maxammo_nails;	// ... without that team number

	int ammo_shells;
	int ammo_nails;
	int ammo_rockets;
	int ammo_cells;
	int ammo_medikit;
	int ammo_detpack;
	int no_grenades_1;
	int no_grenades_2;

	// Replacement_Model Stuff 
	string_t	replacement_model;
	int			replacement_model_body;
	int			replacement_model_skin;
	int			replacement_model_flags;

	// Item Displaying details
	int		 display_item_status[4]; // Goal displays the status of these items
	string_t team_str_home;				// Displayed when the item is at home base
	string_t team_str_moved;		  // Displayed when the item has been moved
	string_t team_str_carried;     // Displayed when the item is being carried
	string_t non_team_str_home;			// Displayed when the item is at home base
	string_t non_team_str_moved;	  // Displayed when the item has been moved
	string_t non_team_str_carried; // Displayed when the item is being carried

	float invincible_finished;
	float invisible_finished;
	float super_damage_finished;
	float radsuit_finished;

	int lives;
	int frags;
	float	wait;

	float	search_time;		// Timer goal delay
	int	    item_list;			// Used to keep track of which goalitems are 
								// affecting the player at any time.
								// GoalItems use it to keep track of their own 
								// mask to apply to a player's item_list

	float	drop_time;		// Time spent untouched before item return
	float		armortype;
	int			armorvalue;
	int			armorclass;			// Type of armor being worn;

	int		count;			// Change teamscores
	
	// Goal Size
	Vector  goal_min;
	Vector  goal_max;

	bool m_bAddBonuses;
	
	int items;
	int items_allowed;
	
	int else_goal;
	int if_goal_is_active;
	int if_goal_is_inactive;
	int if_goal_is_removed;
	int if_group_is_active;
	int if_group_is_inactive;
	int if_group_is_removed;

	int		speed_reduction;
	
	int return_item_no;
	int if_item_has_moved;
	int if_item_hasnt_moved;
	
	int has_item_from_group;
	int hasnt_item_from_group;
	
	int goal_activation;
	int delay_time;
	int weapon;
	string_t owned_by_teamcheck;
	int owned_by;
	string_t noise;
	
	// Spawnpoint behaviour
	int     remove_spawnpoint;
	int     restore_spawnpoint;
	int     remove_spawngroup;
	int     restore_spawngroup;

	// These are the old centerprinting methods.
	// They now print using the large fancy text
	string_t broadcast;						// Centerprinted to all, overridden by the next two
	string_t team_broadcast;				// Centerprinted to AP's team members, but not the AP
	string_t non_team_broadcast; 			// Centerprinted to non AP's team members
	string_t owners_team_broadcast;			// Centerprinted to the members of the team that own the Goal/Item
	string_t non_owners_team_broadcast;		// Centerprinted to the members of the team that don't own the Goal/Item
	string_t team_drop;						// Centerprinted to item owners team
	string_t non_team_drop;					// Centerprinted to everone not on item owners team

	// These are new fields that print the old fashioned centerprint method
	string_t org_broadcast;						// Centerprinted to all, overridden by the next two
	string_t org_team_broadcast;				// Centerprinted to AP's team members, but not the AP
	string_t org_non_team_broadcast; 			// Centerprinted to non AP's team members
	string_t org_owners_team_broadcast;			// Centerprinted to the members of the team that own the Goal/Item
	string_t org_non_owners_team_broadcast;		// Centerprinted to the members of the team that don't own the Goal/Item
	string_t org_team_drop;						// Centerprinted to item owners team
	string_t org_non_team_drop;					// Centerprinted to everone not on item owners team
	string_t org_message;						// Centerprinted to the AP upon activation
	string_t org_noise3;
	string_t org_noise4;
	// These still print the old centerprint fashion
	string_t netname_broadcast;				// same as above, prepended by AP netname and bprinted
	string_t netname_team_broadcast;			// same as above, prepended by AP netname and bprinted
	string_t netname_non_team_broadcast; 	// same as above, prepended by AP netname and bprinted
	string_t netname_owners_team_broadcast;  // same as above, prepended by AP netname and bprinted
	string_t netname_team_drop;			// same as above, prepended by AP netname and bprinted
	string_t netname_non_team_drop;  // same as above, prepended by AP netname and bprinted
	string_t speak;							// VOX Spoken to Everyone
	string_t AP_speak;						// VOX Spoken the AP
	string_t team_speak;					// VOX Spoken to AP's team_members, including the AP
	string_t non_team_speak; 				// VOX Spoken to non AP's team_members
	string_t owners_team_speak;				// VOX Spoken to members of the team that own this Goal
	string_t non_owners_team_speak;			// VOX Spoken to everyone bit the members of the team that own this Goal

	float	 m_flEndRoundTime;
	string_t m_iszEndRoundMsg_Team1_Win;
	string_t m_iszEndRoundMsg_Team2_Win;
	string_t m_iszEndRoundMsg_Team3_Win;
	string_t m_iszEndRoundMsg_Team4_Win;
	string_t m_iszEndRoundMsg_Team1_Lose;
	string_t m_iszEndRoundMsg_Team2_Lose;
	string_t m_iszEndRoundMsg_Team3_Lose;
	string_t m_iszEndRoundMsg_Team4_Lose;
	string_t m_iszEndRoundMsg_Team1;
	string_t m_iszEndRoundMsg_Team2;
	string_t m_iszEndRoundMsg_Team3;
	string_t m_iszEndRoundMsg_Team4;
	string_t m_iszEndRoundMsg_OwnedBy;
	string_t m_iszEndRoundMsg_NonOwnedBy;

	int 	all_active;
	int		last_impulse;		// The previous impulse command from this player

	int	    activate_goal_no;
	int	    inactivate_goal_no;
	int	    remove_goal_no;
	int	    restore_goal_no;
	int	    activate_group_no;
	int	    inactivate_group_no;
	int	    remove_group_no;
	int	    restore_group_no;

	BOOL    do_triggerwork;		// Overrides for trigger handling in TF Goals
	string_t killtarget;	// Remove ents with this target
	string_t	target;	

	string_t	message;

	// Score increases
	int		increase_team[4];			// Increase the scores of teams
	int		increase_team_owned_by;		// Increase the score of the team that owns this entity

	EHANDLE enemy;

	Vector oldorigin;
	int		axhitme;		// Remove item from AP

	int remove_item_group;
};
 

class CTFGoalItem : public CTFGoal
{
public:
	void	Spawn( void );
	void	StartItem( void );
	void	PlaceItem( void );

	Class_T	Classify ( void ) { return CLASS_TFGOAL_ITEM; }

	void item_tfgoal_touch( CBaseEntity *pOther );
	void tfgoalitem_droptouch();
	void tfgoalitem_dropthink();
	void tfgoalitem_remove();

	void DoDrop( Vector vecOrigin );


public:

	float m_flDroppedAt;

	float speed;
	int speed_reduction;

	float distance;
	float pain_finished;
	float attack_finished;

	Vector	redrop_origin;	// Original drop position
	int		redrop_count;	// Number of time's we redropped.
};


class CTFTimerGoal : public CTFGoal
{
public:
	void	Spawn( void );

	Class_T	Classify ( void ) { return CLASS_TFGOAL_TIMER; }
};


class CTFSpawn : public CTFBaseItem
{
public:
	void	Spawn( void );
	void	Activate( void );
	Class_T	Classify ( void ) { return CLASS_TFSPAWN; }
	BOOL	CheckTeam( int iTeamNo );

	EHANDLE m_pTeamCheck;
};


class CBaseDelay : public CTFGoal
{
public:
	DECLARE_CLASS( CBaseDelay, CTFGoal );

	void SUB_UseTargets( CBaseEntity *pActivator, USE_TYPE useType, float value );
	void KeyValue( KeyValueData *pkvd );
	void DelayThink( void );
	virtual bool KeyValue( const char *szKeyName, const char *szValue );

public:
	float m_flDelay;
	string_t m_iszKillTarget;
	int button;
};


class CTeamCheck : public CBaseDelay
{
public:
	void Spawn( void );
	void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
	BOOL TeamMatches( int iTeam );
};


// Global functions.
CTFGoalItem* Finditem(int ino);
void DisplayItemStatus(CTFGoal *Goal, CTFCPlayer *Player, CTFGoalItem *Item);


#endif // TFC_MAPITEMS_H
