//==========================================================================================
//
//	uje_paris.gm
//
//	        Who       	When		   What
//------------------------------------------------------------------------------------------
//	^1[UJE]^3Niek	08 March 2018	Initial Script
//	^1[UJE]^3Captain	14 March 2018	Attack,Defense,Rôles,Improvement
//	^1[UJE]^3Captain	26 March 2018	Clean/Fix Alignment
//
//==========================================================================================
//

global Map =
{
	Debug = 0, // please set to zero before distributing your script

    Movers =
    {
	"MOVER_tank1",
	"MOVER_tank2",
    },
	tank1atsouth = false,
	tank2atnorth = false,
	tank1build = false,
	trucksouth = true,
	trucknorth = true,
	planetank1 = false,
	planetank2 = false,

	Roles =
	{
		AXIS =
		{
		      AllBots = true, // each bot is considered for a role
			ATTACKER = // Attack First Corner
			{
				numbots = 3,
			},

			ESCORT = // Escort
			{
				numbots = 4,
				crucialClass = CLASS.MEDIC,
			},

			INFILTRATOR = // Plant CP
			{
				numbots = 1,
				crucialClass = CLASS.COVERTOPS,
			},
		},
		ALLIES =
		{
			AllBots = true, // default: every other bot
			DEFENDER = // Defend First Corner
			{
				numbots = 3,
				MinBotsForRole = 3,
			},

			INFILTRATOR = // Plant CP
			{
				numbots = 1,
				crucialClass = CLASS.COVERTOPS,
				MinBotsForRole = 2,
			},
		},
	},

	North_Tank_Built = function( trigger )
	{
	Map.tank2build = true;

	if ( Map.tank2atnorth && Map.trucknorth )
	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank2" );
	}
	else
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "ESCORT_tank2" );
	}
	SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_North_Tank" );
	SetGoalRole("ESCORT_tank2", ROLE.ESCORT);

		Util.MapDebugPrint( "North_Tank_Built" );
	},

	North_Tank_Destroyed = function( trigger )
	{
	Map.tank2build = false;
	if ( !Map.planetank2 )
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_North_Tank" );
	}
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank2" );
	ClearGoalRole("ESCORT_tank2", ROLE.ESCORT);

		Util.MapDebugPrint( "North_Tank_Destroyed" );
	},

	North_Truck_Destroyed = function( trigger )
	{
	Map.trucknorth = false;
	if ( Map.tank2atnorth && Map.tank2build )
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "ESCORT_tank2" );
	}
		Util.MapDebugPrint( "North_Truck_Destroyed" );
	},

	South_Tank_Built = function( trigger )
	{
	Map.tank1build = true;

	if ( Map.tank1atsouth && Map.trucksouth )
	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank1" );
	}
	else
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "ESCORT_tank1" );
	}
	SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_South_Tank" );
	SetGoalRole("ESCORT_tank1", ROLE.ESCORT);

	      Util.MapDebugPrint( "South_Tank_Built" );
	},

	South_Tank_Destroyed = function( trigger )
	{
	Map.tank1build = false;
	if ( !Map.planetank1 )
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_South_Tank" );
	}
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank1" );
	ClearGoalRole("ESCORT_tank1", ROLE.ESCORT);

		Util.MapDebugPrint( "South_Tank_Destroyed" );
	},

	South_Truck_Destroyed = function( trigger )
	{
	Map.trucksouth = false;
	if ( Map.tank1atsouth && Map.tank1build )
	{
	SetAvailableMapGoals( TEAM.AXIS, true, "ESCORT_tank1" );
	}
		Util.MapDebugPrint( "South_Truck_Destroyed" );
	},

      South_Plane = function( trigger )
	{
	Map.planetank1 = true;
	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK1_Tower.*" );
	Util.ClearRoleForGoals( "DEFEND_TK1_Tower.*", ROLE.DEFENDER);

	SetAvailableMapGoals( TEAM.AXIS, false, {"ATTACK_TK1_Tower.*","BUILD_South_Tank"} );
	Util.SetRoleForTable("ESCORT_tank2.*", ROLE.ESCORT );

		Util.MapDebugPrint( "South_Plane" );
	},

	North_Plane = function( trigger )
	{
	Map.planetank2 = true;
	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK2_Tower.*" );

	SetAvailableMapGoals( TEAM.AXIS, false, {"ATTACK_TK2_Tower.*","BUILD_North_Tank"} );
	Util.SetRoleForTable("ESCORT_tank1.*", ROLE.ESCORT );

		Util.MapDebugPrint( "North_Plane" );
	},

      tank1_at_first_corner =
      {
 	Name="tank1_at_first_corner",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
 		Util.MapDebugPrint(GetEntName(ent) + "_at_first_corner" );
 	},
 	OnExit = function(ent)
 	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_TK1_Fcorner.*" );
      SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_TK1_Scorner.*" );
	SetGoalRole("ATTACK_TK1_Scorner.*", ROLE.ATTACKER);
	Util.ClearRoleForGoals( "ATTACK_TK1_Fcorner.*", ROLE.ATTACKER);

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK1_Fcorner.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_TK1_Scorner.*" );
	SetGoalRole("DEFEND_TK1_Scorner.*", ROLE.DEFENDER);
	Util.ClearRoleForGoals( "DEFEND_TK1_Fcorner.*", ROLE.DEFENDER);

 		Util.MapDebugPrint(GetEntName(ent) + "_pass_first_corner" );
 	},
},

      tank1_at_second_corner =
      {
 	Name="tank1_at_second_corner",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
 		Util.MapDebugPrint(GetEntName(ent) + "_at_second_corner" );
 	},
 	OnExit = function(ent)
 	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_TK1_Scorner.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_South.*" );
	SetGoalRole("ATTACK_South.*", ROLE.ATTACKER);
	Util.ClearRoleForGoals( "ATTACK_TK1_Scorner.*", ROLE.ATTACKER);

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK1_Scorner.*" );
      SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_South.*" );
	SetGoalRole("DEFEND_South.*", ROLE.DEFENDER);
	Util.ClearRoleForGoals( "DEFEND_TK1_Scorner.*", ROLE.DEFENDER);

 		Util.MapDebugPrint(GetEntName(ent) + "_pass_second_corner" );
 	},
},

	tank1_at_south_barrier =
      {
 	Name="tank1_at_south_barrier",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
	Map.tank1atsouth = true;
	if ( Map.trucksouth )
	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank1" );
	SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_South_Truck" );
	}
 		Util.MapDebugPrint(GetEntName(ent) + "_at_south_barrier" );
 	},
 	OnExit = function(ent)
 	{
	Map.tank1atsouth = false;

	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_South.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_TK1_Tower.*" );
	SetGoalRole("ATTACK_TK1_Tower.*", ROLE.ATTACKER);
	Util.ClearRoleForGoals( "ATTACK_South.*", ROLE.ATTACKER);

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_South.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_TK1_Tower.*" );
	SetGoalRole("DEFEND_TK1_Tower.*", ROLE.DEFENDER);
	Util.ClearRoleForGoals( "DEFEND_South.*", ROLE.DEFENDER);

 		Util.MapDebugPrint(GetEntName(ent) + " _pass_south_barrier" );
 	},
},

	tank1_at_end =
      {
 	Name="tank1_at_end",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
      SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank1" );

 	      Util.MapDebugPrint(GetEntName(ent) + "_at_end" );
 	},
 	OnExit = function(ent)
 	{
 		Util.MapDebugPrint(GetEntName(ent) + "_at_end" );
 	},
},

	tank2_at_first_corner =
      {
 	Name="tank2_at_first_corner",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
            Util.MapDebugPrint(GetEntName(ent) + "_at_first_corner" );
 	},
 	OnExit = function(ent)
 	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_TK2_Fcorner.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_TK2_Scorner.*" );;

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK2_Fcorner.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_TK2_Scorner.*" );

 		Util.MapDebugPrint(GetEntName(ent) + "_pass_first_corner" );
 	},
},

	tank2_at_second_corner =
      {
 	Name="tank2_at_second_corner",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
 	      Util.MapDebugPrint(GetEntName(ent) + "_at_second_corner" );
 	},
 	OnExit = function(ent)
 	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_TK2_Scorner.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_North.*" );

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_TK2_Scorner.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_North.*" );

 		Util.MapDebugPrint(GetEntName(ent) + "_pass_second_corner" );
 	},
},

	tank2_at_north_barrier =
      {
 	Name="tank2_at_north_barrier",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
	Map.tank2atnorth = true;
	if ( Map.trucknorth )
	{
	SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank2" );
	SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_North_Truck" );
	}
 	      Util.MapDebugPrint(GetEntName(ent) + "_at_north_barrier" );
 	},
 	OnExit = function(ent)
 	{
	Map.tank2atnorth = false;
	SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_TK2_Tower.*" );
	SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_North.*" );

	SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_North.*" );
	SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_TK2_Tower.*" );

 		Util.MapDebugPrint(GetEntName(ent) + "_pass_north_barrier" );
 	},
},

	tank2_at_end =
      {
 	Name="tank2_at_end",
 	TriggerOnClass = { CLASS.VEHICLE_HVY, CLASS.VEHICLE },
 	OnEnter = function(ent)
 	{
      SetAvailableMapGoals( TEAM.AXIS, false, "ESCORT_tank2" );

 	      Util.MapDebugPrint(GetEntName(ent) + "_at_end" );
 	},
 	OnExit = function(ent)
 	{
	Map.tank2atnorth = false;

 		Util.MapDebugPrint(GetEntName(ent) + "_at_end" );
 	},
},

	Allied_Command_Post_Built = function( trigger )
	{

	SetAvailableMapGoals( TEAM.ALLIES, false, {"BUILD_Command_Post","PLANT_Command_Post"} );

	SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_Command_Post" );
	SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_Command_Post" );

		Util.MapDebugPrint( "Allied_Command_Post_Built" );
	},

	Axis_Command_Post_Built = function( trigger )
	{
      SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_Command_Post" );
      SetAvailableMapGoals( TEAM.ALLIES, false, "BUILD_Command_Post" );

	SetAvailableMapGoals( TEAM.AXIS, false, {"BUILD_Command_Post","PLANT_Command_Post"} );

		Util.MapDebugPrint( "Axis_Command_Post_Built" );
	},

	Axis_Command_Post_Destroyed = function( trigger )
	{
	SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_Command_Post" );
	SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_Command_Post" );

	SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_Command_Post" );
	SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_Command_Post" );

		Util.MapDebugPrint( "Axis_Command_Post_Destroyed" );
	},

	Allied_Command_Post_Destroyed = function( trigger )
	{
	SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_Command_Post" );
	SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_Command_Post" );

	SetAvailableMapGoals( TEAM.AXIS, true, "BUILD_Command_Post" );
	SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_Command_Post" );

		Util.MapDebugPrint( "Allied_Command_Post_Destroyed" );
	},
};

global OnMapLoad = function()
{
	// Register callback functions

	OnTrigger( "^4The North Tank has been repaired!", Map.North_Tank_Built );
	OnTrigger( "^4The North Tank has been damaged!", Map.North_Tank_Destroyed );
	OnTrigger( "^4The Axis destroyed the North Barrier!", Map.North_Truck_Destroyed );
	OnTrigger( "The plane destroyed the North Tank!", Map.North_Plane );

	OnTrigger( "^8The South Tank has been repaired!", Map.South_Tank_Built );
	OnTrigger( "^8The South Tank has been damaged!", Map.South_Tank_Destroyed );
	OnTrigger( "^8The Axis destroyed the South Barrier!", Map.South_Truck_Destroyed );
	OnTrigger( "The plane destroyed the South Tank!", Map.South_Plane );

	OnTrigger( "^4Allied Command Post constructed", Map.Allied_Command_Post_Built );
	OnTrigger( "^1Axis team has destroyed the Allied Command Post", Map.Allied_Command_Post_Destroyed );

	OnTrigger( "^4Axis Command Post constructed", Map.Axis_Command_Post_Built );
	OnTrigger( "^4Allied team has destroyed the Axis Command Post", Map.Axis_Command_Post_Destroyed );

	//Tank TriggerRegion
	tank1_at_first_corner = OnTriggerRegion(AABB(-1990.889,-3438.944,1.125,-1928.133,-2966.306,75.147), Map.tank1_at_first_corner);
	tank1_at_second_corner = OnTriggerRegion(AABB(-1543.271,-1368.011,1.125,-1487.747,-1038.882,75.129), Map.tank1_at_second_corner);
	tank1_at_south_barrier = OnTriggerRegion(AABB(-873.095,-1422.819,1.126,-827.204,-1023.969,87.705), Map.tank1_at_south_barrier);
	tank1_at_end = OnTriggerRegion(AABB(1802.966,-240.187,1.125,1857.688,16.665,75.129),  Map.tank1_at_end);
	tank2_at_first_corner = OnTriggerRegion(AABB(-2040.349,2820.197,1.125,-1969.393,3291.933,75.128), Map.tank2_at_first_corner);
	tank2_at_second_corner = OnTriggerRegion(AABB(-1544.184,1029.239,1.126,-1488.234,1417.508,75.131), Map.tank2_at_second_corner);
	tank2_at_north_barrier = OnTriggerRegion(AABB(-794.647,1050.244,1.125,-749.622,1393.364,75.154), Map.tank2_at_north_barrier);
	tank2_at_end = OnTriggerRegion(AABB(1787.196,52.985,1.282,1852.181,232.799,75.282), Map.tank2_at_end);

	// all but routes
	Util.DisableGoal( ".*", true );

	//activation ALLIES
	SetAvailableMapGoals( TEAM.ALLIES, true, {
	"BUILD_Command_Post",
	"DEFEND_TK1_Fcorner.*",
	"DEFEND_TK2_Fcorner.*",
	".*CAB.*",
	});

	//activation AXIS
	SetAvailableMapGoals( TEAM.AXIS, true, {
	"BUILD_Command_Post",
	"ATTACK_TK1_Fcorner.*",
	"ATTACK_TK2_Fcorner.*",
	".*CAB.*",

	});

	// Max users per goal
	Util.SetMaxUsers( 1, "PLANT.*" );
	Util.SetMaxUsers( 1, "ESCORT.*" );
	Util.SetMaxUsers( 1, "BUILD.*" );
	Util.SetMaxUsers( 1, "ATTACK.*" );
	Util.SetMaxUsers( 1, "DEFEND.*" );

	// Camp times
	//SetMapGoalProperties( "MOUNTMG42_.*", {MinCampTime=15, MaxCampTime=90} );
	SetMapGoalProperties( "ATTACK.*", {MinCampTime=40, MaxCampTime=80} );
	SetMapGoalProperties( "DEFEND.*", {MinCampTime=40, MaxCampTime=80} );

	//Priorities
	SetGoalPriority( "BUILD_North_Tank", 0.91 );
	SetGoalPriority( "BUILD_south_Tank", 0.91 );
	SetGoalPriority( "BUILD_Command_Post", 0.82 );
	SetGoalPriority( "PLANT_Command_Post", 0.82 );
	SetGoalPriority( "PLANT_North_Truck", 0.91, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_South_Truck", 0.91, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "ESCORT.*", 0.85 );

	// *** ROLES ***
	SetGoalRole("ATTACK_TK1_Fcorner.*", ROLE.ATTACKER);
	SetGoalRole( "PLANT_Command_Post" , ROLE.INFILTRATOR);
	SetGoalRole("DEFEND_TK1_Fcorner.*", ROLE.DEFENDER);

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

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 90.0;
};
