Utility Go per parsing e lancio di espressioni dadi (stile D&D), usata da lazy5e ma riusabile in qualunque progetto.
go get github.com/vcrini/diceroll@latestExpandRollInput(input string) ([]string, error)- Espande input multipli separati da
,e moltiplicatorexN.
- Espande input multipli separati da
ParseRollBatch(input string) (expr string, times int, err error)- Parla una singola entry batch (
1d6x3->1d6,3).
- Parla una singola entry batch (
RollExpression(expr string) (total int, breakdown string, err error)- Esegue il tiro e ritorna totale + breakdown testuale.
ChooseMode(mode byte, a int, b int) intvsceglie il maggiore,sil minore.
- Dado:
NdM(es.2d6,d20) - Dado speciale:
d(alias per2d12)- Se il primo tiro > secondo:
speranza - Se il primo tiro < secondo:
paura - Se uguali:
critico
- Se il primo tiro > secondo:
- Somma/sottrazione:
2d6+d4+3,1d8-1 - Costanti:
+5,-2 - Clamp a zero: se il totale è negativo, ritorna
0.
Suffissi sul dado:
v: tira 2 volte e prende il valore maggiore (d20v)s: tira 2 volte e prende il valore minore (d20s)c: abilita il comportamento critico usato con>/>=(solo sul primo termine dado)cd: critico stile daggerheart sul primo dado (solo con>/>=esuccessExpr)- alias compatibile:
cp
- alias compatibile:
Esempi:
d20v+5d20s+1d20c>15 2d6+3d20cd>10 1d6+2
Formato:
expr > sogliaexpr >= sogliaexpr > soglia successExprexpr >= soglia successExpr
Comportamento:
- senza
successExpr: appendok/koal breakdown - con
successExpr: se condizione vera, valuta anchesuccessExpre lo appende (-> ...) - con suffisso
csul primo dado e tiro massimo sul primo termine: insuccessExprraddoppia il numero di dadi (1d6->2d6) - con suffisso
cdsul primo dado e tiro massimo sul primo termine: insuccessExpraggiunge la massimizzazione del primo dado disuccessExpr- esempio:
d20cd >10 1d6+2con critico sul d20 equivale a1d6+8(+2originale ++6da dado massimizzato)
- esempio:
- con dado speciale
din un confronto (>/>=),dè trattato comecdautomaticamente- il trigger avviene su
criticodel dadod(i due d12 uguali) - con
critico, il check è sempre un successo anche se la soglia non è superata - esempio:
d > 11 d6+2
- il trigger avviene su
Esempi:
1d20+5 > 121d20 >= 10 2d6+1d20c>15 d6+1d20cd>10 1d6+2d > 11 d6+2
- Moltiplicatore:
1d6 x3oppure1d6x3 - Multipli separati da virgola:
d4,d6,d8 - Combinabile:
1d20+5>10x2,d6
package main
import (
"fmt"
"github.com/vcrini/diceroll"
)
func main() {
exprs, _ := diceroll.ExpandRollInput("1d20+5>12,d6x2")
for _, e := range exprs {
total, breakdown, err := diceroll.RollExpression(e)
if err != nil {
fmt.Printf("%s -> errore: %v\n", e, err)
continue
}
fmt.Printf("%s => %d (%s)\n", e, total, breakdown)
}
}- batch
xN:Ndeve essere> 0e<= 200 - numero dadi per termine
<= 1000 - facce dado per termine
<= 100000 - input vuoto o token invalidi ritornano errore
go test ./...