Files
ckochandClaude Opus 4.8 5d6fd277c9 Restructure into multi-game UltraWidePatches umbrella
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>
2026-07-21 11:21:20 -04:00

72 lines
2.8 KiB
INI

[UserSettings]
; ==========================================================================
; Gundam Breaker 4 - UltraWide Fix (SUWSF patch)
; Target display: Samsung 49" Odyssey G93SC (5120x1440, 32:9)
; Engine: Unreal Engine 4.27 | Exe is SteamStub-encrypted -> runtime patch
; ==========================================================================
; Your screen resolution used in patch calculations. "auto" reads primary
; display; set explicitly if auto misreads under Proton/DPI scaling.
Resolution="5120x1440"
; Globally enable or disable all patches (default: true)
Enabled=true
; --------------------------------------------------------------------------
; WARNING: PATCHES BELOW. These are CANDIDATE UE4 patterns adapted from
; known-good UE4 fixes (Trepang2 / Lies of P). Because GB4's .text is
; SteamStub-encrypted on disk we cannot verify the exact bytes statically;
; SUWSF scans the DECRYPTED image in memory at runtime, so if GB4's UE4.27
; codegen matches these generic patterns they apply directly.
;
; If a patch reports 0 matches (see SUWSF log / no visual change), run
; tools/dump_decrypted.sh while the game is running and send me the dump so
; I can derive GB4's exact pattern. Each patch is independent - a miss on one
; does not stop the others.
; --------------------------------------------------------------------------
; [1] HOR+ FOV -- the primary fix.
; Forces ULocalPlayer AspectRatioAxisConstraint to 0 (AspectRatio_MaintainYFOV).
; This makes the camera keep VERTICAL FOV constant and expand horizontally
; (Hor+), removing the zoomed-in feel at 32:9. Do NOT use at 16:9 or narrower.
; Value BA 00 00 00 00 = "mov edx, 0" ; 90 90 90 = pad nops.
[Patch:AspectRatioAxisConstraint]
Enabled=true
Pattern="0F ?? ?? ?? 0F ?? ?? ?? ?? ?? 41 ?? ?? ?? ?? ?? 00 00 48 ?? ?? ?? ?? 00 00 4C ?? ??"
Offset=10
Value="BA 00 00 00 00 90 90 90"
ValueType="byte"
Match="1"
Module="auto"
; [2] Disable pillarboxing/letterboxing (bConstrainAspectRatio = 0).
; Prevents the game clamping the render to 16:9 with black side bars.
[Patch:ConstrainAspectRatio]
Enabled=true
Pattern="33 ?? ?? 83 ?? 02 31 ?? ?? 0F ?? ?? ?? ?? 00 00"
Offset=0
Value="90 90 90 90 90 90"
ValueType="byte"
Match="1"
Module="auto"
; [3] OPTIONAL fallback: some UE builds hardcode 16:9 (1.777778) as a float
; (39 8E E3 3F) or (3B 8E E3 3F) and clamp to it. Disabled by default because
; it can double-apply with patch [1]. Enable ONLY if [1] misses and you still
; see a squeezed/zoomed image. Writes your true aspect ratio in its place.
[Patch:HardcodedAspect_16by9_a]
Enabled=false
Pattern="39 8E E3 3F"
Offset=0
Value="aspectratio"
ValueType="float"
Match="all"
Module="auto"
[Patch:HardcodedAspect_16by9_b]
Enabled=false
Pattern="3B 8E E3 3F"
Offset=0
Value="aspectratio"
ValueType="float"
Match="all"
Module="auto"