//==========================================================================================
//
//	wolfsrudel3_final.gm
//
//	Omni-bot 0.8 script for Wolfsrudel3 final, by d00d
//	15 October 2009
//	Waypoints (mostly) by Blindman
//	Many thanks to BOK Naerling for testing and suggestions
//
//==========================================================================================

global Map =
{
	bunker_secured = false,
	box1status = "home", // "home", "taken", "secured"
	box2status = "home", // "home", "taken", "secured"

	Ammo_Cabinet_cabinet_ammo_model = "AMMOCAB_cabinet_ammo_model",
	Ammo_Cabinet_t10000345 = "AMMOCAB_t10000345",
	Health_Cabinet_cabinet_health_model = "HEALTHCAB_cabinet_health_model",
	Health_Cabinet_t10000346 = "HEALTHCAB_t10000346",
	Checkpoint_forwardbunker_flag = "CHECKPOINT_forwardbunker_flag",
	Flag_emitterbox1 = "FLAG_emitterbox1",
	Flag_emitterbox2 = "FLAG_emitterbox2",
	Build_Antenna_Defense = "BUILD_Antenna_Defense",
	Build_Command_Post = "BUILD_Command_Post",
	Build_Woodenbarrier = "BUILD_Woodenbarrier",
	Plant_Antenna_Defense = "PLANT_Antenna_Defense",
	Plant_Bunker_Sidewall = "PLANT_Bunker_Sidewall",
	Plant_Command_Post = "PLANT_Command_Post",
	Plant_Forwardbunkerdoor = "PLANT_Forwardbunkerdoor",
	Plant_Mainbunkergate = "PLANT_Mainbunkergate",
	Plant_Radio_Mast = "PLANT_Radio_Mast",
	Plant_Sidewall = "PLANT_Sidewall",
	Plant_Woodenbarrier = "PLANT_Woodenbarrier",
	Mount_Spawn_MG = "MOUNTMG42_14",
	Mount_Fort_MG = "MOUNTMG42_94",
	Mount_Bunker_MG = "MOUNTMG42_155",
	Repair_Spawn_MG = "REPAIRMG42_14",
	Repair_Fort_MG = "REPAIRMG42_94",
	Repair_Bunker_MG = "REPAIRMG42_155",

	Antenna_Defense_Built = function()
	{
		SetAvailableMapGoals( TEAM.AXIS, false, "AIRSTRIKE_radio" );
		Util.MapDebugPrint( "Antenna_Defense_Built" );
	},

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

	Woodenbarrier_Built = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			"ROUTE_woodendoor1",
			"ROUTE_woodendoor2",
		});
		Util.MapDebugPrint( "Woodenbarrier_Built" );
	},

	Antenna_Defense_Destroyed = function()
	{
		SetAvailableMapGoals( TEAM.AXIS, true, "AIRSTRIKE_radio" );
		Util.MapDebugPrint( "Antenna_Defense_Destroyed" );
	},

	Bunker_Sidewall_Destroyed = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_sidewall_left" );

		SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_start.*" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ROUTE_sidewall_left",
			"DEFEND_fort.*",
			"DEFEND_radiomast.*",
			"DEFEND_radarparts.*",
			Map.Mount_Fort_MG,
			Map.Repair_Fort_MG,
		});

		Util.MapDebugPrint( "Bunker_Sidewall_Destroyed" );
	},

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

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

	Mainbunkergate_Destroyed = function()
	{
		Map.bunker_secured = true;
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
		});
		SetAvailableMapGoals( TEAM.ALLIES, false, "ATTACK_bunkergate.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "SNIPE_allies.*" );
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Map.Mount_Spawn_MG,
			Map.Repair_Spawn_MG,
		});

		SetAvailableMapGoals( TEAM.AXIS, false, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
			"DEFEND_forwardbunker.*",
			"HEALTHCAB_t10000346",
			"AMMOCAB_t10000345",
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"SNIPE_fort.*",
			Map.Mount_Fort_MG,
			Map.Repair_Fort_MG,
		});

		foreach ( bot in BotTable )
		{
			if ( bot.GetTeam() == TEAM.ALLIES )
			{
				bot.ChangeSpawnPoint(0);
			}
		}
		Util.MapDebugPrint( "Mainbunkergate_Destroyed" );
	},

	Radio_Mast_Destroyed = function()
	{
		SetAvailableMapGoals( TEAM.AXIS, false, {
			"SNIPE_fort4",
			"SNIPE_fort5",
			"SNIPE_fort6",
			"DEFEND_radiomast.*",
			"PLANTMINE_radiomast.*",
			"BUILD_Antenna_Defense",
			"AIRSTRIKE_radio",
		});

		SetAvailableMapGoals( TEAM.ALLIES, false, "PLANT_Antenna_Defense" );
		Util.MapDebugPrint( "Radio_Mast_Destroyed" );
	},

	Sidewall_Destroyed = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, true, "ROUTE_sidewall_right" );
		SetAvailableMapGoals( TEAM.AXIS, true, {
			"ROUTE_sidewall_right",
			"DEFEND_fort.*",
			"DEFEND_radiomast.*",
			"DEFEND_radarparts.*",
			Map.Mount_Fort_MG,
			Map.Repair_Fort_MG,
		});
		Util.MapDebugPrint( "Sidewall_Destroyed" );
	},

	Woodenbarrier_Destroyed = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			"ROUTE_woodendoor1",
			"ROUTE_woodendoor2",
		});
		Util.MapDebugPrint( "Woodenbarrier_Destroyed" );
	},

	emitterbox1_Taken = function()
	{
		Map.box1status = "taken";

		if ( Map.box2status != "home" )
		{
			SetAvailableMapGoals(TEAM.AXIS, false, "DEFEND_radarpart.*");
		}

		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_cappoint.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_cappoint.*" );
		SetGoalPriority( "DEFEND_cappoint.*", 0.8 );
		Util.MapDebugPrint( "emitterbox1_Taken" );
	},

	emitterbox1_Returned = function()
	{
		Map.box1status = "home";

		if ( Map.box2status != "taken" )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_cappoint.*" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_cappoint.*" );
		}
		SetAvailableMapGoals(TEAM.AXIS, true, "DEFEND_radarpart.*");

		Util.MapDebugPrint( "emitterbox1_Returned" );
	},

	emitterbox2_Taken = function()
	{
		Map.box2status = "taken";

		if ( Map.box1status != "home" )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_radarpart.*" );
		}
		SetAvailableMapGoals( TEAM.AXIS, true, "DEFEND_cappoint.*" );
		SetAvailableMapGoals( TEAM.ALLIES, true, "DEFEND_cappoint.*" );
		SetGoalPriority( "DEFEND_cappoint.*", 0.8 );

		Util.MapDebugPrint( "emitterbox2_Taken" );
	},

	emitterbox2_Returned = function()
	{
		Map.box2status = "home";

		if ( Map.box1status != "taken" )
		{
			SetAvailableMapGoals( TEAM.AXIS, false, "DEFEND_cappoint.*" );
			SetAvailableMapGoals( TEAM.ALLIES, false, "DEFEND_cappoint.*" );
		}
		SetAvailableMapGoals(TEAM.AXIS, true, "DEFEND_radarpart.*");

		Util.MapDebugPrint( "emitterbox2_Returned" );
	},

	emitterbox1_Secured = function()
	{
		Map.box1status = "secured";
		if ( Map.box2status == "secured" )
		{
			SetAvailableMapGoals( TEAM.ALLIES, false, "SNIPE_compost" );
			SetAvailableMapGoals( TEAM.AXIS, false, {
				"DEFEND_radarpart.*",
				"DEFEND_cappoint.*",
			});
			SetAvailableMapGoals( TEAM.ALLIES, false, {
				"DEFEND_cappoint.*",
				"PLANT_woodenbarrier",
			});
		}

		Util.MapDebugPrint( "emitterbox_Secured" );
	},

	emitterbox2_Secured = function()
	{
		Map.box2status = "secured";
		if ( Map.box1status == "secured" )
		{
			SetAvailableMapGoals( TEAM.ALLIES, false, "SNIPE_compost" );
			SetAvailableMapGoals( TEAM.AXIS, false, {
				"DEFEND_radarpart.*",
				"DEFEND_cappoint.*",
			});
			SetAvailableMapGoals( TEAM.ALLIES, false, {
				"DEFEND_cappoint.*",
				"PLANT_woodenbarrier",
			});
		}

		Util.MapDebugPrint( "emitterbox_Secured" );
	},

	forwardbunker_flag_Axis_Captured = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, false, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
		});
		SetAvailableMapGoals( TEAM.AXIS, true, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
		});
		Util.MapDebugPrint( "forwardbunker_flag_Axis_Captured" );
	},

	forwardbunker_flag_Allies_Captured = function()
	{
		SetAvailableMapGoals( TEAM.ALLIES, true, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
		});
		SetAvailableMapGoals( TEAM.AXIS, false, {
			Repair_Bunker_MG,
			Mount_Bunker_MG,
		});
		Util.MapDebugPrint( "forwardbunker_flag_Allies_Captured" );
	},

};

global OnMapLoad = function()
{
	/*** TRIGGER REGISTRATION ***/
	OnTrigger( "Allied Command Post constructed. Charge speed increased!", Map.Command_Post_Built );
	OnTrigger( "Axis team has destroyed the Allied Command Post!", Map.Command_Post_Destroyed );
	OnTrigger( "The Antenna Defense has been constructed.", Map.Antenna_Defense_Built );
	OnTrigger( "The Allies have destroyed the  Antenna defense!", Map.Antenna_Defense_Destroyed );
	OnTrigger( "The Woodenbarrier has been constructed.", Map.Woodenbarrier_Built );
	OnTrigger( "The Allies have destroyed the Woodenbarrier!", Map.Woodenbarrier_Destroyed );
	OnTrigger( "The Allies have breached the Sidewall!", Map.Sidewall_Destroyed );
	OnTrigger( "The Allies have breached the Bunkersidewall!", Map.Bunker_Sidewall_Destroyed );
	OnTrigger( "The Allies breach the Forwardbunkerdoor!", Map.Forwardbunkerdoor_Destroyed );
	OnTrigger( "Allies have breached the Main Entrance and secured the Forward Bunker!", Map.Mainbunkergate_Destroyed );
	OnTrigger( "Allies have destroyed the Main Radio Mast!", Map.Radio_Mast_Destroyed );
	OnTrigger( "Allies have stolen the First Radarparts!", Map.emitterbox1_Taken );
	OnTrigger( "Flag returned emitterbox1!", Map.emitterbox1_Returned );
	OnTrigger( "Allies have stolen the Second Radarparts!", Map.emitterbox2_Taken );
	OnTrigger( "Flag returned emitterbox2!", Map.emitterbox2_Returned );
	OnTrigger( "Allies have secured the First Radar Parts!", Map.emitterbox1_Secured );
	OnTrigger( "Allies have secured the Second Radar Parts!", Map.emitterbox2_Secured );
	OnTrigger( "allies_reclaims_forwardbunker_flag", Map.forwardbunker_flag_Allies_Captured );
	OnTrigger( "axis_reclaims_forwardbunker_flag", Map.forwardbunker_flag_Axis_Captured );

	/*** INITIAL AVAILABILITY OF MAP GOALS ***/
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"AIRSTRIKE_.*",
		"PLANTMINE_.*",
		"DEFEND_.*",
		"MOUNTMG42_.*",
		"REPAIRMG42_.*",
		Map.Mount_Spawn_MG,
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, {
		Map.Mount_Bunker_MG,
		Map.Repair_Bunker_MG,
	});
	SetAvailableMapGoals( TEAM.ALLIES, false, {
		Map.Repair_Spawn_MG,
		"SNIPE_.*",
	});
	SetAvailableMapGoals( TEAM.ALLIES, true, "SNIPE_compost" );

	SetAvailableMapGoals( TEAM.AXIS, false, "AIRSTRIKE_.*" );
	SetAvailableMapGoals( TEAM.AXIS, true, "PLANTMINE_.*" );
	SetAvailableMapGoals( TEAM.AXIS, false, {
		"SNIPE_.*",
		Map.Mount_Spawn_MG,
		Map.Repair_Spawn_MG,
		Map.Mount_Fort_MG,
		Map.Repair_Fort_MG,
		"ATTACK.*",
		"DEFEND.*",
	});
	SetAvailableMapGoals( TEAM.AXIS, true, {
		"DEFEND_start.*",
		"DEFEND_forwardbunker.*",
	});

	/*** PRIORITY ***/
	SetGoalPriority( "CHECKPOINT_forwardbunker_flag", 0.8 );
	SetGoalPriority( "CHECKPOINT_forwardbunker_flag", 0.7, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Forwardbunkerdoor", 0.82, TEAM.ALLIES, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Mainbunkergate", 0.81, TEAM.ALLIES, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Forwardbunkerdoor", 0.0, TEAM.ALLIES, CLASS.COVERTOPS );
	SetGoalPriority( "BUILD_Command_Post", 0.8, TEAM.ALLIES, CLASS.ENGINEER );
	SetGoalPriority( "PLANT_Woodenbarrier", 0.8, TEAM.ALLIES, CLASS.COVERTOPS );
	SetGoalPriority( "PLANT_Woodenbarrier", 0.0, TEAM.ALLIES, CLASS.ENGINEER );
	SetGoalPriority( "FLAG_emitterbox1", 0.8, TEAM.ALLIES );
	SetGoalPriority( "FLAG_emitterbox2", 0.81, TEAM.ALLIES );

	/*** GOAL POSITIONS ***/
	Util.SetGoalOffset( -10, -20, 0, "PLANT_Radio_Mast" );
	Util.SetGoalOffset( 0, -10, 0, "PLANT_Forwardbunkerdoor" );
	Util.SetGoalOffset( -10, 0, 0, "PLANT_Woodenbarrier" );

	/*** MAX USERS ***/
	Util.SetMaxUsersInProgress( 1, "DEFEND_.*" );
	Util.SetMaxUsersInProgress( 1, "BUILD_.*" );
	Util.SetMaxUsersInProgress( 1, "PLANT_.*" );
	Util.SetMaxUsersInProgress( 1, "MOUNTMG42_.*" );

	/*** ROUTES ***/
	MapRoutes =
	{
		CAPPOINT_cappoint2 =
		{
			ROUTE_objective =
			{
				ROUTE_frontdoor1 =
				{
					ROUTE_sidewall_left = {},
					ROUTE_sidewall_right = {},
					ROUTE_maingate = {},
				},
				ROUTE_woodendoor1 =
				{
					ROUTE_woodendoor2 =
					{
						ROUTE_sidewall_left = {},
						ROUTE_sidewall_right = {},
						ROUTE_maingate = {},
					}
				}
			},
		},
		BUILD_Command_Post =
		{
			ROUTE_cabinspawn =
			{
				ROUTE_backdoor = {},
				ROUTE_frontdoor =	{ ROUTE_logs = {} }
			},
			ROUTE_watertower =
			{
				ROUTE_left = {},
				ROUTE_right = {}
			}
		},
		PLANT_Forwardbunkerdoor =
		{
			ROUTE_cabinspawn =
			{
				ROUTE_hill =
				{
					ROUTE_right = {},
				},
			},
		},
		CHECKPOINT_forwardbunker_flag =
		{
			ROUTE_watertower =
			{
				ROUTE_left =
				{
					ROUTE_bunker = {},
					ROUTE_middle = {},
					ROUTE_logs = {},
				},
				ROUTE_right =
				{
					ROUTE_bunker = {},
					ROUTE_middle = {},
					ROUTE_tunnel = {},
				}
			},
			ROUTE_cabinspawn =
			{
				ROUTE_backdoor =
				{
					ROUTE_logs = {},
				},
				ROUTE_frontdoor =
				{
					ROUTE_bunker = {},
					ROUTE_middle = {},
					ROUTE_bunkerdoor = { ROUTE_tunnel = {} }
				},
				ROUTE_middle = {},
				ROUTE_bunkerdoor = {},
			},
			ROUTE_axisspawn =
			{
				ROUTE_axisdoor = {},
				ROUTE_gate = {},
				ROUTE_ladder = {},
			},
		},
		PLANT_Command_Post =
		{
			ROUTE_axisspawn =
			{
				ROUTE_axisdoor = {},
				ROUTE_gate = {},
				ROUTE_ladder = {},
			},
		},
		PLANT_Woodenbarrier =
		{
			ROUTE_bunkerspawn =
			{
				ROUTE_sidewall_left = {},
				ROUTE_sidewall_right = {},
				ROUTE_maingate = {},
			},
			ROUTE_cabinspawn =
			{
				ROUTE_backdoor =
				{
					ROUTE_logs = {},
					ROUTE_sidewall_left = {},
					ROUTE_sidewall_right = {},
					ROUTE_maingate = {},
				},
				ROUTE_frontdoor =
				{
					ROUTE_bunker = {},
					ROUTE_middle = {},
					ROUTE_bunkerdoor = { ROUTE_tunnel = {} },
					ROUTE_sidewall_left = {},
					ROUTE_sidewall_right = {},
					ROUTE_maingate = {},
				},
				ROUTE_middle = {},
				ROUTE_bunkerdoor = {},
			},
		}
	};
	MapRoutes.PLANT_Sidewall = MapRoutes.CHECKPOINT_forwardbunker_flag;
	MapRoutes.PLANT_Bunker_Sidewall = MapRoutes.CHECKPOINT_forwardbunker_flag;
	MapRoutes.PLANT_Mainbunkergate = MapRoutes.CHECKPOINT_forwardbunker_flag;
	MapRoutes.PLANT_Radio_Mast = MapRoutes.PLANT_Woodenbarrier;
	MapRoutes.PLANT_Antenna_Defense = MapRoutes.PLANT_Woodenbarrier;
	MapRoutes.FLAG_emitterbox1 = MapRoutes.PLANT_Woodenbarrier;
	MapRoutes.FLAG_emitterbox2 = MapRoutes.PLANT_Woodenbarrier;
	MapRoutes.BUILD_Antenna_Defense = MapRoutes.PLANT_Command_Post;
	MapRoutes.BUILD_Woodenbarrier = MapRoutes.PLANT_Command_Post;

	Util.Routes(MapRoutes);

	SetAvailableMapGoals( TEAM.ALLIES, false, {
		"ROUTE_sidewall_left",
		"ROUTE_sidewall_right",
	});
	SetAvailableMapGoals( TEAM.AXIS, false, {
		"ROUTE_sidewall_left",
		"ROUTE_sidewall_right",
	});

	Util.MapDebugPrint( "OnMapLoad" );
};

global OnBotJoin = function( bot )
{
	// half of the allies should spawn at the water tower
	if ( !Map.bunker_secured )
	{
		Util.ChangeBotSpawn( bot, TEAM.ALLIES, 4, 5 );
	}
};
