Reinforcements

How a garrison under attack calls for help, hunts a distant shooter, gets ahead of a force that is leaving, and eventually loses the ground anyway.

What happens when a garrison is attacked

Left alone, an objective fields whatever it was placed with and nothing more. With reinforcements enabled, a garrison that comes under attack can call for help, and can send some of its own men after whoever is shooting at it.

Nothing responds until the garrison knows it is in a fight, so a force that walks up undetected and takes the position quietly summons nobody. Two things put it in that state: a defender being killed, and the garrison hearing gunfire — rounds that miss count, which is why a position that is being shot at inaccurately does not simply sit there and take it. What its men can hear is the engine’s own model, so a suppressed weapon at distance goes unnoticed.

Hearing shooting also sends a patrol out to look at it, which is on Garrisons along with everything else those groups do. This page is about calling for help.

The two things that make it call

Casualties. Once a set number of defenders have been killed since the last wave, another is called. This is the answer to somebody working through a garrison from cover at range, where nobody is ever outnumbered and a headcount comparison would never trigger.

Force ratio. Attackers standing on the objective per surviving defender. This is the answer to a platoon walking onto a position held by eight men, where waiting for a casualty count would arrive far too late.

The ratio fires less often than you might expect, because the garrison was already scaled up for the number of players connected when it was placed. It mostly matters when a large group hits an objective that was built while the server was quiet.

The two kinds of force

Both are drawn from the objective’s own garrison profile, so an objective is reinforced by more of whatever is already defending it unless you say otherwise.

Reinforcements march to the objective, hold it, and count towards clearing it. They are announced: players get an intercepted-comms warning naming the area and a compass bearing, then a grace period before anything appears. The warning is the point — a squad that has bitten off too much gets the chance to break contact or set up for what is coming.

Hunting parties go after the shooter instead. They are never announced, because warning the person being hunted defeats the whole idea. They do not count towards clearing the objective — the ground is held by whoever is standing on it.

Where help appears from

Never in view. The mod searches outwards from the objective for somewhere no living player can see, widening the ring until it finds ground that is genuinely hidden, and re-checks concealment again at the moment the force actually arrives — otherwise players who react to the warning by moving towards the bearing would watch it materialise.

The trade is that help can legitimately come from a long way off and take a while to walk or drive in. On very open terrain the search can fail entirely, in which case nothing is sent and the log says so. That is working as intended, not a fault; raise the outer search distance if you want it to try harder.

Anything further out than the mounting distance arrives in a vehicle. A profile with no vehicles listed can only ever send help from within walking range.

Hunting parties and the shooter’s position

Nobody is sent after a shooter who is standing on the objective — the men holding it are already dealing with him, and walking a detachment out to search would take them away from the fight. The shooting has to be coming from beyond the hunting range before anyone goes looking, which is a little wider than a garrison is scattered and nothing like as wide as the credit radius.

A hunting party is not told where you are. It is given a degraded estimate — a scattered position whose error is proportional to how far the shot came from — and it approaches across your frontage rather than straight down your line of sight, then walks a ring around the estimate rather than standing on it.

Every further kill from the same place tightens that estimate. Sitting still is what gets you found; moving resets it to wherever you moved to.

A hunt ends when the shooter dies, however that happened, or when it times out. A detachment of the garrison’s own men then drives home and starts counting towards the objective again as soon as it is back. A party sent from off the map waits a while first — which is not idleness, it is the window in which a shooter who has merely gone quiet can start it up again — and then either makes up the garrison’s numbers or walks back the way it came and leaves, only once nobody can see it.

When you break contact and leave

Searching where the shooting came from only works while the shooting is still coming from there. Once nobody is standing on the objective any more, a force that is looking for you switches to a better question — not where were they, but where are they going.

The mod tracks where the attackers were when they were last on the objective and where they are now. Given enough movement in a consistent direction, it projects that heading forward by however far they will travel in the lead time, pulls the result onto a road if one is close, and sets a party down beside that route to wait. Because the lead is a time rather than a distance, the same setting cuts off a section on foot a few hundred metres out and a truck several kilometres out.

An ambush is placed under the same rule as everything else — never where a living player can see it appear — but from a tighter ring, because it is no use arriving after the people it is waiting for. It is never announced, and it is not redirected by later information: a party already in position is not pulled off the route moments before anyone reaches it.

It refuses rather than guessing. A force that has barely moved, or has only just started moving, gives no heading worth reading, and the garrison goes back to searching instead.

When the objective is finished but the garrison is not

An objective with a target — an officer to kill, a vehicle to destroy — resolves while the men guarding it are still alive. Left alone they go on holding ground that no longer matters and watch the people who did it walk away.

So when such an objective completes with more than a set share of its original garrison still standing, everything left on the position is sent after whoever finished it, and a party is called in from off the map alongside it. The reserve does not apply here: it exists to stop a garrison giving away ground it could still lose, and this ground is already lost.

What they are given to search is the last place a shot came from, or — for an objective finished by a demolition charge that killed nobody — the nearest attacker still in the area. Either way it goes through the same degradation as an ordinary hunt, so they sweep a rough area rather than walking straight to you.

This is what the objective linger is for. A finished objective goes on hunting and ambushing for as long as its contents stay in the world, so m_iObjectiveLingerSec on the Configuration page is a difficulty setting as much as a housekeeping one. It does not go on reinforcing — there is nothing left to reinforce.

What is left behind

A wave that is wiped out leaves its transport standing. It is not removed when the last man in it dies — it is handed to the objective and removed with everything else when the objective finally clears, so the people who destroyed the wave have the whole linger to take the truck. That is deliberate: the vehicle is a prize, and taking it away in the same breath as the last casualty is both a worse fight and a worse reward.

A long contested objective is capped at eight of these standing at once, oldest removed first, so an hour-long fight does not end in a car park.

Two things this deliberately does not do. An abandoned transport is never counted as part of the garrison, so it cannot hold a Clear Area objective open — a destroyed wave stays destroyed however much of its kit is still sitting there. And a party that survives and withdraws takes its vehicle with it, because it drove off the map in it.

What stops a garrison emptying itself

A garrison that sends everyone after one sniper has handed the position over for free, so a share of it is always held back.

A hunting party may only leave if what remains standing on the objective is at least the reserve: a flat floor of men, or a fraction of the strength the objective was placed with, whichever is larger. The fraction is measured against the garrison as placed rather than against who is still alive, so casualties make hunting harder rather than easier — a force that has already been halved digs in instead of splitting further.

That is re-checked continuously, not only when a detachment leaves. If an attacker kills the men left holding the ground while their mates are away, the detachment is recalled at once and the objective calls for a hunting party from off the map instead. Otherwise the counter to a garrison that hunts would simply be to kill the handful it left behind.

While a detachment is away, the men left holding the objective go quiet: they hold their fire until something actually threatens them, so a shooter they cannot see gets nothing to range on. They still fight normally the moment anyone closes in.

Why a determined attacker still wins

The ceiling on how many men an objective may have alive at once is concurrent, not cumulative — garrison plus everything sent to help it never exceeds a multiple of the garrison it was placed with. Reinforcements keep coming indefinitely, but the gap between waves grows each time, up to a maximum.

So a patient attacker eventually out-kills the replacement rate and can walk in, which is the intended way to beat a defended objective single-handed. The backoff winds back down after a period of quiet, so a squad that makes contact and withdraws finds the place properly defended again later rather than permanently exhausted.

Settings

These live alongside the rest of the mod’s settings — see Configuration for how to override them, including the note that booleans in the JSON file are written true and false.

SettingDefaultMeaning
m_bResponseEnabledtrueMaster switch. Off, an objective fields whatever it was placed with and nothing more.
m_bResponseHearsShotstrueWhether being shot at counts as coming under attack. Off, nothing responds until a defender dies.
m_fResponseDebusM60How far short of its destination a mounted force stops and gets out.
m_fResponseDefendRadiusM60How much ground a force holds once it arrives. This is its leash, not a tolerance.
m_fResponseStrengthCeiling1.5Most men alive at once, as a multiple of the garrison as placed. The server-performance brake.
m_iResponseCasualtyThreshold4Defenders killed since the last wave before more are called.
m_fResponseForceRatio1.5Attackers on the objective per surviving defender before more are called.
m_iResponseWaveBaseSec120Shortest gap between waves.
m_fResponseWaveBackoff1.5How much longer each wave takes than the one before it.
m_iResponseWaveMaxSec900Longest a wave gap can grow to.
m_iResponseQuietDecaySec300How long without casualties before the backoff starts winding back.
m_iResponseWarningSec45Warning players get between the intercepted-comms message and help arriving.
m_fResponseSpawnMinM600Closest to the objective help may appear. Never in view, whatever this says.
m_fResponseSpawnMaxM2500Furthest out to look for somewhere concealed.
m_fResponseSpawnStepM250How much the search widens each time a ring turns out to be in view.
m_fResponseMountThresholdM400Beyond this, help arrives in a vehicle rather than on foot. Keep it below the minimum above.
m_fResponseHuntMinRangeM150How far outside the objective the shooting must be before anyone is sent after it.
m_iResponseHuntCooldownSec180Shortest gap between hunting parties.
m_iResponseHuntDurationSec300How long a hunting party searches before giving up.
m_iResponseLingerSec120How long an off-map party waits after its hunt before deciding what to do.
m_fResponseWithdrawRadiusM60How close a withdrawing party must get to where it came in before it leaves.
m_fResponseHuntErrorMinM60Tightest a hunting party’s search area can ever be.
m_fResponseHuntErrorMaxM250Widest it can be, on a long first shot before any honing.
m_fResponseFlankOffsetM200How far to one side a hunting party swings before closing in.
m_fResponseAvengeFraction0.5Share of the original garrison that must survive a finished objective for it to come after you.
m_bResponseAmbushEnabledtrueWhether a force will try to get ahead of attackers who have broken contact and left.
m_iResponseAmbushLeadSec120How far ahead of a withdrawing force an ambush is set, as their own travel time.
m_fResponseAmbushSpawnMinM250Closest to the ambush point the party laying it may appear. Never in view, whatever this says.
m_iResponseAmbushHoldSec600How long an ambush party waits before giving up.

One behaviour worth knowing rather than configuring: legs where arriving is the job — crossing to a flanking position, driving into an ambush position, a wave marching to the objective — use a forced move, the ordinary move with its priority raised so the group ignores its own decision to stop and fight on the way. Without that, a detachment sent after a shooter would cancel its move and re-engage the first time a round went past, and the garrison would dispatch men who never get anywhere. The sweep a hunting party walks around its search area is deliberately not forced — breaking off to fight is the entire point of the ring.

On the garrison profile

Who comes, what they drive and how many stay behind belong to the force, not to the server, so they sit on the garrison profile rather than in the settings above. Irregulars and regulars should not reinforce the same way.

FieldDefaultMeaning
m_bCanCallResponsetrueWhether this force can call for help at all. Off for opposition meant to be on its own.
m_aResponseGroups(empty)Who comes. Empty draws from the profile’s own group list, which is the sensible default.
m_aVehicles(empty)Vehicles this force has access to. With none, it stays on foot and can only be reinforced from walking range.
m_iHuntReserve4Fewest men that may ever be left holding the objective. A floor for small garrisons.
m_fHuntReserveFraction0.4Share of the garrison as placed that must stay behind. The larger of this and the floor wins.
m_bHunkerWhileHuntingtrueWhether the men left behind hold their fire until something threatens them.
m_sArmourResponseGroup(empty)Group sent after a straggler in a vehicle during the operation wind-down’s hunt — an anti-tank team rather than a rifle squad, so a stolen tank is not met by luck. Empty keeps the random draw.
m_sMortarEmplacement(empty)Emplacement this force sets up during that hunt against a straggler who goes to ground indoors. Must be a composition holding both a mortar and an ammo box — the stock mortar emplacements qualify; a bare mortar stands silent. Empty uses the mod’s default.

The last two only matter during the operation wind-down; per profile because the right answer is factional. Each vehicle entry also carries m_bManTurret (default true) — see below.

A response group carries the group prefab to send, a weight, and a roleANY, REINFORCE or HUNT. Restrict a group that would be useless at one of the two: a heavy weapons team makes a poor hunting party but a perfectly good reinforcement.

A vehicle entry carries the prefab, how many men it may carry, a weight, and three independent flags. m_bParkWithGarrison parks one at the objective — the garrison mounts up in it to go hunting, and players can steal it, which is the trade. It is parked clear of whatever the objective itself put on the ground, so that a vehicle a task is about is never mistaken for the garrison’s own; the stand-off is m_fGarrisonVehicleSeparationM on Garrisons. m_bCarriesReinforcements uses it to bring help in. Seats are declared rather than read from the prefab, both because capacity is not a readable property and because you may want a truck to move fewer men than it seats.

m_bManTurret puts a gunner behind the gun — both on a vehicle parked with the garrison and on one carrying a wave in, so a gun truck never turns up as a taxi. Who that is comes from the vehicle prefab’s own crew, so it always matches the vehicle and needs no second list, and a vehicle with no turret, or one whose turret names no crewman, is left alone. That is why the flag can be left on for every entry in a profile: an unarmed truck simply ignores it.

Where that gunner belongs differs, and it decides what he can hold:

  • On a parked vehicle he is one man on top of the garrison’s placed strength, and he holds the objective like anyone else — it cannot be cleared while he is alive at his gun. He stays aboard when the garrison mounts up to hunt.
  • On a wave’s transport he belongs to that wave. He arrives with it, leaves with it, and is removed with it. Like every other man sent in to help, he never counts towards holding the objective, so a manned QRF truck cannot keep a Clear Area open.

A gunner still at his gun keeps his wave alive even after every rifleman in it is dead — he is not in their group, and pruning the wave around him would delete a man mid-burst and hand over the truck while its gun was still firing.

If you would rather a vehicle stayed a prop, turn it off per entry.

Note that AI cannot fly. Listing a helicopter will not give you an air response.

A complete example

Reinforcement settings in the JSON override layer, with a garrison profile that brings help in by truck and keeps 40% of its men at home:

{
  "m_bResponseEnabled": true,
  "m_fResponseStrengthCeiling": 1.5,
  "m_iResponseCasualtyThreshold": 4,
  "m_iResponseWaveBaseSec": 120,
  "m_fResponseWaveBackoff": 1.5,
  "m_iResponseWarningSec": 45,
  "m_fResponseSpawnMinM": 600,
  "m_fResponseSpawnMaxM": 2500,
  "m_fResponseMountThresholdM": 400,
  "m_fResponseHuntMinRangeM": 150,
  "m_fResponseAvengeFraction": 0.5,
  "m_bResponseAmbushEnabled": true,
  "m_iResponseAmbushLeadSec": 120,
  "m_aGarrisonProfiles": [
    {
      "$type": "ATG_Scenario_GarrisonProfile",
      "m_sName": "Regulars",
      "m_bCanCallResponse": true,
      "m_iHuntReserve": 4,
      "m_fHuntReserveFraction": 0.4,
      "m_bHunkerWhileHunting": true,
      "m_aGroupPrefabs": [
        "{E552DABF3636C2AD}Prefabs/Groups/OPFOR/Group_USSR_RifleSquad.et"
      ],
      "m_aVehicles": [
        {
          "$type": "ATG_Scenario_GarrisonVehicle",
          "m_sVehiclePrefab": "{D9B91FAB817A6033}Prefabs/Vehicles/Wheeled/Ural4320/Ural4320_transport_covered.et",
          "m_iSeats": 12,
          "m_fWeight": 3,
          "m_bParkWithGarrison": false,
          "m_bCarriesReinforcements": true,
          "m_bManTurret": true
        },
        {
          "$type": "ATG_Scenario_GarrisonVehicle",
          "m_sVehiclePrefab": "{0B4DEA8078B78A9B}Prefabs/Vehicles/Wheeled/UAZ469/UAZ469_PKM.et",
          "m_iSeats": 4,
          "m_fWeight": 2,
          "m_bParkWithGarrison": true,
          "m_bCarriesReinforcements": true,
          "m_bManTurret": true
        }
      ],
      "m_aTiers": [
        {
          "$type": "ATG_Scenario_GarrisonTier",
          "m_iTier": 1,
          "m_iStrength": 8,
          "m_fMenPerPlayer": 2,
          "m_eAISkill": "REGULAR"
        }
      ]
    }
  ]
}

A list in the JSON layer replaces the whole list rather than merging entry by entry, so a m_aGarrisonProfiles written here must be complete. Every entry needs its $type; without it the entry is read as the wrong class and quietly builds nothing.

Tuning it

The shipped defaults are written for a real session and are deliberately slow. If you are watching the behaviour rather than playing, drop the casualty threshold to 1 and cut the wave, warning, hunt and linger timers to something you can sit through — otherwise a single test costs you a quarter of an hour.

Two things worth knowing before you turn dials:

The concurrent ceiling is what protects your server. Multiply the maximum garrison strength by this ceiling, then by the number of objectives running at once, to get the most AI the mod can have standing. Raise it carefully.

Help arriving late is a feature. If reinforcements are taking too long to reach you on open ground, the search is walking outwards looking for cover. Lowering the minimum spawn distance helps more than raising the maximum.

If nothing ever arrives in a vehicle, check the mounting distance against the minimum spawn distance. The concealment search usually succeeds on its first ring, so help is placed at almost exactly the minimum — and if the mounting distance is set higher than that, every wave walks the whole way and there is nothing in the log to say why. The two settings have to be read together.

If a garrison never sends anyone after a shooter, check the hunting range. It is the distance from the objective at which somebody stops being a fight the defenders are already in and becomes something worth going after. Set it wider than players actually engage from and the garrison will sit and trade fire indefinitely instead.