Configuration

Every ATG Scenario setting, its default, and how to override them for your server.

Where settings come from

Settings arrive in three layers, each overriding the one before.

Layer 1 — defaults. Compiled into the mod. You get these if you change nothing.

Every Default column on this page is the value the mod actually ships with, which is what the Workbench panel shows you when you open its settings file. Every single value is set in the script itself, so the mod’s own settings file overrides nothing and carries only the four lists — the tier ladder, the objective templates, the garrison profile and the civilian prefabs — which cannot be expressed as script defaults.

Layer 2 — an override in your own mod. You cannot edit this mod’s settings file: it arrives from the Workshop as read-only, and an update would overwrite your changes anyway. Instead you create an override of it in your own mod. See below.

Layer 3 — a per-server JSON file. $profile:ATG/atg-scenario.json on the server, applied key by key. Only active when ATG Core is loaded ahead of this mod. Useful for running one mod across several servers with different tuning, since it needs no mod changes at all.

The JSON file is read once at startup. Editing it while the server is running changes nothing until the server restarts.

Creating an override

In Workbench, with ATG Scenario among your loaded addons:

  1. Find Configs/InitialSettings.conf in the Resource Browser.
  2. Right-click it → Override. Choose your own addon when asked where the override should live.
  3. Open your new override and change only the settings you care about.

Everything you leave alone keeps the mod’s default, so an override that changes one number stays one line long and is unaffected by future updates to the rest.

Writing the JSON file by hand

A layer-2 override is edited in Workbench’s panel, where every setting has the right kind of control already. The JSON file is the one you write as text:

  • Booleans are true and false — a 1 is ignored, and the setting keeps the value it already had. This page lists defaults as true/false, matching the tickboxes the Workbench panel shows.
  • Enums are written by name, e.g. DESTROY, not by number.
  • Resource paths carry a resource identity prefix in braces before the path. Always set these with the picker rather than typing them.

What layer 3 covers

Every setting on this page, the three list settings included — the tier ladder, the objective templates and the garrison profiles. So a server can be retuned, and its objectives and opposition rewritten, with no mod changes and no Workbench.

Single values are applied key by key: name only what you want to change. Lists are applied whole: naming one replaces it, so a list you touch has to be written out in full, and every entry needs a $type naming its class. The mechanics, and why lists work that way, are on ATG Core configuration — worth reading once before you write a list.

The complete file is at the bottom of this page. Start from that rather than writing a list from memory: a mistyped $type gives you an entry that loads and then does nothing, with nothing in the log to say so.

Score

One faction earns and spends the score. This is a co-operative ledger for the player side, not a scoreboard.

SettingDefaultMeaning
m_bScoreEnabledtrueMaster switch. Off means objectives still run but pay nothing.
m_sScoredFactionKeyUSFaction that earns and spends. Set to your own faction’s key.
m_fStartingScore0Balance on a brand new server.
m_fScoreFloor0Balance can never fall below this. Set below zero to allow a deficit.
m_fScoreCeiling0Upper limit; 0 means uncapped.

What an objective pays is set on the objective itself rather than here — see m_fReward under objective templates below.

A floor of exactly zero makes upkeep stall rather than bite — a faction that runs out simply stops at nothing. Allowing a deficit is what gives losses consequences.

Upkeep

The drain that makes the balance something to manage rather than a number that only grows.

SettingDefaultMeaning
m_fUpkeepPerHour0Flat drain regardless of player count. 0 disables.
m_fUpkeepPerPlayerPerHour0Additional drain per connected player — wages.
m_iUpkeepIntervalSec300How often upkeep is charged.

Rates are per hour and scaled to the interval, so changing the interval changes how often the balance moves, never how fast it falls.

Tiers

An abstract ladder. The mod reports the tier reached; it does not decide what a tier unlocks. A consuming mod listens for the change and acts on it.

SettingDefaultMeaning
m_bTiersEnabledtrueReport a tier as the balance crosses the ladder.
m_bTiersCanFalltrueOff makes tiers a ratchet — once earned, never lost.
m_aTierThresholds(a 1-8 ladder)Balance required for each tier. Highest rung met wins.

m_bTiersCanFall has the most effect on how a server feels. On, a bad run costs the faction its gear as well as its bank. Off, progression only ever moves forwards and a quiet week costs nothing.

It only bites if something can take score away. With both upkeep rates at zero the balance can never fall, so tiers are a ratchet whatever this is set to. Set an upkeep rate, a negative floor, or objective failure penalties before expecting a tier to be lost.

The shipped ladder assumes the map is fully worked: three objectives live at once, a squad on each, one completed roughly every 12 minutes at an average of ~117 score — about 1750 score an hour. On that basis tier 2 arrives in about an hour and a half and tier 8 after some 45 hours of play.

That is a deliberate ceiling, not a prediction. A single squad working one objective at a time earns a third of it and progresses three times slower, which is the intended shape — the ladder rewards fielding enough people to use the map. If your server habitually runs one squad and you want the same pace, divide every rung by three rather than editing them individually.

Director

The loop that keeps objectives on the map.

SettingDefaultMeaning
m_bDirectorEnabledtrueGenerate objectives continuously.
m_iMaxConcurrentObjectives3How many are live at once.
m_iStartupDelaySec60Wait after world load before the first objective.
m_iReplacementDelaySec120Wait after one resolves before replacing it.
m_iObjectiveLingerSec600How long a finished objective’s contents stay in the world, and how long its survivors keep hunting.
m_iObjectiveSpawnStaggerSec15Gap between objectives while the map is short of more than one.
m_iPlacementRetryDelaySec60Retry interval when no usable position was found.
m_aObjectiveTemplates(see below)The kinds of objective that can be built.
m_sObjectiveFactionKey(empty)The player faction the task belongs to — who is given the job. Not the opposition. Falls back to the scored faction.
m_bTaskNamesIncludeZonetrueName the zone in a task title, so the list reads “Destroy vehicle in Landay” rather than “Destroy vehicle”.
m_sTaskZoneFormat%1 in %2How a title and its zone are joined. %1 is the title, %2 the zone name.

Naming the zone is worth having with several objectives up at once, which is the normal case. It has one cost: a title with a place name in it has to be assembled while the server is running, and an assembled title is plain text rather than a translatable key, so it is shown in English whatever language a player is in. Turn it off to keep translatable titles and lose the place name. There is no third option.

This is the faction receiving the task, not the one defending the objective. Set it to your players’ side. Who opposes them is decided entirely by the garrison profiles below.

It must also be a playable faction. Vanilla’s compositions carry no faction of their own — in a hand-built mission the area placed in the world supplies one — so the mod sets it explicitly. Without a playable one the framework refuses to create the task and logs No playable faction available.

Garrison

Who defends an objective, and how dangerous they are.

SettingDefaultMeaning
m_aGarrisonProfiles(empty)Forces that can defend. With none listed, objectives spawn undefended.
m_iGarrisonStrengthMax40Hard ceiling on men per objective, whatever the ladder and player scaling ask for.
m_fGarrisonSpreadM80How far groups are scattered from the objective centre.

Where those men end up standing, which of them patrol, how long they are held awake to walk into position, and what they do when they hear shooting are all on Garrisons.

Difficulty is meant to come from who turns up and how good they are, not from how many bodies there are. Headcount costs server performance and makes a fight tedious rather than dangerous; skill and composition cost nothing and change how it plays. So player count scales the size of a fight — eight players need more to shoot at than one — while the profile decides how hard it is.

A garrison is budgeted in men, not in groups. Groups are drawn from the profile until the budget is filled, and the group that would overshoot it is trimmed to fit. That is what lets one profile list sentry teams and rifle squads together: were the budget counted in groups, “two groups” would mean anything from four men to eighteen depending on the draw, and every extra player would multiply that spread rather than smooth it.

How many men, and how well trained, comes from the profile’s tier ladder — see below. m_iGarrisonStrengthMax is the one global brake, and it is worth setting deliberately: multiply it by m_iMaxConcurrentObjectives to get the most AI the director can have standing at once.

Garrison profiles

FieldMeaning
m_sNameName for logs.
m_iMinTier / m_iMaxTierTier range this profile is valid for. -1 for no upper limit.
m_fWeightRelative likelihood among profiles valid at the current tier.
m_aGroupPrefabsAI group prefabs; one is drawn at random per group spawned. Sizes may differ freely.
m_aTiersThe tier ladder — how strong and how well trained this force is at each tier. See below.
m_fPerceptionFactorHow quickly they notice you. Above 1 is sharper. Set per profile, not per tier.
m_bCanCallResponseWhether this force can call for help once it is in contact.
m_aResponseGroupsWho comes when it calls. Empty draws from the group list above.
m_aVehiclesWhat it drives — for bringing help in, and for chasing a distant shooter.
m_iHuntReserveFewest men that may ever be left holding the objective.
m_fHuntReserveFractionShare of the garrison that must stay behind. The larger of this and the floor wins.
m_bHunkerWhileHuntingWhether the men left behind hold their fire until something threatens them.
m_sArmourResponseGroupGroup sent after a straggler in a vehicle during the operation wind-down’s hunt.
m_sMortarEmplacementEmplacement this force sets up against a straggler who goes to ground indoors.

The last eight are covered properly on Reinforcements, along with the server-wide settings that decide how often help is called and where it appears from, and the fields carried by each vehicle and response-group entry. Take the full shape of a profile from that page’s complete example rather than from the sketch below.

The skill ladder runs NONE, NOOB, ROOKIE, REGULAR, VETERAN, EXPERT, CYLON — the last being deliberately superhuman. REGULAR is a reasonable baseline; stepping a profile up the ladder as tiers rise is the cheapest way to make later objectives harder.

The tier ladder

Each profile carries its own ladder. List a band wherever something changes; the highest band the faction has reached wins, the same way the score ladder is read. A tier below every band listed falls back to the lowest band, so a ladder written for tiers 1-8 covers tier 0 without saying so.

FieldMeaning
m_iTierTier this band takes effect at.
m_iStrengthMen fielded at this tier, before player scaling.
m_fMenPerPlayerExtra men per connected player at this tier.
m_eAISkillHow competent they are in a fight at this tier.

Strength and skill live in the same band because they trade against each other: a garrison that gets better trained can afford to get smaller, and a rung that steps the skill up while dropping the headcount is a harder fight that costs the server less. Player scaling belongs here too — two more conscripts and two more elite troops are not the same reinforcement, so one global rate cannot be right at both ends of a ladder.

A profile that lists no bands fields nobody, and says so in the log.

Tier bounds are what let opposition change character rather than merely grow. Retiring a light profile at a given tier while a heavier one becomes available produces a genuine shift in who you are fighting, and overlapping the ranges gives you a transition period where either might turn up.

The startup delay exists because the world is still assembling at init and nobody has connected, so the distance-from-players rule has nothing to measure against. The replacement delay stops the map reading as a conveyor belt rather than a place.

Objectives are raised one at a time, never in a batch. Each brings an area, a composition and a whole garrison, every group of which spawns its members individually, so filling three empty slots at once lands all of it in a single frame — a hitch everyone on the server feels. m_iObjectiveSpawnStaggerSec is the gap between them while the map fills; the map being briefly one objective short is not something anybody notices.

The linger is separate, and both are timed from the objective resolving, so they don’t stack. Linger governs how long the wreck, the body and anything else the objective spawned stay put — set it to 0 and a casualty is swept away before anyone can search it. A finished objective is also removed from the task list and the map at that point, rather than accumulating in the completed list forever, which on a server running for weeks would otherwise make the map unreadable.

Objective templates

Each entry is one kind of objective. Pick a concrete type when adding one — each bakes in the task type and the Scenario Framework composition that implements it, and exposes only what is worth changing:

TypeProduces
ATG_Scenario_KillObjectiveKill a specific person
ATG_Scenario_DestroyObjectiveDestroy a specific vehicle or object
ATG_Scenario_ClearAreaObjectiveClear the objective’s garrison off the ground
ATG_Scenario_DeliverObjectiveRecover intel from the objective and bring it back
ATG_Scenario_DefendOrDenyObjectiveDestroy the asset, or clear the position and hold it for more score
ATG_Scenario_CustomObjectiveNothing fixed — exposes task type and composition as settings

The mod ships the first five configured, so objectives generate on a stock setup. Deliver intel ships at weight 0, which keeps it defined and out of the draw — raise its weight to put it into rotation.

Task type and composition are baked in rather than exposed because they are not independent choices: pairing the Kill composition with the Destroy task type produces an objective that can never complete, and nothing would catch it. Use ATG_Scenario_CustomObjective for a one-off or an experiment, and promote it to a real subclass once it earns its place.

Every type shares these settings:

FieldMeaning
m_sNameName for logs.
m_iMinTier / m_iMaxTierTier range this objective is valid for. -1 for no upper limit.
m_sTargetPrefabWhat the target slot spawns — the HVT, the vehicle. Ignored by objectives that have no target, such as Clear area.
m_fWeightRelative likelihood among objectives valid at the current tier. 0 retires it.
m_fReward / m_fFailurePenaltyScore paid on completion, deducted on failure.
m_sTaskTitle / m_sTaskDescriptionUsed only where the composition carries none of its own.

You will usually need to set m_sTargetPrefab. Vanilla’s compositions hardcode their targets to stock factions — the Kill objective spawns an unarmed USSR character — so a garrison of any other faction treats that target as an enemy and kills it themselves, completing the objective before players arrive. Point it at a character or vehicle on the same side as your garrison.

Pricing lives on the template rather than being keyed by task type, so two objectives sharing a type can be worth different amounts — a job at the far end of the map should pay more than one on the doorstep. The values are captured when the objective is built, so editing config mid-session never changes what something already on the map is worth.

The mod ships four entries in rotation: Destroy, Kill, Clear area and Defend or deny.

Destroy and Kill use vanilla’s compositions as they stand, and are the only two that work unaided. Clear area needs more than configuration, and is worth understanding before you copy the pattern: it uses vanilla’s composition for the task and its map marker, but the mod decides when it is finished. Vanilla’s version completes the moment its dominance trigger fires, and that trigger fires in situations that have nothing to do with the ground being cleared — so left to itself the objective closes seconds after it appears, with nobody near it. The mod instead completes it when the garrison defending it is dead, which is a question it can answer from the AI it spawned itself, without depending on how two factions from two different mods regard one another.

That is also why a Clear area objective is not placed at all if no garrison profile is valid at the current tier — an objective completed by clearing its defenders cannot be completed when it has none. The mod logs a warning and tries again later rather than placing one.

Defend or deny

An asset has been left where the enemy could reach it, and they have. The squad is called in because something was abandoned or overrun, so both ways out are legitimate answers rather than one being the lazy version of the other:

  • Deny — destroy the asset and leave. Quick, and nobody has it now.
  • Defend — clear the position, leave the asset standing, and hold the ground until the enemy stop trying. Slower and far more exposed, and it pays considerably more.

It spawns the same composition as a Destroy objective, because the deny half is one. The asset is marked and destructible exactly as it would be, and leaving it intact is a decision rather than a failure. Killing the garrison does not complete it — that is how the position becomes holdable, not how the objective ends.

The hold clock only runs while somebody of yours is on the position and no defender is still holding it, so the time below is spent after the fight rather than including it. Being pushed off does not freeze progress, it reverses it.

FieldDefaultMeaning
m_fReward50Score paid for denying — the shared setting, used as the deny payout.
m_fHoldReward150Score paid for defending instead.
m_iHoldSec300How long the position has to be held.
m_fHoldRadiusM100How close a player must be for the hold to count. Much tighter than the contribution radius.
m_fHoldDecayRate0.5How fast progress is lost while the position is not held, as a share of how fast it is gained.

The gap between the two payouts is what makes this an objective rather than a chore: too small and nobody takes the risk, too large and nobody ever denies anything.

At the default decay rate, two minutes pushed off costs one minute of progress — being driven back hurts without wiping out the work. Set it to 0 to freeze progress instead, which makes it safe to walk away and come back much later.

Which way out is taken also changes the area afterwards, and players are told so over the radio. See Notoriety.

The remaining compositions in Prefabs/Systems/ScenarioFramework/Compositions/LayerTasks/ are not usable yet. They expect a mission designer to have placed supporting entities in the world, and produce blank tasks, objectives that cannot complete, or outright errors when spawned bare.

Several entries can share a task type, and that is how tier progression works: one Kill objective bounded to early tiers carrying an insurgent officer, another from a later tier carrying a regular-army officer. The man you are sent after then always belongs to the force defending him.

To change the mix, adjust m_fWeight. Setting it to 0 retires an objective without deleting the entry, which is easier to undo than removing it.

A template with no composition set is skipped rather than treated as an error, and the mod logs which ones at startup.

Placement

Covered in full on Objective placement.

Zones are the one thing not configured from this file. They live either in <profile>/ATG/atg-scenario-zones.json, which a Game Master writes from in-game with /atg zone save, or in a zone config shipped by your map mod and pointed at by m_sZoneConfig below. The surveyed file wins when both exist.

SettingDefaultMeaning
m_sZoneConfig(empty)Zone and exclusion lists shipped in a mod. Ignored when a surveyed zones file exists.
m_sBaseExclusionNameMOBWhich exclusion counts as home, for the range limits.
m_fObjectiveMinSeparationM800Minimum gap between live objectives.
m_fObjectiveMinDistanceFromBaseM600Nothing closer than this to home.
m_fObjectiveMaxDistanceFromBaseM6000Nothing further than this. 0 removes the limit.
m_fObjectiveMinDistanceFromPlayersM400Never place near a connected player.
m_fPlacementClearRadiusM2Radius of clear ground an objective needs.
m_fPlacementVehicleClearRadiusM6The same, for an objective whose target is a vehicle and so needs room for one.
m_fPlacementClearHeightM4Height of clear space it needs.
m_fOverheadClearanceM5Required open sky. Rejects sealed building interiors.
m_fMaxGroundVariationM3How much the ground may rise or fall across the site.

The two clear radii are separate because they answer different questions. Most objectives need somewhere a person can stand, which is a small circle; an objective whose target is a vehicle needs somewhere a vehicle fits, and that one is placed at a fixed offset with no search of its own. Raising the first to the second’s value is the usual cause of objectives refusing to land anywhere built-up.

Overhead clearance is measured from a little above head height, so a value of 5 still rejects a room with a ceiling on it while allowing tree canopy and upper storeys. Set it as high as the height of a building and objectives will only ever land in open fields.

Base protection

Places you do not want players wrecking — gates, garages, workshops. See Base protection for how to mark one out.

SettingDefaultMeaning
m_bProtectionEnabledtrueMaster switch. Off leaves any placed areas inert.
m_iRepairDelaySec600How long after something is destroyed before it is rebuilt.
m_fRepairClearanceM6Never rebuild while a player is this close to the spot. It retries.
m_iRepairSweepSec30How often the rebuild queue is checked.

Charges and enforcement

SettingDefaultMeaning
m_fCollisionPenalty5Charged when a player drives through something in a protected area.
m_fDestructionPenalty40Charged when they destroy it any other way — explosives, gunfire.
m_iIncidentWindowSec60How long one player’s destruction counts as a single incident.
m_fIncidentMaxPenalty150The most one incident can cost. 0 means uncapped.
m_iWarnObjectCount4Objects destroyed in one incident before that player is warned.
m_iKickObjectCount12Objects in one incident before they are removed, having been warned.
m_iWarningsBeforeKick1Warnings allowed before the next offence removes them instead.
m_iKickTimeoutSec600How long a removed player is barred from reconnecting. -1 is permanent.
m_bExemptStafftrueAdmins and Game Masters are never charged, warned or removed.

The cap bounds the charge only. The object count that drives warnings and removal is never capped, so a player past the ceiling still escalates. Set the cap well above your largest single charge — m_fDestructionPenalty multiplied by an area’s own multiplier — or every serious incident costs the same and per-area multipliers stop meaning anything.

A player is never removed without having been warned first.

Shooting a civilian is charged on the same ledger, so somebody who wrecks the base and shoots the locals escalates towards one warning and one removal rather than getting a fresh allowance for each. See Civilians for who they are and where they live.

SettingDefaultMeaning
m_fCivilianPenalty50Charged for the first civilian a player kills.
m_fCivilianPenaltyStep10Added for each further civilian the same player kills inside the window.
m_fCivilianPenaltyMax100The most one civilian death can cost, however far the ramp has climbed.
m_iCivilianPenaltyWindowSec600How long a kill keeps counting towards the ramp, measured from the last one.

Only a player is billed. A civilian killed by the AI is logged and costs nothing.

Announcements

SettingDefaultMeaning
m_bAnnounceScoreChangestrueTell everyone when the score moves, naming who caused it.
m_fAnnounceMinDelta1Ignore movements smaller than this.
m_iAnnounceMaxNames3How many contributors are named before the rest become “and N others”.
m_bResponseAnnouncetrueWarn the people fighting an objective when reinforcements are on the way to it.

The reinforcement warning goes only to players within the contribution radius, and only for reinforcements. A hunting party working around your flank is deliberately never announced — flanking would achieve nothing if it were.

Announcements report what the event was worth, not what reached the balance, and they always fire. A message that appeared only when the balance actually moved would let players work out where the faction sits against its floor, ceiling or cap by watching which of their actions produced one. Upkeep is never announced.

Objective credit

Who gets named when an objective is completed.

SettingDefaultMeaning
m_fContributionRadiusM800How close a player must be to an objective to be credited.
m_iContributionGraceSec180How long credit lasts after they were last near it.
m_iContributionPollSec10How often presence is sampled, and the resolution of the ranking.

The radius is deliberately wide — somebody covering an assault from a ridge half a kilometre away contributed. Players inside the base exclusion are never credited however wide it is set, so an objective placed near home does not credit everyone standing at spawn.

The grace window is what keeps a player who was killed shortly before the objective resolved on the list. Contributors are ranked by how long they were present, so the names shown are the people most involved.

Game Master reminders

SettingDefaultMeaning
m_bGameMasterCombatRemindertrueRemind staff they are logged in while combat ops is running.
m_iGameMasterReminderDelaySec45How long after the switch, or after they log in, to send it.

Useful where something logs Game Masters in automatically, since the usual way to find out is to notice mid-firefight.

The operation wind-down

When a Game Master schedules a switch to a set-piece operation (/atg op <minutes>), the mod winds combat operations down so the operation starts on time — without it, one player four kilometres from base can hold up a scheduled start indefinitely.

The wind-down runs in marks, each timed by its own lead setting. With the defaults: thirty minutes out the director stops placing new objectives; fifteen minutes out, objectives nobody has been near are cancelled and every player gets an Exfil task telling them to return to base; ten minutes out, lingering objectives are torn down, forward spawn points lock so everyone respawns at base, and a hunt is sent after anyone still outside the perimeter; at zero the hunt stands down, the task completes or fails, and the operation begins. A hunt whose lead time has already passed when the operation is scheduled fires immediately rather than being skipped — hunting parties are placed out of sight and have to travel, so somebody who turns for home at the announcement outruns them.

The hunt is not a fight on offer — it exists to make certain the operation starts on time, and dying to it is the fast way back to base rather than a punishment. Lower the skill if that reads as unfair on your server.

The last resort is gas. Shortly before the start, smoke lands on anyone still outside the perimeter, a GAS GAS GAS warning goes out, and the air turns poisonous. It is deliberately too late to run from: whoever it catches still counts as outside when the deadline is judged and dies shortly afterwards, so an operation never opens with a Game Master chasing the last player across the map. Unlike every other mark, it is never brought forward — an operation called at shorter notice than the gas lead simply goes without it. Set m_iExfilGasLeadSec to 0 if you would rather it never happened.

SettingDefaultMeaning
m_bExfilEnabledtrueMaster switch. Off, the operation still starts at the scheduled moment — nobody is penalised.
m_iExfilDirectorStopLeadSec1800Stop placing new objectives this long before the start.
m_iExfilTaskLeadSec900Cancel untouched objectives and issue the Exfil task this long before the start.
m_iExfilHuntLeadSec600Tear down what is left, lock forward spawns and begin the hunt this long before the start.
m_fExfilRadiusM0Where “back inside” is measured from base. 0 uses the base exclusion zone, which is the sensible default.
m_fExfilFailurePenalty150Score charged once — however many players were missing — if anyone is still outside at zero.
m_iExfilPollSec10Granularity of the whole wind-down: the progress bar, re-tasking and the stand-down.
m_bExfilCancelIdleObjectivestrueWhether untouched objectives are cancelled at the task mark.
m_iExfilIdleGraceSec300How long an objective must have had nobody near it to count as untouched.
m_bExfilLockSpawnstrueLock forward spawn points for the hunt, so a player killed outside comes back at base.
m_eExfilHuntSkillCYLONHow competent the hunters are. The top of the scale is the point — this is a deadline, not a fight.
m_fExfilHuntFireRate2How fast hunters fire, as the engine’s coefficient (0.05–2). 1 leaves the engine’s own rate untouched.
m_iExfilGasLeadSec10Gas takes effect on anyone still outside this long before the start. 0 disables the gas entirely.
m_fExfilGasDPS3Damage per second the gas starts at. Exposure compounds, so a small number goes a long way.
m_fExfilHuntGarrisonRangeM1000Garrisons within this of a straggler join the hunt.
m_iExfilRampSec120The hunt’s manpower ceiling ramps up by one objective’s worth this often. 0 opens at the full ceiling.
m_iExfilHuntStrengthMax0Hard ceiling on hunters in the field. 0 derives it from the objective and garrison ceilings above.

The hunt’s manpower is budgeted in men and split between everyone still outside, so two stragglers do not double what is in the field. Which force hunts, what it drives, and what it sets up against a player who goes to ground indoors all come from the garrison profiles — see the armour response and mortar emplacement fields on Reinforcements.

Persistence

SettingDefaultMeaning
m_bPersistScoretrueWrite the balance to $profile:ATG/atg-scenario-state.json.
m_iPersistIntervalSec300How often it is written.

The balance is also written immediately whenever a tier changes, so this interval only bounds how much progress a hard crash can lose.

The complete settings file

Every setting, at the value the mod ships with, as <profile>/ATG/atg-scenario.json.

Copy it and delete the lines you do not want to change — a key you leave out keeps its shipped value, and a shorter file is easier to review later. Keep whole lists intact if you keep any of them, since a list is replaced rather than merged.

{
  "m_bScoreEnabled": true,
  "m_sScoredFactionKey": "US",
  "m_fStartingScore": 0,
  "m_fScoreFloor": 0,
  "m_fScoreCeiling": 0,

  "m_fUpkeepPerHour": 0,
  "m_fUpkeepPerPlayerPerHour": 0,
  "m_iUpkeepIntervalSec": 300,

  "m_bTiersEnabled": true,
  "m_bTiersCanFall": true,
  "m_aTierThresholds": [
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 1,
      "m_fScoreRequired": 0
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 2,
      "m_fScoreRequired": 2700
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 3,
      "m_fScoreRequired": 6900
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 4,
      "m_fScoreRequired": 13200
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 5,
      "m_fScoreRequired": 22800
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 6,
      "m_fScoreRequired": 36000
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 7,
      "m_fScoreRequired": 54000
    },
    {
      "$type": "ATG_Scenario_TierThreshold",
      "m_iTier": 8,
      "m_fScoreRequired": 78000
    }
  ],

  "m_bModeSwitchEnabled": true,
  "m_eDefaultTierMovement": "LOCKED",

  "m_bDirectorEnabled": true,
  "m_iMaxConcurrentObjectives": 3,
  "m_iStartupDelaySec": 60,
  "m_iReplacementDelaySec": 120,
  "m_iObjectiveLingerSec": 600,
  "m_iObjectiveSpawnStaggerSec": 15,
  "m_iPlacementRetryDelaySec": 60,
  "m_sObjectiveFactionKey": "",
  "m_bTaskNamesIncludeZone": true,
  "m_sTaskZoneFormat": "%1 in %2",
  "m_aObjectiveTemplates": [
    {
      "$type": "ATG_Scenario_DestroyObjective",
      "m_sName": "Destroy",
      "m_iMinTier": 0,
      "m_iMaxTier": -1,
      "m_fWeight": 1,
      "m_sTargetPrefab": "",
      "m_fReward": 100,
      "m_fFailurePenalty": 0,
      "m_sTaskTitle": "",
      "m_sTaskDescription": ""
    },
    {
      "$type": "ATG_Scenario_KillObjective",
      "m_sName": "Kill",
      "m_iMinTier": 0,
      "m_iMaxTier": -1,
      "m_fWeight": 1,
      "m_sTargetPrefab": "",
      "m_fReward": 100,
      "m_fFailurePenalty": 0,
      "m_sTaskTitle": "",
      "m_sTaskDescription": ""
    },
    {
      "$type": "ATG_Scenario_ClearAreaObjective",
      "m_sName": "Clear area",
      "m_iMinTier": 0,
      "m_iMaxTier": -1,
      "m_fWeight": 1,
      "m_fReward": 150,
      "m_fFailurePenalty": 0,
      "m_sTaskTitle": "#AR-CombatScenario_ClearAreaTask_Title",
      "m_sTaskDescription": "#ATG-Scenario_ClearArea_Description"
    },
    {
      "$type": "ATG_Scenario_DeliverObjective",
      "m_sName": "Deliver intel",
      "m_iMinTier": 0,
      "m_iMaxTier": -1,
      "m_fWeight": 0,
      "m_fReward": 125,
      "m_fFailurePenalty": 0,
      "m_sTaskTitle": "",
      "m_sTaskDescription": ""
    },
    {
      "$type": "ATG_Scenario_DefendOrDenyObjective",
      "m_sName": "Defend or deny",
      "m_iMinTier": 0,
      "m_iMaxTier": -1,
      "m_fWeight": 1,
      "m_sTargetPrefab": "",
      "m_fReward": 50,
      "m_fHoldReward": 150,
      "m_iHoldSec": 300,
      "m_fHoldRadiusM": 100,
      "m_fHoldDecayRate": 0.5,
      "m_fFailurePenalty": 0,
      "m_sTaskTitle": "",
      "m_sTaskDescription": ""
    }
  ],

  "m_aGarrisonProfiles": [],
  "m_iGarrisonStrengthMax": 40,
  "m_fGarrisonSpreadM": 80,
  "m_fGarrisonSlotSeparationM": 25,
  "m_fGarrisonVehicleSeparationM": 30,
  "m_fGarrisonDefendRadiusM": 60,
  "m_iGarrisonSettleSec": 60,
  "m_fGarrisonPatrolFraction": 0.6,
  "m_fPatrolFirmRangeM": 150,
  "m_fPatrolReliefRangeM": 100,
  "m_iPatrolFirmTimeoutSec": 300,
  "m_fPatrolInvestigateRangeM": 300,
  "m_iPatrolInvestigateSec": 120,

  "m_bResponseEnabled": true,
  "m_bResponseHearsShots": true,
  "m_fResponseStrengthCeiling": 1.5,
  "m_iResponseCasualtyThreshold": 4,
  "m_fResponseForceRatio": 1.5,
  "m_iResponseWaveBaseSec": 120,
  "m_fResponseWaveBackoff": 1.5,
  "m_iResponseWaveMaxSec": 900,
  "m_iResponseQuietDecaySec": 300,
  "m_iResponseWarningSec": 45,
  "m_fResponseSpawnMinM": 600,
  "m_fResponseSpawnMaxM": 2500,
  "m_fResponseSpawnStepM": 250,
  "m_fResponseMountThresholdM": 400,
  "m_fResponseDebusM": 60,
  "m_fResponseDefendRadiusM": 60,
  "m_iResponseHuntCooldownSec": 180,
  "m_iResponseHuntDurationSec": 300,
  "m_iResponseLingerSec": 120,
  "m_fResponseWithdrawRadiusM": 60,
  "m_fResponseHuntErrorMinM": 60,
  "m_fResponseHuntErrorMaxM": 250,
  "m_fResponseFlankOffsetM": 200,
  "m_fResponseHuntMinRangeM": 150,
  "m_fResponseAvengeFraction": 0.5,
  "m_bNotorietyEnabled": true,
  "m_bPersistNotoriety": true,
  "m_fNotorietyPerDenial": 1,
  "m_fNotorietyPerDefence": 1,
  "m_fNotorietyMax": 3,
  "m_fNotorietyDecayPerHour": 1,
  "m_fNotorietySurgeDecayPerHour": 6,
  "m_fNotorietyCeilingBonus": 0.25,
  "m_fNotorietyWaveHaste": 0.2,

  "m_bResponseAmbushEnabled": true,
  "m_iResponseAmbushLeadSec": 120,
  "m_fResponseAmbushSpawnMinM": 250,
  "m_iResponseAmbushHoldSec": 600,

  "m_sZoneConfig": "",
  "m_sBaseExclusionName": "MOB",
  "m_fObjectiveMinSeparationM": 800,
  "m_fObjectiveMinDistanceFromBaseM": 600,
  "m_fObjectiveMaxDistanceFromBaseM": 6000,
  "m_fObjectiveMinDistanceFromPlayersM": 400,
  "m_fPlacementClearRadiusM": 2,
  "m_fPlacementVehicleClearRadiusM": 6,
  "m_fPlacementClearHeightM": 4,
  "m_fOverheadClearanceM": 5,
  "m_fMaxGroundVariationM": 3,

  "m_bAnnounceScoreChanges": true,
  "m_fAnnounceMinDelta": 1,
  "m_iAnnounceMaxNames": 3,
  "m_bResponseAnnounce": true,
  "m_fContributionRadiusM": 800,
  "m_iContributionGraceSec": 180,
  "m_iContributionPollSec": 10,
  "m_bProtectionEnabled": true,
  "m_iRepairDelaySec": 600,
  "m_fRepairClearanceM": 6,
  "m_iRepairSweepSec": 30,
  "m_fCollisionPenalty": 5,
  "m_fDestructionPenalty": 40,
  "m_iIncidentWindowSec": 60,
  "m_fIncidentMaxPenalty": 150,
  "m_iWarnObjectCount": 4,
  "m_iKickObjectCount": 12,
  "m_iWarningsBeforeKick": 1,
  "m_iKickTimeoutSec": 600,
  "m_bExemptStaff": true,
  "m_fCivilianPenalty": 50,
  "m_fCivilianPenaltyStep": 10,
  "m_fCivilianPenaltyMax": 100,
  "m_iCivilianPenaltyWindowSec": 600,
  "m_bGameMasterCombatReminder": true,
  "m_iGameMasterReminderDelaySec": 45,

  "m_bCiviliansEnabled": true,
  "m_aCivilianPrefabs": [
    "{22E43956740A6794}Prefabs/Characters/Factions/CIV/GenericCivilians/Character_CIV_Randomized.et",
    "{B3AB6D12D247DDB5}Prefabs/Characters/Factions/CIV/Businessman/Character_CIV_Businessman_Randomized.et",
    "{5882AE7A4543AFB4}Prefabs/Characters/Factions/CIV/Dockworker/Character_CIV_Dockworker_Randomized.et",
    "{D97EAE64721478F3}Prefabs/Characters/Factions/CIV/ConstructionWorker/Character_CIV_ConstructionWorker_Randomized.et"
  ],
  "m_sCivilianFactionKey": "CIV",
  "m_fCiviliansPer100M": 4,
  "m_iCiviliansMin": 2,
  "m_iCiviliansMax": 16,
  "m_fCivilianSpawnDistanceM": 600,
  "m_fCivilianDespawnDistanceM": 900,
  "m_fCivilianWanderRadiusM": 60,
  "m_bCivilianDayNight": true,
  "m_fCivilianNightIndoorsFraction": 0.6,
  "m_bCiviliansInNarrative": true,

  "m_bExfilEnabled": true,
  "m_iExfilDirectorStopLeadSec": 1800,
  "m_iExfilTaskLeadSec": 900,
  "m_iExfilHuntLeadSec": 600,
  "m_fExfilRadiusM": 0,
  "m_fExfilFailurePenalty": 150,
  "m_iExfilPollSec": 10,
  "m_bExfilCancelIdleObjectives": true,
  "m_iExfilIdleGraceSec": 300,
  "m_bExfilLockSpawns": true,
  "m_eExfilHuntSkill": "CYLON",
  "m_fExfilHuntFireRate": 2,
  "m_iExfilGasLeadSec": 10,
  "m_fExfilGasDPS": 3,
  "m_fExfilHuntGarrisonRangeM": 1000,
  "m_iExfilRampSec": 120,
  "m_iExfilHuntStrengthMax": 0,

  "m_bPersistScore": true,
  "m_iPersistIntervalSec": 300
}

Four things above are not copy-and-go:

  • m_aGarrisonProfiles is the one gap. The mod ships a single profile built on vanilla’s USSR groups, which is why objectives are defended out of the box — but it cannot be printed here, because it arrives as a reference to a config file rather than as inline values. Write your own out in full instead. Each entry is { "$type": "ATG_Scenario_GarrisonProfile", "m_sName": "…", "m_aGroupPrefabs": [ … ], "m_aTiers": [ … ], "m_fPerceptionFactor": 1, "m_iMinTier": 0, "m_iMaxTier": -1, "m_fWeight": 1 }, and the full shape with vehicles and response groups is on Reinforcements. Take resource strings, braces and all, from the Workbench picker. Naming this key with an empty array leaves every objective undefended, and Clear area objectives stop being placed at all, since there would be nothing to clear.
  • m_sTargetPrefab is empty on the Destroy and Kill entries, which leaves them using whatever the stock composition ships. That is usually wrong on a non-vanilla faction — see the objective templates section above.
  • m_aCivilianPrefabs ships the four vanilla CIV characters above, so towns are inhabited on a stock setup. Replace them if your setting wants different people — they are character prefabs rather than group prefabs, and each civilian’s faction comes from the prefab. See Civilians.
  • m_sZoneConfig is empty, and nothing is placed at all until either it is set or zones have been surveyed in-game. Leave it empty if you are surveying — see Objective placement.

Everything else is a working value you can leave alone.