ajhahn.de
← the-way-out
Shell 45 lines
#!/usr/bin/env bash
# Builds "The Way Out.app" — a thin launcher that auto-updates its game
# code from GitHub. Run on macOS only. Rebuild + re-send is only needed
# when the Python version or dependencies change (rare); normal code
# changes ship via `git push` + the in-game Update button.
set -euo pipefail
cd "$(dirname "$0")"

PY=".venv/bin/python"                       # NEVER system python3 (3.14)
[ -x "$PY" ] || { echo "missing $PY"; exit 1; }
"$PY" -m pip install --quiet --upgrade pyinstaller certifi

APPNAME="The Way Out"
SEEDPARENT="$(mktemp -d)"; SEED="$SEEDPARENT/_seed"; mkdir -p "$SEED"
rsync -a --delete \
  --exclude '.git' --exclude '.venv' --exclude '__pycache__' \
  --exclude 'build' --exclude 'dist' --exclude '*.spec' \
  --exclude '.DS_Store' --exclude 'ajhahnde' --exclude '.venv-intel' \
  ./ "$SEED/"                                # assets/ MUST be in (offline 1st run)

rm -rf build dist "$APPNAME.spec"
"$PY" -m PyInstaller --noconfirm --windowed --clean \
  --name "$APPNAME" \
  --osx-bundle-identifier de.ajhahn.thewayout \
  --icon assets/icon.icns \
  --collect-all pygame \
  --collect-all certifi \
  --add-data "$SEED:_seed" \
  launcher.py

# Declare the bundle as a game so macOS Sonoma+ auto-enables Game Mode
# (priority CPU/GPU, lower Bluetooth latency) whenever it runs
# fullscreen — there is no runtime API for this, only this plist key.
# Must run before codesign: the re-sign below covers the edited bundle.
PLIST="dist/$APPNAME.app/Contents/Info.plist"
/usr/libexec/PlistBuddy \
  -c "Add :LSApplicationCategoryType string public.app-category-games" \
  "$PLIST" 2>/dev/null \
  || /usr/libexec/PlistBuddy \
  -c "Set :LSApplicationCategoryType public.app-category-games" "$PLIST"

codesign --force --deep --sign - "dist/$APPNAME.app"
( cd dist && ditto -c -k --keepParent "$APPNAME.app" "TheWayOut-mac.zip" )
echo "Done: dist/TheWayOut-mac.zip — 1st launch: right-click > Open > Open"