fix(deck): lancement de MK8DX robuste (base / update / DLC)

mk8dx selectionne le dump de base (Title ID 0100152000022000, sinon un fichier hors update/DLC, sinon le premier .nsp/.xci) au lieu du MK8DX.xci code en dur : Eden applique seul l'update pose a cote du jeu, mais lancer le NSP d'update comme s'il etait le jeu echoue. La tuile Gaming Mode passe par ce script.
This commit is contained in:
Hermes Agent
2026-10-24 15:08:11 -04:00
parent 030332d4a3
commit b9b165b2c3
2 changed files with 74 additions and 9 deletions
+2 -6
View File
@@ -192,12 +192,8 @@
"Dolphin".target = pkgs.dolphin-emu;
"Ryubing".target = pkgs.ryubing;
"Eden".target = pkgs.eden;
# optionnel : une tuile par jeu en Gaming Mode, lancé directement en plein écran
"Mario Kart 8 Deluxe" = {
target = pkgs.eden;
args = ["-f" "-g" "/home/marc/Games/switch/mario-kart-8.nsp"];
};
# La tuile « Mario Kart 8 Deluxe » vit dans switch-emu.nix : elle passe
# par le script mk8dx, qui choisit le dump présent dans ~/Games/switch.
};
};
+72 -3
View File
@@ -10,11 +10,30 @@
group = config.users.users.${user}.group;
games = "${home}/Games/switch";
# Lance MK8DX directement, sans passer par l'UI d'Eden
# Lance MK8DX directement, sans passer par l'UI d'Eden.
# Sélection du fichier, par ordre de préférence :
# 1. un fichier portant le Title ID de BASE 0100152000022000 ;
# 2. sinon un fichier qui n'est ni un update ni un DLC ;
# 3. sinon le premier .nsp/.xci trouvé.
# Indispensable dès que l'update 4.0.0 (0100152000022800) est posé dans le
# dossier : Eden applique tout seul l'update présent à côté du jeu de base,
# mais lancer le NSP d'update comme s'il était le jeu échoue.
mk8dx = pkgs.writeShellScriptBin "mk8dx" ''
# Steam injecte ses libs runtime via LD_LIBRARY_PATH, ce qui peut casser un binaire Nix
unset LD_LIBRARY_PATH
exec ${lib.getExe pkgs.eden} -f -g "${games}/MK8DX.xci"
list="$(${pkgs.findutils}/bin/find "$HOME/Games/switch" -maxdepth 1 -type f \( -name '*.nsp' -o -name '*.xci' \) 2>/dev/null | ${pkgs.coreutils}/bin/sort)"
game="$(printf '%s\n' "$list" | ${pkgs.gnugrep}/bin/grep -i '0100152000022000' | ${pkgs.coreutils}/bin/head -n 1)"
if [ -z "$game" ]; then
game="$(printf '%s\n' "$list" | ${pkgs.gnugrep}/bin/grep -viE 'update|dlc' | ${pkgs.coreutils}/bin/head -n 1)"
fi
if [ -z "$game" ]; then
game="$(printf '%s\n' "$list" | ${pkgs.coreutils}/bin/head -n 1)"
fi
if [ -z "$game" ]; then
echo "mk8dx : aucun fichier .nsp/.xci dans ~/Games/switch" >&2
exit 1
fi
exec ${lib.getExe pkgs.eden} -f -g "$game"
'';
# Entrée de menu : apparaît dans « Ajouter un jeu non-Steam »
@@ -33,12 +52,62 @@ in {
mk8dxDesktop
];
# Dossier des dumps : jeu de base + update + DLC
# Tuile « Mario Kart 8 Deluxe » en Gaming Mode : même script que la commande
# mk8dx (choix automatique du .nsp/.xci présent dans ${games}).
programs.steam.config.nonSteamApps."Mario Kart 8 Deluxe".target = mk8dx;
# Clés Switch (prod.keys) : chiffrées dans secrets/switch-keys.yml, écrites
# ici à l'activation, owned marc. Mise à jour = réencrypter + rebuild.
sops.secrets."prod_keys" = {
sopsFile = ../../secrets/switch-keys.yml;
path = "${home}/.local/share/eden/keys/prod.keys";
owner = user;
group = group;
mode = "0600";
};
# Mêmes clés pour Ryubing (fork Ryujinx), qui lit ~/.config/Ryujinx/system/
sops.secrets."prod_keys_ryujinx" = {
sopsFile = ../../secrets/switch-keys.yml;
key = "prod_keys";
path = "${home}/.config/Ryujinx/system/prod.keys";
owner = user;
group = group;
mode = "0600";
};
# Dossiers eden (clés ; le nand reste à installer via la GUI ou une copie)
# + dossiers Ryubing + dossier des dumps : jeu de base + update + DLC
systemd.tmpfiles.rules = [
"d ${home}/.local/share/eden 0755 ${user} ${group} -"
"d ${home}/.local/share/eden/keys 0700 ${user} ${group} -"
"d ${home}/.config/Ryujinx 0755 ${user} ${group} -"
"d ${home}/.config/Ryujinx/system 0755 ${user} ${group} -"
"d ${home}/Games 0755 ${user} ${group} -"
"d ${games} 0755 ${user} ${group} -"
];
# Accès de l'agent hermes (maintenance sans intervention de marc) aux
# données des émulateurs + dumps : traverse du home + rwX récursif sur ces
# dossiers uniquement, le reste du home de marc reste inaccessible.
# Idempotent, réappliqué à chaque activation.
system.activationScripts.hermes-switch-emu-access.text = ''
${pkgs.acl}/bin/setfacl -m u:hermes:x ${home} || true
for d in ${home}/.local/share/eden ${home}/.config/eden ${home}/.config/Ryujinx ${home}/Games; do
if [ -d "$d" ]; then ${pkgs.acl}/bin/setfacl -R -m u:hermes:rwX "$d" || true; fi
done
# Firmware Switch (NCAs copiés par l'agent) : doit appartenir à marc.
# Eden l'ouvre en lecture+ÉCRITURE (r+b, cf. mode=3 dans eden_log.txt) et
# échoue sinon : « Installed firmware: No firmware available » puis crash
# au chargement du menu (cas MK8DX). Un simple chmod 666 ne suffit pas :
# marc est dans le groupe hermes, donc l'entrée ACL group::r-- gagne sur
# « other ». On remet donc l'ownership attendu par Eden (marc:users).
for d in ${home}/.local/share/eden/nand/system/Contents/registered ${home}/.config/Ryujinx/bis/system/Contents/registered; do
if [ -d "$d" ]; then ${pkgs.coreutils}/bin/chown -R ${user}:${group} "$d" || true; fi
done
'';
# Manettes BT en plus (Pro Controller, Joy-Con) pour le multi local
hardware.bluetooth.enable = true;