global Map =
{
	Debug=0,
	Quiet = true,
	DontDispenseAmmo = true,
	Suicide = 1,

	rampBuilt = false,
	truckBuilt = false,
	gateDestroyed = false,
	controlsDestroyed = false,

	TriggerOneVoiceChat = false,
	TriggerOne =
	{
		Name = "TriggerOne",
		TriggerOnClass = CLASS.ANYPLAYER,
		OnEnter = function(ent)
		{
			if( GetEntTeam(ent) == TEAM.ALLIES )
			{
				SetAvailableMapGoals( TEAM.AXIS, false, {
					"MOBILEMG42_ax1",
					"MOBILEMORTAR_mor1",
					"DEFEND_dgate.*",
					"DEFEND_dramp.*",
				});

				// cs: only do this once or else it's extremely annoying
				if ( !Map.TriggerOneVoiceChat && MAP_TALK ) {
					Util.OneBotVSayTeam( TEAM.AXIS, VOICE.DEFEND_OBJECTIVE );
					Map.TriggerOneVoiceChat = true;
				}
			}
		},
	},

	SetCity = function(b)
	{
		if (!Map.controlsDestroyed)
		{
			SetAvailableMapGoals( TEAM.ALLIES, b, {
				"PLANT_Door_Controls",
				"ATTACK_acontrols.*",
				"MOBILEMG42_ally99",
			});
		}
		if (!Map.truckBuilt){
			SetAvailableMapGoals( TEAM.ALLIES, b, "CHECKPOINT_spawnflag" );
		}
		SetAvailableMapGoals( TEAM.ALLIES, b, {
			".*_Neutral_Command_Post",
			"BUILD_Escape_Truck",
		});
		SetAvailableMapGoals( TEAM.ALLIES, !b, {
			"ATTACK_gate.*",
			"SMOKEBOMB_a1",
		});
	},

	Allied_Assault_Ramp_Built = function( trigger )
	{
		Map.rampBuilt = true;
		Util.MapDebugPrint("Allied_Assault_Ramp_Built");
		sleep(2);
		if(Map.rampBuilt){
			Map.SetCity(true);
		}
	},

	Escape_Truck_Built = function( trigger )
	{
		Map.truckBuilt = true;
		SetAvailableMapGoals( TEAM.ALLIES, true, "CAPPOINT_.*" );

		//forward flag secured by allies
		Map.SetCity(true);
		SetAvailableMapGoals( TEAM.ALLIES, false, "BUILD_Allied_Assault_Ramp" );
		SetAvailableMapGoals( TEAM.AXIS, false, "PLANT_Allied_Assault_Ramp" );
		if (!Map.gateDestroyed){
			SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_City_Gate" );
		}
		Util.DisableGoal("CHECKPOINT_spawnflag");

		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ARTILLERY_S_.*",
			"CALLARTILLERY_.*",
		});

		Util.MapDebugPrint( "Escape_Truck_Built" );
	},

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

	Allied_Assault_Ramp_Destroyed = function( trigger )
	{
		Map.rampBuilt = false;
		if (!Map.gateDestroyed && !Map.truckBuilt){
			Map.SetCity(false);
		}

		Util.MapDebugPrint( "Allied_Assault_Ramp_Destroyed" );
	},

	City_Gate_Destroyed = function( trigger )
	{
		Map.gateDestroyed = true;
		sleep(2);
		Map.SetCity(true);
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_dgate.*",
			"DEFEND_dramp.*",
		});

		Util.MapDebugPrint( "City_Gate_Destroyed" );
	},

	Door_Controls_Destroyed = function( trigger )
	{
		Map.controlsDestroyed = true;
		sleep(6);
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"FLAG_.*",
			"ATTACK_adocs.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_dcontrols.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_ddocs.*" );
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_acontrols.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"SMOKEBOMB_a2",
			"GRENADE_ally3",
			"GRENADE_ally2",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, "MOBILEMG42_ally99" );

		Util.MapDebugPrint( "Door_Controls_Destroyed" );
	},

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

	northdocs_Taken = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_ddocs.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_atruck.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"DEFEND_dtruck.*",
			"AIRSTRIKE_axis3",
			"ARTILLERY_S_.*",
			"CALLARTILLERY_.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ATTACK_adocs.*",
			"SMOKEBOMB_a2",
			"GRENADE_ally3",
			"GRENADE_ally2",
		});
		Util.ChangeSpawn(TEAM.AXIS, 3, 9);

		Util.MapDebugPrint( "northdocs_Taken" );
	},

	northdocs_Returned = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_ddocs.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_dtruck.*" );
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_atruck.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "ATTACK_adocs.*" );
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"ARTILLERY_S_.*",
			"CALLARTILLERY_.*",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, "SMOKEBOMB_a2" );
		SetAvailableMapGoals( TEAM.AXIS, false, "AIRSTRIKE_.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"GRENADE_ally3",
			"GRENADE_ally2",
		});
		Util.ChangeSpawn(TEAM.AXIS, 0, 9);

		foreach ( id and bot in BotTable )
		{
			if ( bot.GetTeam() == TEAM.AXIS )
			{
				//distance check instead?
				if ( Map.Suicide && bot.GetReinforceTime() < 5 )
				{
					bot.ExecCommand( "kill" );
				}
			}
		}

		Util.MapDebugPrint( "northdocs_returned" );
	},

	control_plant = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"DEFEND_dgate.*",
			"DEFEND_dramp.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_dcontrols.*" );

		Util.MapDebugPrint( "planted at door controls" );
	},

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

	spawnflag_Allies_Captured = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"CHECKPOINT_spawnflag",
			"DEFEND_dcontrols.*",
		});
		Map.DontDispenseAmmo = false;

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

global OnMapLoad = function()
{
	OnTrigger( "The Allied North Assault Ramp has been constructed.", Map.Allied_Assault_Ramp_Built );
	OnTrigger( "The Truck has been repaired.", Map.Escape_Truck_Built );
	OnTrigger( "Allied Command Post constructed. Charge speed increased!", Map.Neutral_Command_Post_Built );
	OnTrigger( "Axis have destroyed the Allied North Assault Ramp.", Map.Allied_Assault_Ramp_Destroyed );
	OnTrigger( "Allied Team has destroyed the City Gate.", Map.City_Gate_Destroyed );
	OnTrigger( "Allied Team has destroyed the Doors Controls.", Map.Door_Controls_Destroyed );
	OnTrigger( "Axis team has destroyed the Allied Command Post!", Map.Neutral_Command_Post_Destroyed );
	OnTrigger( "Allies have stolen the Documents!", Map.northdocs_Taken );
	OnTrigger( "Flag returned northdocs!", Map.northdocs_Returned );
	OnTrigger( "Planted at the Door Controls.", Map.control_plant );
	OnTrigger( "Axis reclaimed the Old City!", Map.spawnflag_Axis_Captured );
	OnTrigger( "Allies capture the Old City!", Map.spawnflag_Allies_Captured );

	cellar = OnTriggerRegion(AABB(-2167.1, -1408.9, 135.125, -1831.09, -1362.5, 218.6), Map.TriggerOne);
	storage = OnTriggerRegion(AABB(-1749.4, -1857.7, 135.125, -1684.9, -1558.845, 225.125), Map.TriggerOne);
	westhall = OnTriggerRegion(AABB(-2698.04, -2338.14, 327.125, -2511.74, -2287.126, 401.125), Map.TriggerOne);
	easthall = OnTriggerRegion(AABB(-2464.76, -2340.09, 151.125, -2260.5, -2287.126, 225.125), Map.TriggerOne);

	Util.DisableGoal(".*", true);
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"ATTACK_gate.*",
		"SMOKEBOMB_a1",
		"PLANT_City_Gate",
		"BUILD_Allied_Assault_Ramp",
	});

	SetAvailableMapGoals( TEAM.AXIS, true, {
		".*_Neutral_Command_Post",
		"DEFEND_dgate.*",
		"DEFEND_dramp.*",
		"MOBILEMG42_ax1",
		"MOBILEMORTAR_mor1",
		"PLANT_Allied_Assault_Ramp",
	});

	SetMapGoalProperties( "DEFEND_.*", {MinCampTime=30, MaxCampTime=90} );

	SetGoalPriority( "BUILD_Allied_Assault_Ramp", 0.85, TEAM.ALLIES);
	SetGoalPriority( "PLANT_City_Gate", 0.85, TEAM.ALLIES);

	Util.SetMaxUsers( 2, "CHECKPOINT_.*" );
	Util.SetMaxUsers( 1, "BUILD_.*" );
	Util.SetMaxUsers( 1, "PLANT_City_Gate" );
	Util.SetMaxUsers( 1, "PLANT_Neutral_Command_Post" );

	Util.AddUsePoint( "BUILD_Escape_Truck", Vec3(-586.5, -2239, 160.125) ) ;
	Util.AddUsePoint( "PLANT_City_Gate", { Vec3(2195, 1077, 112.125), Vec3(2085.45, 1077.5, 112.125) });
	Util.AddUsePoint( "PLANT_Door_Controls", { Vec3(-2335.8, -1782, 176.125), Vec3(-2325.56, -1872, 176.125), Vec3(-2349.8, -1961.2, 176.125) } ) ;
	Util.SetGoalPosition( 1614, 2132.4, 297.098, "PLANT_Allied_Assault_Ramp" ) ;

	Util.ChangeSpawn(TEAM.AXIS, 1, 6);

	MapRoutes =
	{
		DEFEND_dgate1 =
		{
			ROUTE_ax1  =
			{
				ROUTE_ax2  =
				{
					ROUTE_axr1  =
					{
						ROUTE_axr2  =
						{
						},
					},
					ROUTE_axl1  =
					{
						ROUTE_axl2  =
						{
							ROUTE_axl3  =
							{
								ROUTE_axl4  =
								{
									ROUTE_axl5  =
									{
									},
									ROUTE_axl7  =
									{
									},
								},
							},
						},
						ROUTE_axr2  =
						{
						},
					},
				},
				ROUTE_dst1  =
				{
					ROUTE_axl1  =
					{
						ROUTE_axl2  =
						{
							ROUTE_axl3  =
							{
								ROUTE_axl4  =
								{
									ROUTE_axl5  =
									{
									},
									ROUTE_axl7  =
									{
									},
								},
							},
						},
						ROUTE_axr2  =
						{
						},
					},
				},
			},
		},

		ATTACK_acontrols1 =
		{
			ROUTE_407  =
			{
				ROUTE_290  =
				{
					ROUTE_324  =
					{
						ROUTE_303  =
						{
						},
						ROUTE_296  =
						{
							ROUTE_300  =
							{
								ROUTE_303  =
								{
								},
							},
						},
					},
				},
			},
		},

		FLAG_northdocs =
		{
			ROUTE_407  =
			{
				ROUTE_docs1  =
				{
					ROUTE_290  =
					{
						ROUTE_docs4  =
						{
							ROUTE_docs5  =
							{
								ROUTE_docs8  =
								{
									ROUTE_docs12  =
									{
									},
								},
							},
							ROUTE_docs2  =
							{
								ROUTE_docs9  =
								{
									ROUTE_docs10  =
									{
										ROUTE_docs11  =
										{
										},
									},
								},
							},
						},
					},
				},
			},
		},

		CAPPOINT_truck =
		{
			ROUTE_documents  =
			{
				ROUTE_docs12  =
				{
					ROUTE_docs8  =
					{
						ROUTE_docs5  =
						{
							ROUTE_docs4  =
							{
								ROUTE_run8  =
								{
								},
							},
						},
						ROUTE_docs2  =
						{
							ROUTE_324  =
							{
								ROUTE_303  =
								{
									ROUTE_run77  =
									{
										ROUTE_run78  =
										{
											ROUTE_run79  =
											{
											},
										},
									},
								},
							},
						},
						ROUTE_290  =
						{
							ROUTE_docs1  =
							{
								ROUTE_407  =
								{
									ROUTE_axl3  =
									{
										ROUTE_ax2  =
										{
											ROUTE_run3  =
											{
												ROUTE_run4  =
												{
												},
											},
										},
									},
								},
							},
						},
					},
				},
				ROUTE_docs11  =
				{
					ROUTE_docs10  =
					{
						ROUTE_docs9  =
						{
							ROUTE_docs3  =
							{
								ROUTE_df6  =
								{
									ROUTE_df7  =
									{
									},
								},
							},
							ROUTE_324  =
							{
								ROUTE_303  =
								{
									ROUTE_run1  =
									{
										ROUTE_417  =
										{
											ROUTE_run2  =
											{
												ROUTE_axl2  =
												{
													ROUTE_axl4  =
													{
														ROUTE_dst1  =
														{
															ROUTE_run4  =
															{
															},
														},
													},
													ROUTE_run3  =
													{
														ROUTE_run4  =
														{
														},
													},
												},
											},
										},
									},
								},
							},
							ROUTE_docs4  =
							{
								ROUTE_run8  =
								{
									ROUTE_run1  =
									{
										ROUTE_docs1  =
										{
											ROUTE_axl4  =
											{
												ROUTE_axl5  =
												{
													ROUTE_axr2  =
													{
														ROUTE_axr1  =
														{
															ROUTE_axl2  =
															{
																ROUTE_run4  =
																{
																},
															},
														},
													},
												},
											},
										},
									},
								},
							},
						},
					},
				},
			},
		},

		DEFEND_dcontrols1 =
		{
			ROUTE_df1  =
			{
				ROUTE_df3  =
				{
					ROUTE_df4  =
					{
						ROUTE_df5  =
						{
							ROUTE_df6  =
							{
								ROUTE_df7  =
								{
								},
							},
							ROUTE_df8  =
							{
							},
						},
					},
				},
			},
			ROUTE_df2  =
			{
				ROUTE_df3  =
				{
					ROUTE_df4  =
					{
						ROUTE_df5  =
						{
							ROUTE_df6  =
							{
								ROUTE_df7  =
								{
								},
							},
							ROUTE_df8  =
							{
							},
						},
					},
				},
			},
		},
	};

	MapRoutes.DEFEND_dgate2 = MapRoutes.DEFEND_dgate1;
	MapRoutes.DEFEND_dgate3 = MapRoutes.DEFEND_dgate1;
	MapRoutes.DEFEND_dgate4 = MapRoutes.DEFEND_dgate1;
	MapRoutes.DEFEND_dramp1 = MapRoutes.DEFEND_dgate1;
	MapRoutes.DEFEND_dramp2 = MapRoutes.DEFEND_dgate1;
	MapRoutes.ATTACK_acontrols2 = MapRoutes.ATTACK_acontrols1;
	MapRoutes.ATTACK_acontrols3 = MapRoutes.ATTACK_acontrols1;
	MapRoutes.ATTACK_acontrols4 = MapRoutes.ATTACK_acontrols1;
	MapRoutes.ATTACK_acontrols5 = MapRoutes.ATTACK_acontrols1;
	MapRoutes.PLANT_Door_Controls = MapRoutes.ATTACK_acontrols1;
	MapRoutes.ATTACK_adocs1 = MapRoutes.FLAG_northdocs;
	MapRoutes.ATTACK_adocs2 = MapRoutes.FLAG_northdocs;
	MapRoutes.ATTACK_adocs3 = MapRoutes.FLAG_northdocs;
	MapRoutes.ATTACK_adocs4 = MapRoutes.FLAG_northdocs;
	MapRoutes.ATTACK_atruck1 = MapRoutes.CAPPOINT_truck;
	MapRoutes.ATTACK_atruck2 = MapRoutes.CAPPOINT_truck;
	MapRoutes.ATTACK_atruck3 = MapRoutes.CAPPOINT_truck;
	MapRoutes.ATTACK_atruck4 = MapRoutes.CAPPOINT_truck;
	MapRoutes.ATTACK_atruck5 = MapRoutes.CAPPOINT_truck;
	MapRoutes.ATTACK_atruck6 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck1 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck2 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck3 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck4 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck5 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dtruck6 = MapRoutes.CAPPOINT_truck;
	MapRoutes.DEFEND_dcontrols2 = MapRoutes.DEFEND_dcontrols1;
	MapRoutes.DEFEND_dcontrols3 = MapRoutes.DEFEND_dcontrols1;
	MapRoutes.DEFEND_dcontrols4 = MapRoutes.DEFEND_dcontrols1;
	MapRoutes.DEFEND_dcontrols5 = MapRoutes.DEFEND_dcontrols1;
	Util.Routes(MapRoutes);

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

global OnBotJoin = function( bot )
{
	bot.TargetBreakableDist = 100.0;
	bot.MaxViewDistance = 2900.0;
};
