Cette série de tutoriels vise à expliquer les fonctionnalités avancées d’ink. L’objectif est d’arriver en fin de parcours à avoir un système robuste permettant de mettre le jeu que vous voulez.

Ce tutoriel-ci reprend les bases de l’aléatoire.

Le suivant sera en parallèle celui de smwhr qui présentera une manière d’avoir un inventaire en ink avec des listes. De mon côté, je présenterai comment avoir un moteur de narramiettes avec des listes et de l’aléatoire.

Celui d’après sera à propos d’une autre technique pour avoir un inventaire plus poussée ou simplement des stats plus « rangées » et simple à utiliser mais demandant un peu plus de code.

Le dernier article de la série sera celui où nous combinerons toutes les techniques ensemble pour avoir un système intéressant.

Généralités sur l’aléatoire

Pour apporter un peu d’aléatoire dans ink, plusieurs solutions existent. Mais d’abord, pourquoi vouloir ajouter de l’aléatoire ? Plusieurs raisons viennent directement à l’esprit :

  • Si vous voulez que rejouer l’histoire apporte un peu de surprise.
  • Si vous voulez simuler un système de compétences similaire à un jeu de rôle où l’on lancerait des dés, pour avoir des réussites et des échecs dépendant d’aléatoire pondéré par les choix précédents du joueur.
  • Si vous voulez avoir un système de Pierre-Feuille-Ciseaux ou tout autre jeu reposant sur l’aléatoire dans votre histoire.
  • Si vous voulez avoir du code en commun sans que le lecteur ne s’en aperçoive (par exemple les salutations que le narrateur peut faire aux gens autour de lui).
  • Si vous voulez créer une génération d’éléments différent à chaque fois, par exemple un jeu reposant sur les narramiettes (liens vers l’article présentant les narramiettes). Je parlerai de techniques pour le faire dans un prochain article de la série mais cela repose sur l’aléatoire et les listes.

Shuffle

La méthode la plus simple, c’est d’utiliser les « shuffles » (« mélanger », dans le sens « mélanger des cartes »), cette structure avec des accolades où chaque élément est séparé par des barres verticales (aussi connues sous le nom de pipes en anglais) : {~element1|element2}

Comment faire des accolades au clavier ? Sur Windows avec un clavier français, en appuyant sur Alt Gr (la touche Alt sur le côté droit de la barre espace), et la touche 4 pour l’accolade ouvrante {.
Pour l’accolade fermante }, c’est Alt Gr et la touche =+.

Comment faire des barres verticales au clavier ? Sur Windows et un clavier français, en appuyant sur Alt Gr (toujours celle-ci ^^) et 6. Ca ressemble à ça : |.

Cela permet de résoudre la plupart des éléments de choix discret, particulièrement quand on veut avoir de la description qui change un peu d’un passage à l’autre.

Exemple simple :

<- dire_bonjour
<- dire_bonjour

-> END

=== dire_bonjour ===

{~Bonjour !|Hiya !|Coucou les amis.|Salut les djeuns !|Petit signe de la main pour dire bonjour.}

-> DONE

(Il existe d’autres façons de faire varier ce qui est montré au joueur, avec plus ou moins d’aléatoire (par exemple montrer chacune des options l’une après l’autre) ; voir l’article dédié !)

Shuffle multiligne

On peut aussi tout à fait l’utiliser sur du multiligne. Du coup, c’est sous la forme suivante :

=== dire_bonjour_multiligne ===

{shuffle:
- Bonjour !
- Hiya !
- Coucou les amis.
- Salut les djeuns !
- Petit signe de la main pour dire bonjour.
}

-> DONE

Il est aussi possible d’avoir du code (des instructions) multiligne sur ce dernier format, c’est à dire de faire un traitement particulier.

Shuffle non équiprobable

Une utilisation un peu particulière de cette structure peut être de créer un dé pipé. (Le principe étant que chaque possibilité n’a pas la même chance d’arriver : on associe le poids que l’on veut en multipliant la présence.)

VAR dé = 0

~ dé = dé_pipé()
{dé}
{dé}
{dé}

~ dé = dé_pipé()
{dé}
{dé}
{dé}

-> END

=== function dé_pipé() ===

~ return "{~1|1|1|2|2|3}"

Ici la variable n’est affectée par le dé pipé que deux fois. À chaque fois qu’on appelle dé_pipé, le résultat est enregistré dans la variable et ça permet d’utiliser cette dernière plusieurs fois sans que le résultat change. Celui-ci changera à chaque fois que vous appelez de nouveau la fonction.

Un bémol de cette solution est que le résutat est une chaîne de caractères ; pour avoir un nombre, on doit utiliser la version longue.

=== function dé_pipé_nombre() ===

{shuffle:
-
~ return 1
-
~ return 1
-
~ return 1
-
~ return 2
-
~ return 2
-
~ return 3
}

À noter qu’il est obligatoire d’avoir le renvoi sur la ligne d’après la condition.

Ce nombre obtenu en appelant cette nouvelle fonction, vous pouvez l’utiliser dans des opérations, le tester dans des conditions… En tout point, c’est une véritable nombre.

Utiliser les fonctions d’aléatoire

Il existe dans le langage ink deux fonctions avec RANDOM dans le nom.

La première prend en argument un minimum et un maximum. C’est celle qu’on s’attend le plus à avoir.

~ dé = RANDOM(1, 6)

Cela donnera à ma variable une valeur entre 1 et 6 (les deux compris), chacun des nombres ayant la même probabilité d’apparaître que les autres. Comme un vrai dé à 6 faces, non pipé !

Je vais parler de la seconde fonction dans la deuxième partie, car cela utilise l’élément que je préfère dans ink : les listes.

S’assurer que l’aléatoire soit répétable

Si je dis que l’on peut vouloir s’assurer que le résultat de l’aléatoire soit répétable, est-ce aberrant pour vous ?

Typiquement, quand on veut travailler sur un passage ou le tester, notamment directement dans Inky, il peut être intéressant de fixer l’aléatoire. Cela s’appelle dans le jargon informatique avoir la graine (seed en anglais). Une graine est en général un chiffre ou une chaine de caractère que le programme va utiliser pour initialiser tous les appels aléatoires du programme.

En ink, il y a une commande pour entrer la graine et donc avoir un aléatoire répétable :

~ SEED_RANDOM(235)

À partir de là, à chaque fois que vous rejouerez une partie, les résultats aléatoires seront les mêmes. N’oubliez pas d’enlever cette ligne avant de publier votre histoire, que les joueurs aient un véritable aléatoire !

Conclusion

Avec ce tutoriel, vous devez être capable de faire de la variation si vous avez un morceau de code qui revient tout le temps (une salutation du narrateur, comment il décroche son téléphone, comment il parle à tel personnage au fil du récit interactif) ainsi que les bases nécessaires pour avoir un système de statistiques et récupérer la valeur d’un dé, ou tout autre générateur d’aléatoire.

Vous voulez être sûr que vous avez tout compris comment marche l’aléatoire ?

Alors pourquoi ne pas faire un système Pierre-Feuille-Ciseaux ? Le joueur a le choix entre ces trois options, et l’adversaire choisit aléatoirement entre les trois éléments. Pensez à stocker le résultat dans des variables pour les comparer.

Vous devriez avoir tout ce qu’il faut pour y arriver. Et dans deux semaines, nous commencerons notre exploration des listes, un élément de syntaxe très puissant d’ink.