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:
- Find
Configs/InitialSettings.confin the Resource Browser. - Right-click it → Override. Choose your own addon when asked where the override should live.
- 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
trueandfalse— a1is 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.
| Setting | Default | Meaning |
|---|---|---|
m_bScoreEnabled | true | Master switch. Off means objectives still run but pay nothing. |
m_sScoredFactionKey | US | Faction that earns and spends. Set to your own faction’s key. |
m_fStartingScore | 0 | Balance on a brand new server. |
m_fScoreFloor | 0 | Balance can never fall below this. Set below zero to allow a deficit. |
m_fScoreCeiling | 0 | Upper 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.
| Setting | Default | Meaning |
|---|---|---|
m_fUpkeepPerHour | 0 | Flat drain regardless of player count. 0 disables. |
m_fUpkeepPerPlayerPerHour | 0 | Additional drain per connected player — wages. |
m_iUpkeepIntervalSec | 300 | How 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.
| Setting | Default | Meaning |
|---|---|---|
m_bTiersEnabled | true | Report a tier as the balance crosses the ladder. |
m_bTiersCanFall | true | Off 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.
| Setting | Default | Meaning |
|---|---|---|
m_bDirectorEnabled | true | Generate objectives continuously. |
m_iMaxConcurrentObjectives | 3 | How many are live at once. |
m_iStartupDelaySec | 60 | Wait after world load before the first objective. |
m_iReplacementDelaySec | 120 | Wait after one resolves before replacing it. |
m_iObjectiveLingerSec | 600 | How long a finished objective’s contents stay in the world, and how long its survivors keep hunting. |
m_iObjectiveSpawnStaggerSec | 15 | Gap between objectives while the map is short of more than one. |
m_iPlacementRetryDelaySec | 60 | Retry 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_bTaskNamesIncludeZone | true | Name the zone in a task title, so the list reads “Destroy vehicle in Landay” rather than “Destroy vehicle”. |
m_sTaskZoneFormat | %1 in %2 | How 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.
| Setting | Default | Meaning |
|---|---|---|
m_aGarrisonProfiles | (empty) | Forces that can defend. With none listed, objectives spawn undefended. |
m_iGarrisonStrengthMax | 40 | Hard ceiling on men per objective, whatever the ladder and player scaling ask for. |
m_fGarrisonSpreadM | 80 | How 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
| Field | Meaning |
|---|---|
m_sName | Name for logs. |
m_iMinTier / m_iMaxTier | Tier range this profile is valid for. -1 for no upper limit. |
m_fWeight | Relative likelihood among profiles valid at the current tier. |
m_aGroupPrefabs | AI group prefabs; one is drawn at random per group spawned. Sizes may differ freely. |
m_aTiers | The tier ladder — how strong and how well trained this force is at each tier. See below. |
m_fPerceptionFactor | How quickly they notice you. Above 1 is sharper. Set per profile, not per tier. |
m_bCanCallResponse | Whether this force can call for help once it is in contact. |
m_aResponseGroups | Who comes when it calls. Empty draws from the group list above. |
m_aVehicles | What it drives — for bringing help in, and for chasing a distant shooter. |
m_iHuntReserve | Fewest men that may ever be left holding the objective. |
m_fHuntReserveFraction | Share of the garrison that must stay behind. The larger of this and the floor wins. |
m_bHunkerWhileHunting | Whether the men left behind hold their fire until something threatens them. |
m_sArmourResponseGroup | Group sent after a straggler in a vehicle during the operation wind-down’s hunt. |
m_sMortarEmplacement | Emplacement 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.
| Field | Meaning |
|---|---|
m_iTier | Tier this band takes effect at. |
m_iStrength | Men fielded at this tier, before player scaling. |
m_fMenPerPlayer | Extra men per connected player at this tier. |
m_eAISkill | How 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:
| Type | Produces |
|---|---|
ATG_Scenario_KillObjective | Kill a specific person |
ATG_Scenario_DestroyObjective | Destroy a specific vehicle or object |
ATG_Scenario_ClearAreaObjective | Clear the objective’s garrison off the ground |
ATG_Scenario_DeliverObjective | Recover intel from the objective and bring it back |
ATG_Scenario_DefendOrDenyObjective | Destroy the asset, or clear the position and hold it for more score |
ATG_Scenario_CustomObjective | Nothing 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:
| Field | Meaning |
|---|---|
m_sName | Name for logs. |
m_iMinTier / m_iMaxTier | Tier range this objective is valid for. -1 for no upper limit. |
m_sTargetPrefab | What the target slot spawns — the HVT, the vehicle. Ignored by objectives that have no target, such as Clear area. |
m_fWeight | Relative likelihood among objectives valid at the current tier. 0 retires it. |
m_fReward / m_fFailurePenalty | Score paid on completion, deducted on failure. |
m_sTaskTitle / m_sTaskDescription | Used 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.
| Field | Default | Meaning |
|---|---|---|
m_fReward | 50 | Score paid for denying — the shared setting, used as the deny payout. |
m_fHoldReward | 150 | Score paid for defending instead. |
m_iHoldSec | 300 | How long the position has to be held. |
m_fHoldRadiusM | 100 | How close a player must be for the hold to count. Much tighter than the contribution radius. |
m_fHoldDecayRate | 0.5 | How 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.
| Setting | Default | Meaning |
|---|---|---|
m_sZoneConfig | (empty) | Zone and exclusion lists shipped in a mod. Ignored when a surveyed zones file exists. |
m_sBaseExclusionName | MOB | Which exclusion counts as home, for the range limits. |
m_fObjectiveMinSeparationM | 800 | Minimum gap between live objectives. |
m_fObjectiveMinDistanceFromBaseM | 600 | Nothing closer than this to home. |
m_fObjectiveMaxDistanceFromBaseM | 6000 | Nothing further than this. 0 removes the limit. |
m_fObjectiveMinDistanceFromPlayersM | 400 | Never place near a connected player. |
m_fPlacementClearRadiusM | 2 | Radius of clear ground an objective needs. |
m_fPlacementVehicleClearRadiusM | 6 | The same, for an objective whose target is a vehicle and so needs room for one. |
m_fPlacementClearHeightM | 4 | Height of clear space it needs. |
m_fOverheadClearanceM | 5 | Required open sky. Rejects sealed building interiors. |
m_fMaxGroundVariationM | 3 | How 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.
| Setting | Default | Meaning |
|---|---|---|
m_bProtectionEnabled | true | Master switch. Off leaves any placed areas inert. |
m_iRepairDelaySec | 600 | How long after something is destroyed before it is rebuilt. |
m_fRepairClearanceM | 6 | Never rebuild while a player is this close to the spot. It retries. |
m_iRepairSweepSec | 30 | How often the rebuild queue is checked. |
Charges and enforcement
| Setting | Default | Meaning |
|---|---|---|
m_fCollisionPenalty | 5 | Charged when a player drives through something in a protected area. |
m_fDestructionPenalty | 40 | Charged when they destroy it any other way — explosives, gunfire. |
m_iIncidentWindowSec | 60 | How long one player’s destruction counts as a single incident. |
m_fIncidentMaxPenalty | 150 | The most one incident can cost. 0 means uncapped. |
m_iWarnObjectCount | 4 | Objects destroyed in one incident before that player is warned. |
m_iKickObjectCount | 12 | Objects in one incident before they are removed, having been warned. |
m_iWarningsBeforeKick | 1 | Warnings allowed before the next offence removes them instead. |
m_iKickTimeoutSec | 600 | How long a removed player is barred from reconnecting. -1 is permanent. |
m_bExemptStaff | true | Admins 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.
| Setting | Default | Meaning |
|---|---|---|
m_fCivilianPenalty | 50 | Charged for the first civilian a player kills. |
m_fCivilianPenaltyStep | 10 | Added for each further civilian the same player kills inside the window. |
m_fCivilianPenaltyMax | 100 | The most one civilian death can cost, however far the ramp has climbed. |
m_iCivilianPenaltyWindowSec | 600 | How 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
| Setting | Default | Meaning |
|---|---|---|
m_bAnnounceScoreChanges | true | Tell everyone when the score moves, naming who caused it. |
m_fAnnounceMinDelta | 1 | Ignore movements smaller than this. |
m_iAnnounceMaxNames | 3 | How many contributors are named before the rest become “and N others”. |
m_bResponseAnnounce | true | Warn 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.
| Setting | Default | Meaning |
|---|---|---|
m_fContributionRadiusM | 800 | How close a player must be to an objective to be credited. |
m_iContributionGraceSec | 180 | How long credit lasts after they were last near it. |
m_iContributionPollSec | 10 | How 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
| Setting | Default | Meaning |
|---|---|---|
m_bGameMasterCombatReminder | true | Remind staff they are logged in while combat ops is running. |
m_iGameMasterReminderDelaySec | 45 | How 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.
| Setting | Default | Meaning |
|---|---|---|
m_bExfilEnabled | true | Master switch. Off, the operation still starts at the scheduled moment — nobody is penalised. |
m_iExfilDirectorStopLeadSec | 1800 | Stop placing new objectives this long before the start. |
m_iExfilTaskLeadSec | 900 | Cancel untouched objectives and issue the Exfil task this long before the start. |
m_iExfilHuntLeadSec | 600 | Tear down what is left, lock forward spawns and begin the hunt this long before the start. |
m_fExfilRadiusM | 0 | Where “back inside” is measured from base. 0 uses the base exclusion zone, which is the sensible default. |
m_fExfilFailurePenalty | 150 | Score charged once — however many players were missing — if anyone is still outside at zero. |
m_iExfilPollSec | 10 | Granularity of the whole wind-down: the progress bar, re-tasking and the stand-down. |
m_bExfilCancelIdleObjectives | true | Whether untouched objectives are cancelled at the task mark. |
m_iExfilIdleGraceSec | 300 | How long an objective must have had nobody near it to count as untouched. |
m_bExfilLockSpawns | true | Lock forward spawn points for the hunt, so a player killed outside comes back at base. |
m_eExfilHuntSkill | CYLON | How competent the hunters are. The top of the scale is the point — this is a deadline, not a fight. |
m_fExfilHuntFireRate | 2 | How fast hunters fire, as the engine’s coefficient (0.05–2). 1 leaves the engine’s own rate untouched. |
m_iExfilGasLeadSec | 10 | Gas takes effect on anyone still outside this long before the start. 0 disables the gas entirely. |
m_fExfilGasDPS | 3 | Damage per second the gas starts at. Exposure compounds, so a small number goes a long way. |
m_fExfilHuntGarrisonRangeM | 1000 | Garrisons within this of a straggler join the hunt. |
m_iExfilRampSec | 120 | The hunt’s manpower ceiling ramps up by one objective’s worth this often. 0 opens at the full ceiling. |
m_iExfilHuntStrengthMax | 0 | Hard 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
| Setting | Default | Meaning |
|---|---|---|
m_bPersistScore | true | Write the balance to $profile:ATG/atg-scenario-state.json. |
m_iPersistIntervalSec | 300 | How 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_aGarrisonProfilesis 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_sTargetPrefabis 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_aCivilianPrefabsships 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_sZoneConfigis 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.