Avec ce que nous avons appris jusqu’à maintenant, nous pouvons déjà écrire des histoires assez conséquentes. Cependant, elles restent assez statiques et nous ne savons pas encore comment garder certaines choses en mémoire. Nous allons remédier à cela dès maintenant.

Rappel : pour savoir si le joueur a vu un passage

Rappelons-nous : il est possible de d’afficher du texte ou de proposer un choix seulement si un certain passage a été vu ou une certaine option, sélectionnée.

Ce qui n’avait pas été dit, c’est qu’en fait, quand on tape le nom d’un nœud (ou d’une maille ou d’un choix) dans une condition, on ne teste pas si le joueur a vu ou non tel passage ; on teste combien de fois il a été vu (s’il a été vu 1 fois ou plus, la condition est vrai, fausse sinon).

Il est donc possible de faire des tests plus avancés :

{attente > 5: Vous en avez assez d'attendre, vous passez à l'action ! -> attaque}

Ici, le texte ne sera affiché que si le passage attente a été vu plus de cinq fois. Nous allons voir plus loin quels autres conditions peuvent être testées.

Créons des variables

Comme dans n’importe quel autre langage de programmation, il est possible de créer des variables dans ink. Une variable est une valeur que l’on veut sauvegarder pour pouvoir la récupérer plus tard : le score ou les pièces d’or du protagoniste, mais aussi s’il a obtenu un arc ou le nom de sa prochaine destination.

Pour déclarer une variable, il faut utiliser le mot-clef VAR suivi de son nom (sans espaces, comme pour les nœuds) et de sa valeur initiale. Un bon endroit pour faire cela est le début de son code, ou dans le fichier .ink principal.

VAR pieces = 9
VAR arc = false
VAR destination = "la crypte du Nécromancien"

On voit ici qu’une variable peut stocker différents types de valeurs : la première est un nombre, qui peut être décimal ou pas, positif ou négatif. La deuxième est un booléen, c’est-à-dire un type qui ne peut avoir que deux valeurs, true (vrai) ou false (faux). La dernière est une chaîne de caractère, c’est-à-dire du texte ; on la reconnaît grâce aux guillemets qui l’encadrent.

Il faut obligatoirement déclarer ses variables avant de pouvoir les utiliser, c’est pourquoi il vaut mieux le faire le plus tôt possible.

Affichons nos variables

Pour afficher la valeur de ses variables, rien de plus simple : il suffit de les écrire quelque part dans des accolades.

Vous possédez {pieces} pièces d'or et votre prochaine destination est {destination}.

Cela affichera, avec les valeurs données plus hauts :

Vous possédez 9 pièces d'or et votre prochaine destination est la crypte du Nécromancien.

Il est possible d’afficher le contenu de variables dans des options, mais attention : comme les accolades au début d’un choix déterminent sous quelles conditions il est visible, on ne peut pas afficher de variables au début du texte de l’option.

Modifions nos variables

Tout cela est bien beau, mais nos variables ne varient pour l’instant pas beaucoup. Il nous faut un moyen de les modifier en cours d’histoire.

Avec ink, quand on veut exécuter du code plutôt que simplement afficher du texte, il faut commencer la ligne par le symbole ~. On peut alors changer la valeur de ses variables.

Vous apercevez un scintillement dans l'herbe, plus loin.

*   [Allez voir.]
    ~ pieces = pieces + 7 // On gagne 7 pièces.
    Vous trouvez quelques pièces par terre !

Les différentes opérations possibles pour les nombres sont + (addition), - (soustraction), * (multiplication), / (division) et % (modulo, pour obtenir le reste de la division). De plus, il faut utiliser des nombres décimaux pour avoir un résultat non arrondi, (à prendre en compte surtout lors des divisions). Ainsi, 1/4 vaut 0, mais 1.0/4, 1/4.0 et 1.0/4.0 valent 0,25 chacun.

Additionner deux chaînes de caractères revient à les concaténer : "Bon" + "jour" donnera "Bonjour".

Il est bien évidemment possible de ne pas effectuer d’opération et d’assigner directement une valeur :

*   [Acheter l'arc pour 50 pièces d'or]
    ~ pieces = pieces - 50
    ~ arc = true
    Vous achetez un arc. Vous possédez maintenant {pieces} pièces.

Enfin, il existe des raccourcis pour les opérations communes :

// Chaque paire de lignes est équivalente.
~ pieces = pieces + 5
~ pieces += 5

~ pieces = pieces - 5
~ pieces -= 5

~ pieces = pieces + 1
~ pieces++

~ pieces = pieces - 1
~ pieces--

Testons nos variables

Enfin, la dernière chose utile à faire avec des variables est de les comparer. Par exemple, tout à l’heure, il aurait fallu vérifier si le joueur a assez de pièces pour acheter l’arc. C’est conditions peuvent se mettre aux mêmes endroits que lorsque l’on testait si un passage avait été visité.

Tout d’abord, on peut comparer deux valeurs entre elles :

  • x == y : x est égal à y ;
  • x != y : x est différent de y ;
  • x > y : x est plus grand que y ;
  • x >= y : x est plus grand ou égal à y ;
  • x < y : x est plus petit que y ;
  • x <= y : x est plus petit ou égal à y ;
  • x : x est différent de 0.
  • not x : x est égal à 0.

Ici, x et y peuvent être n’importe quoi : un nombre tapé directement, une variable, une opération entre plusieurs valeurs…

Attention, il s’agit bien de deux symboles = à la suite ! On utilise un seul symbole uniquement quand on veut donner une valeur à une variable !

Lorsque l’on teste un booléen, il suffit d’écrire son nom quand on veut qu’il soit vrai et le précéder de not quand on veut qu’il soit faux.

*   {arc} Vous utilisez votre arc.
*   {not arc} Vous n'avez malheureusement pas d'arc.

Il est aussi possible de combiner plusieurs conditions entre elles :

  • condition_1 and condition_2 ou condition_1 && condition_2 (au choix) : les deux conditions doivent être vraies ;
  • condition_1 or condition_2 ou condition_1 || condition_2 (au choix) : au moins une des deux conditions doit être vraie. Il s’agit du caractère « barre verticale » dans la deuxième forme.

Notre exemple de l’arc devient ainsi :

*   {pieces >= 50 and not arc}[Acheter l'arc pour 50 pièces d'or]
    ~ pieces -= 50
    ~ arc = true
    Vous achetez un arc.
*   {arc} [Vendre votre arc pour 35 pièces d'or.]
    ~ pieces += 35
    ~ arc = false
    Vous vendez votre arc.

- <> Vous possédez maintenant {pieces} pièces.

Pour effectuer plusieurs choses en fonction d’une certaine condition, que ce soit pour afficher du texte ou modifier plusieurs variables, il existe la syntaxe suivante :

{ condition:
    // Tout ce qui est ici se passera si la condition est vrai.
- else:
    // Tout ce qui est ici se passera si elle est fausse.
}

Ou, s’il doit arriver des choses différentes selon plusieurs conditions :

{
- condition_1:
    // La condition 1 est vrai.
- condition_2:
    // La condition 1 est fausse mais la deux est vraie (fonctionne comme un « sinon si »).
- condition_3
    // Les deux conditions précédentes sont fausses mais la troisième est vraie.
- else:
    // Toutes les conditions sont fausses.
}

Il est possible de faire ce que vous voulez sous chaque condition : afficher du texte, modifier des variables, même proposer des choix ! Je vous laisse expérimenter.

Conclusion

Ce tutoriel était assez théorique. Si vous avez déjà des notions d’autres langages de programmation, tout ce qui est ici doit être assez facile. Si ce n’est pas le cas, je vous conseille de bien vous habituer à ce que nous venons de voir, car il y a souvent besoin de garder en mémoire certaines choses dans des histoires interactives !