
TheControlRoomFix
Equips every Control Room with a Micro Cruncher, blueprints and resident files. Works on new cities and existing saves.
TheControlRoomFix
BepInEx IL2CPP plugin for Shadows of Doubt. TheControlRoomFix adds a Micro Cruncher, blueprints and a single resident-files drawer to every Control Room. It works on existing saves and new cities.
Surveillance feeds fill in after several in-game hours, as in vanilla. If you fast-travel into a building, walk around the area for a moment; recording may not start until the surroundings have loaded. Some cameras may stay offline, as in vanilla.
Some buildings have no cameras by vanilla design.
Version 1.0.0 is a gameplay release: those surfaces worked in playtest. It does not fill missing employees.
Playtest (authoritative for 1.0.0)
On the same completely broken test city used throughout development, T A checked 7/7 Control Rooms:
- Computers and blueprints were present.
- Management login worked and was enough to use surveillance.
- Most rooms had a file cabinet with some resident folders (vanilla-like, not a complete every-resident roster).
A later check on a fresh 9x6 city and on existing saves confirmed feeds record away from the player and survive save/reload.
Employee login and filling empty jobs are out of scope. That belongs to a separate BACK TO WORK! mod so the two plugins do not fight.
What the plugin does
The plugin uses Harmony (runtime method patching) and BepInEx (Unity plugin
loader) on IL2CPP (Unity's compiled scripting backend). After
MurderController.OnStartGame it:
- Exempts the
ControlRoomroom class from the erroneousskipIfNoAddressInhabitantsgate (new interiors can spawn functional clusters). - Repairs already-serialized broken Control Rooms with vanilla placement
APIs when no Micro Cruncher is present (
RepairExistingControlRooms, default on). - Prefers a Toolbox desk preset that defines a Micro Cruncher when
DeskAgainstWallwould otherwise place a desk with none. - Places one filing cabinet cluster per Control Room (tall if possible, otherwise short), not both.
- Always limits resident folders to one drawer per Control Room:
extra
ResidentRosterdrawers are emptied so the same files are not copied into every drawer. Optionally (CompleteResidentRosters, default off) adds every building inhabitant to that one keeper drawer. - Logs furniture/interactable counts when the debug pipeline dump is on (diagnostics from the 0.7.1 probe remain; they are not a claim that rooms are empty).
City Hall duplicate-company work stays disabled and is out of the 1.0.0 bar.
This plugin must not invent or fill missing employees.
Install
- Install BepInExPack IL2CPP (Thunderstore: common BepInEx mod listing).
- Place
ControlRoomFix.dllinBepInEx/plugins/ControlRoomFix. - Load a city (back up first). Rooms that already have a Micro Cruncher are left alone (idempotent repair).
The plugin DLL filename stays ControlRoomFix.dll.
Config
The config file name is unchanged: BepInEx/config/sod.controlroomfix.cfg.
CompleteResidentRosters(default false): when true, the one remaining drawer can list every building inhabitant. Leave false for vanilla-like "some folders." Extra drawers are emptied either way.DumpInteractablePipeline(default false, debug only): log vanilla furniture/interactable APIs and before/after repair counts.
If an older config still has CompleteResidentRosters = true or
DumpInteractablePipeline = true, edit those keys by hand. The file on
disk wins over the plugin defaults.
City analyzer (Python)
Diagnostic tooling for procedural-generation defects in city files
(.cit). Python 3.9+; no runtime dependencies.
python3 sod_city_analyzer.py "/path/to/City.cit"
python3 sod_city_analyzer.py "/path/to/City.cit" --json
The analyzer can flag Control Rooms missing desks/computers/plans, City Hall issues, and company-roster IDs that point at missing citizens. That last check is detection only, not a job-fill patch.
Known gaps (documented, not blocking 1.0.0 gameplay)
- Employee login / empty jobs: BACK TO WORK!, not this mod.
- Not every cabinet has every resident; vanilla-like is the bar.
- City Hall: experimental, off.
Build (local, needs game Dynamic Link Libraries)
SOD_BEPINEX_DIR=<BepInEx directory>
SOD_INTEROP_DIR=<BepInEx/interop directory>
dotnet build src/ControlRoomFix/ControlRoomFix.csproj --configuration Release
python3 tools/build_package.py --configuration Release
Cloud agents cannot compile against proprietary game DLLs.
Support
If TheControlRoomFix improved your cases, you can support development here:
- Ko-fi: https://ko-fi.com/sm3gm
- Buy Me a Coffee: https://buymeacoffee.com/sm3gm