SDL-Controllermaps

Bild des Benutzers mitscherdinger

Kennt Ihr das?

Ihr habt einen Controller in der Hand, der wunderbar mit Supertuxkart und anderen OpenSource-Games funktioniert, aber bei Steam-Spielen entweder gar nicht funktioniert oder komische Sachen macht. Schuld daran sind meist fehlende SDL-Controllermaps. Dieser Artikel zeigt Euch, wie man Controllermaps erstellt und diese ins System einbindet. Ich nutze Debian (Testing) und dessen Paketverwaltung, Ubuntu-User sollten diese Anleitung nahezu 1:1 übernehmen können.

Die aktuelle SDL-Bibliothek hat eigentlich alle Werkzeuge an Bord, um Controllermaps zu erstellen. Dummerweise verharren die Programme dafür im test-Verzeichnis des Quellcodes - und werden deswegen nicht von den Distributoren gebaut und paketiert.

SDL-Sourcen runterladen

Ein einfaches

apt-get source libsdl2

läd den Quellcode in das aktuelle Verzeichnis herunter. Die *.debian.tar.xz-, *.dsc- und *.orig.tar.gz-Dateien werden nicht gebraucht und können gelöscht werden. Benötigt werden dagegen noch build-essential und libsdl2-dev, welche man sich als root mittels

apt-get install build-essential libsdl2-dev

aufs System holt(, sofern sie nicht schon auf dem System sind).

Hilfsprogramme kompilieren

Für's Bauen der Hilfsprogramme wechselt man nun in das übrig gebliebene Verzeichnis libsdl2-x.x.x/ und danach in das Verzeichnis test/ und führt ein

./configure

aus. Sollten Fehlermeldungen erscheinen, fehlen weitere Pakete. Läuft das Script aber durch, kann man nun mittels

make

alle Programme im Verzeichnis erstellen. Die Programme sind nun direkt ausführbar. Sie müssen also nicht erst mit make install installiert werden.

Controllermaps erstellen

Wir bleiben im test/-Verzeichnis. Uns interessiert von allen gebauten Programmen hauptsächlich controllermap, das beim Ausführen mittels

./controllermap

auch sofort die angeschlossenen Joysticks, Lenkräder und Gamepads (kurz: alle Game-Controller) in einer Liste ab Nummer 0 ausspuckt. In meinem Fall sähe der Auswurf von controllermap bei einem angeschlossenen "Snakebyte idroid:con" so aus:

INFO: There are 1 joysticks attached
INFO: Joystick 0: idroid:con
INFO: axis: 4
INFO: balls: 0
INFO: hats: 1
INFO: buttons: 12
INFO: guid: 050000006964726f69643a636f6e0000

Eine Controllermap wird erst dann erstellt, wenn dem Programm eine Nummer als Option übergeben wird. Wenn wie in diesem Beispiel eine Controllermap vom idroid:con erstellt werden soll, also

./controllermap 0.

Es erscheint eine Grafik, die ein typisches Game-Pad darstellt. Eine Controllermap soll der libsdl nun beibringen, welcher gedrückte Knopf und welche benutzte Achse eines Joysticks nun was darstellen soll. Deswegen wird jede Funktion der Reihe nach durch gegangen. Ihr habt nun die Aufgabe, die entsprechenden Knöpfe und Joystick-Achsen auf Eurem Controller zu betätigen. So lange es sich bei dem Gerät, von dem Ihr eine Controllermap erstellen wollt, um ein Game-Pad handelt, ist die Sache relativ einfach. Wollt Ihr allerdings andere Game-Controller nutzen, ist unter Umständen Phantasie gefragt. Knöpfe oder Joystick-Achsen, die Ihr beim besten Willen nicht zuordnen könnt, könnt Ihr mit [Space] überspringen.
Nach der Prozedur sollte controllermap so etwas wie das hier auswerfen:

050000006964726f69643a636f6e0000,idroid:con,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,

(Genau genommen wirft das Programm bei mir die Zeile zwei mal aus, aber ist ja nicht schlimm - verwendet wird trotzdem nur eine der beiden.)

Controllermaps nutzen

Es gibt nun mehrere Möglichkeiten, die erzeugte Controllermap zu nutzen.

Manche Spiele nutzen Text-Dateien, die voll von solchen Controllermaps sind und beim Start des jeweiligen Spiels geladen werden. Diese Dateien heißen beispielsweise

gamecontrollerdb.txt (Skullgirls)
oder
SDLGamepad.config (DiRT Showdown)

Dort lassen sich die selbst erzeugten Controllermaps einfügen und abspeichern. Der Vorteil ist, dass sich auf diese Weise für jedes Spiel eigens angepasste Controllermaps nutzen lassen. Eher negativ zu bewerten ist die Tatsache, dass man das für jedes Spiel einzeln machen muss - wenn das Spiel überhaupt eine solche Datei zur Verfügung stellt(, die meisten tun es nicht).

Eine andere Möglichkeit ist, die Umgebungs-Variable SDL_GAMECONTROLLERCONFIG zu setzen, die jedes SDL-basierte Spiel beim Start ausliest. Im Prinzip müsste man also irgendwie ein

export SDL_GAMECONTROLLERCONFIG="[controllermap]"

dem nachfolgenden Spiele-Befehl vorausschicken. Das kann man jedes mal manuell im Terminal erledigen (Aaaaanstrengend!) oder man sorgt dafür, dass die Umgebungs-Variable an relevanter Stelle gesetzt wird. Eine Lösung wäre, ein Script zu erstellen, dass die Variable setzt und danach Steam startet. Ich habe mich dafür entschieden, die Variable global in /etc/profile zu setzen - so können Steam, alle Spiele und jedes sonst irgendwie SDL-basierte Programm, aber auch alle User auf die Controllermap zugreifen. In meinem Fall lautet der Eintrag:

export SDL_GAMECONTROLLERCONFIG="050000006964726f69643a636f6e0000,idroid:con,platform:Linux,x:b0,a:b1,b:b2,y:b3,back:b8,start:b9,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,"

Mehrere Controllermaps verschiedener Controller lassen sich übrigens aneinandergereiht und mit Komma getrennt als Variable setzen.

Endbemerkung

Ab sofort sollte also selbst der billigste China-Controller mit dem unbekanntesten Indie-Game zusammen funktionieren. Das ist ein Fortschritt.

Letzten Endes muss man hier aber ganz deutlich erwähnen, dass diese Arbeit - die zugegebener Maßen nicht sonderlich aufwändig ist, WENN MAN WEISS, WIE ES GEHT - nicht am (Linux-)User hängen bleiben sollte. Natürlich sind hier Device- und Spiele-Hersteller gefragt: Erstere sollten eigentlich inzwischen wissen, dass SDL im Gaming-Business keine Randerscheinung mehr ist und Ihre User mit eigenen Beispiel-controllermaps unter die Arme greifen. Die Spiele-Hersteller könnten wiederum eine Software wie controllermap in ihre Spiele integrieren und damit endlich garantieren, dass Hardware, die vom Kernel erkannt wird, auch genutzt werden kann. Aber auch Distributoren sollten verstehen, wie wichtig es ist, Tools wie controllermap unter die User zu bringen. Nicht zuletzt sollte nicht unerwähnt bleiben, dass auch die Entwickler der SDL-Bibliothek offensichtlich nicht genug dafür tun, die nötigen Informationen unter die Leute zu bringen. Es ist schon bezeichnend, dass man, selbst, wenn man dort persönlich nachfragt, nur auf das mehr schlecht als recht funktionierende Steam-Konfigurationstool im Big-Picture-Mode verwiesen wird, anstatt seinen eigenen - tadellos funktionierenden -Tools zu vertrauen.

Screenshots und Videos
Mastodon