M   E   N   U

  N  E  W  S
    News
       Mugen News
       Site News
       Old News

 D  O  W  N  L  O  A  D
    Characters
       Athena 2001
       Athena 2002
       Neo Athena
       Evil Ryu
       Violent Ken
       Lynn Baker
       Karin
       Sissy
       Sakura
    Hosted
       Diao
       Kyo
    Stages
       Neogeo 1
       Neogeo 2
       Neogeo 3
       Neogeo 4
       EFZ
       EFZ 2
       Melty Blood
       Others
    Add-ons
       Screen Pack
       Tools/Others
       Video

 W  I  P
    Characters
       Mina

 D  O  C  S
    Tutoriels (FR)
       Personnages
       Stages
       Barres de vie
       Screen Pack
       Intro-Fin
    FAQ (FR)
       Lexique
       Mugen
       Personnages
       Stages
       Screen Pack
       Communauté
    Mugen Torch
       Text in French
       Text in English

 A  R  T  S
       Iris-Net




IV. CODAGE DU SCHEMA DE JEU DE L'AI

Il existe deux méthodes distinctes pour coder un AI dans un personnage. L'une d'elle fait appel au statedef -2 du fichier CNS, tandis que l'autre fait appel au statedef -1 du CMD. Cette dernière méthode est bien plus efficace en termes de confort de lecture et de rédaction. En effet en général un CMD est beaucoup moins long qu'un CNS, et permet une plus grande flexibilité. C'est donc sur cette méthode que j'insisterai le plus, en laissant de côté l'autre pour le moment. A vous de voir ce qui vous arrange, mais je ne vous donnerai rien de plus sur la méthode du CNS.

Ouvrez le fichier CMD de votre personnage, vous devriez avoir la liste des commandes de votre personnage, puis l'association des commandes aux states du CNS dans le statedef -1. Voici la méthode à suivre pour coder l'AI dans le CMD.

1. Créer des commandes impossibles à exécuter par l'être humain (genre HAUT et BAS et GAUCHE et DROITE et 3 boutons en même temps, le tout en 1/60è de seconde. C'est bien impossible à exécuter pour un humain, même s'il s'appelle Flash :), et les nommer "CPUx" ou "AI_x" (c'est pour les distinguer des commandes normales), le x étant à remplacer par le numéro de la commande (genre CPU1, CPU2 etc ...). Sachez que plus il y a de commandes, plus l'AI se déclenchera tôt (cf. la suite pour les explications). Voici un exemple de commande CPU tiré de mon Clark (type CHOPEUR) :

;--------------------------
[Command]
name = "CPU1"
command = D, D, U, U, D, U
time = 1
;--------------------------

La commande D,D,U,U,D,U indique qu'il faudrait faire bas bas haut haut bas haut en 1/60è de seconde, ce qui est impossible pour un humain.

2. Assigner une variable qui prendra la valeur 1 si l'une des commandes CPU s'exécute. Il vous faudra donc regrouper toutes les commandes en trigger dans un bloc VarSet, comme suivant (ATTENTION CE BLOC DOIT ETRE REDIGE DANS LE STATEDEF -1, EN-DESSOUS DONC) :

[State -1, Activation de l'AI]
type = VarSet
trigger1 = command = "CPU1"
trigger2 = command = "CPU2"
trigger3 = command = "CPU3"
trigger4 = command = "CPU4"
trigger5 = command = "CPU5"
trigger6 = command = "CPU6"
trigger7 = command = "CPU7"
v = 6
value = 1

On indique ici à Mugen d'initialiser une variable, ici la 6 (vous pouvez prendre n'importe quelle valeur, tant qu'lle ne dépasse pas 59 ; j'ai pris la 6 parce que les 5 premières sont déjà utilisées pour Clark), et de lui donner la valeur 1 si l'une des commandes CPU est exécutée par le moteur. Dans mon CLark il n'y a que 7 commandes CPU, mais dans des personnages du type Evil Ken, il peut y en a voir 15,20 voire plus selon les besoins. C'est une partie très importante car sans elle, pas d'AI. Il faut absolument être sûr d'avoir écrit ce bloc avant de continuer.

3. Indiquer à MUGEN qu'une fois la variable à 1, il ne doit exécuter que les states prédéfinis par le créateur.
En effet, tout ce travail préliminaire ne servirait à rien sinon. Il faut dire à MUGEN qu'il ne doit exécuter que ces states et ne pas utiliser sa méthode de choix de states aléatoire, ce qui donnerait l'impression d'un AI qui fait absolument n'importe quoi. C'est pourquoi chacun des states que vous rédigerez devra contenir la ligne suivante :

[State -1, Blah ...]
type = ChangeState
value = valeur_du_state

triggerall = var(x) = 1

C'est cette dernière ligne qui est obligatoire. Notez qu'il faut remplacer le x par la valeur de la variable initialisée plus haut. Ainsi on s'assure que l'AI est bien activé.
Remarque : il est généralement très recommandé de marquer cette ligne en triggerall et non pas en triggerx puisque un AI a besoin de plusieurs conditions. En voici la preuve dans un bloc de mon Clark, concernant le Super Argentina Backbreaker ainsi que des commentaires sur chaque ligne (chope proche) :

[State -1, Super Argentina Backbreaker]
type = ChangeState
value = 900
triggerall = var(6) = 1 ; l'AI doit être activé pour pouvoir accéder à ce state
triggerall = statetype != A ; Clark ne doit pas être en l'air (en effet l'argentina backbreaker ne se fait qu'au sol)
triggerall = p2statetype != A ; L'ennemi ne doit pas être en l'air (pour éviter de se faire contre-attaquer)
triggerall = p2statetype != L ; L'ennemi ne doit pas être "allongé par terre" (s'il vient de tomber par exemple)
triggerall = p2stateno != 5120 ; L'ennemi ne doit pas être dans son state où il tombe inerte au sol (fall)
triggerall = random < 950 ; Ce state sera exécuté 9.5 fois sur 10 si les conditions sont remplies
triggerall = moveguarded = 0 ; Ce state ne sera pas exécuté si l'ennemi a déjà bloqué un coup précédent
trigger1 = ctrl ; Clark doit pouvoir bouger comme le ferait un joueur humain
trigger1 = P2bodydist X <= 30 ; L'ennemi doit se trouver à moins de 30 pixels en termes d'axe X de Clark

trigger2 = movecontact ; s'exécutera si le coup qui suit a touché l'adversaire, qu'il ait bloqué ou pas l'attaque
trigger2 = stateno = 211 ; State du gros poing proche (comme dans KOF, faut pas oublier de faire comme dans le jeu hein :p)

trigger3 = movecontact
trigger3 = stateno = 202 ; avant + petit pied (même raison)

3 conditions spécifiques (triggerx), et des conditions générales (triggerall).

Les conditions varient donc d'un personnage à l'autre, d'un coup à l'autre, à vous de voir comment vous allez coder tout ça, je peux pas vous aider pour chaque personnage existant ! :D Mais je peux toujours vous donner des conseils et trucs pour réussir votre AI.


V. CONSEILS SUPPLEMENTAIRES

Voici donc quelques conseils que je vous fournis afin d'éviter les erreurs de base dans le coding d'un AI.

1. Précisez bien que le personnage qui entre dans un state ne doit pas être déjà dans ce state. (sauf exception) Pour clarifier, prenons Clark. Il a un coup de base qui est un gros poing proche 2hit. Il faut dire à l'AI que Clark ne peut pas annuler ce gros poing pour en faire un autre, sinon bonjour l'infini.

2. Ne donnez pas réponse à tout à votre AI
En effet, un AI peut être fort, efficace mais pas cheap non plus. Il faut bien qu'il y ait une faille à un moment ou a un autre. C'est pourquoi les persos du type Psycho Shredder ont un AI complètement inutile et qu'il est idiot de copier. Regardez par exemple ceux de Sander qui sont très bien faits.

3. N'oubliez pas les sons pour votre AI
Si vous devez utiliser des SndStop pour votre personnage, il faut également refaire ces SndStop pour l'AI, sinon ça va devenir un charabia sonore difforme. Exemple avec mon Clark :

[State -3, Mute for Player]
type = StopSnd

triggerall = var(6) = 0

trigger1 = stateno = 100
trigger1 = AnimElem = 5, >= 0
trigger1 = command != "holdfwd"
trigger2 = stateno != 100 ; Run
trigger2 = stateno != 950 ; Flash Elbow
trigger2 = stateno != 2500 ; Mount Tackle
trigger2 = stateno != 3001 ; Running Three
trigger2 = stateno != 3003
trigger2 = stateno != 3101 ; Running Three SDM
trigger2 = stateno != 3103
trigger2 = stateno != 3104
trigger2 = stateno != 3105
trigger2 = stateno != 4500 ; Mega Running Spark
trigger2 = stateno != 4503
trigger2 = stateno != 4505
trigger2 = stateno != 4507
trigger2 = stateno != 7902 ; Twisted Wrestle DM
trigger2 = stateno != 7954 ; Twisted Wrestle SDM
channel = 3

[State -3, Mute for AI]
type = StopSnd

triggerall = var(6) = 1

trigger1 = stateno = 100
trigger1 = AnimElem = 5, >= 0
trigger1 = command != "holdfwd"
trigger2 = stateno != 100 ; Run
trigger2 = stateno != 950 ; Flash Elbow
trigger2 = stateno != 2500 ; Mount Tackle
trigger2 = stateno != 3001 ; Running Three
trigger2 = stateno != 3003
trigger2 = stateno != 3101 ; Running Three SDM
trigger2 = stateno != 3103
trigger2 = stateno != 3104
trigger2 = stateno != 3105
trigger2 = stateno != 4500 ; Mega Running Spark
trigger2 = stateno != 4503
trigger2 = stateno != 4505
trigger2 = stateno != 4507
trigger2 = stateno != 7902 ; Twisted Wrestle DM
trigger2 = stateno != 7954 ; Twisted Wrestle SDM
channel = 3

4. Vérifiez bien que le bloc que vous avez rédigé fonctionne correctement d'après les conditions que vous avez fournies.
En effet, il ne faut pas passer à autre chose sans s'assurer que tout marche impec en premier lieu.

5. N'oubliez pas de signaler à l'AI dans votre state les conditions impossibles
Par exemple si un coup ne peut s'effectuer qu'au sol, il faut bien dire à MUGEN que l'AI ne peut pas l'effectuer en l'air.

Exemple :
triggerall = statetype != A ; Clark ne doit pas être en l'air (en effet l'argentina backbreaker ne se fait qu'au sol)

6. Faites bien attention au coding de combos
Le coding de combos utilise le même système de stateno cancels. Faites attention lorsque vous voulez que votre AI fasse des combos donc. Un petit exemple avec Clark, on veut lui dire de faire Close C -> Gatling Strong -> Napalm Stretch -> Flash Elbow. On va procéder ainsi :

> Dans le state AI correspondant au Gatling Strong, dire à l'AI que ce coup peut annuler le 1er hit du close C (stateno = 211 && time = [0,8]), mais que ce n'est pas le seul (stateno = 202, petit poing accroupi)

> Dans le state AI correspondant au Napalm Stretch, dire à l'AI que ce coup est un followup du Gatling à un certain intervalle de temps (on pourra lui dire de le faire tout le temps afin de prolonger le combo)

> Dans le state AI correspondant au Flash Elbow, on dira à l'AI que ce coup est un followup du Napalm Stretch durant également un certain intervalle.

Les command cancels sont expliqués dans les tutoriaux d'Elecbyte, je ne reviens donc pas dessus.
Voilà, j'espère qu'avec ce tutorial vous comprendrez mieux le fond et la forme d'un AI, et armez-vous de patience, tout vient à point à qui sait attendre ;)


VI. CREDITS

Les personnes qui m'ont aidé de manière directe ou indirecte

> Sander71113 : c'est lui qui m'a indirectement quasi tout appris concernant le coding d'un AI. Le savoir se transmet ;)

> YongMing : J'ai chipé quelques lignes de l'ai de son clark pour le mien :D

> Reu, O.Herman, etc ... : tous ceux-là ont fait des persos avec des gros AI dont j'ai appris pas mal de choses aussi.



 
   Home
   About
   FAQ
   Disclaimer
   Staff/Thanks
   Contact



   Forum in french
   and english.

   Iris-Net



   
   Delta Park
   Sunny World
   Neoxfight Studios
   Mike Mugen
   Gods Anger
   Matmut's Creations
   Byakko
   :o domain
   Fun Factory
   Mugen Guild
   Anime Mugen
   Shin Mugen





Cute Mugen | © 2002 - 2004 | All Rights Reserved.