このダイス ローラーは、ダイス ロールのコンポーネント部分を含むオブジェクトを返す文字列パーサーです。 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
という 2 つのクラスを公開します。
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
クラスが構築されたら、サイコロロールを実行するには 3 つのオプションがあります。
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
、単一のパラメーター (レンダリングするRollBase
オブジェクト) を持つ単一のrender
メソッドを公開し、レンダリングされた文字列を返します。
// 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
これにより次の 4 つのことが行われます。
# 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
クラスから出力され、typescript ユーザーのインターフェイスとして使用できます。
ロール結果によって返されるオブジェクトは次の型で構成されます。
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
と同等ですが、「success」および「failure」修飾子のみをサポートします。このオブジェクトは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 | 受け入れる一致の最小数。このプロパティのデフォルトはNumberType として 2 です。 |
カウント | boolean | 一致をカウントするかどうか。 |
モッド? | CompareOperation | 指定されている場合、一致条件に使用するチェック タイプ。このフィールドはオプションです。 |
表現? | RollExpression | 一致条件を表す式 (指定されている場合)。このフィールドはオプションです。 |
KeepDropModType
キープまたはドロップ修飾子を表すオブジェクト。キープまたはドロップするサイコロの出目の数 (最高または最低のロールのいずれか) を指定します。このオブジェクトはParsedType
インターフェイスを拡張します。
例
キープ:
2d20kh1
ドロップ:2d20dl1
財産 | タイプ | 説明 |
---|---|---|
タイプ | "keep", "drop" | このオブジェクトが表す解析済みアイテムのタイプ。 |
ハイロー | HighLowType | 最高または最低のロールを維持するかドロップするか。 |
式 | RollExpression | 保持/ドロップするロールの数を表す式。このプロパティのデフォルトはNumberType として 1 です。例: 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"
: ターゲットを満たすサイコロを再ロールし、新しいロールが一致する場合は続行し、結果を 1 つのロールに追加します。"penetrate"
: 新しい値から 1 を引いてターゲットを満たすサイコロを再ロールし、新しいロールが一致する場合は続行します。"reroll"
: 目標を達成する限りサイコロを再ロールし、最後のロールを維持します。"rerollOnce"
: 目標を満たした場合、新しいロールを維持したまま、サイコロを 1 回再ロールします。例
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
2 つ以上のサイコロの出目間の数学タイプの式。このオブジェクトはRootType
インターフェイスを拡張します。
例
2d6 + 3d6 * 4d6
財産 | タイプ | 説明 |
---|---|---|
頭 | AnyRoll | 操作を実行する最初のロール。 |
タイプ | "expression" | このオブジェクトが表す解析済みアイテムのタイプ。 |
作戦 | Array< MathType < AnyRoll >> | 最初のロールに適用する操作。 |
MathType
適用されるロール演算演算とそれを適用する値を表すオブジェクト。このオブジェクトはParsedType
インターフェイスを拡張します。このオブジェクトのインターフェイスは、操作で使用される 2 番目の値の型を指定するテンプレート型TailType
を取ります。使用できる操作のタイプを指定する 2 番目のテンプレート タイプOpValues
があります。これのデフォルトはArray<
MathOperation
>` です。
例
+ 3d6 (as part of 2d6 + 3d6)
財産 | タイプ | 説明 |
---|---|---|
タイプ | "math" | このオブジェクトが表す解析済みアイテムのタイプ。 |
オプ | OpValues | 実行する数学演算。 |
しっぽ | TailType | 操作で使用する 2 番目の値。 |
MathFunctionExpression
適用される数学関数とそれを適用する式を表すオブジェクト。このオブジェクトはRootType
インターフェイスを拡張します。
例
floor(3d6 / 2d4)
財産 | タイプ | 説明 |
---|---|---|
タイプ | "mathfunction" | このオブジェクトが表す解析済みアイテムのタイプ。 |
オプ | MathFunction | 適用される関数。 |
式 | AnyRoll | 関数を適用する式。 |
以下は、上記のインターフェイスで使用されるサポート タイプです。
DiceGroupMathOperation
サイコロのグループに対する数学演算の有効な演算を表すヘルパー タイプ。
"+" | "-"
MathOperation
数学演算の有効な演算を表すヘルパー タイプ。
"+" | "-" | "*" | "/" | "%" | "**"
MathFunction
数学演算の有効な演算を表すヘルパー タイプ。
"floor" | "ceil" | "round" | "abs"
CriticalType
ロールを重要な成功または失敗としてマークするときに使用されるヘルパー タイプ。
"success" | "failure" | null
CompareOperation
比較ポイントで使用できる操作のヘルパー タイプ。
">" | "<" | "="
HighLowType
どのロールを保持または削除するかを決定するために使用されるヘルパー タイプ。
"h" | "l" | null