LoLTracker

 

/tech : offrir un contexte aux champions

xayahrakanheader
 
Avec sa série /tech, Riot donne des détails sur la partie technique du jeu. Et ici, nous en avons notamment sur les interactions spéciales entre champions...
 
/tech : offrir un contexte aux champions
 
/tech est une nouvelle série sur le Nexus qui s'intéresse à la technologie utilisée dans League of Legends. Si vous aimez cette histoire, jetez un œil au blog des ingénieurs de Riot Games (en anglais) pour découvrir d'autres articles détaillés sur les systèmes qui alimentent le jeu.
 
Salut les amis, ici AaronMike et Lucida ! Nous sommes ingénieurs logiciel dans l'équipe dédiée au gameplay central de League of Legends, et nous souhaiterions vous parler des Composants d'Action Contextuelle (CAC en abrégé), qui ajoutent de la richesse à la personnalité de nos champions. Il s'agit d'un système qui permet aux développeurs de créer des interactions personnalisées entre les champions, afin qu'ils réagissent plus naturellement à ce qui se passe dans la Faille.
 
Explorer le système
 
Commençons par voir un exemple de ce qui arrive quand Poppy lance une provocation, soit quand elle est seule, soit quand elle est à côté de son allié aux ailes dorées, Galio :
 
 
Provocation de Poppy sans Galio / Poppy lance une provocation devant Galio
 
Quand Poppy lance une provocation seule ou près de champions avec lesquels elle n'est pas associée, la réplique de cette provocation sera l'une de ses phrases génériques. Quand Poppy se tient près de son allié Galio, elle plaisantera, et Galio lui répondra s'il se trouve encore près d'elle à la fin de sa réplique. Cela peut sembler évident, mais quand LoL a été lancé en 2010, ce type d'interaction était impossible. Le seul moyen de créer une interaction était de laisser le moteur audio choisir aléatoirement une réplique à partir d'une liste. Cela obligeait les designers sonores à utiliser des phrases passe-partout pour éviter qu'une réplique incongrue ne se fasse entendre lors de certaines situations.
 
 
Par exemple, la réplique de Lux « Une petite rivalité familiale ? Ça promet d'être amusant ! » est logique quand elle se tient aux côtés de Garen. Mais si elle se trouve à côté de Katarina ? Ça l'est beaucoup moins. Une telle réplique n'aurait pas été acceptée dans l'ancien système audio de League of Legends, car celui-ci n'avait pas la possibilité de la choisir à bon escient. Nous perdions de précieuses opportunités de montrer la personnalité de chaque personnage et leur relation avec les autres champions !
 
Et le système CAC a été créé exprès pour ça. Il est au cœur de ce type d'interactions ; c'est ce qui fait que Poppy et Lux sont « conscientes contextuellement » d'informations en temps réel telles que leur allié le plus proche, quel objet elles ont acheté ou quel champion elles viennent d'éliminer. Il donne aussi à Caitlyn Pulsefire sa réplique unique lors d'un quintuplé et permet à Xayah et Rakan de s'échanger des mots doux sur la Faille.
 
Sous le capot
 
Le système CAC a été créé dans un but simple : exécuter différentes actions suivant le contexte de n'importe quelle situation dans le jeu. La structure du système peut être représentée ainsi :
 
  • - Situation
    • - Règle 1
      • - Conditions
      • - Action
    • - Règle 2
      • - Conditions
      • - Action
    • - Autres règles
 
Une situation est une construction prédéfinie dans notre jeu, du type KillChampion, AttackBuilding ou BuyItem. Au cours de ces deux dernières années, nous avons créé des dizaines de situations dans League of Legends. Chaque situation peut intégrer une liste de règles, contenant à leur tour une série de conditions et une action particulière. Quand une situation se produit, une règle dont les conditions sont remplies est choisie, puis son action est exécutée. Une égalité entre plusieurs règles valides sera résolue sur la base du premier arrivé-premier servi, ou aléatoirement si spécifié. Les conditions sont des contextes prédéfinis, tels que « niveau de ses propres PV », « nom du champion ciblé », « région de la carte », « niveau de sort », etc. Pour chaque action parlée, une réplique est choisie en fonction de l'auditeur (soi-même, les alliés, les ennemis ou les spectateurs).
 
Ci-dessous vous trouverez un exemple de Camille avec le skin Programme Camille provoquant Ashe avec le skin PROJET : Ashe :
 
 
Comme pour la majorité du code de base de League of Legends, ce système est rédigé en C++ et utilise notre serveur de données de jeu (Game Data Server, ou GDS) pour sa configuration. Regardez cet extrait de code appelé à chaque fois qu'un champion en tue un autre :
 
 
Cet extrait illustre la façon dont le système détermine quelle action doit être prise en fonction du contexte. La fonction PickRule repassera chacune des règles pour la situation KillChampion jusqu'à trouver la règle qui remplit toutes les conditions, puis exécutera la ou les actions correspondantes.
 
Écriture
 
Les captures d'écran suivantes montrent une règle que nous avons instaurée pour tout joueur assez talentueux (ou chanceux) pour réussir un quintuplé avec Caitlyn Pulsefire :
 
 
Chaque fois que Caitlyn Pulsefire élimine un champion ennemi, le système CAC passe en revue les règles de la situation KillChampion. Cette règle dit : en cas de cinquième élimination d'une série meurtrière, jouer la réplique KillChampion3DPentakill pour soi (le joueur) et les joueurs ennemis. Remarquez que cette règle a une limite de 3 « occurences » (note : je dois corriger la faute d'orthographe). Elle ne se fera donc entendre que pour les trois premiers quintuplés réussis, pour ne pas casser les oreilles des joueurs.
 
Victoires
 
Historiquement, les effets sonores étaient déclenchés directement par les événements dans différents systèmes du jeu. Ces événements pouvaient être la création de particules, des événements d'animation, le lancer de sorts, une entrée utilisateur, etc. Par exemple, quand le joueur déplace son champion, le client du jeu construit un événement audio dont le nom ressemble à « Champion_VO_MoveCommand » et tente de déclencher le clip audio correspondant. N'étant pas conscients du contexte du jeu, les déclencheurs historiques étaient incapables de personnaliser les interactions.
 
Les événements directs ne faisaient qu'effleurer la surface de ce dont est capable le système CAC. La combinaison de situations et de règles permet d'écrire des interactions très pointues. Avant ce système, nous avions des interactions spécialisées dans le jeu, mais nous nous reposions sur le hasard pour les appliquer à un rythme approprié. Par exemple, Zac a deux répliques de provocation génériques, « Soyez forts ou soyez morts » et « Vous faites de la muscu, mais savez-vous faire ça ? » Quand il lance une provocation, le jeu choisit au hasard l'une des deux phrases. Désormais, nous avons des leviers pour les peaufiner uniquement dans le cas de situations appropriées. De cette façon, nous provoquons à dessein des interactions uniques et précises plutôt que de laisser faire le hasard.
 
Xayah et Rakan
 
En début 2016, nous avons décidé de créer notre premier couple de champions de l'univers de League of Legends. Notre but était que ces deux champions interagissent dans le jeu comme les amants qu'ils sont, plutôt que de faire appel à des interactions génériques et interchangeables. Et si Rakan pouvait soulever Xayah dans les airs pendant un pas de danse ? Et si Xayah pouvait taquiner Rakan d'une petite blague (affectueuse) ? Et si Rakan avait besoin d'avertir Xayah d'un danger imminent ?
 
Pour rendre toutes ces situations possibles, nous avions besoin d'enrichir le système CAC de quelques nouvelles actions et situations.
 
 
Xayah et Rakan
 
Animation
 
Le système d'animation n'était pas équipé d'une partie du contexte requis par les animateurs pour créer la danse synchronisée désirée ou des parties du rappel. Pour atteindre ce résultat final, nous avons ajouté un nouveau type d'action au système pour contrôler les animations de champions. Chaque fois que Xayah fait quelque chose (ou quand elle ne fait rien), elle envoie une requête PlayAnimation avec le nom de l'animation souhaitée auprès du système d'animation. Nous avons modifié ce flux pour que le système CAC intercepte ces requêtes et vérifie si des conditions contextuelles sont remplies. Si c'est le cas, l'animation est échangée contre une autre plus en phase avec le contexte. La requête est ensuite renvoyée vers le système d'animation pour qu'il prenne le relais.
 
CACs interactifs
 
Le défi suivant était la danse. Comment Xayah et Rakan peuvent-ils indiquer l'un à l'autre qu'ils veulent commencer à danser ensemble ? Nous y sommes arrivés en ajoutant une nouvelle situation, qui se déclenche à chaque fois qu'un autre champion accomplit une action CAC. Tous les CACs du jeu sont avertis de l'action accomplie et du contexte actuel du jeu pour pouvoir déterminer l'opportunité d'une réaction.
 
 
De gauche à droite : les deux sont inactifs, Xayah commence à danser seule, Rakan lui emboîte le pas et ils exécutent leur danse synchronisée.
 
Signaux contextuels
 
Une autre victoire formidable a été le reroutage des requêtes de signaux par le système CAC. Désormais, en plus des signaux normaux, les amoureux peuvent s'échanger des répliques telles que « Chéri, attention ! » pour le signal Danger et « Ils ne sont pas là ! » pour le signal Ennemi disparu.
 
Problèmes techniques
 
Anti-triche
 
La triche et le piratage sont des problèmes cruciaux à chaque fois que nous ajoutons des systèmes tels que le système CAC à League of Legends. Une forme de piratage implique de glaner plus d'informations que le jeu en offre aux joueurs pour gagner un avantage compétitif. Un tricheur pourrait exploiter le système contextuel pour obtenir ces informations. Imaginez qu'Elise déclenche une réplique telle que « Mes sens d'araignée sont en alerte... » à chaque fois que votre équipe est cachée à proximité dans les herbes hautes... Pour empêcher ce type de triche, le système CAC a été conçu pour ne réagir qu'aux informations déjà dans le client, et rien de plus (en d'autres mots, il voit ce que vous voyez).
 
Performances
 
Nous voulons donner aux développeurs la liberté et la facilité d'usage dont ils ont besoin pour faire vivre les personnages de LoL, mais nous souhaitons aussi éviter que cela affecte la performance chez les joueurs, qu'ils jouent sur un monstre refroidi à l'azote liquide ou sur un portable d'entrée de gamme. Notre but a toujours été de créer un système aussi léger et performant que possible à chaque étape du processus. Une combinaison de choix de codage et de pratiques exemplaires nous permet d'atteindre les objectifs suivants :
 
  1. Les situations sont stockées dans une table de hachage, avec une valeur de hachage qui sert de clé. Grâce à cette structure, nous pouvons récupérer rapidement une situation à partir d'un objet du système CAC. Si un champion n'a pas de données pour une situation précise, rien n'est déclenché. Comme chaque champion a un petit ensemble de situations idoines, la plupart d'entre elles ont un très faible coût.
  2. Nous préférons les situations spécifiques à celles qui sont générales. En temps normal, nous préférerions avoir des solutions générales et réutilisables qui résolvent plusieurs problèmes à la fois, mais ce cas est unique. Les situations plus générales contiennent plus de règles, qui pour chacune incluent d'autres conditions devant être traitées par le processeur central. Diviser une situation générale en plusieurs situations spécifiques réduit le nombre de règles et améliore la performance. Les situations sans règle peuvent même être retournées directement. Par exemple, nous avons quatre situations spécifiques d'élimination : KillChampion, KillTurret, KillNeutralMinion et KillWard. KillChampion propose souvent le plus de variations, mais ne survient que quelques fois dans le jeu. KillNeutralMinion propose le plus petit nombre de variations, mais se produit plus souvent. Si nous utilisions une situation générale telle que KillTarget pour toutes nos éliminations, nous devrions parcourir une énorme liste de règles chaque fois que ces quatre types de cibles sont tuées.
  3. Nous préférons vérifier d'abord des faits ou conditions simples, mais importants. Si l'une de ces conditions n'est pas remplie, les autres vérifications complexes du processus peuvent être évitées.
    1. Nous passerons les situations audio si le locuteur est déjà en train d'énoncer une réplique. League of Legends ne permet pas à un même personnage de prononcer plusieurs phrases en même temps. Cela nous offre une formidable possibilité d'optimisation. Si le système CAC découvre que le personnage parle, elle peut ignorer les nouvelles situations audio. En cas de spam d'emotes, le système CAC reste très efficace car il saute la plupart du processus une fois que le champion commence à parler.
    2. Une autre condition importante est le délai de récupération d'une situation. Si le champion ne doit pas répondre à une situation peu de temps après la dernière action, alors il n'existe aucune raison de lancer la situation.
  4. Les situations à forte fréquence sont évitées si possible. Si une situation se produit fréquemment, il existe certaines manières d'éviter un impact de performance :
    1. Fixer un délai de récupération pour la situation afin que le client du jeu puisse éviter la vérification à chaque fois que la situation se produit.
    2. S'assurer que les situations à forte fréquence possèdent peu de règles, afin de s'exécuter plus vite.
 
Conclusion
 
Avec le système CAC, l'audio et l'animation sont davantage conscients du contexte dans le jeu, ce qui ouvre de nombreuses possibilités à nos collègues créatifs. Ils peuvent ainsi enrichir la personnalité des champions et continuer d'étendre le monde de League of Legends. Chacune des répliques que nous ajoutons au jeu représente une opportunité de faire sourire quelqu'un et de rapprocher les joueurs de leurs champions préférés.
 
 
Présentation de runes : Stormlord's Mandate et Spe...
Mise à jour sur le PBE (02/08)
 
You must login to post a comment.
People in conversation:
Loading comment... The comment will be refreshed after 00:00.
  • This commment is unpublished.
    Ecthelion
    • Tipeur
    · 6 years ago
    Mauvais exemple pour Lux, Kata et la rivalité familiale. Kata est quasiment la belle sœur de lux
   facebook   Discord2   rss   logo twitter   

Derniers articles

LoLTracker ferme ses portes après plus de 10 ans de bons et loyaux services !
Thèmes abordés : Fermeture imminente du site, Project L, pause de fin d'année chez Riot, Riot mobile, et bien plus !...
Analysons les problèmes actuels de Yuumi et notre manière d'aborder sa refonte.
Une nouvelle mise à jour a eu lieu sur le PBE, apportant de l'équilibrage
C'est le dernier patch de l'année, la 12.23B est là !