//script created by palota
global Map =
{
	Checkpoint_forward_spawn = "CHECKPOINT_forward_spawn",
	Plant_Axis_Helipad = "PLANT_Axis_Helipad",
	Build_Damaged_Bridge = "BUILD_Damaged_Bridge",
	Plant_Damaged_Bridge = "PLANT_Damaged_Bridge",
	Build_Damaged_aqueduct = "BUILD_Damaged_aqueduct",
	Plant_Damaged_aqueduct = "PLANT_Damaged_aqueduct",
	Plant_Aqueduct_Houses_Well_Gate = "PLANT_Aqueduct_Houses_Well_Gate",
	Build_Well_Gate = "BUILD_Well_Gate",
	Plant_Well_Gate = "PLANT_Well_Gate",
	Build_helipad_mg40 = "BUILD_helipad_mg40",
	Mount_helipad_mg40 = "MOUNTMG42_helipad_mg40",
	Plant_helipad_mg40 = "PLANT_helipad_mg40",
	Repair_helipad_mg40 = "REPAIRMG42_helipad_mg40",
	Health_Cabinet_healthcabinet = "HEALTHCAB_healthcabinet",

	DispenseHealthTime = 10.0,
	alliesFlag=false,
	aqueductBuilt=false,
	bridgeBuilt=false,
	wellGateBuilt=false,
	houseWellGrateDestroyed=false,

	Navigation =
	{
		swim_up =
		{
			navigate = function(_this)
			{
				_this.Bot.HoldButton(BTN.JUMP, 4);
				for(j=0; j<4; j+=1){
					sleep(1);
					_this.Bot.ResetStuckTime();
				}
				sleep(2);
			},
		},
	},

	SetSpawn = function(bot)
	{
		if (bot.GetTeam() == TEAM.ALLIES){
			if (Map.alliesFlag){ bot.ChangeSpawnPoint(3); }
			else { bot.ChangeSpawnPoint(RandInt(1,2)); }
		}else{
			if (bot.GetClass() == CLASS.ENGINEER){
				bot.ChangeSpawnPoint(4);
			}
			if (bot.GetClass() == CLASS.COVERTOPS){
				bot.ChangeSpawnPoint(3);
			}
		}
	},

	SetHelipad = function()
	{
		if(Map.aqueductBuilt && Map.bridgeBuilt){ m=9; } else { m=1; }
		Util.SetMaxUsersInProgress(m, Map.Plant_Axis_Helipad);
	},

	Checkpoint_Captured = function(byAllies)
	{
		Map.alliesFlag=byAllies;
		SetAvailableMapGoals( TEAM.AXIS, !byAllies, {
			"DEFEND_flag.*",
			".*MINE_flag.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, byAllies, "PLANTMINE_axis.*" );
		if(!Map.houseWellGrateDestroyed){
			SetAvailableMapGoals( TEAM.ALLIES, byAllies, Map.Plant_Aqueduct_Houses_Well_Gate );
		}
		SetAvailableMapGoals( TEAM.ALLIES, byAllies, Map.Build_Damaged_aqueduct );

		foreach ( id and bot in BotTable )
		{
			Map.SetSpawn(bot);
		}
	},

	forward_spawn_Axis_Captured = function()
	{
		if(Map.bridgeBuilt){
			SetGoalPriority( Map.Plant_Damaged_Bridge, 0.75, TEAM.AXIS, 0 );
		}
		if(Map.aqueductBuilt){
			SetGoalPriority( Map.Plant_Damaged_aqueduct, 0.75, TEAM.AXIS, 0 );
		}
		if(!Map.wellGateBuilt){
			SetGoalPriority( Map.Build_Well_Gate, 0.75, TEAM.AXIS, 0 );
		}
		Map.Checkpoint_Captured(false);
		Util.MapDebugPrint( "forward_spawn_Axis_Captured" );
	},

	forward_spawn_Allies_Captured = function()
	{
		Map.Checkpoint_Captured(true);
		Util.MapDebugPrint( "forward_spawn_Allies_Captured" );
	},

	Damaged_Bridge_Built = function()
	{
		Map.bridgeBuilt = true;
		Map.SetHelipad();
		Util.EnableGoal("ROUTE_north");
		Util.MapDebugPrint( "Damaged_Bridge_Built" );
	},

	Damaged_Bridge_Destroyed = function()
	{
		Map.bridgeBuilt = false;
		Map.SetHelipad();
		Util.DisableGoal("ROUTE_north");
		SetGoalPriority( Map.Plant_Damaged_Bridge, 0.55, TEAM.AXIS, 0 );
		Util.MapDebugPrint( "Damaged_Bridge_Destroyed" );
	},

	Damaged_aqueduct_Built = function()
	{
		Map.aqueductBuilt = true;
		Map.SetHelipad();
		Util.EnableGoal("ROUTE_aqueduct");
		Util.DisableGoal("ROUTE_aqueduct_eng");
		Util.MapDebugPrint( "Damaged_aqueduct_Built" );
	},

	Damaged_aqueduct_Destroyed = function()
	{
		Map.aqueductBuilt = false;
		Map.SetHelipad();
		Util.DisableGoal("ROUTE_aqueduct");
		Util.EnableGoal("ROUTE_aqueduct_eng");
		SetGoalPriority( Map.Plant_Damaged_aqueduct, 0.55, TEAM.AXIS, 0 );
		Util.MapDebugPrint( "Damaged_aqueduct_Destroyed" );
	},

	Well_Gate_Built = function()
	{
		Map.wellGateBuilt=true;
		foreach ( id and bot in BotTable )
		{
			if ( AABB(-3340,-370,50,-3120,0,810).Contains(bot.GetPosition()) //well
				&& (bot.GetTeam() == TEAM.AXIS || bot.GetClass() != CLASS.ENGINEER)
				|| AABB(-3630,-700,50,3000,-370,450).Contains(bot.GetPosition()) ){ //tunnel
				bot.ExecCommand("kill");
			}
		}
		Util.DisableGoal("ROUTE_well");
		SetGoalPriority( Map.Build_Well_Gate, 0.55, TEAM.AXIS, 0 );
		Util.MapDebugPrint( "Well_Gate_Built" );
	},

	Well_Gate_Destroyed = function()
	{
		Map.wellGateBuilt=false;
		Util.EnableGoal("ROUTE_well");
		Util.MapDebugPrint( "Well_Gate_Destroyed" );
	},

	house_well_gate_Destroyed = function()
	{
		Map.houseWellGrateDestroyed=true;
		Util.MapDebugPrint( "house_well_gate_Destroyed" );
	},

	two_minute = function()
	{
		if (GetGameTimeLeft() > 0)
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_.*" );
		}
		Util.MapDebugPrint( "two_minute" );
	},
};

global OnMapLoad = function()
{
	OnTrigger( "The aqueduct has been repaired!", Map.Damaged_aqueduct_Built );
	OnTrigger( "The aqueduct has been blown!", Map.Damaged_aqueduct_Destroyed );
	OnTrigger( "The Bridge has been repaired!", Map.Damaged_Bridge_Built );
	OnTrigger( "The Bridge has been blown!", Map.Damaged_Bridge_Destroyed );
	OnTrigger( "The Well Gate has been repaired!", Map.Well_Gate_Built );
	OnTrigger( "Allies have blown up the Well Gate!", Map.Well_Gate_Destroyed );
	OnTrigger( "axis_capture_forward_spawn", Map.forward_spawn_Axis_Captured );
	OnTrigger( "axis_reclaims_forward_spawn", Map.forward_spawn_Axis_Captured );
	OnTrigger( "Allies capture the Aqueduct House!", Map.forward_spawn_Allies_Captured );
	OnTrigger( "Allies have blown up the Aqueduct House's Well Gate!", Map.house_well_gate_Destroyed );
	OnTrigger( "two minute warning.", Map.two_minute );

	Util.DisableGoal("MOVER.*");
	Util.DisableGoal("DEFEND_.*");
	Util.DisableGoal(".*MINE_.*");
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		Map.Plant_Aqueduct_Houses_Well_Gate,
		Map.Build_Damaged_aqueduct,
	});

	SetGoalPriority( Map.Checkpoint_forward_spawn, 0.6, TEAM.AXIS);
	SetGoalPriority( Map.Build_Well_Gate, 0.8, TEAM.AXIS);
	SetGoalPriority( Map.Mount_helipad_mg40, 0.65, TEAM.AXIS);
	SetGoalPriority( Map.Repair_helipad_mg40, 0.85, TEAM.AXIS);
	SetGoalPriority( "PLANTMINE_flag.*", 0.73, TEAM.AXIS);
	SetGoalPriority( "TRIPMINE_flag.*", 0.74, TEAM.AXIS);

	SetGoalPriority( Map.Checkpoint_forward_spawn, 0.75, TEAM.ALLIES);
	SetGoalPriority( Map.Plant_Axis_Helipad, 0.89, TEAM.ALLIES);
	SetGoalPriority( Map.Plant_Aqueduct_Houses_Well_Gate, 0.92, TEAM.ALLIES);
	SetGoalPriority( Map.Plant_Well_Gate, 0.9, TEAM.ALLIES);
	SetGoalPriority( Map.Plant_helipad_mg40, 0.51, TEAM.ALLIES);
	SetGoalPriority( "CALLARTILLERY_.*", 0.7, TEAM.ALLIES );

	foreach (goal in { Map.Build_Well_Gate, Map.Plant_Aqueduct_Houses_Well_Gate,
		Map.Plant_Damaged_Bridge, "SNIPE_.*",
		Map.Mount_helipad_mg40, Map.Build_helipad_mg40, Map.Plant_helipad_mg40 }){
		Util.SetMaxUsersInProgress(1, goal);
	}
	Util.SetMaxUsersInProgress(3, "ATTACK.*");

	SetMapGoalProperties( "SNIPE_.*", {mincamptime=30, maxcamptime=90} );
	SetMapGoalProperties( "MOUNTMG42.*", {mincamptime=30, maxcamptime=150} );
	SetMapGoalProperties( "DEFEND_.*", {mincamptime=20, maxcamptime=60} );
	SetMapGoalProperties( "ATTACK_.*", {mincamptime=5, maxcamptime=20} );

	Util.SetGoalPosition(-3340,-56,760, Map.Plant_Well_Gate);

	WeaponTable.SetWeaponTeamAvailability(TEAM.ALLIES, CLASS.SOLDIER, WEAPON.FLAMETHROWER, false);

	Util.DisableGoal("ROUTE_north");
	Util.DisableGoal("ROUTE_aqueduct");

	MapRoutes =
	{
		PLANT_Axis_Helipad =
		{
			ROUTE_flag0 = {
				ROUTE_aqueduct_eng = {},
				ROUTE_aqueduct = { Weight = 1.5 },
				ROUTE_north_eng1 = { ROUTE_north_eng2 = {} },
				ROUTE_well_eng1 = { Weight = 0.5, ROUTE_well_eng2 = {} },
				ROUTE_south = { Weight = 0.5 },
			},
			ROUTE_allies_south = {
				ROUTE_well_eng1 = { Weight = 2 },
				ROUTE_south = {},
			},
		},
		CHECKPOINT_forward_spawn =
		{
			ROUTE_allies_north = {
				ROUTE_flag_north = { Weight=2 },
				ROUTE_flag_south = {},
			},
			ROUTE_allies_south = {
				ROUTE_flag_north = {},
				ROUTE_flag_south = { Weight=2 },
			},
			ROUTE_axis_spawn = {
				ROUTE_aqueduct = {},
				ROUTE_north = {},
				ROUTE_south = { ROUTE_flag_north = {}},
			},
		},
		PLANT_helipad_mg40 =
		{
			ROUTE_flag0 = {
				ROUTE_aqueduct = { Weight = 1.5 },
				ROUTE_north = { Weight = 1 },
				ROUTE_south = { Weight = 0.5 },
				ROUTE_well = { Weight = 0.4 },
			},
		},
	};

	MapRoutes["ATTACK_helipad.*"] = MapRoutes.PLANT_helipad_mg40;
	Util.Routes(MapRoutes);

	Util.MapDebugPrint( "Map script for " + GetMapName() + " loaded" );
};

global OnBotJoin = function( bot )
{
	Map.SetSpawn(bot);
};
