Files
UltraWidePatches/install.sh
T
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

109 lines
4.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# Gundam Breaker 4 - UltraWide Fix installer (Linux / Proton)
# Installs SUWSF + Ultimate ASI Loader + our GB4 SUWSF.ini next to the
# shipping exe. Idempotent. Use ./install.sh uninstall to remove.
# ============================================================================
set -euo pipefail
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOADER_NAME="${LOADER_NAME:-dsound.dll}" # override: LOADER_NAME=version.dll ./install.sh
# --- locate GB4 shipping exe dir across Steam libraries -----------------------
find_gamedir() {
local cand
for base in \
"$HOME/.steam/steam" "$HOME/.local/share/Steam" \
"/media/$USER/Data/steam" "/media/$USER"/*/steam \
"$HOME/.var/app/com.valvesoftware.Steam/.local/share/Steam"; do
cand="$base/steamapps/common/GBBBB/GB4/Binaries/Win64"
[ -f "$cand/GB4-Win64-Shipping.exe" ] && { echo "$cand"; return 0; }
done
# brute-force fallback
cand=$(find /home /media /mnt -maxdepth 8 -name GB4-Win64-Shipping.exe 2>/dev/null | head -1)
[ -n "$cand" ] && { dirname "$cand"; return 0; }
return 1
}
GAMEDIR="${GB4_WIN64_DIR:-$(find_gamedir || true)}"
if [ -z "${GAMEDIR:-}" ] || [ ! -f "$GAMEDIR/GB4-Win64-Shipping.exe" ]; then
echo "[!] Could not find GB4-Win64-Shipping.exe."
echo " Set it manually: GB4_WIN64_DIR=/path/to/GB4/Binaries/Win64 ./install.sh"
exit 1
fi
echo "[+] Game dir: $GAMEDIR"
ASI="$HERE/vendor/SUWSF-x64/SUWSF.asi"
LOADER_SRC="$HERE/vendor/SUWSF-x64/dsound.dll" # Ultimate ASI Loader (adapts by filename)
INI="$HERE/patch/SUWSF.ini"
for f in "$ASI" "$LOADER_SRC" "$INI"; do
[ -f "$f" ] || { echo "[!] missing $f"; exit 1; }
done
# --- locate the Proton prefix Engine.ini (for the immediate menu/lobby win) ---
find_engine_ini() {
local cand
for base in \
"/media/$USER/Data/steam" "$HOME/.local/share/Steam" \
"$HOME/.steam/steam" "/media/$USER"/*/steam; do
cand="$base/steamapps/compatdata/1672500/pfx/drive_c/users/steamuser/AppData/Local/GB4/Saved/Config/WindowsNoEditor/Engine.ini"
[ -f "$cand" ] && { echo "$cand"; return 0; }
done
return 1
}
MARK_BEGIN="; >>> BG4 UltraWide Fix (MaintainYFOV) >>>"
MARK_END="; <<< BG4 UltraWide Fix <<<"
apply_engine_ini() {
local ini; ini="$(find_engine_ini || true)"
[ -z "$ini" ] && { echo "[i] Engine.ini not found (launch the game once first); skipping menu-level win."; return; }
if grep -qF "$MARK_BEGIN" "$ini"; then echo "[i] Engine.ini tweak already present."; return; fi
cp -v "$ini" "$ini.bak-bg4uw"
{ echo ""; echo "$MARK_BEGIN"; echo "[/Script/Engine.LocalPlayer]";
echo "AspectRatioAxisConstraint=AspectRatio_MaintainYFOV"; echo "$MARK_END"; } >> "$ini"
echo "[+] Engine.ini: added MaintainYFOV (fixes menus/lobby immediately; SUWSF covers missions)."
}
remove_engine_ini() {
local ini; ini="$(find_engine_ini || true)"
[ -z "$ini" ] && return
if grep -qF "$MARK_BEGIN" "$ini"; then
sed -i "/$(printf '%s' "$MARK_BEGIN" | sed 's/[][\/.*^$]/\\&/g')/,/$(printf '%s' "$MARK_END" | sed 's/[][\/.*^$]/\\&/g')/d" "$ini"
echo "[+] Engine.ini: removed BG4 UltraWide block."
fi
}
uninstall() {
echo "[+] Uninstalling..."
for f in SUWSF.asi SUWSF.ini dsound.dll dinput8.dll version.dll winmm.dll; do
[ -f "$GAMEDIR/$f" ] && { rm -v "$GAMEDIR/$f"; }
done
remove_engine_ini
echo "[+] Done. (game files untouched; nothing was ever modified in the exe)"
}
if [ "${1:-}" = "uninstall" ]; then uninstall; exit 0; fi
# --- install ------------------------------------------------------------------
cp -v "$ASI" "$GAMEDIR/SUWSF.asi"
cp -v "$INI" "$GAMEDIR/SUWSF.ini"
cp -v "$LOADER_SRC" "$GAMEDIR/$LOADER_NAME"
apply_engine_ini
echo
echo "[+] Installed: SUWSF.asi, SUWSF.ini, $LOADER_NAME"
echo
echo "NEXT (Steam):"
echo " 1. If the game does not apply the fix, add this to GB4's Steam"
echo " Launch Options (right-click game > Properties > Launch Options):"
echo " WINEDLLOVERRIDES=\"${LOADER_NAME%.dll}=n,b\" %command%"
echo " 2. Set the in-game resolution to 5120x1440 (fullscreen)."
echo " 3. Launch. Camera should widen (Hor+) instead of zooming in."
echo
echo "If nothing changes, the runtime AOB may differ for GB4. Run:"
echo " python3 tools/dump_decrypted.py (while game is at main menu)"
echo " python3 tools/aob.py (reports which patterns matched)"
echo
echo "To try a different loader name: LOADER_NAME=version.dll ./install.sh"
echo "To remove everything: ./install.sh uninstall"