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,則傳回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 ) ;