Commit Graph
21 Commits
Author SHA1 Message Date
ckochandClaude Opus 4.8 15d0169f56 publish.sh: one release for the whole collection
GAME now accepts a space-separated list and defaults to 'all', building and
attaching every game's zip to a single release instead of one game per tag -
which matches the repo being a collection. Release body is the game's own
README for a single game, or the collection README for several.

Asset upload replaces same-named assets, so re-running is idempotent.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 17:16:54 -04:00
ckochandClaude Opus 4.8 6f24502956 Expedition 33: record version drift honestly, ship reduced profile
Running ClairObscurFix v0.0.10 with upstream defaults crashed on save load.
Removing it entirely let the game load normally, isolating the fix as the cause
rather than Proton or the year-old save. The fix is archived and predates the
current build; two pattern scans already failed outright, and the crash
coincides with its Level Load hook.

Ship a reduced profile with only Center HUD enabled - the one option actually
needed at 32:9 - and mark the game PARTIAL rather than implying full support.
Adds a revalidation checklist since vendored archived fixes decay as the game
patches, plus a note that the game has no DRM, so a dedicated HUD-centering
patch is a viable replacement if Center HUD eventually breaks too.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 17:15:12 -04:00
ckochandClaude Opus 4.8 0833cf8495 Add Clair Obscur: Expedition 33 via new METHOD=external
Expedition 33 is UE5 with no DRM, but a mature MIT-licensed fix already exists:
ClairObscurFix by Lyall. Rather than reimplement it, install.sh gains a third
method that vendors a third-party fix unmodified and layers our own tuned
config on top, with the upstream license shipped in the release zip as MIT
requires. Upstream is archived, so vendoring also keeps it available.

Our only change vs upstream defaults is [Center HUD] Enabled = true, since at
5120px wide the edge-anchored HUD elements end up absurdly far apart.

Install/uninstall round-trip verified against a scratch game dir, including
that our tuned ini overrides the vendored default.

Credit to Lyall is recorded in THIRD_PARTY.md, the game README, and the repo
README's method table.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:58:05 -04:00
ckochandClaude Opus 4.8 efaab8bd32 Fix release pipeline: bepinex packaging + no silent failures
'GAME=BurglinGnomes ./tools/publish.sh' exited with zero output. Two causes:

1. build_release.sh was SUWSF-only and hard-failed on a missing SUWSF.ini for
   BepInEx games. It now reads METHOD from game.conf and packages BepInEx plus
   the prebuilt plugin instead.
2. publish.sh ran the build with stdout to /dev/null, so that error was
   invisible and  killed the script silently. Build output is now shown
   and failure reported explicitly.

Also: publish.sh creates the tag locally when missing (v1.1.0 never existed, so
the tag push would have failed too), and defaults the release body to the
game's own README so per-game notes are always accurate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:40:41 -04:00
ckochandClaude Opus 4.8 b97a8a73b1 Credit BepInEx/UnityExplorer, fix stale README refs
BepInEx install/uninstall verified end-to-end against a scratch game dir:
installs loader + plugin, uninstall removes both and leaves BepInEx/ intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:34:34 -04:00
ckochandClaude Opus 4.8 59ee13de9d Burglin' Gnomes: finalize fix, docs, and BepInEx install support
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>
2026-07-21 16:33:56 -04:00
ckochandClaude Opus 4.8 ed2e0016ba Plugin: never cache a zero baseline for world-space canvases
The in-game log showed 'World Canvas localScale (0,0,0) -> (0,0,0)'. Games hide
world-space UI by zeroing its scale; if that zero got cached as the baseline,
multiplying it would pin the canvas to zero permanently and the UI could never
reappear. Now skips canvases that are currently zeroed - both when capturing the
baseline and when applying - so hidden UI is left alone and picked up once the
game shows it again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:25:27 -04:00
ckochandClaude Opus 4.8 40d057ac6e Plugin: reload config live and always log HUD changes
BepInEx does not pick up external edits to a plugin's .cfg, so tuning values
while the game ran silently did nothing - the plugin kept the values loaded at
startup. Now watches the config file's mtime and calls Config.Reload() when it
changes, so edits apply within ~2s with no restart. Reload is wrapped in
try/catch so a malformed .cfg warns instead of spamming exceptions.

HUD adjustments now always log (not just under Verbose) with the resulting
scale, so it is obvious whether a value took effect.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:18:05 -04:00
ckochandClaude Opus 4.8 cbcc53c2e9 Add Burglin' Gnomes BepInEx ultrawide UI plugin
Config-driven so values are tunable without recompiling or pasting console
scripts. Camera is deliberately untouched - it is orthographic with constant
orthographicSize, which is already correct Hor+ at 32:9.

Fixes the two UI families separately, each via the lever that actually works:
- HUD (ScreenSpaceOverlay/ScaleWithScreenSize): match=1 + referenceResolution.y
  raised by HudScale, shrinking the HUD while giving the layout more room.
- World labels (WorldSpace): canvas transform localScale, because
  CanvasScaler.scaleFactor is overwritten by HandleWorldCanvas every frame.

Baselines are cached per canvas so periodic re-apply never compounds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 16:08:11 -04:00
ckochandClaude Opus 4.8 b9e68fd284 UI tuner: fix stale readback and World-Space label lever
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>
2026-07-21 16:04:56 -04:00
ckochandClaude Opus 4.8 ae994c27e6 Bake real test values into UI tuner defaults
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>
2026-07-21 16:00:45 -04:00
ckochandClaude Opus 4.8 4cd18fb9f4 UI tuner: handle both canvas modes, echo knob values
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>
2026-07-21 15:58:37 -04:00
ckochandClaude Opus 4.8 bd9fdc50f6 Fix UI tuner: scaleFactor is ignored in ScaleWithScreenSize
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>
2026-07-21 15:52:19 -04:00
ckochandClaude Opus 4.8 3525c79dba Burglin' Gnomes: camera confirmed correct, add live UI tuner
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>
2026-07-21 15:51:38 -04:00
ckochandClaude Opus 4.8 8bbc1cfac8 Correct Burglin' Gnomes diagnosis: camera is ORTHOGRAPHIC
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>
2026-07-21 15:31:05 -04:00
ckochandClaude Opus 4.8 e21c6c3c44 Add UnityExplorer camera/UI diagnostic script
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>
2026-07-21 15:06:02 -04:00
ckochandClaude Opus 4.8 b6ab1bf5ab Scaffold Burglin' Gnomes (Unity 6 Mono) as second target
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>
2026-07-21 13:16:18 -04:00
ckochandClaude Opus 4.8 9bdb4284d6 Migrate to self-hosted Gitea
- 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>
2026-07-21 12:03:21 -04:00
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
ckochandClaude Opus 4.8 b37677cbc1 Add GitHub publish script
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 20:21:52 -04:00
ckochandClaude Opus 4.8 dc28d60392 Gundam Breaker 4 UltraWide Fix v1.0.0
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>
2026-07-20 20:21:23 -04:00