書く方への補足
JSON で下書きを準備する。形式の要点と、依頼文の例
Leafork の作品は、編集の画面だけで作れます。このページは、それとは別に、作品のファイル(JSON)を手もとで用意して読み込みたい方のための補足です。使わなくても、困ることはありません。
JSON は、作品の本文・選択肢・結末をまとめた、文字だけのファイルです。メモ帳などで開いて直すこともできますし、ChatGPT などの外部ツールに整形を頼むこともできます。Leafork の中に、文章や分岐を自動で作る機能はありません。外部ツールで用意したものを、Leafork に読み込む、という順になります。

流れ
- 形の見本を手に入れる。下の見本をダウンロードするか、自分の作品を編集の画面の「JSON書き出し」で書き出します。
- 中身を用意する。見本を書きかえるか、外部ツールに整形を頼みます(下の依頼文の例に、仕様の全文を入れてあります)。
- 読み込む。上の「書く」をひらき、「JSONをインポート」からファイルを選びます。
- 確かめて、直す。読み込んだ下書きを、編集の画面とテストプレイで確かめます。
見本
どちらも、導入が1つ、選択肢が2つ、結末が2つの、いちばん小さな形です。
- 最終列車と手紙(見本):小説を書く方への記事の例
- 屋根裏のひみつ(見本):イラストを描く方への記事の例(絵は入っていません)
見本は、Leafork の読み込みの検査を通ることと、「JSONをインポート」から読み込めることを確かめてあります。
読み込むと、どうなるか
- 新しい下書きが1つできて、編集の画面がひらきます。すでにある作品は、上書きしません。
- 題名の後ろに「(インポート)」が付きます。「作品設定」で直せます。
- 読み込んだだけでは、公開されません。
- 形が合わないとき(行き先のない選択肢がある、開始の場面がない、など)は、読み込まずに、理由を一覧で出します。
- 絵のファイルは、JSON には入りません。挿絵は、読み込んだあとに編集の画面で入れます。
- 同じ ID のパラグラフが2つあるなど、ID が重なっている JSON は、読み込みません(どちらかが黙って消えてしまうため)。
すでにある作品を、JSON で直す
書いている作品を「JSON書き出し」で書き出し、直した JSON を、同じ作品の編集の画面の「JSONで更新」から読み込むと、その作品の下書きを置き換えられます。外部のツールで、パラグラフや選択肢を書き足したいときに使えます。
- ID が同じパラグラフ・選択肢・章・エンディングは、そのまま続きます(読者の足あと・読みかけ・ふせんが、つながったままです)。書き出した JSON の ID は、変えないでください。
- 新しく足すパラグラフには、作品の中で重ならない、好きな ID を付けます(読み込むときに、Leafork が付け直します)。新しい選択肢には、ID を付けなくてかまいません。
- JSON にないものは、消えます。読み込む前に、そのまま・変わる・足す・消える、の数を見せるので、確かめてから置き換えます。
- 題名・紹介文・タグ・年齢区分は変わりません(「作品設定」で直します)。公開中の作品も変わりません。確かめてから、公開し直します。
- 置き換える前の下書きは控えに残り、「版の履歴」の「戻す前の下書きに戻す」で取り消せます。
形式の要点
文章と選択肢だけの作品なら、次の形で足ります。「……」のところに、自分の文章が入ります。
{
"format": "leafork-book",
"version": 2,
"book": {
"title": "最終列車と手紙",
"description": "紹介文",
"tags": ["短編"],
"settings": { "stats": [] },
"start": "p1",
"chapters": [{ "id": "c1", "title": "ホーム", "order": 0 }],
"endings": [
{ "id": "e_search", "name": "差出人をさがして", "type": "normal" },
{ "id": "e_train", "name": "同じ封筒", "type": "normal" }
],
"paragraphs": {
"p1": {
"no": 1, "chapter": "c1",
"text": "最終列車が来るまで、あと五分。……",
"choices": [
{ "label": "手紙を拾う", "to": "p2" },
{ "label": "手紙には触れず、列車に乗る", "to": "p3" }
]
},
"p2": { "no": 2, "chapter": "c1", "text": "……", "choices": [], "ending": "e_search" },
"p3": { "no": 3, "chapter": "c1", "text": "……", "choices": [], "ending": "e_train" }
}
}
}| 項目 | 内容 |
|---|---|
format・version | このとおりに書きます("leafork-book" と 2)。 |
title・description・tags | 題名(100字まで)・紹介文・タグ。 |
settings | 作品の設定。能力値を使わないなら、例のとおり { "stats": [] } と書きます(省くと、体力と運の2つの能力値が付きます)。 |
start | 最初に読む場面の ID。 |
chapters | 章。分けないなら、1つだけ書きます。 |
endings | 結末の一覧。type は good・normal・bad のどれか。 |
paragraphs | 場面(パラグラフ)の一覧。"p1" のような ID を見出しにして並べます。ID は、作品の中で重ならなければ、好きな英数字でかまいません。 |
no | 読者に見せる番号。重ならない整数にします。 |
text | 本文(5000字まで)。改行は \n と書きます。 |
choices | 選択肢。label が選択肢の文(200字まで)、to が行き先の場面の ID。1つの場面に20個まで。結末の場面は、空([])にします。 |
ending | 結末の場面にだけ書きます。endings の id を指します。 |
ダイス判定・キーワード入力・条件・効果・能力値も、JSON で書けます。はじめは使わなくてかまいません。書き方は、下の仕様の全文にあります。
仕様の全文(外部ツールに、そのまま渡せます)
項目の型(必ず書くもの・省けるもの・選べる値・長さの上限)、選択肢の4つの種類(移動・ダイス判定・キーワード入力・外れたときの行き先)の書き方と意味、守らないと読み込めない決まり、仕掛け入りの例をまとめたものです。外部ツールに形式を正確に伝えたいときは、これを丸ごと渡します。
Leafork の作品ファイル(JSON)の仕様
# Leafork の作品ファイル(JSON)の仕様
Leafork は、選択肢で読み進める物語(ゲームブック)のサービスです。これは、Leafork に読み込める作品ファイルの形式です。
ファイル全体で、1つの JSON オブジェクトです。文字コードは UTF-8。コメントと、末尾のカンマは書けません。本文の改行は \n と書きます。
## 1. 型
「?」の付いた項目は省けます。それ以外は、必ず書きます。ここにない項目は、書きません。
「A | B」は、A か B のどちらか。"…" は、そのとおりに書く文字です。
File = { "format": "leafork-book", "version": 2, "book": Book }
Book = { "title": 文字列(1〜100字),
"description"?: 文字列(2000字まで),
"tags"?: 文字列の配列(10個まで。1つ24字まで),
"settings": Settings,
"start": 場面ID,
"chapters": Chapter の配列(1個以上),
"endings": Ending の配列(0個以上),
"paragraphs": { 場面ID: Paragraph, … }(1〜5000個) }
Settings = { "stats": Stat の配列(0〜10個。能力値を使わない作品は []),
"allotPoints"?: 整数(0〜999),
"allotDice"?: ダイス,
"font"?: "serif" | "sans",
"skin"?: "standard" | "fantasy" | "mystery" | "horror" | "scifi" | "everyday" | "wafu" }
Stat = { "key": 能力値キー, "label": 文字列(1〜12字), "init": Init,
"max"?: 整数, "hidden"?: true, "fatal"?: true }
Init = { "mode": "fixed", "value": 整数 }
| { "mode": "dice", "dice": ダイス }
| { "mode": "allot", "base": 整数 }
Chapter = { "id": 章ID, "title": 文字列(1〜100字), "order": 整数(0 から順に) }
Ending = { "id": 結末ID, "name": 文字列(1〜100字), "type": "good" | "normal" | "bad" }
Paragraph = { "no": 整数(1以上。作品の中で重ならない),
"chapter": 章ID,
"text": 文字列(1〜5000字),
"choices": Choice の配列(0〜20個),
"effects"?: Effect の配列(20個まで),
"ending"?: 結末ID }
Choice = Go | Roll | Key | Miss
どの種類にも、"if"?: Condition を付けられます。
Go = { "label": 文字列(1〜200字), "to": 場面ID }
Roll = { "label": 文字列(1〜200字),
"roll": { "dice": ダイス, "target": 整数, "ok": 場面ID, "ng": 場面ID,
"by"?: "lte" | "even" | "odd",
"addStat"?: 能力値キー,
"okLabel"?: 文字列(20字まで), "ngLabel"?: 文字列(20字まで) } }
Key = { "label": "", "to": 場面ID, "key": { "words": 文字列の配列(1〜10個。1つ50字まで) } }
Miss = { "label": "", "to": 場面ID, "key": { "miss": true } }
Condition = { "item"?: 名前, "notItem"?: 名前, "flag"?: 名前, "notFlag"?: 名前,
"stat"?: 能力値キー, "gte"?: 整数 }
1つ以上の項目を書きます。"stat" と "gte" は、必ず2つそろえて書きます。
Effect = { "stat": 能力値キー, "add": 整数 }
| { "item": 名前 } | { "drop": 名前 }
| { "flag": 名前 } | { "unflag": 名前 }
場面ID・章ID・結末ID = 英数字と _ だけの文字列(64字まで)。同じ種類の中で重ならない。例:"p1" "c1" "e_good"
能力値キー = 英小文字で始まり、英小文字・数字・_ だけの文字列(16字まで)。例:"hp" "luck"
名前 = 持ち物や出来事の名前(1〜100字)。同じものは、どこでも一字一句同じに書く
ダイス = "個数d面の数"。必要なら、後ろに "+数" か "-数"。例:"2d6" "1d6+2"。個数は1〜10、足す数は99まで
整数 = −9999〜9999
## 2. 意味
- 読者は "start" の場面から読みはじめます。場面の "text" を読み、"choices" から1つを選んで、行き先の場面へ進みます。
- "no" は、読者に見せる場面の番号です。行き先は、番号ではなく場面ID で指します。
- Go(移動):選ぶと "to" の場面へ進みます。
- Roll(ダイス判定):選ぶとダイスを振ります。出た合計が "target" 以上なら "ok" の場面へ、そうでなければ "ng" の場面へ進みます。
- "addStat" を書くと、合計にその能力値を足します。
- "by": "lte" は、合計が "target" 以下なら成功。"even" は偶数、"odd" は奇数なら成功(このとき "target" は使われませんが、0 を書きます。"addStat" は書きません)。
- "okLabel"・"ngLabel" は、結果として読者に見せる言葉です(省くと「成功」「失敗」)。
- Roll には "to" を書きません。
- Key(キーワード入力):ボタンとしては見せず、場面に入力欄を1つ出します。読者の入力が "words" のどれかに合えば、"to" の場面へ進みます。
- ひらがなとカタカナ、全角と半角、大文字と小文字、空白のちがいは、同じ言葉として扱います。漢字とかなは別の言葉なので、両方を "words" に書きます。
- 1つの場面に Key をいくつ置いても、入力欄は1つです。上にあるものから順に照らします。
- どれにも合わなければ、読者はその場で入力し直せます。
- Miss(外れたときの行き先):その場面のどの Key にも合わなかったとき、"to" の場面へ進みます。Key のある場面にだけ、1つまで置けます。
- "if"(条件):書いた項目をすべて満たすときだけ、その選択肢が出ます(Key は、満たすときだけ照らします)。
- "item":その持ち物を持っている。"notItem":持っていない。
- "flag":その出来事が記録されている。"notFlag":記録されていない。
- "stat" と "gte":その能力値が "gte" 以上。
- "effects"(効果):その場面に入ったときに、上から順に起きます。
- "stat" と "add":能力値に "add" を足す(減らすときは負の数)。
- "item":持ち物を得る。"drop":持ち物を失う。
- "flag":出来事を記録する。"unflag":出来事の記録を消す。
- "ending":これを書いた場面で、物語が終わります。その場面の "choices" は [] にします。
- 能力値:"fatal": true の能力値が0以下になると、ゲームオーバーです。"hidden": true の能力値は、読者に見せません。"max" は上限です。
- "init" の "fixed" は決まった数。"dice" は、読みはじめにダイスで決める。"allot" は、"base" に、読者が持ち点("allotPoints"。"allotDice" があれば、その出目を足す)を振り分ける。
## 3. 必ず守ること(破ると、読み込めないか、書いたとおりに動きません)
1. "start" と、すべての "to"・"ok"・"ng" は、"paragraphs" にある場面ID にする。
2. どの選択肢も、"to" か "roll" のどちらか一方を持つ。
3. "addStat"、Condition の "stat"、Effect の "stat" は、"settings" の "stats" にある能力値キーにする。
4. ダイスは、上の書き方に合わせる。
5. Key の "words" には、言葉を1つ以上書く。
6. "mode": "allot" の能力値があるときは、"allotPoints" を1以上にするか、"allotDice" を書く。"mode": "fixed" の "value" は、"max" 以下にする。
7. "chapter" は "chapters" にある章ID、"ending" は "endings" にある結末ID にする。
## 4. 守るとよいこと(読み込めますが、作者に警告が出ます)
- 結末でない場面には、選択肢を1つ以上置く(行き止まりにしない)。
- すべての場面が、"start" から選択肢をたどって届くようにする。
- 条件に使う持ち物・出来事は、どこかの場面の "effects" で、得られる・記録されるようにする。
- Key だけの場面にしない(ふつうの選択肢か、Miss を置く。答えの分からない読者が、そこで止まるため)。
- 同じ場面の Key に、同じ言葉を重ねない。
- "no" は、1 からの通し番号にする。
- 必ず成功する・必ず失敗するダイス判定にしない。
## 5. 例
### 文章と選択肢だけの作品
{
"format": "leafork-book",
"version": 2,
"book": {
"title": "最終列車と手紙",
"description": "紹介文",
"tags": ["短編"],
"settings": { "stats": [] },
"start": "p1",
"chapters": [{ "id": "c1", "title": "ホーム", "order": 0 }],
"endings": [
{ "id": "e_search", "name": "差出人をさがして", "type": "normal" },
{ "id": "e_train", "name": "同じ封筒", "type": "normal" }
],
"paragraphs": {
"p1": {
"no": 1, "chapter": "c1",
"text": "最終列車が来るまで、あと五分。……",
"choices": [
{ "label": "手紙を拾う", "to": "p2" },
{ "label": "手紙には触れず、列車に乗る", "to": "p3" }
]
},
"p2": { "no": 2, "chapter": "c1", "text": "……", "choices": [], "ending": "e_search" },
"p3": { "no": 3, "chapter": "c1", "text": "……", "choices": [], "ending": "e_train" }
}
}
}
### 能力値・効果・条件・ダイス判定・キーワード入力を使った作品
{
"format": "leafork-book",
"version": 2,
"book": {
"title": "石の扉",
"description": "扉の向こうへ行く方法は、ひとつではない。",
"tags": ["短編", "ファンタジー"],
"settings": {
"stats": [{ "key": "hp", "label": "体力", "init": { "mode": "fixed", "value": 10 }, "fatal": true }]
},
"start": "p1",
"chapters": [{ "id": "c1", "title": "扉の前", "order": 0 }],
"endings": [
{ "id": "e_open", "name": "扉の向こう", "type": "good" },
{ "id": "e_back", "name": "引き返した道", "type": "normal" }
],
"paragraphs": {
"p1": {
"no": 1, "chapter": "c1",
"text": "石の扉が、道をふさいでいる。",
"choices": [
{ "label": "銀の鍵で開ける", "to": "p4", "if": { "item": "銀の鍵" } },
{ "label": "体当たりで破る", "roll": { "dice": "2d6", "target": 8, "ok": "p4", "ng": "p3" } },
{ "label": "まわりを調べる", "to": "p2", "if": { "notItem": "銀の鍵" } }
]
},
"p2": {
"no": 2, "chapter": "c1",
"text": "草むらに、銀の鍵が落ちていた。",
"effects": [{ "item": "銀の鍵" }],
"choices": [{ "label": "扉の前に戻る", "to": "p1" }]
},
"p3": {
"no": 3, "chapter": "c1",
"text": "扉はびくともしない。肩が痛む。",
"effects": [{ "stat": "hp", "add": -3 }],
"choices": [{ "label": "扉の前に戻る", "to": "p1" }]
},
"p4": {
"no": 4, "chapter": "c1",
"text": "扉の奥に、番人が立っていた。「合言葉を言え」",
"choices": [
{ "label": "", "to": "p5", "key": { "words": ["ひらけごま", "開けゴマ"] } },
{ "label": "引き返す", "to": "p6" }
]
},
"p5": { "no": 5, "chapter": "c1", "text": "番人は、黙って道をあけた。", "choices": [], "ending": "e_open" },
"p6": { "no": 6, "chapter": "c1", "text": "来た道を、ゆっくりと戻った。", "choices": [], "ending": "e_back" }
}
}
}外部ツールへの依頼文の例
どれも、必要なときにだけ使う例です。外部ツールに渡すのは、相談に必要な部分(一場面や、絵の内容の一言ずつ)だけでかまいません。出てきたものは案として読み、残すところを自分で選びます。
以下は私が書いた小説の一場面です。 読者が選べる行動を二つ提案してください。 元の本文は変更せず、登場人物の性格と世界観を保ってください。 それぞれの行動の先で何が起きるか、短いあらすじを添えてください。 不明な設定は勝手に追加せず、質問してください。 (ここに、相談したい一場面を貼る)
私が描いた絵を、選択肢で読み進める絵本にしたいです。 絵は次の3枚です。絵そのものは変えません。 1. 屋根裏の部屋(机と小さな窓がある) 2. 引き出しの中の小さな鍵 3. 庭の木の上にいる猫 1 をはじまりの場面にして、2 と 3 へ進む選択肢の文を、それぞれ三案ずつ提案してください。 選択肢は「机を調べる」のような、短い行動のことばにしてください。 絵に描いていない設定は勝手に追加せず、必要なら質問してください。
自分で決めた本文と分岐を、JSON に整形してもらう(仕様の全文つき。「ここに…」のところを書きかえて使います)
以下の「整理してほしい内容」を、下の仕様に合う Leafork の作品ファイル(JSON)にしてください。
【頼みたいこと】
- 本文と選択肢の文言は、一字も変更しない。
- 場面には p1、p2… の ID を付け、"no" は 1 からの通し番号にする。
- 章は1つだけ作り、題名は作品の題名と同じにする(指定があれば、それに従う)。
- 結末の "type" は、指定がなければ "normal" にする。
- 指定していない仕掛け(能力値・ダイス判定・キーワード入力・条件・効果)は、足さない。能力値を使わないなら、"stats" は [] にする。
- 仕様の「必ず守ること」と「守るとよいこと」を、すべて満たす。
- 返事は JSON だけにする(説明や、コードブロックの記号を付けない)。
- 物語の内容で分からない点は、推測で補わずに質問する。
【整理してほしい内容】
(ここに、題名・紹介文・タグと、場面ごとの本文、選択肢と行き先、結末の名前を書く)
【仕様】
# Leafork の作品ファイル(JSON)の仕様
Leafork は、選択肢で読み進める物語(ゲームブック)のサービスです。これは、Leafork に読み込める作品ファイルの形式です。
ファイル全体で、1つの JSON オブジェクトです。文字コードは UTF-8。コメントと、末尾のカンマは書けません。本文の改行は \n と書きます。
## 1. 型
「?」の付いた項目は省けます。それ以外は、必ず書きます。ここにない項目は、書きません。
「A | B」は、A か B のどちらか。"…" は、そのとおりに書く文字です。
File = { "format": "leafork-book", "version": 2, "book": Book }
Book = { "title": 文字列(1〜100字),
"description"?: 文字列(2000字まで),
"tags"?: 文字列の配列(10個まで。1つ24字まで),
"settings": Settings,
"start": 場面ID,
"chapters": Chapter の配列(1個以上),
"endings": Ending の配列(0個以上),
"paragraphs": { 場面ID: Paragraph, … }(1〜5000個) }
Settings = { "stats": Stat の配列(0〜10個。能力値を使わない作品は []),
"allotPoints"?: 整数(0〜999),
"allotDice"?: ダイス,
"font"?: "serif" | "sans",
"skin"?: "standard" | "fantasy" | "mystery" | "horror" | "scifi" | "everyday" | "wafu" }
Stat = { "key": 能力値キー, "label": 文字列(1〜12字), "init": Init,
"max"?: 整数, "hidden"?: true, "fatal"?: true }
Init = { "mode": "fixed", "value": 整数 }
| { "mode": "dice", "dice": ダイス }
| { "mode": "allot", "base": 整数 }
Chapter = { "id": 章ID, "title": 文字列(1〜100字), "order": 整数(0 から順に) }
Ending = { "id": 結末ID, "name": 文字列(1〜100字), "type": "good" | "normal" | "bad" }
Paragraph = { "no": 整数(1以上。作品の中で重ならない),
"chapter": 章ID,
"text": 文字列(1〜5000字),
"choices": Choice の配列(0〜20個),
"effects"?: Effect の配列(20個まで),
"ending"?: 結末ID }
Choice = Go | Roll | Key | Miss
どの種類にも、"if"?: Condition を付けられます。
Go = { "label": 文字列(1〜200字), "to": 場面ID }
Roll = { "label": 文字列(1〜200字),
"roll": { "dice": ダイス, "target": 整数, "ok": 場面ID, "ng": 場面ID,
"by"?: "lte" | "even" | "odd",
"addStat"?: 能力値キー,
"okLabel"?: 文字列(20字まで), "ngLabel"?: 文字列(20字まで) } }
Key = { "label": "", "to": 場面ID, "key": { "words": 文字列の配列(1〜10個。1つ50字まで) } }
Miss = { "label": "", "to": 場面ID, "key": { "miss": true } }
Condition = { "item"?: 名前, "notItem"?: 名前, "flag"?: 名前, "notFlag"?: 名前,
"stat"?: 能力値キー, "gte"?: 整数 }
1つ以上の項目を書きます。"stat" と "gte" は、必ず2つそろえて書きます。
Effect = { "stat": 能力値キー, "add": 整数 }
| { "item": 名前 } | { "drop": 名前 }
| { "flag": 名前 } | { "unflag": 名前 }
場面ID・章ID・結末ID = 英数字と _ だけの文字列(64字まで)。同じ種類の中で重ならない。例:"p1" "c1" "e_good"
能力値キー = 英小文字で始まり、英小文字・数字・_ だけの文字列(16字まで)。例:"hp" "luck"
名前 = 持ち物や出来事の名前(1〜100字)。同じものは、どこでも一字一句同じに書く
ダイス = "個数d面の数"。必要なら、後ろに "+数" か "-数"。例:"2d6" "1d6+2"。個数は1〜10、足す数は99まで
整数 = −9999〜9999
## 2. 意味
- 読者は "start" の場面から読みはじめます。場面の "text" を読み、"choices" から1つを選んで、行き先の場面へ進みます。
- "no" は、読者に見せる場面の番号です。行き先は、番号ではなく場面ID で指します。
- Go(移動):選ぶと "to" の場面へ進みます。
- Roll(ダイス判定):選ぶとダイスを振ります。出た合計が "target" 以上なら "ok" の場面へ、そうでなければ "ng" の場面へ進みます。
- "addStat" を書くと、合計にその能力値を足します。
- "by": "lte" は、合計が "target" 以下なら成功。"even" は偶数、"odd" は奇数なら成功(このとき "target" は使われませんが、0 を書きます。"addStat" は書きません)。
- "okLabel"・"ngLabel" は、結果として読者に見せる言葉です(省くと「成功」「失敗」)。
- Roll には "to" を書きません。
- Key(キーワード入力):ボタンとしては見せず、場面に入力欄を1つ出します。読者の入力が "words" のどれかに合えば、"to" の場面へ進みます。
- ひらがなとカタカナ、全角と半角、大文字と小文字、空白のちがいは、同じ言葉として扱います。漢字とかなは別の言葉なので、両方を "words" に書きます。
- 1つの場面に Key をいくつ置いても、入力欄は1つです。上にあるものから順に照らします。
- どれにも合わなければ、読者はその場で入力し直せます。
- Miss(外れたときの行き先):その場面のどの Key にも合わなかったとき、"to" の場面へ進みます。Key のある場面にだけ、1つまで置けます。
- "if"(条件):書いた項目をすべて満たすときだけ、その選択肢が出ます(Key は、満たすときだけ照らします)。
- "item":その持ち物を持っている。"notItem":持っていない。
- "flag":その出来事が記録されている。"notFlag":記録されていない。
- "stat" と "gte":その能力値が "gte" 以上。
- "effects"(効果):その場面に入ったときに、上から順に起きます。
- "stat" と "add":能力値に "add" を足す(減らすときは負の数)。
- "item":持ち物を得る。"drop":持ち物を失う。
- "flag":出来事を記録する。"unflag":出来事の記録を消す。
- "ending":これを書いた場面で、物語が終わります。その場面の "choices" は [] にします。
- 能力値:"fatal": true の能力値が0以下になると、ゲームオーバーです。"hidden": true の能力値は、読者に見せません。"max" は上限です。
- "init" の "fixed" は決まった数。"dice" は、読みはじめにダイスで決める。"allot" は、"base" に、読者が持ち点("allotPoints"。"allotDice" があれば、その出目を足す)を振り分ける。
## 3. 必ず守ること(破ると、読み込めないか、書いたとおりに動きません)
1. "start" と、すべての "to"・"ok"・"ng" は、"paragraphs" にある場面ID にする。
2. どの選択肢も、"to" か "roll" のどちらか一方を持つ。
3. "addStat"、Condition の "stat"、Effect の "stat" は、"settings" の "stats" にある能力値キーにする。
4. ダイスは、上の書き方に合わせる。
5. Key の "words" には、言葉を1つ以上書く。
6. "mode": "allot" の能力値があるときは、"allotPoints" を1以上にするか、"allotDice" を書く。"mode": "fixed" の "value" は、"max" 以下にする。
7. "chapter" は "chapters" にある章ID、"ending" は "endings" にある結末ID にする。
## 4. 守るとよいこと(読み込めますが、作者に警告が出ます)
- 結末でない場面には、選択肢を1つ以上置く(行き止まりにしない)。
- すべての場面が、"start" から選択肢をたどって届くようにする。
- 条件に使う持ち物・出来事は、どこかの場面の "effects" で、得られる・記録されるようにする。
- Key だけの場面にしない(ふつうの選択肢か、Miss を置く。答えの分からない読者が、そこで止まるため)。
- 同じ場面の Key に、同じ言葉を重ねない。
- "no" は、1 からの通し番号にする。
- 必ず成功する・必ず失敗するダイス判定にしない。
## 5. 例
### 文章と選択肢だけの作品
{
"format": "leafork-book",
"version": 2,
"book": {
"title": "最終列車と手紙",
"description": "紹介文",
"tags": ["短編"],
"settings": { "stats": [] },
"start": "p1",
"chapters": [{ "id": "c1", "title": "ホーム", "order": 0 }],
"endings": [
{ "id": "e_search", "name": "差出人をさがして", "type": "normal" },
{ "id": "e_train", "name": "同じ封筒", "type": "normal" }
],
"paragraphs": {
"p1": {
"no": 1, "chapter": "c1",
"text": "最終列車が来るまで、あと五分。……",
"choices": [
{ "label": "手紙を拾う", "to": "p2" },
{ "label": "手紙には触れず、列車に乗る", "to": "p3" }
]
},
"p2": { "no": 2, "chapter": "c1", "text": "……", "choices": [], "ending": "e_search" },
"p3": { "no": 3, "chapter": "c1", "text": "……", "choices": [], "ending": "e_train" }
}
}
}
### 能力値・効果・条件・ダイス判定・キーワード入力を使った作品
{
"format": "leafork-book",
"version": 2,
"book": {
"title": "石の扉",
"description": "扉の向こうへ行く方法は、ひとつではない。",
"tags": ["短編", "ファンタジー"],
"settings": {
"stats": [{ "key": "hp", "label": "体力", "init": { "mode": "fixed", "value": 10 }, "fatal": true }]
},
"start": "p1",
"chapters": [{ "id": "c1", "title": "扉の前", "order": 0 }],
"endings": [
{ "id": "e_open", "name": "扉の向こう", "type": "good" },
{ "id": "e_back", "name": "引き返した道", "type": "normal" }
],
"paragraphs": {
"p1": {
"no": 1, "chapter": "c1",
"text": "石の扉が、道をふさいでいる。",
"choices": [
{ "label": "銀の鍵で開ける", "to": "p4", "if": { "item": "銀の鍵" } },
{ "label": "体当たりで破る", "roll": { "dice": "2d6", "target": 8, "ok": "p4", "ng": "p3" } },
{ "label": "まわりを調べる", "to": "p2", "if": { "notItem": "銀の鍵" } }
]
},
"p2": {
"no": 2, "chapter": "c1",
"text": "草むらに、銀の鍵が落ちていた。",
"effects": [{ "item": "銀の鍵" }],
"choices": [{ "label": "扉の前に戻る", "to": "p1" }]
},
"p3": {
"no": 3, "chapter": "c1",
"text": "扉はびくともしない。肩が痛む。",
"effects": [{ "stat": "hp", "add": -3 }],
"choices": [{ "label": "扉の前に戻る", "to": "p1" }]
},
"p4": {
"no": 4, "chapter": "c1",
"text": "扉の奥に、番人が立っていた。「合言葉を言え」",
"choices": [
{ "label": "", "to": "p5", "key": { "words": ["ひらけごま", "開けゴマ"] } },
{ "label": "引き返す", "to": "p6" }
]
},
"p5": { "no": 5, "chapter": "c1", "text": "番人は、黙って道をあけた。", "choices": [], "ending": "e_open" },
"p6": { "no": 6, "chapter": "c1", "text": "来た道を、ゆっくりと戻った。", "choices": [], "ending": "e_back" }
}
}
}仕掛け(ダイス判定やキーワード入力など)を入れたいときは、「整理してほしい内容」に、どの選択肢をどの仕掛けにするかを、ことばで書きそえます。
読み込んだあとに、確かめること
JSON が読み込めても、物語のつながりは、実際に読んで確かめる必要があります。
- 本文と選択肢の文が、自分の書いたとおりになっているか(言い回しが変わっていないか)。
- 「分岐マップ」で、場面が思ったとおりにつながっているか。
- 「テストプレイ」で、すべての選択肢を一度ずつ選んで、結末まで読めるか。
見本を読み込んで、本文を自分の文章に書きかえるところから始められます。
登録して書きはじめる書くには登録が必要です。読むだけなら、登録はいりません。