Ou comment installer un jeu requiérant un lecteur CD-ROM (et CD-Audio) sur mon Steam Deck.

Pro-Pinball Timeshock! partie en cours
Contexte
J'ai ce jeu en version CD-ROM depuis… longtemps. Tellement longtemps que je ne m'en rappelle même plus. Probablement deux décennies minimum.

Pro Pinball Timeshock! Version fr publiée par Pointsoft, recto de la pochette cartonnée

Pro Pinball Timeshock! Version fr publiée par Pointsoft, le disque posé sur la pochette

Pro Pinball Timeshock! Version fr publiée par Pointsoft, verso de la pochette cartonnée
Il y a quelques années, j'avais dumpé le disque au format cue+bin. J'avais bien fait, parce que le CD-ROM n'est plus lisible (enfin, partiellement). Je vais donc utiliser cette image disque.
Note
Les pistes audio (musiques) du jeu sont au format CD-Audio.
Installation du jeu
Basculer en mode Bureau (KDE/Plasma) sur le Deck.
Installer Lutris (ou bootle, ou autre… peu importe), via Discovery (gestionnaire de paquets flatpak)
Et là, on arrive au truc le plus chiant : installer CDemu.
CDemu
CDemu est un émulateur de lecteur CD-ROM et DVD-ROM. Ce n'est pas simplement un alias sur la commande mount, mais un émulateur complet d'un contrôleur SCSI. Cela nécessite l'installation d'un module supplémentaire, VHBA (Virtual Host Bus Adapter).
Première étape : basculer le système en modification.
Note
Si ce n'est déjà fait, définir un mot de passe pour le compte deck. Ça ne sera pas détaillé ici (utiliser la commande passwd).
Donc, déverrouiller le système en écriture et préparer pacman (le gestionnaire de paquets pour ArchLinux, qui est la base de SteamOS 3).
On pourrait utiliser les commandes
sudo steamos-readonly disable pacman-key --init pacman-key --populate pacman -Syu
Ou bien passer par un script qui automatise tout ça. Le mien est disponible ici : https://gitlab.com/chibinah/scripts/-/tree/main/SteamDeck
Laisser tournel le script (il y a des dialogues et des notifications indiquant la progression de l'installation).

Exécution du script steamos-unlock-prepare-pacman.sh
Avis
Ne pas récupérer le script et l'exécuter tel-quel. Il correspond à mes besoins. Faire attention aux variables PACKAGES_TO_INSTALL (qui contient la liste des paquets à installer/réinstaller) et FILES_TO_REMOVE (qui supprime irrémédiablement des fichiers sur le système). Cela peut casser complètement SteamOS et la réinstallation (avec perte de données) est alors obligatoire. Oui, ça m'est arrivé.

Le script a terminé. La notification “Installation terminée” apparaît.
Ensuite, récupérer la version du noyau Linux utilisé.
uname -a

Commande uname -a dans un terminal sur le Deck
Ici, il s'agit de la version 6.11 (neptune-611). Notez bien cette valeur.
Vérifions quand même la présence du paquet des entêtes du noyau Linux correspondant à cette version.
pacman -Ss neptune-611

Les deux paquets linux-neptune-611 et linux-neptune-611-headers ont été trouvés dans le repo jupiter-main, de VALVe
Vérifions aussi si CDemu est présent dans les repos d'ArchLinux/SteamOS.

cdemu-client et cdemu-daemon ont été trouvés dans le repo extra-main
Pour installer le module VHBA, on va utiliser la version DKMS. C'est le plus simple. Mais cela nécessite les entêtes (headers) du noyau utilisé. C'est pour cela que l'on a d'abord vérifié s'ils étaient disponibles avant d'aller plus loin.
Du coup, on peut installer les entêtes, le module vhba et CDemu
sudo pacman -S cdemu-client vhba-module-dkms jupiter-main/linux-neptune-611-headers

Prêt à installer. Appuyer sur Entrée pour lancer l'installation.
Quelques instants plus tard (quelques milliers de millisecondes), c'est installé.

Installation faite sans erreur. Les Warning sont à ignorer ici.
Du coup, on peut tester
cdemu status
Et là, c'est le drame ! Une erreur apparaît.
Avis
ERREUR: Failed to acquire daemon interface version (this most likely means your daemon is out-of-date): g-dbus-error-quark: GDBus.Error:org.freedesktop.DBus.Error.NameHasNoOwner: Could not activate remote peer 'net.sf.cdemu.CDEmuDaemon': startup job failed (3)
Et oui, on a simplement installé le module VHBA. Il n'est pas chargé côté noyau. Remédions à ça.
sudo modprobe -a sg sr_mod vhba
On charge les modules sg, sr_mod et vhba.
On peut tester à nouveau.
cdemu status

Premier test de cdemu, échec en rouge. Chargement des modules, test à nouveau et cette fois, c'est bon, pas d'erreur
CDemu a préparé un lecteur (0), sans disque.
On peut alors charger l'image cue+bin du jeu.
L'image disque étant sur la micro SD, dans le répertoire jeux, Timeshock, il suffit de s'y déplacer
cd /run/media/mmcblk0p1/jeux/Timeshock/
Puis charger l'image disque (le fichier cue, pas le fichier bin)
cdemu load 0 Timeshock.cue

L'image est chargée, KDE indique également qu'il a détecté qu'un CD-ROM a été inséré dans le lecteur
Cliquer sur “Mount and Open”.

Dolphin se lance automatiquement, et affiche le contenu du CD
Installation du jeu (pour de vrai cette fois)
Le reste, c'est du clicodrôme.
Lancer Lutris, cliquer sur le petit symbole Plus (+) en haut à gauche.

Ajouter des jeux à Lutris
Cliquer sur “Rechercher les installateurs sur le site de Lutris”.
Saisir le nom du jeu, ici timeshock.

Résultat de la recherche du jeu. Trouvé
Le jeu a été trouvé. Il suffit ensuite de suivre le reste de l'installateur.
On a la version Windows, on prend donc la version wine CD.

Choix entre la version PC Windows (wine CD) et la version PlayStation

Sélection du répertoire d'installation. Ici, sur la micro SD.
Note
Ayant déjà installé le jeu, ici, il sera installé dans le répertoire “/run/media/mmcblk0p1/jeux/pro-pinball-timeshock-2”.
Cliquer ensuite sur “Continuer”.
Laisser Lutris faire les préparatifs. Cela prend un moment.
Ensuite, Lutris demande d'insérer le disque ou de sélectionner le point de montage.

Insérez ou montez le disque de jeu et cliquer sur Auto-détecter ou utilisez Parcourir si le disque est monté sur un emplacement non standard
On clique sur “Parcourir…”
la fenêtre de sélection du répertoire apparaît.
Là, c'est simple, il suffit de cliquer sur Timeshock! à gauche, sous “Removable Devices”. Cela sélectionne automatiquement le bon chemin vers le lecteur.

Sélecteur de répertoire. Clic sur le disque à gauche, ça a rempli automagiquement le chemin du point de montage.
Cliquer sur le bouton “OK”, et le programme d'installation se lance. Typiquement Install Wizard des années 90.

Programme d'installation, sélection de la langue
Le reste, c'est du Suite, Suite, Suite, Fin.



Concernant la taille du jeu, en réalité, peu importe. Je sélectionne “Très grande” juste par habitude. Je pourrais sélectionner “Petite”, mais cela nécessiterait de monter l'image disque avant de lancer le jeu (c'est le cas pour Pro-Pinball The Web, où les fichiers restent sur le CD-ROM, seul l'exécutable est installé).



Note
À la question “Veux-tu que DirectX3b soit installé sur ton système?”, répondre “Non, je l'ai déjà”.

Installation terminée
Le jeu se lance.
Là, deux possibilités, soit le jeu se lance sans erreur (tant mieux), soit le jeu sort l'erreur “Unable to set mode (640x480 non-flip)”.

Dans le premier cas, quitter le jeu. Dans le second cas, cliquer sur "OK".

Installation terminée.
Cliquer sur le bouton “Fermer”.
Sélectionner le jeu, puis, au lieu de cliquer sur “Jouer”, cliquer sur le petit triangle à côté de Jouer pour afficher le menu. Cliquer sur Configurer.

Menu dans Lutris
Aller dans l'onglet “Options du jeu”. Vérifier que l'architecture du préfixe est bien sur 32 bits (ça devrait l'être).

Onglet Options du jeu
Aller ensuite dans l'onglet “Options de l'exécuteur”, et cocher “Activer dgvoodoo2”

dgvoodoo2 n'est pas activé.
Cliquer sur le bouton “Sauvegarder”.
Lancer le jeu en cliquant sur le bouton “Jouer”.

Le jeu a démarré, la musique est présente

Le jeu est installé et est fonctionnel.
Intégration avec Steam
Jouer au jeu en mode Bureau, ok, c'est super, mais passer par le terminal, à chaque fois pour charger l'image disque, c'est pénible. Ça serait bien si on avait le jeu, jouable directement depuis le mode jeu dans SteamOS, où la seule action à faire, c'est d'appuyer sur “Jouer”.
D'abord : fermer Steam (il ne doit pas être en cours d'exécution).
Dans Lutris, sélectionner le jeu, cliquer sur le petit triangle à côté de “Jouer” pour afficher le menu, et cliquer sur “Create Steam shortcut”.

Menu. L'entrée Create Steam shortcut est visible.
Relancer Steam. Le jeu Pro-Pinball Timeshock! a été ajouté.

Steam. Le jeu a été ajouté.
Pour personnaliser la bannière et l'icône du jeu, faire un clic droit sur le fond, puis “Définir un arrière plan personnalisé” et “Définir un logo personnalisé”.

Cliquer sur la roue dentée, puis cliquer sur “Propriétés”.

Menu pour le jeu dans Steam

Propriétés du jeu, onglet “Raccourci”
Lutris a ajouté une entrée, cible flatpak et options de lancement lutris, etc.
Noter bien les informations de lancement. Ici :
run net.lutris.Lutris lutris:rungameid/13
Ouvrir Dolphin (gestionnaire de fichiers), aller dans le répertoire contenant l'image disque du jeu.
Faire un clic droit, “Create new”, "Fichier texte…".

Nommer le fichier “run.sh” (en fait, peu importe le nom).

Sur ce fichier, clic droit, “Open with Kate”.

Menu contextuel, Ouvrir avec Kate

Éditeur de fichier texte Kate, avec le contenu du script affiché
À l'intérieur du fichier, coller ce contenu :
#!/bin/sh cd /run/media/mmcblk0p1/jeux/Timeshock/ udisksctl unmount -b /dev/sr0 sleep 2 cdemu unload 0 sleep 2 cdemu load 0 Timeshock.cue flatpak run net.lutris.Lutris lutris:rungameid/13
Remplacer “/run/media/mmcblk0p1/jeux/Timeshock/” par le répertoire contenant l'image disque (copier-coller l'adresse depuis la barre d'adresse de Dolphin), et “rungameid/13” par la valeur indiquée dans les options de lancement de Steam (ça change d'un jeu à l'autre, c'est pas forcément 13).
Enregistrer et fermer.
Note
J'ai eu quelques soucis avec Pro-Pinball The Web, parce que les données du jeu restent sur le CD. Du coup, il me fallait monter l'image via udisksctl en plus de charger l'image disque avec CDemu. Ce qui explique pourquoi je démonte l'image disque avec udisksctl unmount, puis une pause de 2 secondes pour être sûr que l'image est démontée, avant d'éjecter le disque, puis de nouveau pause de 2 secondes, avant de charger l'image disque et lancer le jeu via lutris. Sans ces pauses de 2 secondes, l'image ne montait pas ou le disque ne chargeait pas. Avec ces temporisations, ça fonctionne, mais au prix d'un temps de lancement plus élevé.
Pour Timeshock!, comme j'ai fait l'installation complète du jeu, pas besoin de monter l'image via udisksctl, il faut juste que le disque soit présent dans le lecteur virtuel.
Faire de nouveau un clic droit sur le fichier “run.sh”, puis “Properties”.

Menu contextuel
Aller dans l'onglet “Permissions”, et cocher la petite case “Allow executing file as program”.

Propriétés du fichier, onglet Permissions
C'est bon, on a presque terminé.
Copier le chemin depuis la barre d'adresse de Dolphin (déjà fait plus haut pour récupérer le chemin pour le script)

Chemin sélectionné dans la barre d'adresse de Dolphin
Revenir dans Steam, et modifier les informations dans l'onglet “Raccourci” comme suit :
- Cible : /run/media/mmcblk0p1/jeux/Timeshock/run.sh
- Début dans : /run/media/mmcblk0p1/jeux/Timeshock/
- Options de lancement : (tout effacer)
Remplacer les chemins par ceux copiés depuis Dolphin.

Propriétés modifiées dans l'onglet “Raccourci”
Le but de l'opération : au lieu de Steam lance flatpak et lutris directement, on veut que Steam lance le jeu via le script run.sh
Sans ce script, au redémarrage du Steam Deck, l'image disque du jeu ne sera pas chargée et le message “Plase insert "Timeshock! CD drive and try again" apparaît”.

Message d'erreur du jeu, demandant à ce que le CD soit inséré
Fermer la fenêtre “Propriétés”.
Pour vérifier si le script fonctionne réellement, dans le terminal, taper :
cdemu unload 0

Terminal, avec la commande d'éjection du disque
Vérifier dans Disques & périphériques (via la flèche à gauche de l'horloge) que le disque du jeu n'apparaisse plus.

Disques & périphériques, pas de CD visible
Dans Steam, cliquer sur le bouton “Jouer”.

Steam, Pro Pinball Timeshock, avec la bannière et l'icône définies
Patienter quelques instants, et les logos du jeu s'affichent ensuite.




Le jeu fonctionne (penser à redéfinir les contrôles avant de lancer une partie).
Conclusion
Ça m'avais pris un peu de temps pour réunir toutes les informations pour pouvoir installer ce jeu avec l'émulation complète du lecteur CD.
J'aurais pu ne pas me prendre la tête et soit acheter le jeu sur GoG, soit acheter la version remastérisée du jeu sur Steam, soit utiliser un patch No-CD.
On peut théoriquement utiliser cette méthode avec n'importe quel jeu requiérant le CD-ROM, exceptés ceux “protégés” par les malwares (tels que définis par Microsoft, parce que le pilote Macrovision utilisé par les solutions DRM est complement troué) (Rovi) SafeDisk et (Sony DADC) SecuROM.
https://www.rockpapershotgun.com/windows-10-safedisc-securom-drm
Note
La réinstallation de CDemu est à faire systématiquement, quand SteamOS est mis à jour. Le système ne conserve pas les modifications réalisées dans la partition SteamOS.
Les différents scripts que j'utilise sur mon Steam Deck sont disponibles ici : https://gitlab.com/chibinah/scripts/-/tree/main/SteamDeck
J'ai ajouté “install-cdemu.sh” et le “run.sh” expliqué plus haut.