【再び】条件による異なったメッセージの表示方法

Mr.あきちゃん
記事: 68
登録日時: 2017年7月23日(日) 02:51

【再び】条件による異なったメッセージの表示方法

投稿記事by Mr.あきちゃん » 2019年10月13日(日) 11:39

皆様にはいつも大変お世話になっております。久しぶりに質問させていただきます。

「放置したまま勝手に戦闘する」というのを作りたいのです。
『放置の部屋』みたいな所に入ると、勝手に(ランダムで)歩き回って、エンカウントして、自動で戦って、戦闘が終わってまた歩き回って、エンカウントして、戦って‥‥というような感じです。

ところが戦闘に入ると通常は「○○が出現!」と表示されて、そのままキー入力待ちになってしまいます。これだと放置状態では先に進みません。
『用語』の『メッセージ』で「出現」のところを「%1が出現!\|\^」(1秒表示してスキップ)にすれば解決はするのですが、こうしてしまうと通常の戦闘(放置の部屋でないとき)もスキップされてしまいます。

通常時はコマンド入力待ちにして、放置状態のときだけメッセージをスキップ、なんていう設定はできないものでしょうか?皆様のお知恵を拝借したいのです。

よろしくお願いいたします。
最後に編集したユーザー Mr.あきちゃん on 2019年10月20日(日) 00:10 [ 編集 2 回目 ]

ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 条件による異なったメッセージの表示方法

投稿記事by ジャングル » 2019年10月13日(日) 17:11

コアスクリプトrpg_objects.jsの421行目の書き換えで良いと思います(2行追加)

スイッチ番号3がオンであれば、表示するテキストに \|\^ を追加します

コード: 全て選択

Game_Message.prototype.add = function(text) {
    this._texts.push(text);
};

▲これを▼のように書き換えます

コード: 全て選択

Game_Message.prototype.add = function(text) {
    var switch_number = 3;
    if ($gameSwitches.value(switch_number)) { text += "\x1b|\x1b^"; }
    this._texts.push(text);
};


これで、スイッチ番号3がオンのときはオートメッセージになり、
そうでないときは通常通りになります
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: 条件による異なったメッセージの表示方法

投稿記事by 奏ねこま » 2019年10月13日(日) 17:55

コアスクリプトを書き換えないで済む方法を。

用語の出現メッセージには実は変数が使えます。(添付画像1枚め参照)
なので、通常時は変数を空っぽにしておいて(添付画像2枚め参照)
放置部屋のときは制御文字を入れれば(添付画像3枚め参照)
ご期待の動作をするのではないかと。
制御文字の入れ方が少々特殊( \ ではなく \x1b とするところ)である点にご注意ください。

1.png

3.png

2.png
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 条件による異なったメッセージの表示方法

投稿記事by ジャングル » 2019年10月13日(日) 18:16

> 奏ねこま様
確かに良いですが、
スイッチ一発の方が楽じゃないですか?

そして、全てのメッセージに \v[1] と書くんですか?

コアスクリプトを汚したくないなら、
▼こいつをプラグインにしてjs/pluginsに追加すれば済みます

コード: 全て選択

var _Game_Message_add = Game_Message.prototype.add;
Game_Message.prototype.add = function(text) {
    var switch_number = 3;
    if ($gameSwitches.value(switch_number)) { text += "\x1b|\x1b^"; }
    _Game_Message_add.call(this, text);
};
Mr.あきちゃん
記事: 68
登録日時: 2017年7月23日(日) 02:51

Re: 【解決済】条件による異なったメッセージの表示方法

投稿記事by Mr.あきちゃん » 2019年10月14日(月) 11:37

ジャングル様、奏ねこま様、ありがとうございました。
ご教示いただくのが早すぎて、私が追いつかないです‥^^;

それにしても「\x1b」にする、なんていう情報はどこでお知りになるのですか?
Javascript界では常識なんですかね??(自分がJavascriptをよく知らないもので‥)

また、プラグインにする方法までご教示いただき、大大感謝です!m(_ _)m
誠にありがとうございました。
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 【解決済】条件による異なったメッセージの表示方法

投稿記事by ジャングル » 2019年10月14日(月) 18:33

解決されたようで良かったです

>どこでお知りになるのですか?
プラグインとかコアスクリプトとかに書かれてます

\V[2]などの\は、エスケープ文字なのでそれだけでは文字と認識されません
だから"\"と認識させたい場合は"\\"と書く必要があります

※イベントコマンド「文章の表示」では\V[2]は\\V[2]に加工されてから$gameMessage.add()に渡されます
で、\\ は内部的に \x1b に変換されて処理されます★

コード: 全て選択

Window_Base.prototype.convertEscapeCharacters = function(text) {
    text = text.replace(/\\/g, '\x1b');//←★
    text = text.replace(/\x1b\x1b/g, '\\');
    text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
        return $gameVariables.value(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
        return $gameVariables.value(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bN\[(\d+)\]/gi, function() {
        return this.actorName(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bP\[(\d+)\]/gi, function() {
        return this.partyMemberName(parseInt(arguments[1]));
    }.bind(this));
    text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
    return text;
};

つまり内部的に\\は\x1bになっているので、最初からそれを与えても良いわけです

もちろん\x1bではなく\\を与えても機能します
$gameMessage.add("\x1bV[2]"); // これで変数2の値が表示されます
$gameMessage.add("\\V[2]");  // これでも構いません

※Vでもvでも構いません
※\C[2]など上記で変換していないタグは、書き出す直前にprocessEscapeCharacterメソッドで値だけが取り出されます

僕も最初は意味不明でした
Mr.あきちゃん
記事: 68
登録日時: 2017年7月23日(日) 02:51

Re: 【再び】条件による異なったメッセージの表示方法

投稿記事by Mr.あきちゃん » 2019年10月20日(日) 00:21

申し訳ありません、解決かと思ったのですが、問題が発生しました‥

放置の状態で、戦闘後レベルアップをするとキー入力待ちになってしまいます。
調べてみると、どうやらGame_Actor.prototype.displayLevelUpという所にある
$gameMessage.newPage();
というのが原因のようです。(↑これをやるとキー入力待ちになるみたいです。)
放置状態のときは↑をやらない、とすればとりあえずは先に進むと思うのですが、
どうせならせっかくなので教えていただいたプラグインにくっつけたいのですが、
見様見真似でやってみてもどうにもうまくいかないのです‥(ToT)

図々しいお願いで誠に恐縮なのですが、レベルアップ時にもキー入力を
スキップするようになるプラグインを教えていただけないでしょうかm(_ _)m
図々しくて、本当に申し訳ありません
何卒よろしくお願いいたします。
ジャングル
記事: 108
登録日時: 2018年12月30日(日) 14:51
お住まい: 自動販売機

Re: 【再び】条件による異なったメッセージの表示方法

投稿記事by ジャングル » 2019年10月24日(木) 08:22

遅くなって済みません。
さっき返信を見つけました(忙しくてツクマテ見てなくて・・・)

これでいけませんか?

コード: 全て選択

(function() {
   var switch_number = 3;
   var auto_text = "\x1b|\x1b^";

   var _Game_Message_add = Game_Message.prototype.add;
   Game_Message.prototype.add = function(text) {
       if ($gameSwitches.value(switch_number)) { text += auto_text; }
       _Game_Message_add.call(this, text);
   };
   var _Window_Message_updateInput = Window_Message.prototype.updateInput;
   Window_Message.prototype.updateInput = function() {
      if ($gameSwitches.value(switch_number)) {
         return false;
      }
      return _Window_Message_updateInput.call(this);
   };
   var _Window__updatePauseSign = Window.prototype._updatePauseSign;
   Window.prototype._updatePauseSign = function() {
       _Window__updatePauseSign.call(this);
       if ($gameSwitches.value(switch_number)) {
          this._windowPauseSignSprite.alpha = 0;
       }      
   };
})();

“MV:質問” へ戻る