Le principe est d'avoir un fichier unique de configuration regroupant toutes les informations nécessaires pour les jeux "Lightgun" de tous les systèmes & émulateurs.
Ainsi, on pourra faire de l'héritage, des regroupements de jeux mais aussi gérer des particularités sans avoir un fichier par jeu ou par système comme on peut le faire déjà mais sans pouvoir regrouper des systèmes par exemple. Ce qui est possible avec ce xml unique.
De plus, on pourra, dans les versions suivantes, rajouter des aides en lignes, des messages lors du chargement des jeux, etc...
Un autre avantage par rapport aux surcharges classiques : on peut rajouter des fonctions dans le python du Configgen pour aller chercher/identifier si un matériel est présent comme la Mayflash dolphin bar ou savoir sur quel board/pc on se trouve. On peut décider de configurer ainsi entre 1 à 3 joueurs Lightgun à ce jour.
Pour rappel, ceci n'est possible que pour Libretro pour l'instant. Rien ne nous empêcherait de le faire pour d'autres émulateurs avec le fichier xml que l'on a déjà.
En fait, la configuration des jeux est dans un fichier xml (pour info, c'est un ".cfg" en fait).
Le fichier est organisé ainsi en terme de structure (ici il est vide sans configurations pour montrer la structure xml au complet) :
<?xml version="1.0"?>
<root>
<emulatorOptions>
<option />
</emulatorOptions>
<coreOptions>
<option />
</coreOptions>
<system>
<emulatorList>
<emulator />
</emulatorList>
<emulatorOptions>
<option />
</emulatorOptions>
<coreOptions>
<option />
</coreOptions>
<gameList>
<game>
<emulatorOptions>
<option />
</emulatorOptions>
<coreOptions>
<option />
</coreOptions>
</game>
</gameList>
</system>
</root>
<root> : c'est la base du XML où tout va se retrouver ainsi qu'une version pour suivre les évolution de ce fichier
<?xml version="1.0"?>
<root>
<!-- internal version of the file to help follow-up of update, same version until release -->
<version>1.0.6 - 18-03-2024</version>
</root>
<emulatorOptions> : c'est la partie dans <root> et commune de surchage de retroarchcustom.cfg
que l'on va avoir pour tous les systèmes, dans le cas du lightgun, on va y mettre les touches de base comme select/exit/start/trigger.
<!-- MANDATORY inputs (for retroarchcustom.cfg): comon part to use for all systems (using dolphinbar and until 2 wiimotes) -->
<emulatorOptions>
<option name="input_player1_gun_start" value="enter" />
<option name="input_player2_gun_start" value="enter" />
<option name="input_player1_gun_select" value="escape" />
<option name="input_player2_gun_select" value="escape" />
<!-- force selecte and start for consoles games -->
<option name="input_player1_select" value="escape" />
<option name="input_player2_select" value="escape" />
<option name="input_player1_start" value="enter" />
<option name="input_player2_start" value="enter" />
<!-- for many it's necessary to move in menu or else -->
<option name="input_player1_gun_dpad_up" value="up" />
<option name="input_player1_gun_dpad_down" value="down" />
<option name="input_player1_gun_dpad_right" value="right" />
<option name="input_player1_gun_dpad_left" value="left" />
<option name="input_player2_gun_dpad_up" value="up" />
<option name="input_player2_gun_dpad_down" value="down" />
<option name="input_player2_gun_dpad_right" value="right" />
<option name="input_player2_gun_dpad_left" value="left" />
<!-- index to manage distinction between guns -->
<option name="input_player1_mouse_index" value="GUNP1" />
<option name="input_player2_mouse_index" value="GUNP2" />
<!-- wiimotes home button for exit game -->
<option name="input_exit_emulator" value="lsuper" />
<option name="input_enable_hotkey" value="lsuper" />
<!-- set on fullscreen for don't see cursor mouse on x86(-64) -->
<option name="video_fullscreen" value="true" />
<!-- to have help using overlay switch and finally ask to press 2 times home to exit -->
<option name="input_overlay_next" value="lsuper" />
<option name="quit_press_twice" value="true" />
</emulatorOptions>
<coreOptions> : c'est la partie dans <root>
et commune de surchage de retroarch-core-options.cfg
que l'on va avoir. Dans notre cas, ce n'est pas utilisé de manière commune mais cela serait possible.
<!-- OPTIONAL options (for retroarch-core-options.cfg): comon part to use for all systems (using dolphinbar and until 2 wiimotes) -->
<coreOptions>
<!-- only for more log on test -->
<!-- <option name="libretro_log_level" value="2" />
<option name="log_verbosity" value="true" /> -->
</coreOptions>
<option> : ce sont les valeurs de base de configuration toujours composées de 2 attributs name
et value
:
<option name="input_player1_gun_start" value="enter" />
<system> : c'est la partie qui regroupe toute la configuration d'un système. On y retrouve les tags <emulatorList>
, <emulator>
, <emulatorOptions>
, <coreOptions>
, <gameList>
et <game>
.
<!-- ********************************************************* Nintendo Entertainment System ************************************************************** -->
<system name="nes">
<!-- MANDATORY: emulator and core selected for lightgun -->
<emulatorList name="libretro">
<emulator priority="1" name="libretro" core="fceumm" />
</emulatorList>
<!-- MANDATORY: inputs common to this system -->
<emulatorOptions>
<!-- gamepad -->
<option name="input_libretro_device_p0" value="1" />
<!-- lightgun -->
<option name="input_libretro_device_p1" value="258" />
<!-- Wiimote button B -->
<option name="input_player2_gun_trigger_mbtn" value="1" />
<!-- Set index to GUNP1 on player 2 to have first wiimote as player 1 -->
<option name="input_player2_mouse_index" value="GUNP1" />
</emulatorOptions>
<!-- MANDATORY: options common to this system -->
<coreOptions>
<option name="fceumm_zapper_mode" value="clightgun" />
<option name="fceumm_zapper_tolerance" value="6" />
<option name="fceumm_show_crosshair" value="enabled" />
</coreOptions>
<gameList>
<!-- list of games using lightgun -->
<!-- see 'duckhunt' game to see more explainations to know how to setup game part -->
<game name="3in1supergun" tested="true" />
<emulatorList> : ce tag liste la liste des émulateurs compatibles, généralement limité à un seul :
<!-- MANDATORY: emulator and core selected for lightgun-->
<emulatorList>
<emulator priority="1" name="libretro" core="flycast" />
</emulatorList>
<emulator> : ce tag a pour valeur la priorité, le nom de l'émulateur et core à utiliser. il se trouve toujours dans <emulatorList>
comme ci-dessus.
<emulator priority="1" name="libretro" core="flycast" />
<emulatorOptions> : ce tag permet de surcharger retroarchcustom.cfg
en plus de la partie <emulatorOptions>
au niveau des <system>
, <gameList>
et/ou <game>
.
<system>
.....
<emulatorOptions>
<!-- gamepad -->
<option name="input_libretro_device_p0" value="1" />
<!-- lightgun -->
<option name="input_libretro_device_p1" value="258" />
<!-- Wiimote button B -->
<option name="input_player2_gun_trigger_mbtn" value="1" />
<!-- Set index to GUNP1 on player 2 to have first wiimote as player 1 -->
<option name="input_player2_mouse_index" value="GUNP1" />
.....
.....
<gameList>
<emulatorOptions>
<!-- no reload, this game is a free fire but need secondary input for grenade and more -->
<option name="input_player1_a_mbtn" value="2" />
<option name="input_player2_a_mbtn" value="2" />
</emulatorOptions>
<game name="alien3thegun" tested="true" />
.....
.....
<game name="gunbuster" tested="true">
<name>gunbuster</name>
<emulatorOptions>
<!-- no reload free fire game but ned secondary input for grenade and more -->
<!-- move players with dpad on wiimote -->
<option name="input_player1_a" value="2" />
<option name="input_player1_gun_offscreen_shot_mbtn" value="nul" />
<option name="input_player2_a" value="2" />
<option name="input_player2_gun_offscreen_shot_mbtn" value="nul" />
</emulatorOptions>
</game>
.....
<coreOptions>: ce tag permet de surcharger retroarch-core-options.cfg
en plus de la partie <coreOptions>
au niveau des <system>
, <gameList>
et/ou <game>
.
<!-- options common to this system-->
<coreOptions>
<option name="genesis_plus_gx_gun_input" value="lightgun" />
<option name="genesis_plus_gx_gun_cursor" value="enabled" />
</coreOptions>
<gameList> : ce tag est la racine des groupes de jeux. Cela permet d'avoir une configuration distinct pour une partie des jeux dans un même système, on peut donc avoir plusieurs sections <gameList>
dans le même système.
<gameList>
<emulatorOptions>
<!-- no reload, these games have a free fire but need secondary input for grenade and more -->
<option name="input_player1_a_mbtn" value="2" />
<option name="input_player2_a_mbtn" value="2" />
</emulatorOptions>
<game name="alien3thegun" tested="true" />
<game name="beastbusters" tested="true" />
<game name="dragongun" tested="true" />
</gameList>
<game> : ce tag qui est dans <gameList>
est pour définir la configuration du jeu en particulier.
<game name="gunbuster" tested="ok">
<emulatorOptions>
<!-- no reload free fire game but ned secondary input for grenade and more -->
<!-- move players with dpad on wiimote -->
<option name="input_player1_a" value="2" />
<option name="input_player1_gun_offscreen_shot_mbtn" value="nul" />
<option name="input_player2_a" value="2" />
<option name="input_player2_gun_offscreen_shot_mbtn" value="nul" />
</emulatorOptions>
</game>
<game> possède les attributs
name
(pour reconnaitre le jeu lancé) ettested
pour savoir si on a déjà testé cette rom en particulier et connaitre son statut (2 valeurs possibles) :
- true -> testé avec la configuration défini.
- false -> testé mais pas fonctionnel, donc ne sera pas configuré pour fonctionner en mode lightgun pour l'instant (on a de l'espoir).
Il faut toujours mettre le nom sans espace/caractères spéciaux et en minuscule pour le parsing de la "gamelist" d'un système par Recalbox. Attention, c’est le nom du jeu dans son plus simple appareil, c’est ni le nom du fichier de la rom ni le nom avec la zone géographique, etc… il faut rester le plus simple possible pour que la correspondance se fasse à coup sûr. Faire un scrap permettra d'être sur d'avoir un jeu avec un nom identifiable.
En fait dans ce paragraphe, nous souhaitons vous expliquer que dans l'ordre la configuration se fera ainsi :
common
-> system
-> gameList
-> game
.... On vous laisse nous dire à quoi sera égale input_player2_gun_trigger_mbtn
dans l'exemple suivant
<?xml version="1.0"?>
<root>
<emulatorOptions>
<option name="input_player2_gun_trigger_mbtn" value="1" />
</emulatorOptions>
<coreOptions>
</coreOptions>
<system>
<emulatorList>
<emulator></emulator>
</emulatorList>
<emulatorOptions>
<string name="input_player2_gun_trigger_mbtn" value="2" />
</emulatorOptions>
<coreOptions>
</coreOptions>
<gameList>
<emulatorOptions>
<string name="input_player2_gun_trigger_mbtn" value="1" />
</emulatorOptions>
<coreOptions>
</coreOptions>
<game>
<emulatorOptions>
<option name="input_player2_gun_trigger_mbtn" value="2" />
</emulatorOptions>
<coreOptions>
</coreOptions>
</game>
</gameList>
</system>
</root>
Nous avons du gérer les index des "mouse" et le préciser de manière commune ou plus précise par jeu. Par exemple quand le joueur 1 est finalement sur le port 2, et le joueur 2 sur le port 3. Nous avons donc des mots clés comme GUNP1
, GUNP2
ou GUNP3
.
.....
<emulatorOptions>
<!-- index to manage distinction between guns -->
<option name="input_player1_mouse_index" value="GUNP1" />
<option name="input_player2_mouse_index" value="GUNP2" />
.....
<gameList> <!-- games using justifier -->
<emulatorOptions>
<!-- lightguns always on port 2 -->
<!-- For Justifier device (blue cross) -->
<string name="input_libretro_device_p2" value="516" />
<string name="input_player2_mouse_index" value="GUNP1" />
<!-- Wiimote button B or Z -->
<string name="input_player2_gun_trigger_mbtn" value="1" />
<!-- For Justifier(P2) device (pink cross) -->
<string name="input_libretro_device_p3" value="772" />
<string name="input_player3_mouse_index" value="GUNP2" />
<!-- Wiimote button B or Z -->
<string name="input_player3_gun_trigger_mbtn" value="1" />
<!-- Common inputs part replicated for this game using player 3 -->
<string name="input_player3_gun_start" value="enter" />
<string name="input_player3_gun_select" value="escape" />
<!-- Common inputs part replicated to force select and start for consoles games -->
<string name="input_player3_select" value="escape" />
<string name="input_player3_start" value="enter" />
</emulatorOptions>
<game name="lethalenforcers" tested="true" />
</gameList>
En fait, le fichier xml de configuration n'est pas trouvable dans votre “share” mais il est dans le système et accessible uniquement en SSH : /recalbox/share_init/system/.emulationstation/lightgun.cfg
.
Pour pouvoir modifier ce fichier, il faudra monter la partition du système en lecture/écriture.
Il suffit de trouver le système, exemple pour la NES :
Et de rajouter dans la section <gameList> le tag <game> puis <name> ainsi :
<game name="monjeu2" tested="true" />
RAPPEL: Il faut toujours mettre le nom sans espace/caractères spéciaux et en minuscule pour le parsing de la "gamelist" d'un système par Recalbox. Attention, c’est le nom du jeu dans son plus simple appareil, c’est ni le nom du fichier de la rom ou le nom avec la zone géographique, etc… il faut rester le plus simple possible pour que la correspondance se fasse à coup sûr. Faire un scrap permettra d'être sur d'avoir un jeu avec un nom identifiable.
Le mieux est de regarder ce que l'on a fait pour d'autres jeux… En général, vous allez avoir besoin de modifier les paramètres correspondants aux boutons de tir primaire et secondaire, voire désactiver des touches (voir ci-après) mais cela peut être encore plus compliqué… Si c'est le cas, il faudra aller voir les manuels des jeux de l'époque et passer beaucoup de temps dans les menu de RetroArch… donc maitriser l'art de la surcharge !
<game name="ninjaassault" tested="true">
<emulatorOptions>
<!-- for this game start p1 for P2 aux_c -->
<string name="input_player1_gun_start" value="nul" />
<string name="input_player1_gun_aux_b" value="enter" />
<!-- for this game trigger -->
<string name="input_player1_gun_trigger_mbtn" value="nul" />
<string name="input_player1_gun_aux_a_mbtn" value="1" />
<!-- for this game real offscreen reload -->
<string name="input_player1_gun_offscreen_shot_mbtn" value="nul" />
</emulatorOptions>
</game>
Dans ce cas, il faut vraiment connaitre le core à utiliser, les paramètres de RetroArch et en général configurer aussi le "device" dans <emulatorOptions>
ainsi que les paramètres "lightgun" du core dans <coreOptions>
.
......
<system name="megadrive">
<!-- MANDATORY: emulator and core selected for lightgun -->
<emulatorList name="libretro">
<emulator priority="1" name="libretro" core="genesisplusgx" />
</emulatorList>
<!-- MANDATORY: inputs common to this system -->
<emulatorOptions>
<!-- Wiimote button B or Z -->
<option name="input_player2_gun_trigger_mbtn" value="1" />
<!-- Wiimote button A or c - aux when it's necessary as jump, rocket, etc... -->
<option name="input_player2_gun_aux_a_mbtn" value="2" />
<!-- <option name="input_player2_gun_aux_a_mbtn" value="2" /> -->
<!-- gamepad always on port 1-->
<option name="input_libretro_device_p1" value="1" />
</emulatorOptions>
<!-- MANDATORY: options common to this system -->
<coreOptions>
<option name="genesis_plus_gx_gun_input" value="lightgun" />
<option name="genesis_plus_gx_gun_cursor" value="enabled" />
</coreOptions>
.....
Bon courage !!!