Des geekeries, de la MAO, de tout et de rien…
Je suis
Charlie

Duke Nukem 3D, EDuke 32, Steam et GNU/Linux

Icône auteur nah, Icône canondrier 14 décembre 2014, Icône commentaire
Mots clés Icône catégorie Jeux, linux, Steam, GNU/Linux, MIDI, classé dans Icône catégorie 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

Écran titre du jeu Duke Nukem 3D, en version haute définition.
Admirez l'écran titre.

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 ».
    Capture d'écran du jeu sous Dosbox.
    Le jeu sous Dosbox, en 640×400.
  • 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
    Capture d'écran du jeu via EDuke32.
    Le jeu sous EDuke32, en 1920×1200.

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.

Une capture d'écran du jeu Duke Nukem 3D, montrant l'un des ennemis, un genre de sanglier humanoïde aux yeux rouges, avec un fusil à pompe et une tenue de policier américain.
Comme il est joli ce FLI… ce L.A.R.D.

Une capture d'écran du jeu Duke Nukem 3D, montrant plusieurs des ennemis précédemment désignés, abattus par Duke lui-même.
Je cite Johnny BAbrioli : « Je t'avais dit Crève, sale alien ! »

Une capture d'écran du jeu Duke Nukem 3D, montrant un extraterrestre de près.
Je ne sais pas ce que tu me veux, mais j'espère que tu ne va pas me faire un bisou.

Une capture d'écran du jeu Duke Nukem 3D, montrant Duke se regardant dans un miroir, un fusil à pompe à la main.
Damn… I'm looking good !