roll-a-d6
adalah pustaka mesin penggulung dadu yang mendukung makro dan rumus canggih yang tidak didukung oleh penggulung dadu lainnya.
Pada intinya, kami memiliki roller dadu: 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 ( ', ' ) ) ;
Komponen pelempar dadu meliputi validator, tokenizer, parser, konverter RPN, dan evaluator. Untuk informasi lebih lanjut, lihat dokumen API di sini.
Contoh pelemparan dadu yang lebih canggih yang didukung paket ini:
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 ] ) ;
Gulungan harus dalam format x d y , misalnya '1d20' atau
Operator harus menggunakan infix, misalnya 5+7, meskipun dievaluasi postfix.
+, -, *, /
Lebih besar dari ( >
), Kurang dari ( <
), dan operator serupa lainnya ( <=
, >=
, ==
, dan <>
(tidak sama)) menghasilkan nilai benar atau salah.
Lebih besar dari ( >>
) dan Lebih kecil dari ( <<
) mengembalikan nilai yang sesuai, misalnya 5<<7
mengembalikan 5
.
||
dan &&
melakukan operasi yang setara.
->
dan ;
adalah setara dengan kemudian dan yang lain. Misalnya: 1d20>10->1d6;0
pertama-tama akan melakukan roll 1d20, lalu membandingkan nilainya dengan 10. Jika nilainya lebih besar dari 10, maka akan melakukan roll 1d6 dan mengembalikan hasil roll tersebut. Jika nilainya kurang dari atau sama dengan 10, maka akan menghasilkan 0.
Operator ini memungkinkan Anda memutar hal yang sama berkali-kali dengan mudah. Misalnya, 4#+1d6
setara dengan 1d6+1d6+1d6+1d6
. Ini berbeda dari 4*1d6 karena yang pertama tidak akan melempar ulang dadu tersebut; keinginan yang terakhir.
Operator berikut ini didukung:
#+
- Tambahkan hasilnya bersama-sama#*
- Kalikan hasilnya#&
- AND ( &&
) hasilnya bersamaan, mengembalikan nilai terakhir jika semuanya benar, atau nilai pertama yang salah.#|
- ATAU ( ||
) hasilnya bersamaan, mengembalikan nilai terakhir jika semuanya salah, atau nilai kebenaran pertama. Mengawali referensi variabel dengan ^
akan menyebabkannya diperlakukan sebagai 0 jika tidak diteruskan.
Dengan menggunakan nama makro, Anda bisa mengevaluasi makro tersebut dalam rumus Anda. Makro juga dapat mereferensikan makro lainnya.
Berikut ini contoh sederhananya:
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 ) ;
Anda mungkin ingin memeriksa hasil makro dan kemudian menggunakannya. Ada beberapa cara untuk melakukan ini.
Salah satu caranya melibatkan penggunaan operator >>
dan <<
. Misalnya, untuk memilih nilai yang lebih tinggi antara macro1
dan macro2
, Anda akan menulis macro1>>macro2
.
Cara yang lebih maju melibatkan contoh makro global dan lokal.
[]
digunakan untuk instance makro lokal. {}
digunakan untuk instance makro global.
Evaluasi instans makro lokal hanya digunakan untuk makro/rumus yang saat ini dievaluasi. Misalnya, Anda mungkin ingin mengetahui apakah hasil 1d20 adalah 20, 1, atau di atas nilai tertentu. Anda dapat melakukan ini seperti ini: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
Evaluasi instans makro global digunakan untuk setiap makro yang mereferensikannya. Mereka lebih berguna dalam aplikasi yang sangat terfokus dibandingkan pada gulungan yang lebih umum dan dapat digunakan kembali.
Sebagai hasil dari lemparan tersebut, Anda mungkin ingin mengubah beberapa nilai, seperti mengurangi penggunaan suatu kemampuan. Alternatifnya, Anda mungkin ingin melacak nilai selama pelemparan dan menggunakannya untuk menentukan apa yang harus dilakukan selanjutnya. Anda dapat melakukan ini dengan efek samping!
Saat ini, hanya tiga efek samping yang didukung:
:=
(tugas)+=
(kenaikan)-=
(penurunan) Jika Anda ingin menerapkan efek samping, Anda harus mengawali nama variabel dengan $
.
Anda dapat menggunakan ...
operator semu antara efek samping dan hasil yang ingin Anda kembalikan.
Salah satu contoh efek samping, menggunakan makro dari atas:
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 ) ;