Aujourd’hui, nous allons nous attarder sur une fonctionnalité pratique d’ink, même si elle ne sera pas forcément utile à tout le monde : les tunnels. Il est tout à fait possible d’écrire une histoire sans et vous n’en aurez peut-être pas besoin, mais on ne sait jamais.

Et il reste possible de les utiliser pour expérimenter même si on aurait pu procéder autrement. C’est avec la pratique qu’on finit par savoir quand telle fonctionnalité est nécessaire.

Des nœuds à paramètres

Commençons toutefois par quelque chose qui n’a de prime abord pas de rapport avec les tunnels (nous verrons ensuite pourquoi).

Nous avons vu précédemment des nœuds spéciaux, les fonctions, qui pouvaient prendre des paramètres. Il se trouve que les nœuds normaux le peuvent aussi.

Comment irez-vous au travail aujourd'hui ?

*   [En voiture]
    -> travail("voiture")
*   [En bus]
    -> travail("bus")
*   [En métro]
    -> travail("métro")

=== travail(transport) ===

Vous vous rendez à votre travail en {transport}{transport == "voiture": <> et vous arrivez à destination malgré les embouteillages}.

Ici, il faut fournir une valeur entre parenthèses quand on dévie vers travail, car ce nœud demande un argument. On passe ici un texte mais, comme pour une fonction, on aurait pu utiliser un nombre ou un booléen. Le mot transport se comporte exactement comme un argument de fonction normal : on peut l’afficher, le comparer, même lui assigner une autre valeur à l’intérieur du nœud… et il n’est disponible qu’à l’intérieur de son passage. Les mailles aussi peuvent avoir des arguments.

Cela permet de réutiliser un même passage mais avec des variations en fonction de la façon dont on y arrive. Très pratique pour ne pas avoir à écrire plusieurs fois un passage identique excepté de petites différences.

On aurait pu utiliser une variable globale (chaque choix lui donne la valeur adéquate) et afficher cette variable, mais je trouve cette syntaxe plus claire. Et s’il n’y a qu’à cet endroit que le mode de transport affecte l’histoire, alors ça ne vaut peut être pas la peine de créer une variable globale accessible à toute l’histoire !

Garder une déviation en mémoire

Les variables peuvent, comme nous l’avons vu, stocker des textes, des nombres ou des booléens. Mais elles peuvent aussi stocker des déviations.

VAR epilogue = -> fin_malheureuse

-> intro

=== intro ===

*   Vous décidez de gagner.
    ~ epilogue = -> fin_heureuse
    -> intro
*   Finir maintenant.
    -> epilogue

=== fin_malheureuse ===

Vous avez perdu !
-> END

=== fin_heureuse ===

Vous avez gagné !
-> END

Ici, quand l’histoire rencontre -> epilogue, elle va chercher quelle déviation est stockée à l’intérieur de la variable, et elle sera déviée vers le nœud approprié. Initialement, la variable contient une déviation vers fin_malheureuse. Cependant, si le joueur a décidé de gagner, elle contiendra une déviation vers fin_heureuse.

Il ne faut pas oublier d’écrire la flèche quand on stocke une déviation ! En effet, le nom d’un nœud sans la flèche signifie le nombre de fois que celui-ci a été visité. Si l’on n’avait pas écrit la flèche à la première ligne, on aurait stocké le nombre 0 dans la variable (car le passage n’a jamais été visité à ce moment).

Cela peut être utile quand un passage ne doit pas mener au même endroit en fonction des choix précédents du joueur. Ici, il aurait été facile de mettre une condition plutôt qu’une variable (si le joueur a précédemment sélectionné l’option de gagner, alors aller vers la fin heureuse, sinon aller vers la fin malheureuse), mais dans une histoire complexe, il se peut que la fin (ou toute autre déviation) doivent changer en fonction d’éléments trop compliqués à exprimer par une condition.

Maintenant, combinons ce que nous venons d’apprendre et passons une déviation comme argument d’un passage. Attention cependant, il faut bien écrire la flèche même devant l’argument après le nom du nœud. Cela peut être pratique pour par exemple se souvenir de l’endroit d’où est fait la déviation. Un exemple sera peut-être plus parlant.

-> gare

=== gare ===

Quelle sera votre destination ?

*   [Paris]
    -> voyage(-> paris)
    // on dévie vers voyage, en donnant comme paramètre la déviation -> paris.

// Ci-dessous, il ne faut pas oublier la flèche.
=== voyage(-> destination) ===

Vous prenez place dans le train.

// Passage qui raconte les rencontres que fait le joueur, les événements du voyage, etc.

Enfin, vous arrivez à destination.
// On dévie vers la destination donnée en paramètre.
-> destination

=== paris ===

Vous êtes dans la capitale de la France.

Comme cela, il est facile d’ajouter de nouvelles destinations tout réutilisant le passage qui décrit le voyage, puisqu’on peut maintenant spécifier où aller après ledit voyage.

Enfonçons-nous sous terre

Et c’est là que les tunnels entrent en jeu. Imaginons que le voyage en train est assez complexe et possède de nombreux nœuds et mailles. Comme il faut garder en mémoire la destination, il faudrait à chaque fois passer la déviation en argument de chaque passage !

=== voyage(-> destination) ===

Vous prenez place dans le train.

Que faites-vous ?

*   [Manger]
    -> manger(-> destination)
*   [Dormir]
    -> dormir(-> destination)

= manger(-> destination)

Vous manger puis arrivez enfin à destination.
-> destination

= dormir(-> destination)

Vous dormez un moment. Quand vous vous réveillez, vous vous rendez-compte que vous êtes arrivés.
-> destination

C’est assez lourd. Une solution simple serait encore une fois d’utiliser une variable globale. Mais ce n’est pas la peine, car les créateurs d’ink ont pensé à cette situation et ont créé les tunnels.

Une tunnel est une déviation spéciale qui mène vers un passage qui, une fois terminé, nous ramène à l’endroit où l’on était au moment d’entrer dans le tunnel.

Pour entrer dans un tunnel, on ajoute une flèche à la fin d’une déviation : -> mon_tunnel ->. Cela signifie : « Rends-toi au nœud mon_tunnel puis reviens ici. »

Ici, mon_tunnel est simplement un nœud normal (ou une maille). Il se passera des choses à l’intérieur de ce nœud, qui contiendra éventuellement d’autres déviations, jusqu’à ce qu’on veuille sortir du tunnel. Dans ce cas, il suffira d’écrire deux flèches à la suite : ->->. Cela voudra dire qu’on souhaite revenir à l’endroit où on est entré dans le tunnel.

Notre exemple deviendrait alors :

-> gare

=== gare ===

Quelle sera votre destination ?

*   [Paris]
    // On entre dans le tunnel voyage.
    -> voyage ->
    // Puis on va à Paris.
    -> paris

=== voyage ===

Vous prenez place dans le train.

Que faites-vous ?

*   [Manger]
    -> manger
*   [Dormir]
    -> dormir

= manger

Vous manger puis arrivez enfin à destination.

// On sort du tunnel.
->->

= dormir

Vous dormez un moment. Quand vous vous réveillez, vous vous rendez compte que vous êtes arrivé.

// On sort du tunnel.
->->

=== paris ===

Vous êtes dans la capitale de la France.

Plus besoin de traîner un argument ! Les tunnels sont, je trouve, assez intuitifs, mais n’hésitez pas à bien tester l’exemple pour être certain que rien ne vous échappe. Ici, un cheminement possible serait gare, voyage, dormir, retour au milieu de gare, paris.

Entrer dans un tunnel, c’est comme faire pause dans l’histoire actuelle (le joueur décide de visiter des villes de France) pour passer momentanément à une sous-histoire (les rencontres du joueur dans le train).

Il faut bien vous assurer que le joueur va finir par rencontre un ->-> pour qu’il puisse sortir du tunnel. Et il faut aussi vous assurer que le joueur ne rencontre pas de double flèche alors qu’il n’est pas dans un tunnel.

Sachez également qu’il est possible d’enchaîner des tunnels et des déviations. On aurait donc pu écrire dans l’exemple ceci, sur une seule ligne : -> voyage -> paris. On pourrait même écrire, dans d’autres cas, -> tunnel_1 -> tunnel_2 -> tunnel_3 -> pour effectuer plusieurs tunnels à la suite.

Il est aussi possible d’entrer dans un second tunnel alors qu’on est déjà à l’intérieur d’un tunnel. On passerait donc à une sous-sous-histoire qui, quand elle sera terminée, reviendra à la première sous-histoire qui, quand elle sera terminée, reviendra à l’histoire principale. J’espère que c’est assez clair ! 🙂

Pour finir

Vous vous demandez peut-être maintenant l’intérêt de passer des arguments à un nœud si les tunnels existent. C’est toujours utile quand on veut passer un nombre ou un texte, comme dans le tout premier exemple. Pour le reste, tout dépend de votre histoire. Utilisez ce qui vous paraît le plus clair.

Enfin, comme dit au début, il est possible que vous n’ayez jamais besoin de ces fonctionnalités. Expérimentez quand même, car vous pourrez vous rendre compte qu’elles peuvent quand même servir !