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 ( &&
) результаты вместе, возвращая последнее значение, если все они правдивы, или первое ложное значение.#|
- ИЛИ ( ||
) результаты вместе, возвращая последнее значение, если все они ложны, или первое истинное значение. Префикс ссылки на переменную с помощью ^
приведет к тому, что она будет обработана как 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 ) ;