/**
 * Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
 */

// Global gameplay stat defines

`if(`isdefined(INCLUDE_GAME_STATS))

	/*************************************
		GAME EVENTS
	*************************************/
	/** Match has started */
	const GAMEEVENT_MATCH_STARTED = 0;
	/** Match has ended */
	const GAMEEVENT_MATCH_ENDED = 1;
	/** Round has started */
	const GAMEEVENT_ROUND_STARTED = 2;
	/** Round has ended */
	const GAMEEVENT_ROUND_ENDED = 3;
	/** Game type defined */
	const GAMEEVENT_GAME_CLASS = 6;
	/** Game options defined */
	const GAMEEVENT_GAME_OPTION_URL = 7;
	/** Map name defined */
	const GAMEEVENT_GAME_MAPNAME = 8;
	
	/*************************************
		SYSTEM STATS
	*************************************/
	/** Memory usage */
	const GAMEEVENT_MEMORYUSAGE_POLL = 35;
	/** Frame rate */
	const GAMEEVENT_FRAMERATE_POLL = 36;
	/** Network usage in */
	const GAMEEVENT_NETWORKUSAGEIN_POLL = 37;
	/** Network usage out */
	const GAMEEVENT_NETWORKUSAGEOUT_POLL = 38;
	/** Ping */
	const GAMEEVENT_PING_POLL = 39;
	/** Render thread time */
	const GAMEEVENT_RENDERTHREAD_POLL = 40;
	/** Game thread time */
	const GAMEEVENT_GAMETHREAD_POLL = 41;
	/** GPU frame time */
	const GAMEEVENT_GPUFRAMETIME_POLL = 42;
	/** Total frame time */
	const GAMEEVENT_FRAMETIME_POLL = 43;

	/*************************************
		TEAM EVENTS
	*************************************/
	/** Team created */
	const GAMEEVENT_TEAM_CREATED = 50;
	/** Team score recorded */
	const GAMEEVENT_TEAM_GAME_SCORE = 51;
	/** Match has been won */
	const GAMEEVENT_TEAM_MATCH_WON = 4;
	/** Round has been won */
	const GAMEEVENT_TEAM_ROUND_WON = 5;
	/** Round stalemate */
	const GAMEEVENT_TEAM_ROUND_STALEMATE = 52;

	/*************************************
		PLAYER EVENTS
	*************************************/
	/** Player logged in */
	const GAMEEVENT_PLAYER_LOGIN = 100;
	/** Player logged out */
	const GAMEEVENT_PLAYER_LOGOUT = 101;
	/** Player has just spawned in */
	const GAMEEVENT_PLAYER_SPAWN = 102;
	/** Player on winning team */
	const GAMEEVENT_PLAYER_MATCH_WON = 103;
	/** Player killed another player */
	const GAMEEVENT_PLAYER_KILL = 104;
	/** Player location poll */
	const GAMEEVENT_PLAYER_LOCATION_POLL = 105;
	/** Player has changed teams */
	const GAMEEVENT_PLAYER_TEAMCHANGE = 106;
	/** Kill streak recorded */
	const GAMEEVENT_PLAYER_KILL_STREAK = 107;
	/** Player died */
	const GAMEEVENT_PLAYER_DEATH = 108;
	/** Player winning round */
	const GAMEEVENT_PLAYER_ROUND_WON = 109;
	/** Player stalemate round */
	const GAMEEVENT_PLAYER_ROUND_STALEMATE = 110;

	/** Weapon damage has occurred */
	const GAMEEVENT_WEAPON_DAMAGE = 150;
	/** Weapon melee damage has occurred */
	const GAMEEVENT_WEAPON_DAMAGE_MELEE = 151;
	/** Weapon has been fired */
	const GAMEEVENT_WEAPON_FIRED = 152;

	/** Kill types (add others to derived class) */
	const GAMEEVENT_PLAYER_KILL_NORMAL = 200; 

	/** generic param list event range (300-400) */
	const GAMEEVENT_GENERIC_PARAM_LIST_START = 300;
	const GAMEEVENT_GENERIC_PARAM_LIST_END = 400;

	/** Game specific starts here */
	const GAMEEVENT_GAME_SPECIFIC = 1000;

	/** Only 16 bits of events are possible */
	const GAMEEVENT_MAX_EVENTID = 0x0000FFFF;
`endif


// these are defines so that we don't have to recompile every time one of these is added
`define GAMEEVENT_AI_PATH_FAILURE 302 
`define GAMEEVENT_AI_FIRELINK 305

// mirror the EGameplayEventType enum in GameplayEventsUtilities.h
`define GET_GameString			0
`define GET_GameInt				1
`define GET_TeamInt				2
`define GET_PlayerInt			3
`define GET_PlayerFloat			4
`define GET_PlayerString		5
`define GET_PlayerSpawn			6
`define GET_PlayerLogin			7
`define GET_PlayerLocationPoll	8
`define GET_PlayerKillDeath		9
`define GET_PlayerPlayer		10
`define GET_WeaponInt			11
`define GET_DamageInt			12
`define GET_ProjectileInt		13
`define GET_GenericParamList	14
`define GET_GameFloat			15
`define GET_TeamString			16
`define GET_TeamFloat			17
`define GET_GamePosition		18
`define GET_GameAggregate		19
`define GET_TeamAggregate		20
`define GET_PlayerAggregate		21
`define GET_WeaponAggregate		22
`define GET_DamageAggregate		23
`define GET_ProjectileAggregate	24
`define GET_PawnAggregate		25
`define GET_GameType			1000 // Game Specific Values start after this


// Change this or predefine it to your class type
`if(`notdefined(StatsClass))
	`define StatsClass class'GameplayEventsWriterBase'
`endif

`define StatId(Id) `StatsClass.const.GAMEEVENT_`Id
`define TeamStatId(Id) `StatsClass.const.GAMEEVENT_TEAM_`Id
`define PlayerStatId(Id) `StatsClass.const.GAMEEVENT_PLAYER_`Id
`define KillStatType(Type) `StatsClass.const.GAMEEVENT_PLAYER_KILL_`Type

`if(`notdefined(StatsContext))

	`if(`isdefined(GAMEINFO))
		`define StatsContext		GameplayEventsWriter
		`define ValidStatsContext	GameplayEventsWriter != None && GameplayEventsWriter.IsSessionInProgress()
	`else
		`define StatsContext		WorldInfo.Game.GameplayEventsWriter
		`define ValidStatsContext	WorldInfo.Game != None && WorldInfo.Game.GameplayEventsWriter != None && WorldInfo.Game.GameplayEventsWriter.IsSessionInProgress()
	`endif

`endif

// Macros for recording stats	
`define RecordLoginChange(Id,Player,PlayerName,PlayerId,bSplitScreen) if(`ValidStatsContext){`StatsContext.LogPlayerLoginChange(`PlayerStatId(`Id),`Player,`PlayerName,`PlayerId,`bSplitScreen);}

// Game stats
`define RecordGameIntStat(Id,Value) if(`ValidStatsContext){`StatsContext.LogGameIntEvent(`StatId(`Id),`Value);}
`define RecordGameStringStat(Id,Value) if(`ValidStatsContext){`StatsContext.LogGameStringEvent(`StatId(`Id),`Value);}
`define RecordGameFloatStat(Id,Value) if(`ValidStatsContext){`StatsContext.LogGameFloatEvent(`StatId(`Id),`Value);}
`define RecordGamePositionStat(Id,Position,Value) if(`ValidStatsContext){`StatsContext.LogGamePositionEvent(`StatId(`Id),`Position,`Value);}

// Team stats
`define RecordTeamStringStat(Id, TeamInfo, Value) if(`ValidStatsContext){`StatsContext.LogTeamStringEvent(`TeamStatId(`Id),`TeamInfo,`Value);}
`define RecordTeamIntStat(Id, TeamInfo, Value) if(`ValidStatsContext){`StatsContext.LogTeamIntEvent(`TeamStatId(`Id),`TeamInfo,`Value);}
`define RecordTeamFloatStat(Id, TeamInfo, Value) if(`ValidStatsContext){`StatsContext.LogTeamFloatEvent(`TeamStatId(`Id),`TeamInfo,`Value);}

// Player stats
`define RecordPlayerIntStat(Id,Player,Value) if(`ValidStatsContext){`StatsContext.LogPlayerIntEvent(`PlayerStatId(`Id),`Player,`Value);}
`define RecordPlayerIntStatRaw(Id,Player,Value) if(`ValidStatsContext){`StatsContext.LogPlayerIntEvent(`Id,`Player,`Value);}
`define RecordPlayerFloatStat(Id,Player,Value) if(`ValidStatsContext){`StatsContext.LogPlayerFloatEvent(`PlayerStatId(`Id),`Player,`Value);}
`define RecordPlayerSpawn(Player,PawnClass,Team) if(`ValidStatsContext){`StatsContext.LogPlayerSpawnEvent(`PlayerStatId(SPAWN),`Player,`PawnClass,`Team);}
`define RecordPlayerPlayerEvent(Id,Player,Target) if(`ValidStatsContext){`StatsContext.LogPlayerPlayerEvent(`PlayerStatId(`Id),`Player,`Target);}

// Weapon stats
`define RecordKillEvent(KillType,Killer,DamageType,Dead) if(`ValidStatsContext){`StatsContext.LogPlayerKillDeath(`PlayerStatId(KILL),`KillStatType(`KillType),`Killer,`DamageType,`Dead);}
`define RecordDeathEvent(KillType,Killer,DamageType,Dead) if(`ValidStatsContext){`StatsContext.LogPlayerKillDeath(`PlayerStatId(DEATH),`KillStatType(`KillType),`Dead,`DamageType,`Killer);}

`define RecordWeaponIntStat(Id,Player,Weapon,Value) if(`ValidStatsContext){`StatsContext.LogWeaponIntEvent(`StatId(`Id),`Player,`Weapon,`Value);}

`define RecordProjectileIntStat(Id,Player,Proj,Value) if(`ValidStatsContext){`StatsContext.LogProjectileIntEvent(`StatId(`Id),`Player,`Proj,`Value);}

`define RecordDamage(Id,Player,Damage,Target,Amount) if(`ValidStatsContext){`StatsContext.LogDamageEvent(`StatId(`Id),`Player,`Damage,`Target,`Amount);}

`if(`notdefined(FINAL_RELEASE))
`define RecordAIPathFailEvent(Bot,Reason,Dest) if(`ValidStatsContext){`StatsContext.RecordAIPathFail(`Bot,`Reason,`Dest);}
`else
`define RecordAIPathFailEvent(Bot,Reason,Dest)
`endif