Nouvel article questionnant les différents procédés de narration procédurale ; cette fois, on va s’intéresser un peu plus attentivement à la méthode combinatoire, et essayer de déterminer ensemble comment on peut l’utiliser de façon intelligente au lieu d’un simple mixe de variables sans valeur ajoutée.

Z’êtes prêts ? En avant Rantanplan.

Au menu :

  1. Qu’est-ce que la méthode combinatoire ?
  2. Les écueils de la méthode combinatoire
  3. Méthode combinatoire & content spinning
  4. Exemple applicatif de la méthode combinatoire linéaire
  5. Méthode combinatoire à permutations
  6. Contexte d’utilisation

Qu’est-ce que la méthode combinatoire ?

J’avais déjà abordé de façon succincte la méthode combinatoire au sein de la narration procédurale dans un précédent article. Pour rappel, la méthode combinatoire repose sur un principe de textes à trous que l’on complète avec différentes variables. Pour vous donner un exemple concret, reprenons celui (ô combien célèbre) de Skyrim :

Salutations [race], [phrase random prononcée par le garde].

“Salutations Dunmer, tu sais, moi dans le temps, j’étais un aventurier comme toi, jusqu’au jour où je me suis pris une flèche dans le genou.”

Ceux qui ont joué à Skyrim SAVENT. Bref, on remarque ici un texte à trous que viennent compléter deux variables : la première relative à la race du joueur, la seconde est une phrase piochée au hasard par le jeu pour meubler la conversation du garde.

Bien sûr, on pourrait aller plus loin et proposer davantage de variables, ce n’est pas interdit :

[bonjour] [race], [météo], [phrase random].

Salut Khajit, il fait froid dis donc, bon, c’est pas tout mais je dois finir mon tour de garde.”

Quelque soit le nombre de variables employées, les effets demeurent identiques :

  1. Les PNJ s’adaptent au contexte du joueur.
  2. Les PNJ s’adaptent aux variables et paramètres du jeu.

L’avantage principal étant d’introduire de la variété dans les réactions des PNJ et donc de simuler une certaine dynamique dans un écosystème normalement figé. C’est toujours mieux que d’avoir un type qui répète en boucle “Hey salut, comment ça va ?“.

Les écueils de la méthode combinatoire

Je vous renvoie une fois encore à la conférence donnée par FibreTigre au Game Camp France, où notre vieux briscard pointe avec intelligence les principaux écueils de la méthode combinatoire telle qu’utilisée aujourd’hui (l’italique n’est pas là pour faire joli, on va revenir sur ce point très vite) :

  1. La récurrence des variables : si la bibliothèque de variables est faible, les quelques variables disponibles vont circuler en boucle dans la bouche des PNJ. On va donc obtenir un effet inverse à celui escompté : plutôt que de générer de la variété, les PNJ recyclent ad nauseam les mêmes bouts de phrase jusqu’à rendre fou le malheureux joueur (cf. la flèche dans le genou).
  2. La faiblesse de l’information transmise : effectivement, parler météo ou flèche dans le genou n’est pas très passionnant. De plus, le joueur sait déjà qu’il pleut ou que son personnage est un Elfe Noir. Au final, on se retrouve avec des PNJ maniant avec brio la fonction phatique du langage.

Que penser de tout ça ? De toute évidence, FibreTigre a raison, du moins dans les exemples cités ci-dessus. Néanmoins, ce n’est pas la méthode combinatoire qui pose problème : c’est la façon dont elle est employée. Evidemment que c’est relou d’avoir un type qui ressasse trois phrases en boucle. Evidemment qu’on s’en cale éperdument de la météo. Les solutions pour y remédier sont cependant là, sous nos yeux : d’abord par l’utilisation de plusieurs paquets de variables mélangées de façon aléatoire, puis par l’utilisation de ces variables au sein de textes à trou apportant une valeur ajoutée au joueur et au storyworld. On pourrait même aller plus loin via de la quête procédurale, mais je vais éviter de m’emballer, on abordera ça dans un autre billet.

J’en profite pour ajouter un petit disclaimer : ce dont on va causer ci-dessous est très théorique, et n’est pas forcément réalisable à 100% dans la production d’un jeu vidéo d’aujourd’hui, aussi bien au niveau du coût que des moyens (en particulier s’il faut faire parler les PNJ de vive voix avec nos technos actuelles, quoique, ça se discute). Je reste néanmoins persuadé qu’il s’agit d’une excellente alternative au tout procédural et que l’on se dirige plus ou moins dans cette direction au fil des années à venir.

 

Méthode combinatoire & content spinning

Le postulat de base est le suivant : plutôt que d’utiliser deux ou trois variables au sein d’une phrase, nous allons faire varier tous les mots au sein d’une même phrase. Ouais, rien que ça.

Je vois déjà vos petits yeux s’arrondir de stupeur : “ce type délire complètement, c’est impossible de faire ça, en plus ça doit prendre 3 plombes, c’est imbitable“.

C’est pourtant ce que produisent certaines personnes lorsqu’ils font du content spinning. Dans le web, le content spinning est une technique permettant de générer, à partir d’une matrice initiale, une pluralité de textes différents traitant d’un même sujet. Ces textes seront ensuite publiés sur tout un tas de sites satellites, lesquels feront un joli lien à valeur ajouté vers le site principal.

Bref, je ne vais pas vous barber avec tout un tas de théories SEO (surtout que je m’étais promis de ne pas parler de mon ancien boulot ici), mais lorsque l’on fait du content spinning correctement, on est censé faire varier chaque mot d’une phrase, et pas avec des synonymes, oh que non, avec des mots aux sens différents. Les trucs genre Salut|Salutations|Bonjour sont donc absolument proscris sous peine de créer des textes à fort taux de similarité (et donc de se faire taper sur les doigts par Google). Nan, il faut vraiment se sortir les doigts du cul et introduire des variations telles que Bonjour|Ne bougez plus|Halte là|Stoppez tout|Bienvenue, pour chaque mot, pour chaque phrase du texte.

Concrètement, ça ressemble à ça (oui, j’utilise des synonymes, inutile de me faire la remarque) :

{Bonjour|Salut|Bien le bonjour|Hello} {jeune homme|monsieur|mon brave|mon jeune ami}{,| } {comment allez-vous|comment vous sentez-vous|est-ce que ça va|est-ce que tout va bien} {aujourd’hui|en cette fabuleuse journée|par cette belle journée|ce matin} ?

Ce qui génère ce type de phrases, une fois le texte passé à la moulinette :

Bonjour mon brave, comment allez-vous en cette fabuleuse journée ?

Salut mon jeune ami, comment vous sentez-vous ce matin ?

Bien le bonjour monsieur, est-ce que tout va bien aujourd’hui ?

Vous remarquerez que tous les mots sont variés, y compris (c’est possible si l’on est retord) la ponctuation, le but du jeu étant d’éviter les orphelins (un mot tout seul) pour, encore une fois, ne pas faire grimper le taux de similarité.

Oui, ça prend la tête. Non, un texte ne se rédige pas en 10 minutes. Néanmoins, pour quelqu’un qui a l’habitude et qui est expérimenté, il faut compter environ 4H pour un texte de 300 mots minimum. Ce n’est pas non plus la fin du monde.

Vous voyez où je veux en venir, on pourrait très bien adapter le principe du content spinning au contenu textuel d’un jeu vidéo au sein d’une nouvelle méthode combinatoire, que j’ai baptisé méthode combinatoire linéaire, oui, j’ose. Pourquoi linéaire ? Parce que l’on fait varier un à un tous les mots d’une même phrase dans un axe donné (gauche à droite) mais l’on pourrait aller plus loin encore – j’y reviens très vite.

Contrairement à ce que l’on pourrait croire, ce n’est pas aussi lourdingue que ça :

  1. Ce n’est pas des textes de 300 mots que l’on doit rédiger à chaque fois, simplement des bouts de phrases.
  2. On est pas emmerdé par la question de la similarité.
  3. Donc on peut utiliser des synonymes.
  4. Ce qui nous permet d’aller finalement assez vite !

Si l’on a malgré tout peur des coûts supplémentaires engendrés par les besoins d’une telle technique, on peut réserver cette nouvelle méthode combinatoire aux PNJ secondaires. Assassin’s Creed l’a très bien fait dans Odyssey par exemple avec ses quêtes aléatoires (on remarquera que dans cet exemple, les dialogues apparaissent souvent décousus, le procédé combinatoire combinant des phrases et non pas des mots).

De toute manière, je pense qu’il est préférable de conserver une écriture statique (et bien fignolée) pour la trame principale, c’est bien mieux comme ça.

Exemple applicatif de la méthode combinatoire linéaire

Je suis en train de “développer” (c’est un bien grand mot puisque je ne code pas réellement) sous Twine un jeu à mi-chemin entre le roman et un Livre dont vous êtes le héros joliment appelé “Konarr le Barbare“. Le principe : laisser le joueur se forger ses propres aventures en faisant des choix (limités à 2, comme un Reigns, oui) à intervalles réguliers. Là où c’est intéressant, c’est que j’ai utilisé le principe du content spinning pour renouveler constamment le contenu texte. Il est donc impossible que le joueur se retrouve deux fois avec la même chose. Il y a des milliards de combinaisons possibles (voire à terme plus que le nombre d’atomes dans l’Univers observable, oui je sais, ça fait rêver).

Voici à quoi ça ressemble (merci à la macro either: dans Twine, sans qui tout cela aurait été chiant au possible à mettre en place). D’abord l’appel aux différents contenus spinnés :

Exemple de texte avec méthode combinatoire linéaire - narrative design

Puis un exemple de texte spinné :

Exemple de texte combinatoire linéaire - narrative design

Contrairement à ce que l’on pourrait croire, je n’ai pas passé une semaine sur le texte ci-dessus, mais 20 minutes. Comme quoi, c’est possible pour peut qu’on s’en donne les moyens. Au final, quand on “joue”, voici ce qu’il se passe. Je vous ai mis plusieurs exemples :

 

Konarr gifla un type dont la tête ne lui revenait pas : “Par Crom ! T’es un sacré merdeux, sale face de cul !” Rugit-il son visage contre celui de l’autre. Le glorieux barbare cassa la main droite du chien galeux en éclatant de rire. “Youhou, une bonne bagarre !” Claironnèrent certains habitants tandis que d’autres s’enfuirent de la taverne. Tout le monde se bastonna pendant que Konarr faisait des pompes. La mêlée prit fin peu après l’intervention de la garde.
 Konarr s’avança vers un homme qui buvait tranquillement sa bière : “Par tous les dieux ! T’es qu’un soudard mal embouché !” S’égosilla-t-il en agitant son poing. Le glorieux barbare gifla avec violence le pisse-menu en riant aux éclats. “Nom de dieu !” Dirent certains habitants en balançant des tabourets. On se donna des coups et la taverne se transforma en champ de bataille. La mêlée se termina après le départ du barbare.
Notre héros souleva par le col l’un des serviteurs de la taverne : “Parbleu ! T’es un froussard, tu me fais vomir !” S’exclama-t-il tout de go. Notre fier héros brisa la mâchoire du forband en l’injuriant copieusement. “Par tous les dieux !” Dirent plusieurs types patibulaires en fracassant leur tabouret sur la tête de leur voisin. Les uns et les autres se frappèrent de leurs poings dans un chaos indescriptible. La baston fut terminée quand Konarr décréta que c’était terminé.
Notre héros courut vers l’un des serviteurs de la taverne : “Dindonneau ! T’es qu’un foutu gougnafier vicieux !” S’époumona-t-il le visage rouge de colère. Le glorieux barbare décocha un coup dans la mâchoire du sacripan avec un clin d’oeil. “Ça va saigner !” Braillèrent plusieurs villageois en fracassant leur tabouret sur la tête de leur voisin. On s’engagea dans une bataille furieuse tandis que le personnel de la taverne essayait de mettre fin au chaos. La bataille se termina quand tout le monde fut à demi assommé.
 Konarr marcha vers un marchand qui comptait son argent : “Nom d’une catin ! T’es qu’un fichu scélérat de fils à sa maman !” Beugla-t-il en regardant aux alentours. Konarr rompit les os du bras du pauvre homme avec la célérité de l’éclair. “Ça va saigner !” Hurlèrent plusieurs habitants en balançant des tabourets. Les uns et les autres se frappèrent de leurs poings pendant que Konarr faisait des pompes. La bagarre fut terminée quand tout le monde fut à demi assommé.

 

Je ne prétends pas proposer quelque chose de révolutionnaire, mais vous admettrez que la méthode combinatoire que je viens de vous décrire va beaucoup plus loin qu’une simple alternance de variables déclinées sous forme de phrases. En tout cas, l’effet de dynamique est bien présent : le joueur n’a pas l’impression d’entendre 36 fois la même chose, même si la situation initiale reste plus ou moins identique.

Méthode combinatoire à permutations

Je vous disais tout à l’heure que l’on peut aller plus loin avec la méthode que je vous ai décrite. En effet, en plus de faire varier chaque mot d’une phrase dans un même axe, on peut également introduire des permutations ou des ajouts facultatifs pour introduire davantage de variété. Là, je vous l’avoue, c’est théorique et ça devient complexe : je n’ai pas mis ça en place dans l’exemple que je vous ai donné. Pourtant, ça existe dans le content spinning. Voyons voir ce que ça donne.

Commençons par les ajouts facultatifs, et prenons la phrase suivante, vous allez comprendre de suite :

[bonjour] [race] [quête]

Ce qui peut donner par exemple :

Bonjour Argonien, j’ai perdu mon pantalon, pourrais-tu m’aider à le retrouver ?

Un ajout facultatif (et aléatoire) pourrait se glisser dans cette phrase sous cette forme :

[remarque random] [bonjour] [race] [quête]

Bon sang, où ais-je pu le ranger ?… Ah tiens, salut Argonien, j’ai hélas perdu mon pantalon, serait-il possible de m’aider à le trouver ?

Ou encore :

[remarque random] [bonjour] [race] [quête] [récompense]

Fichtre, qu’est-ce que j’en ai fais… Oh, mes salutations Argonien, j’ai malheureusement égaré mon pantalon, pourrais-tu m’aider à le retrouver ? Je suis prêt à te payer 50 drakes.

Vous l’aurez compris, il s’agit d’introduire des portions de phrases à combinatoire linéaire au sein de phrases elles-mêmes à combinatoire linéaire. Comme je vous le disais, on gagne en complexité. Mais on peut faire mieux (ou pire, ça dépend comment on voit les choses). Reprenons le dernier exemple :

[remarque random] [bonjour] [race] [quête] [récompense]

On pourrait s’amuser à créer des permutations comme ceci :

[bonjour] [race] [récompense] [quête]

Bien le bonjour Argonien, pour 50 drakesaide-moi à retrouver mon pantalon que j’ai égaré.

Ou comme ça :

[remarque random] [bonjour] [quête] [récompense] [race]

Diable, où est-il passé… Oh, mes salutations. J’ai égaré mon vieux pantalon, pourrais-tu m’aider à le retrouver ? Je peux te payer 50 drakes Argonien.

Ça prend la tête, n’est-ce pas ? Surtout qu’en ce qui nous concerne, ce n’est pas vraiment utile d’aller aussi loin. Autant l’introduction de permutation dans un contexte de rédaction pour le web fait sens (rappelez-vous, la question du taux de similarité des textes), autant pour le jeu vidéo, on s’en fout un peu, on peut très bien se contenter d’une combinaison dite linéaire.

Contexte d’utilisation

De toute évidence, le support le plus pratique pour déployer une telle méthode de combinaison reste l’écrit, c’est-à-dire des interactions avec le jeu / le storyworld / les PNJ qui se limitent à des bulles de texte sans aucune vocalisation des paroles.

Néanmoins, au vu des progrès accomplis par les vocalisateurs, il n’est pas interdit de penser que d’ici quelques années, ce procédé sera en outre facilement déclinable à l’oral, et donc de papoter avec des PNJ en ayant l’impression d’avoir une conversation unique et originale.

Le plus sympa avec la méthode combinatoire, c’est qu’il serait éventuellement possible de la décliner avec des quêtes, et donc d’implanter un système de génération de quêtes au déroulement aléatoire. Ce serait plutôt cool, hein ? Mais ne vous emballez pas, je garde ça sous le coude pour un prochain billet, où je vais essayer de vous décrire le système et la méthodologie pour créer ce genre de trucs. D’ici là, vous pouvez commencer à en baver d’avance.