ティラノスクリプトのバックログ改造と、現在スキップ中かどうかを判定するマクロ

最近 Wavebox 押してくださった方ありがとうございます!

本日もティラノスクリプトの小ネタです。

バックログ改造

早速ですが、デフォルトのバックログはこんな感じです。

キャラ名がある場合は「キャラ名:表示文」、キャラ名が無い場合は表示文がそのまま出ます。

個人的にキャラ名の文字数によって表示文の表示位置が変わるのがちょっと見づらいかなーと思うので、改造するプラグインを作ります。

 

表示したテキストがバックログに自動で挿入されるので、おそらくテキスト表示処理からバックログへのテキスト挿入処理が呼ばれていると当たりをつけます。

テキスト表示処理ってどこにあるの? というのは結論だけ

【ティラノスクリプト】テキスト表示ごとに既読にするプラグイン

で書いたので調査過程は省きます。
tyrano/plugins/kag/kag.tag.js 内の showMessage という関数です。

その関数の中身を覗くとすぐ this.pushTextToBackLog(chara_name,message_str) という記述を見つけることができます。
これがバックログへのテキスト挿入処理なので、同ファイル内の pushTextToBackLog の処理を上書きするプラグインを書きます。

https://tyrano.jp/usage/advance/plugin

に書いてある通り、data/others/plugin ディレクトリに今回作りたいプラグインの名称のディレクトリを作り、その中に

  • init.ks
  • main.js
  • main.css

を新規作成します。
※init.ks はこの通りの名前でないとダメですが、他は名前はなんでもいいです。

今回は適当に backlog というプラグインにします。

data/others/plugin/backlog/init.ks に下記のように書きます。

[loadjs storage="plugin/backlog/main.js"]
[loadcss file="./data/others/plugin/backlog/main.css" ]
[return]

JavaScript の処理は data/others/plugin/backlog/main.js に書きます。

【ティラノスクリプト】改ページクリック待ちごとに既読にするプラグインの作り方

では試行錯誤の過程まで書いてますが、今回は結論を流用します。
TYRANO.kag.ftag.master_tag.text を書き換えればOKです。

今回はバックログにテキストを挿入する処理全体を書き換える必要があるので、まず元の関数の中身を全部コピペし、変えたい部分だけ変えましょう。

(function ($) {
    (function () {
        // デフォルトの [text] を変数に保存する
        const _text = TYRANO.kag.ftag.master_tag.text;
        // デフォルトの [text] の pushTextToBackLog を独自の関数で上書きする
        // pushTextToBackLog 以外の定義は引き継ぐ
        TYRANO.kag.ftag.master_tag.text = $.extend(true, {}, _text, {
            pushTextToBackLog: function (chara_name, message_str) {
                var should_join_log = "true" == this.kag.stat.log_join;
                if ("" != chara_name && !should_join_log || "" != chara_name && "true" == this.kag.stat.f_chara_ptext) {
                    // ここを変えた
                    const log_str = `<div class="backlog_listitem"><span class="backlog_chara_name ${chara_name}">${chara_name}</span><span class="backlog_text ${chara_name}">${message_str}</span></div>`;
                    this.kag.pushBackLog(log_str, "add");
                    if ("true" == this.kag.stat.f_chara_ptext) {
                        this.kag.stat.f_chara_ptext = "false";
                        this.kag.stat.log_join = "true"
                    }
                } else {
                    // ここを変えた
                    const log_str = `<div class="backlog_listitem"><span class="backlog_chara_name"></span><span class="backlog_text ${chara_name}">${message_str}</span></div>`;
                    const join_type = should_join_log ? "join" : "add";
                    this.kag.pushBackLog(log_str, join_type)
                }
            },
        });
    })();
})(jQuery);

今回はキャラ名と表示文を flexbox を使って横並びに表示したいと思います。
キャラ名が無いときもキャラ名の部分の余白は空けたいです。
あと <b> とかいう今や使用されないタグが使われているのはやめて、CSS で太字を指定したいと思います。

そのため書き換えるのは2か所の log_str への代入箇所のみで、キャラ名があるときは

const log_str = `<div class="backlog_listitem"><span class="backlog_chara_name ${chara_name}">${chara_name}</span><span class="backlog_text ${chara_name}">${message_str}</span></div>`;

キャラ名が無いときは

const log_str = `<div class="backlog_listitem"><span class="backlog_chara_name"></span><span class="backlog_text ${chara_name}">${message_str}</span></div>`;

としています。
<div> に指定しているクラス名は既存のクラス名と被らないクラス名にしたほうが無難です。

最後に CSS で整えましょう。

data/others/plugin/backlog/main.css を追加して下記のように記述します。

.backlog_listitem {
    display: inline-flex;
    width: 100%;
}
.backlog_chara_name {
    width: 10%;
    padding-right: 16px;
    flex-shrink: 0;
    font-weight: bold;
    text-align: right;
}

そして data/scenario/first.ks に

[plugin name="backlog"]

と書けば完了です。

これで起動すると完成形が得られます。

display: inline-flex を使っているのは、今回の処理とは別のところで行間に改行タグが入るからです。
行間が空きすぎないように flex ではなく inline-flex を使用しています。

これでプラグインの作成は完了ですが、以前作った「テキスト表示ごとに既読にするプラグイン」は今回のプラグインと同じ TYRANO.kag.ftag.master_tag.text に対する改造プラグインなので、下記のように一つのプラグインに纏めてしまうといいでしょう。

(function ($) {
  (function () {
    const _text = TYRANO.kag.ftag.master_tag.text;
    TYRANO.kag.ftag.master_tag.text = $.extend(true, {}, _text, {
      showMessage: function (...args) {
        // ここに既読処理プラグインの内容
      },
      pushTextToBackLog: function (chara_name, message_str) {
        // ここにバックログ改造プラグインの内容
    },
    });
  })();
})(jQuery);

纏めておくメリットとしては、特に Web 公開を念頭に置いた場合、ファイル数が少ないほうがファイル取得時のリクエストにかかる時間が減るので読み込み時間が短くなることが期待できます。
(一般に複数の js ファイルを 1 ファイルに纏める処理を行うことも多いが、たぶんティラノスクリプトはそういうことはしていない)

あと単純に同じオブジェクトを触る処理は一か所に書いておいたほうがいいでしょう。
うっかりオブジェクトを上書きしてしまう可能性もあるので。

現在スキップ中かどうかを判定するマクロ

ティラノスクリプトではスキップ中に一部のタグの演出をスキップしてくれるのですが、[wait][mask] はスキップしてくれません。

そのためスキップ中なら [wait] を飛ばしたり、[mask] の time を強制的に短くするようなマクロが欲しくなります。

そのためには現在スキップ中かどうかを判定する必要があります。

というわけで、現在スキップ中かどうかを tf.is_skip という一時変数に格納するマクロがこちらです。

[macro name=set_is_skip]
[iscript]
tf.is_skip = TG.stat.is_skip;
[endscript]
[endmacro]

ソースコードを読むと、現在スキップ中かどうかは this.kag.stat.is_skip という変数に入っていました。
更にティラノスクリプトに元々同梱されている公式マクロを読み解くと this.kag.stat[iscript] 内では TG.stat で参照できることがわかりました。

TG.stat.is_skip を直接 if 文などに使えれば早かったんですが、なんか無理っぽかったので、一時変数に格納しました。
(もしかしたら書き方が悪いだけかも)

上記のマクロの使い方ですが

[macro name=skip_wait]
[set_is_skip]
[if exp="tf.is_skip == false"]
[wait time="%time"]
[endif]
[endmacro]

というように、スキップ中でないときだけ [wait] を実行する [skip_wait] というマクロを作ることができます。
ゲーム内の [wait] を全部これに置換すればスキップ中は高速に動くようになって快適です。

おわり