//==========================================================================================
//
//	mia1d.gm
//
//	Who	When		What
//------------------------------------------------------------------------------------------
//	palota	18 September 2011	Initial Script
//	palota	21 August 2015	updated from mia1 to mia1d, removed generator, lab spawn, tent spawn, removed ATTACK_stairs, DEFENDER2 role, elevator can be used in both directions, GRENADE_door_mg is disabled until window is broken
//==========================================================================================
//

global Map =
{
	Debug = 0,

	gateDestroyed = false,
	labDestroyed = false,
	elevatorPos = 1,
	callElevatorTime = 0,
	windowDestroyed = {},

	Navigation =
	{
		elevator_up =
		{
			navigate = function(_this)
			{
				//get inside
				_this.Goto(Vec3(4.6, 1229, -55.6));
				sleep(8);
				if (Map.elevatorPos==1)
				{
					//failed, get out
					_this.Goto(Vec3(4.387, 971.822, -55.875));
				}else{
					//wait until the elevator is down
					while(Map.elevatorPos<4){
						sleep(0.3);
					}
				}
			},
		},
		elevator_down =
		{
			navigate = function(_this)
			{
				//get inside
				_this.Goto(Vec3(21.4, 1229, -2198.8));
				sleep(8);
				if (Map.elevatorPos==4)
				{
					//failed, get out
					_this.Goto(Vec3(-5.994, 951.788, -2206.880));
				}else{
					//wait until the elevator is up
					while(Map.elevatorPos!=1){
						sleep(0.3);
					}
				}
			},
		},
		elevator_call =
		{
			EvalFunc = function(_this){
				return (Map.elevatorPos==4 && !Map.labDestroyed || Map.elevatorPos==1 && Map.labDestroyed) &&
				_this.Bot.GetTeam()==TEAM.ALLIES && GetTime()-Map.callElevatorTime > 9;
			},
			navigate = function(_this)
			{
				Map.callElevatorTime = GetTime();
				_this.Goto(Vector3(120.114, 983.871, -55.875));
				if (Map.elevatorPos==4 && !Map.labDestroyed || Map.elevatorPos==1 && Map.labDestroyed){
					_this.AddAimRequest(Priority.High, "position", Vec3(118.7, 1037.8, -24.8));
					sleep(0.3);
					_this.Bot.PressButton(BTN.USE);
				}
			}
		},
	},

	Switches =
	{
		elevator = //top
		{
			Enabled = true,
			Priority = 0,
			WaypointName = "elevator",
			AimPosition = Vec3(118.7, 1037.8, -24.8)
		},
		elevator2 = //bottom
		{
			Enabled = true,
			Priority = 0,
			WaypointName = "elevator2",
			AimPosition = Vec3(116.9, 989.8, -2201.9)
		},
	},

	Roles =
	{
		AXIS =
		{
			DEFENDER2 =
			{
				numbots = 5,
				crucialClass = CLASS.FIELDOPS,
			},
		},
		ALLIES =
		{
			ATTACKER2 =
			{
				numbots = 3,
			},
		}
	},


	Main_Gate_Destroyed = function( trigger )
	{
		Map.gateDestroyed = true;
		sleep(2);

		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_gate.*",
			".*MG42_gate.*",
			".*ARTILLERY.*gate.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			".*MG42_Door.*",
			"SNIPE_door.*",
			"DEFEND_door.*",
		});

		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_gate.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"PLANT_Door_Lock",
			".*Command_Post",
			"AMMOCAB_ammo",
			"HEALTHCAB_health",
			"ATTACK_door.*",
			"ATTACK_roof.*",
			"SMOKEBOMB_door.*",
		});

		for(i=1; i<=3; i+=1)
		{
			if(Map.windowDestroyed[i]) {
				SetAvailableMapGoals( TEAM.ALLIES, true, "GRENADE_door_mg" + i);
			}
		}
		SetGoalPriority( "DEFEND_window.", 0.79);

		Util.MapDebugPrint( "Main_Gate_Destroyed" );
	},

	Door_Lock_Destroyed = function( trigger )
	{
		sleep(8);
		Map.SetLab(true);

		SetAvailableMapGoals( TEAM.AXIS, false, {
			"SNIPE_door.*",
			"DEFEND_door.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_door.*",
			"ATTACK_roof.*",
			"SMOKEBOMB_door.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "PLANT_Axis_Lab" );
		Util.EnableGoal( "AMMOCAB_ammo_1" );
		Util.EnableGoal( "HEALTHCAB_health_1" );

		SetGoalPriority( "DEFEND_door.*", 0.45);
		SetGoalPriority( "GRENADE_door.*", 0.49);
		SetGoalPriority( "GRENADE_door.*", 0.65, TEAM.ALLIES, CLASS.FIELDOPS);
		Util.SetGoalRange("BUILD_Neutral_Command_Post", 2700);

		WeaponTable.SetWeaponAvailability(CLASS.SOLDIER, WEAPON.FLAMETHROWER, true);
		Util.MapDebugPrint( "Door_Lock_Destroyed" );
	},

	Lab_Destroyed = function( trigger )
	{
		Map.labDestroyed = true;
		Map.SetLab(false);

		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_cap.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"FLAG_allied_gold",
			"CAPPOINT_truck",
			"ATTACK_cap.*",
		});

		SetGoalPriority( "PLANT_Neutral_Command_Post", 0.9);

		Util.EnableGoal(".*MG42_gate.*");
		SetGoalPriority( "MOUNTMG42.*", 0.5);
		ClearGoalRole("MOUNTMG42_gate.*", ROLE.DEFENDER2);

		WeaponTable.SetWeaponAvailability(CLASS.SOLDIER, WEAPON.FLAMETHROWER, false);
		Util.MapDebugPrint( "Lab_Destroyed" );
	},

	SetLab = function(b)
	{
		SetAvailableMapGoals( TEAM.AXIS, b, {
			"DEFEND_lab.*",
			"TRIPMINE_lab.*",
			"MOBILEMG42_lab.*",
			".*MG42_lower",
		});
		SetAvailableMapGoals( TEAM.ALLIES, b, "ATTACK_lab.*" );
	},


	allied_gold_Taken = function( trigger )
	{
		Util.ChangeSpawn( TEAM.ALLIES, 3); //command post
		Util.MapDebugPrint( "allied_gold_Taken" );
	},

	allied_gold_Returned = function( trigger )
	{
		Util.ChangeSpawn( TEAM.ALLIES, 4); //lab
		Util.MapDebugPrint( "allied_gold_Returned" );
	},

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


	window_Destroyed = function( i )
	{
		Map.windowDestroyed[i] = true;
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_window" + i );
		if(Map.gateDestroyed){
			SetAvailableMapGoals( TEAM.ALLIES, true, "GRENADE_door_mg" + i);
		}
		Util.MapDebugPrint( "window_Destroyed " + i );
	},
	window1_Destroyed = function( trigger )
	{
		Map.window_Destroyed(1);
	},
	window2_Destroyed = function( trigger )
	{
		Map.window_Destroyed(2);
	},
	window3_Destroyed = function( trigger )
	{
		Map.window_Destroyed(3);
	},


	elever_goto = function( trigger )
	{
		if (ToVector(trigger.Action).z > 0)
		{
			Map.Switches.elevator2.Enabled = false;
			Util.MapDebugPrint( "elevator door closing" );
		}else{
			Map.Switches.elevator.Enabled = false;
			Util.MapDebugPrint( "elevator door closing" );
		}
	},

	elev_door_topl_goto = function( trigger )
	{
		if (ToVector(trigger.Action).x < 0)
		{
			Map.Switches.elevator.Enabled = true;
			Wp.SetWaypointFlag("elevator_up", "closed", false);
			Map.elevatorPos = 1;
			Util.MapDebugPrint( "elevator up" );
		}else{
			sleep(1.7);
			Map.elevatorPos = 3;
			Util.MapDebugPrint( "elevator moving down" );
			Wp.SetWaypointFlag("elevator_up", "closed", true);
		}
	},

	elev_door_botl_goto = function( trigger )
	{
		if (ToVector(trigger.Action).x <= 0)
		{
			sleep(0.5);
			Map.Switches.elevator2.Enabled = true;
			Wp.SetWaypointFlag("elevator_down", "closed", false);
			Map.elevatorPos = 4;
			Util.MapDebugPrint( "elevator down" );
			sleep(15);
		}else{
			sleep(1.7);
			Map.elevatorPos = 5;
			Util.MapDebugPrint( "elevator moving up" );
			Wp.SetWaypointFlag("elevator_down", "closed", true);
		}
	},

};

global OnMapLoad = function()
{
	OnTrigger( "The allies destroyed the Main Gate. Deffend the Door Lock!", Map.Main_Gate_Destroyed );
	OnTrigger( "The allied team has destroyed the door locking mechanism and gained acc" /*ess to the lower base!"*/, Map.Door_Lock_Destroyed );
	OnTrigger( "Allies have destroyed the lab!", Map.Lab_Destroyed );
	OnTrigger( "Allies have taken the Axis gold!", Map.allied_gold_Taken );
	OnTrigger( "Flag returned allied_gold!", Map.allied_gold_Returned );
	OnTrigger( "The Allies have secured the Axis gold", Map.allied_gold_Secured );
	OnTrigger( "GRENADE_window1 Exploded.", Map.window1_Destroyed );
	OnTrigger( "GRENADE_window2 Exploded.", Map.window2_Destroyed );
	OnTrigger( "GRENADE_window3 Exploded.", Map.window3_Destroyed );
	OnTrigger( "lever3_goto", Map.elever_goto );
	OnTrigger( "elev_door_topl_goto", Map.elev_door_topl_goto );
	OnTrigger( "elev_door_botl_goto", Map.elev_door_botl_goto );

	OnTriggerRegion(AABB(-563.898,-626.583,609.125,578.451,825.866,721.349),RegionTrigger.DisableCombatMovement); //roof

	Util.DisableGoal( ".*", true );
	SetAvailableMapGoals( TEAM.AXIS, true, {
		".*MG42_gate.*",
		".*Command_Post",
		"AMMOCAB_ammo",
		"DEFEND_gate.*",
		"DEFEND_window.",
		".*ARTILLERY.*gate.*",
	});

	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"PLANT_Axis_Gate",
		"ATTACK_gate.*",
	});

	SetGoalPriority( "DEFEND_window.", 0.1);
	SetGoalPriority( "FLAG_allied_gold", 0.61);
	SetGoalPriority( "GRENADE.*", 0.6);
	SetGoalPriority( "ATTACK_roof.*", 0.61);
	SetGoalPriority( "DEFUSE_Neutral_Command_Post.*", 0.8, TEAM.ALLIES, CLASS.ENGINEER, true);
	SetGoalPriority( "REPAIRMG42_Door.*", 0.82);
	SetGoalPriority( "TRIPMINE.*", 0.82 );
	SetGoalPriority( "REPAIRMG42_lower", 0.86);
	SetGoalPriority( "SNIPE.*", 0.81);
	SetGoalPriority( "MOUNTMG42.*", 0.6, TEAM.AXIS);
	SetGoalPriority( "MOUNTMG42_Door.*", 0.4, TEAM.AXIS, CLASS.MEDIC);
	SetGoalPriority( "MOUNTMG42_Door.*", 0.4, TEAM.AXIS, CLASS.FIELDOPS);
	SetGoalPriority( "MOUNTMG42_Door.*", 0.4, TEAM.AXIS, CLASS.COVERTOPS);

	Util.SetRoleForTable({ "ATTACK_roof.*", "ATTACK_cap_e.*" }, ROLE.ATTACKER2);
	Util.SetRoleForTable({ "MOUNTMG42_gate.*", "DEFEND_gate_mg.*", "DEFEND_cap_e.*" }, ROLE.DEFENDER2);

	Util.SetGoalRange("BUILD_Neutral_Command_Post", 0);

	// Max users per goal
	foreach (goal in { "DEFEND_.*", ".*MG42_.*", "GRENADE_.*",
		"SNIPE_.*", ".*Command_Post", "REPAIRMG42_lower" }){
		Util.SetMaxUsers(1, goal);
	}
	Util.SetMaxUsersInUse(1, "PLANT_Axis_Gate");
	Util.SetMaxUsersInUse(1, "PLANT_Door_Lock");
	Util.SetMaxUsersInProgress(2, "DEFEND_gate4");

	// Camp times
	SetMapGoalProperties( "MOUNTMG42_Door.*", {MinCampTime=15, MaxCampTime=25} );
	SetMapGoalProperties( "MOUNTMG42_lower", {MinCampTime=40, MaxCampTime=100} );
	SetMapGoalProperties( "MOBILEMG42_.*", {MinCampTime=30, MaxCampTime=90} );
	SetMapGoalProperties( "DEFEND_door.*", {MinCampTime=15, MaxCampTime=70} );
	SetMapGoalProperties( "DEFEND_gate.*", {MinCampTime=15, MaxCampTime=70} );

	Util.SetGoalOffset(0, 10, -10, "MOUNTMG42_lower");
	Util.SetGoalOffset(0, 10, 0, "MOUNTMG42_gate_west");
	Util.SetGoalOffset(0, 10, 0, "MOUNTMG42_gate_east");
	Util.AddUsePoint( "PLANT_Axis_Lab", { Vec3(2049.633, 277.719, -2431.875), Vec3(2277.201, 272.825, -2431.875) });

	Wp.SetWaypointFlag("elevator_up", "closed", false);
	Wp.SetWaypointFlag("elevator_down", "closed", true);

	WeaponTable.SetWeaponAvailability(CLASS.SOLDIER, WEAPON.FLAMETHROWER, false);

	Util.UpdateSwitchData();

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

global InitializeRoutes = function()
{
	MapRoutes =
	{
		PLANT_Axis_Gate = {
			ROUTE_allied_spawn = {
				ROUTE_allied_main = {},
				ROUTE_allied_west = { Weight=2.5,
					ROUTE_allied_center = {},
					ROUTE_allied_east = {},
				},
			}
		},
		MOUNTMG42_Door1 = {
			ROUTE_lower_spawn = {
				ROUTE_stairs_e = {},
				ROUTE_stairs_w = {},
			}
		},
		PLANT_Door_Lock = {
			ROUTE_allied_spawn = {
				ROUTE_side = { Weight=6,
					ROUTE_hall1 = {},
					ROUTE_hall2 = {},
					ROUTE_hall3 = {},
					ROUTE_hall4 = {},
				},
				ROUTE_hall5 = { Weight=2 },
				ROUTE_hall6 = {},
				ROUTE_hall7 = {},
				ROUTE_hall8 = { Weight=2 },
			},
		},
		ATTACK_door1 = {
			ROUTE_allied_spawn = {
				ROUTE_side = {}
			},
		},
		ATTACK_door3 = {
			ROUTE_allied_spawn = {
				ROUTE_roof = {}
			},
		},
		PLANT_Neutral_Command_Post = {
			ROUTE_axis_spawn = {
				ROUTE_side = {},
			}
		},
		PLANT_Axis_Lab = {
			ROUTE_cp_spawn = {
				ROUTE_side = {
					ROUTE_stairs_e = {
						ROUTE_lab1 = {},
						ROUTE_lab2 = {},
						ROUTE_lab_lower = { Weight=2 },
					},
					ROUTE_elevator = {
						ROUTE_lower_back = { Weight=2 },
						ROUTE_lab1 = {},
						ROUTE_lab2 = {},
					},
					ROUTE_stairs_w = { Weight=1.6,
						ROUTE_lower_back = {},
					},
				},
				ROUTE_stairs_e = { Weight=0.6, },
				ROUTE_elevator = {},
				ROUTE_stairs_w = {},
			},
			ROUTE_allied_spawn = {
				ROUTE_stairs_e = {},
				ROUTE_stairs_w = {},
				ROUTE_elevator = {},
			},
		},
		CAPPOINT_truck = {
			ROUTE_gold = {
				ROUTE_stairs_e = { Weight=0.6,
					ROUTE_allied_east = { ROUTE_allied_west = {}},
				},
				ROUTE_stairs_w = {},
				ROUTE_elevator2 = {},
			},
		},
	};
	MapRoutes["ATTACK_cap.*"] = {
		ROUTE_lab_spawn = {
			ROUTE_stairs_e = { Weight=0.6,
				ROUTE_allied_east = { ROUTE_allied_west = {}},
			},
			ROUTE_stairs_w = {},
			ROUTE_elevator2 = {},
		},
	};
	MapRoutes["DEFEND_cap_e.*"] = {
		ROUTE_tent_spawn = {
			ROUTE_allied_east = {},
		}
	};
	MapRoutes["ATTACK_gate.*"] = MapRoutes.PLANT_Axis_Gate;
	MapRoutes["GRENADE_door_mg.*"] = MapRoutes.PLANT_Door_Lock;
	MapRoutes.ATTACK_door5 = MapRoutes.PLANT_Door_Lock;
	MapRoutes.ATTACK_door2 = MapRoutes.ATTACK_door1;
	MapRoutes.BUILD_Neutral_Command_Post = MapRoutes.PLANT_Neutral_Command_Post;
	MapRoutes.DEFEND_door12 = MapRoutes.PLANT_Neutral_Command_Post;
	MapRoutes.DEFEND_door10 = MapRoutes.DEFEND_door12;
	MapRoutes.DEFEND_door8 = MapRoutes.DEFEND_door12;
	MapRoutes.SNIPE_door4 = MapRoutes.DEFEND_door12;
	MapRoutes.MOUNTMG42_Door2 = MapRoutes.MOUNTMG42_Door1;
	MapRoutes.MOUNTMG42_Door_Lock = MapRoutes.MOUNTMG42_Door1;
	MapRoutes.REPAIRMG42_Door1 = MapRoutes.MOUNTMG42_Door1;
	MapRoutes.REPAIRMG42_Door2 = MapRoutes.MOUNTMG42_Door2;
	MapRoutes.REPAIRMG42_Door_Lock = MapRoutes.MOUNTMG42_Door_Lock;
	MapRoutes["ATTACK_lab.*"] = MapRoutes.PLANT_Axis_Lab;
	Util.Routes(MapRoutes);
};

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 250.0;
	foreach ( weap in { WEAPON.THOMPSON,WEAPON.MP40,WEAPON.SHOTGUN } )
	{
		w = bot.GetWeapon(weap);
		if(w){ w.PrimaryFire.SetTargetBias(CLASS.BREAKABLE, 1.2); }
	}
};
