//==========================================================================================
//
//	kharanthan.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	d00d	04 January 2011	Pretty much done.
//		TODO: Fix team door at wp id 299.
//	d00d	02 January 2011	Initial Script
//
//==========================================================================================
//

global Map =
{
	Debug = 0, // please set to zero before distributing your script
	DefendingTeam = TEAM.AXIS,

	Tank_Barrier_Dyno = 0,
	Tank_Barrier2_Dyno = 0,
	Town_Gate_Dyno = 0,

	Navigation =
	{
		quickjump =
		{
			// better response time than nav flags
			navigate = function(_this)
			{
				_this.Bot.PressButton(BTN.JUMP);
				yield();
			},
		},
		crouchjump =
		{
			navigate = function(_this)
			{
				_this.Bot.PressButton(BTN.JUMP);
				_this.Bot.HoldButton(BTN.CROUCH, 0.5);
				yield();
			},
		},
		door =
		{
			navigate = function(_this)
			{
				_this.AddAimRequest( Priority.High, "position", Vec3(1402,520,-1770) );
				_this.Bot.PressButton(BTN.USE);
				yield();
				_this.Bot.PressButton(BTN.USE);
				yield();
				_this.Bot.PressButton(BTN.USE);
				yield();
			},
		},
	},

	Tank_Built = function( trigger )
	{
		Util.MapDebugPrint( "Tank_Built" );
	},

	Tank_Barrier_Built = function( trigger )
	{
		Util.MapDebugPrint( "Tank_Barrier_Built" );
	},

	Tank_Barrier2_Built = function( trigger )
	{
		Util.MapDebugPrint( "Tank_Barrier2_Built" );
	},

	Town_Gate_Built = function( trigger )
	{
		Util.MapDebugPrint( "Town_Gate_Built" );
	},

	Tank_Barrier_Planted = function( trigger )
	{
		Map.Tank_Barrier_Dyno += 1;
		Util.MapDebugPrint( "Tank_Barrier_Planted" );
	},

	Tank_Barrier2_Planted = function( trigger )
	{
		Map.Tank_Barrier2_Dyno += 1;
		Util.MapDebugPrint( "Tank_Barrier2_Planted" );
	},

	Town_Gate_Planted = function( trigger )
	{
		Map.Town_Gate_Dyno += 1;
		Util.MapDebugPrint( "Town_Gate_Planted" );
	},

	Tank_Barrier_Defused = function( trigger )
	{
		Map.Tank_Barrier_Dyno -= 1;
		Util.MapDebugPrint( "Tank_Barrier_Defused" );
	},

	Tank_Barrier2_Defused = function( trigger )
	{
		Map.Tank_Barrier2_Dyno -= 1;
		Util.MapDebugPrint( "Tank_Barrier2_Defused" );
	},

	Town_Gate_Defused = function( trigger )
	{
		Map.Town_Gate_Dyno -= 1;
		Util.MapDebugPrint( "Town_Gate_Defused" );
	},

	Tank_Barrier_Destroyed = function( trigger )
	{
		Map.Tank_Barrier_Dyno = 0;

		Util.MapDebugPrint( "Tank_Barrier_Destroyed" );
	},

	Tank_Barrier2_Destroyed = function( trigger )
	{
		Map.Tank_Barrier2_Dyno = 0;

		Util.MapDebugPrint( "Tank_Barrier2_Destroyed" );
	},

	Tank_Past_Barrier1 = function( trigger )
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_tb1.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_tb2.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_tb1.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_tb2.*" );
		Util.MapDebugPrint( "Tank_Past_Barrier1" );
	},

	Tank_Past_Barrier2 = function( trigger )
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_tb2.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_hq.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_tb2.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_hq.*",
			"PLANTMINE_alley.*",
			"PLANTMINE_backdoor.*",
			"PLANTMINE_frontdoor.*",
		});
		Util.MapDebugPrint( "Tank_Past_Barrier2" );
	},

	Town_Gate_Destroyed = function( trigger )
	{
		Map.Town_Gate_Dyno = 0;

		Util.MapDebugPrint( "Town_Gate_Destroyed" );
	},

	Docs_Accessible = function( trigger )
	{
		SetMapGoalProperties( "MOUNT_Tank", {AimMode = "random"} );
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_tb.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_hq.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_tb.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_hq.*" );
		iw1 = OnTriggerRegion( AABB(2303.863,2031.539,-1816.039,2435.173,2156.698,-1664.466), RegionTrigger.IntrusionWarning );
		iw2 = OnTriggerRegion( AABB(2136.427,2477.799,-1786.485,2273.273,2638.421,-1686.592), RegionTrigger.IntrusionWarning );
		iw3 = OnTriggerRegion( AABB(2768.811,2105.022,-1797.775,2896.143,2197.293,-1694.848), RegionTrigger.IntrusionWarning );
		Util.MapDebugPrint( "Docs_Accessible" );
	},

	Vietcong_Documents_Taken = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_hq.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_cp.*" );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"BUILD_Tank",
			"MOUNT_Tank",
			"ATTACK_hq.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_cp.*" );
		Util.MapDebugPrint( "Vietcong_Documents_Taken" );
	},

	Vietcong_Documents_Returned = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_hq.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_cp.*" );
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_cp.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_hq.*" );
		Util.MapDebugPrint( "Vietcong_Documents_Returned" );
	},

	Vietcong_Documents_Secured = function( trigger )
	{
		Util.MapDebugPrint( "Vietcong_Documents_Secured" );
	},

	dbg = function( )
	{
		while(true)
		{
			DrawDebugLine( Vec3(1402,520,-1783), Vec3(1402,520,-1770), COLOR.BLUE, 0.25 );
			yield();
		}
	},

};

global OnMapLoad = function()
{
	// Register callback functions
	OnTrigger( "The tank has been repaired!", Map.Tank_Built );
	OnTrigger( "^hThe First Tank Barrier has been constructed!", Map.Tank_Barrier_Built );
	OnTrigger( "^hThe Second Tank Barrier has been constructed!", Map.Tank_Barrier2_Built );
	OnTrigger( "^hThe Town Gate has been built!", Map.Town_Gate_Built );
	OnTrigger( "Planted at the MISSING_STRING.", Map.Tank_Barrier_Planted );
	OnTrigger( "Planted at the MISSING_STRING.", Map.Tank_Barrier2_Planted );
	OnTrigger( "Planted at the MISSING_STRING.", Map.Town_Gate_Planted );
	OnTrigger( "Defused at the MISSING_STRING.", Map.Tank_Barrier_Defused );
	OnTrigger( "Defused at the MISSING_STRING.", Map.Tank_Barrier2_Defused );
	OnTrigger( "Defused at the MISSING_STRING.", Map.Town_Gate_Defused );
	OnTrigger( "^iThe First Tank Barrier has been destroyed!", Map.Tank_Barrier_Destroyed );
	OnTrigger( "goldrush_axis_tank_barrier1", Map.Tank_Past_Barrier1 );
	OnTrigger( "^iThe Second Tank Barrier has been destroyed!", Map.Tank_Barrier2_Destroyed );
	OnTrigger( "goldrush_axis_tank_barrier2", Map.Tank_Past_Barrier2 );
	OnTrigger( "^iThe Town Gate has been destroyed!", Map.Town_Gate_Destroyed );
	OnTrigger( "^qViet Cong must defend the HQ and the documents!", Map.Docs_Accessible );
	OnTrigger( "Allies have stolen The Vietcong Documents!", Map.Vietcong_Documents_Taken );
	OnTrigger( "Flag returned Vietcong Documents!", Map.Vietcong_Documents_Returned );
	OnTrigger( "Marines team has secured the documents!", Map.Vietcong_Documents_Secured );

	Util.DisableGoal( "DEFEND_.*" );
	Util.DisableGoal( "ATTACK_.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_tb1.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_tb1.*" );

	SetGoalPriority( "BUILD_Tank_Barrier", 0.91 );
	SetGoalPriority( "BUILD_Tank", 0.91 );
	SetGoalPriority( "BUILD_Neutral_Command_Post", 0.7 );
	SetGoalPriority( "PLANT_Neutral_Command_Post", 0.7 );
	SetGoalPriority( "PLANT_Tank_Barrier", 0.82 );
	SetGoalPriority( "PLANT_Tank_Barrier_1", 0.81 );
	SetGoalPriority( "PLANT_Town_Gate", 0.81, 0, CLASS.COVERTOPS );

	// Max users per goal
	Util.SetMaxUsers( 1, "PLANT_.*" );
	Util.SetMaxUsers( 1, "BUILD_.*" );
	Util.SetMaxUsers( 2, "BUILD_Tank" );
	Util.SetMaxUsers( 1, "DEFEND_.*" );
	Util.SetMaxUsers( 1, "GRENADE_.*" );
	Util.SetMaxUsers( 1, "MOUNTMG42_.*" );
	Util.SetMaxUsers( 3, "FLAG_Vietcong_Documents" );

	Util.AddUsePoint( "BUILD_Tank_Barrier_1", Vec3(3750,-695,-1789) ); // better cover
	Util.AddUsePoint( "PLANT_Town_Gate", { Vec3(3250,-795,-1789), Vec3(3250,-695,-1789) } );

	// Camp times
	SetMapGoalProperties( "MOUNTMG42_.*", {MinCampTime=15, MaxCampTime=90} );
	SetMapGoalProperties( "MOBILEMG42_.*", {MinCampTime=10, MaxCampTime=60} );

	MapRoutes =
	{
		PLANT_Town_Gate = {
			ROUTE_allied_spawn = {
				ROUTE_yard = {},
				ROUTE_gate_right = {
					ROUTE_corner = {},
					ROUTE_window = {}
				},
				ROUTE_street_left = {},
				ROUTE_door_left = {},
				ROUTE_window = {}
			}
		},
		PLANT_Tank_Barrier = {
			ROUTE_allied_spawn = {
				ROUTE_street_left = {},
				ROUTE_gate_right = {},
				ROUTE_mast = { ROUTE_house_right = {} }
			}
		},
		FLAG_Vietcong_Documents = {
			ROUTE_allied_spawn = {
				ROUTE_street_left = {},
				ROUTE_alley = { ROUTE_alley2 = { ROUTE_backdoor = {} } },
				ROUTE_gate_right = { ROUTE_alley2 = { ROUTE_backdoor = {} } },
				ROUTE_alley2 = { ROUTE_backdoor = {} }
		}
		},
		CAPPOINT_Huey = {
			ROUTE_objective = {
				ROUTE_frontdoor = {
					ROUTE_street_left = {},
					ROUTE_gate_right = {}
				},
				ROUTE_backdoor = {
					ROUTE_alley2 = {
						ROUTE_gate_right = {}
					}
				},
			},
			ROUTE_frontdoor = {
				ROUTE_street_left = {},
				ROUTE_gate_right = {}
			}
		},
	};
	Util.Routes(MapRoutes);

	// thread( Map.dbg );
	Util.MapDebugPrint( "Omni-bot map script for Kha-Ran-Than executed." );
};

global OnBotJoin = function( bot )
{
	bot.MaxViewDistance = 3500;
};
