Captain Headsman — Modding Guide
Captain Headsman is moddable through plain JSON files placed in the StreamingAssets folder. No compilation, no special tools. Open a text editor, write your JSON, drop it in the right folder, launch the game.
How the mod system works
The game loads every .json file found anywhere inside StreamingAssets/ at startup. Files are grouped by their "id" field. If two files share the same id, they are shallow-merged in alphabetical filename order — later files overwrite earlier ones at the top level. Your mod file only needs to contain the fields you want to change; everything else stays as the default.
StreamingAssets/
Default/ ← shipped defaults (do not edit these)
Characters/
Nodes/
GameSettings.json
Mods/ ← your mod files go here
MyGameSettingsMod.json
MyMaleRebelMod.json
…Place your files anywhere inside
StreamingAssets/. The subfolder name does not matter. UsingMods/is the recommended convention.
Disabling a mod file: Any file whose name begins with
_(underscore) is skipped in a release build. RenameMyMod.jsonto_MyMod.jsonto temporarily disable it without deleting it.
File anatomy
Every JSON file the game loads must have at minimum:
{
"$type": "<fully qualified C# type name>",
"id": "<unique identifier string>"
}The $type field tells the deserializer which data class to use. The id field identifies which data object this file belongs to (or creates).
| Purpose | $type value |
|---|---|
| Game settings | Scripts.DataComponents.GameSettingsDataObject, Assembly-CSharp |
| Character definition | Scripts.DataComponents.CharacterDataObject, Assembly-CSharp |
| Node (most types) | Scripts.DataComponents.NodeDataObject, Assembly-CSharp |
| OptionNode | Scripts.DataComponents.OptionNodeDataObject, Assembly-CSharp |
| ViewTrophyNode | Scripts.DataComponents.ViewTrophyNodeDataObject, Assembly-CSharp |
Quick-start: your first mod
- Create a file at
StreamingAssets/Mods/ExecuteOrReleaseMod.json. - Paste the following to disable the stripping options from the verdict screen:
{
"$type": "Scripts.DataComponents.OptionNodeDataObject, Assembly-CSharp",
"id": "execute_or_release",
"nodeType": "OptionNode",
"options": [
{ "text": "Execute", "nodeId": "execute_prisoner" },
{ "text": "Release", "nodeId": "release_prisoner" }
]
}- Launch the game. The verdict screen now only shows Execute and Release.
Why this filename? The game merges files with the same
idin alphabetical filename order. Your file must be named so it sorts after the default file (ExecuteOrRelease.json).ExecuteOrReleaseMod.jsonsatisfies this becauseMsorts after..
Guides
| Guide | What it covers |
|---|---|
| Game Settings | Name pools, action camera pivots, GIF settings |
| Characters | Prisoner character definitions and hair colours |
| Nodes | Node types and how to wire them together |
| Exchanges | Writing dialogue exchanges |