第11章 サンプル集
images/11_samples.png
図11-1: サンプルの利用イメージ
images/11_samples.png本章はエンジン機能の確認・参照用サンプルです。はじめてシナリオを書く手順は 制作者向け入門 を先に読んでください。絵や音の名前は見本の GameData にあるものか、作品に合わせて置き換える前提の名前です。
11.1 最小システムスクリプト
system/MyInit.txt:
// @lumina
function main() {
System.debugLog("MyInit 開始");
Window.setTitle("サンプルゲーム");
Window.setSize(1280, 720);
Window.setFPS(60);
System.wait(500);
System.debugLog("MyInit 完了");
}
main();
呼び出し(拡張子は System.setExtension("systemScript", …) に従って補われる):
Scripts.execStorage("system/MyInit");
11.2 Config.txt 抜粋
// @lumina
function setupWindow() {
Window.setTitle("私のゲーム v1.0");
Window.setSize(1280, 720);
Window.setFPS(60);
Window.setSingleInstance(true);
}
function setupFolders() {
System.setFolder("script", "data0"); // data0/system・scenario・macro・lang
System.setFolder("bgImage", "data2");
System.setFolder("stand", "data4/stand");
System.setFolder("bgm", "data5/sound");
System.setFolder("movie", "data8");
}
function setupSave() {
System.setSaveProduct("MyBrand", "MyGame"); // ブランド名・ゲーム名
System.setSaveRoot("InstallPath"); // exe の隣
System.setSaveFolder("SaveData"); // exe\SaveData\
System.setSaveDataId("MYGAME001"); // 他作品のセーブと取り違えないための印
System.setSaveDataMode("z"); // ""=平文 / "c"=暗号化 / "z"=圧縮
}
function configMain() {
System.setDataRoot("GameData"); // exe\GameData\ に data0〜 を置く
setupWindow();
setupFolders();
setupSave();
}
configMain();
System.setFolder のキーは script・ui・bgImage など決まった 14 個です(第6章 6.6)。それ以外のキーは無視されます。
11.3 タイトル画面ボタン
// @lumina
function setupTitle() {
Title.clear();
Title.setBackground("data1/title/bg_title");
// ボタンを押したときの処理(id ごとに 1 つ)
Title.register("start",
"Title.hide(); Title.waitUntilHidden(); System.loadScenario('scenario/chapter01');");
Title.register("quit", "System.exit();");
// ボタン: id, x, y, 通常, 乗ったとき, 押したとき, 押せないとき の絵
Title.addButton("start", 500, 400,
"title/btn_title_start_normal", "title/btn_title_start_rollover",
"title/btn_title_start_active", "title/btn_title_start_inactive");
Title.addButton("quit", 500, 560,
"title/btn_title_quit_normal", "title/btn_title_quit_rollover",
"title/btn_title_quit_active", "title/btn_title_quit_inactive");
Title.show();
}
setupTitle();
Title.addButton は 7 引数(絵の実寸で置く)か、末尾に幅・高さを足した 9 引数です。ボタンの文字は絵に描いておきます。実際のタイトル画面は system/title_enhanced.txt を参照してください。
11.4 プラグインの許可
function setupPlugins() {
System.clearPluginDirectories();
System.addPluginDirectory(".");
System.addPluginDirectory("DLL");
System.setAllowedPlugins([
"lmmovie.dll", "mrutheora.dll", "mruvorbis.dll", "mruopus.dll"
]);
// 読み込みは各機能を最初に使う直前に自動で行われる。
// 先に読んでおきたいときだけ書く(任意):
// System.loadPlugin("mruvorbis.dll");
}
Steam 連携の mrusteam.dll だけは、許可一覧に足したうえで System.loadPlugin が必要です(第8章)。
11.5 実行モードの決め方(RunMode.txt)
実行モード(Debug / Release)は system/RunMode.txt の 1 か所で決めます(PreInitialize.txt が起動時に実行)。見本の判定部分:
var runModeEnv = System.getEnv("LUMINA_RUNMODE");
if (runModeEnv == "1") {
System.setRunMode("Debug");
} else if (runModeEnv == "0") {
System.setRunMode("Release");
} else if (Storages.isExistentStorage("data0/system/DevMode.txt")) {
System.setRunMode("Debug");
} else {
System.setRunMode("Release");
}
環境変数 → 開発中の印 DevMode.txt → どちらも無ければ Release、の順です。DevMode.txt は配布用の書き出しで外れるので、配布物は Release で動きます。スクリプトの中では System.isDebugMode() で見分けられます。
11.6 ロゴ演出
// @lumina
function showLogo() {
Common.ShowImage("data1/logo/bland_logo", 0, 0);
System.fadeFromBlack(1200);
Common.Wait(2000);
System.fadeToBlack(1000);
Common.HideImage("data1/logo/bland_logo");
Scripts.execStorage("system/title_enhanced");
}
showLogo();
タイトル画面はシステムスクリプトなので Scripts.execStorage で実行します(Scenario.load はシナリオ用)。見本のロゴは system/logo_enhanced.txt で、2D / 3D の演出とムービーを切り替えられます。
11.7 シナリオ: 導入部
scenario/chapter01.txt:
*start
msgshow
bg 0 bg01a 0 0 fadein 60 sync
bgm_play main_theme
name "ナレーション"
春の午後、主人公は学校の屋上に立っていた。
遠くに聞こえるセミの声が、夏の訪れを告げている。
name ""
chara_show 0 heroine center 30
name "ヒロイン"
あ、いたんだ。探してたの。
chara_change 0 heroine,smile 15
今日、放課後暇?
name ""
select "一緒に帰る" route_home "断る" route_refuse
*route_home
addvar affection 2
jump common_end
*route_refuse
addvar affection -1
jump common_end
*common_end
chara_hide 0 30
fadeout 1000
end
本文はタブで始めます。話し手は name で出し、name "" で地の文に戻します。立ち絵の指定は「キャラ ID」または「キャラ ID,表情」です。
11.8 シナリオ: 選択肢とフラグ
*check_affection
if affection >= 5 good_route
通常ルートです。
jump normal_route
*good_route
setsysflag good_end_seen, 1
グッドルートです。
jump ending
*normal_route
ノーマルルートです。
jump ending
*ending
おしまい。
end
if は「成り立てばラベルへ飛ぶ」1 行の分岐です(ラベルの * は付けても省いてもよい)。何行かをまとめて切り替えるときは #if を使います。
#if "affection >= 5"
好感度が高いときのセリフです。
#elif "affection >= 2"
ふつうのときのセリフです。
#else
好感度が低いときのセリフです。
#endif
setvar / addvar の値はセーブデータごと、setsysflag の値は systemdata.dat に残ります(第6章 6.9)。
時間制限付きの選択肢は、選択肢の直前に select_timeout 制限ms [既定] を書きます。
select_timeout 5000 *no_answer
select "一緒に帰る" route_home "断る" route_refuse
*no_answer
……答えられないまま、時間が過ぎた。
制限が付くのは次の選択肢 1 回だけで、残り時間の帯が出ます。既定 は時間切れのときに選んだことにする選択肢の番号(1 から)か *ラベル(選択肢に無い飛び先でもよい)で、省くと 1 つ目の選択肢になります。セーブ画面などを開いている間は時間が止まり、セーブからの再開やシーン戻りでは制限が付き直ります。
11.9 シナリオ: 動画再生
name "ナレーション"
オープニングムービーを再生します。
name ""
playmovie 0 opening
bgm_play main_theme
書式は playmovie <ループ 0/1> <名前> [x] [y] [マスク] [非同期] です。同期再生では終わるまで待ちます。data8 に opening.ogv(Windows)と opening.mp4(ブラウザ/Android)を並べ、スクリプトでは拡張子を省きます。
11.10 シナリオ: アニメキャラ(mruanime)
animeload chara data8/anime/chara.anm.json
animecreate chara h
animepos h 640 500
animemotion h idle
voice vo01_0001
voice_wait
animestop h
animedestroy h
animeload でモデル(JSON)を読み、animecreate モデル名 変数名 で作った実体の番号を変数に受け取ります。以降はその変数で実体を指します。
11.11 シナリオ: イベント CG
evcg_show "base" 500
これはイベントシーンの一枚絵です。
evcg_show "base+smile" 300
表情だけを差し替えました。
evcg_hide 500
書式は evcg_show <絵> <ミリ秒>、evcg_hide <ミリ秒> です。どの CG のフォルダを使うかは system/EventCgSetup.txt(見本は cg01 とベースの base)で決め、base+smile のように重ねる差分を書けます。
11.12 シナリオ: 画面エフェクト
quake 500 10
flash 200 255 255 255
color_sepia
wait 2000
color_restore
shake 5 3 300
quake <ミリ秒> [強さ]、flash <ミリ秒> [R G B]、shake <強さ> <回数> <ミリ秒>、color_sepia / color_restore は省略可能な切り替え時間(ミリ秒)を取ります。
11.13 シナリオ: ルール画像による場面切り替え
bg 0 bg01b 0 0 001 120
wipe bg01c 2000 1080p_rule10 16
trans_begin
bg 0 bg01a
chara_clear
trans 015 2000 96
trans_begin
bg 0 bg01b
trans crossfade 1500
bg <層> <絵> <x> <y> <ルール名> <コマ数> [ぼかし]… 背景 1 枚をルール画像で出すwipe <絵> <ミリ秒> <ルール名> [ぼかし]… 同じことを時間指定で(層 0)trans_begin〜 場面を変える 〜trans <ルール名|crossfade> <ミリ秒> [ぼかし]… 立ち絵ごと場面をまるごと切り替える
ルール画像は data7/rule(System.setFolder("rule", …))に置き、名前だけで指します。ぼかしは 0〜255(省くと 64)です。見本は scenario/trans_test.txt(環境変数 LUMINA_TRANS_TEST=1 で起動)。
11.14 シナリオ: プリプロセッサ条件
setvar chapter 2
#if "chapter >= 2"
第二章以降のセリフです。
#else
第一章のセリフです。
#endif
条件は「シナリオ変数 演算子 値」を引用符で囲んで書きます。#if は入れ子にできます。
11.15 マクロの利用
macro/fade_scene.txt:
[macro name="FADE_SCENE"]
fadeout 500
bg 0 %0 0 0
fadein 500
[end_macro]
呼び出し(data0/macro のファイルはエンジンが読み込むので、読み込みの命令は要りません):
FADE_SCENE bg01b
引数は %0, %1 … の順に入ります。組み込みの命令と同じ名前は付けないでください。
11.16 多言語
システムスクリプトでは文言を Text.get で引きます(見本の system/Confirm.txt より)。
var cExit = Text.get("confirm.caption.exit", "終了確認");
文言表 data0/lang/en.txt:
confirm.caption.exit=Confirm Exit
絵・声・シナリオの英語版は data0/lang/en/ に、スクリプトに書く名前から先頭の dataN/ を外した形で置きます(例 data0/lang/en/dialog/yes.png)。確かめるときは LUMINA_LANG_TEST=en を付けて起動します。言語の一覧は system/Localization.txt の LANG_TABLE です(第5章 5.5)。
11.17 育成・恋愛シミュレーションの見本
- 起動:
lumina.exe --start-scenario=scenario/sim_sample、または開発用メニュー「デバッグ → 恋愛シミュレーション見本を開始」 - シナリオ:
data0/scenario/sim_sample.txt - 設定ファイル:
data0/sim/love_sample.txt(暦・能力・予定・登場人物・行事・結末) - 絵:
data1/sim/(予定表・ステータスの背景、ボタン)
命令(sim_load・sim_week など)は 第10章 育成・恋愛シミュレーション を参照してください。
11.18 機能デモの実行
見本のタイトル画面の「はじめから」は全機能デモ scenario/feature_demo を始めます。システムスクリプトから直接始めることもできます。
System.loadScenario("scenario/feature_demo");
// または
Scenario.load("scenario/feature_demo");
feature_demo.txt は、基本編(文章・本文のタグ・背景・立ち絵・音・選択肢・分岐・スプライト・メニューバー・オート/スキップ)と応用編(手続き生成エフェクト・画面効果・カメラ・イベント CG・口パク・マクロ・パーティクル・色調・スクロール・フラグ・動画など)のメニューから選んで確かめる構成です。
11.19 3D・モーションのデモ
Windows では build\win\bin\Release の run-*.bat で起動できます(環境変数を立てて lumina.exe を起動するだけです)。
| 起動用 | 環境変数 | 内容 |
|---|---|---|
run-3d-demo.bat | LUMINA_3D_DEMO=1 | 3D の表示(system/Scene3DDemo.txt) |
run-action3d-demo.bat | LUMINA_3D_ACTION_DEMO=1 | 3D アクション: 歩く・撃つ・拾う・調べる(system/Action3DDemo.txt) |
run-world3d-demo.bat | LUMINA_3D_WORLD_DEMO=1 | 広い世界: 地形・インスタンス・組・経路(system/Action3DDemo2.txt) |
run-physics3d-demo.bat | LUMINA_3D_PHYSICS_DEMO=1 | 物理演算: 剛体・拘束・ラグドール(system/Action3DDemo3.txt) |
run-motion-demo.bat | LUMINA_MOTION_DEMO=1 | メッシュ変形モーション(system/MotionDemo.txt)。LUMINA_MOTION_DEMO2 / LUMINA_MOTION_DEMO3 で別の確認 |
run-anime-demo.bat | LUMINA_ANIME_DEMO=1 | 部品アニメ(system/AnimeDemo.txt) |
run-logo-2d.bat / run-logo-3d.bat | LUMINA_LOGO_3D=2 / 1 | エンジンロゴを 2D / 3D の演出で出す |
| — | LUMINA_RICHTEXT_CHECK=1 | 本文のタグ(ふりがな・色・大きさ)とループ効果音(scenario/richtext_check.txt) |
| — | LUMINA_TRANS_TEST=1 | ルール画像による場面切り替え(scenario/trans_test.txt) |
確認用の変数として LUMINA_LANG_TEST(言語)と LUMINA_SIMULATE_DEVICE_LOST(デバイスの喪失を装う。Windows)もあります。ブラウザではアドレスに ?LUMINA_3D_ACTION_DEMO=1 のように付け、Android ではアプリのファイル置き場の launch.txt に LUMINA_3D_ACTION_DEMO=1 のように 1 行ずつ書きます。run-*.bat は開発用なので配布物から外してください。
11.20 デバッグ実行(Windows)
$env:LUMINA_RUNMODE = "1"
.\lumina.exe
開発中の build\win\bin\Release は DevMode.txt があるので、環境変数を付けなくても Debug 実行モードで動きます。Debug 実行モードでは:
- タイトルに
[Debug Mode | FPS]が出て、メニューバーにデバッグメニューが加わる - exe の隣に診断ログ(
lumina_debug.log・lumina_diag.logなど)が残る - タイトル表示後、または Shift+D でパネルを開いたときに
LuminaDebugTools.dllが読み込まれる System.debugLogの出力がログに残る
11.21 関連ファイル
ファイル(build\win\bin\Release\GameData\ から) | 内容 |
|---|---|
data0\system\Initialize.txt | 起動ブートストラップ |
data0\system\Config.txt | ウィンドウ・保存先・拡張子・フォルダ設定 |
data0\system\RunMode.txt | 実行モードの決定 |
data0\system\Localization.txt | 多言語の設定 |
data0\scenario\feature_demo.txt | 全機能デモ |
data0\scenario\trans_test.txt | ルール画像による場面切り替え |
data0\scenario\sim_sample.txt / data0\sim\love_sample.txt | 育成・恋愛シミュレーションの見本 |
| 第9章 | システムスクリプト API 一覧 |
| 第10章 | シナリオコマンド一覧 |