You are viewing a potentially older version of this package. View all versions.
Sm3gm-TheControlRoomFix-1.0.0 icon

TheControlRoomFix

Equips every Control Room with a Micro Cruncher, blueprints and resident files. Works on new cities and existing saves.

Date uploaded 2 weeks ago
Version 1.0.0
Download link Sm3gm-TheControlRoomFix-1.0.0.zip
Downloads 39
Dependency string Sm3gm-TheControlRoomFix-1.0.0

This mod requires the following mods to function

BepInEx-BepInExPack_IL2CPP-6.0.755 icon
BepInEx-BepInExPack_IL2CPP

BepInEx pack for IL2CPP x64 Unity games. Preconfigured and ready to use.

Preferred version: 6.0.755

README

TheControlRoomFix

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 ControlRoom room class from the erroneous skipIfNoAddressInhabitants gate (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 DeskAgainstWall would 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 ResidentRoster drawers 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

  1. Install BepInExPack IL2CPP (Thunderstore: common BepInEx mod listing).
  2. Place ControlRoomFix.dll in BepInEx/plugins/ControlRoomFix.
  3. 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:

CHANGELOG

1.2.0

  • Every resident gets a folder. Vanilla files only some of a building's residents, and all its resident drawers share one list. Now every resident of the building has a Resident File in the Control Room, 14 per drawer, sorted by floor and apartment, with no duplicates.
  • More drawers where needed: free drawers in tall filing cabinets first, then the bottom drawer of short cabinets, then extra tall cabinets. In rooms too cramped for the game's own furniture search, a tall cabinet is placed on a free spot against a wall, or swaps places with a short cabinet. Anything that was in or on the short cabinet moves to the new one.
  • Only people who live in the building are filed. Shop and office staff are left out.
  • New settings: FileEveryResident (on) and ResidentsPerDrawer (14). The old CompleteResidentRosters setting is gone and can be removed from the config file.
  • Like the other repairs, the folders are rebuilt each time a city loads. Extra cabinets stay in your save and are not added twice.

1.1.0

  • Repaired Control Rooms now have a working computer login. Many Building Management companies have no staff, so their Micro Cruncher had no one to log in as. Each time a city loads, one unemployed citizen takes the vacant Security Guard post, and logging in as them gives you the Surveillance app. Nothing is saved. Turn it off with HireForVacantControlRooms.
  • A Control Room now counts as working only when it holds a real Micro Cruncher and blueprints, so rooms that only looked complete get repaired too.
  • The plugin ID is now sm3gm.sod.controlroomfix. Settings reset to their defaults in the new file BepInEx/config/sm3gm.sod.controlroomfix.cfg, and the old sod.controlroomfix.cfg can be deleted.
  • TryAlternateInteractableOrdering and PreferWorkingDeskPreset moved to the [Fixes] section. Diagnostic logging is off by default.

1.0.0

First public release as TheControlRoomFix.

  • One resident-files drawer per Control Room (tall or short cabinet, not both).
  • Verified on a fresh 9x6 city and on existing saves (feeds record away from the player and survive save/reload).
  • Feed timing documented.