A player in Yorkshire emailed to say our corporation tax small profits rate was wrong for one financial year in the 1970s. He was right. He had also already fixed it locally, because the rate tables are a text file, and he attached the file rather than a screenshot.
We took the fix, credited him in the notes, and shipped it to everybody the following week. That exchange took two emails. Without published formats it would have taken a month and a support ticket, and most people would not have bothered.
The content is data, and the data is text
Almost nothing in the game is compiled in. The tax tables, the 116 trade definitions, the towns and their economic characteristics, the research trees, the letter templates, the events, the names, the price series, the employment rules by date: all of it lives in structured text files that ship alongside the executable in a readable directory.
They are documented. Each file has a schema, each field has a description and a unit, and the documentation says which version of the game introduced or changed it. We publish that documentation on the site rather than in a forum post, because a forum post rots.
Editing one is editing a file. There is no toolchain to install, no exporter, no proprietary binary format, and no requirement to own a particular piece of software. If you can open a text editor you can change what a plumber's van costs in 1983.
Loading works by overlay. Your files are validated before anything in them is used, against the same rules the game's own catalogues have to satisfy. Ids must be unique within your file and must not clash with one the game already ships. Every reference has to resolve: an industry id, a town id or a region id must already exist. Every range has to be the right way round and inside sane bounds. An entry with a problem is reported with the field that caused it, and nothing from a rejected entry reaches the simulation.
That means today you add rather than replace. A mod contributes new scenarios, new names and new events alongside ours; it cannot overwrite an entry we ship. Industries and towns are compiled tables at the moment rather than data files, so those two are fully validated and reported but not yet loaded. Write them now and they will already be correct on the day those catalogues become data, which is the honest state of it rather than a roadmap promise.
A save is a seed and a list of what you did
The save format is where modding meets the thing we care about most, which is determinism.
A saved career is not a snapshot of every object in memory. It is the seed the world was generated from, the content versions and mod set that were loaded, and the ordered list of decisions the player has taken since the first month. Loading a save means regenerating the world from the seed and replaying the decisions.
This has consequences we like. Saves are small and diff readable. A replay is a file you can send somebody else, and if they have the same content set they get the same career, penny for penny. When a player reports that something went wrong in month 214, we can run their file and watch it go wrong.
It also has a consequence we have to be strict about. Because the world is rebuilt from inputs rather than restored from state, the inputs have to be complete, and that includes the mods. A save records exactly which content was loaded and at which version. Load it without them and the game tells you what is missing instead of guessing and producing a career that is quietly not the one you saved.
Determinism survives modding, because the mod is an input
The obvious worry is that letting people rewrite the rules destroys the reproducibility guarantee the whole engine is built on. It does not, because a mod is data the simulation consumes, not code that runs inside it.
Content files cannot execute. There is no scripting hook in a tax table that can ask the system clock what time it is, read a file, open a socket or take a different branch on a different machine. A modded game is the same deterministic simulation fed different numbers, and it is reproducible in exactly the same way the unmodded one is: same seed, same content set, same decisions, same outcome.
That is also why we have not added a general scripting language for mods, which is the feature people ask for most. The moment arbitrary code runs inside the turn, the guarantee is gone, and the guarantee is the thing that lets us fix bugs from a player's file. We would rather have a narrower modding surface that keeps the property than a wide one that does not.
What a mod cannot reach
A mod can change what the world contains and how much things cost. It cannot change how the engine resolves a month.
The order in which systems run, the way cash is applied against obligations, the rounding rules on money, the way the bank manager's memory accumulates: those are engine behaviour, not content. If they were mod visible, every save would depend on them and no two players would be discussing the same game.
Two other lines. Mods cannot change which business types the free game includes, and they cannot open the full game or a track in a copy that does not have it, because that is a licensing check rather than a content file. And mods that ship a modified copy of the executable are not something we will host or link to.
A modded career is marked as one
Loading any mod marks the save. That flag rides along in the save file, in any replay you export, and in your hall of fame entry, and a modded save cannot earn achievements.
That is not a punishment. A career built on catalogues nobody else has is not comparable with anyone else's, and an achievement that compares nothing is worth nothing. Everything else works exactly as it always did: a modded game saves, loads and replays like any other, and the determinism holds.
Change your copy, do not redistribute ours
The licence position is short. You may modify your own copy of the game as much as you like, including its content files, and you may publish mods you have written. What you may not do is redistribute our content: the base data files, the art, the music, the text or the executable, modified or otherwise.
In practice this means a mod should be a set of your own files that overlay ours, not a repackaged copy of the game with your changes baked in. Ship your files, not ours. That also happens to be better engineering, because a patch survives an update and a fork does not.
If you have written something you want people to have and you are unsure whether it crosses the line, ask us. We would rather answer an email than send a takedown.
Why we care about this
We are a small studio with one game and one engine, and we will never have as many hours in the rules as the people who play them do. A published format turns a player who has spotted an error into somebody who can hand us the fix. It also means that when we eventually stop updating a game, the thing people bought does not become unmaintainable, because everything that makes it work is a file they can read.