roll-a-d6
es una biblioteca de motor de lanzamiento de dados que admite macros y fórmulas sofisticadas que ningún otro rodillo de dados admite.
En esencia, tenemos el rodillo de dados: 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 ( ', ' ) ) ;
Los componentes del rodillo de dados incluyen el validador, el tokenizador, el analizador, el convertidor RPN y el evaluador. Para obtener más información, consulte los documentos de API aquí.
Un ejemplo de una tirada de dados más sofisticada que admite este paquete:
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 ] ) ;
Los rollos deben tener el formato x d y , por ejemplo, '1d20' o
Los operadores deben usarse infijos, por ejemplo, 5+7, aunque se evalúan como postfijos.
+, -, *, /
Mayor que ( >
), Menor que ( <
) y otros operadores similares ( <=
, >=
, ==
y <>
(no igual)) devuelven verdadero o falso.
Mayor de ( >>
) y menor de ( <<
) devuelven el valor apropiado, por ejemplo, 5<<7
devuelve 5
.
||
y &&
realizan las operaciones equivalentes.
->
y ;
son los equivalentes de entonces y más. Por ejemplo: 1d20>10->1d6;0
primero lanzará 1d20, luego comparará ese valor con 10. Si el valor es mayor que 10, lanzará 1d6 y devolverá el resultado de esa tirada. Si el valor es menor o igual a 10, devolverá 0.
Estos operadores le permiten rodar lo mismo muchas veces con facilidad. Por ejemplo, 4#+1d6
es el equivalente a 1d6+1d6+1d6+1d6
. Esto es distinto de 4*1d6 porque el primero no volverá a tirar esos dados; este último lo hará.
Se admiten los siguientes operadores:
#+
- Suma los resultados juntos#*
- Multiplica los resultados juntos#&
- AND ( &&
) los resultados juntos, devolviendo el último valor si todos son verdaderos, o el primer valor falso.#|
- O ( ||
) los resultados juntos, devolviendo el último valor si todos son falsos, o el primer valor verdadero. Prefijar una referencia de variable con ^
hará que se trate como 0 si no se pasó.
Al usar el nombre de una macro, puede evaluar esa macro en su fórmula. Las macros también pueden hacer referencia a otras macros.
Aquí hay un ejemplo simple:
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 ) ;
Es posible que desee comprobar el resultado de una macro y luego utilizarla. Hay un par de formas de hacer esto.
Una forma implica utilizar los operadores >>
y <<
. Por ejemplo, para elegir el valor más alto entre macro1
y macro2
, escribiría macro1>>macro2
.
La forma más avanzada implica macroinstancias globales y locales.
[]
se utiliza para instancias de macro locales. {}
se utiliza para instancias de macro globales.
Las evaluaciones de instancias de macros locales se utilizan solo para la macro/fórmula evaluada actualmente. Por ejemplo, es posible que desees saber si el resultado de 1d20 fue 20, 1 o si estuvo por encima de cierto valor. Puedes hacer esto así: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
Las evaluaciones de instancias de macros globales se utilizan para cada macro que hace referencia a ellas. Son más útiles en aplicaciones muy específicas que en rollos reutilizables más generales.
Como resultado de una tirada, es posible que desees cambiar algún valor, como disminuir el uso de una habilidad. Alternativamente, es posible que desee realizar un seguimiento de un valor durante una tirada y utilizarlo para determinar qué hacer a continuación. ¡Puedes hacer esto con efectos secundarios!
Actualmente, sólo se admiten tres efectos secundarios:
:=
(tarea)+=
(incremento)-=
(disminución) Si desea aplicar un efecto secundario, debe anteponer $
al nombre de la variable.
Puede utilizar el pseudooperador ...
entre un efecto secundario y el resultado que desea obtener.
Un ejemplo de efecto secundario, usando las macros de arriba:
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 ) ;