Introduction
Framework NonIA

Page principale NonIA

Développement

Jalons de développement
Suggestion de changements de l'API

Programmation de l'IA

Documentation API
Introduction
Fichier info.nut
Fichier main.nut
Principes de base
Détermination de chemin routier
Détermination de chemin ferroviaire
Sauver / Charger des données
Choses à savoir
Squirrel
Page principale
Erreurs courantes
Listes
Traiter les erreurs OTTD
Tramways
Bibliothèques de l'IA
Forum
FAQ du forum
Comportement de l'IA

IAs

TestAI
WrightAI
Convoy
Voir le forum
Voir BaNaNaS
Tous les articles de la catégorie NonIA

Pour commencer, le langage pour écrire votre IA est Squirrel. Squirrel est un langage de script très simple, ressemblant à C++. Pour une introduction à Squirrel, voyez la page Introduction à Squirrel. La raison pour laquelle nous avons choisi Squirrel est qu'il est très similaire à C++.

Dans cette introduction, nous allons vous guider à travers le processus de création d'une IA basique. Ce faisant, nous vous expliquerons les principes de base que vous devez connaître pour créer une IA, et une IA dans OpenTTD. Pour une maîtrise avancée de l'IA, nous vous suggérons d'acheter un bon livre. Le résultat final de ce tutoriel peut se trouver dans le répertoire 'example'.

Contents

Créer votre propre IA

Il peut y avoir différentes manières de commencer.

Vous pouvez vouloir télécharger une IA existante et la modifier, si sa licence le permet (au moment où ces lignes sont écrites, toutes les IA connues sont libres de droit). Vous pouvez partir de "IA Wright" et construire partir d'elle.

Le guide suppose que vous voulez démarrer votre IA de rien. IA:TestAI est un exemple d'une IA minimale avec des paramètres utilisateurs. Vous pouvez examiner ou copier ce code pour voir ce que vous devez avoir pour commencer.

Une règle générale de programmation sur le pouce est d'écrire une bonne documentation pour votre IA, afin qu'après quelques jours ou quelques mois, vous puissiez vous souvenir facilement de ce que les fonctions sont supposées faire. Diviser l'IA en petits fichiers logiques aidera aussi à l'organiser. Certains auteurs d'IA utilisent des commentaires de style Doxygen pour leur permettre de produire automatiquement une documentation de qualité.

Fichiers de Squirrel indispensables

  1. Trouvez votre répertoire d'installation de OpenTTD. Sur Windows, ce devrait être C:\Program Files\OpenTTD; sous Linux, /usr/share/games/openttd
  2. Créez un nouveau répertoire pour votre IA sous le répertoire ai. Par exemple, vous pouvez créer le répertoire MaNouvelleIA
    • Vous pouvez aussi créer un nouveau répertoire sous content_download/ai (situé dans votre répertoire ~/.openttd sur Linux, et dans le répertoire Documents/OpenTTD de l'utilisateur sous Windows), mais cette méthode n'est PAS recommandée, car vous risquez d'écraser vos fichiers si vous mettez votre IA sur Bananas et, comme elle est située dans un répertoire utilisateur, elle ne fonctionnera que pour cet utilisateur particulier.
  3. Créez un fichier appelé info.nut. Ceci est important, car le chargeur Squirrel le recherchera, ainsi que main.nut, dans tous les sous-répertoires. S'il ne trouve pas info.nut, le répertoire est considéré comme autre chose, et votre IA ne sera pas chargée.

La hiérarchie de votre répertoire devrait désormais ressembler à ceci:

$OpenTTD_Dir/
    | ai/
        | MaNouvelleIA/
            | info.nut 
            | main.nut

Ouvrez info.nut puis continuez à lire la section suivante.

Enregistrer

Vous voulez faire savoir à OpenTTD que vous avez une IA que vous voulez appliquer à une compagnie. Pour cela, vous devez ajouter une classe qui étend AIInfo:

class MaNouvelleIA extends AIInfo {
  function GetAuthor()      { return "Écrivain d'IA débutant"; }
  function GetName()        { return "MaNouvelleIA"; }
  function GetDescription() { return "Un exemple d'IA en suivant le tutoriel sur http://wiki.openttd.org/"; }
  function GetVersion()     { return 1; }
  function GetDate()        { return "17/03/2007"; }
  function CreateInstance() { return "MaNouvelleIA"; }
  function GetShortName()   { return "XXXX"; }
  function GetAPIVersion()  { return "1.0"; }
}

Le résultat de cela est de dire à OpenTTD comment s'appelle votre IA, sa version, et d'autres informations générales. Après cela, vous devez créer une instance de la classe. Squirrel:

/* Informer le cœur que nous sommes une IA */
RegisterAI(MaNouvelleIA());

C'est suffisant pour initialiser votre IA. Mais nous n'en sommes pas encore à la faire démarrer. Nous n'avons pas encore une vraie IA, seulement un morceau de code qui dit ce qu'est votre IA, et qui l'a écrite. Alors, faisons donc une classe qui sera notre IA.

Votre première IA

Pour cela, créez un fichier main.nut dans le même répertoire, et faites une classe qui étende AIController. Voyez Style de codage pour les recommandations de formatage.

class MaNouvelleIA extends AIController 
{
  function Start();
}/

function MaNouvelleIA::Start()
{
  while (true) {
    AILog.Info("Je suis une toute nouvelle IA avec une fonction périodique appelé MaNouvelleIA et je suis au tic " + this.GetTick());
    this.Sleep(50);
  }
}

Ce premier bloc crée la classe en étendant AIController. Le second bloc crée une fonction Start(), qui est appelée une fois au démarrage de votre IA. Si vous sortez de cette fonction, votre IA se terminera. Donc, nous créons une boucle while() qui ne s'arrête jamais. Vous n'avez pas trop à vous inquiéter sur le fait que votre IA encombre le jeu en occupant tout le CPU de votre machine (et donc en stoppant le jeu lui-même), le moteur lui-même s'endormira tous les X codes d'opération, pour forcer une répartition équitable et permettre au jeu de tourner de façon régulière. Vous pouvez toutefois mettre l'IA en sommeil manuellement en appelant la commande Sleep(). Vous verrez, quand nous démarrerons notre IA dans un moment, que cela imprime une ligne sur votre console tous les 50 tics.

Démarrez un nouveau jeu et regardez dans l'écran du menu principal pour les paramètres de l'IA. Là, sélectionnez votre IA pour la lancer. Vous n'avez besoin que de redémarrer le jeu chaque fois que vous modifiez le fichier info.nut. Assurez-vous de modifier l'heure de démarrage de votre IA pour ne pas avoir à l'attendre.

Conseil: Sur Windows Vista, vous pouvez avoir besoin de lancer openttd.exe en tant qu'administrateur. Faites soit un clic droit et choisissez "Lancer en tant qu'administrateur" chaque fois, ou désactiver l'UAC pour les administrateurs ([1]). Si OpenTTD ne tourne pas comme administrateur, les répertoires de l'IA seront invisibles à l'exécutable, et charger une IA provoquera une erreur "L'IA nommée 'XYZ' est inconnue ou non adaptée".

Si vous ouvrez la fenêtre de débogage de l'IA, qui se trouve sous l'icône du point d'interrogation, vous verrez une jolie ligne indiquant que nous sommes actifs. Vous pouvez aussi démarrer manuellement votre IA nouvellement créée en tapant la commande

start_ai MaNouvelleIA

dans la console du jeu (ouverte par la touche `)

Si vous changez le code ailleurs que dans info.nut, vous pouvez utiliser la commande de console restart pour redémarrer le jeu depuis le début. Ou vous pouvez simplement utiliser le bouton "Recharger IA" dans la fenêtre de débogage de l'IA.

Toutes les erreurs rencontrées, à la fois à la compilation et à l'exécution, sont envoyées dans la fenêtre de débogage de l'IA. Si votre info.nut ne se charge pas, vous ne verrez pas les erreurs, sauf si vous activez la console de débogage depuis la ligne de commande du jeu. -d ai=5.

Vous pouvez rediriger la sortie de la console du jeu en ouvrant celle-ci et en tapant

developer 2

Activez la sortie des ordres print et AILog.* de votre IA en tapant

debug_level ai=4

Vous pouvez défiler dans la fenêtre de la console avec les touches SHIFT-PGUP, SHIFT-PDOWN et SHIFT-FLÈCHE(haut/bas).

Ainsi, vous avez votre première IA. Bien entendu, nous avons maintenant besoin d'y ajouter de nouvelles fonctions. Pour cela, nous vous recommandons de continuer avec le chapitre suivant, principes de base. Vous avez juste à savoir que tout votre code doit aller dans Start(). Une autre chose que vous devriez savoir: ne créez jamais de variable globale. Gardez tout dans l'instance de votre classe. Mais c'est simplement une règle de vie, et si vous ne savez pas ce que cela signifie, ce n'est pas très important pour le moment.