20140201

Añadiendo soporte para un mando a juegos de Feral Interactive

Los últimos juegos de Feral Interactive (por ejemplo, Batman: Arkham City o Tomb Raider) están diseñados con un sistema modular que define los mandos soportados. Tal y como ellos indican (ver aquí, por ejemplo), pueden ampliar con relativa facilidad el soporte de uno de sus juegos. Sin embargo, si el mando que tienes es demasiado viejo o poco popular, podría suceder que no hagan caso a tu petición.

Vamos a ver qué podemos hacer nosotros par añadir por nuestra cuenta soporte a un mando USB antiguo.
Lo primero es comprobar si el juego tiene la estructura adecuada para añadir soporte a un nuevo mando. Debemos localizarlo en nuestro disco duro, pulsar con el botón derecho, y elegir la opción "Mostrar Contenido del paquete".


Ahora, comprobamos que existe una estructura de directorios así:
Contents/Resources/InputDevices/
...y dentro varias carpetas con ficheros .plist

Si es así, estamos de suerte y podemos crear nuestra propia configuración para el mando.

Ahora, vamos a identificar nuestro mando y sus botones y palancas, para poder preparar la información. Conectamos el mando a un puerto USB y abrimos "Información del Sistema" (dentro de /Aplicaciones/Utilidades).

Una vez abierta, miramos la información de nuestro mando
Tomamos nota del ID del producto y el ID del fabricante. Estos números están en hexadecimal, así que usamos la calculadora para saber el valor en decimal. En nuestro ejemplo, ID del producto: 41728 (a300) e ID del fabricante: 1784 (06f8).

Ahora, vamos a identificar los botones y palancas del mando. Para ello, descargamos la aplicación "Joystick and gamepad tester" (desde aquí).

Con el mando conectado, abrimos la aplicación, pulsamos todos los botones y rogamos las distintas palancas disponibles, y tomamos nota de los números de los botones,los tipos de palancas, los valores máximos y mínimos, etc. que tiene nuestro mando.
En el caso concreto que estamos utilizando, la asignación de los botones respecto, por ejemplo, a un mando de XBox es la siguiente:
DALeader XBox
1
LeftShoulder
2
LeftTrigger
3
RightShoulder
4
RightTrigger
5
ButtonX
6
ButtonY
7
ButtonB
8
ButtonA
9
LeftThumb
10
RightThumb
11
ButtonBack
12
ButtonStart

Ahora volvamos al directorio Contents/Resources/InputDevices/Digital/ y hagamos una copia del archivo LogitechRumblePad2.plist.

Si abrimos este fichero con un editor de texto, veremos que tiene una estructura muy concreta, que es la que indica cómo se relacionan los botones del mando con los botones que usaremos en el juego. De hecho, la forma de nombrarlos está muy relacionada con los botones de un mando de XBox.
Pues bien, ahora renombraremos el fichero a nuestro gusto (para el ejemplo en que estamos yo he elegido el nombre GuillemotDALeader.plist) y vamos a modificarlo para nuestras necesidades, según los siguientes criterios:
  • Se debe indicar los valores VendorID con ID del fabricante y ProductID con ID del producto
  • Los botones normales se identifican con 9:n donde n es el número de botón.
  • Los analógicos suelen ser identificados por sus ejes X e Y con códigos 1:48,1:49 (izquierda, X e Y), 1:53,1:54 (derecha, X e Y) y se indican en los valores: AxisX, AxisY
  • Además, para los analógicos se deben tener en cuenta el máximo, mínimo y valor neutro, con los valores: AxisX-Min, AxisX-Max, (…), XAxisInitValue, etc.
  • Para un D-Pad o HatSwitch, el código suele ser 1:49, en el valor HatSwitch y luego se indica siempre el mismo tipo de valores para arriba (HSValueUp), abajo, diagonales, etc.
De esta manera, el fichero en nuestro caso, quedaría modificado así:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CGPDeviceType</key>
<string>Rumble2</string>
<key>VendorID</key>
<real>1784</real>
<key>ProductID</key>
<integer>41728</integer>
<key>LeftAxisX</key>
<string>1:48</string>
<key>LeftAxisX-Min</key>
<string>0</string>
<key>LeftAxisX-Max</key>
<string>255</string>
<key>LeftAxisY</key>
<string>1:49</string>
<key>LeftAxisY-Min</key>
<string>0</string>
<key>LeftAxisY-Max</key>
<string>255</string>
<key>LeftTrigger</key>
<string>9:2</string>
<key>RightAxisX</key>
<string>1:53</string>
<key>RightAxisX-Min</key>
<string>0</string>
<key>RightAxisX-Max</key>
<string>255</string>
<key>RightAxisY</key>
<string>1:54</string>
<key>RightAxisY-Min</key>
<string>0</string>
<key>RightAxisY-Max</key>
<string>255</string>
<key>RightTrigger</key>
<string>9:4</string>
<key>ButtonA</key>
<string>9:8</string>
<key>ButtonB</key>
<string>9:7</string>
<key>ButtonX</key>
<string>9:5</string>
<key>ButtonY</key>
<string>9:6</string>
<key>LeftShoulder</key>
<string>9:1</string>
<key>RightShoulder</key>
<string>9:3</string>
<key>LeftThumb</key>
<string>9:9</string>
<key>RightThumb</key>
<string>9:10</string>
<key>ButtonStart</key>
<string>9:12</string>
<key>ButtonBack</key>
<string>9:11</string>
<key>ButtonDevice</key>
<string>9:13</string>
<key>DPadUp</key>
<string>0</string>
<key>DPadDown</key>
<string>0</string>
<key>DPadLeft</key>
<string>0</string>
<key>DPadRight</key>
<string>0</string>
<key>Hatswitch</key>
<string>1:57</string>
<key>HSValueRest</key>
<integer>15</integer>
<key>HSValueUp</key>
<integer>0</integer>
<key>HSValueUpRight</key>
<integer>1</integer>
<key>HSValueRight</key>
<integer>2</integer>
<key>HSValueDownRight</key>
<integer>3</integer>
<key>HSValueDown</key>
<integer>4</integer>
<key>HSValueDownLeft</key>
<integer>5</integer>
<key>HSValueLeft</key>
<integer>6</integer>
<key>HSValueUpLeft</key>
<integer>7</integer>
<key>XAxisInitValue</key>
<integer>127</integer>
<key>YAxisInitValue</key>
<integer>127</integer>
</dict>
</plist>

Observar, a modo de ejemplo, comparando con la tabla de más arriba, cómo hemos asignado el botón número 8 del mando, al botón tipo A de XBoX:
<key>ButtonA</key>
<string>9:8</string>

Finalmente, tras haber preparado nuestro fichero, sólo hemos de dejarlo en la carpeta con el resto de archivos .plist, e iniciar el juego para comprobar que los controles funcionan.

1 comentario: