Licence CC BY-SA

L'intelligence artificielle dans Helium Rain

Questions-réponses avec l'équipe du jeu

Après avoir détaillé le modèle physique des armes et disséqué le processus créatif dans Helium Rain, il nous fallait conclure cette série sur le développement du jeu. À la demande générale, c’est l’intelligence artificielle du jeu qui arrive sous le microscope aujourd’hui. On répond à toutes vos questions !

Concurrents, compagnies, compétition

Helium Rain est un jeu assez particulier dans la mesure où il n’a pas d’histoire scriptée, de personnages humains visibles ou même d’ennemis en tant que tel. On parle dans le jeu de concurrents, car les entités intelligentes du jeu sont des entreprises de colonisation - des compagnies, comme on les appelle, non sans écho aux marchands et explorateurs du XVI° siècle.

Le jeu est situé autour d’une géante gazeuse, escortée de plusieurs lunes, qu’une expédition de colonisation explore dans un futur proche. Les différentes factions se sont organisées autour de compagnies spécialisées dans l’extraction minière à la surface d’astéroïdes, dans la production de vaisseaux, ou dans les fermes orbitales, et ces factions cohabitent, collaborent, mais parfois aussi s’affrontent.

La carte orbitale, avec tous l'univers du jeu
La carte orbitale, avec tous l’univers du jeu.

L’économie et la concurrence sont au cœur du jeu, puisqu’on simule ici un marché libre : chaque acteur tente de produire des biens, de s’approvisionner à moindre coût, de nourrir la population locale, tout en tâchant d’agrandir son empire. Le résultat est similaire à ce qui se passe dans notre monde, avec des phénomènes de croissance, des crises, des guerres ou des alliances.

L’originalité du jeu réside dans le degré auquel nous avons poussé cette logique :

  • Les compagnies proposent dynamiquement des contrats au joueur, basés non pas sur un script ou un simple générateur, mais en fonction de leurs besoins réels : quand vous acceptez d’éliminer un cargo concurrent, vous allez réellement aider cette compagnie.
  • Si au contraire vous échouez à défendre un secteur contre une attaque de pirates, vous constaterez par vous-même les conséquences économiques.
  • Il est possible de causer des crises graves en détruisant complètement la production ou l’approvisionnement en ressources.

Le joueur est à la fois l’élément perturbateur, et celui sur lequel on compte pour résoudre les crises. Une guerre à l’échelle du jeu entier qui mettrait l’économie à genoux n’est pas dans son intérêt.

Les mines construites sur les astéroïdes sont une importante source de richesses
Les mines construites sur les astéroïdes sont une importante source de richesses.

Vos questions, nos réponses

Arius a pris le temps de recueillir vos questions sur le sujet. Merci à lui, et à tous ceux qui ont envoyé une question !

Comment s’y prendre pour créer une IA ? En se basant sur l’exemple d’Helium Rain, comment imaginer une IA qui arrivera à gérer tout ce qu’on souhaite faire automatiquement, et qui l’implémente correctement sans conflits ?

C’est une question très large ! Habituellement, dans le jeu vidéo, on se base sur des arbres de comportement ou behaviour trees. Il s’agit simplement de décrire une machine à états, par exemple on peut modéliser un combattant par trois états : la recherche d’une cible, le mouvement vers la cible, et le combat contre la cible. Il suffit ensuite d’associer des actions à chaque état et des transitions d’un état à l’autre.

Un exemple d'arbre de comportement pour un combattant
Un exemple d’arbre de comportement pour un combattant.

Notre approche est très différente, parce qu’on travaille sur des objectifs à long terme : transport de marchandises, achat de ressources, construction de stations… On a une approche qui consiste donc plutôt à modéliser des processus exécutés périodiquement à chaque « jour » de jeu :

  • la compagnie identifie ses besoins ;
  • elle organise l’achat, la vente et le transport de produits ;
  • elle tente de croître avec le budget dont elle dispose.

Chaque compagnie a des priorités, des préférences sur les actions qu’elle va accomplir.

Comment sont gérés les choix des compagnies non jouables pour accroître leur puissance sans atteindre une sorte de situation d’équilibre indépassable ? Comment gérez-vous l’économie pour éviter des situations de monopoles ou de domination sans changement possible ?

La diplomatie du jeu est la principale réponse aux problèmes de monopole. Les compagnies ont une attitude négative envers celles qui leur sont supérieures, les compagnies les plus importantes sont donc peu appréciées.

En outre, Helium Rain pratique le revenu universel : les compagnies les plus faibles reçoivent une subvention fournie par les plus puissantes, afin de garantir un minimum de diversité.

Comment fonctionne la modélisation économique ? Comment les agents déterminent la consommation, la construction de tel vaisseau militaire ou civil ? Suit-elle un scénario pré-établis se calquant sur la progression du joueur ? Y’a-t-il un système d’apprentissage en fonction des parties précédentes ?

Le jeu simule une population variable, dépendante de nourriture et de produits de consommation. Il y a plusieurs types de ressources dans Helium Rain : des ressources primaires extraites de sources naturelles, des ressources secondaires transformées, et des produits tertiaires que la population achète, pilotant indirectement l’ensemble de l’économie.

La progression du joueur est relativement peu prise en compte, même si c’est prévu. Il n’y a pas d’apprentissage dynamique.

Comment est calculée l’évolution des compagnies non jouables, et donc les déplacements des vaisseaux dans les secteurs où le joueur n’est pas ? Est ce que la position de ces vaisseaux est calculée plus ou moins en continu, ou est ce que lorsque le joueur arrive dans un secteur, l’évolution de celui-ci est recalculée en fonction de l’état dans lequel il était la dernière fois que le joueur est venu et du temps qui s’est écoulé ?

L’univers du jeu est séparé en plusieurs secteurs, un peu comme les niveaux d’un jeu classique. Les secteurs sont des zones de quelques kilomètres autour d’un point d’intérêt ; un seul secteur est actif à la fois. Dans le secteur actif, les vaisseaux sont modélisés précisément, mais on simule des actions tactiques et non stratégiques : les IA peuvent combattre ou patrouiller le secteur, mais elles ne font pas de commerce en temps réel. Cet aspect stratégique est simulé à chaque jour qui passe, pour tout le jeu.

On a choisi de s’organiser ainsi parce que les temps de trajet dans l’espace sont grands (plusieurs jours ou semaines), et il ne se passe donc pas grand chose à l’échelle humaine (plusieurs minutes). les actions en temps réel ont un impact sur l’aspect stratégique, mais les changements stratégiques n’apparaissent qu’au jour suivant.

L’IA est-elle capable d’adopter une stratégie lors des combats ou détruit-elle juste les vaisseaux un par un au hasard, sans véritable stratégie autre que de gagner la bataille ? De manière plus large, l’IA peut-elle adopter une stratégie sur les territoires à conquérir ?

L’IA en combat, ou plus largement en pilotage, est gérée vaisseau par vaisseau, sans organisation ou stratégie globale. Chaque pilote identifie la cible la plus pertinente pour lui, en fonction de ses armes ou de sa trajectoire, et s’y attaque. Il n’y a donc pas beaucoup de stratégie, mais une compétence tactique importante : les combattants sont assez efficaces et réactifs, au point où il a été très vite nécessaire de diminuer leurs vitesses de réaction.

L’aspect stratégique est surtout visible avant les combats, puisque les compagnies sont capables d’équiper leurs vaisseaux en fonction du type d’ennemi qu’elles s’attendent à affronter.

Comment avez-vous géré la difficulté de l’IA, la courbe de progression ? Y a-t-il plusieurs niveaux de difficulté ?

On ne propose pas de niveaux de difficulté. La progression est basée sur quelques principes simples :

  • On souhaite un jeu relativement peu exigeant (sous réserve de comprendre les mécanismes).
  • Les compagnies concurrentes commencent à un niveau de richesse bien supérieur pour assurer le démarrage correct de l’économie ainsi qu’un minimum de stabilité.
  • Les récompenses de contrats sont adaptées à la force économique et militaire du joueur.
  • C’est au joueur de se donner ses propres défis, ses propres objectifs.

On met l’accent sur la liberté d’action plus que sur une difficulté exagérée.

Comment une IA est-elle testée, vu le caractère assez large des possibilités et la grande dépendance au contexte ? Y a-t-il un équivalent des tests unitaires (ou du moins, automatisés) pour les IA, histoire de s’assurer qu’elles vont se comporter comme on veut ?

On ne fait pas de tests unitaires, ce qui n’est probablement pas une bonne idée. Ce qu’on fait, c’est du test à long terme, dans un mode accéléré du jeu où le joueur est inactif, laissant les IA se développer seules. Après 10 ans, 20 ans du temps dans le jeu, soit de nombreuses heures en jeu réel, on fait un diagnostic de l’état de l’univers pour déterminer si les choses se passent normalement ou non.

Exemple de situation non désirée : tout le monde en guerre avec un joueur inactif
Exemple de situation non désirée : tout le monde en guerre avec un joueur inactif.

On essaye aussi de jouer régulièrement pour s’assurer par nous-mêmes que les comportements sont corrects.

Comment sont calculées les trajectoires ? Est-ce que le pilote automatique doit gérer les mêmes contraintes que le joueur quand il manipule la navette ? Est-ce que le pilote automatique peut échouer à docker un vaisseau ? Vous êtes vous inspirés de ce qui existe dans l’aéronautique ?

Le pilote automatique a exactement les mêmes contrôles que le joueur ! Il ne triche donc jamais. Tout ce qu’un pilote automatique fait est aussi faisable par un excellent pilote humain. Les compétences du pilote automatique sont assez extrêmes, pour preuve, cette démonstration d’évitement de collision, dans laquelle tous les vaisseaux tentent de rejoindre le même point dans l’espace.

En fait, le pilote automatique est tellement fiable qu’on le propose aussi au joueur, sous la forme d’assistances ponctuelles. Le joueur se docke typiquement à des stations de façon automatique, y compris dans les pires conditions, comme une station percutée par un objet et qui tournerait sur elle-même - ce n’est pas une difficulté, du moment que les moteurs suivent. C’est aussi possible manuellement pour les plus pressés d’entre vous.

On propose également une option d’évitement de collision, dans laquelle le vaisseau prend automatiquement les commandes en cas de danger pour empêcher l’impact. Ce système est permanent, mais activé uniquement sur demande ; quand il est éteint, il se contente d’alarmer le joueur sur le danger sans prendre de mesures.

Quid de l’énergie ? Quels calculs ont été effectués pour assurer ce réalisme ? Quelle autonomie pour les vaisseaux ? Quel(s) mode(s) de propulsion ?

On part typiquement de la masse des vaisseaux, qu’on estime en fonction du volume, et on en déduit des forces de moteur pour garantir un gameplay pertinent. Personne ne veut piloter un chasseur qui met une minute à se retourner ! L’énergie des tirs est régie par l’énergie cinétique, puisque nous utilisons des projectiles classiques : des obus. On simule également l’échauffement des pièces en fonction de l’énergie produite et dissipée. Ces éléments sont relativement réalistes.

On a revanché supprimé très tôt la notion de carburant, essentiellement parce qu’elle n’apportait que des problèmes au gameplay et pas vraiment de défis intéressants. Comment rendre le ravitaillement fiable, rapide, accessible, sans rendre le mécanisme inutile ? On a préféré s’en passer.

C’est un sujet de discussion récurrent : il faut souvent choisir, ou du moins arbitrer, entre un réalisme plus poussé et un jeu intéressant.


Pour rappel, on est toujours prêts à répondre à vos questions sur le sujet dédié au projet. On tient également notre site Web à jour, autant que possible. On n’a pas encore de date de sortie ferme pour le jeu, mais on s’organise pour une publication au troisième trimestre 2017.

Le code source du jeu est entièrement disponible sur GitHub, pour les plus motivés d’entre vous qui souhaiteraient en apprendre plus. En particulier, les sources liées à l’intelligence stratégique des compagnies sont ici, tandis que l’IA de pilotage est ici.

Merci pour votre lecture !

13 commentaires

Merci pour cet article très intéressant !

Et bonne chance pour la suite du développement, je suis impatient de pouvoir y jouer. :)

+13 -0

J’ai été intrigué par :

L’énergie des tirs est régie par l’énergie cinétique, puisque nous utilisons des projectiles classiques : des obus. On simule également l’échauffement des pièces en fonction de l’énergie produite et dissipée. Ces éléments sont relativement réalistes.

Ça veut dire qu’il y a un effet d’action-reaction quand on tire un obus ?

Lors de l’échauffement des pièces, la dissipation se fait comment ? Elle dépend de la zone où on est (selon qu’il y ait un nuage de gaz pour récupérer la chaleur) ou non ?

J’ai été intrigué par :

L’énergie des tirs est régie par l’énergie cinétique, puisque nous utilisons des projectiles classiques : des obus. On simule également l’échauffement des pièces en fonction de l’énergie produite et dissipée. Ces éléments sont relativement réalistes.

Ça veut dire qu’il y a un effet d’action-reaction quand on tire un obus ?

Holosmos

Oui et non : on l’a pour la cible, avec une action physique qui va induire un mouvement à l’impact ; mais quand des vaisseaux de taille équivalente se tirent dessus, cet effet est mineur devant les forces des moteurs. Du coup, l’effet physique se voit surtout quand un chasseur est touché par un tir de gros calibre d’un destroyer, et on ne simule même pas la force côté tireur - non sans avoir confirmé que dans la vraie vie, et contrairement à une légende urbaine, le canon d’un A-10 ne ralentit pas significativement l’avion.

Ce que voulait dire ce paragraphe, c’était surtout qu’on utilise l’énergie cinétique comme métrique de dégâts. Un tir oblique cause donc moins de dégâts qu’un impact perpendiculaire, et la vitesse relative du tireur a des conséquences directes sur l’efficacité du tir - une passe à 500m/s cause considérablement plus de dégâts qu’une attaque dans le dos sur un ennemi fuyard.

1
float ShellEnergy = 0.5f * ShellMass * ImpactVelocity.SizeSquared() / 1000; // Damage in KJ

Lors de l’échauffement des pièces, la dissipation se fait comment ? Elle dépend de la zone où on est (selon qu’il y ait un nuage de gaz pour récupérer la chaleur) ou non ?

Holosmos

La dissipation se fait uniquement par radiation, comme sur l’ISS de nos jours. On simule des composants de type "radiateur", qui extraient de la chaleur du vaisseau (et peuvent être détruits, conduisant à un échauffement destructeur). Sur le vaisseau ci-dessous, les radiateurs sont visibles tout en haut, au dessus des moteurs du RCS, en rouge foncé.

Exemple d’échauffement extrême de certaines pièces

Hey there ! :)

Merci pour cet article fort sympathique, qui m’a particulièrement intéressé étant donné que je suis moi même en réflexion pour l’élaboration d’une IA pour un jeu en développement (sans concurrence à Helium Rain ^^)

Mais je suis resté un peu sur ma faim…

Dans mes recherches sur les IA, j’avais bien entendu parlé des Behavior Trees, tu en parle toi aussi, et tu conclut en disant :

Notre approche est très différente, parce qu’on travaille sur des objectifs à long terme : transport de marchandises, achat de ressources, construction de stations… On a une approche qui consiste donc plutôt à modéliser des processus exécutés périodiquement à chaque « jour » de jeu :

  • la compagnie identifie ses besoins ;
  • elle organise l’achat, la vente et le transport de produits ;
  • elle tente de croître avec le budget dont elle dispose.

Je suis vraiment curieux de savoir comment vous avez géré la chose, car j’ai sensiblement les mêmes besoins: objectifs à long terme, choix stratégique de production de ressource, attaque d’un autre joueur, lancement de recherches…

Je suis allé fouiller dans le code source, mais j’avoue que c’est pas évident :D

Je ne sais pas trop ce que j’attends, mais est-ce que tu pourrais en dire un peu plus que :

On a une approche qui consiste donc plutôt à modéliser des processus exécutés périodiquement à chaque « jour » de jeu 

Dans les questions que je me pose, c’est comment votre IA fait pour choisir entre telle ou telle possibilité ? Comment vous faites donner à votre IA une vision à moyen/long terme ?

Merci :)

Dans les questions que je me pose, c’est comment votre IA fait pour choisir entre telle ou telle possibilité ? Comment vous faites donner à votre IA une vision à moyen/long terme ?

Merci :)

Shellbash

Le processus est relativement simple en fait. Regarde cette méthode FlareAIBehavior::SimulateGeneralBehavior, tu as la structure globale de l’IA d’une compagnie à chaque jour qui s’écoule. D’abord on fait fuir, en priorité, les cargos en danger, puis on met à jour le commerce, puis les réparations, avant de gérer le budget - et on termine par le combat. La gestion de priorités se limite à ça. Tu peux regarder le détail du budget ici, il y a un mécanisme de priorité dynamique en fonction de l’attitude de la compagnie.

La vision à long terme est très limitée, par design : essentiellement, à chaque jour, la compagnie travaille sur tous les aspects, avec une priorité sur les ressources, le budget, les vaisseaux disponibles. C’est le seul mécanisme de choix, en fait : faire tout ce qu’on peut faire, dans un ordre de passage.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte