-- IMPORTS -- import("ScarUtil.scar") : has most of the scar function -- import("WXPScarUtil.scar") : more scar functions from DC and/or WA (I honestly not sure)
import("ScarUtil.scar") import("WXPScarUtil.scar")
--addon_dark_eldar_list_post_dark_lance
-- ONGAMESETUP -- OnGameSetup() : Mandatory Function that sets up the mission & sets up the players that are in the mission (Including AI Players). -- This function is run first and starts the entire mission and than starts OnInit( ) -- Also has list of the Global varibles defined in it ( g_ ) -- OnGameRestore() : Mandatory Function called after loading a saved game.
function OnGameSetup() -- Global varibles
-- Place to store the player Race, so I dont have to keep calling the functions to get them
-- chaos_marine_race, dark_eldar_race, eldar_race, guard_race, necron_race, ork_race, space_marine_race, sisters_race, tau_race
g_raceName = "default_race"
-- What Race based intel event to use
g_intelEvent_raceId = 0
-- Place to store the player Faction (Example: "Blood Ravens")
g_factionName = "default_factionName"
-- Place to store the Color Scheme being used for player race (Example: "default_1")
g_colorScheme = "default_colorScheme"
-- Place to stores the Type of HQ based on each players race (Example: "chaos_hq")
g_HQ_blueprint = " "
-- Place to stores the Type of Builder used based on each players race (Example: "chaos_squad_slave")
g_Builder_blueprint = " "
-- Tier to determine difficulty level of mission based on stronghold strength
-- 1 = low, 2 = medium, 3 = high
g_strongholdStrengthTier = 0
-- Forward Base Code:
-- generator markers start at 0
g_bonus_gen_counter = 0
-- turrer markers start at 6
g_bonus_turret_counter = 6
-- Handles Highlightlighting of Objectives
g_PrimaryObjectives = -1
g_SecondaryObjectives = -1
------------------------------------------BALANCE VARIBLES----------------------------------
--------------------- Starting Resources ----------------------------------------
-- Amount of Initial Resource to give each of the AI Players
g_amountRequisitionToGiveAI = 15000
g_amountPowerToGiveAI = 10000
-- Initial Amount of Extra Resources to Give Player (Non Necron Races)
g_amountRequisitionToGivePlayer = 500
g_amountPowerToGivePlayer = 500
-- Initial Amount of Extra Power Resource to Give to Necron Player
g_amountPowerToGiveNecron = 500
-- How Much Resources to Give the Player for each cage they save
g_amountRequisitionToGivePlayer_PerCage = 300
g_amountPowerToGivePlayer_PerCage = 100
-- How Much Resources to Give the Necron Player for each cage they save
g_amountPowerToGiveNecron_PerCage = 300
-- Time a base takes to produce units once it goes active
-- Once a unit produces, it will attack
-- Initial Areas:
g_timer_centerBase = 60
g_timer_prisonerCage = 30
-- First Tier Activation:
g_timer_eastBase = 180
g_timer_westBase = 180
g_timer_vectBase = 180
-- Second Tier Activation
g_timer_mainBase = 540
g_timer_southEastBase = 360
-- Third Tier Activation:
g_timer_northBase = 540
g_timer_northWestBase = 540
g_timer_southWestBase = 360
-- Time between Vect Attacks (Will Only Attack if 100% Health, Else Wait till next time)
g_timer_vectAttack = 540
-- What Percent of His life does Vect Retreat at (subtracts 0.10 before begininng checks)
g_vect_retreat_damage = 1.05
--Time From Player Construction of HQ until Enemy Techs to Next Tier
g_time_Tier_Two = 600
g_time_Tier_Three = 1200
g_units_produced = 0
---------------------------------------------END BALANCE VARIBLES------------------------------
-- Tracks if a Base has activated & thus can produce troops
g_base_activated_Center = false
g_base_activated_East = false
g_base_activated_Main = false
g_base_activated_North = false
g_base_activated_NorthWest = false
g_base_activated_SouthEast = false
g_base_activated_SouthWest = false
g_base_activated_West = false
g_base_activated_Vect = false
-- Can the Dark Eldar Use Soul Power yet
g_soulPower_enabled_Corrosion = false
g_soulPower_enabled_SoulStorm = false
g_soulPower_enabled_ScreamofDammed = false
g_soulPower_enabled_PiercingVision = false
g_patrol_activated_Center = true
g_patrol_activated_North = true
g_patrol_activated_SouthWest = false
g_skimmerShop10_activated = false
g_hallOfBlood10_activated = false
g_hallOfBlood14_activated = false
g_hallOfBlood15_activated = false
-- Which Troops are Active to Support Vect
g_vectSupport_warpBeast = false
g_vectSupport_ravager = false
-- Tracks if a Prisoner Cage Base has been activated (or a scripted attack has fired)
g_firstTroops_sent = false
g_prisonerCage3_activated = false
g_prisonerCage4_activated = false
g_prisonerCage6_activated = false
g_prisonerCage10_activated = false
-- Counts have many prisoners have been freed
g_prisonerCage_numFreed = 0
-- What Percentage of the Squad do troops reinforce up to...
g_reinforce_percent = 0.70
-- Can Squads Retreat?
g_retreating_enabled = true
-- How many Incubi can the Archon Have (used to track the researches
g_number_incubi = 2
-- Can Squad Capture?
g_canCaptureStrat = true
g_canCaptureRelic = true
g_canCaptureCrit = false -- there are none!
-- Check for Basic Strategic Point, Relic, Critical Point
g_blueprintRelic = Util_MakeBlueprintTable("relic_struct")
g_blueprintCritPoint = Util_MakeBlueprintTable("strategic_objective_struct")
g_blueprintStratPoint = Util_MakeBlueprintTable("strategic_point_flag")
-- Squad AI Stuff:
g_squad_attacking = 0
g_squad_retreating = 1 -- also covers normal moving (non-attack move)
g_squad_reinforcing = 2
g_squad_loading = 3
g_squad_usingSkill = 4
g_squad_produced = 5
g_squad_jump_prep = 6
g_squad_jump_ready = 7
g_squad_jump_attack = 8
g_squad_jump_checkjump = 9
g_squad_patrolling = 10
-- Squad Skills
-- hellions & scourge are only used as jump troops (& thus skills used differently)
g_skill_warriors = 1
g_skill_warpbeasts = 2
g_skill_haemonculus = 3
g_skill_raven = 4
g_skill_wych = 5
g_skill_talos = 6
g_skill_archon = 7
g_skill_slave = 8
g_skill_raider = 9
g_skill_raven_airDefense = 10
g_skill_mandrakes = 11
-- Jumping Skills
g_skill_eastBase_hellion_jump = 12
g_skill_westBase_scourge_jump = 13
g_skill_southEastBase_scourge_jump = 14
-- Troops
-- Cage Defense Troops
g_cageDefense_warrior_status = {0,0}
g_cageDefense_scourge_status = {0}
g_cageDefense_reaver_status = {0}
-- Center Base
g_centerBase_reaver_status = {0}
g_centerBase_mandrake_status = {0}
g_centerBase_scourge_status = {0}
-- East Base
g_eastBase_hellions_status = {0}
g_eastBase_warrior_status = {0}
g_eastBase_mandrake_status = {0}
-- Main Base
g_mainBase_raider_status = {0,0}
g_mainBase_ravager_status = {0,0}
g_mainBase_warrior_status = {0,0}
-- North Base
g_northBase_talos_status = {0,0}
g_northBase_raven_status = {0,0}
-- North West Base
g_northWestBase_haemonculus_status = {0}
g_northWestBase_wych_status = {0}
-- Patrol Squads:
g_centerBase_hellions_patrol_status = {0}
g_northBase_warpBeast_patrol_status = {0}
g_northBase_mandrake_patrol_status = {0}
g_southWestBase_warpbeast_patrol_status = {0}
-- Slave Squads for Random Repairing & Soul Harvesting
g_slave_status = {0,0,0,0}
-- South East Base
g_southEastBase_scourge_status = {0}
g_southEastBase_mandrakes_status = {0}
-- South West Base
g_southWestBase_wych_status = {0}
g_southWestBase_haemonculus_status = {0}
g_southWestBase_raven_status = {0}
g_southWestBase_reaver_status = {0,0}
g_southWestBase_talos_status = {0}
-- Vect Support
g_vectSupport_warrior_status = {0}
g_vectSupport_warpBeast_status = {0}
g_vectSupport_reaver_status = {0}
g_vectSupport_ravager_status = {0}
-- West Base
g_westBase_scourge_status = {0}
g_westBase_warrior_status = {0}
g_westBase_reaver_status = {0,0}
-- Vect Base:
g_vectBase_archon_status = {0}
g_vectBase_raven_status = {0,0}
---------------------------------------------RACE BASED INTEL EVENT ARRAYS---------------------
-- Track if IEs have played:
g_ie_FirstCage_Played = false
g_ie_FreeMostTroops_Played = false
g_ie_baseRevealed = false
-- Soul Cage Destroyed IEs:
g_ie_SoulCage_Destroyed = {false,false,false,false}
-- Race Based IE Array for Initial : Our troops are caged -- Free them
g_ie_Initial_Array = {
EVENTS.IE_Initial_Chaos,
EVENTS.IE_Initial_DarkEldar, -- should not be possible to get
EVENTS.IE_Initial_Eldar,
EVENTS.IE_Initial_Guard,
EVENTS.IE_Initial_Necron,
EVENTS.IE_Initial_Ork,
EVENTS.IE_Initial_Sisters,
EVENTS.IE_Initial_Space,
EVENTS.IE_Initial_Tau}
-- Race Based IE Array for FirstCage : Player frees first cage of troops
g_ie_FirstCage_Array = {
EVENTS.IE_FirstCage_Chaos,
EVENTS.IE_FirstCage_DarkEldar, -- should not be possible to get
EVENTS.IE_FirstCage_Eldar,
EVENTS.IE_FirstCage_Guard,
EVENTS.IE_FirstCage_Necron,
EVENTS.IE_FirstCage_Ork,
EVENTS.IE_FirstCage_Sisters,
EVENTS.IE_FirstCage_Space,
EVENTS.IE_FirstCage_Tau}
-- Race Based IE Array for EarlyDarkEldarCharge : Dark Eldar have spotted & are attacking us
g_ie_EarlyDarkEldarCharge_Array = {
EVENTS.IE_EarlyDarkEldarCharge_Chaos,
EVENTS.IE_EarlyDarkEldarCharge_DarkEldar, -- should not be possible to get
EVENTS.IE_EarlyDarkEldarCharge_Eldar,
EVENTS.IE_EarlyDarkEldarCharge_Guard,
EVENTS.IE_EarlyDarkEldarCharge_Necron,
EVENTS.IE_EarlyDarkEldarCharge_Ork,
EVENTS.IE_EarlyDarkEldarCharge_Sisters,
EVENTS.IE_EarlyDarkEldarCharge_Space,
EVENTS.IE_EarlyDarkEldarCharge_Tau}
-- Race Based IE Array for ShowTwoBases : Tell Player to avoid attacking the two large bases
g_ie_ShowTwoBases_Array = {
EVENTS.IE_ShowTwoBases_Chaos,
EVENTS.IE_ShowTwoBases_DarkEldar, -- should not be possible to get
EVENTS.IE_ShowTwoBases_Eldar,
EVENTS.IE_ShowTwoBases_Guard,
EVENTS.IE_ShowTwoBases_Necron,
EVENTS.IE_ShowTwoBases_Ork,
EVENTS.IE_ShowTwoBases_Sisters,
EVENTS.IE_ShowTwoBases_Space,
EVENTS.IE_ShowTwoBases_Tau}
-- Race Based IE Array for FreeMostTroops : Most of our troops are freed
g_ie_FreeMostTroops_Array = {
EVENTS.IE_FreeMostTroops_Chaos,
EVENTS.IE_FreeMostTroops_DarkEldar, -- should not be possible to get
EVENTS.IE_FreeMostTroops_Eldar,
EVENTS.IE_FreeMostTroops_Guard,
EVENTS.IE_FreeMostTroops_Necron,
EVENTS.IE_FreeMostTroops_Ork,
EVENTS.IE_FreeMostTroops_Sisters,
EVENTS.IE_FreeMostTroops_Space,
EVENTS.IE_FreeMostTroops_Tau}
-- Race Based IE Array for FreeBuilders : Builders Freed -- Tell Player to Build HQ
g_ie_FreeBuilders_Array = {
EVENTS.IE_FreeBuilders_Chaos,
EVENTS.IE_FreeBuilders_DarkEldar, -- should not be possible to get
EVENTS.IE_FreeBuilders_Eldar,
EVENTS.IE_FreeBuilders_Guard,
EVENTS.IE_FreeBuilders_Necron,
EVENTS.IE_FreeBuilders_Ork,
EVENTS.IE_FreeBuilders_Sisters,
EVENTS.IE_FreeBuilders_Space,
EVENTS.IE_FreeBuilders_Tau}
-- 3 Random Lines for when piercing vision power is used
g_ie_DetectCloakTaunt_Array = {
EVENTS.IE_DetectCloakTaunt_One,
EVENTS.IE_DetectCloakTaunt_Two,
EVENTS.IE_DetectCloakTaunt_Three}
-- 3 Random Lines for when non-piercing vision soul power is used
g_ie_PowerUseTaunt_Array = {
EVENTS.IE_PowerUseTaunt_One,
EVENTS.IE_PowerUseTaunt_Two,
EVENTS.IE_PowerUseTaunt_Three}
-- Race Based IE Array for VectFirstAttack : First Time Vect Attacks Player -- Vect Taunts, Player Responds
g_ie_VectFirstAttack_Array = {
EVENTS.IE_VectFirstAttack_Chaos,
EVENTS.IE_VectFirstAttack_DarkEldar, -- should not be possible to get
EVENTS.IE_VectFirstAttack_Eldar,
EVENTS.IE_VectFirstAttack_Guard,
EVENTS.IE_VectFirstAttack_Necron,
EVENTS.IE_VectFirstAttack_Ork,
EVENTS.IE_VectFirstAttack_Sisters,
EVENTS.IE_VectFirstAttack_Space,
EVENTS.IE_VectFirstAttack_Tau}
-- 3 Random Lines for when Vect Attacks Player
g_ie_VectRandomAttack_Array = {
EVENTS.IE_VectRandomAttack_One,
EVENTS.IE_VectRandomAttack_Two,
EVENTS.IE_VectRandomAttack_Three}
-- 4 Random Lines for when Vect Retreats
g_ie_VectRandomFlee_Array = {
EVENTS.IE_VectRandomFlee_One,
EVENTS.IE_VectRandomFlee_Two,
EVENTS.IE_VectRandomFlee_Three,
EVENTS.IE_VectRandomFlee_Four}
-----------------------------------------END RACE BASED INTEL EVENT ARRAYS---------------------
-- Get the player race & store for later access
g_raceName = MetaMap_GetPlayerNRaceName(0)
-- Create the Human Player
g_Player1 = Setup_Player(0, g_factionName, g_raceName, 1)
-- Sets up HQ, Builder, Faction Name, Color Scheme, Exception Lists, etc...
Rule_Player_Race_Dependant_Stuff()
-- NOW THAT HUMAN IS SET UP, NEED TO SET UP THE AI PLAYERS AND TEAMS
-- Dark Eldar AI Players
g_Player2 = Setup_Player (1, "$3950220", "dark_eldar_race", 2)
g_Player3 = Setup_Player (2, "$3950220", "dark_eldar_race", 2)
g_Player4 = Setup_Player (3, "$3950220", "dark_eldar_race", 2)
-- Set Dark Eldar Color Scheme
Misc_PlayerTeamColor(g_Player2, "default_1")
Misc_PlayerTeamColor(g_Player3, "default_1")
Misc_PlayerTeamColor(g_Player4, "default_1")
end
-- Used to redefine some varibles after loading a save game function OnGameRestore() ---------------------------------------------RACE BASED INTEL EVENT ARRAYS--------------------- -- Race Based IE Array for Initial : Our troops are caged -- Free them g_ie_Initial_Array = { EVENTS.IE_Initial_Chaos, EVENTS.IE_Initial_DarkEldar, -- should not be possible to get EVENTS.IE_Initial_Eldar, EVENTS.IE_Initial_Guard, EVENTS.IE_Initial_Necron, EVENTS.IE_Initial_Ork, EVENTS.IE_Initial_Sisters, EVENTS.IE_Initial_Space, EVENTS.IE_Initial_Tau}
-- Race Based IE Array for FirstCage : Player frees first cage of troops
g_ie_FirstCage_Array = {
EVENTS.IE_FirstCage_Chaos,
EVENTS.IE_FirstCage_DarkEldar, -- should not be possible to get
EVENTS.IE_FirstCage_Eldar,
EVENTS.IE_FirstCage_Guard,
EVENTS.IE_FirstCage_Necron,
EVENTS.IE_FirstCage_Ork,
EVENTS.IE_FirstCage_Sisters,
EVENTS.IE_FirstCage_Space,
EVENTS.IE_FirstCage_Tau}
-- Race Based IE Array for EarlyDarkEldarCharge : Dark Eldar have spotted & are attacking us
g_ie_EarlyDarkEldarCharge_Array = {
EVENTS.IE_EarlyDarkEldarCharge_Chaos,
EVENTS.IE_EarlyDarkEldarCharge_DarkEldar, -- should not be possible to get
EVENTS.IE_EarlyDarkEldarCharge_Eldar,
EVENTS.IE_EarlyDarkEldarCharge_Guard,
EVENTS.IE_EarlyDarkEldarCharge_Necron,
EVENTS.IE_EarlyDarkEldarCharge_Ork,
EVENTS.IE_EarlyDarkEldarCharge_Sisters,
EVENTS.IE_EarlyDarkEldarCharge_Space,
EVENTS.IE_EarlyDarkEldarCharge_Tau}
-- Race Based IE Array for ShowTwoBases : Tell Player to avoid attacking the two large bases
g_ie_ShowTwoBases_Array = {
EVENTS.IE_ShowTwoBases_Chaos,
EVENTS.IE_ShowTwoBases_DarkEldar, -- should not be possible to get
EVENTS.IE_ShowTwoBases_Eldar,
EVENTS.IE_ShowTwoBases_Guard,
EVENTS.IE_ShowTwoBases_Necron,
EVENTS.IE_ShowTwoBases_Ork,
EVENTS.IE_ShowTwoBases_Sisters,
EVENTS.IE_ShowTwoBases_Space,
EVENTS.IE_ShowTwoBases_Tau}
-- Race Based IE Array for FreeMostTroops : Most of our troops are freed
g_ie_FreeMostTroops_Array = {
EVENTS.IE_FreeMostTroops_Chaos,
EVENTS.IE_FreeMostTroops_DarkEldar, -- should not be possible to get
EVENTS.IE_FreeMostTroops_Eldar,
EVENTS.IE_FreeMostTroops_Guard,
EVENTS.IE_FreeMostTroops_Necron,
EVENTS.IE_FreeMostTroops_Ork,
EVENTS.IE_FreeMostTroops_Sisters,
EVENTS.IE_FreeMostTroops_Space,
EVENTS.IE_FreeMostTroops_Tau}
-- Race Based IE Array for FreeBuilders : Builders Freed -- Tell Player to Build HQ
g_ie_FreeBuilders_Array = {
EVENTS.IE_FreeBuilders_Chaos,
EVENTS.IE_FreeBuilders_DarkEldar, -- should not be possible to get
EVENTS.IE_FreeBuilders_Eldar,
EVENTS.IE_FreeBuilders_Guard,
EVENTS.IE_FreeBuilders_Necron,
EVENTS.IE_FreeBuilders_Ork,
EVENTS.IE_FreeBuilders_Sisters,
EVENTS.IE_FreeBuilders_Space,
EVENTS.IE_FreeBuilders_Tau}
-- 3 Random Lines for when piercing vision power is used
g_ie_DetectCloakTaunt_Array = {
EVENTS.IE_DetectCloakTaunt_One,
EVENTS.IE_DetectCloakTaunt_Two,
EVENTS.IE_DetectCloakTaunt_Three}
-- 3 Random Lines for when non-piercing vision soul power is used
g_ie_PowerUseTaunt_Array = {
EVENTS.IE_PowerUseTaunt_One,
EVENTS.IE_PowerUseTaunt_Two,
EVENTS.IE_PowerUseTaunt_Three}
-- Race Based IE Array for VectFirstAttack : First Time Vect Attacks Player -- Vect Taunts, Player Responds
g_ie_VectFirstAttack_Array = {
EVENTS.IE_VectFirstAttack_Chaos,
EVENTS.IE_VectFirstAttack_DarkEldar, -- should not be possible to get
EVENTS.IE_VectFirstAttack_Eldar,
EVENTS.IE_VectFirstAttack_Guard,
EVENTS.IE_VectFirstAttack_Necron,
EVENTS.IE_VectFirstAttack_Ork,
EVENTS.IE_VectFirstAttack_Sisters,
EVENTS.IE_VectFirstAttack_Space,
EVENTS.IE_VectFirstAttack_Tau}
-- 3 Random Lines for when Vect Attacks Player
g_ie_VectRandomAttack_Array = {
EVENTS.IE_VectRandomAttack_One,
EVENTS.IE_VectRandomAttack_Two,
EVENTS.IE_VectRandomAttack_Three}
-- 4 Random Lines for when Vect Retreats
g_ie_VectRandomFlee_Array = {
EVENTS.IE_VectRandomFlee_One,
EVENTS.IE_VectRandomFlee_Two,
EVENTS.IE_VectRandomFlee_Three,
EVENTS.IE_VectRandomFlee_Four}
-----------------------------------------END RACE BASED INTEL EVENT ARRAYS---------------------
end
-- END OF " GAME SETUP & RESTORE " RULES
-- INITALIZATION -- OnInit() : Mandatory Function that sets up the mission -- Called after OnGameSetup() : Not Sure if possible for something to come between the two of them -- Used for pregame functions, things that should happen before the player officially enters the world --Despawn Reserve Units, Set Groups and Start commands for persistent behaviors. -- Scar_AddInit(OnInit) : Mandatory Function that registers OnInit function with scar.
function OnInit() -- Set up stuff based on the difficulty level of the stronghold Rule_Stronghold_Difficulty_Strength_Stuff()
--Function Used to set the pregame state of the AI (basically disables all the AI)
Rule_PresetAI()
-- Function used to create all the Ai Controlled Buildings on the Map
Rule_Create_All_Ai_Initial_Buildings( )
-- Sets up & Plays the Opening NIS:
WXP_OpeningNISPreset( )
Util_StartNIS( EVENTS.NIS_Opening )
-- Rule_GameStart : Function used to Start the Actual Mission
Rule_Add( Rule_GameStart )
end
-- This registers your init function with scar. Scar_AddInit(OnInit)
-- END OF ALL "INITALIZATION" RULES
-- EXTRA INITIAL SETUP -- Rule_SetupMusicPlaylist() : Used to Setup the music & ambient soundtracks -- Rule_Stronghold_Difficulty_Strength_Stuff() : Used to Set up stuff based on the difficulty level of the stronghold (10-17) -- Rule_PresetAI() : Used to Disable AI Players (Done Before Initial NIS)
-- Used to Setup the music & ambient soundtracks function Rule_SetupMusicPlaylist() -- MUSIC TRACKS
-- clear the music playlist
Sound_PlaylistClear( PC_Music )
-- Add tracks to the playlist
Sound_PlaylistAddTrack( PC_Music, "MU_IG_STR_darkeldar_perc_str" )
Sound_PlaylistAddTrack( PC_Music, "MU_IG_STR_darkeldar" )
Sound_PlaylistAddTrack( PC_Music, "MU_IG_STR_darkeldar_perc" )
Sound_PlaylistAddTrack( PC_Music, "MU_IG_STR_darkeldar_perc_brass" )
-- Mark these tracks to play in order or random (True is in order)
Sound_PlaylistSetorder( PC_Music, true )
-- add silence between tracks in seconds (Randomly chooses time between the two numbers)
Sound_PlaylistSetSilence( PC_Music, 5, 10 )
--Silvey Polish 11/06/07: I had to add this to get the music to play after moving this function after the opening NIS.
Sound_SetVolumeModifierMusic(1.0)
Sound_PlaylistStart(PC_Music)
-- AMBIENT TRACKS
-- clear the ambient playlist
Sound_PlaylistClear( PC_Ambient )
--add tracks to the playlist
Sound_PlaylistAddTrack( PC_Ambient, "Ambience_ChaosCorruption1" )
Sound_PlaylistAddTrack( PC_Ambient, "Ambience_ChaosCorruption2" )
-- Mark these tracks to play in order or random (True is in order)
Sound_PlaylistSetorder( PC_Ambient, true )
-- add silence between tracks in seconds (Randomly chooses time between the two numbers)
Sound_PlaylistSetSilence( PC_Ambient, 5, 10 )
end
-- Used to Set up stuff based on the difficulty level of the stronghold (10-17) function Rule_Stronghold_Difficulty_Strength_Stuff() -- Get the strength of the stronghold from the MetaMap g_strongholdStrength = MetaMap_GetTerritoryMilitaryStrength(MetaMap_GetDefendingTerritoryIndex())
-- Set the difficulty tier based on stronghold strength: (10,11,12)
if g_strongholdStrength <= 12
then
g_strongholdStrengthTier = 1
-- Set the difficulty tier based on stronghold strength: (13,14,15)
elseif g_strongholdStrength <= 15
then
g_strongholdStrengthTier = 2
-- Set the difficulty tier based on stronghold strength: (16,17)
else
g_strongholdStrengthTier = 3
end
end
-- Used to Disable AI Players function Rule_PresetAI() Cpu_Enable(g_Player2, false) Cpu_Enable(g_Player3, false) Cpu_Enable(g_Player4, false) end
-- END OF ALL "EXTRA INITIAL SETUP" RULES
-- INITIAL PLAYER SETUP RULES -- Rule_Player_Race_Dependant_Stuff() : Handles setting everything in scenario that changes based on the player race -- Rule_Create_All_Player_Initial_Units() : Creates all the Players Initial Units on the Map (including Honor Guard) ( & give resources)
-- Handles setting everything in scenario that changes based on the player race function Rule_Player_Race_Dependant_Stuff() if g_raceName == "chaos_marine_race" then -- What Intel Events race is using g_intelEvent_raceId = 1
-- Faction name that Race is using
g_factionName = "$3950214"
-- Color Scheme that Race is using
g_colorScheme = "default_0"
-- HQ that Race uses
g_HQ_blueprint = "chaos_hq"
-- Builder that Race uses
g_Builder_blueprint = "chaos_squad_slave"
-- Air Unit for the Race:
g_AirUnit_blueprint = "chaos_squad_hell_talon"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "chaos_squad_horror_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "chaos_squad_cultist_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "chaos_squad_horror_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "chaos_squad_cultist_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "chaos_squad_khorne_berserker_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "chaos_marine_squad_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"chaos_thermo_plasma_generator",
"chaos_plasma_generator",
"chaos_turret_bolter",
"chaos_mine_field",
"chaos_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
-- Should not be possible to be this race on this map
elseif g_raceName == "dark_eldar_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 2
-- Faction name that Race is using
g_factionName = "$3950220"
-- Color Scheme that Race is using
g_colorScheme = "default_1"
-- HQ that Race uses
g_HQ_blueprint = "dark_eldar_hq"
-- Builder that Race uses
g_Builder_blueprint = "dark_eldar_squad_slave"
-- Air Unit for the Race:
g_AirUnit_blueprint = "dark_eldar_squad_raven"
-- NOT NEEDED SINCE IS DARK ELDAR LEVEL
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = " "
g_prisoner_blueprint_2 = " "
g_prisoner_blueprint_3 = " "
g_prisoner_blueprint_4 = " "
g_prisoner_blueprint_5 = " "
g_prisoner_blueprint_6 = " "
-- NOT NEEDED SINCE IS DARK ELDAR LEVEL
-- used for forward base ability
g_bonus_generator = "dark_eldar_plasma_generator"
g_bonus_turret = "dark_eldar_slave_caravel"
g_bonus_barracks = "dark_eldar_hall_of_blood"
g_bonus_barracks2 = "dark_eldar_skimmer_shop"
g_bonus_research = 0 -- Dark Eldar Research is their second tier, so makes no sense
-- Used for Defeat Checks
t_building_exceptions = {
"dark_eldar_plasma_generator",
"dark_eldar_thermo_plasma",
"dark_eldar_slave_caravel",
"dark_eldar_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "eldar_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 3
-- Faction name that Race is using
g_factionName = "$3950217"
-- Color Scheme that Race is using
g_colorScheme = "default_5"
-- HQ that Race uses
g_HQ_blueprint = "eldar_hq"
-- Builder that Race uses
g_Builder_blueprint = "eldar_squad_bonesinger"
-- Air Unit for the Race:
g_AirUnit_blueprint = "eldar_squad_nightwing"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "eldar_squad_dark_reapers_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "eldar_guardian_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "eldar_squad_fire_dragon_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "eldar_squad_dark_reapers_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "eldar_harlequin_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "eldar_squad_banshees_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"eldar_advanced_warp_generator",
"eldar_warp_generator",
"eldar_support_platform_scatterlaser",
"eldar_mine_field",
"eldar_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "guard_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 4
-- Faction name that Race is using
g_factionName = "$3950219"
-- Color Scheme that Race is using
g_colorScheme = "default_4"
-- HQ that Race uses
g_HQ_blueprint = "guard_hq"
-- Builder that Race uses
g_Builder_blueprint = "guard_squad_enginseer"
-- Air Unit for the Race:
g_AirUnit_blueprint = "guard_squad_marauder"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "guard_squad_kasrkin_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "guard_squad_guardsmen_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "guard_squad_priest_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "guard_squad_guardsmen_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "guard_squad_ogryns_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "guard_squad_guardsmen_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"guard_thermo_plasma",
"guard_plasma_generator",
"guard_turret_heavy_bolter",
"guard_mines",
"guard_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "necron_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 5
-- Faction name that Race is using
g_factionName = "$3950223"
-- Color Scheme that Race is using
g_colorScheme = "default_0"
-- HQ that Race uses
g_HQ_blueprint = "monolith"
-- Builder that Race uses
g_Builder_blueprint = "necron_builder_scarab_squad"
-- Air Unit for the Race:
g_AirUnit_blueprint = "necron_scarab_squad"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "necron_immortal_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "necron_basic_warrior_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "necron_pariah_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "necron_basic_warrior_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "necron_wraith_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "necron_basic_warrior_squad_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"necron_thermoplasma_generator",
"necron_plasma_generator",
"necron_turret",
"necron_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "ork_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 6
-- Faction name that Race is using
g_factionName = "$3950215"
-- Color Scheme that Race is using
g_colorScheme = "default_3"
-- HQ that Race uses
g_HQ_blueprint = "ork_hq"
-- Builder that Race uses
g_Builder_blueprint = "ork_squad_grot"
-- Air Unit for the Race:
g_AirUnit_blueprint = "ork_squad_fighta_bomba"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "ork_squad_tankbusta_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "ork_squad_shoota_boy_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "ork_squad_nob_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "ork_squad_slugga_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "ork_squad_tankbusta_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "ork_squad_slugga_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"ork_bigger_generator",
"ork_generator",
"ork_waagh_banner",
"ork_mine_field",
"ork_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "sisters_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 7
-- Faction name that Race is using
g_factionName = "$3900048"
-- Color Scheme that Race is using
g_colorScheme = "default_2"
-- HQ that Race uses
g_HQ_blueprint = "sisters_hq"
-- Builder that Race uses
g_Builder_blueprint = "sisters_squad_servitor"
-- Air Unit for the Race:
g_AirUnit_blueprint = "sisters_squad_lightning"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "sisters_squad_battle_sister_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "sisters_squad_missionary_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "sisters_squad_celestian_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "sisters_squad_missionary_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "sisters_squad_repentia_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "sisters_squad_battle_sister_sp_dxp3_prisoner"
-- used for forward base ability
g_bonus_generator = "sisters_plasma_generator"
g_bonus_turret = "sisters_turret_flamer"
g_bonus_barracks = "sisters_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 = "sisters_sanctuary"
-- Used for Defeat Checks
t_building_exceptions = {
"sisters_plasma_generator",
"sisters_thermo_plasma",
"sisters_turret_flamer",
"sisters_mines",
"sisters_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "space_marine_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 8
-- Faction name that Race is using
g_factionName = "$3950213"
-- Color Scheme that Race is using
g_colorScheme = "default_0"
-- HQ that Race uses
g_HQ_blueprint = "space_marine_hq"
-- Builder that Race uses
g_Builder_blueprint = "space_marine_squad_servitor"
-- Air Unit for the Race:
g_AirUnit_blueprint = "space_marine_squad_tempest"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "space_marine_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "space_marine_squad_scout_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "space_marine_squad_grey_knights_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "space_marine_squad_scout_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "space_marine_squad_terminator_veteran_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "space_marine_squad_sp_dxp3_prisoner"
-- used for forward base ability
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"
-- Used for Defeat Checks
t_building_exceptions = {
"space_marine_thermo_generator",
"space_marine_generator",
"space_marine_turret_bolter",
"space_marine_mine_field",
"space_marine_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
elseif g_raceName == "tau_race"
then
-- What Intel Events race is using
g_intelEvent_raceId = 9
-- Faction name that Race is using
g_factionName = "$3950224"
-- Color Scheme that Race is using
g_colorScheme = "default_4"
-- HQ that Race uses
g_HQ_blueprint = "tau_hq"
-- Builder that Race uses
g_Builder_blueprint = "tau_builder_squad"
-- Air Unit for the Race:
g_AirUnit_blueprint = "tau_barracuda_squad"
-- What drops out of the prisoner cages when they are freed (7-9 are builders)
g_prisoner_blueprint_1 = "tau_kroot_alpha_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_2 = "tau_honor_guard_fire_warrior_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_3 = "tau_kroot_hound_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_4 = "tau_honor_guard_fire_warrior_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_5 = "tau_kroot_shaper_squad_sp_dxp3_prisoner"
g_prisoner_blueprint_6 = "tau_honor_guard_fire_warrior_squad_sp_dxp3_prisoner"
-- used for forward base ability
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 algorithm 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"
-- Used for Defeat Checks
t_building_exceptions = {
"tau_thermoplasma_generator",
"tau_plasma_generator",
"tau_listening_post"}
-- Used for Defeat Checks
t_unit_exceptions = {}
end
-- Set the Faction Name of the player
Setup_SetPlayerName(g_Player1, g_factionName)
-- Set the Color Schemes Here
Misc_PlayerTeamColor(g_Player1, g_colorScheme)
end
-- Creates all the Players Initial Units on the Map (including Honor Guard) ( & give resources) function Rule_Create_All_Player_Initial_Units() -- Clear the Honor Guard List t_honorGuardUnits = {}
--Set up the Unlocked wargear upgrades
MetaMap_UpdatePlayerWargear(g_Player1)
--Set up the List of the Honor Guard units
MetaMap_GetRaceStartingSquadsList(g_raceName, t_honorGuardUnits)
-- Create the Honor Guard Units on the Map
for j = 1, table.getn(t_honorGuardUnits) do
Util_CreateSquadsAtMarker(g_Player1, "sg_honorGuard", t_honorGuardUnits[j], "mkr_honorGuard_Location", 1)
end
-- Create the Initial Troops
Util_CreateSquadsAtMarkerEx(g_Player1, "sg_player_troops", g_prisoner_blueprint_2, "mkr_initial_troops", 1,20)
SGroup_AddLeaders("sg_player_troops")
-- Sets the Initial Player Resources (RT_Requisition, RT_Power, RT_Pop(Orks Only))
if g_raceName == "necron_race"
then
-- If Necron, Only Give Power
Player_SetResource(g_Player1, RT_Power, g_amountPowerToGiveNecron)
else
-- Otherwise give both
Player_SetResource(g_Player1, RT_Requisition, g_amountRequisitionToGivePlayer)
Player_SetResource(g_Player1, RT_Power, g_amountPowerToGivePlayer)
end
-- Give the Orks Some Population
if g_raceName == "ork_race"
then
Player_AddResource(g_Player1, RT_Pop, 10)
end
end
-- Forward Base Special Ability that the Sisters start with function ForwardBases() -- 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
User_CreateBuilding(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement"..g_bonus_gen_counter, 0)
--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
User_CreateBuilding(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement"..g_bonus_turret_counter, 0)
--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
User_CreateBuilding(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement10", 0)
elseif t_blueprintEntitybonus[j] == g_bonus_research
then
User_CreateBuilding(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement11", 0)
elseif t_blueprintEntitybonus[j] == g_bonus_barracks2
then
User_CreateBuilding(g_Player1, "eg_Bonus"..j, t_blueprintEntitybonus[j], "MM_Reinforcement13", 0)
end
end
end
-- Code to Always Builds the building (prevents crashes & makes sure the buildings spawned) function User_CreateBuilding(p_PlayerID, p_EGroupID, p_Blueprint, p_MarkerName, complete)
-- This will force the building to spawn at a position (Ignores Units in the way)
-- This could have been placed where User_CreateBuilding() was but this new tech function was added later since old Silvey Methods Didn't work well with percentage buildings
Entity_CreateBuildingPositionForce(p_PlayerID, p_EGroupID, p_Blueprint, Marker_GetPosition(Marker_FromName(p_MarkerName, "basic_marker" )), complete)
-- l_EntityID = Entity_Create(p_Blueprint, p_PlayerID, Marker_GetPosition(Marker_FromName(p_MarkerName, "basic_marker" ))) -- EGroup_Add(EGroup_CreateIfNotFound(p_EGroupID), l_EntityID)
-- Entity_Spawn(l_EntityID)
-- I added this part so it can build at a percentage
-- if complete == 0 -- then -- Entity_SetBuildingProgress( l_EntityID, 0 ) -- end end
-- Complete the Forward bases after they are dropped in... function Rule_Complete_Player_Buildings() -- Reset the Forward Base Code: -- generator markers start at 0 g_bonus_gen_counter = 0 -- turrer markers start at 6 g_bonus_turret_counter = 6
-- Player HQ: Player Builds own HQ in mission
-- EGroup_SetConstructionComplete("eg_player_mainBase_HQ1")
-- Forward Bases:
for j=1,table.getn(t_blueprintEntitybonus) do
if t_blueprintEntitybonus[j] == g_bonus_generator
then
EGroup_SetConstructionComplete("eg_Bonus"..j)
--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
EGroup_SetConstructionComplete("eg_Bonus"..j)
--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
EGroup_SetConstructionComplete("eg_Bonus"..j)
elseif t_blueprintEntitybonus[j] == g_bonus_research
then
EGroup_SetConstructionComplete("eg_Bonus"..j)
elseif t_blueprintEntitybonus[j] == g_bonus_barracks2
then
EGroup_SetConstructionComplete("eg_Bonus"..j)
end
end
end
-- END OF ALL "INITIAL PLAYER SETUP" RULES
-- CREATE AI BUILDINGS RULES -- Rule_Create_All_Ai_Initial_Buildings() : Create all AI Bases & give them initial resources & strategic points : Called from OnInit( ) -- Rule_Create_CenterBase_Buildings() : Create Buildings for Center Base (also creates the HQs for the Mega Basilisk Spotter Objective)
-- Create all AI Bases & give them strategic points : Called from OnInit( ) function Rule_Create_All_Ai_Initial_Buildings() -- Create all the AI Buildings Rule_Create_DarkEldar_Buildings()
-- Setup the Strategic Points, Critical Points, & Relics to AI Control
Rule_Setup_AI_StrategicPoints( )
-- Set AI Starting Resources
Player_SetAllResources(g_Player2, g_amountRequisitionToGiveAI, g_amountPowerToGiveAI, 0)
Player_SetAllResources(g_Player3, g_amountRequisitionToGiveAI, g_amountPowerToGiveAI, 0)
Player_SetAllResources(g_Player4, g_amountRequisitionToGiveAI, g_amountPowerToGiveAI, 0)
-- Give Some Starting Soul Resources to AI
Player_AddResource(g_Player2, RT_Souls, 10000)
Player_AddResource(g_Player3, RT_Souls, 10000)
Player_AddResource(g_Player4, RT_Souls, 10000)
end
-- Create All the Dark Eldar Buildings on the Map function Rule_Create_DarkEldar_Buildings() -- Used for Soul Cage Objectives EGroup_Create("eg_soulCage_Objective")
-- Create the haemonculus laboratory:
for i = 1,3 do
Entity_CreateBuildingMarker(g_Player2,"eg_haemonculusLab_"..i, "dark_eldar_haemonculus_laboratory","mkr_haemonculusLab_"..i, 1)
end
-- Create the Barracks: Hall of Blood
for i = 1,15 do
Entity_CreateBuildingMarker(g_Player2,"eg_hallOfBlood_"..i, "dark_eldar_hall_of_blood","mkr_hallOfBlood_"..i, 1)
end
-- Create the HQ:
for i = 1,8 do
Entity_CreateBuildingMarker(g_Player2,"eg_hq_"..i, "dark_eldar_hq","mkr_hq_"..i, 1)
end
-- Upgrade the HQ to the top tier (for soul powers)
EGroup_ForceAddOn("eg_hq_1", "addon_dark_eldar_hq_1" )
EGroup_ForceAddOn("eg_hq_1", "addon_dark_eldar_hq_2" )
-- Create the Plasma Generators:
for i = 1,18 do
Entity_CreateBuildingMarker(g_Player2,"eg_power_"..i, "dark_eldar_plasma_generator","mkr_power_"..i, 1)
end
-- Create the Real Prisoner Cages:
for i = 1,10 do
Entity_CreateBuildingMarker(g_Player2,"eg_prisonerCage_"..i, "dark_eldar_prisoner_cage_sp_dxp3","mkr_prisonerCage_"..i, 1)
end
-- Create some Fake Prisoner Caged (Addon Removes the Smoke Effect)
for i = 1,9 do
Entity_CreateBuildingMarker(g_Player2,"eg_prisonerCage_fake_"..i, "dark_eldar_prisoner_cage_sp_dxp3","mkr_prisonerCage_fake_"..i, 1)
EGroup_ForceAddOn("eg_prisonerCage_fake_"..i, "addon_dark_eldar_cage_empty")
end
-- Create the Vehicle Bay: Skimmer Shop (Dark Foundry)
for i = 1,11 do
Entity_CreateBuildingMarker(g_Player2,"eg_skimmerShop_"..i, "dark_eldar_skimmer_shop","mkr_skimmerShop_"..i, 1)
end
-- Create the Slave Caravels:
-- Ones that create slaves
for i = 1,8 do
Entity_CreateBuildingMarker(g_Player2,"eg_slaveCaravel_"..i, "dark_eldar_slave_caravel","mkr_slaveCaravel_"..i, 1)
EGroup_ForceAddOn("eg_slaveCaravel_"..i, "addon_dark_eldar_slave_graveyard")
end
-- Ones that send out shock ability
for i = 9,20 do
Entity_CreateBuildingMarker(g_Player2,"eg_slaveCaravel_"..i, "dark_eldar_slave_caravel","mkr_slaveCaravel_"..i, 1)
EGroup_ForceAddOn("eg_slaveCaravel_"..i, "addon_dark_eldar_gruesome_display")
end
-- Create the Soul Cages: (Used for objectives)
-- 1 & 2 have been removed
for i = 3,6 do
Entity_CreateBuildingMarker(g_Player2,"eg_soulCage_"..i, "dark_eldar_soul_cage_sp_dxp3","mkr_soulCage_"..i, 1)
EGroup_AddGroup("eg_soulCage_Objective", "eg_soulCage_"..i)
end
-- Create the Wych Cult Arena:
for i = 1,1 do
Entity_CreateBuildingMarker(g_Player2,"eg_wychCultArena_"..i, "dark_eldar_wych_cult_arena","mkr_wychCultArena_"..i, 1)
end
end
-- Setup the Strategic Points, Critical Points, & Relics to AI Control -- All EGroups are set in the editor function Rule_Setup_AI_StrategicPoints( ) ------------------------------------------------------------------------------------------------------------------------------------------------- -- Strategic Point Ownership & Upgrades to Listening Posts ------------------------------------------------------------------------------------------------------------------------------------------------- -- The three by the location where player bulds base -- Upgrade to tier 1 for i=15, 17 do EGroup_SetPlayerOwner("eg_stratPoint"..i, g_Player2) Entity_CreateBuildingPosition(g_Player2, "eg_listeningPost"..i, "dark_eldar_listening_post", EGroup_GetPosition("eg_stratPoint"..i), 1) EGroup_ForceAddOn("eg_listeningPost"..i, "addon_dark_eldar_list_post_1" ) end
-- Strategic Points to g_Player2
-- Upgrade to Tier 2 & Dark Lance Upgrades
for i=1, 14 do
EGroup_SetPlayerOwner("eg_stratPoint"..i, g_Player2)
Entity_CreateBuildingPosition(g_Player2, "eg_listeningPost"..i, "dark_eldar_listening_post", EGroup_GetPosition("eg_stratPoint"..i), 1)
EGroup_ForceAddOn("eg_listeningPost"..i, "addon_dark_eldar_list_post_2" )
EGroup_ForceAddOn("eg_listeningPost"..i, "addon_dark_eldar_list_post_dark_lance")
end
-------------------------------------------------------------------------------------------------------------------------------------------------
-- Relic Ownership & Upgrades to Listening Posts Level 2
-------------------------------------------------------------------------------------------------------------------------------------------------
-- Relic by the Main Base to g_Player2
-- Tier 2 & Dark Lance Upgrades
for i=1, 1 do
EGroup_SetPlayerOwner("eg_relic"..i, g_Player2)
Entity_CreateBuildingPosition(g_Player2, "eg_listeningPostRelic"..i, "dark_eldar_listening_post", EGroup_GetPosition("eg_relic"..i), 1)
EGroup_ForceAddOn("eg_listeningPostRelic"..i, "addon_dark_eldar_list_post_2" )
EGroup_ForceAddOn("eg_listeningPostRelic"..i, "addon_dark_eldar_list_post_dark_lance")
end
-- Relic by the Side Bases to g_Player2
-- No LP so Player knows where they are
for i=2, 3 do
EGroup_SetPlayerOwner("eg_relic"..i, g_Player2)
end
end
-- END OF ALL " CREATE AI BUILDINGS " RULES
-- CREATE AI INITIAL UNIT RULES -- Rule_Create_All_Ai_Initial_Units() : Create all AI Initial Units : Called from OnInit( )
-- Create all AI Initial Units : Called from OnInit( ) function Rule_Create_All_Ai_Initial_Units() -- Spawn in Vect for the Objective Util_CreateSquadsAtMarker(g_Player4, "sg_Vect_Objective", "dark_eldar_squad_dais_of_destruction_sp_dxp3", "mkr_vect_objective", 1)
-- Produce some basic troops by the First Prisoner Cage (Cage 10) (1 squad + 1 for each difficult tier)
Rule_Produce_Mandrake_Full("sg_prisonerCage_firstTroops", "eg_hallOfBlood_10", "mkr_prisonerCage_10")
for i= 1, g_strongholdStrengthTier do
Rule_Produce_Mandrake_Full("sg_prisonerCage_firstTroops", "eg_hallOfBlood_10", "mkr_prisonerCage_10")
end
-- Produce the First Attack Squad of Troops (The group that attacks right past the first cage) (2 warrior + 1 mandrake per tier)
Rule_Produce_Warrior_Full("sg_firstTroops", "eg_hallOfBlood_10", "mkr_spawnFirstTroops_1")
Rule_Produce_Warrior_Full("sg_firstTroops", "eg_hallOfBlood_10", "mkr_spawnFirstTroops_3")
for i = 1, g_strongholdStrengthTier do
Rule_Produce_Mandrake_Full("sg_firstTroops", "eg_hallOfBlood_10", "mkr_spawnFirstTroops_2")
end
-- Produce the Squad of Warriors from Hall of Blood 10
Rule_Produce_Warrior_Full("sg_hallOfBlood10_firstTroops", "eg_hallOfBlood_10", "mkr_hallOfBlood_10")
-- Produce the Squad of Warriors from Hall of Blood 14
Rule_Produce_Warrior_Full("sg_hallOfBlood14_firstTroops", "eg_hallOfBlood_14", "mkr_hallOfBlood_14")
-- Produce the Squad of Warriors from Hall of Blood 15
Rule_Produce_Warrior_Full("sg_hallOfBlood15_firstTroops", "eg_hallOfBlood_15", "mkr_hallOfBlood_15")
-- Produce the First Reavers from SKimmer10
Rule_Produce_Reaver("sg_skimmer10_firstTroops", "eg_skimmerShop_10", "mkr_skimmerShop_10")
Rule_Produce_Reaver("sg_skimmer10_firstTroops", "eg_skimmerShop_10", "mkr_skimmerShop_10")
-- Produce Some Slaves For Repairing & Soul Harvesting
Rule_Produce_Slave("sg_slave_1", "eg_hq_1", "mkr_hq_1")
Rule_Produce_Slave("sg_slave_2", "eg_hq_1", "mkr_hq_1")
Rule_Produce_Slave("sg_slave_3", "eg_slaveCaravel_5", "mkr_slaveCaravel_5")
Rule_Produce_Slave("sg_slave_4", "eg_slaveCaravel_6", "mkr_slaveCaravel_6")
-- Produce Some Loaded Raiders For Jumping In
-- Create at Hall of Blood 7 & Skimmer Shop 7 & Jump in once the player nears the markers
for i=1,4 do
Rule_Produce_Warrior_Full("sg_prisoner_raider_jump_troops"..i, "eg_hallOfBlood_7", "mkr_hallOfBlood_7")
Rule_Produce_Raider("sg_prisoner_raider_jump_"..i, "eg_skimmerShop_7", "mkr_skimmerShop_7")
Cmd_EnterTransport("sg_prisoner_raider_jump_troops"..i, "sg_prisoner_raider_jump_"..i)
end
-- Create the Sourge Jump Troops (w/ Dark Lance) used to jump in throughout the intro areas
-- Create by Center Base & Jump in once the player nears the markers
for i = 1,6 do
Rule_Produce_Scourge_FullDarkLance("sg_prisoner_scourge_jump_"..i, "eg_hq_4", "mkr_hq_4")
end
-- Create the Helion Jump Troops used to jump in throughout the intro areas
-- Create at Hall of Blood 6 & Jump in once the player nears the markers
for i = 1,3 do
Rule_Produce_Hellion("sg_prisoner_hellion_jump_"..i, "eg_hallOfBlood_6", "mkr_hallOfBlood_6")
end
-- Create the Wychs By Prisoner Cage 6
for i = 1,2 do
Rule_Produce_Wych("sg_prisoner_wych_"..i, "eg_hallOfBlood_12", "mkr_prisoner_wych_"..i)
end
-- Create the Warriors By Prisoner Cage 6
for i = 1,2 do
Rule_Produce_Warrior_Full("sg_prisoner_warrior_"..i, "eg_prisonerCage_6", "mkr_prisoner_troop_"..i)
end
-- Create Initial Defense Troops by the Bases
Rule_Create_Ai_Initial_Units_Center_Base()
Rule_Create_Ai_Initial_Units_East_Base()
Rule_Create_Ai_Initial_Units_Main_Base()
Rule_Create_Ai_Initial_Units_North_Base()
Rule_Create_Ai_Initial_Units_NorthWest_Base()
Rule_Create_Ai_Initial_Units_SouthEast_Base()
Rule_Create_Ai_Initial_Units_SouthWest_Base()
Rule_Create_Ai_Initial_Units_West_Base()
end
--Produce Some Troops for Initial Center Base Defense: function Rule_Create_Ai_Initial_Units_Center_Base() -- Two Slave Squads at HQ Rule_Produce_Slave("sg_center_defense_slave1", "eg_hq_4", "mkr_hq_4") Rule_Produce_Slave("sg_center_defense_slave2", "eg_hq_4", "mkr_hq_4")
-- Two Warrior Squads at HQ
Rule_Produce_Warrior_Full("sg_center_defense_warrior1", "eg_hq_4", "mkr_hq_4")
Rule_Produce_Warrior_Full("sg_center_defense_warrior2", "eg_hq_4", "mkr_hq_4")
-- Two Reavers at HQ
Rule_Produce_Reaver("sg_center_defense_reaver1", "eg_hq_4", "mkr_hq_4")
Rule_Produce_Reaver("sg_center_defense_reaver2", "eg_hq_4", "mkr_hq_4")
end
--Produce Some Troops for Initial East Base Defense: function Rule_Create_Ai_Initial_Units_East_Base() -- Four Reaver Squads at HQ Rule_Produce_Reaver("sg_east_defense_reaver1", "eg_hq_5", "mkr_hq_5") Rule_Produce_Reaver("sg_east_defense_reaver2", "eg_hq_5", "mkr_hq_5") Rule_Produce_Reaver("sg_east_defense_reaver3", "eg_hq_5", "mkr_hq_5") Rule_Produce_Reaver("sg_east_defense_reaver4", "eg_hq_5", "mkr_hq_5")
--Warrior Squads at HQ
for i = 1, g_strongholdStrengthTier do
Rule_Produce_Warrior_Full("sg_east_defense_warrior"..i, "eg_hq_5", "mkr_hq_5")
end
end
--Produce Some Troops for Initial Main Base Defense: function Rule_Create_Ai_Initial_Units_Main_Base() -- Produce Two Mandrakes at HQ Rule_Produce_Mandrake_Full("sg_main_defense_mandrakes1", "eg_hq_1", "mkr_hq_1") Rule_Produce_Mandrake_Full("sg_main_defense_mandrakes2", "eg_hq_1", "mkr_hq_1")
--Warrior Squads at HQ
for i = 1, g_strongholdStrengthTier do
Rule_Produce_Warrior_Full("sg_main_defense_warrior"..i, "eg_hq_1", "mkr_hq_1")
end
--ProduceTwo Ravagers
Rule_Produce_Ravager_FullyUpgraded("sg_main_defense_ravager1", "eg_hq_1", "mkr_hq_1")
Rule_Produce_Ravager_FullyUpgraded("sg_main_defense_ravager2", "eg_hq_1", "mkr_hq_1")
-- Produce a Talos
Rule_Produce_Talos("sg_main_defense_talos", "eg_hq_1", "mkr_hq_1")
-- Produce Two Ravens
Rule_Produce_Raven("sg_main_defense_raven1", "eg_hq_1", "mkr_hq_1")
Rule_Produce_Raven("sg_main_defense_raven2", "eg_hq_1", "mkr_hq_1")
end
--Produce Some Troops for Initial North Base Defense: function Rule_Create_Ai_Initial_Units_North_Base() -- Two Warrior Squads at Soul Cage Rule_Produce_Warrior_Full("sg_north_defense_warrior1", "eg_soulCage_5", "mkr_soulCage_5") Rule_Produce_Warrior_Full("sg_north_defense_warrior2", "eg_soulCage_5", "mkr_soulCage_5")
-- Two Scourge Squads at Soul Cage
Rule_Produce_Scourge_FullDarkLance("sg_north_defense_scourge1", "eg_soulCage_5", "mkr_soulCage_5")
Rule_Produce_Scourge_FullDarkLance("sg_north_defense_scourge2", "eg_soulCage_5", "mkr_soulCage_5")
end
--Produce Some Troops for Initial North West Base Defense: function Rule_Create_Ai_Initial_Units_NorthWest_Base() -- Two Reavers at HQ 3 Rule_Produce_Reaver("sg_northWest_defense_reaver1", "eg_hq_3", "mkr_hq_3") Rule_Produce_Reaver("sg_northWest_defense_reaver2", "eg_hq_3", "mkr_hq_3") end
--Produce Some Troops for Initial South East Base Defense: function Rule_Create_Ai_Initial_Units_SouthEast_Base() -- Two Scourge Squads at Hall of Blood 11 Rule_Produce_Scourge_FullDarkLance("sg_southEast_defense_scourge1", "eg_hallOfBlood_11", "mkr_hallOfBlood_11") Rule_Produce_Scourge_FullDarkLance("sg_southEast_defense_scourge2", "eg_hallOfBlood_11", "mkr_hallOfBlood_11")
-- 1 Talos & 1 Mandrakes at HQ7
Rule_Produce_Talos("sg_southEast_defense_talos", "eg_hq_7", "mkr_hq_7")
Rule_Produce_Mandrake_Full("sg_southEast_defense_mandrakes", "eg_hq_7", "mkr_hq_7")
-- 2 Ravagers at Power Plants 17 & 18
Rule_Produce_Ravager_FullyUpgraded("sg_southEast_defense_ravager1", "eg_power_17", "mkr_power_17")
Rule_Produce_Ravager_FullyUpgraded("sg_southEast_defense_ravager2", "eg_power_18", "mkr_power_18")
end
--Produce Some Troops for Initial South West Base Defense: function Rule_Create_Ai_Initial_Units_SouthWest_Base() -- One Wych Squad by Hall of Blood 12 Rule_Produce_Wych("sg_southWest_defense_wych", "eg_hallOfBlood_12", "mkr_hallOfBlood_12")
-- One Warp Beast Squad by Hall of Blood 13
Rule_Produce_WarpBeast("sg_southWest_defense_warpBeast", "eg_hallOfBlood_13", "mkr_hallOfBlood_13")
-- One Talos by Skimmer Shop 9
Rule_Produce_Talos("sg_southWest_defense_talos", "eg_skimmerShop_9", "mkr_skimmerShop_9")
-- One Mandrakes by Haemonculus Lab
Rule_Produce_Mandrake_Full("sg_southWest_defense_mandrakes", "eg_haemonculusLab_3", "mkr_haemonculusLab_3")
-- One Haemonculus by Haemonculus Lab
Rule_Produce_Haemonculus("sg_southWest_defense_haemonculus", "eg_haemonculusLab_3", "mkr_haemonculusLab_3")
-- Two Ravagers by HQ6
Rule_Produce_Ravager_FullyUpgraded("sg_southWest_defense_ravager1", "eg_hq_6", "mkr_hq_6")
Rule_Produce_Ravager_FullyUpgraded("sg_southWest_defense_ravager2", "eg_hq_6", "mkr_hq_6")
end
--Produce Some Troops for Initial West Base Defense: function Rule_Create_Ai_Initial_Units_West_Base() -- 1 Talos & 1 Mandrakes at Skimmer Shop 7 Rule_Produce_Talos("sg_west_defense_talos", "eg_skimmerShop_7", "mkr_skimmerShop_7") Rule_Produce_Mandrake_Full("sg_west_defense_mandrakes1", "eg_skimmerShop_7", "mkr_skimmerShop_7") Rule_Produce_Mandrake_Full("sg_west_defense_mandrakes2", "eg_skimmerShop_7", "mkr_skimmerShop_7") end
-- END OF ALL " CREATE AI INITIAL UNIT " RULES
-- GAME START -- Rule_GameStart( ) : Starts the actual mission : Called from OnInit -- Optional: this all could be done in OnInit( ) but this makes it easier to read and is clearer -- Sets up objective, win/lose conditions, tracks characters, etc... -- Rule_UI_Game_Timer() : Initially sets up the timer that shows the total elapsed time -- Rule_UI_Game_Timer_Tick(): Updates & Shows the game timer every second
-- Starts the actual mission : Called from OnInit function Rule_GameStart() if not Event_IsAnyRunning() then -- Silvey Polish 11/06/07: Dave, I moved the music setup after the opening NIS so I have a little more room to breathe. -- Function Used to Setup the Sound and Music : Function Is Defined Below Rule_SetupMusicPlaylist()
-- Function used to create all the Initial Ai Units on the Map
Rule_Create_All_Ai_Initial_Units( )
-- Function used to give resources & create all the Player Initial Units on the Map (including Honor Guard)
Rule_Create_All_Player_Initial_Units( )
-- Rule_Objective_Define(): Sets up the Objective Lua Tables, but doesn't actually assign them
Rule_Objective_Define()
-- Show and Control the Game Timer
Rule_UI_Game_Timer()
-- Assign & Check for Primary Objective: Establish Base of Operations (Also Assigns Prisoner Cage Objective)
Rule_AddInterval(Rule_EstablishBaseOfOperation_Objective,1)
-- Set up the check for DEFEAT (Loss of Units / Buildings)
Rule_AddInterval(Rule_EndGame_Defeat, 5)
-- Makes Sure all base attacks are synced up
Rule_AddOneShot(Rule_Create_And_Sync_Attacks, 0)
-- Restrict the Player From Building Bases
if g_HQ_blueprint ~= 0 then
Player_RestrictBuilding( g_Player1, g_HQ_blueprint )
end
if g_bonus_generator ~= 0 then
Player_RestrictBuilding( g_Player1, g_bonus_generator )
end
if g_bonus_turret ~= 0 then
Player_RestrictBuilding( g_Player1, g_bonus_turret )
end
if g_bonus_barracks ~= 0 then
Player_RestrictBuilding( g_Player1, g_bonus_barracks )
end
if g_bonus_barracks2 ~= 0 then
Player_RestrictBuilding( g_Player1, g_bonus_barracks2 )
end
if g_bonus_research ~= 0 then
Player_RestrictBuilding( g_Player1, g_bonus_research )
end
-- Remove this rule so that it never runs again
Rule_Remove(Rule_GameStart)
end
end
-- Initially sets up the timer that shows the total elapsed time function Rule_UI_Game_Timer() g_UI_gameTimer = 0 WinWarning_Add( "ui_gameTime", World_GetPlayerAt(0), "", "", "" ) Rule_AddInterval(Rule_UI_Game_Timer_Tick, 1) end
-- Updates & Shows the game timer every second function Rule_UI_Game_Timer_Tick() g_UI_gameTimer = g_UI_gameTimer+1 WinWarning_SetText( "ui_gameTime", Loc_FormatText1( 60445, Loc_FormatTime( 60409, g_UI_gameTimer ) ) ) end
-- END OF ALL "GAME START" RULES
-- OBJECTIVES -- INTIAL DEFINE: -- Rule_Objective_Define(): Sets up the actual Objective Lua Tables : Called from OnInit() -- Doesn't actually assign the objectives -- Just sets up the tables for them
-- ASSIGNING AND CHECKING:
-- Sets up the actual Objective Lua Tables : Called from OnInit() function Rule_Objective_Define() -- Primary Objective : Assigned at Intro Objective_KillVect = { title_id = 3950077, short_desc_id = 3950078, help_tip_id = 3950078}
-- PrimaryObjective: Assigned at Intro
Objective_EstablishBaseOfOperation = { title_id = 3950079, short_desc_id = 3950080, help_tip_id = 3950080}
-- Sub-Primary Ojective : Assigned briefly after start
Objective_FreeBuilders = { title_id = 3950081, short_desc_id = 3950082, help_tip_id = 3950082}
-- Sub-Primary Objective: Assigned once builders are freed
Objective_BuildHQ = { title_id = 3950083, short_desc_id = 3950084, help_tip_id = 3950084}
-- Secondary Objective: Assigned briefly after start
Objective_FreeTroops = { title_id = 3950085, short_desc_id = 3950086, help_tip_id = 3950086}
-- Secondary Objective: Assigned after hq is built
Objective_DestroySoulCages = { title_id = 3950087, short_desc_id = 3950088, help_tip_id = 3950088}
-- Sub-Secondary Objective for all the Soul Cages
Objective_DestroyCage_SoulStorm = { title_id = 3950266, short_desc_id = 3950267, help_tip_id = 3950267}
Objective_DestroyCage_ScreamOfDammed = { title_id = 3950091, short_desc_id = 3950092, help_tip_id = 3950092}
Objective_DestroyCage_Corrosion = { title_id = 3950093, short_desc_id = 3950094, help_tip_id = 3950094}
Objective_DestroyCage_PiercingVision = { title_id = 3950258, short_desc_id = 3950259, help_tip_id = 3950259}
end
-- Assigns & Checks for Primary Objective: Kill Vect function Rule_KillVect_Objective() -- First check if Objective exists and add if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_KillVect.title_id) == false then -- Create ( & Assign) the objective as a primary one Util_ObjectiveCreate(Objective_KillVect, true)
-- Update & Set the Primary Objective To this one when objective screen shows
g_PrimaryObjectives = g_PrimaryObjectives + 1
Objective_SetDefaultPrimary(g_PrimaryObjectives)
--Initial Ping of Vect Location
g_vect_ping = Objective_PingPosition(Objective_KillVect.title_id, SGroup_GetPosition("sg_Vect_Objective"), true, attack)
-- Assign the Secondary Objective to Destroy All the Soul Cages
Rule_AddInterval(Rule_DestroySoulCages_Objective,1)
-- Else Check if Vect is Dead are destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_KillVect.title_id) == true and
SGroup_Count("sg_Vect_Objective") == 0
then
-- Complete the Objective and Remove the Rule
Util_ObjectiveComplete(Objective_KillVect.title_id)
Rule_Remove( Rule_KillVect_Objective )
--Remove Ping
Objective_PingRemove(Objective_KillVect.title_id, g_vect_ping)
-- Victory Goes Here (5 sec delay is so it doesn't happen instantly)
Rule_AddOneShot(Rule_EndGame_Actual_Victory, 5)
-- Else Ping Vect is still alive
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_KillVect.title_id) == true and
SGroup_Count("sg_Vect_Objective") == 1
then
--Remove Old Ping...
Objective_PingRemove(Objective_KillVect.title_id, g_vect_ping)
-- ...Update with new Ping Location of Vect on the Objective Screen
g_vect_ping = Objective_PingPosition(Objective_KillVect.title_id, SGroup_GetPosition("sg_Vect_Objective"), true, attack)
end
end
-- Assigns & Check for Sub-Primary Objective : Establish your Base function Rule_EstablishBaseOfOperation_Objective() -- First check if Objective exists and add if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_EstablishBaseOfOperation.title_id) == false then -- Create ( & Assign) the objective as a primary one Util_ObjectiveCreate(Objective_EstablishBaseOfOperation, true) g_PrimaryObjectives = g_PrimaryObjectives + 1
-- Play Initial IE: Our troops are caged -- Free them
Util_StartIntel(g_ie_Initial_Array[g_intelEvent_raceId])
-- Track when the player builds their hq (& thus all sub-objectives completed)
g_player_hq_created = false
-- Assign & Check for the Sub-Objective: Free Builders
Rule_AddInterval(Rule_FreeBuilders_Objective,1)
-- if objective exists & the sub-objectives are completed (if the player has built HQ)
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_EstablishBaseOfOperation.title_id) == true and
g_player_hq_created == true
then
-- Play IE for Player HQ Completion
Util_StartIntel(EVENTS.IE_PlayerHQ_Built)
--Handles the Delayed Teching & Activation of Enemy Bases & research
Rule_AddOneShot(Rule_Tech_And_Activate_Tier_One,1)
Rule_AddOneShot(Rule_Tech_And_Activate_Tier_Two, g_time_Tier_Two)
Rule_AddOneShot(Rule_Tech_And_Activate_Tier_Three, g_time_Tier_Three)
-- Assign & Check for Primary Objective: Kill Vect (Also Assign Objective with Soul Cages)
Rule_AddInterval(Rule_KillVect_Objective,1)
-- Complete the Objective and Remove the Rule
Util_ObjectiveComplete(Objective_EstablishBaseOfOperation.title_id)
Rule_Remove(Rule_EstablishBaseOfOperation_Objective)
end
end
-- Assigns & Check for Sub-Primary Objective : Free your builders function Rule_FreeBuilders_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_EstablishBaseOfOperation.title_id) == true and Objective_GetState(Objective_EstablishBaseOfOperation.title_id) ~= OS_Complete and Objective_Exists(Objective_FreeBuilders.title_id) == false then -- Create (Assign) the objective as a sub-primary one Objective_SubAdd(Objective_FreeBuilders, Objective_EstablishBaseOfOperation.title_id)
--Associate a Ping with the Objective on the Objective Screen (updates when each cage is destroyed)
g_PrisonerCage_7_Ping_Objective = Objective_PingMarker(Objective_FreeBuilders.title_id, "mkr_prisonerCage_7", true, attack)
g_PrisonerCage_8_Ping_Objective = Objective_PingMarker(Objective_FreeBuilders.title_id, "mkr_prisonerCage_8", true, attack)
g_PrisonerCage_9_Ping_Objective = Objective_PingMarker(Objective_FreeBuilders.title_id, "mkr_prisonerCage_9", true, attack)
-- Set up a ping on the ingame screen:
Ping_Marker("mkr_prisonerCage_7", false, "default")
Ping_Marker("mkr_prisonerCage_8", false, "default")
Ping_Marker("mkr_prisonerCage_9", false, "default")
-- Track when first builder is free so know to assign: Build HQ Objective
g_buildHQ_assigned = false
-- Update & Set the Primary Objective To this one when objective screen shows
g_PrimaryObjectives = g_PrimaryObjectives + 1
Objective_SetDefaultPrimary(g_PrimaryObjectives)
-- Assign & Check for the Secondary Objective: Free Troops
Rule_AddInterval(Rule_FreeTroops_Objective,1)
-- if the objective exists & all the builders are freed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_FreeBuilders.title_id) == true and
EGroup_Count("eg_prisonerCage_7") == 0 and
EGroup_Count("eg_prisonerCage_8") == 0 and
EGroup_Count("eg_prisonerCage_9") == 0
then
-- Give the Player Resources (RT_Requisition, RT_Power) for Freeing All Builders (So Have Enough to Build HQ)
if g_raceName == "necron_race"
then
-- If Necron, Only Give Power
Player_AddResource(g_Player1, RT_Power, g_amountPowerToGiveNecron)
else
-- Otherwise give both
Player_AddResource(g_Player1, RT_Requisition, g_amountRequisitionToGivePlayer)
Player_AddResource(g_Player1, RT_Power, g_amountPowerToGivePlayer)
end
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_FreeBuilders.title_id)
Rule_Remove(Rule_FreeBuilders_Objective)
end
-- Remove Objective Ping when the prisoner cage 7 is destroyed:
if EGroup_Count("eg_prisonerCage_7") == 0 and
Objective_Exists(Objective_FreeBuilders.title_id) == true
then
Objective_PingRemove(Objective_FreeBuilders.title_id, g_PrisonerCage_7_Ping_Objective)
if g_buildHQ_assigned == false
then
g_buildHQ_assigned = true
-- Check if Builders are killed before HQ is Built
Rule_AddInterval(Rule_EndGame_Defeat_Builders,1)
-- Assign Build HQ Objective here
Rule_AddInterval(Rule_BuildHQ_Objective,1)
end
end
-- Remove Objective Ping when the prisoner cage 8 is destroyed:
if EGroup_Count("eg_prisonerCage_8") == 0 and
Objective_Exists(Objective_FreeBuilders.title_id) == true
then
Objective_PingRemove(Objective_FreeBuilders.title_id, g_PrisonerCage_8_Ping_Objective)
if g_buildHQ_assigned == false
then
g_buildHQ_assigned = true
-- Check if Builders are killed before HQ is Built
Rule_AddInterval(Rule_EndGame_Defeat_Builders,1)
-- Assign Build HQ Objective here
Rule_AddInterval(Rule_BuildHQ_Objective,1)
end
end
-- Remove Objective Ping when the prisoner cage 9 is destroyed:
if EGroup_Count("eg_prisonerCage_9") == 0 and
Objective_Exists(Objective_FreeBuilders.title_id) == true
then
Objective_PingRemove(Objective_FreeBuilders.title_id, g_PrisonerCage_9_Ping_Objective)
if g_buildHQ_assigned == false
then
g_buildHQ_assigned = true
-- Check if Builders are killed before HQ is Built
Rule_AddInterval(Rule_EndGame_Defeat_Builders,1)
-- Assign Build HQ Objective here
Rule_AddInterval(Rule_BuildHQ_Objective,1)
end
end
end
-- Assigns & Check for Sub-Primary Objective : Build Your HQ function Rule_BuildHQ_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_EstablishBaseOfOperation.title_id) == true and Objective_GetState(Objective_EstablishBaseOfOperation.title_id) ~= OS_Complete and Objective_Exists(Objective_BuildHQ.title_id) == false then -- Create (Assign) the objective as a sub-primary one Objective_SubAdd(Objective_BuildHQ, Objective_EstablishBaseOfOperation.title_id)
-- Update & Set the Primary Objective To this one when objective screen shows
g_PrimaryObjectives = g_PrimaryObjectives + 1
Objective_SetDefaultPrimary(g_PrimaryObjectives)
-- Play IE
Util_StartIntel(g_ie_FreeBuilders_Array[g_intelEvent_raceId])
-- Un-Restrict the Player From Building Bases
if g_HQ_blueprint ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_HQ_blueprint )
end
if g_bonus_generator ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_bonus_generator )
end
if g_bonus_turret ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_bonus_turret )
end
if g_bonus_barracks ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_bonus_barracks )
end
if g_bonus_barracks2 ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_bonus_barracks2 )
end
if g_bonus_research ~= 0 then
Player_UnRestrictBuilding( g_Player1, g_bonus_research )
end
-- if the objective exists & all the player HQ is built
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_BuildHQ.title_id) == true and
g_playerHQ_built == true
then
-- Remove the Defeat rule that checks for builder death, since HQ is completed now
Rule_Remove(Rule_EndGame_Defeat_Builders)
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_BuildHQ.title_id)
Rule_Remove(Rule_BuildHQ_Objective)
-- Remove the FOW Vision between Patrols & Player1
World_EnablePlayerToPlayerFOW(g_Player1, g_Player3, true)
-- Stop the FOG Reveal around the two large bases in the prisoner area
Rule_Remove(Rule_RevealBaseWarning)
-- so game know Player has built there HQ & where it is ( so main objective completes)
g_player_hq_created = true
end
--Does Player Have HQ?
if EGroup_ContainsBlueprints(Player_GetEntities(g_Player1), Util_MakeBlueprintTable(g_HQ_blueprint), true) == true and
Objective_Exists(Objective_BuildHQ.title_id) == true and
g_player_hq_created == false
then
-- Create EGroup with Player HQ
EGroup_CreateFromEGroup("eg_player_HQ", EGroup_GetName(Player_GetEntities(g_Player1)), g_HQ_blueprint)
-- Is the Player hq Completed (Greater than 97%)?
-- using Greater than 97% in case it gets damaged during the building process
--if EGroup_GetAvgHealth("eg_player_HQ") > 0.97
--then
-- if HQ Egroup Exists, Has at least 1 member, & the HQ is completed
if EGroup_Exists("eg_player_HQ") and EGroup_CountSpawned(EGroup_FromName("eg_player_HQ")) >= 1 and
Entity_GetBuildingProgress(EGroup_GetSpawnedEntityAt(EGroup_FromName("eg_player_HQ"),1)) == 1
then
g_playerHQ_position = EGroup_GetPosition("eg_player_HQ")
g_attack_target = EGroup_GetPosition("eg_player_HQ")
g_playerHQ_built = true
-- Bring in Any Building purchased using the forward bases special power
ForwardBases()
-- Complete the Forward Base Building
Rule_AddOneShot(Rule_Complete_Player_Buildings,5)
end
end
end
-- Assigns & Check for Secondary Objective : Free your troops function Rule_FreeTroops_Objective() -- First check if Objective exists and add if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_FreeTroops.title_id) == false then -- Create( & Assign) the objective as a secondary one Util_ObjectiveCreate(Objective_FreeTroops, false)
--Associate a Ping with the Objective on the Objective Screen (updates when each cage is destroyed)
g_PrisonerCage_1_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_1", true, attack)
g_PrisonerCage_2_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_2", true, attack)
g_PrisonerCage_3_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_3", true, attack)
g_PrisonerCage_4_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_4", true, attack)
g_PrisonerCage_5_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_5", true, attack)
g_PrisonerCage_6_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_6", true, attack)
g_PrisonerCage_10_Ping_Objective = Objective_PingMarker(Objective_FreeTroops.title_id, "mkr_prisonerCage_10", true, attack)
-- Set up a ping on the ingame screen for all the prisoner cages:
for i=1,6 do
Ping_Marker("mkr_prisonerCage_"..i, false, "default")
end
Ping_Marker("mkr_prisonerCage_10", false, "default")
--Show the Objective Screen
Objective_ShowScreen()
-- if the objective exists & all the troops are freed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_FreeTroops.title_id) == true and
EGroup_Count("eg_prisonerCage_1") == 0 and
EGroup_Count("eg_prisonerCage_2") == 0 and
EGroup_Count("eg_prisonerCage_3") == 0 and
EGroup_Count("eg_prisonerCage_4") == 0 and
EGroup_Count("eg_prisonerCage_5") == 0 and
EGroup_Count("eg_prisonerCage_6") == 0 and
EGroup_Count("eg_prisonerCage_10") == 0
then
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_FreeTroops.title_id)
Rule_Remove(Rule_FreeTroops_Objective)
end
-- Remove Objective Ping when the prisoner cage 1 is destroyed:
if EGroup_Count("eg_prisonerCage_1") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_1_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 2 is destroyed:
if EGroup_Count("eg_prisonerCage_2") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_2_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 3 is destroyed:
if EGroup_Count("eg_prisonerCage_3") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_3_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 4 is destroyed:
if EGroup_Count("eg_prisonerCage_4") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_4_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 5 is destroyed:
if EGroup_Count("eg_prisonerCage_5") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_5_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 6 is destroyed:
if EGroup_Count("eg_prisonerCage_6") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_6_Ping_Objective)
end
-- Remove Objective Ping when the prisoner cage 10 is destroyed:
if EGroup_Count("eg_prisonerCage_10") == 0 and
Objective_Exists(Objective_FreeTroops.title_id) == true
then
Objective_PingRemove(Objective_FreeTroops.title_id, g_PrisonerCage_10_Ping_Objective)
end
end
-- Assigns & Check for Secondary Objective : Destroy All Soul Cages function Rule_DestroySoulCages_Objective() -- First check if Objective exists and add if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_DestroySoulCages.title_id) == false then -- Create( & Assign) the objective as a secondary one Util_ObjectiveCreate(Objective_DestroySoulCages, false)
-- Add Sub-Objectives to Destroy Soul Cages
Rule_AddInterval(Rule_DestroyCage_Corrosion_Objective,1)
-- if the objective exists & all the soul cages are destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroySoulCages.title_id) == true and
EGroup_Count("eg_soulCage_Objective") == 0
then
-- Play Initial IE: All Soul Cages Are Destroyed
Util_StartIntel(EVENTS.IE_SoulCage_NoneLeft)
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_DestroySoulCages.title_id)
Rule_Remove(Rule_DestroySoulCages_Objective)
-- if the objective exists & first soul cage is destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroySoulCages.title_id) == true and
EGroup_Count("eg_soulCage_Objective") == 3 and
g_ie_SoulCage_Destroyed[1] == false
then
-- Play IE: First Soul Cages is Destroyed
Util_StartIntel(EVENTS.IE_SoulCage_First_Destroyed)
-- So IE Doesn't Play Again
g_ie_SoulCage_Destroyed[1] = true
-- if the objective exists & two soul cages are destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroySoulCages.title_id) == true and
EGroup_Count("eg_soulCage_Objective") == 2 and
g_ie_SoulCage_Destroyed[2] == false
then
-- NO IE FOR WHEN SECOND CAGE IS DESTROYED
-- So IE Doesn't Play Again
g_ie_SoulCage_Destroyed[2] = true
-- if the objective exists & three soul cages are destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroySoulCages.title_id) == true and
EGroup_Count("eg_soulCage_Objective") == 1 and
g_ie_SoulCage_Destroyed[3] == false
then
-- Play IE: Third Soul Cages is Destroyed (Only One Left)
Util_StartIntel(EVENTS.IE_SoulCage_OneLeft)
-- So IE Doesn't Play Again
g_ie_SoulCage_Destroyed[3] = true
end
end
-- Assigns & Check for Sub-Secondary Objective : Destroy Soul Cage: Corrosion function Rule_DestroyCage_Corrosion_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_DestroySoulCages.title_id) == true and Objective_GetState(Objective_DestroySoulCages.title_id) ~= OS_Complete and Objective_Exists(Objective_DestroyCage_Corrosion.title_id) == false then -- Create (Assign) the objective as a sub-secondary one Objective_SubAdd(Objective_DestroyCage_Corrosion, Objective_DestroySoulCages.title_id)
-- Enable the use of the Corrosion Skill
Rule_AddInterval(Rule_SoulPower_Corrosion, 30)
--Associate a Ping with the Objective on the Objective Screen
g_SoulCage_Corrosion_Ping_Objective = Objective_PingMarker(Objective_DestroyCage_Corrosion.title_id, "mkr_soulCage_4", true, attack)
-- Set up a ping on the ingame screen & reveal FOW for 10 sec:
Ping_Marker("mkr_soulCage_4", false, "default")
FOW_RevealMarker("mkr_soulCage_4", 10)
-- Add Next Sub-Objective
Rule_AddInterval(Rule_DestroyCage_SoulStorm_Objective,1)
-- if the objective exists & the soul cage is destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroyCage_Corrosion.title_id) == true and
EGroup_Count("eg_soulCage_4") == 0
then
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_DestroyCage_Corrosion.title_id)
Rule_Remove(Rule_DestroyCage_Corrosion_Objective)
-- Stop the Use of the Corrosion Skill
Rule_Remove(Rule_SoulPower_Corrosion)
end
end
-- Assigns & Check for Sub-Secondary Objective : Destroy Soul Cage: SoulStorm function Rule_DestroyCage_SoulStorm_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_DestroySoulCages.title_id) == true and Objective_GetState(Objective_DestroySoulCages.title_id) ~= OS_Complete and Objective_Exists(Objective_DestroyCage_SoulStorm.title_id) == false then -- Create (Assign) the objective as a sub-secondary one Objective_SubAdd(Objective_DestroyCage_SoulStorm, Objective_DestroySoulCages.title_id)
-- Enable Soul Storm skill
Rule_AddInterval(Rule_SoulPower_SoulStorm, 45)
--Associate a Ping with the Objective on the Objective Screen
g_SoulCage_RendSoul_Ping_Objective = Objective_PingMarker(Objective_DestroyCage_SoulStorm.title_id, "mkr_soulCage_5", true, attack)
-- Set up a ping on the ingame screen & reveal FOW for 10 sec:
Ping_Marker("mkr_soulCage_5", false, "default")
FOW_RevealMarker("mkr_soulCage_5", 10)
-- Add Next Sub-Objective
Rule_AddInterval(Rule_DestroyCage_ScreamOfDammed_Objective,1)
-- if the objective exists & all the soul cage is destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroyCage_SoulStorm.title_id) == true and
EGroup_Count("eg_soulCage_5") == 0
then
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_DestroyCage_SoulStorm.title_id)
Rule_Remove(Rule_DestroyCage_SoulStorm_Objective)
-- Stop the Use of the Soul Storm Skill
Rule_Remove(Rule_SoulPower_SoulStorm)
end
end
-- Assigns & Check for Sub-Secondary Objective : Destroy Soul Cage: ScreamOfDammed function Rule_DestroyCage_ScreamOfDammed_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_DestroySoulCages.title_id) == true and Objective_GetState(Objective_DestroySoulCages.title_id) ~= OS_Complete and Objective_Exists(Objective_DestroyCage_ScreamOfDammed.title_id) == false then -- Create (Assign) the objective as a sub-secondary one Objective_SubAdd(Objective_DestroyCage_ScreamOfDammed, Objective_DestroySoulCages.title_id)
-- Enable Scream of the Dammed
Rule_AddInterval(Rule_SoulPower_ScreamOfDammed, 45)
--Associate a Ping with the Objective on the Objective Screen
g_SoulCage_Sadisim_Ping_Objective = Objective_PingMarker(Objective_DestroyCage_ScreamOfDammed.title_id, "mkr_soulCage_6", true, attack)
-- Set up a ping on the ingame screen & reveal FOW for 10 sec:
Ping_Marker("mkr_soulCage_6", false, "default")
FOW_RevealMarker("mkr_soulCage_6", 10)
-- Add Next Sub-Objective
Rule_AddInterval(Rule_DestroyCage_PiercingVision_Objective,1)
-- if the objective exists & all the soul cage is destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroyCage_ScreamOfDammed.title_id) == true and
EGroup_Count("eg_soulCage_6") == 0
then
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_DestroyCage_ScreamOfDammed.title_id)
Rule_Remove(Rule_DestroyCage_ScreamOfDammed_Objective)
-- Stop the Use of the Scream of the Dammed Skill
Rule_Remove(Rule_SoulPower_ScreamOfDammed)
end
end
-- Assigns & Check for Sub-Secondary Objective : Destroy Soul Cage: Piercing Vision function Rule_DestroyCage_PiercingVision_Objective() -- Confirm the Primary Objective Exists & check if the Sub-Objective exists & add sub if not... if Event_IsAnyRunning() == false and Objective_Exists(Objective_DestroySoulCages.title_id) == true and Objective_GetState(Objective_DestroySoulCages.title_id) ~= OS_Complete and Objective_Exists(Objective_DestroyCage_PiercingVision.title_id) == false then -- Create (Assign) the objective as a sub-secondary one Objective_SubAdd(Objective_DestroyCage_PiercingVision, Objective_DestroySoulCages.title_id)
-- Enable Piercing Vision
Rule_AddInterval(Rule_SoulPower_PiercingVision,10)
-- Plays IE & Actually Allows the soul powers to start being casted
Rule_AddOneShot(Rule_Start_Using_Soul_Powers, 30)
--Associate a Ping with the Objective on the Objective Screen
g_SoulCage_PiercingVision_Ping_Objective = Objective_PingMarker(Objective_DestroyCage_PiercingVision.title_id, "mkr_soulCage_3", true, attack)
-- Set up a ping on the ingame screen & reveal FOW for 10 sec:
Ping_Marker("mkr_soulCage_3", false, "default")
FOW_RevealMarker("mkr_soulCage_3", 10)
-- Show Objective Screen
Objective_ShowScreen()
-- if the objective exists & all the soul cage is destroyed
elseif Event_IsAnyRunning() == false and
Objective_Exists(Objective_DestroyCage_PiercingVision.title_id) == true and
EGroup_Count("eg_soulCage_3") == 0
then
-- Complete the Objective & Remove the Rule
Util_ObjectiveComplete(Objective_DestroyCage_PiercingVision.title_id)
Rule_Remove(Rule_DestroyCage_PiercingVision_Objective)
-- Stop the Use of the Piercing Vision Skill
Rule_Remove(Rule_SoulPower_PiercingVision)
end
end
-- END OF ALL " OBJECTIVES " RULES
-- Plays IE & Actually Allows the soul powers to start being casted function Rule_Start_Using_Soul_Powers() --Play IE: First Time using a soul power Util_StartIntel(EVENTS.IE_UseSoulCages)
-- Enable the Soul Powers to now be used
g_soulPower_enabled_Corrosion = true
g_soulPower_enabled_PiercingVision = true
g_soulPower_enabled_ScreamofDammed = true
end
--Handles the Delayed Tech-ing & Activation of Enemy Bases & granting of research function Rule_Tech_And_Activate_Tier_One() -- Change Target Location for when a squad is told to retreat (Retreat Toward Main Base HQ) g_retreat_target = Marker_GetPosition(Marker_FromName("mkr_hq_1", "basic_marker"))
-- Rule For Vect Attacks to Start
Rule_AddInterval(Rule_VectAttack, g_timer_vectAttack)
-- Sync Production Rules for After Player Builds HQ
Rule_AddInterval(Rule_Production_East_Base, g_timer_eastBase)
Rule_AddInterval(Rule_Production_Main_Base, g_timer_mainBase)
Rule_AddInterval(Rule_Production_North_Base, g_timer_northBase)
Rule_AddInterval(Rule_Production_NorthWest_Base, g_timer_northWestBase)
Rule_AddInterval(Rule_Production_West_Base, g_timer_westBase)
Rule_AddInterval(Rule_Production_VectBase, g_timer_vectBase)
-- Activate East Base: Warrior, Mandrakes & Jumping Hellions
g_base_activated_East = true
-- Activate West Base: Warriors, Jumping Scourge & Reavers
g_base_activated_West = true
-- Activate North Base Patrols: Patrolling Mandrakes & Patrolling Warp Beasts
g_patrol_activated_North = true
--Archon & Raven Air Defense : Activated here since these raven only attack Air Units & hopefully the early activation will help with letting them get both ravens up before attacking
g_base_activated_Vect = true
end
--Handles the Delayed Tech-ing & Activation of Enemy Bases & granting of research function Rule_Tech_And_Activate_Tier_Two() --Taunt Player (Since Tiered Up) Util_StartIntel(EVENTS.IE_Taunt_One)
-- Jumping Raiders & Troops from Main Base
g_base_activated_Main = true
-- Jumping Scourge & Mandrakes
g_base_activated_SouthEast = true
-- Main Base Warp beasts for Vect:
g_vectSupport_warpBeast = true
-- What Percentage of the Squad do troops reinforce up to...
g_reinforce_percent = .80
-- Change Amount of Time between Vect Attacks
g_timer_vectAttack = 360
-- Grant Mandrake Cloaking
Player_GrantResearch(g_Player2, "dark_eldar_infiltration_mandrake_research")
Player_GrantResearch(g_Player3, "dark_eldar_infiltration_mandrake_research")
-- Increase Mandrake Damage
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_mandrake_melee")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_mandrake_melee")
-- Increase Vechicle Armor
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_vehicle_armor")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_vehicle_armor")
Player_GrantResearch(g_Player4, "dark_eldar_upgrade_vehicle_armor")
-- Add DOT to Melee Attacks
Player_GrantResearch(g_Player2, "dark_eldar_poisoned_blades_research")
Player_GrantResearch(g_Player3, "dark_eldar_poisoned_blades_research")
-- Increase Weapon Accuracy
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_soulseeker_ammunition")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_soulseeker_ammunition")
-- Upgrade Reaver Damage
Player_GrantResearch(g_Player2, "dark_eldar_reaver_targeting_research")
Player_GrantResearch(g_Player3, "dark_eldar_reaver_targeting_research")
-- Stinger for Haemonculus
Player_GrantResearch(g_Player2, "dark_eldar_stinger_research")
Player_GrantResearch(g_Player3, "dark_eldar_stinger_research")
-- Soul Destruction for Haemonculus
Player_GrantResearch(g_Player2, "dark_eldar_soul_destruction_research")
Player_GrantResearch(g_Player3, "dark_eldar_soul_destruction_research")
-- Increase Commander & Leader Health
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_commander_health")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_commander_health")
-- Increase Melee Damage for Leaders :Power Blades
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_power_scythe")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_power_scythe")
-- Increase Ranged Damage for Leaders : Splinter Cannons
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_power_scythe")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_power_scythe")
-- Increase Power (Probably useless for the scenario)
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_power_1")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_power_1")
-- Increase Req (Probably useless for the scenario)
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_requisition_1")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_requisition_1")
-- Give Archon the Crucible of Malediction Skill
Player_GrantResearch(g_Player2, "dark_eldar_crucible_of_malediction_research")
-- Increase size of Archon Squad -- Add More Retinue
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_retinue_size_1")
g_number_incubi = 3
end
--Handles the Delayed Tech-ing & Activation of Enemy Bases & granting of research function Rule_Tech_And_Activate_Tier_Three() --Taunt Player (Since Tiered Up) Util_StartIntel(EVENTS.IE_Taunt_Two)
--Stop the Capturing of Strategic Points & Relics
g_canCaptureStrat = false
g_canCaptureRelic = false
-- North Base: Talos & Ravens
g_base_activated_North = true
-- NorthWest Base: Haemonculus & Wychs
g_base_activated_NorthWest = true
-- SouthWest Base: Wych, Haemonculus, Talos & Raven
g_base_activated_SouthWest = true
-- Main Base Ravagers for Vect:
g_vectSupport_ravager = true
-- Enable the Soul Power
g_soulPower_enabled_SoulStorm = true
-- What Percentage of the Squad do troops reinforce up to...
g_reinforce_percent = .95
-- Change Amount of Time between Vect Attacks
g_timer_vectAttack = 240
-- Increase size of Archon Squad -- Add More Retinue
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_retinue_size_2")
g_number_incubi = 4
-- Further Increase Vechicle Armor
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_vehicle_armor_2")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_vehicle_armor_2")
Player_GrantResearch(g_Player4, "dark_eldar_upgrade_vehicle_armor_2")
-- Increase Commander & Leader Health
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_commander_health_2")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_commander_health_2")
-- 2nd Increase Melee Damage for Leaders
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_agonizer")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_agonizer")
-- Grant Talos Wildfire Skill
Player_GrantResearch(g_Player2, "dark_eldar_wildfire_research")
Player_GrantResearch(g_Player3, "dark_eldar_wildfire_research")
-- Increase Soul Harvesting (Probably useless for the scenario)
Player_GrantResearch(g_Player2, "dark_eldar_soulharvest_research")
Player_GrantResearch(g_Player3, "dark_eldar_soulharvest_research")
-- Increase Power (Probably useless for the scenario)
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_power_2")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_power_2")
-- Increase Req (Probably useless for the scenario)
Player_GrantResearch(g_Player2, "dark_eldar_upgrade_requisition_2")
Player_GrantResearch(g_Player3, "dark_eldar_upgrade_requisition_2")
end
-- UNIT PRODUCTION -- Rule_Produce_XXX (squadName, buildingName, markerName) -- Produces (& Upgrades) XXX from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists -- Return True if XXX is Created, & False if the Building is Destroyed
-- Unit Types:
-- Rule_Produce_Archon
-- Rule_Produce_Haemonculus
-- Rule_Produce_Hellion
-- Rule_Produce_Mandrake
-- Rule_Produce_Mandrake_Full
-- Rule_Produce_Raider
-- Rule_Produce_Ravager
-- Rule_Produce_Ravager_FullyUpgraded
-- Rule_Produce_Raven
-- Rule_Produce_Reaver
-- Rule_Produce_Scourge
-- Rule_Produce_Scourge_FullDarkLance
-- Rule_Produce_Slave (Fast Repairing version of Builder)
-- Rule_Produce_Talos
-- Rule_Produce_WarpBeast
-- Rule_Produce_Warrior
-- Rule_Produce_Warrior_Full
-- Rule_Produce_Wych
-- "dark_eldar_squad_dais_of_destruction" (is the objective for the level so not need
-- Produce an Archon from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Archon(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create an Archon & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_archon", markerName, 1) return true end
-- Archon not created since building doesn't exist
return false
end
-- Produce a haemonculus from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Haemonculus(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a haemonculus & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_haemonculus", markerName, 1) return true end
-- haemonculus not created since building doesn't exist
return false
end
-- Produce a hellion from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Hellion(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a hellion & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_hellion_sp_dxp3", markerName, 1) SGroup_AddLeaders(squadName) return true end
-- hellion not created since building doesn't exist
return false
end
-- Produce a mandrake from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Mandrake(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a mandrake & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_mandrake", markerName, 1) return true end
-- mandrake not created since building doesn't exist
return false
end
-- Produce a mandrake from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Mandrake_Full(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a mandrake & return "true" Util_CreateSquadsAtMarkerEx(g_Player2, squadName, "dark_eldar_squad_mandrake", markerName, 1,6) return true end
-- mandrake not created since building doesn't exist
return false
end
-- Produce a raider from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Raider(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a raider & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_raider_sp_dxp3", markerName, 1) return true end
-- raider not created since building doesn't exist
return false
end
-- Produce a ravager from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Ravager(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a ravager & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_ravager", markerName, 1)
-- Random Chance of Upgrading to Anti-Infantry
if World_GetRand(0,4) < 2
then
-- Upgrade to Anti Infantry Weapon Upgrades
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager", 1)
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager_2", 1)
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager_3", 1)
end
return true
end
-- ravager not created since building doesn't exist
return false
end
-- Produce a ravager from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Ravager_FullyUpgraded(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a ravager & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_ravager", markerName, 1)
-- Upgrade to Anti Infantry Weapon Upgrades
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager", 1)
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager_2", 1)
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_disintegrator_ravager_3", 1)
return true
end
-- ravager not created since building doesn't exist
return false
end
-- Produce a raven from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Raven(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a raven & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_raven", markerName, 1) return true end
-- raven not created since building doesn't exist
return false
end
-- Produce a reaver from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Reaver(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a reaver & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_reaver", markerName, 1) return true end
-- reaver not created since building doesn't exist
return false
end
-- Produce a scourge from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Scourge(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a scourge & return "true" Util_CreateSquadsAtMarkerEx(g_Player2, squadName, "dark_eldar_squad_scourge_sp_dxp3", markerName, 1,4)
-- Give the Scourge their Dark Lance
local darkLance = World_GetRand(0,4)
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_dark_lance_scourge", darkLance)
return true
end
-- scourge not created since building doesn't exist
return false
end
-- Produce a scourge from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Scourge_FullDarkLance(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a scourge & return "true" Util_CreateSquadsAtMarkerEx(g_Player2, squadName, "dark_eldar_squad_scourge_sp_dxp3", markerName, 1,6)
-- Give the Scourge their Dark Lance
Squad_ForceUpgradeWeapons(SGroup_GetSpawnedSquadAt(SGroup_FromName(squadName), 1),"dark_eldar_dark_lance_scourge", 4)
return true
end
-- scourge not created since building doesn't exist
return false
end
-- Produce a slave (slave fast repairs) from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Slave(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a slave & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_fastrepair_sp_dxp3", markerName, 1) return true end
-- slave not created since building doesn't exist
return false
end
-- Produce a talos from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Talos(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a talos & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_talos", markerName, 1) return true end
-- talos not created since building doesn't exist
return false
end
-- Produce a warp beast from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_WarpBeast(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a WarpBeast, Add Leader & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_warp_beast", markerName, 1) SGroup_AddLeaders(squadName) return true end
-- WarpBeast not created since building doesn't exist
return false
end
-- Produce a warrior from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Warrior(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a warrior & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_warrior", markerName, 1) SGroup_AddLeaders(squadName) return true end
-- warrior not created since building doesn't exist
return false
end
-- Produce a full squad of warriors from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Warrior_Full(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a full warrior squad with leader & return "true" Util_CreateSquadsAtMarkerEx(g_Player2, squadName, "dark_eldar_squad_warrior", markerName, 1,6) SGroup_AddLeaders(squadName) return true end
-- warrior not created since building doesn't exist
return false
end
-- Produce a wych from Building at Marker for g_Player2 & Assign it to SGroup(squadName) if building exists function Rule_Produce_Wych(squadName, buildingName, markerName) -- if building still exists if EGroup_Count(buildingName) == 1 then -- Create a wych & return "true" Util_CreateSquadsAtMarker(g_Player2, squadName, "dark_eldar_squad_wych", markerName, 1) SGroup_AddLeaders(squadName) return true end
-- wych not created since building doesn't exist
return false
end
-- END OF ALL " UNIT PRODUCTION " RULES
-- SQUAD AI & TACTICS -- Rule_Squad_Tactics_Helper() : Helper Function that passes squads to the real tactics function & chooses skills for the squad -- Added as an Interval Rule from Rule_Create_And_Sync_Attacks() -- Rule_Squad_Tactics(squad, squad_status, skill_id) : Decides if a squad should Attack, Use Skills, Reinforce, Retreat, or wait since still loading into a transport -- Rule_Squad_Skill(squad, skillID) : Squad tries to use a variety of skills against Player Squads based on skillID passed in
-- Helper Function that passes squads to the real tactics function & chooses skills for the squad -- Added as an Interval Rule from Rule_Create_And_Sync_Attacks() function Rule_Squad_Tactics_Helper() -- Get all the world owned strategic points (relics & crits also) EGroup_Clear("eg_world_points") World_GetStrategicPoints("eg_world_points")
-- Get Attack Target For the Enemy
g_attack_target = SGroup_GetPosition(Player_GetSquads(g_Player1))
-- Cage Defense Troops
g_cageDefense_warrior_status[1] = Rule_Squad_Tactics("sg_cageDefense_warrior1", g_cageDefense_warrior_status[1], g_skill_warriors)
g_cageDefense_warrior_status[2] = Rule_Squad_Tactics("sg_cageDefense_warrior2", g_cageDefense_warrior_status[2], g_skill_warriors)
g_cageDefense_scourge_status[1] = Rule_Squad_Tactics("sg_cageDefense_scourge", g_cageDefense_scourge_status[1], 0)
g_cageDefense_reaver_status[1] = Rule_Squad_Tactics("sg_cageDefense_reaver", g_cageDefense_reaver_status[1], 0)
-- Center Base
g_centerBase_reaver_status[1] = Rule_Squad_Tactics("sg_centerBase_reaver", g_centerBase_reaver_status[1], 0)
g_centerBase_mandrake_status[1] = Rule_Squad_Tactics("sg_centerBase_mandrake", g_centerBase_mandrake_status[1], g_skill_mandrakes)
g_centerBase_scourge_status[1] = Rule_Squad_Tactics("sg_centerBase_scourge", g_centerBase_scourge_status[1], 0)
-- East Base
g_eastBase_hellions_status[1] = Rule_Squad_Tactics("sg_eastBase_hellions", g_eastBase_hellions_status[1], g_skill_eastBase_hellion_jump)
g_eastBase_warrior_status[1] = Rule_Squad_Tactics("sg_eastBase_warrior", g_eastBase_warrior_status[1], g_skill_warriors)
g_eastBase_mandrake_status[1] = Rule_Squad_Tactics("sg_eastBase_mandrake", g_eastBase_mandrake_status[1], g_skill_mandrakes)
-- Main Base
g_mainBase_raider_status[1] = Rule_Squad_Tactics("sg_mainBase_raider1", g_mainBase_raider_status[1], g_skill_raider)
g_mainBase_raider_status[2] = Rule_Squad_Tactics("sg_mainBase_raider2", g_mainBase_raider_status[2], g_skill_raider)
g_mainBase_ravager_status[1] = Rule_Squad_Tactics("sg_mainBase_ravager1", g_mainBase_ravager_status[1], 0)
g_mainBase_ravager_status[2] = Rule_Squad_Tactics("sg_mainBase_ravager2", g_mainBase_ravager_status[2], 0)
g_mainBase_warrior_status[1] = Rule_Squad_Tactics("sg_mainBase_warrior1", g_mainBase_warrior_status[1], g_skill_warriors)
g_mainBase_warrior_status[2] = Rule_Squad_Tactics("sg_mainBase_warrior2", g_mainBase_warrior_status[2], g_skill_warriors)
-- North Base
g_northBase_talos_status[1] = Rule_Squad_Tactics("sg_northBase_talos1", g_northBase_talos_status[1], g_skill_talos)
g_northBase_talos_status[2] = Rule_Squad_Tactics("sg_northBase_talos2", g_northBase_talos_status[2], g_skill_talos)
g_northBase_raven_status[1] = Rule_Squad_Tactics("sg_northBase_raven1", g_northBase_raven_status[1], g_skill_raven)
g_northBase_raven_status [2] = Rule_Squad_Tactics("sg_northBase_raven2", g_northBase_raven_status[2], g_skill_raven)
-- North West Base
g_northWestBase_haemonculus_status[1] = Rule_Squad_Tactics("sg_northWestBase_haemonculus", g_northWestBase_haemonculus_status[1], g_skill_haemonculus)
g_northWestBase_wych_status[1] = Rule_Squad_Tactics("sg_northWestBase_wych", g_northWestBase_wych_status[1], g_skill_wych)
-- Patrol Squads:
g_centerBase_hellions_patrol_status[1] = Rule_Squad_Tactics("sg_centerBase_hellions_patrol", g_centerBase_hellions_patrol_status[1], 0)
g_northBase_warpBeast_patrol_status[1] = Rule_Squad_Tactics("sg_northBase_warpBeast_patrol", g_northBase_warpBeast_patrol_status[1], g_skill_warpbeasts)
g_northBase_mandrake_patrol_status[1] = Rule_Squad_Tactics("sg_northBase_mandrake_patrol", g_northBase_mandrake_patrol_status[1], 0)
g_southWestBase_warpbeast_patrol_status[1] = Rule_Squad_Tactics("sg_southWestBase_warpbeast_patrol", g_southWestBase_warpbeast_patrol_status[1], g_skill_warpbeasts)
-- Slaves to Repair & Soul Harvest
g_slave_status[1] = Rule_Squad_Tactics("sg_slave_1", g_slave_status[1], g_skill_slave)
g_slave_status[2] = Rule_Squad_Tactics("sg_slave_2", g_slave_status[2], g_skill_slave)
g_slave_status[3] = Rule_Squad_Tactics("sg_slave_3", g_slave_status[3], g_skill_slave)
g_slave_status[4] = Rule_Squad_Tactics("sg_slave_4", g_slave_status[4], g_skill_slave)
-- South East Base
g_southEastBase_scourge_status[1] = Rule_Squad_Tactics("sg_southEastBase_scourge", g_southEastBase_scourge_status[1], g_skill_southEastBase_scourge_jump)
g_southEastBase_mandrakes_status[1] = Rule_Squad_Tactics("sg_southEastBase_mandrakes", g_southEastBase_mandrakes_status[1], g_skill_mandrakes)
-- South West Base
g_southWestBase_wych_status[1] = Rule_Squad_Tactics("sg_southWestBase_wych", g_southWestBase_wych_status[1], g_skill_wych)
g_southWestBase_haemonculus_status[1] = Rule_Squad_Tactics("sg_southWestBase_haemonculus", g_southWestBase_haemonculus_status[1], g_skill_haemonculus)
g_southWestBase_raven_status[1] = Rule_Squad_Tactics("sg_southWestBase_raven", g_southWestBase_raven_status[1], g_skill_raven)
g_southWestBase_reaver_status[1] = Rule_Squad_Tactics("sg_southWestBase_reaver_1", g_southWestBase_reaver_status[1], 0)
g_southWestBase_reaver_status[2] = Rule_Squad_Tactics("sg_southWestBase_reaver_2", g_southWestBase_reaver_status[2], 0)
g_southWestBase_talos_status[1] = Rule_Squad_Tactics("sg_southWestBase_talos", g_southWestBase_talos_status[1], g_skill_talos)
-- Vect Support:
g_vectSupport_warrior_status[1] = Rule_Squad_Tactics("sg_vectSupport_warrior", g_vectSupport_warrior_status[1], g_skill_warriors)
g_vectSupport_warpBeast_status[1] = Rule_Squad_Tactics("sg_vectSupport_warpBeast", g_vectSupport_warpBeast_status[1], g_skill_warpbeasts)
g_vectSupport_reaver_status[1] = Rule_Squad_Tactics("sg_vectSupport_reaver", g_vectSupport_reaver_status[1], 0)
g_vectSupport_ravager_status[1] = Rule_Squad_Tactics("sg_vectSupport_ravager", g_vectSupport_ravager_status[1], 0)
-- Vect Base : Archon & Air Defending Ravens
g_vectBase_archon_status[1] = Rule_Squad_Tactics("sg_vectBase_archon", g_vectBase_archon_status[1], g_skill_archon)
g_vectBase_raven_status[1] = Rule_Squad_Tactics("sg_vectBase_raven1", g_vectBase_raven_status[1], g_skill_raven_airDefense)
g_vectBase_raven_status[2] = Rule_Squad_Tactics("sg_vectBase_raven2", g_vectBase_raven_status[2], g_skill_raven_airDefense)
-- West Base
g_westBase_scourge_status[1] = Rule_Squad_Tactics("sg_westBase_scourge", g_westBase_scourge_status[1], g_skill_westBase_scourge_jump)
g_westBase_warrior_status[1] = Rule_Squad_Tactics("sg_westBase_warrior", g_westBase_warrior_status[1], g_skill_warriors)
g_westBase_reaver_status[1] = Rule_Squad_Tactics("sg_westBase_reaver_1", g_westBase_reaver_status[1], 0)
g_westBase_reaver_status[2] = Rule_Squad_Tactics("sg_westBase_reaver_2", g_westBase_reaver_status[2], 0)
end
-- Decides if a squad should Attack, Use Skills, Reinforce, Retreat, or wait since still loading into a transport function Rule_Squad_Tactics(squad, squad_status, skill_id) -- ForEach Function: Check if a Player Owned Strategic Point, Relic or Crit Point is In Range of Squad for Capturing & Sets Attack Location to that point function Rule_Detect_Proximity_CapturePoints_Location(egroupid, itemindex, entityID) EGroup_Clear("building_target") EGroup_Add("building_target", EGroup_GetSpawnedEntityAt(egroupid,itemindex))
-- If Squad is in proximity of a Relic
if g_canCaptureRelic == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintRelic, false) == true
then
-- Attack towards the Relic
g_attack_target = EGroup_GetPosition("building_target")
return true
-- If Squad is in proximity of a Critical Point
elseif g_canCaptureCrit == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintCritPoint, false) == true
then
-- Attack towards the Critical Point
g_attack_target = EGroup_GetPosition("building_target")
return true
-- If Squad is in proximity of a Strategic Point
elseif g_canCaptureStrat == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintStratPoint, false) == true
then
-- Attack towards the Strategic Point
g_attack_target = EGroup_GetPosition("building_target")
return true
end
end
-- Make Sure Squad has members (otherwise this function is useless)
if SGroup_CountSpawned(squad) <= 0
then
return squad_status
end
-- if currently in Attack Mode...
if squad_status == g_squad_attacking
then
-- If not a vehicle, then check for Reinforce (based on squad size being less then X %)
if SGroup_IsVehicle(squad) == false and
Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
-- Reinforce
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
squad_status = g_squad_reinforcing
-- Check for & Attempt to use Skills
elseif skill_id > 0 and Rule_Squad_Skill(squad, skill_id) == true
then
-- Skill Fired
squad_status = g_squad_usingSkill
-- Check for Retreat (based on morale broken)
elseif g_retreating_enabled == true and
SGroup_IsMoraleBroken(squad,true) and
World_GetRand(0,10) > 5
then
-- Give Location To Retreat To
Command_SquadPos(g_Player2, squad, SCMD_Move, g_retreat_target)
squad_status = g_squad_retreating
-- Just Choose "Attack Target" & Attack Move if none of the above
else
-- Get the default Attack Targets For the AI Troops : Location of Player Base if it exists
if EGroup_Exists("eg_player_HQ") and
EGroup_Count("eg_player_HQ") > 0
then
g_attack_target = EGroup_GetPosition("eg_player_HQ")
else
g_attack_target = SGroup_GetPosition(Player_GetSquads(g_Player1))
end
-- Set Range for Target Tracking for Strategic Points:
range = 150
-- Override Attack Target for Locations of any Player Owned Relic, Critical or Strategic Points:
if EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_CapturePoints_Location)
then
-- Do Nothing... ForEach functions already did it
-- Override Attack Target for Locations of any World Owned Relic, Critical or Strategic Points:
elseif EGroup_Count("eg_world_points") > 0 and
EGroup_ForEach("eg_world_points", Rule_Detect_Proximity_CapturePoints_Location)
then
-- Do Nothing... ForEach functions already did it
end
-- Attack Move to the Chosen Attack Target (Either default or the location of the strategic pt)
Cmd_AttackMovePos(squad,g_attack_target)
end
-- if currently in retreat mode
elseif squad_status == g_squad_retreating
then
-- Check for Reinforce (based on squad size being less then X %)
if Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
squad_status = g_squad_retreating
-- else set to attack mode if the morale is restored
elseif SGroup_IsMoraleBroken(squad,true) == false
then
squad_status = g_squad_attacking
Cmd_AttackMovePos(squad,g_attack_target)
end
-- Buy Transports another cycle or two to finish loading, before they attack (loading->produced->attacking)
elseif squad_status == g_squad_loading
then
squad_status = g_squad_produced
-- Handles Patrolling Squads: Try & Use Skill, Otherwise do nothing -- Patrol Functions Handle Movement & Reinforcing
elseif squad_status == g_squad_patrolling
then
if skill_id > 0 and Rule_Squad_Skill(squad, skill_id) == true
then
Rule_Squad_Skill(squad, skill_id)
end
-- Leave in Patrol State
squad_status = g_squad_patrolling
-- Prep for Squad Jumping (Reinforcing & Moving towards jump zone)
elseif squad_status == g_squad_jump_prep
then
-- East Base Sends it hellions to Jump Location 1
if skill_id == g_skill_eastBase_hellion_jump
then
-- Check if arrived
if Prox_AllSquadsNearMarker(squad, "mkr_AI_jumpLocation1")
then
-- Check if need to reinforce
if Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
else
squad_status = g_squad_jump_ready
end
else
Cmd_AttackMoveMarker(squad, "mkr_AI_jumpLocation1")
end
-- West Base Sends Scourge to Jump Location 2
elseif skill_id == g_skill_westBase_scourge_jump
then
-- Check if arrived
if Prox_AllSquadsNearMarker(squad, "mkr_AI_jumpLocation2")
then
-- Check if need to reinforce
if Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
else
squad_status = g_squad_jump_ready
end
else
Cmd_AttackMoveMarker(squad, "mkr_AI_jumpLocation2")
end
-- South East Base Sends it Scourge to Jump Location 3
elseif skill_id == g_skill_southEastBase_scourge_jump
then
-- Check if arrived
if Prox_AllSquadsNearMarker(squad, "mkr_AI_jumpLocation3")
then
-- Check if need to reinforce
if Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
else
squad_status = g_squad_jump_ready
end
else
Cmd_AttackMoveMarker(squad, "mkr_AI_jumpLocation3")
end
end
-- Actual Squad Jumping
elseif squad_status == g_squad_jump_ready
then
-- East Base Hellions: if morale is broken -- retreat and heal up
if SGroup_IsMoraleBroken(squad,true) and
skill_id == g_skill_eastBase_hellion_jump
then
Cmd_JumpToMarker(squad, "mkr_AI_landLocation1")
squad_status = g_squad_jump_prep
-- West Base Scourge: if morale is broken -- retreat and heal up
elseif SGroup_IsMoraleBroken(squad,true) and
skill_id == g_skill_westBase_scourge_jump
then
Cmd_JumpToMarker(squad, "mkr_AI_landLocation2")
squad_status = g_squad_jump_prep
-- South East Base Scourge: if morale is broken -- retreat and heal up
elseif SGroup_IsMoraleBroken(squad,true) and
skill_id == g_skill_southEastBase_scourge_jump
then
Cmd_JumpToMarker(squad, "mkr_AI_landLocation3")
squad_status = g_squad_jump_prep
--Other Jump to Next Location & Attack from the New Direction
else
jumpLoc = World_GetRand(1, 10)
Cmd_JumpToMarker(squad, "mkr_AI_landLocation"..jumpLoc)
squad_status = g_squad_jump_attack
end
-- Check for Jumping
elseif squad_status == g_squad_jump_attack
then
-- Try & use Skills, or just pick target & attack
if skill_id > 0 and Rule_Squad_Skill(squad, skill_id) == true
then
squad_status = g_squad_jump_checkjump
else
Cmd_AttackMovePos(squad,g_attack_target)
squad_status = g_squad_jump_checkjump
end
-- Check if need to jump (also controls reinforcing)
elseif squad_status == g_squad_jump_checkjump
then
-- Only jump to a new location if under attack at current location
if SGroup_IsUnderAttack(squad, true)
then
squad_status = g_squad_jump_ready
end
-- Check if need to reinforce
if Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and
SGroup_GetAvgLoadout(squad) < g_reinforce_percent
then
Command_Squad(g_Player2, squad, SCMD_ReinforceTrooper)
end
-- Set Back to Attack Mode since everything else is done
-- Includes g_squad_status == g_squad_reinforcing & g_squad_usingSkill
else
squad_status = g_squad_attacking
end
-- return the new squad status
return squad_status
end
-- Squad tries to use a variety of skills against Player Squads based on skillID passed in
function Rule_Squad_Skill(squad, skillID)
-- ForEach Function: Checks if a Enemy Squad (Non-Vehicle) is In Range of Your Squad for Skill Targeting
function Rule_Detect_Proximity(sgroupid, itemindex, squadID)
SGroup_Clear("skill_target")
SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
if SGroup_IsVehicle("skill_target") == false and
Prox_SquadsInProximityOfSquads(squad, "skill_target", range, true)
then
return true
end
end
-- ForEach Function: Check if a Enemy Vehicle is In Range of Your Squad for Skill Targeting
function Rule_Detect_Proximity_Vehicles(sgroupid, itemindex, squadID)
SGroup_Clear("skill_target")
SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
if SGroup_IsVehicle("skill_target") and
Prox_SquadsInProximityOfSquads(squad, "skill_target", range, true)
then
return true
end
end
-- ForEach Function: Check if a Enemy Building is In Range of Your Squad for Skill Targeting
function Rule_Detect_Proximity_Buildings(egroupid, itemindex, entityID)
EGroup_Clear("building_target")
EGroup_Add("building_target", EGroup_GetSpawnedEntityAt(egroupid,itemindex))
-- Avoid Basic Strategic Point, Relic, Critical Point
local blueprintTable = Util_MakeBlueprintTable("relic_struct", "strategic_point_flag", "strategic_objective_struct")
if Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", blueprintTable, false) == false
then
return true
end
end
-- ForEach Function: Check if a Enemy Vehicle is In Range of Your Squad for Skill Targeting (& Not in Player Base)
function Rule_Detect_Proximity_Vehicles_NotByPlayerBase(sgroupid, itemindex, squadID)
SGroup_Clear("skill_target")
SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
if SGroup_IsVehicle("skill_target") and
Prox_AllSquadsNearMarker("skill_target", "mkr_hq_4") == false and
Prox_SquadsInProximityOfSquads(squad, "skill_target", range, true)
then
return true
end
end
-- ForEach Function: Check if a Player Owned Strategic Point, Relic or Crit Point is In Range of Squad for Capturing
function Rule_Detect_Proximity_CapturePoints(egroupid, itemindex, entityID)
EGroup_Clear("building_target")
EGroup_Add("building_target", EGroup_GetSpawnedEntityAt(egroupid,itemindex))
-- If Squad is in proximity of a Non-DE Owned Relic w/ No LP on it
if g_canCaptureRelic == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintRelic, true) == true and
EGroup_HasStrategicPointWithStructure("building_target") == false
then
-- Try to Capture the Relic Point
Cmd_Capture(squad, "building_target")
return true
-- If Squad is in proximity of a Non-DE Owned Critical Point
elseif g_canCaptureCrit == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintCritPoint, true) == true
then
-- Try to Capture the Critical Point
Cmd_Capture(squad, "building_target")
return true
-- If Squad is in proximity of a Non-DE Owned Strategic Point w/ No LP on it
elseif g_canCaptureStrat == true and
Prox_SquadsInProximityOfEntities(squad, "building_target", range, true) and
EGroup_ContainsBlueprints("building_target", g_blueprintStratPoint, true) == true and
EGroup_HasStrategicPointWithStructure("building_target") == false
then
-- Try to Capture the Strategic Point
Cmd_Capture(squad, "building_target")
return true
end
end
-- Haemonculus Skills
if skillID == g_skill_haemonculus
then
range = 35
-- Stinger : Causes DoT on Enemy Infantry Squad
if SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySGroup(squad, "dark_eldar_stinger", "skill_target")
then
return true
-- Torture Amp : Slows Movement / Attack Speed on Enemy Infantry
elseif SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySelf(squad, "dark_eldar_torture_amp")
then
return true
-- Try & Cast Soul Destruction Ability if enemy troops in the area (SKill won't actually fire unless there are souls in the area)
elseif SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Squad_SoulDestruction(SGroup_GetSpawnedSquadAt(squad,1))
-- Return False, since it might not have fired off
return false
end
-- Warrior Terrorfex Grenades
elseif skillID == g_skill_warriors
then
range = 35
-- Terrorfex Grenades on Enemy Infantry Squads (Needs Sybarite Leader)
if SGroup_HasLeader(squad, true) and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySGroup(squad, "dark_eldar_terrorfex_grenade", "skill_target")
then
return true
-- Prioritize Infantry for attacks:
elseif SGroup_IsMoraleBroken(squad,true) == false and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Cmd_AttackSGroup(squad, "skill_target")
return true
-- If Morale Not Broken -- Try & Capture Player LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_CapturePoints) and
EGroup_Count("building_target") > 0
then
return true
-- If Morale Not Broken -- Try & Capture World Owned LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_Count("eg_world_points") > 0 and
EGroup_ForEach("eg_world_points", Rule_Detect_Proximity_CapturePoints)
then
return true
end
-- Mandrakes -- Capturing & Infantry Targeting
elseif skillID == g_skill_mandrakes
then
range = 35
-- Prioritize Infantry for attacks:
if SGroup_IsMoraleBroken(squad,true) == false and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Cmd_AttackSGroup(squad, "skill_target")
return true
-- If Morale Not Broken -- Try & Capture Player LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_CapturePoints) and
EGroup_Count("building_target") > 0
then
return true
-- If Morale Not Broken -- Try & Capture World Owned LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_Count("eg_world_points") > 0 and
EGroup_ForEach("eg_world_points", Rule_Detect_Proximity_CapturePoints)
then
return true
end
-- Warp Beast Tame Skill (Restores Morale)
elseif skillID == g_skill_warpbeasts
then
-- Tame Warp Beasts (Needs Beastmaster Leader)
if SGroup_HasLeader(squad, true) and
SGroup_IsMoraleBroken(squad,true) and
Cmd_CastAbilitySelf(squad, "dark_eldar_tame_warp_beasts")
then
return true
-- Give Back Leader if has been killed
elseif SGroup_HasLeader(squad, true) == false
then
Command_Squad(g_Player2, squad, SCMD_ReinforceLeader)
--SGroup_AddLeaders(squad)
return true
end
-- Wych Skill
elseif skillID == g_skill_wych
then
-- Combat Drugs : Increase Movement / Attack Speed (Needs Wych Succubus Leader)
if SGroup_HasLeader(squad, true) and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySelf(squad, "dark_eldar_combat_drugs")
then
return true
-- Prioritize Infantry for attacks:
elseif SGroup_IsMoraleBroken(squad,true) == false and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Cmd_AttackSGroup(squad, "skill_target")
return true
-- If Morale Not Broken -- Try & Capture Player LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_CapturePoints) and
EGroup_Count("building_target") > 0
then
return true
-- If Morale Not Broken -- Try & Capture World Owned LPs
elseif SGroup_IsMoraleBroken(squad,true) == false and
EGroup_Count("eg_world_points") > 0 and
EGroup_ForEach("eg_world_points", Rule_Detect_Proximity_CapturePoints)
then
return true
end
-- Talos : Wildfire -- Fires Attack in different direction
elseif skillID == g_skill_talos
then
range = 15
-- Use Wildfire since nearby Infantry
if SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySelf(squad, "dark_eldar_wildfire")
then
return true
-- Use Wildfire since nearby Vehicles
elseif SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity_Vehicles) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySelf(squad, "dark_eldar_wildfire")
then
return true
-- Use Wildfire since nearby Buildings
elseif EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_Buildings) and
EGroup_Count("building_target") > 0 and
Cmd_CastAbilitySelf(squad, "dark_eldar_wildfire")
then
return true
-- Prioritize Infantry for attacks:
elseif SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Cmd_AttackSGroup(squad, "skill_target")
return true
end
-- Raider : Jump on Top of Enemy Troops
elseif skillID == g_skill_raider
then
range = 100
-- Find an Enemy Infantry Squad in Range...
if SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
-- Jump in Raider on top of the infantry squad
raiderattack_pos = Squad_GetPosition(SGroup_GetSpawnedSquadAt(SGroup_FromName("skill_target"), 1))
Cmd_JumpToPos(squad, raiderattack_pos)
return true
end
-- Tortured Slave : Repair Vehciles
elseif skillID == g_skill_slave
then
range = 50
-- Find an Friendly Vehicle Squad in Range...
if SGroup_ForEach(Player_GetSquads(g_Player2), Rule_Detect_Proximity_Vehicles) and
SGroup_Count("skill_target") > 0 and
SGroup_GetAvgHealth("skill_target") < 1
then
-- Order Slave to Repair
Command_SquadSquad(g_Player2, squad, SCMD_Repair, "skill_target")
return true
-- No One to repair so try soul harvesting
else
Squad_SoulHarvest(SGroup_GetSpawnedSquadAt(squad,1))
return true
end
-- Raven (Air Unit): Short Circuit Ability (Disables Vehicles / Buildings)
elseif skillID == g_skill_raven
then
range = 35
-- Use Short Circuit on Vehicles
if SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity_Vehicles) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySGroup(squad, "dark_eldar_short_circuit", "skill_target")
then
return true
-- Use Short Circuit on Buildings (useless on most of them -- but maybe will get lucky & hit turret or building w/ guns)
elseif EGroup_ForEach(Player_GetEntities(g_Player1), Rule_Detect_Proximity_Buildings) and
EGroup_Count("building_target") > 0 and
Cmd_CastAbilitySGroupE(squad, "dark_eldar_short_circuit", "building_target")
then
return true
end
-- Raven (Air Unit Defense): Short Circuit Ability & Air Unit Targetting Only
elseif skillID == g_skill_raven_airDefense
then
range = 1000
-- Get all the Player Air Units
SGroup_Clear("sg_playerAirUnits")
Util_GetSquadsByBP(SGroup_GetName(Player_GetSquads(g_Player1)), "sg_playerAirUnits", g_AirUnit_blueprint)
-- If You Found an Player Air Unit outside of the players base
if SGroup_Count("sg_playerAirUnits") > 0 and
SGroup_ForEach("sg_playerAirUnits", Rule_Detect_Proximity_Vehicles_NotByPlayerBase) and
SGroup_Count("skill_target") > 0
then
-- Try to Cast Short Circuit on the Air Unit & Attack it if can't cast skill
if Cmd_CastAbilitySGroup(squad, "dark_eldar_short_circuit", "skill_target") == false
then
-- target it
Cmd_AttackSGroup(squad, "skill_target")
return true
end
-- Else Return to Your own Base
else
Cmd_MoveToMarker(squad, "mkr_skimmerShop_11")
return true
end
--Always return true, otherwise unit will attack normal units
return true
-- Archon Commander
elseif skillID == g_skill_archon
then
local blueprintTable = Util_MakeBlueprintTable("dark_eldar_squad_archon")
range = 40
-- Crucible on Enemy Infantry Squads (Squad needs Archon)
if SGroup_ContainsBlueprints(squad, blueprintTable, true) and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySGroup(squad, "dark_eldar_crucible", "skill_target")
then
return true
-- Animus Vitae on Enemy Infantry Squads (Squad needs Archon)
elseif SGroup_ContainsBlueprints(squad, blueprintTable, true) and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0 and
Cmd_CastAbilitySGroup(squad, "dark_eldar_animus_vitae", "skill_target")
then
return true
-- Add the Incubi -- Squad Contains the Archon & still has room to reinforce incubi
elseif SGroup_ContainsBlueprints(squad, blueprintTable, true) and
-- Squad_GetMax(SGroup_GetSpawnedSquadAt(squad,1)) > Squad_Count(SGroup_GetSpawnedSquadAt(squad,1)) and SGroup_CountLeaders(squad) < g_number_incubi then Cmd_ReinforceLeader(squad,1) return true
-- Else Target Nearby Infantry
elseif SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Detect_Proximity) and
SGroup_Count("skill_target") > 0
then
Cmd_AttackSGroup(squad, "skill_target")
return true
end
end
end
-- END OF ALL " SQUAD AI & TACTICS " RULES
-- LEVEL FLOW -- Rule_PrisonerCage_FreeCage : Check For Destroyed Cages so know to free the prisoner from it (& Give Resources) -- Rule_PrisonerCage_BaseActivation : Controls Attacks as the player nears the prisoner cages & small bases -- Rule_RevealBaseWarning() : Warn the Player about the South East & West Bases & Reveal Fog of War on them -- Rule_SlaveCaravel_Attack : Slave Caravels use their Soul Shock Skill
-- Check For Destroyed Cages so know to free the prisoner from it (& Give Resources) function Rule_PrisonerCage_FreeCage() -- Loop Through All The Prisoner Cages for i =1,10 do -- If Cage is Destroyed (& Yet to Free this prisoner) if EGroup_Count("eg_prisonerCage_"..i) == 0 and g_array_prisonerCage_freed[i] == false then -- Free the Prisoner & give leader if possible Util_CreateSquadsAtMarkerEx(g_Player1, "sg_player_freePrisoner"..i,g_array_prisonerCage_prisoner[i], "mkr_prisonerCage_"..i, 1,20) SGroup_AddLeaders("sg_player_freePrisoner"..i) g_array_prisonerCage_freed[i] = true
-- Give the Player Resources (RT_Requisition, RT_Power) for Freeing Prisoner
if g_raceName == "necron_race"
then
-- If Necron, Only Give Power
Player_AddResource(g_Player1, RT_Power, g_amountPowerToGiveNecron_PerCage)
else
-- Otherwise give both
Player_AddResource(g_Player1, RT_Requisition, g_amountRequisitionToGivePlayer_PerCage)
Player_AddResource(g_Player1, RT_Power, g_amountPowerToGivePlayer_PerCage)
end
-- Give the Orks Some Population
if g_raceName == "ork_race"
then
Player_AddResource(g_Player1, RT_Pop, 10)
end
-- Increment the Number of Prisoners Freed
g_prisonerCage_numFreed = g_prisonerCage_numFreed + 1
end
-- if the cage is still alive, reveal fog of war around it
if EGroup_Count("eg_prisonerCage_"..i) == 1
then
FOW_RevealMarker("mkr_prisonerCage_"..i, 10)
end
end
-- First Prisoner Freed...Play IE
if g_prisonerCage_numFreed == 1 and
g_ie_FirstCage_Played == false
then
g_ie_FirstCage_Played = true
-- Play IE for first cage freed
Util_StartIntel(g_ie_FirstCage_Array[g_intelEvent_raceId])
end
-- Most of the Prisoners Freed...Play IE to Attack Base
if g_prisonerCage_numFreed == 5 and
g_ie_FreeMostTroops_Played == false
then
g_ie_FreeMostTroops_Played = true
-- Play IE for most troops freed
Util_StartIntel(g_ie_FreeMostTroops_Array[g_intelEvent_raceId])
end
-- If ALL Prisoners have been freed...Remove the Rule
if g_prisonerCage_numFreed >= 10
then
Rule_Remove(Rule_PrisonerCage_FreeCage)
end
end
-- Check for Activation of Base function Rule_PrisonerCage_BaseActivation() -- Get the rough position of the Players Troops (somewhere for the units to attack move to) g_attack_target = SGroup_GetPosition(Player_GetSquads(g_Player1))
-- If the Player is nearing Prisoner Cage 10 (First Cage)
if g_prisonerCage10_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_prisonerCage_10")
then
-- Activate the Cage (Troops Sent)
g_prisonerCage10_activated = true
-- order the initial troops to attack player
if SGroup_Count("sg_prisonerCage_firstTroops") > 0
then
Cmd_AttackMovePos("sg_prisonerCage_firstTroops", g_attack_target)
end
end
-- If the Player is nearing First group of defence troops (Right Past First Cage)
if g_firstTroops_sent == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_sendFirstTroops")
then
-- First Defense Troops Sent
g_firstTroops_sent = true
-- Play IE for Dark Eldar Attack
Util_StartIntel(g_ie_EarlyDarkEldarCharge_Array[g_intelEvent_raceId])
-- order the initial troops to attack player
if SGroup_Count("sg_firstTroops") > 0
then
Cmd_AttackMovePos("sg_firstTroops", g_attack_target)
end
end
-- If the Player is nearing Prisoner Cage 1/2
if g_hallOfBlood14_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_hallOfBlood14")
then
-- Activate Hall of Blood by Prisoner Cage 1/2
g_hallOfBlood14_activated = true
-- order the initial troops to attack player
if SGroup_Count("sg_hallOfBlood14_firstTroops") > 0
then
Cmd_AttackMovePos("sg_hallOfBlood14_firstTroops", g_attack_target)
end
-- Jump in Scourge Troops
if SGroup_Count("sg_prisoner_scourge_jump_1") > 0 and
SGroup_Count("sg_prisoner_scourge_jump_2") > 0
then
Cmd_JumpToMarker("sg_prisoner_scourge_jump_1","mkr_prisoner_scourge_jump_1")
Cmd_JumpToMarker("sg_prisoner_scourge_jump_2","mkr_prisoner_scourge_jump_2")
end
end
-- If the Player is heading towards Prisoner Cage 3
if g_hallOfBlood15_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_hallOfBlood15")
then
-- Activate Hall of Blood & Skimmer Shop by Prisoner Cage 3
g_hallOfBlood15_activated = true
g_skimmerShop10_activated = true
-- order the initial troops to attack player
if SGroup_Count("sg_hallOfBlood15_firstTroops") > 0
then
Cmd_AttackMovePos("sg_hallOfBlood15_firstTroops", g_attack_target)
end
if SGroup_Count("sg_skimmer10_firstTroops") > 0
then
Cmd_AttackMovePos("sg_skimmer10_firstTroops", g_attack_target)
end
end
-- If the Player is nearing Prisoner Cage 3
if g_prisonerCage3_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_prisonerCage_3")
then
-- Activate the Cage (Troops jumped In)
g_prisonerCage3_activated = true
-- Jump in Scourge Squads
if SGroup_Count("sg_prisoner_scourge_jump_3") > 0 and
SGroup_Count("sg_prisoner_scourge_jump_4") > 0
then
Cmd_JumpToMarker("sg_prisoner_scourge_jump_3","mkr_prisoner_scourge_jump_3")
Cmd_JumpToMarker("sg_prisoner_scourge_jump_4","mkr_prisoner_scourge_jump_4")
end
end
-- If the Player is nearing Raider Ambush Location (Right Past Prisoner Cage 3)
if g_patrol_activated_SouthWest == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_hallOfBlood13")
then
-- Activate Patrol from SouthWest Base
g_patrol_activated_SouthWest = true
-- Play IE for First Raider Attack
Util_StartIntel(EVENTS.IE_FirstRaiderAttack)
-- Jump in the Scourge Squads
if SGroup_Count("sg_prisoner_scourge_jump_5") > 0 and
SGroup_Count("sg_prisoner_scourge_jump_6") > 0
then
Cmd_JumpToMarker("sg_prisoner_scourge_jump_5","mkr_prisoner_scourge_jump_5")
Cmd_JumpToMarker("sg_prisoner_scourge_jump_6","mkr_prisoner_scourge_jump_6")
end
-- Jump in the Raiders w/ Troops
if SGroup_Count("sg_prisoner_raider_jump_1") > 0 and
SGroup_Count("sg_prisoner_raider_jump_2") > 0
then
Cmd_JumpToMarker("sg_prisoner_raider_jump_1","mkr_prisoner_raider_jump_1")
Cmd_JumpToMarker("sg_prisoner_raider_jump_2","mkr_prisoner_raider_jump_2")
end
end
-- If the player has just past the First Raider Ambush
if g_ie_baseRevealed == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_revealBase_warning")
then
-- Play IE for Dark Eldar Attack
Util_StartIntel(g_ie_ShowTwoBases_Array[g_intelEvent_raceId])
-- Enable FOW Vision between Patrols & Player1
World_EnablePlayerToPlayerFOW(g_Player1, g_Player3, false)
-- Ping the Base Locations
Ping_Marker("mkr_activate_southEast_base",false,attack)
Ping_Marker("mkr_activate_southWest_base",false,attack)
-- Warn the Player about the South East & West Bases & Reveal Fog of War on them
Rule_AddInterval(Rule_RevealBaseWarning,5)
g_ie_baseRevealed = true
end
-- If the Player is nearing Prisoner Cage 4
if g_prisonerCage4_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_prisonerCage4")
then
-- Activate the Cage (Troops jumped In)
g_prisonerCage4_activated = true
-- Jump in the Hellions
for i =1,3 do
if SGroup_Count("sg_prisoner_hellion_jump_"..i) > 0
then
Cmd_JumpToMarker("sg_prisoner_hellion_jump_"..i,"mkr_prisoner_hellion_jump_"..i)
end
end
-- Jump in the Raiders w/ Warriors
if SGroup_Count("sg_prisoner_raider_jump_3") > 0
then
Cmd_JumpToMarker("sg_prisoner_raider_jump_3","mkr_prisoner_raider_jump_3")
end
if SGroup_Count("sg_prisoner_raider_jump_4") > 0
then
Cmd_JumpToMarker("sg_prisoner_raider_jump_4","mkr_prisoner_raider_jump_4")
end
end
-- If the Player is nearing Prisoner Cage 5
if g_hallOfBlood10_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_hallOfBlood10") and
SGroup_Count("sg_hallOfBlood10_firstTroops") >0
then
-- Activate Hall of Blood by Prisoner Cage 5
g_hallOfBlood10_activated = true
-- order the initial troops to attack player
Cmd_AttackMovePos("sg_hallOfBlood10_firstTroops", g_attack_target)
end
-- If the Player is nearing Prisoner Cage 6
if g_prisonerCage6_activated == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_prisonerCage6")
then
g_prisonerCage6_activated = true
-- Cast Combat Drugs on the Warriors... while Warriors attack
if SGroup_Count("sg_prisoner_wych_1") > 0 and
SGroup_Count("sg_prisoner_warrior_1") > 0
then
Cmd_CastAbilitySGroup("sg_prisoner_wych_1", "dark_eldar_combat_drugs", "sg_prisoner_warrior_1")
Cmd_AttackMovePos("sg_prisoner_warrior_1", g_attack_target)
end
if SGroup_Count("sg_prisoner_wych_2") > 0 and
SGroup_Count("sg_prisoner_warrior_2") > 0
then
Cmd_CastAbilitySGroup("sg_prisoner_wych_2", "dark_eldar_combat_drugs", "sg_prisoner_warrior_2")
Cmd_AttackMovePos("sg_prisoner_warrior_2", g_attack_target)
end
end
-- If the Player is nearing Center Base from the West Side
if g_base_activated_Center == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_centerBase_West")
then
-- Activate Center Base by Prisoner Cage 7-9
g_base_activated_Center = true
end
-- If the Player is nearing Center Base from the East Side
if g_base_activated_Center == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_centerBase_East")
then
-- Activate Center Base by Prisoner Cage 7-9
g_base_activated_Center = true
end
-- Remove the Rule once all the bases have been activated...
if g_firstTroops_sent == true and
g_prisonerCage3_activated == true and
g_prisonerCage4_activated == true and
g_prisonerCage6_activated == true and
g_prisonerCage10_activated == true and
g_hallOfBlood10_activated == true and
g_hallOfBlood14_activated == true and
g_hallOfBlood15_activated == true and
g_base_activated_Center == true and
g_ie_baseRevealed == true
then
Rule_Remove(Rule_PrisonerCage_BaseActivation)
end
end
-- Warn the Player about the South East & West Bases & Reveal Fog of War on them function Rule_RevealBaseWarning() -- Reveal the southEast & West Bases FOW_RevealMarker("mkr_activate_southEast_base", 10) FOW_RevealMarker("mkr_activate_southWest_base", 10) end
-- Slave Caravels use their Soul Shock Skill function Rule_SlaveCaravel_Attack() for i = 9,20 do -- Check if player is in range & slave caravel is still alive if EGroup_Count("eg_slaveCaravel_"..i) == 1 and Player_AreSquadsNearMarker(g_Player1, "mkr_slaveCaravel_"..i) then -- Attempt to Fire Skill : Skill wont fire if not recharged Command_EntityAbilitySelf(g_Player2,EGroup_GetSpawnedEntityAt(EGroup_FromName("eg_slaveCaravel_"..i), 1), "dark_eldar_soul_shock") end end
-- If All Slave Caravels are destroyed -- Remove Rule
if EGroup_Count("eg_slaveCaravel_9") == 0 and
EGroup_Count("eg_slaveCaravel_10") == 0 and
EGroup_Count("eg_slaveCaravel_11") == 0 and
EGroup_Count("eg_slaveCaravel_12") == 0 and
EGroup_Count("eg_slaveCaravel_13") == 0 and
EGroup_Count("eg_slaveCaravel_14") == 0 and
EGroup_Count("eg_slaveCaravel_15") == 0 and
EGroup_Count("eg_slaveCaravel_16") == 0 and
EGroup_Count("eg_slaveCaravel_17") == 0 and
EGroup_Count("eg_slaveCaravel_18") == 0 and
EGroup_Count("eg_slaveCaravel_19") == 0 and
EGroup_Count("eg_slaveCaravel_20") == 0
then
Rule_Remove(Rule_SlaveCaravel_Attack)
end
end
-- Control Vect Attacks if ready for them function Rule_VectAttack() --if vect is at full life (or if both Repair HQs are Destroyed) if SGroup_Count("sg_Vect_Objective") > 0 and (SGroup_GetAvgHealth("sg_Vect_Objective") == 1.0 or (EGroup_Count("eg_hq_1") == 0 and EGroup_Count("eg_hq_8") == 0)) then -- Share FOW Vision with Vect World_EnablePlayerToPlayerFOW(g_Player1, g_Player4, false)
-- PRODUCE SUPPORT SQUADS AND ORDER ATTACK
-- Produce Some Support Warriors : If the Warrior SGroup is Empty & wap beasts not yet activated
if SGroup_Count("sg_vectSupport_warrior") == 0 and
g_vectSupport_warpBeast == false and
Rule_Produce_Warrior("sg_vectSupport_warrior", "eg_hallOfBlood_3", "mkr_hallOfBlood_3")
then
-- Reset Status (in case died while retreating etc...)
g_vectSupport_warrior_status[1] = g_squad_produced
-- Produce Some Support Warp Beasts : If the Warp Beasts SGroup is Empty
elseif g_vectSupport_warpBeast == true and
SGroup_Count("sg_vectSupport_warpBeast") == 0 and
Rule_Produce_WarpBeast("sg_vectSupport_warpBeast", "eg_hallOfBlood_3", "mkr_hallOfBlood_3")
then
-- Reset Status (in case died while retreating etc...)
g_vectSupport_warpBeast_status[1] = g_squad_produced
end
-- Produce Some Support Reavers : If the Reaver SGroup is Empty & ravagers not yet activated
if SGroup_Count("sg_vectSupport_reaver") == 0 and
Rule_Produce_Reaver("sg_vectSupport_reaver", "eg_skimmerShop_3", "mkr_skimmerShop_3") and
g_vectSupport_ravager == false
then
-- Reset Status (in case died while retreating etc...)
g_vectSupport_reaver_status[1] = g_squad_produced
-- Produce Some Support Ravagers : If the Ravager SGroup is Empty
elseif g_vectSupport_ravager == true and
SGroup_Count("sg_vectSupport_ravager") == 0 and
Rule_Produce_Ravager_FullyUpgraded("sg_vectSupport_ravager", "eg_skimmerShop_3", "mkr_skimmerShop_3")
then
-- Reset Status (in case died while retreating etc...)
g_vectSupport_ravager_status[1] = g_squad_produced
end
--Order Vect to attack the player
Cmd_AttackMovePos("sg_Vect_Objective", g_attack_target)
-- Pick Vects Attack Taunt & Play IE
attack_Taunt = World_GetRand(1,3)
Util_StartIntel(g_ie_VectRandomAttack_Array[attack_Taunt])
-- Subtract 10% from his retreat damage number (EX: 99% to 89%)
g_vect_retreat_damage = g_vect_retreat_damage - 0.10
-- So Retreat Damage is Always over 50%
if g_vect_retreat_damage < 0.5
then
g_vect_retreat_damage = 0.5
end
-- Confirm Rule was removed in time
Rule_Remove(Rule_VectAttack)
-- Add rule to check if Vect has been hurt
Rule_AddInterval(Rule_Check_For_Vect_Damage,5)
-- Vect is Still Wounded...
else
--Taunt Player (Since Not Attacking)
Util_StartIntel(EVENTS.IE_Taunt_Four)
-- make sure he is in his marker area for next attack
Cmd_MoveToMarker("sg_Vect_Objective", "mkr_vect_objective")
-- task some slaves to fix him (slaves from main base)
if SGroup_Count("sg_vectRepair") > 0
then
Command_SquadSquad(g_Player4, "sg_vectRepair", SCMD_Repair, "sg_Vect_Objective")
end
-- task some slaves to fix him (slaves from hq next to vect)
if SGroup_Count("sg_vectRepair_2") > 0
then
Command_SquadSquad(g_Player4, "sg_vectRepair_2", SCMD_Repair, "sg_Vect_Objective")
end
-- Replace Slaves from Main Base HQ
if SGroup_Count("sg_vectRepair") == 0 and
EGroup_Count("eg_hq_1") == 1
then
Util_CreateSquadsAtMarker(g_Player4, "sg_vectRepair", "dark_eldar_squad_slave", "mkr_hq_1", 1)
Command_SquadSquad(g_Player4, "sg_vectRepair", SCMD_Repair, "sg_Vect_Objective")
end
-- Replace Slaves from Backup Repair HQ
if SGroup_Count("sg_vectRepair_2") == 0 and
EGroup_Count("eg_hq_8") == 1
then
Util_CreateSquadsAtMarker(g_Player4, "sg_vectRepair_2", "dark_eldar_squad_slave", "mkr_hq_8", 1)
Command_SquadSquad(g_Player4, "sg_vectRepair_2", SCMD_Repair, "sg_Vect_Objective")
end
end
end
--Check if Vect is Damaged enough -- retreat if so function Rule_Check_For_Vect_Damage() local vect_health = SGroup_GetAvgHealth("sg_Vect_Objective")
-- If hurt enough to retreat
if vect_health <= g_vect_retreat_damage
then
-- Pick Vects Attack Taunt & Play IE
retreat_Taunt = World_GetRand(1,4)
Util_StartIntel(g_ie_VectRandomFlee_Array[retreat_Taunt])
-- Stop Sharing FOW Vision with Vect
World_EnablePlayerToPlayerFOW(g_Player1, g_Player4, true)
-- Use Skill To Cover Escape & retreat
Cmd_CastAbilitySelf("sg_Vect_Objective", "dark_eldar_darklance_sweep")
Cmd_MoveToMarker("sg_Vect_Objective", "mkr_vect_objective")
-- task some slaves to fix him (slaves from main hq)
if SGroup_Count("sg_vectRepair") > 0
then
Command_SquadSquad(g_Player4, "sg_vectRepair", SCMD_Repair, "sg_Vect_Objective")
end
-- task some slaves to fix him (slaves from hq next to vect)
if SGroup_Count("sg_vectRepair_2") > 0
then
Command_SquadSquad(g_Player4, "sg_vectRepair_2", SCMD_Repair, "sg_Vect_Objective")
end
if SGroup_Count("sg_vectRepair") == 0 and
EGroup_Count("eg_hq_1") == 1
then
Util_CreateSquadsAtMarker(g_Player4, "sg_vectRepair", "dark_eldar_squad_slave", "mkr_hq_1", 1)
Command_SquadSquad(g_Player4, "sg_vectRepair", SCMD_Repair, "sg_Vect_Objective")
end
-- Replace Slaves from Backup Repair HQ
if SGroup_Count("sg_vectRepair_2") == 0 and
EGroup_Count("eg_hq_8") == 1
then
Util_CreateSquadsAtMarker(g_Player4, "sg_vectRepair_2", "dark_eldar_squad_slave", "mkr_hq_8", 1)
Command_SquadSquad(g_Player4, "sg_vectRepair_2", SCMD_Repair, "sg_Vect_Objective")
end
--Prepare for Next Attack Attempt (Time Changes based on tech tiers)
Rule_AddInterval(Rule_VectAttack, g_timer_vectAttack)
Rule_Remove(Rule_Check_For_Vect_Damage)
end
end
-- ForEach Function: Checks if a Enemy Squad is under attack for soul powers function Rule_Check_Attack(sgroupid, itemindex, squadID) SGroup_Clear("skill_target") SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
if SGroup_IsVehicle("skill_target") == false and
SGroup_IsUnderAttack("skill_target",true)
then
return true
end
end
-- ForEach Function: Check if a Enemy Vehicle is under attack for soul powers function Rule_Check_Attack_Vehicles(sgroupid, itemindex, squadID) SGroup_Clear("skill_target") SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
if SGroup_IsVehicle("skill_target") and
SGroup_IsUnderAttack("skill_target",true)
then
return true
end
end
-- ForEach Function: Check if a Enemy Building is under attack for soul powers function Rule_Check_Attack_Buildings(egroupid, itemindex, entityID) EGroup_Clear("building_target") EGroup_Add("building_target", EGroup_GetSpawnedEntityAt(egroupid,itemindex))
-- Avoid Basic Strategic Point, Relic, Critical Point
local blueprintTable = Util_MakeBlueprintTable("relic_struct", "strategic_point_flag", "strategic_objective_struct")
if EGroup_IsUnderAttack("building_target",true) and
EGroup_ContainsBlueprints("building_target", blueprintTable, false) == false
then
return true
end
end
-- ForEach Function: Check if a Enemy Building is under attack for soul powers function Rule_Check_SkillUsage(sgroupid, itemindex, squadID) SGroup_Clear("skill_target") SGroup_Add("skill_target", SGroup_GetSpawnedSquadAt(sgroupid,itemindex))
-- Avoid Basic Strategic Point, Relic, Critical Point
local blueprintTable = Util_MakeBlueprintTable("relic_struct", "strategic_point_flag", "strategic_objective_struct")
if SGroup_IsUnderAttack("skill_target",true) and
SGroup_ContainsBlueprints("skill_target", blueprintTable, false) == true
then
return true
end
end
-- Soul Powers
-- Soul Power: Corrosion -- Fires it at Player Squads/Vehicles that are in combat function Rule_SoulPower_Corrosion() -- Check if Player Vehicle is in combat, & fire corrosion at them if g_soulPower_enabled_Corrosion == true and SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Attack_Vehicles) and SGroup_Count("skill_target") > 0 and EGroup_Count("eg_hq_1") > 0 and Cmd_CastAbilityEGroupS("eg_hq_1", "dark_eldar_corrosive_cloud", "skill_target") then -- Random Chance to Play Taunt IE if World_GetRand(0,2) < 1 then -- Play IE if Piercing Vision is used power_Taunt = World_GetRand(1,3) Util_StartIntel(g_ie_PowerUseTaunt_Array[power_Taunt]) end
-- Check if Player Units (Non-Vehicle) is in combat, & fire corrosion at them
elseif g_soulPower_enabled_Corrosion == true and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Attack) and
SGroup_Count("skill_target") > 0 and
EGroup_Count("eg_hq_1") > 0 and
Cmd_CastAbilityEGroupS("eg_hq_1", "dark_eldar_corrosive_cloud", "skill_target")
then
-- Random Chance to Play Taunt IE
if World_GetRand(0,2) < 1
then
-- Play IE if Piercing Vision is used
power_Taunt = World_GetRand(1,3)
Util_StartIntel(g_ie_PowerUseTaunt_Array[power_Taunt])
end
end
end
-- Soul Power: SoulStorm -- Fires it at Eneny Squads in combat function Rule_SoulPower_SoulStorm() -- Check if Player Vehicle is in combat, & fire SoulStorm at them if g_soulPower_enabled_SoulStorm == true and SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Attack_Vehicles) and SGroup_Count("skill_target") > 0 and EGroup_Count("eg_hq_1") > 0 and Cmd_CastAbilityEGroupS("eg_hq_1", "dark_eldar_soulstorm", "skill_target") then -- Random Chance to Play Taunt IE if World_GetRand(0,2) < 1 then -- Play IE if Piercing Vision is used power_Taunt = World_GetRand(1,3) Util_StartIntel(g_ie_PowerUseTaunt_Array[power_Taunt]) end
-- Check if Player Units (Non-Vehicle) is in combat, & fire SoulStorm at them
elseif g_soulPower_enabled_SoulStorm == true and
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Attack) and
SGroup_Count("skill_target") > 0 and
EGroup_Count("eg_hq_1") > 0 and
Cmd_CastAbilityEGroupS("eg_hq_1", "dark_eldar_soulstorm", "skill_target")
then
-- Random Chance to Play Taunt IE
if World_GetRand(0,2) < 1
then
-- Play IE if Piercing Vision is used
power_Taunt = World_GetRand(1,3)
Util_StartIntel(g_ie_PowerUseTaunt_Array[power_Taunt])
end
end
end
-- Soul Power: Scream of the Dammed -- Fires it if Player Squads is in combat function Rule_SoulPower_ScreamOfDammed() -- Check if Player Squad is in combat, & fire Scream of the Dammed if g_soulPower_enabled_ScreamofDammed == true and SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Attack) and SGroup_Count("skill_target") > 0 and EGroup_Count("eg_hq_1") > 0 and Command_EntityAbilitySelf(g_Player2,EGroup_GetSpawnedEntityAt(EGroup_FromName("eg_hq_1"), 1), "dark_eldar_screams_of_the_damned") then -- Random Chance to Play Taunt IE if World_GetRand(0,2) < 1 then -- Play IE if Piercing Vision is used power_Taunt = World_GetRand(1,3) Util_StartIntel(g_ie_PowerUseTaunt_Array[power_Taunt]) end end end
-- Soul Power: Piercing Vision -- Fires it on Enemy Squad in Proximity of Infiltrated player Units function Rule_SoulPower_PiercingVision() -- ForEach Function: Checks if a Enemy Squad is In Range of Player Infiltrated Squad for Skill Targeting function Rule_Detect_Proximity_Infiltrated(sgroupid_ai, itemindex_ai, squadID_ai) SGroup_Clear("squad_ai") SGroup_Add("squad_ai", SGroup_GetSpawnedSquadAt(sgroupid_ai,itemindex_ai))
-- If Dark Eldar Unit is in Proximity to cloaked squad & HQs exists -- try to cast piercing vision
if Prox_SquadsInProximityOfSquads("squad_player", "squad_ai", range, true) and
EGroup_Count("eg_hq_1") > 0 and
Cmd_CastAbilityEGroupS("eg_hq_1", "dark_eldar_piercing_vision", "squad_ai")
then
-- Play IE if Piercing Vision is used
cloak_Taunt = World_GetRand(1,3)
Util_StartIntel(g_ie_DetectCloakTaunt_Array[cloak_Taunt])
return true
end
end
-- ForEach Function: Checks if Player Squad is Infiltrated & if eneny squad in range
function Rule_Check_Player_Infiltrated(sgroupid_player, itemindex_player, squadID_player)
-- Check if the Squad is Infiltrated
if Squad_IsInfiltrated(squadID_player)
then
SGroup_Clear("squad_player")
SGroup_Add("squad_player",squadID_player)
if SGroup_ForEach(Player_GetSquads(g_Player2), Rule_Detect_Proximity_Infiltrated)
then
return true
end
end
end
range = 45
-- Check if AI Squad is in range of an infiltrated player squad, and cast piercing vision on the AI Squad
if g_soulPower_enabled_PiercingVision == true
then
SGroup_ForEach(Player_GetSquads(g_Player1), Rule_Check_Player_Infiltrated)
end
end
-- END OF ALL " LEVEL FLOW " RULES
-- BASE ACTIVATION, PRODUCTION, & ATTACKS -- Rule_Create_And_Sync_Attacks() : Creates the SGroups Used & Adds all the attack Rules at the same time to sync them
-- Creates the SGroups Used & Adds all the attack Rules at the same time to sync them function Rule_Create_And_Sync_Attacks() -- Checks if a prisoner has been freed from their cage yet g_array_prisonerCage_freed = { false, --1 false, --2 false, --3 false, --4 false, --5 false, --6 false, --7 false, --8 false, --9 false, --10 }
-- What Prisoner to free from what cage
g_array_prisonerCage_prisoner = {
g_prisoner_blueprint_1, --1
g_prisoner_blueprint_2, --2
g_prisoner_blueprint_3, --3
g_prisoner_blueprint_4, --4
g_prisoner_blueprint_5, --5
g_prisoner_blueprint_6, --6
g_Builder_blueprint, --7
g_Builder_blueprint, --8
g_Builder_blueprint, --9
g_prisoner_blueprint_6, --10
}
-- Target Location for when a squad is told to retreat (Retreat Toward Center Base HQ)
g_retreat_target = Marker_GetPosition(Marker_FromName("mkr_hq_4", "basic_marker"))
-- Default Attack Target
g_attack_target = SGroup_GetPosition(Player_GetSquads(g_Player1))
-- SGroup & EGroups used for targeting of skills
SGroup_Create("skill_target")
EGroup_Create("building_target")
--Egroup for all of the Strategic Points the World Owns
EGroup_Create("eg_world_points")
-- Used for Air Unit Targeting
SGroup_Create("sg_playerAirUnits")
--Used for Soul Power Targeting
SGroup_Create("squad_player")
SGroup_Create("squad_ai")
--------------------------------------------------------------------------------------------------------------------------------------------
-- Create the SGroups used by the Bases to Attack & Patrol with
-- Cage Defense Troops
SGroup_Create("sg_cageDefense_warrior1")
SGroup_Create("sg_cageDefense_warrior2")
SGroup_Create("sg_cageDefense_scourge")
SGroup_Create("sg_cageDefense_reaver")
-- Center Base
SGroup_Create("sg_centerBase_hellions_patrol")
SGroup_Create("sg_centerBase_reaver")
SGroup_Create("sg_centerBase_mandrake")
SGroup_Create("sg_centerBase_scourge")
-- East Base
SGroup_Create("sg_eastBase_hellions")
SGroup_Create("sg_eastBase_warrior")
SGroup_Create("sg_eastBase_mandrake")
-- Main Base
for i = 1,2 do
SGroup_Create("sg_mainBase_raider"..i)
SGroup_Create("sg_mainBase_ravager"..i)
SGroup_Create("sg_mainBase_warrior"..i)
end
-- North Base
SGroup_Create("sg_northBase_warpBeast_patrol")
SGroup_Create("sg_northBase_mandrake_patrol")
for i = 1,2 do
SGroup_Create("sg_northBase_talos"..i)
SGroup_Create("sg_northBase_raven"..i)
end
-- North West Base
SGroup_Create("sg_northWestBase_haemonculus")
SGroup_Create("sg_northWestBase_wych")
-- South East Base
SGroup_Create("sg_southEastBase_scourge")
SGroup_Create("sg_southEastBase_mandrakes")
-- South West Base
SGroup_Create("sg_southWestBase_warpbeast_patrol")
SGroup_Create("sg_southWestBase_wych")
SGroup_Create("sg_southWestBase_haemonculus")
SGroup_Create("sg_southWestBase_raven")
SGroup_Create("sg_southWestBase_reaver_1")
SGroup_Create("sg_southWestBase_reaver_2")
SGroup_Create("sg_southWestBase_talos")
-- Vect Support
SGroup_Create("sg_vectSupport_warrior")
SGroup_Create("sg_vectSupport_warpBeast")
SGroup_Create("sg_vectSupport_reaver")
SGroup_Create("sg_vectSupport_ravager")
-- Group for Repairing Vect
SGroup_Create("sg_vectRepair")
SGroup_Create("sg_vectRepair_2")
-- West Base
SGroup_Create("sg_westBase_scourge")
SGroup_Create("sg_westBase_warrior")
SGroup_Create("sg_westBase_reaver_1")
SGroup_Create("sg_westBase_reaver_2")
-- Vect Base
SGroup_Create("sg_vectBase_archon")
SGroup_Create("sg_vectBase_raven1")
SGroup_Create("sg_vectBase_raven2")
--------------------------------------------------------------------------------------------------------------------------------------------
-- Check for Base Activation by the Prisoner Cages
Rule_AddInterval(Rule_PrisonerCage_BaseActivation, 1)
-- Check For Destroyed Cages to free prisoners & give resources
Rule_AddInterval(Rule_PrisonerCage_FreeCage,1)
-- Allow Slave Caravals to check for & use soul shock ability
Rule_AddInterval(Rule_SlaveCaravel_Attack,3)
-- Sync Production of Center Base & The Prisoner Cage Defenses
Rule_AddInterval(Rule_Production_Center_Base, g_timer_centerBase)
Rule_AddInterval(Rule_Production_PrisonerCage, g_timer_prisonerCage)
Rule_AddInterval(Rule_Production_SouthEast_Base, g_timer_southEastBase)
Rule_AddInterval(Rule_Production_SouthWest_Base, g_timer_southWestBase)
-- Patrols
Rule_AddInterval(Rule_Patrol_Center, 5)
Rule_AddInterval(Rule_Patrol_North, 5)
Rule_AddInterval(Rule_Patrol_North_Reverse, 5)
Rule_AddInterval(Rule_Patrol_SouthWest, 5)
-- Squad Tactics : Reinforcing, Skills, Attacking, Jumping, etc..
Rule_AddInterval(Rule_Squad_Tactics_Helper,5)
-- Provides Some Random Movement & Life to the Bases
Rule_AddInterval(Rule_RandomMovement_Base,10)
end
-- Produce Scourge, Reaver, Mandrakes, & Patrolling Hellions function Rule_Production_Center_Base() -- If the Scourge SGroup is Empty (& Base Activated) if g_base_activated_Center == true and SGroup_Count("sg_centerBase_scourge") == 0 and Rule_Produce_Scourge("sg_centerBase_scourge", "eg_hallOfBlood_8", "mkr_hallOfBlood_8") then -- Reset Status (in case died while retreating etc...) g_centerBase_scourge_status[1] = g_squad_produced end
-- If the Reaver SGroup is Empty (& Base Activated)
if g_base_activated_Center == true and
SGroup_Count("sg_centerBase_reaver") == 0 and
Rule_Produce_Reaver("sg_centerBase_reaver", "eg_skimmerShop_6", "mkr_skimmerShop_6")
then
-- Reset Status (in case died while retreating etc...)
g_centerBase_reaver_status[1] = g_squad_produced
end
-- If the Patroling Hellion SGroup is Empty (& Patrol Activated)
if g_patrol_activated_Center == true and
SGroup_Count("sg_centerBase_hellions_patrol") == 0 and
Rule_Produce_Hellion("sg_centerBase_hellions_patrol", "eg_skimmerShop_6", "mkr_skimmerShop_6")
then
-- Set SGroup Owner to Player3 so can share FOW Vision
SGroup_SetPlayerOwner("sg_centerBase_hellions_patrol", g_Player3)
-- Task to First Patrol Point
Cmd_AttackMoveMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_1")
g_centerBase_hellions_patrol_status[1] = g_squad_patrolling
end
-- If the Mandrake SGroup is Empty (& Base Activated)
if g_base_activated_Center == true and
SGroup_Count("sg_centerBase_mandrake") == 0 and
Rule_Produce_Mandrake("sg_centerBase_mandrake", "eg_hq_4", "mkr_hq_4")
then
-- Reset Status (in case died while retreating etc...)
g_centerBase_mandrake_status[1] = g_squad_produced
end
--if hall of blood, dark foundry & hqs are destroyed, remove rules since base is gone
if EGroup_Count("eg_skimmerShop_6") == 0 and
EGroup_Count("eg_hq_4") == 0 and
EGroup_Count("eg_hallOfBlood_8") == 0
then
Rule_Remove(Rule_Production_Center_Base)
end
end
-- Produce Warriors & Raiders from the Main Base once activated function Rule_Production_Main_Base() -- Loop through all the Warriors, Raiders, Dark Foundry, & Hall of Bloods in Main Base for i =1,2 do -- Reset Production Values to False local mainBase_troopsProduced = false local mainBase_raiderProduced = false
-- If the Warrior SGroup is Empty (& Base Activated)...
if g_base_activated_Main == true and
SGroup_Count("sg_mainBase_warrior"..i) == 0 and
Rule_Produce_Warrior_Full("sg_mainBase_warrior"..i, "eg_hallOfBlood_"..i, "mkr_hallOfBlood_"..i) == true
then
mainBase_troopsProduced = true
-- Reset Status (in case died while retreating etc...)
g_mainBase_warrior_status[i] = g_squad_produced
end
-- If the Raider SGroup is Empty (& Base Activated)...
if g_base_activated_Main == true and
SGroup_Count("sg_mainBase_raider"..i) == 0 and
Rule_Produce_Raider("sg_mainBase_raider"..i, "eg_skimmerShop_"..i, "mkr_skimmerShop_"..i) == true
then
mainBase_raiderProduced = true
-- Reset Status (in case died while retreating etc...)
g_mainBase_raider_status[i] = g_squad_produced
end
-- if both troops & transport exist...
if mainBase_troopsProduced == true and
mainBase_raiderProduced == true
then
-- load the warriors into the raider (& set status to loading to buy time before sending in)
Cmd_EnterTransport("sg_mainBase_warrior"..i, "sg_mainBase_raider"..i)
g_mainBase_raider_status[i] = g_squad_loading
g_mainBase_warrior_status[i] = g_squad_loading
end
end
-- If the Slave SGroup is Empty (& Base Activated)
if g_base_activated_Main == true and
SGroup_Count("sg_slave_1") == 0 and
Rule_Produce_Slave("sg_slave_1", "eg_hq_1", "mkr_hq_1")
then
-- Reset Status (in case died while retreating etc...)
g_slave_status[1] = g_squad_produced
elseif g_base_activated_Main == true and
SGroup_Count("sg_slave_2") == 0 and
Rule_Produce_Slave("sg_slave_2", "eg_hq_1", "mkr_hq_1")
then
-- Reset Status (in case died while retreating etc...)
g_slave_status[2] = g_squad_produced
end
if EGroup_Count("eg_skimmerShop_1") == 0 and
EGroup_Count("eg_skimmerShop_2") == 0 and
EGroup_Count("eg_hallOfBlood_1") == 0 and
EGroup_Count("eg_hallOfBlood_2") == 0 and
EGroup_Count("eg_hq_1") == 0
then
Rule_Remove(Rule_Production_Main_Base)
end
end
-- Produce Troops from the East Base once activated function Rule_Production_East_Base() -- If the Hellion SGroup is Empty (& Base Activated) if g_base_activated_East == true and SGroup_Count("sg_eastBase_hellions") == 0 and Rule_Produce_Hellion("sg_eastBase_hellions", "eg_skimmerShop_8", "mkr_skimmerShop_8") then -- Reset Status for Jumping g_eastBase_hellions_status[1] = g_squad_jump_prep end
-- If the Mandrake SGroup is Empty (& Base Activated)
if g_base_activated_East == true and
SGroup_Count("sg_eastBase_mandrake") == 0 and
Rule_Produce_Mandrake("sg_eastBase_mandrake", "eg_hq_5", "mkr_hq_5")
then
-- Reset Status (in case died while retreating etc...)
g_eastBase_mandrake_status[1] = g_squad_produced
end
-- If the Warrior SGroup is Empty (& Base Activated)
if g_base_activated_East == true and
SGroup_Count("sg_eastBase_warrior") == 0 and
Rule_Produce_Warrior("sg_eastBase_warrior", "eg_hallOfBlood_4", "mkr_hallOfBlood_4")
then
-- Reset Status (in case died while retreating etc...)
g_eastBase_warrior_status[1] = g_squad_produced
end
--if hall of blood, dark foundry & hqs are destroyed, remove rules since base is gone
if EGroup_Count("eg_hallOfBlood_4") == 0 and
EGroup_Count("eg_hq_5") == 0 and
EGroup_Count("eg_skimmerShop_8") == 0
then
Rule_Remove(Rule_Production_East_Base)
end
end -- Produce Patroling Warp beasts, Patroling Mandrakes, Ravens & Talos function Rule_Production_North_Base() -- Hall of Blood 5:
-- If the Warp Beast Patrol SGroup is Empty (& Base Activated)
if g_patrol_activated_North == true and
SGroup_Count("sg_northBase_warpBeast_patrol") == 0 and
Rule_Produce_WarpBeast("sg_northBase_warpBeast_patrol", "eg_hallOfBlood_5", "mkr_hallOfBlood_5")
then
-- Task to First Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_1")
g_northBase_warpBeast_patrol_status[1] = g_squad_patrolling
end
-- HQ 2:
-- If the Mandrake Patrol SGroup is Empty (& Base Activated)
if g_patrol_activated_North == true and
SGroup_Count("sg_northBase_mandrake_patrol") == 0 and
Rule_Produce_Mandrake("sg_northBase_mandrake_patrol", "eg_hq_2", "mkr_hq_2")
then
-- Task to First Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_1")
g_northBase_mandrake_patrol_status[1] = g_squad_patrolling
end
-- Dark Foundry 4:
-- If the Raven SGroup is Empty (& Base Activated)
if g_base_activated_North == true and
SGroup_Count("sg_northBase_raven1") == 0 and
Rule_Produce_Raven("sg_northBase_raven1", "eg_skimmerShop_4", "mkr_skimmerShop_4")
then
-- Reset Status (in case died while retreating etc...)
g_northBase_raven_status[1] = g_squad_produced
-- Else if the Talos SGroup is Empty (& Base Activated)
elseif g_base_activated_North == true and
SGroup_Count("sg_northBase_talos1") == 0 and
Rule_Produce_Talos("sg_northBase_talos1", "eg_skimmerShop_4", "mkr_skimmerShop_4")
then
-- Reset Status (in case died while retreating etc...)
g_northBase_talos_status[1] = g_squad_produced
end
-- Dark Foundry 5:
-- If the Raven SGroup is Empty (& Base Activated)
if g_base_activated_North == true and
SGroup_Count("sg_northBase_raven2") == 0 and
Rule_Produce_Raven("sg_northBase_raven2", "eg_skimmerShop_5", "mkr_skimmerShop_5")
then
-- Reset Status (in case died while retreating etc...)
g_northBase_raven_status[2] = g_squad_produced
-- Else if the Talos SGroup is Empty (& Base Activated)
elseif g_base_activated_North == true and
SGroup_Count("sg_northBase_talos2") == 0 and
Rule_Produce_Talos("sg_northBase_talos2", "eg_skimmerShop_5", "mkr_skimmerShop_5")
then
-- Reset Status (in case died while retreating etc...)
g_northBase_talos_status[2] = g_squad_produced
end
--if hall of blood, dark foundry & hqs are destroyed, remove rules since base is gone
if EGroup_Count("eg_hallOfBlood_5") == 0 and
EGroup_Count("eg_hq_2") == 0 and
EGroup_Count("eg_skimmerShop_4") == 0 and
EGroup_Count("eg_skimmerShop_5") == 0
then
Rule_Remove(Rule_Production_North_Base)
end
end
-- Produce Troops from the NorthWest Base once activated function Rule_Production_NorthWest_Base() -- If the Haemonculus SGroup is Empty (& Base Activated) if g_base_activated_NorthWest == true and SGroup_Count("sg_northWestBase_haemonculus") == 0 and Rule_Produce_Haemonculus("sg_northWestBase_haemonculus", "eg_hq_3", "mkr_hq_3") then -- Produce a Squad of Warriors & Attach Haemonculus if Rule_Produce_Warrior_Full("sg_northWestBase_haemonculus_support", "eg_hallOfBlood_9", "mkr_hallOfBlood_9") then Cmd_AttachSquads("sg_northWestBase_haemonculus_support", "sg_northWestBase_haemonculus") end
-- Reset Status (in case died while retreating etc...)
g_northWestBase_haemonculus_status[1] = g_squad_produced
end
-- If the Wych SGroup is Empty (& Base Activated)
if g_base_activated_NorthWest == true and
SGroup_Count("sg_northWestBase_wych") == 0 and
Rule_Produce_Wych("sg_northWestBase_wych", "eg_hallOfBlood_9", "mkr_hallOfBlood_9")
then
-- Reset Status (in case died while retreating etc...)
g_northWestBase_wych_status[1] = g_squad_produced
end
-- All Production Buildings destroyed -- Remove Rule
if EGroup_Count("eg_hallOfBlood_9") == 0 and
EGroup_Count("eg_hq_3") == 0
then
Rule_Remove(Rule_Production_NorthWest_Base)
end
end
-- Produce Warriors, Reavers, & Scourge to Defend Prisoner Cages function Rule_Production_PrisonerCage() -- Hall of Blood 14 by Prisoner Cage 1 & 2
-- If the Warrior SGroup is Empty (& Hall of Blood 14 Activated)
if g_hallOfBlood14_activated == true and
SGroup_Count("sg_cageDefense_warrior1") == 0 and
Rule_Produce_Warrior("sg_cageDefense_warrior1", "eg_hallOfBlood_14", "mkr_hallOfBlood_14")
then
-- Reset Status (in case died while retreating etc...)
g_cageDefense_warrior_status[1] = g_squad_produced
end
-- Hall of Blood 15 by Prisoner Cage 3
-- If the Warrior SGroup is Empty (& Hall of Blood 15 Activated)
if g_hallOfBlood15_activated == true and
SGroup_Count("sg_cageDefense_warrior2") == 0 and
Rule_Produce_Warrior("sg_cageDefense_warrior2", "eg_hallOfBlood_15", "mkr_hallOfBlood_15")
then
-- Reset Status (in case died while retreating etc...)
g_cageDefense_warrior_status[2] = g_squad_produced
end
-- Skimmer Shop 10 by Prisoner Cage 3
-- If the Warrior SGroup is Empty (& Skimmer Shop 10 Activated)
if g_skimmerShop10_activated == true and
SGroup_Count("sg_cageDefense_reaver") == 0 and
Rule_Produce_Reaver("sg_cageDefense_reaver", "eg_skimmerShop_10", "mkr_skimmerShop_10")
then
-- Reset Status (in case died while retreating etc...)
g_cageDefense_reaver_status[1] = g_squad_produced
end
-- Hall of Blood 10 by Prisoner Cage 5
-- If the Scourge SGroup is Empty (& Hall of Blood 10 Activated)
if g_hallOfBlood10_activated == true and
SGroup_Count("sg_cageDefense_scourge") == 0 and
Rule_Produce_Scourge("sg_cageDefense_scourge", "eg_hallOfBlood_10", "mkr_hallOfBlood_10")
then
-- Reset Status (in case died while retreating etc...)
g_cageDefense_scourge_status[1] = g_squad_produced
end
--if Hall of Bloods & Dark Foundry are destroyed, remove rules since base is gone
if EGroup_Count("eg_hallOfBlood_14") == 0 and
EGroup_Count("eg_hallOfBlood_15") == 0 and
EGroup_Count("eg_hallOfBlood_10") == 0 and
EGroup_Count("eg_skimmerShop_10") == 0
then
Rule_Remove(Rule_Production_PrisonerCage)
end
end
-- Produces Jumping Scourge & Mandrakes -- (PreActive: Scourge & Mandrakes) function Rule_Production_SouthEast_Base() -- BASE ACTIVE:
-- If the Mandrake SGroup is Empty (& Base Activated)
if g_base_activated_SouthEast == true and
SGroup_Count("sg_southEastBase_mandrakes") == 0 and
Rule_Produce_Mandrake("sg_southEastBase_mandrakes", "eg_hq_7", "mkr_hq_7")
then
-- Reset Status (in case died while retreating etc...)
g_southEastBase_mandrakes_status[1] = g_squad_produced
end
-- If the Scourge SGroup is Empty (& Hall of Blood 10 Activated)
if g_base_activated_SouthEast == true and
SGroup_Count("sg_southEastBase_scourge") == 0 and
Rule_Produce_Scourge("sg_southEastBase_scourge", "eg_hallOfBlood_11", "mkr_hallOfBlood_11")
then
-- Reset Status (in case died while retreating etc...)
g_southEastBase_scourge_status[1] = g_squad_produced
end
-- BASE NOT YET ACTIVE:
if g_base_activated_SouthEast == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_southEast_base")
then
-- If the Mandrake SGroup is Empty
if SGroup_Count("sg_southEastBase_mandrakes") == 0 and
Rule_Produce_Mandrake("sg_southEastBase_mandrakes", "eg_hq_7", "mkr_hq_7")
then
-- Reset Status (in case died while retreating etc...)
g_southEastBase_mandrakes_status[1] = g_squad_produced
end
-- If the Scourge SGroup is Empty
if SGroup_Count("sg_southEastBase_scourge") == 0 and
Rule_Produce_Scourge("sg_southEastBase_scourge", "eg_hallOfBlood_11", "mkr_hallOfBlood_11")
then
-- Reset Status (in case died while retreating etc...)
g_southEastBase_scourge_status[1] = g_squad_produced
end
end
-- BASE DESTROYED
--if Hall of Bloods & HQ are destroyed, remove rules since base is gone
if EGroup_Count("eg_hallOfBlood_11") == 0 and
EGroup_Count("eg_hq_7") == 0
then
Rule_Remove(Rule_Production_PrisonerCage)
end
end
-- Produces Wych, Patroling WarpBeast, Haemonculus, Talos & Raven -- (PreActive: Wych & Reaver) function Rule_Production_SouthWest_Base() -- BASE ACTIVE:
-- Hall of Blood 12
-- If the Wych SGroup is Empty (& Base Activated)
if g_base_activated_SouthWest == true and
SGroup_Count("sg_southWestBase_wych") == 0 and
Rule_Produce_Wych("sg_southWestBase_wych", "eg_hallOfBlood_12", "mkr_hallOfBlood_12")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_wych_status[1] = g_squad_produced
end
-- Hall of Blood 13:
-- If the Warp Beast Patrol SGroup is Empty (& Base Activated)
if g_patrol_activated_SouthWest == true and
SGroup_Count("sg_southWestBase_warpbeast_patrol") == 0 and
Rule_Produce_WarpBeast("sg_southWestBase_warpbeast_patrol", "eg_hallOfBlood_13", "mkr_hallOfBlood_13")
then
-- Set SGroup Owner to Player3 so can share FOW Vision
SGroup_SetPlayerOwner("sg_southWestBase_warpbeast_patrol", g_Player3)
-- Task to First Patrol Point
Cmd_AttackMoveMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_1")
g_southWestBase_warpbeast_patrol_status[1] = g_squad_patrolling
end
-- HQ 6:
-- If the Haemonculus SGroup is Empty (& Base Activated)
if g_base_activated_SouthWest == true and
SGroup_Count("sg_southWestBase_haemonculus") == 0 and
Rule_Produce_Mandrake("sg_southWestBase_haemonculus", "eg_hq_6", "mkr_hq_6")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_haemonculus_status[1] = g_squad_produced
end
-- Dark Foundry 9:
-- If the Raven SGroup is Empty (& Base Activated)
if g_base_activated_SouthWest == true and
SGroup_Count("sg_southWestBase_raven") == 0 and
Rule_Produce_Raven("sg_southWestBase_raven", "eg_skimmerShop_9", "mkr_skimmerShop_9")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_raven_status[1] = g_squad_produced
-- Else If the Talos SGroup is Empty (& Base Activated)
elseif g_base_activated_SouthWest == true and
SGroup_Count("sg_southWestBase_talos") == 0 and
Rule_Produce_Talos("sg_southWestBase_talos", "eg_skimmerShop_9", "mkr_skimmerShop_9")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_talos_status[1] = g_squad_produced
end
-- BASE NOT YET ACTIVE:
if g_base_activated_SouthWest == false and
Player_AreSquadsNearMarker(g_Player1, "mkr_activate_southWest_base")
then
-- If the Wych SGroup is Empty
if SGroup_Count("sg_southWestBase_wych") == 0 and
Rule_Produce_Wych("sg_southWestBase_wych", "eg_hallOfBlood_12", "mkr_hallOfBlood_12")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_wych_status[1] = g_squad_produced
end
-- If the Reaver SGroup is Empty
if SGroup_Count("sg_southWestBase_reaver_1") == 0 and
Rule_Produce_Reaver("sg_southWestBase_reaver_1", "eg_skimmerShop_9", "mkr_skimmerShop_9")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_reaver_status[1] = g_squad_produced
end
-- If the Reaver SGroup is Empty
if SGroup_Count("sg_southWestBase_reaver_2") == 0 and
Rule_Produce_Reaver("sg_southWestBase_reaver_2", "eg_skimmerShop_9", "mkr_skimmerShop_9")
then
-- Reset Status (in case died while retreating etc...)
g_southWestBase_reaver_status[2] = g_squad_produced
end
end
-- BASE DESTROYED
-- All Production Buildings destroyed -- Remove Rule
if EGroup_Count("eg_hallOfBlood_12") == 0 and
EGroup_Count("eg_hallOfBlood_13") == 0 and
EGroup_Count("eg_hq_6") == 0 and
EGroup_Count("eg_skimmerShop_9") == 0
then
Rule_Remove(Rule_Production_SouthWest_Base)
end
end
-- Produce Warriors, Jumping Scourge & Reavers function Rule_Production_West_Base() -- If the Scourge SGroup is Empty (& Base Activated) if g_base_activated_West == true and SGroup_Count("sg_westBase_scourge") == 0 and Rule_Produce_Scourge("sg_westBase_scourge", "eg_hallOfBlood_6", "mkr_hallOfBlood_6") then -- Reset Status for Jumping g_westBase_scourge_status[1] = g_squad_jump_prep end
-- If the Warrior SGroup is Empty (& Base Activated)
if g_base_activated_West == true and
SGroup_Count("sg_westBase_warrior") == 0 and
Rule_Produce_Warrior("sg_westBase_warrior", "eg_hallOfBlood_7", "mkr_hallOfBlood_7")
then
-- Reset Status (in case died while retreating etc...)
g_westBase_warrior_status[1] = g_squad_produced
end
-- If the Reaver SGroup is Empty (& Base Activated)
if g_base_activated_West == true and
SGroup_Count("sg_westBase_reaver_1") == 0 and
Rule_Produce_Reaver("sg_westBase_reaver_1", "eg_skimmerShop_7", "mkr_skimmerShop_7")
then
-- Reset Status (in case died while retreating etc...)
g_westBase_reaver_status[1] = g_squad_produced
end
-- If the Reaver SGroup is Empty (& Base Activated)
if g_base_activated_West == true and
SGroup_Count("sg_westBase_reaver_2") == 0 and
Rule_Produce_Reaver("sg_westBase_reaver_2", "eg_skimmerShop_7", "mkr_skimmerShop_7")
then
-- Reset Status (in case died while retreating etc...)
g_westBase_reaver_status[2] = g_squad_produced
end
--if hall of bloods & Dark Foundry are destroyed, remove rules since base is gone
if EGroup_Count("eg_hallOfBlood_6") == 0 and
EGroup_Count("eg_hallOfBlood_7") == 0 and
EGroup_Count("eg_skimmerShop_7") == 0
then
Rule_Remove(Rule_Production_West_Base)
end
end
-- Handles the Hellions that Patrol the Prisoner Cage Area function Rule_Patrol_Center() -- Check if the Squad arrived at the Patrol Location 1 if SGroup_Exists("sg_centerBase_hellions_patrol") and Prox_AllSquadsNearMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_1") then -- Reinforce BackUp before continuing patrol if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) and SGroup_GetAvgLoadout("sg_centerBase_hellions_patrol") < 0.75 then -- Reinforce Command_Squad(g_Player2, "sg_centerBase_hellions_patrol", SCMD_ReinforceTrooper) else -- Task to Next Patrol Point Cmd_AttackMoveMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_2") end
-- Check if the Squad arrived at the Patrol Location 2
elseif SGroup_Exists("sg_centerBase_hellions_patrol") and
Prox_AllSquadsNearMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_2")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) and
SGroup_GetAvgLoadout("sg_centerBase_hellions_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_centerBase_hellions_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_3")
end
-- Check if the Squad arrived at the Patrol Location 3
elseif SGroup_Exists("sg_centerBase_hellions_patrol") and
Prox_AllSquadsNearMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_3")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) and
SGroup_GetAvgLoadout("sg_centerBase_hellions_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_centerBase_hellions_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_4")
end
-- Check if the Squad arrived at the Patrol Location 4
elseif SGroup_Exists("sg_centerBase_hellions_patrol") and
Prox_AllSquadsNearMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_4")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_centerBase_hellions_patrol",1)) and
SGroup_GetAvgLoadout("sg_centerBase_hellions_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_centerBase_hellions_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_centerBase_hellions_patrol", "mkr_Patrol_Center_1")
end
end
--- Production Building & Patrol Squad are destroyed
if EGroup_Count("eg_skimmerShop_6") == 0 and
SGroup_Count("sg_centerBase_hellions_patrol") == 0
then
Rule_Remove(Rule_Patrol_Center)
end
end
-- Handles the Warp Beasts that Patrol the Northern Area & by the Soul Cages function Rule_Patrol_North() -- Check if the Squad arrived at the Patrol Location 1 if SGroup_Exists("sg_northBase_warpBeast_patrol") and Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_1") then -- Reinforce BackUp before continuing patrol if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75 then -- Reinforce Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper) else -- Task to Next Patrol Point Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_2") end
-- Check if the Squad arrived at the Patrol Location 2
elseif SGroup_Exists("sg_northBase_warpBeast_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_2")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_3")
end
-- Check if the Squad arrived at the Patrol Location 3
elseif SGroup_Exists("sg_northBase_warpBeast_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_3")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_4")
end
-- Check if the Squad arrived at the Patrol Location 4
elseif SGroup_Exists("sg_northBase_warpBeast_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_4")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_5")
end
-- Check if the Squad arrived at the Patrol Location 5
elseif SGroup_Exists("sg_northBase_warpBeast_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_5")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_6")
end
-- Check if the Squad arrived at the Patrol Location 6
elseif SGroup_Exists("sg_northBase_warpBeast_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_6")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_warpBeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_warpBeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_warpBeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_warpBeast_patrol", "mkr_Patrol_North_1")
end
end
--- Production Building & Patrol Squad are destroyed
if EGroup_Count("eg_hallOfBlood_5") == 0 and
SGroup_Count("sg_northBase_warpBeast_patrol") == 0
then
Rule_Remove(Rule_Patrol_North)
end
end
-- Handles the Mandrakes that Patrol the Northern Area & by the Soul Cages function Rule_Patrol_North_Reverse() -- Check if the Squad arrived at the Patrol Location 1 if SGroup_Exists("sg_northBase_mandrake_patrol") and Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_1") then -- Reinforce BackUp before continuing patrol if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75 then -- Reinforce Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper) else -- Task to Next Patrol Point Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_6") end
-- Check if the Squad arrived at the Patrol Location 2
elseif SGroup_Exists("sg_northBase_mandrake_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_6")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_5")
end
-- Check if the Squad arrived at the Patrol Location 3
elseif SGroup_Exists("sg_northBase_mandrake_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_5")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_4")
end
-- Check if the Squad arrived at the Patrol Location 4
elseif SGroup_Exists("sg_northBase_mandrake_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_4")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_3")
end
-- Check if the Squad arrived at the Patrol Location 5
elseif SGroup_Exists("sg_northBase_mandrake_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_3")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_2")
end
-- Check if the Squad arrived at the Patrol Location 6
elseif SGroup_Exists("sg_northBase_mandrake_patrol") and
Prox_AllSquadsNearMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_2")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_northBase_mandrake_patrol",1)) and
SGroup_GetAvgLoadout("sg_northBase_mandrake_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_northBase_mandrake_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_northBase_mandrake_patrol", "mkr_Patrol_North_1")
end
end
--- Production Building & Patrol Squad are destroyed
if EGroup_Count("eg_hq_2") == 0 and
SGroup_Count("sg_northBase_mandrake_patrol") == 0
then
Rule_Remove(Rule_Patrol_North_Reverse)
end
end
-- Handles the WarpBeasts that Patrol the Prisoner Cage Area function Rule_Patrol_SouthWest() -- Check if the Squad arrived at the Patrol Location 1 if SGroup_Exists("sg_southWestBase_warpbeast_patrol") and Prox_AllSquadsNearMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_1") then -- Reinforce BackUp before continuing patrol if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) and SGroup_GetAvgLoadout("sg_southWestBase_warpbeast_patrol") < 0.75 then -- Reinforce Command_Squad(g_Player2, "sg_southWestBase_warpbeast_patrol", SCMD_ReinforceTrooper) else -- Task to Next Patrol Point Cmd_AttackMoveMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_2") end
-- Check if the Squad arrived at the Patrol Location 2
elseif SGroup_Exists("sg_southWestBase_warpbeast_patrol") and
Prox_AllSquadsNearMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_2")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_southWestBase_warpbeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_southWestBase_warpbeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_3")
end
-- Check if the Squad arrived at the Patrol Location 3
elseif SGroup_Exists("sg_southWestBase_warpbeast_patrol") and
Prox_AllSquadsNearMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_3")
then
-- Reinforce BackUp before continuing patrol
if Squad_GetMax(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) > Squad_Count(SGroup_GetSpawnedSquadAt("sg_southWestBase_warpbeast_patrol",1)) and
SGroup_GetAvgLoadout("sg_southWestBase_warpbeast_patrol") < 0.75
then
-- Reinforce
Command_Squad(g_Player2, "sg_southWestBase_warpbeast_patrol", SCMD_ReinforceTrooper)
else
-- Task to Next Patrol Point
Cmd_AttackMoveMarker("sg_southWestBase_warpbeast_patrol", "mkr_Patrol_SouthWest_1")
end
end
--- Production Building & Patrol Squad are destroyed
if EGroup_Count("eg_hallOfBlood_13") == 0 and
SGroup_Count("sg_southWestBase_warpbeast_patrol") == 0
then
Rule_Remove(Rule_Patrol_SouthWest)
end
end
-- Produces the Archon & Ravens from the base where Vect Hangs Out function Rule_Production_VectBase() -- Produce the Archon if g_base_activated_Vect == true and SGroup_Count("sg_vectBase_archon") == 0 and Rule_Produce_Archon("sg_vectBase_archon", "eg_hq_8", "mkr_hq_8") then -- Reset Status (in case died while retreating etc...) g_vectBase_archon_status[1] = g_squad_produced end
-- Produce some Ravens for Air Unit Targeting
if g_base_activated_Vect == true and
SGroup_Count("sg_vectBase_raven1") == 0 and
Rule_Produce_Raven("sg_vectBase_raven1", "eg_skimmerShop_11", "mkr_skimmerShop_11")
then
-- Reset Status (in case died while retreating etc...)
g_vectBase_raven_status[1] = g_squad_produced
elseif g_base_activated_Vect == true and
SGroup_Count("sg_vectBase_raven2") == 0 and
Rule_Produce_Raven("sg_vectBase_raven2", "eg_skimmerShop_11", "mkr_skimmerShop_11")
then
-- Reset Status (in case died while retreating etc...)
g_vectBase_raven_status[2] = g_squad_produced
end
-- Base is destroyed, remove the rule
if EGroup_Count("eg_hq_8") == 0 and
EGroup_Count("eg_skimmerShop_11") == 0
then
Rule_Remove(Rule_Production_VectBase)
end
end
-- END OF ALL " BASE ACTIVATION, PRODUCTION, & ATTACKS " RULES
-- RANDOM MOVEMENT RULES -- Rule_RandomMovement_Support(squadName, markerName) -- Makes sure the squad Exists & has units, before telling the squad to randomly move to a location inside marker -- Rule_RandomMovement_Support_Builder(squadName, markerName) -- Causes Units to Move (Instead of Attack Move) to random location inside marker -- Rule_RandomMovement_Base() -- Causes a few units in each base to wander around it -- giving it the feeling of some life
-- Makes sure the squad Exists & has units, before telling the squad to randomly move to a location inside marker function Rule_RandomMovement_Support(squadName, markerName) if SGroup_Exists(squadName) and SGroup_Count(squadName) > 0 then Util_AttackMoveMarkerRandomRadius(squadName, markerName) end end
-- Causes Units to Move (Instead of Attack Move) to random location inside marker function Rule_RandomMovement_Support_Builder(squadName, markerName) if SGroup_Exists(squadName) and SGroup_Count(squadName) > 0 then local pos = Marker_GetPosition( Marker_FromName( markerName, "basic_marker" ) ) local prox = Marker_GetProximity( Marker_FromName( markerName, "basic_marker" ) )
local xrand = World_GetRand( -prox, prox )
local zrand = World_GetRand( -prox, prox )
local movePos = World_Pos( xrand + pos.x, pos.y, zrand + pos.z )
Command_SquadPos(g_Player2, squadName, SCMD_Move, movePos)
end
end
-- Causes a few units in each base to wander around it -- giving it the feeling of some life function Rule_RandomMovement_Base() -- Center Base: Rule_RandomMovement_Support_Builder("sg_center_defense_slave1", "mkr_hq_4") Rule_RandomMovement_Support_Builder("sg_center_defense_slave2", "mkr_hq_4") Rule_RandomMovement_Support("sg_center_defense_warrior1", "mkr_hq_4") Rule_RandomMovement_Support("sg_center_defense_warrior2", "mkr_hq_4") Rule_RandomMovement_Support("sg_center_defense_reaver1", "mkr_hq_4") Rule_RandomMovement_Support("sg_center_defense_reaver2", "mkr_hq_4")
-- East Base:
Rule_RandomMovement_Support("sg_east_defense_reaver1", "mkr_hq_5")
Rule_RandomMovement_Support("sg_east_defense_reaver2", "mkr_hq_5")
Rule_RandomMovement_Support("sg_east_defense_reaver3", "mkr_hq_5")
Rule_RandomMovement_Support("sg_east_defense_reaver4", "mkr_hq_5")
for i =1, g_strongholdStrengthTier do
Rule_RandomMovement_Support("sg_east_defense_warrior"..i, "mkr_hq_5")
end
-- Main Base:
Rule_RandomMovement_Support("sg_main_defense_mandrakes1", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_mandrakes2", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_ravager1", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_ravager2", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_talos", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_raven1", "mkr_hq_1")
Rule_RandomMovement_Support("sg_main_defense_raven2", "mkr_hq_1")
for i =1, g_strongholdStrengthTier do
Rule_RandomMovement_Support("sg_main_defense_warrior"..i, "mkr_hq_1")
end
-- North Base:
Rule_RandomMovement_Support("sg_north_defense_warrior1", "mkr_soulCage_5")
Rule_RandomMovement_Support("sg_north_defense_warrior2", "mkr_soulCage_5")
Rule_RandomMovement_Support("sg_north_defense_scourge1", "mkr_soulCage_5")
Rule_RandomMovement_Support("sg_north_defense_scourge2", "mkr_soulCage_5")
-- North West Base:
Rule_RandomMovement_Support("sg_northWest_defense_reaver1", "mkr_hq_3")
Rule_RandomMovement_Support("sg_northWest_defense_reaver2", "mkr_hq_3")
-- SouthEast Base:
Rule_RandomMovement_Support("sg_southEast_defense_scourge1", "mkr_hallOfBlood_11")
Rule_RandomMovement_Support("sg_southEast_defense_scourge2", "mkr_hallOfBlood_11")
Rule_RandomMovement_Support("sg_southEast_defense_talos", "mkr_hq_7")
Rule_RandomMovement_Support("sg_southEast_defense_ravager1", "mkr_power_17")
Rule_RandomMovement_Support("sg_southEast_defense_ravager2", "mkr_power_18")
-- SouthWest Base:
Rule_RandomMovement_Support("sg_southWest_defense_wych", "mkr_hallOfBlood_12")
Rule_RandomMovement_Support("sg_southWest_defense_warpBeast", "mkr_hallOfBlood_13")
Rule_RandomMovement_Support("sg_southWest_defense_haemonculus", "mkr_haemonculusLab_3")
Rule_RandomMovement_Support("sg_southWest_defense_talos", "mkr_skimmerShop_9")
Rule_RandomMovement_Support("sg_southWest_defense_ravager1", "mkr_hq_6")
Rule_RandomMovement_Support("sg_southWest_defense_ravager2", "mkr_hq_6")
-- West Base
Rule_RandomMovement_Support("sg_west_defense_talos", "mkr_skimmerShop_7")
Rule_RandomMovement_Support("sg_west_defense_mandrakes1", "mkr_skimmerShop_7")
Rule_RandomMovement_Support("sg_west_defense_mandrakes2", "mkr_skimmerShop_7")
end
-- END OF ALL " RANDOM MOVEMENT " RULES
-- VICTORY / DEFEAT RULES -- Rule_EndGame_Actual_Victory() : Wins the Mission & Plays the Final NIS -- Rule_EndGame_Defeat() : Checks if mission has been lost (Player Killed) -- Rule_GameOver() : Sets Game Over
-- Wins the Mission & Plays the Final NIS -- Called once Vect is Killed function Rule_EndGame_Actual_Victory() -- Kills all rules (Basically cleans up any extra rules that were running and prepares for scenario complete) Rule_RemoveAll()
-- NIS: Play the mission complete scripted scene
WXP_OpeningNISPreset( )
Util_StartNIS(EVENTS.NIS_Victory)
Rule_AddInterval(Rule_GameOver, 1)
end
-- Rule for Losing the Game function Rule_EndGame_Defeat() -- define the "enemy" who will win when the player 'loses' g_enemy = g_Player2
--Lose because of Player Annihilation (Make sure IE is not playing when check is made)
if Event_IsAnyRunning() == false and
Player_HasBuildingsExcept(g_Player1, t_building_exceptions) == false and
Player_HasSquadsExcept(g_Player1, t_unit_exceptions) == false
then
Rule_RemoveAll()
Fade_Start(4, false)
World_SetTeamWin( g_enemy, "" )
Rule_AddInterval(Rule_GameOver,1)
Rule_Remove( Rule_EndGame_Defeat )
end
end
-- Rule for Losing the Game : Version for if builders are lost before HQ is completed function Rule_EndGame_Defeat_Builders() -- define the "enemy" who will win when the player 'loses' g_enemy = g_Player2
--Lose because of Player Builder Annihilation (Make sure IE is not playing when check is made)
if Event_IsAnyRunning() == false and
SGroup_Exists("sg_player_freePrisoner7") and
SGroup_Exists("sg_player_freePrisoner8") and
SGroup_Exists("sg_player_freePrisoner9") and
SGroup_Count("sg_player_freePrisoner7") == 0 and
SGroup_Count("sg_player_freePrisoner8") == 0 and
SGroup_Count("sg_player_freePrisoner9") == 0
then
Rule_RemoveAll()
Fade_Start(4, false)
World_SetTeamWin( g_enemy, "" )
Rule_AddInterval(Rule_GameOver,1)
Rule_Remove( Rule_EndGame_Defeat_Builders )
end
end