吉里吉里にて複数のシナリオを任意のタイミングで切り替えながら進める形式を実現するための簡易プラグインです。
- 動作としてはシナリオの現在状態が保存されている
kag.pcflags
をザッピングパート毎に切り替えるイメージです- テキスト履歴(
HistoryLayer
)のログ内容も切り替わるため,パート別に内容が保持されることに注意してください
- テキスト履歴(
f.〇〇
のシナリオローカルフラグはザッピング前後で維持されます- それぞれのザッピングパートで独立したフラグ管理をしたい場合は,フラグ名の重複を避けてください
- どうしても重複が避けられない場合は
[zapping_option indepflags=~]
を指定してください- 外部のプラグインなどで,現在の状態を
f.〇〇
に保存する実装になっている時などが該当します
- 外部のプラグインなどで,現在の状態を
- 2つ以上のパートのザッピングが可能な実装になっています(実装例では2つのパートの切り替え)
- 各パート相互に状態が影響するシナリオ構成の場合,ザッピング切り替え直後に状態の齟齬が発生する場合があります
- 例:片方のパートでブレーカーを落とす⇒ザッピング切り替え⇒電気が消えていないといけないのにザップ前の状態を保持しているので電気がついたまま,といったようなケース
- 状態の再反映に関しては本プラグインの領分ではないので各々で工夫してください
- テキストメッセージを送るごとに毎回フラグをチェックして変更があれば内容を反映,といった泥臭い方法が一番手っ取り早いと思われます
- 動作チェックが甘いので何かしらの不備があるかもしれません
- ザッピングシナリオ中のcallスタックの扱いなどに不安があります
起動直後のシナリオなどで zapping.ks
を call してください。
各種オプションを定義する [zapping_option]
と,実際にザッピングを実行する [zapping_jump]
マクロが定義されます。
各マクロの詳細はリファレンスを参照してください。
first.ks
等の初期化シナリオ中にプラグインをロードしてください:
; プラグインをロード
[call storage=zapping.ks]
タイトル画面等からゲーム開始直後のシナリオファイルで下記を記述します:
; 全初期化
[zapping_option init]
; パート名と初回起動シナリオを定義
[zapping_option scenario="a" storage="zaproot.ks" target=*first_a]
[zapping_option scenario="b" storage="zaproot.ks" target=*first_b]
; 独立したフラグが必要であればここに記述(zaproot.ks *init_flagsで初期化が必要なことに注意)
[zapping_option indepflags="flag_x:flag_y"]
; ザッピング切り替えUI用定義例
[sysbutton name=zap graphic=zapbutton ... exp='_button_zapping_call(true,"zaproot.ks","*zapbutton")']
; 初回パートにジャンプ
[zapping_jump jump="a"]
ザッピング管理シナリオ(上記の例では zaproot.ks
)にフラグ初期化とジャンプ処理を記述します:
; ザッピング切り替え処理(extra conductor経由)
*zapbutton
; ~必要に応じてここに場面切り替えの演出を追加~
; シナリオパート切り替え
[zapping_jump swap="a:b"]
[return]
; 各パートの初期化と分岐(※ジャンプ先シナリオを必要に応じて調整)
*first_a|
[call target=*init_flags]
[jump storage="Aパート本編.ks" target=*label]
*first_b|
[call target=*init_flags]
[jump storage="Bパート本編.ks" target=*label]
; 共通の初期化処理
*init_flags
; 独立したフラグを指定した場合([zapping_option indepflags=~]),ここで必ず初期化すること
[eval exp="f.flag_x=void"]
[eval exp="f.flag_y=void"]
[return]
[zapping_option init]
初回シナリオテーブルや,現在のザッピング保存状態など,すべて初期化します。 タイトルからスタートした直後などに実行し,そのあとで初回シナリオテーブルを記述すると良いでしょう。
[zapping_option debug=true]
[zapping_option debug=false]
デバッグログ表示を有効にします。debug=true
でログ有り,debug=false
でログ無し(デフォルト)の動作です。
吉里吉里のコンソールログにザッピング動作のタイミングで「@zapping_debug xxx=...
」のようなログが表示されます。
なお,デバッグ状態はセーブデータへは保存されず,[zapping_option init]
の初期化の対象外です。ゲーム起動毎に設定する必要があります。
[zapping_option scenario="scn1" storage="..." target="..."]
scenario=
でパート名(管理しやすい名前を任意に指定/半角大文字小文字は区別されません)を指定し,storage
, target
でジャンプ先を指定します。
storage
および target
を指定しない場合は現在定義されているパートに関しての初回シナリオの情報をクリアします。
もしくは,
[zapping_option resetallscn]
にて,今まで定義したパートに関する初回シナリオの情報をすべてクリアします。
[zapping_option clearstate="scn1:scn2:..."]
過去に切り替えた指定パートのザッピングの状態情報を消去します。:
で区切って複数のパートを一括で消去することができます。
状態情報を消去することでセーブデータのサイズが小さくなるといった利点があります。 これ以降ザッピング機能を利用しないといった場合に使うと良いかもしれません。
[zapping_option init]
を実行してもセーブデータは小さくなります。
[zapping_option indepflags="flag1:flag2:...:flagN"]
各パートで f.〇〇
系のフラグ管理を独立させたい場合に,そのフラグ名を :
で区切って列挙します。
ザッピング時の状態保存データに列挙されたフラグの内容も一緒に保存し,戻す時にフラグを書き戻すという動作になります。
この実装の都合上,初回シナリオジャンプ時は上記でフラグを維持したまま開始されてしまうため, 本ドキュメント冒頭の実装例においては
zaproot.ks
の*init_flags
にてフラグを初期化するという処理を入れてあることに注意してください。
[zapping_option current="scn1"]
ジャンプ処理を実行せずに,強制的に指定のパート内にいるものとして状態を設定します。
基本的には [zapping_jump]
を使うため,この機能を使うことはないと思います。
[zapping_jump jump="scn1"]
指定したパートにザッピングします。extra conductor経由でも通常のシナリオスクリプトからでも使用可能です。
extra conductor内で呼び出された場合は return で本編に戻る瞬間にザッピングする動作になります。
なお,現在のパートがジャンプ指定と同じパートだった場合は何も起こりません。
[zapping_jump swap="scn1:scn2"]
現在プレイ中のパートの次のパートにザッピングします。
swap=
に:
で区切って複数のパートを列挙します- 現在のパートが列挙されたパートのいずれにも含まれない場合は先頭に列挙されたパートにジャンプします
- 現在のパートが末尾に列挙されたパートだった場合も先頭のパートにジャンプします
2つのパートしか列挙しない場合は交互に切り替わる動作となります
/**
* ザッピングボタンが押された時に利用するKAGシナリオコール関数
* @param use_extra : kag.callExtraConductor経由で呼び出す
* @param storage : コールするシナリオファイル
* @param target : コールするラベル
*/
function _button_zapping_call(use_extra, storage, target);
[link_or_uibutton_definition exp=_buton_zapping_call(~)]
のように使うことを想定しています。
/**
* ザッピングボタンが押された時に直接ザッピングを実行する
* @param elm : %[jump:"~"] もしくは %[swap:"~"] を指定。詳細は [zapping_jump] のオプションを参照のこと
*/
function _button_zapping_direct(elm);
exp式で直接ザッピングしたいケースで利用してください。
上記2関数とも,必要に応じて zapping.ks の上記関数のデフォルト引数を調整してください。
- 現在のパート名を調べたい場合は,TJS式にて
kag.zappingScenarioPlugin.getCurrent()
を実行してください
吉里吉里Zのライセンスに準拠してください。