|
Ground of Aces Modding
|
Most of the numbers that drive Ground of Aces - what a building costs, how fast a plane flies, how much a meal lifts a crew member's mood - live in data tables. A mod can change any of them without touching the game's code, by dropping a small file into its own folder.
This page is the complete reference: where the files go, what the two file formats look like, what the game checks before it accepts a value, and what every table and column means.
Every table section in The tables starts with a link to the built-in file, so you can open the real thing in the browser or save it and copy its header row.
One mod is one folder in your Mods folder, and the data tables go into its CSV/ subfolder:
Where the Mods folder is, what config.json may contain and how several mods are ordered is explained once, on How mods work. The one rule that matters here: if you give the mod an Id, it must be 3–64 characters of lower-case letters, digits, _, . or -, starting with a letter or digit; anything else is ignored without a message and the lower-cased folder name is used instead.
Only files directly inside CSV/ are read - subfolders are ignored.
Make the wooden wall cost one plank instead of two. Create Mods/my_balance_mod/CSV/ResourceCost.json containing:
Start the game and the wall costs one plank. That is the whole mod - no manifest, no registration.
A file is named after the table it changes, matched exactly, capital letters included: VehicleData.csv, never vehicledata.csv. A file naming a table that does not exist is skipped, and the log says so.
You may use either format, or both. Within one mod the .csv files are applied first and the .json files after, so a command can refine a row a CSV file added.
<Table>.jsonA list of commands, run top to bottom. This is the format to reach for: it touches only the values you name and leaves everything else alone.
| Command | Fields | What it does |
|---|---|---|
Replace | Id, Cells | Changes only the listed cells of an existing row. Everything else keeps its value. |
Add | Id, Cells | Adds a new row. Only possible in ResourceCost and PropsInfluence (see Adding and removing rows). |
Remove with Columns | Id, Columns | Clears the listed cells of a row. |
Remove without Columns | Id | Removes the whole row. Only in ResourceCost and PropsInfluence. |
Rules of the format:
Command and Id ignore capitalisation. The keys inside Cells and the entries in Columns are column headers and must match exactly, including spaces.300, 1.5, true and "300" all work.null in Cells clears that cell, the same as listing it under Columns in a Remove.Remove does not take Cells; list the cells to clear in Columns.Commands, is skipped whole.<Table>.csvA spreadsheet carrying complete rows. Use this when you would rather edit a table in a spreadsheet program and ship the finished rows.
"Sleep,Chill". A line break inside a quoted cell is not supported - it ends the row.# are ignored, so you can leave notes. A line that starts with an empty id cell but has other cells is read as a continuation of the row above, and that row is then refused as spanning several lines.A column that holds numbers in every built-in row takes only numbers; one that holds TRUE/FALSE takes only those. Movement Speed = fast is refused. Columns that hold text are freer, but most of them still have a rule of their own - the tables further down say which values each one accepts.
A cell may only be left empty in a column where the game already leaves some row empty. Everywhere else, blanking a cell is refused, because the game has no "no value" case for it.
Two columns are special and are filled in for you instead of being left blank:
ResourceCost cell you leave out, clear, or set to "" becomes 0. An Add therefore only needs the resources that actually cost something.Associated Task in BuildingComponents becomes None, meaning "this object gives no task".You are normally changing cells of rows that already exist. Whole rows can only be added or removed in two tables, because everywhere else the game and your save files expect a fixed set of ids:
| Table | Rows can be added or removed |
|---|---|
ResourceCost | yes, for any built-in object or aircraft id |
PropsInfluence | yes, for any built-in object or aircraft id |
| every other table | no |
An added row must use an id that already exists as a building object or an aircraft - you are giving an existing thing a build cost or a mood effect it did not have, not inventing a new thing.
A few tables spread one row over several lines, because that row holds a list - a task with several settings, a mood effect with one variant per bed type. A single mod row cannot express a list, so those rows are refused. The table sections below name them.
In ResourceCost only, some rows carry a leftover heading in their Money cell and so count as several lines. There a whole-row CSV is the fix: it rewrites every cell and tidies the row up at the same time. The affected ids are KickstarterCustomMonument, RadioTower, window_wood, window_tent, window_brick, window_hangar, window_concrete, Distillery, ParkingLarge and gravel.
Every accepted change and every refusal is one line in the game's log, Player.log, which lives in USERPROFILE%\AppData\LocalLow\Blindflug Studios\Ground Of Aces\ on Windows - the same folder that holds Mods (there is an HTML version in the same folder that is easier to read). The label at the start of each line is the mod's id.
A refusal names the file, the row or command number, and the reason:
A misspelled table name or a header row that does not match still produces a skipped: line naming the file. If you see no [Mod …] lines at all, the game did not pick the mod up: the CSV/ folder was still empty when the game started (press Refresh in the Mods window), the mod is switched off in the Mods window, or the mod folder is a symbolic link or junction, which is never followed.
The game ships header templates for four tables in Ground Of Aces_Data/StreamingAssets/Modding/Templates/. For the rest, the column list is in this page - or ask the game: write a deliberately wrong header, load once, and the log prints the columns it expected.
Mods are applied in the order described on How mods work - Workshop first, then local ones, lower LoadOrder first. When two mods change the same row, the later one wins for the cells it touches: a whole-row CSV replaces everything an earlier mod did to that row, a Replace only the cells it names. A mod switched off in the Mods window contributes nothing.
CSV tables are rebuilt every time a level is loaded - return to the main menu and load again. The same happens when the main menu or the map editor opens. Edit a file while a level is running and the change appears on the next load, so you can iterate on values without restarting. A file you keep open in a spreadsheet program is still read.
A brand-new mod folder, a CSV/ folder that was still empty when the game started, or a changed config.json needs the game to look at the mod list again: press Refresh in the Mods window (main menu → Mods) and then load a level, or restart the game. (Developers: reload_mods in the cheat console of a development build does the same.)
Thirty tables can be modded. Three files that exist in the game but are not loaded - ResourceDegradation, StartTimeValues and StateInfluence - cannot.
Each section lists the columns, what values they take, and what the built-in rows use. Where a column has no special rule, only the generic ones above apply.
VehicleData - aircraftBuilt-in file: VehicleData.csv
One row per aircraft. Rows cannot be added or removed.
| Column | Value | Built-in range | Notes |
|---|---|---|---|
Name | localization key | airplane/spitfire | must not be empty |
Type | Fighter, Bomber, MultiRole, Special | ||
Crew | comma list of seats; repeat a role for two seats | Pilot, "Pilot,Gunner,Navigator" | roles: Pilot, Gunner, Navigator, BombAimer, FlightEngineer, RadioOperator |
Runway Tier | whole number | 1–5 | above 5 and no airstrip can serve it |
Parking Size | whole number | 0–2 | above 2 and it can never park |
Victory Points Cost | whole number | 0–12 | 0 makes it free |
Movement Speed | whole number | 5 | taxi speed; 0 and it never reaches the runway |
Landing Length | whole number | 60–170 | longer than any buildable strip and it can never land |
Health | whole number | 100 | |
Initial Integrity | whole number | 1000 | hours of wear the aircraft can take before it is worn out (1000 h ≈ 41 days) |
Fuel Capacity | whole number | 200–1260 | |
Voxel Size | AxBxC | 10x0x10 | |
Fight Power | min-max | 0-0 … 43-60 | 0 ≤ min ≤ max, and max at most twice the highest built-in value |
Bomb Power | min-max | 0-0 … 50-80 | same |
Recon Power | min-max | 5-10 … 42-60 | same |
Manoeuvrability | min-max | 2-10 … 28-50 | same |
Transport Capacity | min-max | 1-5 … 60-90 | same |
Stealthiness | min-max | 10-48 … 88-98 | same |
Wreck Resource Type | /-list of resources | Metal/RepairParts | both wreck columns set, or both empty |
Wreck Resource Amount | /-list of whole numbers | 10/5 | same length as the type list |
Low Caliber Ammo Capacity | whole number | 0–3300 | GunAmmo carried; 0 = none |
High Caliber Ammo Capacity | whole number | 0–300 | AntiAirAmmo; 0 = none |
Plane Bombs Capacity | whole number | 0–32 | PlaneBombs; 0 = none |
AirBaseData - the HQ rank ladderBuilt-in file: AirBaseData.csv
Rows 1–6, one per base category. All six must exist and their ids cannot change.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Airstrip Tier | whole number | 1,2,3,4,5,5 | required to reach the rank |
Minimum Airstrip Count | whole number | 1–5 | |
Minimum Parking Count | whole number | 1–20 | |
Missions Per Week | whole number | 6–18 | slots the week offers; 0 and no missions are scheduled |
Minimum Missions Per Week | whole number | 2–10 | above Missions Per Week makes the quota impossible |
Minimum Success Rate | fraction, not percent | 0.4–0.8 | above 1 is unachievable |
Available Shipment Slots | whole number | 4–8 | 0 disables supply |
AirstripTiersBuilt-in file: AirstripTiers.csv
Rows 1–5.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Length | whole number | 80,120,140,160,200 | tiers match on "length or more", so keep them ascending |
Width | whole number | 12,14,18,22,26 | same |
Material | text | dirt, sand, gravel, concrete, tarmac | must not repeat another tier's material; it also names the ResourceCost row that prices the surface |
Biome Id | whole number | 6,20,22,15,13 | ground painted under the finished strip |
Build Time | whole number | 5,2,2,2,2 | in-game minutes of work per tile for one crew member; two workers halve it |
BiomesBuilt-in file: Biomes.csv
Rows 0–23, the ground types. All columns are numbers, so this table is easy to tune safely.
| Column | Built-in | Notes |
|---|---|---|
Airstrip Tier | 0–5 | tier a runway laid on this ground counts as |
Character Speed Modifier | 1 … 1.2 | 0 freezes anyone standing on it |
Airplane Speed Modifier | 0.5 … 1.2 | |
Degradation Penalty | 0 … 0.2 | extra wear on goods stored here |
Fire Spread Modifier | 0.5 or 1 |
ScrambleData - enemy aircraft in a scrambleBuilt-in file: ScrambleData.csv
Rows Fighter, Diver, Bomber. The names cannot change. All columns are whole numbers.
| Column | Built-in |
|---|---|
PlaneHealth | 18, 26, 34 |
PlanePower | 23, 17, 14 |
PlaneWinDealDamageMin / Max | 15–120 - damage to your aircraft when the enemy wins |
PlaneLooseDealDamageMin / Max | 5–25 - damage when the enemy loses |
AttacksComposition - what an air raid is made ofBuilt-in file: AttacksComposition.csv
The row id is the raid severity. Normal play reaches 1–25; rows 99, 101, 200 and 300 are not reached by the normal severity ladder and are kept for special raids. The ranges below describe rows 1–25; the four special rows go beyond them (9-9 bombers, 10-10 divers, 0-0 fighters) and point at themselves in the last two columns.
| Column | Value | Built-in (rows 1–25) | Notes |
|---|---|---|---|
Bombers | min-max | 0-0 … 4-6 | whole numbers, 0 ≤ min ≤ max |
Divers | min-max | 0-0 … 6-6 | same |
Fighters | min-max | 1-2 … 8-8 | same |
LowAttacks | whole number | 1–14 | severity used instead when the map is set to easier raids - must name a row this table has |
HighAttacks | whole number | 2–25 | severity used when the map is set to harder raids - same |
EquipmentData - AA guns, searchlights, towersBuilt-in file: EquipmentData.csv
Rows are equipment ids: Bofors40mm, Searchlight, RadioTower, VickersGunAA, OerlikonGun, Lookout, ControlTowerMetal, ControlTowerBrick, ControlTowerConcrete.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Range | number | 10–70 | 0 makes the piece useless |
Damage | number | 0–6 | 0 switches the whole weapon off - fire rate, ammo and aiming are then ignored |
Fire Rate | whole number | 0–720 | rounds per minute |
Ammo Type | resource name or None | GunAmmo, AntiAirAmmo, None, 0 | anything that is not a resource name (None, 0) means the piece stores no ammo |
Ammo Capacity | whole number | 0–80 | rounds loaded at once |
Ammo Load Time | number | 0–6.5 | seconds to reload |
Ammo Storage | whole number | 0–500 | 0 means it never draws ammo |
Damage Bonus | number | 0 or 0.25 | granted to others in range (searchlight) |
Firing Angle | number | 0, 140, 360 | 0 is read as a full circle |
Aiming Speed | number | 0–170 | degrees per second |
Range Bonus | number | 0 or 16 | granted to others in range (lookout) |
Attacker Priority | Bombers, Divers, Fighters, Nearest, None | anything else falls back to None |
BuildingComponents - objects and building partsBuilt-in file: BuildingComponents.csv
One row per object, wall piece, floor, roof, workbench and piece of equipment. Rows cannot be added or removed.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Dimensions | WxHxD, or dynamic/1x0x1 for roofs | 1x3x1, 1x0x1, 2x2x2 | |
Build Time | whole number | 0–420 | in-game minutes of work for one crew member; two workers halve it |
Health | whole number | 0–10000 | the huge value marks the indestructible pieces |
Associated Task | task name or None | Sleep, Chill, UseEquipment, PlayPiano, UseTrainingObject, MonitorAirspace, UseRadio, SaluteTheFlag, Grieve, ListenToMusic, PlayDartboard, PlayGuitar, PlayBilliardTable, UsePlanningBoard | pointing an object at a task its art does not fit is allowed, and looks wrong |
Users Limit | whole number | 0–5 | 0 on a usable object means nobody can use it |
Is Wall Deco | TRUE/FALSE | ||
Is Floor Deco | TRUE/FALSE | ||
Is Fireproof | TRUE/FALSE | ||
Placement Requirement | None, Indoors, Outdoors |
Replace is checked against the finished row, so a row that leaves Dimensions or Users Limit empty cannot be patched unless you also set that cell in the same command - or ship the row as CSV. Empty Dimensions: PropagandaPoster, MusicPoster, AirplanePoster, CompanyMascotPoster, CurtainsClosed, CurtainsOpen, EntranceSign, tombstone, storage_box. Empty Users Limit: the workbenches and the three parking sizes.ResourceCost - what something costs to buildBuilt-in file: ResourceCost.csv
One row per object or aircraft id, one column per resource. Rows can be added and removed. A removed row means "no build cost". A cost of 0 means "not required", so zeroing every column has the same effect. An added row's id must be an existing BuildingComponents or VehicleData id; anything else is refused as "neither a built-in prop nor a built-in plane".
Every cell is a whole number, zero or more. The columns are:
Runway surfaces are rows here too - dirt, sand, gravel, concrete, tarmac - so changing gravel changes what a tier-3 runway costs per tile.
PropsInfluence - the mood effect an object radiatesBuilt-in file: PropsInfluence.csv
One row per object that lifts or lowers the mood of crew nearby. Rows can be added and removed; an object without a row simply has no effect.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Buff Name | localization key | prop_effects/organised_sleep | must not be empty |
Radius | number | 0.5–50 | in tiles; the control towers reach 20, 30 and 50 |
Associated Tasks Or Action | comma list of task names | Sleep, "Sleep,Chill", UseEquipment | must not be empty. A name that matches no task is accepted and the effect simply never fires |
Effect 1 | <signed number> <name> | +0.5 Mood … +10 Mood, -1 Mood, -1.5 Energy, +2 Energy, +1 Confidence | names: Mood, Confidence, Energy; the built-in rows go from -1.5 to +10 |
Effect 2 | same, or empty | ||
Effect 3 | same, or empty | no built-in row uses it |
The sign is part of the number, so 1 Mood means +1. Names are matched loosely, so +1 mood works. A name other than the three above is stored as a special effect (the game uses -1 Accident on the three control towers); an invented name is accepted and does nothing.
MapObjects - trees, rocks, ponds and other harvestablesBuilt-in file: MapObjects.csv
One row per world object. Ids are used by map files and cannot change.
| Column | Value | Built-in | Notes |
|---|---|---|---|
LocKey_Name | localization key | map.obj.tree.name | |
LocKey_Description | localization key | ||
Dimensions | WxHxD | 1x4x1, 2x2x2, 3x1x3 | |
Resource Harvested | resource name, or empty | Wood, Stone, Herbs, Food, RawWater, Clay, Sandbags, Metal, Planks, Fuel, seeds | empty means nothing to harvest |
Farming Time | whole number | 0–400 | in-game minutes of work per harvest for one crew member; two workers halve it |
Resource Amount | whole number | 0–50 | yield per harvest |
Resource Total | whole number | 0–500 | total before it is used up |
Limited Harvest Amount | whole number | 0, 20, 30, 100 | cap for endless sources; 0 = uncapped |
Destroyed On Depletion | TRUE/FALSE | FALSE with Refresh Time 0 leaves something that can never be harvested again | |
Refresh Time | whole number | 0–21600 | minutes until it regrows |
Health | whole number | 1–2147483647 | the huge value marks the indestructible ones |
Is Fireproof | TRUE/FALSE | making trees fireproof removes fire spread from the map |
GrowingData - saplings becoming treesBuilt-in file: GrowingData.csv
Two rows, young_tree and young_tree_big.
| Column | Value | Built-in |
|---|---|---|
To | a MapObjects id | tree, tree_big |
Min Hours | whole number | 672 |
Max Hours | whole number | 840 |
A sapling that is already on the map when a save is loaded draws its remaining time between half of Min Hours and Max Hours; only newly planted ones use the full minimum.
GardeningData - the four cropsBuilt-in file: GardeningData.csv
Rows grain, beans, potato, tomato.
| Column | Built-in | Notes |
|---|---|---|
Growth | 3, 6, 15, 10 | watered days until harvest - the plant gains one at midnight for every day its tile was watered; 0 is harvestable instantly |
Food | 3, 4, 20, 7 | food per harvest |
Seeds | 2, 5, 3, 1 | seeds per harvest; 0 makes the crop unsustainable |
Regrowth | only tomato is TRUE | regrows instead of being consumed |
ResourceData - what a resource isBuilt-in file: ResourceData.csv
One row per resource, named exactly as the game names it.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Initial Integrity | whole number | 0–50000 | hours before a pile spoils; 0 rots instantly |
Carry Limit | whole number | 0–250 | how much one person carries; 0 means it can never be moved |
Stack Limit | whole number | 0–2000 | pile cap outdoors |
Double Stack Limit | whole number | 0–3000 | pile cap in proper storage; below Stack Limit shrinks storage |
Resource Tier | Meta, Basic, Advanced, Military, Trash | ||
Category | Food, Seeds, or empty | removing Food from everything edible means the crew can never eat | |
Always Degrades | TRUE/FALSE | spoils even under a roof | |
Explosiveness | whole number | 0, 2, 3 | 0 is inert |
Flammable | TRUE/FALSE | ||
VariantAmountMapping | /-list of whole numbers | 1/2, 1 | picks the pile's look |
WorkbenchProjectData - crafting recipesBuilt-in file: WorkbenchProjectData.csv
The row id is <Workbench>.<Output>. Rows cannot be added, so this changes existing recipes rather than introducing new ones.
| Column | Value | Built-in | Notes |
|---|---|---|---|
Workbench Type | workbench name | FieldKitchen, IndoorKitchen, SawStation, Brickstation, CementMixer, MetalworksWorkbench, CanningStation, ElectronicsWorkbench, TailorStation, EspionageRadio, WaterCooker, HerbDryer, Distillery | |
Output Resource Type | resource name | ||
Output Resource Amount | whole number | 1–200 | |
Input Resource Type | /-list of resources, or None | Food/RawWater, Metal, None | None means made from nothing |
Input Resource Amount | /-list of whole numbers | 2/2, 0 | must have as many entries as the type list |
Time To Craft | whole number | 10–180 | in-game minutes of work for one crew member; two workers halve it |
Valid Entry | TRUE/FALSE | TRUE | left over; the game does not read it |
ShipmentData - the supply catalogueBuilt-in file: ShipmentData.csv
One row per orderable item.
| Column | Value | Notes |
|---|---|---|
Shipment Type | Resource or Prop | |
Category | Military, Miscellaneous or Large | capitalisation matters - military is refused |
Amount | whole number, 1–5000 | units delivered per slot |
Slots | whole number, 1–4 | more slots than any rank offers makes the item unorderable |
CharactersInitialStats - starting skills per jobBuilt-in file: CharactersInitialStats.csv
Rows are job and crew role names: Pilot, Gunner, BombAimer, FlightEngineer, Navigator, RadioOperator, RAFAirCrew, AAFCook, FieldMechanic, FieldEngineer, RAFMedic, AAFLabour, None, Custom.
Columns are the six skills - Flying, Shooting, Bombing, Endurance, Engineering, Navigating - and the value is a rank, 0 to 6, not a point total. 0 is Untrained and 6 is Ace. Keep it inside that range. Endurance also sets maximum health, which is why every row has at least 1 there.
CharactersStatsRankProgression - points per rankBuilt-in file: CharactersStatsRankProgression.csv
Rows must stay Untrained, Rank1 … Rank5, Ace. LevelUpPoints (0, 10, 14, 22, 36, 58, 90) is the points total at which that rank is reached, and the rank is picked as the highest one a character has passed
CharacterStatsCheck - what a rank is worthBuilt-in file: CharacterStatsCheck.csv
Rows are the same seven ranks. For each of the six skills there are two columns: <Skill>Value is a flat bonus added to a mission roll, <Skill>Percentage is a fraction - 0.25 means 25%. Writing 25 gives a 2500% bonus. Column names cannot be renamed.
CharacterJobPriority - what each job is willing to doBuilt-in file: CharacterJobPriority.csv
Rows are the job names: None, Custom, AAFCook, FieldMechanic, FieldEngineer, RAFMedic, AAFLabour, RAFAircrew.
There is one column per kind of work - Building, Gardening, CraftingAndRepairs, Labor, Cooking, Medicine, PlaneWork, Harvest, BaseSafety, Leisure, UseRecreationalItem, Socialize, ConsumeLuxuryGood, Train, Sleep, PilotPlane, FunctionalGroup, Emergency - holding a priority: 0 means the job never does this kind of work, 1 is the highest priority and 3 the lowest. (A medic has Building 0 and Medicine 1.) No column may be dropped or renamed.
These numbers also identify a job: a crew member whose priorities match a row exactly is that job, and one matching none is Custom. Give two jobs identical priorities and the game can no longer tell them apart.
CharactersData - names, nicknames and ranksBuilt-in file: CharactersData.csv
Six of the eight rows are long lists - first names, surnames, nicknames, base crew ranks, pilot ranks - and cannot be changed.
The two you can change are the pilot ranks themselves, where Goal is how many successful missions earn the promotion:
| Row | Value | Goal |
|---|---|---|
OfficerCadet | 2 | 3 |
PilotOfficer | 3 | 10 |
MoraleValuesBuilt-in file: MoraleValues.csv
Name and value, all numbers: BaseMoraleBufferDays, MoraleLevelMin (-100), MoraleLevelMax (100), LeisureThreshold, MoraleTrendTreshold, MoraleBreakingThreshold, MoraleEffectPositiveThreshold, MoraleEffectNegativeThreshold, AirBaseMoraleGameOverThreshold.
Setting AirBaseMoraleGameOverThreshold above MoraleLevelMax loses the run immediately; putting MoraleLevelMin above MoraleLevelMax leaves every limit inverted.
MoraleInfluenceValues - what changes a crew member's moodBuilt-in file: MoraleInfluenceValues.csv
| Column | Value | Built-in | Notes |
|---|---|---|---|
Itentifier | row id (note the spelling) | Sleep, Chill, Panic, BaseAttacked | |
IdentifierType | Task, TaskGroup, TaskCategory, WarPhase, GameEvent, - | a type that does not suit the id means the row is ignored | |
Parameter | the variant key; comma-separates aliases | default, Prop.Bed, ResourceType.Meals | no alias may be listed twice |
Raw Parameter | a note | not read by the game | |
Confidence / Mood / Energy | numbers | -30 … 50 | |
Influence Type | Timed or OnEventTrigger |
Timed values apply every tick and are therefore much smaller than OnEventTrigger ones. Copying a +20 event value into a Timed row pins a crew member's mood to the ceiling within a minute.
Six rows hold one variant per line and cannot be changed at all: Sleep, Eat, WorkOnWorkbench, UseRecreationalItem, MissionCompleted, Death.
FlightMissionData - the mission modifiersBuilt-in file: FlightMissionData.csv
The row id names what is being measured: AirplaneIntegrity, AirplaneHealth, AirplaneFuel, Mood, Energy, Confidence, SeatsConfiguration, CrewHealth, CrewOnFire.
| Column | Value | Built-in | Notes |
|---|---|---|---|
ModifierCategory | a label | low, high, zero, critical, mismatch | |
ModifierType | SkillRollModifier or NoFlightModifier | ||
ModifierRange | min/max whole numbers | 0/-5, 2/0 | bonus applied to the roll |
Parameter | space-separated crew roles, or Default | Default, CrewRole.Pilot | every role must carry the CrewRole. prefix - a bare Pilot never matches, and neither does an unknown role |
ThresholdRange | min/max whole numbers | 1/40, -100/-90, 50/100 | the range of measured values this row covers |
NoFlightModifier is the hard block that grounds an aircraft - out of fuel, or a crew member at rock-bottom mood. Widening its ThresholdRange grounds your whole squadron; setting it to something unreachable such as -1000/-999 effectively switches it off.
Rows spanning several lines and therefore unchangeable: AirplaneIntegrity, AirplaneHealth, Mood, Energy, Confidence.
TaskValues - durations and thresholds per taskBuilt-in file: TaskValues.csv
Three columns: the task id, a Variable Name and a Value.
Variable Name is the key the game looks the setting up by, so only Value can be changed. The names in use are Duration (minutes), Distance, Chance, ExperienceGain, HealthAmount, IntegrityAmount, IntegrityPenalty, ScheduleThreshold, ScheduleThresholdPercentage, ResourceToFuelRatio, Targets, Initiation and Active.
Tasks with several settings take up several lines and cannot be changed. These are: Chat, Chill, Panic, AirAttackPanic, CelebrateSuccessfulMission, BreakThings, RepairAirplane, MaintainAirplane, Refuel, RepairEquipment, RefillAirplaneAmmo, UseTrainingObject, the six …Simple… and six …Advanced… training tasks, and BeOnFire. Everything else - UseRadio, Eat, Salute, Bury, Recover, MonitorAirspace and the rest - has a single setting, almost always Duration (RefillEquipmentAmmo has only ScheduleThresholdPercentage), and can be changed normally.
Value also accepts text (one built-in row names a chair), so a non-number in a numeric setting is accepted and then fails when the task runs. This is the one place in this table where you can still write nonsense.
DaySchedule - the phases of a dayBuilt-in file: DaySchedule.csv
Four rows, 0–3.
| Column | Value | Built-in | |—|—|—| | Phase | Work, Leisure, Sleep | | (Alert and None are also accepted but are not meant for the schedule) | | StartHour | whole number, inclusive | 0, 5, 7, 22 | | EndHour | whole number, exclusive | 5, 7, 22, 24 |
The four spans are expanded hour by hour, so gaps and overlaps both matter: an hour no row covers has no phase at all and the crew idle through it. Keep the spans continuous from 0 to 24.
DayNightSystemData - sun and shadowsBuilt-in file: DayNightSystemData.csv
Name and value, all numbers, purely visual.
| Row | Meaning | Built-in |
|---|---|---|
Morning Time, Dawn Time, Day Time, Evening Time, Dusk Time, Night Time | hour each lighting stage begins | 4, 7, 10, 17, 22, 23 |
Sun Min Rotation / Sun Max Rotation | sun elevation sweep, degrees | 15 / 165 |
Sun Yaw Offset | compass rotation | -90 |
Sun Tilt | degrees | 10 |
Shadow Day Intens / Shadow Night Intens | shadow strength | 0.85 / 0 |
Keep the six time rows ascending and within 0–23, or the lighting stages flip back and forth.
GameGoalAlerts - when the game warns the playerBuilt-in file: GameGoalAlerts.csv
Name and value, all numbers, alerts only: LowMoraleThreshold (-50), CriticalMoraleThreshold (-65), LowFoodThreshold (20), FewLeisureItemsThreshold (5), MissionTimerMinutesThreshold (150), LowWaterThreshold (20).
Variables - the global number bagBuilt-in file: Variables.csv
Name and value, 86 entries, each read by whichever part of the game needs it.
This column accepts anything, because a few entries hold text or a min-max range rather than a number. Write abc where a number belongs and it is accepted, then read as 0 - the feature quietly stops working and the log carries an error. This is the table to be most careful with.
Entries worth knowing before you change them:
TimeTickInterval (0.6666) - real seconds per in-game minute. Halving it doubles the speed of the entire game, including every timer balanced against it.AirplanesLimit (24) - how many aircraft a base may own.CharacterBaseHealth (7) - plus the Endurance rank, this is a crew member's maximum health. Below CharacterHeavyInjuryThreshold (3) everyone starts badly injured.MaxVictoryPoints (12) - the aircraft-ordering budget.ScrambleFuelNeeded (80) - flat fuel per scramble, whatever the aircraft.AttackHourMin / AttackHourMax (12/23) - pulled back into 1–23 if you go outside it.DiverBombFiresCount, BomberBombFiresCount, CharredTerrainRevertTimeDays - these three are min-max ranges, not single numbers.Eight entries are left over and nothing reads them, so changing them does nothing at all: AttackedCharacterId, BikeMovementSpeedMultiplier, LichfieldIntroCrewMembersCount, AirplaneIntegrityModifierTreshold, AirplaneHealthModifierTreshold, AirAttackFighterHealth, AirAttackDiverHealth, AirAttackBomberHealth.
FeedbackVariablesBuilt-in file: FeedbackVariables.csv
The in-game feedback form: API Endpoint, Feedback Character Limit, Screenshot Height, Survey Link, Survey Link Demo, Survey Opened Player Prefs. There is no reason for a gameplay mod to touch this, and pointing API Endpoint elsewhere sends players' feedback to that address.
Mods/my_balance_mod/CSV/ResourceCost.json - give the storage box a build cost, make wooden walls cheaper, and drop the chair's tarp cost:
Mods/my_balance_mod/CSV/Variables.json - speed up turbo mode and make crew chatter more common. Value in this table takes any text, so a typo such as 0,6 is accepted silently and then read as 0 - check the number twice:
The same two changes as Mods/my_balance_mod/CSV/Variables.csv: