ティラノスクリプトの回想モードを何とかする

前回のブログで Wavebox 押してくださった方ありがとうございました!

引き続き創作本編をティラノスクリプト(Ver521f)で作っています。

エンディングリストを回想モードで作ろうとしたら「デフォルトの状態で動かない」というまさかの事態に直面したため、動くようにします。

そもそも回想モードに回想を表示するには

例によってティラノスクリプトのサンプルプロジェクトには回想モードがあるのに回想モードを開放するタグが使用されてなくて不親切なんですけど、シナリオ内で

[setreplay name="replay1" storage="scene1.ks" target="*start" ]

というように [setreplay] を使うと回想モードで回想に入ることができるようになります。

回想モードでは setreplay タグの storagetarget を参照して @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モードが動いているため、exppreexp の値を tf.なんとか という変数に入れるというのは問題ありません。

また preexpmp.なんとか を単独で参照することも問題ありません。

結論、preexpsf.replay_view[mp.なんとか] を参照するのがダメらしいです。たぶん preexpundefined になってしまう。
どうしてダメなんでしょうね……?

動かす

とにかく動かないので何とかします。

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_namepreexp を格納します。
ボタンクリック後、回想先の識別名から回想ジャンプ先の storage target の情報を取得してジャンプします。

これがうまい方法かは不明ですが、とりあえずこれで動きました。


どこかの時点で壊れちゃったのか、Ver521f の一時的なバグなのか謎です……。

終わり