前回のブログで Wavebox 押してくださった方ありがとうございました!
引き続き創作本編をティラノスクリプト(Ver521f)で作っています。
エンディングリストを回想モードで作ろうとしたら「デフォルトの状態で動かない」というまさかの事態に直面したため、動くようにします。
そもそも回想モードに回想を表示するには
例によってティラノスクリプトのサンプルプロジェクトには回想モードがあるのに回想モードを開放するタグが使用されてなくて不親切なんですけど、シナリオ内で
[setreplay name="replay1" storage="scene1.ks" target="*start" ]
というように [setreplay]
を使うと回想モードで回想に入ることができるようになります。
回想モードでは setreplay
タグの storage
と target
を参照して @jump
でシナリオにジャンプします。
ジャンプ先のシナリオでは [endreplay]
に到達すると回想モードを終了します。
そのためエンディングリストのような場合にはたぶんこんな感じになるでしょう。
; data/scenario/ending1.ks
*ending1
; ここにエンディング部分のシナリオ
[endreplay]
; エンディングをすべて閲覧し終わったところで回想モードを開放
[setreplay name="ending1" storage="ending1.ks" target="*ending1" ]
動かない
で、ソースコードを見ても想定挙動は上記のはずなんですけど……Ver521f のサンプルプロジェクトで動かないんですよ、これが……。
回想モードの開放はできるんですけど、回想するボタンを押してもシナリオにジャンプしないのです。
私の環境依存の問題かもしれない。わからない。
色々調べてみたのですけど、data/scenario/replay.ks の
@jump storage=&tf.selected_replay_obj.storage target=&tf.selected_replay_obj.target
ここでジャンプ先が見つからないようなのです。
正確に言うと tf.selected_replay_obj
の中身が undefined
になっています。
tf.selected_replay_obj
はどこで値を入れているかというと、[replay_image_button]
をクリックしたとき。
つまり data/scenario/tyrano.ks の「;CGモードのボタンを表示するためのマクロ」の中の「;渡された値を元に、CG状態を確認していく」の中。
[button graphic=&mp.graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height preexp="sf.replay_view[mp.name]" exp="tf.selected_replay_obj = preexp" storage="replay.ks" target="*clickcg" folder="bgimage" ]
ここです。
preexp
は、タグが実行された時点で、この属性に指定した値が変数に格納されます。
exp
はボタンがクリックされた時に実行される処理です。
だからここで想定されている挙動というのは、タグが実行された時点で preexp
に回想ジャンプ先の storage
target
の情報を格納し、ボタンをクリックしたときに tf.selected_replay_obj
にその情報を移す、であるはずです。
ちなみにCGモードのボタンも非常によく似ていて、そっちは下記のようになっています。
[button graphic=&mp.tmp_graphic[0] x=&mp.x y=&mp.y width=&mp.width height=&mp.height preexp="mp.graphic" exp="tf.selected_cg_image = preexp" storage="cg.ks" target="*clickcg" folder="bgimage" ]
CGモードが動いているため、exp
で preexp
の値を tf.なんとか
という変数に入れるというのは問題ありません。
また preexp
で mp.なんとか
を単独で参照することも問題ありません。
結論、preexp
で sf.replay_view[mp.なんとか]
を参照するのがダメらしいです。たぶん preexp
が undefined
になってしまう。
どうしてダメなんでしょうね……?
動かす
とにかく動かないので何とかします。
data/scenario/tyrano.ks の「;CGモードのボタンを表示するためのマクロ」の中の「;渡された値を元に、CG状態を確認していく」の中を下記のようにします。
[button graphic=&mp.graphic x=&mp.x y=&mp.y width=&mp.width height=&mp.height preexp="mp.name" exp="tf.selected_replay_name = preexp" storage="replay.ks" target="*clickcg" folder="bgimage" ]
呼び出し元の data/scenario/replay.ks の *clickcg
のほうでは、回想シナリオへのジャンプを下記のように書き換えます。
@jump storage=&sf.replay_view[tf.selected_replay_name].storage target=&sf.replay_view[tf.selected_replay_name].target
つまり preexp
は単純に回想先の識別名にしてしまい、exp
では tf.selected_replay_name
に preexp
を格納します。
ボタンクリック後、回想先の識別名から回想ジャンプ先の storage
target
の情報を取得してジャンプします。
これがうまい方法かは不明ですが、とりあえずこれで動きました。
どこかの時点で壊れちゃったのか、Ver521f の一時的なバグなのか謎です……。
終わり