Intelligence Artificielle, le retour

Répondre
Partager Rechercher
Petite vidéo à l'appui :


C'est la première version d'un système "moderne" d'Intelligence Artificielle pour NWN2.

Il fonctionne pour le moment sans NWNX, bien qu'à terme il puisse parfaitement être porté pour être épaulé par des plugins.

Techniquement, ce système va faire que le comportement du PNJ n'est pas dicté directement par un "arbre" de conditions.

La structure est celle-ci : WorldState > Motivations > Goals > Tasks > Actions

En premier lieu l'état du monde (WorldState) est informé : est-ce que je suis attaqué ? Est-ce que je vois un ennemi ? Est-ce que j'ai faim ? Est-ce qu'il fait nuit ? Ce qui permet notamment d'avoir des états différents pour les différents PNJs.

Une ou plusieurs fonctions de Motivations vont ensuite influer sur les buts possibles. L'intérêt à ce niveau est de pouvoir brancher des moteurs externes au PNJ comme des comportements de combat en équipe distribués ou de l'Intelligence de narration, au delà de la gestion simple ( et actuelle ) des objectifs personnels dudit PNJ.

Les Buts (Goals) du PNJ sont ensuite évalué, du plus valorisé au moins valorisé.
Ces buts ont des préconditions qui doivent être validés et des effets qui vont être utilisés pour la phase suivante.

Les tâches (Tasks) sont recherchées récursivement : La première doit satisfaire l'effet recherché du but actuel, la seconde potentiellement satisfaire l'effet recherché par la première task et ainsi de suite. Les tâches ont donc elles aussi des préconditions et des effets.

Enfin, le PNJ est doté d'un plan d'action qu'il exécute. Ces actions sont la partie visible de l'iceberg. Dans la vidéo, quand un PNJ a faim, son plan sera

  1. Aller vers l'objet nourriture
  2. Manger
En l'état, le système est très simple et insuffisant, mais il est aussi plus facile à étendre que le précédent que j'avais produit. En effet, les buts et tâches sont ajoutés à des fichiers 2DA par exemple.

Deux choses pour finir. D'abord, il est évident que le code est disponible pour tous. Ensuite une dédicace à ClementC qui m'a parlé de ce type de systèmes il y a longtemps déjà.

Qu'en pensez-vous?
Ce nain est tellement beau, que même après avoir coupé une femme en deux, les autres l'adorent toujours ^^

Blague à part.

Le tout paraît plutôt au point, en tout cas c'est réactif. Au délais, on dirait que tout est réglé sur les heartbeat des PNJs, ou je suppose mal ?

Le système scripté pour cette IA laisse-t'il la place à d'autres scripts qui pourrait se trouver aux mêmes emplacements ?

Pas de soucis au niveau des recherches dans les 2da ? Paraîtrait qu'il faut éviter des les farfouiller à l'aide de boucle. Pourquoi avoir préféré utiliser des 2da plutôt que BdD alliée à Nwnx4 ?

L'IA est-t'elle juste tournée vers "la vie de tout les jours", ou est-elle aussi adaptée aux monstres et aux batailles ?

Au niveau des performances, le système est-il du genre à en demander pas mal à la machine, ou comparé au gain en jeu la consommation de ressources est négligeable ?

Si le système est aussi adapté aux "Monstres" prend-il en compte les factions personnalisées ?
Oui, pour le moment c'est basé sur le heartbeat.

Si la question est : "Est-ce que je peux ajouter ça au script heartbeat par défaut ?" Je répondrai que non.

Si la question est : "'Est-ce que je peux injecter des scripts d'action existant déjà sur mon module ?" Je répondrai que ça dépend, faut voir les scripts.

En théorie, les 2DA sont mis en cache sur un waypoint au chargement du module. Donc pas de souci ça ce niveau là, une seule lecture par 2DA.

Mon objectif est de produire un système qui soit utilisable sur un module solo comme sur un PW au taquet des plugins. Il suffira de changer / modifier les librairies de scripts pour changer les outils de stockage.

Au choix. Les tableaux : pseudo-tableaux tokenizés, pseudo-tableaux full object, tableaux NWNX. Le stockage : SQL, 2DA. Le tokenizer : Nwscript, NWNX. En gros, aussi portable que possible. Dans un premier temps, j'ai construit une version avec les outils les plus rapides.

On est dans NWN, l'IA de combat va avoir un rôle important.
J'ai fait du social parce que généralement c'est ce qui manque à mon goût. Et sachant que j'ai des objectifs élevés pour les comportements de baston, c'était le plus simple.

Au niveau des performances, tout sera fait pour être aussi optimisé que possible. On pourrait limiter le nombre de comportements attribués par round, en allant même jusqu'à faire de la charge CPU via nwnx ou du nombre de joueurs un facteur. Il suffira d'ajouter une fonction de motivation qui "donnera la parole" aux impératifs de performance.

Les fonctions personnalisées seront probablement un souci. J'imagine que je laisserai les différents PWs gérer ça comme bon leur semblera dans les fonctions de reconnaissance des ennemis par exemple.
Merci pour ces réponses très rapide. J'attend avec une certaine impatience de pouvoir mettre la main sur ton système, et le tester.

Si j'ai bien saisit, tes scripts sont assez ouvert pour qu'un tiers y ajoute des fonctionnalités, mais par contre ils ne peuvent pas être ajouter à d'autres scripts ?

Est-ce que ton système est utilisable par les créatures par défaut du toolset ? Je veux dire on ajoute tes scripts sur un module, on sauvegarde, on le lance, pouf on spawn une créature et ça marche.
La patience est la mère de toutes les vertus Mais si tu veux la première itération pour tester, envoie moi un MP avec ton mail. Je suis en train de faire la conversion pour rendre le système "DataObject Methods Agnostic", en gros compatible pour tout le monde, bien que fonctionnant au départ avec les 2DA, le tokenizer nwscript et les arrays sur des waypoints façon 1.23. Ensuite Brian Meyer va ajouter les librairies du CSP / l'intégrer au CSP pour le faire marcher avec ses méthodes. A ce moment là on devrait avoir une version 1.0 mais sans scripts de combats.

Je te le redis, si tu ne précises le style de scripts que tu as en tête, je ne peux pas te répondre. Du fait que je modifie complètement l'ActionQueue de la créature, ce n'est pas "mixable" mais c'est "optionnable" : Si une créature ne possède pas une variable locale donnée, tu peux lui commander d'utiliser un autre système d'IA.

Oui pour en faire bénéficier les créatures par défaut, il suffirait d'ajouter une ligne de commande dans le onSpawn par défaut en ayant ajouté une ligne au 2DA nwn2_scriptsets. De telle sorte que tu réassignes à la volée les scripts par défaut.
Rien ne presse, et je saurais patienter jusqu'à la sortie de ton projet, et ne peux que t'appuyer à prendre ton temps pour pouvoir tout mettre en place comme tu le souhaites.

Je n'avais pas vraiment de script en tête, mais voici donc un exemple pour illustrer la chose. Sur le script du OnSpawn par défaut, j'ai rajouté une petite fonctionnalité qui dirige les créatures vers la faction qui lui est appropriée, modulo sa race et son apparence en général, ou parfois simplement sa race. Est-ce que ce genre de fonction pourrait entrer en conflit avec ton système ?

Je ne connaissais pas cette méthode via le nwn2_scriptsets, il faudra que je regarde ça un jour.

J'ai dans l'idée un point qui pourrait poser soucis au niveau des PW notamment: sera-t'il possible d'éditer directement en jeu les comportements possibles des PNJs/Créatures, via un objet/conversation/UI ?
C'est-à-dire permettre à la fois de modifier les priorités en jeu du PNJ/Créature, voir même de créer/ajouter un nouveau type de comportement qui n'aurait pas été pensé en amont.
Merci pour les encouragements, on verra comment ça avance mais pour le moment je suis moi même surpris de la rapidité avec laquelle j'ai codé ça. Je pense que l'un des principaux bénéfices de ce système c'est qu'une fois qu'un moddeur l'aura un peu en main, il pourra le modifier et ajouter ses propres impératifs relativement facilement.

Cela par rapport au système précédent que j'avais conçu : un système très impératif avec une fonction centrale monolothique et impossible à comprendre.

Pour ton onSpawn, je ne vois pas de souci pour ce qui est de l'affectation d'une faction. Ensuite, tout dépend de ce que tu fais de la faction en question mais là encore, si tu as codé proprement avec des librairies, ça ne devrait pas poser de souci.

Ajouter un comportement non prévu en amont au sens de "complètement ajouter une action non préexistante", je ne dis pas que c'est impossible (NWN2 m'a démontré plusieurs fois que l'impossible réclamait seulement une manière de penser différente) mais me paraît franchement très complexe. Donc passons.

Modifier les objectifs d'une créature ne pose pas de souci. Voici comment je verrai la chose :

  1. Tu ajoutes une fonction de motivation DM. Tu affectes à cette fonction un "Score de Limite de Motivation" correspondant au maximum possible, de sorte que seule cette fonction de motivation sera utilisée si elle est utilisée.
  2. Ta fonction de motivation va lire une variable sur la créature qui lui indique si un DM lui a donné un ordre. Si oui, elle va lire le But (Goal) que lui a attribué le DM à partir d'une liste, affecter une valeur élevée à ce Goal et définir le SLM cf 1.
  3. Les autres fonctions de motivation éliminées, le planner va recevoir le Goal défini par le DM et tenter de l'accomplir. Et ce tant que le DM ne donne pas d'ordre ou bien si tu l'as défini comme tel, après un temps donné.
Les fonctions de motivation sont un point intéressant dans ce système : elles permettent d'ajouter des conditions personnalisées en fonction des impératifs de son monde, des systèmes qu'on a et de son gameplay.

Si tu veux des vampires avec des buts spécifiques, tu leur donnes une fonction de motivation unique, ils ne se comporteront comme aucune autre créature etc.

Par défaut, je pense fournir les fonctions de motivation suivantes :

  • Pour optimiser les performances IA du module ( performance )
  • Pour gérer les combats de groupe ( combat )
  • Pour gérer les situations de crise ( social )
  • Pour gérer les situations de paix ( socia )
Après quoi, j'ajouterai sans doute ce pour quoi ce système est fait : une fonction de motivation dédiée à l'IA de narration. Comme un DM en quelque sorte.
Thumbs up
Content de lire que la communauté NWN2 existe encore...

J'espère remotiver ma troupe pour reprendre notre projet de nouveau serveur NWN2 : Les Terres Déchirées 2

Bref, c'est un excellent travail Laban, j'ai hâte de pouvoir prendre en main ce système extrêmement prometteur!
Merci pour les encouragements.

Petit point sur l'état des lieux :

- je viens de finir les spécifications de l'application qui permettra d'utiliser le système CrossArea sur un module lambda. Assez complexe et il faut encore le coder.

- je travaille encore sur la partie sociale : les interactions positives sont désormais possibles, j'ai choisi pour l'exemple un placeable sur lequel les joueurs pourraient lancer des sorts pour émerveiller les PNJs, le faire pour un barde, un roublard, un prêtre, un guerrier etc. ne demande qu'une adaptation et de l'imagination.

Concrètement les PNJs se déplacent pour venir "admirer" ce que fait un PJ. Et pendant ce temps là, un acolyte peut leur faire les poches ( niark niark ). Les PNJs réagissent d'aillleurs au pickpocket détecté.

- je vais écrire les specs pour faire un "minigame" dans NWN2 en utilisant l'IA de planning. Plus d'info fin octobre normalement.

- il faut que je mette sur papier les specs pour l'IA de combat, je devrai faire ça en septembre mais ce sera en anglais
Voici une vidéo qui montre les progrès de la chose dans le domaine social.

Désolé pour les sous titres en anglais. Pour vous la faire courte :

Phase 1 : le PC lance des sorts sur un "attracteur" qui convertit le niveau du sort en puissance d'attraction. Plus le sort est puissant, plus les PNJs sont impressionnés.

Phase 2 : le PC commence à déclencher des réactions négatives en vidant des poches. Au départ, ça râle. Ensuite les PNJs évitent le PC. Enfin, quand le PNJ se fait attaquer directement la procédure de fuite "classique" commence.
Je suis toujours là mais la vie réelle et les projets boulots sont parfois très chronophages.

Je n'ai pas abandonné le projet, je suis en train d'apprendre C++ et d'utiliser le framework de Skywing pour résoudre le problème du passage des PNJs de n'importe quelle zone à n'importe quelle zone en déplacement réel. Ou, pour reprendre le titre d'un thread de ce forum, le cross area.

Dès que j'ai ça ( je pensais avoir fini à la fin novembre mais ça risque d'être pour début janvier maintenant ) je peux me remettre à la tâche et intégrer la couche "combats".
Merci pour les encouragements.

Le programme en c++ est fini ( pas parfait mais fonctionnel )

Du coup en principe je devrai me coller sur la partie combats mais la vie réelle a pris le pas...
J'ai oublié d'expliquer le pourquoi de l'exploration :

J'ai fait un "moteur stratégique" qui assigne à toute une équipe une stratégie parmi


  1. Exploration
  2. Ambush ( dissimulation / préparation au combat )
  3. Taunt ( Provocation de l'opposant... Oohhh que je vais aimer ça
  4. Attaque
  5. Repositionnement
  6. Fuite
L'exploration est essentielle car quasi toutes les autres stratégies en dépendent.

Une fois la stratégie reçue, les PNJs peuvent "acheter" des tactiques qui dépendent de leurs caractéristiques. Ex : en stratégie attaque, les tireurs à distance vont chercher à se positionner sur les waypoints les plus hauts et aussi tenter de fuir si l'ennemi approche.
C'est très intéréssant tout ca.
Afin que je comprenne mieux,pour qu'un pnj tag un endroit il faut obligatoirement qu'il passe dessus ou cela peut être dans son champ de vision?
Peut on limiter le périmetre ou ils vont aller chercher une meilleure position.Par exemple une patrouille croise un ennemi ,ils cherchent la meilleure position autour de l'ennemi dans un périmètre X.

A plus et bon courage.
Citation :
Afin que je comprenne mieux,pour qu'un pnj tag un endroit il faut obligatoirement qu'il passe dessus ou cela peut être dans son champ de vision?
Pour le moment, je veux qu'il passe dessus. Mais ce serait possible de le faire avec le champ de vision.

En terme de jeu, j'aime autant que le PNJ se déplace physiquement sur la map. Afin que ça ne consomme pas trop de ressources (étalement du calcul dans le temps) ça prendra plus de temps pour que les PNJs explorent la map (marche et pas course, plusieurs rounds passés sur une position).

Citation :
Peut on limiter le périmetre ou ils vont aller chercher une meilleure position.Par exemple une patrouille croise un ennemi ,ils cherchent la meilleure position autour de l'ennemi dans un périmètre X.
Oui, c'est possible. Mais, si je comprends bien ton idée, c'est gourmand en ressource pour être efficace.

En effet, pour utiliser comme "base de calcul positionnel" la position de(s) (l')ennemi(s), il faudrait recalculer les positions régulièrement car par définition l'ennemi se déplace donc la base de cacul n'est pas stable. En gros, c'est ce qui se fait sans doute dans pas mal de RTS et FPS. Dans les bons, ils doivent même anticiper les positions futures et opter pour les options les plus avantageuses.

Dans mon cas, je préfère rester simple et me fonder sur le territoire "natif", ce qui donne des stratégies plus passives. D'un autre côté, il ne faut pas oublier que les PJs doivent pouvoir gagner et fuir afin que ça reste amusant

Au fait, ceux qui veulent tester, me le dire, il faut que je mette à dispo les fichiers 2DA.
Je testerais volontier mais étant assez une quiche pour tout ce qui est relatif aux script je risque surtout de te bloquer du temps a m'expliquer comment installer ton système.
A voir si tu as un module tout prêt ou je pourrais tester ça et y incorporer mes maps (j'en ai une de monts axée sur la prise de position avec de nombreux points en hauteur ect qui est quasi fini et ne nécéssite pas de hack,il y a aussi dans un coin une muraille défendable avec porte.Je serais curieux de voir comment ca répond dessus.)

A plus.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés