룰 시스템
주사위 언어
모든 문장 뒤의 수식: 주사위 표기법, 굴림이 읽을 수 있는 값, 굴림의 해석 방식, 흔한 메커니즘의 레시피.
모든 문장 아래의 하나의 작은 언어
룰 시스템의 모든 숫자는 단순한 숫자이거나 수식 작은 언어로 쓴 식이에요: 판정이 굴리는 주사위, 목표치, 트랙의 최대치, 능력치의 수정치, 티어별 적의 체력, 룰 카드의 수치. 직접 쓸 일은 거의 없어요: 문장 편집기, 작성기, Hob이 대신 써 주거든요. 고급 탭에서 언제든 전체를 볼 수 있어요.
의도적으로 작게 만들었어요. 프로그래밍 언어가 아니에요: 반복문도 없고, 주어진 값 밖에 접근할 수도 없고, 잘못 작동할 여지도 없어요. 말이 안 되는 수식은 저장할 때 거부되며, 무엇이 잘못됐는지 문장으로 알려 줘요.


주사위
| 쓰기 | 뜻 | 예시 |
|---|---|---|
d20 | 20면체 주사위 하나 | 13 |
3d6 | 6면체 주사위 세 개, 합산 | 4 + 2 + 6 = 12 |
2d20kh1 | d20 두 개, 높은 것 하나만 (어드밴티지) | (7, 16) → 16 |
2d20kl1 | 낮은 것 하나만 (디스어드밴티지) | (19, 7) → 7 |
4d6kh3 | d6 네 개, 좋은 세 개만 | (5, 2, 6, 3) → 14 |
(@stat)d6 | 값이 가리키는 만큼의 주사위 | Prowl 3 → 3d6 |
d(@dexterity) | 값이 가리키는 크기의 주사위, 능력치가 주사위인 게임용 | Dexterity 10 → d10 |
6d10>=6 | 6 이상 주사위 세기: 값은 그 개수 | (2, 6, 9, 10, 1, 7) → 4 |
3d6! | 폭발: 최고 면이 나오면 주사위 하나 더 | (6, 2, 4) + 5 → 17 |
4dF | Fate 주사위: 각각 −1, 0 또는 +1 | (+, 0, −, +) → +1 |
d100 | 백분위 주사위; d% 와 같아요 | 47 |
d100t(1) | 보너스 10자리 주사위가 있는 백분위(더 좋은 10자리 채택); t(-1)은 페널티 주사위 | (4 or 7, 3) → 43 |
d12[Hope] | 이름 있는 주사위: 이름과 함께 표시되고 룰 카드가 읽을 수 있어요 | Hope d12 (9) |
모든 면은 굴림 기록에 남아서, 주사위 트레이가 다시 보여 주고 굴림 칩에 표시할 수 있어요. 모든 주사위는 시드에서 굴려요: 같은 턴에서 같은 굴림을 다시 하면 같은 면이 나와요.
수와 논리
- 산술
+ - * /와 괄호:floor((@str - 10) / 2)- 비교
> >= < <= == !=, 1 또는 0이 나와요:@hp < 5- 논리
and,or,not:@cond.blessed > 0 and @nerve >= 3- 선택
if … then … else …:if @level >= 5 then 2 else 1. 선택된 분기만 계산되므로, 그 분기의 주사위만 굴러가요.- 함수
floor ceil round abs min max clamp:clamp(@edge + @cond.edge, -1, 1)
수식이 읽을 수 있는 값
| 쓰기 | 무엇인가 | 어디서 |
|---|---|---|
@str | 능력치의 값 (id로) | 어디서든 |
@str.mod | 능력치의 수정치: 없으면 그 값 | 어디서든 |
@stat | 굴리는 능력치; @stat.mod 그 수정치 | 판정의 굴림과 목표치 |
@hp | 트랙의 현재 값; @hp.max 그 최대치 | 어디서든 |
@proficiency | 파생 값 (id로) | 어디서든 |
@level | 캐릭터의 레벨; @xp 그 능력의 xp. 다음의 레벨에 따라 커져요 로 설정된 능력에서, 클래스의 사용 횟수, 비용, 효과, 수정치는 그 능력을 지니고 있는 동안 @level 그 클래스에서의 레벨로 읽혀요 | 어디서든 |
@class.hit_die | 그 클래스가 값에 대해 정한 내용 (정하지 않으면 룰 시스템의 기본값을 그 클래스 기준으로 계산; 없으면 0). 여러 클래스를 지니면 시스템 설정에 따라 각 클래스의 값을 더하거나, 합산 값, 최댓값, 첫 클래스의 값으로 읽혀요 | 어디서든 |
@classlevel.wizard | 클래스에서의 레벨 (id로), 보유하지 않으면 0 | 어디서든 |
@classlevel | 이 클래스에서의 레벨: 2 * @classlevel 레벨마다 커져요 | 클래스 고유 값, 그리고 시스템의 클래스 기본값 |
@classfirst | 첫 클래스면 1, 다른 클래스면 0: 첫 클래스만 받는 것 | 클래스 고유 값, 그리고 시스템의 클래스 기본값 |
@own.hit_die | 다른 이름의 이 클래스 고유 값 (히트 다이). @class.hit_die 는 합산된 값으로 읽혀요 | 클래스 고유 값, 그리고 시스템의 클래스 기본값 |
@classes | 지닌 클래스의 수; @mastered 상한에 도달한 클래스의 수 | 어디서든 |
@rank | 이 능력의 순위: 처음 얻으면 1, 다시 얻을 때마다 1씩 증가 | 능력 고유의 소모, 효과, 사용 횟수, 수정치 |
@rank.toughened | 능력의 순위 (id로), 모르면 0 | 어디서든 |
@difficulty | 이야기꾼이 라벨로 고른 단어 뒤의 숫자 (Hard → 20). 모든 라벨은 id로 읽을 수 있어요: @edge, @position. | 판정의 굴림과 목표치 |
@spend_push | 굴리기 전에 플레이어가 그 소모를 지불했으면 1, 아니면 0 | 판정의 굴림 |
@cond.edge | 시트의 상태들이 합산된 edge 값; @cond.mod 보너스 또는 페널티로 | 판정의 굴림 |
@cond.poisoned | 상태의 단계 (없으면 0); @cond.poisoned.left 남은 틱 | 어디서든 |
@opp.insight.mod | 굴림이 대상을 향할 때 상대의 능력치 또는 수정치; @opp.tier 그 티어 | 판정의 대항 목표치 |
@defence | 방어자의 방어 | 공격 판정 |
@second | 타격이 능력치 옆에서 읽는 값으로, 룰 시스템이나 무기가 붙인 이름 (모든 공격이 읽는 값, 이 공격이 읽는 값): 두 능력치 굴림의 두 번째 주사위, 또는 다른 이름 (@accuracy, @weapon_die) | 공격 판정과 피해 |
@tier | 적의 티어, 1부터 6 | 적 템플릿 |
@this | 능력치 그 자체; @linked 그 능력치가 의존하는 능력치 | 능력치의 수정치 |
@group.Hope.high | 이름 붙은 주사위의 최고 면; 또한 .tops (상위 면), .ones, .successes, .value | 굴림 뒤의 결과와 룰 카드 |
@total | 굴림의 합계; 또한 @target, @margin (합계 − 목표치), @measure | 굴림 뒤의 결과와 룰 카드 |
@event.amount | 카드를 발동시킨 공격의 피해 | 피해 카드 |
@roll.high | 타격을 먹힌 공격 굴림의 최고 주사위; @roll.low 그 최저; @group.First.value 이름 붙은 주사위. @roll.high + 5 는 High Roll이며, 자체 주사위는 없어요 | 피해 (무기, 능력, 적, 플레이어의 것) |
@thing.ship.hull | 캐릭터의 그 종류 첫 번째 것의 값 | 어디서든 |
굴림을 읽는 방법
판정은 굴림과 그 해석 방식을 가져요. 해석은 주사위를 결과 구간의 척도로 바꿔요:
| 읽기 | 측정 | 옵션 |
|---|---|---|
| 목표치와 총합 비교 | 성공도: −1 주사위 실패, 0 실패, 1 성공, 2 대성공 | steps: 목표치를 이만큼 넘으면 대성공, 이만큼 못 미치면 주사위 실패 (PF2e: 10). naturals: 첫 주사위의 최고 또는 최저 면이 성공도를 정하거나 한 단계 바꿔요. |
| 총합을 구간으로 | 총합 그 자체 | 범위별 구간: 10+, 7-9, 6- (PbtA). |
| 이하 굴림 | 등급: −1 주사위 실패, 0 실패, 1 성공, 2 어려움, 3 극한 | grades (목표치의 분수), 대성공으로 치는 것(1, 목표치와 정확히 같은 값, 더블), 주사위 실패 기준, 항상 성공·실패하는 면, 등급 대신 성공 단계, 또는 굴림 자체의 10자리 주사위(이하이지만 높을수록 좋음). |
| 최고 주사위 | 가장 좋은 면; 최고 면이 여러 개면 하나 더 높게 | Forged in the Dark. |
| 성공 세기 | 개수 | 같은 면의 짝을 추가 성공과 대성공으로 (d10 풀에서 10자리). |
해석 위에 추가로, 판정은 이름 붙은 두 주사위를 비교할 수 있어요 (Hope 대 Fear): 더 높게 나온 쪽이 결과에 단어를 더하고 자체 효과를 발휘해요; 같은 주사위는 치명타가 될 수 있고(6 이상의 더블처럼 특정 면 이상에서만 가능하게 할 수도 있어요), 낮은 같은 주사위는 실패(fumble, 1의 더블)가 돼요.
레시피
5판의 우위(advantage), 상태와 피로 포함
(if @edge + clamp(@cond.edge + (if @exhaustion >= 1 then -1 else 0), -1, 1) > 0 then 2d20kh1 else if @edge + clamp(@cond.edge + (if @exhaustion >= 1 then -1 else 0), -1, 1) < 0 then 2d20kl1 else d20) + @stat.mod + @cond.mod
Classic d20의 능력치 판정: 불리와 우위는 몇 개가 겹쳐도 한 번씩만 적용돼요.
주사위 하나를 위해 자신을 몰아붙이기
if @stat + @spend_push <= 0 then 2d6kl1 else (@stat + @spend_push)d6
Forged in the Dark: 0 도트는 두 개를 굴려 낮은 쪽을 쓰고, “push” 소비(2 스트레스)를 지불하면 주사위가 하나 더해져요.
Hope, Fear, 그리고 Hope을 소비하면 d6
d12[Hope] + d12[Fear] + @stat + (if @spend_hope > 0 then d6 else 0)
두 능력치 주사위: 능력치가 주사위예요
d(@stat)[First] + d(if @second_stat == 1 then @dexterity else @insight)[Second] + @cond.mod
read: total against @difficulty; matching dice of 6 or more are a critical, double 1s a fumble
attack: d(@stat)[First] + d(@second)[Second] reads: { "second": "@might" }컴포저의 두 능력치 주사위 엔진: 각 능력치는 주사위 크기(d6부터 d12)이고, 두 번째 주사위는 판정자가 고른 능력치 단어가 가리킵니다. 주사위로 표시된 능력치는 항상 실제 주사위로 읽혀요: 장비의 +1은 d8을 그대로 d8로 두고, +2는 d10으로 만들죠. 능력치를 단계만큼 움직이는 상태는 이미 @stat에 반영돼요: Dazed 상태는 Insight가 한 단계 내려가 d10 Insight로 굴리죠 d8. 자세한 내용은 능력치를 움직이는 상태. 공격의 두 번째 주사위는 @second이며, 모든 공격은 이를 전투 능력치로 읽어요. reads가 { "second": "willpower" } 인 지팡이는 WLP + WLP로 굴립니다. 자세한 내용은 이 공격이 읽는 값.
클래스에 따라 커지는 수치
"values": { "caster": "@classlevel", "kit": "2 * @classlevel", "hp": "5" }여러 클래스 아래에 있는 클래스 고유 값: 캐스터 레벨, 클래스 레벨당 2 킷 포인트, 그리고 그냥 보유만으로 +5 히트 포인트. 클래스별로 합산되어, 위저드 2 / 클레릭 3의 캐스터 레벨은 5가 돼요. 숙련을 조건으로 하는 영웅적 능력은 이렇게 읽어요 @classlevel.sentinel >= 10 or @mastered >= 1. 자세한 내용은 클래스에 걸친 수치.
각 클래스의 주사위별 히트 포인트
"hit_points": "@classfirst * (floor(@own.hit_die / 2) - 1) + @classlevel * (floor(@own.hit_die / 2) + 1)"
Classic d20의 클래스 기본값, 보유한 각 클래스마다 한 번씩 계산: 첫 클래스는 첫 레벨에 주사위 전체, 이후 레벨마다 주사위 평균, 나중 클래스는 첫 레벨부터 평균. 파이터 1 / 위저드 1은 10 + 4를 받아요. 자세한 내용은 클래스별로 계산되는 기본값.
보너스·페널티 주사위가 있는 백분위
d100t(@edge) read: roll under, target @stat.mod * @difficulty
헝거 풀: 일부 주사위는 위험해요
(@stat - @hunger)d10>=6 + (@hunger)d10[Hunger]>=6
두 그룹의 성공을 합산하고, 그다음 룰 카드가 이렇게 읽어요 @group.Hunger.ones — 헝거 주사위에서 나온 1이 실패를 더 나쁜 결과로 바꾸게요.
10 단위의 성공도
roll: d20 + @stat.mod read: total against @difficulty, steps 10, naturals 20 / 1 shift the degree
대항 거짓말
opposed: { "deception": "10 + @opp.insight.mod" }자리에 있는 상대에게 하는 거짓말은 난이도 대신 상대의 수동 Insight로 굴려요.