Le tutoriel d’aujourd’hui porte sur une technique très générale et basique pour adapter votre histoire aux choix faits par le joueur : l’utilisation de variables, et les passages dépendant de la valeur de certaines variables. Les variables vous permettent de stocker des informations auxquelles vous pouvez accéder plus tard ; elles représentent un très bon moyen de garder une structure simple pour votre jeu tout en accommodant plus de variations (mineures comme majeures), au prix de quelques lignes de code très simples.
Qui êtes-vous ?
Imaginez que vous avez un jeu complexe, avec tout un arbre de possibilités. Sur une suggestion de votre maman, la première de vos testeuses, vous voulez ajouter la fonctionnalité suivante : le joueur peut choisir au début du jeu si il veut incarner un personnage qui s’appelle Alexis ou un autre qui s’appelle Jacqueline. Il va falloir rajouter un choix au début, en demandant si le joueur préfère s’appeler Alexis ou Jacqueline. Et après… Vous contemplez votre arbre de possibilités, et soupirez. Il va vraiment falloir dupliquer tout l’arbre pour avoir un arbre avec que du Alexis à gauche et un autre avec que du Jacqueline à droite ?
Bien entendu, non, les variables rendent la chose plus simple ! Concrètement, vous faites une variable qui contient « Alexis » ou « Jacqueline » (selon le choix du joueur) ; et dans votre jeu, au lieu de tout le temps afficher « Alexis », vous affichez ce qu’il y a dans cette variable. C’est beaucoup plus simple !
Le premier nœud sera quelque chose comme :
Bienvenue ! Avant de commencer ce récit, préférez-vous vous appeler [[Jacqueline]] ou [[Alexis]] ?
Ensuite, on crée les nœuds correspondant aux deux choix, et chaque nœud va simplement mettre quelque chose de différent dans notre variable, qu’on appellera « prénom ». La syntaxe est la suivante (par exemple pour le nœud « Jacqueline ») :
(set: $prenom to "Jacqueline") (go-to: "debut-histoire")
Désormais, « prénom » contient « Jacqueline » : vous pouvez alors écrire dans le nœud suivant, que nous avons nommé « debut-histoire » :
Quand (print: $prenom) ouvre enfin les yeux, le réveil affiche 07h48. Aaah !
Le nom d’une variable doit commencer par un « $ » ; c’est la façon de Twine de signaler que ce qui suit n’est pas du texte, mais le nom d’une variable. Quant à la macro « print », elle est là pour afficher le contenu de la variable.
Utiliser des variables ainsi permet d’écrire du texte qui s’adapte sans peine aux choix précédents, sans avoir un nombre de branches trop conséquent ; c’est très utilisé, et en fait dans la plupart des jeux. Cependant, si à chaque fois que vous touchez à une variable vous devez faire une petite structure « en diamant », votre code risque d’en être rempli, et ça peut nuire à la lisibilité de votre structure générale… Pour éviter ceci, et parce que ce genre de choix est tellement utilisé, les créateurs de Twine ont créé une construction spécifique, les « setter links », que vous pouvez utiliser à chaque fois que vous voulez modifier la valeur d’une variable en fonction du lien sur lequel la lectrice clique.
Reprenons le premier nœud, et au lieu de créer des liens vers les passages « Jacqueline » et « Alexis », changeons les liens en des « liens modificateurs » (ma traduction de setter links…) :
Bienvenue ! Avant de commencer ce récit, préférez-vous vous appeler (link:"Jacqueline")[(set:$prenom to "Jacqueline")(go-to: "debut-histoire")] ou (link:"Alexis")[(set:$prenom to "Alexis")(go-to: "debut-histoire")] ?
Si ça vous fait peur, pas d’inquiétude, on vous explique ! La macro (link:
crée un lien avec le texte « Jacqueline » (ou « Alexis », pour le deuxième rien), et ce qui suit entre crochet indique ce qu’il faut faire si on clique sur ce lien : donner à la variable $prenom
la valeur « Jacqueline », puis aller au nœud « debut-histoire » ; on fait pareil pour le deuxième lien. Du coup, vous n’avez plus besoin de créer des passages « Jacqueline » et « Alexis », dont le seul but était de changer la valeur de $prenom
: ça nettoie un peu votre structure et évite de créer des nœuds « pour rien » !
On peut faire encore plus flexible pour ce cas du prénom : et si on voulait que la joueuse puisse taper le prénom qu’elle souhaite utiliser ? C’est possible avec la macro prompt
; votre premier nœud deviendrait alors
Bienvenue ! (set: $prenom to (prompt: "Avant de commencer ce récit, tapez votre prénom :", "Tapez votre prénom ici"))
Ce qui veut dire essentiellement « mettez dans $prenom
le résultat de la macro prompt
, c’est-à-dire ce qui vient d’être tapé par le joueur ; le texte qui s’affichera par défaut dans la zone de texte est « tapez votre prénom ici » ».
Tout à fait mon genre
Permettre au lecteur de choisir son prénom a tout de même des incidences sur le reste de votre jeu, puisqu’il va falloir changer les pronoms et les accords dans votre jeu en fonction du genre correspondant ! Partons du principe que « Jacqueline » implique que la lectrice veut être de genre féminin, et que « Alexis » implique un genre masculin (on précise, parce qu’en anglais, c’est plutôt un prénom féminin !). Pour les accords, on va utiliser tout simplement un test, avec la macro « if », que l’on a déjà rencontrée au tutoriel précédent :
« Bonjour, (print: $prenom) ! Ça va, tu as l’air (if: $prenom is "Alexis") [essoufflé] (else:) [essoufflée] ! - Tu me connais, je suis (if: $prenom is "Alexis") [un grand] (else:) [une grande] retardataire... »
Avec ces tests, on a deux textes différents, mais on n’a besoin que d’un seul nœud : ça ne complexifie pas la structure de notre jeu, mais on prend en compte plus de possibilités !
Si vous trouvez le code précédent un peu lourd, c’est normal ! On parlera dans un tutoriel suivant de la possibilité de créer des macros personnalisées, des widgets, qui permettent d’automatiser ce genre de tests : plus besoin d’écrire le test, on écrit une macro qui fait le test et on l’appelle quand on en a besoin !
Pour ce qui est des pronoms, on peut faire la même chose ; mais ici, il y a beaucoup moins de variabilité que pour les accords, et on peut peut-être s’en tirer… avec des variables, encore une fois ! On peut créer une variable $pronompersonnel
, qui contiendra « il » pour Alexis et « elle » pour Jacqueline ; et encore une fois, on peut changer leur valeur dans un « lien modificateur ». Et même mieux : on peut surcharger celui qu’on a déjà créé pour changer les variables $prenom
et $pronompersonnel
en même temps ! La syntaxe pour faire plusieurs assignations est simplement de les séparer par un point-virgule ; ainsi on obtient
Bienvenue ! Avant de commencer ce récit, préférez-vous vous appeler (link:"Jacqueline")[(set:$prenom to "Jacqueline", $pronompersonnel to "elle")(goto: "debut-histoire")] ou (link:"Alexis")[(set:$prenom to "Alexis", $pronompersonnel to "il")(goto: "debut-histoire")] ?
Vous pouvez tester ceci en écrivant par exemple :
« Oui, j’attends (print: $prenom), là… Ouais… Bah, (print: $pronompersonnel) est toujours en retard, de toute façon... »
Certains joueurs aiment bien pouvoir choisir leurs pronoms, encore une fois dans un intérêt de personnalisation et d’identification au personnage principal ; c’est une possibilité par exemple dans quasiment tous les jeux de Choice of Games, et le jeu s’adapte sans problème, ce qui renforce l’immersion. Pour faire ceci, utilisez encore une fois la macro prompt
, mais cette fois pour changer la variable $pronompersonnel
:
(set: $pronompersonnel to (prompt: "Tapez votre pronom :"))
Il reste encore un peu de boulot pour les pronoms, pour définir les formes « lui/elle » et « le/la », mais c’est exactement la même technique – et voilà, vous pouvez créer relativement simplement une histoire où le texte s’adapte au genre du protagoniste !
3 janvier 2021 at 0 h 12
Super instructif, comme les autres tutos ! Merci 🙂
Y aurait-il un moyen autre que le prompt pour demander à l’utilisateur de rentrer une info, mais directement dans la page avec une boîte de dialogue, plutôt que dans un « pop-up » qui bloque la visibilité du reste de la page… ?
J’ai eu un peu de mal avec la « surcharge des variables », le séparateur qui fonctionne pour moi n’est pas un point-virgule mais une virgule… Petit détail mais ça m’a embêté longtemps ! 🙂
(link: »Jacqueline »)[(set:$prenom to « Jacqueline », $pronompersonnel to « elle »)(goto: « debut-histoire »)]
4 janvier 2021 at 18 h 37
Merci pour le signalement, c’est réparé 🙂 Content que ces tutos te soient utiles !
Pour le prompt, j’avoue que je ne sais pas… Avant il y avait « textinput » mais c’était dans Sugarcube/Twine 1… Tu as trouvé quelque chose sur Internet par hasard ?