docs: rewrite SWBF2 setup guide as clean how-to with native Linux section

- Remove editorial content (EA server speculation, 2005 alternative, opinions)
- Add native Linux Steam section covering all six setup steps
- Add separate key paths tables for Wolf and native
- Add native Linux troubleshooting commands alongside Wolf equivalents
- Rename title to reflect both platforms
- Fresh install table rewritten as factual survival matrix

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D8ckUJQtj1pH8jtAddBDZs
This commit is contained in:
Claude
2026-06-22 14:21:22 +00:00
parent 4324ad7ce2
commit 11a7c6529c
+323 -169
View File
@@ -1,117 +1,101 @@
# Star Wars Battlefront II (2017) — Wolf/Moonlight Setup
# Star Wars Battlefront II (2017) — Linux Setup Guide
**AppID:** 1237950
**Proton:** GE-Proton10-34 (required)
**Platform:** Wolf (Games-on-Whales) — WolfSteam Docker container
**Proton:** GE-Proton10-34 or later (required)
This guide covers two setups:
- [Wolf / Games-on-Whales + Moonlight streaming](#wolf--moonlight)
- [Native Linux Steam](#native-linux-steam)
The underlying fix is the same for both. The EA App MSI bundled with the game
fails to install in Wine due to a .NET custom action (`JunoConfigureRegistry`)
that Wine does not support, causing the installer to silently roll back. The
fix is to extract the EA Desktop files directly from the MSI on the Linux host
using `msiextract`, bypassing the installer entirely, then wire up a launch
wrapper to import the necessary registry entries on every launch.
---
## Prerequisites
## Prerequisites (both setups)
- SWBF2 installed via Steam in the WolfSteam session
- GE-Proton10-34 installed (Steam → Settings → Compatibility → Enable Steam Play)
- EA account created at ea.com and linked to your Steam account
- `msitools` on the Docker host: `sudo apt-get install -y msitools`
- SWBF2 (AppID 1237950) installed via Steam and fully downloaded
- GE-Proton10-34 or later installed
- An EA account created at ea.com and linked to your Steam account
- `msitools` installed on the host:
```bash
sudo apt-get install -y msitools # Debian / Ubuntu
sudo dnf install -y msitools # Fedora
```
### EA account requirement
SWBF2 (2017) requires EA account authentication on first launch. Steam handles
the game files; EA App handles identity. First launch requires an internet
connection and a valid EA account linked to your Steam account. After
authenticating, EA App caches credentials locally and subsequent launches work
without re-login until the token expires (typically weeks to months).
To link accounts: log in at ea.com, go to Connections, and link your Steam
account. This is a one-time step that persists across reinstalls.
---
## The EA dependency problem
## Wolf / Moonlight
SWBF2 (2017) requires EA's launcher infrastructure — even for single-player offline:
### Prerequisites (Wolf)
- **Steam** handles payment, library, and game files
- **EA App** handles identity and authentication
- Wolf is running and Steam is open in a Moonlight session
- GE-Proton is installed inside the WolfSteam container
(`./manage.sh ge-proton`)
- In Steam (via Moonlight): SWBF2 → Properties → Compatibility →
Force GE-Proton10-34
First launch requires internet + EA account. After that, EA App caches credentials
locally and subsequent launches work offline — until the token expires or EA's servers
shut down permanently.
### Automated setup
**If/when EA shuts down:**
- Community private server projects (like Kyber) may replace EA's infrastructure
- SWBF2 (2005, AppID 6060) is the zero-dependency alternative — no accounts, no
launchers, active community servers, runs perfectly through Proton
If you are using the ubuntu-post-install framework:
**Migrating to another machine:**
```bash
# Back up the Wine prefix — EA credentials travel with it
tar -czf swbf2-prefix-backup.tar.gz \
/home/retro/.steam/steam/steamapps/compatdata/1237950/
```
Tokens last weeks to months before requiring re-login.
---
## Why docker exec can't run Wine/Proton
`docker exec` carries high Linux capabilities (`CapEff ≈ 0xa8ac35fb`).
Steam processes run with `CapEff=0`. When a high-cap process tries to run bwrap
(Steam's sniper/pressure-vessel sandbox), bwrap tries a privileged uid-map path:
```
setting up uid map: Permission denied
cd ~/docker/wolf
./manage.sh setup-swbf2
```
**Only Steam itself can launch programs through sniper+GE-Proton.** All Wine
operations must go through Steam's launch chain — hence the wrapper approach.
Run this after completing step 1 below. The script handles steps 26
automatically.
---
### Manual steps
## How it works
#### 1. Trigger Wine prefix creation
Steam passes a `link2ea://` URL as the "game executable" to GE-Proton. The wrapper
intercepts this, imports registry fixes, then passes the original URL through.
GE-Proton's `steam.exe` handles `link2ea://`, finds `Link2EA.exe` via the registry,
runs it, and EA Desktop authenticates the session before launching the game.
Launch SWBF2 from Moonlight. Wait approximately 10 seconds. You will see an
"Origin is not installed" error — this is expected. Close it and return to
the terminal.
```
Steam → wrapper → regedit (registry fixes) → exec original args
→ GE-Proton steam.exe → link2ea:// → Link2EA.exe → EA Desktop → SWBF2
```
Verify the MSI appeared in the Wine prefix:
---
## Step-by-step
### 1. Trigger Wine prefix creation
SWBF2 must be launched at least once so Steam creates the Wine prefix and drops
`ea_app.msi` into it. Launch SWBF2 from Moonlight, wait ~10 seconds, then close it
(the "Origin is not installed" error is expected at this point).
Verify the MSI appeared:
```bash
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep Wolf)
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep WolfSteam | head -1)
docker exec "$WOLF_CONTAINER" ls -lh \
/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
```
Expected: ~227 MB file.
### 2. Extract EA Desktop files on the host
Expected: approximately 227 MB.
The MSI's `JunoConfigureRegistry` .NET custom action fails in Wine (it uses
`SetSecurityDescriptorSddlForm` for registry ACLs — unsupported in Wine). This
causes the entire install to roll back. Extract files on the host instead:
#### 2. Extract EA Desktop files on the host
```bash
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep Wolf)
WOLF_CONTAINER=$(docker ps --format '{{.Names}}' | grep WolfSteam | head -1)
docker cp "$WOLF_CONTAINER:/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi" \
docker cp \
"$WOLF_CONTAINER:/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi" \
/tmp/ea_app.msi
sudo apt-get install -y msitools
mkdir -p /tmp/ea_app_extracted
msiextract -C /tmp/ea_app_extracted /tmp/ea_app.msi
```
### 3. Copy EA Desktop files into the Wine prefix
The MSI installs EA Desktop under a versioned directory with a symlink.
The version (e.g. `14.2.0.3345`) is whatever the extracted MSI contains:
#### 3. Copy EA Desktop files into the Wine prefix
```bash
EA_VERSION=$(ls /tmp/ea_app_extracted/Electronic\ Arts/EA\ Desktop/ | head -1)
# Usually "EA Desktop" — this is the versioned dir, renamed during real install
# Use the version from the failed-install symlink if present:
SYMLINK_TARGET=$(docker exec "$WOLF_CONTAINER" readlink \
"/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/Program Files/Electronic Arts/EA Desktop/EA Desktop" \
2>/dev/null || echo "14.2.0.3345")
@@ -131,16 +115,14 @@ docker cp "/tmp/ea_app_extracted/Electronic Arts/EA Desktop/EA Desktop/." \
docker exec "$WOLF_CONTAINER" find "$PFXBASE" -name "Link2EA.exe"
```
### 4. Write registry fix files to drive_c
#### 4. Write registry fix files to drive_c
These are imported into the Wine registry on each launch via the wrapper.
Writing to drive_c ensures they survive wineserver restarts (unlike direct
system.reg edits which get overwritten).
These files are imported into the Wine registry on every launch by the wrapper
script. Storing them in drive_c ensures they survive wineserver restarts.
```bash
PFXC="$WOLF_CONTAINER:/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c"
# link2ea:// protocol handler — tells Wine how to run Link2EA.exe
cat > /tmp/link2ea_fix.reg << 'EOF'
Windows Registry Editor Version 5.00
@@ -152,8 +134,6 @@ Windows Registry Editor Version 5.00
@="\"C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\Link2EA.exe\" \"%1\""
EOF
# EA Desktop Windows services — EALocalHostSvc provides local IPC that
# Link2EA.exe needs; without it launch fails with RPC_S_SERVER_UNAVAILABLE
cat > /tmp/ea_services.reg << 'EOF'
Windows Registry Editor Version 5.00
@@ -178,127 +158,283 @@ docker cp /tmp/link2ea_fix.reg "$PFXC/link2ea_fix.reg"
docker cp /tmp/ea_services.reg "$PFXC/ea_services.reg"
```
### 5. Lock localconfig.vdf and set launch options
Steam overwrites localconfig.vdf on shutdown via atomic rename (temp file +
rename). `chmod 444` on the file is bypassed. Lock the **directory** instead:
```bash
STEAM_UID=$(docker exec "$WOLF_CONTAINER" ls /home/retro/.steam/steam/userdata/)
CONFIG_DIR="/home/retro/.steam/steam/userdata/$STEAM_UID/config"
CONFIG_FILE="$CONFIG_DIR/localconfig.vdf"
# Stop Steam so it flushes before we edit
docker exec "$WOLF_CONTAINER" pkill -f steam.sh || true
sleep 5
# Lock directory
docker exec "$WOLF_CONTAINER" chmod 555 "$CONFIG_DIR"
# Add launch options for AppID 1237950
# Find the 1237950 block and insert/replace LaunchOptions
docker exec "$WOLF_CONTAINER" python3 - "$CONFIG_FILE" << 'PYEOF'
import sys, re
path = sys.argv[1]
with open(path, 'r') as f:
content = f.read()
launch_opt = 'STEAM_UNIX_SOCKET=/tmp/steam.sock /home/retro/ea_install.sh %command%'
# Replace existing LaunchOptions in 1237950 block if present
new = re.sub(
r'("1237950".*?"LaunchOptions"\s*)"[^"]*"',
rf'\1"{launch_opt}"',
content, flags=re.DOTALL
)
if new == content:
# LaunchOptions key missing — add it after the "1237950" line
new = re.sub(
r'("1237950"\s*\n\s*\{)',
rf'\1\n\t\t\t\t"LaunchOptions"\t\t"{launch_opt}"',
content
)
with open(path, 'w') as f:
f.write(new)
print("Done")
PYEOF
# Verify
docker exec "$WOLF_CONTAINER" grep -A3 '"1237950"' "$CONFIG_FILE" | grep -i launch
```
### 6. Write the wrapper script
#### 5. Write the launch wrapper
```bash
cat > /tmp/ea_install.sh << 'EOF'
#!/bin/bash
echo "=== launch $(date) ===" >> /tmp/ea_install.log
# Import registry fixes on every launch (survives wineserver restarts)
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\link2ea_fix.reg"
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\ea_services.reg"
# Pass original args through — Steam's link2ea:// URL goes to GE-Proton → Link2EA.exe
exec "$@"
EOF
chmod +x /tmp/ea_install.sh
docker cp /tmp/ea_install.sh "$WOLF_CONTAINER":/home/retro/ea_install.sh
```
### 7. First launch
#### 6. Set Steam launch options
Stop Steam so it flushes its current state before editing:
```bash
STEAM_UID=$(docker exec "$WOLF_CONTAINER" ls /home/retro/.steam/steam/userdata/)
CONFIG_DIR="/home/retro/.steam/steam/userdata/$STEAM_UID/config"
CONFIG_FILE="$CONFIG_DIR/localconfig.vdf"
docker exec "$WOLF_CONTAINER" pkill -f steam.sh || true
sleep 5
```
Edit localconfig.vdf to add the launch option for AppID 1237950:
```bash
docker exec "$WOLF_CONTAINER" python3 - "$CONFIG_FILE" << 'PYEOF'
import sys, re
path = sys.argv[1]
with open(path) as f:
content = f.read()
opt = 'STEAM_UNIX_SOCKET=/tmp/steam.sock /home/retro/ea_install.sh %command%'
new = re.sub(r'("1237950".*?"LaunchOptions"\s*)"[^"]*"', rf'\1"{opt}"', content, flags=re.DOTALL)
if new == content:
new = re.sub(r'("1237950"\s*\n\s*\{)', rf'\1\n\t\t\t\t"LaunchOptions"\t\t"{opt}"', content)
with open(path, 'w') as f:
f.write(new)
print("Done")
PYEOF
```
Lock the config directory so Steam cannot overwrite localconfig.vdf on shutdown:
```bash
docker exec "$WOLF_CONTAINER" chmod 555 "$CONFIG_DIR"
```
Verify:
```bash
docker exec "$WOLF_CONTAINER" grep -A3 '"1237950"' "$CONFIG_FILE" | grep -i launch
```
#### 7. Launch the game
1. Reconnect to Moonlight and launch SWBF2
2. **Let Vulkan shaders compile** — do not skip, takes several minutes, only happens once
3. EA App authenticates via your linked Steam/EA account (no manual login if accounts are linked)
2. Let Vulkan shaders compile — do not skip; takes several minutes on first run only
3. EA App authenticates via your linked Steam/EA account
4. Game loads
### Fresh install behaviour (Wolf)
| Component | Survives reinstall? | Notes |
|-----------|-------------------|-------|
| EA Desktop files in Wine prefix | No | Re-run setup after prefix is recreated |
| Registry fix files in drive_c | No | Re-run setup after prefix is recreated |
| Launch options in localconfig.vdf | No | Re-run setup after prefix is recreated |
| Config dir lock | No | Re-run setup after prefix is recreated |
| ea_app.msi | No | Requires one launch to reappear |
| EA account link | Yes | Stored on EA's servers |
| EA auth token | No | Requires one re-login after prefix deletion |
If the Wine prefix (`compatdata/1237950/`) is deleted, run the setup again from
step 1. To preserve credentials when moving to a new machine, back up the prefix:
```bash
tar -czf swbf2-prefix-backup.tar.gz \
/path/to/wolf-state/Steam/.steam/steam/steamapps/compatdata/1237950/
```
---
## Is this fragile? Will it work on a fresh install?
## Native Linux Steam
**Honest assessment:**
### Prerequisites (native)
| Component | Fresh install safe? | Notes |
|-----------|-------------------|-------|
| EA Desktop files in Wine prefix | ✅ | Extracted from MSI in game files |
| Registry fixes (.reg files) | ✅ | Imported on every launch via wrapper |
| Launch options in localconfig.vdf | ✅ | Set by script |
| Config dir lock (chmod 555) | ✅ | Set by script |
| ea_app.msi in drive_c | ⚠️ | Requires one failed launch first to appear |
| EA account link | ⚠️ | One-time manual step |
| Vulkan shader cache | ⚠️ | Recompiles on fresh prefix — takes minutes |
| EA token in Wine prefix | ⚠️ | Requires login if prefix deleted or token expired |
- GE-Proton installed via ProtonUp-Qt or manually into `~/.steam/compatibilitytools.d/`
- In Steam: SWBF2 → Properties → Compatibility → Force GE-Proton10-34
**The catch:** The Wine prefix (`compatdata/1237950/`) is recreated from scratch if deleted.
All file copies and registry entries live inside it. A fresh install needs all steps run again
— but the automation handles that.
### Automated setup
**The one irreducible manual step:** Linking your EA account to Steam (done once at ea.com,
persists across reinstalls via EA's servers).
```bash
chmod +x setup-swbf2-linux.sh
./setup-swbf2-linux.sh
```
Run after completing step 1 below.
### Manual steps
#### 1. Trigger Wine prefix creation
Launch SWBF2 from Steam. Wait approximately 10 seconds. You will see an
"Origin is not installed" error — this is expected. Close it.
Verify the MSI appeared:
```bash
ls -lh ~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
```
Expected: approximately 227 MB.
#### 2. Extract EA Desktop files
```bash
mkdir -p /tmp/ea_app_extracted
msiextract -C /tmp/ea_app_extracted \
~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi
```
#### 3. Copy EA Desktop files into the Wine prefix
```bash
PFX_C=~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c
EA_DEST_BASE="$PFX_C/Program Files/Electronic Arts/EA Desktop"
SYMLINK_TARGET=$(readlink "$EA_DEST_BASE/EA Desktop" 2>/dev/null || echo "14.2.0.3345")
mkdir -p "$EA_DEST_BASE/$SYMLINK_TARGET"
cp -r "/tmp/ea_app_extracted/Electronic Arts/EA Desktop/EA Desktop/." \
"$EA_DEST_BASE/$SYMLINK_TARGET/"
rm -f "$EA_DEST_BASE/EA Desktop"
ln -sf "$SYMLINK_TARGET" "$EA_DEST_BASE/EA Desktop"
# Verify
find "$EA_DEST_BASE" -name "Link2EA.exe"
```
#### 4. Write registry fix files to drive_c
```bash
PFX_C=~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c
cat > "$PFX_C/link2ea_fix.reg" << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea]
@="URL:link2ea Protocol"
"URL Protocol"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\link2ea\shell\open\command]
@="\"C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\Link2EA.exe\" \"%1\""
EOF
cat > "$PFX_C/ea_services.reg" << 'EOF'
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EALocalHostSvc]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EALocalHostSvc.exe"
"DisplayName"="EA Local Host Service"
"ObjectName"="LocalSystem"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EABackgroundService]
"Type"=dword:00000010
"Start"=dword:00000002
"ErrorControl"=dword:00000001
"ImagePath"="C:\\Program Files\\Electronic Arts\\EA Desktop\\EA Desktop\\EABackgroundService.exe"
"DisplayName"="EA Background Service"
"ObjectName"="LocalSystem"
EOF
```
#### 5. Write the launch wrapper
```bash
mkdir -p ~/.local/bin
cat > ~/.local/bin/ea_install.sh << 'EOF'
#!/bin/bash
echo "=== launch $(date) ===" >> /tmp/ea_install.log
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\link2ea_fix.reg"
"$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" regedit /S "C:\\ea_services.reg"
exec "$@"
EOF
chmod +x ~/.local/bin/ea_install.sh
```
#### 6. Set Steam launch options
In Steam: right-click SWBF2 → Properties → Launch Options, enter:
```
~/.local/bin/ea_install.sh %command%
```
Alternatively, set it from the terminal. Close Steam first, then:
```bash
STEAM_UID=$(ls ~/.steam/steam/userdata/ | head -1)
CFG=~/.steam/steam/userdata/$STEAM_UID/config/localconfig.vdf
python3 - "$CFG" << 'PYEOF'
import sys, re
path = sys.argv[1]
import os
opt = os.path.expanduser('~/.local/bin/ea_install.sh') + ' %command%'
with open(path) as f:
content = f.read()
new = re.sub(r'("1237950".*?"LaunchOptions"\s*)"[^"]*"', rf'\1"{opt}"', content, flags=re.DOTALL)
if new == content:
new = re.sub(r'("1237950"\s*\n\s*\{)', rf'\1\n\t\t\t\t"LaunchOptions"\t\t"{opt}"', content)
with open(path, 'w') as f:
f.write(new)
print("Done")
PYEOF
```
#### 7. Launch the game
1. Launch SWBF2 from Steam
2. Let Vulkan shaders compile on first run — do not skip
3. EA App authenticates via your linked Steam/EA account
4. Game loads
---
## Troubleshooting
### "Origin is not installed" popup
The game binary checks for Origin before calling link2ea://. This happens when:
- The wrapper didn't run (check launch options are set)
- The wrapper ran but regedit failed (check `tail /tmp/ea_install.log`)
### `link2ea://` fails with ret 31 (SE_ERR_NOASSOC)
`link2ea_fix.reg` wasn't imported. Check drive_c has the file and wrapper ran both regedits.
The wrapper did not run, or ran but regedit failed.
### RPC_S_SERVER_UNAVAILABLE (0x800706ba) in wine log
`ea_services.reg` wasn't imported or EALocalHostSvc failed to register. Check wrapper log.
- Verify launch options are set: Steam → SWBF2 → Properties → Launch Options
- Check the wrapper log:
```bash
tail /tmp/ea_install.log
```
### Game exits immediately, no popup, no log
Wrapper isn't being called. Config dir may not be chmod 555 or launch options missing.
### `link2ea://` fails — game exits silently after a moment
`link2ea_fix.reg` was not imported. Confirm `link2ea_fix.reg` exists in drive_c
and the wrapper ran both regedit commands.
### RPC_S_SERVER_UNAVAILABLE (0x800706ba) in Proton log
`ea_services.reg` was not imported or the service entries were not written
correctly. Check the wrapper log and confirm `ea_services.reg` exists in drive_c.
### Game exits immediately, no popup, no log entry
The wrapper is not being called at all.
**Wolf:**
```bash
docker exec "$WOLF_CONTAINER" stat "$CONFIG_DIR" | grep Access
docker exec "$WOLF_CONTAINER" grep -A5 '"1237950"' "$CONFIG_FILE" | grep -i launch
```
**Native:**
```bash
stat ~/.steam/steam/userdata/*/config | grep Access
grep -A5 '"1237950"' ~/.steam/steam/userdata/*/config/localconfig.vdf | grep -i launch
```
### Collecting logs after a failure
**Wolf:**
```bash
docker exec "$WOLF_CONTAINER" bash -c "
tail -20 /tmp/ea_install.log
@@ -307,18 +443,36 @@ docker exec "$WOLF_CONTAINER" bash -c "
"
```
**Native:**
```bash
tail /tmp/ea_install.log
grep -E '(err:|link2ea|origin|RPC)' ~/.steam/steam/logs/steam_1237950.log 2>/dev/null | tail -20
```
---
## Key paths (inside WolfSteam container)
## Key paths
### Wolf (inside WolfSteam container)
| Path | Description |
|------|-------------|
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/` | SWBF2 Wine prefix |
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/system.reg` | Wine HKLM registry |
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi` | EA App MSI (~227 MB) |
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/link2ea_fix.reg` | link2ea protocol handler reg |
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/link2ea_fix.reg` | link2ea protocol handler |
| `/home/retro/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_services.reg` | EA service registrations |
| `/home/retro/.steam/steam/steamapps/common/STAR WARS Battlefront II/` | Game files |
| `/home/retro/.steam/steam/userdata/<uid>/config/localconfig.vdf` | Steam launch options |
| `/home/retro/ea_install.sh` | Launch wrapper |
| `/tmp/ea_install.log` | Wrapper log (resets on container restart) |
### Native Linux Steam
| Path | Description |
|------|-------------|
| `~/.steam/steam/steamapps/compatdata/1237950/pfx/` | SWBF2 Wine prefix |
| `~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_app.msi` | EA App MSI (~227 MB) |
| `~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/link2ea_fix.reg` | link2ea protocol handler |
| `~/.steam/steam/steamapps/compatdata/1237950/pfx/drive_c/ea_services.reg` | EA service registrations |
| `~/.steam/steam/userdata/<uid>/config/localconfig.vdf` | Steam launch options |
| `~/.local/bin/ea_install.sh` | Launch wrapper |
| `/tmp/ea_install.log` | Wrapper log |