KS(タグ記法)仕様書
作成日: 2026-03-06 / 更新日: 2026-06-09
Kaede Script の タグ記法(KS、.ks) の詳細仕様書です。TyranoScript / KAG 系の書き味に近い、@コマンド 引数 形式でシーンを宣言的に描写します。
Kaede Script 全体像
kaedevn のスクリプト言語は 1 つ(Kaede Script)で、2 つの記法を提供します:
- タグ記法(KS、
.ks) — 本仕様書。宣言的でシーン描写向き- コード記法(KSC、
.ksc) — KSC 仕様書。手続き的で複雑なロジック向き概要は Kaede Script 概要 を参照してください。
処理方式: コンパイラ
KS は コンパイラ方式 で動作します。スクリプト全体を事前に Op[](命令配列)に変換してから実行します。
.ks スクリプト
|
v
Tokenizer ── 字句解析(行を分類)
| lineClassifier で COMMAND / TEXT / LABEL 等を判定
v
Parser ───── 構文解析(コマンドレジストリ参照)
| commandRegistry.ts が全コマンドの定義源
v
Transformer ─ 変換(テキスト内の @l/@p/@r 展開など)
v
Finalizer ── 検証 + Op[] 出力
| プラットフォーム非依存の命令列
v
OpRunner ─── 1命令ずつ実行、描画エンジンに委譲
コンパイル済みの Op[] はプラットフォームを問わず共通です。同じ命令列が Web ブラウザでも Nintendo Switch でも実行されます。
1. 構文の基礎
コマンドの書き方
コマンドは行頭の @ に続けて、引数をスペース区切りで並べます。属性はクォートで囲みません。位置引数と key=value 形式の両方が使えます。
@bg room
@bg room fade=500
@ch 赤音 smile C
@bgm theme vol=80 fade=1000
旧仕様にあった
id="room"のようなクォート属性形式や[bg id="room"]のブラケット形式は 使いません。実際の区切りはスペースで、値はクォートしません。テキスト内に埋め込めるのは@l@p@rの 3 つだけです(後述)。
行の種別
コンパイラはまず各行を以下に分類します:
- COMMAND —
@で始まる(例:@bg room) - LABEL —
*で始まる(例:*scene_01) - COMMENT —
//または;で始まる(例:; メモ) - SPEAKER —
#で始まる(例:#赤音。#単独で話者リセット) - VAR_SET —
変数 = 値(例:flag_a = 1、love += 10) - CHOICE / IF —
choice {/if (条件) {で始まるブロック(後述) - TEXT — 上記以外(地の文・セリフ)
2. メッセージと話者
テキスト表示
コマンド以外の行はそのままテキストとして表示されます。改行・クリック待ち・改ページ はテキスト末尾に @r @l @p を付けて指定します。
今日もいい天気だ。@l
@l— クリック待ち(テキストを消さずに次を追加表示)@p— 改ページ(メッセージをクリアして次を表示)@r— 改行
これら 3 つだけはテキスト行の途中・末尾に埋め込めます。それ以外のコマンドは必ず独立した行に書きます。
話者の指定
話者名は 2 通りで指定できます。
方法 A: #名前 を直前の行に置く
#赤音
おはよう!今日もいい天気だね。@l
方法 B: 全角コロン : で名前とセリフを区切る
赤音:おはよう!今日もいい天気だね。@l
半角コロン
:や名前「セリフ」のカギ括弧形式は話者として解釈されません(そのまま本文に表示されます)。話者抽出に使えるのは#名前行か、全角コロン:です。
3. コマンド・リファレンス
KS で使用可能なコマンドは現在 約 60 種 です(commandRegistry.ts が単一の定義源)。カテゴリ別に示します。
基本(ノベル)
@bgid [fade=N] [x= y= s=] [slide_left/slide_right=N]— 背景を変更@chname pose pos(L/C/R) [fade=N]— キャラ(2D 立ち絵)を表示@ch_hidename [fade=N]— 特定キャラを消去@ch_clear[fade=N]— 全キャラを消去@ch_movename pos [time=N]— キャラの立ち位置を移動@overlayid [fade=N]/@overlay_hide[id]— オーバーレイ画像の表示/消去@bgmid [vol=N] [fade=N]/@bgm_stop[fade=N]— BGM 再生 / 停止@seid [vol=N]— 効果音を一度再生@voiceid/@wait_voice_end— ボイス再生 / ボイス終端まで待機@waitsec— 指定秒数待機@scroll_text"テキスト" [speed=N]— スタッフロール等のスクロール表示@text_style[bgColor=#xxxxxx] [nameColor=#xxxxxx]— メッセージ枠 / 名前枠の色
キャラ表現(2D / Live2D / VRM 共通)
表情・口パク・モーションは 3 系統横断で同じコマンドが使えます。
@ch_exprname expression [fadeMs=N]— 表情変更@ch_lipname mode(auto/off/voice) [audioUrl]— リップシンク@ch_motionname motion [index]— モーション再生@ch_paramname param value [durationMs]— パラメータ操作@ch_statename layer state— レイヤ状態切替@ch_animname pose pos— アニメ立ち絵
Live2D
@live2dmodelId [path= motion= index= x= y= scale=]— Live2D モデル表示@live2d_hidemodelId— 非表示@live2d_motionmodelId motionGroup [index=N]— モーション@live2d_expressionmodelId expression— 表情
VRM / 3D キャラ(開発中・Web のみ)
@sceneMode2d|vrm— 2D / 3D シーンの切替@vrmShowid [pos= x= y= s= rotY= fade=]/@vrmHide[fade=]— VRM モデルの表示 / 非表示@vrmExpressionname [weight= dur=]— 表情@vrmPoseaPose|idle— ポーズプリセット
演出・エフェクト
@camera[x= y= zoom= pivotX= pivotY= time= easing= shake=] [reset]— カメラのパン / ズーム / 揺れ@shake[intensity= duration=]— 画面揺れ@flash[duration=]— フラッシュ@fade_black/@fade_white[duration=]— 黒 / 白フェードアウト@black_in/@white_in[duration=]— 黒 / 白からのフェードイン@filter(別名@screenFilter)type [intensity] [options...]— 画面フィルター@filter_mixtype1 i1 type2 i2 ... [target=scene/bg/ch]— 複数フィルターの合成@filter_clear(別名@screenFilterClear)— フィルター解除@color_adjust[brightness= contrast= saturation= temperature= target=]— 色調補正@particlepreset [x= y= s= duration= intensity= blend=]/@particle_stop[preset]— パーティクル@effectid [wait=true] [scale= intensity= x= y=]— JSON 宣言型エフェクト(effect.json を再生)@slash[x= y= angle= length= duration= color= blend= width=]— 斬撃トレイル
制御・フロー
@jump*ラベル名— ラベルへ移動@call*ラベル名/@return— サブルーチンの呼び出し / 復帰@call_templatetemplateId— コモンイベント(テンプレート)呼び出し@layout_setname— レイアウト切替
インラインコマンド(テキスト内に埋め込み可)
@l— クリック待ち@p— 改ページ@r— 改行
開発中(RPG レイヤー — クリエイターには未公開)
RPG(データベース / マップ / イベント / コマンドバトル)は開発中で、現時点ではクリエイターに公開されていません。記法上は以下が定義されています。
@map_loadid [x y direction]/@map_exit— マップの読込 / 退出@player_movedirection steps/@event_moveeventId x y [durationMs]— 移動@item_addid amount/@item_removeid amount— アイテム増減@battletroopId [onWin=*ラベル onLose=*ラベル]— コマンドバトル開始
4. 選択肢
選択肢は choice { ... } ブロックで記述します。各選択肢は "テキスト" { ... } で、if (条件) を付けて出現条件を指定できます。
*crossroad
choice {
"一緒に帰る" {
@jump go_home
}
"デートに誘う" if (love > 50) {
@jump date_event
}
}
*go_home
#赤音
じゃあ、一緒に帰ろう!@l
@jump day_end
*date_event
#赤音
えっ、デート!? 喜んで!@l
@jump day_end
*day_end
; こうして一日が終わった。
5. 条件分岐
if (条件) { ... } else { ... } で記述します。
if (love > 50) {
#赤音
大好きだよ!@l
} else {
#赤音
またね。@l
}
6. 変数と演算
フラグ管理などに使用します。代入は =、加減算は += / -= が使えます。
flag_a = 1
love += 10
hp -= 5
乗除や複雑な式・関数・ループが必要な場合は KSC(コード記法) を使ってください(KSC 仕様書)。
Op 型(コンパイル出力)
コンパイラが出力する主な命令の種類です。同じ Op 配列が全プラットフォームで共通して実行されます。
- テキスト —
TEXT_APPEND(話者 + 本文),TEXT_NL,PAGE,WAIT_CLICK - 背景 / キャラ —
BG_SET,BG_CLEAR,CH_SET,CH_HIDE,CH_CLEAR,CH_MOVE,CH_EXPR,CH_LIP,CH_MOTION,OVERLAY_SET,OVERLAY_HIDE - Live2D / VRM —
LIVE2D_SET,LIVE2D_MOTION,VRM_SHOW,VRM_EXPRESSION,SCENE_MODE - 演出 —
CAMERA_SET,SHAKE,FLASH,FADE_BLACK,FADE_WHITE,BLACK_IN,WHITE_IN,SCREEN_FILTER,FILTER_MIX,COLOR_ADJUST,PARTICLE_EMIT,EFFECT_PLAY,SLASH_EMIT - 音声 —
BGM_PLAY,BGM_STOP,SE_PLAY,VOICE_PLAY,WAIT_VOICE_END - 制御 —
CHOICE,JUMP,JUMP_IF,CALL,RETURN,CALL_TEMPLATE,VAR_SET,VAR_ADD,VAR_SUB - 待機 —
WAIT_MS,WAIT_CLICK,WAIT_VOICE_END
サンプルシナリオ
; === 学園シーン ===
*scene_01
@bg classroom
@ch 赤音 smile C
#赤音
おはよう!今日もいい天気だね。@l
@ch_expr 赤音 thinking
放課後、どうする?@p
choice {
"一緒に帰る" {
@jump go_home
}
"図書館で勉強" {
@jump library
}
}
*go_home
@ch_expr 赤音 smile
やったー!一緒に帰ろう。@l
love += 5
@jump day_end
*library
@ch_expr 赤音 sad
そっか…じゃあまたね。@l
@jump day_end
*day_end
@ch_hide 赤音 fade=500
@bg sunset
; こうして放課後が過ぎていった。
さらに詳細なロジックを組むには
TypeScript に近い構文で、より複雑なゲームシステム(バトル、インベントリ等)を構築したい場合は、KSC(Kaede Script Code)仕様書 を活用してください。KSC ではユーザー定義関数、型チェック、for/while ループなどの高度な機能が使えます。
関連ドキュメント
- ティラノスクリプトからの移行ガイド — タグ対応表つき
- ティラノで困っていたことは kaedevn でどうなるか — 乗り換えで何が良くなるかの読み物
- KSC スクリプト仕様書 — 高度なロジック向けスクリプト
- ブロック型リファレンス — GUI ブロックの詳細
- エンジンの仕組み — コンパイラの処理パイプライン
- エディタ完全ガイド — エディタの使い方