roll-a-d6
เป็นไลบรารีกลไกการทอยลูกเต๋าที่รองรับมาโครและสูตรที่ซับซ้อนซึ่งไม่มีลูกกลิ้งลูกเต๋าอื่นรองรับ
ที่แกนกลางของมัน เรามีลูกกลิ้งลูกเต๋า: 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 ( ', ' ) ) ;
ส่วนประกอบของลูกกลิ้งลูกเต๋าประกอบด้วยเครื่องมือตรวจสอบความถูกต้อง โทเค็นเซอร์ ตัวแยกวิเคราะห์ ตัวแปลง RPN และผู้ประเมิน สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสาร API ที่นี่
ตัวอย่างของการทอยลูกเต๋าที่ซับซ้อนยิ่งขึ้นซึ่งแพ็คเกจนี้รองรับ:
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 ] ) ;
ม้วนควรอยู่ในรูปแบบ x dy y เช่น '1d20' หรือ
โอเปอเรเตอร์ควรใช้ infix เช่น 5+7 แม้ว่าจะถูกประเมินค่า postfix ก็ตาม
-
มากกว่า ( >
), น้อยกว่า ( <
) และตัวดำเนินการอื่นๆ ที่คล้ายกัน ( <=
, >=
, ==
และ <>
(ไม่เท่ากัน)) ส่งคืนค่าจริงหรือเท็จ
Greater of ( >>
) และ Lesser of ( <<
) ส่งกลับค่าที่เหมาะสม เช่น 5<<7
ส่งกลับ 5
||
และ &&
ดำเนินการเทียบเท่ากัน
->
และ ;
มีค่าเทียบเท่ากับค่านั้นและอย่างอื่น ตัวอย่างเช่น 1d20>10->1d6;0
จะทอย 1d20 ก่อน แล้วจึงเปรียบเทียบค่านั้นกับ 10 หากค่ามากกว่า 10 มันจะทอย 1d6 และส่งคืนผลลัพธ์ของการทอยนั้น ถ้าค่าน้อยกว่าหรือเท่ากับ 10 ก็จะส่งกลับ 0
โอเปอเรเตอร์เหล่านี้ช่วยให้คุณหมุนสิ่งเดียวกันได้หลายครั้งอย่างง่ายดาย ตัวอย่างเช่น 4#+1d6
เทียบเท่ากับ 1d6+1d6+1d6+1d6
สิ่งนี้แตกต่างจาก 4*1d6 เพราะแบบแรกจะไม่ทอยลูกเต๋าเหล่านั้นซ้ำ หลังจะ
รองรับโอเปอเรเตอร์ต่อไปนี้:
#+
- เพิ่มผลลัพธ์ร่วมกัน#*
- คูณผลลัพธ์เข้าด้วยกัน#&
- AND ( &&
) ผลลัพธ์รวมกัน โดยส่งคืนค่าสุดท้ายหากทั้งหมดเป็นความจริง หรือค่าเท็จค่าแรก#|
- หรือ ( ||
) ผลลัพธ์รวมกัน โดยส่งคืนค่าสุดท้ายหากทั้งหมดเป็นเท็จ หรือค่าความจริงค่าแรก การเติมการอ้างอิงตัวแปรด้วย ^
จะทำให้ถือเป็น 0 หากไม่ส่งผ่านเข้าไป
โดยใช้ชื่อของแมโคร คุณสามารถประเมินแมโครนั้นในสูตรของคุณได้ แมโครยังสามารถอ้างอิงถึงมาโครอื่นๆ ได้อีกด้วย
นี่เป็นตัวอย่างง่ายๆ:
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 ) ;
คุณอาจต้องการตรวจสอบผลลัพธ์ของแมโครแล้วใช้งาน มีสองวิธีในการทำเช่นนี้
วิธีหนึ่งเกี่ยวข้องกับการใช้ตัวดำเนินการ >>
และ <<
ตัวอย่างเช่น หากต้องการเลือกค่าที่สูงกว่าระหว่าง macro1
และ macro2
คุณจะต้องเขียน macro1>>macro2
วิธีขั้นสูงยิ่งขึ้นเกี่ยวข้องกับอินสแตนซ์แมโครส่วนกลางและภายในเครื่อง
[]
ใช้สำหรับอินสแตนซ์แมโครในเครื่อง {}
ใช้สำหรับอินสแตนซ์มาโครส่วนกลาง
การประเมินอินสแตนซ์แมโครในเครื่องจะใช้เฉพาะสำหรับมาโคร/สูตรที่ได้รับการประเมินในปัจจุบันเท่านั้น ตัวอย่างเช่น คุณอาจต้องการทราบว่าผลลัพธ์ของ 1d20 คือ 20, 1 หรือสูงกว่าค่าที่กำหนดหรือไม่ คุณสามารถทำเช่นนี้: r=1d20,r[0]==20->crit;(r[0]==0->miss;r[0]>=minimum->hit)
การประเมินอินสแตนซ์แมโครส่วนกลางจะใช้กับทุกแมโครที่อ้างอิงถึงมาโครเหล่านั้น มีประโยชน์มากกว่าในการใช้งานเฉพาะจุดมากกว่าการใช้งานแบบม้วนทั่วไปที่นำกลับมาใช้ใหม่ได้
ผลจากการทอย คุณอาจต้องการเปลี่ยนค่าบางอย่าง เช่น ลดการใช้ความสามารถของคุณ หรืออีกทางหนึ่ง คุณอาจต้องการติดตามค่าระหว่างการหมุนและใช้เพื่อกำหนดว่าจะต้องทำอะไรต่อไป คุณสามารถทำได้โดยมีผลข้างเคียง!
ปัจจุบันรองรับผลข้างเคียงเพียงสามประการเท่านั้น:
:=
(การมอบหมายงาน)+=
(เพิ่มขึ้น)-=
(ลดลง) หากคุณต้องการใช้ผลข้างเคียง คุณต้องใส่ $
นำหน้าชื่อของตัวแปร
คุณสามารถใช้ ...
ตัวดำเนินการหลอกระหว่างผลข้างเคียงกับผลลัพธ์ที่คุณต้องการส่งคืน
ตัวอย่างหนึ่งของผลข้างเคียง โดยใช้มาโครจากด้านบน:
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 ) ;