Duke Nukem 3D, EDuke 32, Steam et GNU/Linux
classé dans Linux, Jeux, MIDI
Cet article va parler de trois choses différentes mais liées :
- Duke Nukem 3D édition atomique
- EDuke32, et l'utilisation du Roland SC-55 pour jouer les musiques midi
- Le lancement de EDuke32 via Steam, sous GNU/Linux
Duke Nukem 3D édition atomique
Le moyen le plus simple pour avoir les fichiers de données du jeu, de manière « légale », c'est d'acheter Duke Nukem 3D, via GOG ou Steam.
Sachant que le moteur 3D est libre/open source, on n'aura pas besoin de l'exécutable fourni avec le jeu.
Pour profiter pleinement du jeu, deux possibilités :
- Soit la jouer old-school, et lancer le jeu via Dosbox (640×400 max, sensations de l'époque garantie). Tous les fichiers de l'édition MS-DOS sont présents dans le répertoire « classic » sous « gameroot ».
- Soit profiter de l'évolution technologique, et utiliser EDuke32 avec HRP (High Resolution Pack). Accessoirement, c'est le seul moyen de pouvoir y jouer dans des conditions « décentes », genre, en 1920x1200 :D
Ce pack contient :
- Les textures en haute résolution, ainsi que les modèles 3D (désactivables pour passer en mode sprites).
- Les musiques enregistrées depuis un expandeur Roland Sound Canvas SC-55.
- Optionnellement, un mode XXX (dont je tairai les détails, je vous laisse deviner ce que ça peut être. Le jeu passe en classé 18+ ou M for Mature).
EDuke32, et l'utilisation du Roland SC-55 pour jouer les musiques midi
Bon, les musiques enregistrées, c'est bien, mais moi, j'ai un SC-55 sous la main, branché en midi sur mon ordi, le tout sous GNU/Linux. Je fais comment ?
Via la ligne de commande, comme ça :
export EDUKE32_MUSIC_CMD="pmidi" export ALSA_OUTPUT_PORTS=$(aplaymidi -l | grep "USB Uno" | cut -f2 -d " ") /usr/games/eduke32
On exporte la variable d'environnement EDUKE32_MUSIC_CMD, pour dire au jeu qu'il faut passer par pmidi pour jouer les musiques.
Accessoirement, ALSA_OUTPUT_PORTS contient 24:0 ou 28:0, en fonction du port midi défini dans ALSA. Pour trouver facilement cette valeur, j'ai juste à énumérer tous les ports midi présents, et de filtrer pour trouver celui qui correspond à mon interface midi USB (donc, ici, "USB Uno").
Non, le port midi n'est pas le lieu où on va immatriculer une galère.
Reste à démarrer le jeu, et de profiter des musiques dans les meilleures conditions.
Le lancement de EDuke32 via Steam, sous GNU/Linux
Et pour le lancer via steam ?
Si vous êtes en 64 bits, il va y avoir un problème.
En effet, le jeu va tenter de démarrer, mais va se figer au démarrage, voire même, ne démarre pas du tout. Pourquoi ?
D'abord, espionnons un peu ce que fait steam, quand il démarre une appli (en gros, lançons le jeu via un script, et copions un printenv quelque part).
Voilà ce que j'ai obtenu :
SHELL=/bin/bash STEAM_RUNTIME=0 LD_PRELOAD=:/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so:/home/alex/.steam/ubuntu12_64/gameoverlayrenderer.so LD_LIBRARY_PATH=:/home/alex/.steam/ubuntu12_32:/home/alex/.steam/ubuntu12_64:/usr/local/games/:/usr/local/games//bin
Pas bon.
L'overlay est chargé en 32 et en 64 bits… donc, une chance sur deux que ça foire.
La variable d'environnement LD_LIBRARY_PATH, qui contient les chemins vers les libs (.so) est modifiée. Les libs sont celles fournies par Steam.
Si je lance le jeu avec ces variables d'environnement depuis une console, les messages d'erreurs sont carrément explicites.
ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored. ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored. ERROR: ld.so: object '/home/alex/.steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored. libGL error: failed to load driver: r600 libGL error: Try again with LIBGL_DEBUG=verbose for more details. libGL error: failed to load driver: swrast libGL error: Try again with LIBGL_DEBUG=verbose for more details. The program 'eduke32' received an X Window System error. This probably reflects a bug in the program. The error was 'BadValue (integer parameter out of range for operation)'. (Details: serial 30 error_code 2 request_code 156 minor_code 3) (Note to programmers: normally, X errors are reported asynchronously; that is, you will receive the error a while after causing it. To debug your program, run it with the --sync command line option to change this behavior. You can then get a meaningful backtrace from your debugger if you break on the gdk_x_error() function.)
Donc, il suffit d'écraser les variables modifiées par les bonnes valeurs, et le tour est joué.
J'en profite pour ajouter le support du midi, comme précisé plus haut.
Le script final, qui me permet de lancer le jeu via steam :
#!/bin/bash #Variables d'environnement pour jouer les musiques via pmidi, sur le SC-55 branché sur un M-Audio MIDI USB UNO export EDUKE32_MUSIC_CMD="pmidi" export ALSA_OUTPUT_PORTS=$(aplaymidi -l | grep "USB Uno" | cut -f2 -d " ") #Je remplace les chemins par les « bons » export LD_PRELOAD=:/home/alex/.steam/ubuntu12_64/gameoverlayrenderer.so export LD_LIBRARY_PATH=:/usr/lib/x86_64-linux-gnu/libfakeroot:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:/lib/i586-linux-gnu:/usr/lib/i586-linux-gnu:/usr/local/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/lib32:/usr/lib32 #Utilisé pour les mises au point. #printenv > /home/alex/env.txt #On initialise le SC-55 via un fichier midi contenant les sysex requis aplaymidi /usr/local/games/initSC.mid #On lance le jeu /usr/games/eduke32 #Réinitialisation du SC-55, pour couper toutes les notes (all notes off) aplaymidi /usr/local/games/initSC.mid
Pour finir, quelques images du jeu.