Este rolo de dados é um analisador de string que retorna um objeto contendo as partes componentes do lançamento de dados. Ele suporta a especificação completa de dados Roll20. Ele usa uma gramática pegjs para criar uma representação do formato de lançamento de dados. Isso pode então ser convertido em um valor numérico simples ou em um objeto complexo usado para exibir os detalhes completos do rolo.
Este é um fork do projeto dice_roller de Ben Morton. Tinha alguns bugs, então estou republicando com correções e recursos necessários para meus projetos.
Instale a biblioteca usando:
npm install dice-roller-parser
Depois de instalada, basta carregar a biblioteca, no navegador:
< script src =" node_modules/dice-roller-parser/dist/index.js " > </ script >
Ou no nó:
import { DiceRoller } from "dice-roller-parser" ;
Em seguida, crie uma nova instância da classe DiceRoller
e use-a para realizar algumas jogadas de dados.
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 ) ;
Esta biblioteca expõe duas classes, uma DiceRoller
e uma DiscordRollRenderer
.
DiceRoller
A classe DiceRoller
gerencia a análise de uma sequência de dados e a execução de jogadas com base no resultado.
// Creates a new instance of the DiceRoller class
const roller = new DiceRoller ( ) ;
O construtor padrão usa Math.random
e aplica um número máximo de lançamentos por dado de 1.000. Eles podem ser especificados usando as seguintes sobrecargas do construtor.
DiceRoller(GeneratorFunction)
Você pode especificar uma função a ser usada como gerador de números aleatórios pelo lançador de dados. Esta função deve ser do tipo () => number
e retornar um número entre 0 e 1. Por padrão, ela usa o método Math.random
integrado.
// 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 ) ;
Isso pode ser lido ou modificado usando a propriedade randFunction
.
roller . randFunction = ( ) => 0.5 ;
DiceRoller(GeneratorFunction, MaxRollsPerDie)
Para evitar a tentativa de analisar números muito grandes de lançamentos de dados, um número máximo de lançamentos para um dado pode ser especificado. O valor padrão é definido como 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 ) ;
Isso pode ser lido ou modificado usando a propriedade maxRollCount
.
roller . maxRollCount = 75 ;
Depois que a classe DiceRoller
for construída, existem três opções para realizar uma jogada de dados:
O método rollValue
recebe uma entrada de string de dados, analisa-a, executa uma jogada e retorna o resultado do valor numérico calculado.
// 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 ) ;
O método roll
recebe uma entrada de string de dados, analisa-a, executa uma jogada e então retorna um objeto que representa a jogada. Usando os objetos roll, você pode criar sua própria funcionalidade de exibição de rolo, em vez de apenas gerar o valor final.
// 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 } ` ) ;
Consulte a saída do resultado do rolo na seção de tipos de saída abaixo para obter mais detalhes sobre o objeto retornado.
O método parse
recebe uma entrada de string de dados, analisa-a e retorna uma representação da entrada analisada. Isso pode ser usado para realizar uma jogada de dados ou reconstruir a entrada original. O método rollParsed
toma esse resultado analisado como uma entrada, executa o roll e retorna a mesma saída do método 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 } ` ) ;
Consulte a saída roll analisada na seção de tipos de saída abaixo para obter mais detalhes sobre o objeto retornado.
DiscordRollRenderer
A classe DiscordRollRenderer
é um exemplo de classe renderizadora que pega uma entrada rolada representada por um objeto RollBase
e a renderiza em uma string em um formato markdown, compatível com Discord.
// Creates a new instance of the DiceRoller class
const renderer = new DiscordRollRenderer ( ) ;
O DiscordRollRenderer
expõe um único método render
com um único parâmetro, o objeto RollBase
a ser renderizado, e retorna a string renderizada.
// 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 ) ;
Para desenvolver esta biblioteca, basta clonar o repositório e executar uma instalação:
npm install
Então faça uma compilação:
npm run build
Isso faz quatro coisas:
# 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
Para executar o conjunto de testes, use:
npm run test
Isso é tudo que há para fazer!
Os seguintes tipos de objetos são gerados pela classe DiceRoller
e estão disponíveis como interfaces para usuários de texto digitado.
O objeto retornado por um resultado de rolagem é composto dos seguintes tipos.
RollBase
A classe base para todas as jogadas de dados, estendida com base na propriedade type.
Propriedade | Tipo | Descrição |
---|---|---|
sucesso | boolean | O lançamento foi um sucesso, para lançamentos de números alvo. Exemplo: 3d6 > 3 |
tipo | RollType | O tipo de rolagem que este objeto representa. |
válido | boolean | A rolagem ainda é válida e está incluída nos cálculos. |
valor | number | O valor rolado ou calculado deste lançamento. |
rótulo | string | A etiqueta de exibição deste rolo. Esta propriedade é opcional. |
ordem | number | Uma propriedade usada para manter a ordem das jogadas de dados dentro dos grupos. |
RollType
Uma enumeração dos tipos válidos de rolagem. Os valores possíveis são:
"number"
"diceexpressionroll"
"expressionroll"
"mathfunction"
"grouproll"
"fate"
"die"
"roll"
"fateroll"
GroupedRoll
Uma interface intermediária estendida para grupos de dados. Esta interface estende RollBase
.
Propriedade | Tipo | Descrição |
---|---|---|
dados | Array< RollBase > | Os rolos incluídos como parte deste grupo. |
DiceExpressionRoll
Uma representação de uma expressão de dados. Esta interface estende GroupedRoll
.
Exemplo
2d20 + 6d6
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "diceexpressionroll" | O tipo de rolagem que este objeto representa. |
operações | Array< DiceGroupMathOperation > | As operações a serem realizadas nos rolos. |
ExpressionRoll
Uma representação de uma expressão matemática. Esta interface estende GroupedRoll
.
Exemplo
20 * 17
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "expressionroll" | O tipo de rolagem que este objeto representa. |
operações | Array< MathOperation > | As operações a serem realizadas nos rolos. |
MathFunctionRoll
Uma representação de uma função matemática. Esta interface estende RollBase
.
Exemplo
floor(20 / 17)
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "expressionfunc" | O tipo de rolagem que este objeto representa. |
operação | MathFunction | As operações a serem realizadas nos rolos. |
expressão | RollBase | A expressão à qual a função é aplicada. |
GroupRoll
Uma representação de um grupo de rolos
Exemplo
{4d6,3d6}. Esta interface estende
GroupedRoll
.
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "grouproll" | O tipo de rolagem que este objeto representa. |
DiceRollResult
O resultado lançado de um grupo de dados. Esta interface estende RollBase
.
Exemplo
6d20
Propriedade | Tipo | Descrição |
---|---|---|
morrer | RollBase | O dado que este resultado representa. |
tipo | "die" | O tipo de rolagem que este objeto representa. |
rolos | DieRollBase [] | Cada lançamento do dado. |
contar | RollBase | O número de lançamentos do dado. |
combinado | boolean | Se este é um resultado de partida. |
DieRollBase
Uma interface intermediária estendida para rolos de matrizes individuais (veja abaixo). Esta interface estende RollBase
.
Propriedade | Tipo | Descrição |
---|---|---|
rolar | number | O resultado rolado do dado. |
combinado | boolean | Se este lançamento é compatível. |
DieRoll
Um lançamento em um dado normal. Esta interface estende DieRollBase
.
Exemplo
d20
Propriedade | Tipo | Descrição |
---|---|---|
morrer | number | O número do dado a ser lançado. |
tipo | "roll" | O tipo de rolagem que este objeto representa. |
crítico | CriticalType | Se esta função for um sucesso ou fracasso crítico (para renderização). |
FateDieRoll
Uma rolagem em um dado de destino. Esta interface estende DieRollBase
.
Exemplo
dF
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "fateroll" | O tipo de rolagem que este objeto representa. |
As interfaces a seguir são expostas pela biblioteca como uma representação da string de entrada analisada. A resposta do método parse
é um objeto RootType
e pode ser qualquer uma das interfaces que o estendem.
ParsedObjectType
Uma enumeração dos tipos válidos de rolagem. Os valores possíveis são:
"number"
"inline"
"success"
"failure"
"crit"
"critfail"
"match"
"keep"
"drop"
"group"
"diceExpression"
"sort"
"explode"
"compound"
"penetrate"
"reroll"
"rerollOnce"
"target"
"die"
"fate"
"expression"
"math"
"mathfunction"
ParsedType
Esta é a interface base para todos os tipos analisados.
Propriedade | Tipo | Descrição |
---|---|---|
tipo | string | O tipo de item analisado que este objeto representa. |
RootType
Esta é a interface base para um subconjunto de tipos analisados, apenas aqueles que podem ser do tipo raiz. Este objeto estende a interface ParsedType
.
Propriedade | Tipo | Descrição |
---|---|---|
rótulo? | string | A etiqueta de texto anexada a este rolo. Esta propriedade é opcional. |
raiz | boolean | Um sinalizador booleano para indicar se esta é a raiz da árvore de análise. |
NumberType
Este objeto representa um único número na entrada. Este objeto estende a interface RootType
.
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "number" | O tipo de item analisado que este objeto representa. |
valor | number | O valor do número. |
InlineExpression
Este objeto representa uma expressão de dados embutida em uma string, colocada entre colchetes duplos. Este objeto estende a interface RootType
.
Exemplo
I want to roll [[2d20]] dice
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "inline" | O tipo de item analisado que este objeto representa. |
expressão | Expression | A expressão que foi analisada como a cadeia de caracteres embutida. |
AnyRoll
Um tipo combinado que representa qualquer rolagem válida. Esta é uma combinação dos seguintes tipos:
GroupedRoll
FullRoll
NumberType
ModGroupedRoll
Este objeto representa uma rolagem agrupada com um modificador opcional. Este objeto estende a interface RootType
.
Exemplo
{4d6+3d8}kh1
Propriedade | Tipo | Descrição |
---|---|---|
moda | Array< KeepDropModType , SuccessFailureModType > | Os modificadores a serem aplicados à rolagem agrupada. |
SuccessFailureCritModType
Um objeto que representa um modificador de teste de sucesso. Este objeto estende a interface ParsedType
. Um modificador de "success"
ou "failure"
converte o resultado em um resultado do tipo sucesso que retorna o número de lançamentos que atendem à meta. Um modificador "crit"
ou "critfail"
testa o teste para saber se o teste deve ou não ser exibido como um sucesso crítico ou uma falha crítica.
Exemplo
Sucesso:
3d6>3
Falha:3d6f<3
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "success", "failure", "crit", "critfail" | O tipo de item analisado que este objeto representa. |
moda | CompareOperation | O tipo de verificação a ser usado para a condição. |
expressão | RollExpression | Uma expressão que representa a condição de sucesso. |
SuccessFailureModType
Equivalente ao SuccessFailureCritModType
, mas suportando apenas modificadores de "sucesso" e "falha". Este objeto estende a interface SuccessFailureCritModType
.
Exemplo
Sucesso:
3d6>3
Falha:3d6f<3
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "success", "failure" | O tipo de item analisado que este objeto representa. |
moda | CompareOperation | O tipo de verificação a ser usado para a condição. |
expressão | RollExpression | Uma expressão que representa a condição de sucesso. |
MatchModType
Um objeto que representa um modificador de tipo de correspondência, usado para modificar a exibição da saída dos dados em roll20. Este objeto estende a interface ParsedType
.
Exemplo
2d6m
Quando usado com a extensão mt
, retornará o número de correspondências encontradas.
Exemplo
20d6mt
Argumentos adicionais podem ser especificados para aumentar o número necessário de correspondências ou para adicionar uma restrição às correspondências.
Exemplo
20d6mt3 counts matches of 3 items
Exemplo
20d6m>3 Only counts matches where the rolled value is > 3
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "match" | O tipo de item analisado que este objeto representa. |
min | NumberType | O número mínimo de correspondências a serem aceitas. O padrão desta propriedade é 2 como NumberType . |
contar | boolean | Contar ou não as partidas. |
moda? | CompareOperation | O tipo de verificação a ser usado para a condição de correspondência, se especificado. Este campo é opcional. |
expr? | RollExpression | Uma expressão que representa a condição de correspondência, se especificada. Este campo é opcional. |
KeepDropModType
Um objeto que representa um modificador de manter ou descartar, especificando um número de lançamentos de dados para manter ou descartar, sejam os lançamentos mais altos ou mais baixos. Este objeto estende a interface ParsedType
.
Exemplo
Manter:
2d20kh1
Queda:2d20dl1
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "keep", "drop" | O tipo de item analisado que este objeto representa. |
destaque | HighLowType | Seja para manter/descartar o lançamento mais alto ou mais baixo. |
expressão | RollExpression | Uma expressão que representa o número de lançamentos a serem mantidos/descartados. O padrão desta propriedade é 1 como NumberType . Exemplo: 2d6 |
GroupedRoll
Este objeto representa um grupo de jogadas combinadas, com modificadores opcionais. Este objeto estende a interface ModGroupedRoll
.
Exemplo
{2d6,3d6}
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "group" | O tipo de item analisado que este objeto representa. |
rolos | Array< RollExpression > | O grupo de rolos incluídos neste grupo. |
RollExpressionType
Um objeto que representa uma expressão roll incluindo rolls e grupos complexos permite apenas operações de adição. Este objeto estende a interface RootType
.
Exemplo
{2d6,3d6}kh1 + {3d6 + 2d6}kh2
Propriedade | Tipo | Descrição |
---|---|---|
cabeça | RollOrExpression | O roll ou expressão inicial da expressão roll. |
tipo | "diceExpression" | O tipo de item analisado que este objeto representa. |
operações | Array< MathType < RollOrExpression , DiceGroupMathOperation >> | As operações a serem aplicadas à rolagem ou expressão inicial. |
RollExpression
Uma combinação de tipo auxiliar de uma expressão roll complexa, uma roll ou uma expressão matemática. Representa os seguintes tipos:
RollExpressionType
RollOrExpression
RollOrExpression
Uma combinação de tipo auxiliar de um rolo ou uma expressão matemática. Representa os seguintes tipos:
FullRoll
Expression
FullRoll
Um objeto que representa uma jogada incluindo a jogada de dados e quaisquer modificadores. Este objeto estende a interface DiceRoll
.
Exemplo
2d6kh1
Propriedade | Tipo | Descrição |
---|---|---|
mods? | Array< ReRollMod , KeepDropModType > | Quaisquer modificadores anexados ao teste. Esta propriedade é opcional. |
alvos? | Array< SuccessFailureCritModType > | Quaisquer alvos de sucesso ou falha para o teste. Esta propriedade é opcional. |
corresponder? | MatchModTyp | Quaisquer modificadores de correspondência para a rolagem. Esta propriedade é opcional. |
organizar? | SortRollType | Quaisquer operações de classificação a serem aplicadas à rolagem. Esta propriedade é opcional. |
SortRollType
Uma operação de classificação a ser aplicada a um rolo. Este objeto estende a interface ParsedType
.
Exemplo
10d6sa
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "sort" | O tipo de item analisado que este objeto representa. |
asc | boolean | Se deve classificar em ordem crescente ou decrescente. |
ReRollMod
Um objeto que representa uma operação de nova rolagem a ser aplicada a uma rolagem. Pode ser um dos seguintes tipos:
"explode"
: lança novamente quaisquer dados que atendam ao alvo, continuando se o novo lançamento corresponder"compound"
: lança novamente quaisquer dados que atendam ao alvo, continuando se o novo lançamento corresponder e adicionando os resultados em um único lançamento"penetrate"
: lança novamente quaisquer dados que atendam ao alvo, subtraindo 1 do novo valor, continuando se o novo lançamento corresponder"reroll"
: relança um dado desde que atinja o alvo, mantendo o lançamento final"rerollOnce"
: lança novamente um dado uma vez se atingir o alvo, mantendo a nova jogadaExemplo
2d6!
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "explode", "compound", "penetrate", "reroll", "rerollOnce" | O tipo de item analisado que este objeto representa. |
alvo | TargetMod | O modificador de destino com o qual comparar o valor da rolagem. |
TargetMod
Um objeto que representa um modificador de destino a ser aplicado a uma rolagem. Este objeto estende a interface ParsedType
.
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "target" | O tipo de item analisado que este objeto representa. |
moda | CompareOperation | O tipo de verificação a ser usado para a condição. |
valor | RollExpr | Uma expressão que representa o valor da condição de destino. |
DiceRoll
A representação de um lançamento de dados. Este objeto estende a interface RootType
.
Exemplo
2d6
Propriedade | Tipo | Descrição |
---|---|---|
morrer | RollExpr , FateExpr | O valor do dado a ser rolado pode ser um dado de destino, um número ou uma expressão de rolagem complexa. |
contar | RollExpr | O número de tempo para lançar este dado. |
tipo | "die" | O tipo de item analisado que este objeto representa. |
FateExpr
A representação de uma jogada de dado de destino. Este objeto estende a interface ParsedType
.
Exemplo
2dF
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "fate" | O tipo de item analisado que este objeto representa. |
RollExpr
Uma combinação de tipo auxiliar de um número ou valor que não é uma expressão. Representa os seguintes tipos:
MathExpression
NumberType
Expression
Uma combinação de tipo auxiliar de tipos de expressão. Representa os seguintes tipos:
InlineExpression
MathExpression
MathExpression
Uma expressão de tipo matemático entre dois ou mais lançamentos de dados. Este objeto estende a interface RootType
.
Exemplo
2d6 + 3d6 * 4d6
Propriedade | Tipo | Descrição |
---|---|---|
cabeça | AnyRoll | A jogada inicial para realizar operações. |
tipo | "expression" | O tipo de item analisado que este objeto representa. |
operações | Array< MathType < AnyRoll >> | As operações a serem aplicadas ao lançamento inicial. |
MathType
Um objeto que representa uma operação matemática de rolagem a ser aplicada e o valor ao qual aplicá-la. Este objeto estende a interface ParsedType
. A interface para este objeto usa um tipo de modelo TailType
que especifica o tipo do segundo valor usado na operação. Existe um segundo tipo de modelo OpValues
que especifica o tipo de operações que podem ser usadas. O padrão é Array<
MathOperation
>`.
Exemplo
+ 3d6 (as part of 2d6 + 3d6)
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "math" | O tipo de item analisado que este objeto representa. |
operação | OpValues | A operação matemática a ser executada. |
cauda | TailType | O segundo valor a ser usado na operação. |
MathFunctionExpression
Um objeto que representa uma função matemática a ser aplicada e a expressão à qual aplicá-la. Este objeto estende a interface RootType
.
Exemplo
floor(3d6 / 2d4)
Propriedade | Tipo | Descrição |
---|---|---|
tipo | "mathfunction" | O tipo de item analisado que este objeto representa. |
operação | MathFunction | A função a ser aplicada. |
expressão | AnyRoll | A expressão à qual aplicar a função. |
A seguir estão os tipos de suporte usados pelas interfaces acima.
DiceGroupMathOperation
Um tipo auxiliar que representa as operações válidas para uma operação matemática em um grupo de dados.
"+" | "-"
MathOperation
Um tipo auxiliar que representa as operações válidas para uma operação matemática.
"+" | "-" | "*" | "/" | "%" | "**"
MathFunction
Um tipo auxiliar que representa as operações válidas para uma operação matemática.
"floor" | "ceil" | "round" | "abs"
CriticalType
Um tipo auxiliar usado ao marcar um teste como um sucesso ou fracasso crítico.
"success" | "failure" | null
CompareOperation
Um tipo auxiliar para as operações disponíveis para um ponto de comparação.
">" | "<" | "="
HighLowType
Um tipo auxiliar usado para determinar quais jogadas manter ou descartar.
"h" | "l" | null