Merge pull request #413 from outis1one/claude/wolf-pair-port-conflict-7nz8qg

wolf: auto-fetch Dolphin's Sys folder, drop AntiMicroX, favor RetroAr…
This commit is contained in:
Outis
2026-09-01 15:25:41 -04:00
committed by GitHub
+73 -119
View File
@@ -316,13 +316,11 @@ EOF
echo " - Write $WOLF_DIR/docker-compose.yml and $WOLF_DIR/manage.sh"
echo " - Open Moonlight UFW ports: TCP ${WOLF_PORTS_TCP[*]} / UDP ${WOLF_PORTS_UDP[*]}"
echo " - Start Wolf and inject Steam + EmulationStation app profiles"
echo " - Create bios/ + retroarch/{cores,shaders,overlays}/ on the game drive and pre-download RetroArch cores (~1.5 GB)"
echo " - Create bios/ + retroarch/{cores,shaders,overlays}/ on the game drive, pre-download RetroArch"
echo " cores (~1.5 GB), and fetch Dolphin's Sys folder so GC/Wii boot clean on first run"
echo " - Offer to auto-download standalone emulator AppImages into emulators/:"
echo " Azahar (3DS), PCSX2 (PS2), Dolphin (GameCube/Wii — unofficial community build,"
echo " symlinked to Dolphin_Emulator.AppImage so ES-DE's own find-rules can see it)"
echo " - Offer to set up AntiMicroX (universal controller-combo hotkey, experimental —"
echo " downloads it and wires a Sway launch hook; the button mapping itself is"
echo " built later through AntiMicroX's own GUI)"
return 0
fi
@@ -907,84 +905,6 @@ UDEV
log_success "Linked $_EMU_DIR/Dolphin_Emulator.AppImage -> $(basename "$_DOLPHIN_REAL") (the filename ES-DE's own find-rules require)"
fi
# ── Optional: AntiMicroX for a universal controller-combo hotkey ─────────
# RetroArch's own hotkeys (Settings -> Input -> Input Hotkey Binds) are
# global across every libretro core, but Dolphin/PCSX2/Azahar each run as
# standalone apps ES-DE launches directly and none of the three support
# gamepad-bound hotkeys natively (confirmed open feature requests:
# PCSX2/pcsx2#1082, azahar-emu/azahar#722; Dolphin's hotkeys are
# hardcoded to keyboard only). AntiMicroX bridges this by watching the
# real controller device (Wolf's virtual gamepad is a genuine uinput
# device — see games-on-whales/wolf's own docs on "inputtino" — so this
# is a real input device AntiMicroX can open, not a proprietary channel)
# and injecting whatever keyboard shortcut each app actually expects.
#
# GoW's own stock Sway config (/cfg/sway/config, baked into the esde and
# retroarch images — same one both apps' `launcher()` call copies) has a
# deliberate extension point at its very first line:
# include /home/retro/.config/sway/custom-cfg
# Since /home/retro/.config is already our own retro-home mount (see the
# esde/retroarch CATALOG mounts above), just writing a file to
# $GAME_STORAGE_DIR/retro-home/sway/custom-cfg on the host lands exactly
# there in the container, for both apps, with zero changes to GoW's own
# image or scripts needed.
#
# This only wires up the plumbing (download AntiMicroX, launch it
# visibly as a floating window every session). The actual button
# mapping — including AntiMicroX's own per-application "Auto Profile"
# switching (Options -> Settings -> Auto Profile in its GUI) needed to
# send a different key to each emulator from the same physical combo —
# has to be built once through AntiMicroX's own GUI while it's running;
# hand-authoring its .gamecontroller.amgp profile XML blind isn't
# something to guess at. Whatever gets saved there persists automatically
# (same retro-home mount), so it's a one-time setup.
local _AMX_DIR="$GAME_STORAGE_DIR/retro-home/antimicrox"
local _SWAY_CFG_DIR="$GAME_STORAGE_DIR/retro-home/sway"
mkdir -p "$_AMX_DIR" "$_SWAY_CFG_DIR"
echo ""
log_info "AntiMicroX lets you map one controller combo (e.g. Select+Start) to a"
log_info "different real keyboard shortcut per emulator — RetroArch's own hotkeys"
log_info "already cover every RetroArch-driven system; this is for Dolphin/PCSX2/"
log_info "Azahar, none of which support gamepad hotkeys natively. EXPERIMENTAL:"
log_info "the actual button mapping has to be built once through its own GUI."
local _GET_AMX=""
prompt_yn "Set up AntiMicroX for a universal controller hotkey? (y/n):" "n" _GET_AMX
if [[ "$_GET_AMX" =~ ^[Yy]$ ]]; then
# Real release asset is "AntiMicroX-x86_64.AppImage" (capitalized) —
# confirmed against the actual GitHub release, not assumed. A plain
# lowercase glob (like Azahar's/PCSX2's, which really are lowercase)
# would silently never match this one, on both the helper's own
# already-downloaded check and the lookup below.
_wolf_download_emulator_appimage \
"AntiMicroX" "AntiMicroX/antimicrox" "[Aa]nti[Mm]icro[Xx]*.AppImage" "$_AMX_DIR"
local _AMX_APP
_AMX_APP=$(ls "$_AMX_DIR"/[Aa]nti[Mm]icro[Xx]*.AppImage 2>/dev/null | head -1)
if [[ -n "$_AMX_APP" ]]; then
backup_if_exists "$_SWAY_CFG_DIR/custom-cfg"
cat > "$_SWAY_CFG_DIR/custom-cfg" << CFGEOF
# Written by services/wolf.sh — AntiMicroX: universal controller-combo hotkey.
# Launched as a normal floating window (not hidden) so its own GUI is
# reachable through the Moonlight stream for one-time profile setup —
# see ~/docker/wolf/README.md for how to build the actual button mapping.
#
# AntiMicroX is a Qt5/X11 app running under XWayland here, same as ES-DE and
# Steam in this same stock config (see their own [class="..."] rules above) —
# app_id only matches native Wayland clients and would never match this one.
# Matched on both class and title as a fallback in case the exact WM_CLASS
# AntiMicroX registers turns out to differ from what's assumed here.
for_window [class="(?i)antimicrox"] floating enable, resize set 480 360, move position 20 20
for_window [title="(?i)antimicrox"] floating enable, resize set 480 360, move position 20 20
exec /home/retro/.config/antimicrox/$(basename "$_AMX_APP") --appimage-extract-and-run &
CFGEOF
chown -R 1000:1000 "$_AMX_DIR" "$_SWAY_CFG_DIR" 2>/dev/null || true
log_success "AntiMicroX will launch (as a small floating window) alongside ES-DE/RetroArch."
log_info "First session: open its window, map your combo, save — it persists from then on."
else
log_warning "AntiMicroX download didn't produce a usable AppImage — skipping the Sway launch hook."
fi
fi
# ── App selection ─────────────────────────────────────────────────────────
echo ""
echo "═══════════════════════════════════════════════════════"
@@ -1771,6 +1691,32 @@ fuse scummvm"
echo "RetroArch cores: $ok downloaded, $skip already present, $fail failed"
echo " → $CORES_DIR"
[ "$fail" -gt 0 ] && echo " Retry failed cores: ./manage.sh cores $SCOPE force"
# The Dolphin core needs its own 'Sys' folder (compatibility DB + IPL
# data) to boot Wii titles at all — it's not part of the core .so/.info
# pair above, and the only documented way to get it is a manual trip
# through RetroArch's own Online Updater -> Core System Files
# Downloader (Dolphin.zip). It's just a static folder from Dolphin's
# own repo (Data/Sys), so fetch it here too instead of requiring that
# GUI step. Sparse+shallow checkout — the full repo is large, this
# folder isn't.
SYS_DIR="$GAME_DIR/retroarch/system/dolphin-emu/Sys"
if [ -f "$CORES_DIR/dolphin_libretro.so" ] && [ ! -d "$SYS_DIR" ]; then
echo "Fetching Dolphin's Sys folder (needed for GameCube/Wii to boot)..."
SYS_TMP=$(mktemp -d)
if git clone --depth 1 --filter=blob:none --sparse -q \
https://github.com/dolphin-emu/dolphin "$SYS_TMP" 2>/dev/null \
&& (cd "$SYS_TMP" && git sparse-checkout set Data/Sys -q 2>/dev/null) \
&& [ -d "$SYS_TMP/Data/Sys" ]; then
mkdir -p "$(dirname "$SYS_DIR")"
cp -r "$SYS_TMP/Data/Sys" "$SYS_DIR"
echo "Dolphin Sys folder installed → $SYS_DIR"
else
echo "Could not fetch Dolphin's Sys folder automatically."
echo " Get it via RetroArch's own Online Updater -> Core System Files Downloader -> Dolphin.zip"
fi
rm -rf "$SYS_TMP"
fi
;;
reorder)
# Interactively reorder the Moonlight tiles by reordering the
@@ -3282,10 +3228,50 @@ ES-DE is usable the moment you launch it; only ROMs and BIOS are yours to add.
- **Exit a game** back to ES-DE: Start+Select opens the RetroArch menu → Quit,
or use the Wolf hotkey START+UP+RB (Ctrl+Alt+Shift+W on a keyboard).
## Standalone emulators (3DS / PS2 / GameCube+Wii)
RetroArch's own libretro cores handle these systems poorly or not at all
(Dolphin's libretro core in particular is unstable for Wii), so ES-DE hands
them off to standalone AppImages instead:
## GameCube / Wii / PS2 — prefer RetroArch's own cores over standalone
RetroArch's libretro cores (Dolphin for GameCube/Wii, PCSX2 for PS2) are
downloaded automatically along with the rest of the RetroArch core set
(\`./manage.sh cores\`) and use RetroArch's own universal hotkey binds
(Settings -> Input -> Input Hotkey Binds) — one combo for exit/save-state/
volume/etc. that works the same across every RetroArch-driven system, no
extra tooling needed. **Point ES-DE's GameCube and Wii systems at this
instead of "Dolphin (Standalone)"**: Main Menu -> Other Settings ->
Alternative Emulators -> GameCube / Wii (two separate entries) -> pick the
RetroArch/core-based option. Same config either way — ES-DE's embedded
RetroArch and the standalone RetroArch app (if you added it) share the
same \`retroarch/\` cores/saves/system directories.
The Dolphin core's \`Sys\` folder (compatibility DB + IPL data it needs to
boot Wii titles at all) is fetched automatically now, right after the core
itself downloads — no more manual trip through RetroArch's own Online
Updater -> Core System Files Downloader.
**If a Wii game shows "This file cannot be used because the data is
corrupted. Delete the file and create a new one?" with the OK button
greyed out** — confirmed live: this isn't a Sys-folder or permissions
problem, and isn't something a fresh install can prevent outright (it's
Dolphin's own generated per-game save data getting stuck mid-write, not a
setup defect) — it's that specific game's own save file wedged in a bad
state. For Mario Kart Wii specifically, delete just its \`rksys.dat\`
(license/ghost/friend-roster data, not your NAND or game files) and let
Dolphin regenerate it fresh:
\`\`\`bash
GAME_DIR=\$(grep '^GAME_STORAGE_DIR=' $WOLF_DIR/.env | cut -d= -f2-)
rm "\$GAME_DIR/retroarch/saves/dolphin-emu/User/Wii/title/00010004/524d4345/data/rksys.dat"
\`\`\`
Other Wii titles hit the same class of issue under their own title ID —
\`find "\$GAME_DIR/retroarch/saves/dolphin-emu/User/Wii/title" -maxdepth 2\`
lists them; delete the specific stuck file inside that title's \`data/\`
folder, not the whole \`Wii/\` tree.
3DS has no viable RetroArch/libretro path at all (Azahar/Citra never
shipped a libretro core), so the standalone AppImage below stays the only
option there. PS2's libretro core is much newer/less mature than Dolphin's
— worth trying the same way, but expect rougher edges.
## Standalone emulators (3DS required; PS2 / GameCube+Wii as a fallback)
ES-DE also hands these off to standalone AppImages, for 3DS (the only
option) or as an alternative to the RetroArch cores above:
- **Azahar** (3DS, open-source Citra fork) — official releases
- **PCSX2** (PS2) — official releases
@@ -3309,38 +3295,6 @@ auto-detected. Missing ones get offered again on a fresh install
(\`sudo ./setup.sh wolf\`); to grab just one by hand, download its AppImage
into \`emulators/\`, \`chmod +x\` it.
## AntiMicroX — universal controller-combo hotkey (experimental)
RetroArch's own hotkeys (Settings -> Input -> Input Hotkey Binds) already
cover every RetroArch-driven system, but Dolphin/PCSX2/Azahar don't support
gamepad-bound hotkeys natively — AntiMicroX watches the controller directly
and injects whatever keyboard shortcut each app actually expects, so one
physical combo (e.g. hold Select, press Start) can mean "exit" — or save
state, or anything else — everywhere.
If you said yes to the AntiMicroX prompt during install, it launches
automatically as a small floating window every time ES-DE or RetroArch
starts. **Building the actual mapping is a one-time step, done through its
own GUI, not something this installer can pre-configure:**
1. Start ES-DE (or RetroArch) from Moonlight as normal — AntiMicroX's small
window appears floating in the corner alongside it.
2. In AntiMicroX: set up your controller under its device list, then create
a profile — click a button in its UI, press the real combo on your
gamepad, assign it the keyboard key the target emulator expects for that
action (see each emulator's own Settings -> Input/Hotkeys for its actual
bindings — Dolphin/PCSX2 defaults are commonly F1-F4-range keys).
3. For a **different translation per emulator** from the same physical
combo, use AntiMicroX's own **Options -> Settings -> Auto Profile** —
add a rule per application (matched by window class/title) so e.g.
Select+Start sends Esc when Dolphin has focus but F4 when RetroArch does.
4. Save. It's written under \`~/.config/antimicrox/\` inside the container,
which is the same \`retro-home/\` mount everything else here persists
through — it'll auto-load on every future session with no further setup.
To change the mapping later, just reopen AntiMicroX the same way. To remove
it entirely, delete \`retro-home/sway/custom-cfg\` and \`retro-home/antimicrox/\`
on the host and re-run \`sudo ./setup.sh wolf\`.
## Troubleshooting: app exits immediately ("Permission denied")
If a launcher (Steam, etc.) closes the moment it opens, its Wolf-managed home
dir has root-owned files the in-container user (uid 1000) can't write. Fix:
@@ -3370,7 +3324,7 @@ MD
bash "$WOLF_DIR/manage.sh" cores all \
|| log_warning "Some cores failed — retry later with: cd $WOLF_DIR && ./manage.sh cores"
chown -R "$ACTUAL_USER:$ACTUAL_USER" "$GAME_STORAGE_DIR/retroarch" 2>/dev/null || true
log_success "RetroArch cores ready — retro games launch on first run"
log_success "RetroArch cores ready — retro games (including GameCube/Wii via the Dolphin core) launch on first run"
else
log_info "Skipped — fetch later with: cd $WOLF_DIR && ./manage.sh cores"
fi