//==========================================================================================
//
//	bloody_omaha_b2.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	palota	27 September 2011	roles, routes, defend/attack at Anti-Tank guns, Wall_Destroyed triggers, Planted/Defused triggers, two_minute, cover spots, more artillery
//==========================================================================================
//
global Map =
{
	Debug = 0,
	ForwardSpawn = false,
	wallDestroyed = false,
	seaWallDestroyed = false,
	FocusPrimary = false,
	alliedSpawn = 2,
	EastDyno = 0,
	WestDyno = 0,

	Roles =
	{
		AXIS =
		{
			AllBots = true,
			ATTACKER = {
				spawnpt = 8, //barracks 2
				crucialClass = CLASS.COVERTOPS,
				numbots = 3
			},
			DEFENDER1 = {
				spawnpt = 10, //bunker 2
				crucialClass = CLASS.FIELDOPS,
				numbots = 4
			},
			DEFENDER2 = {
				spawnpt = 9,  //bunker 1
				crucialClass = CLASS.MEDIC,
				numbots = 4
			},
			DEFENDER3 = {
				spawnpt = 11, //outside 1
				crucialClass = CLASS.ENGINEER,
				numbots = 4
			},
		},
		ALLIES =
		{
			DEFENDER =
			{
				crucialClass = CLASS.COVERTOPS,
				numbots = 3
			},
		}
	},

	East_Anti_Tank_Gun_Destroyed = function( trigger )
	{
		Util.DisableGoal( ".*_east_gun.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_east_dyno.*" );
		Util.ClearRoleForGoals( "DEFEND_west_gun.*", ROLE.DEFENDER2);
		Util.MapDebugPrint( "East_Anti_Tank_Gun_Destroyed" );
	},

	West_Anti_Tank_Gun_Destroyed = function( trigger )
	{
		Util.DisableGoal( ".*_west_gun.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_west_dyno.*" );
		Util.ClearRoleForGoals( "DEFEND_east_gun.*", ROLE.DEFENDER1);
		Util.MapDebugPrint( "West_Anti_Tank_Gun_Destroyed" );
	},

	SetSpawn1 = function(bot)
	{
		if (bot.GetTeam()==TEAM.ALLIES)
		{
			if(Map.ForwardSpawn){
				s=3;
			}else{
				//4,2,5,6,7
				s = Map.alliedSpawn + 1;
				if(s>7){ s=2; }
				if(s==3){ s=4; }
				Map.alliedSpawn = s;
			}
			bot.ChangeSpawnPoint(s);
		}
	},

	SetForwardFlag = function(b)
	{
		Map.ForwardSpawn = b;

		SetAvailableMapGoals( TEAM.AXIS, !b, {
			"CALLARTILLERY.*",
			".*MG42_bunker.*",
			"DEFEND_.*_bunker.*",
			"DEFEND_center.*",
			"DEFEND_front.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, b, {
			".*MG42_lower",
			"TRIPMINE.*",
		});

		SetAvailableMapGoals( TEAM.ALLIES, !b, "SNIPE_allies.*" );
		if(!Map.seaWallDestroyed){ SetAvailableMapGoals( TEAM.ALLIES, b, "PLANT_Seawall" ); }
		SetAvailableMapGoals( TEAM.ALLIES, b && !Map.FocusPrimary, "DEFEND_flag.*" );

		if(b && Map.wallDestroyed){
			Util.SetRoleForGoals( "CHECKPOINT_beach_Flag1", ROLE.ATTACKER );
		}else{
			Util.ClearRoleForGoals( "CHECKPOINT_beach_Flag1", ROLE.ATTACKER );
		}

		foreach(bot in BotTable)
		{
			Map.SetSpawn1(bot);
		}

		WeaponTable.SetWeaponAvailability( CLASS.SOLDIER, WEAPON.FLAMETHROWER, b );
		WeaponTable.SetWeaponAvailability( CLASS.SOLDIER, WEAPON.PANZERFAUST, !b );
		WeaponTable.SetWeaponAvailability( null, WeaponTable.Shotgun, b );
	},

	beach_Flag1_Axis_Captured = function( trigger )
	{
		Map.SetForwardFlag(false);
		Util.MapDebugPrint( "beach_Flag1_Axis_Captured" );
	},

	beach_Flag1_Allies_Captured = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "CHECKPOINT_beach_Flag1" );
		Map.SetForwardFlag(true);
		Util.MapDebugPrint( "beach_Flag1_Allies_Captured" );
	},

	Wall_Destroyed = function()
	{
		if (!Map.wallDestroyed)
		{
			Map.wallDestroyed = true;
			SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_.*_gun.*" );
			SetAvailableMapGoals( TEAM.ALLIES, true, {
				"ATTACK_.*_gun.*",
				".*Command_Post",
				"PLANT.*Anti_Tank_Gun",
				".*CAB_.*",
			});
		}
	},

	SeaWall_Destroyed = function( trigger )
	{
		Map.seaWallDestroyed = true;
		sleep(1);
		Map.Wall_Destroyed();
		if(Map.ForwardSpawn){
			Util.SetRoleForGoals( "CHECKPOINT_beach_Flag1", ROLE.ATTACKER );
		}
		Util.MapDebugPrint( "SeaWall_Destroyed" );
	},

	SideWall_Destroyed = function( trigger )
	{
		sleep(1);
		Map.Wall_Destroyed();
		Util.MapDebugPrint( "SideWall_Destroyed" );
	},

	East_Gun_Planted = function ( trigger )
	{
		Map.EastDyno += 1;

		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_east_dyno.*" );

		Util.MapDebugPrint( "East_Gun_Planted" );
	},

	West_Gun_Planted = function ( trigger )
	{
		Map.WestDyno += 1;

		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_west_dyno.*" );

		Util.MapDebugPrint( "West_Gun_Planted" );
	},

	East_Gun_Defuse = function ( trigger )
	{
		Map.EastDyno -= 1;

		if ( Map.EastDyno < 1  )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_east_dyno.*" );
		}
		Util.MapDebugPrint( "East_Gun_Defuse" );
	},

	West_Gun_Defuse = function ( trigger )
	{
		Map.WestDyno -= 1;

		if ( Map.WestDyno < 1  )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_west_dyno.*" );
		}
		Util.MapDebugPrint( "West_Gun_Defuse" );
	},

	two_minute = function( trigger )
	{
		if (GetGameTimeLeft() > 0)
		{
			Map.FocusPrimary = true;
			SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_flag.*" );
		}
		Util.MapDebugPrint( "two_minute" );
	},

	Allies_Win = function( trigger )
	{
		ETUtil.WinningChat( TEAM.ALLIES );
		ETUtil.LosingChat( TEAM.AXIS );
		Util.MapDebugPrint( "Allies_Win" );
	},

};

global OnMapLoad = function()
{
	OnTrigger( "East Anti-tank gun destroyed!!!", Map.East_Anti_Tank_Gun_Destroyed );
	OnTrigger( "West Anti-Tank gun destroyed!!!", Map.West_Anti_Tank_Gun_Destroyed );
	OnTrigger( "The Axis have reclaimed the seawall!", Map.beach_Flag1_Axis_Captured );
	OnTrigger( "The Allies are advancing up the beach!", Map.beach_Flag1_Allies_Captured );
	OnTrigger( "The allies have breached the seawall!!!", Map.SeaWall_Destroyed );
	OnTrigger( "The allies have destroyed the side wall!!!", Map.SideWall_Destroyed );
	OnTrigger( "The Allies have taken control of the beach!", Map.Allies_Win );
	OnTrigger( "Planted at East Anti Tank Gun.", Map.East_Gun_Planted );
	OnTrigger( "Defused at East Anti Tank Gun.", Map.East_Gun_Defuse );
	OnTrigger( "Planted at West Anti Tank Gun.", Map.West_Gun_Planted );
	OnTrigger( "Defused at West Anti Tank Gun.", Map.West_Gun_Defuse );
	OnTrigger( "two minute warning.", Map.two_minute );

	Util.DisableGoal( ".*", true ); // all but routes
	SetAvailableMapGoals( TEAM.AXIS, !b, ".*MG42_center.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, {
		".*Command_Post",
		".*CAB_.*",
		"ARTILLERY_S_x.*",
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"CHECKPOINT_beach_Flag1",
		"PLANT_Side_Wall",
		"ARTILLERY_S_a.*",
	});

	Map.SetForwardFlag(false);

	Util.SetRoleForTable({ "MOUNTMG42_bunker_e.", "DEFEND_east_bunker.*", "DEFEND_east_gun.*" }, ROLE.DEFENDER1);
	Util.SetRoleForTable({ "MOUNTMG42_bunker_w.", "DEFEND_west_bunker.*", "DEFEND_west_gun.*" }, ROLE.DEFENDER2);
	Util.SetRoleForTable({ "MOUNTMG42_center.", "DEFEND_center.*", "MOUNTMG42_lower" }, ROLE.DEFENDER3);
	Util.SetRoleForGoals( "DEFEND_front.*", ROLE.ATTACKER);
	Util.SetRoleForGoals( "DEFEND_flag.*", ROLE.DEFENDER);

	SetGoalPriority( "SNIPE.*", 0.81 );
	SetGoalPriority( "MOUNTMG42.*", 0.69 );
	SetGoalPriority( "CHECKPOINT_beach_Flag1", 0.6 );
	SetGoalPriority( "DEFEND_.*_dyno.*", 0.9 );
	SetGoalPriority( "DEFUSE_Command_Post.*", 0.81, TEAM.ALLIES, CLASS.ENGINEER, true);
	SetGoalPriority( "PLANT_Command_Post.*", 0.7, TEAM.AXIS, CLASS.ENGINEER);

	foreach (goal in { "DEFEND_.*", "MOUNTMG42_.*", "CALLARTILLERY_.*",
		"SNIPE_.*", "BUILD_Command_Post", "PLANT_Side_Wall"  }){
		Util.SetMaxUsers(1, goal);
	}
	Util.SetMaxUsersInProgress( 5, "DEFEND_.*_dyno.*" );

	Util.SetGoalPosition( 1530,-13770,-50, "PLANT_Side_Wall" );

	SetMapGoalProperties( "ATTACK_.*", {mincamptime=3, maxcamptime=30} );
	SetMapGoalProperties( "DEFEND_.*", {mincamptime=10, maxcamptime=35} );
	SetMapGoalProperties( "DEFEND_center.*", {mincamptime=20, maxcamptime=60} );
	SetMapGoalProperties( "DEFEND_front.*", {mincamptime=30, maxcamptime=90} );
	SetMapGoalProperties( "SNIPE_.*", {mincamptime=5, maxcamptime=40} );
	SetMapGoalProperties( "MOUNTMG42_.*", {mincamptime=10, maxcamptime=250} );

	MapRoutes =
	{
		CHECKPOINT_beach_Flag1 = {
			ROUTE_allied1 = {
				ROUTE_b11 = {
					ROUTE_b21 = { Weight=2 },
					ROUTE_b22 = {},
				},
				ROUTE_b12 = {
					ROUTE_b22 = {},
					ROUTE_b23 = {},
				},
			},
			ROUTE_allied2 = {
				ROUTE_b11 = {},
				ROUTE_b12 = {},
			},
			ROUTE_allied3 = {
				ROUTE_b12 = {},
				ROUTE_b13 = {
					ROUTE_b23 = {},
					ROUTE_b24 = {},
				},
			},
			ROUTE_allied4 = {
				ROUTE_b14 = {
					ROUTE_b23 = {},
					ROUTE_b24 = {},
				},
				ROUTE_b15 = {
					ROUTE_b25 = {},
					ROUTE_b26 = {},
				},
				ROUTE_b16 = {
					ROUTE_b25 = {},
					ROUTE_b26 = {},
				},
			},
			ROUTE_allied5 = {
				ROUTE_b15 = {},
				ROUTE_b16 = { Weight=2 },
			},
			ROUTE_barracks = {
				ROUTE_command_post2 = {},
				ROUTE_west = {},
			},
		},
		PLANT_East_Anti_Tank_Gun = {
			ROUTE_flag = {
				ROUTE_command_post = {
					ROUTE_center = {
						ROUTE_east_gun1 = {},
						ROUTE_east_gun2 = { Weight=0.7 },
						ROUTE_east_gun3 = {},
					},
				},
				ROUTE_command_post2 = { ROUTE_center = {}},
				ROUTE_west = { Weight=3, ROUTE_center = {}},
			}
		},
		PLANT_West_Anti_Tank_Gun = {
			ROUTE_flag = {
				ROUTE_command_post = {
					ROUTE_center = {
						ROUTE_west_gun1 = {},
						ROUTE_west_gun2 = { Weight=0.7 },
						ROUTE_west_gun3 = {},
					},
				},
				ROUTE_command_post2 = { ROUTE_center = {}},
				ROUTE_west = { Weight=3, ROUTE_center = {}},
			}
		},
	};
	MapRoutes.PLANT_Side_Wall = MapRoutes.CHECKPOINT_beach_Flag1;
	MapRoutes.ATTACK_east_gun1 = MapRoutes.PLANT_East_Anti_Tank_Gun;
	MapRoutes.ATTACK_east_gun2 = MapRoutes.ATTACK_east_gun1;
	MapRoutes.ATTACK_east_gun3 = MapRoutes.ATTACK_east_gun1;
	MapRoutes.ATTACK_east_gun4 = MapRoutes.ATTACK_east_gun1;
	MapRoutes.ATTACK_west_gun1 = MapRoutes.PLANT_West_Anti_Tank_Gun;
	MapRoutes.ATTACK_west_gun2 = MapRoutes.ATTACK_west_gun1;
	MapRoutes.ATTACK_west_gun3 = MapRoutes.ATTACK_west_gun1;
	MapRoutes.ATTACK_west_gun4 = MapRoutes.ATTACK_west_gun1;
	Util.Routes(MapRoutes);

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

global OnBotJoin = function( bot )
{
	bot.MaxViewDistance = 4700;
	Map.SetSpawn1(bot);
};
