global Map =
{
	// Conditionals/customization
	TankRampDyno = 0,
	BunkerDyno = 0,
	TankIsPastBunker = false,
	TankIsPastBarrier = false,
	StationSpawnIsPermanent = false,
	StationSpawnAllied = false,
	BarricadeIsBuilt = true,
	Talk = true,
	Debug = false,

	// Store some goal name strings
	Build_Allied_Command_Post = "BUILD_Allied_Command_Post",
	Build_Axis_Command_Post = "BUILD_Axis_Command_Post",
	Build_Barricade = "BUILD_Barricade",
	Build_Roadblock = "BUILD_Roadblock",
	Build_Tank_Barrier = "BUILD_Tank_Barrier",
	Build_Tiger_Tank = "BUILD_Tiger_Tank",

	Plant_Allied_Command_Post = "PLANT_Allied_Command_Post",
	Plant_Axis_Command_Post = "PLANT_Axis_Command_Post",
	Plant_Bunker_Debris = "PLANT_Bunker_Debris",
	Plant_Collapsed_Tunnel = "PLANT_Collapsed_Tunnel",
	Plant_Footbridge = "PLANT_Footbridge",
	Plant_Railway_Tunnel = "PLANT_Railway_Tunnel",
	Plant_Roadblock = "PLANT_Roadblock",
	Plant_Tank_Barrier = "PLANT_Tank_Barrier",
	Plant_Wrecked_Footbridge = "PLANT_Wrecked_Footbridge",

	Explode_Barricade = "EXPLODE_Barricade",
	Checkpoint_station_flag = "CHECKPOINT_station_flag",

	Mount_bunker_MG = "MOUNTMG42_727",
	Repair_bunker_MG = "REPAIRMG42_727",
	Mount_train_mg42 = "MOUNTMG42_train_mg42",
	Repair_train_mg42 = "REPAIRMG42_train_mg42",

	Mover_tank = "MOVER_tank",
	Bird1 = "MOVER_bird1",
	Bird2 = "MOVER_bird2",
	Bird3 = "MOVER_bird3",
	Bird4 = "MOVER_bird4",

	// Keep these movers
	Movers =
	{
		"MOVER_tank",
		"MOVER_bird1",
		"MOVER_bird2",
		"MOVER_bird3",
		"MOVER_bird4",
	},

	Switches =
	{
		cargo_door =
		{
			Debug = false,
			Enabled = false,
			Priority = 0.9,
			WaypointName = "cargo_door",
			LimitBots = 1,
			LimitDistance = 2000,
			LimitTeam = Util.AllTeams,
			LimitClass = Util.AllClasses,
			Timeout = 1000,
		},
	},

	// *** TRIGGER CALLBACKS ***

	Barricade_Built = function( trigger )
	{
		Map.BarricadeIsBuilt = true;
		SetAvailableMapGoals( TEAM.ALLIES, false, "ROUTE_barricade" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ROUTE_barricade" );
		Util.MapDebugPrint( "Barricade_Built" );
	},

	Barricade_Destroyed = function( trigger )
	{
		Map.BarricadeIsBuilt = false;
		SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_barricade" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ROUTE_barricade" );
		Util.MapDebugPrint( "Barricade_Destroyed" );
	},

	station_flag_Axis_Captured = function( trigger )
	{
		Map.StationSpawnAllied = false;
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_checkpoint.*",
			"SNIPE_checkpoint.*",
			"MOBILEMG42_start.*",
			"DEFEND_start.*",
			"SNIPE_start.*",
			Map.Build_Roadblock,
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"GRENADE_barrier1",
			"GRENADE_barrier2",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"DEFEND_checkpoint.*",
			"SNIPE_checkpoint.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Plant_Roadblock );
		Util.MapDebugPrint( "station_flag_Axis_Captured" );
	},

	station_flag_Allies_Captured = function( trigger )
	{
		Map.StationSpawnAllied = true;
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_start.*",
			"SNIPE_start.*",
			"MOBILEMG42_start.*",
			"DEFEND_checkpoint.*",
			"SNIPE_checkpoint.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, "GRENADE_barrier1" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "GRENADE_barrier2" );
		SetAvailableMapGoals( TEAM.ALLIES, false, Map.Plant_Roadblock );
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Build_Roadblock );
		Util.MapDebugPrint( "station_flag_Allies_Captured" );
	},

	StationPermanent = function( trigger )
	{
		Map.StationSpawnAllied = true;
		Map.StationSpawnIsPermanent = true;
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"GRENADE_barrier1",
			"GRENADE_barrier2",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_checkpoint.*",
			"SNIPE_checkpoint.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"SNIPE_checkpoint.*",
			"DEFEND_checkpoint.*",
			Map.Plant_Roadblock,
			Map.Checkpoint_station_flag,
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Map.Checkpoint_station_flag,
			Map.Build_Roadblock,
			Map.Build_Barricade,
		});
		Util.MapDebugPrint( "StationPermanent" );
	},

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

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

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

	Tiger_Tank_Damaged = function( trigger )
	{
		Util.SetPositionGoal( "BUILD_Tiger_Tank", "MOVER_tank" );
		Util.MapDebugPrint( "Tiger_Tank_Damaged", true );
	},

	Tank_In_First_Tunnel = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_footbridge.*",
			"DEFEND_footbridge.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_start.*",
			"SNIPE_start.*",
		});
		Util.MapDebugPrint( "Tank_In_First_Tunnel" );
	},

	Footbridge_Destroyed = function( trigger )
	{
		Wp.SetWaypointFlag("footbridge18", "closed", false);
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Plant_Wrecked_Footbridge );
		Util.MapDebugPrint( "Footbridge_Destroyed" );
	},

	Wrecked_Footbridge_Destroyed = function( trigger )
	{
		Wp.SetWaypointFlag("footbridge18", "closed", true);
		Util.MapDebugPrint( "Wrecked_Footbridge_Destroyed" );
	},

	Tank_Past_Footbridge = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_start.*",
			"SNIPE_start.*",
			"DEFEND_footbridge.*",
			"SNIPE_footbridge.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_tb.*",
			"DEFEND_tb.*",
			Map.Build_Tank_Barrier,
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Plant_Tank_Barrier );
		SetGoalPriority("DEFEND_start.*", 0.5);
		Util.MapDebugPrint( "Tank_Past_Footbridge" );
	},

	Build_Tank_Ramp = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_tank_ramp.*",
			"SNIPE_tank_ramp.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_ramp" );
		SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_ramp" );
		Util.MapDebugPrint( "Build_Tank_Ramp" );
	},

	Tank_Ramp_Built = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_tank_ramp.*",
			"SNIPE_tank_ramp.*",
		});
		SetGoalPriority("DEFEND_start.*", 0.45);
		Util.MapDebugPrint( "Tank_Ramp_Built" );
	},

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

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

	Tank_Ramp_Destroyed = function( trigger )
	{
		Map.TankRampDyno = 0;
		Util.MapDebugPrint( "Tank_Ramp_Destroyed" );
	},

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

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

	Tank_past_Barrier = function( trigger )
	{
		Map.TankIsPastBarrier = true;
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_tunnel.*",
			"SNIPE_tunnel.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"MOBILEMG42_start.*",
			"DEFEND_tb.*",
			"SNIPE_tb.*",
			"DEFEND_tank_ramp.*",
			"SNIPE_tank_ramp.*",
		});
		Util.MapDebugPrint( "Tank_past_Barrier" );
	},

	Tank_at_Corner = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_2ndTankPath.*",
			"SNIPE_2ndTankPath.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Build_Tank_Barrier );
		SetAvailableMapGoals( TEAM.ALLIES, false, Map.Plant_Tank_Barrier );
		SetGoalPriority("DEFEND_start.*", 0.4);
		SetGoalPriority("DEFEND_2ndTankPath.*", 0.55);
		Util.MapDebugPrint( "Tank_at_Corner" );
	},

	Tunnel_Dyno_Enabled = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_after_tunnel6",
			"DEFEND_after_tunnel7",
			"SNIPE_after_tunnel6",
			"SNIPE_after_tunnel7",
		});
		Util.SetGoalPosition( 1800,-767,32, Map.Plant_Railway_Tunnel );
		SetAvailableMapGoals( TEAM.AXIS, true, Map.Plant_Railway_Tunnel );
		SetAvailableMapGoals( TEAM.ALLIES, false, "BUILD_ramp" );
		SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_ramp" );
		Map.doorthreadid = thread( Map.testTraceLineThread );
		Map.Switches.cargo_door.Enabled = true;
		Util.MapDebugPrint( "Tunnel_Dyno_Enabled" );
	},

	Railway_Tunnel_Destroyed = function( trigger )
	{
		// Path across tunnel rubble is open now
		Wp.SetWaypointFlag("tunnel_debris1", "closed", false);
		Wp.SetWaypointFlag("tunnel_debris2", "closed", false);
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Plant_Collapsed_Tunnel );
		Util.MapDebugPrint( "Railway_Tunnel_Destroyed" );
	},

	Railway_Tunnel_Cleared = function( trigger )
	{
		// Path across tunnel rubble is closed again
		Wp.SetWaypointFlag("tunnel_debris1", "closed", true);
		Wp.SetWaypointFlag("tunnel_debris2", "closed", true);
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_after_tunnel.*",
			"SNIPE_after_tunnel.*",
		});
		Util.MapDebugPrint( "Railway_Tunnel_Cleared" );
	},

	Tank_at_Tunnel = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"SNIPE_tb.*",
			"DEFEND_tb.*",
			"DEFEND_2ndTankPath.*",
			"SNIPE_2ndTankPath.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_tunnel.*",
			"SNIPE_tunnel.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Build_Tank_Barrier );
		SetAvailableMapGoals( TEAM.ALLIES, false, Map.Plant_Tank_Barrier );
		Util.MapDebugPrint( "Tank_at_Tunnel" );
	},

	Tank_past_Tunnel = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"SNIPE_tunnel.*",
			"DEFEND_tunnel.*",
			"DEFEND_2ndTankPath.*",
			"SNIPE_2ndTankPath.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_after_tunnel.*",
			"SNIPE_after_tunnel.*",
		});
		Util.MapDebugPrint( "Tank_past_Tunnel" );
	},

	Bunker_Dyno_Enabled = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			Map.Mount_bunker_MG,
			Map.Repair_bunker_MG,
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"SNIPE_tunnel.*",
			"DEFEND_tunnel.*",
			"DEFEND_2ndTankPath.*",
			"SNIPE_2ndTankPath.*",
			"DEFEND_after_tunnel.*",
			"SNIPE_after_tunnel.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_bunker.*",
			"DEFEND_bunker.*",
			"MOBILEMG42_bunker.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Checkpoint_station_flag );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Plant_Tank_Barrier,
			Map.Checkpoint_station_flag,
		});
		Util.MapDebugPrint( "Bunker_Dyno_Enabled" );

		threadKill( Map.doorthreadid );
		Map.Switches.cargo_door.Enabled = false;
		sleep(1);
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Map.Mount_train_mg42,
			Map.Repair_train_mg42,
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Mount_train_mg42,
			Map.Repair_train_mg42,
		});

		SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_Bunker_Control_Room" );
	},

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

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

	Bunker_Destroyed = function( trigger )
	{
		Map.BunkerDyno = 0;
		SetAvailableMapGoals( TEAM.AXIS, false, Map.Build_Axis_Command_Post );
		SetAvailableMapGoals( TEAM.ALLIES, true, Map.Plant_Bunker_Debris );
		SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_Bunker_Control_Room" );
		Util.MapDebugPrint( "Bunker_Destroyed" );
	},

	Tank_past_Bunker = function( trigger )
	{
		Map.TankIsPastBunker = true;
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Map.Repair_bunker_MG,
			Map.Mount_bunker_MG,
			"DEFEND.*",
			"SNIPE.*",
			"MOBILEMG42.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_past_bunker.*",
			"DEFEND_past_bunker.*",
		});
		Util.MapDebugPrint( "Tank_past_Bunker" );
	},

	train_cargo_door_Moving = function( trigger )
	{
		// Util.MapDebugPrint(trigger.Action);
		//Util.MapDebugPrint(trigger.Entity);
		// Util.MapDebugPrint( "train_cargo_door_Moving" );
	},

	testTraceLineThread = function()
	{
		start = Vector3(2035,12,100);
		end = Vector3(1950,12,100);
		interval = 0.8;
		while (1)
		{
			tr = TraceLine(start, end, null, TRACE.SHOT, 0, false);
			if(tr.fraction < 1)
			{
				//Util.MapDebugPrint("closed");
				//DrawDebugLine(start, end, COLOR.RED, interval);
				SetAvailableMapGoals( TEAM.AXIS, false, {
					Map.Mount_train_mg42,
					Map.Repair_train_mg42,
				});
				SetAvailableMapGoals( TEAM.ALLIES, false, {
					Map.Mount_train_mg42,
					Map.Repair_train_mg42,
				});
			}
			else
			{
				//Util.MapDebugPrint("open");
				//DrawDebugLine(start, end, COLOR.GREEN, interval);
				Map.Switches.cargo_door.Enabled = false;
				SetAvailableMapGoals( TEAM.AXIS, true, {
					Map.Mount_train_mg42,
					Map.Repair_train_mg42,
				});
				SetAvailableMapGoals( TEAM.ALLIES, true, {
					Map.Mount_train_mg42,
					Map.Repair_train_mg42,
				});
			}
			sleep(interval);
		}
	},

	Tank_Health = function()
	{
		tankEnt = Util.GetGoalEnt("MOVER_tank");

		if (tankEnt)
		{
			tankName = GetEntName(tankEnt);
			triggerInfo =
			{
				Entity = tankEnt,
				Activator = null,
				TagName = "",
				Action = "",
			};

			status = GetEntFlags(tankEnt, ENTFLAG.DEAD);
			while(1)
			{
				newStatus = GetEntFlags(tankEnt, ENTFLAG.DEAD);
				if ( newStatus != status )
				{
					if ( newStatus == true ) {
						triggerInfo.TagName = tankName + " damaged!";
						triggerInfo.Action = "damaged";
						SendTrigger(triggerInfo);
					}
					else {
						triggerInfo.TagName = tankName + " built!";
						triggerInfo.Action = "built";
						SendTrigger(triggerInfo);
					}

					status = newStatus;
				}

				sleep(0.5);
			}
		}
	},

	tank_at_location = function( trigger )
	{
		switch(Map.VehicleLocation)
		{
			case 1:
			{
				// random positions now
				ETUtil.SetStartIndex("BUILD_Tiger_Tank", -1);
				ETUtil.SetStartIndex("ESCORT_tank", -1);
				ETUtil.SetStartIndex("MOUNT_tank", -1);
			}
			case 2: // Tank_In_First_Tunnel
			{
				Map.Tank_In_First_Tunnel();
			}
			case 3: // Tank_at_Corner
			{
				Map.Tank_at_Corner();
			}
			case 4: // Tank_at_tunnel
			{
				Map.Tank_at_Tunnel();
			}
		}
		Util.MapDebugPrint("tank at location " + Map.VehicleLocation, true);
	},
};

global OnMapLoad = function()
{
	// the wm_announce is oddly unreliable, no idea why. so lets create our own triggers
	thread(Map.Tank_Health);

	// *** TRIGGERS ***
	OnTrigger( "^3*** ^7Axis have built the mine tunnel barricade! ^3***", Map.Barricade_Built );
	OnTrigger( "^3*** ^7Allies have destroyed the mine tunnel barricade! ^3***", Map.Barricade_Destroyed );
	OnTrigger( "^3*** ^7Axis have damaged the railway footbridge! ^3***", Map.Footbridge_Destroyed );
	OnTrigger( "^3*** ^7Allies have destroyed the footbridge, the rail tracks are clear", Map.Wrecked_Footbridge_Destroyed );
	OnTrigger( "^3*** ^7The Tank has passed the footbridge and will try to leave the tr", Map.Tank_Past_Footbridge );
	OnTrigger( "allies_ramp_constructed", Map.Tank_Ramp_Built );
	OnTrigger( "allies_build_ramp", Map.Build_Tank_Ramp );
	OnTrigger( "Planted at the Assault Ramp.", Map.Tank_Ramp_Planted );
	OnTrigger( "Defused at the Assault Ramp.", Map.Tank_Ramp_Defused );
	OnTrigger( "axis_ramp_destroyed", Map.Tank_Ramp_Destroyed );
	OnTrigger( "axis_dynamite_tunnel", Map.Tunnel_Dyno_Enabled );
	OnTrigger( "^3*** ^7Axis have collapsed the tunnel and blocked the road! ^3***", Map.Railway_Tunnel_Destroyed );
	OnTrigger( "^3*** ^7Allies have cleared a path through the tunnel rubble! ^3***", Map.Railway_Tunnel_Cleared );
	OnTrigger( "axis_dynamite_bunker", Map.Bunker_Dyno_Enabled );
	OnTrigger( "Planted at the Bunker Control Room.", Map.Bunker_Planted );
	OnTrigger( "Defused at the Bunker Control Room.", Map.Bunker_Defused );
	OnTrigger( "allies_bunker_damaged", Map.Bunker_Destroyed );
	OnTrigger( "allies_tank_past_bunker", Map.Tank_past_Bunker );
	OnTrigger( "allies_tank_past_barrier", Map.Tank_past_Barrier );
	// OnTrigger( "axis_tank_in_tunnel", Map.Tank_in_Tunnel );
	OnTrigger( "allies_tank_past_tunnel", Map.Tank_past_Tunnel );
	OnTrigger( "^3*** ^7Allies have ^3permanently ^7claimed the station courtyard! ^3**", Map.StationPermanent );
	OnTrigger( "axis_station_captured", Map.station_flag_Axis_Captured );
	OnTrigger( "allies_station_captured", Map.station_flag_Allies_Captured );
	OnTrigger( "train_cargo_door_Moving", Map.train_cargo_door_Moving );
	OnTrigger( "MISSING_STRING", Map.Tank_Barrier_Built );
	OnTrigger( "MISSING_STRING", Map.Tank_Barrier_Destroyed );
	OnTrigger( "MISSING_STRING", Map.Roadblock_Built );
	OnTrigger( "MISSING_STRING", Map.Roadblock_Destroyed );
	OnTrigger( "tank damaged!", Map.Tiger_Tank_Damaged );
	OnTrigger( "tank at location", Map.tank_at_location );

	// *** INITIAL AVAILABILITY OF MAP GOALS ***
	SetAvailableMapGoals( TEAM.AXIS, false, ".*" );
	SetAvailableMapGoals( TEAM.AXIS, true, {
		Map.Plant_Footbridge,
		Map.Build_Axis_Command_Post,
		Map.Build_Barricade,
		Map.Build_Roadblock,
		Map.Plant_Allied_Command_Post,
		Map.Checkpoint_station_flag,
		"MOBILEMG42_start.*",
		"DEFEND_start.*",
		"SNIPE_start.*",
		"DEFEND_checkpoint.*",
		"SNIPE_checkpoint.*",
	});

	SetAvailableMapGoals( TEAM.ALLIES, false, ".*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"EXPLODE_Barricade",
		"GRENADE_barrier1",
		"GRENADE_barrier2",
		"ESCORT_tank",
		"MOUNT_tank",
		Map.Build_Tiger_Tank,
		Map.Plant_Axis_Command_Post,
		Map.Build_Allied_Command_Post,
		Map.Plant_Tank_Barrier,
		Map.Plant_Roadblock,
		Map.Checkpoint_station_flag,
	});
	//SetAvailableMapGoals( TEAM.ALLIES, true, "SNIPE_.*" );

	// *** PRIORITY ***
	SetGoalPriority(Map.Build_Axis_Command_Post, 0.85);
	SetGoalPriority(Map.Build_Allied_Command_Post, 0.85);
	SetGoalPriority(Map.Build_Roadblock, 0.92);
	SetGoalPriority(Map.Plant_Footbridge, 0.93);
	SetGoalPriority(Map.Plant_Wrecked_Footbridge, 0.9);
	SetGoalPriority(Map.Plant_Collapsed_Tunnel, 0.9);
	SetGoalPriority(Map.Plant_Railway_Tunnel, 0.93);
	SetGoalPriority(Map.Plant_Bunker_Debris, 0.85);
	SetGoalPriority("ESCORT_tank", 0.5); // same as the old goal was. make it higher? might increase focus
	SetGoalPriority("PLANT_Bunker_Control_Room", 0.91);
	SetGoalPriority("PLANT_ramp", 0.9);
	SetGoalPriority("GRENADE_barrier1", 0.7);
	SetGoalPriority("GRENADE_barrier2", 0.6);
	SetGoalPriority("ATTACK_.*", 0.5);
	SetGoalPriority("DEFEND_tank_ramp.*", 0.55);
	SetGoalPriority("DEFEND_start.*", 0.55);

	SetMapGoalProperties( "DEFEND_.*", {MinCampTime=3, MaxCampTime=35} );
	SetMapGoalProperties( "SNIPE_.*", {MinCampTime=5, MaxCampTime=35} );
	SetMapGoalProperties( "MOUNTMG42_.*", {MinCampTime=5, MaxCampTime=35} );
	SetMapGoalProperties( "MOBILEMG42_.*", {MinCampTime=10, MaxCampTime=35} );

	Util.SetMaxUsersInProgress( 2, "CHECKPOINT_.*" );
	Util.SetMaxUsersInProgress( 1, "BUILD_.*" );
	Util.SetMaxUsersInProgress( 1, "PLANT_.*" );
	Util.SetMaxUsersInProgress( 2, "ATTACK_.*" );
	Util.SetMaxUsersInProgress( 1, "DEFEND_.*" );
	Util.SetMaxUsersInProgress( 1, "MOUNTMG42_.*" );
	Util.SetMaxUsersInProgress( 1, "GRENADE_.*" );
	Util.SetMaxUsers( 1, "MOUNT_tank" );
	Util.SetMaxUsers( 2, "ESCORT_tank" ); // old goal had Limitbots 1 and 2 offsets

	// Path across tunnel rubble is closed initially
	Wp.SetWaypointFlag("tunnel_debris1", "closed", true);
	Wp.SetWaypointFlag("tunnel_debris2", "closed", true);
	Wp.SetWaypointFlag("footbridge18", "closed", true);

	location1 = OnTriggerRegion(AABB(5464.072,7354.821,95.125,5575.968,7631.087,209.281),RegionTrigger.VehicleTrigger);
	location2 = OnTriggerRegion(AABB(1561.534,6736.362,15.125,2058.672,6972.789,89.125),RegionTrigger.VehicleTrigger);
	location3 = OnTriggerRegion(AABB(2986.661,1088.029,47.642,3339.877,1535.174,162.996),RegionTrigger.VehicleTrigger);
	location4 = OnTriggerRegion(AABB(2591.196,-898.719,-304.875,2955.682,-510.030,-185.702),RegionTrigger.VehicleTrigger);

	Util.SetGoalOffset( 0,40,0, Map.Plant_Roadblock );
	Util.SetGoalOffset( 0,0,-100, Map.Plant_Wrecked_Footbridge );

	// start from the front until it moves out a bit
	ETUtil.SetStartIndex("BUILD_Tiger_Tank", 5);
	ETUtil.SetStartIndex("ESCORT_tank", 5);
	ETUtil.SetStartIndex("MOUNT_tank", 5);

	Util.UpdateSwitchData();

	/*** ROUTES ***/
	MapRoutes =
	{
		BUILD_Allied_Command_Post =
		{
			ROUTE_allied_spawn =
			{
				ROUTE_left = {},
				ROUTE_right = {},
				ROUTE_barricade = {},
			},
			ROUTE_station_spawn =
			{
				ROUTE_station_spawn_a = {},
				ROUTE_station_spawn_b = {},
			},
		},
		DEFEND_start1 =
		{
			ROUTE_axis_spawn =
			{
				ROUTE_frontdoor = {},
				ROUTE_backdoor = {},
			},
			ROUTE_station_spawn =
			{
				ROUTE_station_spawn_a = {},
				ROUTE_station_spawn_b = {},
			},
		},
		DEFEND_after_tunnel1 =
		{
			ROUTE_bunker_spawn =
			{
				ROUTE_door = {},
				ROUTE_door2 = {},
			},
		},
		PLANT_Axis_Command_Post =
		{
			ROUTE_station_spawn =
			{
				ROUTE_station_spawn_a =
				{
					ROUTE_gate = {},
					ROUTE_ladder1 = {},
				},
				ROUTE_station_spawn_b = {},
				ROUTE_gate = {},
				ROUTE_ladder1 = {},
			},
		},
	};

	MapRoutes.DEFEND_start2 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_start3 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_start4 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_start5 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_start6 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start7 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start8 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start9 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start10 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start12 = MapRoutes.DEFEND_start1;
	MapRoutes.MOBILEMG42_start13 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_after_tunnel2 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel3 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel4 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel5 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel6 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel8 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_after_tunnel9 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker1 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker2 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker3 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker8 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker9 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.DEFEND_bunker16 = MapRoutes.DEFEND_after_tunnel1;
	MapRoutes.BUILD_ramp = MapRoutes.BUILD_Allied_Command_Post;
	MapRoutes.CHECKPOINT_station_flag = MapRoutes.BUILD_Allied_Command_Post;
	MapRoutes.ATTACK_2ndTankPath8 = MapRoutes.BUILD_Allied_Command_Post;
	MapRoutes.ATTACK_2ndTankPath7 = MapRoutes.BUILD_Allied_Command_Post;
	MapRoutes.DEFEND_checkpoint2 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_checkpoint4 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_checkpoint7 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge2 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge3 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge4 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge5 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge6 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge7 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_footbridge8 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb1 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb2 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb3 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb4 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb5 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb6 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb7 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb8 = MapRoutes.DEFEND_start1;
	MapRoutes.DEFEND_tb9 = MapRoutes.DEFEND_start1;

	Util.Routes(MapRoutes);

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

	Util.MapDebugPrint( "Omni-bot map script for Breakout 2 executed." );
};

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 90.0;
	// Four birds to ignore as targets:
	bot.IgnoreTarget( GetGoal(Map.Bird1).GetEntity(), 9999 );
	bot.IgnoreTarget( GetGoal(Map.Bird2).GetEntity(), 9999 );
	bot.IgnoreTarget( GetGoal(Map.Bird3).GetEntity(), 9999 );
	bot.IgnoreTarget( GetGoal(Map.Bird4).GetEntity(), 9999 );
};
