第11章 サンプル集

図11-1: サンプルの利用イメージ
キャプチャ差し替え images/11_samples.png

図11-1: サンプルの利用イメージ

図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

ルール画像は 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 育成・恋愛シミュレーションの見本

命令(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.batLUMINA_3D_DEMO=13D の表示(system/Scene3DDemo.txt)
run-action3d-demo.batLUMINA_3D_ACTION_DEMO=13D アクション: 歩く・撃つ・拾う・調べる(system/Action3DDemo.txt)
run-world3d-demo.batLUMINA_3D_WORLD_DEMO=1広い世界: 地形・インスタンス・組・経路(system/Action3DDemo2.txt)
run-physics3d-demo.batLUMINA_3D_PHYSICS_DEMO=1物理演算: 剛体・拘束・ラグドール(system/Action3DDemo3.txt)
run-motion-demo.batLUMINA_MOTION_DEMO=1メッシュ変形モーション(system/MotionDemo.txt)。LUMINA_MOTION_DEMO2 / LUMINA_MOTION_DEMO3 で別の確認
run-anime-demo.batLUMINA_ANIME_DEMO=1部品アニメ(system/AnimeDemo.txt)
run-logo-2d.bat / run-logo-3d.batLUMINA_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 実行モードでは:

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章シナリオコマンド一覧