roll-a-d6
ist eine Würfelwürfel-Engine-Bibliothek, die anspruchsvolle Makros und Formeln unterstützt, die kein anderer Würfelwürfel unterstützt.
Im Kern haben wir den Würfelwurf: 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 ( ', ' ) ) ;
Zu den Komponenten des Würfelrollers gehören der Validator, der Tokenizer, der Parser, der RPN-Konverter und der Evaluator. Weitere Informationen finden Sie in den API-Dokumenten hier.
Ein Beispiel für einen anspruchsvolleren Würfelwurf, den dieses Paket unterstützt:
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 ] ) ;
Rollen sollten im Format x d y vorliegen, z. B. „1d20“ oder
Operatoren sollten im Infix verwendet werden, z. B. 5+7, obwohl sie als Postfix ausgewertet werden.
+, -, *, /
Größer als ( >
), Kleiner als ( <
) und andere ähnliche Operatoren ( <=
, >=
, ==
und <>
(ungleich)) geben „true“ oder „false“ zurück.
Größerer Wert von ( >>
) und kleinerer Wert von ( <<
) geben den entsprechenden Wert zurück, z. B. 5<<7
gibt 5
zurück.
||
und &&
führen die entsprechenden Operationen aus.
->
und ;
sind die Äquivalente von then und else. Beispiel: 1d20>10->1d6;0
würfelt zuerst 1W20 und vergleicht dann diesen Wert mit 10. Wenn der Wert größer als 10 ist, wird 1W6 gewürfelt und das Ergebnis dieses Wurfs zurückgegeben. Wenn der Wert kleiner oder gleich 10 ist, wird 0 zurückgegeben.
Mit diesen Operatoren können Sie problemlos mehrmals das Gleiche würfeln. Beispielsweise ist 4#+1d6
das Äquivalent von 1d6+1d6+1d6+1d6
. Dies unterscheidet sich von 4*1d6, da ersteres diese Würfel nicht erneut würfelt; Letzteres wird.
Die folgenden Operatoren werden unterstützt:
#+
– Addieren Sie die Ergebnisse#*
– Multiplizieren Sie die Ergebnisse miteinander#&
– Verknüpft die Ergebnisse mit AND ( &&
) und gibt den letzten Wert zurück, wenn alle wahr sind, oder den ersten falschen Wert.#|
- ODER ( ||
) die Ergebnisse zusammen und gibt den letzten Wert zurück, wenn alle falsch sind, oder den ersten wahren Wert. Wenn einer Variablenreferenz das Präfix ^
vorangestellt wird, wird sie als 0 behandelt, wenn sie nicht übergeben wurde.
Durch die Verwendung des Namens eines Makros können Sie dieses Makro in Ihrer Formel auswerten. Makros können auch auf andere Makros verweisen.
Hier ist ein einfaches Beispiel:
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 ) ;
Möglicherweise möchten Sie das Ergebnis eines Makros überprüfen und es dann verwenden. Es gibt mehrere Möglichkeiten, dies zu tun.
Eine Möglichkeit besteht darin, die Operatoren >>
und <<
zu verwenden. Um beispielsweise den höheren Wert zwischen macro1
und macro2
auszuwählen, würden Sie macro1>>macro2
schreiben.
Der fortgeschrittenere Weg umfasst globale und lokale Makroinstanzen.
[]
wird für lokale Makroinstanzen verwendet. {}
wird für globale Makroinstanzen verwendet.
Lokale Makroinstanzauswertungen werden nur für das aktuell ausgewertete Makro/die aktuell ausgewertete Formel verwendet. Beispielsweise möchten Sie vielleicht wissen, ob das Ergebnis von 1W20 20, 1 war oder ob es über einem bestimmten Wert lag. Sie können dies folgendermaßen tun: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
Globale Makroinstanzauswertungen werden für jedes Makro verwendet, das auf sie verweist. Sie eignen sich eher für sehr gezielte Anwendungen als für allgemeinere wiederverwendbare Rollen.
Als Ergebnis eines Wurfs möchten Sie möglicherweise einen Wert ändern, z. B. den Einsatz einer Fähigkeit verringern. Alternativ möchten Sie möglicherweise einen Wert während eines Wurfs verfolgen und ihn verwenden, um zu bestimmen, was als nächstes zu tun ist. Das geht mit Nebenwirkungen!
Derzeit werden nur drei Nebenwirkungen unterstützt:
:=
(Aufgabe)+=
(Inkrement)-=
(dekrementieren) Wenn Sie einen Nebeneffekt anwenden möchten, müssen Sie dem Namen der Variablen $
voranstellen.
Sie können den Pseudooperator ...
zwischen einem Nebeneffekt und dem Ergebnis verwenden, das Sie zurückgeben möchten.
Ein Beispiel für einen Nebeneffekt bei Verwendung der Makros von oben:
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 ) ;