veafAssist — Checklists guidées¶
Module ID: ASSIST | Fichier: veafAssist.lua
Voir en jeu : étape 17 « Météo, ATC et assistance cockpit » de la mission de démo.
Objectif¶
Guide un pilote pas à pas dans une procédure. À chaque étape, le module encadre dans le cockpit la commande à actionner, coche la ligne dès que cette commande atteint la bonne position — ou dès que le pilote confirme lui-même —, et passe à la suivante. La checklist complète reste affichée à l'écran sous forme d'image.
Le module ne connaît aucun appareil : les checklists sont des données, écrites en YAML et converties par la construction de la mission.
Un seul appareil est livré avec une checklist : le F-16C (démarrage moteur).
Pour le pilote¶
Menu radio F10 → ASSISTANCE. Une entrée par checklist applicable à l'appareil : si votre appareil
n'en a aucune, aucune entrée n'apparaît.
Une fois la checklist lancée, deux entrées apparaissent à la racine du menu VEAF — pas dans
ASSISTANCE — pour épargner un aller-retour de menu à chaque étape :
| Entrée | Effet |
|---|---|
| ASSISTANCE : VALIDER L'ÉTAPE | Coche l'étape courante — seulement pour les étapes qui attendent votre confirmation |
| ASSISTANCE : PASSER L'ÉTAPE | Coche l'étape sans la faire, et passe à la suivante |
Le sous-menu ASSISTANCE garde les commandes occasionnelles :
| Entrée | Effet |
|---|---|
| Masquer / afficher la checklist | Cache ou remontre l'image |
| Arrêter l'assistance | Termine la session, efface l'encadré et l'image |
Deux comportements qu'il vaut mieux connaître d'avance :
- Les étapes déjà faites sont cochées au démarrage. Vous pouvez lancer l'assistance en cours de route : ce que vous avez déjà réglé n'est pas redemandé.
- Une étape peut être passée. Si une étape refuse de se valider — une fenêtre de tolérance mal
mesurée, par exemple —,
Passer cette étapeévite de rester bloqué.
Une étape passée apparaît cochée comme les autres sur l'image ; c'est le message texte qui vous le signale sur le moment. L'image est le tableau de bord, les textes portent les événements.
Pour le créateur de mission¶
Activer le module¶
modules:
ASSIST:
enabled: true
display: picture # `picture` (défaut) ou `text`
checklists: [f16c-cold-start] # les checklists que cette mission active
- Avec une liste
checklists:: ce sont exactement celles-là. Unidinconnu fait échouer la construction, plutôt que de laisser une entrée de menu manquer en silence. - Sans liste : les checklists que vous avez déposées dans le dossier
checklists/de votre mission sont activées. Jamais tout le catalogue livré — chaque checklist activée embarque une image par étape dans le.miz. - Module absent ou
enabled: false: rien n'est chargé, rien n'est généré, aucune image dans le.miz.
Image ou texte¶
display choisit comment la checklist s'affiche, et c'est un choix à la construction :
| Mode | Ce que voit le pilote | Ce que ça coûte |
|---|---|---|
picture (défaut) |
la checklist entière à l'écran, cases cochées au fur et à mesure | une image par étape embarquée dans le .miz, environ 10 Ko chacune |
text |
un message donnant l'instruction courante et l'avancement (Étape 3/6 : …) |
rien : aucune image n'est générée ni embarquée |
Dans les deux cas la commande de cockpit est encadrée : le mode texte enlève l'image, pas l'assistance. Une valeur inconnue fait échouer la construction — une faute de frappe ne doit pas retomber en silence sur le mode coûteux.
Concrètement, la checklist F-16C livrée pèse 68 Ko en picture et 0 en text. À quarante étapes,
l'écart dépasse le demi-mégaoctet.
Sans connaître les noms techniques¶
Une étape a besoin de l'élément du cockpit, du numéro d'animation et de la valeur qui veut dire « en position ». Ces trois informations sont enfouies dans les fichiers Lua d'une installation DCS — personne ne devrait avoir à les y chercher.
Décrivez plutôt le contrôle avec vos mots, à côté du libellé :
steps:
- label: Batterie
control: MAIN PWR sur BATT # le contrôle, puis la position voulue
- label: Manette
control: throttle sur IDLE
Puis lancez :
veaf-tools cockpit resolve-checklist checklists/ma-checklist.yaml
L'outil complète les champs techniques dans votre fichier, sous chaque control, et ajoute un
resolved_from qui retient le texte dont ils proviennent :
- label: Batterie
control: MAIN PWR sur BATT
element: PTR-ELEC-TMB-MPWR-510
argument: 510
equals: 0.0
resolved_from: MAIN PWR sur BATT
Vos commentaires, votre indentation et vos lignes vides sont conservés : c'est votre fichier.
Un seul fichier à maintenir. Modifiez un control, relancez la commande : seules les étapes dont
le texte a changé sont retouchées — c'est à ça que sert resolved_from. Une étape dont le control
ne correspond plus à son resolved_from fait échouer la construction de la mission, plutôt que
d'embarquer une étape qui vérifierait l'ancien contrôle sans que personne ne le voie.
--dry-run montre ce qui serait écrit sans toucher au fichier.
Écrire un bon control¶
Nommez le contrôle comme le cockpit le nomme, puis la position : throttle sur idle, pas
« mettre les gaz ». Les mots de liaison (sur, le, bouton, interrupteur, position…) sont
ignorés, en français comme en anglais, et les accents et la casse n'ont pas d'importance.
Un refus n'est pas un échec¶
L'outil refuse plutôt que de deviner, parce qu'une mauvaise résolution donne une checklist qui a l'air terminée et qui ne se validera jamais — on ne s'en aperçoit qu'une fois assis dans le cockpit. Il refuse, en disant ce qu'il a trouvé, quand :
- aucun contrôle ne correspond ;
- plusieurs contrôles correspondent aussi bien (
MAIN PWRetMAIN PWR Test) : vous seul savez ; - la position nommée n'existe pas sur ce contrôle — il liste alors celles qui existent ;
- les valeurs des positions de ce contrôle sont inconnues. C'est le cas de la plupart des contrôles
de l'AH-64D : écrivez
argumentetequalsà la main, ou mesurez la position en jeu.
Si une seule étape est refusée, rien n'est écrit : un fichier à moitié résolu est pire qu'un fichier non résolu.
Enfin, un contrôle sans position lisible — un bouton, un interrupteur à rappel comme le JFS du F-16C — est résolu en étape validée par le pilote, et l'outil vous le dit. Ce n'est pas un défaut : ces contrôles sont revenus au repos avant qu'on puisse les lire, quel que soit le moyen employé.
Explorer un cockpit¶
Pour écrire une checklist il faut savoir trois choses d'une commande : son élément, son numéro d'animation, et la valeur de la position voulue. Cette commande vous les donne en manipulant le cockpit, sans rien lire :
veaf-tools cockpit explore-cockpit F-14BU
Bougez un interrupteur : l'outil vous dit lequel c'est, et vous affiche l'étape toute prête à coller dans votre fichier. La valeur est mesurée, pas déduite. Ctrl-C pour arrêter.
C'est ce qui débloque les appareils que le résolveur ne sait pas aider : sur l'AH-64D, 7 commandes sur 478 ont une valeur de position connue des fichiers — en manipulant, vous les obtenez toutes.
Dans l'autre sens, --control "pompe de transfert" encadre la commande dans votre cockpit avant de
se mettre à l'écoute, pour vérifier d'un coup d'œil que votre formulation désigne bien la bonne
chose — ou tout simplement pour la trouver.
Mêmes conditions que la vérification : DCS sur cette machine, dcs-serve lancé, le pont dans la
mission. Et comme elle, l'outil ne manœuvre jamais rien : il encadre, vous manipulez.
Vérifier une checklist dans le cockpit¶
Une valeur écrite par le résolveur reste une hypothèse tant qu'on n'a pas lu le contrôle avec l'interrupteur physiquement dans la bonne position. Cette commande le fait, avec vous aux commandes :
veaf-tools cockpit verify-checklist checklists/ma-checklist.yaml --write
Pour chaque étape mesurable, l'outil encadre le contrôle dans votre cockpit et attend que vous le bougiez. Dès que la valeur change et se stabilise, il la lit et la compare à celle de la checklist. Vous restez aux commandes du début à la fin : l'outil ne manœuvre jamais rien lui-même, il ne fait qu'encadrer — ce qui est aussi bien pratique quand on ne sait pas où se trouve la commande.
--write marque verified: true les étapes confirmées, pour ne pas les refaire ensuite.
Trois conditions : DCS tourne sur cette machine (la lecture passe par Export.lua, qui est
local), dcs-serve est lancé, et la mission embarque le pont. Une valeur lue différente de celle
attendue est signalée en rouge : c'est le cas intéressant, il veut dire que la checklist a la
mauvaise valeur.
Quel mode de validation choisir¶
Une étape se valide de trois façons, et le choix dépend d'abord de où votre mission va tourner.
| Mode | Ce qui est lu | Multijoueur |
|---|---|---|
argument |
la position d'une commande du cockpit | solo et entraînement local seulement |
param |
une grandeur publiée par l'appareil (altitude, vitesse, train) | partout |
confirm |
rien : le pilote coche lui-même | partout |
La règle, en une phrase : si votre mission est destinée au serveur, n'utilisez pas argument.
Cette lecture passe par l'environnement d'Export.lua, qui tourne sur la machine du pilote ; depuis
un serveur dédié elle ne fonctionnera probablement pas — ce n'est pas encore vérifié. Rien ne casse
pour autant : l'étape ne se coche jamais toute seule et le pilote utilise « Passer ».
Le résolveur produit argument quand il le peut, parce qu'une checklist de démarrage se vole
d'abord seul. Pour une mission de serveur, remplacez ces étapes par confirm — il suffit de
supprimer les lignes argument et equals et d'écrire confirm: true.
Référence du format¶
Cette partie décrit les champs techniques. Vous n'avez pas besoin de la lire pour écrire une checklist : elle sert à relire un fichier résolu, ou à écrire à la main une étape que le résolveur a refusée.
Les champs d'une étape¶
Un fichier par checklist, dans checklists/ à côté de votre mission.yaml. Un id identique à
celui d'une checklist livrée remplace cette dernière.
id: f16c-demarrage # unique ; c'est la clé de remplacement
title: Démarrage F-16C # clé du catalogue i18n, ou texte brut
aircraft: [F-16C_50] # types DCS concernés ; un type inconnu est refusé
menu: cold-start # emplacement sous « ASSISTANCE »
steps:
# Étape validée par le pilote : l'élément est encadré pour montrer où regarder
# (`label` accepte aussi {fr: …, en: …} — voir plus bas)
- label: MAIN PWR sur MAIN PWR
element: PTR-ELEC-TMB-MPWR-510 # élément à encadrer dans le cockpit
confirm: true
# Étape validée automatiquement : on lit une grandeur publiée par l'appareil
- label: Train sorti
param: BASE_SENSOR_NOSE_GEAR_DOWN
equals: 1.0 # valeur cible…
tolerance: 0.05 # …à ± cette tolérance (0.05 par défaut)
# Fenêtre large : range remplace equals + tolerance
- label: Vitesse entre 250 et 300 kt
param: BASE_SENSOR_IAS
range: [128.0, 154.0]
Points à retenir :
- Un
label(et letitle) s'écrit de trois façons :
| Écriture | Sens |
|---|---|
label: assist.f16c.main_pwr_batt |
clé du catalogue VEAF — ce qu'utilisent les checklists livrées |
label: MAIN PWR sur BATT |
texte en clair, une seule langue |
label: {fr: MAIN PWR sur BATT, en: MAIN PWR switch to BATT} |
vos traductions, écrites sur place |
La forme avec traductions est résolue à la construction, dans la langue de la mission — la même
que celle de l'image, donc les deux ne peuvent pas diverger. Si la langue demandée manque, on
retombe sur le français, puis sur n'importe quelle traduction présente : un libellé dans la
mauvaise langue vaut mieux que pas de libellé.
- element est indépendant du mode de validation : une jauge peut être encadrée alors que c'est
le pilote qui dit qu'elle est bonne.
- Trois façons de valider une étape : argument (la position d'une commande), param (une
grandeur publiée par l'appareil), ou rien du tout — c'est alors le pilote qui coche. Une étape en
déclare exactement une.
- La tolérance par défaut de 0.05 convient aux grandeurs qui valent 0 ou 1. Pour une altitude ou
une vitesse, donnez votre propre tolerance, ou un range.
- Une erreur dans le fichier fait échouer la construction avec un message qui nomme le fichier
fautif, plutôt que de produire une erreur Lua en jeu.
Mettre au point une checklist sans refaire tout le démarrage¶
Vérifier l'étape 30 d'un démarrage moteur suppose normalement d'avoir fait les 29 précédentes, dans le cockpit. C'est ce qui rend l'itération sur une checklist assez pénible pour décourager de corriger un détail.
D'où dev_condition, une trappe de mise au point : l'étape se valide d'office, sans que le cockpit
soit dans l'état demandé.
- label: MAIN PWR sur BATT
element: PTR-ELEC-TMB-MPWR-510
argument: 510
equals: 1.0
dev_condition: true # absente d'une checklist livrée
Mettez-la sur les étapes que vous voulez sauter — typiquement 1 à 29 — et laissez celle que vous testez telle quelle : à l'ouverture de la session, l'assistance cochera les étapes truquées et s'arrêtera sur la vôtre.
Ce n'est pas un mode de validation : l'étape garde son argument/param/confirm. La trappe
court-circuite l'évaluation, elle ne remplace pas la mesure — vous pouvez donc la retirer sans rien
réécrire.
Trois garde-fous, parce qu'une checklist truquée qui partirait en production dirait à un pilote qu'il a fait une action qu'il n'a pas faite :
- Absente = comportement normal, exactement. Et
dev_condition: yesoudev_condition: 1sont refusés : seulstrueetfalsesont acceptés, pour qu'une faute de frappe n'ouvre pas la trappe. - La construction vous avertit, en nommant la checklist et le numéro de chaque étape concernée. Elle ne refuse pas : sinon vous ne pourriez pas construire la mission que vous voulez justement essayer.
- Le pilote le voit à l'écran au démarrage de la checklist : « ⚠ N étape(s) se valident d'office ». C'est le garde-fou qui ne dépend de la lecture d'aucun journal.
Lire la position d'un interrupteur : argument¶
- label: MAIN PWR sur MAIN PWR
element: PTR-ELEC-TMB-MPWR-510
argument: 510 # l'argument d'animation de la commande
equals: 1.0
tolerance: 0.05
Le nombre en fin de nom d'élément est l'argument : PTR-ELEC-TMB-MPWR-510 → 510.
Quelle valeur pour quelle position ? Elle n'est pas déductible du libellé : le MAIN PWR du
F-16C affiche MAIN PWR/BATT/OFF et vaut +1 / 0 / −1 — dans l'ordre inverse — tandis que
OFF/BACKUP vaut 0 / 1. La seule source fiable, ce sont les raccourcis clavier et joystick de
l'appareil, qui donnent le couple position-valeur noir sur blanc :
MAIN PWR Switch - OFF met −1, - BATT met 0, - MAIN PWR met +1. C'est exactement ce que le
résolveur lit à votre place ; écrire un control vous évite tout ce paragraphe.
⚠️ Réserve multijoueur : ce mode est réservé au solo et à l'entraînement local — voir Quel mode de validation choisir.
Deux cas où argument ne marchera de toute façon pas :
- un interrupteur à rappel (
springloaded_*dansclickable_defs.lua, comme le JFS du F-16C) est déjà revenu au neutre quand on le lit ; - un bouton n'est pas une position : l'argument 757 du F-16C est le doigt de cut-off de la manette, pas la position de la manette.
Mesures et détails : DCS cockpit + picture API.
Trouver un param¶
Ce qu'on peut lire, c'est l'effet d'une commande, pas la commande. Sur un F-16C au parking, 78 grandeurs sont publiées, parmi lesquelles :
| Paramètre | Ce qu'il vaut |
|---|---|
BASE_SENSOR_NOSE_GEAR_DOWN |
1 train avant sorti |
BASE_SENSOR_WOW_LEFT_GEAR |
1 poids sur la roue gauche |
BASE_SENSOR_CANOPY_POS |
ouverture de la verrière, 0 à 1 |
BASE_SENSOR_FLAPS_RETRACTED |
1 volets rentrés |
BASE_SENSOR_IAS |
vitesse indiquée (m/s) |
BASE_SENSOR_BAROALT |
altitude barométrique (m) |
BASE_SENSOR_HEADING |
cap (radians) |
BASE_SENSOR_FUEL_TOTAL |
carburant restant |
La liste dépend de l'appareil : chaque module publie ce qu'il veut. Pour voir celle du vôtre,
appelez list_cockpit_params() dans l'environnement mission — elle renvoie un NOM:valeur par ligne.
Trouver l'élément à encadrer¶
Le plus simple reste d'écrire un control et de laisser
le résolveur le trouver : il connaît les contrôles des appareils indexés
(F-16C, A-10C II, AH-64D, F-14B et F-14B(U)) et il vous donne le nom exact.
Pour un appareil qui n'est pas indexé, le nom se lit dans les fichiers du module, dans votre installation DCS :
<DCS>\Mods\aircraft\<Appareil>\Cockpit\Scripts\clickabledata.lua
Seuls les éléments cliquables y figurent : une jauge ou un voyant n'a pas de nom à encadrer.
Vous pouvez aussi indexer cet appareil une bonne fois, et le résolveur saura le traiter comme les autres :
veaf-build update-dcs-data --cockpit-controls --dcs-path "C:/Program Files/Eagle Dynamics/DCS World"
Ce que ça coûte¶
L'affichage repose sur une image embarquée dans le .miz, et DCS ne sait afficher qu'une ressource
embarquée. La construction génère donc une image par état d'avancement : une checklist de douze
étapes fait treize images, soit de l'ordre de 60 à 80 Ko au total. Une mission qui n'active aucune
checklist ne paie rien.
La construction affiche le nombre d'images et leur poids total, pour que le prix soit visible au moment où on l'engage.
Limite connue¶
L'avancement affiché est linéaire : l'image de l'étape 5 montre les quatre premières cochées. Une étape que le pilote a passée y apparaît donc cochée comme les autres. Représenter fidèlement « passée » demanderait une image par combinaison d'états, ce qui explose. C'est le message texte qui porte l'exception.