Difference between revisions of "Units deployment - XCOM:EU 2012"

From Nexus Mods Wiki
Jump to: navigation, search
(Moved info from Spawn Points article)
 
(17 intermediate revisions by 2 users not shown)
Line 7: Line 7:
 
word-wrap: break-word;">
 
word-wrap: break-word;">
 
'''This article is under development.'''
 
'''This article is under development.'''
 
Replace any section's colored box with your own appropriate material.
 
  
 
Contributors may want to consider writing their material in '''OpenOffice''' with the ''Sun Wiki Publisher'' extension, which enables you to create Wiki articles on '''MediaWiki''' servers without having to know the syntax of the '''MediaWiki''' markup language. All important text attributes such as headings, hyperlinks, lists and simple tables are supported. Even images are supported as long as they have already been uploaded to the wiki site. An automatic upload of images is currently not supported. It is the perfect extension for all users who want to make existing documentations and specifications available on '''MediaWiki''' servers. Just load the document and call the Extension with 'Send – MediaWiki Server'. A dialog will guide you to publish your document.
 
Contributors may want to consider writing their material in '''OpenOffice''' with the ''Sun Wiki Publisher'' extension, which enables you to create Wiki articles on '''MediaWiki''' servers without having to know the syntax of the '''MediaWiki''' markup language. All important text attributes such as headings, hyperlinks, lists and simple tables are supported. Even images are supported as long as they have already been uploaded to the wiki site. An automatic upload of images is currently not supported. It is the perfect extension for all users who want to make existing documentations and specifications available on '''MediaWiki''' servers. Just load the document and call the Extension with 'Send – MediaWiki Server'. A dialog will guide you to publish your document.
Line 16: Line 14:
 
<br>
 
<br>
 
== Overview ==
 
== Overview ==
 +
The following is derived from the Nexus Forums threads [http://forums.nexusmods.com/index.php?/topic/1231530-modding-exalt/ Modding EXALT] and [http://forums.nexusmods.com/index.php?/topic/989749-r-d-ai-improvements R&D AI Improvements].
  
<div name="Rewrite Notice" class="boilerplate metadata" id="Rewrite Notice" style="margin:0px 10px 10px 10px;border:1px solid #cc3333;color: red;
+
There are three separate deployment mechanisms by which units are placed on a map: one for XCOM Soldiers, one for 'walk-in' or 'static' aliens, and one for 'drop-in' or 'dynamic' aliens.  All of these units are placed on defined 'spawn point' locations on each map. (See the related wiki articles [[Maps - XCOM:EU 2012]] and [[Spawn Points - XCOM:EU 2012]] for discussion on those specific topics, and in particular instructions on how to extract the relevant map data to examine that information.)
background-color:#fff5f5;padding:3px;white-space: pre-wrap;
 
white-space: -moz-pre-wrap;
 
white-space: -pre-wrap;
 
white-space: -o-pre-wrap;
 
word-wrap: break-word;">
 
'''This section is in need of development.'''   
 
  
A very general synopsis description of the subject material.
+
The three deployment mechanisms all work through the same general '''XGDeployAI''' process.
</div><br>
 
  
 
== Programs and Tools ==
 
== Programs and Tools ==
Line 35: Line 27:
 
== XCOM soldiers deployment ==
 
== XCOM soldiers deployment ==
  
<div name="Rewrite Notice" class="boilerplate metadata" id="Rewrite Notice" style="margin:0px 10px 10px 10px;border:1px solid #cc3333;color: red;
+
Soldiers deployment is tied in to '''TheWorld.PersistentLevel.PlayerStart_X''' map objects (where "X" is a number), which determine properties of the player start location. Each start location has 6 spawn points determined by '''TheWorld.PersistentLevel.XComSpawnPoint_X''' objects. Spawn points are tied in to player start locations by the "Tag" property.
background-color:#fff5f5;padding:3px;white-space: pre-wrap;
+
 
white-space: -moz-pre-wrap;
+
For example, for map '''CSmallScout_Badlands''' there are 3 possible starting points: '''TheWorld.PersistentLevel.PlayerStart_0''', '''TheWorld.PersistentLevel.PlayerStart_1''' and '''TheWorld.PersistentLevel.PlayerStart_2'''. '''PlayerStart_0'''' has "Tag" property set to "Group2". There are 6 spawn points with the same tag: '''TheWorld.PersistentLevel.XComSpawnPoint_0''' through '''TheWorld.PersistentLevel.XComSpawnPoint_5'''. Spawn points for XCOM Soldiers have the '''XComSpawnPoint''' type property.
white-space: -pre-wrap;
+
 
white-space: -o-pre-wrap;
+
On a side note: '''Meld Canisters''' spawn points in EW are tied in to the player start locations via "Tag" as well. For example, there are 4 possible spawn points for '''meld canisters''' for each of the three player start points. Meld container spawn points have the '''XComMeldContainerSpawnPoint''' type property.
word-wrap: break-word;">
 
'''This section is in need of development.'''
 
</div><br>
 
  
 
== Static aliens deployment ==
 
== Static aliens deployment ==
  
Alien pods deployment is handled via ''XGDeployAI'' in '''XComGame'''. ''GetPossibleSpawns'' function requests ''WorldInfo on AllActors'' of class '''XComAlienPod'''. '''XComAlienPod_X''' objects are defined in '''TheWorld.PersistentLevel''' of each map. EXALT maps have only two '''XComAlienPod''' objects, hence only two pods will be spawned on the map during deployment.
+
Alien pods deployment is handled via ''XGDeployAI'' in '''XComGame'''. ''GetPossibleSpawns'' function requests ''WorldInfo on AllActors'' of class '''XComAlienPod'''. '''XComAlienPod_X''' objects are defined in '''TheWorld.PersistentLevel''' of each map. '''EXALT''' maps have only two '''XComAlienPod''' objects, hence only two pods will be spawned on the map during deployment.
  
'''TheWorld.PersistentLevel.XComAlienPod_X''' objects contain default properties for each '''XComAlienPod''' class instance variable. For example, '''URB_PierA_Terror_CovExt''' has two such objects: '''TheWorld.PersistentLevel.XComAlienPod_1''' and '''TheWorld.PersistentLevel.XComAlienPod_3'''. Their properties are almost identical, only the ''Location'' property is different and sets the pod spawn location:
+
'''TheWorld.PersistentLevel.XComAlienPod_X''' objects contain default properties for each '''XComAlienPod''' class instance variable. For example, map '''URB_PierA_Terror_CovExt''' has two such objects: '''TheWorld.PersistentLevel.XComAlienPod_1''' and '''TheWorld.PersistentLevel.XComAlienPod_3'''. Their properties are almost identical, only the ''Location'' property is different and sets the pod spawn location:
  
 
(See [[#FindObjectEntry TheWorld.PersistentLevel.XComAlienPod_x]] in the '''Separate Content''' section.)
 
(See [[#FindObjectEntry TheWorld.PersistentLevel.XComAlienPod_x]] in the '''Separate Content''' section.)
  
'''XComSpawnPoint_Alien_X''' objects are used by '''TheWorld.PersistentLevel.XComWaveSystem_0''' to define ''SpawnPoints'' and ''OriginationPoints'' for dynamic alien spawns.
+
Another example is map '''CSmallScout_Badlands''', which has four '''XComAlienPod''' objects. One of those contains '''bCommanderPod''' property set to '''1''' and stands for ''commander pod spawn point''. '''XGDeployAI''' contains ''GetPossibleCommanderSpawns'', ''GetPossibleSecondarySpawns'' and ''GetPossibleSoldierSpawns'' functions to determine spawn points for corresponding pod types.
  
Another example is '''CSmallScout_Badlands''', which has four '''XComAlienPod''' objects. One of those contains '''bCommanderPod''' property set to '''1''' and stands for ''commander pod spawn point''. '''XGDeployAI''' contains ''GetPossibleCommanderSpawns'', ''GetPossibleSecondarySpawns'' and ''GetPossibleSoldierSpawns'' functions to determine spawn points for corresponding pod types. During deployment only pods of types defined via '''XComAlienPod''' map objects are spawned.
+
'''XGDeployAI''' maps actual alien squad to '''XComAlienPod''' map objects. It can deploy any pod at any map alien pod "placeholder": for example, if there are no Commanded pods defined, '''XGDeployAI''' will place actual Commander pod at the farthest "placeholder" available.
  
Aliens spawnpoints are computed using the ''XComAlienPod.GetSpawnPoint'' function.  (See [[#XComAlienPod.GetSpawnPoint]] in the '''Separate Content''' section.0
+
Spawn points for alien pods are extracted using the ''XComAlienPod.GetSpawnPoint'' function.  (See [[#XComAlienPod.GetSpawnPoint]] in the '''Separate Content''' section.)
  
 
== Dynamic aliens deployment: Wave System ==
 
== Dynamic aliens deployment: Wave System ==
 +
Council Missions do not use the Wave System; it was introduced for EW. They use ''triggers'' (zones on the map or global events) instead.
 +
 +
'''XComWaveSystem''' is a class in '''XComGame.UPK''' which is used to spawn aliens dynamically. Wave System parameters are defined for each map directly in the map's UPK as archetype objects in '''TheWorld.PersistentLevel'''. Usually maps contain just one Wave System: '''TheWorld.PersistentLevel.XComWaveSystem_0'''. You can extract information on wave objects from map file by decompressing it (with '''UPKDecompressor''') and running '''FindObjectEntry.exe''' (from UPKUtils):<br>
 +
<span style="margin:0px 10px 10px 10px; border:1px solid #cc3333; color: green;
 +
background-color:#fff5f5;padding:3px; ">
 +
FindObjectEntry.exe URB_PierA_Terror_CovExt.upk TheWorld.PersistentLevel.XComWaveSystem_0 > TheWorld.PersistentLevel.XComWaveSystem_0.txt
 +
</span><br>
 +
This will place the object information in the file '''TheWorld.PersistentLevel.XComWaveSystem_0.txt''' for examination.
  
 
''XGOvermind.Init'' function initializes all map spawns and contains ''InitWaveSystem'' call (along with ''DeployPods'' call).
 
''XGOvermind.Init'' function initializes all map spawns and contains ''InitWaveSystem'' call (along with ''DeployPods'' call).
Line 68: Line 65:
 
''AddCharTypeToScalableList'' sorts aliens by type and adds them to three lists: '''m_arrScalableList''' contains all the types available, '''m_arrScalableFlyInList''' contains only flying units, and '''m_arrScalableDropInList''' contains only characters with '''HasTraversal''' property (i.e. those, who can climb ladders).
 
''AddCharTypeToScalableList'' sorts aliens by type and adds them to three lists: '''m_arrScalableList''' contains all the types available, '''m_arrScalableFlyInList''' contains only flying units, and '''m_arrScalableDropInList''' contains only characters with '''HasTraversal''' property (i.e. those, who can climb ladders).
  
When the time comes for another wave, ''SpawnGroup'' function is called, which in turn calls to ''SetScalingAliens'' function.
+
When the time comes for another wave, ''SpawnGroup'' function is called, which in turn calls to the ''SetScalingAliens'' function.
  
If alien group is '''Scalable''' (which is set in properties of alien wave), ''SetScalingAliens'' initializes '''AlienType''' with random alien from one of the ''Scalable Groups'', described above. If group is not '''Scalable''', it forces '''ExaltOperatives''' for Exalt maps and '''ThinMan''' for the other maps.
+
If alien group is '''Scalable''' (which is set in properties of alien wave), ''SetScalingAliens'' initializes '''AlienType''' with random alien from one of the ''Scalable Groups'', described above. If the group is not '''Scalable''', it forces '''ExaltOperatives''' for '''EXALT''' maps and '''ThinMan''' for the other maps.
  
In '''DefaultMaps.ini''' '''AlienType''' is defined explicitly for Council Missions via '''DynamicAliens''' array, but not defined ('''eChar_None''') for Exalt maps. I think it's done to allow for two different Exalt types (regular and elite) for the same maps.
+
Spawn point for the dynamic alien is chosen randomly from the array of available spawn points. And there are plenty of spawn points for '''EXALT''' maps. '''NumAliens''' is defined via '''XComWaveSystem_0''' for those maps, and changing those values does alter the results.
  
Spawn point for the dynamic alien is chosen randomly from the array of available spawn points. And there are plenty of spawn points for Exalt maps. '''NumAliens''' is defined via '''XComWaveSystem_0''' for those maps, and changing those values does alter the results.
+
* '''DropIn''' spawns use ''overwatch''. Any '''EXALT''' unit can spawn as a '''DropIn''' unit, not only snipers. '''WalkIn''' units spawn without ''overwatch''. In theory this can be changed, but it won't be easy, as there is no spawn method entry for those waves.
  
* DropIn spawns use overwatch. Any EXALT unit can spawn as DropIn unit, not only sniper. WalkIn units spawn without overwatch. In theory this can be changed, but it won't be easy, as there is no spawn method entry for those waves.
+
* Spawn time seems to be controlled through linked variables, which are set by events. One can determine which wave spawns when by setting a different number of units per spawn and observing the result in actual gameplay. Or by digging through all sequence action objects.
  
* Spawn time seems to be controlled through linked variables, which are set by events. One can determine which wave spawns when by setting a different number of units per spawn and observing the result in actual gameplay. Or by digging through all sequence action objects, which will be a pain.
+
For '''EXALT''' maps the triggers are already known from experience: approaching active arrays 1 and 2, or the operative approaching the evacuation zone. The trick is to determine which event triggers which wave. And as linked event names are buried inside default properties of the '''SeqEvent''' object, it is necessary to decompile the entire map to find the proper triggers.
 
 
Managed to decompile EXALT linked events, which trigger the waves. But it is still a pain. Most triggers are already known from experience: approaching an array, hacking first array, hacking second array, operative approaching evac zone. The trick is to determine which event triggers which wave. And as linked event names are buried inside default properties of '''SeqEvent''' object, need to decompile all to find proper triggers.
 
  
 
"Capture and hold" missions are actually easier to comprehend as events have human-friendly names.
 
"Capture and hold" missions are actually easier to comprehend as events have human-friendly names.
  
URB_CommercialRestaurant_CNH has 2 alien pods too.  All exalt maps do.  Wave system for this map contains two sets:
+
The Wave System for URB_CommercialRestaurant_CNH map contains two sets:
 
* 1st set:
 
* 1st set:
 
*: disabled when TransmitterCaptured
 
*: disabled when TransmitterCaptured
Line 108: Line 103:
 
*** Group 2: 1 unit with 6 possible spawn points, drop in, overwatch.
 
*** Group 2: 1 unit with 6 possible spawn points, drop in, overwatch.
  
All the maps seem to follow the same pattern, only spawn points are different.
+
All the maps seem to follow the same pattern: only spawn points are different.
  
I've been thinking... Spawn point or pod point - it doesn't actually make any difference, as only coordinates are used in most cases. It is possible to iterate through all the '''XComSpawnPoint_Alien''' map objects, extract coordinates and set spawn locations, based on those coordinates instead of '''XComAlienPod's'''. This will allow for more stationary pods per map.
+
To summarize the results: since spawn locations are extremely limited (2 for covert extraction maps, 6 for capture and hold maps), we can't increase the number of stationary '''EXALT''' pods. So, to increase mission difficulty we need to mod the Wave System. There are plenty of spawn points for dynamic aliens (like 20-30 for each map), so it is very possible to increase a number of '''EXALT''' reinforcements. Spawn timings are tied in to events. It is theoretically possible to mod those, but, IMO, it won't do any good, as spawn points for each wave are tied in to specific trigger locations. Hence, we need to determine which event triggers which wave and adjust it accordingly. Maps will still be scripted, but will be more difficult.
  
To summarize the results: since spawn locations are extremely limited (2 for covert extraction maps, 6 for capture and hold maps), we can't increase the number of stationary EXALT pods. So, to increase mission difficulty we need to mod the wave system. There are plenty of spawn points for dynamic aliens (like 20-30 for each map), so it is very possible to increase a number of EXALT reinforcements. Spawn timings are tied in to events. It is theoretically possible to mod those, but, IMO, it won't do any good, as spawn points for each wave are tied in to specific trigger locations. Hence, we need to determine which event triggers which wave and adjust it accordingly. Maps will still be scripted, but will be more difficult.
+
As a side note, it is possible to mod dynamic alien types inside the Wave System class itself. Remember: It cannot help in modding Council Missions, as those use ''triggers'' instead of the Wave System.
 +
 
 +
==Deployment process==
 +
===Battle Initialization===
 +
 
 +
Apparently, the ''InitPlayers()'' function, which is called from inside '''Initing''' and '''Loading''' states of '''XGBattle''', does call all the necessary alien init functions.  And pods or individual aliens, created by random spawn, show up immediately. It is also called during briefing in the Strategy game, as errors in the deployment code will crash it then.
 +
 
 +
But there are a lot of code, which is used for debug missions init. For example, when you create a mission from developer shell menu. And there is a lot of if-else "safety" code, which checks for proper initialization.
 +
 
 +
'''XGBattle''' state '''Initing''' calls for the functions:
 +
* ''InitDescription()''
 +
* ''InitLevel()''
 +
* ''PostLevelLoaded()''
 +
* ''InitPlayers()''
 +
 
 +
''XGBattle_SP.InitDescription()'' calls for ''XGBattleDesc.InitAlienLoadoutInfos()'', which builds pods and loadouts.
 +
 
 +
In EW ''XGBattle_SP.PostLevelLoaded()'' inits meld containers and capture points by calling ''InitMeldContainers()'' and ''InitCapturePoints()'' respectively.
 +
 
 +
''XGBattle_SP.InitPlayers()'' calls for ''XComAlienPodManager.InitPods()'' and then for each player calls ''XGAIPlayer.LoadSquad()''.
 +
 
 +
''XComAlienPodManager.InitPods()'' centers each pod location on the tile, inits patrol routes (if the pod has any), checks if the pod is enabled and hides/shows the pod body depending upon the current situation.
 +
 
 +
''XGAIPlayer.LoadSquad()'' calls for ''XGAIPlayer.CreateSquad()''.
 +
 
 +
There are several places along this chain of function calls, where transfer data is checked and created if necessary: mission description, narrative moments, human squad, etc.
 +
 
 +
An alien squad is created by ''XGAIPlayer.CreateSquad()'':
 +
: ''XComAlienPodManager.InitPlayer()'' is called, which initializes ''Overmind'' by calling ''XGOvermind.Init()''. ''XGOvermind.Init()'' performs alien spawn initialization by calling for ''XGDeployAI.DeployPods()'', which assigns a pod from the transfer save to map pod "placeholders".
 +
 
 +
: ''XComAlienPodManager.SpawnAllPodAliens()'' then tries to spawn preplaced pods. If it fails, the code tries to create random pods on any available ''XComAlienPod'' "placeholder". If this fails also, the function creates random individual aliens, randomly distributed throughout the map.
 +
 
 +
: ''XComAlienPodManager.SpawnAllPodAliens()'' first tries to create pods from the transfer save. If it fails, it calls for ''CheckAlienCounts()'' to try and build pods from information embedded into ''XComAlienPod'' "placeholders". It analyzes all the information and creates pods, based upon specialty, alien numbers and patrol routes: as many as it can.
 +
 
 +
With so many "safety" spawns, suspect this code will create an alien squad even on totally empty map.
 +
 
 +
All the particle effects and dynamic spawns are embedded into the map package.
 +
 
 +
===XGDeployAI===
 +
This class is used to deploy all units on the tactical map. Main deployment function is ''DeployPods'':
 +
<code>
 +
function array<TAlienSpawn> DeployPods(out TAlienSquad kAlienSquad)
 +
{
 +
    m_kSquad = kAlienSquad;
 +
    SetDeploymentFlags();
 +
    GetPlayerStart();
 +
    GetPossibleSpawns();
 +
    DeployMissionCommander();
 +
    DeploySecondaryAliens();
 +
    DeploySoldiers();
 +
    DeployHunters();
 +
    DeployRoaming();
 +
    return m_arrDeployments;
 +
    //return ReturnValue;   
 +
}
 +
</code>
 +
It takes '''kAlienSquad''' as an input, calculates '''Deployment Flags''', sets '''Player Start''' location, gets '''Possible Spawn''' points from map package and deploys all aliens.
 +
 
 +
===Deployment Flags===
 +
XCOM Soldier deployment order is determined by '''Deployment Flags''':
 +
<code>
 +
enum EDeploymentFlags
 +
{
 +
    eDeploy_Random,
 +
    eDeploy_ClosestFirst,
 +
    eDeploy_FurthestFirst,
 +
    eDeploy_Custom,
 +
    eDeploy_MAX
 +
};
 +
</code>
 +
For '''Council Missions''' ''SetDeploymentFlags'' function sets '''eDeploy_FurthestFirst''' flag, for '''Abductions''' it sets '''eDeploy_ClosestFirst''' flag if there are 2 or less pods in '''Alien Squad''', and '''eDeploy_Random''' if there are 3 or more pods. For every other case '''Deployment Flags''' are set to '''eDeploy_Random'''.
 +
 
 +
===Possible Spawn Points===
 +
'''Possible Spawn Points''' are extracted directly from map packages by ''GetPossibleSpawns'' function: it requests ''WorldInfo for AllActors'' of '''XComAlienPod''' class (subclasses get counted too, as they are of '''XComAlienPod''' class too) and places it into an array. Function then checks if pod is enabled (via '''bUse''' property, see [[Spawn Points - XCOM:EU 2012]]) and in '''Group0''' and deletes the pod from array of possible pods if not. Function then sorts '''Possible Spawns''' by distance from '''Player Start''' (more info on '''Player Start'''), so closest '''Spawn Points''' are moved to array beginning; and furthest to array end.
 +
 
 +
===DeployMissionCommander===
 +
This function finds all '''Commander Pods (pods of type=1)''' in '''Alien Squad''', requests for '''Possible Commander Spawns''' by calling ''GetPossibleCommanderSpawns'' function and places a pod randomly on one of the '''Possible Commander Spawns''' locations by calling ''BuildSpawn'' fucntion.
 +
 
 +
===GetPossibleCommanderSpawns===
 +
This function iterates through all '''Possible Spawn Points''' and returns an array of points marked as '''Commander Spawn''' (via '''bCommanderPod''' property, more info on it in '''XComAlienPod''' class). If no specific '''Commander Spawns''' exist, it returns farthest point of the array of Possible Spawns.
 +
 
 +
===BuildSpawn===
 +
Places a pod on a specified '''Possible Spawn''' point and removes this point from array of '''Possible Spawns'''.
 +
 
 +
''DeploySecondaryAliens'' function works the same way, but checks for '''Secondary pods (Type=2)''', requests specific '''Secondary Spawns''' first and returns a random spawn from array of '''Possible Spawns''' if none are found.
 +
 
 +
''DeploySoldiers'' function deploys '''Soldier Pods (Type=0)''' in according with '''Deployment Flags'''. It calls for ''GetPossibleSoldierSpawns'' function and places a pod in first spawn points if '''eDeploy_ClosestFirst''' flag is set, on last spawn point if '''eDeploy_FurthestFirst''' is set, and on random spawn point from the array of Possible Spawns otherwise.
 +
 
 +
''GetPossibleSoldierSpawns'' works similar to ''GetPossibleCommanderSpawns'', but returns a closest spawn point if all the remaining Possible Spaws are of Commander or Secondary type.
 +
 
 +
===DeployRoaming===
 +
This function does not deploy the aliens, but triggers a global event '''SeqEvent_RoamingAlienNumberSet''' instead, which sets '''iNumAliens''' variable to '''iNumDynamicAliens''' value, defined in '''Alien Squad'''. Dynamic aliens are used in '''Council Missions''' for handling '''ThinMan''' (and other aliens in DLC) drop-downs. '''EXALT''' maps use '''XCOMWaveSystem''' instead.
 +
 
 +
===DeployHunters===
 +
This function does nothing.
 +
 
 +
===XGDeployAI Summary===
 +
* Units positions on map are defined per map individually inside map packages.
 +
* '''Player Start''' location is determined first, then all the other positions are sorted relative to that one.
 +
* Maximum number of pods per map are determined via number of '''XComAlienPod''' objects, defined in that map.
 +
* Any pod can be placed on any position: placement priority is determined via '''XComAlienPod''' type first, and specific functions second.
 +
* Only Soldier pods use '''Deployment Flags''' info.
 +
* ''Roaming'' (i.e. ''dynamic'') aliens are deployed via trigger events ('''Council Missions''') or the Wave System ('''EXALT''' Missions).
 +
 
 +
==EXALT Wave Summary==
 +
This is summary of the information in the map files related to the Wave System for '''EXALT''' missions from ''EW''.
 +
 
 +
<code>
 +
EXALT info
 +
-----------
 +
 
 +
Covert Extraction
 +
-----------------
 +
 
 +
Maps (streams):
 +
---------------
 +
DLC2_1_Portent_CovExt.upk
 +
URB_CommercialAlley_CovExt.upk
 +
URB_ConvienienceStore_CovExt.upk
 +
URB_HighwayConstruction_CovExt.upk
 +
URB_LiquorStore_CovExt.upk
 +
URB_MilitaryAmmo_CovExt.upk
 +
URB_PierA_Terror_CovExt.upk
 +
URB_ResearchOutpost_CovExt.upk
 +
URB_StreetOverpass_CovExt.upk
 +
URB_Trainyard_CovExt.upk
 +
 
 +
Pods:
 +
-----
 +
2 pods on each map
 +
 
 +
Radars:
 +
-------
 +
4 radar arrays, 2 get activated randomly
 +
 
 +
Wave system:
 +
------------
 +
 
 +
~10 units total
 +
 
 +
drop-in method uses overwatch, walk-in doesn't use overwatch
 +
 
 +
DLC2_1_Portent_CovExt, 5 sets:
 +
------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 3 waves
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 4 possible spawn points
 +
    wave[1]: turn 2, 2 groups
 +
        group[0]: 1 unit, drop-in, 3 possible spawn points
 +
        group[1]: 1 unit, drop-in, 3 possible spawn points
 +
    wave[2]: turn 4, 2 groups
 +
        group[0]: 1 unit, drop-in, 3 possible spawn points
 +
        group[1]: 1 unit, drop-in, 3 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
 
 +
URB_CommercialAlley_CovExt, 5 sets:
 +
-----------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points (has Hunter == false)
 +
    wave[1]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points (has Hunter == false)
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
 
 +
URB_ConvienienceStore_CovExt, 5 sets:
 +
-------------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, walk-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points (has Hunter == false)
 +
    wave[1]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points (has Hunter == false)
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
 
 +
URB_HighwayConstruction_CovExt, 5 sets:
 +
---------------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, drop-in, 6 possible spawn points
 +
        group[1]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[1]: turn 2, 2 groups
 +
        group[0]: 1 unit, drop-in, 6 possible spawn points
 +
        group[1]: 1 unit, drop-in, 6 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
 
 +
URB_LiquorStore_CovExt, 5 sets:
 +
-------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 2 possible spawn points
 +
    wave[1]: turn 2, 1 group
 +
        group[0]: 2 units, walk-in, 2 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 5 possible spawn points (2 origination points)
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 5 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 5 possible spawn points (2 origination points)
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
 
 +
URB_MilitaryAmmo_CovExt, 5 sets:
 +
--------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
        group[1]: 1 unit, drop-in, 3 possible spawn points
 +
    wave[1]: turn 2, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
 
 +
URB_PierA_Terror_CovExt, 5 sets:
 +
--------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 1 wave:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
 
 +
URB_ResearchOutpost_CovExt, 5 sets:
 +
-----------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 3 units, drop-in, 3 possible spawn points
 +
    wave[1]: turn 1, 1 group
 +
        group[0]: 3 units, drop-in, 4 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 3 possible spawn points
 +
 
 +
URB_StreetOverpass_CovExt, 5 sets:
 +
----------------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 1 wave:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 5 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
 
 +
URB_Trainyard_CovExt, 5 sets:
 +
-----------------------------
 +
On covert operative approaching evac zone
 +
set[0]: 2 waves:
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points
 +
    wave[1]: turn 1, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points
 +
Array 1 reinforcements:
 +
set[1]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 2 reinforcements:
 +
set[2]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
Array 3 reinforcements:
 +
set[3]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
Array 4 reinforcements:
 +
set[4]: 1 wave
 +
    wave[0]: turn 0, 1 group
 +
        group[0]: 2 units, drop-in, 6 possible spawn points
 +
 
 +
Capture and hold
 +
----------------
 +
 
 +
Maps (streams):
 +
---------------
 +
URB_Boulevard_CNH.upk
 +
URB_CommercialRestaurant_CNH.upk
 +
URB_Demolition_CNH.upk
 +
URB_GasStation_CNH.upk
 +
URB_HighwayConstruction_CNH.upk
 +
URB_IndustrialOffice_CNH.upk
 +
URB_OfficePaper_CNH.upk
 +
URB_PoliceStation_CNH.upk
 +
URB_RooftopsConst_CNH.upk
 +
URB_TruckStop_CNH.upk
 +
 
 +
Pods:
 +
-----
 +
2 pods on each map
 +
 
 +
Capture points:
 +
---------------
 +
2 capture points
 +
 
 +
Radars:
 +
-------
 +
4 radar arrays
 +
 
 +
Wave system:
 +
------------
 +
 
 +
~16 units total
 +
 
 +
drop-in method uses overwatch, walk-in doesn't use overwatch
 +
 
 +
Hunter = false
 +
 
 +
URB_Boulevard_CNH, 2 sets:
 +
--------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 3, 1 group
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
    wave[1]: turn 5, 2 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
    wave[2]: turn 7, 3 groups
 +
        group[0]: 2 units, walk-in, 4 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 1 possible spawn point
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 2 units, walk-in, 5 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 4 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
        group[2]: 1 unit, drop-in, 1 possible spawn point
 +
 
 +
URB_CommercialRestaurant_CNH, 2 sets:
 +
-------------------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
    wave[1]: turn 4, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[2]: turn 6, 3 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 2 units, drop-in, 6 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
 
 +
 
 +
URB_Demolition_CNH, 2 sets:
 +
---------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
    wave[1]: turn 4, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 4 possible spawn points
 +
    wave[2]: turn 6, 3 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 4 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
 
 +
URB_GasStation_CNH, 2 sets:
 +
---------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 3, 2 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
    wave[1]: turn 5, 3 groups
 +
        group[0]: 1 unit, drop-in, 2 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
        group[2]: 1 unit, drop-in, 2 possible spawn points
 +
    wave[2]: turn 7, 4 groups
 +
        group[0]: 1 unit, walk-in, 2 possible spawn points, overwatch
 +
        group[1]: 2 units, walk-in, 2 possible spawn points, overwatch
 +
        group[2]: 1 unit, drop-in, 2 possible spawn points
 +
        group[3]: 1 unit, drop-in, 3 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
        group[2]: 1 unit, drop-in, 2 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
 +
        group[1]: 1 unit, drop-in, 2 possible spawn points
 +
        group[2]: 2 units, walk-in, 3 possible spawn points, overwatch
 +
 
 +
URB_HighwayConstruction_CNH, 2 sets:
 +
------------------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 3, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
    wave[1]: turn 5, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[2]: turn 7, 3 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
 
 +
URB_IndustrialOffice_CNH, 2 sets:
 +
---------------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
    wave[1]: turn 4, 3 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
        group[2]: 1 unit, walk-in, 3 possible spawn points
 +
    wave[2]: turn 6, 3 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, walk-in, 6 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
        group[2]: 1 unit, walk-in, 3 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 3 possible spawn points
 +
        group[1]: 1 unit, walk-in, 3 possible spawn points
 +
        group[2]: 1 unit, walk-in, 3 possible spawn points
 +
 
 +
URB_OfficePaper_CNH, 2 sets:
 +
----------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 2, 2 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
    wave[1]: turn 4, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
    wave[2]: turn 6, 3 groups
 +
        group[0]: 2 units, walk-in, 6 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 6 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 5 possible spawn points
 +
        group[2]: 1 unit, walk-in, 4 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 1 unit, walk-in, 6 possible spawn points
 +
        group[1]: 1 unit, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, walk-in, 4 possible spawn points
 +
 
 +
URB_PoliceStation_CNH, 2 sets:
 +
------------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 2, 1 group
 +
        group[0]: 3 units, drop-in, 9 possible spawn points
 +
    wave[1]: turn 4, 1 group
 +
        group[0]: 4 units, drop-in, 8 possible spawn points
 +
    wave[2]: turn 6, 1 group
 +
        group[0]: 3 units, drop-in, 7 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 3 groups
 +
        group[0]: 1 unit, drop-in, 2 possible spawn points
 +
        group[1]: 1 unit, drop-in, 2 possible spawn points
 +
        group[2]: 1 unit, drop-in, 2 possible spawn points
 +
    wave[1]: turn 2, 3 groups
 +
        group[0]: 2 units, drop-in, 2 possible spawn points
 +
        group[1]: 1 unit, drop-in, 2 possible spawn points
 +
        group[2]: 1 unit, drop-in, 2 possible spawn points
 +
 
 +
URB_RooftopsConst_CNH, 2 sets:
 +
------------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 3, 2 groups
 +
        group[0]: 1 unit, drop-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 4 possible spawn points
 +
    wave[1]: turn 5, 3 groups
 +
        group[0]: 1 unit, drop-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points
 +
        group[2]: 1 unit, drop-in, 5 possible spawn points
 +
    wave[2]: turn 7, 4 groups
 +
        group[0]: 2 units, drop-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 5 possible spawn points
 +
        group[2]: 1 unit, drop-in, 5 possible spawn points
 +
        group[3]: 1 unit, drop-in, 4 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 2 units, drop-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 4 possible spawn points
 +
    wave[1]: turn 2, 2 groups
 +
        group[0]: 2 units, drop-in, 5 possible spawn points
 +
        group[1]: 1 unit, drop-in, 4 possible spawn points
 +
 
 +
URB_TruckStop_CNH, 2 sets:
 +
--------------------------
 +
Enabled from the start, disabled with TransmitterCaptured
 +
set[0]: 3 waves:
 +
    wave[0]: turn 3, 2 groups
 +
        group[0]: 1 unit, walk-in, 5 possible spawn points
 +
        group[1]: 1 unit, walk-in, 5 possible spawn points
 +
    wave[1]: turn 5, 3 groups
 +
        group[0]: 1 unit, walk-in, 5 possible spawn points
 +
        group[1]: 1 unit, walk-in, 5 possible spawn points
 +
        group[2]: 1 unit, drop-in, 4 possible spawn points
 +
    wave[2]: turn 7, 3 groups
 +
        group[0]: 2 units, walk-in, 5 possible spawn points
 +
        group[1]: 2 units, walk-in, 6 possible spawn points
 +
        group[2]: 1 unit, drop-in, 4 possible spawn points
 +
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
 +
set[1]: 2 waves
 +
    wave[0]: turn 0, 2 groups
 +
        group[0]: 2 units, walk-in, 4 possible spawn points
 +
        group[1]: 1 unit, walk-in, 5 possible spawn points
 +
    wave[1]: turn 1, 2 groups
 +
        group[0]: 2 units, walk-in, 4 possible spawn points
 +
        group[1]: 1 unit, walk-in, 5 possible spawn points
 +
</code>
  
As a side note, it is possible to mod dynamic alien types inside the wave system class itself. It can help in modding Council Missions, as those poor ThinMen are too weak mid-late game and can be replaced with something else.
 
  
 
==Separate Content==
 
==Separate Content==
Line 235: Line 919:
 
  }
 
  }
 
</code>
 
</code>
 +
Number of units per group is limited by the number of available spawn points. And sadly, there are some maps with 1 spawn point per group only.
 +
 +
Unpacking the map to apply changes doubles the load time.  Besides, there are a lot of maps and editing the Wave System directly for each one of them doesn't seems like a good idea.
  
 
== References ==
 
== References ==
 
Referred to by this article:<br>
 
Referred to by this article:<br>
 
* [[Modding Tools - XCOM:EU 2012]]
 
* [[Modding Tools - XCOM:EU 2012]]
 +
* [[Maps - XCOM:EU 2012]]
 
* [[Spawn Points - XCOM:EU 2012]]
 
* [[Spawn Points - XCOM:EU 2012]]
* [[Maps_-_XCOM:EU_2012]]
 
 
<br><br>
 
<br><br>
 
That refer to this article:<br>
 
That refer to this article:<br>
 +
* [[Maps - XCOM:EU 2012]]
 
* [[Spawn Points - XCOM:EU 2012]]
 
* [[Spawn Points - XCOM:EU 2012]]
* [[Maps_-_XCOM:EU_2012]]
 
 
<br><br>
 
<br><br>
  
Line 254: Line 941:
 
[[Category:Game Files & Modding - XCOM:EU 2012]]
 
[[Category:Game Files & Modding - XCOM:EU 2012]]
 
[[Category:XCOM]]
 
[[Category:XCOM]]
 +
[[Category:Mod_Creation]]

Latest revision as of 03:41, 17 November 2018


Overview

The following is derived from the Nexus Forums threads Modding EXALT and R&D AI Improvements.

There are three separate deployment mechanisms by which units are placed on a map: one for XCOM Soldiers, one for 'walk-in' or 'static' aliens, and one for 'drop-in' or 'dynamic' aliens. All of these units are placed on defined 'spawn point' locations on each map. (See the related wiki articles Maps - XCOM:EU 2012 and Spawn Points - XCOM:EU 2012 for discussion on those specific topics, and in particular instructions on how to extract the relevant map data to examine that information.)

The three deployment mechanisms all work through the same general XGDeployAI process.

Programs and Tools

XCOM soldiers deployment

Soldiers deployment is tied in to TheWorld.PersistentLevel.PlayerStart_X map objects (where "X" is a number), which determine properties of the player start location. Each start location has 6 spawn points determined by TheWorld.PersistentLevel.XComSpawnPoint_X objects. Spawn points are tied in to player start locations by the "Tag" property.

For example, for map CSmallScout_Badlands there are 3 possible starting points: TheWorld.PersistentLevel.PlayerStart_0, TheWorld.PersistentLevel.PlayerStart_1 and TheWorld.PersistentLevel.PlayerStart_2. PlayerStart_0' has "Tag" property set to "Group2". There are 6 spawn points with the same tag: TheWorld.PersistentLevel.XComSpawnPoint_0 through TheWorld.PersistentLevel.XComSpawnPoint_5. Spawn points for XCOM Soldiers have the XComSpawnPoint type property.

On a side note: Meld Canisters spawn points in EW are tied in to the player start locations via "Tag" as well. For example, there are 4 possible spawn points for meld canisters for each of the three player start points. Meld container spawn points have the XComMeldContainerSpawnPoint type property.

Static aliens deployment

Alien pods deployment is handled via XGDeployAI in XComGame. GetPossibleSpawns function requests WorldInfo on AllActors of class XComAlienPod. XComAlienPod_X objects are defined in TheWorld.PersistentLevel of each map. EXALT maps have only two XComAlienPod objects, hence only two pods will be spawned on the map during deployment.

TheWorld.PersistentLevel.XComAlienPod_X objects contain default properties for each XComAlienPod class instance variable. For example, map URB_PierA_Terror_CovExt has two such objects: TheWorld.PersistentLevel.XComAlienPod_1 and TheWorld.PersistentLevel.XComAlienPod_3. Their properties are almost identical, only the Location property is different and sets the pod spawn location:

(See #FindObjectEntry TheWorld.PersistentLevel.XComAlienPod_x in the Separate Content section.)

Another example is map CSmallScout_Badlands, which has four XComAlienPod objects. One of those contains bCommanderPod property set to 1 and stands for commander pod spawn point. XGDeployAI contains GetPossibleCommanderSpawns, GetPossibleSecondarySpawns and GetPossibleSoldierSpawns functions to determine spawn points for corresponding pod types.

XGDeployAI maps actual alien squad to XComAlienPod map objects. It can deploy any pod at any map alien pod "placeholder": for example, if there are no Commanded pods defined, XGDeployAI will place actual Commander pod at the farthest "placeholder" available.

Spawn points for alien pods are extracted using the XComAlienPod.GetSpawnPoint function. (See #XComAlienPod.GetSpawnPoint in the Separate Content section.)

Dynamic aliens deployment: Wave System

Council Missions do not use the Wave System; it was introduced for EW. They use triggers (zones on the map or global events) instead.

XComWaveSystem is a class in XComGame.UPK which is used to spawn aliens dynamically. Wave System parameters are defined for each map directly in the map's UPK as archetype objects in TheWorld.PersistentLevel. Usually maps contain just one Wave System: TheWorld.PersistentLevel.XComWaveSystem_0. You can extract information on wave objects from map file by decompressing it (with UPKDecompressor) and running FindObjectEntry.exe (from UPKUtils):
FindObjectEntry.exe URB_PierA_Terror_CovExt.upk TheWorld.PersistentLevel.XComWaveSystem_0 > TheWorld.PersistentLevel.XComWaveSystem_0.txt
This will place the object information in the file TheWorld.PersistentLevel.XComWaveSystem_0.txt for examination.

XGOvermind.Init function initializes all map spawns and contains InitWaveSystem call (along with DeployPods call).

InitWaveSystem requests WorldInfo on AllActors of class XComWaveSystem and calls XComWaveSystem.Init function. This function checks if a wave is valid and calls InitScalableList function.

InitScalableList iterates through all Pods in AlienSquad and calls AddCharTypeToScalableList for eMain, eSupport1 and eSupport2 types.

AddCharTypeToScalableList sorts aliens by type and adds them to three lists: m_arrScalableList contains all the types available, m_arrScalableFlyInList contains only flying units, and m_arrScalableDropInList contains only characters with HasTraversal property (i.e. those, who can climb ladders).

When the time comes for another wave, SpawnGroup function is called, which in turn calls to the SetScalingAliens function.

If alien group is Scalable (which is set in properties of alien wave), SetScalingAliens initializes AlienType with random alien from one of the Scalable Groups, described above. If the group is not Scalable, it forces ExaltOperatives for EXALT maps and ThinMan for the other maps.

Spawn point for the dynamic alien is chosen randomly from the array of available spawn points. And there are plenty of spawn points for EXALT maps. NumAliens is defined via XComWaveSystem_0 for those maps, and changing those values does alter the results.

  • DropIn spawns use overwatch. Any EXALT unit can spawn as a DropIn unit, not only snipers. WalkIn units spawn without overwatch. In theory this can be changed, but it won't be easy, as there is no spawn method entry for those waves.
  • Spawn time seems to be controlled through linked variables, which are set by events. One can determine which wave spawns when by setting a different number of units per spawn and observing the result in actual gameplay. Or by digging through all sequence action objects.

For EXALT maps the triggers are already known from experience: approaching active arrays 1 and 2, or the operative approaching the evacuation zone. The trick is to determine which event triggers which wave. And as linked event names are buried inside default properties of the SeqEvent object, it is necessary to decompile the entire map to find the proper triggers.

"Capture and hold" missions are actually easier to comprehend as events have human-friendly names.

The Wave System for URB_CommercialRestaurant_CNH map contains two sets:

  • 1st set:
    disabled when TransmitterCaptured
    has 3 waves
    • 1st wave appears on turn 2, has 2 groups.
      • Groups 0 and 1: 1 unit with 6 possible spawn points, walk in, no overwatch.
    • 2nd wave appears on turn 4, has 3 groups.
      • Groups 0 and 1: 1 unit with 6 possible spawn points, walk in, no overwatch.
      • Group 2: 1 unit with 6 possible spawn points, drop in, overwatch.
    • 3rd wave appears on turn 6, has 3 groups.
      • Group 0: 2 units, 6 spawn points, walk in, no overwatch.
      • Group 1: 1 unit, 6 spawn points, walk in, no overwatch.
      • Group 2: 2 units, 6 spawn points, drop in, overwatch.
  • 2nd set:
    enabled with TransmitterCaptured
    disabled with DataRelayCaptured
    has 2 waves
    • 1st wave: 0 turn after enabled, 3 groups.
      • Group 0 and 1: 1 unit with 6 possible spawn points, walk in, no overwatch.
      • Group 2: 1 unit with 6 possible spawn points, drop in, overwatch.
    • 2nd wave: 2 turn after enabled, 3 groups.
      • Group 0 and 1: 1 unit with 6 possible spawn points, walk in, no overwatch.
      • Group 2: 1 unit with 6 possible spawn points, drop in, overwatch.

All the maps seem to follow the same pattern: only spawn points are different.

To summarize the results: since spawn locations are extremely limited (2 for covert extraction maps, 6 for capture and hold maps), we can't increase the number of stationary EXALT pods. So, to increase mission difficulty we need to mod the Wave System. There are plenty of spawn points for dynamic aliens (like 20-30 for each map), so it is very possible to increase a number of EXALT reinforcements. Spawn timings are tied in to events. It is theoretically possible to mod those, but, IMO, it won't do any good, as spawn points for each wave are tied in to specific trigger locations. Hence, we need to determine which event triggers which wave and adjust it accordingly. Maps will still be scripted, but will be more difficult.

As a side note, it is possible to mod dynamic alien types inside the Wave System class itself. Remember: It cannot help in modding Council Missions, as those use triggers instead of the Wave System.

Deployment process

Battle Initialization

Apparently, the InitPlayers() function, which is called from inside Initing and Loading states of XGBattle, does call all the necessary alien init functions. And pods or individual aliens, created by random spawn, show up immediately. It is also called during briefing in the Strategy game, as errors in the deployment code will crash it then.

But there are a lot of code, which is used for debug missions init. For example, when you create a mission from developer shell menu. And there is a lot of if-else "safety" code, which checks for proper initialization.

XGBattle state Initing calls for the functions:

  • InitDescription()
  • InitLevel()
  • PostLevelLoaded()
  • InitPlayers()

XGBattle_SP.InitDescription() calls for XGBattleDesc.InitAlienLoadoutInfos(), which builds pods and loadouts.

In EW XGBattle_SP.PostLevelLoaded() inits meld containers and capture points by calling InitMeldContainers() and InitCapturePoints() respectively.

XGBattle_SP.InitPlayers() calls for XComAlienPodManager.InitPods() and then for each player calls XGAIPlayer.LoadSquad().

XComAlienPodManager.InitPods() centers each pod location on the tile, inits patrol routes (if the pod has any), checks if the pod is enabled and hides/shows the pod body depending upon the current situation.

XGAIPlayer.LoadSquad() calls for XGAIPlayer.CreateSquad().

There are several places along this chain of function calls, where transfer data is checked and created if necessary: mission description, narrative moments, human squad, etc.

An alien squad is created by XGAIPlayer.CreateSquad():

XComAlienPodManager.InitPlayer() is called, which initializes Overmind by calling XGOvermind.Init(). XGOvermind.Init() performs alien spawn initialization by calling for XGDeployAI.DeployPods(), which assigns a pod from the transfer save to map pod "placeholders".
XComAlienPodManager.SpawnAllPodAliens() then tries to spawn preplaced pods. If it fails, the code tries to create random pods on any available XComAlienPod "placeholder". If this fails also, the function creates random individual aliens, randomly distributed throughout the map.
XComAlienPodManager.SpawnAllPodAliens() first tries to create pods from the transfer save. If it fails, it calls for CheckAlienCounts() to try and build pods from information embedded into XComAlienPod "placeholders". It analyzes all the information and creates pods, based upon specialty, alien numbers and patrol routes: as many as it can.

With so many "safety" spawns, suspect this code will create an alien squad even on totally empty map.

All the particle effects and dynamic spawns are embedded into the map package.

XGDeployAI

This class is used to deploy all units on the tactical map. Main deployment function is DeployPods:

function array<TAlienSpawn> DeployPods(out TAlienSquad kAlienSquad)
{
   m_kSquad = kAlienSquad;
   SetDeploymentFlags();
   GetPlayerStart();
   GetPossibleSpawns();
   DeployMissionCommander();
   DeploySecondaryAliens();
   DeploySoldiers();
   DeployHunters();
   DeployRoaming();
   return m_arrDeployments;
   //return ReturnValue;    
}

It takes kAlienSquad as an input, calculates Deployment Flags, sets Player Start location, gets Possible Spawn points from map package and deploys all aliens.

Deployment Flags

XCOM Soldier deployment order is determined by Deployment Flags:

enum EDeploymentFlags
{
   eDeploy_Random,
   eDeploy_ClosestFirst,
   eDeploy_FurthestFirst,
   eDeploy_Custom,
   eDeploy_MAX
};

For Council Missions SetDeploymentFlags function sets eDeploy_FurthestFirst flag, for Abductions it sets eDeploy_ClosestFirst flag if there are 2 or less pods in Alien Squad, and eDeploy_Random if there are 3 or more pods. For every other case Deployment Flags are set to eDeploy_Random.

Possible Spawn Points

Possible Spawn Points are extracted directly from map packages by GetPossibleSpawns function: it requests WorldInfo for AllActors of XComAlienPod class (subclasses get counted too, as they are of XComAlienPod class too) and places it into an array. Function then checks if pod is enabled (via bUse property, see Spawn Points - XCOM:EU 2012) and in Group0 and deletes the pod from array of possible pods if not. Function then sorts Possible Spawns by distance from Player Start (more info on Player Start), so closest Spawn Points are moved to array beginning; and furthest to array end.

DeployMissionCommander

This function finds all Commander Pods (pods of type=1) in Alien Squad, requests for Possible Commander Spawns by calling GetPossibleCommanderSpawns function and places a pod randomly on one of the Possible Commander Spawns locations by calling BuildSpawn fucntion.

GetPossibleCommanderSpawns

This function iterates through all Possible Spawn Points and returns an array of points marked as Commander Spawn (via bCommanderPod property, more info on it in XComAlienPod class). If no specific Commander Spawns exist, it returns farthest point of the array of Possible Spawns.

BuildSpawn

Places a pod on a specified Possible Spawn point and removes this point from array of Possible Spawns.

DeploySecondaryAliens function works the same way, but checks for Secondary pods (Type=2), requests specific Secondary Spawns first and returns a random spawn from array of Possible Spawns if none are found.

DeploySoldiers function deploys Soldier Pods (Type=0) in according with Deployment Flags. It calls for GetPossibleSoldierSpawns function and places a pod in first spawn points if eDeploy_ClosestFirst flag is set, on last spawn point if eDeploy_FurthestFirst is set, and on random spawn point from the array of Possible Spawns otherwise.

GetPossibleSoldierSpawns works similar to GetPossibleCommanderSpawns, but returns a closest spawn point if all the remaining Possible Spaws are of Commander or Secondary type.

DeployRoaming

This function does not deploy the aliens, but triggers a global event SeqEvent_RoamingAlienNumberSet instead, which sets iNumAliens variable to iNumDynamicAliens value, defined in Alien Squad. Dynamic aliens are used in Council Missions for handling ThinMan (and other aliens in DLC) drop-downs. EXALT maps use XCOMWaveSystem instead.

DeployHunters

This function does nothing.

XGDeployAI Summary

  • Units positions on map are defined per map individually inside map packages.
  • Player Start location is determined first, then all the other positions are sorted relative to that one.
  • Maximum number of pods per map are determined via number of XComAlienPod objects, defined in that map.
  • Any pod can be placed on any position: placement priority is determined via XComAlienPod type first, and specific functions second.
  • Only Soldier pods use Deployment Flags info.
  • Roaming (i.e. dynamic) aliens are deployed via trigger events (Council Missions) or the Wave System (EXALT Missions).

EXALT Wave Summary

This is summary of the information in the map files related to the Wave System for EXALT missions from EW.

EXALT info
-----------
Covert Extraction
-----------------
Maps (streams):
---------------
DLC2_1_Portent_CovExt.upk
URB_CommercialAlley_CovExt.upk
URB_ConvienienceStore_CovExt.upk
URB_HighwayConstruction_CovExt.upk
URB_LiquorStore_CovExt.upk
URB_MilitaryAmmo_CovExt.upk
URB_PierA_Terror_CovExt.upk
URB_ResearchOutpost_CovExt.upk
URB_StreetOverpass_CovExt.upk
URB_Trainyard_CovExt.upk
Pods:
-----
2 pods on each map
Radars:
-------
4 radar arrays, 2 get activated randomly
Wave system:
------------
~10 units total
drop-in method uses overwatch, walk-in doesn't use overwatch
DLC2_1_Portent_CovExt, 5 sets:
------------------------------
On covert operative approaching evac zone
set[0]: 3 waves
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 4 possible spawn points
    wave[1]: turn 2, 2 groups
        group[0]: 1 unit, drop-in, 3 possible spawn points
        group[1]: 1 unit, drop-in, 3 possible spawn points
    wave[2]: turn 4, 2 groups
        group[0]: 1 unit, drop-in, 3 possible spawn points
        group[1]: 1 unit, drop-in, 3 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
URB_CommercialAlley_CovExt, 5 sets:
-----------------------------------
On covert operative approaching evac zone
set[0]: 2 waves
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points (has Hunter == false)
    wave[1]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points (has Hunter == false)
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
URB_ConvienienceStore_CovExt, 5 sets:
-------------------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, walk-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points (has Hunter == false)
    wave[1]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points (has Hunter == false)
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
URB_HighwayConstruction_CovExt, 5 sets:
---------------------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, drop-in, 6 possible spawn points
        group[1]: 1 unit, drop-in, 6 possible spawn points
    wave[1]: turn 2, 2 groups
        group[0]: 1 unit, drop-in, 6 possible spawn points
        group[1]: 1 unit, drop-in, 6 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
URB_LiquorStore_CovExt, 5 sets:
-------------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 2 possible spawn points
    wave[1]: turn 2, 1 group
        group[0]: 2 units, walk-in, 2 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 5 possible spawn points (2 origination points)
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 5 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 5 possible spawn points (2 origination points)
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
URB_MilitaryAmmo_CovExt, 5 sets:
--------------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 2 groups
        group[0]: 2 units, drop-in, 3 possible spawn points
        group[1]: 1 unit, drop-in, 3 possible spawn points
    wave[1]: turn 2, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
URB_PierA_Terror_CovExt, 5 sets:
--------------------------------
On covert operative approaching evac zone
set[0]: 1 wave:
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
URB_ResearchOutpost_CovExt, 5 sets:
-----------------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 1 group
        group[0]: 3 units, drop-in, 3 possible spawn points
    wave[1]: turn 1, 1 group
        group[0]: 3 units, drop-in, 4 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 3 possible spawn points
URB_StreetOverpass_CovExt, 5 sets:
----------------------------------
On covert operative approaching evac zone
set[0]: 1 wave:
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 5 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
URB_Trainyard_CovExt, 5 sets:
-----------------------------
On covert operative approaching evac zone
set[0]: 2 waves:
    wave[0]: turn 0, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points
    wave[1]: turn 1, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points
Array 1 reinforcements:
set[1]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 2 reinforcements:
set[2]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
Array 3 reinforcements:
set[3]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Array 4 reinforcements:
set[4]: 1 wave
    wave[0]: turn 0, 1 group
        group[0]: 2 units, drop-in, 6 possible spawn points
Capture and hold
----------------
Maps (streams):
---------------
URB_Boulevard_CNH.upk
URB_CommercialRestaurant_CNH.upk
URB_Demolition_CNH.upk
URB_GasStation_CNH.upk
URB_HighwayConstruction_CNH.upk
URB_IndustrialOffice_CNH.upk
URB_OfficePaper_CNH.upk
URB_PoliceStation_CNH.upk
URB_RooftopsConst_CNH.upk
URB_TruckStop_CNH.upk
Pods:
-----
2 pods on each map
Capture points:
---------------
2 capture points
Radars:
-------
4 radar arrays
Wave system:
------------
~16 units total
drop-in method uses overwatch, walk-in doesn't use overwatch
Hunter = false
URB_Boulevard_CNH, 2 sets:
--------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 3, 1 group
        group[0]: 2 units, walk-in, 6 possible spawn points
    wave[1]: turn 5, 2 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
    wave[2]: turn 7, 3 groups
        group[0]: 2 units, walk-in, 4 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 1 possible spawn point
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 2 groups
        group[0]: 2 units, walk-in, 5 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 4 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
        group[2]: 1 unit, drop-in, 1 possible spawn point
URB_CommercialRestaurant_CNH, 2 sets:
-------------------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
    wave[1]: turn 4, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[2]: turn 6, 3 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 2 units, drop-in, 6 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points


URB_Demolition_CNH, 2 sets:
---------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
    wave[1]: turn 4, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 4 possible spawn points
    wave[2]: turn 6, 3 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 4 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
URB_GasStation_CNH, 2 sets:
---------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 3, 2 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
    wave[1]: turn 5, 3 groups
        group[0]: 1 unit, drop-in, 2 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
        group[2]: 1 unit, drop-in, 2 possible spawn points
    wave[2]: turn 7, 4 groups
        group[0]: 1 unit, walk-in, 2 possible spawn points, overwatch
        group[1]: 2 units, walk-in, 2 possible spawn points, overwatch
        group[2]: 1 unit, drop-in, 2 possible spawn points
        group[3]: 1 unit, drop-in, 3 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
        group[1]: 1 unit, walk-in, 3 possible spawn points, overwatch
        group[2]: 1 unit, drop-in, 2 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points, overwatch
        group[1]: 1 unit, drop-in, 2 possible spawn points
        group[2]: 2 units, walk-in, 3 possible spawn points, overwatch
URB_HighwayConstruction_CNH, 2 sets:
------------------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 3, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
    wave[1]: turn 5, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[2]: turn 7, 3 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
URB_IndustrialOffice_CNH, 2 sets:
---------------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
    wave[1]: turn 4, 3 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
        group[2]: 1 unit, walk-in, 3 possible spawn points
    wave[2]: turn 6, 3 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, walk-in, 6 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
        group[2]: 1 unit, walk-in, 3 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 3 possible spawn points
        group[1]: 1 unit, walk-in, 3 possible spawn points
        group[2]: 1 unit, walk-in, 3 possible spawn points
URB_OfficePaper_CNH, 2 sets:
----------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 2, 2 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
    wave[1]: turn 4, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
    wave[2]: turn 6, 3 groups
        group[0]: 2 units, walk-in, 6 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 6 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 5 possible spawn points
        group[2]: 1 unit, walk-in, 4 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 1 unit, walk-in, 6 possible spawn points
        group[1]: 1 unit, walk-in, 6 possible spawn points
        group[2]: 1 unit, walk-in, 4 possible spawn points
URB_PoliceStation_CNH, 2 sets:
------------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 2, 1 group
        group[0]: 3 units, drop-in, 9 possible spawn points
    wave[1]: turn 4, 1 group
        group[0]: 4 units, drop-in, 8 possible spawn points
    wave[2]: turn 6, 1 group
        group[0]: 3 units, drop-in, 7 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 3 groups
        group[0]: 1 unit, drop-in, 2 possible spawn points
        group[1]: 1 unit, drop-in, 2 possible spawn points
        group[2]: 1 unit, drop-in, 2 possible spawn points
    wave[1]: turn 2, 3 groups
        group[0]: 2 units, drop-in, 2 possible spawn points
        group[1]: 1 unit, drop-in, 2 possible spawn points
        group[2]: 1 unit, drop-in, 2 possible spawn points
URB_RooftopsConst_CNH, 2 sets:
------------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 3, 2 groups
        group[0]: 1 unit, drop-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 4 possible spawn points
    wave[1]: turn 5, 3 groups
        group[0]: 1 unit, drop-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points
        group[2]: 1 unit, drop-in, 5 possible spawn points
    wave[2]: turn 7, 4 groups
        group[0]: 2 units, drop-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 5 possible spawn points
        group[2]: 1 unit, drop-in, 5 possible spawn points
        group[3]: 1 unit, drop-in, 4 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 2 groups
        group[0]: 2 units, drop-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 4 possible spawn points
    wave[1]: turn 2, 2 groups
        group[0]: 2 units, drop-in, 5 possible spawn points
        group[1]: 1 unit, drop-in, 4 possible spawn points
URB_TruckStop_CNH, 2 sets:
--------------------------
Enabled from the start, disabled with TransmitterCaptured
set[0]: 3 waves:
    wave[0]: turn 3, 2 groups
        group[0]: 1 unit, walk-in, 5 possible spawn points
        group[1]: 1 unit, walk-in, 5 possible spawn points
    wave[1]: turn 5, 3 groups
        group[0]: 1 unit, walk-in, 5 possible spawn points
        group[1]: 1 unit, walk-in, 5 possible spawn points
        group[2]: 1 unit, drop-in, 4 possible spawn points
    wave[2]: turn 7, 3 groups
        group[0]: 2 units, walk-in, 5 possible spawn points
        group[1]: 2 units, walk-in, 6 possible spawn points
        group[2]: 1 unit, drop-in, 4 possible spawn points
Enabled with TransmitterCaptured, disabled with DataRelayCaptured
set[1]: 2 waves
    wave[0]: turn 0, 2 groups
        group[0]: 2 units, walk-in, 4 possible spawn points
        group[1]: 1 unit, walk-in, 5 possible spawn points
    wave[1]: turn 1, 2 groups
        group[0]: 2 units, walk-in, 4 possible spawn points
        group[1]: 1 unit, walk-in, 5 possible spawn points


Separate Content

FindObjectEntry TheWorld.PersistentLevel.XComAlienPod_x

FindObjectEntry
Name to find: TheWorld.PersistentLevel.XComAlienPod_1
Found Export Object:
0x000001AA (426): XComAlienPod'TheWorld.PersistentLevel.XComAlienPod_1'
    TypeRef: 0xFFFFFFB7 -> XComAlienPod
    ParentClassRef: 0x00000000 ->
    OwnerRef: 0x0000000C -> PersistentLevel
    NameIdx: 0x000001E3 (Index) 0x00000002 (Numeric) -> XComAlienPod_1
    ArchetypeRef: 0x00000000 ->
    ObjectFlagsH: 0x00000000
    ObjectFlagsL: 0x02070001
        0x00000001: Transactional
        0x00010000: LoadForClient
        0x00020000: LoadForServer
        0x00040000: LoadForEdit
        0x02000000: HasStack
    SerialSize: 0x0000012F (303)
    SerialOffset: 0x00057958
    ExportFlags: 0x00000000
    NetObjectCount: 0
    GUID: 00000000000000000000000000000000
    Unknown1: 0x00000000
Attempting deserialization:
UObject:
    PrevObjRef = 0xFFFFFFB7 -> XComAlienPod
UDefaultPropertiesList:
UDefaultProperty:
    NameIdx: 0x00000140 (Index) 0x00000000 (Numeric) -> PodIndex
    TypeIdx: 0x000000B9 (Index) 0x00000000 (Numeric) -> IntProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Integer: 0x00000000 = 0
UDefaultProperty:
    NameIdx: 0x000000C5 (Index) 0x00000000 (Numeric) -> LightEnvironment
    TypeIdx: 0x0000010D (Index) 0x00000000 (Numeric) -> ObjectProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Object: 0x00000004 = DynamicLightEnvironmentComponent_1387
UDefaultProperty:
    NameIdx: 0x00000101 (Index) 0x00000000 (Numeric) -> NumAliens_Min
    TypeIdx: 0x000000B9 (Index) 0x00000000 (Numeric) -> IntProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Integer: 0x00000001 = 1
UDefaultProperty:
    NameIdx: 0x00000100 (Index) 0x00000000 (Numeric) -> NumAliens_Max
    TypeIdx: 0x000000B9 (Index) 0x00000000 (Numeric) -> IntProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Integer: 0x00000003 = 3
UDefaultProperty:
    NameIdx: 0x00000141 (Index) 0x00000000 (Numeric) -> PodMesh
    TypeIdx: 0x0000010D (Index) 0x00000000 (Numeric) -> ObjectProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Object: 0x00000196 = StaticMeshComponent_272
UDefaultProperty:
    NameIdx: 0x0000004C (Index) 0x00000000 (Numeric) -> CenterpieceMesh
    TypeIdx: 0x0000010D (Index) 0x00000000 (Numeric) -> ObjectProperty
    PropertySize: 0x00000004
    ArrayIdx: 0x00000000
    Object: 0x00000197 = StaticMeshComponent_273
UDefaultProperty:
    NameIdx: 0x000000D1 (Index) 0x00000000 (Numeric) -> Location
    TypeIdx: 0x000001A8 (Index) 0x00000000 (Numeric) -> StructProperty
    PropertySize: 0x0000000C
    ArrayIdx: 0x00000000
    InnerNameIdx: 0x000001D0 (Index) 0x00000000 (Numeric) -> Vector
    Vector (X, Y, Z) = (0x44341EF0, 0x43D73EFE, 0x3A8FFFFA) = (720.483, 430.492, 0.00109863)
UDefaultProperty:
    NameIdx: 0x00000018 (Index) 0x00000000 (Numeric) -> bDirtyComponents
    TypeIdx: 0x0000002B (Index) 0x00000000 (Numeric) -> BoolProperty
    PropertySize: 0x00000000
    ArrayIdx: 0x00000000
    Boolean value: 0x00 = false
UDefaultProperty:
    NameIdx: 0x000001AA (Index) 0x00000000 (Numeric) -> Tag
    TypeIdx: 0x000000F8 (Index) 0x00000000 (Numeric) -> NameProperty
    PropertySize: 0x00000008
    ArrayIdx: 0x00000000
    Name: 0x000001E3 (Index) 0x00000000 (Numeric) = XComAlienPod
UDefaultProperty:
    NameIdx: 0x000000FD (Index) 0x00000000 (Numeric) -> None
Stream relative position: 0x0000012F (303)
UObjectUnknown:
    Object unknown, can't deserialize!

XComAlienPod.GetSpawnPoint

function XComSpawnPoint_Alien GetSpawnPoint(int iAlien, out Vector vLoc_Out, optional bool bUseDefault)
{
   local XComSpawnPoint_Alien kSpawnPoint;
   bUseDefault = false;
   if(!bUseDefault && CustomStartLocations.Length != 0)
   {
       if(iAlien < CustomStartLocations.Length)
       {
           vLoc_Out = CustomStartLocations[iAlien].Location;
           vLoc_Out = XComTacticalGRI(WorldInfo.GRI).GetClosestValidLocation(vLoc_Out, none,, false);
           kSpawnPoint = Spawn(class'XComSpawnPoint_Alien',,, vLoc_Out, rotator(Location - vLoc_Out),, true);
           return kSpawnPoint;
       }
   }
   else
   {
       if(iAlien < NumAliens)
       {
           vLoc_Out = GetDistributedLocationAround(Location, iAlien, Rotation, true);
           kSpawnPoint = Spawn(class'XComSpawnPoint_Alien',,, vLoc_Out, rotator(Location - vLoc_Out),, true);
           return kSpawnPoint;
       }
   }
}

Number of units per group is limited by the number of available spawn points. And sadly, there are some maps with 1 spawn point per group only.

Unpacking the map to apply changes doubles the load time. Besides, there are a lot of maps and editing the Wave System directly for each one of them doesn't seems like a good idea.

References

Referred to by this article:



That refer to this article: