Every system body has one dominant terrain, stored as FCT_SystemBody.DominantTerrain. Generation picks it from the DIM_PlanetaryTerrain catalogue as the last climate step. A climate refresh can later move it within its base family. Ground combat, ground force signatures, ground construction cost and NPR ground planning read its modifiers. The worked examples on this page are deductions from these rules and the terrain catalogue as shipped.

Star system and planetary generation describes the body generation order that ends in the terrain step, and the climate and homeworld rewrites that come before it. Ground combat covers fortification and the full ground combat formulas, which element attacks and damage states. Automated ground forces covers the NPR ground force design that uses species terrain capabilities. The terraforming processing order is in terraforming.

When a game loads, the game reads every row of DIM_PlanetaryTerrain in the order the database returns them, with no sorting. TerrainID and BaseTerrainType become terrain IDs, and both tectonic bounds become tectonic levels. MinTempRange is a whole number, the combat modifiers and the hydro, temperature and oxygen bounds are decimal numbers, and Desert and Jungle are yes or no flags. Each row then joins the catalogue under its TerrainID. A duplicate TerrainID stops the terrain load with an error (Function #1154), and every later row is missing from the catalogue.

Each bound is compared with one body value. MinimumHydro and MaximumHydro compare with HydroExt, the percentage of the surface covered. MinimumTemperature and MaximumTemperature are in Celsius, because every terrain selection first subtracts 273 from a Kelvin temperature. MinimumOxygen compares with the partial pressure of the oxygen gas (gas 10, Oxygen, its FCT_AtmosphericGas.GasAtm value) in atmospheres, not with its percentage. The tectonic bounds compare with TectonicActivity as numbers. Tectonic levels run 1 Dead, 2 Hot Spot, 3 Plastic, 4 Plate Tectonics, 5 Platelet Tectonics and 6 Extreme, so a bound of 0 sits below Dead.

All 41 rows load and stay selectable. The rules that single out a specific terrain by its ID refer only to IDs 1 to 21, from Barren to Sub-Tropical Rift Valley. IDs 22 to 38 and IDs 39, 40 and 41 take part only through their bounds, modifiers, flags and base type.

The game stores Name and Abbreviation for each row. Displays and events show Name. No display or rule uses Abbreviation in play. Three abbreviations repeat in the catalogue. RFV marks Rift Valleys and Arid Rift Valleys, TUN marks Tundra and Subarctic, and DMT marks Desert Mountain, Cold Desert Mountain and Hot Desert Mountain.

BaseTerrainType groups the catalogue into three families. 23 rows have base Barren, 13 have base Mountain and 5 have base Rift Valleys, and each base row is its own base. The base type limits the climate refresh to rows of the same family. It decides the Mountain Warfare and Rift Valley Warfare construction discounts, which match base Mountain and base Rift Valleys, and the combat Mountain Warfare test, which matches any base other than Barren. The DesertTerrain and JungleTerrain flags decide Desert Warfare and Jungle Warfare.

The table lists all 41 rows of DIM_PlanetaryTerrain in TerrainID order, as shipped. Hydro and Temperature give the inclusive minimum and maximum. Tectonics gives MinimumTectonics to MaximumTectonics as tectonic levels, from 0 below Dead to 6 Extreme. Desert and Jungle are the DesertTerrain and JungleTerrain flags.

ID Name Abbreviation FortificationModifier ToHitModifier Hydro MinimumOxygen Temperature (Celsius) Tectonics BaseTerrainType MinTempRange Desert Jungle
1 Barren BAR 1 1 0 to 100 0 -1000 to 100000 0 to 5 Barren 0 No No
2 Steppe STP 1 1 10 to 100 0.01 -10 to 40 0 to 4 Barren 0 No No
3 Mountain MTN 2 0.5 0 to 100 0 -1000 to 100000 4 to 6 Mountain 0 No No
4 Temperate Forest FST 1.25 0.5 20 to 100 0.025 5 to 30 0 to 5 Barren 0 No No
5 Jungle JGL 1.5 0.25 30 to 100 0.035 25 to 80 0 to 5 Barren 0 No Yes
6 Tundra TUN 1 1 10 to 100 0.01 -75 to 0 0 to 5 Barren 0 No No
7 Swamp SWP 0.5 1 60 to 100 0.015 20 to 80 0 to 4 Barren 0 No No
8 Forested Mountain FMT 2.5 0.25 20 to 100 0.025 5 to 30 4 to 6 Mountain 0 No No
9 Jungle Mountain JMT 3 0.125 30 to 100 0.035 25 to 80 4 to 6 Mountain 0 No Yes
10 Desert DST 0.75 1 0 to 30 0 0 to 30 0 to 5 Barren 0 Yes No
11 Taiga TAI 1.25 0.5 20 to 100 0.025 -50 to 5 0 to 5 Barren 0 No No
12 Archipelago ARC 2 1 95 to 100 0 10 to 80 0 to 5 Barren 0 No No
13 Rift Valleys RFV 1.5 0.75 0 to 100 0 -1000 to 100000 5 to 6 Rift Valleys 0 No No
14 Forested Rift Valley FRV 1.875 0.375 20 to 100 0.025 -50 to 30 5 to 6 Rift Valleys 0 No No
15 Jungle Rift Valley JRV 2.25 0.1875 30 to 100 0.035 25 to 80 5 to 6 Rift Valleys 0 No Yes
16 Savanna SAV 1.15 0.75 15 to 100 0.015 20 to 70 0 to 4 Barren 0 No No
17 Chapparal CHA 1.2 0.75 20 to 100 0.02 10 to 60 0 to 4 Barren 0 No No
18 Prairie PRA 1 1 10 to 100 0.01 0 to 50 0 to 4 Barren 0 No No
19 Sub-Tropical SUB 1.2 0.6 25 to 100 0.025 20 to 50 0 to 4 Barren 0 No No
20 Sub-Tropical Mountain SMT 2.4 0.3 25 to 100 0.025 20 to 50 4 to 6 Mountain 0 No No
21 Sub-Tropical Rift Valley SRV 1.8 0.45 25 to 100 0.025 20 to 50 5 to 6 Rift Valleys 0 No No
22 Cold Desert CDT 0.75 1 0 to 30 0 -50 to 0 0 to 5 Barren 0 Yes No
23 Ice Fields ICF 1 1 40 to 100 0 -150 to -50 0 to 5 Barren 0 No No
24 Desert Mountain DMT 1.375 0.75 0 to 30 0 0 to 30 4 to 6 Mountain 0 Yes No
25 Alpine Grasslands ALP 2 0.5 10 to 100 0.01 -40 to 80 4 to 6 Mountain 30 No No
26 Alpine Forests ALF 2.5 0.25 20 to 100 0.025 -50 to 10 4 to 6 Mountain 0 No No
27 Rainforest RNF 1.35 0.425 30 to 100 0.03 25 to 65 0 to 5 Barren 0 No Yes
28 Mountain Rainforest MRF 2.7 0.2 30 to 100 0.03 25 to 65 4 to 6 Mountain 0 No Yes
29 Cold Steppe CST 1 1 10 to 100 0.01 -40 to 10 0 to 4 Barren 0 No No
30 Coniferous Forest CNF 1.25 0.5 20 to 100 0.025 -30 to 20 0 to 5 Barren 0 No No
31 Arid ARD 0.75 1 0 to 30 0 -50 to 200 0 to 5 Barren 30 Yes No
32 Arid Mountain ARM 1.375 0.75 0 to 30 0 -50 to 200 4 to 6 Mountain 30 Yes No
33 Arid Rift Valleys RFV 1.25 0.875 0 to 30 0 -50 to 200 5 to 6 Rift Valleys 30 Yes No
34 Grassland GRS 1 1 10 to 100 0.01 -40 to 80 0 to 4 Barren 30 No No
35 Boreal Forest BRF 1.25 0.5 20 to 100 0.025 -50 to 40 0 to 5 Barren 30 No No
36 Boreal Mountain Forest BMF 2.5 0.25 20 to 100 0.025 -50 to 40 4 to 6 Mountain 30 No No
37 Subarctic TUN 1 1 0 to 30 0 -30 to 20 0 to 5 Barren 0 No No
38 Subarctic Mountain SBM 2 0.5 0 to 30 0 -30 to 20 4 to 6 Mountain 0 No No
39 Hot Desert HDT 0.75 1 0 to 30 0 30 to 200 0 to 5 Barren 0 Yes No
40 Cold Desert Mountain DMT 1.375 0.75 0 to 30 0 -50 to 0 4 to 6 Mountain 0 Yes No
41 Hot Desert Mountain DMT 1.375 0.75 0 to 30 0 30 to 200 4 to 6 Mountain 0 Yes No

Barren, Mountain and Rift Valleys admit temperatures from -1000 to 100000, every hydro value and zero oxygen, so only tectonics limits them. Seven rows carry MinTempRange 30. They are Alpine Grasslands, Arid, Arid Mountain, Arid Rift Valleys, Grassland, Boreal Forest and Boreal Mountain Forest. Only the preferred-terrain pick for homeworld candidates and the climate refresh compute a temperature range, and both require the range to be at least MinTempRange. Generation assignment never checks that column. Swamp, at 0.5, and Desert, Cold Desert, Arid and Hot Desert, at 0.75, have the only FortificationModifier values below 1. Jungle Mountain has the highest FortificationModifier, 3, and the lowest ToHitModifier, 0.125.

Each generated body reaches terrain through one of five paths.

  • Planets. Planet environment setup sets the body to Barren before the tidal lock roll. For a body that is not a gas giant or superjovian, terrain assignment then runs after mineral generation. A gas giant or superjovian keeps Barren.
  • Moons and asteroids. Every moon type gets terrain assignment after its minerals. Belt and trojan asteroids get it after their minerals when they are created.
  • Comets and fixed bodies. Comet creation and fixed asteroid body creation assign Barren directly.
  • Sol. Sol creation reads the DominantTerrain column of DIM_SolSystemBodies and uses Barren for an ID that matches no catalogue row. In the game database as shipped, 623 of the 626 rows hold 0, which matches no row. Earth holds 4 Temperate Forest, Mars 22 Cold Desert and Io 3 Mountain.
  • Homeworld candidates. Homeworld candidate preparation replaces the generated terrain after its atmosphere rewrite, as preferred terrains for homeworld candidates describes.

Terrain assignment applies these steps in order.

  1. It sets Barren and stops at once for a gas giant or superjovian body.
  2. It sums GasAtm over every atmospheric gas as total pressure and takes the oxygen gas’s GasAtm as oxygen pressure. It converts SurfaceTemp to Celsius by subtracting 273.
  3. It keeps Barren and stops when the body is harsh and its tectonics are below Plate Tectonics. A body is harsh at a temperature below -150 or above 200 Celsius, gravity below 0.1, total pressure exactly 0 or total pressure above 10 atm.
  4. It builds the first candidate list. A row qualifies when oxygen pressure is at least MinimumOxygen and the temperature, HydroExt and TectonicActivity each lie inside the row’s inclusive bounds. The list leaves out Barren (ID 1), Mountain (ID 3) and Rift Valleys (ID 13).
  5. When the first list is empty, it rebuilds the list with the same tests and without leaving any row out.
  6. When the list is not empty, a die with as many sides as the list has rows picks one row, so every row has the same chance. The order in which the catalogue is held fixes which die face maps to which row, not the chance.

The harsh test stops assignment only for tectonics below Plate Tectonics. A body with Plate Tectonics or stronger activity reaches the candidate lists even when it is airless or frozen. Every row with MinimumOxygen 0 and matching hydro and temperature bounds then qualifies, which includes the arid, subarctic and desert mountain rows.

The fallback list is never empty for the catalogue as shipped. Barren admits tectonics 0 to 5, Mountain and Rift Valleys admit 6, and all three have open climate bounds. An Extreme body that reaches the fallback therefore becomes Mountain or Rift Valleys, never Barren. Asteroids are created with Dead tectonics and no atmosphere, so the harsh test keeps them Barren.

The terrain list that a Spacemaster sees for a body uses the same oxygen pressure and Celsius temperature. It holds every row whose oxygen, temperature and hydro bounds admit the body. It applies no tectonic bound, no MinTempRange, no gravity or pressure gate and no exclusion, and it does not check the body type. Total pressure plays no part. Barren, Mountain and Rift Valleys therefore appear for every body. When building the list fails, the game shows an error (Function #3024) and supplies no list. Only the System Body Modification window uses this list.

Preferred terrains for homeworld candidates

Section titled “Preferred terrains for homeworld candidates”

Homeworld candidate preparation ends with a terrain step once its rewritten climate passes the surface temperature check, which needs at least 225 K and at most 340 K. With an NPR generation template whose preferred terrain list is not empty, the preferred-terrain pick decides the result, so a candidate that fits none of the preferred terrains is rejected. With an empty list or no template, the candidate runs the climate refresh and is accepted.

Only the NPR Setup window fills the preferred terrain list. The new game NPR generator builds a template only when the Customised NPRs box of the Game Information window is checked. The Empire NPR preset builds a template without preferred terrains. Generating a system that must hold a habitable homeworld from the System Generation and Display window uses no template.

The NPR Setup window lists the catalogue ordered by MinimumTemperature, then MaximumTemperature, MinimumHydro, MinimumTectonics and MinimumOxygen. It keeps only rows with MinimumTemperature above -100 and MinimumHydro below 70. That drops Barren, Mountain, Rift Valleys, Ice Fields and Archipelago and leaves 36 rows, all checked by default. The Create NPR button appends the checked rows to the template’s preferred terrains. Closing the window without Create NPR leaves the list empty, so that candidate takes the refresh path. The rest of the window is described in NPR generation.

The preferred-terrain pick applies these steps in order.

  1. It computes oxygen pressure as above. Total pressure plays no part.
  2. It sets a low and a high temperature from the orbital surface temperature. A moon uses its parent’s apoapsis for the low value and periapsis for the high value. Any other body uses its own apoapsis and periapsis. The range is high minus low in kelvin, and both values then lose 273. These values always replace the SurfaceTemp starting value, and a circular orbit gives range 0.
  3. It rejects the candidate when the low value is below -150 or the high value is above 200.
  4. It filters the template’s preferred terrains, not the whole catalogue. A row qualifies when oxygen pressure is at least MinimumOxygen, low is at least MinimumTemperature, high is at most MaximumTemperature, HydroExt and TectonicActivity lie inside their bounds and the range is at least MinTempRange.
  5. It rejects the candidate for an empty list. Otherwise a uniform die picks a row, the body takes the catalogue terrain with that TerrainID, and the candidate is accepted.

The orbital surface temperature at a distance d in AU works as follows.

  • The equilibrium temperature is 255 / sqrt(d / sqrt(star luminosity)), at least 4 K.
  • The result is equilibrium temperature x greenhouse factor x Albedo / anti-greenhouse factor, at least 1 K.
  • When the body has atmospheric gases, the greenhouse factor is 1 + AtmosPress / 10 + greenhouse gas pressure, at most 3. The anti-greenhouse factor is 1 + DustLevel / 20000 + anti-greenhouse gas pressure, at most 3. Without gases both factors are 1.
  • A gas counts toward either factor only when equilibrium temperature x SurfaceTemp / BaseTemp is at or above the gas’s boiling point.
  • When HydroExt is above 0 and the result would change the hydrosphere phase, the albedo used for this calculation rises by 0.0015 x HydroExt if the hydrosphere leaves an ice sheet and falls by 0.0015 x HydroExt if it becomes one. A phase change that does not involve an ice sheet leaves the albedo as it was. The temperature is then computed again with that albedo, at least 1 K. The body’s own Albedo does not change.

The template path has no gravity or total pressure gate and no year-length condition. A rejection leaves the atmosphere rewrite in place, as Sol homeworlds and setup overrides states for the candidate rewrite. Its only gate before the row filter is the low and high temperature check of -150 and 200 Celsius.

The climate refresh keeps a terrain inside its BaseTerrainType family. It applies these steps in order.

  1. A gas giant or superjovian body becomes Barren, and the refresh ends without an event.
  2. Gravity below 0.1, total pressure exactly 0 or total pressure above 10 atm reverts the terrain to its base row. When the terrain already is its base row, the refresh ends without an event. Otherwise it logs the change and ends.
  3. Both seasonal temperatures start at SurfaceTemp - 273, with range 0. A moon whose parent’s Year is below 4380 hours takes the orbital surface temperatures at the parent’s apoapsis, for the minimum, and periapsis, for the maximum. Any other body whose own Year is below 4380 hours takes its own. The range is maximum minus minimum in kelvin, before both values lose 273. A longer year keeps the single SurfaceTemp value.
  4. A minimum below -150 or a maximum above 200 Celsius reverts to the base row in the same way as step 2.
  5. When the terrain is Barren, Mountain or Rift Valleys, the candidates are the other rows of the same family that pass the oxygen, temperature, hydro, tectonic and MinTempRange tests. The minimum temperature must be at least MinimumTemperature, the maximum at most MaximumTemperature and the range at least MinTempRange. With no candidate the terrain stays unchanged. Otherwise a uniform die picks a row and the refresh logs the change.
  6. For any other terrain, the candidates are the family rows that pass the same tests, including the current row and the base row. The terrain stays unchanged when the current row qualifies or the list is empty. With more than one candidate, the base row is removed. A uniform die then picks the new row and the refresh logs the change.

The refresh never moves a body to another family. A body that generation placed in the Barren family can reach any Barren-family row the climate admits, but never a mountain row. A body holding a MinTempRange 30 row fails that row on its next refresh when its year, or for a moon its parent’s year, is 4380 hours or more, because its range stays 0. It then moves to another qualifying family row, or to the base row when that is the only candidate.

Each change logs one Change to Dominant Terrain event (event type 284) in the population environment category for every distinct race with a population on the body. The text reads “Due to changes in climate, the dominant terrain on X has changed from A to B”, where X is the place name, A the old terrain name and B the new one. The event is tied to that race’s first population on the body. The pressure-gate message uses the population’s PopName as the place name. The other three messages use the body name as that race sees it.

Path Trigger
Orbital motion update Eccentric planets and comets, eccentric asteroids that are not trojans when Orbital Motion for Asteroids (Game Information window) (FCT_Game.OrbitalMotionAst) is 1 or the update is forced, moons of eccentric parents and eccentric trojans. Each first gets a new BaseTemp of 255 / sqrt(distance / sqrt(luminosity)), with the distance to the star in AU, at least 4, and a moon takes its parent’s BaseTemp. The hydrosphere transition and the pressure update run before the terrain refresh. Fixed bodies are skipped in the system-wide and game-wide planet, comet and asteroid lists. An update for a single body adds that body whatever its type. Without the force flag the whole update is skipped when Orbital Motion for Planets (FCT_Game.OrbitalMotion) is 0.
System generation and new game Sol setup Forced orbital motion update of 10000 seconds right after generation, so eccentric bodies refresh at once
Reload completion Forced game-wide orbital update of 60 seconds, using the eccentric-body terrain path above
Stellar type or orbit edit After direct body recalculations, a forced 60-second update of the system also reaches the eccentric-body terrain path
Death spiral A body that survives the orbital decay step gets a forced single-body update of 10 seconds, reaching the terrain path if eccentric
Update Body in System Body Modification After direct recalculations of the selected body and its moons, a forced 1-second update of the system also reaches the eccentric-body terrain path
Star climate update Every non-moon body of the star, then its moons. A non-moon body gets the same new BaseTemp formula, a moon takes its parent’s, and the surface temperature and pressure updates run before the terrain refresh. New game Sol setup runs it, and so does each luminosity change of a stellar warming or cooling disaster
Homeworld candidate preparation Template absent or without preferred terrains
New planet orbit setup Eccentric planet created in the Spacemaster Add Planet window, after its new BaseTemp
Body environment and orbit recalculation Stellar type or orbit change of a star, and the Update Body button of the System Body Modification window
Gas pressure change Direct change of one gas pressure
Environment recalculation Toxic gas removal, oxygen and climate gas adjustments
Terraforming Terraforming step, ordered in terraforming
Spacemaster hydro extent edit SM: Set Hydro button of the Economics window

In ground combat, each attacking unit’s hit chance out of 10000 starts from 2000 x body ToHitModifier x attacker Morale / 100, where 2000 is the base hit chance. The terrain factor applies on both fortification branches. At a target FortificationLevel of exactly 1, the chance also multiplies by the ToHitModifier of the target class’s base type, and the defence divisor is 1. When the target’s FortificationLevel is not exactly 1, the base type factor is left out, and the defence divisor is FortificationModifier x FortificationLevel x target formation defence bonus multiplier. A non-combat attacking class divides the chance by 5. The chance is then divided by the defence divisor times the environment divisor.

The environment divisor starts at 1. It doubles for each species limit the attacker’s class cannot handle, which means gravity below the species minimum without Low Gravity Combat, gravity above the maximum without High Gravity Combat, pressure above the maximum without Extreme Pressure Combat, and temperature outside the species range without Extreme Temperature Combat. A terrain with DesertTerrain set and a class with Desert Warfare halves it. A terrain with JungleTerrain set and a class with Jungle Warfare halves it again. Mountain Warfare halves it on any terrain whose base is not Barren, which includes the Rift Valleys family. Ground combat does not use Rift Valley Warfare in play. Before each shot, the chance is multiplied by the attacking formation’s offence bonus multiplier, or by its artillery bonus multiplier for a bombardment weapon. That multiplication carries over to the unit’s next shot. A d10000 roll at or below the chance hits.

Ship ground attacks use the same ToHitModifier factor and defence divisor in the orbital direct-fire weapon attack and in the missile attack. Their chance is 2000 x ToHitModifier x ship crew performance modifier x ground support commander bonus x strike hit modifier. At FortificationLevel 1 it also multiplies by the target base type’s ToHitModifier, and at any other level it divides by the defence divisor. At any other level the base type factor is left out. Crew performance, the commander bonus and the strike’s hit modifier take the place of attacker morale. A direct-fire weapon whose to-hit modifier is above 0 and below 1 also multiplies the chance by that modifier. The ship formula is in ground combat.

Space weapons fired at ground formations also use terrain when the combat aftermath resolves their hits. A beam or laser-warhead hit starts from 2000 x ToHitModifier x target element Morale / 100. At FortificationLevel 1 it multiplies by the base type’s ToHitModifier and 0.33. At any other level it multiplies by 0.33, or by 1 against a target attacked as an STO Ground Forces contact, and divides by the same defence divisor. When a ship made the attack, the chance is then multiplied by that ship’s tactical effectiveness multiplier. The missile attack has no 2000 base and no 0.33 factor. It takes ToHitModifier x Morale / 100, with the base type factor at level 1, divides by the defence divisor and multiplies by 10000. The remaining hit rules are in space combat.

A ground element’s fortification-adjusted size is class size x Units / (FortificationLevel x FortificationModifier), or 0 when its formation is not at a population. A formation’s ground force contact tonnage sums the same quotient over the formation’s elements. It also stores that sum as the formation’s total size, which other updates recompute as class size times units without the divisor.

A population’s total ground force contact strength is the sum of its formations’ contact tonnages divided by 100. Its STO ground force signature toward a detecting race is the sum of the adjusted sizes of the elements that race has detected, divided by 100. During sensor checks the game recalculates the total for each alien population. When the total is positive, it finds the first of the detecting race’s active sensors in that system whose range covers the population. Sensor resolution is a whole number. When a sensor’s resolution exceeds the ground force signature of 5, its range is multiplied by the square of 5 divided by the resolution. That division drops the fraction and gives 0, so such a sensor detects ground forces only at distance 0. The distance test is inclusive. That sensor creates an STO Ground Forces contact at the STO signature with the fraction dropped when that signature is positive, and a Ground Forces contact at the remainder with the fraction dropped. A FortificationModifier above 1 and a higher FortificationLevel therefore lower both contact strengths, and Swamp’s 0.5 doubles them against Barren.

The NPR ground posture update for a population estimates the local balance when every hostile formation on the body is away from the front line, in neither Front Line Defence nor Front Line Attack. Local front-line firepower sums, over the weapon components of Front Line Defence and Front Line Attack formations, units x shots x modified penetration x modified damage x body ToHitModifier. Hostile firepower uses the same sum when the race knows the hostile class’s weapons. Without that weapon intelligence it is Units x 100 x ToHitModifier. The current defence strength of Front Line Defence, Support and Rear Echelon formations is units x armour strength x hit points x FortificationLevel x FortificationModifier. The hostile defence strength uses the same product, with the armour strength estimated at 10 until the race has observed 20 armour penetrations of that class, and the hit points estimated at 10 until the race has observed 20 units of that class destroyed. Both stay at 10 for a class the race has no record of. Front Line Attack formations and the projected front-line defence strength use units x armour x hit points / base type ToHitModifier, with no terrain factor. The posture decisions belong to NPR strategic planning.

When an NPR assigns troop transports to ground force deployment shortfalls, it marks a staging population on the body of each hostile alien population. With a hostile Ground Forces contact for that population, the staging population’s estimated invasion defence strength is 100 x FortificationModifier x 3 x ContactStrength, using the contact’s ContactStrength. Without one, it is hostile population amount x 1000.

Ground force design and construction consumers

Section titled “Ground force design and construction consumers”

When a race of the standard race type (the type of player races and ordinary NPRs) builds an automated ground formation template, the game first clears the species’s ground unit capabilities. It then refills them from the homeworld’s TerrainID by exact match, as automated ground forces describes. Automated class creation passes that set to each new ground unit class.

Capability Homeworld TerrainID that grants it
Desert Warfare Desert (10)
Jungle Warfare Jungle (5), Jungle Mountain (9), Jungle Rift Valley (15)
Mountain Warfare Mountain (3), Jungle Mountain (9), Forested Mountain (8), Sub-Tropical Mountain (20)
Rift Valley Warfare Rift Valleys (13), Forested Rift Valley (14), Jungle Rift Valley (15), Sub-Tropical Rift Valley (21)

The grant ignores the DesertTerrain and JungleTerrain flags and BaseTerrainType. A homeworld on any row from ID 22 up therefore grants nothing, including Cold Desert, Rainforest and Desert Mountain, whose flags mark them as desert or jungle terrain. Only TerrainID 10, Desert, grants Desert Warfare.

The build cost of a formation template at a population divides each class’s cost by the capability’s CostMultiplier from DIM_GroundUnitCapability when the construction population’s terrain matches. Each of the four terrain capabilities has CostMultiplier 1.25 in the game database as shipped. Mountain Warfare matches base Mountain, Rift Valley Warfare matches base Rift Valleys, Desert Warfare matches DesertTerrain and Jungle Warfare matches JungleTerrain. Each matching capability divides the cost again, and the total is the adjusted class cost times units, summed over the template’s elements. The combat mountain test is broader than this cost test, because combat accepts any base other than Barren. The cost rules are in production.

The body list of the System Generation and Display window fills its Terrain column with “-” for Barren and with the terrain name otherwise. The Summary tab of the Economics window shows “Dominant Planetary Terrain” with the terrain name, or “Deep Space Pop” for a fixed body.

The System Body Modification window fills its terrain drop-down list with the climate-compatible list, shows the names and selects the current terrain. Picking an entry sets the body’s dominant terrain at once and refreshes the window. The pick is ignored while the window is filling its own controls. No tectonic or MinTempRange test applies, so a Spacemaster can set Mountain on a Dead body. The next climate refresh then works from that row’s family.

These examples are deductions from the rules above and the terrain catalogue as shipped.

  • A terrestrial body at SurfaceTemp 288 K, which is 15 Celsius, has HydroExt 70, oxygen at 0.21 atm of 1 atm total, gravity 1 and Plastic tectonics. No harsh condition holds. The first list is Steppe, Temperate Forest, Chapparal, Prairie, Coniferous Forest, Grassland and Boreal Forest, so each has a 1 in 7 chance. With Platelet Tectonics instead, the list is Temperate Forest, Forested Mountain, Forested Rift Valley, Alpine Grasslands, Coniferous Forest, Boreal Forest and Boreal Mountain Forest.
  • Suppose that body drew Grassland and a later refresh sees the same climate with Year 8760 hours. The seasonal range stays 0, so Grassland and Boreal Forest fail MinTempRange 30. The family list is Barren, Steppe, Temperate Forest, Chapparal, Prairie and Coniferous Forest. Grassland is absent and the list holds more than one row, so the refresh removes Barren and picks among the other five at 1 in 5 each.
  • An airless body at 253 K, which is -20 Celsius, with HydroExt 0 and Extreme tectonics meets the harsh conditions but skips the stop, because Extreme is not below Plate Tectonics. Its first list is Arid Mountain, Arid Rift Valleys, Subarctic Mountain and Cold Desert Mountain, at 1 in 4 each. The same body with Dead tectonics stays Barren.
  • On Jungle Mountain, an attacking element of a combat class with offence bonus multiplier 1, at morale 100 with environment divisor 1, fires its first shot at an element with base type ToHitModifier 1. At FortificationLevel 1 the threshold is 2000 x 0.125 = 250, a 2.5% hit chance. At FortificationLevel 2 with defence bonus 1 it is 2000 x 0.125 / (3 x 2) = 41.67, so d10000 succeeds on 41 faces, 0.41%. The same level 2 target on Barren gives 2000 / 2 = 1000, 10%. A combat class is used because a non-combat class would divide the chance by 5, and the first shot is used because the offence bonus multiplier applies again before every shot.
  • 100 units of size 5 at FortificationLevel 2 on Jungle Mountain give an adjusted size of 500 / 6 = 83.33 tons. That formation adds 0.8333 to the population’s total ground force contact strength, and the Ground Forces contact strength from it alone, with the fraction dropped, is 0. The same formation unfortified on Swamp gives 500 / 0.5 = 1000 tons and adds 10.
  • A homeworld on Jungle Mountain gives the species Jungle Warfare and Mountain Warfare. A homeworld on Desert Mountain gives none, because only TerrainID 10, Desert, grants Desert Warfare, and Mountain Warfare requires one of four IDs from 1 to 21, which are 3, 8, 9 and 20.

FCT_SystemBody stores DominantTerrain as the TerrainID. A new body’s first save writes it, and every later save writes it again for unchanged and changed bodies alike. When a game loads, the stored ID is looked up in the terrain catalogue. An ID the catalogue lacks becomes Barren. Restoring the ID does not itself refresh the climate. Reload completion then forces a 60-second orbital update, which can refresh the terrain of eccentric bodies as described under climate refresh. The terrain catalogue is static data that the game reads from DIM_PlanetaryTerrain when it loads, and no game table copies it.

Nothing in play stores a template’s preferred terrains, so the list matters only during NPR creation. Nothing stores species-level capability rows either. Automated ground template creation rebuilds the species set from the homeworld terrain before each use, and the capabilities a class received persist per class in FCT_GroundUnitCapability.

Related community documentation and developer posts. These may describe a different game version.