Mission event file for Pavonis special mission
Guide
/
Mission event file for Pavonis special mission
Aggiornato 4 years ago di Merric

-- Scavenger Hunt Win Condtition - Used for Pavonis Province in Dark Crusade

-- Find all "Scientists" (using IG civilians as placeholder scientists until final item/unit/artifact is decided on)

-- Author: James Mouat

-- (c) 2006 Relic Entertainment Inc.

import("ScarUtil.scar") import("WXPScarUtil.scar")

function OnGameSetup()

g_ticker = 0 g_IE_Delay = 0 g_Capture_Delay = 0

g_count_scientist1 = 0 g_count_scientist2 = 0 g_count_scientist3 = 0 g_count_scientist4 = 0 g_count_scientist5 = 0 g_count_scientist6 = 0 g_count_scientist7 = 0 g_count_scientist8 = 0 g_count_scientist9 = 0 g_count_scientist10 = 0

g_sci_pos1 = 0 g_sci_pos2 = 0 g_sci_pos3 = 0 g_sci_pos4 = 0 g_sci_pos5 = 0 g_sci_pos6 = 0 g_sci_pos7 = 0 g_sci_pos8 = 0 g_sci_pos9 = 0 g_sci_pos10 = 0

g_P1_squad_count = 0

g_Win = false

g_Scientists_Captured = 0

g_P1_Scientist_Count = 0 g_P2_Scientist_Count = 0 g_P3_Scientist_Count = 0 g_P4_Scientist_Count = 0

g_P1_Win_Count = 0 g_P2_Win_Count = 0 g_P3_Win_Count = 0 g_P4_Win_Count = 0

g_Scientist_Math_firstrun = false

g_total_enemy_score = 0

g_enemy_near_win_delay = 0

g_scientist_arrived_delay = 0

g_territory_index = MetaMap_GetDefendingTerritoryIndex()

g_total_enemy_count = MetaMap_GetTerritoryOpponentCount(g_territory_index)

------------------------------------------------------------------------------
--[[Start Darwin's attacker/defender algorhythm]]

g_attacker_race = MetaMap_GetAttackerRaceName()
g_defender_race = MetaMap_GetDefenderRaceName()
g_player_race = MetaMap_GetPlayerRaceName() 

--print("attacker race = "..g_attacker_race)
--print("defender race = "..g_defender_race)


--check for player vs CPU -- used in the enemy creation functions!
if g_player_race == g_attacker_race then
	
	g_cpu_player_race = g_defender_race
	
	g_defender_strength = MetaMap_GetTerritoryMilitaryStrength(MetaMap_GetDefendingTerritoryIndex())
	
	--print("defender military strength = "..g_defender_strength)
	
	g_cpu_strength = g_defender_strength
	
elseif g_player_race == g_defender_race then
	
	g_cpu_player_race = g_attacker_race
	
	g_attacker_strength = MetaMap_GetTerritoryMilitaryStrength(MetaMap_GetAttackingTerritoryIndex())
	
	--print("attacker military strength = "..g_attacker_strength)
	
	g_cpu_strength = g_attacker_strength
	
end

g_enemy_players_on_map = MetaMap_GetTerritoryOpponentCount(7)

--define a global varible that tells how many total players are on the map.
g_total_players_on_map = g_enemy_players_on_map + 1


--[[defining the name of the player's faction +Engineer BP's +IE Event ID's]]
if g_player_race == "chaos_marine_race" then
	
	factionname = "$690014"
	g_P1_Engineer = "chaos_squad_slave"
	g_P1_IE = 1
	g_player_color = "default_1"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)
	Misc_PlayerTeamColor(g_Player1,g_player_color)
	
elseif g_player_race == "eldar_race" then
	
	factionname = "$690012"
	g_P1_Engineer = "eldar_squad_bonesinger"
	g_P1_IE = 2
	g_player_color = "default_5"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)
	Misc_PlayerTeamColor(g_Player1,g_player_color)
	
elseif g_player_race == "guard_race" then
	
	factionname = "$690011"
	g_P1_Engineer = "guard_squad_enginseer"
	g_P1_IE = 3
	g_player_color = "liberators"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)

	
elseif g_player_race == "ork_race" then
	
	factionname = "$690013"
	g_P1_Engineer = "ork_squad_grot"
	g_P1_IE = 4
	g_player_color = "default_4"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)
	Misc_PlayerTeamColor(g_Player1,g_player_color)
	
elseif g_player_race == "space_marine_race" then
	
	factionname = "$690010"
	g_P1_Engineer = "space_marine_squad_servitor"
	g_P1_IE = 5
	g_player_color = "default_0"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)

	
elseif g_player_race == "tau_race" then
	
	factionname = "$690015"
	g_P1_Engineer = "tau_builder_squad"
	g_P1_IE = 6
	g_player_color = "default_0"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)

	
elseif g_player_race == "necron_race" then
	
	factionname = "$690016"
	g_P1_Engineer = "necron_builder_scarab_squad"
	g_P1_IE = 7
	g_player_color = "default_0"
	
	g_Player1 = Setup_Player(0, factionname, MetaMap_GetPlayerRaceName(), 1)

	
end


	--[[defining the name of the enemy's faction +HQ BP's +Engineer BP's +IE Event ID's +Team color]]  
if g_cpu_player_race == "chaos_marine_race" then
	
	g_enemy_factionname = "$690014"
	g_CPU_HQ = "chaos_hq"
	g_CPU_Engineer = "chaos_squad_slave"
	g_CPU_IE = 1
	g_CPU_color = "default_1"
	
elseif g_cpu_player_race == "eldar_race" then

	g_enemy_factionname = "$690012"
	g_CPU_HQ = "eldar_hq"
	g_CPU_Engineer = "eldar_squad_bonesinger"
	g_CPU_IE = 2
	g_CPU_color = "default_5"
	
elseif g_cpu_player_race == "guard_race" then

	g_enemy_factionname = "$690011"
	g_CPU_HQ = "guard_hq"
	g_CPU_Engineer = "guard_squad_enginseer"
	g_CPU_IE = 3
	g_CPU_color = "liberators"

elseif g_cpu_player_race == "ork_race" then

	g_enemy_factionname = "$690013"
	g_CPU_HQ = "ork_hq"
	g_CPU_Engineer = "ork_squad_grot"
	g_CPU_IE = 4
	g_CPU_color = "default_4"
	
elseif g_cpu_player_race == "space_marine_race" then

	g_enemy_factionname = "$690010"
	g_CPU_HQ = "space_marine_hq"
	g_CPU_Engineer = "space_marine_squad_servitor"
	g_CPU_IE = 5
	g_CPU_color = "default_0"
	
elseif g_cpu_player_race == "tau_race" then
	
	g_enemy_factionname = "$690015"
	g_CPU_HQ = "tau_hq"
	g_CPU_Engineer = "tau_builder_squad"
	g_CPU_IE = 6
	g_CPU_color = "default_0"
	
elseif g_cpu_player_race == "necron_race" then

	g_enemy_factionname = "$690016"
	g_CPU_HQ = "monolith"
	g_CPU_Engineer = "necron_builder_scarab_squad"
	g_CPU_IE = 7
	g_CPU_color = "default_0"

end

--[[End Darwin's attacker/defender algorhythm]]
----------------------------------------------------------------------------



g_Player2 = Setup_Player(1, g_enemy_factionname, g_cpu_player_race, 2)
Misc_PlayerTeamColor(g_Player2, g_CPU_color)

g_Player3 = Setup_Player(2, g_enemy_factionname, g_cpu_player_race, 2)
Misc_PlayerTeamColor(g_Player3, g_CPU_color)

g_Player4 = Setup_Player(3, g_enemy_factionname, g_cpu_player_race, 2)
Misc_PlayerTeamColor(g_Player4, g_CPU_color)

-- neutral team used for scientists
g_Player6 = Setup_Player(5,"$3100100", "npc_race", TEAM_NEUTRAL)
Misc_PlayerTeamColor(g_Player6,"default_7")


--[[ define the "enemy" who will win if the player 'loses' ]]
g_enemy = g_Player2

end

function OnInit() --comment this back in to view the beginning of the SM campaign outro. -- Util_StartNIS( EVENTS.NIS_SM_Campaign_Outro1 ) Rule_Add(Scavenger_Hunt)

end

--[[ the Scar_AddInit(OnInit) function is mandatory! This registers your init function with scar. ]] Scar_AddInit(OnInit)

function Scavenger_Hunt()

Rule_AddInterval(Rule_Timer, 1)

Rule_Add(Rule_Create_Player_Buildings)
Rule_AddOneShot(Rule_Create_Player_Units,1)
Rule_AddOneShot(Rule_Create_NPC_Buildings,1)
Rule_AddOneShot(Rule_Create_Enemy_Bonus_Squads,1)

Rule_AddOneShot(Rule_PresetAI, 1)

Rule_AddOneShot(Rule_Create_Engineers,1)

-- add scientists to the map
Rule_AddOneShot(Rule_Create_Scientists, 2)


Rule_AddOneShot(Rule_Add_Objective, 5)

-- show counter of captured scientists
UI_ShowCount("Scientist_Counter_P2", g_Player2, 3100151, g_P2_Scientist_Count)
UI_ShowCount("Scientist_Counter_P1", g_Player1, 3100150, g_P1_Scientist_Count)

--UI_ShowCount("Scientist_Counter_P3", g_Player3, 3100152, g_P3_Scientist_Count)
--UI_ShowCount("Scientist_Counter_P4", g_Player4, 3100153, g_P4_Scientist_Count)


--make the scientists move around near their spawn point
--Rule_AddInterval(Rule_Scientist_Mover, 45)


Rule_AddIntervalDelay(Rule_EndGame_Win,5,10)
Rule_AddIntervalDelay(Rule_EndGame_Lose,5,10)
Rule_AddIntervalDelay(Rule_EndGame_Lose_ALT,5,10)


--[[ Music ]]
Rule_AddOneShot(Rule_Start_Music, 0)


Rule_Remove(Scavenger_Hunt)

end

function Rule_Add_Objective()

--establish objective
Objective_Scavenger_Hunt = { title_id = 3100001, short_desc_id = 3100002, help_tip_id = 3100001 }

Util_WXP_ObjectiveCreate(Objective_Scavenger_Hunt, true, g_Player1)

Objective_ShowScreen()
Flash_OtherButton("dlg_objectives", 0, false, true)

end

function Rule_Start_Music()

--set the music table based on the players race
if MetaMap_GetPlayerRaceName()  == "chaos_marine_race" then
	
	t_music = {	"MU_IG_STR_Chaos_perc_brass", "MU_IG_STR_Chaos", "MU_IG_STR_Chaos_perc", 
						"MU_IG_STR_Chaos_perc_str", "MU_IG_STR_Chaos_perc_voice"}
	
elseif MetaMap_GetPlayerRaceName()  == "eldar_race" then
	
	t_music = {	"MU_IG_STR_Eldar_perc_brass", "MU_IG_STR_Eldar", "MU_IG_STR_Eldar_perc", 
						"MU_IG_STR_Eldar_perc_str"}
	
elseif MetaMap_GetPlayerRaceName()  == "guard_race" then
	
	t_music = {	"MU_IG_STR_ImpGd_perc_brass", "MU_IG_STR_ImpGd", "MU_IG_STR_ImpGd_perc", 
						"MU_IG_STR_ImpGd_perc_str", "MU_IG_STR_ImpGd_perc_voice"}
	
elseif MetaMap_GetPlayerRaceName()  == "ork_race" then
	
	t_music = {	"MU_IG_STR_Ork_perc_brass", "MU_IG_STR_Ork", "MU_IG_STR_Ork_perc", 
						"MU_IG_STR_Ork_perc_str"}
	
elseif MetaMap_GetPlayerRaceName()  == "space_marine_race" then
	
	t_music = {	"MU_IG_STR_SpaceMarine_perc_brass", "MU_IG_STR_SpaceMarine", "MU_IG_STR_SpaceMarine_perc", 
						"MU_IG_STR_SpaceMarine_perc_str"}
	
elseif MetaMap_GetPlayerRaceName()  == "tau_race" then
	
	t_music = {	"MU_IG_STR_Tau_perc_brass", "MU_IG_STR_Tau", "MU_IG_STR_Tau_perc", 
						"MU_IG_STR_Tau_perc_str"}
	
elseif MetaMap_GetPlayerRaceName()  == "necron_race" then
	
	t_music = {	"MU_IG_STR_Necron_perc_brass", "MU_IG_STR_Necron", "MU_IG_STR_Necron_brass", 
						"MU_IG_STR_Necron_perc"}
	
end

Playlist_Manager( PC_Music, t_music, true, true , {2, 4})


--set ambient sounds
t_ambient = {"ambient_city"}

Playlist_Manager( PC_Ambient, t_ambient, true, true , {0, 15})

end

function Rule_Timer()

g_ticker =  g_ticker + 1

--delay on scientist captured IE
if g_IE_Delay > 0 then
	
	g_IE_Delay = g_IE_Delay - 1
	
end

if g_Capture_Delay > 0 then
	
	g_Capture_Delay = g_Capture_Delay - 1
	
end

--delay on enemy about to win IE
if g_enemy_near_win_delay > 0 then
	
	g_enemy_near_win_delay = g_enemy_near_win_delay - 1
	
end

--delay on new scientist arrival IE
if g_scientist_arrived_delay > 0 then
	
	g_scientist_arrived_delay = g_scientist_arrived_delay - 1
	
end

end

function Rule_Create_Player_Buildings()

t_Player_Buildings ={

chaos_name = {"eg_Player_HQ"},
chaos_building_blueprint = {"chaos_hq"},
chaos_marker_spawn = {"mkr_Player_HQ"},

eldar_name = {"eg_Player_HQ"},
eldar_building_blueprint = {"eldar_hq"},
eldar_marker_spawn ={"mkr_Player_HQ"}, 

guard_name = {"eg_Player_HQ"},
guard_building_blueprint = {"guard_hq"}, 
guard_marker_spawn ={"mkr_Player_HQ"},

ork_name = {"eg_Player_HQ"},
ork_building_blueprint = {"ork_hq"},
ork_marker_spawn ={"mkr_Player_HQ"},

marines_name = {"eg_Player_HQ"},
marines_building_blueprint = {"space_marine_hq"},
marines_marker_spawn ={"mkr_Player_HQ"},

tau_name = {"eg_Player_HQ"},
tau_building_blueprint = {"tau_hq"},
tau_marker_spawn= {"mkr_Player_HQ"},

necron_name ={"eg_Player_HQ"},
necron_building_blueprint = {"monolith"},
necron_marker_spawn = {"mkr_Player_HQ"},

}

if MetaMap_GetPlayerRaceName() == "chaos_marine_race" then
	
	for i = 1, table.getn(t_Player_Buildings.chaos_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.chaos_name[i], t_Player_Buildings.chaos_building_blueprint[i], t_Player_Buildings.chaos_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "eldar_race" then
	
	for i = 1, table.getn(t_Player_Buildings.eldar_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.eldar_name[i], t_Player_Buildings.eldar_building_blueprint[i], t_Player_Buildings.eldar_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "guard_race" then
	
	for i = 1, table.getn(t_Player_Buildings.guard_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.guard_name[i], t_Player_Buildings.guard_building_blueprint[i], t_Player_Buildings.guard_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "ork_race" then
	
	for i = 1, table.getn(t_Player_Buildings.ork_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.ork_name[i], t_Player_Buildings.ork_building_blueprint[i], t_Player_Buildings.ork_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "space_marine_race" then
	
	for i = 1, table.getn(t_Player_Buildings.marines_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.marines_name[i], t_Player_Buildings.marines_building_blueprint[i], t_Player_Buildings.marines_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "tau_race" then
	
	for i = 1, table.getn(t_Player_Buildings.tau_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.tau_name[i], t_Player_Buildings.tau_building_blueprint[i], t_Player_Buildings.tau_marker_spawn[i], 1)
	end
	
elseif MetaMap_GetPlayerRaceName() == "necron_race" then
	
	for i = 1, table.getn(t_Player_Buildings.necron_name) do
		Entity_CreateBuildingMarker(g_Player1, t_Player_Buildings.tau_name[i], t_Player_Buildings.necron_building_blueprint[i], t_Player_Buildings.necron_marker_spawn[i], 1)
	end
	
end


--establish variables to be used to incrementally create turrets and generators by concantenating the variables onto the markers as needed
-- generator markers start at 0
g_bonus_gen_counter = 0
-- turrer markers start at 6
g_bonus_turret_counter = 6

--determine race specific blueprints to be looked for when creating forward base
if MetaMap_GetPlayerRaceName() == "chaos_marine_race" then
	
	g_bonus_generator = "chaos_plasma_generator"
	g_bonus_turret = "chaos_turret_bolter"
	g_bonus_barracks = "chaos_temple"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "chaos_armoury"
	
elseif MetaMap_GetPlayerRaceName() == "eldar_race" then
	
	g_bonus_generator = "eldar_warp_generator"
	g_bonus_turret = "eldar_support_platform_scatterlaser"
	g_bonus_barracks = "eldar_aspect_portal"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "eldar_soul_shrine"
	
elseif MetaMap_GetPlayerRaceName() == "guard_race" then
	
	g_bonus_generator = "guard_plasma_generator"
	g_bonus_turret = "guard_turret_heavy_bolter"
	g_bonus_barracks = "guard_infantry"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "guard_tactica"
	
elseif MetaMap_GetPlayerRaceName() == "ork_race" then
	
	g_bonus_generator = "ork_generator"
	g_bonus_turret = "ork_waagh_banner"
	g_bonus_barracks = "ork_boy_hut"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "ork_pile_o_guns"
	
elseif MetaMap_GetPlayerRaceName() == "space_marine_race" then
	
	g_bonus_generator = "space_marine_generator"
	g_bonus_turret = "space_marine_turret_bolter"
	g_bonus_barracks = "space_marine_barracks"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "space_marine_armoury"
	
elseif MetaMap_GetPlayerRaceName() == "tau_race" then
	
	g_bonus_generator = "tau_plasma_generator"
	g_bonus_turret = 0  --tau have no turrets, so zero is simply a filler value to establish the variable instead of writting cutom checks for tau later.  0 will never be a value fed in by code, so it simply allows the algorithym to function in a standadrd manner for all races.
	g_bonus_barracks = "tau_barracks"
	g_bonus_barracks2 = "tau_kroot_nest"
	g_bonus_research = "tau_research_building"
	
elseif MetaMap_GetPlayerRaceName() == "necron_race" then
	
	g_bonus_generator = "necron_plasma_generator"
	g_bonus_turret = "necron_turret"
	g_bonus_barracks = "necron_summoning_core"
	g_bonus_barracks2 = 0 --value on used for tau kroot nest, dummy value for all other races, like the Tau turret.
	g_bonus_research = "necron_forbidden_archive"
	
end

--Add in any bonus buildings made availible if the player has purchased them via owning Hyperion peaks province


t_blueprintEntitybonus = {}
MetaMap_GetAttackingRaceStartingEntitiesList(t_blueprintEntitybonus)

for j = 1,table.getn(t_blueprintEntitybonus) do
	
	if t_blueprintEntitybonus[j] == g_bonus_generator then
		
		Entity_CreateBuildingMarker(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement"..g_bonus_gen_counter, 1)
		
		--increase by one, the next generator will then spawn at the correct marker after this one
		g_bonus_gen_counter = g_bonus_gen_counter + 1
		
	elseif t_blueprintEntitybonus[j] == g_bonus_turret then
		
		Entity_CreateBuildingMarker(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement"..g_bonus_turret_counter, 1)
		
		--increase by one, the next turret will then spawn at the correct marker after this one
		g_bonus_turret_counter = g_bonus_turret_counter + 1
		
	elseif t_blueprintEntitybonus[j] == g_bonus_barracks then
		
		--fixed marker spawn based on Phil's table.  Only one barracks is spawned, always at marker 10
		--Necron intentionally spawn a summoning core in place of a barracks due to the monolith doubling as their barracks.
		Entity_CreateBuildingMarker(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement10", 1)
		
	elseif t_blueprintEntitybonus[j] == g_bonus_research then
		
		--fixed marker spawn based on Phil's table.  Only one research building is spawned, always at marker 11
		Entity_CreateBuildingMarker(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement11", 1)
		
	elseif t_blueprintEntitybonus[j] == g_bonus_barracks2 then
		
		--This will only be used to spawn the kroot nest when the player is Tau, otherwise it will be passed over due to g_bonus_barracks2 being a dummy value.
		--fixed marker spawn based on Phil's table.  Only one kroot nest is spawned, always at marker 13
		Entity_CreateBuildingMarker(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement13", 1)
		
	end
	
end


Rule_Remove(Rule_Create_Player_Buildings)

end

function Rule_Create_Player_Units()

--setting up the bonus units for the player
t_blueprintbonus = {}
MetaMap_GetRaceStartingSquadsList(MetaMap_GetPlayerRaceName(), t_blueprintbonus)

for j = 1,  table.getn(t_blueprintbonus) do
		
	if j <= 7 then
			
			k = j
	else
	
		k = j - 7
	
	end
	
	Util_CreateSquadsAtMarker(g_Player1, "sg_Bonus"..j, t_blueprintbonus[j], "mkr_Bonus"..k, 1)
	
end

--setting up the upgrades for the commander
MetaMap_UpdatePlayerWargear(g_Player1)

end

function Rule_Create_Enemy_Bonus_Squads()

--setting up the bonus units for the player
t_cpu_blueprintbonus = {}
MetaMap_GetRaceStartingSquadsList(g_cpu_player_race, t_cpu_blueprintbonus)

for t = 1,  table.getn(t_cpu_blueprintbonus) do
		
	u = math.mod(t - 1, 6) + 1
	
	Util_CreateSquadsAtMarker(g_Player2, "sg_cpu_bonus"..t, t_cpu_blueprintbonus[t], "mkr_cpu_bonus"..u, 1)
	
	
end

end

function Rule_Create_NPC_Buildings()

Entity_CreateBuildingMarker(g_Player2, "eg_Player2_HQ", g_CPU_HQ, "mkr_NPC_player2", 1)
Entity_CreateBuildingMarker(g_Player3, "eg_Player3_HQ", g_CPU_HQ, "mkr_NPC_player3", 1)
Entity_CreateBuildingMarker(g_Player4, "eg_Player4_HQ", g_CPU_HQ, "mkr_NPC_player4", 1)

end

function Rule_Create_Engineers()

t_players = {--[[1]] g_Player1, --[[2]] g_Player2, --[[3]] g_Player3, --[[4]] g_Player4}

for i = 1,g_total_players_on_map do
	
	if i == 1 then
		
		Util_CreateSquadsAtMarker(t_players[i],"sg_engineer_P"..i, g_P1_Engineer, "mkr_engineer"..i, 1)
		
	else
		
		Util_CreateSquadsAtMarker(t_players[i],"sg_engineer_P"..i, g_CPU_Engineer, "mkr_engineer"..i, 1)
		
	end
	
end

end

function Rule_PresetAI()

if g_total_enemy_count > 0 then
	
	--[[CPU player2]]
	Cpu_Enable(g_Player2, true)
	Cpu_EnableComponent(g_Player2, true, CT_Resourcing)
	Cpu_EnableComponent(g_Player2, true, CT_BuildBuildings)
	Cpu_EnableComponent(g_Player2, true, CT_BuildUnits)
	Cpu_EnableComponent(g_Player2, true, CT_BuildResearch)
	Cpu_EnableComponent(g_Player2, true, CT_BuildAddOns)
	Cpu_EnableComponent(g_Player2, true, CT_Tactics)
	
	--set difficulty based on kronus.map tabled values.
	Cpu_SetDifficulty(g_Player2, MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,0))
	--print(MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,0))
	
	
	if g_total_enemy_count > 1 then
		--[[CPU player3]]
		Cpu_Enable(g_Player3, true)	
		Cpu_EnableComponent(g_Player3, true, CT_Resourcing)
		Cpu_EnableComponent(g_Player3, true, CT_BuildBuildings)
		Cpu_EnableComponent(g_Player3, true, CT_BuildUnits)
		Cpu_EnableComponent(g_Player3, true, CT_BuildResearch)
		Cpu_EnableComponent(g_Player3, true, CT_BuildAddOns)
		Cpu_EnableComponent(g_Player3, true, CT_Tactics)
		
		--set difficulty based on kronus.map tabled values.
		Cpu_SetDifficulty(g_Player3, MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,1))
		--print(MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,1))
		
		
		if g_total_enemy_count > 2 then
			--[[CPU player4]]
			Cpu_Enable(g_Player4, true)
			Cpu_EnableComponent(g_Player4, true, CT_Resourcing)
			Cpu_EnableComponent(g_Player4, true, CT_BuildBuildings)
			Cpu_EnableComponent(g_Player4, true, CT_BuildUnits)
			Cpu_EnableComponent(g_Player4, true, CT_BuildResearch)
			Cpu_EnableComponent(g_Player4, true, CT_BuildAddOns)
			Cpu_EnableComponent(g_Player4, true, CT_Tactics)
			
			--set difficulty based on kronus.map tabled values.
			Cpu_SetDifficulty(g_Player4, MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,2))
			--print(MetaMap_GetTerritoryOpponentDifficulty(g_territory_index,2))
			
		end
		
	end
	
end

--disable the scientist team AI to prevent unexpected shenanigans!
Cpu_Enable(g_Player6, false)

end

function Rule_Get_All_Units()

--[[This will add all units belonging to eachplayer into one sgroup (per player).  these sgroups will be used for detecting scientists for each player.]]
for i = 1,g_total_players_on_map do
	
	SGroup_AddGroup(SGroup_CreateIfNotFound("sg_All_Units_P"..i), Player_GetSquads(t_players[i]))
	
end

--[[old

SGroup_CreateIfNotFound("sg_All_P1_Units")

SGroup_Clear("sg_All_P1_Units")

SGroup_AddGroup("sg_All_P1_Units", Player_GetSquads(g_Player1))

g_P1_squad_count = SGroup_Count(Player_GetSquads(g_Player1))

--this routine will analyze all the players units and add all non-scientists to an Sgroup.  
--This Sgroup is used to determine player unit proximity to the scientists for acquiring and relinquishing control of the scientists.
if g_P1_squad_count > 0 then
	
	local countsquad = SGroup_CountSpawned("sg_All_P1_Units")
	
	for i = 1, countsquad do
		
		SGroup_Clear(SGroup_CreateIfNotFound("sg_Potential_Add"))
		SGroup_Add(SGroup_FromName("sg_Potential_Add"), SGroup_GetSpawnedSquadAt("sg_All_P1_Units", i))
		
		local blueprinttable = Util_MakeBlueprintTable("guard_squad_civilian_male_a")
		
		if SGroup_ContainsBlueprints(SGroup_FromName("sg_Potential_Add"), blueprinttable, true) == false then
			
			SGroup_AddGroup(SGroup_CreateIfNotFound("sg_Player_Units_no_Scientists"), "sg_Potential_Add")
			
		end
		
	end
	
end

]]

end

function Rule_Create_Scientists()

for i = 1,10 do
	
	Util_CreateSquadsAtMarker(g_Player6, "sg_Scavenger"..i, "space_marine_squad_servitor_sp", "Scavenger_Spawn"..i, 1)
	
	SGroup_AddGroup(SGroup_CreateIfNotFound("sg_Scavenger_Parent"), "sg_Scavenger"..i)
	
	SGroup_SetHealthInvulnerable("sg_Scavenger"..i, true)
	Cpu_LockSGroupAcrossPlayers("sg_Scavenger"..i)
	
	Cmd_SetStance("sg_Scavenger"..i, STANCE_StandGround)
	
end

Rule_AddInterval(Rule_Get_All_Units, 1)
Rule_AddIntervalDelay(Rule_Check_Scientist_Prox, 1,5)

Rule_AddIntervalDelay(Rule_Scientist_Math, 1, 10)

end

function Rule_Scientist_Mover()

for i = 1,10 do
	
	if Prox_AllSquadsNearMarker("sg_Scavenger"..i, "Scavenger_Spawn"..i) then
		
		Util_AttackMoveMarkerRandomRadius("sg_Scavenger"..i, "Scavenger_Spawn"..i)
		
	end
	
end

end

t_scientist_totals = { g_count_scientist1, g_count_scientist2, g_count_scientist3, g_count_scientist4, g_count_scientist5, g_count_scientist6, g_count_scientist7, g_count_scientist8, g_count_scientist9, g_count_scientist10}

-- if scientists are in range of any of the players squads, their status flag will toggle to true, otherwise it will toggle to false function Rule_Check_Scientist_Prox()

--positions of each scientist, updated each pass of the rule.
t_scientist = {	pos = {g_sci_pos1,
									g_sci_pos2,
									g_sci_pos3,
									g_sci_pos4,
									g_sci_pos5,
									g_sci_pos6,
									g_sci_pos7,
									g_sci_pos8,
									g_sci_pos9,
									g_sci_pos10},
						
						mkr = { 	"mkr_Player_HQ",
										"mkr_NPC_player2",
										"mkr_NPC_player3",
										"mkr_NPC_player4"}
}

--apply current positions of scientists.
for a = 1,10 do
	
	t_scientist.pos[a] = SGroup_GetPosition("sg_Scavenger"..a)
	
end

-- iterate for each player
for i = 1,g_total_players_on_map do
	
	--iterate for each scientist
	for k = 1,10 do
		
		SGroup_CreateIfNotFound("sg_sci_cap_P"..i)
		
		SGroup_Clear("sg_sci_cap_P"..i)
		
		--if the player doesn't own the scientist being checked, then proceed with the detection
		if not (t_scientist_totals[k] == i) then
			
			Player_GetAllSquadsNearPos(t_players[i], "sg_sci_cap_P"..i, t_scientist.pos[k], 15)
			
			if SGroup_Count("sg_sci_cap_P"..i) > 0 then
				
				if g_Capture_Delay == 0 then
					
					--move to player ones marker (player has different marker name than NPCs)
					Cmd_MoveToMarker("sg_Scavenger"..k, t_scientist.mkr[i])
					
					t_scientist_totals[k] = i
					
					if i == 1 then	
						
						g_temp_race = g_P1_IE
						
						if Rule_Exists(Rule_IE_Scientist_Found_By_Player) == false then
							
							Rule_AddOneShot(Rule_IE_Scientist_Found_By_Player, 0.5)
							
						end
						
					else
						
						g_temp_race = g_CPU_IE
						
						if Rule_Exists(Rule_IE_Scientist_Found_By_Enemy) == false then
							
							Rule_AddOneShot(Rule_IE_Scientist_Found_By_Enemy, 0.5)
							
						end
						
					end
					
					g_temp_pos = t_scientist.pos[k]
					
					g_Capture_Delay = 3	
					
				end
				
			end
			
		--re-issue move order to HQ if the scientist has somehow been taken out of range of the HQ (i.e. - area effect blast), or has gotten path blocked and stopped in the field.
		elseif t_scientist_totals[k] == i then
			
			if Prox_MarkerSGroup(t_scientist.mkr[i], "sg_Scavenger"..k, PROX_SHORTEST) > 15 then
				
				Cmd_MoveToMarker("sg_Scavenger"..k, t_scientist.mkr[i])
				
			end
			
		end
		
	end
	
end

end

t_player_totals = { score = { g_P1_Scientist_Count, g_P2_Scientist_Count, g_P3_Scientist_Count, g_P4_Scientist_Count},

							win = { 	g_P1_Win_Count,
											g_P2_Win_Count,
											g_P3_Win_Count,
											g_P4_Win_Count},
											
						position = {	g_pos_P1,
											g_pos_P2,
											g_pos_P3,
											g_pos_P4},
							
					UI_range = {	3100150,
											3100151,
											3100152,
											3100153}

}

function Rule_Scientist_Math()

--ensure the tabled values are initialized
if g_Scientist_Math_firstrun == false then
	
	t_player_totals.score[1] = 0
	t_player_totals.score[2] = 0
	t_player_totals.score[3] = 0
	t_player_totals.score[4] = 0
	
	g_Scientist_Math_firstrun = true
	
end

if t_player_totals.position[1] == nil then
	
	t_player_totals.position[1] = Marker_GetPosition(Marker_FromName("mkr_Player_HQ", "basic_marker"))
	t_player_totals.position[2] = Marker_GetPosition(Marker_FromName("mkr_NPC_player2", "basic_marker"))
	t_player_totals.position[3] = Marker_GetPosition(Marker_FromName("mkr_NPC_player3", "basic_marker"))
	t_player_totals.position[4] = Marker_GetPosition(Marker_FromName("mkr_NPC_player4", "basic_marker"))
	
end

-- iterate for each player
for i = 1,g_total_players_on_map do
	
	--clear out the temp values for the next iterations use
	--g_temp_score = 0
	g_temp_win = 0
	
	--clear out SG to make sure if the player has lost all scientists, the count is reflective
	SGroup_Clear(SGroup_CreateIfNotFound("sg_Scientists_P"..i))
	
	--create SG's for all scientists near each player HQ.  These SG's will be used for a count value to determine win condition eligibilty.
	Player_GetAllSquadsNearPos(g_Player6, "sg_Scientists_P"..i, t_player_totals.position[i], 15)
	
	g_temp_win = SGroup_Count("sg_Scientists_P"..i)		
	
	--play the scientist arrived at player HQ IE if the new score is greater than the old score (thus indicating that a new scientist had arrived at the player HQ)
	if i == 1 and g_temp_win > t_player_totals.score[i] and g_scientist_arrived_delay == 0 and g_temp_win < 6 then
		
		if g_player_race == "chaos_marine_race" then
			
			Util_StartIntel(EVENTS.IE_Chaos_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "eldar_race" then
			
			Util_StartIntel(EVENTS.IE_Eldar_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "guard_race" then
			
			Util_StartIntel(EVENTS.IE_IG_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "ork_race" then
			
			Util_StartIntel(EVENTS.IE_Ork_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "space_marine_race" then
			
			Util_StartIntel(EVENTS.IE_SM_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "tau_race" then
			
			Util_StartIntel(EVENTS.IE_Tau_Servitor_Arrives_At_Players_Base)
			
		elseif g_player_race == "necron_race" then
			
			Util_StartIntel(EVENTS.IE_Necron_Servitor_Arrives_At_Players_Base)
			
		end
		
		g_scientist_arrived_delay = 10
		
	end
	
	-- re-assign the new player totals.
	--t_player_totals.score[i] = g_temp_score
	t_player_totals.score[i] = g_temp_win
	t_player_totals.win[i] = g_temp_win
	
	if i == 1 then
		
		-- update counter for player 1
		UI_ShowCountUpdateDxp("Scientist_Counter_P"..i, t_player_totals.score[i], t_player_totals.UI_range[i])
		
	else
		
		g_total_enemy_score = t_player_totals.score[2] + t_player_totals.score[3] + t_player_totals.score[4]
		
		UI_ShowCountUpdateDxp("Scientist_Counter_P2", g_total_enemy_score, t_player_totals.UI_range[2])
		
		--run Enemy about to win IE if the AI is ine away from winning.
		if g_total_enemy_score == 5 and g_enemy_near_win_delay == 0 then
			
			if g_player_race == "chaos_marine_race" then
				
				Util_StartIntel(EVENTS.IE_Chaos_Enemy_About_To_Win)
				
			elseif g_player_race == "eldar_race" then
				
				Util_StartIntel(EVENTS.IE_Eldar_Enemy_About_To_Win)
				
			elseif g_player_race == "guard_race" then
				
				Util_StartIntel(EVENTS.IE_IG_Enemy_About_To_Win)
				
			elseif g_player_race == "ork_race" then
				
				Util_StartIntel(EVENTS.IE_Ork_Enemy_About_To_Win)
				
			elseif g_player_race == "space_marine_race" then
				
				Util_StartIntel(EVENTS.IE_SM_Enemy_About_To_Win)
				
			elseif g_player_race == "tau_race" then
				
				Util_StartIntel(EVENTS.IE_Tau_Enemy_About_To_Win)
				
			elseif g_player_race == "necron_race" then
				
				Util_StartIntel(EVENTS.IE_Necron_Enemy_About_To_Win)
				
			end
			
			--add 5 minute delay before the IE will repeat.
			g_enemy_near_win_delay = 300
			
		end
		
	end
	
end

end

function Rule_IE_Scientist_Found_By_Player()

if g_IE_Delay == 0 then
	
	if g_player_race == "chaos_marine_race" then
		
		Util_StartIntel(EVENTS.IE_Chaos_Found_By_Player)
		
	elseif g_player_race == "eldar_race" then
		
		Util_StartIntel(EVENTS.IE_Eldar_Found_By_Player)
		
	elseif g_player_race == "guard_race" then
		
		Util_StartIntel(EVENTS.IE_IG_Found_By_Player)
		
	elseif g_player_race == "ork_race" then
		
		Util_StartIntel(EVENTS.IE_Ork_Found_By_Player)
		
	elseif g_player_race == "space_marine_race" then
		
		Util_StartIntel(EVENTS.IE_SM_Found_By_Player)
		
	elseif g_player_race == "tau_race" then
		
		Util_StartIntel(EVENTS.IE_Tau_Found_By_Player)
		
	elseif g_player_race == "necron_race" then
		
		Util_StartIntel(EVENTS.IE_Necron_Found_By_Player)
		
	end
	
	g_IE_Delay = 30
	
end

Ping_Position(g_temp_pos, false, default)

end

function Rule_IE_Scientist_Found_By_Enemy()

if g_IE_Delay == 0 then
	
	if g_player_race == "chaos_marine_race" then
		
		Util_StartIntel(EVENTS.IE_Chaos_Found_By_Enemy)
		
	elseif g_player_race == "eldar_race" then
		
		Util_StartIntel(EVENTS.IE_Eldar_Found_By_Enemy)
		
	elseif g_player_race == "guard_race" then
		
		Util_StartIntel(EVENTS.IE_IG_Found_By_Enemy)
		
	elseif g_player_race == "ork_race" then
		
		Util_StartIntel(EVENTS.IE_Ork_Found_By_Enemy)
		
	elseif g_player_race == "space_marine_race" then
		
		Util_StartIntel(EVENTS.IE_SM_Found_By_Enemy)
		
	elseif g_player_race == "tau_race" then
		
		Util_StartIntel(EVENTS.IE_Tau_Found_By_Enemy)
		
	elseif g_player_race == "necron_race" then
		
		Util_StartIntel(EVENTS.IE_Necron_Found_By_Enemy)
		
	end
	
	g_IE_Delay = 30
	
end

Ping_Position(g_temp_pos, false, default)

end

function Rule_IE_Win()

if g_player_race == "chaos_marine_race" then
	
	Util_StartIntel(EVENTS.IE_Chaos_Mission_Success)
	
elseif g_player_race == "eldar_race" then
	
	Util_StartIntel(EVENTS.IE_Eldar_Mission_Success)
	
elseif g_player_race == "guard_race" then
	
	Util_StartIntel(EVENTS.IE_IG_Mission_Success)
	
elseif g_player_race == "ork_race" then
	
	Util_StartIntel(EVENTS.IE_Ork_Mission_Success)
	
elseif g_player_race == "space_marine_race" then
	
	Util_StartIntel(EVENTS.IE_SM_Mission_Success)
	
elseif g_player_race == "tau_race" then
	
	Util_StartIntel(EVENTS.IE_Tau_Mission_Success)
	
elseif g_player_race == "necron_race" then
	
	Util_StartIntel(EVENTS.IE_Necron_Mission_Success)
	
end

Rule_Remove(Rule_IE_Win)

end

function Rule_IE_Lose()

if g_cpu_player_race == "chaos_marine_race" then
	
	Util_StartIntel(EVENTS.IE_Chaos_Mission_Success)
	
elseif g_cpu_player_race == "eldar_race" then
	
	Util_StartIntel(EVENTS.IE_Eldar_Mission_Success)
	
elseif g_cpu_player_race == "guard_race" then
	
	Util_StartIntel(EVENTS.IE_IG_Mission_Success)
	
elseif g_cpu_player_race == "ork_race" then
	
	Util_StartIntel(EVENTS.IE_Ork_Mission_Success)
	
elseif g_cpu_player_race == "space_marine_race" then
	
	Util_StartIntel(EVENTS.IE_SM_Mission_Success)
	
elseif g_cpu_player_race == "tau_race" then
	
	Util_StartIntel(EVENTS.IE_Tau_Mission_Success)
	
elseif g_cpu_player_race == "necron_race" then
	
	Util_StartIntel(EVENTS.IE_Necron_Mission_Success)
	
end

end

function Rule_EndGame_Win()

if t_player_totals.win[1] >= 6 then
	
	Util_ObjectiveComplete(Objective_Scavenger_Hunt.title_id)
	
	g_temp_race = g_P1_IE
	
	Rule_AddOneShot(Rule_IE_Win, 0.5)
	
	World_SetTeamWin( g_Player1, "" )
	Rule_AddIntervalEx( Rule_GameOver,10,1)
	
	Rule_Remove(Rule_EndGame_Win)
	Rule_Remove(Rule_EndGame_Lose)
	Rule_Remove(Rule_EndGame_Lose_ALT)
	
end

end

function Rule_EndGame_Lose()

if g_total_enemy_score >= 6 then
	
	g_temp_race = g_CPU_IE
	
	Rule_AddOneShot(Rule_IE_Lose, 0.5)
	
	Fade_Start(4, false)
	World_SetTeamWin( g_enemy, "" )
	Rule_AddIntervalEx( Rule_GameOver,10,1 )
	
	Rule_Remove(Rule_EndGame_Win)
	Rule_Remove(Rule_EndGame_Lose)
	Rule_Remove(Rule_EndGame_Lose_ALT)
	
end

end

function Rule_EndGame_Lose_ALT()

print("ALT_Lose_GO!")

g_building_exceptions = 
{
	--guard buildings
	"guard_thermo_plasma",
	"guard_plasma_generator",
	"guard_turret_heavy_bolter",
	"guard_mines",
	
	--chaos buildings
	"chaos_thermo_plasma_generator",
	"chaos_plasma_generator",
	"chaos_turret_bolter",
	"chaos_mine_field",
	
	--eldar buildings
	"eldar_advanced_warp_generator",
	"eldar_warp_generator",
	"eldar_support_platform_scatterlaser",
	"eldar_mine_field",
	
	--necron buildings
	"necron_thermoplasma_generator",
	"necron_plasma_generator",
	"necron_turret",
	
	--ork buildings
	"ork_bigger_generator",
	"ork_generator",
	"ork_waagh_banner",
	"ork_mine_field",
	
	--space marines
	"space_marine_thermo_generator",
	"space_marine_generator",
	"space_marine_turret_bolter",
	"space_marine_mine_field",
	
	--tau buildings
	"tau_thermoplasma_generator",
	"tau_plasma_generator"
}

g_unit_exceptions = 
{

}

--[[ Lose because of Annihilation ]]	
if Player_HasBuildingsExcept(g_Player1, g_building_exceptions) == false then
	
	Rule_RemoveAll()
	Fade_Start(4, false)
	World_SetTeamWin( g_enemy, "" )
	Rule_AddIntervalEx( Rule_GameOver,5,1 )
	
end

end

--[[ call this with an interval to ensure the mission ends ]] function Rule_GameOver() World_SetGameOver() end