규칙 집합 시트
이 페이지에서는 규칙 집합의 캐릭터 시트를 설계합니다. 능력치, 기술, 필드와 목록, 실시간 상태, 부상 트랙, 페널티, 휴식과 Game Master 텍스트, 그리고 파티 시트와 진행 시계를 다룹니다. 규칙 집합 작성자를 위한 페이지입니다. 시작하기 전에 Game Mode 규칙 집합 작성하기를 읽으세요.
시트
sections는 편집기 항목을 묶습니다. 필드, 파생 값, 목록은section으로 자신이 속한 구역을 지정하며 능력치, 기술, 내성도 지정할 수 있습니다. 그러면 편집기, 게임 시트, Game Master의 시트 블록이 이를 그 제목 아래에 표시합니다(구역을 지정하지 않은 시트는 이전과 똑같이 표시합니다). 구역에는untrained규칙(아래 참고)도 넣을 수 있습니다.abilities는 핵심 능력치입니다.skills와saves는 각각 굴림에 쓸 능력치,cap,untrained규칙(아래 참고)을 지정할 수 있습니다.fields는 단일 값입니다. 타입은number,text,longtext,boolean,enum(고정 선택지),dice(1d8같은 텍스트)입니다.text필드나 목록 열에는suggestions를 추가할 수 있습니다(Capability API 1.796). 단어를 최대 40개까지 아래에 칩으로 제시하고, 각 칩을 누르면 작성된 내용에 해당 단어를 추가하며, 필드는 여전히 자유롭게 입력할 수 있습니다. 생물 유형 중에서 고르는 레인저의 선호하는 적 등이 그 예입니다. 이런 필드에는pick으로 몇 개를 고를지도 지정할 수 있습니다(Capability API 1.797). 클래스 레벨에 따라 늘어나는 파생 개수처럼 시트에서 읽는 값입니다. 편집기는 "Choose N"을 표시하고 선택한 개수를 보여 주며, N개가 들어가면 더 이상 칩을 제시하지 않지만 직접 입력한 내용은 거부하지 않습니다.derived는 다른 값에서 계산하며 직접 덮어쓸 수 없습니다. 시트는 최대 800개를 가질 수 있으며(Capability API 1.729. 1.111부터 400개, 1.88부터 240개, 1.84부터 120개, 그 전에는 60개), 240개를 넘는 패키지는 1.111을 선언하고 400개를 넘는 패키지는 1.729를 선언합니다. 연산은sum,min,max,scale(고정 수로 곱하고 반올림),multiply(Constitution 수정치 곱하기 레벨처럼 값 두 개에서 여섯 개를 서로 곱함. Capability API 1.82),stepTable(레벨에서 숙련 보너스를 찾듯 경계값 표로 조회),enumTable(열거형 필드나 실시간 상태의 각 값에 대응하는 숫자. 아래 실시간 상태 참고)입니다.lists는 장비, 주문, 특성 같은 자체 열을 가진 표입니다. 목록은 열을 최대 24개 가지며, 열이 12개를 넘는 목록이 있는 패키지는 Capability API 1.165를 선언합니다.pools가 있는 목록은 사용 횟수가 제한된 클래스 특성 등을 위해 각 행을 자체 최대값이 있는 자원으로 만듭니다. 숫자 열은 굴림으로 채울 수 있습니다."roll": { "count": 1, "sides": 8 }처럼 쓰며sides는 숫자, 같은 행의 다른 열({ "column": "die" }, 숫자 열이나d8처럼 값이 주사위로 읽히는 열거형), 또는 시트 값입니다. 시트 편집기는 Engine 자체 주사위를 던져 합계를 쓰는 Roll 버튼을 표시하며, 합계는 열의min과max로 제한합니다(Capability API 1.85).live는 플레이 중 바뀌는 내용입니다.pools(체력, 주문 슬롯, Grit),tracks(탈진 같은 범위 값 또는 칸에 표시하는 부상 트랙),text(집중 중인 대상 같은 짧은 메모),conditions,states(형태나 자세처럼 닫힌 집합 중 하나의 값)입니다.
숫자를 읽는 것은 값 참조로 지정합니다. 정확히 하나의 키를 가진 객체이며 키는 const, field, derived, abilityScore, abilityMod, abilityModFromField, skillMod, saveMod, listSum, livePool, liveTrack, itemStat입니다. 예를 들어 최대값이 파생 값인 풀은 "max": { "derived": "grit_max" }입니다.
listSum은 목록의 숫자 열 하나를 합산합니다.{ "listSum": { "list": "gear", "column": "bulk", "onlyWhen": "packed" } }처럼 씁니다.onlyWhen은 선택 사항이며 불리언 열을 지정하고, 그 열이 설정된 행만 셉니다. 빈 칸은 해당 열의 기본값으로 세고,hideWhen이 숨긴 목록은 아무것도 더하지 않습니다. Ember Roads는 캐릭터가 챙긴 장비에서 이렇게 Burden을 계산하므로 직접 입력한 숫자처럼 목록과 어긋나는 일이 없습니다. 카탈로그의 연동 열은 파생 값을 거치더라도 목록 합계를 읽을 수 없습니다. 목록에는 자체 연동 칸이나 그 합계를 다시 읽는 연동 칸이 있을 수 있어 재계산이 끝나지 않기 때문입니다.livePool은live.pools중 하나에 남은 양을 읽습니다(목록 행의 풀은 해당하지 않습니다).liveTrack은live.tracks중 하나를 읽으며 선택적read를 가집니다."value"는 현재 위치(기본값),"filled"는min보다 얼마나 위인지,"remaining"은max보다 얼마나 아래인지이며, 부상 트랙에서만 쓸 수 있는"penalty"는 적용 중인 페널티입니다. 숨겨진 풀이나 트랙은 0으로 읽습니다. Gravewatch의 "Harm still to take"는{ "liveTrack": "harm", "read": "remaining" }입니다.- 실시간 읽기는 판정을 굴릴 때, 전투가 시작될 때, Game Master의 시트 블록을 작성할 때의 실시간 상태를 읽습니다. 아직 실시간 상태가 없으면(시트 편집기, 가져오기 검토) 플레이가 시작될 때의 상태를 읽습니다. 풀은
start에 따라 가득 차거나 비어 있고, 트랙은default에 있으며, 부상 트랙은 비어 있습니다. - 실시간 상태가 생기기 전에 계산하는 값은 실시간 값을 읽을 수 없습니다. 풀이나 트랙의
max, 숙련 보너스, 카탈로그의 연동 열이나 증가량이 해당합니다. 실시간 값을 읽는 파생 값이나 실시간 값이 상한을 정하는 기술을 거쳐도 마찬가지이며, 가져오기가 그런 값을 지목합니다. - 이 세 가지는 패키지 규칙 집합에서 Capability API 1.39입니다.
itemStat은 착용한 방어구의 방어 수치처럼 캐릭터가 지닌 아이템을 읽으며 실시간 읽기와 같은 규칙을 따릅니다. 시트의 아이템을 참고하세요. Capability API 1.52.
훈련하지 않은 판정. 캐릭터가 훈련하지 않은(단계가 첫 단계인) 기술이나 내성은 규칙 집합이 달리 정하지 않으면 평소처럼 굴립니다. 기술이나 내성, 또는 그것이 속한 구역에 untrained를 두어 정하며 기술이나 내성 자체의 규칙이 우선합니다.
"sections": [{ "id": "labour", "label": "Labour", "untrained": { "by": -1 } }],
"skills": [
{ "id": "dig", "label": "Dig", "ability": "sinew", "section": "labour", "untrained": "refuse" },
{ "id": "listen", "label": "Listen", "ability": "nerve", "untrained": "harder" }
]"normal": 평소대로입니다(기본값).{ "by": -3 }: -20부터 20까지의 값을 판정 숫자에 더합니다. 풀에서는 주사위, 합산에서는 고정 수치입니다. 시트가 표시하고 모든 판정이 굴리는 숫자의 일부이며cap보다 먼저 적용됩니다."harder": 한 단계 어려워집니다. 풀에서는 주사위별 목표가 1 오르므로(목표 범위 안에서) 목표를 옮길 수 있는 풀 규칙 집합이 필요합니다. 그 밖의 경우에는 굴림을 바꿀 수 없으므로 가져올 때 거부합니다."refuse": 판정을 아예 굴리지 않습니다. Engine은 Game Master의 요청을reason="untrained"와 함께 되돌려 쓰며 이것으로 처리가 끝납니다. 나중에 굴리는 일도 없고, Game Master는 캐릭터가 시도할 수 없었다는 안내를 받으며 서술도 그렇게 합니다. 기술 판정 엔드포인트는 이런 판정에 400(skill_check_untrained)으로 응답하며, 이 판정에 따른 분기는 어느 쪽도 남기지 않습니다. 시트 편집기는 이 기술에 숫자를 표시하지 않습니다.- 시트가 없는 캐릭터는 읽을 훈련이 없으므로 미훈련 규칙이 적용되지 않습니다.
- Game Master의 리마인더는 미훈련 규칙을 구역별 또는 기술별로 나열하므로 Game Master는 캐릭터가 할 수 있는 판정을 요청합니다.
능력치, 기술, 내성의 구역 지정과 모든 위치의 untrained는 패키지 규칙 집합에서 Capability API 1.41입니다.
기술이나 내성은 cap을 가질 수 있습니다. 그 판정이 도달할 수 있는 최댓값을 정하는 값 참조로, 넘어설 수 없는 평점이나 판정을 억누르는 트랙입니다. Gravewatch는 Soothe를 파수꾼에게 남은 Resolve로 제한합니다("cap": { "livePool": "resolve" }). 시트가 표시하고 모든 판정이 굴리는 숫자는 제한된 숫자이며, with= 교체는 제한 전 숫자로 계산한 뒤 다시 제한합니다. 상한은 기술이나 내성 수정치를 읽을 수 없으며, 상한이 읽는 파생 값과 그보다 앞에 선언된 파생 값도 마찬가지입니다. 따라서 시트는 여전히 위에서 아래로 한 번에 계산됩니다. Capability API 1.39.
hideWhen은 다른 필드의 값에 따라 필드, 파생 값, 목록, 풀, 일반 트랙을 숨기며 방식은 세 가지 중 정확히 하나입니다. 값 하나와 같을 때(equals), 값 하나와 다를 때(notEquals, 필드가 다른 값을 가질 때마다 숨기며 "이런 캐릭터에게만"을 표현하는 방법입니다), 값 목록에 있을 때(in)입니다. 지정한 모든 값은 필드가 가질 수 있는 값이어야 하며 그렇지 않으면 규칙이 일치할 수 없습니다. 값은 하나씩 검사하며, notEquals와 in에서는 숫자 필드의 범위와 텍스트 필드의 길이도 포함합니다. 규칙은 시트 편집기가 표시하는 값을 읽습니다. 설정하지 않은 필드는 빈 시트의 시작 값이고, 규칙 집합이 더 이상 제공하지 않는 열거형 값은 필드의 기본값입니다. 5e 파일은 equals로 주문을 쓰지 않는 캐릭터에게 주문 슬롯을 숨깁니다. Gravewatch는 "hideWhen": { "field": "watch", "notEquals": "night" }로 야간 경계를 서지 않는 모든 파수꾼의 시트에서 등불 기름을 숨깁니다. 레이어는 이 규칙들이 비교하는 값을 제외할 수 없습니다. 부상 트랙은 시트 표시와 관계없이 굴림과 전투가 읽으므로 숨길 수 없습니다. notEquals와 in은 Capability API 1.39입니다.
일반 트랙의 max는 숫자 대신 값 참조일 수 있으므로 캐릭터의 평점이 트랙 길이를 정할 수 있습니다("max": { "field": "willpower_rating" }). min과 default는 숫자로 유지합니다. 이름 붙은 단계가 있는 부상 트랙의 max는 단계 수와 같고, 번호 칸으로 된 트랙은 자체 max만큼 깁니다(아래 번호 칸 참고). alwaysShow: true는 매 턴 중요한 평점을 위해 트랙이 기본값이어도 Game Master의 시트 블록에 출력합니다. 없으면 기본값인 트랙은 생략합니다. 0인 죽음 내성 세 개는 아무 정보도 주지 않기 때문입니다. 이 세 가지는 패키지 규칙 집합에서 Capability API 1.37입니다.
실시간 상태: 형태, 자세, 불빛
열거형 필드는 캐릭터를 만들 때 고른 뒤 그대로이고, 상태 이상은 켜거나 끄는 것뿐입니다. 실시간 상태는 플레이 중 바뀌는 닫힌 집합 중 하나의 값입니다. 변신하는 캐릭터의 형태, 전투 자세, 등불의 밝기 등입니다.
"live": {
"states": [
{
"id": "stance",
"label": "Stance",
"values": ["guarded", "steady", "reckless"],
"valueLabels": { "guarded": "Guarded", "steady": "Steady", "reckless": "Reckless" },
"default": "steady"
}
]
}values는 2~40개이며 각각valueLabels항목이나 값 자체로 표시합니다. 모든 라벨과 같은 규칙(한 줄, 대괄호 없음, 매크로 중괄호 없음)을 따르며, 시트 명령이 따옴표로 감싸므로 큰따옴표를 넣을 수 없습니다. 상태는 최대 열두 개입니다.default는 모든 시트의 시작 값이며 생략하면 첫 값입니다. 기본값에서 바뀐 상태만 저장하며, 상태가 더 이상 제공하지 않는 저장 값은 기본값으로 읽습니다.hideWhen은 풀과 마찬가지로 필드 값에 따라 시트에서 상태를 제외합니다. 표시하지 않고, 명령으로 설정할 수 없으며, 표(아래 참고)는 값이 전혀 없는 것으로 읽습니다.- Game Master는
[sheet: who="Name" op="state" state="Stance" value="Reckless"]로 설정하며, 상태는 ID나 라벨로, 값은 값 자체나 라벨로 지정합니다. 시트에 없는 상태나 값은 거부합니다(unknown-state,unknown-value). Engine은 규칙 집합에 상태가 있을 때만 명령을 가르치고 모든 값을 나열하며, 모든 시트 블록은 기본값을 포함해 각 상태의 값을 알려 줍니다. "인간 형태" 같은 사실은 서술에 매 턴 필요하기 때문입니다. - 게임의 시트 화면은 상태마다 선택기를 표시합니다.
- 휴식은 상태를 지정한 회복 단계로 상태를 되돌립니다.
{ "state": "stance", "to": "default" }처럼 쓰거나"to"에 값 하나를 지정합니다.
따라오는 숫자. "op": "enumTable"인 파생 값은 열거형 필드나 실시간 상태의 각 값에 대응하는 숫자를 줍니다.
{
"id": "stance_brawn",
"label": "Stance on Brawn",
"op": "enumTable",
"from": { "liveState": "stance" },
"table": { "guarded": -1, "reckless": 2 },
"default": 0
}from은field(열거형 필드)나liveState중 정확히 하나를 지정합니다.table의 모든 행은 그 대상이 가질 수 있는 값이며 1~40개입니다. 표에 없는 값과 시트가 숨긴 상태는default로 읽습니다(생략하면 0).- 필드는 캐릭터를 만들 때 고정되므로 필드를 키로 하는 표는 최댓값에 쓸 수 있습니다. Gravewatch는 새벽 경계를 서는 파수꾼에게 Resolve를 하나 더 줍니다. 실시간 상태는 플레이 중 바뀌므로 이를 키로 하는 표는
liveTrack처럼 실시간 읽기입니다. 실시간 상태가 생기기 전에 계산하는 값은 직접이든 다른 파생 값을 거쳐서든 이를 읽을 수 없습니다. 키가state가 아니라liveState인 이유입니다. 실시간 상태를 읽는 키에는 모두live가 붙으므로 작성자와 가져오기 모두 최댓값이 무엇을 쓸 수 없는지 구분할 수 있습니다. - 숫자를 주사위에 반영하려면
resolution.adjust가 이를 가리키게 하세요(시트의 수정치 참고). Ember Roads는 Stance를 모든 Brawn 굴림에 더하고, Gravewatch는 닫히거나 꺼진 등불만큼 모든 Nerve 굴림에서 뺍니다. - 레이어는 표에 행이 있는 필드에서 값을 제외할 수 있습니다. 레이어가 켜져 있는 동안 그 행은 읽히지 않습니다.
실시간 상태, enumTable, state를 지정한 휴식 단계는 패키지 규칙 집합에서 Capability API 1.42입니다.
부상 트랙: 숫자 대신 트랙인 체력
체력을 세지 않는 시스템도 많습니다. 점점 나빠지는 칸의 열을 만들고 다칠 때 표시합니다. live.tracks 항목에 kinds와 함께 이름 붙은 levels 또는 번호가 붙은 boxes(아래 참고)를 주면 범위 숫자가 아닌 이런 형태가 됩니다.
시스템에 필요한 형태는 무엇인가요? 풀은 받은 피해량을, 트랙은 각 피해의 양과 종류를 기록합니다. 타격성, 치명성, 악화성 부상을 구분하며 악화성은 천천히 낫거나 흡수하지 못하거나 결국 죽음에 이르게 하는 등 타격 후에도 종류가 중요하면, 굴림 뒤에도 이를 보관해야 합니다. 종류를 보관하는 것은 표시뿐입니다. 점수 풀은 피해를 빼면 작은 숫자가 될 뿐 시트가 어느 점수가 어떤 종류였는지 기억하지 못합니다. 그래서 체력이 풀인 규칙 집합의 combat.damageKinds는 조용히 무시하지 않고 거부합니다. 풀에도 damageTypes를 두고 상대가 저항하거나 면역일 수 있습니다. 이는 이후 상처 종류가 아니라 타격의 얼마가 실제 들어가는지에 관한 문제이기 때문입니다.
{
"id": "harm",
"label": "Harm",
"min": 0,
"max": 4,
"levels": [
{ "label": "Scuffed", "penalty": 0 },
{ "label": "Winded", "penalty": -1 },
{ "label": "Bleeding", "penalty": -3 },
{ "label": "Down", "penalty": -99 }
],
"kinds": [
{ "id": "knock", "label": "K", "severity": 0 },
{ "id": "tear", "label": "T", "severity": 1 }
]
}levels는 좋은 상태부터 나쁜 상태까지 1~16단계입니다. 각각label과 0 이하의 정수penalty를 가집니다. 큰 음수로 행동 불능을 표현하므로-99도 괜찮습니다.kinds는 트랙이 받을 피해 1~6종류이며 각각id, 칸에 쓸 짧은label,severity를 가집니다. 심각도는 서로 달라야 하며 숫자는 순서 외 의미가 없어 간격은 자유입니다.- 둘은 함께 있어야 합니다.
levels나boxes없는kinds는 표시할 곳이 없어 거부하고,kinds없는levels나boxes는 표시에 종류가 필요하므로 거부합니다. 트랙은levels와boxes중 하나만 가지며 둘 다 가질 수는 없습니다. - 두 용어를 구분하세요.
kinds는 표시가 될 수 있는 종류를 규칙 집합이 정의한 것입니다. 표시는 플레이 중 그 종류 하나가 트랙에 놓인 것입니다. 정의는 종류를, 시트는 표시를 가집니다. - 부상 트랙은 표시 없이 시작하므로
min은 0입니다. 이름 붙은 단계가 있는 트랙은 단계 수만큼 길어max가levels.length이며, 다르게 선언하면 조용히 수정하지 않고 거부하므로 서로 다른 길이 둘을 파일에 두지 않습니다. 칸으로 된 트랙은 자체max만큼 길며, 이 값은 시트가 계산하는 값일 수 있습니다(아래 번호 칸 참고).
모호하게 이해하면 잘못된 트랙이 되므로 정확한 규칙을 설명합니다.
- 표시는 가장 심한 것부터 정렬합니다. 일곱 단계 트랙은 최대 일곱 표시를 담습니다.
- 표시는 끝에 붙이지 않고 기존 표시 사이에 심각도 순서로 배치합니다. 그 심각도가 차지할 수 있는 가장 높은 단계를 차지하고 가벼운 표시를 아래로 밉니다.
- 적용 페널티는 표시들의 합이 아니라 표시된 가장 아래 단계의 값입니다. 위 트랙의 표시 셋은
0 + -1 + -3이 아니라-3입니다. amount는 한 종류의 표시 개수이며 하나씩 적용합니다. 도중에 가득 찬 트랙도 처음부터 가득 찬 것과 같은 규칙을 따릅니다.- 가득 찬 트랙에 표시하면 새 표시를 더하지 않고 가장 가벼운 표시를 한 단계 올립니다. 새 표시 종류와 무관하게 자체 종류 순서에서 한 단계입니다.
- 최고 심각도를 넘게 될 표시는 최고에 머물며 들어가지 못한 것은 초과분으로 셉니다. 초과분도 저장하여 새로고침으로 이미 받은 피해를 잊지 않습니다.
- 회복은 같은 명령에 음수를 씁니다. 표시보다 초과분을 먼저 지웁니다. 트랙의 종류 하나를 지정한 회복은 그 종류의 표시만 지우므로, "타격성은 낫고 치명성은 남는다"는 음수 양과 함께
kind="bashing"을 씁니다. 트랙에 있는 종류를 지정하지 않은 회복은 가벼운 표시부터 지웁니다.
플레이 중 표시하기. Game Master는 [sheet: op="damage" track="harm" kind="knock" amount="1"]를 쓰고 음수 amount로 회복합니다. 칸 단위로 채우는 트랙에서는 타격이 들어갈 칸을 box="3"으로 덧붙입니다. 대신 pool=을 지정하는 기존 damage는 그대로입니다. 숫자만으로 새 표시 종류를 알 수 없어 부상 트랙에는 일반 track 명령을 거부합니다. 시스템이 기대하는 대로 플레이어도 시트에서 직접 표시하고 지울 수 있습니다.
전투도 표시할 수 있습니다. combat.health를 풀 대신 트랙에 지정하면 명중 타격이 combat.damageKinds.marks가 정한 칸 수에 해당 블록이 피해 타입을 대응시킨 종류의 표시를 남깁니다. 트랙이 가득 차면 캐릭터가 쓰러지며 죽음 규칙이 이를 읽습니다. 칸 단위로 채우는 트랙에서는 per-point 피해가 들어갈 칸을 지정하고 per-blow는 첫 칸을 겨누며, 어느 칸도 받을 수 없는 타격은 캐릭터를 쓰러뜨립니다. 이런 트랙을 쓰는 시스템에서 전투 불능이 뜻하는 바가 그것입니다. 회복은 종류와 관계없이 가장 가벼운 표시 하나를 지웁니다. 임시 점수를 둘 버퍼가 없으므로 임시 점수는 거부합니다. Engine은 트랙을 남은 단계 수로 읽으므로 전투의 다른 부분, 쓰러짐, 소생, 로그와 요약은 그대로입니다.
휴식도 부상 트랙을 회복할 수 있습니다. "to"로 트랙을 지정한 회복 단계는 초과분을 포함해 지정한 표시 수까지 줄입니다. 음수 "by"로 지정한 단계는 초과분부터 그 개수만큼 지우므로 "by": { "const": -2 }는 두 개를 지웁니다. kind도 지정한 단계는 그 종류의 표시만 지웁니다. Gravewatch의 "Catch your breath"는 { "track": "harm", "kind": "knock", "to": "min" }이며 타박은 고치고 찢긴 상처는 남깁니다. 휴식은 피해를 표시하지 않으므로 표시를 더하게 되는 단계는 아무것도 하지 않습니다. 양수 "by"도 마찬가지이며 아무 알림 없이 건너뛰므로 빼기 기호를 꼭 쓰세요.
이름 붙은 단계 대신 번호 칸
캐릭터가 강인한 만큼 트랙이 길어야 한다면 levels 대신 boxes를 주세요. 칸 수는 자체 max와 같으며, 이 값은 시트가 계산하는 값일 수 있고(실시간 상태를 읽는 값은 불가) 최대 64입니다.
{
"id": "strain",
"label": "Strain",
"min": 0,
"max": { "derived": "strain_boxes" },
"boxes": {
"penalty": {
"by": "remaining",
"table": [
[0, -1],
[1, 0]
]
}
},
"kinds": [{ "id": "strain", "label": "S", "severity": 0 }],
"fill": "indexed",
"onFull": "refuse"
}- 적용 페널티는
filled또는remaining칸 수를 기준으로table(파생 값과 같은 단계 표이며 페널티는 0 이하)에서 읽습니다. 그 숫자가 무엇이든 읽으므로 표시가 하나도 없어도 비용이 있을 수 있습니다. 어느 칸에 표시했는지와는 무관합니다. - 칸에는 번호가 붙습니다. 시트는 "Box 3"으로 표시하고, Game Master의 시트 블록은 단계 이름 대신 전체 칸 중 몇 칸이 표시되었는지 알려 줍니다.
칸 지정 채우기와 거부하는 트랙
"fill": "indexed"는 명령이box=로 지정한 칸(지정하지 않으면 첫 칸)이나 그 위의 다음 빈칸에 표시하며, 한번 놓인 표시는 옮기지 않습니다. 회복은 가장 가벼운 표시 중 가장 높은 칸의 것을 지웁니다. 시트 화면에서 플레이어는 비어 있는 어느 칸이든 클릭할 수 있습니다."onFull": "refuse"는 빈칸이 없을 때 가장 가벼운 표시를 올리는 대신 표시를 거부합니다. 명령 전체를 거부하므로 빈칸이 둘일 때 표시 셋은 하나도 들어가지 않습니다. 칸 지정 트랙은 항상 거부하므로 함께"onFull": "refuse"를 명시하세요.
목록이 더하는 단계
이름 붙은 단계가 있는 트랙에 "extra": { "list": "scars", "countColumn": "levels", "penaltyColumn": "penalty" }를 주면 시트의 목록이 캐릭터마다 트랙을 늘릴 수 있습니다. 각 행은 순서대로 자기 개수만큼의 단계(최대 16)를 자기 페널티로 더하며, 페널티가 그와 같거나 더 나은 마지막 단계 뒤에 놓입니다. 페널티가 같으면 그 단계 이름을, 다르면 페널티를 이름으로 씁니다. Gravewatch의 흉터가 이렇게 작동합니다. 시트가 숨긴 목록은 아무것도 더하지 않으며, 단계에 표시가 있는 상태에서 행을 삭제하면 더 이상 들어가지 않는 표시는 초과분으로 보존합니다. 시트를 편집한다고 피해가 없어지지는 않습니다.
boxes, fill, onFull, extra, 휴식 단계의 kind는 패키지 규칙 집합에서 Capability API 1.40입니다.
굴림 페널티
resolution.penaltyFrom은 이 규칙 집합의 모든 판정에 페널티를 적용할 부상 트랙을 지정합니다. 추정하지 않고 선언하므로 생략한 규칙 집합은 부상 트랙 도입 전과 같은 방식으로 굴립니다.
페널티의 작용은 시트 숫자와 마찬가지로 판정 종류가 정합니다.
dice-pool은 풀에서 주사위를 빼고 자체pool.min을 하한으로 합니다.pool.min이 1이면 맨 아래 단계도 한 개를 던지며,pool.min이 0이면 아무것도 던지지 않고 실패합니다.dice-sum은 굴림의 고정 수정치이며 능력치와 훈련이 더하는 숫자에 합칩니다.
지정한 트랙은 부상 트랙이어야 합니다. 일반 트랙에는 적용할 페널티가 없어 가져올 때 거부합니다. 결과는 적용 페널티를 알려 주사위가 줄어든 이유를 보여 주며 Game Master의 시트 블록도 단계와 비용을 표시합니다.
시트의 수정치
시트의 일부 숫자는 관련된 모든 굴림에 따라붙습니다. 무거운 짐은 모든 등반에, 방어구 페널티는 모든 은신에, 축복은 모든 것에 붙습니다. resolution.adjust가 이를 선언하며 두 종류 모두에서 쓸 수 있습니다.
"adjust": [{ "value": { "derived": "burdened" }, "abilities": ["brawn"] }]value는 파생 값이 읽는 것과 같은 형태의 시트 값이며 실시간 상태도 포함합니다. 음수는 뺍니다. Ember Roads는 캐릭터가 챙긴 장비의 부피를 Burden으로 합산하고, 단계 표가 그 3마다 각 Brawn 굴림에서 1을 뺍니다. 형태나 자세가 주사위에 반영되는 방법은 실시간 상태를 키로 하는 표입니다(실시간 상태 참고).abilities는 선택 사항입니다. 지정하면 그 능력치 중 하나로 굴리는 판정에만 적용됩니다. 능력치 자체, 그 능력치를 쓰는 기술이나 내성,with=로 그 능력치와 함께 굴린 기술, 그 능력치를 포함한 능력치 쌍입니다. 생략하면 모든 판정에 적용됩니다.- 부상 페널티와 같은 위치에 적용합니다. 풀에서는 같은
pool.min하한 아래에서 주사위로, 합산에서는 기록이 합산하는 수정치 안의 고정 숫자로 적용합니다. 항목은 최대 여덟 개이며 판정마다 합산합니다. - 규칙 집합 전투는 전투가 시작될 때 시트로 만드는 모든 굴림에 이를 더합니다. 능력치나 기술로 굴리는 공격, 내성, 능력치·기술·내성에서 읽는 겨루기 판정과 우선권은 그 능력치의 항목을 받고, 그 밖에 굴리는 것은 모든 굴림에 적용되는 항목만 받습니다.
- 시트가 없는 캐릭터는 수정치를 받지 않는 것과 마찬가지로 이것도 받지 않습니다.
결과는 시트가 더한 값을 알려 주므로(기록의 adjust="-2"와 주사위 카드의 한 줄) 플레이어가 굴림 결과의 이유를 알 수 있습니다. 패키지 규칙 집합에서 Capability API 1.38입니다.
휴식
휴식은 회복 단계와 지울 것의 목록입니다. 각 단계는 대상 하나(pool, poolGroup, listPools, track, state)를 지정하고 값을 설정하거나("to": "max", "to": "min", 숫자) 변경합니다("by": { "const": 1 }, "by": { "fractionOfMax": 0.5 }). 부상 트랙 단계는 회복만 할 수 있으므로 by가 음수이며 위에서 설명합니다. 실시간 상태 단계는 "default"나 그 값 중 하나로 설정만 합니다. fractionOfMax가 있는 poolGroup 단계는 그룹의 각 풀을 각자의 비율만큼 바꿉니다. "shared": true(Capability API 1.77)를 더하면 대신 그룹 전체의 최대치로 비율을 계산하고, 시트가 나열한 순서대로 그룹의 풀에 각자 부족한 만큼까지 나눠 줍니다. 주사위 종류마다 풀 하나에 담는 히트 다이스의 "캐릭터 총수의 절반"을 회복하는 5e의 긴 휴식은 { "poolGroup": "hit_dice", "by": { "fractionOfMax": 0.5, "round": "down", "min": 1 }, "shared": true }입니다.
Game Master 텍스트
checkGuidance는 Game Master에게 판정 요청 방법을 알려 주는 내장 문단을 대체합니다. 어떤 시스템이며 언제 굴릴지 쓰세요. Game Master는 기술과 난이도만 지정하며 Engine이 시트로 계산하고 굴리므로 모델에게 계산을 요구하지 마세요.sheetGuidance는 프롬프트에서 시트를 소개합니다. 중요한 자원과 소비 시점을 설명하세요.worldGuidance는 선택 사항이며 세계 생성 시 한 번만 읽습니다. 화약 없음, 희귀한 마법, 걸어 다니는 망자 등 GM이 만드는 세계관을 규칙에 맞춥니다. 턴에는 들어가지 않습니다.opposition은 전투의 상대편을 누가 플레이하는지 지정합니다(Capability API 1.774)."game-master"는 모든 상대의 턴을 Game Master에게 맡기며, Game Master는 Engine이 제시하는 선택지 중 하나를 고르고 응답하지 않으면 Engine 자체 선택기가 대신 고릅니다. 플레이어가 Game Master에게 보스를 맡기도록 허용한 게임에서만 적용되며,combat블록이 없는 규칙 집합의 Classic 또는 Tactical 전투를 포함한 모든 전투 스타일에 적용됩니다. Fate, Blades in the Dark, Trophy, Lasers & Feelings처럼 상대편을 피해의 합이 아닌 이야기로 플레이하는 서사 중심 시스템에 사용하세요."engine"을 쓰거나 생략하면 Engine의 선택기를 유지하며, 보스와 플레이어가 요청한 경우 이름 있는 상대 및 천재적인 사고를 하는 상대는 Game Master가 맡습니다. 이 키를 사용하는 규칙 집합에는 Capability API 1.774가 필요합니다.sheetSummary는 캐릭터마다 GM에게 보일 필드, 파생 값, 목록 행을 고릅니다. Engine은 능력치 수정치, 훈련된 기술과 내성, 실시간 값을 항상 표시합니다. 매 턴 보내므로 나머지는 짧게 유지하세요. 요약 목록의nameColumn은 텍스트 열이나 열거형 열일 수 있으며(열거형은 값의 라벨을 표시),columns는 이름 뒤에 출력할 행 자체의 열을 최대 세 개 더 지정합니다. 따라서 블록에 이름만 나오지 않고Gear: Crowbar 1d6처럼 나옵니다. 불리언 열은 설정되어 있으면 라벨을 출력합니다. 둘 다 패키지 규칙 집합에서 Capability API 1.37입니다.sheetGuidance에서 시트 명령을 가르칠 필요는 없습니다. Engine이 파일이 선언한 이름으로 모든 명령을 직접 가르치며, 규칙 집합에 부상 트랙이 있으면 표시용op="damage"명령을 추가하고 그 단계와 피해 종류를 나열합니다. 실시간 상태가 있으면op="state"명령을 추가하고 각 상태가 가질 수 있는 값을 나열합니다.
전체 GM 규칙 참고 자료
선택적 최상위 gmReference는 Game Master를 위한 규칙 집합의 전체 규칙 참고 자료를 최대 16,000자까지 담습니다. 확장된 재정 규칙은 여기에 두고, 짧은 판정·자원 지시는 gm.checkGuidance와 gm.sheetGuidance에 두세요. 이 필드들과 gm.worldGuidance에는 여전히 1,500자 제한이 있으며, 레이어 지침도 기존 제한을 유지합니다.
"gmReference": "When a journey crosses hostile country, judge supplies, shelter and exposure before the next leg. A failed navigation check costs time rather than silently moving the party to its destination."참고 자료는 안정적인 시스템 프롬프트의 Game Master rules reference 아래에 요청마다 한 번 나타납니다. 턴별 리마인더에는 복사하지 않습니다. 다른 프롬프트 안전 텍스트처럼 제어 문자, 대괄호, 매크로 중괄호({{와 }}) 없이 한 줄이어야 합니다. 평소의 대화 기록·답변 예산 조정 뒤에도 요청이 컨텍스트 제한을 넘으면, 핵심 지시를 자르기 전에 잘렸다는 표시와 함께 참고 자료를 줄입니다. 기존 프롬프트를 유지하려면 설정하지 마세요. 이를 쓰는 패키지는 매니페스트에 schemaVersion: 2와 capabilityApi: { "major": 1, "minor": 145 } 이상을 선언해야 합니다.
파티와 장면의 진행 시계(clocks)
Capability API 1.143은 선택적 최상위 clocks 객체를 추가합니다. 생략하면 시계 명령은 꺼진 상태로 남습니다. 객체는 엄격하여 다음 세 키만 받습니다.
"clocks": {
"sizes": [4, 6, 8],
"max": 8,
"text": "Create clocks for looming threats and long projects. Tick them when the fiction advances."
}sizes는 2~12 사이의 서로 다른 정수 칸 수를 1~6개 허용하며 기본값은 [4, 6, 8]입니다. max는 한 번에 유지하는 시계의 최대 수로 1~12이며 기본값은 8입니다. 선택적 text는 GM이 언제 시계를 만들고 칸을 채울지 설명하는 최대 400자의 프롬프트 안전 한 줄입니다. 빈 객체는 기본값으로 켭니다.
시계는 캐릭터가 아니라 파티와 장면에 속합니다. GM 리마인더는 매 턴 시계의 이름과 채운 정도를 나열하고 다음 명령을 가르칩니다.
[clock: name="Alarm raised" size="6"]는 빈 시계를 만듭니다. 허용되지 않은 크기, 이미 있는 이름(대소문자 구분 없음),max도달 시에는 생성을 거부합니다.[clock: name="Alarm raised" tick="2"]는 칸을 더 채웁니다. 음수는 칸을 비우며, 채운 양은0..size범위로 제한합니다. 가득 찬 시계는 완료된 것으로, 계속 표시되며 지울 때까지max에 포함됩니다. 음수로 칸을 비우면 다시 열 수 있습니다.[clock: name="Alarm raised" clear]는 지정한 시계를 없앱니다.
이름은 큰따옴표, 대괄호, 제어 문자, 매크로 중괄호가 없는 1~100자의 한 줄입니다. 각 태그는 정확히 하나의 동작을 요청합니다. 명령은 답변 순서대로 적용하므로 한 답변에서 시계를 만들고 칸을 채울 수 있습니다. Engine은 각 태그를 result="ok" now="4/6"(또는 now="cleared")이나 result="refused" reason="..."로 다시 씁니다. 모델이 쓴 결과 속성은 버립니다. 알 수 없는 시계와 잘못된 요청은 거부하며, 답변 하나에 명령은 최대 40개까지 적용합니다.
Game Mode는 파티 상태 옆에 칸으로 나뉜 원, 이름, 채운 정도를 표시합니다. 태그는 저장된 답변에 영수증으로 남고 서술에서는 숨겨집니다. 시계는 각 게임 상태 스냅샷에 rulesetClocks로 저장되며, 데이터가 없으면 시계가 없는 것입니다. 재생성은 이전 스냅샷에서, 이어 쓰기는 현재 스냅샷에서 시작하며, 스와이프나 메시지를 선택하거나 제거하면 그 스냅샷의 나머지와 함께 시계도 복원합니다.
파티 시트: 크루, 우주선, 공유 Story Points
Capability API 1.144는 sheet 옆에 선택적 최상위 party를 추가합니다. 게임마다 공유 시트 하나를 담으며, Blades의 크루, Lasers & Feelings의 우주선, Genesys의 Story Points 등이 해당합니다.
"party": {
"label": "Crew",
"fields": [
{ "id": "heat", "label": "Heat", "type": "number", "min": 0, "max": 9, "default": 0 },
{ "id": "vault", "label": "Vault capacity", "type": "number", "min": 0, "max": 16, "default": 8 },
{ "id": "upgrades", "label": "Upgrades", "type": "text", "maxLength": 400 }
],
"pools": [{ "id": "coin", "label": "Coin", "max": { "field": "vault" }, "start": "empty" }],
"advancement": { "fields": ["heat", "vault", "upgrades"], "text": "Record heat after a score." },
"text": "Coin belongs to the crew."
}fields는 sheet.fields와 같은 필드 스키마를 쓰고, pools는 start, group, hideWhen, allowTemp를 포함해 sheet.live.pools와 같은 스키마를 씁니다. 필드나 풀이 하나 이상 필요하며 ID는 파티 시트 안에서 고유해야 합니다. 캐릭터와 파티의 ID는 겹쳐도 됩니다. 이 마이너 버전에서 파티 시트에는 구역, 목록, 능력치, 파생 값, 캐릭터 시트 마이그레이션이 없습니다. 풀의 max는 상수나 파티의 숫자 필드를 읽습니다. 캐릭터 공식은 파티 값을 읽을 수 없고, 파티 공식은 캐릭터 값을 읽을 수 없습니다. hideWhen도 파티 필드만 지정합니다.
advancement.fields는 GM이 영구히 바꿀 수 있는 number, text, longtext 필드를 지정합니다. advancement.text와 text는 각각 최대 400자의 프롬프트 안전 한 줄을 받습니다. 선택적 summary는 gm.sheetSummary를 재사용합니다. fields는 파티 필드를 고르며 derived와 lists는 비어 있어야 합니다. 요약이 없으면 보이는 파티 필드를 모두 표시합니다. 풀은 항상 나타납니다.
[sheet: sheet="party" op="restore" pool="coin" amount="3"]
[sheet: sheet="party" op="spend" pool="coin" amount="2"]
[sheet: sheet="party" op="advance" field="heat" by="2"]
[sheet: sheet="party" op="advance" field="upgrades" to="Hidden vault"]sheet="party"는 공유 시트를 고르며 who는 생략합니다. 기존 who="party"는 여전히 모든 캐릭터에 적용되며 공유 시트는 바꾸지 않습니다. 이 마이너 버전은 파티 시트에서 spend, restore, 필드 advance를 허용합니다. 알 수 없는 시트, 지원하지 않는 동작, 부족한 풀, 선언하지 않은 성장, 잘못된 값은 거부하고 Engine의 결과로 다시 씁니다. 파티 풀은 캐릭터 풀과 같은 현재값/최대값 계산과 기본값을 따릅니다.
GM은 매 턴 캐릭터 시트 블록 옆에서 파티 라벨, 필드, 풀을 받습니다. Game Mode는 캐릭터 초상화 옆에 같은 시트 표시를 쓰는, 접을 수 있는 읽기 전용 파티 시트를 제공합니다. 영구 값은 채팅 메타데이터(gamePartySheet)에 gameCharacterCards와 나란히 한 번만 저장되며 성장 영수증을 공유합니다. 실시간 풀은 rulesetLive의 예약된 $party 항목을 쓰며, 정규화된 캐릭터 이름은 이와 겹칠 수 없습니다. 재생성은 답변 이전 상태에서 시작하며, 스와이프 선택이나 삭제는 기존 기록을 통해 영구 값과 실시간 값을 모두 복원합니다. party가 없는 규칙 집합은 기존 동작을 유지합니다.
공유 파티 생성(Capability API 1.163). 파티 시트는 lists(최대 12개이며 캐릭터 시트의 목록처럼 작성), 자체 안내형 builder, fromMembers를 가질 수 있습니다. 이는 파티의 캐릭터에서 읽는 파티 숫자 필드 최대 8개이며, 각각 { "field", "count": true }(캐릭터 수) 또는 { "field", "sum": "<character number field>" }(Totem 점처럼 캐릭터들의 값을 합한 것)입니다. 구성원 필드는 공유 시트를 읽을 때마다 그 시점의 캐릭터로 계산하므로 캐릭터가 합류하거나 떠나면 즉시 바뀝니다. 목록이 있으면 파티 summary.lists가 이를 지정할 수 있습니다.
빌더는 캐릭터의 빌더와 똑같이 작성하며(풀, 단계, 가격이 붙은 행, 소비 제안, 프로필), 파티 자체 필드와 목록을 기준으로 같은 규칙을 따릅니다. 카탈로그 단계와 행 복사 단계는 파티 목록에 공급하는 규칙 집합의 카탈로그를 읽을 수 있습니다. Game Mode에서는 어느 플레이어든 공유 시트의 Edit를 열 수 있으며, 여기서 안내형 설정을 제공하고 파티 전체를 위해 저장합니다. 각 저장은 그것을 연 시점의 리비전을 지정합니다(채팅 메타데이터의 gamePartySheetRevision이며 모든 저장과 이야기 자체의 변경이 올림). 다른 사람의 저장이 반영되기 전에 연 저장은 거부하고 더 새로운 시트를 보여 주며, 플레이어의 초안은 열린 채로 남으므로 다시 저장해 교체할지는 플레이어가 고릅니다.
"party": {
"label": "The Crew",
"fields": [
{ "id": "tier", "label": "Tier", "type": "number", "min": 0, "max": 4, "default": 0 },
{ "id": "size", "label": "Crew size", "type": "number", "min": 0, "max": 12, "default": 0 }
],
"lists": [{ "id": "upgrades", "label": "Upgrades", "columns": [{ "id": "name", "label": "Name", "type": "text" }] }],
"builder": { "steps": [{ "id": "upgrades", "label": "Upgrades", "kind": "rows", "list": "upgrades" }] },
"fromMembers": [{ "field": "size", "count": true }]
}