第6章 仕様

ファイル形式・セーブ・フォルダマッピングなどの仕様です。作成手順は 制作者向け入門、配布手順は 第3章 を参照してください。

6.1 実行ファイル仕様

項目値
実行ファイル(ビルド出力)Windows: lumina.exe / ブラウザ: lumina.html + lumina.js + lumina.wasm / Android: lumina.apk(Play 向け: lumina.aab)
対応プラットフォーム起動可: Windows / Steam / ブラウザ / Android(完全互換ではない)。開発中: Linux / iOS / PlayStation系 / Switch系
Android最小 API レベル 24。ABI は arm64-v8a(実機)と x86_64(PC のエミュレータ)
描画 APIWindows: DirectX 12 / ブラウザ: WebGPU(Dawn) / Android: OpenGL ES 3.0(Vulkan / Metal はスケルトン)
音声 APIWindows: LUMINA Audio(XAudio2 / WASAPI) / Android: OpenSL ES / ブラウザ: Web Audio
動画Windows: lmmovie(DirectShow / Media Foundation / Theora)/ Android: MediaCodec / ブラウザ: HTML <video>
スクリプトエンジンlumina_scriptengine(SimpleScript と LUMINA Script の 2 つの書き方)。SystemScriptEngine(起動・UI)と ScenarioScriptEngine(本編)の 2 系統

6.1.1 プラットフォーム別バックエンド・成熟度

同じシナリオ・素材・データ構造を共有しますが、描画/音声/プラグインの実装はプラットフォームごとに異なります。現在の状況は次の通りです。

プラットフォーム描画音声動画プラグイン状況
WindowsDirectX 12LUMINA Audio / XAudio2 / WASAPIlmmovie(DS/MF/Theora)DLL(DLL\ フォルダ)起動可(主要ターゲット)
Steam(Windows と同じ)(Windows と同じ)(Windows と同じ)mrusteam(既定の許可一覧に入っていて、使うときに自動で読み込む)起動可
ブラウザ(WASM)WebGPU(Dawn)Web AudioHTML <video>DLL は使わない。アニメ・モーションは本体に内蔵起動可
AndroidOpenGL ES 3.0OpenSL ESMediaCodecDLL は使わない。アニメ・モーション・音声デコーダ(OGG Vorbis / Opus)は本体に内蔵起動可
Linux雛形雛形——開発中(起動不可)
iOS雛形雛形——開発中(起動不可)
PlayStation系————開発中(起動不可・SDK 前提)
Switch系————開発中(起動不可・SDK 前提)
ブラウザは WebGL ではなく WebGPU(Dawn / emdawnwebgpu) を既定の描画パスに使用します。WebGPU が使えないときは、黒い画面のままにせず理由を画面に出します(日本語/英語はブラウザの言語に合わせる):
  • WebGPU に対応していないブラウザ … 対応ブラウザ(パソコンの Chrome / Edge、Android の Chrome など)を案内
  • https(または localhost)以外で開いている … WebGPU は安全な接続のページでしか使えないため、https での配信を案内(配布サーバーは必ず https にする)
  • GPU を借りられない(ハードウェア アクセラレーションが切・対象外の GPU)… 設定の見直しか別のブラウザ・端末を案内
このときはゲームデータ(数百 MB)の取得とエンジンの起動も止めます(描けないのにダウンロードだけ進むのを防ぐ)。案内の文言は lumina/app/web/shell.html にあります。

6.1.2 3D

API は 第9章 の Scene3D を参照してください。

図6-1: 実行ファイル(プラットフォーム別)
キャプチャ差し替え images/06_specification.png

図6-1: 実行ファイル(プラットフォーム別)

図6-1: 実行ファイル(プラットフォーム別) — 差し替え: images/06_specification.png

6.2 設定ファイル仕様

config.ini

既定では使いません。見本の Config.txt は System.setIniEnabled(false) と System.setIniAutoCreate(false) を指定しており、この状態ではエンジンは config.ini を読まず、書かず、作りもしません(設定は systemdata.dat に保存されます)。

INI と自動作成を両方有効にした場合だけ、exe のフォルダに次の雛形が作られます(Windows)。


# ADV設定
[Window]
Title=ADV Game Engine
Width=1280
Height=720
TopMost=0
FPS=60
WindowResizable=1
AspectRatioLock=2
SingleInstance=1
SingleInstanceKey=ADV Game Engine

[Display]
# ScreenMode: FALSE=ウィンドウ, DirectX12/Win32=仮想フルスクリーン
ScreenMode=FALSE
# WindowMode: Linear=リニア, Cubic=キュービック, Lanczos=ランチョス, SharpLinear=シャープリニア
WindowMode=Linear
CubicStrength=0.80
MultiCore=1
CoreCount=2
ExitDialog=ON

[Confirm]
# DialogType: 0=なし(即実行), 1=Windows(MessageBox), 2=rc(リソースダイアログ), 3=画像ダイアログ
ExitType=3
MenuExitType=3
TitleExitType=1

[Startup]
StartupDialog=OFF
StartupScript=startup.txt

[SystemSave]
# SaveRoot: InstallPath / MyDocuments / AppData / MyGamesDocuments
SaveRoot=InstallPath
SaveDataID=
BrandName=
GameName=

実際の雛形には、ウィンドウアイコンの指定例(IconPath など)のコメントも入ります。[Debug] DebugMode(1 / 0)は INI を有効にしているときだけ読まれ、実行モードを上書きします。INI が無効なら config.ini を置いても無視され、実行モードは system/RunMode.txt(環境変数 LUMINA_RUNMODE → 開発中の印 DevMode.txt → どちらも無ければ Release)で決まります(第3章 3.5)。

systemdata.dat

利用者の設定・既読・システムフラグ等の保存ファイルです。保存先フォルダ(6.8)に作られます。起動ダイアログの表示有無や画面モードなどは、保存した値が Config.txt の既定値より優先されます。

保存形式(System.setSaveDataMode)説明
""(空文字)平文
cAES-GCM で暗号化
zzstd で圧縮(見本の Config.txt はこれ)

コマンドライン: --systemsave-mode=c / --systemsave-mode=z

6.3 パックファイル仕様(.laf)

項目仕様
拡張子.laf。dataN フォルダごとに 1 つ(data0.laf〜)
圧縮Zstd(build-pack-data.ps1 の既定はレベル 9。0 は無圧縮)。無圧縮で入れた動画は、Windows ではパックからその場で再生できる
暗号化任意。パスワードを指定したときだけ AES-256-GCM(PBKDF2 で鍵を作り、HMAC で改ざんを検出、ダミーの項目を混ぜる)。暗号化したパックを読むには、エンジンにも同じ語を入れてビルドする(CMake の -DLUMINA_PACK_PASSWORD)。既定のパックは暗号化しない
マウント起動時に exe のフォルダと 1 階層下(GameData など)の *.laf、および setDataRoot のフォルダの *.laf を自動で読み込む
素のファイルとの関係Windows では同じ名前の素のファイルが優先され、パックは見つからないときの予備になる(パックで動かすフォルダには素の dataN フォルダを置かない)
ブラウザGameData/packlist.json に載ったパックだけを取得する
仮想パスpack:/// プレフィックス(内部解決)
上限目次(ファイル一覧)の大きさは 256MB まで。範囲がファイルの外を指す項目は読まない

パックは build-pack-data.ps1(書き出しの dataN をまとめてパック)、luminapack(コマンドライン)、PackTool(GUI)で作れます。どれで作った .laf も全プラットフォーム共通で、実行時に自動で読み込まれます。

6.4 暗号化スクリプト仕様(.lsf)

項目仕様
拡張子.lsf
マジックGSCRYPT1
方式AES-256-GCM + HMAC-SHA256、鍵は PBKDF2-SHA256、ダミーの項目を混ぜる
生成ツールScriptEncryptor(GUI・コマンドライン)
パスワード既定のエンジンキー、または Config.txt の System.setScriptPassword と同じ語。Config 自体は既定のエンジンキーで暗号化する(パスワードを設定する前に読まれるため)
対象システムスクリプト・シナリオ・マクロ・シミュレーションの設定ファイル

解決順序(拡張子省略時): System.setExtension で決めた拡張子 → 無ければもう一方(.lsf ⇔ .txt)。.tjs は起動用スクリプトの候補としてだけ探します。

6.5 画像形式仕様(LGC)

項目仕様
形式LGC(拡張子 .lgc)。マジック LGC1、16 バイトのヘッダ
圧縮ZLIB / ZSTD / LZ4 / LZMA(予測フィルタによる前処理あり)
生成LuminaImageCompressor(PNG / JPG / BMP から変換。GUI・コマンドライン)
読み込み実行時に自動で読み込み。見本の既定の画像拡張子は lgc
上限縦横とも 16384 ピクセルまで(それを超える画像・大きさ 0 の画像は読まない)

6.6 フォルダマッピング仕様

System.setFolder(key, path) / System.getFolder(key) で管理します。使えるキーは下の 14 個で、それ以外のキーは黙って無視されます(scenario・macro・system はキーではありません。スクリプトは script の下の system / scenario / macro / lang を見ます)。

キー用途見本の値
scriptスクリプト(配下の system / scenario / macro / lang)data0
uiUI 画像data1
bgImage背景data2
eventCgイベント CGdata3
stand立ち絵data4/stand
spriteスプライトdata4/sprite
bgm / se / voiceBGM / 効果音 / ボイスdata5/sound / data5/se / data6
sysse / sysvoiceシステム効果音 / システム音声(場面の音とは別の音量)data5/sysse / data5/sysvoice
rule場面切り替えのルール画像data7/rule
movie動画data8
font組み込み書体(指定フォルダの font を見る)data0

6.7 プラグイン仕様

項目仕様
形式Windows の DLL。Android / ブラウザは DLL を使わず、同じ機能を本体に内蔵(第8章)
置き場所exe の隣の DLL\(steam_api64.dll も同じ場所)
読み込み各機能を最初に使う直前にエンジンが自動で読む。System.loadPlugin("name.dll") で先読みも可
検索パスSystem.addPluginDirectory(path)(見本は "." と "DLL")
許可リストSystem.setAllowedPlugins([...])。載っていない DLL は読み込まれない(空の一覧は制限なし)
ログDebug 実行モードの lumina_diag.log([プラグイン] の行)。Debug ビルドの exe は plugin_load.jsonl も出す

6.8 セーブデータ仕様

種類API保存先
スロットセーブSystem.saveData(slot) / SaveSlot保存先フォルダ
クイックセーブ/オートセーブSaveSlot.setSeries で履歴の番号と保持数を決める同上
前回の続きからQuickResume オブジェクト同上
中断(サスペンド)Suspend オブジェクト同上
設定・既読・システムフラグ自動systemdata.dat

保存先は Config.txt の次の API で決めます。

API意味
System.setSaveProduct(ブランド名, ゲーム名)フォルダ分けに使う名前。両方とも省くと LUMINA / GameEngine
System.setSaveRoot(ルート)InstallPath / MyDocuments / MyGamesDocuments / AppData
System.setSaveFolder(名前)末尾のフォルダ名(既定 save。見本は SaveData)
System.setSaveDataId(ID)他の作品のセーブを読み違えないための印。セーブファイルの中に書いて照合する(フォルダ分けには使わない)
System.setSaveDataMode(形式)"" / "c" / "z"(6.2)
プラットフォーム保存先
WindowsInstallPath = <exe のフォルダ>\<保存フォルダ>/MyDocuments = ドキュメント\<ブランド名>\<ゲーム名>\<保存フォルダ>/MyGamesDocuments = ドキュメント\My Games\<ブランド名>\<ゲーム名>\<保存フォルダ>/AppData = %APPDATA%\<ブランド名>\<ゲーム名>\<保存フォルダ>。InstallPath に書き込めないときは AppData へ回す(第3章 3.4)
ブラウザIndexedDB(IDBFS)。同じサイトに置いた別の作品と混ざらないよう <保存フォルダ>/<ブランド名>/<ゲーム名> で分け、ブラウザに永続保存(navigator.storage.persist)を求める
Androidアプリの内部ストレージ(<保存フォルダ>/<ブランド名>/<ゲーム名>)

セーブデータの安全性

ロード・シーン戻りで戻るもの

セーブのロード、「前回の続きから」、シーン戻りでは、シナリオの位置と変数に加えて、背景・立ち絵・イベント CG・BGM・メッセージウィンドウの状態が戻ります。Windows・Android・ブラウザで同じです。

画面の保存(画面キャプチャー)

画面は PNG で保存します。

呼び方保存のしかた
System.captureScreen()exe の隣の capture\ に capture_0001.png から連番で保存(上書きしない)。exe の隣に書き込めないときは、保存先フォルダの capture\ に保存
System.captureScreen("ask")、メニューの「画面キャプチャー」保存先を選ぶ窓を出す。形式は PNG が既定(BMP も選べる)
プラットフォーム保存先
Windows上の表のとおり
Androidアプリの内部ストレージの capture/ に PNG で保存
ブラウザPNG をダウンロードとして渡す

6.9 フラグシステム仕様

保存先の違う 4 種類の値を使えます(命令の詳細は 第10章)。

種類値保存先・寿命シナリオ命令
シナリオ変数整数(範囲の制限なし)セーブデータごと。System.loadScenario で新しく始めると空になる(System.jumpScenario は保つ)setvar 名前 値 / addvar 名前 値
システムフラグ0〜9(範囲外は 0〜9 に収める。0 を入れると下ろせる)systemdata.dat(どのセーブで立てても残る)setsysflag 名前, 値 / addsysflag 名前, 値
クリアフラグ真 / 偽systemdata.datsetclearflag 名前, 値
フローチャートフラグ0〜9(0 を入れると下ろせる)systemdata.datsetflowflag 名前, 値 / addflowflag 名前, 値

分岐はシナリオ変数を比べます。

システムスクリプトからは System.setSystemFlag / addSystemFlag / getSystemFlag / setClearFlag / getClearFlag / setFlowchartFlag / addFlowchartFlag / getFlowchartFlag / clearAllClearFlags を使います。

6.10 入力仕様

ADV 向け抽象入力(Input オブジェクト):

ゲームパッド

パッドで文章送り・選択肢・セーブ画面などを操作できます。割り当てはどの環境でも同じです。

ボタン操作
A決定(文章送り)
B / START取り消し・戻る(右クリック・Esc と同じ)
十字キー / 左スティック上下左右の移動(押し続けると繰り返す)
LBバックログ
RB(押し続ける)スキップ
プラットフォーム受け付け方
WindowsXInput 対応のパッド。ゲームの窓が前面にあるときだけ効く
Androidパッドに加えて、キーボードのキー(Enter・Esc・矢印キー・PageUp・Ctrl など)も同じ操作として受け付ける。端末の「戻る」ボタンはメニューの一覧を出す(確認・設定などの画面やバックログでは、その画面の「戻る」)
ブラウザブラウザの Gamepad API で、最初に見つかったパッドを使う

選択肢は十字キーで選んで A で決めます。Android / ブラウザでは、まだ選んでいないときに A を押すと、最初の選択肢に印が付きます。使うかどうかは Input.setGamepadEnabled(0 / 1)(既定は使う)、つながっているかは Input.isGamepadConnected() で調べられます。

汎用の画面のキー・パッド操作

Screen.show で出す画面(フローチャート・マップ・ステータス・育成シミュレーションの予定表など。Windows 以外では確認ダイアログも)は、キーとパッドでも操作できます。

確認ダイアログのキー・パッド操作

確認ダイアログの「次回から確認しない」も、すべての環境でキーとパッドで操作できます。

プラットフォーム操作
Windows左右の矢印キー(十字キー)でボタン(はい・中断・いいえ)を選び、下でチェック欄へ、上でボタンへ戻る。Enter / A で選んでいる所を押す。チェック欄では入り切りだけで、ダイアログは閉じない。何も選んでいないときの Enter はこれまでどおり「はい」。選んでいるボタンはマウスを乗せたときと同じ絵、チェック欄は行全体を枠で囲んで示す
Android / ブラウザ上の「汎用の画面」と同じく十字キーで選ぶ。チェック欄も選べ、選んでいる間は枠で囲む。A で入り切りする(閉じない)

6.11 コマンドライン引数(Windows)

引数説明
--start-scenario=<パス>ロゴとタイトルを飛ばし、このシナリオから始める(例 --start-scenario=scenario/sim_sample)
--start-label=<ラベル>開始するラベル。シナリオの指定が無いときは、タイトルの「はじめから」で読むシナリオに使う
--start-line=<行>そのシナリオのソース行から始める
--smoke-test-systemdata画面を出さずに systemdata.dat の作成・読み込み・保存だけを行って終了
--systemsave-mode=c / zsystemdata.dat の保存形式(暗号化/圧縮)

System.switchArg(index, default, code0, code1, ...) で分岐可能。ブラウザはアドレスの ?KEY=VALUE、Android は launch.txt が環境変数の代わりになります(System.switchEnv で読めます)。

6.12 スクリプト言語仕様(概要)

システムスクリプト(LUMINA Script)

シナリオスクリプト

詳細は 第9章 システムスクリプト API と 第10章 シナリオ命令 を参照。