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: next・nextset・nextjump・選択肢のタグ実行直後に移動した関数の冒頭
「\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」に記述してください。
コンフィグの設定変更
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から始まる連番】」が参照されます。
@【フォルダ名】.【ギャラリーリスト名】【1から始まる連番】
見出し用画像|個別表示画像ファイルパス|解禁判定変数名(グローバル変数)
例1:差分無しの場合
見出し用画像は画像パスまたは\_b["画像パス",inline,--option=background,...]で指定してください。
@【フォルダ名】.【ギャラリーリスト名】【1から始まる連番】
見出し用画像|個別表示画像ファイルパス1|解禁判定変数名(グローバル変数)|個別表示画像ファイルパス2|解禁判定変数名(グローバル変数)|...
例2:差分有りの場合
@【フォルダ名】.【ギャラリーリスト名】【1から始まる連番】
見出し用画像|個別表示画像ファイルパス:x座標(半角数字):y座標(半角数字)|解禁判定変数名(グローバル変数)|...
例3:画面いっぱいよりも小さい画像を表示するときの座標を指定できます。
座標指定が無ければテキスト描画開始位置左上(0,0)に配置されます。