global Map =
{
	Bunker_flag = "CHECKPOINT_bunker_spawn_flag",

	Destroy_Left_Wall = "PLANT_Left_Wall",
	Destroy_Tunnel_Wall = "PLANT_Tunnel_Wall",
	Destroy_Safe_Door = "PLANT_Safe_Door",

	Build_Fence = "BUILD_fence",
	Destroy_Fence = "PLANT_fence",
	Build_Allied_CP = "BUILD_Command_Post",
	Destroy_Allied_CP = "PLANT_Command_Post",
	Build_Axis_CP = "BUILD_Command_Post",
	Destroy_Axis_CP = "PLANT_Command_Post",

	Tank_Status = 0,
	LeftWall_Status = 0,
	TunnelWall_Status = 0,
	MainGate_Status = 0,
	BunkerFlag_Status = 0,
	SafeDoor_Status = 0,
	SecretDocs_Status = 0,
	Fence_Status = 0,
	CP_Status = 0,

	Allies_Capture_Flag = function( trigger )
	{
		Map.BunkerFlag_Status = 1;
		if ( Map.SafeDoor_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				Map.Destroy_Safe_Door,
				"DEFEND_AlliedSafeDefend.*",
			});
		}
		else
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				"ATTACK_AlliedFenceAttack",
				"ATTACK_AlliedRadarAttack.*",
			});
		}
		if ( Map.Fence_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_AxisRadarTunnelDefend.*" );
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_AxisRadarDefend.*" );
		}

		SetAvailableMapGoals( TEAM.ALLIES, false, Map.Bunker_flag );
		SetAvailableMapGoals( TEAM.ALLIES, true, "SNIPE_AlliedBunkerSnipe1" );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"PLANTMINE_AlliedBeachMine1",
			"DEFEND_AlliedLeftWallDefend1",
			"SMOKEBOMB_bunker_.*",
			"DEFEND_AlliedTunnelDefend1",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_fence" );

		SetAvailableMapGoals( TEAM.AXIS, true, {
			Map.Bunker_flag,
			"DEFEND_AxisRadarDefend.*",
			"DEFEND_AxisRadarMineFieldDefend1",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"CALLARTILLERY_BunkerBeachWindow.*",
			"ARTILLERY_S_AxisArtyTarget.*",
			"DEFEND_AxisBunkerDefend.*",
			"DEFEND_AxisTunnelDefend.*",
			"DEFEND_AxisLeftWallDefend.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, "PLANTMINE_AxisRadarMine.*" );
		Util.MapDebugPrint( "Allies_Capture_Flag" );
	},
	Axis_Capture_Flag = function( trigger )
	{
		Map.BunkerFlag_Status = 0;
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Bunker_flag );
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Bunker_flag );

		SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_fence" );
		if( Map.SafeDoor_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				Map.Destroy_Safe_Door,
				"DEFEND_AlliedSafeDefend.*",
			});
		}
		SetAvailableMapGoals( TEAM.ALLIES, false, "SNIPE_AlliedBunkerSnipe1" );
		if( Map.TunnelWall_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "PLANTMINE_AlliedBeachMine1" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_AlliedTunnelDefend1" );
		}
		if( Map.LeftWall_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_AlliedLeftWallDefend1" );
		}
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_AlliedFenceAttack",
			"ATTACK_AlliedRadarAttack.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "SMOKEBOMB_bunker_.*" );

		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_AxisRadarDefend.*",
			"DEFEND_AxisRadarMineFieldDefend1",
			"DEFEND_AxisRadarTunnelDefend.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"CALLARTILLERY_BunkerBeachWindow.*",
			"ARTILLERY_S_AxisArtyTarget.*",
			"DEFEND_AxisBunkerDefend.*",
		});
		Util.MapDebugPrint( "Axis_Capture_Flag" );
	},

	Tank_Repaired = function( trigger )
	{
		Map.TankStatus = 1;
		SetAvailableMapGoals( TEAM.ALLIES, false, "BUILD_tank" );
		if( Map.MainGateStatus == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "MOUNT_tank" );
		}
		Util.MapDebugPrint( "Tank_Repaired" );
	},
	Tank_Destroyed = function( trigger )
	{
		Map.TankStatus = 0;
		Util.SetPositionGoal( "BUILD_Tank", "MOVER_tank" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_tank" );
		SetAvailableMapGoals( TEAM.ALLIES, false, "MOUNT_tank" );
		Util.MapDebugPrint("Tank_Destroyed");
	},
	Tank_At_Location = function( trigger )
	{
		switch(Map.VehicleLocation)
		{
			case 1:
			{
				ETUtil.SetExcludeIndexes("BUILD_Tank");
				ETUtil.SetExcludeIndexes("MOUNT_tank");
			}
		}

		Util.MapDebugPrint("tank at location " + Map.VehicleLocation, true);
	},

	Left_Wall_Destroyed = function( trigger )
	{
		Map.LeftWall_Status = 1;
		if( Map.BunkerFlag_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, Map.Bunker_flag );
		}
		if( Map.SafeDoor_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				Map.Destroy_Safe_Door,
				"DEFEND_AlliedSafeDefend.*",
			});
		}
		SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_leftwall" );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Destroy_Left_Wall,
			"DEFEND_AlliedLeftWallDefend.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_AxisLeftWallDefend1" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_AxisLeftWallDefend2",
			"DEFEND_AxisBunkerDefend2",
		});
		Util.MapDebugPrint( "Left_Wall_Destroyed" );
	},
	Tunnel_Wall_Destroyed = function( trigger )
	{
		Map.TunnelWall_Status = 1;
		if( Map.BunkerFlag_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, Map.Bunker_flag );
		}
		if( Map.SafeDoor_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				Map.Destroy_Safe_Door,
				"DEFEND_AlliedSafeDefend.*",
			});
		}
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Destroy_Tunnel_Wall,
			"DEFEND_AlliedLeftWallDefend1",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_AxisTunnelDefend1" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_AxisTunnelDefend2",
			"DEFEND_AxisBunkerDefend1",
		});
		Util.MapDebugPrint( "Tunnel_Wall_Destroyed" );
	},

	Main_Gate_Destroyed = function( trigger )
	{
		Map.MainGateStatus = 1;
		if( Map.BunkerFlag_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, Map.Bunker_flag );
		}
		if( Map.SafeDoor_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				Map.Destroy_Safe_Door,
				"DEFEND_AlliedSafeDefend.*",
			});
		}
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"BUILD_tank",
			"MOUNT_tank",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_AxisBunkerDefend1",
			"DEFEND_AxisBunkerDefend2",
		});
		Util.MapDebugPrint( "Main_Gate_Destroyed" );
	},

	Safe_Door_Destroyed = function( trigger )
	{
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"ATTACK_AlliedFenceAttack",
			"ATTACK_AlliedRadarAttack.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Destroy_Safe_Door,
			"DEFEND_AlliedSafeDefend.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"FLAG_SecretDocs",
			"CAPPOINT_SecretDocs",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_AxisSafeDoorAttack1" );
		Util.MapDebugPrint( "Safe_Door_Destroyed" );
	},

	Documents_Stolen = function( trigger )
	{
		Map.SecretDocs_Status = 1;
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_AxisRadarDefend.*" );
		Util.MapDebugPrint( "Documents_Stolen" );
	},
	Documents_Returned = function( trigger )
	{
		Map.SecretDocs_Status = 0;
		if( Map.BunkerFlag_Status == 0 )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_AxisRadarDefend.*" );
		}
		Util.MapDebugPrint( "Documents_Returned" );
	},

	Fence_Built = function( trigger )
	{
		Map.Fence_Status = 0;
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Destroy_Fence );
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Build_Fence );
		Util.MapDebugPrint( "Fence_Built" );
	},
	Fence_Destroyed = function( trigger )
	{
		Map.Fence_Status = 1;
		SetAvailableMapGoals( TEAM.ALLIES, false, Map.Destroy_Fence );
		SetAvailableMapGoals( TEAM.AXIS, true, Map.Build_Fence );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_AlliedRadarAttack.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_AxisRadarTunnelDefend.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_AxisRadarDefend.*",
			"DEFEND_AxisRadarMineFieldDefend1",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, "PLANTMINE_AxisFenceMine.*" );
		Util.MapDebugPrint( "Fence_Destroyed" );
	},

	Allied_CP_Built = function( trigger )
	{
		Map.CP_Status = 1;
		Util.MapDebugPrint( "Allied_CP_Built" );
	},
	Allied_CP_Destroyed = function( trigger )
	{
		Map.CP_Status = 0;
		Util.MapDebugPrint( "Allied_CP_Destroyed" );
	},

	Axis_CP_Built = function( trigger )
	{
		Map.CP_Status = 2;
		Util.MapDebugPrint( "Axis_CP_Built" );
	},
	Axis_CP_Destroyed = function( trigger )
	{
		Map.CP_Status = 0;
		Util.MapDebugPrint( "Axis_CP_Destroyed" );
	},
};

global OnMapLoad = function()
{
	OnTrigger( "The Tank has been repaired!", Map.Tank_Repaired );
	OnTrigger( "The Tank has been damaged!", Map.Tank_Destroyed );
	OnTrigger( "tank at location", Map.Tank_At_Location );
	l1 = OnTriggerRegion(AABB(826.247,744.792,63.125,1070.879,908.175,137.125), RegionTrigger.VehicleTrigger);

	OnTrigger( "Left Wall has been destroyed!", Map.Left_Wall_Destroyed );
	OnTrigger( "Tunnel Wall has been destroyed!", Map.Tunnel_Wall_Destroyed );
	OnTrigger( "Main Gate has been destroyed!", Map.Main_Gate_Destroyed );

	OnTrigger( "Allies captured Bunker!", Map.Allies_Capture_Flag );
	OnTrigger( "Axis reclaimed Bunker!", Map.Axis_Capture_Flag );

	OnTrigger( "Safe Door has been destroyed!", Map.Safe_Door_Destroyed );

	OnTrigger( "Allies have stolen Secret Documents!", Map.Documents_Stolen );
	OnTrigger( "Axis have returned Secret Documents!", Map.Documents_Returned );

	OnTrigger( "Fence has been built!", Map.Fence_Built );
	OnTrigger( "Fence has been destroyed!", Map.Fence_Destroyed );

	OnTrigger( "Allied Command Post constructed. Charge speed increased!", Map.Allied_CP_Built );
	OnTrigger( "Axis team has destroyed the Allied Command Post!", Map.Allied_CP_Destroyed );
	OnTrigger( "Axis Command Post constructed. Charge speed increased!", Map.Axis_CP_Built );
	OnTrigger( "Allied team has destroyed the Axis Command Post!", Map.Axis_CP_Destroyed );

	// Max users per goal
	Util.SetMaxUsersInProgress( 3, Map.Bunker_flag );
	Util.SetMaxUsers( 1, "BUILD_.*" );
	Util.SetMaxUsers( 1, "PLANT_.*" );
	Util.SetMaxUsers( 3, "FLAG_.*" );
	Util.SetMaxUsers( 1, "DEFEND_.*" );
	Util.SetMaxUsers( 1, "GRENADE_.*" );
	Util.SetMaxUsers( 0, "MOUNTMG42_.*" );

	// Usable offset indexes for vehicle goals
	ETUtil.SetExcludeIndexes( "BUILD_Tank", { 1,2,3,4,5 } );
	ETUtil.SetExcludeIndexes( "MOUNT_tank", { 1,2,3,4,5 } );

	// Allied goals
	SetAvailableMapGoals( TEAM.ALLIES, false, ".*" );

	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"SMOKEBOMB_bunker_.*",
		"GRENADE_rocks",
		"MOUNT_tank",
		"SNIPE_AlliedBeachSnipe1",
	});
	//SetAvailableMapGoals( TEAM.ALLIES, true, "PLANTMINE_AlliedBeachMine1" );
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		Map.Destroy_Safe_Door,
		Map.Destroy_Left_Wall,
		Map.Destroy_Tunnel_Wall,
		"DEFEND_AlliedLeftWallDefend.*",
		"DEFEND_AlliedTunnelDefend1",
		Map.Build_Allied_CP,
	});

	// Axis goals
	SetAvailableMapGoals( TEAM.AXIS, false, ".*" );

	SetAvailableMapGoals( TEAM.AXIS, true, {
		"MAP_ARTY_AxisArtyTarget1.*",
		Map.Build_Axis_CP,
		"DEFEND_BunkerBeachWindow1",
		"DEFEND_AxisTunnelDefend1",
		"DEFEND_AxisLeftWallDefend1",
		"PLANTMINE_AxisFenceMine.*",
	});

	MapRoutes =
	{
		FLAG_SecretDocs =
		{
			ROUTE_allied_spawn  =
			{
				ROUTE_left_tunnel  =
				{
					ROUTE_stairs1 = {},
					ROUTE_stairs2 = {},
					ROUTE_leftwall = {},
				},
			},
			ROUTE_maindoor  =
			{
				ROUTE_stairs1 = {},
				ROUTE_stairs2 = {},
				ROUTE_leftwall = {},
			},
		},
		DEFEND_AlliedLeftWallDefend1 =
		{
			ROUTE_allied_spawn  =
			{
				ROUTE_left_tunnel  =
				{
				},
			},
		},
		DEFEND_AlliedLeftWallDefend4 =
		{
			ROUTE_allied_spawn  =
			{
				ROUTE_right_tunnel  =
				{
				},
			},
		},
		CAPPOINT_SecretDocs =
		{
			ROUTE_objective  =
			{
				ROUTE_tunnel1  =
				{
				},
				ROUTE_tunnel3  =
				{
				},
				ROUTE_tunnel4  =
				{
				},
			},
		},
		PLANT_Fence =
		{
			ROUTE_bunker_spawn  =
			{
				ROUTE_tunnel1  =
				{
					ROUTE_tunnel2 =
					{
					},
				},
				ROUTE_rock  =
				{
				},
			},
			ROUTE_allied_spawn  =
			{
				ROUTE_right_tunnel  =
				{
				},
				ROUTE_left_tunnel  =
				{
				},
			},
		},
	};

	MapRoutes.DEFEND_AlliedLeftWallDefend2 = MapRoutes.DEFEND_AlliedLeftWallDefend1;
	MapRoutes.DEFEND_AlliedLeftWallDefend3 = MapRoutes.DEFEND_AlliedLeftWallDefend1;
	MapRoutes.DEFEND_AlliedLeftWallDefend5 = MapRoutes.DEFEND_AlliedLeftWallDefend1;
	MapRoutes.DEFEND_AlliedTunnelDefend1 = MapRoutes.DEFEND_AlliedLeftWallDefend4;
	MapRoutes.CAPPOINT_SecretDocs.ROUTE_droparea = MapRoutes.CAPPOINT_SecretDocs.ROUTE_objective;
	Util.Routes(MapRoutes);
	SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "ROUTE_.*" );
	SetAvailableMapGoals( TEAM.ALLIES, false, "ROUTE_leftwall" );

	Util.MapDebugPrint( "Omni-bot map script for No Mercy executed." );
};
