見出し画像

オートモードの挙動を改善する【ティラノスクリプト】

システムボタンなどから開始できるオートモード、ティラノデフォルトではこのような動きになっています。

1.オートモードボタンクリック
2.メッセージやボイスの進行状況にかかわらずオートモード開始

これが気に入らないので、↓のように改善します。

・メッセージ進行中にオートモード開始ボタンをクリックした場合、メッセージを最後まで一気に表示させずオートモード開始
・ボイス再生中にオートモード開始ボタンをクリックした場合、ボイスはそのまま再生を続けたままオートモード開始

コード全体

/**
* オートモードからの復帰判定
*/
let is_auto = false
$(document).off("mousedown")
$(document).on("mousedown", function(e) {
    const that = TYRANO.kag.key_mouse
    is_auto = TYRANO.kag.stat.is_auto
    that.clearSkip();          
    var target = null;
    //中央クリック
    if (e.which == 2) {
        target = that.map_mouse["center"];
    }else if(e.which == 3){
        //右クリック
        target = that.map_mouse["right"];
    }
    if(typeof target=="function"){
        target();
    }else{
        if(that[target]){
            that[target]();
        }
    }
});

/**
* オートモード対応
* レイヤークリック時の動作
*/
let layer_obj_click = $(".layer_event_click");
layer_obj_click.off("click")
layer_obj_click.click(function(e){
    if(that.kag.tmp.ready_audio==false){
        if($.isNeedClickAudio()){
            that.kag.readyAudio();
            that.kag.tmp.ready_audio = true;
            if(that.kag.stat.is_adding_text == true){
                that.kag.stat.is_click_text = true;
                return false;
            }
            that.kag.ftag.nextOrder();
            return false;
        }
    }
    if(that.is_swipe){
        that.is_swipe = false;
        return false;
    }
    if(that.kag.stat.is_hide_message == true){
        that.kag.layer.showMessageLayers();
        return false;
    }
    //テキスト再生中にクリックされた場合、文字列を進めて終了にする
    if(that.kag.stat.is_adding_text == true){
        that.kag.stat.is_click_text = true;
        return false;;
    }
    //テキストマッハ表示時もリターン。
    if(that.kag.stat.is_click_text == true){
        return false;
    }
    if(that.kag.stat.is_stop == true){
        return false;
    }
    //フキダシ表示の場合は一回非表示にする。
    if(that.kag.stat.fuki.active==true){
        that.kag.layer.hideMessageLayers();
    }
    //ここから変更
    if(!is_auto){
        //オートモードからの復帰じゃないとき(=非オートモード)はそのまま進める
        that.kag.ftag.nextOrder();
    }else if(!that.kag.stat.is_adding_text && !that.kag.tmp.is_vo_play){
        //オートモードからの復帰のときはテキスト&ボイス進行中じゃなければ進める
        that.kag.ftag.nextOrder();
    }
    //ここまで変更
})

//オートモード拡張
tyrano.plugin.kag.tag.autostart = {
    pm : {},
    start : function(pm) {
        if (this.kag.stat.is_auto == true) {
            return false;
        }
        this.kag.readyAudio();
        //[p][l] の処理に、オート判定が入ってます
        this.kag.stat.is_auto = true;
        //ここから変更
        if(this.kag.tmp.sleep_game === null){
            if(!this.kag.stat.is_adding_text && !this.kag.tmp.is_vo_play){
                this.kag.ftag.nextOrder();
            }else{
                //テキスト表示中orボイス再生中にオート開始したときは再度クリック待ちを挟んでおく
                this.kag.ftag.startTag("l")
            }
        }else{
            //sleepgame中はそのまま進める
            this.kag.ftag.nextOrder();
        }
        //ここまで変更
    } 
}
TYRANO.kag.ftag.master_tag.autostart = TYRANO.kag.tag.autostart
TYRANO.kag.ftag.master_tag.autostart.kag = TYRANO.kag

tyrano.plugin.kag.tag.autostop = {
    pm : {
        next:"true"
    },
    start : function(pm) {
        const _is_auto = this.kag.stat.is_auto
        this.kag.stat.is_auto = false;
        this.kag.stat.is_wait_auto = false;
        if(pm.next=="true"){
        //ここから変更
            //テキスト表示中orボイス再生中にオート停止したときは何もしない
            if(!this.kag.stat.is_adding_text && !this.kag.tmp.is_vo_play){
                this.kag.ftag.nextOrder();
            }else if(!_is_auto){
                this.kag.ftag.nextOrder();
            }
            //ここまで変更
        }
    }
}
TYRANO.kag.ftag.master_tag.autostop = TYRANO.kag.tag.autostop
TYRANO.kag.ftag.master_tag.autostop.kag = TYRANO.kag

このコードを適当なjsファイルとして保存して、first.ksとかでloadjsすればオートモードの挙動が変わります。

以下、何をしているか知りたい方向け

解説

オートモードの挙動は複数の関数に跨って設定されているので、いじる箇所も多いですがひとつずつ見ていきましょう。

オートモードからの復帰を判定する変数を定義

/**
* オートモードからの復帰判定
*/
let is_auto = false

まずはこちら。「is_auto」という変数を定義しています。

この変数は、「オートモードが解除されたか」の判定をするのに使います。詳細は後述

ゲーム画面をクリックしたときの動作

$(document).off("mousedown")
$(document).on("mousedown", function(e) {
    const that = TYRANO.kag.key_mouse
    is_auto = TYRANO.kag.stat.is_auto  //ここを追加
    that.clearSkip();          
    var target = null;
    //中央クリック
    if (e.which == 2) {
        target = that.map_mouse["center"];
    }else if(e.which == 3){
        //右クリック
        target = that.map_mouse["right"];
    }
    if(typeof target=="function"){
        target();
    }else{
        if(that[target]){
            that[target]();
        }
    }
});

コメント入れてるところを追加しています。

ここでは、「クリックした時点のオートモードの状態」を先程定義した「is_auto」変数に代入しています。
これにより、「今はオートモードから通常のメッセージ進行モードに戻ったタイミングか」がわかるわけです。

レイヤークリック時の動作

/**
* オートモード対応
* レイヤークリック時の動作
*/
let layer_obj_click = $(".layer_event_click");
layer_obj_click.off("click")
layer_obj_click.click(function(e){
    if(that.kag.tmp.ready_audio==false){
        if($.isNeedClickAudio()){
            that.kag.readyAudio();
            that.kag.tmp.ready_audio = true;
            if(that.kag.stat.is_adding_text == true){
                that.kag.stat.is_click_text = true;
                return false;
            }
            that.kag.ftag.nextOrder();
            return false;
        }
    }
    if(that.is_swipe){
        that.is_swipe = false;
        return false;
    }
    if(that.kag.stat.is_hide_message == true){
        that.kag.layer.showMessageLayers();
        return false;
    }
    //テキスト再生中にクリックされた場合、文字列を進めて終了にする
    if(that.kag.stat.is_adding_text == true){
        that.kag.stat.is_click_text = true;
        return false;;
    }
    //テキストマッハ表示時もリターン。
    if(that.kag.stat.is_click_text == true){
        return false;
    }
    if(that.kag.stat.is_stop == true){
        return false;
    }
    //フキダシ表示の場合は一回非表示にする。
    if(that.kag.stat.fuki.active==true){
        that.kag.layer.hideMessageLayers();
    }
    //ここから変更
    if(!is_auto){
        //オートモードからの復帰じゃないとき(=非オートモード)はそのまま進める
        that.kag.ftag.nextOrder();
    }else if(!that.kag.stat.is_adding_text && !that.kag.tmp.is_vo_play){
        //オートモードからの復帰のときはテキスト&ボイス進行中じゃなければ進める
        that.kag.ftag.nextOrder();
    }
  //ここまで変更
})

続いては、ゲーム画面をクリックしたときの動作の定義です。
コメントのある部分を変更しています。

オートモードから通常モードに変わったタイミング」であれば、「メッセージ表示中」または「ボイス再生中」かを判定し、「メッセージ表示中でなく、かつボイス再生中でもない」場合にのみ次のメッセージに進めます。

オートモードから通常モードに変わったタイミング」でない場合は、そのままメッセージを進めます。通常の、「クリックしてメッセージ進行」の動作ですね。

[autostart]タグの拡張

//オートモード拡張
tyrano.plugin.kag.tag.autostart = {
    pm : {},
    start : function(pm) {
        if (this.kag.stat.is_auto == true) {
            return false;
        }
        this.kag.readyAudio();
        //[p][l] の処理に、オート判定が入ってます
        this.kag.stat.is_auto = true;
        //ここから変更
        if(this.kag.tmp.sleep_game === null){
            if(!this.kag.stat.is_adding_text && !this.kag.tmp.is_vo_play){
                this.kag.ftag.nextOrder();
            }else{
                //テキスト表示中orボイス再生中にオート開始したときは再度クリック待ちを挟んでおく
                this.kag.ftag.startTag("l")
            }
        }else{
            //sleepgame中はそのまま進める
            this.kag.ftag.nextOrder();
        }
        //ここまで変更
    } 
}
TYRANO.kag.ftag.master_tag.autostart = TYRANO.kag.tag.autostart
TYRANO.kag.ftag.master_tag.autostart.kag = TYRANO.kag

続いて[autostart]タグをいじっていきます。
これもコメントを入れているところです。

sleepgame中でない」場合、かつ「メッセージ表示中でなくボイス再生中でない」場合に「オートモード開始」したときは、そのままメッセージを進めます。

「メッセージ表示中またはボイス再生中」の場合に「オートモード開始」したときは、クリック待ちの処理を挟むことで「オートモード待機時間経過後に次のメッセージに進む」処理となります。

[autostop]タグの拡張

tyrano.plugin.kag.tag.autostop = {
    pm : {
        next:"true"
    },
    start : function(pm) {
        const _is_auto = this.kag.stat.is_auto
        this.kag.stat.is_auto = false;
        this.kag.stat.is_wait_auto = false;
        if(pm.next=="true"){
        //ここから変更
            //テキスト表示中orボイス再生中にオート停止したときは何もしない
            if(!this.kag.stat.is_adding_text && !this.kag.tmp.is_vo_play){
                this.kag.ftag.nextOrder();
            }else if(!_is_auto){
                this.kag.ftag.nextOrder();
            }
            //ここまで変更
        }
    }
}
TYRANO.kag.ftag.master_tag.autostop = TYRANO.kag.tag.autostop
TYRANO.kag.ftag.master_tag.autostop.kag = TYRANO.kag

最後、[autostop]タグをいじります。
これもこれまでと同じようなことをしています。

メッセージ表示中でなく、かつボイス再生中でない」場合に「オートモード終了」したときは、そのまま次のメッセージに進めます。

メッセージ表示中またはボイス再生中」の場合に「オートモード終了」したときは、さらに「オートモードから通常モードに変更したタイミングか」を判定し、偽であれば次のメッセージに進みます。
通常の、クリックでメッセージ進行の処理ですね。

そんなかんじで…影響する範囲が小さい割にいじる箇所が多いですが、ひとつひとつ見ていけば理解できると思います。では~

サポートをしていただけると私がたいへんよろこびます。 ちなみに欲しい物リストはこちら→https://www.amazon.jp/hz/wishlist/ls/2DBRPE55L3SQC?ref_=wl_share