Two defects in the tuner, both visible in the in-game logs:
1. AFTER lines read Canvas.scaleFactor immediately after writing, but that is
recomputed in CanvasScaler.Update(), so it reported last frame's value
(showed 1.3333 after ref was set to 1350). Now prints the mathematically
expected scale instead.
2. WORLD_SCALE set CanvasScaler.scaleFactor on WorldSpace canvases, which
HandleWorldCanvas() overwrites with dynamicPixelsPerUnit every frame - the
log showed 'APPLIED scaleFactor 1 -> 0.8' followed by effectiveScale=1.0.
World-space label size is driven by the canvas transform localScale, so it
now scales that, stashing a baseline child so repeated runs don't compound.
Also documents that MATCH must stay 1.0: match .8 + ref 1350 yields 1.281 vs
1.067 at match 1, largely cancelling the shrink.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pasting the file verbatim was a no-op because the knobs shipped at 1.0, so
every run reported KNOBS ...=1 and changed nothing. Default to HUD_SCALE=0.85
and WORLD_SCALE=0.8 so copying the file straight from the editor actually
exercises the fix.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
In-game capture revealed two canvas families: ScreenSpaceOverlay/
ScaleWithScreenSize (the HUD, ref 1920x1080 match=1) and WorldSpace/
ConstantPixelSize (NamePlate and friends). Unity ignores referenceResolution
in ConstantPixelSize mode, so the old HUD_SCALE knob could never affect the
in-world labels. Split into HUD_SCALE (referenceResolution) and WORLD_SCALE
(scaleFactor), applied per mode.
Also echoes the knob values and logs APPLIED lines, so a stale console edit is
immediately obvious instead of looking like the fix did nothing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CanvasScaler.scaleFactor only applies to ConstantPixelSize mode, so the old
SCALE_MULT knob would have done nothing. Replaced with HUD_SCALE, implemented
via referenceResolution.y (effective scale = screenH/refH), which genuinely
shrinks the HUD while giving the layout MORE logical room - the right lever
for overlapping text.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
orthographicSize is constant at 5.0 across 1920x1080 and 5120x1440 (visible
height 10.0, width 17.8 -> 35.6). The camera is already textbook Hor+ and needs
no patch - the entire ultrawide problem is HUD scaling.
CanvasScaler match=0.453 gave scaleFactor 1.948 (ballooned HUD); match=1 gives
1.333 with logical height exactly 1080 (the design height). Adds a live tuner
with independent match / scaleFactor / referenceResolution knobs to chase the
remaining text overlap.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fieldOfView is meaningless here (reads 60 at every resolution because nothing
uses it). The governing value is orthographicSize. Diagnostic now reports
orthoSize plus computed visible width/height, and checks Cinemachine lens
ortho size too.
Also confirmed the HUD cause: CanvasScaler match=0.453 (width-biased) with a
1920x1080 reference, which balloons the HUD at 5120px wide. Added a live
fix-test script to try match=1 and an orthoSize override in-game.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reflection-based so it compiles across Cinemachine versions. Dumps cameras,
Cinemachine lens FOV, and CanvasScaler settings to identify what drives FOV
and what breaks the HUD at ultrawide.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recon: Unity 6000.0.62f1, Mono backend (readable C# assemblies), URP +
Cinemachine, no DRM. No FOV logic in game code, so the horizontal-FOV lock is
a serialized camera setting - needs runtime inspection via BepInEx/UnityExplorer.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- origin now points at git.lazypugs.com/ckoch/UltraWidePatches
- rewrite tools/publish.sh for Gitea's API (token via GITEA_TOKEN env, never
stored on disk); creates/updates the release and uploads the game zip
- update the remaining self-referential link to the Gitea URL
Upstream links (SUWSF, Ultimate ASI Loader, Lyall's patterns) intentionally
still point at GitHub - those are third-party projects.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Generalize the project from a single GB4 fix into a collection that can host
ultrawide patches for many games.
- games/<Game>/{SUWSF.ini,game.conf,README.md}; GB4 moved in as the first entry
- game.conf carries all game-specific data (appid, exe, paths, loader, launch
option), so install.sh is fully generic: ./install.sh <Game> [uninstall]
- installer gains GAME_DIR / PREFIX_INI_FILE / LOADER_NAME overrides; verified
install -> idempotent re-run -> uninstall leaves the tree pristine
- tools de-hardcoded: dump_decrypted.py takes an exe name, read_protonlog.sh
takes an appid, aob.py takes a dump + game ini, build_release.sh takes a game
- README rewritten as an umbrella index with an "adding a game" guide
- LICENSE copyright -> programmingPug
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32:9 / 21:9 ultrawide support for Gundam Breaker 4 (UE4.27) via SUWSF +
Ultimate ASI Loader. Forces Hor+ FOV (AspectRatioAxisConstraint=MaintainYFOV)
and disables pillarboxing, patched in decrypted memory at runtime so it holds
through missions (the exe is SteamStub-encrypted; a static patch is impossible).
Confirmed working in gameplay at 5120x1440 (Samsung Odyssey G93SC) on Proton.
Requires WINEDLLOVERRIDES="dsound=n,b" on Proton so the loader injects.
Includes: patch/SUWSF.ini, Proton installer with clean uninstall, release-zip
builder, and runtime dump/verify tooling. Third-party bundles under MIT (see
THIRD_PARTY.md).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>