Lily Novel Player シナリオ制作の手引き

  • 変更すべき箇所は赤い色の太字で表記されます。
  • Lily Novel PlayerをLNPと略記する場合があります。

Lily Novel Playerについて

Lily Novel Playerは、使用中のシェルに対応して内容が変わるゴーストです。

使用中のシェルのフォルダ名と同じ名前のフォルダが「ghost/master/scenarios/【フォルダ名】」として存在すれば、その中の「dic【任意の辞書名】.txt」をLNP基本辞書に追加して読み込みます。


追加シナリオを配布する場合、シェルとゴースト追加辞書とをまとめたサプリメントが基本的な1セットとなります。

配布用ファイルの作成については、UKADOCをご確認ください。

また、「LilyNovelPlayer」フォルダ直下に、説明つき見本「test_supplement.zip」を同梱しています。
zipファイルを解凍して中身をご覧ください。
そのままインストールもできます。


シナリオの記述方法については、「ghost/master/scenarios/master」以下のtxtが動作見本となっております。
「ghost/master」直下のLNP基本辞書を理解する必要は、基本的にはありません。

同梱素材のリストと利用条件

利用条件

LNPへの追加ファイルへの使用に限り、以下の条件でご自由にお使いいただけます。

  • 著作者表示不要
  • 加筆・反転等の加工OK
  • 同梱再配布OK

※初期から同梱済みのファイルを改変せずに使う場合、配布ファイルにそれを含める必要はありません。
既存のファイルを指定してお使いください。
例: (bg、assets/preset/color_light.png

素材リスト

ghost/master/
 dic_base_bootend.txt
 dic_base_event.txt
 dic_base_resource.txt
 dic_game_core.txt
 dic_game_tag.txt
 dic_menu.txt
 dic_menu_config.txt
 dic_menu_gallery.txt
 dic_menu_saveload.txt
 dic_settings_default.txt

 assets/
  preset/
   batsu_button.png
   button1.png
   button1d.png
   choice_base1.png
   clickwait.png
   color_dark.png
   color_light.png
   gallery_locked.png
   menu_backlog.png
   menu_config.png
   menu_gallery.png
   menu_load.png
   menu_save.png
   messagewindow1.png
   messagewindow2.png
   nowloading.png
   ownerdraw_background.png
   ownerdraw_foreground.png
   ownerdraw_sidebar.png
   resumewindow.png
   osorawo_osampo.mp3
   tanoshii_ukagaka.mp3

  preset_chara/
   gallery/
    boy_01_g.png
    boy_02_g.png
    boy_03_g.png
    boy_04_g.png
    boy_05_g.png
    boy_06_g.png
    boy_07_g.png
    boy_08_g.png
    boy_ex_g.png
    girl_01_g.png
    girl_02_g.png
    girl_03_g.png
    girl_04_g.png
    girl_05_g.png
    girl_06_g.png
    girl_07_g.png
    girl_08_g.png
    girl_ex_g.png

   mirror_gallery/
    boy_01_g.png
    boy_02_g.png
    boy_03_g.png
    boy_04_g.png
    boy_05_g.png
    boy_06_g.png
    boy_07_g.png
    boy_08_g.png
    boy_ex_g.png
    girl_01_g.png
    girl_02_g.png
    girl_03_g.png
    girl_04_g.png
    girl_05_g.png
    girl_06_g.png
    girl_07_g.png
    girl_08_g.png
    girl_ex_g.png

   mirror_stand_large/
    boy_01.png
    boy_02.png
    boy_03.png
    boy_04.png
    boy_05.png
    boy_06.png
    boy_07.png
    boy_08.png
    boy_ex.png
    girl_01.png
    girl_02.png
    girl_03.png
    girl_04.png
    girl_05.png
    girl_06.png
    girl_07.png
    girl_08.png
    girl_ex.png

   mirror_stand/
    boy_01.png
    boy_02.png
    boy_03.png
    boy_04.png
    boy_05.png
    boy_06.png
    boy_07.png
    boy_08.png
    boy_ex.png
    girl_01.png
    girl_02.png
    girl_03.png
    girl_04.png
    girl_05.png
    girl_06.png
    girl_07.png
    girl_08.png
    girl_ex.png

   stand_large/
    boy_01.png
    boy_02.png
    boy_03.png
    boy_04.png
    boy_05.png
    boy_06.png
    boy_07.png
    boy_08.png
    boy_ex.png
    girl_01.png
    girl_02.png
    girl_03.png
    girl_04.png
    girl_05.png
    girl_06.png
    girl_07.png
    girl_08.png
    girl_ex.png

   stand/
    boy_01.png
    boy_02.png
    boy_03.png
    boy_04.png
    boy_05.png
    boy_06.png
    boy_07.png
    boy_08.png
    boy_ex.png
    girl_01.png
    girl_02.png
    girl_03.png
    girl_04.png
    girl_05.png
    girl_06.png
    girl_07.png
    girl_08.png
    girl_ex.png

   voice/
    chara_voice1.wav
    chara_voice2.wav
    chara_voice_douji.wav

 scenarios/master/
  dic_gallerylist.txt
  dic_keypress.txt
  dic_scenario1.txt
  dic_scenario2.txt
  dic_settings.txt
  dic_snippet.txt
  dic_title.txt

  resources/
   Number001.png
   Number002.png
   Number003.png
   Number004.png
   Number005.png
   Number006.png
   Number007.png
   Number008.png
   Number009.png
   Number010.png
   bg_desktop.png
   bg_move1.png
   bg_move2.png
   bg_move3.png
   bg_move4.png
   bg_sky.png
   bg_title.png
   nowloading.png

shell/master/
 descript.txt
 surface0.png
 surface10.png
 surfaces.txt
 title1.png
 titlebar1.png
 window_reduce.png

LilyNovelPlayerBallon/
 arrow0.png
 arrow1.png
 balloonc0.png
 balloons0.png
 balloons1.png
 balloons2.png
 balloons3.png
 cancel_down.png
 cancel_up.png
 clickwait.png
 descript.txt
 install.txt
 marker.png
 ok_down.png
 ok_up.png
 online0.png
 online1.png
 online2.png
 online3.png
 sstp.png

test_supplement/
 install.txt

 ghost/master/scenarios/LilyNovelPlayer_test/
  dic0.txt

 shell/LilyNovelPlayer_test/
  descript.txt
  readme.txt
  surface0.png
  surface10.png
  surfaces.txt
  titlebar1.png
  window_reduce.png

 LilyNovelPlayerBallon_test/
  arrow0.png
  arrow1.png
  balloonc0.png
  balloons0.png
  balloons1.png
  balloons2.png
  balloons3.png
  cancel_down.png
  cancel_up.png
  clickwait.png
  descript.txt
  install.txt
  marker.png
  ok_down.png
  ok_up.png
  online0.png
  online1.png
  online2.png
  online3.png
  sstp.png

シェルフォルダの命名規則

LNPではシェルフォルダ名をシナリオの識別名とみなし、他の追加シェルと被らないことを前提として動作しています。
そのため、フォルダ名は以下の命名規則で、赤太文字の部分を半角英数字のみ(0~9、a~z、A~Z)で表記してください。

作者名_タイトル名などの管理用文字列

作者名を出したくない場合などは、masterシェルのシナリオに「補助識別子生成」があるので、ご活用ください。

シナリオの流れ

ゴースト起動後およびシェル変更後、必要な処理が終わると「*【フォルダ名】.起動」へジャンプします。

待ち時間は基本的に短いため、最初の場面で音や効果音を鳴らしたい場合は、事前にワンクッション置くと親切かもしれません。


シナリオ中は、LNP独自タグ「next」「nextset」「nextjump」「選択肢」で関数を移動していく、というのが基本の流れです。

上記4種のタグでシナリオを移動する場合のジャンプ先は「【フォルダ名】.【任意の文字列】」です。

LNP独自タグ以外で遷移すれば他の関数名も使えますが、そのままでは中断からの復帰やセーブデータからの再開時のチェックポイントになりません。

いずれの場合も、LNP基本辞書内の文・単語群・変数との名前被りがあると、不具合の原因になります。


展開を分岐させる場合の例は以下です。

(when,(変数読み出し,うにゅう好感度)>100,
(next_set,うにゅうの好感度が高い,1),
(next_set,うにゅうの好感度が普通,1)
)

終了時は「ゲーム終了」へジャンプさせてください。

独自で「\-」を記述してもよいです。
(ただし、セーブデータに不要な変数がたくさん残ります)

辞書記述時の注意点

フォルダ名・関数名・ゲーム内変数の名前・ゲーム内変数の内容には、なるべく区切り字を含まないでください。
※括弧の展開などで、LNP独自タグ実行のタイミングで無くなっていればかまいません。

#里々既定の区切り字
、
、
,
,
(バイト値、1)
#LNP独自の区切り字
|
:

LNP基本辞書でsplit関数を多用しています。
そのため、シナリオの動作でsplitを使う場合、splitした直後以外は(S【数値】)の中身が書き換わっている可能性が高いです。


「$自動改行挿入」を「無効」にしています。
そのため、辞書の*内の改行に応じて\nが自動挿入されることはありません。
出力スクリプトを改行したい時は、手動で\nなどを書いてください。


中断やセーブからの再開はチェックポイント(*1)を起点に行われます。
そのため、画像や音の指定は、変更が無くても再度行ってください。
そうしないと、再開時に画像や音が出ないことがあります。

*1: nextnextsetnextjump選択肢のタグ実行直後に移動した関数の冒頭


「\w1」~「\w9」は、LNP独自のコンフィグ設定に応じて、スクリプト出力直前に「\_w[【半角数値】]」へ置き換えられるか、除去されます。
「\w1」~「\w9」以外は変更されません。


以下のような形で関数を移動すると、LNP独自の文字色設定などが初期化されます。

*関数名1
:ほにゃらら\x
>関数名2

LNP独自の文字色設定用スクリプトは出力スクリプトの冒頭へ挿入されています。
「\x」を使うと、それらは使用中バルーンのデフォルト設定に戻されます。
そのあと「>関数名」や「(関数名)」、「(call,関数名)」などのSHIORIリクエストの発生しない方法で関数を移動すると、文字色設定用スクリプトが再び挿入されることはありません。

「\![raise,関数名]」「\![embed,関数名]」を使うと、再び文字色設定用スクリプトが挿入されます。

セーブデータ

LNP独自タグ「next」「nextset」「nextjump」「選択肢」で、ゲーム内変数を操作できます。
特別な理由のない限り、残したい変数の記録はLNP独自タグで行ってください。

「$変数名【タブ】内容」や「(set,変数名,内容)」で変数を操作する場合、中断からの復帰やセーブデータからの再開時、再度同じ動作が行われることを念頭に置いてください。


ゲーム内変数には、セーブデータのロードで書き換わるものと、ロードで書き換わらないもの(グローバル変数)との2種類があります。


グローバル変数は、他のシナリオからも読み込むことができます。
他のシナリオのゲーム内変数を書き換えるLNP独自タグの実装予定はありません。

ロードおよび中断から再開時

LNP独自タグ「next」「next_set」「nextjump」「選択肢」でジャンプした先の関数が、中断からの復帰やセーブデータからの再開のチェックポイントとして扱われます。


セーブデータからの再開時、グローバル変数以外のゲーム内変数は、すべてロードしたセーブデータのものと置き換えられます。


中断から復帰した時(最小化からの復帰やメニューから戻った時など)、チェックポイントとなった関数の終了まで、以下の変更が加えられます。

  • 「\w1」~「\w9」のウェイトは削除
  • 文字表示スピードは一括
  • 効果音・ボイスが再生されない

セーブデータからの再開はこの対象になりません。


SSPの本体設定で「最小化時に喋らない」が有効になっていると、「メニュー.最小化」を経由しない最小化時(*1)に音が一時停止されません。
対応不可能なため、仕様とします。
*1: ショートカットキー操作・タスクトレイアイコンのダブルクリック、など

設定辞書

「ghost/master/dic_settings_default.txt」にある内容は、シナリオ側に同じ設定があれば、シナリオ側のものが優先されます。

変更したい設定のみ、単語群名の冒頭の「__default」の部分を【シナリオフォルダ名】と差し替え、「ghost/master/scenarios/【フォルダ名】/dic【辞書名】.txt」に記述してください。

メニューなどのUI

レイアウトの調整をしたい場合、設定辞書の項目を変更すると、LNP基本辞書で用意しているメニュー類のレイアウトが変更されます。


以下の関数がある場合、その関数へジャンプし、LNP基本辞書の処理は行われません。
これにより、高度なレイアウト変更・処理の追加等が可能です。

(フォルダ名).ギャラリー
*(フォルダ名).コンフィグ
*(フォルダ名).セーブ
*(フォルダ名).タイトルに戻る
*(フォルダ名).バックログ
*(フォルダ名).ロード
*(フォルダ名).不許可
*(フォルダ名).終了ダイアログ

【フォルダ名】.不許可」は、タグ「メニュー不可」などでメニュー表示を拒否している時に操作されると発生します。
(__MenuCurrent)に何が不許可だったかが入っています。

◆入っている可能性のある内容のリスト

  • オート
  • ギャラリー
  • クイックセーブ
  • クイックロード
  • コンフィグ
  • スキップ
  • セーブ
  • タイトルに戻る
  • ハイド
  • バックログ
  • ロード

各種メニューが開けるかどうかの状態を個別に変えたい場合は、以下の変数の中身を直接書き換えてください。
変数の中身が「1」ならば、許可していることになります。
終了ダイアログを禁止する変数は、LNP基本辞書では用意していません。

  • メニュー状態.オート
  • メニュー状態.ギャラリー
  • メニュー状態.クイックセーブ
  • メニュー状態.クイックロード
  • メニュー状態.コンフィグ
  • メニュー状態.スキップ
  • メニュー状態.セーブ
  • メニュー状態.タイトルに戻る
  • メニュー状態.ハイド
  • メニュー状態.バックログ
  • メニュー状態.ロード

また、タグ「メニューボタン」は前述の変数と連動します。

コンフィグの設定変更

LNP基本UIを使う場合、以下の設定が変更できます。

ウェイト
辞書内の「\w1」~「\w9」をLNP基本辞書が設定に応じて置き換えます。
文字の速さ
文字表示にかかるスピードを変更します。
音声
音楽・効果音・ボイスの音量を設定します。
外部プラグイン読み上げ対応の設定(*1)も切り替えられます。
スキップ・オート
スキップ・オート機能関連の設定を変更します。
既読
既読の文章・選択肢の表示などを変更します。

これらはSSPの本体設定に影響を及ぼしません。
LNP内各シナリオで共通して使われます。

*1 : 「する」では画面がチラつきやすくなり、動作が不安定になります。

ユーザに文字入力させる

\![open,inputbox,ID,--reference=【ジャンプ先シナリオ名】,...]

Onで始まらないIDを振ると、入力された文字に対して「OnUserInput」で区切り字消し加工をします。
さくらスクリプトのエスケープはしないので、読み上げる時は「\_?」で前後を囲むなどしてください。


イベント「OnUserInput」「OnUserInputCancel」の処理は、変数「ユーザ入力受付中」のみ動作します。


Onで始まるIDを振るとLNP基本辞書での加工はされません。
入力決定後にイベント「On【振ったID】」が発生します。
入力ボックスを閉じるか時間切れでイベント「On【振ったID】Cancel」が発生します。
この場合、変数「ユーザ入力受付中」の状態は関係しません。

キーボード入力への反応

「*【フォルダ名】.?が押された」が存在すると、そのキーが押された時に該当する関数へジャンプします。
アルファベットのAキーが押された場合、小文字の「*【フォルダ名】.aが押された」が呼ばれます。


「KeyPressCommand_AcceptingInputs」変数が1のときにキー入力があると、「@【フォルダ名】.KeyPressCommand」の中身に応じてコマンドを照合します。
この変数が1である間は、「*【フォルダ名】.?が押された」へのジャンプ動作は行われません。
コマンドが合致するか、ゴーストの起動・終了でこれらの変数は初期化されます。 半角カンマ区切りで左から照合し、合致したら「*【フォルダ名】.【シナリオ名】」へジャンプします。

【フォルダ名】.KeyPressCommand_List
command1,シナリオ名1,command2,シナリオ名2

ジャンプ直後の関数はセーブデータのチェックポイントにならないため、以下の様にラベル通過を適宜行ってください。

【フォルダ名】.【シナリオ名】

$__tmp	(call,ラベル通過,【シナリオ名】)
#オートセーブを許可する場合こちら

$__tmp	(call,ラベル通過,【シナリオ名】,オートセーブ不可)
#オートセーブを許可しない場合こちら

マウス入力への反応

以下の変数の中身が1の時のみ、それぞれのマウス入力へ反応するための関数へ飛ぼうとします。
変数はゲーム起動時、0に戻ります。

変数「マウス受付_クリック」
【フォルダ名】.(当たり判定名)左クリック
【フォルダ名】.(当たり判定名)右クリック
変数「マウス受付_つつかれ」
【フォルダ名】.(当たり判定名)つつかれ
変数「マウス受付_なでられ」
【フォルダ名】.(当たり判定名)なでられ
変数「マウス受付_ころころ」
【フォルダ名】.(当たり判定名)ころころ上
【フォルダ名】.(当たり判定名)ころころ下
【フォルダ名】.(当たり判定名)ころころ

当たり判定のない箇所で操作があった時は、(当たり判定名)の箇所のない関数に飛ぼうとします。

変数「マウス受付_クリック」
【フォルダ名】.左クリック
【フォルダ名】.右クリック
変数「マウス受付_つつかれ」
【フォルダ名】.つつかれ
変数「マウス受付_なでられ」
【フォルダ名】.なでられ
変数「マウス受付_ころころ」
【フォルダ名】.ころころ上
【フォルダ名】.ころころ下
【フォルダ名】.ころころ

バックログ

「バックログ状態」という変数の中身が1である時にチェックポイント(*1)を通過すると、通過したシナリオ名が「バックログ格納」という変数へ記録されます。

バックログを開くと、「バックログ格納」に記録された内容と設定辞書の記述に応じて、「【フォルダ名】.【シナリオ名】【バックログ接尾辞】」が参照されます。

同じシナリオ名が連続してバックログに入ることはありません。

セーブデータからのロード時には水平線が挿入されます。

*1: nextnextsetnextjump選択肢のタグ実行直後に移動した関数の冒頭