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 d y 형식이어야 합니다(예: '1d20' 또는).
연산자는 후위로 평가되지만 중위(예: 5+7)로 사용해야 합니다.
+, -, *, /
보다 큼( >
), 보다 작음( <
) 및 기타 유사한 연산자( <=
, >=
, ==
및 <>
(같지 않음))는 true 또는 false를 반환합니다.
더 큰 값( >>
) 및 더 작은 값( <<
)은 적절한 값을 반환합니다. 예를 들어 5<<7
5
반환합니다.
||
및 &&
동일한 작업을 수행합니다.
->
그리고 ;
then과 else와 동일합니다. 예: 1d20>10->1d6;0
먼저 1d20을 굴린 다음 해당 값을 10과 비교합니다. 값이 10보다 크면 1d6을 굴리고 해당 굴림의 결과를 반환합니다. 값이 10보다 작거나 같으면 0을 반환합니다.
이 연산자를 사용하면 동일한 것을 쉽게 여러 번 굴릴 수 있습니다. 예를 들어 4#+1d6
1d6+1d6+1d6+1d6
과 동일합니다. 이는 주사위를 다시 굴리지 않기 때문에 4*1d6과 다릅니다. 후자는 그럴 것이다.
다음 연산자가 지원됩니다.
#+
- 결과를 함께 추가#*
- 결과를 함께 곱합니다.#&
- 결과를 함께 AND ( &&
)하여 모두 참인 경우 마지막 값을 반환하거나 첫 번째 거짓 값을 반환합니다.#|
- 결과를 함께 OR( ||
)하여 모두 거짓인 경우 마지막 값을 반환하거나 첫 번째 진실 값을 반환합니다. 변수 참조 앞에 ^
붙이면 변수 참조가 전달되지 않은 경우 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 ) ;