Modding Guide
This is the web copy of the modding guide that ships with the game (Modding/README.md in the install folder, next to the example mods). The web copy tracks the latest build.
Mods change the game's data, text and art. They come from two places:
- Steam Workshop subscriptions. Steam downloads them before the game starts.
- Your Mods folder,
%LOCALAPPDATA%\FDsIndustryTycoon\Mods\, one folder per mod. This is where you make and test your own mods. The Mods Folder button in the game opens it.
If the same mod id is in both places, the copy in your Mods folder wins.
Managing mods
Open Mods on the main menu. Every mod the game found is listed: tick a mod to turn it on, untick it to turn it off. New subscriptions start turned on. Changes apply the next time you start the game.
A mod listed in red failed to load. Select it to see why. A mod that fails is left out completely, and the rest still load. Subscribing and unsubscribing happen on the Workshop page (the Workshop button opens it).
Folder layout
A mod folder looks like the game's own Content folder (in the install folder: right-click the game in Steam, then Manage, then Browse local files):
my_mod/
manifest.json required
preview.png Workshop thumbnail (optional, under 1 MB)
Data/ game data patches
Localization/ text, one file per language
Fonts/ fonts for a new language
Sprites/ art
Include only the folders you need. Other files in the mod folder are ignored.
manifest.json
{
"schema_version": 1,
"id": "my_mod",
"name": "My Mod",
"author": "Your Name",
"version": "1.0.0",
"game_version_min": "0.8.1",
"description": "What it does."
}
schema_versionmust be1.id: letters, digits and_, at most 64 characters. It is the mod's name in saves, in the log and in the mods.json settings file, so do not change it after you publish.name(required, at most 128 characters),author,version(shown in the Mods window and used as the Workshop change note) anddescription(at most 1000 characters).game_version_min(optional): the lowest game version that loads the mod, compared number by number (0.9.10is newer than0.9.9). A shorter value covers every build under it:0.8means any0.8.x.x. The version is at the bottom right of the main menu.
Load order
Mods load in order of their id. When two mods change the same thing, the later one wins. You cannot choose where your mod lands relative to someone else's, so do not rely on it.
Data
Files in Data/ patch the game's files of the same name in Content/Data/. These files can be patched:
| file | what it holds |
|---|---|
products.json |
every product: price, where it is made, recipe, output and sales per line, storage size |
buildings.json |
building costs, line limits, running costs, storage, retail formats |
cities.json |
cities: population, wages, education, productivity, climate, disasters |
tax.json |
corporate tax schedules and which city uses which |
scenarios.json |
scenarios and the product groups they use |
achievements.json |
achievements |
victory.json |
victory types |
ai.json |
how rival companies behave |
executives.json |
the executive market |
Any other file in Data/ stops the mod from loading.
A patch file has the same shape as the game's file but holds only what you change:
- Objects merge. Keys you write replace the game's values, and keys you leave out stay as they are.
{"Warehouse": {"storageLineCapacity": 1800}}changes one number inbuildings.json. - Lists of entries merge by id. In lists whose entries all have an
"id"(cities use"key"), an entry with an existing id changes only the fields you write, and an entry with a new id is added at the end.{"products": [{"id": 1, "price": 3.5}]}changes one product's price. - Any other list is replaced whole (for example
listOrderincities.json, or a recipe'sinputs). - Mods cannot delete entries.
The game checks patched data with the same checks it runs on its own files. If your mod breaks one, the whole mod is turned off and the Mods window shows the reason, such as products.json: product 901 requires outputPerLine. When a field is missing the message may only name the file, so start a new entry by copying a complete one from the game's file.
Products
A new product needs every field the game's entries have: id, price, producedIn, tier, dept, isConsumer, outputPerLine, capacityUnits, and salesPerLine for consumer goods. Every id in inputs must be a product. Stores sell consumer goods by shelf, which follows dept (Food and Agriculture go to Grocery, HealthBeauty, Clothing, Electronics, Home and General to the shelf of the same name). A consumer good in any other department needs its own shelf (one of those or Vehicle).
- Name:
product.<id>inLocalization/<language>.json. - Icon (optional):
Sprites/Products/<id>_<anything>_24.png, 24x24, with the id as three digits (900_honey_tea_24.png). Without one the name shows alone.
Cities
A new city is added at the end of cities. It must also appear in listOrder (the order of the city list in New Game). Because that list is replaced whole, copy the game's full listOrder and add your city. Give it a tax jurisdiction in tax.json ({"cities": {"my_city": "uk"}}) and a name, city.<key>, in Localization.
Scenarios
A new scenario needs a banner, Sprites/Banners/scenario_<id>.png (280x90). Without one the mod does not load. Its texts are scenario.<id>.name, .brief, .won and .failed in Localization.
Achievements and victory types
Texts are achievement.<id>.name / .desc and victory.<id>.name / .desc / .tip. Icons are optional: Sprites/Achievements/<id>_color.png and <id>_gray.png (40x40), and victory_<id>_color.png, _gray.png and _victory.png (60x60).
Data mods, saves and multiplayer
A mod with a Data/ folder is a data mod. A world remembers the data mods that were on when it was created, and a save loads only while the same data mods (by id) are on: the Load window names the mods a save needs. Updating a data mod keeps saves loading, so keep ids stable and do not remove products or cities that existing worlds may use.
In multiplayer every player needs exactly the same data mods, same versions included. Language and art mods do not matter for saves or multiplayer.
Text
Localization/<language>.json is a flat list of keys and texts, the same keys as the game's Content/Localization/en.json.
- A file named after a language the game has (
en,ko,ja,zh-CN,zh-TW) changes the keys you write in that language. - Any other name adds a language. Give it
"_meta.display_name"(the name in the language list, written in that language). Keys you leave out show in English.
Keep the {0}, {1} placeholders a text has in English.
Fonts
A new language whose letters the game's fonts lack can bring its own. Put a fonts.json in Fonts/ with the same layout as the game's Content/Fonts/fonts.json, keyed by your language code, and the .ttf / .otf files next to it (at most 30 MB each). A font named in fonts.json may also be one the game already ships.
Art
A PNG in Sprites/ replaces the game's file at the same path under Content/Sprites. A new file name adds art where the game reads a whole folder:
| folder | files |
|---|---|
Sprites/CompanyLogos/ |
logo_<number>.png (24x24): more company logos |
Sprites/ExecutivePortraits/ |
exec_<anything>.png: more executive portraits |
Sprites/Products/ |
product icons |
Sprites/Banners/ |
scenario banners, merger art merge_complete_<anything>.png, disaster news art disaster_<kind>_<anything>.png (a still PNG, or animated with its JSON) |
Sprites/Achievements/ |
achievement and victory icons |
Animated art is a PNG strip plus an Aseprite JSON (Array export) of the same name. If you replace an animated sprite, include its JSON too, even when the frames stay the same. Images may be at most 8192 pixels on a side.
Testing
- Put your mod folder in the Mods folder and start the game.
- Open Mods. A red entry shows what went wrong.
- Every launch writes what happened to each mod to
%LOCALAPPDATA%\FDsIndustryTycoon\game.log(lines starting with[MOD]).
Publishing to the Workshop
Steam must be running. In the Mods window, select your mod from the Mods folder (marked Local), choose who can see it (Public, Friends Only or Private) and press Upload. To test a mod privately, upload it as Private and subscribe to it yourself.
The first upload creates the Workshop item and writes workshop_item.json into your mod folder. Uploading the same folder again updates that item, with version as the change note. If another Steam account or a different mod id made the item, the upload creates a new one.
The first time, Steam may ask you to accept the Workshop agreement: the page opens in the Steam overlay. Accept it and upload again. By uploading you agree to the Steam Workshop terms of service.
Limits
- JSON files: 10 MB. Fonts: 30 MB. Images: 8192 pixels on a side.
- The game reads only JSON, PNG and font files. Mods cannot run code or add sounds or music.
Examples
The examples folder next to this guide has four small mods. Copy one into your Mods folder to try it.
italian_pack: adds a language (only the main menu is translated).balance_tweaks: changes two values inai.jsonandbuildings.json.new_product: adds a product with its names and icon.new_scenario: adds a scenario with its texts and banner.