This page describes how the game targets and fires ship weapons and surface-to-orbit (STO) weapons, flies missiles, runs point defence, applies damage and destroys ships. It follows the order in which things happen and the state that changes on the way, including the places where that order differs from a simultaneous-combat reading. It covers attacks on populations and ground targets where those attacks go through the same weapon fire as space targets. Full ground combat, boarding rounds and strategic NPR target selection are separate systems.

Point-defence allocation and interception have their own page, point-defence modes, allocation and interception. Formulas on this page keep the game’s exact arithmetic, including whole-number conversions, random comparisons and local limits. Worked examples use synthetic inputs and state them. Each kind of attack has its own hit-chance limits and validity rules. No single limit or rule covers all of them.

Nominal component and missile recipes are in component and ordnance design. Hull armour geometry is in ship and station design. Sensor visibility, signatures, shields and weapon recharge are in ship power, class and detection. Crew effectiveness, delays, recovery and repair are in ship readiness and recovery. Propulsion and stock transfers are in movement and logistics. Remembered enemy capabilities are in intelligence mechanics. NPR sensor, shield, targeting, point-defence estimate and ramming decisions are in NPR tactical and system behaviour.

State Meaning
Fire-control assignment (FCT_FireControlAssignment) One fire-control instance, identified by its component plus its fire-control number (FCNum). It holds the target type and ID, the open-fire state, the point-defence mode, the priority and the concentration.
Weapon assignment (FCT_WeaponAssignment) One numbered weapon linked to that numbered fire control, not merely to its component type.
Weapon recharge (FCT_WeaponRecharge) One numbered weapon’s outstanding recharge or reload. A weapon with no entry counts as ready, so the absence of an entry matters.
Missile salvo (FCT_MissileSalvo) Shared missile type, guidance, target, flight position and endurance, plus a list that maps each individual missile number to its remaining onboard decoys.
Attack record Collected shot, hit and damage information that the damage and aftermath pass consumes. Launch records and point-defence records sit alongside damaging attacks.
Damage and shields Points. These are distinct from HTK, armour columns and depth, hull size in HS and ordnance size.
Distance and speed Distance in kilometres in system coordinates and movement speed in km/s. Fire-control and weapon ranges use their stored kilometre values.
Time Seconds. Absolute game time is a decimal. Increment and subpulse lengths are whole numbers. Each mechanism keeps its own recharge or damage interval.

Attack records count shots fired, total hits, shield hits, armour hits, penetrating hits, decoy hits, missiles destroyed and overkill separately. A recorded hit is therefore not the same thing as a destroyed internal component.

Where the game rounds to the nearest whole number, an exact half rounds to the nearest even number. Where it converts a value to a whole number, it truncates toward zero. Square roots and powers are worked out in floating point, even when the values around them are exact decimals. A percentage threshold has to be read together with its actual random draw and comparison. Ship fire, missile impact, interception and damage each use their own accuracy rules, and no single accuracy formula covers them all.

Before movement, the game can shorten the selected increment. It considers open offensive fire only when the increment is longer than 5 seconds. When it shortens the increment for this reason it logs “Increment length adjusted due to imminent action”. Ships boarded by enemy troops impose their own limit, which is the time until the next boarding round (60 seconds minus the largest boarding clock), never less than 5 seconds. Missile arrival prediction is consulted only when the remaining selected length exceeds 120 seconds. The final increment length is never shorter than 5 seconds. With the One Second Sub Pulse game option on (OneSecondSubPulse = 1), a 5-second increment uses one-second subpulses. This does not move ordinary offensive fire into each one-second subpulse.

To pick the shorter length for open fire, the game looks at undocked ships with zero fire delay and offensive open-fire assignments. Each needs linked weapons, a nonzero effective range and a target within that range, and a target range of -1 does not count. A weapon with no recharge entry gives 5 seconds at once, except for grouped NPR standard-missile batteries. A launcher reload of 5 seconds or less gives 5. Otherwise the candidate time is the remaining recharge (RechargeRemaining) truncated to a whole number. For beam weapons other than gauss cannons, the candidate is RechargeRemaining / min(RechargeRate, undamaged reactor output) x 5. Ships with zero reactor output are skipped. Gauss cannons give 5. NPR standard-missile ships can instead be grouped by identical system survey and coordinates. Each group’s largest outstanding reload counts, and the smallest of these across the groups sets the candidate. These are scheduling estimates. They are not the final firing checks and not the shared reactor recharge allocation.

Position in increment What happens that matters for combat
Before the first subpulse Record the start coordinates of fleets, salvos and contacts. Clear resolution flags and ship combat tracking. Cache each race’s fire-control speed technology (1000 when there is none).
Each subpulse Advance absolute time. Logistics and fleet movement. Missile movement, interceptions and impacts, with their records and aftermath. Then refresh sensors and reduce ship fire and sensor delays.
After the last subpulse Recharge shields. Shore leave, repair and intelligence decay. Advance weapon and STO recharge, escape timers .
End-of-increment space-fire pass Area beam point defence, AMM launches, offensive missile launches, direct fire, STO fire, ongoing acid, records, damage and aftermath, then launch-contact and intelligence updates.
After the space-fire pass Clear the fire-control fired flags and update the detecting races for STO elements that fired. Then, separately, consider ground-combat rounds and other economy and time processing.

The space-fire pass first clears attack and bombardment records. When NPR processing is enabled, NPR open-fire assignments are reset, then the tactical sensor, shield and targeting AI runs for every NPR . An STO element is a candidate when it has a weapon, a target selection other than Do Not Fire and more Units than outstanding recharges, and its system holds a hostile contact updated at exactly the current time. The check for ready STO elements is repeated once for each race, and each repetition looks at the STO elements of every race, not only that race’s own, so the same candidates can be gathered more than once. The NPR decisions made at this point are described in active sensor policy, shield policy and weapon assignment passes.

Ships ready for offensive fire must not be carried by a mothership, must have FireDelay 0 and must have enabled assignments, point defence included. The separate point-defence list requires SensorDelay 0 instead of FireDelay 0. If both lists and the STO candidates are empty, the pass stops before acid processing. Otherwise every ship in the selected combat systems refreshes its effectiveness, speed and tracking. Current active-sensor salvo contacts with a status below Neutral start area point defence and AMM launches. Offensive launches and beam fire follow. Warnings about targets that cannot be attacked are logged and reset. Then STO weapons fire and acid advances. Attack records are applied afterwards. Detection of new launches, launcher intelligence and contact logging and purging finish the pass. The pass ignores how many seconds the increment lasted.

A weapon instance is a component plus a weapon number (WeaponNum). Its linked fire control is a fire-control component plus a fire-control number (FCNum). Recharge matching uses the weapon’s identity. Assigning a target contact copies the contact’s ID and type. It does not open fire and does not check hostility. The manual target list shows the race’s own current contacts in the system, active-sensor or population contacts, leaves out ships on planetary combat orders and lists each population once. It has no hostile-only filter. Opening and ceasing fire change existing undamaged fire-control assignments. Ceasing offensive fire leaves the point-defence mode as it is. Automatic assignment and open-fire settings are described in automatic combat configuration.

Fire at Will is an immediate assignment. It selects current hostile active-sensor ship contacts that the firing race detects in the same system, and leaves out ships that carry that race’s own ground formations. It does not set up automatic target reselection in later increments. Beam targets must be within effective beam range. Each candidate’s weight is max(1, floor(score x 1000)). The score sums, over the linked weapons, the fractional hit chance times the damage at the whole-number range. The score includes jamming and the weapon hit modifier and uses the target’s effective maximum speed when the target is operational, otherwise 0. It leaves out the tactical multiplier, shots per weapon and recharge readiness. Missile targets must be strictly closer than the maximum missile range. Their weight is max(1, floor(size / max(range, 10000) x 10000000 x commercial factor)), with the size in HS and the range in km, where the commercial factor is 0.1 for a class known to have commercial engines and 1 otherwise. The game rolls d(sum of weights), selects the first candidate whose cumulative weight is at least the roll, sets it as the ship’s target and opens fire.

Fire at Will for a whole ship applies its fire delay, which uses the halved Fire at Will mode multiplier, only when inexperienced fleet penalties are enabled (InexpFleets). Fire at Will for a selected fire control places the assignment itself inside that penalties check, so it does nothing at all when penalties are disabled. In these paths the saved autofire setting (Autofire in FCT_Ship) does not reselect targets automatically. Dragging a contact onto a fire control applies the standard delay once, and a flag on the ship prevents a second application. Fleet open fire applies its standard delay only with inexperienced penalties enabled. The exact delay arithmetic and the training and commander state behind it are in ship readiness and recovery.

Eligibility is specific to the entry point

Section titled “Eligibility is specific to the entry point”
Entry point Detection and relation requirements
Manual target list Own current active-sensor or population contacts in the system. No hostility filter.
Fire at Will Own current active-sensor hostile ship contacts in the system. Ships carrying the race’s own troops are excluded.
Already assigned direct-fire target The target must still exist and belong to a supported target family. The basic target check does not require current detection, hostility, the same system or an undocked target.
STO ship selection Own current active-sensor hostile ship contacts in the system, with independent-target, range and planetary-order exclusions.
STO population-style selection A hostile contact in the same system and within weapon range, with no current-update requirement. Detection method and body rules vary by target family.

Losing a sensor contact or a change in diplomatic status therefore does not by itself cancel an offensive target that is already assigned. The interface, the AI, launch support and point defence apply their own rules.

Direct fire takes a snapshot of the direct fire controls that have not fired this phase, are set to open fire and have a positive target ID. A ship with SyncFire on waits if any other sync-fire ship in the same fleet has a positive FireDelay. For beam fire this check does not require the other ship to have open fire. Linked weapons are sorted by descending effective range, and weapons with recharge entries are removed.

Ship targets use the live fleet position and, when the target is operational, its effective maximum speed. Salvo targets use MissileSpeed and the race’s salvo tracking bonus. Population, shipyard, ground and STO targets use the population coordinates and zero speed. A shipyard target needs a yard there, a ground target needs a formation and an STO target needs an STO element there. A missing target is logged and skipped. The jamming and target speed values are carried over between the fire controls of one ship instead of being reset for each. Jamming is set for ship targets but not reset for salvo or population targets, and a target ship that is not operational does not overwrite the target speed. A later fire control can therefore use the values an earlier one left. Only the tracking bonus resets to 1 for each fire control. A target of any other type is not rejected and is handled with whatever values are left over or the defaults. Direct fire at a waypoint is not a supported use.

Weapons that are electronic-only (ElectronicOnly) skip targets other than ships and salvos. Each weapon needs range <= min(effective weapon range, whole-number fire-control range), with the fire-control range from ComponentValue. A weapon out of range marks the target as unattackable and ends that fire control’s weapon pass, because the weapons are in descending range order. A calculated chance of zero or less holds fire with no recharge, no maintenance check and no shot roll. Otherwise maintenance is checked, full PowerRequirement recharge is added, the fire control’s fired flag is set, and each of the weapon’s NumberOfShots gets an independent roll. Because the list of fire controls and weapons was built before firing began, all ready linked weapons of a fire control fire even though the flag is set partway through. Records with zero hits are kept. Impact contacts need positive hits. The fired flags are cleared at the end of the increment.

For Standard races, when the game requires maintenance, a d50 roll of exactly 5 triggers a weapon failure check. With enough maintenance supplies the ship pays the weapon’s Cost and the weapon fires. With too few supplies the component is damaged and the weapon does not fire. This die is drawn only after the positive chance and range checks and before the recharge and shot dice.

Beam, railgun and gauss weapons assigned to fire controls use the same hit calculation. Their component values supply the differences in tracking, damage, shots, recharge and accuracy.

  1. Start the weapon tracking speed W at the weapon’s TrackingSpeed. If that is zero, use the larger of the race’s fire-control speed rating and the firing ship’s effective maximum speed. Cap W at the fire control’s TrackingSpeed. The fire control uses W in place of its own tracking only when W is positive and lower, otherwise it keeps its own tracking. T = round(tracking x tracking bonus), as a whole number.
  2. base = max(0, (1 - range in km / fire-control range) x speed factor), where the speed factor is T / target speed when the target speed exceeds T, and 1 otherwise.
  3. chance percent = 100 x base x jammer multiplier x weapon modifier x tactical effectiveness.

The weapon modifier (WeaponToHitModifier) applies only when it is strictly between 0 and 1. Other values are ignored. A fire control that is not a direct fire control gives a chance of 0, and a chance of zero or less before the tactical multiplication gives 0. No upper limit is applied. At exactly the nominal fire-control range the range check admits the weapon, but base accuracy is 0.

Jamming uses the target ship’s first component that carries fire-control jammer technology, provided at least one of that component is undamaged. Its strength is that component’s ComponentValue. Several jammer component types are not summed and not compared. The strength is converted to a whole number. When the fire control’s ECCM is above 0, the whole-number ECCM is subtracted. A residual of 0 or less gives a multiplier of 1, otherwise the multiplier is 0.75 to the power of the residual. The salvo tracking bonus is 1 + min(ContinualContactTime, whole-number technology cap) x 0.2 / 100. It applies when the race’s best researched Max Tracking Time Bonus technology has a nonzero value (that value, AdditionalInfo, is the cap in seconds) and the race has an active-sensor contact on the salvo. That contact check does not require the contact to be current (LastUpdate).

Tactical effectiveness = (1 + round((square root of GradePoints) - 10) / 100) x CrewMorale² x OverhaulFactor x ship commander half Tactical bonus x tactical officer full Tactical bonus. A half bonus is 1 + (bonus - 1) / 2. A missing bonus counts as 1. The equation has no separate factor for the current crew ratio or for fleet training points (TFPoints). How its inputs change is described in crew grade, officers and training.

A ship shot hits when d10000 <= 100 x chance percent. A die roll d(n) draws a whole number from 1 to n inclusive from the game’s shared random generator. For finite ordinary thresholds the effective probability is floor(threshold) / 10000, bounded by the die’s range. A positive chance below 0.01% therefore still uses up firing state but cannot hit, and a chance of 100% or more always hits. This describes the die comparison, not a general limit applied before the roll.

Effective weapon range is 0 for a component that is not a weapon. Otherwise it is MaxWeaponRange when that is positive, else whole-number(DamageOutput x RangeModifier) when the damage is positive, else 0. Damage at range receives the actual distance truncated to whole kilometres. With a positive fixed MaxWeaponRange the damage is the full DamageOutput within that range and 0 outside it. With no fixed range and RangeModifier 0 the damage is 1. Otherwise damage = whole-number(DamageOutput / max(1, range / RangeModifier)).

An STO element’s ready weapons are Units - outstanding recharges. Ship candidates are the element race’s own current active-sensor hostile ship contacts in the same system that are not carried by a mothership and are within weapon range (MaxWeaponRange). Ships in fleets on planetary combat orders are excluded. Player elements order the candidates by size (Target Largest Ship, Target Smallest Ship), by effective maximum speed (Target Fastest Ship, Target Slowest Ship), by a d1000 roll in ascending order (Target Random Ship), or by highest calculated hit chance without offence and morale (Target Easiest Ship). NPR elements divide a precomputed priority score by max(1, live range / 1000), with the range in km, then sort descending with a d1000 tie-break. A FiringDistribution of 0 uses all ready weapons on each target. Positive values cycle batches of that many weapons over the targets. For NPRs a first target smaller than 10 HS forces 1 weapon per target, and one smaller than 20 HS forces 2.

STO hit chance starts as max(0,100 x (1 - range / MaxFireControlRange) x speed factor) x jammer multiplier. Tracking = whole-number(round(class TrackingSpeed x tracking bonus)), and the tracking bonus is 1 in both STO uses. The speed factor is tracking / target fleet Speed when the tracking is slower than that target, and 1 otherwise. The jammer strength is reduced by the element class ECCM, and the multiplier is 0.75 to the power of the residual (1 when the residual is 0 or less). Actual fire then multiplies by the formation commander’s Ground Combat Offence bonus and by Morale / 100. It does not apply the ship tactical factor or the weapon’s WeaponToHitModifier. Each weapon adds a recharge of the class RechargeTime, and each shot hits on d100 <= chance percent. There is no hold-fire check for zero chance and no upper limit. A chance of 33.9% therefore works out as 33% and 0.9% as 0. Impact registration happens even with zero hits.

Population-style modes allow only Target Population, Target Shipyards and Target Ground Forces. Target STO Ground Forces is rejected by an earlier check, so its own targeting rules never run. The element selects the strongest hostile contact in range that its own race detects in the same system, with no current-update condition. A population contact may use any detection method, while ground and shipyard contacts must be active-sensor contacts. Population and ground targets on the firing element’s own body are excluded, while shipyard targets are not. All ready weapons fire at that one target with speed 0, and the record carries the population, shipyard or ground type that later decides how the damage is applied.

After firing, the races that detect the STO elements that fired are rebuilt from current active-sensor ground-unit contacts. The rebuild is meant to look only at contacts of the firing population, but that restriction has no effect, so it considers all current active ground-unit contacts.

Ordinary missile launches use the ships that are not carried by a mothership, have FireDelay 0 and have any enabled firing or point-defence assignment. AMM readiness instead selects independent ships with SensorDelay 0 and enabled assignments, and FireDelay does not gate that selection. Area and final beam point defence build their own list of eligible ships. These must not be carried by a mothership, must have SensorDelay 0 and must have fire-control assignments in a matching defensive mode. Offensive open fire and a zero FireDelay are not required.

Ordinary launches go through the missile fire controls that have not fired this phase, are set to open fire and have a positive TargetID. Launchers are matched by fire-control component and FCNum, and launchers with a matching component and weapon-number recharge entry are removed. The target checks only confirm that the target exists, and for population subtypes that the subtype exists. They do not require a fresh active-sensor contact. Current contacts are enforced later, while the missiles home in flight.

For a ship target the missile fire-control range is MaxSensorRange x min(1, (current sensor cross-section / Resolution)²) x 0.75 to the power of max(0, sensor jammer - ECCM). Working out this range also records the target’s sensor jammer strength in the firing race’s intelligence. For missile targets the range uses max(Size, 0.33) missile size points against the fire control’s Resolution, with the squared reduction only when the missile is smaller, and no missile ECM term. This differs from search detection, which uses max(0.3, Size / 20) HS. Population and subtype targets use the unmodified MaxSensorRange. Every launcher additionally checks that the current distance is within the missile’s total range.

A waypoint target has no range of its own. The game takes the range left over from the previous fire control processed for the same ship, or 0 for the first, so no waypoint distance or missile fire-control range check applies to it. The check against the missile’s total range still runs, using that leftover range.

Each launcher’s missile comes from its missile assignment (FCT_MissileAssignment), matched by launcher component and weapon number. The order is the range check, then consumption of one physical missile from the magazine, then the size check (missile Size larger than the launcher’s ComponentValue fails), then the maintenance check. An oversized missile or a firing maintenance failure can therefore use up stock without a launch. AMM launches also consume a missile before their size, maintenance and no-hit-chance checks. Consumption finds the matching missile type, fails when there is no entry or the amount is not positive, removes one missile and deletes the entry once it is empty. Magazine capacity, launcher existence and the missile recipe are separate matters, and loadouts are covered in component and ordnance design. A successful ordinary launch adds a RateOfFire reload, marks the fire control and the ship as having fired, and creates or merges exactly one missile. The launcher’s NumberOfShots appears in the launch report but does not multiply the number of missiles launched.

With SyncFire 1 a ship waits when other sync-fire ships in the same fleet have any open-fire assignment and the largest FireDelay among them is above 0. It then logs that it “is waiting for other ships in the same fleet to confirm their readiness before firing”. An NPR ship also waits when its fleet is co-located with a synchronising NPR standard-missile fleet, or when other sync-fire ships that have not fired yet still have missile-launcher recharge entries. The opening step of the launch pass marks same-race fleets at exactly the same coordinates in the same system survey.

Normal missile and decoy reload debt is RateOfFire seconds and is cleared separately from ammunition supply. Recharge treats missile launchers and decoy missile launchers as timed, not as reactor consumers. The ordinary reduction by elapsed time, the mothership Carrier Operations divisor, and launchers that reload only in a hangar (HangarReloadOnly), which need a mothership or local same-race transfer support and reload at elapsed time divided by 10 outside a hangar, are described in weapon recharge scheduling and persistence. This timed rule does not describe fighter pods.

Salvos launched through a fire control merge when they share the launching ship, the current launch time, the exact missile type, the fire-control component, FCNum and TargetID. Target type is not compared. Merging without a fire control leaves out the fire-control keys as well. Each entry in a salvo’s missile list maps one missile number to its remaining onboard decoys (RemainingDecoys), starting at NumDecoys. It is not a warhead count and not missile hit points. A new normal salvo gets a flight speed of whole-number(missile Speed), an endurance of the design Endurance, the launching fleet’s position and a hit modifier (ModifierToHit) equal to the ship’s current tactical effectiveness, with 0 replaced by 1. The default homing method (stored value 0) is initial active guidance.

When MaxDetonationRange is above 0, the detonation range is chosen when the salvo is created. It is the maximum when maximum - MinDetonationRange is 0 or less, and otherwise minimum + random fraction x (maximum - minimum). The draw is kept by missile type and current game time, so separate salvos of the same type launched at the same moment share it.

The same missile step both predicts the next arrival time and actually moves the missiles. Salvos resolve by category in the order Decoy, Anti-missile, Strike, then larger missile size first, then larger missile count first. Empty salvos are skipped. A stationary salvo with no further stage stays in play when it carries any EM, thermal, active or geological sensor. Otherwise it is destroyed when it resolves. Stationary sensor buoys do not lose endurance the way moving missiles do.

A salvo with TargetID 0 tries onboard target acquisition when it resolves. If that fails, moving missiles lose endurance equal to the subpulse length without moving, and are destroyed at 0 or less. A known ship target needs a firing-race contact updated at exactly the current game time, with a method that matches the homing method. Initial or retargeted active guidance needs an active-sensor contact, thermal homing a thermal contact, and EM homing a shield or EM emission contact. Onboard sensors do not stand in for this contact check. Salvo targets need a current active-sensor track specifically. Population targets need a current thermal or shield contact. Shipyard, ground and STO targets need a current active-sensor contact of that subtype. Waypoints use stored coordinates with no contact check.

When no target position results, prediction skips the salvo and a resolving pass destroys missiles without sensors. The game treats coordinates of exactly 0, 0 as no position, even for a real target at the origin. Moving missiles with onboard combat sensors log the loss once and continue toward the last known target position (LastTargetX and LastTargetY). In that case the missile does not clear its target ID and does not start reacquisition, so automatic reacquisition right after contact loss should not be expected. A geological sensor alone is not enough here.

Against a ship, the missile aims at the fleet’s actual location when the fleet is not moving and the missile has no laser detonation maximum. Otherwise it aims at a projected fleet point, then converts that into a standoff point for the current detonation range. When a non-laser missile actually reaches a ship, it snaps to the ship’s current coordinates. Against a population, the standoff point lies on the line at the distance minus the detonation range. Projection is a finite stepping approximation, not an exact intercept solution. For fleet targets the step is max(initial separation / whole-number interceptor speed / 100, subpulse length), with at most 199 candidate points. Target movement uses the fleet’s actual Speed, with an offset for targets that have already moved. For missile interception the step is max(initial separation / target missile speed / 100, subpulse length). The current target point is used when target speed x subpulse length >= separation. Otherwise at most 199 candidates are tried along the last heading, and both target and interceptor movement apply the target’s already-moved offset.

Prediction starts with the earliest time equal to the time window. When missile speed x time window >= distance, it considers distance / (missile speed x time window) x time window, and gives the earliest time truncated to whole seconds. That calculation ignores remaining endurance and stage separation timing. During actual movement the distance moved is speed x subpulse length. If the endurance is shorter than the subpulse length, movement is capped at speed x endurance and the salvo is flagged to expire. Otherwise the full subpulse length is subtracted from endurance. When the salvo is still short of its target, it moves in a straight line and separates its next stage when remaining distance <= SeparationRange. Separation takes precedence over expiry, and otherwise expiry destroys the salvo. When the endurance equals the subpulse length exactly, it drops to 0 but the salvo is not flagged to expire in that pass. Reaching the target queues resolution, even when movement shortened by endurance was enough to get there.

Stage deployment also happens at arrival, after the local point defence, interception and CIWS steps described below. The child salvo is a copy of the parent with a new ID, type, time, speed and endurance. The child speed is the stage type’s Speed as a fractional value, not truncated to a whole number the way first launch speed is. The child count is surviving parent count x parent NumSS. Each child missile gets its own type’s NumDecoys. The child keeps the parent’s fire control, FCNum, hit modifier and other copied values. With a fire control it keeps the target ID and type, and without one it chooses a target on its own. Stationary children clear their targets and take the orbit body at their exact coordinates. The new stage is not moved again in the pass that creates it.

Choosing a target on its own differs from acquiring one by sensor. It requires onboard sensors other than geological sensors. It considers detectable active-sensor, thermal and EM contacts and leaves out ships being boarded by the salvo race’s own forces. The missile’s reach is missile type Speed x salvo remaining endurance. A candidate’s range must be strictly below that reach, and reach - candidate class maximum speed x endurance must exceed the range. Weight = floor(Size / max(range, 10000) x 10000000 x commercial modifier), at least 1 for a reachable target, with a commercial modifier of 0.1 for a class known to have commercial engines. This assigns only the target ID and type, while sensor acquisition also sets the target ship and the homing method.

Sensor acquisition tries active sensors first, thermal only when there are no active candidates, and EM only when there are still none. The candidate contact search matches race, system, type and method but does not explicitly filter for a current update or for hostility. Active range is the missile type’s SensorRange, reduced by (current cross-section / SensorResolution)² when the target is smaller. Thermal and EM range is square root of (sensor strength x contact strength) x 250000 km. A candidate’s weight is its positive estimated impact chance, using the whole-number effective maximum speed, the jammer and the launch ModifierToHit, capped at 100, then at least 1 and truncated to a whole number. A roll of d(sum of weights) picks by cumulative weight, sets the target and sets the matching homing method.

When a fire control is destroyed or its ship is deleted, each salvo it guides is reset. A salvo without combat sensors is removed. Otherwise it is detached from the fire control and the ship, and its target ID, target type and target references are cleared. A geological sensor alone does not keep the salvo in play.

Hit chance ship decoys and payload at impact

Section titled “Hit chance ship decoys and payload at impact”

Missile hit chance is 100 at once when the target speed is 0. Otherwise the missile design’s terminal guidance value (ATG) is raised to at least 1 and stored that way, and chance = design Speed / target speed x 10 x hit modifier x ATG x jammer effect. No upper or lower limit is applied. Against a ship’s whole-number missile jammer strength J and the missile’s ECCM K, the jammer effect is 1 when J = 0 or J - K <= 0, and otherwise 0.75 to the power of J, the full J, not J - K.

The launch report uses the target fleet’s actual Speed and the shooter’s current tactical multiplier. Impact on a ship uses the whole-number effective maximum speed of the target ship and the salvo’s stored ModifierToHit, then caps the chance at 100. A stopped fleet is therefore not an automatic hit in general, but a zero effective maximum speed is. Each warhead rolls independently and hits on d100 <= chance, so a fractional probability is effectively rounded down to a whole percentage. Any hit removes its missile, even when the missile’s other warheads miss, and a missile whose warheads all miss stays. A salvo whose missile type has no retargeting (Retargeting) then destroys all its surviving missiles. A retargeting salvo marks itself as resolved for this pass, which keeps missed missiles for later passes without explicitly changing their target.

Conventional damage per hit = WarheadStrength / MultipleWarheads, and radiation = RadDamage / MultipleWarheads. Laser damage = LaserWarhead / max(1, current detonation range / LaserWarheadRangeModifier), and 0 when the modifier is 0. Laser damage is not divided by MultipleWarheads, uses the same missile hit roll, and can be delivered from outside final CIWS and point-blank point-defence range. Impact on a population or subtype reports the missile count as hits at 100%, then destroys all missiles, with no per-warhead rolls. Those records are processed later in the aftermath described below.

Before individual strike salvos resolve, each threatened ship with decoy launcher assignments works out how many ship decoys to launch.

  1. Threshold = max(1, DecoyThreshold x remaining armour integrity), where remaining armour integrity = (armour thickness x width - armour cells lost) / (thickness x width).
  2. Incoming size = sum(surviving missile count x missile Size) over the incoming salvos.
  3. Requested launches = floor(incoming size / threshold).
  4. Decoy assignments still recharging are removed. Matching missile assignments are bound and sorted by size descending, then MissileECM descending. The game consumes stock, checks size, adds a RateOfFire reload and launches or merges decoys until the requested count is reached or the ready launchers run out.

This path has no firing maintenance check. A ship decoy’s strength is its WarheadStrength used as an attraction value, not damage to a ship.

For each ship warhead hit that has already succeeded, the decoy attraction is summed over the decoy salvos targeting that ship. Each salvo adds decoy WarheadStrength x (1 - max(0, striking ECCM - decoy MissileECM) x 0.2) x decoy count, but only when that per-decoy value is positive. The game compares random fraction x (ship tons + total attraction) with ship tons, where ship tons = class Size x 50. When the left side is larger, the hit is diverted and becomes a decoy hit. Diversion does not use up the decoys. These external ship decoys are different from a missile’s onboard decoys (NumDecoys). Decoy salvos are removed at the end of resolution regardless of their count.

During the end-of-increment space-fire pass the game runs area beam and STO point defence first, then automatic AMM launches, then ordinary missile launches and direct fire. Sensor checks on fresh launches follow. When missiles arrive, the order is as follows.

  1. Allocate and resolve local defensive beam and STO fire.
  2. Keep only the living arrivals that have not yet resolved.
  3. Resolve interceptor salvos first.
  4. Launch ship decoys.
  5. For each remaining strike salvo, run the target’s CIWS, then either deploy the next stage or roll the payload and warhead hits.

There is no general separate final-fire mechanic beyond these local point-defence modes and CIWS.

The area and arrival allocators, beam, STO and CIWS resolution, automatic AMM launches, interceptor resolution, the ten point-defence modes and their settings, engagement counts, and the point-defence summaries and capacity estimates are described in point-defence modes, allocation and interception.

Each incoming hit takes its special flags from the attacking component, not from a missile. These are IgnoreArmour, IgnoreShields, ElectronicOnly, ArmourRetardation and the bio-acid special function. The remaining acid damage starts at floor(original decimal damage), before shields or any other change.

  1. Shields intervene only when their strength is above 0, IgnoreShields is off and the hit is not internal, collateral or anti-air damage. Electronic damage multiplies the incoming decimal damage by 3 before shields. If the shields cover all of it, the game subtracts the damage, adds it to the shield damage absorbed, records shield damage in the attacker’s intelligence and ends the hit at once as shield damage. In that case there is no grade gain, no intensity roll, no armour, no penetration and no acid queue.
  2. When the damage exceeds the shields, the game subtracts the current shield strength from the damage, records and adds up the shield amount, subtracts floor(current shield strength) from the original acid amount, sets the shields to 0, and divides the remaining damage by 3 for electronic-only damage. For example, high-power microwave damage 4 against shields 5 uses up all 5 shield points and leaves (12 - 5) / 3 = 7/3 internal damage before flooring, rather than 4 - 5.
  3. For damage that is not electronic, intensity I = damage / class Size x 1000. Only when I >= 50 does the game draw d1000 and require roll < I. On success q = damage / 5 and p = q x 100, then q is floored. The game takes whole-number(p modulo 100), draws d100 and adds one to q when the roll is <= that value. Extra penetrating damage = d(whole-number q). This bonus bypasses armour and can also occur for internal, collateral and anti-air hits. The strict comparison makes I = 50 a 49/1000 chance. A d(0) gives 0 without drawing a random number.
  4. GradePoints increase by damage x (100 / Size), divided by 10 for commercial ships. This uses the remaining decimal damage, even when armour then stops it.
  5. Armour spread is chosen. The default is 1, which covers ordinary missiles, gauss cannons and carronades. Lasers use 3, railguns 2, ordinary particle beams (SpecialFunction none) 2, particle lances 0, and missiles with LaserWarhead above 0 use 3. The rules apply in order, so the particle lance setting overrides the particle beam family.
  6. Armour applies only when IgnoreArmour is off, the hit is not internal, collateral or anti-air damage, and the class NoArmour is 0. Otherwise all of floor(damage) penetrates. The extra penetrating damage is added after armour, the attacker’s intelligence record of the ship is told that penetrating damage value, and then components are resolved repeatedly until the remaining damage is zero or the ship is destroyed.
  7. A hit the ship survives ends with the highest stage it reached. That is armour damage even when penetration was 0, and penetrating damage when any positive penetration existed, even if every selected electronic component resisted or damage control saved it. A hit that overflows the shields does not count as a shield hit when it ends up as armour or penetrating damage.

The armour damage pattern for spread S and total damage D starts with positions 1 to 99, puts the whole of D at position 50 and scans positions 1 to 99 repeatedly. When a position holds more than S and a neighbour holds less than current - S, one point moves to the less loaded neighbour (the left one on a tie) and one is taken from the source. Full scans repeat until nothing moves. The increasing scan order shapes the result, so the pattern is not an abstract symmetric triangle. The positive values are then packed into consecutive positions. Spread 0 never redistributes and gives one column holding all the damage.

The hit then draws one start column, d(ArmourWidth). Each packed value is applied in turn, after which the column number goes up by one and wraps from the width back to 1. A pattern wider than the hull’s circumference can therefore revisit columns in the same hit. The column of the first strictly greatest pattern value is recorded as the acid peak column. Armour damage is stored per column as the number of cells already removed, and a column without an entry starts at 0.

  • If a column is already at full thickness, its whole pattern damage penetrates.
  • Otherwise, if ArmourRetardation is above 0, remaining = thickness - damage in the column, and threshold = whole-number((1 - retardation)^remaining x 1000.0). The game draws d1000. On roll < threshold, one point penetrates. Otherwise one armour cell is removed and one point is absorbed. This case handles exactly one point, whatever the column’s pattern value. Ordinary meson cannons, as the game creates them, have DamageOutput 1, IgnoreShields on and IgnoreArmour off.
  • Otherwise the column absorbs min(pattern damage, remaining armour), is capped at full thickness, and any excess carries into internal damage. Absorbed damage is counted separately from the hit result. When the column overflows, the attacker’s intelligence records the column’s whole pattern damage as armour damage, not just the absorbed part.

Weapon exceptions come from the weapon data. The high-power microwave, as the game creates it, sets ElectronicOnly and IgnoreArmour but not IgnoreShields. Meson cannons bypass shields and use retardation. The particle lance concentrates damage into one column. Ordinary lasers and laser warheads spread 3, railguns and ordinary particle beams spread 2, and gauss cannons and the default spread 1. Not every beam weapon bypasses armour, and not every missile is a plain nuclear warhead.

The class damage allocation table leaves out armour and adds ceiling(component Size x quantity) for each component entry, in the order the class lists its components. ChanceToHit is cumulative. Electronic systems also get a separate cumulative ElectronicCTH. The totals are MaxDACRoll and ESMaxDACRoll. These are size weights, not HTK weights. HTK affects how much damage a component consumes after it is selected. The table keeps the design counts even when components are damaged.

Each batch of penetrating damage P starts with a fresh attempt count. Each attempt draws d(MaxDACRoll) and selects the first entry with ChanceToHit >= roll, in ChanceToHit order. Electronic damage draws d(ESMaxDACRoll) and keeps the entries with ElectronicCTH >= roll, but still orders them by normal ChanceToHit. For maintenance failures, normal selection redraws any component marked NoMaintFailure. The undamaged count is the class quantity converted to a whole number, minus the damaged count. When the intact count is above 0, the game draws d100 and accepts the component on roll <= whole-number(intact / NumComponent x 100). A selected entry that is fully damaged, or a failed intact-percentage roll, uses up an attempt but consumes no damage.

After a component is accepted in combat, the following steps apply.

  1. With electronic-only damage and ElectronicCTD below 100, the game draws d100. A roll above ElectronicCTD means the component resists. Its HTK is subtracted from P anyway and max(P, 0) carries on to the hit. No destruction record, crew casualty or damage-control roll occurs. An ElectronicCTD of 100 or more skips the resistance roll.
  2. If P < HTK, the destruction chance is whole-number(P / HTK x 100), checked with d100. On a roll above the chance, the components-hit counter goes up and the remaining damage becomes 0 without damaging the component. Otherwise P becomes 0 and the steps continue. If P >= HTK, HTK is simply subtracted. A component with HTK 0 consumes no damage, and the outcome then depends on component destruction and on the selection and death rules.
  3. If the ship’s maintenance supplies are at least the component Cost, the game draws d100 against floor(damage control success percent), using the damage control success percent. Success spends exactly the component Cost, logs a damage control event, keeps the component intact and carries the already reduced P on to the hit. A saved component therefore still absorbs its HTK. This immediate combat save does not depend on AutomatedDamageControl.
  4. If the class Crew is above 0, the crew loss is whole-number(component crew x (0.25 + 0.05 x d10)), capped at CurrentCrew - 1. It is subtracted and added to the crew casualties. This keeps one crew member aboard in an ordinary ship with positive crew, and the loss is 30% to 75% of the component’s crew.
  5. The component is added to the ship’s destroyed-component tally for this pass before its consequences are processed. If any hostile boarding formations are aboard, the ship’s own formations that are not boarding are included as well, with a fraction that starts at component Size / class Size x (0.25 + 0.05 x d10). The fraction is multiplied again for every formation, rather than starting over for each one. This is where space damage hands over to boarding losses, not a description of boarding combat.
  6. The damaged-component step records the persistent damage, applies its consequences and handles any explosion. The remaining P plus any secondary damage go back to the hit.

Damage control success percent sums the undamaged Damage Control, Commercial Damage Control and Engineering capacity, without commander bonuses. When the sum is below 1 the result is 0. Base = floor(capacity x 200 / Size), capped at 50, then multiplied by the effective Engineering commander bonus. The combat check floors that result, so the bonus can lift the final success chance above 50.

Ship death is not a hull hit-point bar running out. When no valid intact component is accepted in 20 consecutive normal attempts, the game does the following at the 20th attempt. It logs the pending attack summaries for that target and clears their target race. It marks the ship destroyed and adds it to the ships destroyed this pass. It logs a catastrophic explosion with a cargo loss report, removes the ship as destroyed, and refreshes the old fleet’s speed. Electronic-only attempts stop after 20 and leave 0 damage with no catastrophic kill. Every successful component hit or HTK absorption goes back to the hit, so the next selection starts a new count of 20 attempts. A normal hit can destroy a ship that still has undamaged components when the sampling misses them 20 times in a row.

Damaged versus destroyed records and direct consequences

Section titled “Damaged versus destroyed records and direct consequences”

The persistent damaged-component count (Number in FCT_DamagedComponent) is what makes components unavailable, and it drives the undamaged count. The destroyed-component tally is a combat reporting count of component casualties, not a second pool of missing equipment. It counts by component definition (SDComponentID). Clearing a ship’s combat tracking empties that tally, the per-phase absorbed damage, components hit, casualty counts, hit summaries and damaged-capability flags. It leaves damaged components and armour damage alone.

Plain component damage registration, used for example by firing maintenance failures, checks that the component belongs to the class, increases the damaged count and removes weapon assignments and recharges whose weapon number is higher than the remaining count. It does not apply the explosion, transport or fire-control consequences below.

The combat damaged-component step first increases the damaged count and then works out remaining = whole-number quantity - damaged count. If ExplosionChance is above 0, threshold = ExplosionChance x 100, multiplied by 2 - chief engineer Engineering bonus when a chief engineer is present. A roll of d10000 <= threshold means the component explodes. This roll happens before the category handling, even for weapon types whose handling ignores the explosion.

Category Immediate consequence
Weapon Remove weapon assignments, decoy-launcher assignments and weapon recharges whose weapon or launcher number is above the remaining count. This category causes no general explosion.
Missile or direct fire control Sort the existing fire-control assignments by FCNum and count them from 1. Remove the assignments beyond the remaining ordinal count: remove the weapons linked to that FCNum, reset or remove salvos launched by this ship through this fire-control definition and FCNum, set open fire off, then remove the fire-control assignment.
Magazine Ordnance destruction, described below. When the magazine explodes, a secondary magazine explosion contact is registered with the resulting explosion size.
Engine or reactor When it explodes, the result is d(MaxExplosionSize) and a secondary power explosion contact is registered. Lost engine output and power afterwards come from undamaged-capacity checks.
Jump stabiliser Any Stabilise Jump Point or Stabilise Lagrange Point fleet order clears the whole fleet’s move orders and raises a system-damaged event.
Shield, fuel, colonist, troop or cargo capacity Set the matching damaged flag (shields, fuel storage, colonist transport, troop transport or cargo hold) for trimming in the aftermath.
Command and control Commander casualties. Bridge (SDComponentID 18) exposes the captain and the science officer, Auxiliary Control (65736) the executive officer, Combat Information Centre (65738) the tactical officer, Main Engineering (65737) the chief engineer, and Flag Bridge (225) the commanders of the naval admin commands hosted on the ship. Each exposed officer dies on an independent 50% roll, gets history entries and retires as Killed in Naval Combat.

Magazine destruction works out the remaining capacity after the damage. C = current ordnance capacity, old C = C + damaged magazine ComponentValue, and loss fraction = 1 - C / old C. Every ordnance entry except ship decoys loses ceiling(amount x loss fraction), whether or not the magazine was over capacity. When the magazine explodes, floor(removed x WarheadStrength) is added. When the missile has a second stage, floor(removed x NumSS x second stage WarheadStrength) is added even when the magazine did not explode. Entries at zero or below are removed, and the summed whole-number internal damage goes to the ship. With nothing loaded the result is 0.

On a bio-acid hit the ship survives, once all penetrating damage has been applied, the game queues an acid attack. Its remaining damage is the original floored damage less the floored shields, its last damage time is now and its armour column is the peak column. The interval is 120 / remaining acid damage using whole-number division first. A result below 5 becomes 5, and any other result is rounded up to a multiple of 5. Setting the column to 0 because penetration remains never happens, because positive penetrating damage has already been applied by then. When armour was skipped there is no peak column and the default of 0 results. With zero remaining acid damage the interval would divide by zero. The game then shows error Function #327, the hit reports no damage and no acid is queued.

Ongoing acid is processed ship by ship. Each entry that is due (elapsed time >= PointOfDamageTime) does one point of damage, never a catch-up series. It sets LastDamageTime to now and lowers its remaining damage by one, or is removed when the remaining damage is 1.

  • Column 0 means internal damage.
  • When the entry’s armour column is already at full thickness, the entry’s column becomes 0 and the point is internal.
  • Otherwise the column’s removed cells and the armour total go up by one.
  • A column with no armour damage entry yet gets damage 1, but this does not add to the armour total.

A due batch with any armour or internal damage records one hit with damage per hit equal to the number of internal points and the acid penetration marker set. An armour-only batch therefore records a hit with zero internal damage. A separate acid burn event reports the armour total.

When the aftermath resolves an acid record, it marks the hit as anti-air damage. Acid internal points therefore skip shields and armour. Records of real anti-air attacks are not marked that way when they are applied, so they do not skip shields or armour just because they are anti-air attacks.

Attack records reporting and capacity losses

Section titled “Attack records reporting and capacity losses”

The aftermath processes attack records in list order. A ship record needs a ship target and a component, missile, anti-air, collateral, acid or ram marker. The target is looked up among living ships, so records processed after the ship’s removal are skipped. Each record repeats once per total hit, resolving each hit independently with the record’s damage per hit, and the stage each hit reaches increases only the matching hit count. Destruction marks the record’s target as destroyed, credits the kill and stops, and the record’s total hits stay as originally recorded rather than the number resolved before the kill. Hits on NPR ships update the ship and fleet damage time and the beam or missile hit time. Penetrating results on NPR ships set LastPenetratingDamageTime. Ram records come in pairs, one for damage done by the attacker and one for damage done by the target. The ramming decision and the collision rules are in ramming decision and resolution.

The attack damage is recorded as total hits x damage per hit even when the record stopped early. The ship-attack diplomatic penalty applies when the record names both the target race and the attacking race, and the combat survey DangerRating rises by whole-number(resolved damage), as described in danger rating from combat. For a surviving ship the armour measurement uses armour hits x damage per hit. The internal damage measurement and the “internal damage suffered” history line also use armour hits x damage per hit, not penetrating hits or the actual internal damage. Report counters are therefore not exact lost HTK. When a damaged ship that is not under tow becomes slower than its fleet, it is detached into a new fleet if the fleet holds more than one ship and the ship survived. Otherwise the fleet speed drops to the ship’s effective maximum. Combat log variants show the known alien attacker, a fallback for unknown energy weapon fire, damage, range and hit information. Separate messages exist for special anti-air, boarding collateral and acid damage.

Kill credit works as follows. An attacking ship gains a destruction history entry and a captain history entry, a hostile-ships-destroyed measurement of 1, and commercial or military destroyed tonnage of Size x 50. The attacker’s intelligence record of the target is marked destroyed with GameTimeDamaged set to now. An STO attacker updates its formation commander’s history and tonnage and the known alien target, without the ship’s hostile-ships counter. An attack with no attacking ship and no attacking ground unit, such as continuing acid, gets no credit.

After the attack records and point-defence summaries, the game gathers the living ships with destroyed components, absorbed damage or components hit, plus the ships destroyed this pass. NPRs refresh their active-sensor assignments. The owner’s damage report includes hit counters, shield and armour damage absorbed, components hit and destroyed, casualties and the current shields, armour and speed. Known attacking races receive an attack report with hit counts and a destroyed marker. For surviving ships with at least one destroyed component this pass, the flagged capacities are processed in the order colonists, shields, fuel, troop capacity (skipped when the aftermath runs after boarding combat) and cargo.

  • Colonists. The excess over current capacity is reported. Each carried species keeps whole-number(old amount x capacity / total), so per-species truncation can lose slightly more than the reported excess.
  • Shields. Current shield strength is capped at undamaged shield capacity x OverhaulFactor, and the reduction is reported.
  • Fuel. Fuel is capped at the fuel capacity, and the excess is reported.
  • Troops. The game sums the size of the carried formations and compares it with the undamaged troop transport capacity. A capacity of 0 destroys the formations and their commanders but produces an empty report text. Otherwise fraction = (total - capacity) / total. Each element loses round(units x fraction), with halves rounding to even. An element that loses all its units is removed, and each formation raises a system-damaged event. This is transport loss, not the ground combat rules.
  • Cargo. The total is trade goods x 2500 + installations x CargoPoints + sum(component Size x 50) + minerals x 2 tons. The component term is not multiplied by the stored amount. Free capacity is the hold total minus the carried cargo, floored at 0 and truncated to a whole number, so loss begins once the cargo exceeds half of the surviving hold space. When the total exceeds the free capacity, every trade good, installation and component amount and every mineral is scaled by free capacity / total. The report text for trade goods, installations and components shows the loss fraction times the already scaled amount, while minerals are listed with their original quantities before scaling.

The reports also cap current shields at the original class ShieldStrength and show current armour as (thickness x width - sum of armour damage) / total. The list of ships destroyed this pass is then cleared, the ground combat aftermath runs, and empty missile salvos are removed. Finally the game looks at living damaged ships whose last damage was less than 90000 seconds ago. When the fleet has at least 2 independent ships that are not under tow, and the ship’s effective speed differs from its design speed and is below 90% of the fastest independent ship’s speed, the ship is detached.

Removing a ship from play does the following. It removes shipyard tasks for the ship and its parent shipyard link. It removes tracking contacts and continuing acid on the ship. It prunes fleet move orders and contact destinations that point at it (an NPR clears all orders, others remove the matching order and the ones after it). It resets or removes salvos targeting the ship and clears every fire control’s ship target ID and type that points at it. It recursively destroys the ship’s parasite craft and clears other ships’ links to it as their mothership. It handles embarked formations, clears tractor links and moves naval admin commands hosted on the ship. Last, it takes the ship out of its fleet and out of play, and removes the fleet when empty or recalculates its speed. Parasite craft removed this way do not go through the hit and kill-credit steps one by one.

Removal of a destroyed or abandoned ship evacuates crew only for Standard races and creates a wreck . It kills the commanders of embarked formations that evacuation did not already take, with an event and a history entry, and removes those formations. A Standard-race formation commander whose transport ship is this ship takes the evacuation roll instead. Colonists and cargo are not turned into survivor groups by this path. Removal for any other reason disembarks, with separate population and formation handling.

Evacuation uses CurrentCrew after the earlier component casualties. For a destroyed ship the survivors are CurrentCrew x (d50 + 25) / 100, which is 26% to 75%. An abandoned ship saves all its crew. When the decimal survivor count is 0 or less, evacuation stops before handling commanders. Otherwise it creates a lifepod holding floor(survivors), with the race, species, system, class, name, position, current time and GradePoints. The officer list combines transported, assigned and named ship officers and removes duplicates. Each officer’s assignment and transport ship are cleared first. For a destroyed ship each officer independently survives or dies on a 50% roll, and for an abandoned ship all survive. Survivors gain a ship-destruction-survived measurement and a link to the lifepod. Those who die retire as Killed in Naval Combat. Evacuation into a population instead of a lifepod never happens, because a lifepod is always created and no population is ever supplied.

Expired lifepods kill all crew and officers only when now > creation time + 1209600 seconds (14 days, with a strict comparison). Officers get a history entry and retire as Died in a Life Pod, and the pod is removed. See lifepods and captivity.

A new wreck stores the original class Size, the ship ID, race, system, position and class. Each of the 11 minerals (Duranium, Neutronium, Corbomite, Tritanium, Boronide, Mercassium, Vendarite, Sorium, Uridium, Corundium and Gallicite) is independently class mineral amount x d5 / 10, which is 10% to 50%. All 11 draws happen even for minerals the class does not contain. For each component type not marked NoScrap, the wreck keeps min(5, whole-number class quantity - persistent damaged count) intact components when that is above 0. The wreck takes an orbit when a system body lies within one unit of it. The game then stores the wreck and notifies every other race with any ship or population in the system. No sensor roll is involved. Recovery is described in salvage and archaeology.

Wreck technology recovery starts only when d200 <= class Size. The game starts with threshold 128 and roll 1. While the roll is below the threshold, it picks a random component and a random technology of that component, adds the technology with a d20 percentage, halves the threshold and draws d128 as the next roll. When the chosen component has no technology, the game shows error Function #2686 and then error Function #3185, and adds no further technology to that wreck. A technology that is researched automatically is not replaced by its prerequisite.

When a ship is destroyed, every observing race marks its own record of the ship as destroyed. An observing race is one with a contact on the ship updated at the current time, other than the attacking race. The intelligence report can add “by energy weapon fire from” the beam attacker or from the STO weapons based at a population. Those additions check only whether any observing race has a current active-sensor contact on the attacker, not whether this particular observer has one. The event is logged under the destroyed ship’s own race. The attacking race’s own record of the target is marked by the hit resolution and the kill credit.

An offensive direct-fire attack on a missile salvo follows a simpler path than allocated point defence. When the record is not a point-defence record, total hits missiles are removed, capped at the salvo’s current count. That path has no onboard-decoy diversion, no size or warhead durability and no electronic resistance, high-power microwaves included. Allocated point defence has already removed its missiles and is not applied a second time.

A shipyard target ID names a population. One yard there is selected uniformly by d(number of yards), and its capacity is used, divided by 10 for a commercial yard or a repair yard. The per-hit slipway destruction threshold is max(1, whole-number(damage per hit / adjusted capacity x 10000)), but it is compared with d100, not d10000. Each successful roll removes a slipway. Excess tasks are abandoned in ascending CompletedBP order, and the yard is removed at 0 or fewer slipways. This is not ship armour or HTK damage. See shipyard development and ship work.

Population, ground-unit and STO ground-unit records use the population damage path. For non-collateral attacks on ground units or STO ground units, the number of ground attacks is the record’s shots fired, while attacks on a population roll d3 = 2 once per total hit. Candidate formations are those stationed there, and STO targeting keeps only formations and elements whose detecting races include the attacker. One formation is selected using whole-number total-size weights (for STO targets, the size the attacker has detected), then one element using whole-number(Units x class Size) weights. Each selection draws a random whole number and compares it with inclusive cumulative start and end points. For a total above 2 the draw runs from 1 to total minus 1, so the last point of the final candidate’s range can never be drawn. For totals of 1 and 2 the full range can be drawn.

Beam and laser-warhead ground attacks derive ground damage = floor(20 x square root of damage per hit) and penetration = floor(ground damage / 2). They then make another d10000 hit check that uses terrain, base type, morale, fortification, commander and tactical factors, before the ground unit hit is resolved with the frontline morale modifier turned off. Conventional missile ground attacks instead split into fragments. The count starts at 1 with damage = damage per hit. Each level doubles the count and divides the already reduced damage by the new count, until the damage falls below 1. Fragment ground damage = floor(20 x square root of current fragment damage) and penetration = damage / 2 without the beam floor. Up to max(1, floor(50 / element class size)) unit hit rolls are made, capped by the units not already lost. These are the entry rules for bombardment from space. The ground unit armour, morale and casualty rules and full ground rounds are in element attacks and damage.

Installation damage per hit is the record’s damage per hit, multiplied by 20 for any missile record. Population records use all total hits. Ground and STO records roll d3 = 2 per total hit to count installation and population hits. Their civilian multiplier is count / total hits when the count is positive. When the count is 0 the multiplier stays 1. Installation target weights = whole-number(TargetSize x ceiling(Amount)), and each hit selects by cumulative d(total). Enough damage increases the destroyed count and subtracts TargetSize. Only missile attacks carry leftover damage on to further installations. A partial kill uses the strict test d10000 < remaining damage / TargetSize x 10000. Installation sizes are listed in the planetary installation catalogue.

Total record damage D = total hits x damage per hit. It adds D dust for missiles and D / 20 for other attacks, and missiles add total hits x radiation damage per hit as radiation. Civilian deaths in millions are D / 10 for missiles and D / 500 otherwise, multiplied by the civilian multiplier and capped at the current population. Missile records count as missile attacks here even when they carry laser warheads. Bombardment summaries and diplomatic penalties are separate from the ship hit-stage report. These differences are why a hit on a population does not behave like a shield, armour or internal ship hit.

Beam and point-defence observations add up shots, hits, the maximum observed range and damage per component and attacking ship. The firing ship’s last firing time is updated. Only active-sensor contacts updated at the current game time minus the observation offset supply the observed attacker. The weapon count is whole-number shots / NumberOfShots. Energy point defence also updates the observed point-defence totals. Launcher intelligence from new launches starts instead from salvos launched now that have a known launching ship and current active-sensor detection. It matches the missile size, converted to a whole number, to a launcher of the same capacity and records the counts. Fractional missile sizes can therefore fail that match after the conversion. These are catalogue updates driven by observation, separate from the actual live components used in combat. See weapon, defence and damage observation.

Combat configuration and combat state are stored separately. A save does not store the current list of attack records as a pending damage queue. Each phase clears that list and builds the next pass’s records, so saved assignment and missile state is distinct from the transient shot totals.

State What the game stores
Ship readiness and damage FCT_Ship holds shields, fire and sensor delays, morale and crew, damage times, the destroyed state, autofire and sync fire, and the decoy threshold. Component and armour damage use companion rows.
Numbered weapon recharge FCT_WeaponRecharge holds the ship, weapon component ID, weapon number and remaining recharge.
Weapon-to-control link FCT_WeaponAssignment holds the ship, weapon ID and number, and fire-control component ID and number.
Fire-control configuration FCT_FireControlAssignment holds the component and number, target ID and type, open fire, point-defence mode, concentration, priority, minimum AMM range and fired flag.
Missile ammunition assignment Separate missile assignment rows in FCT_MissileAssignment (ship, missile, launcher and weapon number). Ordnance counts are distinct from flying missiles.
Flying salvo FCT_MissileSalvo holds race, type and system, the optional launching ship, body and fire control, target ID and type, speed, hit modifier, endurance, launch time, current, previous, start and target coordinates, homing mode and current detonation range.
Individual flying missile FCT_Missile holds the missile number, salvo ID and remaining onboard decoys.
Ongoing acid FCT_AcidAttack holds the target ship, armour column, point interval, remaining damage and last damage time.
Wreck and survivors FCT_Wrecks with its technology and component rows, and FCT_Lifepods with crew, species and race, class and name, coordinates, creation time and grade points.

When a game is loaded, IDs are matched against the objects already loaded. A weapon, recharge or assignment row whose ship or component is missing is skipped. Fire-control target ID and type load as stored values, without requiring a currently valid contact. A salvo needs a known race, missile type and system. Its launching ship, body and fire control are optional. Target references are restored by target family when the target already exists. Salvo targets are resolved while the salvo rows are read, by checking whether the target salvo has already been loaded, so the result depends on load order. The game does not run a second pass to fill in a missing salvo target. A target ID of 0 or less skips target-type restoration.

Acid rows are deleted per game (GameID) when saving, but loading reads every row of FCT_AcidAttack with no game filter and keeps the rows whose target ship ID exists in the current ship list. That does not guarantee separation between games stored in the same database. Broader limits on how saved objects are matched up again after loading are covered in object identity and reload.

Armour holes persist in FCT_ArmourDamage and unavailable components in FCT_DamagedComponent. The per-phase destroyed-component tally, absorbed damage, casualty and report counters and capacity-loss flags are transient. Armour loading, like acid loading, has no GameID filter and relies on current ship IDs. Ships removed by destruction are absent from the next save, even though FCT_Ship has a Destroyed column.

A fractional second-stage flight speed is saved but loaded back as a whole number, rounded to the nearest integer, unlike its original fractional value. A salvo’s save does not include the per-shot point-defence range, chance and remaining shots, interception lists, tracking maps, protected race and priority, the logged-loss and resolution flags, the expended count or the cached detonation draw. Clearing a ship’s combat tracking does not clear the fire controls’ fired flag (FiredThisPhase). That flag has its own clear at the end of the increment and is also saved.

Take a fire-control range of 200,000 km and tracking of 10,000 km/s, weapon tracking 0, racial tracking 5,000 and a firing ship effective speed of 8,000. The target is operational with an effective maximum of 16,000, at a range of 50,000. Weapon tracking becomes 8,000. The range factor is .75 and the speed factor is .5. Jammer 4 minus ECCM 2 gives .75² = .5625. The weapon modifier is .8. With grade factor 1.1, morale .9, overhaul .95, captain half bonus 1.1 and tactical officer 1.2, tactical = 1.1 x .9² x .95 x 1.1 x 1.2 = 1.117314. Chance = 18.85467375%, which is a threshold of 1885.467375 on d10000. A roll of 1885 hits and 1886 misses. Four shots make four draws and one weapon recharge.

DamageOutput 12 with RangeModifier 10,000 and no fixed range, fired at 25,000.9 km, passes the whole number 25000, so damage = whole-number(12 / 2.5) = 4 per hit. A positive fixed MaxWeaponRange of 30000 instead gives the full 12 there. A population-target fire control processed after a ship-target fire control on the same ship can inherit the earlier .5625 jamming factor, while a population fire control processed on its own starts at 1.

A design speed of 20,000 km/s against a target effective maximum of 10,000, with ATG 1.5 and a stored launch modifier of 1.2, gives 36%. Jammer 3 against ECCM 2 reduces this by .75³, giving 15.1875%, and d100 accepts rolls 1 to 15. ECCM 3 removes the penalty and restores 36%. A stopped fleet can show a 100% launch estimate while impact still uses its positive effective maximum speed.

When an allocated beam or AMM shot hits a missile with remaining onboard decoys and an ECCM advantage below 5, the game rolls d(5 + (5 - ECCM advantage) x onboard decoys) and destroys the real missile on a roll of 5 or less. With two onboard decoys and an effective ECCM advantage of 1, the real missile is selected with probability 5/(5 + 4 x 2) = 5/13. CIWS with an advantage of -1 uses 5/(5 + 6 x 2) = 5/17, because its advantage is not raised to 0. These are conditional chances after the accuracy roll. Ship decoys work differently, by attraction against ship tons. For DecoyThreshold 200, armour integrity .8 and incoming size 500 points, the threshold of 160 requests floor(500/160) = 3 launches, limited by ready launchers and stock.

Laser payload 20, range modifier 100,000 and standoff 250,000 give 20/2.5 = 8 damage per successful warhead roll. That distance is beyond the target CIWS’s 10,000 km limit. A missile fire control against a size .1 missile with resolution 1 uses (.33/1)² = .1089 of nominal range, while search sensors treat that target at its .3 HS floor.

Electronic damage 4 against shields 5 first becomes 12. The shields absorb 5, and the residual is (12 - 5)/3 = 7/3. IgnoreArmour lets floor 2 electronic damage go internal. Against shields 12 the result is shield-only. Ordinary damage 10 spreads as [1,1,2,3,2,1] for spread 1, [1,3,4,2] for spread 2 and [3,5,2] for spread 3. Spread 0 gives [10]. The lopsided shape follows from the ascending, in-place transfer scan.

A selected component with HTK 5 hit by internal damage 2 has a destruction opportunity of whole-number(2/5 x 100) = 40%. A d100 roll of 41 leaves it intact and increases the components-hit counter, and a roll of 40 goes on to a possible damage-control rescue. A rescue still absorbs the HTK or damage already subtracted. For allocation entries of size 2 x quantity 3 and size 1.2 x quantity 2, the weights are 6 and ceiling(2.4) = 3, regardless of HTK. After losing two of the first entry, its table weight stays 6 but its acceptance check becomes whole-number(1/3 x 100) = 33%, which makes failed selection retries matter.

Meson retardation .2 against three intact layers gives whole-number(.8³ x 1000) = 512. On d1000, rolls 1 to 511 penetrate and 512 to 1000 remove one cell. Remaining acid 7 uses whole-number 120/7 = 17, rounded up to 20 seconds. Remaining acid 25 gives 4, which becomes the minimum of 5. Even a 100 second gap produces one tick per acid entry.

When magazine damage leaves a capacity of 80 out of 100, ordnance counts of 6 and 1 each lose ceiling(amount x .2), which is 2 and 1. If the removed missiles are a warhead 3 missile and a zero-warhead bus with four children of warhead 2, the explosion does 6 + 8 = 14 damage when the magazine detonates. It still does 8 when the magazine does not detonate, because the child contribution does not depend on the detonation.

CurrentCrew 101 with an evacuation d50 of 25 gives 50.5 survivors as a decimal, and the lifepod stores 50. Each officer independently has a 50% escape chance, rather than sharing the crew fraction. Pod expiry uses the strict test now > creation + 14 days.

The way a marker is named does not tell when it resets. The flag that marks a salvo as moved this subpulse resets after movement in each subpulse. The flag that marks a salvo as resolved resets only before the first subpulse of the increment. Retargeting strike missiles that missed can therefore stay exposed to local point defence on later arrival passes while their payload retry waits for the next increment. CIWS mount-use counts share the movement subpulse budget and reset during the recharge step after the last subpulse, before ordinary offensive fire.

Special damage follows the flags of the actual firing component. Ordinary high-power microwave and meson components, as the game creates them, carry the flags described above. When the game builds a turret from a weapon, the new turret copies IgnoreArmour, IgnoreShields and SpecialFunction but not ElectronicOnly or ArmourRetardation. A turret built from such a weapon therefore does not inherit its electronic-only damage or its armour retardation. Turret design is described in component and ordnance design.

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