查看: 1758|回复: 4

[有事请教] 請問ツクール工房A1的氣泡對話插件,要如何使用?(已解決)

[复制链接]
梦石
0
星屑
5241
在线时间
760 小时
注册时间
2009-1-21
回帖
236
发表于 2023-1-9 15:02:57 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 御之嵐 于 2023-1-14 09:27 编辑

如標題

這個日本的氣泡對話插件
研究半天還是沒有動作

網址
http://a1tktk.web.fc2.com/mv_plugin_page/popup_message.html

必要プラグイン:A1共通プラグイン
[pre lang="javascript" file="A1Common.js"]//=============================================================================
// A1Common.js
//=============================================================================
/*:
* @plugindesc ツクール工房A1(仮)の共通スクリプトです。
* @author ツクール工房A1(仮)
*
* @help このプラグインにはプラグインコマンドはありません。
*
*  プラグインコマンドに多重配列が使えるようになります。
*  例  :コマンド AAA BBB,CCC,DDD
*  結果:コマンド AAA,[BBB,CCC,DDD]
*
*  例  :コマンド AAA BBB,[CCC,DDD],EEE
*  結果:コマンド AAA,[BBB,[CCC,DDD],EEE]
*
*  プラグインコマンドに文字列リテラルが使えるようになります。
*  例  :コマンド ${1+2}
*  結果:コマンド 3
*
*  プラグインコマンドを定義して呼び出せます。
*    「プラグインコマンドの定義」をオーバーライドして
*    プラグインコマンドで呼び出したいメソッドを定義します。
*    使用方法は「セルフスイッチ拡張」プラグイン等を参考にお願いします。
*
*  メモの内容を配列・ハッシュ化して読み込めます。
*  例  :<データ名 arg,arg,arg,arg...>
*  結果:メモの内容を配列で読み込みます。  
*     重複したデータ名がある場合、多重配列化して連結します。
*
*  例  :<データ名 key arg,arg,arg...>
*  結果:メモの内容をハッシュで読み込みます。  
*     重複したデータ名・keyがある場合は多重配列を連結します。
*
*  例  :<データ名>
*  結果:メモの内容にデータ名と一致するものがあれば True を返します。
*
*/
//=============================================================================
// 更新履歴  2020/06/27 Ver1.00 リリース
//           2020/06/27 Ver1.01 後の拡張機能の為にevalを関数化
//           2020/06/27 Ver1.01 条件式を厳格化
//           2020/06/28 Ver1.10 メモの内容を読み取る機能を追加
//           2020/06/28 Ver1.10 テキストの幅を計算する機能を追加
//           2020/06/30 Ver1.20 共通スクリプト以外のバージョンチェック機能を追加
//           2020/06/30 Ver1.20 シーンにウィンドウを追加・削除する機能を追加
//           2020/06/30 Ver1.20 エスケープ文字の入ったテキストの幅を計算する機能を追加
//           2020/06/30 Ver1.20 顔や歩行のFileNameとIndexをキーにして列挙する機能を追加
//           2020/07/02 Ver1.21 テキストの幅を計算するエスケープ文字の対象を追加
//           2020/07/02 Ver1.30 エスケープ文字引数の処理を追加
//           2020/07/05 Ver1.40 データベースロード完了後の処理(空定義)追加
//           2020/07/05 Ver1.50 ファイル・フォルダ一覧取得処理追加
//           2020/07/10 Ver1.60 配列化にTO_FLOATを追加
//=============================================================================
// ■ バージョン定義
//=============================================================================
var $A1Common = null;
var $A1PlugInImpoted = {};
$A1PlugInImpoted["A1共通スクリプト"] = 1.60;
//=============================================================================
// ■ 定数
//=============================================================================
const TO_STRING = 0;
const TO_INT    = 1;
const TO_FLOAT  = 2;
//=============================================================================
// ■ プラグイン設定値
//=============================================================================
var A1PlugInParams = {};
//=============================================================================
// ■ A1共通スクリプト
//=============================================================================
function A1Common() {
  this.initialize.apply(this, arguments);
};
//=============================================================================
// ○ バージョンチェック
//=============================================================================
A1Common.VersionCheck = function(plugin_name, version, import_name = "A1共通スクリプト") {
  if ($A1PlugInImpoted[import_name] < version){
    alert(`${plugin_name} には ${import_name} Ver ${version} 以上が必要です。`);
    return false;
  }
  return true;
};
//=============================================================================
// ○ イニシャライズ
//=============================================================================
A1Common.prototype.initialize = function() {
  this._define_command = {};
  this.define_command();
};
//=============================================================================
// ○ プラグインコマンドの定義
//=============================================================================
A1Common.prototype.define_command = function() {
  return this._define_command;
};
//=============================================================================
// ○ プラグインコマンドの実行
//=============================================================================
A1Common.prototype.proc_define_command = function(command, args) {
if (command in this._define_command){
   return this._define_command[command].call(this, args)
}
return false;
};
//=============================================================================
// ○ Eval結果で文字列を置換
//=============================================================================
A1Common.ReplaceEval = function(text, exp){
  var exp_result  = exp.exec(text);
  if (exp_result === null){ return text }
  var exp_text  = exp_result[1];
  var text_end  = exp_text.indexOf("}");
  if (text_end < 0) { text_end = exp_text.length }
  var eval_text = exp_text.substring(0, text_end);
  text = text.replace(`\${${eval_text}}`, A1Common.ProcEval(eval_text))
  return A1Common.ReplaceEval(text, exp);
};
//=============================================================================
// ○ Evalを実行する
//=============================================================================
A1Common.ProcEval = function(command){
  return eval(command);
};
//=============================================================================
// ○ 配列を考慮したスプリット
//=============================================================================
A1Common.SplitArgs = function(text, result_args = [], to_int = TO_STRING){
  text = A1Common.ReplaceEval(text, /\$\{(\S+)\}/);
  var args = text.split(",");
  if (args.length === 1) {
    var array_sym  = /^\[(\S+)\]/;
    var array_args = array_sym.exec(text);
    if (array_args !== null) { result_args.push([array_args[1]]) }
        else { result_args.push(A1Common.to_i(text, to_int)) }
  }
  else {
    A1Common.ArrayInArray(args, result_args, to_int)
  }
  return result_args;
};
//=============================================================================
// ○ 配列の中の配列
//=============================================================================
A1Common.ArrayInArray = function(args, result_args, to_int){
  var push_array = [];
  var temp_array = [];
  var left_count  = 0;
  var right_count = 0;
  args.forEach(function(text) {
    var left_sym    = /^\[(\S+)/;
    var right_sym   = /(\S+)\]/;
    var left_array  = left_sym.exec(text);
    var right_array = right_sym.exec(text);
    if (left_array !== null){
      if (left_count === 0){
        temp_array.push(left_array[1])
      }
      else {
        temp_array.push(A1Common.to_i(text, to_int))
      };
      left_count += 1;
    }
    else if (right_array !== null){
      right_count += 1;
      if (right_count === left_count) {
        temp_array.push(right_array[1]);
        A1Common.ArrayInArray(temp_array, push_array, to_int);
        temp_array  = [];
        left_count  = 0;
        right_count = 0;
      }
      else {
        temp_array.push(A1Common.to_i(text, to_int));
      }
    }
    else if (left_count > 0) {
      temp_array.push(A1Common.to_i(text, to_int));
    }
    else {
      A1Common.SplitArgs(text, push_array, to_int)
    }
  });
  result_args.push(push_array);
};
//=============================================================================
// ○ 文字列を数値にできるものだけ数値にする
//=============================================================================
A1Common.to_i = function(text, to_int){
  if(to_int === TO_STRING) { return text }
  var int_exp    = /^(-?[0-9]+\.?[0-9]*$)/
  var int_result = int_exp.exec(text)
  if(int_result === null) { return text }
  var ret;
  if(to_int === TO_FLOAT){
    ret = parseFloat(text)
  }
  else if(to_int === TO_INT){
    ret = parseInt(text)
  }
  if(isNaN(ret)){ return text }
  return ret;
};
//=============================================================================
// ○ メモを読み込む
//=============================================================================
A1Common.ReadNote = function(note_key, note, to_int = TO_STRING, ret = false){
  var note_exp    = new RegExp(`<${note_key}\\s?(.*)>\\n`);
  var exp_result  = note_exp.exec(note);
  if(exp_result === null){ return ret }
  if(exp_result[1] === ""){ return true }
  var data = exp_result[1].split(" ")
  var result_args = [];
  var match_string = exp_result[0];
  if(data.length === 1){
    A1Common.SplitArgs(data[0], result_args, to_int);
    if(ret === false){
      ret = result_args;
    }
    else{
      ret = ret.concat(result_args);
        }
    note = note.replace(match_string, "");
    ret = A1Common.ReadNote(note_key, note, to_int, ret);
    if(ret.length === 1){
       ret = ret[0];
        }
  }
  else{
    var key = data.shift();
    A1Common.SplitArgs(key, result_args, to_int);
    key = result_args[0];
    if(ret === false){ ret = {} }
    result_args = [];
    data.forEach(function(arg) { A1Common.SplitArgs(arg, result_args, to_int) });
    if(ret === false || !(key in ret)){
      ret[key] = result_args;
    }
    else{
      ret[key] = ret[key].concat(result_args);
        }
    note = note.replace(match_string, "");
    ret = A1Common.ReadNote(note_key, note, to_int, ret);
  }
  return ret;
};
//=============================================================================
// ○ テキストの横幅を取得する
//=============================================================================
A1Common.CalcTextWidth = function(text, FontFace, FontSize){
  var bitmap = new Bitmap(0, 0);
  bitmap.fontFace = FontFace;
  bitmap.fontSize = FontSize;
  return bitmap.measureTextWidth(text);
};
//=============================================================================
// ○ テキストのスプライトを作成する。
//=============================================================================
A1Common.CreateTextSplite = function(text, FontFace, FontSize, height, align = "left"){
  var width = A1Common.CalcTextWidth(text, FontFace, FontSize);
  var bitmap = new Bitmap(width, height);
  bitmap.fontFace = FontFace;
  bitmap.fontSize = FontSize;
  bitmap.drawText(text, 0, 0, width, height, align);
  var sprite = new Sprite(bitmap);
  return sprite;
};
//=============================================================================
// ○ エスケープ文字入りテキストの横幅を取得する
//=============================================================================
A1Common.CalcTextWidthInEscape = function(text, FontFace, FontSize){
  var iconCount;
  var maxWidth = 0;
  var splitText = text.split("\n");
  for(var i = 0; i < splitText.length; i++){
    var line = splitText;
    iconCount = (line.match( /\x1bI\[\d+\]/g ) || []).length
    line = A1Common.removeEscapeCharacter(line);
    var textWidth = A1Common.CalcTextWidth(line, FontFace, FontSize) + 32 * iconCount;
    maxWidth = maxWidth < textWidth ? textWidth : maxWidth;
  }
  return maxWidth;
};
//=============================================================================
// ○ テキストのエスケープ文字を消去する
//=============================================================================
A1Common.removeEscapeCharacter = function(text){
  text = text.replace(/\x1bC\[\d+\]/g, "");
  text = text.replace(/\x1bI\[\d+\]/g, "");
  text = text.replace(/\x1b{/g, "");
  text = text.replace(/\x1b}/g, "");
  text = text.replace(/\x1b\$/g, "");
  text = text.replace(/\x1b\./g, "");
  text = text.replace(/\x1b\|/g, "");
  text = text.replace(/\x1b\!/g, "");
  text = text.replace(/\x1b>/g, "");
  text = text.replace(/\x1b</g, "");
  text = text.replace(/\x1b\^/g, "");
  text = text.replace(/\x1bFC\[[^\]]*,*\d+\]/g, "");
  return text;
};
//=============================================================================
// ○ 顔グラフィックや歩行グラフィックのキーを作成
//=============================================================================
A1Common.makeFaceCharKeys = function(ary, ret = []) {
  if(Array.isArray(ary[0])){
    var makeAry = ary.shift();
    A1Common.makeFaceCharKeys(makeAry, ret);
    if(ary.length > 0){ A1Common.makeFaceCharKeys(ary, ret) }
  }
  else{
    var name = ary.shift();
    if(ary.length > 0){
      for(var i = 0; i < ary.length; i++){
        ret.push([name, parseInt(ary)]);
          }
    }
    else{
      ret.push([name]);
        }
  }
  return ret;
};
//=============================================================================
// ○ パスの存在チェック
//=============================================================================
A1Common.pathExist = function(path) {
  try {
    var fs = require('fs');
    fs.statSync(path);
    return true;
  } catch (error) {
    if (error.code === 'ENOENT') {
      return false;
    } else {
    }
  }
};
//=============================================================================
// ○ A1Common フォルダ内のファイル/フォルダ取得
//=============================================================================
A1Common.getFolder = function(path, dirList, exp = true){
  var ret = [];
  var fs = require('fs');
  fs.readdir(path, function(err,files){
    if (err) return console.log(err);
    files.forEach( function (file,idx){
      fs.lstat(path+'/'+file,function(err,stats){
      if(err) return console.log(err);
        if(stats.isDirectory() && dirList === true){
          ret.push(file)
        }
        if(stats.isDirectory() === false && dirList === false){
          if(exp === false){
            var tmp = file.split(".")
            file = file.slice(0, (tmp[tmp.length - 1].length + 1) * -1);
            if(ret.some( fileName => fileName === file) === false){
              ret.push(file)
                        }
                  }
          else{
            ret.push(file)
                  }
        }
      });                  
    });
  });
  return ret;
};
//=============================================================================
// ○ データベースロード完了後の処理
//=============================================================================
A1Common.afterDataLoad = function() {
};
//=============================================================================
// ■ function(_global)
//=============================================================================
(function(_global) {
//=============================================================================
// ☆ Scene_Boot 準備完了か判定
//=============================================================================
var A1CommonSB_isReady = Scene_Boot.prototype.isReady;
Scene_Boot.prototype.isReady = function() {
  var ret = A1CommonSB_isReady.apply(this);
  if(ret === true){ A1Common.afterDataLoad() }
  return ret;
};
//=============================================================================
// ○ Window_Base マスク用の矩形調整
//=============================================================================
Window_Base.prototype.maskRect = function(rect) {
};
//=============================================================================
// ☆ WindowLayer ウィンドウのマスク範囲設定
//=============================================================================
var A1CommonWL_maskWindow = WindowLayer.prototype._maskWindow;
WindowLayer.prototype._maskWindow = function(window, shift) {
  var ret = A1CommonWL_maskWindow.apply(this, arguments);
  var rect = this._windowRect;
  window.maskRect(rect);
  return ret;
};
//=============================================================================
// ○ SceneManager シーンにウィンドウを追加 [AddWindow]
//=============================================================================
SceneManager.sceneAddWindow = function(window) {
  this._scene.addWindow(window);
};
//=============================================================================
// ○ SceneManager シーンにウィンドウを追加 [AddChild]
//=============================================================================
SceneManager.sceneAddChild = function(window) {
  this._scene.addChild(window);
};
//=============================================================================
// ○ SceneManager シーンからウィンドウを削除
//=============================================================================
SceneManager.sceneRemoveWindow = function(window) {
  this._scene._windowLayer.removeChild(window)
};
//=============================================================================
// ○ SceneManager シーンからウィンドウを削除して追加
//=============================================================================
SceneManager.sceneReAddWindow = function(window) {
  this.sceneRemoveWindow(window);
  this.sceneAddWindow(window);
};
//=============================================================================
// ○ SceneManager シーンの指定ウィンドウを1つ前に置く
//=============================================================================
SceneManager.sceneForwardWindow = function(window, forward) {
  this.sceneRemoveWindow(window);
  this.sceneRemoveWindow(forward);
  this.sceneAddWindow(window);
  this.sceneAddWindow(forward);
};
//=============================================================================
// ☆ DataManager データベースのロード
//=============================================================================
var A1CommonDM_loadDatabase = DataManager.loadDatabase;
DataManager.loadDatabase = function() {
  var ret = A1CommonDM_loadDatabase.apply(this, arguments);
  $A1Common = new A1Common();
};
//=============================================================================
// ☆ Game_Interpreter プラグインコマンド
//=============================================================================
var A1CommonGI_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
  var result_args = [];
  args.forEach(function(arg) { A1Common.SplitArgs(arg, result_args) });
  args = result_args;
  if ($A1Common.proc_define_command(command, args)) {
    return true;
  } else {
    var result = A1CommonGI_pluginCommand.call(this, command, args);
    return result;
  }
};
//=============================================================================
// ☆ Window_Base エスケープ文字引数の処理
//=============================================================================
var A1CommonWB_obtainEscapeParam = Window_Message.prototype.obtainEscapeParam;
Window_Base.prototype.obtainEscapeParam = function(textState) {
  var ret = A1CommonWB_obtainEscapeParam.apply(this, arguments);
  if(ret !== ''){ return ret }
  var arr = /^\[([^\]],*\d+)\]/.exec(textState.text.slice(textState.index));
  if (arr) {
    textState.index += arr[0].length;
    var data = arr[1].split(",");
    if(data.length === 1){
      data[0] = parseInt(data[0]);
    }
    else {
      data[1] = parseInt(data[1]);
        }
    ret = data;
  };
  return ret;
};
})(this);[/pre]



氣泡對話插件  プラグイン本体
[pre lang="javascript" file="A1PopupMessage.js"]//=============================================================================
// A1PopupMessage.js
//=============================================================================
/*:
* @plugindesc 吹き出しメッセージを表示します。
* @author ツクール工房A1(仮)
*
* @help メッセージを吹き出しで表示します。
* ※表示した吹き出しメッセージは
*   プラグインコマンドでクローズするまで表示し続けます。
*
* 必要プラグイン
*   ツクール工房A1(仮)共通スクリプト Ver 1.20 以上
*
* 必要ファイル
*   Window_Popup.png
*   img/system に配置してください。
*
* 併用プラグイン
*   ネームウィンドウ Ver 1.10 以上
*
* データベース「アクター」の「メモ」に記載
*   <顔グラフィック FaceName>
*    顔グラフィックとアクターを紐づけます。
*    FaceName で指定した顔グラフィックファイル全てに同じ表示名を適用します。
*     ※ネームウィンドウと共用です
*
*   <顔グラフィック FaceName,FaceIndex,,FaceIndex,FaceIndex...>
*    顔グラフィックとアクターを紐づけます。
*    FaceName で指定した顔グラフィックファイルの内、続けて列挙する FaceIndex を表示名に適用します。
*     ※ネームウィンドウと共用です
*
*   <歩行グラフィック characterName>
*    歩行グラフィックとアクターを紐づけます。
*    characterName で指定した顔グラフィックファイル全てに同じ表示名を適用します。
*
*   <歩行グラフィック characterName,characterIndex,characterIndex,characterIndex...>
*    歩行グラフィックとアクターを紐づけます。
*    characterName で指定した歩行グラフィックファイルの内、続けて列挙する characterIndex を表示名に適用します。
*
* プラグインコマンド:
*   吹き出しメッセージ on|off
*     吹き出しメッセージの使用状態を切り替えます。
*
*   吹き出しメッセージ eventID
*     続くメッセージを eventID で指定したイベントの吹き出しとして表示します。
*
*   吹き出しクローズ
*     現在表示している吹き出しメッセージを全てクローズします。
*
*   --------------------------------------注--------------------------------------
*    説明が煩雑になっていますが
*    1キャラにつき顔グラフィックと歩行グラフィックが
*    1ファイルずつになっていると扱いやすいので、おすすめです。
*
*    例:歩行グラフィック登録 アレックス顔 アレックス歩行
*        歩行グラフィック解除 ブライアン顔
*        吹き出しクローズ 顔 キャロル顔
*        吹き出しクローズ 歩行 デイジー歩行
*   ------------------------------------------------------------------------------
*
*   吹き出しクローズ ID eventID,eventID,eventID...
*     列挙した eventID のイベントに表示されている吹き出しメッセージをクローズします。
*
*   吹き出しクローズ 顔 faceName
*   吹き出しクローズ 顔 [faceName],[faceName]...
*     指定した faceName に紐づいたイベントに表示されている吹き出しメッセージをクローズします。
*     列挙する場合は、faceName 一つ毎に [ ] で囲ってください
*
*   吹き出しクローズ 顔 faceName,faceIndex
*   吹き出しクローズ 顔 faceName,faceIndex,faceIndex,faceIndex...
*     指定した faceName faceIndex に紐づいたイベントに表示されている吹き出しメッセージをクローズします。
*     faceName の後に faceIndex を列挙できます。
*
*   吹き出しクローズ 顔 [faceName,faceIndex],[faceName,faceIndex]...
*   吹き出しクローズ 顔 [faceName,faceIndex,faceIndex,faceIndex...],[faceName,faceIndex,faceIndex,faceIndex...]...
*     [ ] で囲むことで、faceName faceIndex のセットを列挙できます。
*
*   吹き出しクローズ 歩行 characterName
*   吹き出しクローズ 歩行 [characterName],[characterName]...
*     上記「吹き出しクローズ 顔」の歩行グラフィック版です
*     同様の使い方ができます。
*
*   吹き出しクローズ 歩行 characterName,characterIndex
*   吹き出しクローズ 歩行 characterName,characterIndex,characterIndex,characterIndex...
*     上記「吹き出しクローズ 顔」の歩行グラフィック版です
*     同様の使い方ができます。
*
*   吹き出しクローズ 歩行 [characterName,characterIndex],[characterName,characterIndex]...
*   吹き出しクローズ 歩行 [characterName,characterIndex,characterIndex,characterIndex...],[characterName,characterIndex,characterIndex,characterIndex...]...
*     上記「吹き出しクローズ 顔」の歩行グラフィック版です
*     同様の使い方ができます。
*
*   歩行グラフィック登録 FaceName characterName
*    顔グラフィックと歩行グラフィックを紐づけます。
*    FaceName で指定した顔グラフィックファイル全てに、characterNameで指定した歩行グラフィック全てを適用します。
*
*   歩行グラフィック登録 FaceName,FaceIndex characterName,characterIndex
*   歩行グラフィック登録 FaceName,FaceIndex,FaceIndex,FaceIndex... characterName,characterIndex,characterIndex,characterIndex...
*    顔グラフィックと歩行グラフィックを紐づけます。
*    FaceName で指定した顔グラフィックファイルの内、続けて列挙する FaceIndex を
*    characterName で指定した歩行グラフィックファイルの内、続けて列挙する characterIndex に紐づけます。
*
*   歩行グラフィック解除 FaceName
*    「歩行グラフィック登録 FaceName characterName」にて登録した紐づけを解除します。
*
*   歩行グラフィック解除 FaceName,FaceIndex characterName,characterIndex
*   歩行グラフィック解除 FaceName,FaceIndex,FaceIndex,FaceIndex... characterName,characterIndex,characterIndex,characterIndex...
*    顔グラフィックと歩行グラフィックの紐づけを解除します。。
*    FaceName で指定した顔グラフィックファイルの内、続けて列挙する FaceIndex を
*    characterName で指定した歩行グラフィックファイルの内、続けて列挙する characterIndex の紐づけを解除します。
*
* ネームウィンドウ併用時プラグインコマンド:
*   吹き出しクローズ 名前 表示名
*   吹き出しクローズ 名前 表示名,表示名,表示名...
*     指定した 表示名 に紐づいたイベントに表示されている吹き出しメッセージをクローズします。
*
* 「登録用コモンイベント番号」に設定したコモンイベントに
*  上記プラグインコマンドを記載することで、ゲーム起動時に歩行グラフィック登録します。
*
*  データベース「アクター」の「メモ」やプラグインコマンドにて登録していないアクターは
*  データベース「アクター」で設定しているcharacterName characterIndexにてアクターを紐づけます。
*
* @param 歩行登録用コモンイベント番号
* @desc 歩行グラフィック登録用のコモンイベント番号
* デフォルト: 0
* @default 0
*
* @param 表示位置補正[x座標]
* @desc 吹き出しメッセージの x 座標を補正します
* デフォルト: 0
* @default 0
*
* @param 表示位置補正[y座標・上]
* @desc メッセージのウィンドウ位置が「上」の際の y 座標を補正します
* デフォルト: 0
* @default 0
*
* @param 表示位置補正[y座標・下]
* @desc メッセージのウィンドウ位置が「下」の際の y 座標を補正します
* デフォルト: 0
* @default 0
*
* @param ヒレ表示位置補正[x座標]
* @desc 吹き出しメッセージのヒレの x 座標を補正します
* デフォルト: 0
* @default 0
*
* @param ヒレ表示位置補正[y座標・上]
* @desc メッセージのウィンドウ位置が「上」の際のヒレの y 座標を補正します
* デフォルト: 0
* @default 0
*
* @param ヒレ表示位置補正[y座標・下]
* @desc メッセージのウィンドウ位置が「下」の際のヒレの y 座標を補正します
* デフォルト: 0
* @default 0
*
*/
//=============================================================================
// 更新履歴  2020/06/30 Ver1.00 リリース
//           2020/06/30 Ver1.01 ネームウィンドウプラグインを導入しないと
//                              メッセージが表示される不具合を修正
//           2020/07/02 Ver1.02 エスケープ文字の処理に対応
//=============================================================================
// ■ バージョン定義
//=============================================================================
$A1PlugInImpoted["吹き出しメッセージ"] = 1.02;
//=============================================================================
// ■ バージョンチェック
//=============================================================================
var common = A1Common.VersionCheck("吹き出しメッセージ", 1.20);
if (common){
//=============================================================================
// ■ プラグイン設定値
//=============================================================================
A1PlugInParams.PopupWindow = {};
A1PlugInParams.PopupWindow.Parameters = PluginManager.parameters('A1PopupMessage');
A1PlugInParams.PopupWindow.CharRegisterCommonEventID = Number(A1PlugInParams.PopupWindow.Parameters["歩行登録用コモンイベント番号"]) || 0;
A1PlugInParams.PopupWindow.RevisionPosX          = Number(A1PlugInParams.PopupWindow.Parameters["表示位置補正[x座標]"]) || 0;
A1PlugInParams.PopupWindow.RevisionUpPosY        = Number(A1PlugInParams.PopupWindow.Parameters["表示位置補正[y座標・上]"]) || 0;
A1PlugInParams.PopupWindow.RevisionBottomPosY    = Number(A1PlugInParams.PopupWindow.Parameters["表示位置補正[y座標・下]"]) || 0;
A1PlugInParams.PopupWindow.RevisionPopPosX       = Number(A1PlugInParams.PopupWindow.Parameters["ヒレ表示位置補正[x座標]"]) || 0;
A1PlugInParams.PopupWindow.RevisionPopUpPosY     = Number(A1PlugInParams.PopupWindow.Parameters["ヒレ表示位置補正[y座標・上]"]) || 0;
A1PlugInParams.PopupWindow.RevisionPopBottomPosY = Number(A1PlugInParams.PopupWindow.Parameters["ヒレ表示位置補正[y座標・下]"]) || 0;
//=============================================================================
// ■ グローバル変数定義
//=============================================================================
var $dataCharLink = null;
//=============================================================================
// ■ DataCharLink
//=============================================================================
function DataCharLink() {
  this.initialize.apply(this, arguments);
};
//=============================================================================
// ○ DataCharLink オブジェクト初期化
//=============================================================================
DataCharLink.prototype.initialize = function() {
  this._linkChar    = {};
  this._linkIndex   = -1;
  this._removeChar  = [];
  this.SearchLinkActor();
  this.SearchLinkRegister("歩行グラフィック登録",   A1PlugInParams.PopupWindow.CharRegisterCommonEventID);
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を探す [アクター]
//=============================================================================
DataCharLink.prototype.SearchLinkActor = function() {
  for(var i = 1; i < $dataActors.length; i++){
    var face_key = [];
    var char_key = [];
    var face_note_data = A1Common.ReadNote("顔グラフィック", $dataActors.note, TO_INT);
    var char_note_data = A1Common.ReadNote("歩行グラフィック", $dataActors.note, TO_INT);
    if(char_note_data === false){ char_key.push([$dataActors.characterName, $dataActors.characterIndex]) }
    else { char_key = this.CreateKeys([char_note_data]) }
    if(face_note_data === false){ face_key.push([$dataActors.faceName,      $dataActors.faceIndex])      }
    else { face_key = this.CreateKeys(face_note_data) }
    this.AddLinkFromNote(face_key, char_key);
    this.addSearchLinkActor(i, face_key, char_key);
  }
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を探す [アクター・拡張用]
//=============================================================================
DataCharLink.prototype.addSearchLinkActor = function(i, face_key, char_key) {
};
//=============================================================================
// ○ DataCharLink キーを作成する
//=============================================================================
DataCharLink.prototype.CreateKeys = function(note_data, keys = []) {
 return A1Common.makeFaceCharKeys(note_data);
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を探す [レジスター]
//=============================================================================
DataCharLink.prototype.SearchLinkRegister = function(command_name, commonEventID) {
  if(commonEventID === void 0 || commonEventID === 0){ return false }
  var commonEvent = $dataCommonEvents[commonEventID];
  var list = commonEvent.list;
  for(var i = 0; i < list.length; i++){
    var line = list;
    if (line.code !== 356){ continue };
    var params = line.parameters;
    var args = params[0].split(" ");
    var command = args.shift();
    if (command !== command_name) { continue };
    if(command_name === "歩行グラフィック登録"){ this.AddLinkFromEvent(args[0], args[1]) }
    this.addSearchLinkRegister(i, args[0], args[1], command_name);
  }
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を探す [レジスター・拡張用]
//=============================================================================
DataCharLink.prototype.addSearchLinkRegister = function(i, face_args, char_args, command_name) {
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を追加する [イベントから]
//=============================================================================
DataCharLink.prototype.AddLinkFromEvent = function(face_args, char_args) {
  var keys = this.CreateFaceAndCharKeys(face_args, char_args);
  var face_key = keys[0];
  var char_key = keys[1];
  this.AddLinkFromNote(face_key, char_key);
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を削除する [イベントから]
//=============================================================================
DataCharLink.prototype.RemoveLinkFromEvent = function(face_args) {
  var face_key = this.CreateKeys(face_args);
  this.AddLinkFromNote(face_key, null, true);
};
//=============================================================================
// ○ DataCharLink 顔グラフィックと歩行グラフィックのキーを作成する
//=============================================================================
DataCharLink.prototype.CreateFaceAndCharKeys = function(face_args, char_args) {
  var result_args = [];
  if(Array.isArray(face_args) === false){ A1Common.SplitArgs(face_args, result_args, TO_INT) }
  var face_key = this.CreateKeys(result_args.length > 0 ? result_args : face_args);
  var result_args = [];
  if(Array.isArray(char_args) === false){ A1Common.SplitArgs(char_args, result_args, TO_INT) }
  var char_key = this.CreateKeys(result_args.length > 0 ? result_args : char_args);
  return [face_key, char_key];
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を追加する [メモから]
//=============================================================================
DataCharLink.prototype.AddLinkFromNote = function(face_key, char_key, remove = false) {
  for(var i = 0; i < face_key.length; i++){
    if(remove === false) { this.AddLink(face_key, char_key) };
    if(remove === true)  { this.RemoveLink(face_key) };
  }
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を追加する
//=============================================================================
DataCharLink.prototype.AddLink = function(face_key, char_key) {
  if(this._linkChar[face_key] === void 0){ this._linkChar[face_key] = char_key };
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク先を解除する
//=============================================================================
DataCharLink.prototype.RemoveLink = function(face_key) {
  if(this._linkChar[face_key] !== void 0){
    delete this._linkChar[face_key]
    this._removeChar.push(face_key);
  }
};
//=============================================================================
// ○ DataCharLink 歩行グラフィック解除済の顔グラフィックを取得する
//=============================================================================
DataCharLink.prototype.RemoveChar = function(face_key) {
  return this._removeChar;
};
//=============================================================================
// ○ DataCharLink 歩行グラフィック解除済の顔グラフィックをクリアする
//=============================================================================
DataCharLink.prototype.clearRemoveChar = function() {
  this._removeChar = [];
};
//=============================================================================
// ○ DataCharLink 歩行グラフィックのリンク名称
//=============================================================================
DataCharLink.prototype.LinkChar = function(face_key) {
  return this._linkChar[face_key];
};
//=============================================================================
// ■ Window_PopupMessage
//=============================================================================
function Window_PopupMessage() {
  this.initialize.apply(this, arguments);
};
//=============================================================================
// ○ Window_PopupMessage 継承元設定
//=============================================================================
Window_PopupMessage.prototype = Object.create(Window_Base.prototype);
Window_PopupMessage.prototype.constructor = Window_PopupMessage;
//=============================================================================
// ○ Window_PopupMessage オブジェクト初期化
//=============================================================================
Window_PopupMessage.prototype.initialize = function(LinkEvent, messageWindow) {
  this._messageWindow = messageWindow;
  this._linkEvent   = LinkEvent;
  this._windowWidth = Graphics.boxWidth;
  this.createPopupSplite();
  var x      = this.windowX();
  var y      = this.windowY();
  var width  = this.windowWidth();
  var height = this.windowHeight();
  Window_Base.prototype.initialize.call(this, x, y, width, height);
  this._positionType = 2;
  this._popupType    = 0;
  this.move(x, y, 0, height);
  this.openness = 0;
  this.setupPopupSplite();
};
//=============================================================================
// ○ Window_PopupMessage 吹き出しのヒレをセットアップ
//=============================================================================
Window_PopupMessage.prototype.setupPopupSplite = function() {
  var key = [this._positionType === 0 ? 0 : 1, 0];
  this._popupSplite = new Sprite(this._popupBitmap[key]);
  this.addChild(this._popupSplite);
};
//=============================================================================
// ○ Window_PopupMessage 吹き出しのヒレを作成
//=============================================================================
Window_PopupMessage.prototype.createPopupSplite = function() {
  this._popupSplite = null;
  this._popupBitmap = {};
  this.createBltBitmap(0 , 0);
  this.createBltBitmap(1 , 0);
  this.createBltBitmap(0 , 1);
  this.createBltBitmap(1 , 1);
};
//=============================================================================
// ○ Window_PopupMessage 吹き出しのヒレ用Bitmapを作成
//=============================================================================
Window_PopupMessage.prototype.createBltBitmap = function(positionType, popupType) {
  var key = [positionType, popupType];
  var tempBitmap         = ImageManager.loadSystem('Window_Popup');
  var bitmapWidth        = tempBitmap.width  / 2;
  var bitmapHeight       = tempBitmap.height / 2;
  this._popupBitmap[key] = new Bitmap(bitmapWidth, bitmapHeight);
  var x = positionType === 0 ? 0 : bitmapWidth;
  var y = popupType    === 0 ? 0 : bitmapHeight;
  this._popupBitmap[key].blt(tempBitmap, x, y, bitmapWidth, bitmapHeight, 0, 0);
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウの幅
//=============================================================================
Window_PopupMessage.prototype.windowWidth = function() {
  return this._windowWidth;
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウの幅を設定
//=============================================================================
Window_PopupMessage.prototype.setWindowWidth = function(value) {
  this._windowWidth = value + 144 + this.standardPadding() * 4;
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウの高さ
//=============================================================================
Window_PopupMessage.prototype.windowHeight = function() {
  return this.fittingHeight(4);
};
//=============================================================================
// ○ Window_PopupMessage ポップアップタイプの設定
//=============================================================================
Window_PopupMessage.prototype.setPopupType = function(value) {
  this._popupType = value;
};
//=============================================================================
// ○ Window_PopupMessage フレーム更新
//=============================================================================
Window_PopupMessage.prototype.update = function() {
  Window_Base.prototype.update.call(this);
  var x = this.windowX();
  var y = this.windowY();
  this.opacity = this._linkEvent.opacity();
  this.contentsOpacity = this.opacity;
  this.move(x, y, this.windowWidth(), this.windowHeight());
  this.movePopupSplite();
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウのx座標
//=============================================================================
Window_PopupMessage.prototype.windowX = function() {
  var x = this._linkEvent.screenX() - 96 + A1PlugInParams.PopupWindow.RevisionPosX;
  var moveX = 0;
  if(x + this.width > Graphics.boxWidth){
    moveX = x - (Graphics.boxWidth - this.width);
    x -= moveX;
  }
  if(x < 0){
    moveX = x;
    x = 0;
  }
  if(this._popupSplite) { this._popupSplite.x = 96 + moveX + A1PlugInParams.PopupWindow.RevisionPopPosX }
  return x;
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウのy座標
//=============================================================================
Window_PopupMessage.prototype.windowY = function() {
  var y;
  if(this._positionType === 0) { y = this._linkEvent.screenY() - this.height - 80 + A1PlugInParams.PopupWindow.RevisionUpPosY}
  if(this._positionType > 0)   { y = this._linkEvent.screenY() + 32  + A1PlugInParams.PopupWindow.RevisionBottomPosY}
  return y;
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウの位置タイプ設定
//=============================================================================
Window_PopupMessage.prototype.setPositionType = function(value) {
  var key = [value === 0 ? 0 : 1, this._popupType];
  this._popupSplite.bitmap = this._popupBitmap[key];
  this._positionType = value;
};
//=============================================================================
// ○ Window_PopupMessage ヒレの移動
//=============================================================================
Window_PopupMessage.prototype.movePopupSplite = function() {
  if(this._positionType === 0) { this._popupSplite.y = this.height - 4 + A1PlugInParams.PopupWindow.RevisionPopUpPosY}
  if(this._positionType > 0)   { this._popupSplite.y = 0 - this._popupSplite.height + 4 + A1PlugInParams.PopupWindow.RevisionPopBottomPosY}
  this._popupSplite.opacity = Math.min(this.opacity, this.openness);
};
//=============================================================================
// ○ Window_PopupMessage 顔グラフィックの描画
//=============================================================================
Window_PopupMessage.prototype.drawMessageFace = function() {
  this.drawFace($gameMessage.faceName(), $gameMessage.faceIndex(), 0, 0);
  ImageManager.releaseReservation(this._imageReservationId);
};
//=============================================================================
// ○ Window_PopupMessage 内容のクリア
//=============================================================================
Window_PopupMessage.prototype.clear = function() {
  this.contents.clear();
};
//=============================================================================
// ○ Window_PopupMessage エスケープ文字の処理
//=============================================================================
Window_PopupMessage.prototype.processEscapeCharacter = function(code, textState) {
  this._messageWindow.processEscapeCharacter(code, textState);
};
//=============================================================================
// ■ function(_global)
//=============================================================================
(function(_global) {
//=============================================================================
// ☆ DataManager ゲームオブジェクトの作成
//=============================================================================
var A1PopupMessageDM_createGameObjects = DataManager.createGameObjects;
DataManager.createGameObjects = function() {
  var ret = A1PopupMessageDM_createGameObjects.apply(this);
  if($dataCharLink === null){ $dataCharLink = new DataCharLink() }
  return ret;
};
//=============================================================================
// ○ Window_Message エスケープ文字の変換
//=============================================================================
Window_Message.prototype.convertEscapeCharacters = function(text) {
  text = Window_Base.prototype.convertEscapeCharacters.call(this, text);
  var kp_exp = /\x1bKP/gi;
  var popupType = (text.match(kp_exp) || []).length > 0 ? 1 : 0
  text = text.replace(kp_exp, this.setPopupType(popupType));
  return text;
};
//=============================================================================
// ○ Window_Base ポップアップタイプの設定
//=============================================================================
Window_Message.prototype.setPopupType = function(value) {
  this._popupType = value;
  return "";
};
//=============================================================================
// ☆ Window_Message メンバ変数の初期化
//=============================================================================
var A1PopupMessageWM_initMembers = Window_Message.prototype.initMembers;
Window_Message.prototype.initMembers = function() {
  this._popupWindows = {};
  this._linkEvent    = {};
  this._linkFaceName = {};
  this._linkEventID = null;
  var ret = A1PopupMessageWM_initMembers.apply(this);
  return ret;
};
//=============================================================================
// ☆ Window_Message メッセージの開始
//=============================================================================
var A1PopupMessageWM_startMessage = Window_Message.prototype.startMessage;
Window_Message.prototype.startMessage = function() {
  this._linkEventID = null;
  this._popupType   = 0;
  this.SearchLinkEvent();
  var ret = A1PopupMessageWM_startMessage.apply(this);
  return ret;
};
//=============================================================================
// ☆ Window_Message 新しいメッセージの作成
//=============================================================================
var A1PopupMessageWM_newPage = Window_Message.prototype.newPage;
Window_Message.prototype.newPage = function(textState) {
  if(this._linkEventID && $gameSystem.usePopupMessage() === true){
    this._popupWindows[this._linkEventID].clear();
    this.setPopupWidth(this._linkEventID);
  }
  var ret = A1PopupMessageWM_newPage.apply(this, arguments);
  return ret;
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージウィンドウ幅の設定
//=============================================================================
Window_Message.prototype.setPopupWidth = function(LinkEventID) {
  var fontFace  = this.contents.fontFace
  var fontSize  = this.contents.fontSize
  var textWidth = A1Common.CalcTextWidthInEscape(this._textState.text, fontFace, fontSize);
  this._popupWindows[LinkEventID].setWindowWidth(textWidth);
  this._popupWindows[LinkEventID].setPopupType(this._popupType);
};
//=============================================================================
// ☆ Window_Message 表示位置の更新
//=============================================================================
var A1PopupMessageWM_updatePlacement = Window_Message.prototype.updatePlacement;
Window_Message.prototype.updatePlacement = function() {
  var ret = A1PopupMessageWM_updatePlacement.apply(this);
  if(this._linkEventID && $gameSystem.usePopupMessage() === true){
    this.setPopupWindow(this._linkEventID)
  }
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージウィンドウの設定
//=============================================================================
Window_Message.prototype.setPopupWindow = function(LinkEventID) {
  this._popupWindows[LinkEventID].setPositionType(this._positionType);
  this._popupWindows[LinkEventID].open();
};
//=============================================================================
// ☆ Window_Message 顔グラフィックの描画
//=============================================================================
var A1PopupMessageWM_drawMessageFace = Window_Message.prototype.drawMessageFace;
Window_Message.prototype.drawMessageFace = function() {
  var ret = A1PopupMessageWM_drawMessageFace.apply(this);
  if(this._linkEventID && $gameSystem.usePopupMessage() === true){
    this._popupWindows[this._linkEventID].drawMessageFace();
  }
  return ret;
};
//=============================================================================
// ○ Window_Message リンクするイベントの検索
//=============================================================================
Window_Message.prototype.SearchLinkEvent = function() {
  var ret;
  var LinkEvent = this.FaceLinkEvent();
  if(LinkEvent && $gameSystem.usePopupMessage() === true){
    this.openness = 0;
    this.ShowPopupMessage(LinkEvent);
    return true;
  }
  return false;
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージの表示
//=============================================================================
Window_Message.prototype.ShowPopupMessage = function(LinkEvent) {
  this.CreatePopupMessage(LinkEvent)
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージの作成
//=============================================================================
Window_Message.prototype.CreatePopupMessage = function(LinkEvent) {
  var LinkEventID = LinkEvent === $gamePlayer ? -1 : LinkEvent.eventId();
  this._linkEventID = LinkEventID;
  if((LinkEventID in this._popupWindows) === false){
    this._popupWindows[LinkEventID] = new Window_PopupMessage(LinkEvent, this);
    SceneManager.sceneAddWindow(this._popupWindows[LinkEventID]);
  }
};
//=============================================================================
// ○ Window_Message 文字の処理
//=============================================================================
Window_Message.prototype.processCharacter = function(textState) {
  if(this._linkEventID  && $gameSystem.usePopupMessage() === true){
    this._popupWindows[this._linkEventID].processCharacter(textState)
  }
  else {
    Window_Base.prototype.processCharacter.call(this, textState)
  }
};
//=============================================================================
// ○ Window_Message 顔グラフィックとリンクしている歩行イベントの取得
//=============================================================================
Window_Message.prototype.FaceLinkEvent = function() {
  var ret;
  var TempEventID = $gameTemp.tempPopupID();
  if(TempEventID){
    ret = $gameMap.event(TempEventID);
    $gameTemp.setTempPopupID(null);
  }
  else {
    var events = $gameMap.events();
    var key  = [$gameMessage.faceName()];
    var char = $dataCharLink.LinkChar(key);
    if(char === void 0){
      var key = [$gameMessage.faceName(), $gameMessage.faceIndex()];
      char = $dataCharLink.LinkChar(key);
        }
    if(char === void 0){ return false };
    ret = this.LinkEventSearch($gamePlayer, char, key);
    if(ret){ return ret }
    for(var i = 0; i < events.length; i++){
      ret = this.LinkEventSearch(events, char, key);
      if(ret){ break }
        }
  }
  return ret;
};
//=============================================================================
// ○ Window_Message 顔グラフィックとリンクしている歩行イベントの検索
//=============================================================================
Window_Message.prototype.LinkEventSearch = function(event, char, key) {
  var ret;
  var event_key = [event.characterName(), event.characterIndex()];
  var result = char.find(item => JSON.stringify(item) === JSON.stringify(event_key));
  if(result !== void 0){
    ret = event;
    var eventID = event === $gamePlayer ? -1 : ret.eventId();
    this._linkEvent[eventID] = key;
  }
  return ret;
};
//=============================================================================
// ☆ Window_Message ウィンドウのオープン
//=============================================================================
var A1PopupMessageWM_open = Window_Message.prototype.open;
Window_Message.prototype.open = function() {
  if(this._linkEventID){ return false }
  var ret = A1PopupMessageWM_open.apply(this, arguments);
  return ret;
};
//=============================================================================
// ☆ Window_Message メッセージの終端
//=============================================================================
var A1PopupMessageWM_terminateMessage = Window_Message.prototype.terminateMessage;
Window_Message.prototype.terminateMessage = function() {
  for(key in this._popupWindows){ this._popupWindows[key].pause = false }
  var ret = A1PopupMessageWM_terminateMessage.apply(this);
  return ret;
};
//=============================================================================
// ☆ Window_Message 一時停止
//=============================================================================
var A1PopupMessageWM_startPause = Window_Message.prototype.startPause;
Window_Message.prototype.startPause = function() {
  var ret = A1PopupMessageWM_startPause.apply(this, arguments);
  if(this._linkEventID){ this._popupWindows[this._linkEventID].pause = true }
  return ret;
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージの強制クローズ
//=============================================================================
Window_Message.prototype.forceClosePopup = function() {
  for(key in this._popupWindows){ this._popupWindows[key].close() }
  $gameSystem.setUsePopupMessage(null);
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ
//=============================================================================
Window_Message.prototype.closePopup = function(id, remove = false) {
  if(id in this._popupWindows){ this._popupWindows[id].close() }
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [ID指定]
//=============================================================================
Window_Message.prototype.closePopupID = function() {
  var list = $gameTemp.closePopupID();
  for(var i = 0; i < list.length; i++){ this.closePopup(list) }
  $gameTemp.setClosePopupID(null);
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [ALL]
//=============================================================================
Window_Message.prototype.closePopupAll = function() {
  for(var id in this._popupWindows){ this._popupWindows[id].close() }
  $gameTemp.setClosePopupAll(null);
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [歩行グラフィック指定]
//=============================================================================
Window_Message.prototype.closePopupChar = function() {
  var list = A1Common.makeFaceCharKeys($gameTemp.closePopupChar())
  var events = $gameMap.events();
  for(var i = 0; i < list.length; i++){
    var info = list;
    var key = info.length === 1 ? [info[0]] : [info[0], info[1]];
    for(var j = -1; j < events.length; j++){
      var event   = j === -1 ? $gamePlayer : events[j];
      var eventID = j === -1 ? -1 : events[j].eventId();
      if(event.characterName() !== key[0]){ continue }
      if(key.length === 1 || key[1] === event.characterIndex()){ this.closePopup(eventID) }
        }
  }
  $gameTemp.setClosePopupChar(null);
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [顔グラフィック指定]
//=============================================================================
Window_Message.prototype.closePopupFace = function() {
  this.closePopupForFace(A1Common.makeFaceCharKeys($gameTemp.closePopupFace()));
  $gameTemp.setClosePopupFace(null);
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [歩行リンク解除]
//=============================================================================
Window_Message.prototype.closePopupRemoveFace = function() {
  this.closePopupForFace(A1Common.makeFaceCharKeys($dataCharLink.RemoveChar()), true);
  $dataCharLink.clearRemoveChar();
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [顔グラフィック指定]
//=============================================================================
Window_Message.prototype.closePopupForFace = function(list, remove = false) {
  for(var i = 0; i < list.length; i++){
    var info = list;
    var key = info.length === 1 ? [info[0]] : [info[0], info[1]];
    for(eventID in this._linkEvent){
      if(JSON.stringify(this._linkEvent[eventID]) === JSON.stringify(key)){ this.closePopup(eventID, remove) }
    }
  }
};
//=============================================================================
// ☆ Window_Message フレーム更新
//=============================================================================
var A1PopupMessageWM_update = Window_Message.prototype.update;
Window_Message.prototype.update = function() {
  if($gameSystem.usePopupMessage() === false){ this.forceClosePopup() }
  if($gameTemp.closePopupID().length > 0)  { this.closePopupID() }
  if($gameTemp.closePopupChar().length > 0){ this.closePopupChar() }
  if($gameTemp.closePopupFace().length > 0){ this.closePopupFace() }
  if($dataCharLink.RemoveChar().length > 0){ this.closePopupRemoveFace() }
  if($gameTemp.closePopupAll() === true)   { this.closePopupAll() }
  var ret = A1PopupMessageWM_update.apply(this);
  return ret;
};
//=============================================================================
// ☆ Scene_Boot システムイメージのロード
//=============================================================================
var A1PopupMessageSB_loadSystemImages = Scene_Boot.loadSystemImages;
Scene_Boot.loadSystemImages = function() {
  var ret = A1PopupMessageSB_loadSystemImages.apply(this);
  ImageManager.reserveSystem('Window_Popup');
  return ret;
};
//=============================================================================
// ☆ Game_Temp オブジェクト初期化
//=============================================================================
var A1_PopupMessageGT_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function() {
  var ret = A1_PopupMessageGT_initialize.apply(this);
  this._tempPopupID    = null;
  this._closePopupID   = [];
  this._closePopupChar = [];
  this._closePopupFace = [];
  this._closePopupName = [];
  this._closePopupAll  = null;
  return ret;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージ全クローズの取得
//=============================================================================
Game_Temp.prototype.closePopupAll = function(value) {
  return this._closePopupAll;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージ全クローズの設定
//=============================================================================
Game_Temp.prototype.setClosePopupAll = function(value) {
  this._closePopupAll = value;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズイベントの取得
//=============================================================================
Game_Temp.prototype.closePopupID = function() {
  return this._closePopupID;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズイベントの設定
//=============================================================================
Game_Temp.prototype.setClosePopupID = function(value) {
  this.addClosePopup(value, this._closePopupID);
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ歩行グラフィックの取得
//=============================================================================
Game_Temp.prototype.closePopupChar = function() {
  return this._closePopupChar;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ歩行グラフィックの設定
//=============================================================================
Game_Temp.prototype.setClosePopupChar = function(value) {
  this.addClosePopup(value, this._closePopupChar);
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ顔グラフィックの取得
//=============================================================================
Game_Temp.prototype.closePopupFace = function() {
  return this._closePopupFace;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ顔グラフィックの設定
//=============================================================================
Game_Temp.prototype.setClosePopupFace = function(value) {
  this.addClosePopup(value, this._closePopupFace);
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズの追加
//=============================================================================
Game_Temp.prototype.addClosePopup = function(value, target) {
  if(value === null){
    target.splice(0);
  }
  else if(Array.isArray(value) === true){
    for(var i = 0; i < value.length; i++){ target.push(value) }
  }
  else{
    target.push(value);
  }
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージ一時表示イベントの取得
//=============================================================================
Game_Temp.prototype.tempPopupID = function() {
  return this._tempPopupID;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージ一時表示イベントの設定
//=============================================================================
Game_Temp.prototype.setTempPopupID = function(value) {
  this._tempPopupID = value;
};
//=============================================================================
// ☆ Game_System オブジェクト初期化
//=============================================================================
var A1_PopupMessageGS_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
  var ret = A1_PopupMessageGS_initialize.apply(this);
  this._usePopupMessage   = null;
  return ret;
};
//=============================================================================
// ○ Game_System 吹き出しメッセージ使用状態の取得
//=============================================================================
Game_System.prototype.usePopupMessage = function() {
  return this._usePopupMessage;
};
//=============================================================================
// ○ Game_System 吹き出しメッセージ使用状態の設定
//=============================================================================
Game_System.prototype.setUsePopupMessage = function(value) {
  this._usePopupMessage = value;
};
//=============================================================================
// ☆ A1Common プラグインコマンドの定義
//=============================================================================
var A1_PopupMessage_define_command = A1Common.prototype.define_command;
A1Common.prototype.define_command = function() {
  var command = A1_PopupMessage_define_command.apply(this);
  command["吹き出しメッセージ"] = Game_Interpreter.A1_PopupMessage.bind(this);
  command["吹き出しクローズ"]   = Game_Interpreter.A1_ClosePopupMessage.bind(this);
  command["歩行グラフィック登録"]   = Game_Interpreter.A1_RegisterCharLink.bind(this);
  command["歩行グラフィック解除"]   = Game_Interpreter.A1_RemoveCharLink.bind(this);
  return command;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [吹き出しメッセージ]
//=============================================================================
Game_Interpreter.A1_PopupMessage = function(args) {
  if     (args[0] === "on" )    { $gameSystem.setUsePopupMessage(true)  }
  else if(args[0] === "off")    { $gameSystem.setUsePopupMessage(false) }
  else{ $gameTemp.setTempPopupID(parseInt(args[0])) }
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [吹き出しクローズ]
//=============================================================================
Game_Interpreter.A1_ClosePopupMessage = function(args) {
  if     (args[0] === "ID" )  { $gameTemp.setClosePopupID(parseInt(args[1]))  }
  else if(args[0] === "歩行") { $gameTemp.setClosePopupChar(args[1]) }
  else if(args[0] === "顔")   { $gameTemp.setClosePopupFace(args[1]) }
  else { $gameTemp.setClosePopupAll(true) }
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [歩行グラフィック登録]
//=============================================================================
Game_Interpreter.A1_RegisterCharLink = function(args) {
  $dataCharLink.AddLinkFromEvent(args[0], args[1]);
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [歩行グラフィック解除]
//=============================================================================
Game_Interpreter.A1_RemoveCharLink = function(args) {
  $dataCharLink.RemoveLinkFromEvent(args[0]);
  return true;
};
//=============================================================================
// ■ ネームウィンドウ使用時の処理
//=============================================================================
var nameWindow = null;
if($A1PlugInImpoted["ネームウィンドウ"]){
  nameWindow = A1Common.VersionCheck("吹き出しメッセージ", 1.10, "ネームウィンドウ");
}
if(nameWindow){
//=============================================================================
// ☆ Window_FaceName オブジェクト初期化
//=============================================================================
var A1PopupMessageWithNameWindowWFN_initialize = Window_FaceName.prototype.initialize;
Window_FaceName.prototype.initialize = function(FaceName, x, y) {
  var ret = A1PopupMessageWithNameWindowWFN_initialize.apply(this, arguments);
  this._parentWindow = null;
  return ret;
};
//=============================================================================
// ○ Window_FaceName フレーム更新
//=============================================================================
var A1PopupMessageWithNameWindowWFN_update = Window_FaceName.prototype.update;
Window_FaceName.prototype.update = function() {
  var ret = A1PopupMessageWithNameWindowWFN_update.apply(this);
  this._splite.opacity = Math.min(this.openness, this.opacity);
  return ret;
};
//=============================================================================
// ○ Window_FaceName 親ウインドウの設定
//=============================================================================
Window_FaceName.prototype.setParentWindow = function(window) {
  this._parentWindow = window;
};
//=============================================================================
// ○ Window_FaceName 親ウインドウの取得
//=============================================================================
Window_FaceName.prototype.parentWindow = function() {
  return this._parentWindow;
};
//=============================================================================
// ☆ Window_PopupMessage オブジェクト初期化
//=============================================================================
var A1PopupMessageWithNameWindowWPM_initialize = Window_PopupMessage.prototype.initialize;
Window_PopupMessage.prototype.initialize = function(LinkEvent) {
  var ret = A1PopupMessageWithNameWindowWPM_initialize.apply(this, arguments);
  this._linkNameWindow = null;
  return ret;
};
//=============================================================================
// ○ Window_PopupMessage リンクするネームウィンドウの取得
//=============================================================================
Window_PopupMessage.prototype.linkNameWindow = function() {
  return this._linkNameWindow;
};
//=============================================================================
// ○ Window_PopupMessage リンクするネームウィンドウの設定
//=============================================================================
Window_PopupMessage.prototype.setLinkNameWindow = function(window) {
  this._linkNameWindow = window;
  if(window){
    window.setParentWindow(this);
    SceneManager.sceneForwardWindow(this, window);
  }
};
//=============================================================================
// ☆ Window_PopupMessage フレーム更新
//=============================================================================
var A1PopupMessageWithNameWindowWPM_update = Window_PopupMessage.prototype.update;
Window_PopupMessage.prototype.update = function() {
  var ret = A1PopupMessageWithNameWindowWPM_update.apply(this);
  this.moveNameWindow();
  return ret;
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウのオープン
//=============================================================================
Window_PopupMessage.prototype.open = function() {
  Window_Base.prototype.open.call(this);
  if($gameSystem.usePopupMessage() !== true){ return false }
  var window = this._linkNameWindow;
  if(window && $gameSystem.ShowNameWindow() === true){ window.open() };
};
//=============================================================================
// ○ Window_PopupMessage ウィンドウのクローズ
//=============================================================================
Window_PopupMessage.prototype.close = function() {
  Window_Base.prototype.close.call(this);
  if($gameSystem.usePopupMessage() !== true){ return false }
  var window = this._linkNameWindow;
  if(window && $gameSystem.ShowNameWindow() === true){ window.close() };
};
//=============================================================================
// ○ Window_PopupMessage ネームウィンドウの移動
//=============================================================================
Window_PopupMessage.prototype.moveNameWindow = function() {
  if($gameSystem.usePopupMessage() !== true){ return false }
  var x = this.nameWindowX();
  var y = this.nameWindowY();
  var window = this._linkNameWindow;
  if(window){
    window.move(x, y, window.windowWidth(), window.windowHeight())
    window.opacity = this.opacity;
  }
};
//=============================================================================
// ○ Window_PopupMessage ネームウィンドウのx座標
//=============================================================================
Window_PopupMessage.prototype.nameWindowX = function() {
  return this.x + 72;
};
//=============================================================================
// ○ Window_PopupMessage ネームウィンドウのy座標
//=============================================================================
Window_PopupMessage.prototype.nameWindowY = function() {
  var y;
  if(this._positionType > 0)  { y = this.y + this.height - this.lineHeight() / 2}
  if(this._positionType === 0){ y = this.y - this.lineHeight() / 2}
  return y;
};
//=============================================================================
// ☆ Window_Message 吹き出しメッセージの作成
//=============================================================================
var A1PopupMessageWithNameWindowWM_CreatePopupMessage = Window_Message.prototype.CreatePopupMessage;
Window_Message.prototype.CreatePopupMessage = function(LinkEvent) {
  var ret = A1PopupMessageWithNameWindowWM_CreatePopupMessage.apply(this, arguments);
  return ret;
};
//=============================================================================
// ☆ Window_Message 顔グラフィックとリンクしている名前の検索
//=============================================================================
var A1PopupMessageWithNameWindowWM_FindLinkName = Window_Message.prototype.FindLinkName;
Window_Message.prototype.FindLinkName = function(key) {
  var ret = A1PopupMessageWithNameWindowWM_FindLinkName.apply(this, arguments);
  if(ret !== void 0){ this._linkFaceName[key] = ret }
  return ret;
};
//=============================================================================
// ☆ Window_Message 吹き出しメッセージウィンドウの設定
//=============================================================================
var A1PopupMessageWithNameWindowWPM_setPopupWindow = Window_Message.prototype.setPopupWindow;
Window_Message.prototype.setPopupWindow = function(LinkEventID) {
  if($gameSystem.usePopupMessage() === true){
    var eventKey = this._linkEvent[LinkEventID];
    var LinkName = this._linkFaceName[eventKey];
    this._popupWindows[LinkEventID].setLinkNameWindow(this._nameWindow[LinkName]);
  }
  var ret = A1PopupMessageWithNameWindowWPM_setPopupWindow.apply(this, arguments);
  return ret;
};
//=============================================================================
// ☆ Window_Message ネームウィンドウの移動
//=============================================================================
var A1PopupMessageWithNameWindowWPM_moveNameWindow = Window_Message.prototype.moveNameWindow;
Window_Message.prototype.moveNameWindow = function(window, key) {
  if(window.parentWindow()){ return false }
  var ret = A1PopupMessageWithNameWindowWPM_moveNameWindow.apply(this, arguments);
  return ret;
};
//=============================================================================
// ☆ Window_Message ネームウィンドウのオープン
//=============================================================================
var A1PopupMessageWithNameWindowWM_OpenNameWindow = Window_Message.prototype.OpenNameWindow;
Window_Message.prototype.OpenNameWindow = function() {
  if($gameSystem.usePopupMessage() !== true){
    return A1PopupMessageWithNameWindowWM_OpenNameWindow.apply(this);
  }
  if($gameSystem.ShowNameWindow() === false){ return false }
  for(var key in this._nameWindow){
    if(this._nameWindow[key].parentWindow()) { continue }
    this._nameWindow[key].open();
  };
};
//=============================================================================
// ☆ Window_Message ネームウィンドウのクローズ
//=============================================================================
var A1PopupMessageWithNameWindowWM_CloseNameWindow = Window_Message.prototype.CloseNameWindow;
Window_Message.prototype.CloseNameWindow = function() {
  if($gameSystem.usePopupMessage() !== true){
    return A1PopupMessageWithNameWindowWM_CloseNameWindow.apply(this);
  }
  for(var key in this._nameWindow){
    if(this._nameWindow[key].parentWindow()){ continue }
    this._nameWindow[key].close();
  }
};
//=============================================================================
// ☆ Window_Message ネームウィンドウの表示
//=============================================================================
var A1PopupMessageWithNameWindowWM_ShowNameWindow = Window_Message.prototype.ShowNameWindow;
Window_Message.prototype.ShowNameWindow = function(LinkName) {
  if($gameSystem.usePopupMessage() !== true){
    return A1PopupMessageWithNameWindowWM_ShowNameWindow.apply(this, arguments);
  }
  for(var key in this._nameWindow){
    if(this._nameWindow[key].parentWindow()){ continue }
    this._nameWindow[key].visible = false;
  }
  if(LinkName in this._nameWindow){ this._nameWindow[LinkName].visible = true  }
  else{ this.CreateNameWindow(LinkName) }
};
//=============================================================================
// ☆ Window_Message 吹き出しメッセージの強制クローズ
//=============================================================================
var A1PopupMessageWithNameWindowWM_forceClosePopup = Window_Message.prototype.forceClosePopup;
Window_Message.prototype.forceClosePopup = function() {
  for(var key in this._popupWindows){ this._popupWindows[key].setLinkNameWindow(null) }
  for(var key in this._nameWindow)  {
    this._nameWindow[key].setParentWindow(null);
    this._nameWindow[key].openness = 0;
  }
  var ret = A1PopupMessageWithNameWindowWM_forceClosePopup.apply(this);
  return ret;
};
//=============================================================================
// ☆ Window_Message フレーム更新
//=============================================================================
var A1PopupMessageWithNameWindowWM_update = Window_Message.prototype.update;
Window_Message.prototype.update = function() {
  var ret = A1PopupMessageWithNameWindowWM_update.apply(this);
  if($gameTemp.closePopupName().length > 0){ this.closePopupName() }
  return ret;
};
//=============================================================================
// ○ Window_Message 吹き出しメッセージのクローズ [名前指定]
//=============================================================================
Window_Message.prototype.closePopupName = function() {
  var list = $gameTemp.closePopupName();
  for(var i = 0; i < list.length; i++){
    var linkFace = this._linkFaceName;
    for(var key in linkFace){
      if(linkFace[key] !== list){ continue }
      var linkEvent = this._linkEvent;
      for(eventID in linkEvent){
        var result = A1Common.SplitArgs(key, [], TO_INT);
        if(JSON.stringify(linkEvent[eventID]) === JSON.stringify(result[0])){ this.closePopup(eventID) }
      }
        }
  }
  $gameTemp.setClosePopupName(null);
};
//=============================================================================
// ☆ Window_Message 吹き出しメッセージのクローズ
//=============================================================================
var A1PopupMessageWithNameWindowWM_closePopup = Window_Message.prototype.closePopup;
Window_Message.prototype.closePopup = function(id, remove = false) {
  if(remove === true){
    var popupWindow = this._popupWindows[id];
    if(popupWindow){
      var nameWindow = popupWindow.linkNameWindow();
      if(nameWindow){
        nameWindow.setParentWindow(null);
          nameWindow.openness = 0;
      }
      popupWindow.setLinkNameWindow(null);
    }
  }
  var ret = A1PopupMessageWithNameWindowWM_closePopup.apply(this, arguments);
  return ret;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ名称の取得
//=============================================================================
Game_Temp.prototype.closePopupName = function() {
  return this._closePopupName;
};
//=============================================================================
// ○ Game_Temp 吹き出しメッセージクローズ名称の設定
//=============================================================================
Game_Temp.prototype.setClosePopupName = function(value) {
  this.addClosePopup(value, this._closePopupName);
};
//=============================================================================
// ☆ Game_Interpreter プラグインコマンド [吹き出しクローズ]
//=============================================================================
var A1PopupMessageWithNameWindowGI_A1_ClosePopupMessage = Game_Interpreter.A1_ClosePopupMessage;
Game_Interpreter.A1_ClosePopupMessage = function(args) {
  var ret = A1PopupMessageWithNameWindowGI_A1_ClosePopupMessage.apply(this, arguments);
  if(args[0] === "名前") { $gameTemp.setClosePopupName(args[1]) }
  return ret;
};
//=============================================================================
// ■ ネームウィンドウ使用時の処理 ここまで
//=============================================================================
}
})(this);
}[/pre]



必要ファイル:Window_Popup.png(MV版)

Window_Popup.png

Window_Popup.png


必要素材
放入 /img/system  底下

----------------------------------------
插件命令 使用
  1. 吹き出しメッセージ on
复制代码

沒有反應

指定事件
  1. 吹き出しメッセージ eventID
复制代码

ID輸入之後也是沒有反應

所以想請問一下
這個插件腳本要怎麼使用

----------------------------------------
另外
同一個作者的
對話名稱顯示插件
可以跟氣泡對話況併行使用
也麻煩講解一下使用方法

網址
http://a1tktk.web.fc2.com/mv_plugin_page/name_window.html

[pre lang="javascript" file="A1NameWindow.js"]//=============================================================================
// A1NameWindow.js
//=============================================================================
/*:
* @plugindesc メッセージウィンドウにネームウィンドウを表示します。
* @author ツクール工房A1(仮)
*
* @help データベース「アクター」の「メモ」及びプラグインコマンドで表示名を設定します。
*
* 必要プラグイン
*   ツクール工房A1(仮)共通スクリプト Ver1.10 以上
*
* データベース「アクター」の「メモ」に記載
*   <顔グラフィック FaceName>
*   <顔グラフィック FaceName,FaceIndex,FaceIndex,FaceIndex...>
*
*   <顔グラフィック FaceName>
*    顔グラフィックとアクター名を紐づけます。
*    FaceName で指定した顔グラフィックファイル全てに同じ表示名を適用します。
*
*   <顔グラフィック FaceName,FaceIndex,,FaceIndex,FaceIndex...>
*    顔グラフィックとアクター名を紐づけます。
*    FaceName で指定した顔グラフィックファイルの内
*    続けて列挙する FaceIndex を表示名に適用します。
*
* プラグインコマンド:
*   ネームウィンドウ on|off
*   ネームウィンドウ 表示名
*   顔グラフィック登録 表示名 FaceName
*   顔グラフィック登録 表示名 FaceName,FaceIndex,FaceIndex,FaceIndex...
*   ネームウィンドウ非表示登録 表示名
*   ネームウィンドウ非表示登録 表示名
*
*   顔グラフィック解除 FaceName
*   顔グラフィック解除 FaceName,FaceIndex,FaceIndex,FaceIndex...
*
*   ネームウィンドウ on|off
*    ネームウィンドウ表示の on off を切り替えます。
*
*   ネームウィンドウ 表示名
*    次のメッセージの際に、表示名でネームウィンドウを表示します。
*
*   顔グラフィック登録 表示名 FaceName
*    顔グラフィックと表示名を紐づけます。
*    FaceName で指定した顔グラフィックファイル全てに同じ表示名を適用します。
*
*   顔グラフィック登録 表示名 FaceName,FaceIndex,FaceIndex,FaceIndex...
*    顔グラフィックと表示名を紐づけます。
*    FaceName で指定した顔グラフィックファイルの内
*    続けて列挙する FaceIndex を表示名に適用します。
*
*   顔グラフィック解除 FaceName
*    「顔グラフィック登録 表示名 FaceName」にて登録した紐づけを解除します。
*
*   顔グラフィック解除 表示名 FaceName,FaceIndex,FaceIndex,FaceIndex...
*    顔グラフィックと表示名の紐づけを解除します。。
*    FaceName で指定した顔グラフィックファイルの内
*    続けて列挙する FaceIndex の表示名を解除します。
*    「顔グラフィック登録 表示名 FaceName」にて登録した紐づけは解除できません。
*
*   ネームウィンドウ非表示登録 表示名
*    表示名 で指定したネームウィンドウを表示させなくします。
*
*   ネームウィンドウ非表示解除 表示名
*    表示名 で指定したネームウィンドウの非表示登録を解除します。
*
* 「登録用コモンイベント番号」に設定したコモンイベントに
*  上記プラグインコマンドを記載することで、ゲーム起動時に顔グラフィック登録します。
*
*  データベース「アクター」の「メモ」やプラグインコマンドにて登録していないアクターは
*  データベース「アクター」で設定しているFaceName FaceIndexにてアクター名を紐づけます。
*
* @param 登録用コモンイベント番号
* @desc 顔グラフィック登録用のコモンイベント番号
* デフォルト: 0
* @default 0
*
* @param フォント名
* @desc ネームウィンドウのフォント名
* デフォルト: GameFont
* @default GameFont
*
* @param フォントサイズ
* @desc ネームウィンドウのフォントサイズ
* デフォルト: 28
* @default 28
*
*/
//=============================================================================
// 更新履歴  2020/06/28 Ver1.00 リリース
//           2020/06/29 Ver1.01 ウィンドウ表示位置に対応
//           2020/06/29 Ver1.10 プラグインコマンド「ネームウィンドウ非表示登録」追加
//           2020/06/29 Ver1.10 プラグインコマンド「ネームウィンドウ非表示解除」追加
//           2020/06/29 Ver1.10 吹き出しメッセージ対応
//=============================================================================
// ■ バージョン定義
//=============================================================================
$A1PlugInImpoted["ネームウィンドウ"] = 1.10;
//=============================================================================
// ■ バージョンチェック
//=============================================================================
var common = A1Common.VersionCheck("ネームウィンドウ", 1.10);
if (common){
//=============================================================================
// ■ プラグイン設定値
//=============================================================================
A1PlugInParams.NameWindow = {};
A1PlugInParams.NameWindow.Parameters = PluginManager.parameters('A1NameWindow');
A1PlugInParams.NameWindow.RegisterCommonEventID = Number(A1PlugInParams.NameWindow.Parameters["登録用コモンイベント番号"]) || 0;
A1PlugInParams.NameWindow.FontFace = String(A1PlugInParams.NameWindow.Parameters["フォント名"])     || "GameFont";
A1PlugInParams.NameWindow.FontSize = Number(A1PlugInParams.NameWindow.Parameters["フォントサイズ"]) || 28;
//=============================================================================
// ■ グローバル変数定義
//=============================================================================
var $dataFaceLink = null;
//=============================================================================
// ■ DataFaceLink
//=============================================================================
function DataFaceLink() {
  this.initialize.apply(this, arguments);
};
//=============================================================================
// ○ DataFaceLink オブジェクト初期化
//=============================================================================
DataFaceLink.prototype.initialize = function() {
  this._linkFace  = {};
  this._linkIndex = -1;
  this.SearchLinkActor();
  this.SearchLinkRegister();
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を探す [アクター]
//=============================================================================
DataFaceLink.prototype.SearchLinkActor = function() {
  for(var i = 1; i < $dataActors.length; i++){
    var key;
    var note_data  = A1Common.ReadNote("顔グラフィック", $dataActors.note, TO_INT);
    var actor_name = $dataActors.name;
    if(note_data === false){
      key = [$dataActors.faceName, $dataActors.faceIndex];
      this.AddLink(key, actor_name);
        }
    else{
      this.AddLinkFromNote(note_data, actor_name);
        }
  }
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を探す [レジスター]
//=============================================================================
DataFaceLink.prototype.SearchLinkRegister = function() {
  var commonEventID = A1PlugInParams.NameWindow.RegisterCommonEventID;
  if(commonEventID === 0){ return false }
  var commonEvent = $dataCommonEvents[commonEventID];
  var list = commonEvent.list;
  for(var i = 0; i < list.length; i++){
    var line = list;
    if (line.code !== 356){ continue };
    var params = line.parameters;
    var args = params[0].split(" ");
    var command = args.shift();
    if (command !== "顔グラフィック登録") { continue };
    var result_args = A1Common.SplitArgs(args[1], [], TO_INT);
    this.AddLinkFromNote(result_args[0], args[0]);
  }
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を追加する [イベントから]
//=============================================================================
DataFaceLink.prototype.AddLinkFromEvent = function(args, name) {
  this.AddLinkFromNote(args, name);
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を追加する [メモから]
//=============================================================================
DataFaceLink.prototype.AddLinkFromNote = function(note_data, actor_name, remove = false) {
  if(Array.isArray(note_data[0])){
    for(var i = 0; i < note_data.length; i++){
      this.AddLinkFromNote(note_data, actor_name);
        }
  }
  else{
    if(Array.isArray(note_data)){
      var face_name = note_data.shift();
      for(var i = 0; i < note_data.length; i++){
        var key = [face_name, note_data];
        if(remove === false) { this.AddLink(key, actor_name) };
        if(remove === true)  { this.RemoveLink(key) };
      }
    }
    else {
      if(remove === false) { this.AddLink(note_data, actor_name) };
      if(remove === true)  { this.RemoveLink(note_data) };
        }
  }
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を追加する
//=============================================================================
DataFaceLink.prototype.AddLink = function(key, actor_name) {
  if(this._linkFace[key] === void 0){ this._linkFace[key] = actor_name };
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を解除する
//=============================================================================
DataFaceLink.prototype.RemoveLink = function(key) {
  if(this._linkFace[key] !== void 0){ delete this._linkFace[key] };
};
//=============================================================================
// ○ DataFaceLink 顔グラフィックのリンク先を解除する [イベントから]
//=============================================================================
DataFaceLink.prototype.RemoveLinkFromEvent = function(args) {
  this.AddLinkFromNote(args, null, true);
};
//=============================================================================
// ○ 顔グラフィックのリンク名称
//=============================================================================
DataFaceLink.prototype.LinkName = function(key) {
  return this._linkFace[key];
};
//=============================================================================
// ■ Window_FaceName
//=============================================================================
function Window_FaceName() {
  this.initialize.apply(this, arguments);
};
//=============================================================================
// ○ Window_FaceName 継承元設定
//=============================================================================
Window_FaceName.prototype = Object.create(Window_Base.prototype);
Window_FaceName.prototype.constructor = Window_FaceName;
//=============================================================================
// ○ Window_FaceName オブジェクト初期化
//=============================================================================
Window_FaceName.prototype.initialize = function(FaceName, x, y) {
  this._faceName    = FaceName;
  this._splite      = this.CreateTextSplite(FaceName);
  this._nameWidth   = this._splite.width;
  this._nameHeight  = this._splite.height;
  var width  = this.windowWidth();
  var height = this.windowHeight();
  this._splite.x    = (width - this._splite.width) / 2
  Window_Base.prototype.initialize.call(this, x, y, width, height);
  this.addChild(this._splite);
  this.openness = 0;
  this._splite.opacity = 0;
};
//=============================================================================
// ○ Window_FaceName 名前のスプライトを作成する
//=============================================================================
Window_FaceName.prototype.CreateTextSplite = function(FaceName) {
  var FontFace = A1PlugInParams.NameWindow.FontFace;
  var FontSize = A1PlugInParams.NameWindow.FontSize;
  var height   = this.lineHeight();
  return A1Common.CreateTextSplite(FaceName, FontFace, FontSize, height, "center");
};
//=============================================================================
// ○ Window_FaceName ウィンドウの幅
//=============================================================================
Window_FaceName.prototype.windowWidth = function() {
    return this._nameWidth + 16;
};
//=============================================================================
// ○ Window_FaceName ウィンドウの高さ
//=============================================================================
Window_FaceName.prototype.windowHeight = function() {
    return this._nameHeight;
};
//=============================================================================
// ○ Window_FaceName マスク用の矩形調整
//=============================================================================
Window_FaceName.prototype.maskRect = function(rect) {
  rect.width  = 0;
  rect.height = 0;
};
//=============================================================================
// ○ Window_FaceName フレーム更新
//=============================================================================
Window_FaceName.prototype.update = function() {
  Window_Base.prototype.update.call(this);
  this._splite.opacity = this.openness;
};
//=============================================================================
// ○ Window_FaceName ウィンドウのオープン
//=============================================================================
Window_FaceName.prototype.open = function() {
  var result = $gameSystem.hiddenNameWindow().find(item => item === this._faceName);
  if(result === this._faceName){ this.close() }
  else{ Window_Base.prototype.open.call(this) }
};
//=============================================================================
// ■ function(_global)
//=============================================================================
(function(_global) {
//=============================================================================
// ☆ DataManager ゲームオブジェクトの作成
//=============================================================================
var A1NameWindowDM_createGameObjects = DataManager.createGameObjects;
DataManager.createGameObjects = function() {
  var ret = A1NameWindowDM_createGameObjects.apply(this);
  if($dataFaceLink === null){ $dataFaceLink = new DataFaceLink() }
  return ret;
};
//=============================================================================
// ☆ Window_Message メンバ変数の初期化
//=============================================================================
var A1NameWindowWM_initMembers = Window_Message.prototype.initMembers;
Window_Message.prototype.initMembers = function() {
  this.initNameWindowMembers();
  var ret = A1NameWindowWM_initMembers.apply(this);
  return ret;
};
//=============================================================================
// ○ Window_Message メンバ変数の初期化 [ネームウィンドウ]
//=============================================================================
Window_Message.prototype.initNameWindowMembers = function() {
  this._forwardLinkName  = null;
  this._nameWindow       = {};
};
//=============================================================================
// ☆ Window_Message 新しいメッセージの作成
//=============================================================================
var A1NameWindowWM_newPage = Window_Message.prototype.newPage;
Window_Message.prototype.newPage = function(textState) {
  var ret = A1NameWindowWM_newPage.apply(this, arguments);
  var LinkName = this.FaceLinkName();
  if(LinkName){
    if(LinkName !== this._forwardLinkName){ this.ShowNameWindow(LinkName) }
    this._forwardLinkName = LinkName;
  }
  else{
    this.CloseNameWindow();
  }
  return ret;
};
//=============================================================================
// ○ Window_Message ネームウィンドウのオープン
//=============================================================================
Window_Message.prototype.OpenNameWindow = function() {
  if($gameSystem.ShowNameWindow() === false){ return false }
  for(var key in this._nameWindow){ this._nameWindow[key].open() };
};
//=============================================================================
// ○ Window_Message ネームウィンドウのクローズ
//=============================================================================
Window_Message.prototype.CloseNameWindow = function() {
  for(var key in this._nameWindow){ this._nameWindow[key].close() }
};
//=============================================================================
// ○ Window_Message ネームウィンドウの強制クローズ
//=============================================================================
Window_Message.prototype.forceCloseNameWindow = function() {
  for(var key in this._nameWindow){ this._nameWindow[key].close() }
};
//=============================================================================
// ○ Window_Message ネームウィンドウの表示
//=============================================================================
Window_Message.prototype.ShowNameWindow = function(LinkName) {
  for(var key in this._nameWindow){ this._nameWindow[key].visible      = false }
  if(LinkName in this._nameWindow){ this._nameWindow[LinkName].visible = true  }
  else{ this.CreateNameWindow(LinkName) }
};
//=============================================================================
// ○ Window_Message ネームウィンドウの作成
//=============================================================================
Window_Message.prototype.CreateNameWindow = function(LinkName) {
  var x = this.nameWindowX();
  var y = this.nameWindowY();
  this._nameWindow[LinkName] = new Window_FaceName(LinkName, x, y);
  this.addChild(this._nameWindow[LinkName]);
  SceneManager.sceneAddWindow(this._nameWindow[LinkName]);
};
//=============================================================================
// ○ Window_Message 顔グラフィックとリンクしている名前の取得
//=============================================================================
Window_Message.prototype.FaceLinkName = function() {
  var ret;
  var tmpName = $gameTemp.TempShowName();
  if(tmpName){
    ret = tmpName;
  }
  else {
    var key = [$gameMessage.faceName()];
    ret = this.FindLinkName(key);
    if(ret === void 0){
      var key = [$gameMessage.faceName(), $gameMessage.faceIndex()];
      ret = this.FindLinkName(key);
        }
  }
  return ret;
};
//=============================================================================
// ○ Window_Message 顔グラフィックとリンクしている名前の検索
//=============================================================================
Window_Message.prototype.FindLinkName = function(key) {
  return $dataFaceLink.LinkName(key);
};
//=============================================================================
// ☆ Window_Message メッセージの終端
//=============================================================================
var A1NameWindowWM_terminateMessage = Window_Message.prototype.terminateMessage;
Window_Message.prototype.terminateMessage = function() {
  var ret = A1NameWindowWM_terminateMessage.apply(this);
  $gameTemp.setTempShowName(null);
  return ret;
};
//=============================================================================
// ○ Window_Message ウィンドウのオープン
//=============================================================================
Window_Message.prototype.open = function() {
  Window_Base.prototype.open.call(this);
  var LinkName = this.FaceLinkName();
  if(LinkName){ this.OpenNameWindow() };
};
//=============================================================================
// ○ Window_Message ウィンドウのクローズ
//=============================================================================
Window_Message.prototype.close = function() {
  Window_Base.prototype.close.call(this);
  this.CloseNameWindow();
};
//=============================================================================
// ☆ Window_Message フレーム更新
//=============================================================================
var A1NameWindowWM_update = Window_Message.prototype.update;
Window_Message.prototype.update = function() {
  var ret = A1NameWindowWM_update.apply(this);
  for(var key in this._nameWindow){ this.moveNameWindow(this._nameWindow[key], key) }
  if($gameSystem.ShowNameWindow() === false){
    this.forceCloseNameWindow();
    $gameSystem.setShowNameWindow(null);
  }
  return ret;
};
//=============================================================================
// ○ Window_Message ネームウィンドウの移動
//=============================================================================
Window_Message.prototype.moveNameWindow = function(window, key) {
  window.move(this.nameWindowX(key), this.nameWindowY(key), window.width, window.height)
};
//=============================================================================
// ○ Window_Message ネームウィンドウのx座標
//=============================================================================
Window_Message.prototype.nameWindowX = function(key) {
  return this.x + 72;
};
//=============================================================================
// ○ Window_Message ネームウィンドウのy座標
//=============================================================================
Window_Message.prototype.nameWindowY = function(key) {
  var y;
  if(this._positionType === 0){ y = this.y + this.height - this.lineHeight() / 2}
  if(this._positionType > 0)  { y = this.y - this.lineHeight() / 2}
  return y;
};
//=============================================================================
// ☆ Game_System オブジェクト初期化
//=============================================================================
var A1_NemeWindowGS_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
  var ret = A1_NemeWindowGS_initialize.apply(this);
  this._showNameWindow   = null;
  this._hiddenNameWindow = [];
  return ret;
};
//=============================================================================
// ○ Game_System ネームウィンドウ表示状態の取得
//=============================================================================
Game_System.prototype.ShowNameWindow = function() {
  return this._showNameWindow;
};
//=============================================================================
// ○ Game_System ネームウィンドウ表示状態の設定
//=============================================================================
Game_System.prototype.setShowNameWindow = function(value) {
  this._showNameWindow = value;
};
//=============================================================================
// ○ Game_System ネームウィンドウ非表示の取得
//=============================================================================
Game_System.prototype.hiddenNameWindow = function() {
  return this._hiddenNameWindow;
};
//=============================================================================
// ○ Game_System ネームウィンドウ非表示登録
//=============================================================================
Game_System.prototype.addHiddenNameWindow = function(name) {
  this._hiddenNameWindow.push(name);
};
//=============================================================================
// ○ Game_System ネームウィンドウ非表示解除
//=============================================================================
Game_System.prototype.removeHiddenNameWindow = function(name) {
  if(this._hiddenNameWindow(name) !== void 0){ delete this._hiddenNameWindow(name) }
};
//=============================================================================
// ☆ Game_Temp オブジェクト初期化
//=============================================================================
var A1_NemeWindowGT_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function() {
  var ret = A1_NemeWindowGT_initialize.apply(this);
  this._tempShowName  = null;
  return ret;
};
//=============================================================================
// ○ Game_Temp ネームウィンドウ一時表示名の取得
//=============================================================================
Game_Temp.prototype.TempShowName = function() {
  return this._tempShowName;
};
//=============================================================================
// ○ Game_Temp ネームウィンドウ一時表示名の設定
//=============================================================================
Game_Temp.prototype.setTempShowName = function(value) {
  this._tempShowName = value;
};
//=============================================================================
// ☆ A1Common プラグインコマンドの定義
//=============================================================================
var A1_NemeWindow_define_command = A1Common.prototype.define_command;
A1Common.prototype.define_command = function() {
  var command = A1_NemeWindow_define_command.apply(this);
  command["ネームウィンドウ"]           = Game_Interpreter.A1_NameWindow.bind(this);
  command["ネームウィンドウ非表示登録"] = Game_Interpreter.A1_AddHiddenNameWindow.bind(this);
  command["ネームウィンドウ非表示解除"] = Game_Interpreter.A1_RemoveHiddenNameWindow.bind(this);
  command["顔グラフィック登録"]         = Game_Interpreter.A1_RegisterNameLink.bind(this);
  command["顔グラフィック解除"]         = Game_Interpreter.A1_RemoveNameLink.bind(this);
  return command;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [ネームウィンドウ]
//=============================================================================
Game_Interpreter.A1_NameWindow = function(args) {
  if     (args[0] === "on" )    { $gameSystem.setShowNameWindow(true)  }
  else if(args[0] === "off")    { $gameSystem.setShowNameWindow(false) }
  else{ $gameTemp.setTempShowName(args[0]) }
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [ネームウィンドウ非表示登録]
//=============================================================================
Game_Interpreter.A1_AddHiddenNameWindow = function(args) {
  $gameSystem.addHiddenNameWindow(args[0]);
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [ネームウィンドウ非表示解除]
//=============================================================================
Game_Interpreter.A1_RemoveHiddenNameWindow = function(args) {
  $gameSystem.removeHiddenNameWindow(args[0]);
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [顔グラフィック登録]
//=============================================================================
Game_Interpreter.A1_RegisterNameLink = function(args) {
  $dataFaceLink.AddLinkFromEvent(args[1], args[0]);
  return true;
};
//=============================================================================
// ○ Game_Interpreter プラグインコマンド [顔グラフィック解除]
//=============================================================================
Game_Interpreter.A1_RemoveNameLink = function(args) {
  $dataFaceLink.RemoveLinkFromEvent(args[0]);
  return true;
};
})(this);
}
[/pre]


以上
還請幫忙解惑
如果可以 希望能有個DEMO 讓我參考參考
非常感謝
梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2023-1-9 20:55:39 | 显示全部楼层
[fold][pre lang="javascript"]//=============================================================================
// A1NameWindow.js
//=============================================================================
/*:
* @plugindesc 在消息窗口中顯示名稱窗口。
* @author Maker Studio A1(暫定)
 *
* @help 在數據庫“actor”的“memo”和插件命令中設置顯示名稱。
 *
* 需要的插件
* Maker Kobo A1(臨時)通用腳本Ver1.10或更高版本
 *
* 在數據庫“演員”的“註釋”中描述
* <人臉圖形 FaceName>
* <人臉圖形FaceName,FaceIndex,FaceIndex,FaceIndex...>
 *
* <人臉圖形 FaceName>
* 將面部圖形與演員姓名相關聯。
* 對 FaceName 指定的所有面部圖形文件應用相同的顯示名稱。
 *
* <人臉圖形FaceName,FaceIndex,,FaceIndex,FaceIndex...>
* 將面部圖形與演員姓名相關聯。
* FaceName指定的人臉圖形文件裡面
* 將連續枚舉的FaceIndex應用於顯示名稱。
 *
* 插件命令:
* 名稱窗口開|關
* 名稱窗口顯示名稱
* 面部圖形註冊顯示名稱 FaceName
* 人臉圖形註冊 顯示名稱 FaceName,FaceIndex,FaceIndex,FaceIndex...
* 名稱窗口不顯示註冊顯示名稱
* 名稱窗口不顯示註冊顯示名稱
 *
*解鎖面部圖形FaceName
* 解鎖人臉圖形 FaceName,FaceIndex,FaceIndex,FaceIndex...
 *
* 名稱窗口開|關
* 關閉名稱窗口顯示。
 *
* 名稱窗口顯示名稱
* 在下一條消息中顯示帶有顯示名稱的名稱窗口。
 *
* 面部圖形註冊顯示名稱 FaceName
* 將面部圖形與顯示名稱相關聯。
* 對 FaceName 指定的所有面部圖形文件應用相同的顯示名稱。
 *
* 人臉圖形註冊 顯示名稱 FaceName,FaceIndex,FaceIndex,FaceIndex...
* 將面部圖形與顯示名稱相關聯。
* FaceName指定的人臉圖形文件裡面
* 將連續枚舉的FaceIndex應用於顯示名稱。
 *
*解鎖面部圖形FaceName
* 釋放在“面部圖形註冊顯示名稱 FaceName”中註冊的鏈接。
 *
* 解鎖面部圖形顯示名稱 FaceName,FaceIndex,FaceIndex,FaceIndex ...
*取消鏈接面部圖形和顯示名稱。  .
* FaceName指定的人臉圖形文件裡面
* 釋放要連續枚舉的FaceIndex的顯示名稱。
*您無法取消使用“面部圖形註冊顯示名稱FaceName”註冊的關聯。
 *
* 名稱窗口不顯示註冊顯示名稱
* 隱藏顯示名稱指定的名稱窗口。
 *
*取消隱藏名稱窗口顯示名稱
*取消顯示名稱指定的名稱窗口的隱藏註冊。
 *
* 到“註冊公共事件編號”中設置的公共事件
* 通過輸入上述插件命令,遊戲開始時將註冊面部圖形。
 *
* 未在數據庫“Actor”或插件命令中用“Memo”註冊的Actor
* 將演員姓名與數據庫“演員”中設置的FaceName FaceIndex 關聯起來。 [/pre][/fold]
回复

使用道具 举报

梦石
0
星屑
5241
在线时间
760 小时
注册时间
2009-1-21
回帖
236
 楼主| 发表于 2023-1-9 22:07:37 | 显示全部楼层
本帖最后由 御之嵐 于 2023-1-30 11:08 编辑
tseyik 发表于 2023-1-9 20:55
[fold]//=============================================================================
// A1NameWind ...



先感謝你的翻譯
插件說明我大致上看得懂
但是用起來就是沒動作吶

像是基本的插件命令
  1. * プラグインコマンド:
  2. *   吹き出しメッセージ on|off
  3. *     吹き出しメッセージの使用状態を切り替えます。
  4. *
  5. *   吹き出しメッセージ eventID
  6. *     続くメッセージを eventID で指定したイベントの吹き出しとして表示します。
  7. *
  8. *   吹き出しクローズ
  9. *     現在表示している吹き出しメッセージを全てクローズします。
复制代码


這個區塊使用起來就沒動作
是哪裡沒設定嗎?
插件那邊我是都沒去動
數值都是 預設  0

至於下面可以一起併行使用的 對話名稱顯示插件
我也只有
  1. * プラグインコマンド:
  2. *   ネームウィンドウ 表示名
复制代码


這段插件命令有動作
其他也是無法動作
研究整下午
目前還是無解

回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2023-1-10 23:09:16 | 显示全部楼层
使用例・プラグインパラメータ.png
使用例・データベース「コモンイベント」.png
使用例・データベース「アクター」.png
使用例・イベントエディター.png
回复

使用道具 举报

梦石
0
星屑
5241
在线时间
760 小时
注册时间
2009-1-21
回帖
236
 楼主| 发表于 2023-1-11 12:57:58 | 显示全部楼层

非常感謝
原來前置作業的登錄都還要弄
想說直接就能用ON OFF 或者 指定事件ID使用的說
效果是有出來了,只是有夠難用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部