Comment faire un scénario ?

Didacticiel de l'éditeur    -    Guide des déclencheurs    -    Guide des scripts IA

1) Introduction (celle du guide d'ES traduit par Apad)

Age Of Empire II (AOE2) utilise un nouveau système expert d'Intelligence Artificielle (IA) pour faire agir les Joueurs Gérés par l'Ordinateur (JGO). Ce système expert utilise une série de règles qui sont testées pour mettre en place les actions des JGO. Vous allez apprendre comment créer de nouvelles règles, comment évaluer le contexte du jeu pour déclencher ces règles et comment gérer l'IA selon vos instructions.

Les fichiers d'IA sont des fichiers texte avec une extension '.per' (par exemple 'Charlemagne.per'). Ces fichiers contiennent les commandes de script utilisées pour créer un nouveau comportement personnalisé de JGO. Utilisez un éditeur de texte pour créer vos scripts et copier ces fichiers dans le répertoire où vous avez installé AOE2, dans le dossier AI.

Un fichier vide avec l'extension '.ai' (par exemple 'Charlemagne.ai') doit être créé pour obtenir une entrée dans la liste des JGO et dans l'éditeur de scénarios. Le jeu essayera de trouver le fichier correspondant avec l'extension '.per' lorsque vous sélectionnerez votre nouveau joueur. Ainsi, dans le répertoire AI du jeu, vous devez avoir 2 fichiers :
C:\Program Files\Microsoft Games\Age of Empires II\AI\Charlemagne.ai (Ce fichier vide crée une entrée dans la liste du jeu)
C:\Program Files\Microsoft Games\Age of Empires II\AI\Charlemagne.per (Ce fichier contient votre script personnalisé d'IA)

2) L'intérieur

2.1) Général

Une fois vos 2 fichiers crées, ouvrez le fichier .per (avec l'éditeur IA de préférence) et vous voila prêt, devant votre page blanche, a taper votre code :).

Le contenu change un peu suivant le script IA que l'on vise, il y a plusieurs sortes de scripts IA :
- Le script minimum destiné a s'adapter a un scénario en particulier (une centaine de ligne max.)
- Le script normal, celui qui va être expliqué dans ce guide (de 500 a 1000 lignes je pense)
- Le script géant, genre le Standard d'ES (qui n'est conseillé a personne, d'ailleurs je n'en vois pas trop l'utilité, cela prendrait beaucoup trop de temps, ce genre de script est réalisé par les développeurs du jeu, pas par les joueurs !), je pense que ce script doit faire plus de 5000 lignes !

Ne vous laissez pas impressionner par le nombre de ligne, rien n'indique que les lignes sont remplies comme dans un texte, la mise en forme du script (pour une meilleure lisibilité) rajoute énormément de lignes ;)

Note a propos du script Standard : ce script est vraiment long et bien fait (en tout cas, j'en félicite l'auteur pour tout ce travail ! ). Par contre, il est vraiment très dur de l'étudier, du fait qu'il soit reparti en plusieurs fichiers, qu'il manque de commentaires, etc. En fait, je parle d'étudier comment il fait face a certaines situation pour le recopier, mais du fait qu'il ai aussi une grande part de hasard le rend très compliqué (l'auteur doit non seulement répondre a toutes les situations mais aussi créer plusieurs réponses a chaque situation ! ).

2.2) Le script normal

Voici les parties les plus importantes que le script normal devra gérer :
- Les nombres stratégiques (Strategic numbers)
- Les constructions
- Les unités
- Les technologies
- Le script principal et le reste

Je conseille de séparer les parties en différents fichiers pour une meilleure organisation.

3) Les nombres stratégiques

3.1) Présentation

Des fois, ils se trouvent dans le script principal mais lorsqu'il y en a trop, mieux vaut les mettre dans un fichier a part.

Il est pratique de les regrouper dans un fichier a part, et ainsi de définir tout les nombres stratégiques d'un coup, mais n'oubliez pas que certains SN doivent changer tout au long du jeu (comme par exemple la répartition des villageois).
Il est de plus inutile de définir tout les nombres stratégiques, car d'après mes tests, il y en a un paquet qui ne marche pas... (dans mon Script De Base, ceux qui ne sont pas désactivés sont ceux dont je suis sur qu'ils marchent).

Attention, une règle IA ne doit posséder maximum que 15 Actions, sous peine d'erreur lors du démarrage de la partie.

3.2) Pratique

Pour définir les nombres stratégiques, c'est très simple :

(defrule)
(true) ;pour que ce soit execute des le debut
=>
(set-strategic-number sn-percent-civilian-gatherers 60)
;ceci definit le % de péons qui récoltent les ressources
(disable-self)
;il suffit de le définir une seule fois, pas plus, et puis sinon
;ça empêche de le changer après
)

4) Les constructions

4.1) Présentation

Ce morceau de script gère toutes les constructions du JGO (Joueur Géré par l'Ordinateur).

Ce morceau de code est, je pense, le plus facile a ecrire, il suffit d'employer a peu près la même règle pour chaque bâtiment du jeu.

4.2) Pratique

Voici un exemple :

(defrule
(building-type-count-total siege-workshop < 1)
;nombre d'atelier de siege inferieur a 1
(can-build siege-workshop)
;construction possible
=>
(build siege-workshop)
;construction
(chat-local-to-self "atelier de siege")
;sert quand on teste le scénario en se mettant a la place de l'ordi
)

Il suffit de tester que le bâtiment n'est pas déjà construit, que l'ordinateur est capable de le construire (ressources, age...), puis de le construire ;).

Certains bâtiments sont plus particuliers :

Maisons : Il faut rajouter ces deux Facts

(housing-headroom < 4)
;places disponible dans les maisons inférieures a 4
(population-headroom > 0)
;nombre de places qui peuvent être crées avant d'arriver
;a la limite de population

Forum : Le JGO doit construire plusieurs forums pour faire un petit boom, ceci grâce a ces facts

(game-time > 45)
;pour ne pas construire direct le forum si la partie
;commence a l'age des châteaux
(current-age == castle-age)
;construire les forums uniquement a l'age des châteaux (facultatif)
(building-type-count town-center < 3)
;nombre max de forum a construire

Fermes : Les fermes doivent être construites en nombre suffisant

(defrule
(sheep-and-forage-too-far)
;plus de baies ni d'animaux
(building-type-count-total farm < 5)
;nombre de fermes inferieur a 5
(idle-farm-count == 0)
;pas de fermes épuisées ou sans fermier
(can-build farm)
=>
(build farm)
(chat-local-to-self "ferme")
)

(defrule
(food-amount < 100)
;si manque de nourriture
(building-type-count-total farm < 12)
;nombre de fermes inférieur a 12
(idle-farm-count == 0)
(can-build farm)
=>
(build farm)
(chat-local-to-self "plus de nourriture : ferme")
)

Notez aussi qu'il est assez stratégique de construire des bâtiments directement chez l'ennemi en rajoutant "-forward" a l'action "build".

(build-forward barrack)
;construire une caserne chez l'ennemi

5) Les unités

5.1) Présentation

Toutes les unités que le JGO va entraîner (je conseille de mettre les villageois dans le script principal).

Ce morceau de code est très simple a la base, mais si vous voulez une réelle efficacité, il faudra compliquer le tout.

5.2) Pratique

Voici le code de base pour chaque unité :

(defrule
(can-train skirmisher)
(unit-type-count-total skirmisher < 10)
;moins de 10 tirailleurs
=>
(train skirmisher)
(chat-local-to-self "tirailleur")
)

Ainsi, des que le JGO le pourra, il entraînera des tirailleurs jusqu'a qu'il y en ai 10. L'ordinateur aura une belle armée, mais ce n'est pas la solution de faire en grand nombre, toutes les sortes d'unités possibles, en rajoutant ce fact, l'ordi ne fera des tirailleurs que si l'ennemi possède beaucoup d'archers.

(players-unit-type-count any-enemy archer-line > 15)

Remarquez que je n'utilise jamais "archer", "skirmisher" ou autres, mais "archer-line", "skirmisher-line", etc. ce qui désigne non seulement l'archer ou le tirailleur, mais aussi toutes les upgrades des ces unités, sinon l'ordi ne formerait plus d'archers une fois ces derniers convertis en fantassins à arc (cela diminue pas mal le nombre de lignes a écrire).

Il est recommandé de perfectionner ces règles pour avoir une IA plus intelligente, comme par exemple en créant certaines unités suivant les ages, en faisant des combinaisons d'unités pour une belle attaque, puis ensuite une autre combinaison pour une autre attaque si la première n'a pas marché etc...

6) Les technologies

Ce morceau de script est d'après moi le plus long a écrire du fait des nombreuses technologies d'AoK, je vous conseille de copier ce morceau de script (dans la section Scripts et Mods) qui gère les technologies suivant le système "tant d'unité d'un type : upgrade des ces unités".

Je n'ai pas plus a ajouter sur ce sujet.

7) Le script principal

7.1) Présentation

C'est lui qui sera lancé par l'ordi, il appellera ensuite tous les autres fichiers du script, il peut servir aussi a définir les constantes, les SN (strategics numbers), ou tout autres choses trop petites pour être placés dans un fichier a part.

Pour exemple, dans le fichier principal de mon Script De Base, j'y ai mis la création des villageois, le système d'attaque, et l'abandon.

7.2) Pratique

Voyons d'abord le système d'attaque, c'est un des morceaux les plus importants du script IA, en effet, cela ne sert a rien d'avoir une IA super intelligente, qui a pleins d'unités et de ressources si elle n'attaque pas l'ennemi !

Il y a plusieurs manières de déclencher une attaque, premièrement, a partir de quand l'ordinateur commencera le processus d'attaque, pour cela, il faut utiliser un goal qui sera défini sur 1 lorsque les attaques pourront commencer :

(defrule
(true)
;toujours vrai
=>
(set-goal 1 0)
;defini au goal 1 une valeur de 0
(disable-self)
;se desactive ensuite pour ne pas se declencher plusieurs fois
)

(defrule
(game-time >= 600)
;placez ici la condition que vous voulez, c'est elle qui
;enclenchera le processus d'attaque
=>
;ici l'attaque commencera apres 10 minutes de jeu
(set-goal 1 1) ;defini le goal 1 a 0
(chat-local-to-self "mode attaque enclenché")
(disable-self)
)

; ************* Mode d'attaque tous les laps de temps

(defrule
(goal 1 1)
;si le goal attaque est enclenché
=>
(enable-timer 1 120)
;declencher un compte a rebours de 120 secondes
(disable-self)
;une seule fois
)

(defrule
(goal 1 1)
; si le goal attaque est enclenché
(timer-triggered 1)
;et que le compte a rebours est terminé
=>
(attack-now)
;attaquer maintenant
(disable-timer 1)
;detruire le compte a rebours
(enable-timer 1 120)
;declencher un nouveau compte a rebours de 120 secondes
(chat-local-to-self "a l'attaque !")
)

; ************* Autre exemple : Attaque quand le JGO possede 
; un certain nombre d'unités

(defrule
(goal goal-attaque 1)
(military-population >= 10)
;si le JGO possede 10 militaires
=>
(attack-now)
(chat-local-to-self "a l'attaque !")
)

Il est bien sur possible d'employer beaucoup d'autres Facts pour déclencher l'attaque.

8) Conclusion

Je pense avoir abordé pas mal de domaines dans le codage de scripts IA, si vous avez des questions, si vous voulez que j'approfondisse certains points, n'hésitez pas a m'écrire.

 

RETOUR aux articles de l'éditeur

  

 

Copyright (c)  2001-2003 , L'Âge du Savoir ( Licence GFDL )

Informations légales