Kagari
キーワードを入力してドキュメントを検索します。

ビルドと実行

プロジェクト

Kagari のゲームはプロジェクトです。プロジェクトは、マニフェスト kagari.toml、ソースファイル、アセットを収めたディレクトリです。kagari build はプロジェクトを 1 つの .kagari ファイルと .kiarchive アセットアーカイブにコンパイルし、ランタイムがそれを実行します。

プロジェクトの構成

kagari init は次の構成を作ります(kagari init を参照)。

text
my-game/
├── kagari.toml the manifest
├── .gitignore ignores /target
├── src/
│ ├── main.kis the root file (`project.entry`)
│ ├── scenario/mod.kix the story
│ ├── scripts/mod.kis
│ ├── scripts/characters.kis
│ ├── system/mod.kix the game system
│ └── effect/mod.kis
├── assets/ `asset("…")` paths are relative to this directory
│ ├── bgimage/
│ ├── sound/
│ ├── music/
│ └── characters/character1/
│ ├── image/normal.png
│ └── voice/0001.wav
└── target/ build output (`build.out-dir`)
└── v0/
├── game.kagari
└── *.kiarchive

必須なのは kagari.toml とルートファイルだけです。モジュールツリーはルートファイルから広がります。ソースファイルとモジュールを参照してください。src/ と assets/ の下のディレクトリ名はテンプレートの慣習であり、規則ではありません。

Kagari リポジトリの example/test_game1 は同じ形の完全なプロジェクトです。

kagari.toml

マニフェストは 4 つのテーブルからなる TOML です。すべてのキーを使った例を示します。

toml
[project]
name = "my-game" # required
version = "0.1.0" # required, semver
entry = "src/main.kis" # the root file; default "src/main.kis"
[toolchain]
kagari = "0.1" # required; the toolchain versions the project accepts
[assets]
dir = "assets" # the asset directory; default "assets"
system-fonts = true # whether `system_font("…")` may name installed fonts; default true
[build]
targets = ["v0"] # engine major versions to build for; default ["v0"]
runtime-compatibility = ["native_v0"] # runtime profiles whose decoders the assets must suit; default ["native_v0"]
out-dir = "target" # default "target"
state-cap = 200000
recursion-depth = 2048
keyframe-check = false

共通の規則:

  • 未知のテーブルやキーはエラーです。
  • パスはすべて kagari.toml のあるディレクトリからの相対パスです。絶対パスはエラーです。
  • kagari ツールは、--manifest-path で指定されない限り、カレントディレクトリから親ディレクトリへ順に kagari.toml を探します。

[project]

キー型既定値意味
name文字列必須プロジェクト名。空にはできません。
version文字列必須プロジェクトのバージョン。"0.1.0" のような semver のバージョンです。
entry文字列(パス)"src/main.kis"ルートのソースファイル。.kis か .kix で終わる必要があります。

[toolchain]

キー型既定値意味
kagari文字列必須実行中の kagari のバージョンが満たすべき semver の条件("0.1"、">=0.1, <0.3")。

条件を満たさない場合、プロジェクトを読み込むコマンドはすべて this project requires kagari <req>, but this is kagari <version> を出して終了ステータス 2 で止まります。kagari init は、プロジェクトを作ったツールチェインの major.minor を書き込みます。

[assets]

キー型既定値意味
dir文字列(パス)"assets"アセットディレクトリ。asset("…") のパスはここからの相対パスです。
system-fonts真偽値truesystem_font("…") がビルドするマシンにインストールされたフォントを指せるかどうか。false のとき、system_font の呼び出しはすべて E1031 になります。

アセットディレクトリ直下の system-fonts/ と std/ ディレクトリは予約されています(E1032)。システムフォントと、シェーダーなど標準ライブラリ自身のアセットは、ビルド出力の中でこれらの名前の下に格納されます。

system_font("…") は、ゲームをビルドするマシンの次のディレクトリを順に探します。

プラットフォームディレクトリ
Windows%LOCALAPPDATA%\Microsoft\Windows\Fonts、%WINDIR%\Fonts
macOS~/Library/Fonts、/Library/Fonts、/System/Library/Fonts
Linux など$XDG_DATA_HOME/fonts(既定は ~/.local/share/fonts)、~/.fonts、続いて $XDG_DATA_DIRS の各ディレクトリの fonts(既定は /usr/local/share:/usr/share)

フォントファイルはビルド出力にコピーされるため、プレイヤーがそのフォントをインストールしている必要はありません。配布する前にフォントのライセンスを確認してください。

[build]

キー型既定値意味
targets文字列の配列["v0"]kagari build がビルドするターゲット。対応しているのは v0。空にはできず、重複は無視されます。
runtime-compatibility文字列の配列["native_v0"]すべてのアセットが対応すべきデコーダを持つランタイムプロファイル。対応しているのは native_v0。空にはできず、重複は無視されます。
out-dir文字列(パス)"target"出力ディレクトリ。
state-cap整数200000コンパイラオプション state-cap。
recursion-depth整数2048コンパイラオプション recursion-depth。
keyframe-check真偽値falseコンパイラオプション keyframe-check。

コンパイラオプション

コンパイラオプションは、コンパイラが検査・出力する内容を変える 4 つのマニフェストキーです。kagari check、kagari build、言語サーバーはいずれもこれを使います。

オプションキー既定値意味
状態数の上限[build] state-cap200 000解析が探索する物語の状態数の上限。超えると解析を打ち切り、W5006 を報告します。
再帰の深さ[build] recursion-depth2048実行時の呼び出しの入れ子の上限。すべての呼び出しフレーム(fn、クロージャ、シーン、即時手続き)を数えます。これより深い呼び出しはゲームをエラーで停止させます。.kagari ファイルに書き込まれます。
キーフレーム検査[build] keyframe-checkオフキーフレーム配置の検査(W5011)を行います。プレイヤーが直接到達しうるステップ(各選択肢と、各エントリーシーンの最初のステップ)にはキーフレームとなるレンダーがあるべきです。演出を参照してください。
システムフォント[assets] system-fontsオンsystem_font("…") がインストール済みフォントを指せるようにします(オフのときは E1031)。

W5006 と W5011 は物語の解析(E5xxx)、E1031 はモジュール・アイテム・名前(E1xxx)を参照してください。

ターゲットと出力ディレクトリ

ターゲットは、.kagari ファイルが対象とするエンジンのメジャーバージョンです。ターゲットは v0 だけです。kagari build はターゲットごとに専用のディレクトリ <out-dir>/<target> へ書き出します。

text
target/v0/
├── game.kagari
├── bgimage.kiarchive
├── bgm.kiarchive
├── fgimage.kiarchive
├── image.kiarchive
└── system-fonts.kiarchive

(これは example/test_game1 の出力です。)kagari build は書き出す前に、以前のビルドがそのディレクトリに残した game.kagari とすべての .kiarchive を削除します。それ以外のファイルには触れません。

アセットとアーカイブ

kagari build がパックするのは、プログラムが(asset("…") と system_font("…") で)参照するアセットだけで、アセットディレクトリ全体ではありません。アセットは game.kagari の隣の .kiarchive ファイルに入ります。

アセットのパスアーカイブ
characters/character1/image/normal.pngcharacters.kiarchive(最上位のディレクトリごとに 1 つ)
title.png(アセットディレクトリ直下)data.kiarchive
システムフォント(例: system-fonts/msgothic.ttc)system-fonts.kiarchive
標準ライブラリのアセット(例: std::shaders のシェーダー std/shaders/color/blur.wgsl)std.kiarchive

アーカイブ内のエントリ名はアセットの完全なパスです。ランタイムは、ゲームがあるアーカイブのアセットを初めて必要としたときにそのアーカイブを開きます。アーカイブが見つからなくても起動時のエラーにはなりません。ランタイムは警告をログに出し、そのアセットは使用時に存在しないものとして扱われます。

ランタイムは、ベースのアーカイブの隣にある番号付きのパッチアーカイブ(bgimage.001.kiarchive、bgimage.002.kiarchive、… 最初に欠けた番号まで)も読みます。各パッチは、それより前のアーカイブのエントリを追加・置換・削除します。kagari build が書き出すのはベースのアーカイブだけです。

ランタイムプロファイル

ランタイムプロファイルは、ランタイムが持つデコーダの集合の名前です。kagari build は何かを書き出す前に、参照されるすべてのアセットを build.runtime-compatibility のすべてのプロファイルに照らして検査します。アセットの形式はファイル拡張子ではなく内容で判定します。プロファイルはデスクトップランタイムの native_v0 だけです。

アセットの種類native_v0 がデコードできる形式
画像PNG(APNG は既定の画像を表示)、ベースラインおよびプログレッシブ JPEG、非可逆・可逆・拡張(アルファまたはメタデータ付き)WebP
オーディオ、ボイスOgg Vorbis、FLAC、WAV(PCM または IEEE 浮動小数点)、MP3
フォントTrueType、OpenType(CFF)、TrueType/OpenType コレクション
シェーダーWGSL ソース(UTF-8 テキスト)
動画なし

それ以外はすべて拒否されます。アニメーション WebP、算術・可逆・階層・12 ビット符号化の JPEG、GIF、BMP、AVIF、JPEG XL、Ogg Opus、Ogg FLAC、その他のコーデックの Ogg、圧縮 WAV、AAC/M4A、WOFF、WOFF2 です。動画のアセットは内容にかかわらず拒否されます。問題はアセットとプロファイルの組ごとに 1 行ずつ出力されます。

text
error: asset `bgimage/bad.jxl` (image): JPEG XL is not supported by runtime profile `native_v0`
error: asset `movie/intro.webm` (video): video assets are not supported by runtime profile `native_v0`

シェーダーの検査

プロファイルの検査に続いて、kagari build は参照されるすべてのシェーダーを、標準ライブラリのものも含め、その定数が宣言するロールとしてコンパイルします(ColorShader<…> はカラーシェーダーとして検査する、など)。2 つのロールで使われるファイルはロールごとに 1 回ずつ検査します。不正なシェーダーごとに 1 行出力し、誤りが .wgsl ファイル内にあればその行番号を示します。

text
error: shader `shader/broken.wgsl` (color): line 4: no definition in scope for identifier: `undefined_name`

ロールは color、mix、texture、mask、local motion、transitional motion です。

このときビルドは、出力ディレクトリを作らず以前の出力も削除せずに、ステータス 1 で終了します。STD リファレンスのランタイムプロファイルも参照してください。

ゲームの配布

配布するゲームは、ランタイムの実行ファイルと <out-dir>/<target> の中身を収めた 1 つのディレクトリです。

text
MyGame/
├── kagari-desktop-runtime (kagari-desktop-runtime.exe on Windows; you may rename it)
├── game.kagari
└── *.kiarchive

ディレクトリ引数なしで起動すると、ランタイムは自身の実行ファイルのディレクトリで game.kagari を探します。設定とセーブはそこには書かれず、ユーザーごとのデータディレクトリに保存されます(データディレクトリを参照)。プレイヤーにはシステム要件に挙げたシステムライブラリが必要です。

最終更新日 2026年10月29日