JeuxOnLineForumsPlusConnectés : 789 (sites) | 1405 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Répondre
Partager Outils Rechercher
Avatar de Taern
Taern
Alpha & Oméga
 
Avatar de Taern
 
Que de réactions ça fait plaisir à voir.

Pour répondre à Mastokk, si les rats ne réagissent pas à ta torche, c'est parceque c'est pas vraiment prévu et que paradoxalement ça compliquerait beaucoup le script. (et c'est là qu'on sent encore l'absence du OnEquip... ouin )
Quoique maintenant que tu en parle j'essaierais bien de modifier ça

D'autre part, Sire Pom-pom a vu tout juste. Ce système de "mimétique" s'inspire beaucoup d'une approche du comportement humain utilisée dans de vraies IA. Même si évidemment NWN ne deviendra jamais vraiment un simulateur de vie, il est possible de s'en rapprocher de manière assez amusante.

Alors maintenant que j'ai déjà quelques bonnes heures d'expérience sur le montre (car oui, c'est un monstre : je n'ai jamais vu de scripts écrits de cette manière, c'est simple, on en oublie que c'est du NWScript ), je vais pouvoir vous faire part de ce que j'ai appris, et surtout corriger ce que j'ai dit plus haut.

Donc, concrètement le système fonctionne ainsi (je simplifie hein) :

- tout d'abord, on assigne des memes à des créatures; ce sont des comportements (ou des séquences de comportements) qui ont un niveau de priorité ainsi que des "flags" (par exemple, FLAG_REPEAT pour un meme qui devra se répéter à l'infini).
Les memes sont définis de 2 manières : soit par script (i_<nomdumeme>_<suffixe>), soit par libraire, le plus simple étant d'après moi le script.
A chaque meme correspond 3 "évènements", désignés par les suffixes _go, _end, _brk (début, fin et annulation) (les 2 derniers sont optionnels)
Un bon exemple est celui des rats : ils possèdent un meme de basse priorité (un comportement d'arrière plan en quelque sorte) qui leur fait faire l'équivalent d'un WalkWayPoints.
Jusque là, rien de bien compliqué

- ensuite viennent les générateurs; c'est eux qui vont tirer parti des évènements d'une créature. Comme pour les memes, les générateurs possèdent plusieurs évènements, qui sont ici évident : _atk (OnAttacked), _see (OnPerception), etc.
Ils se définissent par script ("g_<nomdugénérateur>_<suffixe>") ou par libraires.
On va assigner ces générateurs sur le OnSpawn des créatures, tout pareil que les memes.
Les rats possèdent un générateur appelé g_goto_see, qui est enclenché (avec StartGenerator(), puisqu'il est également possible de pauser, voire d'arrêter un générateur) sur leur OnSpawn. Sur le OnPerception des rats, ce script va être lancé et les rats vont automatiquement s'approcher de l'objet qu'ils voient (il y a quelques conditions supplémentaires, mais en gros c'est ça).

- puis viennent les events. Ils se définissent comme les deux objets ci-dessus ("e_nom_suffixe"), mais eux se rapprochent plus d'un UserDefinedEvent. Ils sont déclenchés d'une façon similaire, c'est à dire qu'un autre script pourra envoyer un signal n, et si l'event possède un trigger sur le signal n, alors il se lance. Comme les autres, tous pleins de paramètres possibles, enfin pour l'instant j'en suis pas là
Pour en revenir aux rats, ils possèdent un event avec un trigger sur le signal n=200. Cet event, appelé e_avoidlight_go (avoid light = éviter la lumière), les fait s'enfuir en courant (si tant est qu'on rat peut courir) et en couinant.
Mais quand donc est déclenché cet event ? c'est là qu'entrent en jeu les emitters (émetteurs ? emmetteurs ? éméteurs ? bon on va garder le mot anglais )

- les emitters sont différents du reste puisqu'ils n'ont pas de script associé; ils se définissent par une commande à rallonge (13 arguments, j'ai compté), puis peuvent être assignés à tout et n'importe quoi : location, créatures et objets il me semble. En fait ce sont des AreaOfEffect d'un rayon de 10m (valeur qui n'est pas augmentable, et diminuable à ses risques et périls, vu qu'un rayon inférieur à 10m fait semble-t-il intervenir un script récurrent un peu lourdingue), et il est possible de définir ce qui arrive lorsque quelqu'un pénètre dans cette zone. Texte sur le PJs, dialogue, autres trucs bizarroïdes et surtout : envoi d'un signal à la personne qui vient de rentrer

En clair : les rats se baladent par défaut dans la grotte en suivant leurs waypoints. Si ils aperçoivent un PJ, ils lui fonce dessus et lui couinent dans les oreilles pendant un petit moment avant de le laisser tranquille et de retourner à ses occupations. Si jamais ils entrent dans le rayon d'un emitter de type "lumière" (il y en a un, mobile, sur le petit garçon, et un sur chaque torche à l'entrée de la grotte), alors ils s'enfuient, restent à l'écart pendant un certain temps puis reprennent leur ronde de waypoints.
Voilà, vous connaissez le secret des rats luminophobe

Je vois déja Delphinea rappliquer pour me crier dessus que tout ça, c'est faisable aussi simplement avec des scripts tout petits et astucieux, que y'a pas besoin de tout ce boxon etc. Et ben, à vrai dire, t'as tout à fait raison Ce qui est intéressant, ce n'est pas de faire en sorte qu'un rat fuie une torche et point barre. Ce qui est intéressant, c'est le fait de pouvoir ajouter de nombreux comportements différents, de changer leur priorité, d'utiliser les events pour créer des réactions réalistes, de superposer les générateurs pour complexifier les réactions des PNJs à l'infini.
L'intérêt d'un tel système, c'est qu'il n'a pas vraiment de limite. Alors que bidouiller l'IA de Bioware pour en faire quelquechose de sympa, ça tourne rapidement au casse tête chinois (j'ai déja essayé :/). Ici, contrairement aux apparences, et une fois qu'on maîtrise le système, créer un comportement complet est loin d'être compliqué. Les routines internes se chargent d'affecter les actions aux PNJs, de les réactualiser, de déclencher le bon script au bon moment, etc. En clair, avec de tels outils tu n'utilise même plus ClearAllActions().

Maintenant, vous pensez ce que vous voulez, mais personnellement j'en suis encore sur le cul

Cela dit, le réel intérêt de ce système à mes yeux n'est pas vraiment ludique (puisqu'une IA très développée, si elle n'est pas parfaite, ne vaut pas vraiment le coup), mais expérimental . Enfin personnellement je m'amuse autant qu'avec mes Lego quand j'étais gosse

Bon, c'est pas tout ça mais je suis crevé Bonne nuit à ceux qui auront eu le courage de lire ça jusqu'au bout :bouffon:
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
J'ai tout lu

En gros ils ont créé une bibliothèque de OnScripts pour faciliter la vie des créateurs de module qui veulent donner un aspect "vivant et réaliste" à leurs PNJ/Monstres sans devoir le scripter eux-même, mais en utilisant simplement leur nomenclature et leurs fonctions.

C'est utile, ça y a pas à dire, disons que ça mâche le boulot. (Mais c'est pas de l'IA )

Néanmoins
Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
Citation:
Le problème d'une IA de séquence de lancement de sorts (ou de n'importe quoi d'autre en combat), c'est qu'il suffira de 2 ou 3 affrontements à un joueur intelligent pour en saisir les failles et pour détruire ton monstre sur lequel tu as passé 3 jours à scripter l'IA. Et tu vas faire quoi après ? Rescripter une IA pour contrer le joueur ? Ou alors créer une IA aléatoire ?
Je veux pas que mon dragon se contente d'une séquence de sort mais plutot d'un truc du genre :
- le PJ a des sorts actifs de bas niveau sur lui : dissipation
- le PJ a des sorts actifs de haut niveau sur lui : disjonction
- S'il n'y a plus de dissipation, utiliser les disjonction et vice-versa.
- Si les PJs sont regroupés dans une même zone : sort de zone
- etc.

Prend 2 archers et un gros monstre et regarde ce qu'il se passe. Le premier archer tire, le monstre va vers lui, il s'enfuit. Le second tire, le monstre fait demi-tour et va vers lui, il s'enfuit. Et ainsi de suite. Balancer Arrêt du Temps et Doigt de Mort serait bien plus simple mais ce crétin de dragon veut rien comprendre.

Bon, faudra que je me penche sur tout ça dès que j'ai un peu plus de temps libre. Allez hop, dans les favoris pour pas oublier.
Lien direct vers le message - Vieux
Avatar de Archamedes_Fr
Archamedes_Fr
Alpha & Oméga
 
Avatar de Archamedes_Fr
 
Je suis d'accord avec Delphinea, un dragon c'est pas de la chair à PJ qu'on spawn à droite ou à gauche.

Maintenant, quand un DM contrôle un dragon, il a pas accès au souffle. :o( C'est quand même dommage.
Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
T'es sûr pour le souffle ? Il me semble l'avoir vu.

Click droit sur la bestiole pour faire apparaitre le menu radial et en fouillant un peu tu dois arriver sur une "icone" te donnant accès aux pouvoirs du monstres. Pour le dragon, tu trouve le souffle et l'aura de terreur.
Par contre, je me rapelle pas si ces pouvoirs sont mis automatiquement lorsqu'on crée un dragon dans le toolset.

Le dragon était un exemple, c'est juste une des bestioles que j'ai le plus tester. Et il serait pas fait pour mettre à droite à gauche, faut pas exagérer non plus je vais pas laisser trainer n'importe où une créature pouvant raser une ville...
Bon je vais créer plein de gob et raler sur leur intelligence lamentable (bien que pour eux ce soit un peu normal ).

[Edit] : Pour avoir accès au souffle, il faut prendre le contrôle de la créature mais pas avec les pleins pouvoirs (ou alors j'ai pas su le voir dans ce mode là).
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Citation:
Je veux pas que mon dragon se contente d'une séquence de sort mais plutot d'un truc du genre :
- le PJ a des sorts actifs de bas niveau sur lui : dissipation
- le PJ a des sorts actifs de haut niveau sur lui : disjonction
- S'il n'y a plus de dissipation, utiliser les disjonction et vice-versa.
- Si les PJs sont regroupés dans une même zone : sort de zone
- etc.
Si tu veux simuler un semblant de cohérence, ton dragon devrait d'abord faire une détection avant de balancer son artillerie, je parle en action pas en script. Tu peux modifier le sort d'identification de façon à ce qu'il fonctionne comme un sort de détection de la magie (avec intensité, type de magie, etc)
-Si le dragon détecte de l'abjuration très intense, il lancera une disjonction; s'il détecte de la divination très faible, il est fort possible qu'il ne lance rien et attaque directement.
-Ensuite, le dragon lancera un de ses sorts selon ce qu'il a détecté.

l'IA de Bioware fonctionne comment ? Prenons l'exemple d'un mage PNJ.

Si le Mage possède des sorts de mage à lancer, il le fera comme suit:
(Il a 25% de chance de procéder dans cet ordre):
-> Utiliser ses capacités de soin s'il est blessé.
-> S'il possède un sort défensif ou de protection, il lancera la version plus puissante en premier, ensuite la plus faible, ensuite sur ses alliés.
-> Ensuite il lancera ses "buffs" (sorts d'amélioration) personnels, et ensuite sur les autres s'il lui en reste.

(Deja à ce moment là tu as le temps de le buter 10 fois, mais "heureusement" il y a 75% de chance pour qu'il utilise un sort offensif directement sans passer par la phase de "protection")

-> S'il est attaqué au corps à corps, il fera ceci:
- Si l'opposant est seul: Sort Offensif de Contact (le plus haut niveau d'abord, ensuite en décroissant jusqu'à trouver un qui peut être utilisé); ensuite sort à distance (au corps à corps, oui oui ), ensuite un sort de zone, et pour finir n'importe quel sort offensif.
- Si les opposants sont plusieurs: Sort Offensif de Zone (le plus haut d'abord, etc); ensuite sort de contact puis sort à distance.
-> S'il est attaqué à distance, il fera ceci:
- Si la distance est supérieure à 5.0 et si il y a au moins un allié à portée de la cible, il lancera un sort qui n'a pas d'effet de zone.
- Si la distance est supérieure à 5.0 et si ils sont au moins 2 ennemis, il lancera un sort de zone.
- Ensuite il lancera n'importe quel sort de distance qu'il possède.
-> S'il voit des ennemis à distance, il fera sensiblement la même chose que ci-dessus.
-> Il utilisera un sort offensif
- Il attaquera la créature visible la plus proche de la même faction que celui l'ayant attaqué. (Le bon truc, tu tires de loin et tu laisses ton pote au corps à corps, il mangera le sort )
- Il va d'abord vérifier qu'il possède un sort offensif qui n'a pas d'effet de zone, et lancer le plus haut niveau qu'il possède; ensuite n'importe quel sort à portée, et pour finir n'importe quel sort de contact.
-> S'il n'en a plus, il attaquera au "corps à corps".
- Si l'opposant est seul, il s'approchera pour l'affecter par un sort de contact, puis de distance, puis d'effet de zone, etc... bref la série habituelle du robot-mage
- S'ils sont plusieurs, d'abord le sort de zone, ensuite robot-mage.

Bref, on remarque vite que les PNJ mages font tous la même chose, et le plus ridicule est qu'ils choisissent d'attaquer ou de se protéger selon le résultat d'un integer "Random"

Si tu veux bosser l'IA de combat, c'est dans le "nw_i0_generic" que ça se passe
Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
Je rajouterais un petit truc sans importance.

- Contre 3 vénérables dragons d'or, mon dragon lance Dissipation de la Magie (les dragons d'or le tapent au corps à corps).
- Contre 5 vénérables dragons d'or, il se souvient qu'il a des sorts de niveau 9 .

Euh ? Il faut qu'il affronte des ennemis de quelle puissance pour se remuer un peu ? Après ça, c'est normal qu'il s'amuse à affronter mon Ensorceleur au corps à corps (par contre il lance de temps en temps des Doigts de Mort, c'est un bon début).

Bon, j'irais regarder le "nw_i0_generic" même si je suis quasiment certains de rien y comprendre...
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
En fait il utilise son meilleur "Talent" en fonction du CR de ce dernier. Voici ce que dit la fonction utilisée dans ce cas là:

GetCreatureTalentBest
Code PHP:
// Get the best talent (i.e. closest to nCRMax without going over) of oCreature,
// within nCategory.
// - nCategory: TALENT_CATEGORY_*
// - nCRMax: Challenge Rating of the talent
// - oCreature
talent GetCreatureTalentBest(int nCategoryint nCRMaxobject oCreature=OBJECT_SELF
Alors le plus drôle reste à venir, regarde ça

Tu te demandes certainement quelle valeur va prendre nCR dans la fonction ici au-dessus. Tu te dis le CR des ennemis, et ben non...raté, regarde plutôt la fonction retournant la valeur de nCR:

Code PHP:
int GetAssociateCRMax()
{
    
int nCR;
    
/*
    if(GetAssociateState(NW_ASC_HAVE_MASTER))
    {
        object oEnemy = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN);
        oEnemy = GetFactionStrongestMember(oEnemy);
        int nHD = GetHitDice(oEnemy);
        if(GetAssociateState(NW_ASC_OVERKIll_CASTING))
        {
            nCR = 20;
        }
        else if(GetAssociateState(NW_ASC_POWER_CASTING))
        {
            nCR = nHD * 2;
            if (nCR > 20) {nCR = 20;}
            if (nCR < 5) {nCR = 5;}
        }
        else
        {
            nCR = nHD + 4;
            if (nCR > 20){nCR = 20;}
        }
        return nCR;
    }
    */
    
return 20;

Toute la fonction en Rem, pour avoir un CR ayant une valeur constante: 20

Mais en ce qui concerne les dragons en particulier, voici le script d'IA correspondant:
Code PHP:
else if(nClass == CLASS_TYPE_DRAGON)
        {
            
//Use healing
            
if(TalentHeal()) {return;}
            if(
TalentCureCondition()) {return;}
            if(
d100() < 15)
            {
                if(
TalentRangedEnemies(oIntruder)) {return;}
                if(
TalentMeleeAttacked(oIntruder)) {return;}
            }
            if(
TalentPersistentAbilities()) {return;}
            if(
TalentAdvancedProtectSelf()){return;}
            if(
TalentUseProtectionOnSelf()) {return;}
            if(
TalentDragonCombat(oIntruder)) {return;}
        } 
Donc ici on peut voir que le dragon va en priorité:
- Se soigner
- Attaquer les ennemis à distance ou au corps à corps dans 15% des cas
- Utiliser ses capacités innées (aura de peur, etc)
- Se lancer ses meilleurs sorts de protection
- Se lancer ses autres sorts de protection
- Attaquer à l'aide de ses capacités de Dragon, qui sont dans l'ordre:
- Son souffle
- Ses attaques spéciales de mêlée (renversement, etc)
- Le fabuleux: "ActionAttack(oTarget);" une des fonctions les plus daubesques de NWN

Bref, rien de glorieux dans tout ça, pas une once d'IA
Lien direct vers le message - Vieux
Avatar de Taern
Taern
Alpha & Oméga
 
Avatar de Taern
 
Ah, là, je dois avouer que je suis déçu par Bioware
Enfin bon, l'IA d'un jeu comme NWN n'est pas aussi primordiale que celle d'un bon gros jeu de stratégie

Bon, si j'ai le temps et le courage, j'essaierais de faire une IA de dragon plus intéressante avec les mimétiques, mais je promet rien
Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
*3 tubes d'aspirines plus tard*

Arfeuh, pas très génial le dragon... Et dire que c'est la même chose pour tous les PNJs j'ai l'impression...

Par contre, je confirme que pour ce qui est de se soigner, il sait faire, mais c'est bien le seul truc qu'il fait correctement. Et encore...

Bon, je crois que je vais attendre de voir s'ils ont modifié tout ça dans SoU (c'était prévu je crois), ce sera le plus simple.

Et ça fait quoi si je mets 1000 (autant prendre un très gros chiffre) au lieu du 20 pour le CRMax ? Ca devrait changer quelque chose au niveau des attaques qu'il utilise ?

[Taern] : Pourquoi faire une IA de dragon ? Une IA générique réglée comme du papier à musique serait tout aussi bien, ensuite libre à chacun de la modifier suivant ses créatures non ? Et si cette IA générique existe déjà, ben il reste plus qu'à en faire une spécifique pour chaque créature (ça doit être drole de voir des gobs courir dans tous les sens lorsque des ennemis trop puissant pour eux les chargent).
Lien direct vers le message - Vieux
Avatar de Ormus
Ormus
Roi
 
Avatar de Ormus
 
Il y a aussi l'IA de CODI qui vient de sortir...ça serait sympa de l'opposer à la Memetic...je le ferais si j'ai le temps
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Si tu mets 1000 à la place de 20, il ne va rien faire, vu qu'il va chercher un Talent (sort dans ce premier cas) de niveau 1000

Mais si tu veux que ton dragon utilise Disjonction de Mordenkainen si le machin en face possède un sort de protection actif, bah tu édites le nw_i0_generic et tu ajoutes le code à la ligne 652:

Code PHP:
if(UseDisjonction(oIntruder)) {return;} 
Et cette fonction dans le script:

Code PHP:
int UseDisjonction(object oTarget)
{
 
int nC;
 for (
nC 1nC 248nC++)
 {
  
int nSortActif GetHasSpellEffect(nCoTarget);
  
talent tSortActif TalentSpell(nSortActif);
  
int nAbju MatchSpellProtections(tSortActif);
    if(
nAbju == TRUE)
    {
     
int nDisj GetHasSpell(SPELL_MORDENKAINENS_DISJUNCTIONOBJECT_SELF)
     if(
nDisj == TRUE)
     {
      
ActionCastSpellAtObject(SPELL_MORDENKAINENS_DISJUNCTIONoTarget);
      return 
TRUE;
     }
    }
 }
 return 
FALSE;

Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
Citation:
Si tu mets 1000 à la place de 20, il ne va rien faire, vu qu'il va chercher un Talent (sort dans ce premier cas) de niveau 1000
Va falloir que je réussisse à comprendre cette notion de niveau d'un talent...
Si mon dragon lance un sort avec un niveau de lanceur de 25, ça veut dire que ce sort est un talent de niveau 25 ? Ou alors c'est en fonction du niveau du sort et du niveau du lanceur de sort ?

C'est sympa de me sortir ce script, mais il m'en faudrait un pour chaque sort, capacité spéciale et don activable, sans compter qu'il faudrait que je cherche un maximum de possibilités existantes pour qu'il soit amener à utiliser tel sort ou tel don.

Arfeuh, je crois que je vais vraiment attendre de voir s'ils ont améliorer tout ça dans SoU, sinon je n'en sortirais pas...
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Scripter une IA ne se fait pas en une après-midi

Pas que je ne veux pas le faire, mais si je ne me consacre pas aux scripts de Valprofond, j'en connais certains qui vont me poursuivre avec un fouet ou une corde pour me pendre

En tout cas c'est quelque chose qui m'intéresse, d'ailleurs à mes heures perdues je vais tenter de scripter un Dragon assez futé, ça pourrait être drôle
Lien direct vers le message - Vieux
Avatar de Simkim
JOL Simkim
Alpha & Oméga
 
Avatar de Simkim
 
Je sais que ça ne se fait pas en une après-midi sinon j'en aurais proposé une (bon d'accord, elle aurait été pleine de bugs ).

Bon allez zou, je vais essayer de me mettre au mimetic moi. Avec un peu de chance j'aurais compris comment ça marche avant la sortie de XP2 (pour les ignares c'est le nom provisoire du deuxième add-on de NWN).
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > L'IA mimétique
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 15h03.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite