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 ) ;
マクロの結果を確認してから使用するとよいでしょう。これを行うには、いくつかの方法があります。
1 つの方法では、 >>
演算子と<<
演算子を使用します。たとえば、 macro1
とmacro2
の間で大きい値を選択するには、 macro1>>macro2
と記述します。
より高度な方法には、グローバル マクロ インスタンスとローカル マクロ インスタンスが含まれます。
[]
はローカル マクロ インスタンスに使用されます。 {}
グローバル マクロ インスタンスに使用されます。
ローカル マクロ インスタンスの評価は、現在評価されているマクロ/式に対してのみ使用されます。たとえば、1d20 の結果が 20 だったのか、1 だったのか、それとも特定の値を超えていたのかを知りたい場合があります。これは次のように行うことができます: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
グローバル マクロ インスタンスの評価は、それらを参照するすべてのマクロに使用されます。これらは、より一般的な再利用可能なロールよりも、非常に焦点を絞ったアプリケーションで役立ちます。
ロールの結果として、能力の使用量を減らすなど、値を変更したい場合があります。あるいは、ロール中に値を追跡し、それを使用して次に何を行うかを決定することもできます。副作用があってもこれを行うことができます!
現在、次の 3 つの副作用のみがサポートされています。
:=
(代入)+=
(増分)-=
(減分)副作用を適用したい場合は、変数名の先頭に$
を付ける必要があります。
副作用と返したい結果の間に...
擬似演算子を使用できます。
上記のマクロを使用した場合の副作用の一例:
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 ) ;