Ce lancer de dés est un analyseur de chaînes qui renvoie un objet contenant les composants du lancer de dés. Il prend en charge la spécification complète Roll20 Dice. Il utilise une grammaire pegjs pour créer une représentation du format de lancer de dés. Cela peut ensuite être converti en une simple valeur numérique ou en un objet complexe utilisé pour afficher les détails complets du rôle.
Il s'agit d'un fork du projet dice_roller de Ben Morton. Il y avait quelques bugs, je le republie donc avec les correctifs et les fonctionnalités nécessaires à mes projets.
Installez la bibliothèque en utilisant :
npm install dice-roller-parser
Une fois installée, chargez simplement la bibliothèque, soit dans le navigateur :
< script src =" node_modules/dice-roller-parser/dist/index.js " > </ script >
Ou en noeud :
import { DiceRoller } from "dice-roller-parser" ;
Créez ensuite une nouvelle instance de la classe DiceRoller
et utilisez-la pour effectuer des lancers de dés.
const diceRoller = new DiceRoller ( ) ;
// Returns the total rolled value
const roll = diceRoller . rollValue ( "2d20kh1" ) ;
console . log ( roll ) ;
// Returns an object representing the dice roll, use to display the component parts of the roll
const rollObject = diceRoller . roll ( "2d20kh1" ) ;
console . log ( rollObject . value ) ;
Cette bibliothèque expose deux classes, un DiceRoller
et un DiscordRollRenderer
.
DiceRoller
La classe DiceRoller
gère l'analyse d'une chaîne de dés et l'exécution de lancers en fonction du résultat.
// Creates a new instance of the DiceRoller class
const roller = new DiceRoller ( ) ;
Le constructeur par défaut utilise Math.random
et applique un nombre maximum de lancers par dé de 1 000. Ceux-ci peuvent être spécifiés à l'aide des surcharges de constructeur suivantes.
DiceRoller(GeneratorFunction)
Vous pouvez spécifier une fonction à utiliser comme générateur de nombres aléatoires par le lanceur de dés. Cette fonction doit être du type () => number
et renvoyer un nombre compris entre 0 et 1. Par défaut, elle utilise la méthode Math.random
intégrée.
// Default constructor using Math.random
const roller = new DiceRoller ( ) ;
// Uses a custom random generator that always returns 0.5
const roller = new DiceRoller ( ( ) => 0.5 ) ;
Cela peut être lu ou modifié à l'aide de la propriété randFunction
.
roller . randFunction = ( ) => 0.5 ;
DiceRoller(GeneratorFunction, MaxRollsPerDie)
Pour éviter de tenter d'analyser un très grand nombre de lancers de dés, un nombre maximum de lancers pour un dé peut être spécifié. La valeur par défaut est définie sur 1000.
// Uses the default constructor with a limit of 100 rolls per die
const roller = new DiceRoller ( null , 100 ) ;
// Uses a custom random generator that always returns 0.5, and a limit of 10 rolls per die
const roller = new DiceRoller ( ( ) => 0.5 , 10 ) ;
Cela peut être lu ou modifié à l'aide de la propriété maxRollCount
.
roller . maxRollCount = 75 ;
Une fois la classe DiceRoller
construite, il existe trois options pour effectuer un lancer de dés :
La méthode rollValue
prend une entrée de chaîne de dés, l'analyse, effectue un lancer et renvoie le résultat de la valeur numérique calculée.
// Rolls 2 d20 dice and keeps the value of the highest
const roll = roller . rollValue ( "2d20kh1" ) ;
// Prints out the numeric value result
console . log ( roll ) ;
La méthode roll
prend une entrée de chaîne de dés, l'analyse, effectue un lancer puis renvoie un objet qui représente le lancer. À l'aide des objets roll, vous pouvez créer votre propre fonctionnalité d'affichage du roll, plutôt que de simplement afficher la valeur finale.
// Rolls 2 d20 dice and keeps the value of the highest
const roll = roller . roll ( "2d20kh1" ) ;
// Print out the full roll breakdown
printDiceRoll ( roll ) ;
// Prints out the numeric value result
console . log ( `Final roll value: ${ roll . Value } ` ) ;
Consultez le résultat du lancer dans la section Types de sortie ci-dessous pour plus de détails sur l'objet renvoyé.
La méthode parse
prend une entrée de chaîne de dés, l'analyse et renvoie une représentation de l'entrée analysée. Cela peut être utilisé soit pour effectuer un lancer de dés, soit pour reconstruire l'entrée originale. La méthode rollParsed
prend ce résultat analysé comme entrée, effectue le roll et renvoie la même sortie que celle de la méthode roll
.
// Rolls 2 d20 dice and keeps the value of the highest
const parsedInput = roller . parse ( "2d20kh1" ) ;
// Print out a re-constructed input string
printParsedInput ( parsedInput ) ;
// Run the roller on the parsed object
const roll = roller . rollParsed ( parsedInput ) ;
// Print out the full roll breakdown
printDiceRoll ( roll ) ;
// Print out the numeric value result
console . log ( `Final roll value: ${ roll . Value } ` ) ;
Consultez la sortie du rouleau analysée dans la section Types de sortie ci-dessous pour plus de détails sur l'objet renvoyé.
DiscordRollRenderer
La classe DiscordRollRenderer
est un exemple de classe de rendu qui prend une entrée roulée représentée par un objet RollBase
et la restitue sous forme de chaîne dans un format markdown, compatible avec Discord.
// Creates a new instance of the DiceRoller class
const renderer = new DiscordRollRenderer ( ) ;
Le DiscordRollRenderer
expose une seule méthode render
avec un seul paramètre, l'objet RollBase
à restituer, et renvoie la chaîne rendue.
// Rolls 2 d20 dice and keeps the value of the highest
const roll = roller . rollValue ( "2d20kh1" ) ;
// Get the formatted string
const render = renderer . render ( roll ) ;
console . log ( render ) ;
Pour développer cette bibliothèque, clonez simplement le référentiel, lancez une installation :
npm install
Ensuite, faites un build :
npm run build
Cela fait quatre choses :
# Clean any existing builds
npm run clean
# Build the dice grammer
npx pegjs src/diceroll.pegjs
# Run tslint against the project
tslint -c tslint.json --project tsconfig.json
# Then run webpack to build and package everything up nicely
webpack
Pour exécuter la suite de tests, utilisez :
npm run test
C'est tout ce qu'il y a à faire !
Les types d'objets suivants sont générés par la classe DiceRoller
et sont disponibles en tant qu'interfaces pour les utilisateurs de TypeScript.
L'objet renvoyé par un résultat de lancer est composé des types suivants.
RollBase
La classe de base pour tous les lancers de dés, étendue en fonction de la propriété type.
Propriété | Taper | Description |
---|---|---|
succès | boolean | Le lancer a-t-il été un succès, pour les lancers à nombre cible. Exemple : 3d6 > 3 |
taper | RollType | Le type de lancer que cet objet représente. |
valide | boolean | Le rôle est-il toujours valide et inclus dans les calculs. |
valeur | number | La valeur lancée ou calculée de ce lancer. |
étiquette | string | L'étiquette d'affichage de ce rouleau. Cette propriété est facultative. |
commande | number | Une propriété utilisée pour maintenir l’ordre des lancers de dés au sein des groupes. |
RollType
Une énumération des types de rouleaux valides. Les valeurs possibles sont :
"number"
"diceexpressionroll"
"expressionroll"
"mathfunction"
"grouproll"
"fate"
"die"
"roll"
"fateroll"
GroupedRoll
Une interface intermédiaire étendue pour les groupes de dés. Cette interface étend RollBase
.
Propriété | Taper | Description |
---|---|---|
dés | Array< RollBase > | Les rouleaux inclus dans ce groupe. |
DiceExpressionRoll
Une représentation d'une expression de dé. Cette interface étend GroupedRoll
.
Exemple
2d20 + 6d6
Propriété | Taper | Description |
---|---|---|
taper | "diceexpressionroll" | Le type de lancer que cet objet représente. |
opérations | Array< DiceGroupMathOperation > | Les opérations à effectuer sur les rouleaux. |
ExpressionRoll
Représentation d'une expression mathématique. Cette interface étend GroupedRoll
.
Exemple
20 * 17
Propriété | Taper | Description |
---|---|---|
taper | "expressionroll" | Le type de lancer que cet objet représente. |
opérations | Array< MathOperation > | Les opérations à effectuer sur les rouleaux. |
MathFunctionRoll
Une représentation d'une fonction mathématique. Cette interface étend RollBase
.
Exemple
floor(20 / 17)
Propriété | Taper | Description |
---|---|---|
taper | "expressionfunc" | Le type de lancer que cet objet représente. |
op | MathFunction | Les opérations à effectuer sur les rouleaux. |
expression | RollBase | L'expression sur laquelle la fonction est appliquée. |
GroupRoll
Une représentation d'un groupe de rouleaux
Exemple
{4d6,3d6}. Cette interface étend
GroupedRoll
.
Propriété | Taper | Description |
---|---|---|
taper | "grouproll" | Le type de lancer que cet objet représente. |
DiceRollResult
Le résultat lancé par un groupe de dés. Cette interface étend RollBase
.
Exemple
6d20
Propriété | Taper | Description |
---|---|---|
mourir | RollBase | Le dé que représente ce résultat. |
taper | "die" | Le type de lancer que cet objet représente. |
rouleaux | DieRollBase [] | Chaque lancer de dé. |
compter | RollBase | Le nombre de lancers de dé. |
assorti | boolean | S'il s'agit d'un résultat de match. |
DieRollBase
Une interface intermédiaire étendue pour les rouleaux de dés individuels (voir ci-dessous). Cette interface étend RollBase
.
Propriété | Taper | Description |
---|---|---|
rouler | number | Le résultat du dé. |
assorti | boolean | Si ce jet correspond. |
DieRoll
Un jet sur un dé ordinaire. Cette interface étend DieRollBase
.
Exemple
d20
Propriété | Taper | Description |
---|---|---|
mourir | number | Le numéro du dé à lancer. |
taper | "roll" | Le type de lancer que cet objet représente. |
critique | CriticalType | Si ce rôle est un succès ou un échec critique (pour le rendu). |
FateDieRoll
Un jet sur un dé du destin. Cette interface étend DieRollBase
.
Exemple
dF
Propriété | Taper | Description |
---|---|---|
taper | "fateroll" | Le type de lancer que cet objet représente. |
Les interfaces suivantes sont exposées par la bibliothèque comme une représentation de la chaîne d'entrée analysée. La réponse de la méthode parse
est un objet RootType
et peut être n'importe laquelle des interfaces qui l'étendent.
ParsedObjectType
Une énumération des types de rouleaux valides. Les valeurs possibles sont :
"number"
"inline"
"success"
"failure"
"crit"
"critfail"
"match"
"keep"
"drop"
"group"
"diceExpression"
"sort"
"explode"
"compound"
"penetrate"
"reroll"
"rerollOnce"
"target"
"die"
"fate"
"expression"
"math"
"mathfunction"
ParsedType
Il s'agit de l'interface de base pour tous les types analysés.
Propriété | Taper | Description |
---|---|---|
taper | string | Type d'élément analysé que cet objet représente. |
RootType
Il s'agit de l'interface de base pour un sous-ensemble de types analysés, uniquement ceux qui peuvent être le type racine. Cet objet étend l'interface ParsedType
.
Propriété | Taper | Description |
---|---|---|
étiquette? | string | L'étiquette de texte attachée à ce rouleau. Cette propriété est facultative. |
racine | boolean | Un indicateur booléen pour indiquer s'il s'agit de la racine de l'arbre d'analyse. |
NumberType
Cet objet représente un nombre unique dans l'entrée. Cet objet étend l'interface RootType
.
Propriété | Taper | Description |
---|---|---|
taper | "number" | Type d'élément analysé que cet objet représente. |
valeur | number | La valeur du nombre. |
InlineExpression
Cet objet représente une expression de dés en ligne dans une chaîne, entourée de doubles crochets. Cet objet étend l'interface RootType
.
Exemple
I want to roll [[2d20]] dice
Propriété | Taper | Description |
---|---|---|
taper | "inline" | Type d'élément analysé que cet objet représente. |
expression | Expression | Expression qui a été analysée en tant que chaîne en ligne. |
AnyRoll
Un type combiné représentant n’importe quel jet valide. Il s'agit d'une combinaison des types suivants :
GroupedRoll
FullRoll
NumberType
ModGroupedRoll
Cet objet représente un jet groupé avec un modificateur facultatif. Cet objet étend l'interface RootType
.
Exemple
{4d6+3d8}kh1
Propriété | Taper | Description |
---|---|---|
mods | Array< KeepDropModType , SuccessFailureModType > | Les modificateurs à appliquer au jet groupé. |
SuccessFailureCritModType
Un objet représentant un modificateur de test de réussite. Cet objet étend l'interface ParsedType
. Un modificateur "success"
ou "failure"
convertit le résultat en un résultat de type réussite qui renvoie le nombre de lancers qui atteignent l'objectif. Un modificateur "crit"
ou "critfail"
teste le jet pour savoir si le jet doit ou non être affiché comme un succès critique ou un échec critique.
Exemple
Succès :
3d6>3
Échec :3d6f<3
Propriété | Taper | Description |
---|---|---|
taper | "success", "failure", "crit", "critfail" | Type d'élément analysé que cet objet représente. |
module | CompareOperation | Le type de contrôle à utiliser pour la condition. |
expression | RollExpression | Une expression représentant la condition de réussite. |
SuccessFailureModType
Équivalent au SuccessFailureCritModType
mais ne prenant en charge que les modificateurs « succès » et « échec ». Cet objet étend l'interface SuccessFailureCritModType
.
Exemple
Succès :
3d6>3
Échec :3d6f<3
Propriété | Taper | Description |
---|---|---|
taper | "success", "failure" | Type d'élément analysé que cet objet représente. |
module | CompareOperation | Le type de contrôle à utiliser pour la condition. |
expression | RollExpression | Une expression représentant la condition de réussite. |
MatchModType
Un objet représentant un modificateur de type de match, utilisé pour modifier l'affichage des dés sortis dans roll20. Cet objet étend l'interface ParsedType
.
Exemple
2d6m
Lorsqu'il est utilisé avec l'extension mt
, renverra le nombre de correspondances trouvées.
Exemple
20d6mt
Des arguments supplémentaires peuvent être spécifiés pour augmenter le nombre requis de correspondances ou pour ajouter une contrainte aux correspondances.
Exemple
20d6mt3 counts matches of 3 items
Exemple
20d6m>3 Only counts matches where the rolled value is > 3
Propriété | Taper | Description |
---|---|---|
taper | "match" | Type d'élément analysé que cet objet représente. |
min | NumberType | Le nombre minimum de correspondances à accepter. Cette propriété a la valeur par défaut 2 en tant que NumberType . |
compter | boolean | Faut-il ou non compter les matchs. |
modif ? | CompareOperation | Le type de contrôle à utiliser pour la condition de correspondance, si spécifié. Ce champ est facultatif. |
expr? | RollExpression | Expression représentant la condition de correspondance, si spécifiée. Ce champ est facultatif. |
KeepDropModType
Un objet représentant un modificateur de conservation ou de suppression, spécifiant un nombre de lancers de dés à conserver ou à abandonner, soit le lancer le plus élevé ou le plus bas. Cet objet étend l'interface ParsedType
.
Exemple
Donjon :
2d20kh1
Récupération :2d20dl1
Propriété | Taper | Description |
---|---|---|
taper | "keep", "drop" | Type d'élément analysé que cet objet représente. |
très bas | HighLowType | S'il faut conserver/abandonner le jet le plus élevé ou le plus bas. |
expression | RollExpression | Une expression représentant le nombre de lancers à conserver/abandonner. Cette propriété a la valeur par défaut 1 en tant que NumberType . Exemple : 2d6 |
GroupedRoll
Cet objet représente un groupe de lancers combinés, avec des modificateurs facultatifs. Cet objet étend l'interface ModGroupedRoll
.
Exemple
{2d6,3d6}
Propriété | Taper | Description |
---|---|---|
taper | "group" | Type d'élément analysé que cet objet représente. |
rouleaux | Array< RollExpression > | Le groupe de rouleaux inclus dans ce groupe. |
RollExpressionType
Un objet représentant une expression de lancer comprenant des lancers et des groupes complexes, autorise uniquement les opérations d'addition. Cet objet étend l'interface RootType
.
Exemple
{2d6,3d6}kh1 + {3d6 + 2d6}kh2
Propriété | Taper | Description |
---|---|---|
tête | RollOrExpression | Le roulement initial ou l'expression de l'expression de roulement. |
taper | "diceExpression" | Type d'élément analysé que cet objet représente. |
opérations | Array< MathType < RollOrExpression , DiceGroupMathOperation >> | Les opérations à appliquer au lancer ou à l'expression initiale. |
RollExpression
Une combinaison de type d'assistance d'une expression de jet complexe, d'un jet ou d'une expression mathématique. Représente les types suivants :
RollExpressionType
RollOrExpression
RollOrExpression
Une combinaison de type d'aide d'un jet ou d'une expression mathématique. Représente les types suivants :
FullRoll
Expression
FullRoll
Un objet représentant un lancer comprenant le lancer de dés et tous les modificateurs. Cet objet étend l'interface DiceRoll
.
Exemple
2d6kh1
Propriété | Taper | Description |
---|---|---|
des modifs ? | Array< ReRollMod , KeepDropModType > | Tous les modificateurs attachés au jet. Cette propriété est facultative. |
des cibles ? | Array< SuccessFailureCritModType > | Toute cible de réussite ou d’échec pour le jet. Cette propriété est facultative. |
correspondre? | MatchModTyp | Tous les modificateurs de correspondance pour le jet. Cette propriété est facultative. |
trier? | SortRollType | Toutes les opérations de tri à appliquer au rouleau. Cette propriété est facultative. |
SortRollType
Une opération de tri à appliquer à un rouleau. Cet objet étend l'interface ParsedType
.
Exemple
10d6sa
Propriété | Taper | Description |
---|---|---|
taper | "sort" | Type d'élément analysé que cet objet représente. |
asc | boolean | S'il faut trier par ordre croissant ou décroissant. |
ReRollMod
Un objet représentant une opération de relance à appliquer à un lancer. Il peut s'agir de l'un des types suivants :
"explode"
: relance tous les dés qui atteignent la cible, en continuant si le nouveau lancer correspond"compound"
: relance tous les dés qui atteignent l'objectif, en continuant si le nouveau lancer correspond et en ajoutant les résultats en un seul lancer"penetrate"
: relance tous les dés qui atteignent l'objectif en soustrayant 1 de la nouvelle valeur, en continuant si le nouveau lancer correspond"reroll"
: relance un dé tant qu'il atteint la cible, en gardant le lancer final"rerollOnce"
: relance un dé une fois s'il atteint la cible, en gardant le nouveau lancerExemple
2d6!
Propriété | Taper | Description |
---|---|---|
taper | "explode", "compound", "penetrate", "reroll", "rerollOnce" | Type d'élément analysé que cet objet représente. |
cible | TargetMod | Le modificateur cible avec lequel comparer la valeur du jet. |
TargetMod
Un objet représentant un modificateur de cible à appliquer à un jet. Cet objet étend l'interface ParsedType
.
Propriété | Taper | Description |
---|---|---|
taper | "target" | Type d'élément analysé que cet objet représente. |
module | CompareOperation | Le type de contrôle à utiliser pour la condition. |
valeur | RollExpr | Expression représentant la valeur de la condition cible. |
DiceRoll
La représentation d’un jet de dé. Cet objet étend l'interface RootType
.
Exemple
2d6
Propriété | Taper | Description |
---|---|---|
mourir | RollExpr , FateExpr | La valeur du dé sur lequel lancer le lancer peut être un dé du destin, un nombre ou une expression de lancer complexe. |
compter | RollExpr | Le nombre de fois pour lancer ce dé. |
taper | "die" | Type d'élément analysé que cet objet représente. |
FateExpr
La représentation d’un jet de dé du destin. Cet objet étend l'interface ParsedType
.
Exemple
2dF
Propriété | Taper | Description |
---|---|---|
taper | "fate" | Type d'élément analysé que cet objet représente. |
RollExpr
Combinaison de types d'assistance d'un nombre ou d'une valeur qui n'est pas une expression. Représente les types suivants :
MathExpression
NumberType
Expression
Une combinaison de types d’assistance de types d’expression. Représente les types suivants :
InlineExpression
MathExpression
MathExpression
Une expression de type mathématique entre deux ou plusieurs lancers de dés. Cet objet étend l'interface RootType
.
Exemple
2d6 + 3d6 * 4d6
Propriété | Taper | Description |
---|---|---|
tête | AnyRoll | Le jet initial contre lequel effectuer des opérations. |
taper | "expression" | Type d'élément analysé que cet objet représente. |
opérations | Array< MathType < AnyRoll >> | Les opérations à appliquer au lancer initial. |
MathType
Un objet représentant une opération mathématique de lancer à appliquer et la valeur à laquelle l'appliquer. Cet objet étend l'interface ParsedType
. L'interface de cet objet prend un type TailType
basé sur un modèle qui spécifie le type de la deuxième valeur utilisée dans l'opération. Il existe un deuxième type OpValues
basé sur un modèle qui spécifie le type d'opérations pouvant être utilisées. La valeur par défaut est Array<
MathOperation
>`.
Exemple
+ 3d6 (as part of 2d6 + 3d6)
Propriété | Taper | Description |
---|---|---|
taper | "math" | Type d'élément analysé que cet objet représente. |
op | OpValues | L'opération mathématique à effectuer. |
queue | TailType | Deuxième valeur à utiliser dans l'opération. |
MathFunctionExpression
Un objet représentant une fonction mathématique à appliquer et l'expression à laquelle l'appliquer. Cet objet étend l'interface RootType
.
Exemple
floor(3d6 / 2d4)
Propriété | Taper | Description |
---|---|---|
taper | "mathfunction" | Type d'élément analysé que cet objet représente. |
op | MathFunction | La fonction à appliquer. |
expression | AnyRoll | L’expression sur laquelle appliquer la fonction. |
Voici les types de support utilisés par les interfaces ci-dessus.
DiceGroupMathOperation
Un type d'assistance représentant les opérations valides pour une opération mathématique sur un groupe de dés.
"+" | "-"
MathOperation
Un type d'assistance représentant les opérations valides pour une opération mathématique.
"+" | "-" | "*" | "/" | "%" | "**"
MathFunction
Un type d'assistance représentant les opérations valides pour une opération mathématique.
"floor" | "ceil" | "round" | "abs"
CriticalType
Un type d'aide utilisé pour marquer un jet comme un succès ou un échec critique.
"success" | "failure" | null
CompareOperation
Un type d'assistance pour les opérations disponibles pour un point de comparaison.
">" | "<" | "="
HighLowType
Un type d'aide utilisé pour déterminer quels jets conserver ou abandonner.
"h" | "l" | null