Aller au contenu

Instructions et résultats

tilttek/dice

Une entrée contient une instruction ou plus, séparées par ; ou ,. Les instructions sont lancées dans l'ordre, chacune avec son propre résultat, et chacune peut parler de celles qui la précèdent — jamais de celles qui la suivent. Un résultat est un nombre, un texte ou une liste.

$result = $dice->roll($dice->parse('8d10; @1c[>=6]; @1c[=1]; "$2 successes, $3 ones"'), $randomizer);

$result->totals();    // [44, 5, 1, null], for instance
$result->outputs();   // [44, 5, 1, "5 successes, 1 ones"]

Instructions et références

ConstructionExemplesSens
Instructions2d6; 1d8, 2d6, 1d8Chacune lancée avec son propre résultat ; ; et , les séparent de la même façon
Un résultat$1, $2+1Le résultat d'une instruction précédente, numérotée à partir de 1 : son total, son texte ou sa liste
Un élément$1[0], $2[3]Un élément de ce résultat, numéroté à partir de 0 : de sa liste, ou des valeurs de ses dés qui comptent
Les dés d'une instruction@1, @1c[>=6], @2kh1Les dés qui comptent dans une instruction précédente, jugés de nouveau comme un seul ensemble, sans être relancés
Dés liésb[1,2]kh2Les dés qui comptent dans plusieurs instructions, comme un seul ensemble ; les instructions gardent leurs propres résultats
Dés fusionnésm[1,2]kh1Le même ensemble, les instructions fusionnées cédant leurs dés

@ seul reste les dés de l'ensemble précédent, dans la même instruction (notation) ; @ suivi d'un nombre représente les dés de cette instruction. Les dés des instructions acceptent les modificateurs qui jugent des dés une fois lancés — garder et écarter, réussites, filtres, tris, marques critiques —, aucun qui en lance davantage.

Une instruction fusionnée n'a plus de total : ExpressionResult::total() est null et mergedInto donne le numéro de l'instruction qui a pris ses dés. Son résultat est quand même gardé, et $n le lit toujours ; ses dés ne peuvent plus être liés ni fusionnés. Une référence ne prend pas les dés de l'instruction qu'elle lit : $1 est une valeur, @1 un ensemble de dés.

Groupes

{4d6, 2d10}kh1 lance chaque expression du groupe avec son propre total, puis juge les totaux comme des dés déjà lancés : garder et écarter, réussites ({3d6, 3d6, 3d6}>=10), filtres, tris, marques critiques. Une expression d'un groupe ne voit pas les dés extérieurs, et les dés précédents (@) après un groupe sont ses totaux. Les totaux sont énumérés dans DiceResult::parts sous les noms expression-1, expression-2 et ainsi de suite.

Listes de textes

ConstructionExemplesSens
Une liste1L[sword,bow], L[sword,bow]Tire un élément, ou autant que le dit le nombre ; le nombre est un nombre ou une expression entre parenthèses
Éléments uniques3Lu[a,b,c,d]Tire des éléments différents
Sans séparateur3Ln[ka,ro,mi]Joint les éléments tirés en un seul texte, karomi
Poids1L[a[2],b,c[3]]Un élément qui pèse 2 est tiré deux fois plus souvent qu'un élément qui pèse 1
Intervalles1L[1..2:a,3..6:b]Lance un nombre de la borne la plus basse à la plus haute ; l'élément dont l'intervalle le contient est tiré

Un élément s'écrit tel quel, jusqu'à la virgule, au crochet ou au poids qui le termine, ses espaces retirées ; entre guillemets doubles, il peut contenir n'importe quel caractère, une virgule ou un crochet compris. Un élément est un texte ou une clé de traduction, jamais du HTML. Les intervalles d'une liste se suivent, du premier au dernier, sans trou ; une liste est pondérée ou sur des intervalles, pas les deux. Une liste unique tire parmi les éléments restants, selon leurs poids ou la largeur de leurs intervalles.

ListResult garde les éléments tirés, l'indice de chacun dans la liste (draws), le nombre lancé pour chacun (rolls : de 1 au poids total, ou sur les intervalles) et le nombre d'éléments quand il a été lancé. Chaque tirage compte comme un dé au regard des limites.

Textes et phrases

Un texte s'écrit entre guillemets doubles : "Critical!", "weapon.sword". Sans marqueurs, c'est un texte ou une clé de traduction, tel que le lit l'application — jamais du HTML ; la page l'échappe. Avec des marqueurs, c'est une phrase, dont les marqueurs sont remplacés par des résultats au moment du lancer :

MarqueurRemplacé par
%1Le résultat dont il parle : le sujet de la branche dans laquelle il se trouve, ou l'instruction juste avant
%2Les valeurs des dés qui comptent dans ce résultat, séparées par des virgules
%3Les résultats de chaque instruction précédente, séparés par des virgules
$n, $n[i]Le résultat de l'instruction n, ou son élément i
@nLes valeurs des dés qui comptent dans l'instruction n, séparées par des virgules

Une liste s'écrit avec ses éléments séparés par une virgule et une espace, ou accolés quand elle n'a pas de séparateur. Une barre oblique inversée écrit un saut de ligne, \n, et écrit tel quel une barre oblique inversée, un guillemet double, %, $, @, [ ou un chiffre qui la suit : "50\% off" ; "$1\2" est le résultat de l'instruction 1 suivi du chiffre 2. Un signe qui n'est pas suivi d'un chiffre s'écrit tel quel : "100 %".

Branches

ConstructionExemplesSens
Si1d20i[>=15]{"hit"}{"miss"}La première branche quand la condition est vraie, la seconde sinon — ou le sujet lui-même quand il n'y en a pas
Aiguillage1d6S[1..2]{"a"}[2..5]{"b"}{"c"}Sous forme de liste, la branche de chaque cas vrai ; la dernière branche, sans condition, quand aucun n'est vrai — ou le sujet lui-même
Aiguillage exclusif1d6S^[1..2]{"a"}[3..5]{"b"}{"c"}La branche du premier cas vrai

Une branche s'applique à l'opérande juste avant elle — des dés, une liste de valeurs, un groupe, une référence, une expression entre parenthèses : (1d20+5)i[>=15]{…}. Sa condition est un validateur entre crochets, avec la portée dans laquelle elle juge le sujet : sa valeur par défaut, all: ou any: des dés qui y comptent, total: leur somme sans ce qui leur est ajouté. Un sujet sans dés est jugé comme un seul dé de sa valeur. Une branche contient tout ce que peut contenir une instruction : un nombre, des dés, un texte, une liste, une autre branche. Seule la branche retenue est lancée. Le sujet est un nombre : un texte ou une liste ne peut pas être jugé.

BranchResult garde le sujet, les cas vrais — par leur indice à partir de 0, un if étant un seul cas —, si la branche par défaut a donné le résultat, et le résultat.

Répétitions

repeat(4d6kh3, 6) lance son premier argument autant de fois que le dit son second — un nombre, ou une expression lancée d'abord — et donne les résultats dans une liste. Ce qu'il répète peut être un texte ou une liste, dont les éléments rejoignent la liste. Chaque répétition compte au regard des limites, celles d'un repeat() dans un repeat() une fois pour chaque passage.

Commentaires

ConstructionExemple
Jusqu'à la fin de la ligne2d6 # fire damage, 2d6 // fire damage
Entre crochets, après un opérande2d6[fire] + 1d4[cold]

Les commentaires ne prennent part ni au lancer ni à la forme canonique ; Pool::$comments les garde, selon l'indice à partir de 0 de l'instruction dans laquelle ils sont écrits. Un commentaire jusqu'à la fin de la ligne se termine à un saut de ligne : une instruction qui le suit commence donc à la ligne suivante. Un commentaire entre crochets ne contient ni guillemet ni # ; après un modificateur qui prend un seuil entre crochets — une relance, une explosion, une marque critique, des occurrences —, les crochets sont lus comme le seuil.

Résultats

RésultatDonne
ConstantResult, OperationResult, NegationResult, FunctionResult, DiceResultUn nombre ; les libellés des faces qui comptent pour les dés personnalisés dont les faces ne portent pas de valeur
TextResultUn texte
ListResultUne liste de nombres et de textes, ou un seul texte une fois joints
BranchResultCe qu'a donné sa branche
ReferenceResultCe qu'a donné l'instruction qu'il lit, ou son élément

NodeResult::output() donne le nombre, le texte ou la liste ; value() donne le nombre, et lève CannotRoll pour un texte ou une liste. ExpressionResult::output() est la sortie d'une instruction, text() la même écrite comme l'écrit une phrase, total() le nombre quand c'en est un. PoolResult::outputs() énumère les sorties, totals() les totaux.

La forme canonique

La forme canonique sépare les instructions par ", ", écrit les dés d'une instruction @n et ceux de plusieurs b[…] ou m[…], les groupes {a, b}, une liste nL avec u puis n et ses éléments tels qu'écrits, sauf s'ils exigent des guillemets, un aiguillage S — en majuscule, comme L et le F des dés Fudge, pour qu'aucun ne se lise comme un tri ou un chiffre —, un if i, et un texte entre guillemets doubles avec les échappements qu'il exige. Les commentaires ne sont pas écrits.

EntréeForme canonique
8d10; @1c[>=6]8d10, @1>=6
1d6;1d8;B[1]1d6, 1d8, @1
l[sword, bow]1L[sword,bow]
2L[a[3], b, c[1]]2L[a[3],b,c]
1L[a,"b, c"]1L[a,"b, c"]
1d6s[1]{"a"}1d6S[1]{"a"}
2d6 [fire] # roll2d6