• v1.2.0 1176df8f20

    v1.2.0 Stable

    ckoch released this 2026-07-21 17:35:37 -04:00 | 3 commits to main since this release

    UltraWidePatches

    Ultrawide (32:9 / 21:9) fixes for PC games that ship with poor or no ultrawide support — built and tested on a Samsung 49" Odyssey G93SC (5120×1440), and Proton/Linux-first.

    Fixes use whichever approach the engine calls for:

    • SUWSF + Ultimate ASI Loader — runtime memory patching, for Unreal titles (and anything DRM-wrapped, where static patching is impossible).
    • BepInEx plugin — a proper C# mod, for Unity titles with the Mono backend.
    • External — where a good third-party fix already exists, it is vendored (license permitting) with our tuned config and full credit, rather than reimplemented. Vendored fixes can go stale against a patched game, so those entries carry a revalidation checklist.

    Most force Hor+ FOV (a wider screen shows you more rather than zooming in) and fix UI that assumes 16:9. Some games already render correctly and only need UI work — Burglin' Gnomes is one, and the fix deliberately leaves its camera alone.

    Supported games

    Game Engine Method Status
    Gundam Breaker 4 Unreal Engine 4.27 SUWSF Confirmed working at 5120×1440
    Burglin' Gnomes Unity 6 (Mono) BepInEx plugin Confirmed working at 5120×1440
    Clair Obscur: Expedition 33 Unreal Engine 5 External (ClairObscurFix by Lyall) ⚠️ Partial — reduced profile, see notes

    Install

    ./install.sh                    # list available patches
    ./install.sh GundamBreaker4     # install one
    ./install.sh GundamBreaker4 uninstall
    

    The installer finds the game across your Steam libraries, drops the loader + patch next to the executable, and applies any config-level tweak (with a backup). It never modifies game files.

    Proton users: each game needs a WINEDLLOVERRIDES launch option or the loader is silently ignored — the installer prints the exact line for that game. This is the single most common reason a fix "doesn't work."

    Windows users can extract a release zip straight into the game's exe folder; no launch option needed.

    Why runtime patching

    Config-file tweaks (e.g. UE4's AspectRatioAxisConstraint=MaintainYFOV) typically fix menus but revert once gameplay loads, because the game re-sets the camera per view. Many shipping executables are also DRM-encrypted on disk (GB4's is SteamStub-wrapped, .text entropy 8.0), which makes static exe patching impossible. Patching the decrypted image in memory solves both problems at once.

    Repo layout

    Path What
    games/<Game>/SUWSF.ini Patch definitions (SUWSF games)
    games/<Game>/plugin/ C# plugin source + prebuilt DLL (BepInEx games)
    games/<Game>/*.ini Our tuned config for a vendored external fix
    games/<Game>/game.conf Game metadata (appid, exe, paths, launch option)
    install.sh Generic installer / uninstaller
    tools/build_release.sh Builds a per-game drop-in release zip
    tools/publish.sh Pushes + cuts a Gitea release
    tools/dump_decrypted.py Dumps a DRM-decrypted image from a running process
    tools/aob.py Verifies/derives byte patterns against a dump
    tools/read_protonlog.sh Confirms ASI injection + per-patch match counts
    tools/unity_diag.cs, tools/unity_uitune.cs UnityExplorer console diagnostics/tuners
    vendor/SUWSF-x64/ Upstream SUWSF 2.3.0 + Ultimate ASI Loader (MIT)
    vendor/BepInEx_win_x64_*.zip Upstream BepInEx 5.4.23.5 (LGPL-2.1)

    Adding a game

    1. mkdir games/<GameName> with a game.conf (copy GB4's as a template) and a SUWSF.ini.
    2. Set METHOD= in game.conf to suwsf, bepinex, or external.
      Check for an existing fix first — if a good one exists and its license
      allows redistribution, vendor it with credit instead of rewriting it.
    3. Unreal: start from the UE4 patterns in games/GundamBreaker4/SUWSF.ini — they match across many UE4 titles. If a pattern misses, use tools/dump_decrypted.py + tools/aob.py to derive the exact bytes.
    4. Unity: install BepInEx + UnityExplorer and inspect live with tools/unity_diag.cs / tools/unity_uitune.cs, then write a plugin (copy games/BurglinGnomes/plugin/).

    Changelog

    Version history and the versioning policy (adding a game = minor bump) are in CHANGELOG.md.

    License

    MIT — see LICENSE. Bundled third-party components (SUWSF, Ultimate ASI Loader) are MIT and credited in THIRD_PARTY.md. You must own the games; nothing here modifies or circumvents copy protection.

    Downloads
  • v1.1.0 efaab8bd32

    v1.1.0 Stable

    ckoch released this 2026-07-21 16:42:00 -04:00 | 7 commits to main since this release

    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.scaleFactor does nothing on a WorldSpace canvas — CanvasScaler.HandleWorldCanvas() overwrites it with dynamicPixelsPerUnit every 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.

    Downloads
  • v1.0.0 dc28d60392

    v1.0.0 Stable

    ckoch released this 2026-07-20 20:21:23 -04:00 | 24 commits to main since this release

    Gundam Breaker 4 — UltraWide Fix v1.0.0

    Part of UltraWidePatches.

    Ultrawide 32:9 / 21:9 support for Gundam Breaker 4 (PC). Forces Hor+ FOV — a wider screen shows you more, instead of zooming the camera in — and disables pillarboxing. Confirmed working in gameplay at 5120×1440 on Linux/Proton (Samsung 49" Odyssey G93SC).

    Install (Linux / Proton)

    1. Extract the zip into …/GB4/Binaries/Win64/ (next to GB4-Win64-Shipping.exe), or run ./install.sh GundamBreaker4 from the repo.
    2. Required — Steam → Properties → Launch Options:
      WINEDLLOVERRIDES="dsound=n,b" %command%
      
      Without this, Proton ignores the loader and the fix only works in the lobby.
    3. Set the in-game resolution to your native ultrawide res, fullscreen.

    Install (Windows)

    Extract the zip into …\GB4\Binaries\Win64\. No launch option needed.

    How it works

    GB4 is Unreal Engine 4.27 and its shipping exe is SteamStub-encrypted, so a static exe patch isn't possible. This uses SUWSF + Ultimate ASI Loader to patch the decrypted UE4 AspectRatioAxisConstraint in memory at runtime — which is why it holds through missions (the Engine.ini trick alone reverts in-mission).

    Notes

    • Do not enable the HOR+ patch at 16:9 or narrower.
    • You must own the game. Nothing here modifies or circumvents copy protection.
    • Uninstall: ./install.sh GundamBreaker4 uninstall, or delete SUWSF.asi, SUWSF.ini, dsound.dll.

    Credits: SUWSF by PhantomGamers · Ultimate ASI Loader by ThirteenAG · patterns adapted from Lyall's UltrawidePatches.

    Downloads