変数とディレクティブ
変数はワールドのゲーム状態です。AIは毎ターン現在値を読み、応答に角括弧ディレクティブを書いて更新します。
変数スキーマ
json
{
"id": "health",
"name": "Health",
"type": "number",
"defaultValue": 100,
"min": 0,
"max": 100,
"description": "Player's physical health",
"behaviorRules": "0 = death. 1-20 = critical. 20-50 = wounded. 50-80 = bruised. 80-100 = healthy. Decrease on physical damage: punch -5 to -10, slash -15 to -25, fall -20 to -40. Rest +5, healing +10 to +30. Max change per turn: 30."
}変数のタイプ
number
任意のmin/max境界を持つ数値。
ディレクティブ構文:
[health: set 50] → 50に設定
[health: +10] → 10加える(別名: add)
[health: -15] → 15引く(別名: subtract)
[health: *2] → 2倍にする(別名: multiply)
[gold: 100] → 暗黙のset(演算子なし)string
テキスト値。
ディレクティブ構文:
[location: set "dark forest"]
[mood: set "suspicious"]
[notes: append " Found a clue."]boolean
真偽値フラグ。
ディレクティブ構文:
[has-key: toggle] → true ↔ false を切り替え
[met-elder: set true]
[quest-active: set false]json
複雑な構造。オブジェクトと配列。ネストしたドットパス更新をサポート。
ディレクティブ構文:
[inventory: push {"name": "Iron Sword", "damage": 10}]
[inventory: delete 0]
[inventory: set [{"name": "Potion", "qty": 3}]]
[npcs.aria.affinity: +5]
[npcs.aria.mood: set "happy"]
[npcs: merge {"aria": {"trust": 80}}]
[quest-log: push {"id": "q1", "status": "active"}]
[config: delete "deprecated-key"]ドットパス操作:
[root.nested.field: op value]— JSON変数内のネストしたフィールドを更新- 中間オブジェクトが存在しない場合、自動作成
- 配列インデックスアクセス:
[inventory.0.durability: -1]
すべての操作
| 操作 | タイプ | 構文 | 動作 |
|---|---|---|---|
set | すべて | [id: set value] または [id: value] | 値を置き換え |
add / + | number | [id: +10] または [id: add 10] | 増加 |
subtract / - | number | [id: -5] または [id: subtract 5] | 減少 |
multiply / * | number | [id: *2] または [id: multiply 2] | スケール |
toggle | boolean | [id: toggle] | true/falseを反転 |
append | string | [id: append " text"] | 連結 |
merge | json(オブジェクト) | [id: merge {"key": "val"}] | 浅いマージ |
push | json(配列) | [id: push "item"] または [id: push {...}] | 配列に追加 |
delete | json | [id: delete "key"] または [id: delete 0] | キー/インデックスを削除 |
オーディオディレクティブ
オーディオは別のディレクティブ形式でトリガーされます。
[audio: track-id play]
[audio: track-id stop]
[audio: track-id crossfade 2.5]
[audio: track-id volume 0.5]
[audio: track-id play chain:next-track]ビヘイビアルール
behaviorRules フィールドは、AIのシステムプロンプトに <behavior-rules> ブロックとして注入される平易な英語(または日本語)です。いつ、どのように変数を更新するかをAIに教えます。
効果的なビヘイビアルールに含めるもの:
- 各値範囲がナラティブで何を意味するか
- 変化のトリガー(およびどの方向)
- 変化量のガイドライン(どれだけ変えるか)
- 上限(1ターンあたりの最大変化、絶対境界)
- 他の変数とのリレーションシップ
例 — 複雑なJSON変数:
"behaviorRules": "Array of party members. Push new object when recruiting: {\"name\": \"...\", \"class\": \"...\", \"trust\": 50}. Update trust via dot-path: [allies.0.trust: +5]. To remove an ally, use a Behavior with an UpdateVariable JSON Patch action, or overwrite the whole array with [allies: set [...]]. Trust below 20 = may betray."ID規則
- IDはワールド内で一意である必要があります
- 文字、数字、アンダースコアで構成されるIDは変数マクロとしてアクセス可能です。例えば
player_healthはエントリ内で{{player_health}}として到達できます。-を含むIDはマクロリゾルバでマッチしないので、二重ブレースマクロ構文で参照する変数にはsnake_case(またはcamelCase)を優先してください。 - 変数ディレクティブパーサー(AIの応答内で使用)はIDで
-を受け付けるので、[player-health: +5]のようなディレクティブではkebab-caseIDも機能します。 - 予約語を避ける:
audio、user、char、time、date
