wolf: auto-fetch Dolphin's Sys folder, drop AntiMicroX, favor RetroArch core for GC/Wii
Confirmed live: the Dolphin libretro core needs its own 'Sys' folder (compatibility DB + IPL data) to boot Wii titles, previously only obtainable through a manual trip through RetroArch's Online Updater -> Core System Files Downloader. ./manage.sh cores now fetches it automatically (a sparse/shallow git checkout of dolphin-emu/dolphin's Data/Sys) right after the core itself downloads, so a fresh install needs no GUI step to get GameCube/Wii working. Also documents the one Dolphin quirk that isn't installer-fixable: a "This data is corrupted, delete and create a new one?" dialog with a greyed-out OK button on a specific title (confirmed live with Mario Kart Wii's own rksys.dat) is that game's own save data getting stuck, not a setup defect — the fix is deleting that one file, which the README now walks through directly instead of leaving it as a mystery. Removes the AntiMicroX controller-combo plumbing entirely: RetroArch's own universal hotkey binds already cover this for any core-based system (GameCube/Wii and PS2 both now go through RetroArch's own cores rather than standalone AppImages by default), and AntiMicroX grabbing the controller device exclusively caused real problems (a stuck "controller connected" screen) without enough benefit over RetroArch's native binds to justify keeping it. Reframes the GC/Wii/PS2 docs: RetroArch's cores are now the recommended path (point ES-DE's Alternative Emulators at RetroArch instead of "Dolphin (Standalone)"), with the standalone AppImages kept as a fallback and as the only option for 3DS (Azahar has no libretro core at all). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VLX1yYKJExGSXmgUhxKQG6
This commit is contained in:
+73
-119
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user