見出し画像

【ティラノスクリプト】オリジナルタグを作ろう

ティラノスクリプトで1からオリジナルタグ(独自タグ)を作成する方法について解説します。


JSファイルの作成と読み込み

[プロジェクトフォルダー]/data/others/
に「original.js」を作成します。

original.jsに下記のコードを記述します。

※このJSファイルの文字コードを「UTF-8」にして保存してください。
余計なトラブルが防げます。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        start: function() {
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

first.ksに下記のスクリプトを記述します。

[loadjs storage="original.js"]
[original]
おしまい
[s]

これで準備は完了です。
この状態でティラノスタジオからプロジェクトを起動すると、「おしまい」の文字が表示されるだけで終わるはずです。

original.jsの解説

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        start: function() {
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

2行目の
TYRANO.kag.ftag.master_tag.original = {
太字の部分がタグ名になります。

例えば
TYRANO.kag.ftag.master_tag.オリジナル = {
のように変更すると[オリジナル]といったタグが使用できます。

start: function()内で、そのタグで行う処理を記述します。
今回はまだ何も処理していません。

this.kag.ftag.nextOrder();
は次のタグへ移動する関数です。以後nextOrderと呼びます。nextOrderがないと次のタグへ進みません。

例外として、nextOrderを呼び出さずにjumpタグを処理中に呼び出すことで処理を終えることも可能です。
また応用として、他の既存タグなどを処理中に呼び出し、呼び出し先の処理でnextOrderをすることも可能です。
よくあるミスとしては既存タグを複数呼び出し、1つのタグ内でnextOrderが複数呼び出されバグを発生させるというケースです。
1つのタグ内でnextOrderを複数呼び出させないように注意しましょう。

kag: TYRANO.kag
はティラノスクリプトのDNAみたいなものです。
これを記述しないと動かないので変更しないでください。

とりあえずこの時点では何もしないで次のタグへ進むタグとなっていますので、このoriginalタグに適当な処理を追加していきます。

コンソールに変数を出力する処理の追加

手始めにfやsfなどの変数をコンソールに出力する処理を追加していきましょう。予めConfig.tjsのdebugMenu.visibleをfalseに設定しておくと見やすくなります。
また、コンソールを確認するための開発者ツールの表示を有効にしていない場合は「デバッグを表示する」を有効にしましょう。

それでは処理を追加してきます。
まずはtf、f、sfすべての変数をそれぞれ出力してみましょう。
コンソールへの出力にはconsole.logという関数を使用します。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        start: function() {
            console.log(sf);
            console.log(tf);
            console.log(f);
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

実行結果はこんな感じになります。

見事にエラーになりました。
「tfなんて変数はねーぞ」って言われていますね。

オリジナルでタグを作成する際に、基本はiscript内と同じjavascriptでの記述が可能ですが、ティラノスクリプトで使用されているfなどの変数は、実際は下記の場所に保存されています。

this.kag.variable.sf
this.kag.variable.tf
this.kag.stat.f

iscript内ではこれらの変数をsfやtfとして使用できるように予め宣言されています。
それではiscript内と同じように扱えるように記述を追記しましょう。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        start: function() {
            const sf = this.kag.variable.sf;
            const tf = this.kag.variable.tf;
            const f  = this.kag.stat.f;

            console.log(sf);
            console.log(tf);
            console.log(f);
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

これでエラーがなく、コードが実行されるようになりました。

※オリジナルタグ内でsf変数を変更した場合は、
this.kag.saveSystemVariable();
を使用する必要があります。

this.kag.variable.sf.test = 1;
this.kag.saveSystemVariable();
this.kag.ftag.nextOrder();

iscriptやevalの場合、saveSystemVariableが自動的に実行されますが、オリジナルタグの場合はこのような記述が必要となります。
この記述がない場合、次のsaveSystemVariableが何らかのタグで実行されるまでの間にゲームを終了した場合、sf変数はローカルファイルに保存されていない状態となります。

パラメーターの渡し方

次にパラメーターの渡し方を説明します。
パラメーターとは例えば[wait time=1000]のtimeの部分のことです。

originalタグにパラメーターを受け渡す為の記述を追記します。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        pm: {
            type: "",
        },
        start: function(pm) {
            const sf = this.kag.variable.sf
            const tf = this.kag.variable.tf
            const f  = this.kag.stat.f

            console.log(sf);
            console.log(tf);
            console.log(f);
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

変更点は3~6行目です。

        pm: {
            type: "",
        },
        start: function(pm) {

pmの中にはパラメーターの初期値を設定可能です。複数設定した場合は下記のように記述します。

        pm: {
            type: "",
            name: "",
        },

start: function(pm) {
でpmオブジェクトを受け取ります。

この記述で、typeパラメーターになにも設定しなかった場合は空の文字列がpm.typeに入った状態で処理がスタートします。

ちなみにpm内に記述のないパラメーターが使用できないわけではありません。
例えば[original storage="test.txt"]という記述をした場合、pm.storageには"test.txt"が入った状態となります。

また、注意点としてpmに渡ってくる変数は全て文字列として扱われる点を留意しましょう。
例えば[original time=3000 wait=true]と記述した場合、pm.timeには文字列の"3000"が、pm.waitには文字列の"true"が受け渡されます。それぞれ数値や真偽値ではない為、注意してください。

それではこれを踏まえて、typeに渡したパラメーターによって、コンソールに表示する変数を分岐させる処理を追加していきましょう。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        pm: {
            type: "",
        },
        start: function(pm) {
            const sf = this.kag.variable.sf;
            const tf = this.kag.variable.tf;
            const f  = this.kag.stat.f;

            if (pm.type == "") {
                //typeパラメーターに指定がない場合は全表示
                console.log(sf);
                console.log(tf);
                console.log(f);
            } else {
                if (pm.type == "sf") console.log(sf);
                if (pm.type == "tf") console.log(tf);
                if (pm.type == "f" ) console.log(f);
            }
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };
})();

この状態で[original type="sf"]を実行すると、sf変数のみがコンソールに出力されます。

wait_timerタグを作成してみる

最後に、実用的なwait_timerタグを作成していきます。
このタグは、任意の場所からタイマーを開始し、指定した時間になるまで待機するといった機能を持たせます。

この機能は例えば、BGMに合わせて演出を切り替えたい場合などに活躍します。
通常のwaitタグなどを使用しても可能そうに感じますが、実際はPCスペックなどの問題で同期がとれない(スペックの高いPCでは思ったよりも速く処理が終わり、低いPCだと逆に処理に時間がかかる)といった事態がよく起こりますが、このタグを使用することである程度緩和できます。

(function(){
    TYRANO.kag.ftag.master_tag.original = {
        pm: {
            type: "",
        },
        start: function(pm) {
            const sf = this.kag.variable.sf
            const tf = this.kag.variable.tf
            const f  = this.kag.stat.f

            if (pm.type == "") {
                //typeパラメーターに指定がない場合は全表示
                console.log(sf);
                console.log(tf);
                console.log(f);
            } else {
                if (pm.type == "sf") console.log(sf);
                if (pm.type == "tf") console.log(tf);
                if (pm.type == "f" ) console.log(f);
            }
            this.kag.ftag.nextOrder();
        },
        
        kag: TYRANO.kag
    };

    TYRANO.kag.ftag.master_tag.wait_timer = {
        pm: {
            time: "",
        },
        start: function(pm) {

            //このタグを実行した時点の時間を取得
            const now = performance.now();

            if (pm.time == ""){
                //timeが空の時はtimerのスタート時間をテンポラリーに格納
                this.kag.tmp.startTime = now;
                this.kag.ftag.nextOrder();
                return
            }
            
            //pm.timeの型を数値に変更
            const time = Number(pm.time);

            //スタート時間からtimeで渡した時間がエンド時間
            const endTime = this.kag.tmp.startTime + time;
            
            //エンド時間から現在の時間を引いた数値が実際に待機する時間
            const waitTime = endTime - now;

            if (waitTime <= 0) {
                //既に経過している場合
                this.kag.ftag.nextOrder();
            } else {
                //指定された時間を待機してからnextOrder
                setTimeout(() => {
                    this.kag.ftag.nextOrder();
                }, waitTime);

            }
        },
        
        kag: TYRANO.kag
    };

})();

first.ksは以下のように記述します。

[loadjs storage="original.js"]

;タイマースタート
[wait_timer]

[wait_timer time=1000]

1秒経ったよ[r]

[wait_timer time=5000]

5秒経ったよ[r]

[wait_timer time=10000]

10秒経ったよ[r]

おしまい
[s]

TYRANO.kag.ftag.master_tag.wait_timer
を追加していきます。
どんな処理をしているかは注釈の通りですが、pmの型変換やthis.kag.tmpをテンポラリーとして使えるという点がポイントとなります。

こんな感じで、慣れると自分にとって便利なタグが簡単に作成できるようになります。
もし同じようなiscriptの記述が複数に点在しているプロジェクトがあった場合、それをオリジナルタグにまとめるとシナリオファイル内がスッキリするのでお勧めです。

今回作成したプロジェクトファイルを置いておきます。
自由に使ってください。


ゲームを楽しんで貰えたり、記事やプラグインがお役に立てましたらサポート(投げ銭)を頂けると幸いです!