roll-a-d6
是一个骰子滚动引擎库,支持其他骰子滚轮不支持的复杂宏和公式。
其核心是骰子滚轮: rollFormula(formula, macrosObject)
import * as d6 from 'roll-a-d6' ;
const roll = d6 . rollFormula ( '1d20+Strength,1d8+Strength' , { Strength : '5' } ) ;
console . log ( roll . result . join ( ', ' ) ) ;
骰子滚轮的组件包括验证器、分词器、解析器、RPN 转换器和评估器。有关更多信息,请查看此处的 API 文档。
该包支持的更复杂的掷骰子示例:
import * as d6 from 'roll-a-d6' ;
const macros = {
roll : 'r=1d20,(^adv&&^disadv)||(adv==0&&disadv==0)->r[0];(adv->r[0]>>r[1];r[0]<<r[1])' ,
atk : 'roll[0]==20->dmgDice[0]+dmgDice[1]+dmgMod;(roll[0]==1->0;roll[0]+bonus>ac@Defender->dmgDice[0]+dmgMod;0)' ,
bonus : 'prof+dmgMod' ,
shortSword : '1d6,dmgMod=Dex>>Str' ,
sneakAttack : '3d6' ,
sneakAttackIfPossible : 'canYouSneakAttack->sneakAttack;0' ,
Str : '10' ,
Dex : '18' ,
prof : '3' ,
} ;
const roll = d6 . rollFormula ( 'ac@Defender=?,canYouSneakAttack=1,dmgDice=shortSword,(atk[0]+atk[1])>0->(atk[0]+atk[1]+sneakAttackIfPossible);0' , macros ) ;
// now I know the attacker's AC is 15
const foundResult = roll . result . find ( ( { minValue , maxValue } ) => minValue <= 15 && ! ( maxValue < 15 ) ) ;
console . log ( foundResult [ 0 ] ) ;
卷的格式应为x d y ,例如 '1d20' 或
运算符应该使用中缀,例如 5+7,尽管它们是后缀计算的。
+、-、*、/
大于 ( >
)、小于 ( <
) 和其他类似运算符( <=
、 >=
、 ==
和<>
(不等于))返回 true 或 false。
大于 ( >>
) 和小于 ( <<
) 返回适当的值,例如5<<7
返回5
。
||
和&&
执行等效操作。
->
和;
相当于 then 和 else。例如: 1d20>10->1d6;0
将首先掷1d20,然后将该值与10进行比较。如果该值大于10,它将掷1d6并返回该掷的结果。如果该值小于或等于10,则返回0。
这些运算符使您可以轻松地多次滚动同一事物。例如, 4#+1d6
相当于1d6+1d6+1d6+1d6
。这与 4*1d6 不同,因为前者不会重新掷骰子;后者会的。
支持以下运算符:
#+
- 将结果相加#*
- 将结果相乘#&
- AND ( &&
) 将结果放在一起,如果全部为真,则返回最后一个值,否则返回第一个假值。#|
- OR ( ||
) 将结果放在一起,如果所有结果都是假值,则返回最后一个值,或者返回第一个真值。 如果变量引用没有传入,则在变量引用前面加上^
会导致其被视为 0。
通过使用宏的名称,您可以在公式中计算该宏。宏还可以引用其他宏。
这是一个简单的例子:
import * as d6 from 'roll-a-d6' ;
const macros = {
macro : '1d20>10->helperMacro;0' ,
helperMacro : '1d10+5' ,
} ;
const formula = 'macro+macro' ;
const roll = d6 . rollFormula ( formula , macros ) ;
您可能想检查宏的结果然后使用它。有几种方法可以做到这一点。
一种方法涉及使用>>
和<<
运算符。例如,要选择macro1
和macro2
之间较高的值,您可以编写macro1>>macro2
。
更高级的方式涉及全局和局部宏实例。
[]
用于本地宏实例。 {}
用于全局宏实例。
本地宏实例评估仅用于当前评估的宏/公式。例如,您可能想知道 1d20 的结果是 20、1 还是高于某个值。你可以这样做: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
全局宏实例评估用于引用它们的每个宏。它们在非常集中的应用中比在更一般的可重复使用的卷中更有用。
作为掷骰的结果,您可能想要更改某些值,例如减少对某项能力的使用。或者,您可能希望在掷骰过程中跟踪一个值并使用它来确定下一步要做什么。你可以做到这一点,但有副作用!
目前,仅支持三种副作用:
:=
(赋值)+=
(增量)-=
(递减)如果您希望应用副作用,则必须在变量名称前加上$
前缀。
您可以在副作用和要返回的结果之间使用...
伪运算符。
使用上面的宏的副作用的一个示例:
const myMacros = {
... macros ,
sneakAttack : '3d6' ,
sneakAttackIfPossible : 'canSneakAttack>0->$canSneakAttack:=0...sneakAttack;0' ,
attackWithSneakAttack : 'atk[0]>0->atk[0]+sneakAttackIfPossible;0' ,
} ;
const formula = 'canSneakAttack=1,2#+attackWithSneakAttack' ;
d6 . rollFormula ( formula , myMacros ) ;