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.
| |
| | |
|