global Map =
{
	GoldIsStolen = false,
	Barrier1IsBuilt = false,
	Barrier2IsBuilt = false,
	GateIsIntact = true,

	EscortVehicle =
	{
		Truck =
		{
			EscortVehicleGoalName = "MOVER_truck",
			LimitBots = 1,
			Offset =
			{
				Vector3(0,-40,0),
				Vector3(-50,0,0),
			}
		}
	},

	OnFlagTake = function()
	{
		if ( Map.GoldIsStolen)
		{
			return;
		}
		SetAvailableMapGoals(TEAM.AXIS, false, "ATTACK_AFlag.*");
		SetAvailableMapGoals(TEAM.ALLIES, false, "ATTACK_Flag.*");
		SetAvailableMapGoals(TEAM.ALLIES, true, "ATTACK_BFlag.*");
		SetAvailableMapGoals(TEAM.AXIS, true, {
			"ATTACK_Flag.*",
			"BUILD_Neutral_Command_Post",
		});

		Util.MapDebugPrint("OnFlagTake");
	},

	OnFlagRet = function()
	{
		if ( Map.GoldIsStolen)
		{
			return;
		}
		SetAvailableMapGoals(TEAM.AXIS, true, "ATTACK_AFlag.*");
		SetAvailableMapGoals(TEAM.ALLIES, true, "ATTACK_Flag.*");
		SetAvailableMapGoals(TEAM.ALLIES, false, "ATTACK_BFlag.*");
		SetAvailableMapGoals(TEAM.AXIS, false, "ATTACK_Flag.*");

		Util.MapDebugPrint("OnFlagRet");
	},

	OnFlagSec = function()
	{
		Map.GateIsIntact = false;

		SetAvailableMapGoals(TEAM.ALLIES, false, "CHECKPOINT_flag1_flag");
		SetAvailableMapGoals(TEAM.AXIS, false, "CHECKPOINT_flag1_flag");
		if ( Map.GoldIsStolen)
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "MOVER_truck" );
			return;
		}

		SetAvailableMapGoals(TEAM.ALLIES, false, {
			"ATTACK_BFlag.*",
			"ATTACK_Flag.*",
		});
		SetAvailableMapGoals(TEAM.ALLIES, true, {
			"ATTACK_CPA.*",
			"BUILD_Neutral_Command_Post",
			"BUILD_Truck",
			"CAPPOINT_236",
			"FLAG_keycard_flag",
			"PLANT_Neutral_Command_Post",
			"PLANT_Side_Door",
			"SNIPE_CPA.*",
			"ROUTE_maindoor_right",
			"ROUTE_maindoor_left",
			"ROUTE_generator",
			"ATTACK_KeyA.*",
		});

		SetAvailableMapGoals(TEAM.AXIS, true, "ATTACK_Keyd.*");
		SetAvailableMapGoals(TEAM.AXIS, false, {
			"ATTACK_AFlag.*",
			"ATTACK_Flag.*",
			"PLANTMINE_Amine.*",
		});
		SetAvailableMapGoals(TEAM.AXIS, true, {
			"ATTACK_CPB.*",
			"BUILD_Neutral_Command_Post",
			"BUILD_Truck_Barrier_1",
			"PLANT_Neutral_Command_Post",
		});

		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.91, TEAM.AXIS, CLASS.COVERTOPS );
		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.91, TEAM.ALLIES, CLASS.COVERTOPS );

		Util.MapDebugPrint("OnFlagSec");
	},

	OnSide = function()
	{
		SetAvailableMapGoals(TEAM.ALLIES, true, {
			"BUILD_Neutral_Command_Post",
			"PLANT_Neutral_Command_Post",
			"FLAG_keycard_flag",
			"ATTACK_KeyA.*",
			"CAPPOINT_236",
			"ROUTE_sidedoor_right",
			"ROUTE_sidedoor_left",
			"ROUTE_sidedoor",
		});
		SetAvailableMapGoals(TEAM.AXIS, true, {
			"ATTACK_Keyd.*",
			"BUILD_Neutral_Command_Post",
			"PLANT_Neutral_Command_Post",
		});
		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.91, TEAM.AXIS, CLASS.COVERTOPS );
		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.91, TEAM.ALLIES, CLASS.COVERTOPS );

		Util.MapDebugPrint("OnSide");
	},

	OnAllCP = function()
	{
		SetAvailableMapGoals(TEAM.AXIS, false, "PLANT_Neutral_Command_Post");
		SetAvailableMapGoals(TEAM.ALLIES, true, "BUILD_Truck");

		//disables CommandPost-Attack etc
		SetAvailableMapGoals(TEAM.ALLIES, false, {
			"SNIPE_CPA.*",
			"ATTACK_CPA.*",
		});
		SetAvailableMapGoals(TEAM.AXIS, false, "ATTACK_CPB.*");

		//enables Keycard-Attack
		SetAvailableMapGoals(TEAM.ALLIES, true, "ATTACK_KeyA.*");
		SetAvailableMapGoals(TEAM.AXIS, true, "ATTACK_Keyd.*");

		Util.MapDebugPrint("OnAllCP");
	},

	OnKeyStolen = function()
	{
		SetAvailableMapGoals(TEAM.AXIS, true, "ATTACK_cappoint.*");
		SetAvailableMapGoals(TEAM.ALLIES, true, "ATTACK_cappoint.*");
		Util.MapDebugPrint("OnKeyStolen");
	},

	OnKeyReturned = function()
	{
		SetAvailableMapGoals(TEAM.ALLIES, true, "ATTACK_KeyA.*");
		SetAvailableMapGoals(TEAM.ALLIES, false, "ATTACK_cappoint.*");
		SetAvailableMapGoals(TEAM.AXIS, true, "ATTACK_Keyd.*");
		SetAvailableMapGoals(TEAM.AXIS, false, "ATTACK_cappoint.*");
		Util.MapDebugPrint("OnKeyReturned");
	},

	OnKeySec = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_cappoint.*",
			"ATTACK_KeyA.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"ATTACK_TruckA.*",
			"BUILD_Truck",
			"MOVER_truck",
			"PLANT_Truck_Barrier_1",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"ATTACK_cappoint.*",
			"ATTACK_Keyd.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_TruckD.*",
			"BUILD_Truck_Barrier_1",
		});

		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.6, TEAM.AXIS, CLASS.COVERTOPS );
		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.6, TEAM.ALLIES, CLASS.COVERTOPS );

		Util.MapDebugPrint("OnKeySec");
	},

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

	OnTruckStolen = function()
	{
		Map.GoldIsStolen = true;
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_truckpath1.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_truckpath1.*" );
		Util.MapDebugPrint("OnTruckStolen");
	},

	TruckAtFirstBarrier =
	{
		TriggerOnEntity = GetGoal("MOVER_truck").GetEntity(),
		OnEnter = function(ent)
		{
			if ( Map.Barrier1IsBuilt )
			{
				SetAvailableMapGoals( TEAM.ALLIES, false, "MOVER_truck" );
			}
			SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_.*" );
			SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_truckpath2.*" );
			SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_.*" );
			SetAvailableMapGoals( TEAM.AXIS, true, {
				"ATTACK_truckpath2.*",
				"BUILD_Truck_Barrier_2",
			});
			// print(GetEntName(ent), "entered");

		},
		OnExit = function(ent)
		{
			// print(GetEntName(ent), "exited");
		},
	},

	FirstBarConst = function()
	{
		Map.Barrier1IsBuilt = true;
		Util.MapDebugPrint("FirstBarConst");
	},

	FirstBarDest = function()
	{
		Map.Barrier1IsBuilt = false;
		if ( Map.GoldIsStolen )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "MOVER_truck" );
		}
		Util.MapDebugPrint("FirstBarDest");
	},

	PlantFirstBar = function()
	{
		if ( RandInt(1,2) > 1 )
		{
			Util.SetGoalPosition( 1400, 1054, 70, "PLANT_Truck_Barrier_1" );
		}
		else
		{
			Util.SetGoalPosition( 1060, 1054, 70, "PLANT_Truck_Barrier_1" );
		}
		Util.MapDebugPrint("PlantFirstBar");
	},

	OnFirstBar = function()
	{

		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_.*",
			"ATTACK_KeyA.*",
			"PLANT_Truck_Barrier_1",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"ATTACK_SecBa.*",
			"ATTACK_truckpath3.*",
			"PLANT_Truck_Barrier_2",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"ATTACK_.*",
			"ATTACK_Keyd.*",
			"BUILD_Truck_Barrier_1",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_SecBa.*",
			"ATTACK_truckpath3.*",
			"BUILD_Truck_Barrier_2",
		});

		Util.MapDebugPrint("OnFirstBar");
	},

	TruckAtGate =
	{
		TriggerOnEntity = GetGoal("MOVER_truck").GetEntity(),
		OnEnter = function(ent)
		{
			if ( Map.GateIsIntact )
			{
				SetAvailableMapGoals( TEAM.ALLIES, false, "MOVER_truck" );
			}
			// print(GetEntName(ent), "entered");

		},
		OnExit = function(ent)
		{
			// print(GetEntName(ent), "exited");
		},
	},

	TruckAtSecondBarrier =
	{
		TriggerOnEntity = GetGoal("MOVER_truck").GetEntity(),
		OnEnter = function(ent)
		{
			if ( Map.Barrier2IsBuilt )
			{
				SetAvailableMapGoals( TEAM.ALLIES, false, "MOVER_truck" );
			}
			SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_.*" );
			SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_truckpath4.*" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_truckpath4_9" );
			SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_.*" );
			SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_truckpath4.*" );
			// print(GetEntName(ent), "entered");

		},
		OnExit = function(ent)
		{
			// print(GetEntName(ent), "exited");
		},
	},

	PlantSecBar = function()
	{
		if ( RandInt(1,2) > 1 )
		{
			Util.SetGoalPosition( -1103, 447, 70, "PLANT_Truck_Barrier_2" );
		}
		else
		{
			Util.SetGoalPosition( -1380, 468, 70, "PLANT_Truck_Barrier_2" );
		}
		Util.MapDebugPrint("PlantSecBar");
	},

	SecBarConst = function()
	{
		Map.Barrier2IsBuilt = true;
		Util.MapDebugPrint("SecBarConst");
	},

	SecBarDest = function()
	{
		Map.Barrier2IsBuilt = false;
		if ( Map.GoldIsStolen )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "MOVER_truck" );
		}
		Util.MapDebugPrint("SecBarDest");
	},

	OnSecBar = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_.*",
			"PLANT_Truck_Barrier_2",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_truckpath5.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"ATTACK_.*",
			"BUILD_Truck_Barrier_2",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_truckpath5.*" );

		Util.MapDebugPrint("OnSecBar");
	},
};

global OnMapLoad = function()
{
	/*** TRIGGERS ***/
	OnTrigger("The Allies have captured the forward bunker!", Map.OnFlagTake);
	OnTrigger("The Axis have reclaimed the forward bunker!", Map.OnFlagRet);
	OnTrigger("The main gate has been destroyed!", Map.OnFlagSec);
	OnTrigger("The side door has been destroyed!", Map.OnSide);
	OnTrigger("Allied Command Post constructed. Charge speed increased!", Map.OnAllCP);
	OnTrigger("Allies have stolen the Keycard!", Map.OnKeyStolen);
	OnTrigger("Flag returned keycard_flag!", Map.OnKeyReturned);
	// OnTrigger("The Allies have captured the keycard. The generator has been started!", Map.OnKeyCap);
	OnTrigger("Allied team has gained access to the truck!", Map.OnKeySec);
	OnTrigger("The Truck has been repaired!", Map.OnTruckrep);
	OnTrigger("Planted at Truck Barrier #1.", Map.PlantFirstBar);
	OnTrigger("goldrush_axis_truck_barrier1", Map.OnFirstBar);
	OnTrigger("Truck Barrier #1 has been constructed.", Map.FirstBarConst);
	OnTrigger("Truck Barrier #1 has been destroyed.", Map.FirstBarDest);
	OnTrigger("Truck Barrier #2 has been constructed.", Map.SecBarConst);
	OnTrigger("Truck Barrier #2 has been destroyed.", Map.SecBarDest);
	OnTrigger("Planted at Truck Barrier #2.", Map.PlantSecBar);
	OnTrigger("goldrush_axis_truck_barrier2", Map.OnSecBar);
	OnTrigger("goldrush_axis_truck_stolen", Map.OnTruckStolen);

	tb1 = OnTriggerRegion( Vector3(1600,670,90), 100, Map.TruckAtFirstBarrier );
	tb2 = OnTriggerRegion( Vector3(-730,1850,90), 100, Map.TruckAtSecondBarrier );
	tgate = OnTriggerRegion( Vector3(-1250,940,90), 100, Map.TruckAtGate );

	SetGoalPriority( "ATTACK_cappoint.*", 0.6, TEAM.AXIS );
	SetGoalPriority( "PLANTMINE.*", 0.7 );

	SetMapGoalProperties( "ATTACK_.*", {MinCampTime=5, MaxCampTime=30} );
	SetMapGoalProperties( "DEFEND_.*", {MinCampTime=15, MaxCampTime=30} );

	/*** MAX USERS ***/
	Util.SetMaxUsers( 3, "FLAG_.*" );
	Util.SetMaxUsers( 3, "CHECKPOINT.*" );
	Util.SetMaxUsers( 1, "PLANT_.*" );
	Util.SetMaxUsers( 1, "BUILD_.*" );
	Util.SetMaxUsers( 1, "MOUNTMG42_.*" );

	SetAvailableMapGoals( TEAM.AXIS, false, ".*" );
	SetAvailableMapGoals( TEAM.ALLIES, false, ".*" );

	SetAvailableMapGoals(TEAM.ALLIES, true, {
		"PLANT_Main_Gate",
		"PLANT_Side_Door",
		"CHECKPOINT_flag1_flag",
		"ATTACK_Flag.*",
	});

	//Axis Flag Defense First Stage
	SetAvailableMapGoals(TEAM.AXIS, true, {
		"ATTACK_AFlag.*",
		"PLANTMINE_Amine.*",
		"CHECKPOINT_flag1_flag",
	});

	if ( RandInt(1,2) > 1 )
	{
		Util.SetGoalPosition( 1400, 1054, 70, "PLANT_Truck_Barrier_1" );
		Util.SetGoalPosition( -1380, 468, 70, "PLANT_Truck_Barrier_2" );
	}
	else
	{
		Util.SetGoalPosition( 1060, 1054, 70, "PLANT_Truck_Barrier_1" );
		Util.SetGoalPosition( -1103, 447, 70, "PLANT_Truck_Barrier_2" );
	}

	mainGate = GetGoal("PLANT_Main_Gate");
	if ( mainGate )
	{
		mainGate.AddUsePoint( Vector3(-967, 1610, 80) );
		mainGate.AddUsePoint( Vector3(-880, 1620, 80) );
	}

	MapRoutes =
	{
		PLANT_Main_Gate =
		{
			ROUTE_allied_spawn  =
			{
				ROUTE_spawn_east  =
				{
					ROUTE_flag_east  =
					{
					},
					ROUTE_flag_west1  =
					{
					},
					ROUTE_flag_west2  =
					{
					},
				},
				ROUTE_house  =
				{
				},
				ROUTE_flag_west1  =
				{
				},
			},
		},
		FLAG_keycard_flag =
		{
			ROUTE_flag =
			{
				ROUTE_sidedoor =
				{
					ROUTE_sidedoor_left = {},
					ROUTE_sidedoor_right = {}
				},
				ROUTE_maindoor_left =
				{
					ROUTE_generator = {}
				},
				ROUTE_maindoor_right = {}
			},
			ROUTE_cp =
			{
				ROUTE_cp_front = {},
				ROUTE_cp_right = {},
				ROUTE_balcony = {},
				ROUTE_stairs = {}
			}
		},
		PLANT_Truck_Barrier_1 =
		{
			ROUTE_cp =
			{
				ROUTE_cp_front = {},
				ROUTE_cp_right = {},
				ROUTE_balcony = {},
				ROUTE_stairs = {}
			}
		},
		ATTACK_truckpath4_1 =
		{
			ROUTE_axis_spawn =
			{
				ROUTE_garage = {},
				ROUTE_secondfloor = {}
			}
		},
		BUILD_Neutral_Command_Post =
		{
			ROUTE_flag =
			{
				ROUTE_sidedoor =
				{
					ROUTE_sidedoor_left = {},
					ROUTE_sidedoor_right = {}
				},
				ROUTE_maindoor_left =
				{
					ROUTE_generator = {}
				},
				ROUTE_maindoor_right = {}
			}
		}
	};

	MapRoutes.CHECKPOINT_flag1_flag = MapRoutes.PLANT_Main_Gate;
	MapRoutes.ATTACK_FlagA = MapRoutes.CHECKPOINT_flag1_flag;
	MapRoutes.ATTACK_FlagA1 = MapRoutes.CHECKPOINT_flag1_flag;
	MapRoutes.PLANT_Side_Door = MapRoutes.PLANT_Main_Gate;
	MapRoutes.ATTACK_truckpath4_2 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_3 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_5 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_6 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_7 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_8 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath4_10 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_1 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_2 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_3 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_4 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_5 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_6 = MapRoutes.ATTACK_truckpath4_1;
	MapRoutes.ATTACK_truckpath5_7 = MapRoutes.ATTACK_truckpath4_1;
	Util.Routes(MapRoutes);
	SetAvailableMapGoals( TEAM.AXIS, true, "ROUTE_.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_.*" );
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"ROUTE_maindoor.*",
		"ROUTE_sidedoor.*",
	});

	Util.MapDebugPrint("OnMapLoad");
};

global OnBotJoin = function( _bot )
{
};
