← 仕様書・設計書一覧

JSON 中間表現(Op 命令セット)仕様書

KS スクリプトをコンパイルした結果生成される Op 命令セット(中間表現 / IR)の仕様書です。ランタイム(インタプリタ)はこの Op 命令列を逐次実行してゲームを進行させます。

概要

  • KS スクリプトは直接実行されず、必ず Op 命令列(JSON 配列)に変換されます
  • 各 Op は op フィールドで種別を識別します
  • コンパイル済みシナリオは CompiledScenario 型として管理されます

CompiledScenario 構造

interface CompiledScenario {
  id: string;    // シナリオID
  ops: Op[];     // Op 命令の配列
}

Op 型一覧

テキスト表示

Opフィールド説明
TEXT_APPENDwho?: string, text: stringテキストを追記表示。who でキャラ名指定
TEXT_NL改行

フロー制御

Opフィールド説明
WAIT_CLICKクリック待ち
PAGEページ送り(テキストクリア)
WAIT_MSms: number指定ミリ秒待機

背景・キャラクター

Opフィールド説明
BG_SETid: string, fadeMs?: number背景画像を設定
CH_SETname, pose, pos, fadeMs?キャラクターを表示
CH_HIDEname: string, fadeMs?: numberキャラクターを非表示
CH_CLEARfadeMs?: number全キャラクターをクリア
CH_ANIMname, src, frames, fps, pos, loop?キャラクタースプライトアニメーション

オーディオ

Opフィールド説明
BGM_PLAYid, vol?, fadeMs?BGM 再生
BGM_STOPfadeMs?: numberBGM 停止
SE_PLAYid, vol?効果音再生
VOICE_PLAYid: stringボイス再生
WAIT_VOICE_ENDボイス再生完了待ち

変数操作

Opフィールド説明
VAR_SETname: string, value: number変数に値を代入
VAR_ADDname: string, value: number変数に値を加算
VAR_SUBname: string, value: number変数から値を減算

選択肢・分岐

Opフィールド説明
CHOICEoptions: Array<{ label: string, jump: number }>選択肢を表示
JUMPpc: number指定した命令位置へジャンプ
JUMP_IFcondition: string, pc: number条件が真の場合に指定位置へジャンプ

Op 命令の例

テキスト表示

KS:

【太郎】こんにちは!

Op:

[
  { "op": "TEXT_APPEND", "who": "太郎", "text": "こんにちは!" },
  { "op": "WAIT_CLICK" }
]

背景とキャラクター

KS:

@bg classroom fade 500
@ch hanako smile center fade 300

Op:

[
  { "op": "BG_SET", "id": "classroom", "fadeMs": 500 },
  { "op": "CH_SET", "name": "hanako", "pose": "smile", "pos": "center", "fadeMs": 300 }
]

選択肢

KS:

@choice_start
- はい
- いいえ
@choice_end

Op:

[
  { "op": "CHOICE", "options": [
    { "label": "はい", "jump": 2 },
    { "label": "いいえ", "jump": 5 }
  ]}
]

SaveData スキーマ

ゲームの状態を保存するための構造です。バージョン 1 で固定されています。

interface SaveData {
  save_schema_version: 1;        // スキーマバージョン(固定)
  engine_version: string;        // エンジンバージョン
  work_id: string;               // 作品ID
  scenario_id: string;           // シナリオID
  node_id: string;               // 現在のノードID
  vars: Record<string, unknown>; // 変数の状態
  read: Record<string, unknown>; // 既読情報
  timestamp: number;             // 保存時刻(UNIX タイムスタンプ)
}

設計方針: 画像や音声データは埋め込まず、参照IDのみを保存。後方互換性は save_schema_version で管理。