该骰子滚轴是一个字符串解析器,它返回包含骰子滚轴组成部分的对象。它支持完整的 Roll20 Dice 规范。它使用 pegjs 语法来创建骰子滚动格式的表示。然后可以将其转换为简单的数值,或转换为用于显示完整卷详细信息的复杂对象。
这是 Ben Morton 的 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 兼容的 markdown 格式的字符串。
// 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
所有骰子的基类,根据类型属性进行扩展。
财产 | 类型 | 描述 |
---|---|---|
成功 | 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