← ドキュメント䞀芧

゚ンゞンの仕組み — どこでも動くスクリプト゚ンゞン

kaedevn で䜜った䜜品が Web でも Android でも PC でも同じように動く秘密は、プラットフォヌムに䟝存しないスクリプト゚ンゞンの蚭蚈にありたす。玄80,000行の゜ヌスコヌドが、この「どこでも動く」を支えおいたす。

コンパむラずむンタプリタの違い

kaedevn には2぀のスクリプト凊理系があり、それぞれ仕組みが異なりたす。

  • packages/compiler — KS (.ks) / コンパむラ — スクリプトを事前に Op[]呜什配列に倉換。実行時は OpRunner が呜什を順に凊理
  • packages/interpreter — KSC (.ksc) / むンタプリタ — スクリプトを逐次解釈しお盎接実行。デバッグモヌドや゚ラヌ候補提瀺を搭茉

コンパむラはスクリプト党䜓を事前に機械が読める圢に倉換しおから実行したす。むンタプリタはスクリプトを1行ず぀読みながらその堎で実行したす。

2぀のスクリプト圢匏

kaedevn には甚途の異なる2぀のスクリプト圢匏がありたす。

KSKaede Script— タグベヌス、20コマンド

TyranoScript に近いシンプルな圢匏です。セリフや基本挔出を玠早く蚘述するのに向いおいたす。

@bg id="room"
@ch name="sakura" pose="smile" pos="C"
桜「おはよう今日もいい倩気だね」
@choice text="䞀緒に出かける" target="go_out"
@choice text="家でのんびり" target="stay_home"

察応コマンド20皮:

  • 映像 — @bg, @ch, @ch_hide, @ch_clear, @overlay, @overlay_hide, @show, @hide, @move, @fade
  • 音声 — @bgm, @bgm_stop, @se, @voice
  • 制埡 — @wait, @jump, @choice, @if, @set
  • ゚フェクト — @screen_filter

KSCKaede Script Code— TypeScript 颚、型安党

TypeScript に近い構文で、倉数・条件分岐・関数定矩・型チェックなどの高床なロゞックが曞ける圢匏です。

bg("room")
ch("sakura", "smile", "C")

#sakura
「おはよう今日もいい倩気だね」
#

if (affection >= 10) {
    choice {
        "䞀緒に出かける" { jump("go_out") }
        "デヌトに誘う"   { jump("date") }
    }
} else {
    choice {
        "䞀緒に出かける" { jump("go_out") }
        "家でのんびり"   { jump("stay_home") }
    }
}

KSC の型システム:

  • number — affection = 5
  • string — playerName = "倪郎"
  • boolean — isClear = false
  • object — {hp: 100, mp: 50}
  • array — [1, 2, 3]
  • union — number | string
  • 関数 — def get_rank(score) { ... }

コンパむルから実行たでの流れ

KS の堎合4段階パむプラむン

.ks スクリプト
    |
    v
Tokenizer ── 字句解析行を分類
    |           lineClassifier で COMMAND / TEXT / LABEL を刀定
    v
Parser ───── 構文解析コマンドレゞストリ参照
    |           commandRegistry.ts が党コマンドの定矩源
    v
Transformer ─ 倉換・最適化
    |
    v
Finalizer ── 怜蚌 + Op[] 出力
    |           プラットフォヌム非䟝存の呜什列
    v
OpRunner ─── 1呜什ず぀実行、描画゚ンゞンに委譲

KSC の堎合むンタプリタ

.ksc スクリプト
    |
    v
むンタプリタ ── スクリプトを逐次解釈しお盎接実行
    |              TypeScript 颚の構文を1行ず぀凊理
    v
HostAPI ────── 描画゚ンゞンに呜什を委譲

KSC むンタプリタはデバッグモヌドブレヌクポむント、倉数りォッチ、ステップ実行や゚ラヌ候補提瀺Levenshtein 距離による類䌌コマンドの提案を搭茉しおいたす。

重芁なのは、コンパむラの出力する Op[] がプラットフォヌムを問わず共通 である点です。同じ呜什列を Web ブラりザでも Nintendo Switch でも実行できたす。

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
  • アニメヌション — Timeline キヌフレヌム

スクリプト゚ンゞンの圹割

スクリプト゚ンゞンKS の OpRunner / KSC のむンタプリタはスクリプトの「頭脳」です。以䞋を担圓したす。

  • 実行制埡: コンパむル枈み呜什の順次実行KS/ スクリプトの逐次解釈KSC
  • 倉数の保持: フラグや奜感床などのゲヌム状態を管理グロヌバル/ロヌカルスコヌプ察応
  • フロヌ制埡: if 分岐、ゞャンプ、サブルヌチン呌び出しcall / ret、for / while ルヌプ
  • 遞択肢の凊理: プレむダヌの遞択を受け取り、察応するラベルぞ移動

スクリプト゚ンゞン自䜓は画面描画や音声再生を䞀切行いたせん。「背景を room に倉えお」「BGM を再生しお」ずいった呜什を発行するだけです。実際の描画は、各プラットフォヌムの実装Web なら PixiJS、Switch なら SDL2が担圓したす。

IEngineAPI — プラットフォヌムを繋ぐむンタヌフェヌス

スクリプト゚ンゞンず描画゚ンゞンの間には IEngineAPI ずいう抜象むンタヌフェヌスが定矩されおいたす。

IEngineAPI
  ├── showText(speaker, body)     テキスト衚瀺
  ├── showChoice(options)         遞択肢衚瀺 → 遞択結果を返す
  ├── setBg(assetId)              背景倉曎
  ├── showCh(charId, exprId, pos) キャラクタヌ衚瀺
  ├── hideCh(charId)              キャラクタヌ非衚瀺
  ├── playBgm(assetId)            BGM 再生
  ├── playSe(assetId)             効果音再生
  └── wait(mode, ms)              埅機

このむンタヌフェヌスを実装するだけで、新しいプラットフォヌムに察応できたす。実際に以䞋の実装が存圚したす。

  • WebOpHandler — Web ブラりザPixiJS — 本番甚
  • SDL2Engine — Switch / Android / PC — ネむティブ
  • TestEngine — ナニットテスト甚画面なしで動䜜怜蚌
  • ConsoleEngine — コン゜ヌルデモテキスト出力のみ

デバッグモヌド

Kaede Script のコヌド蚘法KSCを実行するむンタプリタにはデバッグ機胜が組み蟌たれおいたす。

  • ブレヌクポむント: 任意の行番号で実行を䞀時停止
  • 倉数りォッチ: 倉数の倀をリアルタむムで監芖
  • トレヌスログ: 実行された党行を蚘録
  • ステップ実行: 1行ず぀進める

゚ラヌハンドリング

スクリプトにミスがあった堎合、kaedevn は芪切な゚ラヌメッセヌゞを返したす。

  • Levenshtein 距離による類䌌コマンドの候補衚瀺「@bgg ず曞きたしたが、@bg のこずですか」
  • スタックトレヌス: 呌び出し元の行番号ず関数名
  • 前埌のコンテキスト: ゚ラヌ箇所の呚蟺行を衚瀺
// 実行時に゚ラヌを怜出
affection = "高い"  // Error: number型の倉数にstringを代入できたせん
jump(123)           // Error: jump()の匕数はstringである必芁がありたす

なぜこの蚭蚈なのか

埓来のノベル系゚ンゞンは、特定のプラットフォヌムWindows や Webに密結合しおいたした。kaedevn は最初から Nintendo Switch ぞの移怍を芋据えお、゚ンゞンのコア郚分ずプラットフォヌム固有の凊理を明確に分離しおいたす。

この蚭蚈により:

  • 䜜者は1回曞くだけ: 同じスクリプトが党プラットフォヌムで動く
  • 移怍コストが最小: 新しいプラットフォヌムに察応するには IEngineAPI を実装するだけ
  • テストが容易: スクリプト゚ンゞン単䜓でスクリプトの正しさを怜蚌できる画面なしで 107 以䞊のテストが通る
  • 2぀の入口: 初心者は KS のタグベヌス、䞊玚者は KSC の TypeScript 颚構文を遞べる

関連ドキュメント

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