Ce tutoriel est voué à aider celles et ceux qui utilisent du matériel de type Joystick(s) et/ou HOTAS de la marque Thrustmaster. J'ai pu enfin créer mon profil autour du T16000M et du TWCS (HOTAS) en passant par le Script Editor plutôt que le logiciel graphique (qu'on abrègera par : GUI), car le Script Editor (qu'on abrègera par : SE) s'avère beaucoup plus puissant. On peut y faire beaucoup plus de choses mais il s'avère complexe au départ lorsqu'on a aucune notion dans les langages de scripts.
Ce tutoriel est loin d'être exhaustif dans la manière d'aborder, d'organiser la création d'un profil via le SE, loin de là... Il s'agit seulement de partager avec vous une façon de faire que j'ai appliqué et que je me suis appropriée, une organisation de fichiers et de nomenclature que je trouve bien plus claire afin de s'y retrouver facilement. La quantité d'informations que j'ai pu trouvé sur le sujet sur la toile s'avère maigre ou peu complète, j'ai arrêté de farfouillé pour essayer de comprendre en solo et je dois dire que le manuel est d'une grande aide au départ, il est d'ailleurs un prérequis à avoir pour ce tutoriel.
MON PROFIL TÉLÉCHARGEABLE ICI
MATÉRIEL UTILISÉ POUR LE TUTO :
- T16000M (Joystick)
- TWCS (HOTAS)
(en terme de rapport qualité-prix y'a pas mieux encore à l'heure actuelle pour les petits budgets)
PRÉREQUIS DE DÉPART : - Avoir les manuels du GUI et du SE avec soi et les avoir lus
- Savoir utiliser le GUI pour créer un profil de type ADVANCED
- Même si on va voir ça ensemble : comprendre les différents "Layers" ou "Couches" à savoir "IOUMD"
Lorsqu'on fait un profil de type ADVANCED, on a accès déjà dans le GUI à plusieurs couches/sous-couches pour chacune des touches de vos périphériques :
• Les couches principales : U, M et D
• Les sous-couches : I et O pour chaque couche principale
Donc un potentiel total de 6 fonctions différentes à paramétrer pour chacun des bouton et pour chaque ensemble de [sous-couche + couche] suivants :
• IU, IM et ID
• OU, OM et OD
Ça laisse rêveur... en effet, c'est possible et très faisable, on peut se passer du SE pour ça car tout ceci est possible via le GUI seulement. Le logiciel n'est pas si mal fait et si vous ne souhaitez pas aller plus loin alors concentrez-vous sur le GUI seulement, le manuel seul suffira à vous guider efficacement. Entre les 16 boutons + le mini-joystick du T16000M et les multiples joysticks du TWCS avec ses différents boutons et ses axes, vous avez déjà un éventail de possibilités énorme.
• T16000M : 16 boutons x 6 = 96
• TWCS : 17 boutons, et oui, 3 mini-joy à 4 positions ça fait 12 boutons déjà, ajouté à ça on a 3 boutons et un levier haut/bas donc 5 de + ce qui fait 17 x 6 = 102
• 96 + 102 = 198 éventualités brut rien qu'avec les boutons des 2 périphériques cumulés et sans compter les axes, ça vous suffit ou il faut que je développe ?
Alors ça c'est la théorie, en pratique on aura forcément moins, X4 Foundations n'est pas un jeu aux mêmes exigences qu'un Elite Dangerous, Star Citizen ou un simulateur de vol d'aviation. Il faut déjà réserver 3 boutons dédiés au switch d'une couche vers une autre. C'est chose facile avec des périphériques sophistiqués comme le Wartog et son palonnier par exemple qui possède de multiples boutons à 2 ou 3 positions fixes différentes, chose que nous n'avons pas sur le T16000M ni sur le TWCS. Mais un bouton simple à appui/relâchement classique, comme une touche de clavier, peut très bien faire office de permutation => cf. pages 36 à 40 du manuel du GUI...
Par défaut, on se trouvera toujours dans la couche 'OM' dès le lancement du profil, rien à voir avec le foot sortez pas les pancartes... ce sont les sous-couche/couche définies par défaut parce qu'il en faut bien... Si on souhaite utiliser les différentes couches et sous-couches que le soft propose, il faut donc impérativement choisir ces 3 boutons qui serviront à ça, rien de plus simple :
- Dans le GUI, dans la zone 2.ASSIGN PARAMETERS vous cliquez sur EDIT LAYERS dans le coin supérieur droit
- De là, vous pouvez même faire un glisser/déposer du bouton qui servira à permuter les sous-couches I/O dans le 1er grand cadre
- Et pareil pour les 2 boutons servant à permuter les couches U/M et D/M dans les 2 cadres en-dessous
- On oublie pas pour chacun d'eux de cocher la case • "TOGGLE" BEHAVIOUR, c'est indispensable !!
Et vous comprenez bien qu'il ne va plus être possible d'utiliser ces 3 boutons pour autre chose que ça désormais, à chaque appui sur chacun d'eux on permute de couche ou de sous-couche donc ils ont déjà leur utilité. On va pas s'amuser à y ajouter l'ouverture de la carte par exemple sur le bouton qui switch de I vers O... vous comprenez bien que c'est contre-mécanique... donc 3 boutons que je vous conseille de ne réserver qu'à cet effet : la permutation des couches et sous-couches. Personnellement chez moi ce sont les 3 boutons oranges du TWCS pour avoir tout à portée des doigts sans bouger la main, bien plus pratique et si vous vous calquez sur mon profil, c'est forcément préférable de garder les mêmes.
Si vous avez déjà mis vos mains dans ces softs, vous devez déjà avoir votre propre idée sur comment utiliser ces différentes couches à bon escient. Si c'est une découverte pour vous alors vous vous demandez sûrement comment on va pouvoir s'en servir ?
Bien souvent on va utiliser une couche selon un "état" dans lequel on se trouve en jeu comme par exemple être en situation de vol ou être à pieds, on voudrait ne pas avoir accès aux mêmes fonctionnalités dans ces 2 cas-là. En effet, inutile d'avoir une fonction qui active le mode croisière dans X4 lorsqu'on est à pieds dans les stations... en 1 appui sur un bouton on change la fonction de tous les autres et voilà chez moi comment j'ai pensé les différentes couches dans mon profil :
Couche {I} dès lors qu'on est debout et plus aux commandes d'un vaisseau
Couche {O} dès lors qu'on est aux commandes d'un vaisseau et non à pieds (par défaut)
Couche {M} lorsqu'on est en exploration simple, que ce soit en vol comme à pieds (par défaut)
Couche {U} lorsqu'on est aux commandes d'un vaisseau mais en combat avec des ennemis autour
Couche {D} la couche utilisée pour la navigation dans les menus et la carte, qu'on soit à pieds ou aux commandes d'un vaisseau
Allez, une illustration d'exemple c'est plus simple :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050102045625905718168844.png)
Ci-dessus, on voit bien que je n'utilise pas le plein potentiel des 6 couches sur ce bouton, parce que je n'en ai pas la nécessité, mais aussi parce que j'ai préféré mettre plus de fonctionnalités sur les différents boutons du palonnier plutôt que sur le Joystick pour ne pas avoir à bouger la main du Joystick, c'est juste une question de choix personnel. Et donc ici dans le cas du bouton B5, on a 2 fonctionnalités différentes pour 1 seul bouton.
Autre exemple :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050102054325905718168850.png)
Ici, nous avons 3 fonctions différentes pour chacun des 2 boutons TBTN4 et TBTN5 du palonnier selon les couches dans lesquelles on se trouve. On comprend vite que la couche {U} Combat lorsqu'on est à pieds ne va pas nous servir à grand chose dans ce jeu... d'une manière absolue, lorsqu'on est à pieds dans X4 on a vraiment pas besoin d'avoir 50 fonctions différentes sur nos boutons vu le peu d'interactions possibles, je vous apprends rien ^^ Mais là je ne vous montre que le profil dans le GUI qui m'a servi de base pour construire mon script plus complet dans le SE, il y a en réalité un peu plus de fonctions que ça mais qui ne sont possible qu'en passant par le SE.
Si jusque-là vous suivez, vous savez faire au moins ce qu'il y a en illustration et que vous le comprenez plutôt bien, alors on va passer à la suite, on va accélérer un peu je préfère prévenir...
Sachez qu'on peut accéder au script construit par le GUI en cliquant sur VIEW SCRIPT tout en bas à gauche de la zone 2.ASSIGN PARAMETERS ce qui vous ouvre le script construit par TARGET au format texte, on va s'en servir pour passer sur le SE. C'est pour cela que je conseille vivement de passer d'abord par le GUI pour finaliser un profil afin d'avoir déjà une idée fixe des fonctions que vous souhaitez associer à chacun de vos boutons et qui seront bien entendu en fonction de vos contrôles en jeu. En somme, via le GUI on est déjà en train de créer des macros qu'on associe à notre/nos périphérique(s).
Ce script pré-construit par le GUI est donc au bon format pour être exploité par le SE à savoir le format .tmc donc on va le sauvegarder quelque part dans un dossier vide de préférence et lui donner un nom et on peut maintenant l'ouvrir avec le SE de TARGET pour mettre les mains dans le cambouis... Déjà, dans les options du SE je vous conseille FORTEMENT d'activer l'affichage des numéros des lignes :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050102053225905718168849.png)
Si vous avez suivi la procédure, vous vous retrouvez avec un fichier .tmc qui, lorsqu'on l'ouvre dans SE ressemble à un beau bordel sans nom quand on n'a pas l'habitude, exemple avec le mien au départ :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050103201625905718168889.png)
Magnifique n'est-ce pas... Vous souhaitez toujours continuer ? Vous voulez persister pour affiner votre profil via le SE ? Peut-être qu'un jour vous envisagerez d'ajouter d'autres fonctionnalités à vos boutons ou effectuer des changements ? Oui car si vous êtes très bien avec ce profil créé via le GUI, qu'il ne vous manque rien de plus que ce que vous avez paramétré jusque-là, au risque de me répéter une dernière fois, vous n'avez pas réellement besoin de passer par le SE pour ça !! Gardez votre script tel quel et lancez-le via le GUI pour en profiter ça suffira amplement.
Les 2 lignes ci-dessous montrent les différentes macros de la touche B5 vue plus haut, je vous laisse constater laquelle est la plus lisible... (la 1ère correspond à la ligne 26 de l'illustration juste avant)
- MapKeyIOUMD( &T16000, B5, CHAIN( DOWN+L_SHIFT, D(), PULSE+'m', D(), UP+L_SHIFT), CHAIN( DOWN+L_SHIFT, D(), PULSE+'&', D(), UP+L_SHIFT), CHAIN( DOWN+L_SHIFT, D(), PULSE+'m', D(), UP+L_SHIFT), CHAIN( DOWN+L_SHIFT, D(), PULSE+'&', D(), UP+L_SHIFT), CHAIN( DOWN+L_SHIFT, D(), PULSE+'m', D(), UP+L_SHIFT), CHAIN( DOWN+L_SHIFT, D(), PULSE+'m', D(), UP+L_SHIFT) );
- MapKeyIOUMD( &T16000, B5, Display_Missions_I_OD, Toggle_Cruse_Mode_OUM, Display_Missions_I_OD, Toggle_Cruse_Mode_OUM, Display_Missions_I_OD, Display_Missions_I_OD);
Ces 2 lignes font exactement la même chose, la 1ère provient donc de mon profil élaboré via le GUI, la 2ème provient de mon profil élaboré via le SE, les fonctionnalités sont totalement identiques mais le code est largement plus lisible et compréhensif dans le 2ème cas... selon moi du moins ^^ Je ne vous apprends rien non plus en vous disant qu'une meilleure lisibilité, une meilleure organisation dans un code permet de le comprendre, de s'y retrouver et de pas être perdu lorsqu'on veut faire des modifications.
Dans la 1ère ligne ci-dessus, on retrouve par exemple plusieurs fois cet ensemble :
- CHAIN( DOWN+L_SHIFT, D(), PULSE+'m', D(), UP+L_SHIFT), => on comprend vite qu'il s'agit d'une chaîne de commande dans laquelle on maintient Shift + 'm', ce qui selon mes réglages en jeu correspond à l'affichage des missions actuelles.
- Display_Missions_I_OD, => voilà comment l'ensemble a été simplifié dans ma 2ème ligne, non seulement la nomenclature a du sens, mais en plus j'indique dans quelles couches cette commande va se retrouver à savoir I_OD donc IU, IM, ID et OD
Je le rappelle : ce tutoriel ne porte que sur mon organisation, ma façon de faire qui peut vous servir d'exemple ou d'inspiration mais qui n'est pas la seule vérité absolue. Vous pouvez organiser votre code comme bon vous semble, comme déjà dit au début, ce tutoriel n'est là que pour vous montrer un chemin de compréhension parmi tant d'autres, s'il vous convient j'en suis très content, s'il vous a ouvert les yeux vers votre propre organisation j'en suis tout autant ravi et s'il ne vous a servi à rien c'est qu'il est nul et inutile pour vous tout simplement...
On va commencer par se pencher sur les fichiers .tmh qui vont regrouper tous les contrôles que vous avez paramétré dans votre jeu X4, j'ai préféré les regrouper en 2 fichiers et bien entendu vous pouvez leur donner le nom que vous souhaitez :
- H-Primary__X4_MAMY-PROFIL.tmh : regroupe les contrôles primaires à l'exception des réglages Analogiques qui sont réservés aux axes
- H-Secondary__X4_MAMY-PROFIL.tmh : regroupe les contrôles secondaires à l'exception des réglages Analogiques qui sont réservés aux axes
A l'exception de l'absence des réglages Analogiques, j'ai repris avec exactitude la même structure que les réglages des contrôles en jeu de manière à s'y retrouver facilement le jour où on souhaite en changer dans le jeu :
Réglages en jeu =>
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050104512525905718168954.png)
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050104511525905718168952.png)
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050104511625905718168953.png)
Pour chaque réglage correspond une variable déclarée comme ceci :
int nomdelavariable = quelquechose;
Et j'ai bien entendu choisi un nom moi-même pour chacune d'elles puisqu'on peut nommer une variable comme on veut en respectant quelques conditions comme par exemple ne pas commencer par un chiffre, éviter les caractères spéciaux et chaque variable doit avoir un nom unique. Pour les contrôles secondaires, j'ai forcément repris les mêmes et n'ai eu qu'à rajouter '_2' à la fin du nom de chacune d'elles pour m'y repérer facilement. La structure des 2 fichiers est donc identique, ils ont le même nombre de lignes (272) et là aussi c'est important, ce n'est pas 'bloquant' si on ne respecte pas ce principe mais c'est seulement pour s'y retrouver facilement. Tout ce qui est en vert n'est pas du code mais seulement des lignes de commentaires, j'en utilise beaucoup dans mon profil pour donner beaucoup d'indications et je ne saurais conseiller que de faire pareil si vous souhaitez tout construire par vous-même.
On remarque une chose : lorsqu'un contrôle en jeu est une association de SHIFT + une touche, ou CTRL + une touche, je n'indique pas dans ces fichiers le SHIFT+ ou CTRL+ mais bien QUE la touche qui suit, la construction du SHIFT+ ou CTRL+ va se faire ailleurs, dans notre fichier des Macros au format .ttm qui va être le cœur d'à peu près tout. Alors on y vient à ce fichier Macros ? Oui j'arrive, j'arrive...
Plus que des mots, une petite photo et après on traduit, voyons maintenant le fichier des Macros que j'ai baptisé :
Macros__X4_MAMY-PROFIL_T16000M-TWCS.ttm =>
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050109164025905718169131.png)
Kécekidit le Monsieur ? T'inquiète, ça va bien se passer. Pour le moment concentrons-nous sur la zone GENERICS dont les commentaires parlent d'eux-mêmes, j'y ai définit ici des choses qui vont servir au reste plus bas (qu'on voit pas encore parce que... c'est plus bas...). Chaque fonction doit être définie comme ceci :
define nomdelafonction quelquechose
Pas besoin de = ni de finir par un point-virgule contrairement à la déclaration d'une variable, 1 seul espace suffit entre le nom de la fonction et sa définition mais si vous en mettez plusieurs ils seront interprétés comme 1 seul, ça aide à aérer les choses pour y voir clair. Si vous avez bien lu le manuel, vous avez donc remarqué qu'on sépare systématiquement un enchaînement de touches par un 'délai' dont le délai standard est caractérisé par la fonction native du soft : D() que j'ai repris dans DS pour 'Délai Standard'. En effet, ce délai est très important lors de la construction d'une macro pour éviter d'éventuels problèmes dans l'ordre exact d’exécution de votre macro, mais je m'étalerais pas sur les détails des possibilités de cette fonction pour avancer sur le reste.
Bon, je pense qu'en lisant les commentaires après DLS, ULS, DLC et ULC vous comprendrez vite à quoi ça sert... Regrouper un enchainement de touches sous un nom de fonction à 3 lettres pour raccourcir, simplifier l'écriture, ni plus, ni moins, et ça va forcément nous aider pour les SHIFT+ lettre et CTRL+ lettre. Plus bas qu'il a dit le Monsieur !! Ok, ok, j'y viens...
Mais d'abord on doit construire l'appui simple de chaque touche avec PULSE+ :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050109302125905718169154.png)
La fonction PULSE+ sert à reproduire l'appui/relâchement d'une touche. Pour l'appui seulement (donc maintenu) c'est DOWN+ touche et le relâchement c'est UP+ touche. Lorsqu'il y a un DOWN+ touche quelque part, mieux vaut toujours le faire suivre à un moment ou un autre par un UP+ de la même touche, on a pas trop envie que notre PC interprète à l'infini l'appui d'une touche même si par la plus grande des chances elle ne perturbe pas votre jeu... On remarquera que pour la définition des fonctions liées aux PULSE+ j'ai repris tout simplement le nom de la variable associée à la touche en question mais écrite en CamelCase. Et en commentaire j'ai pris soin d'indiquer la ligne à laquelle se trouve la variable dans les fichiers .tmh pour y retrouver facilement la touche correspondante dans les contrôles, d'où l'intérêt pour ces 2 fichiers d'être identiques pour que chaque ligne dans les contrôles primaires corresponde exactement au même contrôle et à chaque même ligne dans le fichiers des contrôles secondaires, dans le cas où on veuille les utiliser.
Un peu plus bas :
![Image](https://nsm09.casimages.com/img/2023/05/01//mini_23050111424425905718169179.png)
Ici on retrouve donc nos fonctions construites autour du SHIFT+ et CTRL+ associées forcément avec celles construites avec un PULSE+, lorsqu'un contrôle nécessite l'utilisation de l'un ou de l'autre on vient tout simplement le construire avec une nouvelle fonction ici sous la section correspondante. Et devinez quoi ? Le choix du nom de la fonction n'est autre que le même que celui déclaré pour construire le PULSE+ en y ajoutant au début un LS_ dans le cas du SHIFT+ ou un LC_ dans le cas du CTRL+, trop d'inspiration ça fume...
Encore un peu plus bas : (ça y est j'ai le vertige...)
![Image](https://nsm09.casimages.com/img/2023/05/02//mini_23050212040225905718169180.png)
Ici on se réserve une petite section pour y construire quelques spéciales dont j'ai eu besoin et je vais continué à en avoir besoin car je n'ai pas fini à 100% mon profil. Peut-être que vous aussi vous pourriez avoir besoin d'en construire des spéciales à vous... de voir... Ah oui, j'y ai mis un petit rappel de la définition des différentes couches tout en commentaires bien sûr, ça m'a aidé à y voir vert... non c'est pas ça le mot... CLAIR, à y voir clair... Et sinon on descend encore loin comme ça dans ce foutu fichier ? Oui, il fait 371 lignes
![Surprised :-o](./images/smilies/icon_surprised.gif)
![Mr. Green :mrgreen:](./images/smilies/icon_mrgreen.gif)
![Image](https://nsm09.casimages.com/img/2023/05/02//mini_23050212213425905718169186.png)
Ça se corse un peu hein ^^Non, c'est la grande présence de toutes mes indications en vert qui peuvent faire loucher, on va décortiquer pas à pas mais en vérité ça va s'éclairer plus facilement que vous ne le croyez. Si vous avez compris jusque-là ça va être bien plus simple de comprendre la suite, sinon je vous invite à remonter un peu ou à poser vos questions, c'est fait aussi pour ça.
Déjà ça : MACROS BUTTONS : T16000M, ça devrait vous indiquer qu'on va commencer à construire le nom des macros finales pour chaque bouton du T16000M (non sans blague !). Bein y'a plus qu'à, on commence par les boutons du Joystick et si vous avez élaboré un profil via le GUI vous ne devriez pas être perdu sur la correspondance entre le nom d'un bouton et son emplacement sur le Joystick... sinon... bein fermez le SE et ouvrez le GUI pour vous rafraîchir la mémoire
![Thinking :gruebel:](./images/smilies/icon_think.gif)
define Display_Missions_I_OD CHAIN( LS_Missions ) // I | OD
On veut construire ici une macro qui reproduit le raccourci clavier 'Missions', donc qui affiche la page des missions en jeu, on définit donc une fonction qui va lancer notre contrôle SHIFT+ 'm' et ce contrôle a été construit préalablement :
- Tout d'abord, la lettre 'm' a bien été définie en contrôle primaire dans le fichier H-Primary__X4_MAMY-PROFIL.tmh stockée dans la variable :
- int missions = 'm'; (à la ligne 89 pour rappel)
- Ensuite, dans notre fichier Macros__X4_MAMY-PROFIL_T16000M-TWCS.ttm on a bien construit un PULSE+ de cette touche 'm' :
- define Mission PULSE+ missions
- Comme il s'agit d'un SHIFT+ on a aussi bien pris soin d'en construire la fonction adéquate associée à ce PULSE+ :
- define LS_Missions DLS, Missions, ULS
- Et c'est bien sur cette dernière que l'on veut provoquer l'enchaînement des touches pour notre macro, c'est pourquoi on utilise obligatoirement la fonction CHAIN() lorsqu'il s'agit d'un enchaînement de touches et de délais :
- CHAIN( LS_Missions )
- On a tout, il faut définir un nom à cette fonction et pour ça j'ai pris systématiquement l'habitude d'accoler à la fin du nom l'indication des couches dans (la)lesquelles elle va être utilisée, on oublie pas le define bien sûr :
- define Display_Missions_I_OD
- Oui à la fin je ne peux m'empêcher d'indiquer en commentaire à nouveau la/les couches dans (la)lesquelles la fonction va être utilisée :
- // I | OD
- On met ça dans le bon ordre bien entendu pour avoir la ligne complète du boyau et on a le verdict du légiste :
- define Display_Missions_I_OD CHAIN( LS_Missions ) // I | OD
Ok, ensuite ? Ah bein oui c'est pas fini
![Evil or Very Mad :evil:](./images/smilies/icon_evil.gif)
![Headbang :headbang:](./images/smilies/icon_headbang.gif)
![Image](https://nsm09.casimages.com/img/2023/05/02//mini_23050201115025905718169188.png)
Ces + de 700 lignes s'expliquent assez vite au regard de comment j'ai disposé l'écriture pour chaque bouton de chaque périphérique, tout me paraît bien plus lisible comme ça à la verticale. En réalité il y en aurait 6x moins si pour chaque mappage de bouton j'avais tout gardé sur 1 seule ligne... mais c'est pas lisible du tout et pour bien identifier à quel ensemble de couches correspond chaque mappage j'ai pu justement par ce biais ajouter en commentaire l'ensemble de couches correspondantes à chaque mappage comme on peut le voir.
Dans une même ligne de chaque fonction MapKeyIOUMD(...), le mappage selon les couches est toujours dans ce même ordre :
IU / OU / IM / OM / ID / OD
Une fois qu'on a identifié ça, il suffit de placer au bon endroit la fonction qu'on veut et que l'on a bien construit pas à pas dans notre fichier Macros, on oublie pas la virgule à la fin de chaque mappage sauf pour le dernier et on ferme par ); et la boucle est bouclée ! Et pour avoir à peu près tout testé via leur outil le DEVICE ANALYSER présent dans le SE : tout fonctionne à merveille ^^
J'ai donc bien pour ma mascotte B5 les fonctions suivantes selon l'ensemble des couches :
- Affichage des Missions : lorsque je suis à pieds (I), que la couche Combat (U) soit activée ou pas... mais aussi lorsque je suis dans la manipulation des menus (D), lorsque la carte est ouverte par exemple, c'est le cas le plus fréquent pour cette couche
- (Dés)Activation de la Croisière : uniquement lorsque je suis aux commandes en vol, que je sois en combat ou pas donc pour les ensembles OU et OM seulement
![Skull :skull:](./images/smilies/icon_skull.gif)
Dans la toute 1ère illustration du fichier Macros plus haut, on aperçoit la déclaration d'une variable :
char bool;
Kécécé ? Oui on va pouvoir se servir de variables pour ajouter de nouvelles fonctionnalités à nos boutons selon leur valeur... What ?? Pas compris... Oui bein 2 minutes, j'texplique. Imaginons une variable 'bool' de type booléen dont les seules valeurs qu'elle peut prendre sont vrai/faux ou 1/0. Imaginons que lorsqu'on actionne par exemple le mini-joystick sur le T16000M vers le haut : notre variable prend la valeur VRAI ou 1 et lorsqu'on relâche notre variable reprend sa valeur par défaut FAUX ou 0... ça fait penser à un bouton qui permute de couche non ? Mais Mamy mais Pourquoi tu fais ça ?
- Je suis aux commandes de mon vaisseau en vol, en mode exploration simple, donc hors combat, je suis donc dans l'ensemble de couches OM selon mon profil.
- Sur l'ensemble des 3 mini-joysticks sur le côté du TWCS j'ai une fonction différente pour toutes les touches comme afficher les missions, activer le scan, la croisière, le MATS... etc.
- Je passe en mode combat parce qu'il y a des ennemis, j'appuie donc sur le bouton pour passer de la couche (M) vers la couche (U), je suis donc maintenant dans l'ensemble OU selon mon profil.
- Vu que j'ai changé de couche, là où j'avais afficher les missions, activer le scan, la croisière et le MATS j'ai désormais autre chose comme par exemple l'armement des tourelles, le déploiement des drones... etc.
- Mais je voudrais aussi continuer de profiter des fonctions que j'avais dans la couche (M) même lorsque je suis dans la couche (U) tout en restant dans la couche (U).
- De même que je voudrais profiter lorsque je suis dans la couche (M) des commandes présentes dans la couche (U) tout en restant dans la couche (M)... (t'es pas chiant toi... oui, c'est pour ça qu'on change les couches...)
- Bonjour madame la variable !! Comment ça va ?
Imaginez le bouton d'un mini-joy qui lorsqu'on est en OM avec bool == 0 : lance l'affichage des missions ; et lorsque bool == 1 en restant en OM : lance le déploiement des drones
Maintenant on passe en mode combat en OU avec bool == 0 : notre bouton lance le déploiement des drones ; et lorsque bool == 1 en restant en OU : il affiche les missions...
Une histoire de permutation à nouveau, mais sans changer de couches ^^ seulement en activant un autre bouton, on change l'état d'une variable et on peut conditionner le reste des boutons en fonction de cet état... tordu vous dites ? L'objectif du tuto n'est pas de juger si c'est tordu ou pas mais bien de montrer que c'est possible et comment c'est possible, à vous de voir si ça va vous être utile ou pas.
Allez on accélère, retournons dans notre fichier Macros pour voir ça de plus près :
![Image](https://nsm09.casimages.com/img/2023/05/02//mini_23050212585625905718169375.png)
H1U pour le T16000 correspond au mini-joy du haut, donc j'ai bien paramétré le fait que lorsque ce mini-joy est activé vers le haut ma variable bool prend 1 comme valeur et revient à 0 lorsque je relâche. Maintenant je conditionne le reste autour de ça, avec TBTN4 par exemple, dans le 2ème encadré où j'ai définis plusieurs choses :
- Je suis à pieds (I), peu importe que la couche combat (U) soit active ou que je sois dans la couche (M), activer TBTN4 me fera regarder vers le haut avec bool == 0, donc sans actionner vers le haut le mini-joy du T16000.
- Dans ces mêmes couches, si j'active le mini-joy du T16000 vers le haut (bool == 1) + j'active TBNT4 et là c'est la fonction de retour au vaisseau qui se lance.
- Je suis aux commandes en vol, combat ou pas donc OU ou OM, sans activer le mini-joy (bool == 0), actionner TBNT4 me permet de tirer avec les armes secondaires.
- Mêmes conditions, j'actionne le mini-joy (bool == 1) + TBTN4 me fait me lever du siège et donc quitter les commandes du vaisseau.
- Pour la couche (D), elle n'est pas conditionnée par la variable bool, dans tous les cas la fonction sera de faire un dézoom sur la map.
• On fait un basique IF/ELSE (SI/SINON) :
"SI (condition remplie) FAIT CECI; SINON FAIT CELA;"
• On commence la construction de notre macro en englobant notre conditionnement dans la fonction EXEC() comme le prévoit le manuel :
EXEC( "if (condition remplie) FAIT CECI; SINON FAIT CELA;" )
• Notre condition c'est "if (bool == 1)", ce qui revient à écrire :
EXEC( "if (bool) FAIT CECI; SINON FAIT CELA;" )
• Si la condition est remplie on veut FAIRE CECI, ici c'est lancer la fonction qui nous fait retourner au vaisseau à savoir LS_ReturnShip, mais on est obligé d'utiliser la fonction ActKey(KEYON+ mafonction) : (cf. manuel !!)
EXEC( "if (bool) ActKey(KEYON+ LS_ReturnShip); SINON FAIT CELA;" )
• SINON (else) on veut FAIRE CELA, ici c'est la fonction de regarder vers le haut à savoir FPSLookUp, toujours avec ActKey(KEYON+ mafonction) :
EXEC( "if (bool) ActKey(KEYON+ LS_ReturnShip); else ActKey(KEYON+ FPSLookUp);" )
Et vous comprenez bien maintenant l'utilité d'avoir grandement simplifié l'écriture du code, je vous laisse imaginer la lecture brute par exemple de la fonction FPSLookUp_ReturnShipIF_IUM si on devait mettre bout à bout tous les CHAIN( DOWN+ L_SHIFT, D(), PULSE+, D()... ) et autres joyeusetés qu'on a pris soin de synthétiser pas à pas... tout l'intérêt de ce tuto était de vous montrer certaines choses possibles tout en vous montrant une façon d'organiser, de factoriser afin de rendre le code buvable et lisible.
Ce que je disais bien plus haut sur le fait qu'on peut faire encore plus de choses avec le SE réside par exemple ici, alors on peut faire encore bien bien plus, mais vous savez bien que X4 n'est pas une simulation nécessitant autant de commandes complexes et différentes qu'un simulateur de vol. Pour ne pas surcharger le tuto je n'ai abordé que l'aspect réglages des macros sur les touches et ne me suis pas penché sur les axes, il y aurait un tuto tout aussi long à faire dessus...
Voilà j'espère que ce tuto était au moins buvable pour vous ^^ moi j'ai déjà vomi dans un coin de ma tête... j'espère aussi que ça aidera, au moins ça fournira une source d'infos sur le SE de TARGET, une base de départ. Bien entendu s'il y a des questions ou des personnes ayant besoin d'aide Mamy est là, je ferais de mon mieux pour vous aider, bon vol !!
![Wink :wink:](./images/smilies/icon_wink.gif)