プラグインで制御文字を追加したい

味噌原

ユーザー
/PI[n]という制御文字から任意の数字をPictureIdという変数として取得するプラグインを作っていたのですが、
このスクリプトを適用するとなぜか/C[n]などの制御文字が「c[n]」と表示され、読まれなくなってしまいます。

下記が作成したスクリプトです。

JavaScript:
(() => {
    //変換
  // PI[n]の処理を追加
  const _Window_Base_convertEscapeCharacters = Window_Base.prototype.convertEscapeCharacters;
  Window_Base.prototype.convertEscapeCharacters = function(text) {
    // PI[n]の正規表現を追加
    const piRegexp = /\\PI\[(\d+)\]/i;
    // PI[n]の置換関数を追加
    const piReplacer = (_, p1) => {
      // nを数値に変換してpictureIdに代入
      const pictureId = Number(p1);
      return '';
    };

    // 他のエスケープシーケンスの処理はそのまま継承
    return _Window_Base_convertEscapeCharacters.apply(this, arguments)
      .replace(piRegexp, piReplacer);
  };
  //ここでPIを制御文字としていろいろする
   const _Window_Message_processEscapeCharacter = Window_Message.prototype.processEscapeCharacter;
    Window_Message.prototype.processEscapeCharacter = function(code, textState) {
        switch (code) {
            case 'PI':
                const pictureId = this.obtainEscapeParam(textState);
                console.log(pictureId);
                SetPI(pictureId);
               
                break;
            default:
                _Window_Message_processEscapeCharacter.apply(this, arguments);
                break;
        }
    };

    function SetPI(n){
        const pictureId = n;
        if (pictureId > 0) {
          // ピクチャIDを取得した場合
           Window_Message.prototype.processControlCharacter = function(textState) {
            Window_Base.prototype.flushTextState.call(this, textState);
             //ここから口パク
            console.log(textState);
             }}
    };

})();

コンソールで確認したところ、Window_Message.prototype.processEscapeCharacterもWindow_Base.prototype.processEscapeCharacterも正しく実行されてはいるようです。

何かわかることがあればご教示願います。1682019390980.png
 
最後に編集:

DarkPlasma

ユーザー
setPI 関数で processControlCharacter を動的に書き換えてしまっているため、
元の processControlCharacter の処理が失われてしまっているのが原因です。

\PI 以降、メッセージウィンドウで文字を表示するたびに何か処理をしたいということであれば、
Window_Message クラスの変数にピクチャIDを持たせて、それで分岐してあげるのが素直な方法です。

パラメータを取得して、それ以降文字を表示する度に何かするプラグインのサンプルを書いてみました。

Live2Dプラグインを触ってないのでこれはただの想像ですが、
幾通りかの口パクアニメーションを重複しないように呼び出すことで、ある程度それらしい動きになってくれそうな気はします。

こまさんに聞けばもっと良いやり方があるかもしれません。
 

味噌原

ユーザー
ありがとうございます!無事、個々の文字とピクチャIDがコンソールに表示されました!
 
トップ