Этот ролик кубиков представляет собой анализатор строк, который возвращает объект, содержащий составные части броска игральных костей. Он поддерживает полную спецификацию Roll20 Dice. Он использует грамматику pegjs для создания представления формата броска игральных костей. Затем его можно преобразовать в простое числовое значение или в сложный объект, используемый для отображения полной информации о рулоне.
Это ответвление проекта dice_roller Бена Мортона. В нем было несколько ошибок, поэтому я публикую его повторно с исправлениями и функциями, необходимыми для моих проектов.
Установите библиотеку, используя:
npm install dice-roller-parser
После установки просто загрузите библиотеку либо в браузере:
< script src =" node_modules/dice-roller-parser/dist/index.js " > </ script >
Или в узле:
import { DiceRoller } from "dice-roller-parser" ;
Затем создайте новый экземпляр класса DiceRoller
и используйте его для выполнения некоторых бросков кубиков.
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 ) ;
Эта библиотека предоставляет два класса: DiceRoller
и DiscordRollRenderer
.
DiceRoller
Класс DiceRoller
управляет анализом строки игральной кости и выполняет броски на основе результата.
// Creates a new instance of the DiceRoller class
const roller = new DiceRoller ( ) ;
Конструктор по умолчанию использует Math.random
и применяет максимальное количество бросков на кубик, равное 1000. Их можно указать с помощью следующих перегрузок конструктора.
DiceRoller(GeneratorFunction)
Вы можете указать функцию, которая будет использоваться в качестве генератора случайных чисел при бросании игральных костей. Эта функция должна иметь тип () => number
и возвращать число от 0 до 1. По умолчанию она использует встроенный метод Math.random
.
// 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 ) ;
Его можно прочитать или изменить с помощью свойства randFunction
.
roller . randFunction = ( ) => 0.5 ;
DiceRoller(GeneratorFunction, MaxRollsPerDie)
Чтобы предотвратить попытки анализа очень большого количества бросков кубика, можно указать максимальное количество бросков кубика. По умолчанию установлено значение 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 ) ;
Его можно прочитать или изменить с помощью свойства maxRollCount
.
roller . maxRollCount = 75 ;
После создания класса DiceRoller
существует три варианта выполнения броска игральной кости:
rollValue
принимает входные данные строки кубика, анализирует их, выполняет бросок и возвращает результат вычисленного числового значения.
// 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 ) ;
roll
принимает входные данные строки кубика, анализирует их, выполняет бросок, а затем возвращает объект, представляющий бросок. Используя объекты прокрутки, вы можете создать собственную функцию отображения прокрутки, а не просто выводить окончательное значение.
// 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 } ` ) ;
Дополнительные сведения о возвращаемом объекте см. в выводе результата прокрутки в разделе «Типы вывода» ниже.
Метод parse
принимает входные данные строки кубика, анализирует их и возвращает представление анализируемых входных данных. Это можно использовать либо для броска кубика, либо для восстановления исходного ввода. rollParsed
принимает этот анализируемый результат в качестве входных данных, выполняет прокрутку и возвращает тот же результат, что и метод 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 } ` ) ;
Дополнительные сведения о возвращаемом объекте см. в разделе «Типы вывода» ниже в разделе «Типы вывода».
DiscordRollRenderer
Класс DiscordRollRenderer
— это пример класса средства визуализации, который принимает прокручиваемые входные данные, представленные объектом RollBase
, и преобразует их в строку в формате уценки, совместимом с Discord.
// Creates a new instance of the DiceRoller class
const renderer = new DiscordRollRenderer ( ) ;
DiscordRollRenderer
предоставляет один метод render
с одним параметром — объект RollBase
для рендеринга и возвращает визуализированную строку.
// 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 ) ;
Чтобы разработать эту библиотеку, просто клонируйте репозиторий, запустите установку:
npm install
Затем выполните сборку:
npm run build
Это делает четыре вещи:
# 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
Чтобы запустить набор тестов, используйте:
npm run test
Вот и все!
Следующие типы объектов являются выходными данными класса DiceRoller
и доступны в качестве интерфейсов для пользователей машинописного текста.
Объект, возвращаемый результатом броска, состоит из следующих типов.
RollBase
Базовый класс для всех бросков кубика, расширенный на основе свойства type.
Свойство | Тип | Описание |
---|---|---|
успех | boolean | Был ли бросок успешным для бросков целевого числа? Пример: 3d6 > 3 |
тип | RollType | Тип рулона, который представляет этот объект. |
действительный | boolean | Бросок все еще действителен и включен в расчеты? |
ценить | number | Выпавшее или рассчитанное значение этого броска. |
этикетка | string | Отображаемая этикетка для этого рулона. Это свойство является необязательным. |
заказ | number | Свойство, используемое для поддержания порядка бросков кубиков внутри групп. |
RollType
Перечисление допустимых типов рулона. Возможные значения:
"number"
"diceexpressionroll"
"expressionroll"
"mathfunction"
"grouproll"
"fate"
"die"
"roll"
"fateroll"
GroupedRoll
Промежуточный интерфейс расширен для групп игральных костей. Этот интерфейс расширяет RollBase
.
Свойство | Тип | Описание |
---|---|---|
кости | Array< RollBase > | Рулоны входят в эту группу. |
DiceExpressionRoll
Представление выражения игральной кости. Этот интерфейс расширяет GroupedRoll
.
Пример
2d20 + 6d6
Свойство | Тип | Описание |
---|---|---|
тип | "diceexpressionroll" | Тип рулона, который представляет этот объект. |
ОП | Array< DiceGroupMathOperation > | Операции, выполняемые с рулонами. |
ExpressionRoll
Представление математического выражения. Этот интерфейс расширяет GroupedRoll
.
Пример
20 * 17
Свойство | Тип | Описание |
---|---|---|
тип | "expressionroll" | Тип рулона, который представляет этот объект. |
ОП | Array< MathOperation > | Операции, выполняемые с рулонами. |
MathFunctionRoll
Представление математической функции. Этот интерфейс расширяет RollBase
.
Пример
floor(20 / 17)
Свойство | Тип | Описание |
---|---|---|
тип | "expressionfunc" | Тип рулона, который представляет этот объект. |
оп | MathFunction | Операции, выполняемые с рулонами. |
выражение | RollBase | Выражение, к которому применяется функция. |
GroupRoll
Изображение группы рулонов
Пример
{4d6,3d6}. Этот интерфейс расширяет
GroupedRoll
.
Свойство | Тип | Описание |
---|---|---|
тип | "grouproll" | Тип рулона, который представляет этот объект. |
DiceRollResult
Выпавший результат группы кубиков. Этот интерфейс расширяет RollBase
.
Пример
6d20
Свойство | Тип | Описание |
---|---|---|
умереть | RollBase | Кубик, который представляет этот результат. |
тип | "die" | Тип рулона, который представляет этот объект. |
рулоны | DieRollBase [] | Каждый бросок кубика. |
считать | RollBase | Количество бросков кубика. |
соответствует | boolean | Является ли это результатом матча. |
DieRollBase
Промежуточный интерфейс, расширенный для отдельных валков штампа (см. ниже). Этот интерфейс расширяет RollBase
.
Свойство | Тип | Описание |
---|---|---|
рулон | number | Выпавший результат кубика. |
соответствует | boolean | Совпадает ли этот бросок. |
DieRoll
Бросок на обычном игральном кубике. Этот интерфейс расширяет DieRollBase
.
Пример
d20
Свойство | Тип | Описание |
---|---|---|
умереть | number | Число кубиков, которое нужно бросить. |
тип | "roll" | Тип рулона, который представляет этот объект. |
критический | CriticalType | Если эта роль является критическим успехом или неудачей (для рендеринга). |
FateDieRoll
Бросок на кубике судьбы. Этот интерфейс расширяет DieRollBase
.
Пример
dF
Свойство | Тип | Описание |
---|---|---|
тип | "fateroll" | Тип рулона, который представляет этот объект. |
Следующие интерфейсы предоставляются библиотекой как повторное представление проанализированной входной строки. Ответ метода parse
является объектом RootType
и может представлять собой любой из расширяющих его интерфейсов.
ParsedObjectType
Перечисление допустимых типов рулона. Возможные значения:
"number"
"inline"
"success"
"failure"
"crit"
"critfail"
"match"
"keep"
"drop"
"group"
"diceExpression"
"sort"
"explode"
"compound"
"penetrate"
"reroll"
"rerollOnce"
"target"
"die"
"fate"
"expression"
"math"
"mathfunction"
ParsedType
Это базовый интерфейс для всех анализируемых типов.
Свойство | Тип | Описание |
---|---|---|
тип | string | Тип анализируемого элемента, который представляет этот объект. |
RootType
Это базовый интерфейс для подмножества анализируемых типов, только тех, которые могут быть корневым типом. Этот объект расширяет интерфейс ParsedType
.
Свойство | Тип | Описание |
---|---|---|
этикетка? | string | Текстовая метка, прикрепленная к этому рулону. Это свойство является необязательным. |
корень | boolean | Логический флаг, указывающий, является ли это корнем дерева синтаксического анализа. |
NumberType
Этот объект представляет одно число во входных данных. Этот объект расширяет интерфейс RootType
.
Свойство | Тип | Описание |
---|---|---|
тип | "number" | Тип анализируемого элемента, который представляет этот объект. |
ценить | number | Значение числа. |
InlineExpression
Этот объект представляет собой встроенное выражение кубика в строке, заключенное в двойные квадратные скобки. Этот объект расширяет интерфейс RootType
.
Пример
I want to roll [[2d20]] dice
Свойство | Тип | Описание |
---|---|---|
тип | "inline" | Тип анализируемого элемента, который представляет этот объект. |
выражение | Expression | Выражение, которое было проанализировано как встроенная строка. |
AnyRoll
Комбинированный тип, представляющий любой допустимый бросок. Это сочетание следующих типов:
GroupedRoll
FullRoll
NumberType
ModGroupedRoll
Этот объект представляет собой сгруппированный рулон с необязательным модификатором. Этот объект расширяет интерфейс RootType
.
Пример
{4d6+3d8}kh1
Свойство | Тип | Описание |
---|---|---|
моды | Array< KeepDropModType , SuccessFailureModType > | Модификаторы, которые будут применены к сгруппированному роллу. |
SuccessFailureCritModType
Объект, представляющий модификатор успешного теста. Этот объект расширяет интерфейс ParsedType
. Модификатор "success"
или "failure"
преобразует результат в результат типа успеха, который возвращает количество бросков, соответствующих цели. Модификатор "crit"
или "critfail"
проверяет бросок на то, должен ли бросок отображаться как критический успех или критический провал.
Пример
Успех:
3d6>3
Провал:3d6f<3
Свойство | Тип | Описание |
---|---|---|
тип | "success", "failure", "crit", "critfail" | Тип анализируемого элемента, который представляет этот объект. |
мод | CompareOperation | Тип проверки, используемый для условия. |
выражение | RollExpression | Выражение, представляющее условие успеха. |
SuccessFailureModType
Эквивалент SuccessFailureCritModType
, но поддерживает только модификаторы «успех» и «неуспех». Этот объект расширяет интерфейс SuccessFailureCritModType
.
Пример
Успех:
3d6>3
Провал:3d6f<3
Свойство | Тип | Описание |
---|---|---|
тип | "success", "failure" | Тип анализируемого элемента, который представляет этот объект. |
мод | CompareOperation | Тип проверки, используемый для условия. |
выражение | RollExpression | Выражение, представляющее условие успеха. |
MatchModType
Объект, представляющий модификатор типа соответствия, используемый для изменения отображения вывода игральной кости в Roll20. Этот объект расширяет интерфейс ParsedType
.
Пример
2d6m
При использовании с расширением mt
возвращает количество найденных совпадений.
Пример
20d6mt
Можно указать дополнительные аргументы, которые увеличивают необходимое количество совпадений или добавляют ограничение на совпадения.
Пример
20d6mt3 counts matches of 3 items
Пример
20d6m>3 Only counts matches where the rolled value is > 3
Свойство | Тип | Описание |
---|---|---|
тип | "match" | Тип анализируемого элемента, который представляет этот объект. |
мин | NumberType | Минимальное количество совпадений, которое можно принять. По умолчанию это свойство имеет значение 2 как NumberType . |
считать | boolean | Считать спички или нет. |
мод? | CompareOperation | Тип проверки, используемый для условия соответствия, если он указан. Это поле является необязательным. |
выражение? | RollExpression | Выражение, представляющее условие соответствия, если оно указано. Это поле является необязательным. |
KeepDropModType
Объект, представляющий модификатор сохранения или удаления, определяющий количество бросков кубиков, которые нужно сохранить или выбросить, либо самый высокий, либо самый низкий бросок. Этот объект расширяет интерфейс ParsedType
.
Пример
Хранить:
2d20kh1
Дроп:2d20dl1
Свойство | Тип | Описание |
---|---|---|
тип | "keep", "drop" | Тип анализируемого элемента, который представляет этот объект. |
высокий низкий | HighLowType | Оставить/отбросить самый высокий или самый низкий бросок. |
выражение | RollExpression | Выражение, обозначающее количество бросков, которые нужно оставить/выбросить. По умолчанию это свойство имеет значение 1 как NumberType . Пример: 2d6 |
GroupedRoll
Этот объект представляет собой группу объединенных бросков с дополнительными модификаторами. Этот объект расширяет интерфейс ModGroupedRoll
.
Пример
{2d6,3d6}
Свойство | Тип | Описание |
---|---|---|
тип | "group" | Тип анализируемого элемента, который представляет этот объект. |
рулоны | Array< RollExpression > | Группа роллов, входящая в эту группу. |
RollExpressionType
Объект, представляющий выражение прокрутки, включая сложные прокрутки и группы, допускает только операции сложения. Этот объект расширяет интерфейс RootType
.
Пример
{2d6,3d6}kh1 + {3d6 + 2d6}kh2
Свойство | Тип | Описание |
---|---|---|
голова | RollOrExpression | Начальный бросок или выражение для выражения броска. |
тип | "diceExpression" | Тип анализируемого элемента, который представляет этот объект. |
ОП | Array< MathType < RollOrExpression , DiceGroupMathOperation >> | Операции, применяемые к начальному броску или выражению. |
RollExpression
Комбинация вспомогательного типа сложного выражения прокрутки, прокрутки или математического выражения. Представляет следующие виды:
RollExpressionType
RollOrExpression
RollOrExpression
Комбинация вспомогательного типа, состоящая из броска или математического выражения. Представляет следующие виды:
FullRoll
Expression
FullRoll
Объект, представляющий бросок, включая бросок кубика и любые модификаторы. Этот объект расширяет интерфейс DiceRoll
.
Пример
2d6kh1
Свойство | Тип | Описание |
---|---|---|
моды? | Array< ReRollMod , KeepDropModType > | Любые модификаторы, прикрепленные к броску. Это свойство является необязательным. |
цели? | Array< SuccessFailureCritModType > | Любые успехи или неудачи являются целями броска. Это свойство является необязательным. |
соответствовать? | MatchModTyp | Любые модификаторы соответствия для броска. Это свойство является необязательным. |
сортировать? | SortRollType | Любые операции сортировки, которые можно применить к рулону. Это свойство является необязательным. |
SortRollType
Операция сортировки, применяемая к рулону. Этот объект расширяет интерфейс ParsedType
.
Пример
10d6sa
Свойство | Тип | Описание |
---|---|---|
тип | "sort" | Тип анализируемого элемента, который представляет этот объект. |
по возрастанию | boolean | Сортировать по возрастанию или по убыванию. |
ReRollMod
Объект, представляющий операцию повторного рулона, применяемую к рулону. Может быть одним из следующих типов:
"explode"
: перебрасывает все кубики, достигшие цели, и продолжает, если новый бросок соответствует цели."compound"
: перебрасывает все кубики, которые соответствуют цели, продолжает, если новый бросок совпадает, и суммирует результаты в один бросок."penetrate"
: перебрасывает все кубики, которые соответствуют цели, вычитая 1 из нового значения, продолжая, если новый бросок совпадает."reroll"
: перебрасывает кубик до тех пор, пока он не достигнет цели, сохраняя последний бросок."rerollOnce"
: перебрасывает кубик один раз, если он достигает цели, сохраняя новый бросок.Пример
2d6!
Свойство | Тип | Описание |
---|---|---|
тип | "explode", "compound", "penetrate", "reroll", "rerollOnce" | Тип анализируемого элемента, который представляет этот объект. |
цель | TargetMod | Целевой модификатор, с которым сравнивается значение броска. |
TargetMod
Объект, который заменяет целевой модификатор для применения к броску. Этот объект расширяет интерфейс ParsedType
.
Свойство | Тип | Описание |
---|---|---|
тип | "target" | Тип анализируемого элемента, который представляет этот объект. |
мод | CompareOperation | Тип проверки, используемый для условия. |
ценить | RollExpr | Выражение, представляющее целевое значение условия. |
DiceRoll
Представление броска кубика. Этот объект расширяет интерфейс RootType
.
Пример
2d6
Свойство | Тип | Описание |
---|---|---|
умереть | RollExpr , FateExpr | Значение кубика, против которого выполняется бросок, может быть кубиком судьбы, числом или сложным выражением броска. |
считать | RollExpr | Количество раз, за которое можно бросить этот кубик. |
тип | "die" | Тип анализируемого элемента, который представляет этот объект. |
FateExpr
Изображение броска кубика судьбы. Этот объект расширяет интерфейс ParsedType
.
Пример
2dF
Свойство | Тип | Описание |
---|---|---|
тип | "fate" | Тип анализируемого элемента, который представляет этот объект. |
RollExpr
Комбинация вспомогательного типа числа или значения, не являющаяся выражением. Представляет следующие виды:
MathExpression
NumberType
Expression
Комбинация типов выражений вспомогательного типа. Представляет следующие виды:
InlineExpression
MathExpression
MathExpression
Выражение математического типа между двумя или более бросками игральной кости. Этот объект расширяет интерфейс RootType
.
Пример
2d6 + 3d6 * 4d6
Свойство | Тип | Описание |
---|---|---|
голова | AnyRoll | Начальный бросок для выполнения операций. |
тип | "expression" | Тип анализируемого элемента, который представляет этот объект. |
ОП | Array< MathType < AnyRoll >> | Операции, которые следует применить к начальному рулону. |
MathType
Объект, представляющий применяемую математическую операцию прокрутки, и значение, к которому ее следует применить. Этот объект расширяет интерфейс ParsedType
. Интерфейс этого объекта принимает шаблонный тип TailType
, который определяет тип второго значения, используемого в операции. Существует второй шаблонный тип OpValues
, который определяет тип операций, которые можно использовать. По умолчанию это Array<
MathOperation
>`.
Пример
+ 3d6 (as part of 2d6 + 3d6)
Свойство | Тип | Описание |
---|---|---|
тип | "math" | Тип анализируемого элемента, который представляет этот объект. |
оп | OpValues | Математическая операция, которую необходимо выполнить. |
хвост | TailType | Второе значение, используемое в операции. |
MathFunctionExpression
Объект, представляющий математическую функцию, которую необходимо применить, и выражение, к которому ее следует применить. Этот объект расширяет интерфейс RootType
.
Пример
floor(3d6 / 2d4)
Свойство | Тип | Описание |
---|---|---|
тип | "mathfunction" | Тип анализируемого элемента, который представляет этот объект. |
оп | MathFunction | Функция, которую необходимо применить. |
выражение | AnyRoll | Выражение, к которому применяется функция. |
Ниже приведены типы поддержки, используемые вышеуказанными интерфейсами.
DiceGroupMathOperation
Вспомогательный тип, представляющий допустимые операции для математических операций над группой игральных костей.
"+" | "-"
MathOperation
Вспомогательный тип, представляющий допустимые операции для математической операции.
"+" | "-" | "*" | "/" | "%" | "**"
MathFunction
Вспомогательный тип, представляющий допустимые операции для математической операции.
"floor" | "ceil" | "round" | "abs"
CriticalType
Вспомогательный тип, используемый при пометке броска как критического успеха или неудачи.
"success" | "failure" | null
CompareOperation
Вспомогательный тип для доступных операций для точки сравнения.
">" | "<" | "="
HighLowType
Вспомогательный тип, используемый для определения того, какие броски оставить, а какие отбросить.
"h" | "l" | null