【解決済み】SAN_EntireEscapeCharacterにて不具合が発生しました

アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

【解決済み】SAN_EntireEscapeCharacterにて不具合が発生しました

投稿記事by にゃたま » 2018年10月31日(水) 01:28

こんばんは。

サンシロ様のSAN_EntireEscapeCharacterというプラグインで一定条件のときに
デバッグ画面で不具合が発生することが判明しました。

プラグインは以下からダウンロードできます。
https://drive.google.com/drive/folders/ ... 2o1ZzhuTGs

こちらのプラグインの中身を覗いてみましたが私の知識では原因がわからなかったので
ご質問させていただきます。

因みにツクールのバージョンは最新のMac版を使用しています。

一定条件というのはスイッチの最大数が201を超える時にデバッグ画面(変数値やスイッチの値の表示)
で下にスクロールしてスイッチの201以降を表示しようとするとエラー画面が表示されるというものです。

逆に言えば200以内のスイッチ数ならエラーは出ませんが
201以上のスイッチが作れないので困ります。

スクリプトに詳しい方、原因がわかりましたら教えていただきたく思います。
万一、うちの環境だとエラー出ないよって場合も教えていただけると嬉しいです。
よろしくお願いいたします。
最後に編集したユーザー にゃたま on 2018年10月31日(水) 12:39 [ 編集 1 回目 ]

アバター
ツミオ
記事: 83
登録日時: 2017年4月02日(日) 13:46
連絡を取る:

Re: SAN_EntireEscapeCharacterにて不具合が発生しました

投稿記事by ツミオ » 2018年10月31日(水) 09:29

こんにちは。
コードを拝見しました。

問題はdrawTextに渡されるtextがtoStringメソッドを呼べない場合が存在することにあります。今回はundefinedが渡されているようです。
なので解決方法としては、対象プラグインのdrawTextを以下のように変更するとよいかと思います。
注*toStringメソッドを利用できないundefindedかnull以外の値を渡すと依然としてエラーが発生するかと思いますが、多分そんな値をdrawTextに渡すことはないだろうという判断です。

コード: 全て選択

Sanshiro.EntireEscapeCharacter.Window_Base_drawText = Window_Base.prototype.drawText;
Window_Base.prototype.drawText = function(text, x, y, maxWidth, align) {
    var regex = /(\\[VNPCI](\[\d+\]))|(\\[G{}\\|$.|!><^])/g;
    const canToString = (text !== undefined) && (text !== null);
    if (canToString && regex.test(text.toString())) {
        if (!Sanshiro.EntireEscapeCharacter.dontApplyWindowList.contains(this.constructor.name)) {
            this.drawTextEx(text.toString(), x, y);
            return;
        } else {
            text = text.replace(regex, '');
        }
    }
    Sanshiro.EntireEscapeCharacter.Window_Base_drawText.call(this, text, x, y, maxWidth, align);
};



なお、なぜundefinedが渡されるかと言えば、Window_DebugEdit内においてスイッチ名が存在しないものを描画する場合があるからのようです(maxItemsが10個と決め打ちされているのと関係しているかも。ちょっとこの辺よく読んでません)。
例えば201個のスイッチを設定した場合、Window_DebugEditのitemNameメソッド内において201個目まではSystem.jsonから作成するスイッチの名前データが初期化されるため、文字列として処理できます。
ですが、残り9個のスイッチについては未定義のデータが返されてしまっているようです。
この未定義データが対象プラグインのdrawTextに渡されてしまうのでエラーが発生していました。

したがって「200以内なら発生しない」という条件は正しくなく、例えば181という数値でも発生するかと思います。

以上、何か参考になりましたら幸いです。
【Twitter】https://twitter.com/TsumioNtGame/
【GitHub】https://github.com/Tsumio/rmmv-plugins

有償の依頼も募集中。
今まで有償で制作したものは実績をご覧ください。
アバター
にゃたま
記事: 837
登録日時: 2016年1月13日(水) 23:53
お住まい: 床下の猫王国-すみませんが体調悪いのでサポートはお休みさせていただきます
連絡を取る:

Re: SAN_EntireEscapeCharacterにて不具合が発生しました

投稿記事by にゃたま » 2018年10月31日(水) 12:38

ツミオ様

ご返信いただきありがとうございます。
わざわざ詳細な発生の原因まで教えていただきありがとうございました。
コードを書き換えたところエラーなく無事動作できました。
やはり私には理解の範疇を超えるというか難しすぎたようです。
200以内でも発生したのですね。私の環境では201以上でしかエラーしませんでした。
理由はよくわかりませんでしたが無事解決できてよかったです。
本当にありがとうございました。

“MV:質問” へ戻る