Support d'artillerie par IA configurable (GDC AR Lib)

Ce système est en version beta et est susceptible de rencontrer des bugs

Support artillerie par IA ou artillerie virtuelle ?

Il est possible - et plus simple pour le mission maker - d'utiliser le système d'artillerie virtuel. Les prefabs vanilla disponibles sont puissants et hautement configurables. Un article du wiki décrit les paramètres de ces prefabs : Comment paramétrer des tirs de mortiers (virtuels). Cependant, ce système a plusieurs limites, notamment le fait que les mortiers n'existant pas, ils ne peuvent pas être détruits. De plus, le système est tout-puissant : les mortiers, sauf à ce que le mission maker prenne en compte volontairement ce paramètre, n'ont pas de limite de portée. De plus, les salves de tirs sont parfois irréalistes, sauf à imaginer une batterie de 5 mortiers ou plus tirant en continu.

A contrario, le système de support d'artillerie par IA, est un (tout petit) peu plus long à mettre en œuvre car il faut que des mortiers et des servants soient posés ou spawnés. En outre, il est plus réaliste :

  • le mortier ne peut pas tirer plus vite que la cadence de tir de l'IA (réglage des azimuts, chargement des obus),
  • la portée est limitée par la configuration de l'arme (faible en vanilla, autour de 2,5 km pour les mortiers de 80 mm vanilla),
  • les tirs des mortiers sont audibles, ce qui permet de détecter leur position,
  • plus polyvalent, car il peut être utilisé avec n'importe quelle arme de tir indirecte (non testé).

Le système GDC_ArtilleryFireSupport

Le prefab GDC_ArtilleryFireSupport.et permet de définir une mission d'appui-feu indirect par mortiers depuis le World Editor. Il commande un groupe IA déjà présent dans la scène (ou spawné dynamiquement) et lui fait exécuter une ou plusieurs séquences de tir sur une position choisie. Le système est :

  • Facile à configurer, sans script ni événement personnalisé à créer.
  • Flexible : permet de paramétrer simplement des missions d'appui composées de plusieurs ordres de tir (nombre d'obus, zone d'impact, délai entre les ordres, etc.).
  • Peut s'adapter à de nombreux cas d'usage : tir au début de la mission, appui-feu déclenché par un drapeau du TilW Mission Framework (TMF), permet d'utiliser un mortier spawné dynamiquement, etc.

Le prefab est disponible dans le mod GDC AR Lib, à l'emplacement GDC AR Lib>Prefabs>AI>Artillery>GDC_ArtilleryFireSupport.et. Il peut être utilisé en vanilla, mais requiert le TilW Mission Framework (TMF) pour bénéficier du déclenchement par flag ou du spawn dynamique. Cet article suppose que vous maîtrisez le TMF. Si ce n'est pas le cas, un tutoriel de prise en main est disponible : Créer une mission avec TilW Mission Framework.

Comment ça fonctionne

Vous placez le prefab GDC_ArtilleryFireSupport.et dans la scène à l'endroit où vous voulez centrer la zone d'impact. Il référence un mortier (ou son groupe IA) via le champ AIGroup Name. Quand le timer ou la condition de déclenchement est remplie, il envoie au servant une série d'ordres de tir (*fire orders*) à exécuter l'un après l'autre.

L'image ci-dessus illustre une séquence de trois ordres de tir : chaque anneau visible dans le World Editor correspond à un ordre et matérialise sa zone d'impact. Les anneaux s'affichent dès que l'entité est sélectionnée (option Show Debug Rings activée) et leur couleur passe du jaune pour le premier ordre au rouge pour le dernier. Chaque ordre définit :

  • un nombre d'obus à tirer,
  • une zone d'impact en forme de anneau centrée sur le prefab, définie par un rayon intérieur et un rayon extérieur en mètres (rayon intérieur à 0 pour un disque plein, sans zone morte au centre),
  • un délai avant l'ordre suivant.

Les impacts sont répartis aléatoirement dans l'anneau avec une distribution uniforme : il n'y a pas de concentration au centre.

Dans la plupart des cas, les IA seront inactivées par le système de simulation dynamique du moteur de jeu. Pensez à forcer les IA en question en LOD 0 (lire l'article L'optimisation des IA dans Arma Reforger : le système de LOD)

Référence des paramètres

GDC_ArtilleryFireSupportComponent

Paramètre Valeur par défaut Description
AIGroup Name (m_sAIGroupName) (vide) Nom de l'entité mortier ou du groupe d'IA à commander.
Condition Flag (m_sConditionFlag) (vide) Drapeau du TilW Mission Framework qui déclenche la mission. Si vide, la mission démarre immédiatement au lancement de la partie.
Initial Delay (m_fInitialDelay) 5 s Délai entre le déclenchement et le premier tir.
Ammo Type (m_eAmmoType) HIGH_EXPLOSIVE Type de munition pour tous les ordres de tir de cette mission.
Fire Orders (m_aFireOrders) (vide au niveau du code du composant, mais trois ordres de tir définis par défaut dans le prefab, cf. copie d'écran ci-dessus) Séquence ordonnée d'ordres de tir (voir ci-dessous). Exécutés du premier au dernier.
Show Debug Rings (m_bShowDebugRings) true (World Editor uniquement) Affiche les anneaux d'impact de chaque ordre de tir dans l'éditeur quand l'entité est sélectionnée.

GDC_ArtilleryFireOrder (un élément de la liste Fire Orders)

Paramètre Valeur par défaut Description
Shot Count (m_iShotCount) 1 Nombre d'obus pour cet ordre. Mettre -1 pour un tir infini (la mission ne passe pas à l'ordre suivant).
Min Radius (m_fMinRadius) 80 m Rayon intérieur de l'anneau d'impact. Aucun obus ne tombe plus près que cette distance du centre _sauf dispersion du mortier_. 0 = disque plein (pas de zone morte au centre).
Max Radius (m_fMaxRadius) 90 m Rayon extérieur de l'anneau. Aucun obus ne tombe plus loin _sauf dispersion du mortier_.
Delay After (m_fDelayAfter) 5 s Délai avant l'ordre suivant. Ignoré pour le dernier ordre de la séquence.

Cas d'usage

Cas 1 — Tout est défini dans l'éditeur

C'est le cas le plus simple, mais le moins flexible. Le mortier et son servant sont posés en éditeur, idem pour le prefab GDC_ArtilleryFireSupport.

Poser un mortier et son servant IA

Si vous ne savez pas comment affecter une IA en tant que servant d'un mortier, lisez d'abord : Attribuer un ou des servants à une arme fixe ou un équipage à un véhicule

Placer et configurer GDC_ArtilleryFireSupport

Dans le Resource Browser, ouvrez GDC AR Lib>Prefabs>AI>Artillery et glissez GDC_ArtilleryFireSupport.et dans la scène à l'endroit où vous voulez centrer la zone d'impact. Les anneaux de chaque ordre de tir sont centrés sur le gizmo du prefab.

Configurez les paramètres :

  • AIGroup Name → le nom donné au groupe d'IA servant le mortier ou, si vous utilisez le composant TILW_VehicleCrewComponent pour le servant, le nom renseigné dans le champ Entity Name de ce composant (voir la section dédiée à TILW_VehicleCrewComponent dans l'article sur les armes fixes avec servant IA)
  • Condition Flag → voir ci-dessous pour les différentes options de déclenchement
  • Initial Delay → temps de réaction entre le déclenchement et le premier obus
  • Ammo Type → choisissez le type de munition
  • Fire Orders → ajoutez au moins un ordre de tir
Déclenchement par timer (sans TMF)

Laissez Condition Flag vide. La mission s'active au lancement de la partie, après le délai Initial Delay.

Déclenchement par flag TMF

Renseignez Condition Flag avec le nom d'un flag TMF (ex. GO_ARTY). La mission se déclenche dès que ce flag passe à true.

Avec cette approche, vous pouvez pouvez poser plusieurs prefabs de tir dans la scène et les déclencher indépendamment les uns des autres via des flags différents. La seule limite est que les positions des prefabs GDC_ArtilleryFireSupport doivent être définies à l'avance dans la scène.

Cas 2 — La position sur laquelle la mission de tir est spawnée n'est pas connue à l'avance

Ici, le mortier et son servant sont posés en éditeur comme au Cas 1. Mais on veut pouvoir définir lors de l'exécution la position sur laquelle va être déclenchée la mission de tir (par exemple, sur les joueurs =)). Autrement dit, la mission d'artillerie elle-même (le prefab GDC_ArtilleryFireSupport.et) est lancée à l'exécution (par un TILW_PrefabSpawnerEntity ou une instruction TILW_SpawnPrefabInstruction).

Poser le mortier et son servant

Même procédure que pour le cas 1.

Créer un ou des prefabs dérivés de GDC_ArtilleryFireSupport

Puisque le prefab de tir est spawné dynamiquement, il ne peut pas être configuré directement dans la scène, en particulier pour le champ AIGroup Name. La solution est de créer un prefab dérivé de GDC_ArtilleryFireSupport.et en renseignant son champ AIGroup Name avec le nom du groupe d'IA servant le mortier.

Vous pouvez ainsi spawner ce prefab dérivé à l'exécution, à la position d'impact voulue (propriété Location name du spawner du TMF) via un TILW_PrefabSpawnerEntity ou une instruction TILW_SpawnPrefabInstruction.

Vous pouvez créer autant de prefabs dérivés que de types de missions de tir que vous voulez spawner, avec des noms explicites (ex. GDC_ArtilleryFireSupport_TargetPlayers.et pour une mission ciblant les joueurs). Puisque ces prefabs vont contenir des paramètres spécifiques à votre mission (a minima, le AIGroup Name), il est conseillé de les enregistrer dans un dossier propre à votre mission, par exemple VotreModDeMission>Worlds>MissionArty>Prefabs>Arty>GDC_ArtilleryFireSupport_TargetPlayers.et.

TODO: article qui explique comment créer un prefab dérivé avec des paramètres différents du prefab original.

Cas 3 — Le mortier est spawné dynamiquement

Dans les cas 1 et 2, le mortier est déjà présent dans la scène, ce qui permet de le référencer facilement dans le champ AIGroup Name du prefab GDC_ArtilleryFireSupport ou de ses dérivés (cas 2). Mais parfois, on veut faire spawner le mortier lui-même dynamiquement. Dans ce cas, son nom n'est pas connu à l'avance.

Spawner le mortier et lui attribuer un nom

Placez un TILW_PrefabSpawnerEntity pour le mortier dans la scène et configurez-le :

  • Prefab → le prefab du mortier (avec TILW_VehicleCrewComponent configuré pour son équipage)
  • Set Entity Names → un nom unique, par exemple mortier_dynamique

Le mortier spawné portera le nom mortier_dynamique dès sa création.

Créer un prefab dérivé de GDC_ArtilleryFireSupport

Même procédure que pour le cas 2, mais cette fois, renseignez le champ AIGroup Name du prefab dérivé avec le nom donné au mortier dans le spawner (ex. mortier_dynamique).

Spawner ensuite la mission de tir comme à l'accoutumée, en utilisant ce prefab dérivé.

L'ordre de spawn est critique : le servant doit être monté dans le mortier avant que GDC_ArtilleryFireSupport tente de résoudre le groupe IA. Utilisez des flags distincts ou un délai (Spawn Timings) pour garantir cet ordre — le champ Initial Delay du prefab de tir peut aussi absorber ce délai. Si vous spawnez un groupe avec le composant TILW_VehicleCrewComponent, assurez-vous que la case No Turret Dismount est cochée pour ce groupe.

Récapitulatif des trois cas

Cas 1 — Tout en éditeur Cas 2 — Mission spawnée dynamiquement Cas 3 — Mortier et mission de tir spawnés dynamiquement
TFM requis Non (timer) / Oui (flag) Oui Oui
Mortier posé comment Éditeur Éditeur Via un spawner (m_setEntityNames fixe son nom)
GDC_ArtilleryFireSupport posé comment Éditeur Via un prefab dérivé + spawner Via un prefab dérivé + spawner
Valeur de AIGroup Name Nom du mortier (éditeur) Nom du mortier (éditeur, dans le prefab dérivé) Nom attribué au mortier par son spawner (dans le prefab dérivé)
Position d'impact Fixée en éditeur Fixée au runtime (position du spawner) Fixée au runtime (position du spawner)
Plusieurs missions vers la même batterie Possible (plusieurs prefabs en éditeur) Facile (plusieurs spawners, même prefab dérivé) Facile (plusieurs spawners de mission, déclenchés après le spawn du mortier)
Déclenchement Timer ou flag TFM Au spawn (flag TFM) Au spawn (flag TFM, après le spawn du mortier)
Spawner nécessaire Non Oui (un par mission de tir) Oui (un pour le mortier + un par mission de tir)