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' أو
يجب استخدام عوامل التشغيل infix، على سبيل المثال، 5+7، على الرغم من تقييمها بعد الإصلاح.
+، -، *، /
أكبر من ( >
)، وأقل من ( <
)، وغيرها من العوامل المشابهة ( <=
، >=
، ==
، و <>
(غير متساوية)) تُرجع صوابًا أو خطأ.
الأكبر من ( >>
) والأقل من ( <<
) يُرجع القيمة المناسبة، على سبيل المثال، 5<<7
يُرجع 5
.
||
و &&
تنفيذ العمليات المكافئة.
->
و ;
هي معادلات ثم وآخر. على سبيل المثال: 1d20>10->1d6;0
سوف يتدحرج أولاً إلى 1d20، ثم يقارن هذه القيمة بـ 10. إذا كانت القيمة أكبر من 10، فسوف يتدحرج 1d6 ويعيد نتيجة هذا اللفة. إذا كانت القيمة أقل من أو تساوي 10، فستُرجع 0.
تسمح لك هذه العوامل بتدوير نفس الشيء عدة مرات بسهولة. على سبيل المثال، 4#+1d6
يعادل 1d6+1d6+1d6+1d6
. وهذا يختلف عن 4*1d6 لأن الأول لن يقوم بإعادة رمي النرد؛ هذا الأخير سوف.
يتم دعم عوامل التشغيل التالية:
#+
- جمع النتائج معًا#*
- اضرب النتائج معًا#&
- AND ( &&
) النتائج معًا، مع إرجاع القيمة الأخيرة إذا كانت جميعها صحيحة، أو القيمة الأولى الخاطئة.#|
- أو ( ||
) النتائج معًا، مع إرجاع القيمة الأخيرة إذا كانت جميعها خاطئة، أو القيمة الصحيحة الأولى. ستؤدي إضافة مرجع متغير بـ ^
إلى معاملته على أنه 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 ) ;