← ドキュメント一覧

KS(タグ記法)仕様書

Kaede Scriptタグ記法(KS、.ks の詳細仕様書です。TyranoScript / KAG 系の書き味に近い、@コマンド 属性="値" 形式でシーンを宣言的に描写します。

Kaede Script 全体像

kaedevn のスクリプト言語は 1 つ(Kaede Script)で、2 つの記法を提供します:

  • タグ記法(KS、.ks — 本仕様書。宣言的でシーン描写向き
  • コード記法(KSC、.kscKSC 仕様書。手続き的で複雑なロジック向き

概要は Kaede Script 概要 を参照してください。

処理方式: コンパイラ

KS は コンパイラ方式 で動作します。スクリプト全体を事前に Op[](命令配列)に変換してから実行します。

.ks スクリプト
    |
    v
Tokenizer ── 字句解析(行を分類)
    |           lineClassifier で COMMAND / TEXT / LABEL を判定
    v
Parser ───── 構文解析(コマンドレジストリ参照)
    |           commandRegistry.ts が全コマンドの定義源
    v
Transformer ─ 変換・最適化
    v
Finalizer ── 検証 + Op[] 出力
    |           プラットフォーム非依存の命令列
    v
OpRunner ─── 1命令ずつ実行、描画エンジンに委譲

コンパイル済みの Op[] はプラットフォームを問わず共通です。同じ命令列が Web ブラウザでも Nintendo Switch でも実行されます。

1. 構文の基礎

コマンドの2つの書き方

コマンド(タグ)は、行頭で @ を使う形式と、テキストの途中で [] を使う形式の2種類があります。

@bg id="room" fade=1000
[bg id="room" fade=1000]

コメントとラベル

; で始まる行はコメントとして無視されます。* で始まる行は、ジャンプ先として指定できるラベルになります。

; ここはメモ書きです
*scene_01

行分類

コンパイラはまず各行を以下のタイプに分類します:

  • COMMAND@ で始まる(例: @bg id="room"
  • LABEL* で始まる(例: *scene_01
  • COMMENT; で始まる(例: ; メモ
  • VAR_SET変数 = 値(例: flag_a = 1
  • CHOICE_START@choice(例: @choice text="はい" target="yes"
  • IF_START@if(例: @if (flag > 0)
  • TEXT — 上記以外(例: 桜「おはよう」

テキストとコマンドが同じ行にある場合(例: テキスト@l)は、別々のコマンドに分割されます。

2. コマンド・リファレンス(20種)

KS で使用可能な全コマンドの一覧です。すべてのコマンドは @ で始めるか、テキスト内で [ ] で囲んで記述します。

映像 (Visual) — 10コマンド

  • @bg id, fade — 背景画像を変更します
  • @ch name, pose, pos, fade — キャラクターを表示します。pos は L/C/R
  • @ch_hide name, fade — 特定のキャラクターを消去します
  • @ch_clear fade — 全キャラクターを消去します
  • @overlay id, fade — オーバーレイ画像を重ねて表示します
  • @overlay_hide fade — オーバーレイを消去します
  • @show id — 要素を表示します
  • @hide id — 要素を非表示にします
  • @move id, x, y, time — 移動アニメーションを実行します
  • @fade id, alpha, time — フェードアニメーションを実行します

音声 (Audio) — 4コマンド

  • @bgm id, vol, fade — BGM をループ再生します
  • @bgm_stop fade — BGM を停止します
  • @se id, vol — 効果音を一度だけ再生します
  • @voice id — ボイスを再生します

制御 (Control) — 5コマンド

  • @wait time(秒) — 指定秒数、進行を停止します
  • @jump target(*ラベル名) — 指定したラベルへ移動します
  • @choice text, target — 選択肢を表示します。target にジャンプ先を指定
  • @if (条件式) — 条件分岐を開始します
  • @set var, value — 変数に値を設定します

エフェクト (Effect) — 1コマンド

  • @screen_filter type, intensity — 画面フィルターを適用します(46 種のフィルター)

インラインコマンド

  • @l — 行末クリック待ち
  • @c — 改ページクリック待ち
  • @r — 改行

3. メッセージと画面制御

テキスト表示

コマンド以外の行はそのままテキストとして表示されます。話者名は 名前「セリフ」 の形式で記述します。

桜「おはよう!今日もいい天気だね」

インラインコマンドの活用

テキストの途中にコマンドを埋め込めます。

桜「おはよう!」@l
桜「今日もいい天気だね」@c
  • @l — 行末でクリック待ち。テキストを消さずに次の行を追加表示
  • @c — ページ全体をクリアして次のテキストを表示

4. 高度なフロー制御

ジャンプとコール

シナリオの流れを制御するための重要なコマンドです。

@jump: 指定したラベルへ移動します。

@jump target="*next_scene"

@call / @return: サブルーチンを呼び出します。共通の演出などを別ラベルに切り出す際に便利です。

@call target="*common_effect"
...
*common_effect
[se id="sparkle"]
[wait 500]
@return

選択肢

複数の @choice を連続して記述すると、プレイヤーに選択肢が表示されます。

*crossroad
@choice text="一緒に帰る" target="go_home"
@choice text="デートに誘う" target="date_event"

*go_home
桜「じゃあ、一緒に帰ろう!」
@jump target="*day_end"

*date_event
桜「えっ、デート!? 喜んで!」
@jump target="*day_end"

*day_end
; こうして一日が終わった。

5. 変数と演算

フラグ管理などに使用します。演算子(+=, -= 等)が使用可能です。

flag_a = 1
love_points += 10

if (love_points > 50) {
    #sakura
    「大好きだよ!」@l
} else {
    #sakura
    「またね」@l
}

Op 型(コンパイル出力)

コンパイラが出力する命令の種類は以下の通りです。同じ Op 配列が全プラットフォームで共通して実行されます。

  • テキスト — TEXT_APPEND(話者名 + 本文)
  • 映像 — BG_SET, CH_SET, CH_HIDE, CH_CLEAR, OVL_SET, OVL_HIDE, SHOW, HIDE, MOVE, FADE, SCREEN_FILTER
  • 音声 — BGM_PLAY, BGM_STOP, SE_PLAY, VOICE_PLAY
  • 制御 — CHOICE, JUMP, VAR_SET, IF(ネスト対応)
  • 待機 — WAIT(click / timeout / voiceend)

サンプルシナリオ

; === 学園シーン ===
*scene_01

@bg id="classroom"
@ch name="sakura" pose="smile" pos="C"
桜「おはよう!今日もいい天気だね」@l

@ch name="sakura" pose="thinking" pos="C"
桜「放課後、どうする?」@c

@choice text="一緒に帰る" target="go_home"
@choice text="図書館で勉強" target="library"

*go_home
@ch name="sakura" pose="smile" pos="C"
桜「やったー!一緒に帰ろう」@l
love_points += 5
@jump target="*day_end"

*library
@ch name="sakura" pose="sad" pos="C"
桜「そっか...じゃあまたね」@l
@jump target="*day_end"

*day_end
@ch_hide name="sakura" fade=500
@bg id="sunset"
; こうして放課後が過ぎていった。

さらに詳細なロジックを組むには

TypeScript に近い構文で、より複雑なゲームシステム(バトル、インベントリ等)を構築したい場合は、KSC(Kaede Script Code)仕様書 を活用してください。KSC ではユーザー定義関数、型チェック、for/while ループなどの高度な機能が使えます。

関連ドキュメント

Ad: inContent (336x280)
Ad: stickyBottom (728x90)
kaedevn - ノベルゲームを作れるプラットフォーム