//==========================================================================================
//
//	cherbourg.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	palota	16 November 2012	Initial Script
//
//==========================================================================================
//

global Map =
{
	Debug = 0,
	bankwallDestroyed = false,
	barricadeDestroyed = true,
	factoryTeam = TEAM.AXIS,
	Movers = { "MOVER_tower", "MOVER_roadblock" },

	Roles =
	{
		AXIS =
		{
			AllBots = true, // each bot is considered for a role
			DEFENDER1 =
			{
				numbots = 9,
			},
			DEFENDER2 =
			{
				numbots = 9,
			},
			DEFENDER3 =
			{
				numbots = 9,
			},
			DEFENDER =
			{
				numbots = 9,
			},
		}
	},

	tower_Built = function( trigger )
	{
		SetAvailableMapGoals(TEAM.ALLIES, true, ".*MG42_tower");
		Util.MapDebugPrint( "tower_Built" );
	},

	tower_Destroyed = function( trigger )
	{
		SetAvailableMapGoals(TEAM.ALLIES, false, ".*MG42_tower");
		Util.MapDebugPrint( "tower_Destroyed" );
	},

	roadblock_Built = function( trigger )
	{
		SetAvailableMapGoals(TEAM.AXIS, false, "BUILD_Axis_Roadblock" );
		SetAvailableMapGoals(TEAM.AXIS, true, ".*MG42_Axis_Roadblock");
		SetAvailableMapGoals(TEAM.ALLIES, true, "PLANT_Axis_Roadblock" );
		Util.MapDebugPrint( "roadblock_Built" );
	},

	roadblock_Destroyed = function( trigger )
	{
		SetAvailableMapGoals(TEAM.AXIS, true, "BUILD_Axis_Roadblock" );
		SetAvailableMapGoals(TEAM.AXIS, false, ".*MG42_Axis_Roadblock");
		SetAvailableMapGoals(TEAM.ALLIES, false, "PLANT_Axis_Roadblock" );
		Util.MapDebugPrint( "roadblock_Destroyed" );
	},

	barricade_Built = function( trigger )
	{
		Map.barricadeDestroyed = false;
		Util.DisableGoal("ROUTE_barricade");
		if(Map.factoryTeam == TEAM.AXIS){
			SetGoalRole("CHECKPOINT_factoryflag", ROLE.INFILTRATOR);
		}
		SetGoalPriority("DEFEND_factory[123]", 0.49);
		Util.MapDebugPrint( "barricade_Built" );
	},

	barricade_Destroyed = function( trigger )
	{
		Map.barricadeDestroyed = true;
		Util.EnableGoal("ROUTE_barricade");
		ClearGoalRole("CHECKPOINT_factoryflag", ROLE.INFILTRATOR);
		SetGoalPriority("DEFEND_factory[123]", 0.5);
		Util.MapDebugPrint( "barricade_Destroyed" );
	},

	bankwall_Destroyed = function( trigger )
	{
		Map.bankwallDestroyed = true;
		ClearGoalRole("CHECKPOINT_bankflag", ROLE.INFILTRATOR);
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_bank.*" );
		Util.MapDebugPrint( "bankwall_Destroyed" );
	},

	yardwall_Destroyed = function( trigger )
	{
		Util.EnableGoal("ROUTE_yard_wall");
		Util.MapDebugPrint( "yardwall_Destroyed" );
	},


	Dam_Flag_Axis = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_dam.*" );
		ClearGoalRole("CHECKPOINT_damflag", ROLE.DEFENDER1);
		Util.MapDebugPrint( "Dam_Flag_Axis" );
	},

	Dam_Flag_Allies = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_dam.*" );
		SetGoalRole("CHECKPOINT_damflag", ROLE.DEFENDER1);
		Util.MapDebugPrint( "Dam_Flag_Allies" );
	},

	Factory_Flag_Axis = function( trigger )
	{
		Map.factoryTeam = TEAM.AXIS;
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_factory.*" );
		if(!Map.barricadeDestroyed){
			SetGoalRole("CHECKPOINT_factoryflag", ROLE.INFILTRATOR);
		}
		ClearGoalRole("CHECKPOINT_factoryflag", ROLE.DEFENDER2);
		Util.MapDebugPrint( "Factory_Flag_Axis" );
	},

	Factory_Flag_Allies = function( trigger )
	{
		Map.factoryTeam = TEAM.ALLIES;
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_factory.*" );
		ClearGoalRole("CHECKPOINT_factoryflag", ROLE.INFILTRATOR);
		SetGoalRole("CHECKPOINT_factoryflag", ROLE.DEFENDER2);
		Util.MapDebugPrint( "Factory_Flag_Allies" );
	},

	Dock_Flag_Axis = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_dock.*" );
		ClearGoalRole("CHECKPOINT_dockflag", ROLE.DEFENDER2);
		Util.MapDebugPrint( "Dock_Flag_Axis" );
	},

	Dock_Flag_Allies = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_dock.*" );
		SetGoalRole("CHECKPOINT_dockflag", ROLE.DEFENDER2);
		Util.MapDebugPrint( "Dock_Flag_Allies" );
	},

	Courtyard_Flag_Axis = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_yard.*" );
		ClearGoalRole("CHECKPOINT_yardflag", ROLE.DEFENDER3);
		Util.MapDebugPrint( "Courtyard_Flag_Axis" );
	},

	Courtyard_Flag_Allies = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_yard.*" );
		SetGoalRole("CHECKPOINT_yardflag", ROLE.DEFENDER3);
		Util.MapDebugPrint( "Courtyard_Flag_Allies" );
	},

	Bank_Flag_Axis = function( trigger )
	{
		if(!Map.bankwallDestroyed){
			SetGoalRole("CHECKPOINT_bankflag", ROLE.INFILTRATOR);
		}else{
			SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_bank.*" );
		}
		ClearGoalRole("CHECKPOINT_bankflag", ROLE.DEFENDER);
		Util.MapDebugPrint( "Bank_Flag_Axis" );
	},

	Bank_Flag_Allies = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_bank.*" );
		ClearGoalRole("CHECKPOINT_bankflag", ROLE.INFILTRATOR);
		SetGoalRole("CHECKPOINT_bankflag", ROLE.DEFENDER);
		Util.MapDebugPrint( "Bank_Flag_Allies" );
	},
};

global OnMapLoad = function()
{
	OnTrigger( "Allied Tower has been constructed.", Map.tower_Built );
	OnTrigger( "Allied Tower has been destroyed.", Map.tower_Destroyed );
	OnTrigger( "Axis Roadblock has been constructed.", Map.roadblock_Built );
	OnTrigger( "Axis Roadblock has been destroyed.", Map.roadblock_Destroyed );
	OnTrigger( "Barricade has been constructed.", Map.barricade_Built );
	OnTrigger( "Axis Barricade has been destroyed.", Map.barricade_Destroyed );
	OnTrigger( "bankwall Destroyed.", Map.bankwall_Destroyed );
	OnTrigger( "the Courtyard Wall Destroyed.", Map.yardwall_Destroyed );
	OnTrigger( "Axis capture the Dam Flag!", Map.Dam_Flag_Axis );
	OnTrigger( "Allies capture the Dam Flag!", Map.Dam_Flag_Allies );
	OnTrigger( "Axis capture the Factory Flag!", Map.Factory_Flag_Axis );
	OnTrigger( "Allies capture the Factory Flag!", Map.Factory_Flag_Allies );
	OnTrigger( "Axis capture the Dock Flag!", Map.Dock_Flag_Axis );
	OnTrigger( "Allies capture the Dock Flag!", Map.Dock_Flag_Allies );
	OnTrigger( "Axis capture the Courtyard Flag!", Map.Courtyard_Flag_Axis );
	OnTrigger( "Allies capture the Courtyard Flag!", Map.Courtyard_Flag_Allies );
	OnTrigger( "Axis capture the Bank Flag!", Map.Bank_Flag_Axis );
	OnTrigger( "Allies capture the Bank Flag!", Map.Bank_Flag_Allies );

	Util.DisableGoal("ROUTE_yard_wall");
	Util.DisableGoal(".*MG42_tower");
	Util.DisableGoal(".*MG42_Axis_Roadblock");
	Util.LimitToTeam(TEAM.AXIS, "DEFEND.*");
	Util.LimitToTeam(TEAM.AXIS, "PLANTMINE.*");
	Util.LimitToTeam(TEAM.ALLIES, "ATTACK.*");
	SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_bank.*" );

	SetGoalPriority("BUILD_Axis_Command_Post", 0.95);
	SetGoalPriority("SNIPE.*", 0.75, TEAM.AXIS);
	SetGoalPriority("SNIPE.*", 0.81, TEAM.ALLIES);
	SetGoalPriority("PLANT_tower", 0.74);
	SetGoalPriority("PLANT_Allied_Command_Post", 0.75);
	SetGoalPriority("PLANT_Axis_Command_Post", 0.7);

	ClearGoalRole("CHECKPOINT_.*", {ROLE.INFILTRATOR,ROLE.DEFENDER,ROLE.DEFENDER1,ROLE.DEFENDER2,ROLE.DEFENDER3});
	SetGoalRole({"CHECKPOINT_bankflag", "PLANT_Axis_Command_Post"}, ROLE.INFILTRATOR);
	SetGoalRole("MOUNTMG42_Axis_Roadblock", {ROLE.DEFENDER, ROLE.DEFENDER2} );
	SetGoalRole("DEFEND_dam.*", ROLE.DEFENDER1);
	SetGoalRole("DEFEND_factory.*", ROLE.DEFENDER2);
	SetGoalRole("DEFEND_dock.*", ROLE.DEFENDER2);
	SetGoalRole("DEFEND_yard.*", ROLE.DEFENDER3);
	SetGoalRole("DEFEND_bank.*", ROLE.DEFENDER);
	SetGoalRole("DEFEND_road.*", ROLE.DEFENDER);

	Util.AddUsePoint("PLANT_Courtyard_Wall", Vec3(2336.309, -1019.527, -531.018));
	Util.AddUsePoint("PLANT_Axis_Barricade", Vec3(-964.671, -2420.430, -423.875));
	Util.AddUsePoint("BUILD_Axis_Roadblock", Vec3(118.425, -1150.348, -527.875));
	Util.AddUsePoint("PLANT_Axis_Roadblock", Vec3(11.328, -932.969, -527.875));
	Util.SetGoalOffset(0,20,0, "MOUNTMG42_tower");

	SetMapGoalProperties( "ATTACK_.*", {mincamptime=5, maxcamptime=15} );
	SetMapGoalProperties( "DEFEND_.*", {mincamptime=10, maxcamptime=25} );

	Util.SetMaxUsers(1, "BUILD_.*");
	Util.SetMaxUsers(1, "MOUNTMG42_.*");

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

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 100.0;
	Util.IgnoreTargetGoalTable( bot, Map.Movers );
};
