PLUTO - GdC-Framework/GdC_lib GitHub Wiki

Lien vers le code

Introduction

PLUTO est un petit système d'IA qui a pour objectif initial de simuler une communication basique entre les différents groupes ennemis afin d'offrir une solution relativement simple au syndrome des IA qui patrouillent pépère alors qu'un autre groupe IA vient de se faire flinguer à quelques mètres de là.
J'ai aussi rajouté deux fonctionnalités complémentaires optionnelles qui permettent aux IA d'utiliser les informations récoltées afin d'entreprendre des actions spécifiques.

En gros PLUTO fait donc les choses suivantes :

  • Lorsqu'un groupe IA repère une unité ennemie, l'information est transmise aux autres groupes d'IA qui sont à proximité.
  • Il est possible de désigner des groupes IA "QRF" qui ont pour rôle d'attaquer les ennemis ainsi repérés.
  • Il est possible de désigner des groupes "artillerie" qui peuvent bombarder les ennemis ainsi repérés.

Ce que PLUTO ne fait pas :

PLUTO n'est pas GAIA. Bien que PLUTO emprunte à GAIA une partie de son fonctionnement (notamment pour la récolte de d'information), il n'est pas aussi approfondi dans la mesure où il ne vise pas à simuler un système complet de gestion dynamique des groupes IA. PLUTO est plutôt une surcouche qui peut être appliquée sur une mission classique crée dans l'éditeur.
Par exemple, cela veut dire que PLUTO ne gère pas les patrouilles où les renforts scriptés des IA (le système de QRF inclu n'est pas un système de renfort).
En somme, PLUTO n'intervient réellement dans la mission qu'à partir du moment où les IA ont repéré des ennemis.

PLUTO n'est pas conçu pour être utilisé en conjonction avec GAIA ou tout autre système de gestion dynamique des IA.

Comment ça marche

La boucle

Toutes les 10 secondes et pendant toute la mission PLUTO effectue une boucle qui passe par deux étapes.

1/ Tout d'abord, PLUTO dresse une liste des contacts ennemis connus par les groupes IA du camp auquel il est assigné.

2/ Ensuite, le contenu de cette liste est transmis aux groupes IA du même camp. Chaque groupe IA reçoit une partie de cette liste définie en fonction de la distance qui le sépare de chaque contact.
Pour qu'un groupe ennemi soit révélé à un groupe IA qui n'est pas encore au courant de son existence il faut donc que la distance qui sépare l'un de l'autre soit inférieure à une distance définie.
Cette distance est un paramètre appelé "Reveal Range" et il peut être modifié de différentes manières.
Si la condition de distance est validée, le contact ennemi est ainsi révélé au groupe IA. Ce dernier est maintenant au courant de la présence d'un contact ennemi à tel endroit et il peut entreprendre d'éventuelles tâches spéciales.

Réaction basique au contact

Dans arma 3, lorsqu'un groupe IA est mis au courant de la présence d'un contact ennemi, il se met en étant d’alerte et il est probable que certains de ses membres soient envoyés à la rencontre du contact si celui-ci n'est pas très loin. Si le contact ennemi disparait (éliminé ou perdu de vue pendant longtemps) le groupe IA reprend la tâche qu'il effectuait auparavant. Ceci est donc le comportement naturel de l'IA arma 3.
Lorsqu'un contact ennemi est révélé à un groupe IA via PLUTO, il se produit la même chose à moins qu'une tâche spéciale ai été assignée au groupe IA.

Les tâches spéciales

Il est possible d'assigner des tâches spéciales à chacun des groupes IA d'une mission. Celles-ci sont déclenchées lorsqu'un groupe apprend l'existence d'un contact ennemi via PLUTO. Pour l'instant, il n'existe que deux types de tâches spéciales.

  • QRF : un groupe IA QRF abandonne sa tâche en cours et de nouveaux points de passage sont générés pour qu'il parte en direction de la position du contact ennemi le plus proche afin de le trouver et de le détruire. Le groupe IA QRF va ainsi patrouiller dans la zone où le contact ennemi a été observé j'usqu'à ce qu'un nouvel ordre de QRF lui soit donné.
  • ARTY (artillerie) : un groupe IA ARTY utilise la pièce d'artillerie à sa disposition afin de faire feu sur les contacts ennemis connus.

Chaque tâche spéciale dispose de paramètres qui lui sont propres et qui permettent de limiter ou modifier son déclenchement et son effet.

Utiliser PLUTO dans une mission

Activer PLUTO

Pour activer PLUTO vous devez exécuter la fonction GDC_fnc_pluto là où se trouvent les IA qui doivent être affectées par PLUTO.
Par exemple si vous avez placé vos IA directement dans l'éditeur, les IA seront sur le serveur. Vous pouvez donc exécuter la fonction dans le fichier initserver.sqf.
Si vous faites spawn vos IA par script sur le Headless Client, la fonction doit être exécutée sur le HC.

Pour exécuter la fonction en utilisant les paramètres par défaut, utilisez la ligne de script ci-dessous en modifiant le paramètre en fonction des camps de vos unités IA (blufor,opfor,independent) :

[opfor](/GdC-Framework/GdC_lib/wiki/opfor) call GDC_fnc_pluto;

Le comportement de PLUTO dépend d'un certain nombre de paramètres qui peuvent être modifiés de manière globale et au cas par cas. Les paramètres globaux utilisent des valeurs par défaut s'ils ne sont pas définis par le créateur de missions. Si un paramètre est défini au cas par cas pour une unité, le paramètre global n'est pas utilisé pour cette unité mais reste valable pour toutes les autres.

Paramètres globaux

Pour exécuter la fonction en modifiant les paramètres par défaut globaux utilisez les lignes de code ci-dessous et modifiez les paramètres à votre convenance.

[
	[independent],		//0 camps
	[1000,2000,6000],	//1 revealRange [man,land,air]
	[1500,2000,3000],	//2 sensorRange [man,land,air]
	120,			//3 QRFtimeout
	[1000,2000,6000],	//4 QRFrange [man,land,air]
	[20,30,60],		//5 QRFdelay [min,mid,max]
	240,			//6 ARTYtimeout
	[20,30,60],		//7 ARTYdelay [min,mid,max]
	[1,2,4],		//8 ARTYrounds [min,mid,max]
	[0,40,100],		//9 ARTYerror [min,mid,max]
	[1000,300]		//10 hearingRange [non suppressed, suppressed]
] call GDC_fnc_pluto;
  1. side : Les camps affectés par PLUTO (blufor,opfor,independent). ex: [opfor,independent]
  2. revealRange : la distance max entre un groupe IA et un contact ennemi pour que le contact soit révélé au groupe en fonction du type de groupe IA [piéton,véhicule,aéronef].
  3. sensorRange : la distance max entre un groupe IA et un contact ennemi pour que le groupe IA donne l'information à PLUTO en fonction du type de groupe IA [piéton,véhicule,aéronef]. A ne modifier que pour des cas particuliers.
  4. QRFtimeout : temps (en secondes) d'attente minimum entre deux ordres de QRF pour un même groupe IA. Ce paramètre indique aussi le temps minimum avant que la première QRF de la mission ne puisse se déclencher.
  5. QRFrange : la distance max entre un groupe IA et un contact ennemi pour que le groupe soit envoyé en QRF contre le contact en fonction du type de groupe IA [piéton,véhicule,aéronef].
  6. QRFdelay : délai (en secondes) entre le moment où l'ordre de QRF est donné et le moment où celle-ci est effectivement déclenchée [min,moy,max]. Ne pas mettre un temps supérieur à QRFtimeout sans quoi le groupe risque de ne jamais bouger.
  7. ARTYtimeout : temps (en secondes) d'attente minimum entre deux ordres de frappe d'artillerie pour un même groupe IA. Ce paramètre indique aussi le temps minimum avant que la première frappe d'artillerie de la mission ne puisse se déclencher.
  8. ARTYdelay : délai entre le moment où l'ordre de frappe d'artillerie est donné et le moment où celle-ci est effectivement tirée [min,moy,max]. Éviter les temps supérieurs à ARTYtimeout.
  9. ARTYrounds : Nombre de coups tirés par l'artillerie à chaque ordre de frappe [min,moy,max].
  10. ARTYerror : Erreur de tir possible de l'artillerie. Distance en mètres entre la position du contact et la position ciblée par l'artillerie [min,moy,max]. Le réglage par défaut convient bien pour une artillerie de type mortier.
  11. hearingRange : Distance à laquelle les IAs entendent les tirs non suppressés et suppressés.

Attribuer une tâche spéciale

Pour attribuer une tâche spéciale à un groupe il faut définir la variable "PLUTO_ORDER" pour le groupe en question.
Exemple : Placez la ligne ci-dessous dans le champ "init" d'une unité dans l'éditeur pour attribuer la tâche QRF au groupe de cette unité.

(group this) setVariable ["PLUTO_ORDER","QRF"];

Les tâches spéciales disponibles sont les suivantes :

  • "QRF"
  • "ARTY"
  • "IGNORE" : Dans ce cas le groupe est ignoré par PLUTO (il ne reçoit pas les infos propagées par PLUTO).

Paramètres au cas par cas

Pour définir des paramètres au cas par cas il faut attribuer une variable au groupe voulu.
Exemple : Placez la ligne ci-dessous dans le champ "init" d'une unité dans l'éditeur pour définir le paramètre "RevealRange" de son groupe à 800 mètres.

(group this) setVariable ["PLUTO_REVEALRANGE",800];

Les paramètres qui peuvent être définis au cas par cas sont les suivants :

  • "PLUTO_REVEALRANGE" : Distance en mètres.
  • "PLUTO_SENSORRANGE" : Distance en mètres
  • "PLUTO_QRFTIMEOUT" : Temps en secondes.
  • "PLUTO_QRFRANGE" : Peut être une distance en mètres ou une zone (marker/trigger) dans ce cas la QRF ne se déclenche que si le contact est dans la zone. Exemple : _group setVariable ["PLUTO_QRFRANGE","mkr_zone"];
  • "PLUTO_QRFDELAY" : Temps en secondes [min,moy,max].
  • "PLUTO_ARTYTIMEOUT" : Temps en secondes
  • "PLUTO_ARTYRANGE" : Peut être une distance en mètres ou une zone (marker/trigger) dans ce cas la frappe d'artillerie ne se déclenche que si le contact est dans la zone. Si cette variable n'est pas définie, le "QRFrange" des véhicules terrestres est utilisé par défaut. Exemple : _group setVariable ["PLUTO_ARTYRANGE","mkr_zone"];
  • "PLUTO_ARTYROUNDS" : Nombre de coups tirés [min,moy,max].
  • "PLUTO_ARTYDELAY" : Temps en secondes [min,moy,max].
  • "PLUTO_ARTYERROR" : Distance en mètres [min,moy,max].
  • "PLUTO_ARTYAMMOTYPE" : Type de munitions ["magazine_classname"].

Divers :

Debug :

Il est possible d'activer le mode debug de PLUTO en utilisant la variable ci-dessous :

gdc_plutoDebug = true;

Interrompre PLUTO :

Il est possible d'interrompre la boucle de PLUTO en cours de mission en utilisant la variable ci-dessous :

gdc_plutoRun = false;

La méthode simple :

Houla c'est trop compliqué ! Tu peux faire la même en plus simple STP ?
Si vous ne voulez pas vous prendre la tête, il suffit de copier les lignes de code ci-dessous dans le init.sqf de votre mission pour activer la fonctionnalité de base de PLUTO (les groupes IA se communiquent les contacts ennemis repérés) :
Il faut quand même mettre les bons camps en paramètre hein...

if (isServer) then {
	[opfor](/GdC-Framework/GdC_lib/wiki/opfor) call GDC_fnc_pluto;
};

Presse papier :

Quelques lignes à copier coller dans votre mission pour régler les paramètres de PLUTO au cas par cas.

(group this) setVariable ["PLUTO_ORDER","QRF"];
(group this) setVariable ["PLUTO_ORDER","ARTY"];
(group this) setVariable ["PLUTO_ORDER","IGNORE"];
(group this) setVariable ["PLUTO_REVEALRANGE",1000];
(group this) setVariable ["PLUTO_SENSORRANGE",1500];
(group this) setVariable ["PLUTO_QRFTIMEOUT",120];
(group this) setVariable ["PLUTO_QRFRANGE",1000]; // Peut aussi être une zone (marker/trigger) dans ce cas l'action ne se déclenche que si la cible est dans la zone
(group this) setVariable ["PLUTO_QRFDELAY",[20,30,60]];
(group this) setVariable ["PLUTO_ARTYTIMEOUT",240];
(group this) setVariable ["PLUTO_ARTYRANGE",2000]; // Peut aussi être une zone (marker/trigger) dans ce cas l'action ne se déclenche que si la cible est dans la zone
(group this) setVariable ["PLUTO_ARTYDELAY",[20,30,60]];
(group this) setVariable ["PLUTO_ARTYROUNDS",[1,2,4]];
(group this) setVariable ["PLUTO_ARTYERROR",[0,40,100]];
(group this) setVariable ["PLUTO_ARTYAMMOTYPE","DEFAULT"];