Lattice リファレンス · 4 分の 2
Block、コンテンツ、線形フロー
Block はフローが対象にできる最小の段落です。執筆メタデータ、可視コンテンツ、任意の連続性の注釈、そしてちょうど一つのフロー終端を組み合わせます。
Block 宣言
block opening (
title: "The warning",
purpose: setup,
summary: { Mara finds the signal source. },
setup: [signal_arc],
tags: [opening]
) {
text: { A light wakes beneath the garden. };
next -> answer;
}すべての Block は次の規則をすべて満たさなければなりません。
- ID が、インポートされたすべてのファイルを通じて一意である。
titleとpurposeが存在する。- 少なくとも一つの
textまたはdialogue項目が可視である。 - コンテンツ項目が終端より前に現れる。
- 終端がちょうど一つ存在し、選ばれたストーリー種別と文脈で許可されている。
- 参照されるすべての対象が存在し、メインストーリーまたは現在の Module の中に留まる。
Block メタデータ
| フィールド | 必須 | 許可される値 | 意味 |
|---|---|---|---|
title | はい | テキスト | 読者 / 執筆者に見える段落タイトル |
purpose | はい | purpose 識別子 | Block のナラティブ上の機能 |
summary | いいえ | テキスト | 執筆者向けの簡潔なあらすじ |
prose_target | いいえ | 正の整数 | 再配分可能な局所的な草稿予算 |
setup | いいえ | マーカー ID リスト | ナラティブの約束を導入する |
requires | いいえ | マーカー ID リスト | 以前の伏線の根拠を期待する |
resolves | いいえ | マーカー ID リスト | 以前の伏線の根拠を回収する |
tags | いいえ | テキストまたはリスト | 執筆上の分類 |
prose_target には完全な Story の本文ゴールが必要です。段階的な執筆を導きますが、それだけで Block を有効または無効にするものではありません。
許可される purpose の値は次のとおりです。
| 値 | 典型的な用途 |
|---|---|
setup | 登場人物、状況、問い、約束を確立する |
exposition | 読者に必要な文脈を伝える |
development | 確立された筋を進める |
transition | 場所、時間、段階の間を移る |
turn | 出来事の方向や意味を変える |
climax | 決定的な行動でストーリーの中心的な圧力を解決する |
resolution | 中心的な対立の後の結果を示す |
payoff | 約束された明かし、結果、感情的な回収を届ける |
これらの値は検証と執筆ツールを支えますが、フローは作りません。
ナレーション
ナレーションは text、コロン、本文値、セミコロンを使います。
text: {
The station clock kept perfect time.
Mara watched the second hand cross midnight.
};Block には、読む順に複数のナレーションと対話の項目を含められます。
text: { The rails begin to sing. };
dialogue ch_mara: { That train is a day early. };
text: { No one on the platform turns to answer. };text は可視コンテンツです。公開検証は、注釈やフローだけを含む Block を拒否します。アウトライン検証は一時的にそれを許可し、本文を書く前に最終的な Block グラフ、要約、予算、連続性の関係を確認できるようにします。プレビューとエクスポートは、欠けている読者向けテキストを執筆者向けの要約で代用しません。
対話
宣言の形は dialogue <character-id> (<metadata>): <prose>; です。
dialogue ch_mara (
mode: whisper,
emotion: cautious,
expression: focused,
pose: listening,
position: left,
stage_direction: { She leans toward the soil. }
): { Not again. };話者は宣言された character を参照しなければなりません。対話のメタデータはすべて任意です。
| フィールド | 許可される値 | 意味 |
|---|---|---|
mode | speech、thought、whisper、shout | 発話の種別 |
position | left、center、right | 読者への提示位置 |
emotion | 識別子 | アセット向けの感情状態 |
expression | 識別子 | アセット向けの表情 |
pose | 識別子 | アセット向けの身体のポーズ |
stage_direction | テキスト | 別個の動作または舞台の覚書 |
提示フィールドはプレビュー / エクスポートのために保持されますが、Block のフロー、Guard、ランタイム State を変えることは決してありません。アセット識別子が欠けていてもストーリーの分岐は作りません。
軽量な連続性マーカー
Block メタデータは、ランタイムロジックを追加せずに伏線と回収を記述できます。
block warning (
title: "The warning",
purpose: setup,
setup: [signal_arc]
) {
text: { The key pulses whenever Mara faces north. };
next -> crossing;
}
block crossing (
title: "Crossing",
purpose: development,
requires: [signal_arc]
) {
text: { She trusts the pulse and steps into the fog. };
next -> answer;
}
block answer (
title: "The answer",
purpose: payoff,
resolves: [signal_arc]
) {
text: { The pulse spells her own name. };
end;
}setupはマーカーを導入します。requiresは、この Block がそのマーカーが導入済みであることを期待する、という意味です。resolvesは、この Block がそのマーカーを回収する、という意味です。
マーカー ID は執筆上の事実であり、宣言された State ではありません。Module を条件に適合させたり、Pool の終了を満たしたり、通常のプレイヤーの選択を記憶したりはできません。
構造化された連続性イベント
構造化された注釈は、ナレーションと対話の間に置きます。
foreshadowing fs_signal: event {
subject: ch_mara,
object: it_key,
predicate: notices,
time: "before dawn"
};
reveals rv_signal resolves fs_signal: event {
subject: ch_mara,
object: it_key,
predicate: understands,
time: "midnight"
};foreshadowing 宣言は独自の ID を持ちます。reveals 宣言は独自の ID を持ち、回収する伏線を名指しします。
イベントには subject と predicate が必要です。object、place、time は任意です。イベントの値は識別子、文字列、数値、真偽値のいずれかです。これらの注釈はナラティブの根拠のみを記述します。そのタプルが CYOA の State に似ていても、その State を有効化または削除することは決してありません。
フロー終端
すべての Block は、次のいずれかの形でちょうど一つ終わります。
| 終端 | 形 | 使用できる場所 |
|---|---|---|
| 自動継続 | next -> target; | Linear と CYOA、同じストーリーまたは Module |
| 結末 | end; | Linear と CYOA、ストーリー全体を終える |
| プレイヤーの選択 | choice { option ... } | CYOA、同じストーリーまたは Module |
| Pool に入る | enter pool_id -> resume; | CYOA のメインストーリーのみ |
| Module を完了する | complete (...); | CYOA の Module のみ |
暗黙のフォールスルーはありません。ファイルや Scene で次の Block が実行されるのは、終端がそれを対象にしている場合だけです。
Linear story の規則
Linear story が許可するのは next と end だけです。
next -> answer;end;choice、enter、complete、predicate、state、state group、pool、module、story.initial_state は、それらの宣言が正しくパースされても拒否します。
Story の entry は一つの有限の連鎖を始めなければなりません。
entry -> block -> block -> ... -> one ending完全な検証は次を拒否します。
- entry への入力エッジ。
- ちょうど一つの入力エッジを持たない、entry 以外の Block。
- 分岐または合流。
- 到達不能 / 接続されていない Block。
- 循環。
- 結末がない、または複数の結末がある。
完全な Linear の例
story main (
title: "Signal Garden",
language: "en",
format: novel,
entry: opening,
beat_order: [opening, resolution]
);
entity character ch_mara (name: "Mara", role: protagonist);
entity location loc_garden (name: "Signal Garden");
scene garden (
title: "The garden",
beat: opening,
pov: ch_mara,
location: loc_garden
) {
block opening (
title: "The warning",
purpose: setup,
setup: [signal_arc]
) {
text: { A light wakes beneath the garden. };
dialogue ch_mara (
mode: whisper,
emotion: cautious
): { Not again. };
next -> answer;
}
block answer (
title: "The answer",
purpose: resolution,
resolves: [signal_arc]
) {
text: { She follows the light home. };
end;
}
}宣言の順序はこのソースを読みやすくしますが、読む順序を定義するのは entry、next、end だけです。連鎖にリンクせずに Block を追加すると、到達不能な Block が生まれます。
beat の順序は Block のフローではない
story.beat_order は、Scene の beat メタデータに期待される順序を与えます。対応する検証経路では、欠落した、未知の、順序の違う beat を診断できますが、Block をつなぐことは決してありません。Linear story を複数ファイルに分割するときは、意図した beat の順序と明示的な Block の対象の両方を保ってください。
