/********************************************************
I found some old waypoints and made a script for them.
Script by Santa Claus a.k.a. :)BOK(: Naerling
Many thanks to the christmas elves d00d and crapshoot for their work on the tram! :D
********************************************************/

global Map =
{
	Quiet = true,
	//set Talk to false if you don't want the bots talking ingame:
	Talk = true,
	AxisCapture = false,

	MaxTramRiders = 1,
	Movers =
	{
		"MOVER_cablecar",
	},

	//Goals
	Ammo_Cabinet_alliedhut_ammocabinet = "AMMOCAB_alliedhut_ammocabinet",
	Ammo_Cabinet_t1096 = "AMMOCAB_t1096",
	Health_Cabinet_alliedhut_healthcabinet = "HEALTHCAB_alliedhut_healthcabinet",
	Health_Cabinet_t1095 = "HEALTHCAB_t1095",
	Checkpoint_roadbunker = "CHECKPOINT_roadbunker",
	Flag_star = "FLAG_star",
	Build_Command_Post = "BUILD_Command_Post",
	Build_Guardhouse = "BUILD_Guardhouse",
	Build_Road_MG = "BUILD_Road_MG",
	Build_Town_Door = "BUILD_Town_Door",
	Cappoint_Sleigh = "CAPPOINT_Sleigh",
	Plant_Command_Post = "PLANT_Command_Post",
	Plant_Guardhouse = "PLANT_Guardhouse",
	Plant_Road_MG = "PLANT_Road_MG",
	Plant_Town_Door = "PLANT_Town_Door",
	Plant_Tunnel_Entrance = "PLANT_Tunnel_Entrance",
	Mount_36 = "MOUNTMG42_36",
	Mount_Guardhouse = "MOUNTMG42_Guardhouse",
	Mount_Road_MG = "MOUNTMG42_Road_MG",
	Repair_36 = "REPAIRMG42_36",
	Repair_Guardhouse = "REPAIRMG42_Guardhouse",
	Repair_Road_MG = "REPAIRMG42_Road_MG",
	Call_Artillery_ax_callarty_1 = "CALLARTILLERY_ax_callarty_1",
	Call_Artillery_ax_callarty_2 = "CALLARTILLERY_ax_callarty_2",
	Artillery_S_ax_arty_1 = "ARTILLERY_S_ax_arty_1",
	Artillery_S_ax_arty_2 = "ARTILLERY_S_ax_arty_2",
	Artillery_S_ax_arty_2 = "ARTILLERY_S_ax_arty_3",
	Call_Artillery_al_callarty_1 = "CALLARTILLERY_al_callarty_1",
	Artillery_S_al_arty_1 = "ARTILLERY_S_al_arty_1",
	Artillery_S_al_arty_2 = "ARTILLERY_S_al_arty_2",
	Mobile_MG42_d_door_2 = "MOBILEMG42_d_door_2",
	Snipe_al_snipe_1 = "SNIPE_al_snipe_1",

	//Tram Stuff
	TramEntity = GetGoal("MOVER_cablecar").GetEntity(),
	Navigation =
	{
		tramwait =
		{
			navigate = function(_this)
			{
				_this.Bot.HoldButton( BTN.CROUCH, 99 );
				counter = 0;
				readyToExit = false;
				while(!readyToExit)
				{
					counter += 50;
					absPos = GetEntityWorldSpace(Map.TramEntity,Vector3(9,46,-192));

					// change the aim position half way so they are facing the right way
					if ( counter < 8000  )
					{
						aimPos = GetEntityWorldSpace(Map.TramEntity,Vector3(83,0.394, -180));
					}
					else
					{
						aimPos = GetEntityWorldSpace(Map.TramEntity,Vector3(-89,5.5, -180));
					}

					_this.AddAimRequest(Priority.High, "position", aimPos);
					_this.Bot.MoveTowards(absPos);
					_this.GotoAsync(absPos, 1000);

					if ( Map.TramStatus == "arrived" )
					{
						if ( counter >= 16500 )
						{
							readyToExit = true;
						}
					}
					yield();
				}
				_this.ReleaseAimRequest();
				_this.Bot.ReleaseButton(BTN.CROUCH);
			},
		},

		jump_pt =
		{
			navigate = function(_this)
			{
				_this.Bot.PressButton(BTN.JUMP);
				sleep(0.25);
			},
		},
	},

	TramStatus = "waiting",
	Switches =
	{
		tramswitch1 =
		{
			Enabled = true,
			Priority = 0,
			WaypointName = "tram1",
			Timeout = 2000,
			AimPosition = Vector3(2459.875,3478.388,1301.885), // for 0.8
		},

		tramswitch2 =
		{
			Enabled = true,
			Priority = 0,
			WaypointName = "tram2",
			Timeout = 2000,
		},
	},

	Riders = 0,
	Tram_Riders =
	{
		Name = "Tram_Riders",
		TriggerOnClass = CLASS.ANYPLAYER,
		OnEnter = function(ent)
		{
			Map.Riders += 1;
			if ( Map.Riders >= Map.MaxTramRiders )
			{
				Wp.SetWaypointFlag( "tram2", "closed", true );
			}
		},
		OnExit = function(ent)
		{
			Map.Riders -= 1;
			if ( Map.Riders < Map.MaxTramRiders )
			{
				Wp.SetWaypointFlag( "tram2", "closed", false );
			}
		},
	},

	//Other Stuff
	Command_Post_Built = function( trigger )
	{
		Util.MapDebugPrint( "Command_Post_Built" );
	},

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

	//First Stage
	roadbunker_Axis_Captured = function( trigger )
	{
		AxisCapture = true;
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Map.Plant_Tunnel_Entrance,
			Map.Mount_36,
			Map.Repair_36,
			"CALLARTILLERY_ax_callarty_1",
			"CALLARTILLERY_ax_callarty_2",
			"ARTILLERY_S_ax_arty_1",
			"ARTILLERY_S_ax_arty_2",
			"ARTILLERY_S_ax_arty_3",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			Map.Flag_star,
			Map.Plant_Guardhouse,
			Map.Plant_Town_Door,
			Map.Plant_Command_Post,
			Map.Build_Command_Post,
			"ATTACK_a_door_.*",
		});

		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Build_Guardhouse,
			Map.Mount_Guardhouse,
			Map.Repair_Guardhouse,
			"DEFEND_d_flag_.*",
			"CALLARTILLERY_al_callarty_1",
			"ARTILLERY_S_al_arty_1",
			"ARTILLERY_S_al_arty_2",
		});
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			Map.Build_Road_MG,
			Map.Mount_Road_MG,
			Map.Repair_Road_MG,
			"DEFEND_d_tram_1",
			"DEFEND_d_star_.*",
			"MOBILEMG42_.*",
			"SNIPE_.*",
		});

		if ( Map.Talk && MAP_TALK )
		{
			foreach ( id and bot in BotTable )
			{
				if ( bot.GetTeam() == TEAM.AXIS )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.ExecCommand("vsay_team FTFollowMe");
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice(VOICE.REINFORCE_OFF);
					}
				}
				if ( bot.GetTeam() == TEAM.ALLIES )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.SayVoice(VOICE.DEFEND_OBJECTIVE);
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice("VOICE.NEGATIVE");
					}
				}
			}
		}

		Util.MapDebugPrint( "roadbunker_Axis_Captured" );
	},

	roadbunker_Allies_Captured = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Map.Flag_star,
			Map.Plant_Guardhouse,
			Map.Plant_Road_MG,
			Map.Plant_Town_Door,
			Map.Plant_Command_Post,
			Map.Build_Command_Post,
			"ATTACK_a_door_.*",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"CALLARTILLERY_ax_callarty_1",
			"CALLARTILLERY_ax_callarty_2",
			"ARTILLERY_S_ax_arty_1",
			"ARTILLERY_S_ax_arty_2",
			"ARTILLERY_S_ax_arty_3",
			Map.Plant_Tunnel_Entrance,
			Map.Mount_36,
			Map.Repair_36,
		});

		SetAvailableMapGoals( TEAM.ALLIES, true, {
			Map.Build_Guardhouse,
			Map.Mount_Guardhouse,
			Map.Repair_Guardhouse,
			Map.Build_Road_MG,
			Map.Mount_Road_MG,
			Map.Repair_Road_MG,
			"CALLARTILLERY_al_callarty_1",
			"ARTILLERY_S_al_arty_1",
			"ARTILLERY_S_al_arty_2",
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Build_Road_MG,
			Map.Mount_Road_MG,
			Map.Repair_Road_MG,
			"DEFEND_d_tram_.*",
			"DEFEND_d_star_.*",
			"MOBILEMG42_.*",
			"SNIPE_.*",
		});

		if( Map.AxisCapture )
		{
			SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_flag_.*" );
		}

		if ( Map.Talk && MAP_TALK )
		{
			foreach ( id and bot in BotTable )
			{
				if ( bot.GetTeam() == TEAM.AXIS )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.ExecCommand("vsay_team FTFallBack");
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice("VOICE.NEGATIVE");
					}
				}
				if ( bot.GetTeam() == TEAM.ALLIES )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.SayVoice(VOICE.DEFEND_OBJECTIVE);
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.ExecCommand("vsay_team FTAttack");
					}
				}
			}
		}

		Util.MapDebugPrint( "roadbunker_Allies_Captured" );
	},

	Tunnel_Entrance_Destroyed = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "ROUTE_Cave" );

		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_flag_.*" );

		Util.MapDebugPrint( "Tunnel_Entrance_Destroyed" );
	},

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

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

	//Second Stage
	Town_Door_Built = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "ROUTE_Door" );
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_a_door_.*" );

		SetAvailableMapGoals( TEAM.ALLIES, true, "CHECKPOINT_roadbunker" );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"DEFEND_d_door_.*",
			"DEFEND_d_star_.*",
		});

		if ( Map.Talk && MAP_TALK )
		{
			foreach ( id and bot in BotTable )
			{
				if ( bot.GetTeam() == TEAM.AXIS )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.ExecCommand("vsay_team FTAttack");
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice(VOICE.REINFORCE_OFF);
					}
				}
				if ( bot.GetTeam() == TEAM.ALLIES )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.SayVoice(VOICE.DEFEND_OBJECTIVE);
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice(VOICE.REINFORCE_OFF);
					}
				}
			}
		}

		Util.MapDebugPrint( "Town_Door_Built" );
	},

	Town_Door_Destroyed = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "ROUTE_Door" );
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_a_door_.*" );

		SetAvailableMapGoals( TEAM.ALLIES, false, "CHECKPOINT_roadbunker" );
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"DEFEND_d_door_.*",
			"DEFEND_d_star_.*",
		});

		if ( Map.Talk && MAP_TALK )
		{
			foreach ( id and bot in BotTable )
			{
				if ( bot.GetTeam() == TEAM.AXIS )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.ExecCommand("vsay_team FTFollowMe");
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.SayVoice(VOICE.REINFORCE_OFF);
					}
				}
				if ( bot.GetTeam() == TEAM.ALLIES )
				{
					r = RandRange(0,10);
					if( r < 2 )
					{
						bot.SayVoice(VOICE.DEFEND_OBJECTIVE);
					}
					else if( r > 8 )
					{
						sleep(1.2);
						bot.ExecCommand("vsay_team FTFallBack");
					}
				}
			}
		}

		Util.MapDebugPrint( "Town_Door_Destroyed" );
	},

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

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

	//Star Stuff
	star_Taken = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "ATTACK_a_cap_.*" );

		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_d_cap_.*" );

		Util.MapDebugPrint( "star_Taken" );
	},

	star_Returned = function( trigger )
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "ATTACK_a_cap_.*" );

		SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_d_cap_.*" );

		Util.MapDebugPrint( "star_Returned" );
	},

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

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

	//Some more tram stuff
	Tram_Moving = function( trigger )
	{
		if ( trigger.Action == "opening" )
		{
			Map.TramStatus = "moving";
			Map.Switches.tramswitch1.Enabled = false;
			Util.MapDebugPrint("tram moving");
		}
	},

	Tram_Waiting = function( trigger )
	{
		vec = ToVector( trigger.Action );
		if ( vec.x == -100 )
		{
			Map.TramStatus = "waiting";
			Map.Switches.tramswitch1.Enabled = true;
			Util.MapDebugPrint("tram waiting");
		}
		else if ( vec.y == -100 )
		{
			Map.TramStatus = "arrived";
			Util.MapDebugPrint("tram arrived");
		}
	},
};

global OnMapLoad = function()
{
	//Move some goals
	Util.SetGoalOffset( -35, 0, -20, "BUILD_Guardhouse" );
	Util.SetGoalOffset( 0, -35, -20, "BUILD_Town_Door" );
	Util.SetGoalOffset( 0, 20, -80, "PLANT_Town_Door" );

	//Triggers
	OnTrigger( "MISSING_STRING", Map.Command_Post_Built );
	OnTrigger( "MISSING_STRING", Map.Command_Post_Destroyed );

	//First Stage
	OnTrigger( "Axis capture the North Pole!", Map.roadbunker_Axis_Captured );
	OnTrigger( "Allies capture the North Pole!", Map.roadbunker_Allies_Captured );
	OnTrigger( "Axis team have breached the Tunnel Entrance!", Map.Tunnel_Entrance_Destroyed );
	OnTrigger( "The high Guardtower have been built.", Map.Guardhouse_Built );
	OnTrigger( "The high Guardtower have been destroyed!", Map.Guardhouse_Destroyed );

	//Second Stage
	OnTrigger( "The Town Door have been built.", Map.Town_Door_Built );
	OnTrigger( "The Town Door have been destroyed!", Map.Town_Door_Destroyed );
	OnTrigger( "Allied team has constructed the Road MG Nest!", Map.Road_MG_Built );
	OnTrigger( "Axis team has destroyed the Road MG Nest!", Map.Road_MG_Destroyed );

	//Star Stuff
	OnTrigger( "Axis has stolen the Christmas Star!", Map.star_Taken );
	OnTrigger( "Flag returned star!", Map.star_Returned );
	OnTrigger( "The Axis team have escaped with the Christmas Star!", Map.axis_Win );
	OnTrigger( "Allied team has stopped the Axis from stealing the Christmas Star!", Map.allies_Win );

	//Set up triggers for the tram
	OnTrigger( "cablecar_goto", Map.Tram_Waiting );
	OnTrigger( "cable_button_Moving", Map.Tram_Moving );

	//Tram riders
	tr = OnTriggerRegion(AABB(2323.125,3267.125,1267.125,2504.838,3446.658,1385.458), Map.Tram_Riders);

	//Enable Switches
	Util.UpdateSwitchData();

	//Disable Goals
	Util.DisableGoal( ".*", true ); //All but routes

	//Goals at start
	//Allies
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		Map.Checkpoint_roadbunker,
		Map.Build_Town_Door,
		Map.Build_Command_Post,
		Map.Plant_Command_Post,
		Map.Build_Guardhouse,
		Map.Mount_Guardhouse,
		Map.Repair_Guardhouse,
		"DEFEND_d_flag_.*",
	});
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"DEFEND_d_flag_6",
		"DEFEND_d_flag_7",
		"DEFEND_d_flag_9",
		"DEFEND_d_flag_11",
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		"CALLARTILLERY_al_callarty_1",
		"ARTILLERY_S_al_arty_1",
		"ARTILLERY_S_al_arty_2",
	});

	//Axis
	SetAvailableMapGoals( TEAM.AXIS, true, {
		Map.Plant_Tunnel_Entrance,
		Map.Checkpoint_roadbunker,
		Map.Mount_36,
		Map.Repair_36,
		"CAPPOINT_Sleigh",
		"CALLARTILLERY_ax_callarty_1",
		"CALLARTILLERY_ax_callarty_2",
		"ARTILLERY_S_ax_arty_1",
		"ARTILLERY_S_ax_arty_2",
		"ARTILLERY_S_ax_arty_3",
	});

	//Set some goal properties
	Util.SetMaxUsersInProgress( 1, "BUILD.*" );
	Util.SetMaxUsersInProgress( 2, "PLANT_.*" );
	Util.SetMaxUsersInProgress( 1, "DEFEND_.*" );
	Util.SetMaxUsersInProgress( 1, "ATTACK_.*" );
	Util.SetMaxUsersInProgress( 1, "MOUNTMG42_.*" );

	SetMapGoalProperties( "ATTACK_.*", {mincamptime=60, maxcamptime=120} );
	SetMapGoalProperties( "DEFEND_.*", {mincamptime=60, maxcamptime=120} );
	SetMapGoalProperties( "MOUNTMG42_.*", {mincamptime=120, maxcamptime=120} );
	SetMapGoalProperties( "MOBILEMG42_.*", {mincamptime=120, maxcamptime=120} );
	SetMapGoalProperties( "SNIPE_.*", {mincamptime=120, maxcamptime=120} );

	//Priority Main Goals
	SetGoalPriority( "CHECKPOINT.*", 0.55 );
	SetGoalPriority( "MOUNT.*", 0.6 );
	SetGoalPriority( "PLANT_Town_Door", 0.91 );
	SetGoalPriority( "BUILD_Town_Door", 0.91 );
	SetGoalPriority( "DEFEND_d_star_1", 0.7 );
	SetGoalPriority( "DEFEND_d_star_2", 0.7 );
	SetGoalPriority( "DEFEND_d_star_3", 0.7 );
	SetGoalPriority( "DEFEND_d_cap_.*", 0.9 );
	SetGoalPriority( "ATTACK_a_cap_.*", 0.9 );
	SetGoalPriority( "MOBILEMG42_.*", 0.56 );
	SetGoalPriority( "SNIPE_.*", 0.56 );

	//Disable some routes
	SetAvailableMapGoals( TEAM.AXIS, false, {
		"ROUTE_Cave",
		"ROUTE_Door",
	});

	//Routes
	MapRoutes =
	{
		CHECKPOINT_roadbunker =
		{
			ROUTE_Axis_Spawn =
			{
				ROUTE_Hill_Left = {},
				ROUTE_Hill_Right = {},
				ROUTE_Cave = {},
			},
			ROUTE_Allied_Spawn =
			{
				ROUTE_Tram_Lower = {},
				ROUTE_Gate_Upper = {},
			},
		},

		FLAG_star =
		{
			ROUTE_House_Spawn =
			{
				ROUTE_Door = {},
				Weight = 2,
				ROUTE_Door =
				{
					ROUTE_DiningRoom =
					{
						ROUTE_Barrels = {},
						ROUTE_Packages = {},
						ROUTE_Packages2 = {},
					},
				},
				ROUTE_TramRoute = {},
				ROUTE_TramRoute =
				{
					ROUTE_DiningRoom =
					{
						ROUTE_Barrels = {},
						ROUTE_Packages = {},
						ROUTE_Packages2 = {},
					},
				},
			},
		},
	};

	Util.Routes(MapRoutes);
	Util.MapDebugPrint( "Botscript for ^1North Pole ^2by ^0:)^1BOK^0(: ^1Naerling ^2was successfully loaded!" );
};

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