Aller au contenu

Tables aléatoires

tilttek/generator

Le répertoire tables/ du paquet contient des tables aléatoires prêtes à tirer, ou à copier et à adapter : les générateurs que la plupart des jeux demandent, écrits avec la syntaxe de la bibliothèque. Leur contenu est neutre, lié à aucun jeu. Chaque table est écrite en anglais, dans tables/en/, et en français, dans tables/fr/. Tables::directory() donne le répertoire des tables anglaises et Tables::directory('fr') celui des tables françaises, Tables::file('shop', 'fr') le fichier d'une table, Tables::NAMES leurs noms et Tables::LOCALES leurs langues ; une autre langue est une InvalidDefinition :

use Tilttek\Generator\Generator;
use Tilttek\Generator\Loading\FileLoader;
use Tilttek\Generator\Tables;

$generator = new Generator(new FileLoader()->catalog([Tables::directory('fr'), 'generators']));
$generator->draw('table.shop')->first();

Les deux versions d'une table ont la même forme : les mêmes listes, les mêmes générateurs, les mêmes valeurs d'état, les mêmes variables et les mêmes champs, sous les mêmes noms. Une application charge une langue ou l'autre, jamais les deux, puisque leurs noms sont les mêmes, et garde ses états quand elle change de langue : les valeurs que l'application fixe gardent leurs identifiants en français aussi (terrain: forest, odds: likely, chaos: 6), sauf le lieu des rumeurs, un texte écrit avec son article (le village). Les tables françaises ne sont pas traduites mot à mot : elles sont écrites en français, avec les filtres de grammaire de la langue : l'accord des créatures, l'élision des accroches et des rumeurs, l'article de l'enseigne d'une boutique.

Chaque table est un fichier dont les listes et les générateurs se nomment table.<name> et table.<name>.…, et qui ne nomme rien hors de son fichier : un fichier peut se charger seul, ou se copier sous un autre nom et s'adapter. Charger une table et la copie qu'en a faite une application donne deux listes du même nom, que le catalogue refuse : une application prend la table, ou sa copie.

TableGénérateursCe qu'ils donnent
encountertable.encounterQui le groupe rencontre, combien, ce qu'ils font, à quelle distance et comment ils le prennent. Le terrain (forest, road, hills, swamp, ruins ou underground) est une valeur d'état que fixe l'application ; road au premier tirage.
magic-itemtable.magic-itemUn objet magique structuré : son nom et son pouvoir, son apparence, une manie et ses charges.
loottable.loot, table.loot.unidentifiedDes pièces, des gemmes avec leur valeur, une œuvre d'art, et un objet non identifié : ce dont il a l'air, ce qu'il est vraiment, et un indice qui y mène.
shoptable.shop, table.shop.merchantUne boutique : son genre et son enseigne, son marchand avec un trait et une humeur, et cinq articles de son stock avec leur prix en argent.
hooktable.hookUne accroche de scénario : qui demande, quoi, où, pourquoi, et le revirement que le groupe ignore encore.
rumourtable.rumourUne rumeur sur un lieu et sa part de vérité. Le lieu est une valeur d'état que fixe l'application ; the village au premier tirage.
oracletable.oracle, table.oracle.yes-no, table.oracle.inspirationUn oracle de jeu en solo : une réponse oui ou non pesée selon les chances de la question et un facteur de chaos, avec un événement aléatoire sur un double ; une réponse oui ou non simple ; une action et un thème pour l'inspiration.
fortunetable.fortune, table.fortune.day, table.fortune.prophecyLa bonne aventure : un tirage de trois cartes d'un jeu de vingt-deux, chacune à l'endroit ou renversée ; une carte du jour ; une prophétie faite de trois tables.

L'oracle du jeu en solo

table.oracle garde deux valeurs d'état que l'application fixe entre les questions : odds, l'une de certain, likely, even, unlikely et impossible, et chaos, le facteur de chaos de 1 à 9. La chance d'un oui est celle des chances (90, 70, 50, 30 ou 10 sur cent), déplacée de 5 par cran de chaos au-dessus ou au-dessous de 5, et gardée de 1 à 99 ; un jet d'un cinquième de la chance ou moins est un oui exceptionnel, un jet dans le dernier cinquième du reste un non exceptionnel. Un double (11, 22, … 99) dont les dizaines ne dépassent pas le facteur de chaos amène un événement aléatoire. Le résultat est structuré :

$generator->draw('table.oracle', new Draw(state: ['odds' => 'likely', 'chaos' => '6']))->first();
// ['roll' => '34', 'answer' => 'Yes', 'event' => '']

L'arithmétique reste en nombres entiers (//), pour que le même germe donne partout la même réponse.

Écrire une table

Les tables emploient les techniques de la bibliothèque, que les tables d'une application peuvent reprendre : une entrée choisie par une variable au moyen d'une étiquette (table.loot.unidentified tire un nombre, puis l'apparence et l'identité qui en portent l'étiquette, pour qu'elles correspondent), le genre d'une boutique tiré dans une variable et passé aux tirages de son stock comme étiquette, une valeur d'état comme entrée que donne l'application, et des boucles sur les entrées d'un tirage multiple, séparées au moyen de loop.index0.