//==========================================================================================
//
//	et_ufo_final.gm
//
//	       Who          	       When		                      What
//------------------------------------------------------------------------------------------
//	^1[UJE]^3Captain	        13 August 2018	                 Initial Script
//
//==========================================================================================
//

global Map =
{
	Debug = 0, // please set to zero before distributing your script
	MainStatus = 0,
	SouthStatus = 0,
	DocStatus = 0,
	Allied_Command_Post = 0,
	Axis_Command_Post = 0,
	AllyInside = 0,
	// Rôles
	Roles =
	{	
		AXIS =
		{
		AllBots = true, // each bot is considered for a role
			INFILTRATOR = //PLANT CP
			{
				numbots = 1,
				crucialClass = CLASS.COVERTOPS,
			},
		},
		ALLIES =
		{
			AllBots = true, // default: every other bot
		      INFILTRATOR = //PLANT CP
			{
			      numbots = 1,
				crucialClass = CLASS.COVERTOPS,
			},
		},
	},
	// Navigation
	Navigation =
	{     // /bot waypoint_setproperty paththrough Navigation_PT:window
		window =
		{
			navigate = function(_this)
			{
				_this.Bot.PressButton(BTN.JUMP);
				sleep(0.25);
				_this.Bot.HoldButton(BTN.SPRINT, 3);
				_this.Bot.HoldButton(BTN.CROUCH, 1);
				sleep(3);
			},
		},
		// /bot waypoint_setproperty paththrough Navigation_PT:boxes
		boxes =
		{
			navigate = function(_this)
			{
				_this.Bot.HoldButton(BTN.JUMP, 0.55);
				sleep(0.55);
			},
		},
		// /bot waypoint_setproperty paththrough Navigation_PT:rail
		rail =
		{
			navigate = function(_this)
			{
				_this.Bot.PressButton(BTN.JUMP);
				sleep(0.25);
			},
		},
	},

	Allied_Command_Post_Built = function( trigger )
	{
      Map.Allied_Command_Post = 1;
	SetAvailableMapGoals( TEAM.AXIS, true, "PLANT_Command_Post");
	SetAvailableMapGoals( TEAM.AXIS, false, "BUILD_Command_Post" );
	
	SetAvailableMapGoals( TEAM.ALLIES, false, {
	      "PLANT_Command_Post",
	      "BUILD_Command_Post"
	});
	
		Util.MapDebugPrint( "Allied_Command_Post_Built" );
	},
	
	Allied_Command_Post_Destroyed = function( trigger )
	{
	Map.Allied_Command_Post = 0;
	if ( !Map.DocStatus && Map.AllyInside == 0 )
	      {
	            SetAvailableMapGoals( TEAM.AXIS, true, {
		      "DEFEND_South.*",
		      "DEFEND_Main.*",
			"AIRSTRIKE_Axis.*",
		      ".*MG42.*"
	      });
	            SetAvailableMapGoals( TEAM.AXIS, false, {
		      "DEFEND_UFO.*",
		      "DEFEND_Doc.*"
	      });
	}
	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" );
	},
	
      Axis_Command_Post_Built = function( trigger )
	{
	Map.Axis_Command_Post = 1;
	if ( Map.MainStatus || Map.SouthStatus )
	{
	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 )
	{
      Map.Axis_Command_Post = 0;
	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( "Axis_Command_Post_Destroyed" );
	},
	
	South_Gate_Planted = function( trigger )
	{

		Util.DisableGoal("DEFUSE_South_Gate.*");
	},
	
	South_Gate_Destroyed = function( trigger )
	{
	Map.SouthStatus = 1;
      SetAvailableMapGoals( TEAM.ALLIES, false, {
		"AIRSTRIKE_Allied_S.*",
		"ATTACK_South.*"
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"ATTACK_Doc.*",
		"FLAG.*"
	});
	if ( Map.Axis_Command_Post )
            {
	      SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_Command_Post" );
	      }
	      else
	      {
	      SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_Command_Post" );
	      }
	SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_First_South.*" );
	if ( Map.AllyInside == 0 )
      {
	SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_South.*" );
	}
		Util.MapDebugPrint( "South_Gate_Destroyed" );
	},
	
	Main_Gate_Planted = function( trigger )
	{
            Util.DisableGoal("DEFUSE_Main_Gate.*");
	},
	
	Main_Gate_Destroyed = function( trigger )
	{
	Map.MainStatus = 1;
	if ( Map.Axis_Command_Post )
	      {
	      SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_Command_Post" );
	      }
	      else
	      {
	      SetAvailableMapGoals( TEAM.ALLIES, true, "BUILD_Command_Post" );
	      }
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"AIRSTRIKE_Allied_M.*",
            "ATTACK_Main.*"
	});	
	SetAvailableMapGoals( TEAM.ALLIES, true, {
	      "ATTACK_Doc.*",
		"FLAG.*"
	});	
      SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_First_Main.*" );
	if ( Map.AllyInside == 0 )
      {
	SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_Main.*" );
	}
		Util.MapDebugPrint( "Main_Gate_Destroyed" );
	},

	The_UFO_Documents_Taken = function( trigger )
	{
	Map.DocStatus = 1;
      SetAvailableMapGoals( TEAM.AXIS, true, {
		"DEFEND_Trans.*",
		"DEFEND_Flex_Trans.*",
		"AIRSTRIKE_Trans.*" 
	});
      SetAvailableMapGoals( TEAM.AXIS, false, {
		"DEFEND_Doc.*",
		"DEFEND_UFO.*"
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"ATTACK_Trans.*",
		"CAPPOINT.*"
	});
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"ATTACK_Doc.*",
		"FLAG.*"
	});
		Util.MapDebugPrint( "UFO_Doc_Taken" );
	},

	The_UFO_Documents_returned = function( trigger )
	{
      Map.DocStatus = 0;
      SetAvailableMapGoals( TEAM.AXIS, false, {
		"DEFEND_Trans.*",
		"DEFEND_Flex_Trans.*",
		"AIRSTRIKE_Trans.*"
	});
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"CAPPOINT.*",
		"ATTACK_Trans.*"		
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"ATTACK_Doc.*",
		"FLAG.*"
	});
	if ( Map.AllyInside == 0 && !Map.Allied_Command_Post )
	{
	SetAvailableMapGoals( TEAM.AXIS, true, {
		"DEFEND_South.*",
		"DEFEND_Main.*",
		"AIRSTRIKE_Axis.*",
		".*MG42.*"
	});
      }
	else
      {
	SetAvailableMapGoals( TEAM.AXIS, true, {
		"DEFEND_UFO.*",
		"DEFEND_Doc.*"
	});
	}
		Util.MapDebugPrint( "UFO_Doc_Returned" );
	},

	The_UFO_Documents_Captured = function ( trigger )
	{
		Util.MapDebugPrint( "UFO_Doc_Secured" );
	},
	
	Ally_Ins = //UFO intrusion area 
	{
		Name = "Ally_Ins",
		TriggerOnClass = CLASS.ANYPLAYER,
		OnEnter = function(ent)
 	      {
		if( GetEntTeam(ent) == TEAM.ALLIES )
			{
				bot = Util.IsBot(ent);
				if ( bot )
				{
				Map.AllyInside += 1;
			      Util.MapDebugPrint(GetEntName(ent) + " ^5Ally Entered Bunker UFO");
				}
		      if ( !Map.DocStatus )
		      {
			sleep(3);
	            SetAvailableMapGoals( TEAM.AXIS, false, {
		      "DEFEND_South.*",
		      "DEFEND_Main.*",
			"AIRSTRIKE_Axis.*",
			"DEFEND_First.*",
		      ".*MG42.*"
	            });
	            SetAvailableMapGoals( TEAM.AXIS, true, {
		      "DEFEND_UFO.*",
		      "DEFEND_Doc.*"
	            });
	            }
		}
 	},
 	OnExit = function(ent)
 	{
		if( GetEntTeam(ent) == TEAM.ALLIES )
			{
				bot = Util.IsBot(ent);
				if ( bot )
				{
				Map.AllyInside -= 1;
				Util.MapDebugPrint(GetEntName(ent) + " ^5UFO Bunker Is Safe" );
				}
			if ( !Map.DocStatus && !Map.Allied_Command_Post && Map.AllyInside == 0 )
	            {
			sleep(3);
	            SetAvailableMapGoals( TEAM.AXIS, true, {
			"AIRSTRIKE_Axis.*",
			"DEFEND_South.*",
			"DEFEND_Main.*",
		      ".*MG42.*"
	            });
	            SetAvailableMapGoals( TEAM.AXIS, false, {
		      "DEFEND_UFO.*",
		      "DEFEND_Doc.*"
	            });
			}
			if ( !Map.MainStatus )
	            {
		      SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_First_Main.*" );
		      }
			if ( !Map.SouthStatus )
	            {
		      SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_First_South.*" );
		      }
		   }
	     }
 	},
 };

global OnMapLoad = function()
{
      //Register callback functions
	OnTrigger( "Allied Command Post constructed. Charge speed increased!", Map.Allied_Command_Post_Built );
	OnTrigger( "Axis team has destroyed the Allied Command Post!", Map.Allied_Command_Post_Destroyed );
	OnTrigger( "Axis Command Post constructed. Charge speed increased!", Map.Axis_Command_Post_Built );
	OnTrigger( "Allied team has destroyed the Axis Command Post!", Map.Axis_Command_Post_Destroyed );
	
	OnTrigger( "Planted at The Main Gate.", Map.Main_Gate_Planted );
	OnTrigger( "The Main Gate Destroyed.", Map.Main_Gate_Destroyed );
	OnTrigger( "Planted at The South Gate.", Map.South_Gate_Planted );
	OnTrigger( "The South Gate Destroyed.", Map.South_Gate_Destroyed );
	
	OnTrigger( "Allies have stolen The UFO Documents!", Map.The_UFO_Documents_Taken );
	OnTrigger( "Flag returned allied_obj3!", Map.The_UFO_Documents_returned );
	OnTrigger( "Allies Transmitted the UFO Documents!", Map.The_UFO_Documents_Captured );
	
	//Region Trigger
	Ally1 = OnTriggerRegion(AABB(-2810.608,-3658.102,730.747,-1025.112,2002.705,1619.245), Map.Ally_Ins);

	//Max users per goal
	Util.SetMaxUsers( 1, "DEFEND.*" );
	Util.SetMaxUsers( 1, "ATTACK.*" );
	Util.SetMaxUsers( 1, ".*MG42.*" );
	Util.SetMaxUsers( 1, "FLAG.*" );
	Util.SetMaxUsers( 1, "BUILD.*" );
	Util.SetMaxUsers( 1, "PLANT.*" );
	
	//Camp times
	SetMapGoalProperties( "ATTACK.*", {MinCampTime=15, MaxCampTime=30});
	SetMapGoalProperties( "DEFEND.*", {MinCampTime=40, MaxCampTime=90});
	SetMapGoalProperties( "MOUNTMG42.*", {MinCampTime=60, MaxCampTime=120});
	
	//SetGoalPriority
	SetGoalPriority( "BUILD_Command_Post.*",  0.98, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Command_Post", 0.96,  TEAM.AXIS, CLASS.COVERTOPS );
	SetGoalPriority( "PLANT_Command_Post", 0.96,  TEAM.ALLIES, CLASS.COVERTOPS );
	SetGoalPriority( "PLANT_South_Gate", 1.0, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Main_Gate", 1.0, TEAM.AXIS, CLASS.ENGINEER );
	SetGoalPriority( "DEFEND.*", 0.96);
      SetGoalPriority( "AIRSTRIKE.*", 1.0);
	SetGoalPriority( "FLAG.*", 0.96);
	Util.LimitToClass( "MOUNT.*", TEAM.AXIS, CLASS.ENGINEER);
	
	//all but routes
	Util.DisableGoal(".*", true);
	
	//Allies goals activation
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"ATTACK_Main.*",
		"ATTACK_South.*",
		"AIRSTRIKE_Allied.*",
		"PLANT_Main_Gate",
		"PLANT_South_Gate"
	});
	
      //Axis goals activation
	SetAvailableMapGoals( TEAM.AXIS, true, {
		"DEFEND_First_Main.*",
		"DEFEND_First_South.*",
		"AIRSTRIKE_Axis.*",
		"BUILD_Command_Post",
		".*MG42.*"
	});
};

global OnBotJoin = function( bot )
{
	// Uncomment for shootable breakables
	bot.TargetBreakableDist = 90.0;
	// Only set MaxViewDistance on maps with limited sight (e.g. fog)
	//bot.MaxViewDistance = 400;
};
global InitializeRoutes = function()
{
	MapRoutes =
	{
		PLANT_South_Gate =
		{
			ROUTE_AlliesSpawn = { ROUTE_south_route = {}, },
		},
		PLANT_Main_Gate =
		{
			ROUTE_AlliesSpawn =
			{
				ROUTE_hill_route = {},
				ROUTE_north_route = {},
			},
		},
		FLAG_allied_obj3 =
		{
			ROUTE_AlliesSpawn =
			{
				ROUTE_hill_route =
				{
					ROUTE_main_gate =
					{
						ROUTE_trans_route =
						{
							ROUTE_spawn_stairs =
							{
								  ROUTE_spawn_route = {},
								  ROUTE_upper_ufo =
								  {
									Weight = 2,
									ROUTE_upper_west = {},
									ROUTE_upper_east = {},
								  },
							},
						},

						ROUTE_north_alley =
						{
							ROUTE_garage =
							{
								ROUTE_duct =
								{
									ROUTE_roof = {},
									ROUTE_duct_exit = {},
								},

								ROUTE_stairs = { Weight = 4, },
							},
						},
					},
				},
				ROUTE_south_route =
				{
					ROUTE_south_gate =
					{
						ROUTE_nw_corner =
						{
							ROUTE_garage =
							{
								ROUTE_duct =
								{
									ROUTE_roof = {},
									ROUTE_duct_exit = {},
								},

								ROUTE_stairs = { Weight = 4, },
							},
						},
						ROUTE_mid_alley =
						{
							ROUTE_garage =
							{
								ROUTE_duct =
								{
									ROUTE_roof = {},
									ROUTE_duct_exit = {},
								},

								ROUTE_stairs = { Weight = 4, },
							},
						},
					},
				},
			},
			ROUTE_CPSpawn =
			{
				ROUTE_nw_corner =
				{
					ROUTE_garage =
					{
						ROUTE_duct =
						{
							ROUTE_roof = {},
							ROUTE_duct_exit = {},
						},

						ROUTE_stairs = { Weight = 4, },
					},
				},
				ROUTE_mid_alley =
				{
					ROUTE_garage =
					{
						ROUTE_duct =
						{
							ROUTE_roof = {},
							ROUTE_duct_exit = {},
						},

						ROUTE_stairs = { Weight = 4, },
					},
				},
				ROUTE_main_gate =
				{
					Weight = 2,
					ROUTE_trans_route =
					{
						ROUTE_spawn_stairs =
						{
							ROUTE_spawn_route = {},
							ROUTE_upper_ufo =
							{
								Weight = 2,
								ROUTE_upper_west = {},
								ROUTE_upper_east = {},
							},
						},
					},
				},
			},
		},
		CAPPOINT_transmitter =
		{
			ROUTE_DocSteal =
			{
				ROUTE_nw_corner =
				{
					ROUTE_main_gate =
					{
						ROUTE_trans_stairs = {},
						ROUTE_trans_ladder = {},
					},
				},

				ROUTE_trans_ladder = {},
				ROUTE_north_alley =
				{
					ROUTE_trans_stairs = {},
				},

				ROUTE_duct =
				{
					Weight = 2,
					ROUTE_trans_ladder = {},
					ROUTE_north_alley =
					{
						ROUTE_trans_stairs = {},

					},
				},
			},
		},
	};	

	MapRoutes[".*MG42.*"] = 
		{
		ROUTE_AxisSpawn = { ROUTE_main_gate_defense = {}, 
		}
	};
	MapRoutes["ATTACK_Doc.*"] = MapRoutes.FLAG_allied_obj3;
	MapRoutes["DEFEND_Main.*"] = MapRoutes[".*MG42.*"];
	MapRoutes["DEFEND_South.*"] = MapRoutes[".*MG42.*"];
	Util.Routes(MapRoutes);
};