見出し画像

ティラノスクリプトで、変数のスコープを同一シナリオ内に抑える

ティラノスクリプトでゲームを制作していて、このような悩みを持ったことはありませんか?

  • [iscript]内で定義した変数を同一シナリオファイル内でのみ使いまわしたい。

  • [iscript]間で変数を共有するために、tfを使うと、他のファイルにも影響が出る。

そこで今回は、同一シナリオファイル内でのみ使用可能な変数を定義し、jumpで削除しようと思います。

結論

結論から言うと、次のJSファイルを読み込みます。

TYRANO.kag.ftag.master_tag.ksp = {
    start: function () {
        this.kag.stat.is_script = true
        this.kag.stat.buff_script = ""
        if (!this.kag.variable.tf.def) {
            this.kag.variable.tf.def = {}
        }
        this.kag.ftag.startTag("text", {
            val: "const def = tyrano.plugin.kag.variable.tf.def"
        })
    }
}
TYRANO.kag.ftag.master_tag.ksp.kag = TYRANO.kag

TYRANO.kag.ftag.master_tag.endksp = {
    pm: {stop: "false"}, start: function (pm) {
        this.kag.stat.is_script = false;
        this.kag.evalScript(this.kag.stat.buff_script);
        this.kag.stat.buff_script = "";
        "false" === pm.stop && this.kag.ftag.nextOrder()
    }
}
TYRANO.kag.ftag.master_tag.endksp.kag = TYRANO.kag

tyrano.plugin.kag.tag.jump.start = function (pm) {
    const self = this;
    setTimeout((function () {
        if (pm.storage && self.kag.variable.tf.def) {
            self.kag.variable.tf.def = null
        }
        self.kag.ftag.nextOrderWithLabel(pm.target, pm.storage)
    }), 1)
}

2023年5月23日追記
さくま様より、ご指摘いただきました。ありがとうございます。

textタグ内でもnextOrderはしているはずなので、kspタグの最後のnextOrderは不要かもしれません

ご指摘の通り、nextOrderは不要です。私だけでは中々気付けなかったので、とても嬉しいコメントでした。改めて、ありがとうございます。


使い方

使い方は、[ksp]と[endksp]の間に、JavaScriptのコードを書くだけです。

変数は、defに格納されているため、このようなコードを書けるようになります。

[ksp]
def.hoge = 'foo'
[endksp]

// 何らかのKAGコード

[ksp]
console.log(def.hoge)
[endksp]

[jump storage="foo.ks"]

defは、storageを指定したjumpタグに到達すると削除されます。

仕組み

ほとんどの方は知らなくても問題ありませんが、私のようなプログラマ寄りの方のために、内部の処理を少し解説します。

まず、iscript, endscriptとほぼ同じ処理を行うタグksp, endkspを作成します。

ほぼ同じと言っても、kspの中では、tf.defが存在するかチェックし、存在しなければtf.defを定義します。その後、tf.defdefに代入するコードを実行します。

TYRANO.kag.ftag.master_tag.ksp = {
    start: function () {
        this.kag.stat.is_script = true
        this.kag.stat.buff_script = ""
        if (!this.kag.variable.tf.def) {
            this.kag.variable.tf.def = {}
        }
        this.kag.ftag.startTag("text", {
            val: "const def = tyrano.plugin.kag.variable.tf.def"
        })
    }
}

endkspは、endscriptとタグの定義は同じです。kspタグに対応する終了タグとして定義しただけになります。

最後に、jumpの処理を書き換えます。
ここでは、storageが指定されていれば、tf.defをnullで初期化するようにしています。

※ storageが指定されている = 他のシナリオファイルに移動する と解釈

tyrano.plugin.kag.tag.jump.start = function (pm) {
    const self = this;
    setTimeout((function () {
        if (pm.storage && self.kag.variable.tf.def) {
            self.kag.variable.tf.def = null
        }
        self.kag.ftag.nextOrderWithLabel(pm.target, pm.storage)
    }), 1)
}


得意言語は、JS, PHP, Java, Kotlinです。ここら辺の言語を勉強中の方は、ぜひフォローをお願いします。

この記事が気に入ったらサポートをしてみませんか?