Développement
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
- Listes
- Traiter les erreurs OTTD
- Tramways
- Bibliothèques de l'IA
- Forum
- FAQ du forum
- Comportement de l'IA
IAs
Tous les articles de la catégorie NonIANous 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.