NWN2 - La Tour des Arcanes

Intelligence Artificielle de Combat : un nouveau système

Répondre
Partager Rechercher
Chers amis moddeurs,

J'apporte les dernières modifications à un petit système permettant d'améliorer les combats dans NWN2. Voici une vidéo de gameplay avec des commentaires en anglais, mea culpa.


C'est une IA qui se fonde sur la gestion d'un groupe d'ennemis avec une gestion des rôles assez fine : rôles tactiques ( éclaireur, archer, lanceur de sort, soigneur etc. ) et hiérarchiques ( chef, sous-chef ). Ils partagent les informations, le moral, les cibles.

En gros, ils attaquent en groupe et fuient quand ça tourne mal. Une équipe avec des éclaireurs vous détecte de loin ( fini les monstres qu'on voit sans qu'ils vous voient ), vous attaque ( fini les monstres qui attaquent sans que leurs collègues immédiat le fassent ) et fuient ( fini les humains qui se laissent poutrer jusqu'au dernier sang sans réflexe de survie ).

Ce système sert aussi de système de spawning ( réglage de la difficulté, apparition aux heures indiquées etc. ) et présente l'avantage d'être optimisé au niveau des ressources : un contrôleur centralise les décisions via un script onHeartBeat unique pour toutes les créatures.

Il y a ensuite tout un tas de détails plus ou moins intéressants sur la manière dont les créatures sont générées, dont elles attaquent, dont elles fuient et disparaissent, sur les réglages qu'on peut apporter.

L'important c'est que la source est disponible pour qui veut. Pour le moment un plugin NWNX est nécessaire mais on peut imaginer une adaptation pour les modules solos.

Voilà. Sachez que potentiellement plus tard, je compte intégrer une gestion plus fine de la magie ( prise en compte des rôles, du niveau des ennemis avec des listes de sorts optimisées par classe ) et une gestion plus efficace des stratégies de groupe ( retrait tactique, attaques par les flancs etc.)

Je suis ouvert à toutes les suggestions et propositions
Et ben ! Je me rappelle pas avoir vu si abouti un jour ! J'aime beaucoup. Si j'avais un module... je peux te dire que j'intégrerais ce truc ! Si en plus ça gère les spawns, c'est le pied !

Si un jour mes rêves de modules se concrétisent, je pense que je repasserai par là pour qu'on explique à la noob que je suis comment installer tout ça ou gérer le truc si je comprends rien =).
Ça reste un tantinet complexe à installer, faut pas se le cacher.

À terme, il faudra un plugin capable de rendre l'édition d'une rencontre plus pratique.

Mais en gros, c'est uniquement des variables assignées à un trigger
Ben écoute, le jour où je pourrai avoir mon module est pas encore arrivé. C'est pas évident je suis surtout orienté RP et mapping, mais après au delà tout ce qui est technique j'ai du mal. Du coup j'espère pouvoir compter sur des volontaires, des même très bonnes volontés pour m'expliquer. Je suis du genre à comprendre vite quand on explique longtemps.

Enfin, on y est pas encore comme dit, mais si jamais un jour ça arrive, tu serais éventuellement ok pour m'expliquer dans le détail ? (ça t'engage à rien évidement) Du genre "tu cliques là, tu tapes le nombre de ça que tu veux, tu fait enregistrer là" etc ^^ ?
Bien entendu. Au risque de faire dévier le débat, ce système pourrait faire partie de "Foundation" le projet de GrinningFool : un "Pack pour mondes persistants" avec une certaine quantité de systèmes clefs-en-main pour les moddeurs.

Projet en anglais, mais la doc serait fournie.
J'ai entendu parlé de ce projet, c'est vraiment une bonne idée. Maintenant il faut espérer qu'il ne tarde pas trop (sans vouloir mettre la pression) parce que du côté français j'ai l'impression que l'enthousiasme est de moins en moins présent et que la durée de vie de never 2 risque de voir ses limites approcher en absence d'innovations, de nouveautés...

En tout cas très bonne initiative, j'espère pour bientôt tout ça =D.
__________________
http://image.noelshack.com/fichiers/2012/46/1353252187-foret-bleue.png
La seconde version est arrivée : http://fanelya.fr !
IP : fanelya.no-ip.org

Liste de tous les serveurs : http://nwnlist.com
J'adore ton système Laban et je suis curieux d'en savoir plus !

Est il disponible sur le site que tu indiques, je ne l'ai pas trouvé ! S'il n'y est pas, envisages tu de le mettre à disposition ?

En tout cas ça m'a l'air bien prometteur...

Au niveau de la récompense d'xp quand les ennemis battent en retraite, est il possible d'y insérer son propre système, ou est ce trop compliqué ?

En tout cas, très beau travail que cela, félicitation !
Charloulou, vaste sujet que la durée de vie de NWN2. Personnellement, rien d'autre ne m'attire.

Doto, la récompense en XP pour faire fuire une créature est un paramètre facilement modifiable. Ça peut être entre 0% et 100% de l'XP potentielle. Par exemple mon réglage actuel est à 50%.

Les scripts pour faire tourner cette AI seront bientôt sur le Vault. J'améliore encore quelques fonctions, ensuite je rince et j'uploade.

PS : Je viens de faire une nouvelle petite vidéo. Elle montre une scène de chasse, les créatures sauvages fuyant les joueurs.

J'adore ce système ! Il me le faut ! Il est trop trop trop fort ! Franchement bravo, t'es un petit génie toi dis donc !

Et sinon pour la durée de vie, je crois que la seule chose qu'on puisse dire c'est qu'elle est parfaitement incertaine et dépendante clairement de gens comme toi qui s'acharnent encore à faire quelque chose de super avec ce jeu. J'ai beau regarder partout je ne vois rien d'équivalent à never 2, tant niveau communautaires que possibilités et surtout roleplay. Merci à toi en tout cas .
__________________
http://image.noelshack.com/fichiers/2012/46/1353252187-foret-bleue.png
La seconde version est arrivée : http://fanelya.fr !
IP : fanelya.no-ip.org

Liste de tous les serveurs : http://nwnlist.com
Un excellent travail Laban !

Une fois de plus oserai-je dire même si cela doit fâcher ta modestie

Tu n'as pas essayé une troupe de paysans chassant un vilain chevalier voulant les rançonner ?
Parce que là, il n'y a qu'un PJ vs des PnJs, mais assister à des scènes grâce à ton système qui donne des animations pour les PJs sans que cela devienne l'évènement récurrent arrivant à heure fixe du genre : c'est la rixe de 18h29.
Merci pour tes précisions Laban !

Pour l'xp, on utilise un système perso sur notre module, la formule a été concocté par nos soins (et demande pas mal d'ajustements encore !), mais bon, je trouverai bien un moyen de faire fonctionner le tout !

J'ai hâte de voir ça en tout cas !!
Charloulou, ça n'a rien de génial. Mais merci. Je vais mettre tout ça à dispo dès que possible pour ceux qui veulent tester.

Doto, nous avons aussi un système d'XP custom ( avec dette/pénalité d'XP qui augmente et qui est partiellement remboursée à chaque gain etc. ). Donc dans l'absolu, il suffit de remplacer une fonction comme DistributeXPToPartyMembers() par la votre. Ce qui me fait penser d'ailleurs qu'il faut que je veille à tout ça quand je vais distribuer le système.

Argyl, la meilleure idée dans tout ça n'est pas de moi mais de GrinningFool. Donc tous les hommages lui reviennent, je ne suis qu'un vulgaire tâcheron qui ne fait qu'appliquer les ordres

Pour l'animation des PNJs, je suis en train de concevoir un système qui sera une Intelligence Artificielle Sociale Distribuée.

IA Distribuée = comme dans le système de combat les agents ne sont pas réellement autonomes, un controlleur centralise les informations pour eux.

Le mieux que cette IA sociale sache faire sera de faire réagir aux actes des joueurs ( vol, agression, espérons-le performance artistique ). Avec possibilité pour que des PNJs marqués comme gardiens attaquent et poursuivent les joueurs.

Au minimum il s'agira d'un système d'animation permettant d'avoir des PNJs civilisés et animaux qui se regroupent selon leurs affinités, font leur travail, rentrent chez eux etc.

Maintenant, avoir des PNJs qui simulent des antagonismes entre eux, j'y pense mais je n'ai pas trouvé la bonne solution encore. En effet, il faut que ce soit générique pour rester simple à implémenter.
Tes travaux sont très intéressent en tout cas !

Quand tu parles de contrôleur, tu parles du contrôleur au sens de la méthode MVC, ou contrôleur comme Pnj qui contrôle les autres ?
(même si au final ça revient un peu à la même chose ^^)
Un contrôleur en l'occurrence c'est un placeable invisible. C'est le gestionnaire de comportement pour toute une équipe : les agents n'ont pas de script récurent ( on heart beat ) individuels. Chaque round, le contrôleur traverse un tableau ( d'où NWNX dont j'utilise le plugin xp_hashset ) contenant chaque créature de l'équipe et détermine cibles et actions.
Thumbs up
Ca me fait penser un peu à un autre système, mais étant donné que notre module n'est pas encore prêt et que justement il nous manque ce genre de système (complet et complexe) je veux bien attendre après le tiens! Il m'a l'air vraiment intéressant et très complet!

Peux tu peut être juste détailler un peu plus le nombre de comportements différents?
Soit.

Pour commencer, je précise que j'utilise pas mal de "flags bitwise". Ceux qui connaissent peuvent passer à la liste.

Pour ceux qui ne connaissent pas, les "flags bitwise" traduisent la construction binaire (0 ou 1) des nombres dans l'ordinateur. Par exemple, le nombre 23 est la somme des nombres 16 + 4 + 2 + 1, ou 0x17 = 0x10 + 0x04 + 0x02 + 0x01, cette dernière notation étant la version hexadécimale ( de 0 à F = de 0 à 15 ). les 0x** sont des puissances de 2 : 0x10 = 2^5 = 16

Quel intérêt ? Réponse : un seul chiffre peut contenir un grand nombre d'informations car tout chiffre se décompose en plusieurs autres qui ne peuvent être contenus qu'une et une seule fois. Et chacune des puissances de 2 peut être "taggée" pour représenter une information particulière.

Ceci permet souplesse et performance, mais c'est un peu complexe pour le béotien.

Voici la liste :

Code PHP:

const int AI_FLAG_COWARD             0x00000001;
const 
int AI_FLAG_AGRESSIVE         0x00000002;
const 
int AI_FLAG_STEALTH            0x00000004;
const 
int AI_FLAG_SEARCH            0x00000008;
const 
int AI_FLAG_BOSS                0x00000010// 16
const int AI_FLAG_RIGHTHAND            0x00000020// 32
const int AI_FLAG_UNIQUE            0x00000040// 64
const int AI_FLAG_TWO                0x00000080// 128
const int AI_FLAG_ARCHER            0x00000100// 256
const int AI_FLAG_BUFFER            0x00000200// 512
const int AI_FLAG_CASTER            0x00000400// 1024
const int AI_FLAG_HEALER            0x00000800// 2048
const int AI_FLAG_WILD            0x00001000// 4096
const int AI_FLAG_SCOUT            0x00002000// 8192 
Certains de ces tags ne sont pas utilisés, le design ayant changé en cours de production. Les utiles sont :

Général
coward = peureux
scout = guetteur

Hiérarchique
boss = chef
righthand = lieutenant

Fonction
archer = attaquant à distance
buffer = lanceur de sorts défensifs / protecteurs
caster = lanceur de sorts offensifs
healer = lanceur de sorts de soins

On peut ainsi cumuler les "traits" pour construire des modèles élaborés comme un Boss Scout Archer, un Righthand Caster et ainsi de suite...
On doit mettre les valeurs manuellement, ou il y a déjà des fonctions exprès pour ? C'est simple d'utilisation pour le néophyte endurci ? Prenons une quiche, par exemple. Une quiche fait partie des néophytes endurcis. Donc admettons qu'une quiche veuille utiliser ce système. Est-ce simple d'accès pour la quiche ?

Parce que je ne veux pas imaginer la soupe que ça donnerait si je mettais 0x0000FFFF. ^^
Non, ce n'est pas très commode pour la quiche, endurcie ou pas. Personnellement, je la préfère tendre, ceci dit. Mais ça ne change rien à l'affaire.

Il faut entrer manuellement les variables sur l'objet. Variables pour l'équipe ( ex : float DIFFICULTY = 3.0 ) et pour chaque créature qui la compose (ex : string CREATURE_1 = "8192,1,3,c_orc,2,orc_camp_1,orc_camp_2" ).

À terme, il faudrait faire un plugin pour éditer les triggers de manière adéquate. Mais pas le temps pour le moment :\
Même pour les quiches (!) ce n'est pas si compliqué.

Définir un lieutenant archer peureux :
AI_FLAG_COWARD & AI_FLAG_RIGHTHAND & AI_FLAG_ARCHER
à mettre dans une variable attachée à la créature.

Est-ce une créature agressive :
if (Variable_Creature &
AI_FLAG_AGRESSIVE) ...

Est-ce un éclaireur furtif :
if (Variable_Creature &
AI_FLAG_SCOUT & AI_FLAG_STEALTH) ...

Est-ce un guérisseur ou un lanceur de sort :
if (Variable_Creature & (
AI_FLAG_HEALER | AI_FLAG_CASTER) ) ...

@Laban, fort intéressant, pour une campagne solo l'AI devrait s'appliquer aussi aux compagnons et aux henchmen, est-ce fait par override des scripts standard?
Il faut lire :

Définir un lieutenant archer peureux :
AI_FLAG_COWARD | AI_FLAG_RIGHTHAND | AI_FLAG_ARCHER

ou plus prosaïquement :

AI_FLAG_COWARD + AI_FLAG_RIGHTHAND + AI_FLAG_ARCHER

à mettre dans une variable attachée à la créature.

La quiche avertie aura rectifié ...
En ce qui concerne le calcul des variables en lui même, c'est bien le principe.

Mais dans les variables il faut bien ajouter la valeur numérique et pas les constantes, ça implique des calculs source d'erreur et un peu fastidieux. Ceci dit, coder un calculateur ne serait pas trop long.

Et ça ne vient pas en variables sur la créature elle-même. Ça se place dans une chaîne de caractères ( string ) sur le trigger "custom". Celui qui, détail, sert à "spawner" les créatures en fonction du "Challenge Rating" de l'équipe de joueur et qui va les gérer en équipe. Un "Boss" n'a de sens que dans une équipe : son apport est de sélectionner les cibles pour tout le groupe, sa perte est désastreuse pour le moral.

Concernant les hench du coup, ce n'est pas du tout prévu pour ça. Personnellement, je préconise l'usage de l'AI de Tony_K. La partie sur les compagnons n'a pas été intégrée totalement dans le moteur alors que c'est ce que je préfère dedans en tant que joueur.

Concernant les scripts, quand je spawne la créature, je change entièrement son set de scripts. Ces nouveaux scripts sont quasi vides, à l'exception de OnDeath et OnAttacked, vu que pour le reste c'est le contrôleur qui gère.

Voilà. Ceci dit, je sais que ClementC a de son côté quelque chose d'assez brillant qui pourrait pour le coup s'adapter mieux pour des compagnons. Et dont je pense probablement m'inspirer pour gérer les stratégies d'équipe.
Joli travail Laban

Citation :
Publié par Laban
Ce système sert aussi de système de spawning ( réglage de la difficulté, apparition aux heures indiquées etc. ) et présente l'avantage d'être optimisé au niveau des ressources : un contrôleur centralise les décisions via un script onHeartBeat unique pour toutes les créatures.
Est-ce que ça va poser un problème avec un système de spawn custom ? ( http://nwvault.ign.com/View.php?view...s.Detail&id=20 )
Et donc disponible pour ceux qui veulent tester. Attention il faut :

1.23

Pas de Windows Seven

Et le message concernant une librairie dll manquante n'a pas d'importance.
Répondre

Connectés sur ce fil

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

Recherche avancée