L'IA mimétique

Répondre
Partager Rechercher
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;

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...
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
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).
Je suis l'avancée du Memetic AI toolkit depuis sa sortie. C'est un système qui me séduit beaucoup parcequ'il est modulaire et qu'il a une approche beaucoup plus académique que l'AI de bioware.

J'attends la sortie de la version utilisateur 1 (pour l'instant on en est à la developper release 4)

@+
mm, personnellement, je lis, je réfléchis (un peu, il est encore tôt ) et je m'étonne moi aussi de tant de méfiance
Très franchement, c'est exactement le genre de trucs que je cherchais pour animer mes gardes dans ma prison, mes rats et mes orcs, mes . . . etc. dire que je me suis fendu d'un tas de machin bancals (bancaux ? ) pour faire tout ca (et que j'ai abandonné la plupart des idées) j'ai pas testé, fautes de temps, et g abandonné tout ca pour faire autre chose
mais si c'est économique, ba ca simplifie achement la vie non ? même plus, ca ouvre vraiment le champ à un tas de trucs drôle . . .


Enfin, peut être que, comme 95% de ce qui est fais sur un module, ca ne seras jamais remarqué par les joueurs, mais tout de même, c'est le genre de trucs qui rend fier de son bébé ca nom ?

bref, juste pour dire que je suis pas mal emballé par ce truc aussi
un énième "à suivre" donc
et tous éclaircissement apportés sur cet apparemment merveilleux système sont les bienvenu
Nananan Vald_F, t'es pas "heup tou dète" !
Pour l'instant la Developper's Release 5 finale est dispo, et ils bossent sur une beta de la DR6 qui devrais arriver bientôt.
Parmi les apports de cette nouvelle version, on a (il me semble) la gestion de listes d'objets/textes qui servent de paramètres pour les memes (en gros ça économise des SetLocal*), et aussi l'ajout de fonctions déclenchées sur les emitters. Y'a sûrement d'autres trucs, mais bon j'ai pas eu le temps de lire l'intégralité du forum.

En dehors de ça ben j'ai encore pas mal fouillé le système, et en fait le gros problème en l'état actuel des choses c'est que le système est encore en développement, ce qui veut dire qu'on doit développer ses propres memes, générateurs et events. Et là ça devient assez casse-tête.
Personnellement je n'ai pas encore réussi à faire marcher une sequence de memes, ni à faire marcher d'event. Contrairement à ce que je croyais au début, les résultats se font vraiment attendre, ce qui est du au fait que c'est comme si on devait apprendre un nouveau language de programmation; la syntaxe reste la même, mais le principe et les fonctions utilisées sont radicalement différentes, et pas franchement simples

Enfin bon, là je suis sur le point de réussir à faire un comportement de passant simpliste, dès qu'il roule je vous le mets ici intégralement commenté, promis
En gros programmer cette IA la ou refaire l'IA de Bioware c'est pareil, faut se tapper le boulot ou attendre que les concepteurs le fassent à notre place
Citation :
ou attendre que les concepteurs le fassent à notre place
Petit message de David Gaider de chez BioWare à propos de l'IA dans SoU.

Citation :
The overall AI is improved, not the henchmen specifically... and, yes, the generic AI scripts themselves have been changed.
Reste plus qu'à attendre de voir ce que ça va donner
Attend, t'emballe pas trop vite, ça peut vouloir dire en clair:

- Comme il y a 50 nouveaux sorts et des nouvelles classes, on a bien du modifier quelques lignes dans le script d'IA, histoire que les PNJ possédant l'un et l'autre pensent à les utiliser de temps en temps

Citation :
The overall AI is improved, not the henchmen specifically
Alors cette phrase là, elle me fait à la fois prendre espoir (les mots avant la virgule); mais la suite ne m'annonce rien de bon
Cela sous-entend qu'au vu des nombreuses demandes au sujet des compagnons, Bioware a bien du se résoudre d'améliorer un peu leur IA, MAIS ils veulent rassurer tout le monde en précisant qu'ils ont aussi modifier (un peu, juste pour dire quoi) le reste.
J'extrapole beaucoup, mais je sens encore le gros poisson pas frais se profiler au bout de la canne à pèche
Je ne m'embale pas, je sais qu'entre ce que disent (de façon très vague) les développeurs et ce qu'on trouve généralement dans le jeu, il y a souvent des différences .

En continuant ma lecture du forum, je suis tombé sur un autre passage de David Gaider. Il semblerait que "l'amélioration" principale soit au niveau du choix et de l'ordre des sorts lancés.

Bah, j'ai de quoi être optimiste quand à la nouvelle IA, ça ne peut pas être pire que maintenant, donc ce sera forcément mieux .
Mouais, peut être qu'ils gagneront en clarté, ça serait pas mal Quoiqu'avec les UDE on peut rajouter des scripts à l'IA de base sans risquer de la perturber.

Bref, j'ai réussi à créer une IA mimétique de PNJ très (très) basique, donc je vais vous en faire part

- Comportement souhaité

Ici le but était qu'un PNJ fasse 2 choses très simples :
- la plupart du temps, se balader sur une petite zone (RandomWalk);
- de temps en temps, se déplacer sur de longues distances
(pour faire une ville un petit peu plus réaliste, enfin personnellement je vois pas souvent des gens dans la rues qui tournent en rond toute la journée, généralement chaque personne va a un endroit précis)

- Memes

Logiquement, on devra créer 2 memes sur chaque citoyen, un par actions souhaitées. A noter que l'action "de grand déplacement" se déclenchera périodiquement, mais j'ai choisi de la créer dès le début et de lui donner une priorité nulle (ajustable par la suite).

- Générateurs

Y'en a pas encore

- Events

On va avoir besoin d'un event, fourni avec le package DR 5 : e_prioritize. Celui-ci permet de changer la priorité d'un meme au cours du jeu, ce qui nous permettra de faire se déplacer le PNJ à un moment voulu.

-- Scripts --

Là on entre dans le vif du sujet J'ai eu besoin de créer 3 scripts : le OnSpawn du PNJ, et les scripts du meme "i_deplac" (grand déplacement).
Bien sûr, pour que les objets mimétiques inclus au DR 5 fonctionnent, il faut initialiser les libraires sur le module etc. mais je détaille pas, c'est pas vraiment un tutorial

Alors, le OnSpawn du PNJ :

s_citoyen
Code PHP:

//::///////////////////////////////////////////////
//:: s_citoyen
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Initialisation des memes, generateurs
    et events des PNJs citoyens
    (Mimetic AI)
*/
//:://////////////////////////////////////////////
//:: Created By: Taern
//:://////////////////////////////////////////////
#include "h_ai"

void main()
{
    
object oMemeoEventoSeqoGen;
    
float fDelai IntToFloat(Random(20)+40);   // Delai précédant la première activation de l'event e_prioritize

    // 1er meme : balade (action de fond)
    
MeCreateMeme("i_wander",                    // Nom du meme (celui-la est inclus au DR 5)
                 
PRIO_LOW,                      // Priorite (de PRIO_NONE à PRIO_HIGH)
                 
0,                             // Modificateur a l'interieur de la priorite
                 
MEME_RESUME|MEME_REPEAT);      // Flags (ici le meme boucle a l'infini
                                                // et recommence apres une interruption)

    // 2e meme : grand deplacement (action en attente)
    
oMeme MeCreateMeme("i_deplac",            // J'ai du creer ce meme
                         
PRIO_NONE,             // Le meme reste "en attente", aucune priorite
                         
0,                     // idem
                         
MEME_RESUME);          // Le meme reprendra si il est arrete, mais ne boucle pas

    // 1er event : grand deplacement
    
oEvent MeCreateEvent("e_prioritize",      // Cet event est inclus au DR 5
                           
EVENT_PERSISTANT);   // Flags, mais la on a pas le choix, c'est le seul existant
                           
    
MeAddTriggerTime(oEventfDelai);           // On declare un trigger, càd une condition pour que l'evenement se lance.
                                                // Il y a 2 types de triggers : triggers temporels et triggers signaux
                                                // Le 2e type est utilise pour les emitters, donc ici on s'en fout :P

    // Parametres de l'event (connus a partir de la description de l'event dans le script lib_events)
    
MeAddFloatRef(oEvent120.0"Delay");          // Delai entre chaque nouveau changement de priorite
                                                    // en fait cet event va tourner en boucle, remettant
                                                    // a chaque fois la priorite du meme a la meme valeur
    
MeAddObjectRef(oEventoMeme"Meme");          // Meme qui doit etre modifie (on peut en entrer plusieurs)
    
MeAddIntRef(oEventPRIO_MEDIUM"Priority");   // Nouvelle priorite voulue
    
MeAddIntRef(oEvent50"Modifier");            // Nouveau modificateur voulu
    
MeAddIntRef(oEvent20"DelayJitter");         // Composante aleatoire sur le delai defini plus haut
    
    
MeStartEvent(oEvent);                           // Et hop on lance l'event  : )

    
MeUpdateActions();          // Cette commande assigne le meme adequat au PNJ
                                // Elle doit toujours etre appelee lorsqu'on modifie les memes d'un PNJ
                                // a noter qu'elle n'est souvent utilisee que dans le onspawn, mais qu'elle l'est
                                // aussi bien sur dans l'event e_prioritize

Voilà, rien de bien méchant en fait, l'important étant d'être rigoureux et méthodique. La plupart du temps rien de marchait chez moi parce que j'oubliais soit de lancer l'event, soit de définir un trigger, etc.

Bon ensuite le premier script du meme de grand déplacement, i_deplac_go.

i_deplac_go
Code PHP:

/* Meme : i_deplac_go (grand deplacement)
 Choix d'une destination, enregistrement de celle-ci
 Ordre de mouvement
*/
#include "pnj_inc"
#include "h_ai"

void main()
{
    
object oDest GetLocalObject(OBJECT_SELF"destination");      // Ceci permet de verifier si une destination
                                                                    // avait deja ete assignee au PNJ mais n'avait
                                                                    // pas ete atteinte

    
if(!GetIsObjectValid(oDest))                            // Si effectivement aucune destination n'etait assignee...
    
{
        
oDest ChoixObjetZone(GetArea(OBJECT_SELF), "pnj_interet");    // Alors on en choisit une
                                                                        // (fonction perso que j'ai faite pour mes PNJs,
                                                                        // secret defense ; )  )
        
SetLocalObject(OBJECT_SELF"destination"oDest);          // On assigne cette destination
                                                                    // (au cas ou le meme serait interrompu)
    
}
    
MoveToLocationDecalee(OBJECT_SELFGetLocation(oDest));         // On va vers cette destination
                                                                    // (autre fonction perso :P a noter que ces fonctions
                                                                    // sont dans pnj_inc)

En fait les memes ressemblent à de simples scripts d'action. Mais il est possible de faire plus compliqué en rajoutant des paramètres, des valeurs renvoyées par le meme etc. Enfin là c'est ma première IA (oui bon je sais, ça a rien d'intelligent ) donc on reste dans le basique.

Enfin, dernier script créé : i_deplac_end (la fin du grand déplacement).

i_deplac_end
Code PHP:

/* Meme : i_deplac_end (grand deplacement)
 Suppression de la destination enregistree
*/
#include "h_ai"

void main()
{
    
DeleteLocalObject(OBJECT_SELF"destination");  // On supprime la destination precedemment assignee au PNJ
                                                    // puisque celle-ci a ett atteinte
                                                    
    
MeSetPriority(MEME_SELFPRIO_NONE0);     // Ici on doit absolument remettre la priorite du meme a zero
                                                // si on veut que le PNJ se remette a se balader aleatoirement
                                                // sans ca, ledit PNJ resterait betement sur place
                                                // jusqu'a la fin de ses jours, cruel non ? ; )

    
MeUpdateActions();              // Encore elle, je ne suis pas sr de sa necessite, mais on est jamais trop prudent
                                    // de toutes facons, cette fonctions ne perturbera jamais
                                    // le comportement d'une creature, elle ne fait que de le "rafraichir"

Voilà ! J'espère que ça vous aura un peu aidé Ces scripts sont tout de même très basiques, mais je trouve ça très formateur

Prochaine leçon : les emitters ! pourvu que j'arrive à les faire marcher
Répondre

Connectés sur ce fil

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