Final tuned values baked in as defaults: HudScale=0.8, WorldLabelScale=0.8. - install.sh gains METHOD=bepinex: installs BepInEx from vendor + the prebuilt plugin, with a matching uninstall that leaves BepInEx/ alone (other mods may depend on it). Success banner is now method-aware. - Ship the prebuilt plugin DLL so users don't need a .NET SDK. - Per-game README documenting why the camera is deliberately untouched (orthographic, constant orthographicSize = already Hor+), the two-canvas UI problem, tuning, and where the plugin log actually lives. - Root README lists both games and both fix methods. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Burglin' Gnomes — UltraWide Fix
✅ Confirmed working at 5120×1440 (32:9) on Proton.
- Engine: Unity 6 (6000.0.62f1), Mono backend, URP + Cinemachine
- Steam AppID: 3844970
- Executable:
Gnomium.exe - Method: BepInEx plugin (no DRM, no memory patching needed)
What it fixes — and what it deliberately doesn't
The camera is already correct. It's orthographic with a constant orthographicSize of 5.0, so a wider display genuinely shows more world (visible width 17.8 → 35.6 going 16:9 → 32:9). That's textbook Hor+, and this fix does not touch it. fieldOfView reads 60 at every resolution simply because orthographic cameras don't use it — a red herring if you go looking.
The problem is entirely UI, in two separate places needing two different levers:
| Canvas | Problem | Lever |
|---|---|---|
HUD (ScreenSpaceOverlay + ScaleWithScreenSize) |
Ships matchWidthOrHeight = 0.453 (width-biased). At 5120px that yields scaleFactor 1.948 — a ballooned HUD with overlapping bottom/centre text. |
match = 1 (scale by height) + raise referenceResolution.y, shrinking the HUD and giving the layout more logical room |
In-world labels (WorldSpace, e.g. NamePlate) |
At 32:9 you see twice as much world, so far more labels are on screen and can collide | Canvas transform.localScale |
Gotcha:
CanvasScaler.scaleFactordoes nothing on a WorldSpace canvas —CanvasScaler.HandleWorldCanvas()overwrites it withdynamicPixelsPerUnitevery frame. Scaling the transform is the only thing that works.
Install (Linux / Proton)
./install.sh BurglinGnomes
Then required — Steam → Properties → Launch Options:
WINEDLLOVERRIDES="winhttp=n,b" %command%
Without it Proton ignores BepInEx's winhttp.dll loader and the plugin never runs.
Install (Windows)
Extract the release zip into the game folder (next to Gnomium.exe). No launch option needed.
Tuning
Config is generated on first launch:
<game>/BepInEx/config/com.programmingpug.burglingnomes.ultrawidefix.cfg
Edits apply live (~2s) — no restart. BepInEx doesn't reload config on its own, so the plugin watches the file's mtime and calls Config.Reload() itself.
| Setting | Default | Notes |
|---|---|---|
HudScale |
0.8 |
HUD size. Lower = smaller HUD and more layout room (cures overlapping text) |
WorldLabelScale |
0.8 |
In-world nameplate size |
MatchWidthOrHeight |
1.0 |
Leave at 1. Lower re-introduces width scaling and cramps the layout vertically |
DesignHeight |
1080 |
The game's design height; don't change |
Verbose |
false |
Log every canvas adjustment |
HudScale → resulting HUD scale at 5120×1440 (stock is 1.333):
| HudScale | 1.0 | 0.85 | 0.8 | 0.6 |
|---|---|---|---|---|
| scale | 1.333 | 1.133 | 1.067 | 0.800 |
Verifying it works
<game>/BepInEx/LogOutput.log
That's the plugin's log — not UnityExplorer's in-game Log window, which only shows Unity Debug.Log. You should see:
Burglin' Gnomes UltraWide Fix 1.0.0 loaded.
HUD 'Canvas' ref (1920.00, 1080.00) -> (1920.00, 1350.00) match=1 => scale=1.067
World 'NamePlate' localScale (1.00, 1.00, 1.00) -> (0.80, 0.80, 0.80)
If a line is absent, that adjustment didn't happen.
Uninstall
./install.sh BurglinGnomes uninstall
Removes the loader and plugin. BepInEx/ is left in place in case other mods use it.
Building the plugin from source
Prebuilt BurglinGnomes.UltraWideFix.dll ships here, so this is only needed if you change it:
cd plugin
dotnet build -c Release -p:GameDir="/path/to/Burglin' Gnomes"
Requires the .NET SDK; it references the game's own assemblies and redistributes none of them.