//==========================================================================================
//
//	MLB_Egypt.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	Advieszeur	2 May 2008
//	palota	23 October 2010	updated from omni-bot 0.66 to 0.8, RIDE_boat, paththrough navigation
//	palota	26 October 2010	fixed routes, priorities, switches AimPosition, mg42 aim vectors, coverspots, GRENADE, MOBILEMG42, ARTILLERY,
//	      	               	gun can be destroyed after loaded, fixed gold_Returned trigger, added templedoor_Destroyed trigger
//	palota	29 October 2010	routes to switches and cappoint, ignore boat after temple entrance destroyed, allies suicide after gun fired,
//	      	               	bots suicide at escape path only when gold returned and not taken again, axis don't repair boat in floodgate
// palota	19 November 2010	ROUTE_escape_c1, ROUTE_r_temple, role to defend gold, longer MOUNTMG42 camp time, more bots ride boat after barrier destroyed
//==========================================================================================
//

global Map =
{
	Debug = 0,
	Lift_phase  = 0,                // face 0 of 6 phases boatlifting
	BarrierIsBuild = false,         //Is Barrier build
	LowerGate = "close",
	UpperGate = "close",
	BoatAtBarrier   = false,        //Boat is at flooddoor
	BoatAtLowerGate  = false,       //Boat is at flooddoor
	BoatInLift = false,             //Boat good between flooddoors
	BoatAtEnd = false,              //Boat at the end of route
	BoatIsDamaged = false,          // Boat is damaged
	GunIsLoaded = false,
	GoldIsStolen = false,
	boatDiff = Vec3(),

	Movers =
	{
		"MOVER_boat",           //retain the boat as a mover
	},

	Navigation =
	{
		climb_rope = {
			navigate = function(_this) {
				_this.AddAimRequest(Priority.High, "facing", Vector3(0.4,0,0.8));
				_this.Bot.HoldButton(BTN.FORWARD, 9);
				for(j=0; _this.Bot.GetPosition().z < -460; j+=1)
				{
					if (j>25) { return; }
					sleep(0.5);
				}
				_this.Bot.HoldButton(BTN.STRAFE_L, 1.5);
				sleep(0.5);
				_this.Bot.ReleaseButton(BTN.FORWARD);
				sleep(1);
			},
		},
	},

	EscapeTrigger =
	{
		Name = "EscapeTrigger",
		TriggerOnClass = CLASS.ANYPLAYER,
		OnEnter = function(ent)
		{
			if ( GetEntFlags( ent, ENTFLAG.CARRYINGGOAL ) ){
				sleep(6);
				SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_end");
				SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_d_escape.*");
				Util.MapDebugPrint( "Escape_Trigger" );
			}
		},
	},

	Roles =
	{
		ALLIES =
		{
			DEFENDER2 =
			{
				numbots = 2,
			},
		},
	},


	resetGoals = function()   {
		Util.DisableGoal("DEFEND_.*" );
		Util.DisableGoal("ATTACK_.*" );
		Util.DisableGoal("SNIPE_.*" );
		Util.DisableGoal("CALLARTILLERY_.*" );
		Util.DisableGoal("ARTILLERY_.*" );
		Util.DisableGoal("MOBILEMG42_.*" );
		Util.MapDebugPrint( "Reset Goals done", true );
	},


	//==== Boat things  ===========================

	Set_Ride = function() {
		ride = !(Map.BoatAtBarrier && Map.BarrierIsBuild ||
			Map.BoatAtLowerGate && Map.LowerGate == "close" ||
			Map.BoatInLift && Map.UpperGate == "close" ||
			Map.BoatAtEnd || Map.BoatIsDamaged);

		SetAvailableMapGoals( TEAM.AXIS, ride, "RIDE_boat" );
		if ( Map.BoatIsDamaged )  {
			Util.MapDebugPrint( "Repair the boat!", true );
		} else if(ride)  {
			Util.MapDebugPrint( "Escort the boat!", true );
		} else {
			Util.MapDebugPrint( "RIDE_boat disabled", true );
		}
	},

	boat_Damaged = function( trigger )   {
		Map.BoatIsDamaged = true;
		Map.Set_Ride();
		Util.MapDebugPrint( "boat_Damaged" );
	},

	boat_Repaired = function( trigger )   {
		Map.BoatIsDamaged = false;
		Map.Set_Ride();
		Util.MapDebugPrint( "boat_Repaired" );
	},


	brickwall_Down = function( trigger )   {
		Util.EnableGoal("ROUTE_r_barrier_a1");
		Util.MapDebugPrint( "Brick wall shot down" );
	},

	boat_barrier_Built = function( trigger )   {
		Map.BarrierIsBuild = true;
		Map.Set_Ride();
		SetGoalPriority("REPAIRMG42_156", 0.95);
		Util.MapDebugPrint( "boat_barrier_Built" );
	},

	Boat_At_Barrier = function() {
		Map.BoatAtBarrier = true;
		Map.Set_Ride();
		SetGoalPriority( "PLANT_boat_barrier", 0.95 );
		Util.OnTriggerPosition( "MOVER_boat", "a_boat_26", 180.0, Map.Past_Barrier  );
		Util.MapDebugPrint( "Boat at barrier");
	},

	boat_barrier_Destroyed = function( trigger )   {
		Map.BarrierIsBuild = false;
		Util.SetMaxUsersInProgress( 9, "RIDE_boat" );
		Map.Set_Ride();
		SetGoalPriority("REPAIRMG42_156", 0.7);
		Util.MapDebugPrint( "boat_barrier_Destroyed" );
	},

	//boat Past barrier
	Past_Barrier = function( trigger )   {
		Map.BoatAtBarrier = false;
		Map.resetGoals();
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, false, ".*MG42_156" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_barrier2_.*",
			"SNIPE_s_barrier2_x.*",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"BUILD_boat_barrier",
			"GRENADE_barrier_mg",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"DEFEND_d_barrier2_.*",
			"SNIPE_s_barrier2_l.*",
			".*ARTILLERY.*_barrier2_l.*",
		});

		Util.SetMaxUsersInProgress( 2, "RIDE_boat" );
		Util.OnTriggerPosition( "MOVER_boat", "a_boat_46", 180.0, Map.Boat_At_LowerGate  );
		Util.MapDebugPrint( "Boat past barrier" );
	},

	//boat Past barrier2
	Past_Barrier2 = function( trigger )   {
		Map.resetGoals();
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_flooddoor_.*",
			"SNIPE_s_flooddoor_x.*",
			"BUILD_generator",
			"SWITCH_flooddoor_uppergate",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"PLANT_generator",
			"DEFEND_d_flooddoor.*",
			"SNIPE_s_flooddoor_l.*",
			".*ARTILLERY.*_flooddoor_l.*",
			"MOBILEMG42_flooddoor_l.*",
		});

		Util.MapDebugPrint( "Boat past second barrier, enable switch and generator" );
	},

	Boat_At_LowerGate = function() {
		//Boat arived at closed lowerdoor
		Map.BoatAtLowerGate = true;
		Map.Set_Ride();
		SetGoalPriority( "BUILD_generator", 0.95 );
		Util.OnTriggerPosition( "MOVER_boat", "BoatPos_lift", 700.0, Map.BoatPos_inlift  );
		Util.MapDebugPrint( "Boat is for the lower door");
	},

	//Boat lift
	generator_Built = function( trigger )   {
		SetGoalPriority("SWITCH_flooddoor.*", 0.7);
		Util.MapDebugPrint( "generator_Built", true );
	},

	generator_Destroyed = function( trigger )   {
		SetGoalPriority("SWITCH_flooddoor.*", 0);
		Util.MapDebugPrint( "generator_Destroyed", true );
	},

	//Ship lifting  (6 faces - 2x 3 buttons)
	upper_gate_Closed = function( trigger )   {
		Util.DisableGoal("SWITCH_flooddoor.*");
		SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_generator" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_generator" );

		sleep(3);
		Map.UpperGate = "close";
		if ( Map.BoatInLift ) {
			Map.Lift_phase = 5;
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_uppergate" );
			Map.Set_Ride();
		} else {
			Map.Lift_phase = 1;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_uppergate" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_waterpump" );
		}

		Util.MapDebugPrint( "upper_gate_Closed" );
	},

	waterlevel_Lowered = function( trigger )   {
		Wp.SetWaypointFlag("flood", "closed", true);
		Util.DisableGoal("SWITCH_flooddoor.*");
		sleep(7);
		if ( Map.BoatInLift ) {
			Map.Lift_phase = 4;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_lowergate" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_waterpump" );
		} else {
			Map.Lift_phase = 2;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_waterpump" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_lowergate" );
		}

		Util.MapDebugPrint( "waterlevel_lowered" );
	},

	lower_gate_Opened = function( trigger )   {
		Util.DisableGoal("SWITCH_flooddoor.*");
		sleep(2);
		Map.LowerGate = "open";

		if ( Map.BoatInLift ) {
			Map.Lift_phase = 3;
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_lowergate" );
		} else {
			Map.Lift_phase = 3;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_lowergate" );
			//Disable Generator
			SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_generator" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_generator" );
			Map.Set_Ride();
		}
		Util.MapDebugPrint( "lower_gate_Opened" );
	},

	//boat Past the lower gate
	Past_LowerGate = function( trigger )   {
		Map.BoatAtLowerGate = false;
		Util.DisableGoal("SWITCH_flooddoor_lowergate");
		Util.MapDebugPrint( "Boat past lower gate", true );
	},

	//boat in the boat lift
	BoatPos_inlift   = function( trigger) {
		if ( Map.BoatInLift ) { return; }
		Map.BoatInLift = true;
		Map.Set_Ride();
		SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_Boat" );
		SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_lowergate" );
		//Enable Generator
		SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_generator" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_generator" );
		Util.MapDebugPrint( "Boat is in lift" );
	},

	lower_gate_Closed = function( trigger )   {
		Util.DisableGoal("SWITCH_flooddoor.*");
		SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_generator" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_generator" );
		sleep(2);
		Map.LowerGate = "close";
		if ( Map.BoatInLift ) {
			Map.Lift_phase = 4;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_lowergate" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_waterpump" );
		} else {
			Map.Lift_phase = 2;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_waterpump" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_lowergate" );
			Map.Set_Ride();
		}

		Util.MapDebugPrint( "lower_gate_Closed" );
	},

	waterlevel_Raised = function( trigger )   {
		Util.DisableGoal("SWITCH_flooddoor.*");
		sleep(7);
		if ( Map.BoatInLift ) {
			Map.Lift_phase = 5;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_waterpump" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_uppergate" );
		} else {
			Map.Lift_phase = 1;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_uppergate" );
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_waterpump" );
		}
		SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_Boat" );
		Wp.SetWaypointFlag("flood", "closed", false);

		Util.MapDebugPrint( "waterlevel_Raised" );
	},

	upper_gate_Opened = function( trigger )   {
		Util.DisableGoal("SWITCH_flooddoor.*");
		sleep(3);
		Map.UpperGate = "open";

		if ( Map.BoatInLift ) {
			Map.Lift_phase = 6;
			SetAvailableMapGoals( TEAM.ALLIES, true, "SWITCH_flooddoor_uppergate" );
			//Disable Generator
			SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_generator" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_generator" );

			Map.Set_Ride();
		} else {
			Map.Lift_phase = 0;
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_flooddoor_uppergate" );
		}

		Util.MapDebugPrint( "upper_gate_Opened" );
	},

	//boat Past the upper gate
	Past_UpperGate = function( trigger )   {
		Map.BoatInLift = false;
		Util.DisableGoal("SWITCH_flooddoor.*");

		Map.resetGoals();
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_generator" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_a_temple_.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_a_temple_start" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_s_temple_x.*",
			".*MG42_959",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_generator" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"DEFEND_d_temple_.*",
			"SNIPE_s_temple_l.*",
			"GRENADE_temple_mg",
			"MOBILEMG42_temple_l.*",
		});

		Util.MapDebugPrint( "Boat past Upper gate" );
	},

/////////////////////////////////////////////////////////////////

	//======  Second part of level  (Boatroute is finished)  =======

	templeEntrance_Destroyed = function( trigger )   {
		//Boat route is finished now
		Map.BoatAtEnd = true;
		Map.Set_Ride();
		Util.IgnoreTargetGoalAll("MOVER_boat");

		Map.resetGoals();       //Reset goals
		Util.EnableGoal( "ATTACK_a_temple_start" );
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"BUILD_Boat",
			".*MG42_959",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_temple_entrance_door" );
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, false, "GRENADE_temple_mg" );

		Wp.SetWaypointFlag("c_temple", "closed", false);

		//selfkill for change spawnpoint
		ETUtil.SuicideSpawn( TEAM.AXIS, 0 );

		Util.MapDebugPrint( "templeEntrance_Destroyed" );
	},

	templedoor_Planted = function( trigger )   {
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"DEFEND_d_square.*",
			"SNIPE_s_square_l.*",
			"MOBILEMG42_square_l.*",
		});

		Util.MapDebugPrint( "templedoor_Planted" );
	},

	templedoor_Destroyed = function( trigger )   {
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_square_.*",
			"SNIPE_s_square_x.*",
			"PLANT_temple_entrance_gate",
		});

		Util.MapDebugPrint( "templedoor_Destroyed" );
	},

	dynawall_Destroyed = function( trigger )   {
		Map.resetGoals();       //Reset goals
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_gun_.*",
			"PLANT_courtyard_floor_crack",
			"BUILD_gun",
			"FLAG_ammo",
			"CAPPOINT_cap_ammo",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"DEFEND_d_gun.*",
			"DEFEND_d_ammo.*",
			"PLANT_gun",
			"MOBILEMG42_gun_l.*",
		});

		Util.MapDebugPrint( "dynawall_Destroyed" );
	},

	cracked_floor_Destroyed = function( trigger )   {
		Util.EnableGoal("ROUTE_r_stealammo_a1");
		Util.SetMaxUsersInProgress( 20, "FLAG_ammo" );
		Util.MapDebugPrint( "cracked_floor_Destroyed" );
	},

	const_gun_Destroyed = function( trigger )   {
		SetAvailableMapGoals( TEAM.AXIS, false, "SWITCH_gun" );
		Util.MapDebugPrint( "const_gun_Destroyed" );
	},

	const_gun_Built = function( trigger )   {
		if (Map.GunIsLoaded){
			SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_gun" );
		}
		Util.MapDebugPrint( "Gun built" );
	},

	ammo_Stolen = function( trigger )   {
		SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_d_ammo.*" );
		Util.MapDebugPrint( "Ammo stolen" );
	},

	ammo_Returned = function( trigger )   {
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_ammo.*" );
		Util.MapDebugPrint( "Ammo Returned" );
	},

	gun_Loaded = function( trigger )   {
		Map.GunIsLoaded = true;
		SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_courtyard_floor_crack" );
		SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_d_ammo_.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "CAPPOINT_cap_ammo" );
		Util.MapDebugPrint( "Gun Loaded" );
	},

	gun_Ready = function( trigger )   {
		SetAvailableMapGoals( TEAM.AXIS, true, "SWITCH_gun" );
		Util.MapDebugPrint( "Gun Ready" );
	},

	gun_Fired = function( trigger )   {
		Map.resetGoals();       //Reset goals
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"BUILD_gun",
			"SWITCH_gun",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_wall2_.*",
			"PLANT_sarcophagus_room_door",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_gun" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_wall2.*" );
		ETUtil.SuicideSpawn( TEAM.ALLIES, 0 );

		Util.MapDebugPrint( "Gun Fired" );
	},

	dynawall2_Destroyed = function( trigger )   {
		Map.resetGoals();       //Reset goals
		//Axis
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ATTACK_a_gold_.*",
			"BUILD_scaffolding",
			"FLAG_gold",
			"CAPPOINT_cap_gold",
		});
		//Allies
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_gold.*" );
		Util.ClearRoleForGoals("DEFEND_d_gold.*", ROLE.DEFENDER2);
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"PLANT_scaffolding",
			"MOBILEMG42_gold_l.*",
		});

		OnTriggerRegion(Vector3(2400, 5300, -720),800, Map.EscapeTrigger);
		Wp.SetWaypointFlag("c_temple", "closed", true);

		Util.MapDebugPrint( "dynawall2_Destroyed" );
	},

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

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

	gold_Suicide = function( bot )
	{
		while( bot.GetReinforceTime() > 2 ) {
			yield();
		}
		if (!Map.GoldIsStolen)
		{
			bot.ExecCommand("kill");
		}
	},

	gold_Stolen = function( trigger )   {
		Map.GoldIsStolen = true;

		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_a_gold_.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_a_escape_.*" );

		Util.SetRoleForGoals("DEFEND_d_gold.*", ROLE.DEFENDER2);
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_escape.*" );

		Util.MapDebugPrint( "gold_Stolen" );
	},

	gold_Returned = function( trigger )   {
		Map.GoldIsStolen = false;

		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_a_gold_.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_a_escape_.*" );

		Util.ClearRoleForGoals("DEFEND_d_gold.*", ROLE.DEFENDER2);
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"DEFEND_d_escape.*",
			"DEFEND_end",
		});

		//kill all bots who are at river
		foreach ( bot in BotTable )
		{
			pos = bot.GetPosition();
			if (pos.y > 5100 && (pos.z < -780 || pos.x < 1500))
			{
				thread(Map.gold_Suicide, bot);
			}
		}

		Util.MapDebugPrint( "gold_Returned" );
	},

};


//============ GLOBAL  MAP LOAD  ====================

global OnMapLoad = function()
{
	//MOVE GOALS FOR BETTER REACHABLE
	Util.SetGoalOffset( -10, 252,  180, "PLANT_boat_barrier" );
	Util.AddUsePoint( "PLANT_gun", Vector3(-1881.266, -3391.333, -1191.875));
	Util.AddUsePoint( "PLANT_scaffolding", Vector3(1394.185, 1677.112, -1183.875));

	Wp.SetWaypointFlag("flood", "closed", false);

	//GOAL PROPERTIES
	SetMapGoalProperties( "ATTACK_.*", {mincamptime=5, maxcamptime=25});
	SetMapGoalProperties( "DEFEND_.*", {mincamptime=30, maxcamptime=300});
	SetMapGoalProperties( "SNIPE_.*", {mincamptime=60, maxcamptime=300});
	SetMapGoalProperties( "MOUNTMG42_.*", {mincamptime=60, maxcamptime=200});
	SetMapGoalProperties( "MOBILEMG42_.*", {mincamptime=80, maxcamptime=400});

	Util.SetMaxUsers( 1, "REPAIRMG42.*" );
	Util.SetMaxUsers( 1, "GRENADE.*" );
	Util.SetMaxUsersInProgress( 3, "SWITCH.*" );
	Util.SetMaxUsers( 20, "ATTACK_a_temple_start" );
	Util.SetMaxUsers( 20, "DEFEND_end" );
	Util.SetMaxUsers( 3, "DEFEND_d_escape_l3" );
	Util.SetMaxUsersInProgress( 2, "FLAG_ammo" );

	Util.DisableGoal(".*", true);       //disable all
	Util.DisableGoal("ROUTE_r_barrier_a1"); //brick wall
	Util.DisableGoal("ROUTE_r_stealammo_a1"); //courtyard floor

	//Axis goals
	SetAvailableMapGoals( TEAM.AXIS, true, {
		"BUILD_Boat",
		"RIDE_boat",
		"PLANT_boat_barrier",
		"ATTACK_a_barrier_.*",
		"SNIPE_s_barrier_x.*",
		".*MG42_156",
	});

	//Allies goals
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"BUILD_boat_barrier",
		"SNIPE_s_barrier_l.*",
		"DEFEND_d_barrier_.*",
		"GRENADE_barrier_mg",
		".*ARTILLERY.*_barrier_l.*",
	});

	SetGoalPriority( "SWITCH_flooddoor.*", 0);
	SetGoalPriority( "BUILD_gun", 0.8 );
	SetGoalPriority( "FLAG_ammo", 0.5, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "DEFEND_d_escape_l3", 0.49 );

	//Boat
	OnTrigger( "^1The boat has been damaged!", Map.boat_Damaged );
	OnTrigger( "^4The boat has been repaired!", Map.boat_Repaired );
	//Brickwall
	OnTrigger( "^4The brick wall has been shot down", Map.brickwall_Down );
	//Barrier
	OnTrigger( "^dAllied team has built the boat barrier!", Map.boat_barrier_Built );
	OnTrigger( "^dAxis team has destroyed the boat barrier!", Map.boat_barrier_Destroyed );
	OnTrigger( "^4The second barrier has been blown", Map.Past_Barrier2 );
	//Generator
	OnTrigger( "^4Axis team has fixed the generator!", Map.generator_Built );
	OnTrigger( "^1The generator broke down!", Map.generator_Destroyed );
	OnTrigger( "^1Allied team has broken the generator!", Map.generator_Destroyed );
	//Uppergate
	OnTrigger( "^dAxis has closed the upper gate!",   Map.upper_gate_Closed );
	OnTrigger( "^dAllies has closed the upper gate!", Map.upper_gate_Closed );
	OnTrigger( "^dAxis has opened the upper gate!",   Map.upper_gate_Opened);
	OnTrigger( "^dAllies has opened the upper gate!", Map.upper_gate_Opened );
	//Waterlevel
	OnTrigger( "^dAxis has lowered the water!", Map.waterlevel_Lowered );
	OnTrigger( "^dAllies has lowered the water!", Map.waterlevel_Lowered );
	OnTrigger( "^dAxis has raised the water!", Map.waterlevel_Raised );
	OnTrigger( "^dAllies has raised the water!", Map.waterlevel_Raised );
	//Lowergate
	OnTrigger( "^dAxis has opened the lower gate!", Map.lower_gate_Opened );
	OnTrigger( "^dAllies has opened the lower gate!", Map.lower_gate_Opened );
	OnTrigger( "^dAxis has closed the lower gate!", Map.lower_gate_Closed );
	OnTrigger( "^dAllies has closed the lower gate!", Map.lower_gate_Closed );

	//boat is through lower gate
	OnTrigger( "^1The boat is entering the floodgate  !", Map.Past_LowerGate );
	//boat is through lift
	OnTrigger( "^1The boat is through the floodgate  !", Map.Past_UpperGate );
	OnTrigger( "^4The temple entrance has been destroyed", Map.templeEntrance_Destroyed );

	//Finish boat tour, start second part of level
	//========================================================================
	OnTrigger( "Planted at the temple entrance door.", Map.templedoor_Planted );
	OnTrigger( "the temple entrance door Destroyed.", Map.templedoor_Destroyed );
	OnTrigger( "^1Axis have breached the Temple entrance!", Map.dynawall_Destroyed );

	//Ammo
	OnTrigger( "^1Axis has stolen the ammo !", Map.ammo_Stolen );
	OnTrigger( "^4Allies has returned the ammo !", Map.ammo_Returned );
	//Gun
	OnTrigger( "^dAxis team has built the Gun!", Map.const_gun_Built );
	OnTrigger( "^dAllied team has destroyed the Gun!", Map.const_gun_Destroyed );
	OnTrigger( "^1Axis has loaded the gun !", Map.gun_Loaded );
	OnTrigger( "^dThe gun is ready to fire!", Map.gun_Ready );
	OnTrigger( "^4The Pyramid entrance has been destroyed", Map.gun_Fired );

	OnTrigger( "^dThe scaffolding has been built", Map.scaffolding_Built );
	OnTrigger( "^dThe scaffolding has been destroyed", Map.scaffolding_Destroyed );
	//Gold
	OnTrigger( "Axis have stolen The Gold Crate!", Map.gold_Stolen );
	OnTrigger( "Flag returned gold!", Map.gold_Returned );
	//OnTrigger( "^4Axis got away with the gold ^d!!!!!!!!!!", Map.gold_Save );

	OnTrigger( "^dAxis has breached the courtyard floor!", Map.cracked_floor_Destroyed );
	OnTrigger( "^1Axis has breached the Sarcophagus room wall!", Map.dynawall2_Destroyed );

	//Trigger for the Boat pos
	Util.OnTriggerPosition( "MOVER_boat", "a_boat_25", 180.0, Map.Boat_At_Barrier  );

	GetGoal("BUILD_Boat").PaththroughFunction = function(_this)
	{
		bot = _this.Bot;
		ent = GetGoal("MOVER_boat").GetEntity();
		v = GetEntFacing(ent);
		pos = GetEntityWorldSpace(ent, Vector3(0,-234,-10) + Map.boatDiff);
		for(k=0; k<4; k+=1)
		{
			//climb up from water to the boat
			_this.AddAimRequest(Priority.High, "facing", Vector3(v.x, v.y, 2));
			sleep(0.1);
			bot.HoldButton(BTN.FORWARD, BTN.JUMP, 4);
			sleep(1);
			bot.ReleaseButton(BTN.JUMP);
			for(i=0; i<=70 && bot.DistanceTo(pos) > 80; i+=1)
			{
				yield();
			}
			bot.ReleaseButton(BTN.FORWARD);
			if (bot.GetPosition().z < pos.z + 40){ break; }
			//bot has climbed the second ladder, step back and try again
			bot.HoldButton(BTN.BACKWARD, 0.5);
			sleep(0.5);
		}
		//strafe left or right
		_this.AddAimRequest(Priority.High, "facing", v);
		if (RandInt( 0, 9 ) < 5){ b=BTN.STRAFE_L; k=-1; } else { b=BTN.STRAFE_R; k=1; }
		bot.HoldButton(b, 2);
		sleep(0.8);
		//go forward
		pos = GetEntityWorldSpace(ent, Vector3(71 * k, -59, -10.875) + Map.boatDiff);
		bot.MoveTowards(pos);
		sleep(1.8);
		if (Abs(bot.GetPosition().z - pos.z) > 50)
		{
			Util.MapDebugPrint("BUILD_Boat paththrough failed", true);
			 _this.Finished();
		}
	};

	Map.boatDiff = Util.FixMoverPos("boat", Vec3(-5345.721, 6025.444, -1218.000), Vec3(-5344.000, 5999.000, -1302.000));
};

global InitializeRoutes = function()
{
	// ********************************************************
	// *****  ROUTES   ****************************************
	// ********************************************************

	MapRoutes =
	{
		//Axis routes
		PLANT_boat_barrier =
		{
			ROUTE_r_spawn_x1 =  {
				//tunnel route
				ROUTE_r_barrier_a1 = { Weight = 5, ROUTE_r_barrier_a2 = {}, },
				//oposite river route
				ROUTE_r_barrier_c1 = { ROUTE_r_barrier_c2 = {},  },
				//above route
				ROUTE_r_barrier_d1 = { ROUTE_r_barrier_d2 = {},  },
			},
		},

		BUILD_generator =
		{
			ROUTE_r_spawn_x3 =  {
				//Tunnel route
				ROUTE_r_lift_a1 = { Weight = 6,
					ROUTE_r_lift_a2 = {Weight = 3,},
					ROUTE_r_lift_a3 = {},
				},
				//Floodwall route
				ROUTE_r_lift_b1 = {},
				ROUTE_r_lift_c1 = {
					ROUTE_r_lift_c2 = {},
				},
			},
		},

		ATTACK_a_flooddoor_x2 =
		{
			ROUTE_r_spawn_x3 =  {
				//Tunnel route
				ROUTE_r_lift_a1 = {
					Weight = 7,
					ROUTE_r_lift_a2 = {Weight = 3,},
					ROUTE_r_lift_a3 = {},
				},
				//Floodwall route
				ROUTE_r_lift_b1 = {},
				ROUTE_r_lift_c1 = {
					Weight = 2,
					ROUTE_r_lift_c2 = {},
				},
			},
		},

		PLANT_sarcophagus_room_door =
		{
			ROUTE_r_spawn_x8 =  {
				//Left side
				ROUTE_r_barrier2_a1 = { ROUTE_r_barrier2_a2 = {}, },
				//Right side
				ROUTE_r_barrier2_b1 = { ROUTE_r_barrier2_b2 = {}, },
			},
		},

		FLAG_ammo =
		{
			ROUTE_r_spawn_x7 =  {
				//`floorgap`
				ROUTE_r_stealammo_a1 = { Weight = 2,
					ROUTE_r_stealgold_a2 = {},
					ROUTE_r_stealgold_a3 = {},
				},
				//Both sides
				ROUTE_r_stealammo_b1 = { Weight = 0.5 },
				ROUTE_r_stealammo_c1 = {},
			},
		},

		CAPPOINT_cap_gold =
		{
			ROUTE_gold = {
				ROUTE_escape_a1 = { Weight = 2, ROUTE_escape_a2 = {}},
				ROUTE_escape_b1 = {},
				ROUTE_escape_c1 = {},
			}
		},

		//Allies Routes
		PLANT_generator =
		{
			ROUTE_r_spawn_l3 =  {
				ROUTE_r_flood_a1 = {},
				ROUTE_r_flood_b1 = { Weight = 3 },
			},
		},

		DEFEND_d_temple_l2 = {
			ROUTE_r_spawn_l9 = {
				ROUTE_r_temple_a1 = {},
				ROUTE_r_temple_a2 = { Weight = 3 },
			}
		},

		DEFEND_d_temple_l1 = {
			ROUTE_r_spawn_l9 = {
				ROUTE_r_temple_b1 = {},
			}
		},
	};

	// Copy routes  barrier
	MapRoutes.ATTACK_a_barrier_x1 = MapRoutes.PLANT_boat_barrier;
	MapRoutes.ATTACK_a_barrier_x2 = MapRoutes.ATTACK_a_barrier_x1;
	MapRoutes.ATTACK_a_barrier_x3 = MapRoutes.ATTACK_a_barrier_x1;
	MapRoutes.ATTACK_a_barrier_x4 = MapRoutes.ATTACK_a_barrier_x1;
	// Copy routes  lift  asis
	MapRoutes.ATTACK_a_flooddoor_x1 = MapRoutes.ATTACK_a_flooddoor_x2;
	MapRoutes.ATTACK_a_flooddoor_x4 = MapRoutes.ATTACK_a_flooddoor_x2;
	MapRoutes.ATTACK_a_flooddoor_x5 = MapRoutes.ATTACK_a_flooddoor_x2;
	// Copy routes  Steal ammo
	MapRoutes.FLAG_ammo.ROUTE_r_spawn_x7_2 = MapRoutes.FLAG_ammo.ROUTE_r_spawn_x7;
	MapRoutes.FLAG_ammo.ROUTE_r_spawn_x7_3 = MapRoutes.FLAG_ammo.ROUTE_r_spawn_x7;
	// Copy routes  Dynowall2
	MapRoutes.ATTACK_a_wall2_x1 = MapRoutes.PLANT_sarcophagus_room_door;
	MapRoutes.ATTACK_a_wall2_x2 = MapRoutes.PLANT_sarcophagus_room_door;
	MapRoutes.ATTACK_a_wall2_x3 = MapRoutes.PLANT_sarcophagus_room_door;
	// Copy routes  lift  asis
	MapRoutes.DEFEND_d_flooddoor_l1 = MapRoutes.PLANT_generator;
	MapRoutes.DEFEND_d_flooddoor_l2 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l3 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l4 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l5 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l6 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l7 = MapRoutes.DEFEND_d_flooddoor_l1;
	MapRoutes.DEFEND_d_flooddoor_l8 = MapRoutes.DEFEND_d_flooddoor_l1;
	// Copy routes  defend temple
	MapRoutes.DEFEND_d_temple_l3 = MapRoutes.DEFEND_d_temple_l1;
	MapRoutes.DEFEND_d_temple_l7 = MapRoutes.DEFEND_d_temple_l1;
	MapRoutes.DEFEND_d_temple_l8 = MapRoutes.DEFEND_d_temple_l1;
	MapRoutes.DEFEND_d_temple_l10 = MapRoutes.DEFEND_d_temple_l1;
	MapRoutes.DEFEND_d_temple_l4 = MapRoutes.DEFEND_d_temple_l2;
	MapRoutes.DEFEND_d_temple_l5 = MapRoutes.DEFEND_d_temple_l2;
	MapRoutes.DEFEND_d_temple_l6 = MapRoutes.DEFEND_d_temple_l2;
	MapRoutes.DEFEND_d_temple_l9 = MapRoutes.DEFEND_d_temple_l2;
	MapRoutes.DEFEND_d_temple_l11 = MapRoutes.DEFEND_d_temple_l2;

	MapRoutes.SWITCH_flooddoor_lowergate =
	{
		ROUTE_r_spawn_l3 = MapRoutes.DEFEND_d_flooddoor_l1,
		ROUTE_r_spawn_x3 = MapRoutes.ATTACK_a_flooddoor_x2,
	};
	MapRoutes.SWITCH_flooddoor_waterpump = MapRoutes.SWITCH_flooddoor_lowergate;
	MapRoutes.SWITCH_flooddoor_uppergate = MapRoutes.SWITCH_flooddoor_lowergate;

	Util.Routes(MapRoutes);
	Util.MapDebugPrint( "Omni-bot map script for " + GetMapName() + " executed." );
};
