Principes de base
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

Nous supposons que vous avez lu l'introduction, qui explique comment ajouter une IA à OpenTTD. Cette page expliquera comment ajouter quelques choses simples pour faire faire quelque chose à votre IA. Le résultat se trouve dans les AIs d'exemple.

Contents

Nommer votre compagnie

Bien entendu, la première chose que vous voudrez faire est de nommer votre compagnie. Vous voulez vous faire de la publicité, n'est-ce pas? Pour changer le nom de votre compagnie, vous devez charger la classe AICompany. Dans Squirrel, toutes les classes sont préchargées, donc vous pouvez les utiliser directement.

Maintenant, modifions le nom de notre compagnie. La fonction pour le faire, comme nous le dit l'API, est SetName. Le paramètre est une chaîne. Nous avons donc:

function MaNouvelleIA::Start()
{
  AICompany.SetName("MaNouvelleIA");
}

Maintenant, si vous faites bien attention, vous aurez tout de suite remarqué que cela va à l'encontre d'une règle apprise dans l'introduction: le Start() se termine, donc votre IA meurt. Mais c'est simplement une illustration, donc cela suffira pour le moment.

Démarrez OpenTTD, lancez une nouvelle carte et voyez comment votre IA modifie maintenant le nom de la compagnie du nouveau joueur en MaNouvelleIA.

Nommer votre compagnie (avancé)

Mais maintenant, que se passe-t-il si votre IA démarre deux fois. Vous ne pouvez pas avoir deux IA avec le même nom de compagnie. Si vous les lancez, vous verrez que le second nom reste à Non nommé. Cela ne va pas. Heureusement, nous pouvons vérifier le résultat de la fonction voir s'il est OK. Améliorons donc un peu la fonction, et vérifions le résultat. S'il a échoué, trouvons un autre nom.

function MaNouvelleIA::Start()
{
  if (!AICompany.SetName("MaNouvelleIA")) {
    local i = 2;
    while (!AICompany.SetName("MaNouvelleIA #" + i)) {
      i = i + 1;
    }
  }
}

Ce qui se passe là est que si le renommage de l'IA en MaNouvelleIA échoue, il essayera MaNouvelleIA #2. Si cela échoue aussi, il essayera MaNouvelleIA #3, etc. Au bout d'un moment, cela fonctionnera, du moins c'est l'idée. Donc voilà, vous avez votre première IA qui fait quelque chose dans le cours du jeu.

Afficher des sorties de débogage

Pour afficher une sortie dans la fenêtre de débogage de l'IA, vous pouvez utiliser AILog. Ces messages sont aussi écrits dans la console (AILog.Info avec niveau de débogage de l'IA à 4 ou plus, AILog.Warning avec niveau 3 ou plus et AILog.Error avec niveau 1 ou plus). Notez que ces fonctions n'acceptent qu'une chaîne en paramètre. Si vous voulez écrire autre chose, convertissez-le d'abord en chaîne. La manière la plus simple de le faire est d'ajouter une chaîne vide, par exemple:

AILog.Info(un_entier + "");

Système d'événements

Le système d'événements est un simple système de sondage. Vous devez sonder le contrôleur d'événements de temps en temps pour voir s'il y a des événements significatifs pour vous dans la pile. Le faire est assez facile:

while (AIEventController.IsEventWaiting()) {
  local e = AIEventController.GetNextEvent();
  switch (e.GetEventType()) {
    case AIEvent.AI_ET_VEHICLE_CRASHED:
      local ec = AIEventVehicleCrashed.Convert(e);
      local v  = ec.GetVehicleID();
      AILog.Info("Nous avons un véhicule accidenté (" + v + ")");
      /* Gestion du véhicule accidenté */
      break;
  }
}

Et maintenant?

Comment procéder ensuite dépend beaucoup de ce que vous voulez que fasse votre IA. La meilleure chose à faire est de commencer à regarder dans l'API. Nous vous suggérons de commencer avec une IA pour véhicules routiers uniquement. Nous savons que c'est assez pénible, mais vous pouvez vraiment gagner beaucoup d'argent avec eux, en opérant correctement. De plus, il sont bien plus faciles à créer et à comprendre que les trains. Les navires et les avions sont aussi très faisables, mais moins intéressants que les véhicules routiers.

Par exemple, si vous voulez construire des routes et des gares routières, regardez la documentation de AIRoad. Vous y trouverez les bonnes fonctions. Pour l'information sur les stations, voyez AIStation. Pour la construction de véhicules et la fixation des ordres, voyez AIVehicle et AIOrder. Tout cela semble assez logique, non?

Bien sûr, il y a beaucoup de choses qui vous facilitent la vie. Il y a par exemple un bout de code qui met en queue toutes vos commandes dans une grande liste et commence à les exécuter à la demande, toutes ensemble. Maintenant, si l'une échoue, là où ce n'avait pas encore été le cas, tout est annulé. C'est très utile de temps à autres, comme quand vous planifiez une route qui peut sembler ne pas poser problème à construire mais qui, au moment de vouloir placer une portion, trouve qu'une autre compagnie a déjà occupé la case. De telles portions de code facilitent la gestion de ce genre de situation. D'autres exemples sont les déterminations de chemin, et autres choses semblables.