//==========================================================================================
//
//	springfield_pb.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	palota	04 April 2012	new gm script, goals, fixed teleports
//	palota	07 June 2012	covertops can destroy spawnwall
//
//==========================================================================================
//
global Map =
{
	phase = 0,
	barrier1Destroyed = true,
	barrier2Destroyed = true,

	Roles =
	{
		AXIS =
		{
			DEFENDER2 = {
				numbots = 2,
				crucialClass = CLASS.MEDIC,
			},
		},
	},

	Navigation =
	{
		door1 = {navigate=function(_this){ //Simpsons house
			_this.Goto(Vec3(401.875, -0.079, 154.303));
			sleep(3);
			_this.Goto(Vec3(167.826, -1.572, 154.125));
		}},
	},

	SetEscort = function()
	{
		SetAvailableMapGoals(TEAM.ALLIES, Map.phase>=10 && Map.phase!=50 && (Map.phase!=20 || Map.barrier1Destroyed) && (Map.phase!=70 || Map.barrier2Destroyed), "ESCORT_truck");
	},

	Truck_Stolen = function()
	{
		Map.phase=10;
		Map.SetEscort();
		SetAvailableMapGoals(TEAM.AXIS, true, {
			"BUILD_Truck_Barrier_2",
			"SNIPE_x.*",
			"MOBILEMORTAR_x1",
			"DEFEND_barrier.*",
			"PLANTMINE_square.*",
		});
		SetAvailableMapGoals(TEAM.ALLIES, true, {
			"BUILD_Command_Post",
			"ATTACK_square.*",
			"PLANT_Truck_Barrier_1",
			".*MG42_mg42_bank",
			"SNIPE_l.*",
		});
		SetAvailableMapGoals(TEAM.AXIS, false, {
			"DEFEND_house.*",
			"MOBILEMG42_house.*",
		});
		SetAvailableMapGoals(TEAM.ALLIES, false, "ATTACK_house.*");
		Util.SetMaxUsers( 3, "BUILD_Truck_Barrier_1" );
		SetGoalPriority("BUILD_Truck_Barrier_1", 0.91, TEAM.AXIS);
		Util.ForceRouting( "BUILD_Truck", false );
		WeaponTable.SetWeaponAvailability( CLASS.SOLDIER, WEAPON.FLAMETHROWER, false );
		OnTriggerRegion(AABB(-4100,-934,-6,-3860,-728,96), Map.TruckAtBarrier1);
		Util.MapDebugPrint( "Truck_Stolen" );
	},

	Truck_Built = function()
	{
		Util.MapDebugPrint( "Truck_Built" );
	},

	Truck_Damaged = function()
	{
		Util.MapDebugPrint( "Truck_Damaged" );
	},

	Truck_Barrier_1_Built = function()
	{
		Map.barrier1Destroyed = false;
		Map.SetEscort();
		Util.MapDebugPrint( "Truck_Barrier_1_Built" );
	},

	Truck_Barrier_1_Destroyed = function()
	{
		Map.barrier1Destroyed = true;
		Map.SetEscort();
		Util.MapDebugPrint( "Truck_Barrier_1_Destroyed" );
	},

	TruckAtBarrier1 =
	{
		Name = "Barrier1Trigger",
		TriggerOnClass = { CLASS.VEHICLE, CLASS.VEHICLE_HVY },
		OnEnter = function(ent)
		{
			Map.phase=20;
			SetAvailableMapGoals(TEAM.ALLIES, true, "SMOKEBOMB_barrier1" );
			SetGoalPriority("PLANT_Truck_Barrier_1", 0.95, TEAM.ALLIES);
			Map.SetEscort();
			DeleteTriggerRegion("Barrier1Trigger");
			Util.MapDebugPrint( "Truck_At_Barrier1" );
		},
	},

	Truck_At_Barrier = function()
	{
		truckPos = GetEntPosition(GetGoal("MOVER_truck").GetEntity());
		if(DistanceBetween(truckPos, Vec3(-3941.353, -902.399, 16.125)) < 300){
		}else if(DistanceBetween(truckPos, Vec3(-3887.745, -2645.676, 16.125)) < 400){
		}
		Map.SetEscort();
	},

	Truck_Past_Barrier_1 = function()
	{
		Map.phase=30;
		SetAvailableMapGoals(TEAM.AXIS, true, {
			"BUILD_Moes_wall",
			"MOBILEMG42_bus.*",
			"DEFEND_square.*",
		});
		SetAvailableMapGoals(TEAM.AXIS, false, {
			"DEFEND_barrier.*",
			"MOBILEMORTAR_x1",
			"BUILD_Truck_Barrier_1",
			".*_Command_Post",
		});
		SetAvailableMapGoals(TEAM.ALLIES, false, "SMOKEBOMB_barrier1" );
		SetGoalPriority("BUILD_Truck_Barrier_2", 0.8, TEAM.AXIS);
		SetGoalPriority("REPAIRMG42_mg42_bank", 0.91, TEAM.ALLIES);
		OnTriggerRegion(AABB(-6368,-2333,-9,-6220,-2218,65), Map.TruckAtBus);
		Util.MapDebugPrint( "Truck_Past_Barrier_1" );
	},

	TruckAtBus =
	{
		Name = "BusTrigger",
		TriggerOnClass = { CLASS.VEHICLE, CLASS.VEHICLE_HVY },
		OnEnter = function(ent)
		{
			Map.phase=50;
			Map.SetEscort();
			SetAvailableMapGoals(TEAM.AXIS, true, "TRIPMINE_x.*");
			SetAvailableMapGoals(TEAM.ALLIES, true, "PLANT_spawnwall" ); //does not work in Omni-bot 0.81, requires Omni-bot 0.82
			SetAvailableMapGoals(TEAM.ALLIES, true, {
				"PLANT_Schoolbus",
				"CAPPOINT_truck",
			});
			SetAvailableMapGoals(TEAM.ALLIES, false, "BUILD_Truck");
			SetGoalPriority("REPAIRMG42_mg42_bank", 0.81, TEAM.ALLIES);
			DeleteTriggerRegion("BusTrigger");
			Util.MapDebugPrint("truck at bus");
		},
	},

	plutoninum_Accessible = function()
	{
		sleep(2);
		SetAvailableMapGoals(TEAM.AXIS, true, "DEFEND_moe.*");
		SetAvailableMapGoals(TEAM.ALLIES, true, {
			"FLAG_plutoniumcase",
			"PLANT_Moes_wall",
		});
		SetGoalRole("DEFEND_square.*", ROLE.DEFENDER2 );
		WeaponTable.SetWeaponAvailability( CLASS.SOLDIER, WEAPON.FLAMETHROWER, true );
	},

	Schoolbus_Destroyed = function()
	{
		Util.EnableGoal("ROUTE_bus");
		Map.plutoninum_Accessible();
		Util.MapDebugPrint( "Schoolbus_Destroyed" );
	},

	spawnwall_Destroyed = function()
	{
		Util.EnableGoal("ROUTE_spawnwall");
		SetAvailableMapGoals(TEAM.ALLIES, false, "PLANT_spawnwall" );
		Map.plutoninum_Accessible();
		Util.MapDebugPrint( "spawnwall_Destroyed" );
	},

	Moes_wall_Built = function()
	{
		Util.DisableGoal("ROUTE_moe_wall");
		Util.MapDebugPrint( "Moes_wall_Built" );
	},

	Moes_wall_Destroyed = function()
	{
		Util.EnableGoal("ROUTE_moe_wall");
		Util.MapDebugPrint( "Moes_wall_Destroyed" );
	},

	plutoniumcase_Taken = function()
	{
		SetAvailableMapGoals(TEAM.ALLIES, true, "BUILD_Truck");
		SetGoalPriority("BUILD_Truck_Barrier_2", 0.9, TEAM.AXIS);
		Util.MapDebugPrint( "plutoniumcase_Taken" );
	},

	plutoniumcase_Returned = function()
	{
		SetAvailableMapGoals(TEAM.ALLIES, false, "BUILD_Truck");
		Util.MapDebugPrint( "plutoniumcase_Returned" );
	},

	Plutonium_Captured = function()
	{
		Map.phase=60;
		Map.SetEscort();
		SetAvailableMapGoals(TEAM.AXIS, true, "DEFEND_escape.*");
		SetAvailableMapGoals(TEAM.ALLIES, true, "PLANT_Truck_Barrier_2");
		SetAvailableMapGoals(TEAM.AXIS, false, {
			"TRIPMINE_x.*",
			"DEFEND_moe.*",
			"BUILD_Moes_wall",
			"MOBILEMG42_bus.*",
		});
		SetAvailableMapGoals(TEAM.ALLIES, false, {
			"PLANT_Moes_wall",
			"PLANT_Schoolbus",
			"PLANT_spawnwall",
		});
		Util.SetMaxUsers( 2, "BUILD_Truck_Barrier_2" );
		SetGoalPriority("REPAIRMG42_mg42_bank", 0.91, TEAM.ALLIES);
		ClearGoalRole("DEFEND_square.*", ROLE.DEFENDER2 );
		WeaponTable.SetWeaponAvailability( CLASS.SOLDIER, WEAPON.FLAMETHROWER, false );
		OnTriggerRegion(AABB(-3850,-2751,-6,-3600,-2567,103), Map.TruckAtBarrier2);
		Util.MapDebugPrint( "Plutonium_Captured" );
	},

	Truck_Barrier_2_Built = function()
	{
		Map.barrier2Destroyed = false;
		Map.SetEscort();
		Util.MapDebugPrint( "Truck_Barrier_2_Built" );
	},

	Truck_Barrier_2_Destroyed = function()
	{
		Map.barrier2Destroyed = true;
		Map.SetEscort();
		Util.MapDebugPrint( "Truck_Barrier_2_Destroyed" );
	},

	TruckAtBarrier2 =
	{
		Name = "Barrier2Trigger",
		TriggerOnClass = { CLASS.VEHICLE, CLASS.VEHICLE_HVY },
		OnEnter = function(ent)
		{
			Map.phase=70;
			SetAvailableMapGoals(TEAM.AXIS, false, {
				"PLANTMINE_square.*",
				"DEFEND_square.*",
			});
			SetGoalPriority("PLANT_Truck_Barrier_2", 0.95, TEAM.ALLIES);
			Map.SetEscort();
			DeleteTriggerRegion("Barrier2Trigger");
			Util.MapDebugPrint( "Truck_At_Barrier2" );
		},
	},

	Truck_Past_Barrier_2 = function()
	{
		Map.phase=80;
		SetAvailableMapGoals(TEAM.AXIS, false, "BUILD_Truck_Barrier_2");
		Util.MapDebugPrint( "Truck_Past_Barrier_2" );
	},

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

global OnMapLoad = function()
{
	OnTrigger( "Allied team has stolen the Truck!", Map.Truck_Stolen );
	OnTrigger( "The Truck has been repaired!", Map.Truck_Built );
	OnTrigger( "The Truck has been damaged!", Map.Truck_Damaged );
	OnTrigger( "Truck Barrier #1 has been constructed.", Map.Truck_Barrier_1_Built );
	OnTrigger( "Truck Barrier #1 has been destroyed.", Map.Truck_Barrier_1_Destroyed );
	OnTrigger( "Truck Barrier #2 has been constructed.", Map.Truck_Barrier_2_Built );
	OnTrigger( "Truck Barrier #2 has been destroyed.", Map.Truck_Barrier_2_Destroyed );
	OnTrigger( "goldrush_axis_truck_barrier1", Map.Truck_Past_Barrier_1 );
	OnTrigger( "goldrush_axis_truck_barrier2", Map.Truck_Past_Barrier_2 );
	OnTrigger( "Moeswall has been rebuilt", Map.Moes_wall_Built );
	OnTrigger( "Allies have breached Moes wall!", Map.Moes_wall_Destroyed );
	OnTrigger( "the Schoolbus Destroyed.", Map.Schoolbus_Destroyed );
	OnTrigger( "Axis spawnwall destroyed!", Map.spawnwall_Destroyed );
	OnTrigger( "Allies have stolen The Plutonium!", Map.plutoniumcase_Taken );
	OnTrigger( "Flag returned plutoniumcase!", Map.plutoniumcase_Returned );
	OnTrigger( "Allied team has secured the Plutonium!", Map.Plutonium_Captured );
	OnTrigger( "Allied team escaped with the Plutonium!", Map.Allies_Escaped );

	Util.DisableGoal( ".*", true );
	Util.DisableGoal("ROUTE_bus");
	Util.DisableGoal("ROUTE_spawnwall");
	Util.EnableGoal("AMMOCAB.*");
	Util.EnableGoal("HEALTHCAB.*");
	Util.EnableGoal("PLANT_Command_Post");
	SetAvailableMapGoals(TEAM.AXIS, true, {
		"BUILD_Command_Post",
		"DEFEND_house.*",
		"MOBILEMG42_house.*",
		"BUILD_Truck_Barrier_1",
	});
	SetAvailableMapGoals(TEAM.ALLIES, true, {
		"ATTACK_house.*",
		"BUILD_Truck",
	});

	SetGoalPriority("BUILD_Truck_Barrier_1", 0.89, TEAM.AXIS);
	SetGoalPriority("BUILD_Truck_Barrier_2", 0.7, TEAM.AXIS);
	SetGoalPriority("PLANT_Command_Post", 0.6, TEAM.AXIS, CLASS.ENGINEER);
	SetGoalPriority("PLANT_spawnwall", 0.8, TEAM.ALLIES, CLASS.ENGINEER);
	SetGoalPriority("MOUNTMG42_mg42_bank", 0.85, TEAM.ALLIES, CLASS.SOLDIER);
	SetGoalPriority("SNIPE_.*", 0.8);

	SetMapGoalProperties("DEFEND_.*", {mincamptime=15, maxcamptime=50} );
	SetMapGoalProperties("SNIPE_.*", {MinCampTime=20, MaxCampTime=60} );
	SetMapGoalProperties("MOBILEMG42_.*", {MinCampTime=25, MaxCampTime=60} );
	SetMapGoalProperties("MOUNTMG42_.*", {MinCampTime=30, MaxCampTime=90} );

	Util.SetMaxUsersInProgress( 3, "ESCORT_truck" );
	Util.SetMaxUsers( 1, "BUILD_Command_Post" );
	Util.SetMaxUsers( 1, "BUILD_Moes_wall" );
	Util.SetMaxUsers( 1, "BUILD_Truck_Barrier_1" );
	Util.SetMaxUsers( 1, "BUILD_Truck_Barrier_2" );
	Util.SetMaxUsers( 1, "PLANT_spawnwall" );

	ClearGoalRole("DEFEND_square.*", ROLE.DEFENDER2 );

	Util.ForceRouting( "BUILD_Truck", true );

	Util.AddUsePoint( "PLANT_Truck_Barrier_1", { Vec3(-4107.064, -834.790, 16.125), Vec3(-4202.764, -968.147, 16.125) });
	Util.AddUsePoint( "PLANT_Truck_Barrier_2", { Vec3(-3492.646, -2586.968, 16.125) });
	Util.AddUsePoint( "PLANT_Schoolbus", { Vec3(-6385,-2644,16) });

	MapRoutes =
	{
		BUILD_Command_Post = {
			ROUTE_allied_spawn = {
				ROUTE_allied1 = {},
				ROUTE_allied2 = {},
				ROUTE_allied3 = {},
			},
		},
		FLAG_plutoniumcase = {
			ROUTE_allied_spawn = { Weight=3,
				ROUTE_bus = {
					ROUTE_moe_wall = {},
					ROUTE_moe_door = {},
				},
				ROUTE_spawnwall = {},
			},
		},
		CAPPOINT_truck = {
			ROUTE_plutonium = {
				ROUTE_bus = {},
				ROUTE_axis_spawn = {},
			}
		},
	};
	MapRoutes["ATTACK_house.*"] = MapRoutes.BUILD_Command_Post;
	MapRoutes.PLANT_Command_Post = MapRoutes.BUILD_Command_Post;
	MapRoutes.BUILD_Truck = MapRoutes.BUILD_Command_Post;
	MapRoutes.FLAG_plutoniumcase.ROUTE_house_spawn = MapRoutes.FLAG_plutoniumcase.ROUTE_allied_spawn;
	Util.Routes(MapRoutes);

	Util.FixMoverPos("truck", Vec3(586.000, -383.000, 59.000), Vec3(584.000, -252.000, 0.000));

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

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 90.0; //Simpsons house windows

	if (bot.GetTeam()==TEAM.ALLIES)
	{
		bot.ChangeSpawnPoint(RandInt(0,1)*2+1);
	}
};
