//==========================================================================================
//
//	ctf_halo.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	palota	22 November 2011	routes, RideMovers
//
//==========================================================================================
//

global Map =
{
	Debug = 0,
	Movers = { "MOVER_cablecar", "MOVER_cablecar2", "MOVER_cablecar3", "MOVER_cablecar4", "MOVER_cablecar5", "MOVER_cablecar6" },
	SwitchPos = { Vec3(-36.125, 3998.294, 24.595), Vec3(40.125, -3998.634, 32.843), Vec3(-2089.445, -2649.570, 697.125), Vec3(2088.703, 2598.204, 697.125), Vec3(-108.125, 3670.232, 288.961), Vec3(71.986, -3663.445, 289.125) },
	CarPos = {},
	RideMovers = {},

	CarIndexFromEnt = function(ent)
	{
		entName = GetEntName(ent).Right(8);
		foreach(id and name in Map.Movers){
			if(name.Right(8)==entName){
				return id;
			}
		}
	},
};

global OnMapLoad = function()
{
	for(i=0; i<6; i+=1)
	{
		Map.RideMovers["car" + i] = {
			carIndex = i,
			movergoal = Map.Movers[i],
			rideposition = Vector3(0,0,10),
			startwp = "car" + i,
			exitwp = "car" + i + "_out",
			board = function(_this)
			{
				if (Map.CarPos[this.carIndex] != 1){ _this.Finished(); }
				return true;
			},
			leave = function(_this)
			{
				index = this.carIndex;
				if (Map.CarPos[index] == 1)
				{
					Util.MapDebugPrint("board cablecar" + index, true);
					dowhile(Map.CarPos[index] == 1)
					{
						_this.AddAimRequest(Priority.High, "position", Map.SwitchPos[index]);
						_this.Bot.MoveTowards(_this.Pos);
						sleep(0.3);
						_this.Bot.PressButton(BTN.USE);
						sleep(1);
					}
					_this.ReleaseAimRequest();
				}
				if (Map.CarPos[index] != 2){ return false; }
				Util.MapDebugPrint("leave cablecar" + index, true);
				return true;
			},
		};

		trig = "Car" + i + "_Enter";
		Map[trig] =
		{
			carIndex = i,
			Name = trig,
			TriggerOnEntity = GetGoal(Map.Movers[i]).GetEntity(),
			OnEnter = function(ent) {
				i = Map.CarIndexFromEnt(ent);
				Wp.SetWaypointFlag("car" + i, "closed", false);
				sleep(1);
				Map.CarPos[i] = 1;
			},
			OnExit = function(ent) {
				i = Map.CarIndexFromEnt(ent);
				Map.CarPos[i] = -1;
				sleep(1);
				Wp.SetWaypointFlag("car" + i, "closed", true);
			},
		};

		trig = "Car" + i + "_Exit";
		Map[trig] =
		{
			carIndex = i,
			Name = trig,
			TriggerOnEntity = GetGoal(Map.Movers[i]).GetEntity(),
			OnEnter = function(ent) {
				sleep(0.7);
				Map.CarPos[Map.CarIndexFromEnt(ent)] = 2;
			},
			OnExit = function(ent) {
				Map.CarPos[Map.CarIndexFromEnt(ent)] = -1;
			},
		};
		Wp.SetWaypointFlag("car" + i, "closed", false);
		Map.CarPos[i] = 1;
	}//end for

	OnTriggerRegion(AABB(-131.703,3903.125,29.362,-60.128,4032.875,103.362),Map.Car0_Enter);
	OnTriggerRegion(AABB(-133.448,-4032.873,25.015,-74.512,-3903.127,99.125),Map.Car0_Exit);
	OnTriggerRegion(AABB(54.145,-4032.875,29.125,134.476,-3916.392,103.125),Map.Car1_Enter);
	OnTriggerRegion(AABB(41.340,3932.667,25.015,133.144,4022.659,99.015),Map.Car1_Exit);
	OnTriggerRegion(AABB(-2066.366,-2664.875,689.125,-1991.524,-2568.026,763.125),Map.Car2_Enter);
	OnTriggerRegion(AABB(-2071.219,2534.910,689.125,-2004.663,2621.185,763.125),Map.Car2_Exit);
	OnTriggerRegion(AABB(2001.904,2503.125,693.125,2061.722,2608.794,767.125),Map.Car3_Enter);
	OnTriggerRegion(AABB(1986.609,-2616.483,689.125,2066.252,-2527.928,763.125),Map.Car3_Exit);
	OnTriggerRegion(AABB(-210.626,3575.125,281.125,-125.801,3704.875,355.125),Map.Car4_Enter);
	OnTriggerRegion(AABB(-214.822,-3696.875,281.133,-128.728,-3583.336,355.133),Map.Car4_Exit);
	OnTriggerRegion(AABB(88.641,-3696.874,285.314,166.410,-3570.754,359.314),Map.Car5_Enter);
	OnTriggerRegion(AABB(94.413,3575.125,281.213,193.623,3704.875,355.213),Map.Car5_Exit);

	SetGoalPriority( "SNIPE_.*", 0.82);
	Util.SetMaxUsersInProgress(2, ".*Command_Post");

	MapRoutes =
	{
		FLAG_allies_gold_crate = {
			ROUTE_N_spawn = {
				ROUTE_NE_side1 = { Weight=2 },
				ROUTE_NW_side1 = { Weight=2 },
				ROUTE_NE_side2 = {},
				ROUTE_NW_side2 = {},
				ROUTE_E_center1 = {},
				ROUTE_E_center2 = {},
				ROUTE_W_center1 = {},
				ROUTE_W_center2 = {},
				ROUTE_NE_down1 = {},
				ROUTE_NE_down2 = {},
				ROUTE_NW_down1 = {},
				ROUTE_NW_down2 = {},
			}
		},
		FLAG_axis_gold_crate = {
			ROUTE_S_spawn = {
				ROUTE_SE_side1 = { Weight=2 },
				ROUTE_SW_side1 = { Weight=2 },
				ROUTE_SE_side2 = {},
				ROUTE_SW_side2 = {},
				ROUTE_E_center1 = {},
				ROUTE_E_center2 = {},
				ROUTE_W_center1 = {},
				ROUTE_W_center2 = {},
				ROUTE_SE_down1 = {},
				ROUTE_SE_down2 = {},
				ROUTE_SW_down1 = {},
				ROUTE_SW_down2 = {},
			}
		},
		CAPPOINT_N = {
			ROUTE_S_gold = {
				ROUTE_SE_gold_down = {
					ROUTE_SE_down1 = {},
					ROUTE_SE_down2 = {},
				},
				ROUTE_SW_gold_down = {
					ROUTE_SW_down1 = {},
					ROUTE_SW_down2 = {},
				},
				ROUTE_E_bunker = { Weight=2 },
				ROUTE_W_bunker = { Weight=2 },
			}
		},
		CAPPOINT_S = {
			ROUTE_N_gold = {
				ROUTE_NE_gold_down = {
					ROUTE_NE_down1 = {},
					ROUTE_NE_down2 = {},
				},
				ROUTE_NW_gold_down = {
					ROUTE_NW_down1 = {},
					ROUTE_NW_down2 = {},
				},
				ROUTE_E_bunker = { Weight=2 },
				ROUTE_W_bunker = { Weight=2 },
			}
		},
		BUILD_Command_Post = {
			ROUTE_N_spawn = {
				ROUTE_NE_down1 = {},
				ROUTE_NE_down2 = {},
				ROUTE_NW_down1 = {},
				ROUTE_NW_down2 = {},
			},
			ROUTE_S_spawn = {
				ROUTE_SE_down1 = {},
				ROUTE_SE_down2 = {},
				ROUTE_SW_down1 = {},
				ROUTE_SW_down2 = {},
			},
		},
	};
	MapRoutes.PLANT_Command_Post = MapRoutes.BUILD_Command_Post;
	Util.Routes(MapRoutes);

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