Skip to the content.

Navigation: page “Mission Maker” du site de documentation VEAF


🚧 TRAVAUX EN COURS 🚧

La documentation est en train d’être retravaillée, morceau par morceau. En attendant, vous pouvez consulter l’ancienne documentation.


Table des matières

Introduction

Le module Radio permet de gérer les menus radio des scripts VEAF.

Il permet également de créer facilement des menus pour déclencher des actions à la demande, liés ou non à des groupes d’appareils.

Principes

Le menu radio de DCS possède une entrée “F10. Other” qui peut être programmée.

On peut y ajouter des menus, qui contiennent d’autres menus, et ultimement des commandes.

Ces dernières peuvent déclencher des actions en exécutant arbitrairement du code dans la mission.

Le module Radio utilise cette entrée pour créer des menus VEAF qui permettent d’interagir avec les scripts. C’est entièrement automatique, dès lors que le module est activé (et il devrait l’être, sans lui les autres scripts risquent de ne pas bien fonctionner).

Exemple - menu radio standard VEAF

veaf_radio_menu

C’est le menu radio standard VEAF. On peut également créer facilement des menus et des commandes imbriqués qui permettent au mission maker de déclencher des actions au besoin.

Exemple - menu radio utilisateur

user_radio_menu

Comment configurer le module

Comme d’habitude, ça se passe dans le fichier de configuration de la mission missionConfig.lua, qui est situé dans le répertoire src/scripts de votre mission.

Ce dernier est un fragment de code source LUA qui permet de choisir la manière dont les scripts VEAF sont activés et configurés. Nous vous conseillons d’utiliser Notepad++ ou Visual Studio Code pour l’éditer.

Par défaut, si vous avez utilisé le convertisseur de mission existante pour préparer votre dossier de mission VEAF, il contient déjà la configuration nécessaire.

Sinon, le principe de configuration est simple, il suffit de recopier le code ci-dessous:

if veafRadio then
    veaf.loggers.get(veaf.Id):info("init - veafRadio")
    veafRadio.initialize(true)
end

Comment configurer un menu radio utilisateur

Pour créer un menu radio spécifique et dédié à la mission, il suffit de créer sa structure dans une table LUA, puis d’utiliser la fonction veafRadio.createUserMenu; exemple:

veafRadio.createUserMenu(
  {  
    {"menu", "Mission menus", {
        {"menu", "QRA management", {
            {"menu", "QRA Maykop", {
                {"command", "START", _changeQra, {"QRA-Maykop", "stop"}},
                {"command", "STOP", _changeQra, {"QRA-Maykop", "start"}}
            }},
            {"menu", "QRA Minvody", {
                {"command", "START", _changeQra, {"QRA-Minvody", "stop"}},
                {"command", "STOP", _changeQra, {"QRA-Minvody", "start"}}
            }}
        }}
    }}
  }
, groupId)

Pour simplifier l’écriture et la relecture de cette structure, nous mettons à disposition des fonctions d’aide (mainmenu, menu, command); en les utilisant ça devient plus lisible:

local groupId = nil -- set this to a flight group id if you want the menu to be specific to a flight
veafRadio.createUserMenu(
  veafRadio.mainmenu(
    veafRadio.menu("Mission menus", 
      veafRadio.menu("QRA management", 
        veafRadio.menu("QRA Maykop", 
          veafRadio.command("START", _changeQra, {"QRA-Maykop", "stop"}),
          veafRadio.command("STOP", _changeQra, {"QRA-Maykop", "start"})
        ),
        veafRadio.menu("QRA Minvody", 
          veafRadio.command("START", _changeQra, {"QRA-Minvody", "stop"}),
          veafRadio.command("STOP", _changeQra, {"QRA-Minvody", "start"})
        )
      )
    )
  ), groupId
)

Il est important de savoir coder un minimum pour définir ce qui va se passer quand le joueur va cliquer sur les commandes de votre menu.

Dans mon exemple, ça va appeler la fonction _changeQra avec pour chaque commande un paramètre différent (par exemple, pour la première commande, {"QRA-Maykop", "stop"}) ; on utilise des accolades pour encadrer les paramètres pour pouvoir en passer plusieurs (ça définit une table).

Il faut donc que cette fonction soit définie, et qu’elle accepte et comprenne vos paramètres.

Le plus simple est de définir sa propre fonction, et d’utiliser l’API des scripts VEAF pour vous aider.

Par exemple, voici le code de la fonction dont on parle:

local function _changeQra(parameters)
    local name, startOrStop = veaf.safeUnpack(parameters) -- on extrait les deux paramètres de la table "parameters"
    local qra = veafQraManager.get(name) -- on recherche l'object correspondant à la QRA par son nom
    if qra then
        if startOrStop:upper() == "START" then
            qra:start(false) -- on la lance, sans écrire de message
        else
            qra:stop(false) -- on la stoppe, sans écrire de message
        end
    end
end

Voici un autre exemple, cette fonction détruit le groupe dont le nom est passé en paramètre (utile pour contrebalancer l’inefficacité relative d’une CAP humaine, par exemple):

local function _destroyGroup(name)
    local names = name
    if type(name) == "string" then
        names = {name}
    end
    for _, name in pairs(names) do
        local _group = Group.getByName(name)
        if _group then
            _group:destroy()
            trigger.action.outText(string.format("Group %s has been destroyed", name), 10)
        end
    end
end

Et voici comment l’utiliser dans un menu radio:

local groupId = nil -- set this to a flight group id if you want the menu to be specific to a flight
veafRadio.createUserMenu(
  veafRadio.mainmenu(
    veafRadio.menu("Mission menus", 
      veafRadio.menu("Destruction d'unités", 
        veafRadio.menu("CAP ennemie", 
          veafRadio.command("CAP Maykop", _destroyGroup, "CAP-Maykop"),
          veafRadio.command("CAP Minvody", _destroyGroup, "CAP-Minvody")
        ),
        veafRadio.menu("SAM ennemis", 
          veafRadio.command("SA6 Maykop", _destroyGroup, "SA6-Maykop"),
          veafRadio.command("SA10 Minvody", _destroyGroup, "SA10-Minvody")
        )
      )
    )
  ), groupId
)

Enfin, un exemple qui écrit des drapeaux (flag) pour déclencher des actions dans des triggers du mission editor:

local groupId = nil -- set this to a flight group id if you want the menu to be specific to a flight
veafRadio.createUserMenu(
    veafRadio.mainmenu(
        veafRadio.menu("Mission menus",
            veafRadio.menu("Gestion de flags",
                veafRadio.menu("Gérer le drapeau ALPHA",
                    veafRadio.command("ON", veafSpawn.missionMasterSetFlagFromTable, { "alpha", 1 }),
                    veafRadio.command("OFF", veafSpawn.missionMasterSetFlagFromTable, { "alpha", 0 })
                ),
                veafRadio.menu("Gérer le drapeau 127",
                    veafRadio.command("Incrémenter", veafSpawn.missionMasterIncrementFlagValue, 127),
                    veafRadio.command("Décrémenter", veafSpawn.missionMasterDecrementFlagValue, 127)
                )
            )
        )
    ), groupId
)

On peut aussi ajouter plusieurs menus, et optionnellement choisir quels menus sont affichés pour un groupe DCS en particulier; utile pour avoir un menu pour tout le monde, et un menu juste pour le mission maker !

Les possibilités sont infinies. N’hésitez pas à me contacter si vous avez des questions !

Contacts

Si vous avez besoin d’aide, ou si vous voulez suggérer quelque chose, vous pouvez :