Lavorando alla prossima versione del Quantum Dice Roller mi sono informato sulle notazioni già esistenti per il lancio di dadi. Scrivo questo post per chiedervi un consiglio… Trovate la domanda in fondo all’articolo!
Nell’ottica di supportare più giochi possibili e non soltanto D&D e Pathfinder, ho deciso di implementare i seguenti concetti:
tieni i più bassi
tieni i più alti
tieni i successi
rilanciane alcuni scartando i vecchi risultati
rilanciane alcuni tenendo i vecchi risultati (dadi “esplosivi”)
Per far questo ho rielaborato quanto letto nella pagina di Wikipedia, supportando fin qui le seguenti casistiche:
Dungeons & Dragons 3.5 (prova di abilità) = 1d20+6 = lancia 1d20 e somma 6 al risultato
Dungeons & Dragons 3.5 (creazione pg) = 4d6-L = scarta il dado più basso e somma i rimanenti
Dungeons & Dragons 5 (vantaggio) = 2d20+H+2 = tieni il dado più alto e somma 2 al risultato
Dungeons & Dragons 5 (svantaggio) = 2d20+L+2 = tieni il dado più basso e somma 2 al risultato
Legend of the Five Rings = 4k3 = 4d10+H3 = lancia 4d6 e somma i 3 dadi più alti
Nameless Land = 1d% = lancia 1d100
Arkham Horror = 2d6+S5 = conta i successi, da 5 in su (potrei quindi ottenere 0, 1 oppure 2)
Vampiri, la Masquerade = 10d10+S = conta i successi, da 8 in su (8 è il valore di default)
Fudge = 1dF = restituisce un valore tra -1 e 1
Altro = (1d4+3d6)+H+S = lancia 1d4 e 3d6, tieni solo il risultato più alto, conta quanti successi ( >=8 ) ho ottenuto = zero 🙂
Mi rimane però un dubbio su come implementare il “rilancio”.
Per i dadi esplosivi qualcuno usa il punto esclamativo. Mi piace l’idea, ma dove si potrebbe mettere?
Per i dadi da scartare invece non so neanche che notazione usare… Avete qualche idea?
Grazie 🙂
Questione interessante. Ci penso in una fine di settimana di queste entranti. Buon anno, buon tutto!
(Mi scocciavo e ho anticipato i tempi. Questa soluzione è stata scritta principalmente stanotte. Se vi annoiate potete saltare direttamente ad *** *** *** ALCUNI ESEMPI *** *** ***.) Dipende molto dal gusto personale e dalle persone che ti aspetti utilizzino il Quantum Dice Roller. Secondo il mio gusto personale: – una sintassi deve prima di tutto essere consistente, poi elegante, infine semplice; – sarebbe preferibile inoltre si conservassero l’ordine di priorità consueto e tante proprietà utili delle operazioni ordinarie (addizione, sottrazione, moltiplicazione, divisione, divisione di interi/modulo, elevamento a potenza); – va bene che ci siano ridondanze tra operazioni finché non siano in conflitto con la sintassi e le proprietà; – le operazioni tipiche di programmazione (per esempio, incrementare) sono sacrificabili. – (molto opzionale) non implementerei una notazione case sensitive se non strettamente necessario. Qui sotto introduco una soluzione. Abbiamo 2 oggetti: – “d” per “dice”: dado, – “t” per “throw”: tiro. La differenza tra dado e tiro è che i dadi si valutano e i tiri si contano. Questa differenza è totalmente arbitraria ma aiuterà poi. [TBI: i dadi in notazione si sommano solamente e non c’è la possibilità di farci altre operazioni. Se trovo una ragione pratica per la sottrazione e la divisione non mi spiego perché non ci sia una notazione per moltiplicare i valori ottenuti (sia l’addizione che la moltiplicazione sono commutative).] Abbiamo quattro operatori “o”: – “h” per “highest”: il più alto; – “l” per “lowest”: il più basso; – “s” per “success”: successo; – “f” per “fail”: fallimento. [NdA: il dado Fudge è così importante?! È un banale d3-2… Se sì, sostituire f di failed con u di unsuccess.] I primi due operatori si applicano ai dadi, i secondi due ai tiri. L’intensità degli operatori è definita dal numero “N” associato immediatamente dopo l’operatore: – i dadi con risultato più alto (N=1, cioè il dado più alto) – i dadi con risultato più basso (N=1, cioè il dado più basso) – il numero di tiri uguali a N o superiori a N (N=8, cioè i successi a 8) [NdA: vogliamo mettere altri numeri predefiniti?] – il numero di tiri inferiori a N (N=8, cioè i fallimenti a 8) Se N è omesso l’intensità predefinita è implicito. L’effetto degli operatori è definito dall’operazione “°” associata immediatamente dopo l’intensità. Per h e l: – “+” tieni; – “-” scarta; – “*” rilancia tenendo; – “/” rilancia scartando. Per s e f: – “+” tieni i successi; – “-” tieni i fallimenti; – “*” ritira i massimi e tieni i successi; – “/” ritira i minimi e tieni i fallimenti. Se ° è omessa l’effetto predefinito e implicito è l’effetto “somma” +. [NdA Il punto esclamativo lo terrei per determinare l’effetto complementare [TBI], ad esempio per scartare tutti i risultati tranne il più alto. Si tratterebbe di implementare ridondanze, ma per alcuni casi sono molto più eleganti. Si potrebbe utilizzare anche per casi molto particolari, ad esempio decidi se ritirare ma ti tieni il ritiro oppure tira e aggiungi successi finché esce il massimo: non vorrei si sovrapponesse all’operazione fattoriale.] Si determina innanzitutto l’intensità e l’effetto dell’operatore. Si determinano casualmente i risultati dei dadi e dei tiri e si applica l’operatore. Infine si applicano le consuete operazioni secondo discendente priorità di risoluzione (prima addizioni e sottrazioni, poi moltiplicazioni e divisioni, eccetera). L’uso delle parentesi può alterare l’operando dell’operatore, ad esempio un numero di dadi misto o determinato dinamicamente [NdA: runtime]. L’uso delle parentesi può anche alterare l’intensità e l’effetto dell’operatore, ad esempio intensità o effetti casuali. La composizione degli operatori avviene da destra a sinistra. *** *** *** ALCUNI ESEMPI *** *** *** [NdA: sperando che si prenda l’HTML…] 1d20+6 = d20+6 : il valore di un dado a venti facce e aggiungi sei [Dungeons & Dragons 3.5 (prova di abilità)] 4h3d6 = 4h3+d6 = 4l-d6 = 4l1-d6 : tieni i tre valori più alti = scarta il valore più basso; somma i rimanenti [Dungeons & Dragons 3.5 (creazione pg)] 2hd20+2 = 2h1d20 = 2h+d20 = 2h1+d20 = 2l-d20 = 2l1-d20 : tieni il valore più alto = scarta il valore più basso; aggiungi due [Dungeons & Dragons 5 (vantaggio)] 2ld20+2 = 2l1d20 = 2l+d20 = 2l1+d20 = 2h-d20 = 2h1-d20 : tieni il valore più basso = scarta il valore più alto; aggiungi due [Dungeons & Dragons 5 (svantaggio)] 4h3d10 = 4h3+d10 = 4l-d10 = 4l1-d10 : tieni i tre valor più alti e sommali [Legend of the Five Rings (4k3)] 1d% = d% = 1d100 = d100 : il valore di un dado a cento facce 2s5t6 = 2s5+t6 : di due tiri su sei facce conta i risultati da cinque in su (potrei quindi ottenere 0, 1 oppure 2) [Arkham Horror] 10st10 = 10s8t10 : di dieci tiri su dieci facce conta i risultati da otto in su (8 è il valore predefinito; potrei ottenere da 0 a 10) [Vampiri, la Masquerade] 1dF = restituisce -1, 0 o 1 [Fudge] [NdA: serve davvero?…] sh(1t4+3t6) : di un tiro su quattro facce e tre tiri su sei facce tieni il risultato più alto e conta da otto in su (ZERO) [Altro] 1s10t(2d6) s10t(2d6) : della somma dei valori di due dadi a sei facce conta da dieci in su (potrei ottenere 0 o 1) [Dungeon World (successo senza inconvenienti)] s*$(CA)t20+$(TxC) = 1s*$(CA)t20+$(TxC) : di un tiro su venti facce conta da Classe Armatura in su, ritirando i massimi e contando; somma il Tiro per Colpire [Dungeons & Dragons 3.5 (tiro per colpire con minaccia al 20: doppio successo è un critico!)] [NdA: il dollaro è un bashismo…]
Eh, lo sapevo mi si svangava la formattazione! In estrema sintesi, l’idea sintattica è attenersi a una forma del tipo XoN°dY, dove: – X è il numero di lanci; – o è l’operatore; – N è l’intensità dell’operatore; – ° è l’effetto dell’operatore; – d (oppure t) sono dadi (oppure tiri); – Y è il numero di facce.
Tra gli esempi che hai fatto ho notato una ridondanza: Dungeons & Dragons 3.5 (creazione pg) = 4d6-L = scarta il dado più basso e somma i rimanenti è la stessa cosa di Legend of the Five Rings = 4k3 = 4d10+H3 = lancia 4d6 e somma i 3 dadi più alti per cui per questi basta una sola notazione e direi che la migliore e più intuitiva è la prima (numero e tipo di dadi e sottrazione del/i minore/i). Si potrebbe aggiungere un’altro parametro facoltativo, tipo un numero prima di L che dica quanti dei dadi più bassi sottrarre (-nL). Si potrebbe anche aggiungere la possibilità di scartare il maggiore (-H) o più di un risultato maggiore (-nH) o entrambe le cose assieme per tenere solo i dadi con valori medi (-nH-nL e/o viceversa). Per il vantaggio/svantaggio, non basterebbe una notazione con un + o un – davanti? Tipo +xdy+q per il vantaggio (tira due volte xdy e prende il risultato migliore) e -xdy+q per lo svantaggio (tira due volte xdy e tiene il risultato peggiore). C’è un gioco con due meccaniche di tiro particolari che conosco: Tunnels & Trolls 7° edizione. In combattimento prevede lo “spite damage”, ovvero 1 o più danni sicuri per ogni 6 rollato (e si arriva a rollare tanti d6 in quel gioco) che viene inflitto agli avversari a prescindere (“in spite of”, da cui il nome) dall’armatura o da altri fattori riducenti. Ci possono essere nemici che fanno spite particolari con valori differenti dal solo 6, tipo 5-6 o 4-5-6, o con più 6 contemporaneamente (ma per quest’ultima cosa non servirebbe una notazione a parte). Fuori dal combattimento, invece, ha il tiro di recupero, in cui si tirano 2d6 cui si somma una caratteristica contro una difficoltà prestabilita (parte da 15 e sale di 5 in 5 ogni livello di difficoltà oltre al primo). I valori pari si sommano e si ritirano i dadi sommando ancora (ad esempio, 5 e 5 al primo tiro e 3 e 4 al secondo fa 17). Se al primo tiro si fa 3, però, è un fallimento automatico (2 e 1 sui dadi). Per la prima cosa servirebbe una notazione tipo xdy+q$p che restituisca sia il valore tirato che il numero di spite ottenuti. Ad esempio 8d6+25$6 per un risultato di 51 (1), ovvero 51 danni base e 1 spite. Il valore spite sarebbe sempre l’intervallo compreso tra p e y, p compreso. Per la seconda invece una cosa tipo “xdy+q per sommare e ritirare i tiri con x risultati uguali sui dadi. In alcuni casi, come ad esempio giocando a Risk/Risiko, contano anche i singoli valori ottenuti sui dadi, per cui potrebbe servire una notazione che renda visibili tali valori, tipo mettendo davanti ad una qualsiasi altra notazione il carattere #. Per esempio, #xdy. Si potrebbe espandere la cosa per sommare un valore identico ad ogni dado, per casi che lo richiedano, ad esempio #xdy+#q per tirare 1dy+q per x volte e mostrare ciascun risultato separatamente. Senza il secondo #, il valore q sarebbe sommato al totale dei dadi e il valore ottenuto sarebbe indicato all’inizio, prima della serie di valori (il totale dovrebbe essere indicato comunque, anche nell’altro caso). Un esempio di dove potrebbe servire è un qualsiasi D&D con la riduzione del danno e un certo numero di attacchi a segno che facciano lo stesso ammontare di danni potenziali: ci servirebbero i singoli tiri per i danni in quanto ciascuno dovrebbe superare la RD per far danno e quindi non ci serve il totale (mi è davvero successo in una battaglia di avere tipo 30 arcieri tutti uguali che scagliavano contemporaneamente su un personaggio con RD).
P.S. – Questo sistema di commenti non tiene conto degli a capo e delle linee di separazione tra paragrafi, pare. Una cosa abbastanza seccante quando si cercano di leggere commenti lunghi.
grazie ragazzi, è da un po’ che ho letto i vostri commenti e ci sto pensando su. Ho già quasi pronta una piccola app che implementa la notazione standard estesa. https://github.com/giorgiobeggiora/complete-dice-roller @ Eldrad la notazione che hai proposto mi sembra molto simile a quella standard perciò proverò ad inserirla nell’app come notazione opzionale @ Mad Master, la rindondanza la lascerò perchè consente di scrivere formule più semplici, scrivere 6k3 è molto più semplice di scrivere 6d10+H3 e rispecchia la notazione ufficiale del gioco, cosa che voglio fare per più giochi possibile, vedi ad esempio il supporto ai dadi Fudge. “L” come tutte le lettere supporta un numero successivo (es 6k3 = 6d10-L3). Riguardo al vantaggio/svantaggio, se ci fosse una notazione diffusa la supporterei ma in mancanza preferisco mantenere gli elementi già esistenti. Sapere che ogni “azione” è sempre composta da +/-, lettera e numero opzionale e non cambia mai secondo me semplifica molto. Grazie per la segnalazione della meccanica di tunnels & trolls, ci ragiono su, a prima vista mi sembra simile a quella che ho implementato con “R” (vedi esempi in homepage del progetto github linkato qui sopra). Per la riduzione del danno, in realtà non credo sia pratico inserire in una formula un valore che può cambiare ad ogni avversario, comunque anche qui ci ragiono, anche perchè sto lavorando alle macro! Per casi meno variabili come le check skill invece potrai usare “S” per indicare il valore da superare (o F per quello da non superare, come in Call of Cthulhu) non appena avrò implementato questa sintassi con le parentesi: (1d20+4)+S15. Attacchi multipli potranno essere gestiti semplicemente con roll multipli in un’unica formula o macro. GRAZIE A TUTTI PER I VOSTRI FEEDBACK, ANCHE A COLORO CHE MI STANNO CONTATTANDO PRIVATAMENTE!!!