La dernière fois, nous avions parlé des tunnels, une fonctionnalité d’ink assez avancée, mais bien pratique quand on en a besoin. Le sujet d’aujourd’hui est similaire, bien qu’on puisse peut-être le considérer comme encore plus avancé. Mais n’ayons pas peur ! Les fils ne sont pas si compliqués, même s’il peut être difficile de leur trouver une utilisation de prime abord.

Que sont les fils ?

Un fil (thread en anglais) permet d’aller chercher du contenu ailleurs dans l’histoire afin de l’intégrer dans le nœud actuel. Pour en créer un, il faut utiliser une déviation vers la gauche : <- mon_fil.

Un petit exemple pour mettre tout cela au clair :

-> reveil

=== reveil ===

Quand je me suis réveillée ce jour-là, j'ai tout de suite su que quelque chose clochait. 

// On crée un fil à cet endroit
<- fenetre

=== fenetre ===

Les volets avaient été ouverts et la lumière était différente.

*   Je me suis levée pour regarder par la fenêtre.
*   J'ai tiré les rideaux sans jeter un œil dehors.

En testant, nous nous rendons compte que le texte du nœud reveil est affiché, puis celui du nœud fenetre avec ses options. En effet, lorsque nous démarrons un fil, ink va chercher les texte et les options du passage indiqué pour l’intégrer au nœud actuel.

Mais pourquoi ne pas avoir écrit le texte de fenetre directement dans reveil ? Ici, ça aurait effectivement été plus facile, mais ça devient intéressant quand on utilise plusieurs fils à la fois.

-> reveil

=== reveil ===

Quand je me suis réveillée ce jour-là, j'ai tout de suite su que quelque chose clochait.

// Deux fils en même temps, cette fois-ci.
<- fenetre
<- musique

=== fenetre ===

Les volets avaient été ouverts et la lumière était différente.

*   Je me suis levée pour regarder par la fenêtre.
*   J'ai tiré les rideaux sans jeter un œil dehors.

=== musique ===

Une étrange musique s'échappait de la porte entrebâillée.

*   J'ai écouté la mélodie.
*   J'ai quitté la pièce.

Ici, nous récupérons le contenu de deux nœuds différents. Ink va procéder comme suit. Après avoir affiché l’introduction, ink va chercher le contenu du noeud fenetre pour afficher son texte et garder les choix qu’il propose en mémoire. Mais il ne va pas les montrer tout de suite ! Ink doit d’abord chercher le contenu du second fil, l’afficher et garder ses choix en mémoire. Quand tous les fils ont été parcouru, ink montre toutes les options qu’il a rencontré d’un coup.

Ici, on aura donc l’introduction, la ligne décrivant les volets, la ligne annonçant la mélodie, puis les quatre choix à la suite.

Ces choix n’ont rien de particulier autrement. Pour compléter l’exemple, on ajouterait des réponses et des diversions à chaque option, ou des points de rassemblement, afin de continuer l’histoire comme si de rien n’était.

Tout cela est bien beau, mais à quoi peut concrètement servir tout cela ?

De l’utilité des fils

Comme on vient de le voir, les fils permettent de récupérer du contenu ailleurs dans l’histoire pour les intégrer sur le champ. Chaque fil peut être vu comme une vision d’un futur possible (chaque futur étant représenté par un nœud) : on peut soit s’intéresser à la fenêtre, soit s’intéresser à la musique. Mais dès qu’un choix est sélectionné, c’est le futur auquel il appartient qui devient la réalité : si la protagoniste regarde à l’extérieur, alors c’est qu’elle a décidé de ne pas s’intéresser à la mélodie.

Les fils peuvent n’avoir qu’une utilité organisationnelle : plutôt que de mettre tout le texte et toutes les options dans un seul énorme nœud, on le casse en plusieurs petits morceaux. C’est ce que nous avons fait dans l’exemple plus tôt. En effet, rien ne nous aurait empêché d’écrire tout le contenu dans reveil.

Mais les fils deviennent véritablement utiles quand on veut le même contenu à plusieurs moments. Il peut s’agir de personnages se déplaçant à différents endroits, d’un ordinateur que le joueur peut consulter depuis divers emplacements…

=== couloir ===

La musique était un peu plus forte dans le couloir. Elle semblait venir du salon.

<- ecouter
*   Je suis allée dans le salon.
    -> salon
*   Je suis retournée dans ma chambre
    -> chambre

=== salon ===

La mélodie était forte ici, envoûtante, mais je ne parvenais pas à en localiser l'origine.

<- ecouter
*   J'ai cherché d'où venait la musique.

=== ecouter ===

*   J'ai fermé les yeux et me suis laissé emporter.
    J'ai eu la sensation de basculer. Quand j'ai rouvert les yeux…
    À suivre…
    -> END

Ici, il sera possible d’écouter l’hypnotisante musique partout, en plus des choix que chaque pièce offre. Le fil permet donc de récupérer l’option depuis des nœuds différents, sans avoir à réécrire plusieurs fois la même chose.

Encore mieux, comme avec des déviations normales, on peut passer des paramètres quand on crée un fil. Cela peut servir si l’on veut retourner à l’endroit d’où a été fait le fil :

=== foret ===

J'étais dans une étrange forêt.

// Ce point de rassemblement ne sert qu'à avoir un endroit vers lequel on peut dévier.
- (options)

// On crée un fil avec comme paramètre une déviation vers le point de rassemblement ci-dessus.
<- carte(-> options)
*   Les arbres étaient moins serrés, plus loin.
    -> clairiere

=== clairiere ===

Je me tenais dans une drôle de clairière 

- (options)

<- carte(-> options)
*   J'ai exploré l'endroit.

=== carte(-> retour) ===

*   J'ai consulté l'étrange carte que j'avais trouvée.

// On revient vers l'endroit spécifié quand on crée un fil. On utilise un point de rassemblement pour que l'on soit sûr de revenir, même si le nœud a plusieurs options.
- -> retour

Le nœud carte prend comme argument une déviation ; quand on créé le fil, on fournit l’endroit vers lequel on veut revenir. Pour cela, nous utilisons des points de rassemblement que nous avons nommés et qui n’ont pas d’autres vocations que d’être la cible de déviation (lisez l’article dédié aux points de rassemblement pour vous rafraîchir la mémoire !). On aurait pu s’en passer et dévier vers les nœuds directement, mais cela aurait eu pour effet de répéter le texte du nœud, ce qui n’aurait pas forcément été souhaitable.

Interrompre un fil

Un fil cherche le contenu d’un nœud et ses options, mais il peut arriver que l’on veuille interrompre cette collecte. Par exemple, si la protagoniste ne possède pas la carte, on ne veut pas que les options pour la consulter soient visibles. On peut pour cela utiliser la déviation spéciale -> DONE, qui dit à ink d’interrompre le fil à cet endroit.

VAR possede_carte = true

=== carte ===

// Si on ne possède pas la carte, on coupe le fil et rien ne sera récupéré.
{not possede_carte: -> DONE}

// Sinon, on récupère les choix.
* J'ai consulté l'étrange carte que j'avais trouvée.

Si la variable est fausse, la condition coupe le fil avec -> DONE et tout contenu qui suit ne sera jamais récupéré. Le jeu n’affichera donc pas l’option dans ce cas-ci. Cela est plus pratique que de mettre une condition à chaque fois qu’on crée le fil (comme ceci : {possede_carte: <- carte}) car on n’a à le faire qu’à un seul endroit.

Conclusion

Et cela clôt cet article ! Nous avons fait un tour général des fils dans ink, mais n’hésitez pas à lire la documentation officielle pour plus d’exemples. Et surtout, expérimentez ! Votre histoire n’en n’a peut-être pas besoin, mais il n’y a qu’un moyen de le savoir.

Gardez simplement en tête qu’une fois que des fils sont en jeu, une histoire obtient une structure plus complexe, alors faites attention et ne perdez pas le fil ! (Oui, j’avoue, elle était facile.)