code:
//=============================================================================
// TitleCommandPosition.js
//=============================================================================

/*:
 * @plugindesc Changes the position of the title command window.
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc The offset value for the x coordinate.
 * @default 0
 *
 * @param Offset Y
 * @desc The offset value for the y coordinate.
 * @default 0
 *
 * @param Width
 * @desc The width of the command window.
 * @default 240
 *
 * @param Background
 * @desc The background type. 0: Normal, 1: Dim, 2: Transparent
 * @default 0
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc タイトルコマンドウィンドウの位置を変更します。
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc X座標のオフセット値です。
 * @default 0
 *
 * @param Offset Y
 * @desc Y座標のオフセット値です。
 * @default 0
 *
 * @param Width
 * @desc コマンドウィンドウの幅です。
 * @default 240
 *
 * @param Background
 * @desc 背景タイプです。0: 通常、1: 暗くする、2: 透明
 * @default 0
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function () {
  var parameters = PluginManager.parameters("TitleCommandPosition");
  var offsetX = Number(parameters["Offset X"] || 0);
  var offsetY = Number(parameters["Offset Y"] || 0);
  var width = Number(parameters["Width"] || 240);
  var background = Number(parameters["Background"] || 0);

  var _Window_TitleCommand_updatePlacement =
    Window_TitleCommand.prototype.updatePlacement;
  Window_TitleCommand.prototype.updatePlacement = function () {
    _Window_TitleCommand_updatePlacement.call(this);
    this.x += offsetX;
    this.y += offsetY;
    this.setBackgroundType(background);
  };

  Window_TitleCommand.prototype.windowWidth = function () {
    return width;
  };
})();

repo_name: Idkwtcm/violated

license: unknown


code:
//=============================================================================
// TitleImageChange.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.4.5 2020/03/01 進行度変数の値を戻したときに、リロードするまで元のタイトル画面に戻らない問題を修正
// 1.4.4 2018/07/11 1.4.3の修正でタイトル画面が変更される条件を満たした状態でセーブ後にタイトルに戻るで再表示しても変更が反映されない問題を修正
// 1.4.3 2018/06/09 セーブファイル数の上限を大きく増やしている場合にタイトル画面の表示が遅くなる現象を修正
// 1.4.2 2018/04/26 ニューゲーム開始後、一度もセーブしていないデータで進行状況のみをセーブするスクリプトを実行しても設定が反映されない問題を修正
// 1.4.1 2017/07/20 1.4.0で追加した機能で画像やBGMを4つ以上しないとタイトルがずれてしまう問題を修正
// 1.4.0 2017/02/12 画像やBGMを4つ以上指定できる機能を追加
// 1.3.1 2017/02/04 簡単な競合対策
// 1.3.0 2017/02/04 どのセーブデータの進行度を優先させるかを決めるための優先度変数を追加
// 1.2.1 2016/12/17 進行状況のみセーブのスクリプトを実行した場合に、グローバル情報が更新されてしまう問題を修正
// 1.2.0 2016/08/27 進行状況に応じてタイトルBGMを変更できる機能を追加
// 1.1.0 2016/06/05 セーブデータに歯抜けがある場合にエラーが発生する問題を修正
//                  進行状況のみをセーブする機能を追加
// 1.0.0 2016/04/06 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc タイトル画面変更プラグイン
 * @author トリアコンタン
 *
 * @param 進行度変数
 * @desc ゲームの進行度に対応する変数番号(1...)
 * @default 1
 * @type variable
 *
 * @param 優先度変数
 * @desc 複数のセーブデータが存在するとき、どのセーブデータの進行度を優先するかを決める変数番号(1...)
 * @default 0
 * @type variable
 *
 * @param タイトル1の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル1の画像が表示されます。
 * @default 1
 *
 * @param タイトル1の画像
 * @desc 進行度変数の値がタイトル1の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル1のBGM
 * @desc 進行度変数の値がタイトル1の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param タイトル2の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル2の画像が表示されます。
 * @default 2
 *
 * @param タイトル2の画像
 * @desc 進行度変数の値がタイトル2の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル2のBGM
 * @desc 進行度変数の値がタイトル2の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param タイトル3の進行度
 * @desc 進行度変数の値がこの値以上ならタイトル3の画像が表示されます。
 * @default 3
 *
 * @param タイトル3の画像
 * @desc 進行度変数の値がタイトル3の進行度以上のときに表示される画像(img/titles1)のファイル名です。
 * @default
 * @require 1
 * @dir img/titles1/
 * @type file
 *
 * @param タイトル3のBGM
 * @desc 進行度変数の値がタイトル3の進行度以上のときに演奏されるBGM(audio/bgm)のファイル名です。
 * @default
 * @require 1
 * @dir audio/bgm/
 * @type file
 *
 * @param 以降の進行度
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りで進行度を指定します。例(4,5,6)
 * @default
 *
 * @param 以降の画像
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りで画像(img/titles1)のファイル名を指定します。例(aaa,bbb,ccc)
 * @default
 *
 * @param 以降のBGM
 * @desc タイトルを4パターン以上使いたい場合はカンマ区切りでBGM(audio/bgm)のファイル名を指定します。例(aaa,bbb,ccc)
 * @default
 *
 * @help ゲームの進行度に応じてタイトル画面の画像およびBGMを変更します。
 * 進行度には任意の変数が指定でき、通常は全セーブデータの中の最大値が反映されます。
 *
 * ただし、優先度変数が別途指定されている場合は、その変数値が最も大きい
 * セーブデータの進行度をもとに画像及びBGMが決まります。
 *
 * タイトル画像は最大3つまで指定可能で、複数の条件を満たした場合は
 * 以下のような優先順位になります。
 *
 * 1. 4以降の画像及びBGM
 * 2. タイトル3の画像およびBGM
 * 3. タイトル2の画像およびBGM
 * 4. タイトル1の画像およびBGM
 * 5. デフォルトのタイトル画像およびBGM
 *
 * ゲームデータをセーブせず進行状況のみをセーブしたい場合は、
 * イベントコマンドの「スクリプト」から以下を実行してください。
 * DataManager.saveOnlyGradeVariable();
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function () {
  "use strict";
  var pluginName = "TitleImageChange";

  var getParamString = function (paramNames) {
    var value = getParamOther(paramNames);
    return value == null ? "" : value;
  };

  var getParamNumber = function (paramNames, min, max) {
    var value = getParamOther(paramNames);
    if (arguments.length < 2) min = -Infinity;
    if (arguments.length < 3) max = Infinity;
    return (parseInt(value, 10) || 0).clamp(min, max);
  };

  var getParamOther = function (paramNames) {
    if (!Array.isArray(paramNames)) paramNames = [paramNames];
    for (var i = 0; i < paramNames.length; i++) {
      var name = PluginManager.parameters(pluginName)[paramNames[i]];
      if (name) return name;
    }
    return null;
  };

  var getParamArrayString = function (paramNames) {
    var valuesText = getParamString(paramNames);
    if (!valuesText) return [];
    var values = valuesText.split(",");
    for (var i = 0; i < values.length; i++) {
      values[i] = values[i].trim();
    }
    return values;
  };

  var getParamArrayNumber = function (paramNames, min, max) {
    var values = getParamArrayString(paramNames);
    if (arguments.length < 2) min = -Infinity;
    if (arguments.length < 3) max = Infinity;
    for (var i = 0; i < values.length; i++) {
      if (!isNaN(parseInt(values[i], 10))) {
        values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
      } else {
        values.splice(i--, 1);
      }
    }
    return values;
  };

  //=============================================================================
  // パラメータの取得と整形
  //=============================================================================
  var paramGradeVariable = getParamNumber(
    ["GradeVariable", "進行度変数"],
    1,
    5000
  );
  var paramPriorityVariable = getParamNumber(
    ["PriorityVariable", "優先度変数"],
    0,
    5000
  );
  var paramTitleGrades = [];
  paramTitleGrades.push(getParamNumber(["TitleGrade1", "タイトル1の進行度"]));
  paramTitleGrades.push(getParamNumber(["TitleGrade2", "タイトル2の進行度"]));
  paramTitleGrades.push(getParamNumber(["TitleGrade3", "タイトル3の進行度"]));
  var paramTitleImages = [];
  paramTitleImages.push(getParamString(["TitleImage1", "タイトル1の画像"]));
  paramTitleImages.push(getParamString(["TitleImage2", "タイトル2の画像"]));
  paramTitleImages.push(getParamString(["TitleImage3", "タイトル3の画像"]));
  var paramTitleBgms = [];
  paramTitleBgms.push(getParamString(["TitleBgm1", "タイトル1のBGM"]));
  paramTitleBgms.push(getParamString(["TitleBgm2", "タイトル2のBGM"]));
  paramTitleBgms.push(getParamString(["TitleBgm3", "タイトル3のBGM"]));
  paramTitleGrades = paramTitleGrades
    .concat(getParamArrayNumber(["TitleGradeAfter", "以降の進行度"]))
    .reverse();
  paramTitleImages = paramTitleImages
    .concat(getParamArrayString(["TitleImageAfter", "以降の画像"]))
    .reverse();
  paramTitleBgms = paramTitleBgms
    .concat(getParamArrayString(["TitleBgmAfter", "以降のBGM"]))
    .reverse();

  //=============================================================================
  // DataManager
  //  ゲーム進行状況を保存します。
  //=============================================================================
  var _DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
  DataManager.makeSavefileInfo = function () {
    var info = _DataManager_makeSavefileInfo.apply(this, arguments);
    this.setGradeVariable(info);
    return info;
  };

  DataManager.getFirstPriorityGradeVariable = function () {
    this._loadGrade = true;
    var globalInfo = this.loadGlobalInfo().filter(function (data, id) {
      return this.isThisGameFile(id);
    }, this);
    this._loadGrade = false;
    var gradeVariable = 0;
    if (globalInfo && globalInfo.length > 0) {
      var sortedGlobalInfo = globalInfo
        .clone()
        .sort(this._compareOrderForGradeVariable);
      if (sortedGlobalInfo[0]) {
        gradeVariable = sortedGlobalInfo[0].gradeVariable || 0;
      }
    }
    return gradeVariable;
  };

  var _DataManager_loadGlobalInfo = DataManager.loadGlobalInfo;
  DataManager.loadGlobalInfo = function () {
    if (this._loadGrade) {
      if (!this._globalInfo) {
        try {
          var json = StorageManager.load(0);
          this._globalInfo = json ? JSON.parse(json) : [];
        } catch (e) {
          console.error(e);
          this._globalInfo = [];
        }
      }
      return this._globalInfo;
    } else {
      return _DataManager_loadGlobalInfo.apply(this, arguments);
    }
  };

  DataManager._compareOrderForGradeVariable = function (a, b) {
    if (!a) {
      return 1;
    } else if (!b) {
      return -1;
    } else if (
      a.priorityVariable !== b.priorityVariable &&
      paramPriorityVariable > 0
    ) {
      return (b.priorityVariable || 0) - (a.priorityVariable || 0);
    } else {
      return (b.gradeVariable || 0) - (a.gradeVariable || 0);
    }
  };

  DataManager.saveOnlyGradeVariable = function () {
    var saveFileId = this.lastAccessedSavefileId();
    var globalInfo = this.loadGlobalInfo() || [];
    if (globalInfo[saveFileId]) {
      this.setGradeVariable(globalInfo[saveFileId]);
    } else {
      globalInfo[saveFileId] = this.makeSavefileInfo();
    }
    this.saveGlobalInfo(globalInfo);
  };

  DataManager.setGradeVariable = function (info) {
    info.gradeVariable = $gameVariables.value(paramGradeVariable);
    if (paramPriorityVariable > 0) {
      info.priorityVariable = $gameVariables.value(paramPriorityVariable);
    }
  };

  var _DataManager_saveGlobalInfo = DataManager.saveGlobalInfo;
  DataManager.saveGlobalInfo = function (info) {
    _DataManager_saveGlobalInfo.apply(this, arguments);
    this._globalInfo = null;
  };

  //=============================================================================
  // Scene_Title
  //  進行状況が一定以上の場合、タイトル画像を差し替えます。
  //=============================================================================
  var _Scene_Title_initialize = Scene_Title.prototype.initialize;
  Scene_Title.prototype.initialize = function () {
    _Scene_Title_initialize.apply(this, arguments);
    this.changeTitleImage();
    this.changeTitleBgm();
  };

  Scene_Title.prototype.changeTitleImage = function () {
    var gradeVariable = DataManager.getFirstPriorityGradeVariable();
    if ($dataSystem.originalTitle1Name !== undefined) {
      $dataSystem.title1Name = $dataSystem.originalTitle1Name;
    }
    for (var i = 0, n = paramTitleGrades.length; i < n; i++) {
      if (paramTitleImages[i] && gradeVariable >= paramTitleGrades[i]) {
        $dataSystem.originalTitle1Name = $dataSystem.title1Name;
        $dataSystem.title1Name = paramTitleImages[i];
        break;
      }
    }
  };

  Scene_Title.prototype.changeTitleBgm = function () {
    var gradeVariable = DataManager.getFirstPriorityGradeVariable();
    if ($dataSystem.titleBgm.originalName !== undefined) {
      $dataSystem.titleBgm.name = $dataSystem.titleBgm.originalName;
    }
    for (var i = 0, n = paramTitleGrades.length; i < n; i++) {
      if (paramTitleBgms[i] && gradeVariable >= paramTitleGrades[i]) {
        $dataSystem.titleBgm.originalName = $dataSystem.titleBgm.name;
        $dataSystem.titleBgm.name = paramTitleBgms[i];
        break;
      }
    }
  };
})();


code:
/*---------------------------------------------------------------------------*
 * Torigoya_SaveCommand.js
 *---------------------------------------------------------------------------*
 * 2019/01/26 ru_shalm
 * http://torigoya.hatenadiary.jp/
 *---------------------------------------------------------------------------*/

/*:
 * @plugindesc Add save command in Plugin Command
 * @author ru_shalm
 *
 * @help
 *
 * Plugin Command:
 *   SaveCommand save 1       # save to slot 1
 *   SaveCommand save [1]     # save to slot variables[1]
 *   SaveCommand save last    # save to last accessed file
 *   SaveCommand load 1       # load from slot 1
 *   SaveCommand load [1]     # load from slot variables[1]
 *   SaveCommand load last    # load from last accessed file
 *   SaveCommand remove 1     # remove save file of slot 1
 *   SaveCommand remove [1]   # remove save file of slot variables[1]
 *   SaveCommand remove last  # remove last accessed file
 *
 * (default last accessed file: 1)
 */

/*:ja
 * @plugindesc プラグインコマンドからセーブを実行できるようにします。
 * @author ru_shalm
 *
 * @help
 * イベントコマンドの「プラグインコマンド」を使って、
 * イベント中に自動的にセーブを実行できるようになります。
 *
 * 例えばオートセーブのゲームなどが作れるようになります。
 *
 * ------------------------------------------------------------
 * ■ プラグインコマンド（セーブ系）
 * ------------------------------------------------------------
 *
 * ● スロット1にセーブを実行する
 * SaveCommand save 1
 *
 * ※ 1 の部分の数字を変えると別のスロットにセーブされます
 *
 * ● 変数[1]番のスロットにセーブを実行する
 * SaveCommand save [1]
 *
 * ● 前回ロード/セーブしたスロットにセーブを実行する
 * SaveCommand save last
 *
 * ※ ロード/セーブしていない場合はスロット1になります。
 *
 * ＜おまけ＞
 * セーブ時に以下のように末尾に「notime」をつけることで
 * セーブ時刻を更新せずにセーブすることができます。
 *
 * SaveCommand save 1 notime
 *
 * これによってロード画面でカーソル位置をオートセーブした場所ではなく
 * プレイヤーが自分でセーブしたファイルに合わせたままにすることができます。
 *
 * ------------------------------------------------------------
 * ■ プラグインコマンド（ロード系）
 * ------------------------------------------------------------
 * ＜注意＞
 * RPGツクールはイベントの途中で
 * セーブデータがロードされることが想定されていません。
 * そのためイベントのタイミングによっては、
 * ロード後のゲームの動作がおかしくなることがあります。
 *
 * ● スロット1からロードを実行する
 * SaveCommand load 1
 *
 * ● 変数[1]番のスロットからロードを実行する
 * SaveCommand load [1]
 *
 * ● 前回ロード/セーブしたスロットからロードを実行する
 * SaveCommand load last
 *
 * ※ ロード/セーブしていない場合はスロット1になります。
 *
 * ● 一番最後にセーブをしたスロットからロードを実行する
 * SaveCommand load latest
 *
 * ※ last ではなく latest です＞＜；
 *
 * ------------------------------------------------------------
 * ■ プラグインコマンド（削除系）
 * ------------------------------------------------------------
 * ＜注意＞
 * セーブデータを削除するコマンドなので取扱注意ですよ！
 *
 * ● スロット1を削除する
 * SaveCommand remove 1
 *
 * ● 変数[1]番のスロットを削除する
 * SaveCommand remove [1]
 *
 * ● 前回ロード/セーブしたスロットを削除する
 * SaveCommand remove last
 *
 * ※ ロード/セーブしていない場合はスロット1になります。
 */

(function (global) {
  "use strict";

  var SaveCommand = {
    name: "Torigoya_SaveCommand",
    settings: {},
    lastTimestamp: undefined,
    lastAccessId: undefined,
  };

  // -------------------------------------------------------------------------
  // SaveCommand

  /**
   * スロットID指定文字列からスロットIDを求める
   * @param {string} str
   * @returns {number}
   */
  SaveCommand.parseSlotId = function (str) {
    var slotId, matches;
    if ((matches = str.match(/^\[(\d+)\]$/))) {
      slotId = $gameVariables.value(~~matches[1]);
    } else if (str.match(/^\d+$/)) {
      slotId = ~~str;
    } else {
      switch (str) {
        case "last":
          slotId = DataManager.lastAccessedSavefileId();
          break;
        case "latest":
          slotId = DataManager.latestSavefileId();
          break;
      }
    }

    if (~~slotId <= 0) {
      throw "[Torigoya_SaveCommand.js] invalid SlotId: " + slotId;
    }

    return slotId;
  };

  /**
   * セーブ系コマンド処理の実行
   * @param {Game_Interpreter} gameInterpreter
   * @param {string} type
   * @param {number} slotId
   * @param {boolean} skipTimestamp
   */
  SaveCommand.runCommand = function (
    gameInterpreter,
    type,
    slotId,
    skipTimestamp
  ) {
    switch (type) {
      case "load":
        this.runCommandLoad(gameInterpreter, slotId);
        break;
      case "save":
        this.runCommandSave(gameInterpreter, slotId, skipTimestamp);
        break;
      case "remove":
        this.runCommandRemove(gameInterpreter, slotId);
        break;
    }
  };

  /**
   * ロード処理
   * @note ちょっと無理やり感があるのでイベントの組み方次第ではまずそう
   * @param {Game_Interpreter} gameInterpreter
   * @param {number} slotId
   */
  SaveCommand.runCommandLoad = function (gameInterpreter, slotId) {
    if (!DataManager.isThisGameFile(slotId)) return;

    var scene = SceneManager._scene;
    scene.fadeOutAll();
    DataManager.loadGame(slotId);
    gameInterpreter.command115(); // 今のイベントが継続しないように中断コマンドを実行する
    Scene_Load.prototype.reloadMapIfUpdated.apply(scene);
    SceneManager.goto(Scene_Map);
    $gameSystem.onAfterLoad();
  };

  /**
   * セーブ処理
   * @param {Game_Interpreter} gameInterpreter
   * @param {number} slotId
   * @param {boolean} skipTimestamp
   */
  SaveCommand.runCommandSave = function (
    gameInterpreter,
    slotId,
    skipTimestamp
  ) {
    if (skipTimestamp) {
      var info = DataManager.loadSavefileInfo(slotId);
      SaveCommand.lastTimestamp = info && info.timestamp ? info.timestamp : 0;
      SaveCommand.lastAccessId = DataManager.lastAccessedSavefileId();
    }

    // そのままセーブしてしまうと
    // ロード時にもプラグインコマンドが呼び出されてしまうため
    // 次の行のイベントコマンドから始まるように細工する
    var originalIndex = gameInterpreter._index;
    gameInterpreter._index++;

    $gameSystem.onBeforeSave();
    if (DataManager.saveGame(slotId) && StorageManager.cleanBackup) {
      StorageManager.cleanBackup(slotId);
    }

    if (skipTimestamp) {
      DataManager._lastAccessedId = SaveCommand.lastAccessId;
      SaveCommand.lastTimestamp = undefined;
      SaveCommand.lastAccessId = undefined;
    }

    // 細工した分を戻す
    gameInterpreter._index = originalIndex;
  };

  /**
   * セーブファイルの削除処理
   * @param {Game_Interpreter} _
   * @param {number} slotId
   */
  SaveCommand.runCommandRemove = function (_, slotId) {
    StorageManager.remove(slotId);
  };

  // -------------------------------------------------------------------------
  // alias

  var upstream_DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
  DataManager.makeSavefileInfo = function () {
    var info = upstream_DataManager_makeSavefileInfo.apply(this);
    if (SaveCommand.lastTimestamp !== undefined) {
      info.timestamp = SaveCommand.lastTimestamp;
    }
    return info;
  };

  var upstream_Game_Interpreter_pluginCommand =
    Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    if (command === "SaveCommand") {
      var type = (args[0] || "").trim();
      var slotId = SaveCommand.parseSlotId((args[1] || "").trim());
      var skipTimestamp = args[2] === "notime";
      SaveCommand.runCommand(this, type, slotId, skipTimestamp);
      return;
    }
    upstream_Game_Interpreter_pluginCommand.apply(this, arguments);
  };

  // -------------------------------------------------------------------------
  global.Torigoya = global.Torigoya || {};
  global.Torigoya.SaveCommand = SaveCommand;
})(window);


code:
/*============================================================================
 _TranslateStrings.js
----------------------------------------------------------------------------
 (C)2020 kiki
 This software is released under the MIT License.
 http://opensource.org/licenses/mit-license.php
----------------------------------------------------------------------------
 [Blog]   : http://sctibacromn.hatenablog.com/
============================================================================*/
/*:
 * @plugindesc 文章をトリガーとして、jsonから対応する文字列を言語別に取得するプラグインです。
 * @author kiki
 * @version 1.00
 *
 * @help
 * 言語を追加するときの手順
 * １．言語文字に追加したい言語を表す二文字を追記します。
 * 　　この二文字は、window.navigator.languageを実行したときに出力される
 * 　　文字のことです。
 * ２．このjsを開いてもらって、強制言語の設定に英語と同様に追記。
 * 　　ただしvalueの値を連番にする。
 *
 * @param 強制言語の設定
 * @desc テストするときの強制言語の設定
 * @type select
 * @option なし
 * @value 0
 * @option 英語
 * @value 1
 * @default 0
 *
 * @param データベースを言語別に使用する
 * @desc 日本語ではない場合、対応言語のデータベースをロードするかどうか
 * @type boolean
 * @default false
 *
 * @param 文章を言語別に取得する
 * @desc 文章を対応する言語で取得するか
 * @type boolean
 * @default false
 *
 * @param 言語データベース名
 * @type string[]
 * @desc 言語データベースを追加するときに追記する
 * @default ["", "", ""]
 *
 * @param 言語文字
 * @type string[]
 * @desc 他の言語を追加するときに追記する
 * 例えば中国語ならzh
 * @default ["en"]
 *
 * @param 言語jsonフォルダ名
 * @desc 言語jsonが入ったフォルダ名
 * @type string
 * @default Translate
 */

var $gameStrings = null; // ゲーム中恒常的に使う文言系。
var $gameMapText = null; // マップのセリフテキスト。
var $gameCommonText = null; // コモンイベントのセリフテキスト。
var $language = "ja"; // 言語設定
function GameStrings() {
  throw new Error("This is a static class");
}

(function () {
  var Lang = {};
  Lang.Param = PluginManager.parameters("TranslateStrings");
  Lang.forceLangIndex = Number(Lang.Param["強制言語の設定"]);
  Lang.reflectDataBase =
    Lang.Param["データベースを言語別に使用する"] == "true" ? true : false;
  Lang.reflectSentence =
    Lang.Param["文章を言語別に取得する"] == "true" ? true : false;
  Lang.dirName = Lang.Param["言語jsonフォルダ名"];
  Lang.nameList = JSON.parse(Lang.Param["言語文字"]);
  Lang.dbNameList = JSON.parse(Lang.Param["言語データベース名"]);
  Lang.useCommonId = 0;
  for (var i = 0; i < Lang.dbNameList.length; i++) {
    Lang.dbNameList[i] = Lang.dbNameList[i] + ".json";
  }
  // 言語設定を取得
  let lang =
    (window.navigator.languages && window.navigator.languages[0]) ||
    window.navigator.language ||
    window.navigator.userLanguage ||
    window.navigator.browserLanguage;
  $language = lang.slice(0, 2);
  if (Lang.forceLangIndex != 0) {
    Lang.forceLangIndex -= 1;
    $language = Lang.nameList[Lang.forceLangIndex];
  }
  console.log("言語：" + $language);

  // GameStrings.jsonロード
  DataManager._databaseFiles.push({
    name: "$gameStrings",
    src: Lang.dirName + "/GameStrings.json",
  });

  //-----------------------------------------------------------------------------
  // 対応言語のデータベースの反映
  //-----------------------------------------------------------------------------
  const _DataManager_loadDatabase = DataManager.loadDatabase;
  DataManager.loadDatabase = function () {
    if (!Lang.reflectDataBase) {
      _DataManager_loadDatabase.call(this);
      return;
    }
    var test = this.isBattleTest() || this.isEventTest();
    var prefix = test ? "Test_" : "";
    for (var i = 0; i < this._databaseFiles.length; i++) {
      var name = this._databaseFiles[i].name;
      var src = this._databaseFiles[i].src;
      // 日本語以外は外国語の該当フォルダ名から出力
      if (Lang.dbNameList.includes(src)) {
        if ($language != "ja") {
          src = $language + "/" + src;
        }
      }
      this.loadDataFile(name, prefix + src);
    }
    if (this.isEventTest()) {
      this.loadDataFile("$testEvent", prefix + "Event.json");
    }
  };
  //-----------------------------------------------------------------------------
  // イベントスタート時、マップＩｄ、イベントＩｄの記憶
  //-----------------------------------------------------------------------------
  const _Game_System_prototype_initialize = Game_System.prototype.initialize;
  Game_System.prototype.initialize = function () {
    _Game_System_prototype_initialize.apply(this, arguments);
    this._serifEventId;
  };
  Game_Event.prototype.start = function () {
    var list = this.list();
    if (list && list.length > 1) {
      this._starting = true;
      // $gameMap._mapIdは場所移動するとその場所のマップＩＤに変更される
      // 場所移動後もセリフを反映させるために記憶する
      // イベントIDを記憶するのも同じ理由
      $gameSystem._mapId = $gameMap._mapId;
      $gameSystem._eventId = this._eventId;
      if (this.isTriggerIn([0, 1, 2])) {
        this.lock();
      }
    }
  };
  //-----------------------------------------------------------------------------
  // 文章の言語表示
  //-----------------------------------------------------------------------------
  Game_Interpreter.prototype.command101 = function () {
    if (!$gameMessage.isBusy()) {
      $gameMessage.setFaceImage(this._params[0], this._params[1]);
      $gameMessage.setBackground(this._params[2]);
      $gameMessage.setPositionType(this._params[3]);
      let messages = "";
      while (this.nextEventCode() === 401) {
        // Text data
        this._index++;
        var message = this.currentCommand().parameters[0];
        messages += message + "\n";
      }
      if (messages != "") {
        // 後方改行削除
        messages = messages.replace(/\n$/g, "");
        // 一行ずつではなく、コマンド一つの文章と、言語jsonを比較する
        // 文章そのものをトリガーにすることによって、仕組みをシンプルにする
        // ただし同一イベント内でセリフが被ると、上のセリフが優先される
        let transMessages = GameStrings.GetText(messages, $gameSystem._eventId);
        let messageList = transMessages.split(/\r\n|\n/);
        messageList.forEach(function (message) {
          $gameMessage.add(message);
        });
      }
      switch (this.nextEventCode()) {
        case 102: // Show Choices
          this._index++;
          this.setupChoices(this.currentCommand().parameters);
          break;
        case 103: // Input Number
          this._index++;
          this.setupNumInput(this.currentCommand().parameters);
          break;
        case 104: // Select Item
          this._index++;
          this.setupItemChoice(this.currentCommand().parameters);
          break;
      }
      this._index++;
      this.setWaitMode("message");
    }
    return false;
  };
  Game_Interpreter.prototype.convertVariables = function (text) {
    text = text.replace(/\\/g, "\x1b");
    text = text.replace(/\x1b\x1b/g, "\\");
    text = text.replace(
      /\x1bV\[(\d+)\]/gi,
      function () {
        return $gameVariables.value(parseInt(arguments[1]));
      }.bind(this)
    );
    return text;
  };
  GameStrings.GetText = function (messages, eventId) {
    if ($language != "ja" && Lang.reflectSentence) {
      // マップイベントの文章を出力する（MapSerif.jsonから）
      for (let i = 0; i < $gameMapText.length; i++) {
        let text = $gameMapText[i];
        if (text.mapId != $gameSystem._mapId || text.eventId != eventId) {
          continue;
        }
        let transMessages = GameStrings.GetTransMessages(text, messages);
        if (transMessages != "") {
          return transMessages;
        }
      }
      // コモンイベントの文章を出力する（CommonSerif.jsonから)
      if (Lang.useCommonId == 0) {
        return messages;
      }
      for (var i = 0; i < $gameCommonText.length; i++) {
        let text = $gameCommonText[i];
        let commonId = Lang.useCommonId;
        if (text.commonId != commonId) {
          continue;
        }
        let transMessages = GameStrings.GetTransMessages(text, messages);
        if (transMessages != "") {
          return transMessages;
        }
      }
    }
    return messages;
  };

  GameStrings.GetTransMessages = function (text, messages) {
    let transMessages = "";
    if (text.ja == messages) {
      transMessages = GameStrings.GetMessage(text);
    }
    return transMessages;
  };
  //-----------------------------------------------------------------------------
  // セリフ以外の単語の言語表示
  //-----------------------------------------------------------------------------
  Window_MapName.prototype.refresh = function () {
    this.contents.clear();
    if ($gameMap.displayName()) {
      var width = this.contentsWidth();
      this.drawBackground(0, 0, width, this.lineHeight());
      this.drawText(
        GameStrings.GetString($gameMap.displayName()),
        0,
        0,
        width,
        "center"
      );
    }
  };

  Window_Command.prototype.drawItem = function (index) {
    var rect = this.itemRectForText(index);
    var align = this.itemTextAlign();
    this.resetTextColor();
    this.changePaintOpacity(this.isCommandEnabled(index));
    this.drawText(
      GameStrings.GetString(this.commandName(index)),
      rect.x,
      rect.y,
      rect.width,
      align
    );
  };
  GameStrings.GetString = function (message) {
    if ($gameStrings == null || $language == "ja") {
      return message;
    }
    let array = message.split(":");
    for (var i = 0; i < array.length; i++) {
      let word = array[i];
      if ($gameStrings[word]) {
        let text = $gameStrings[word];
        let transMessage = GameStrings.GetMessage(text);
        let regexp = new RegExp("(" + word + ")");
        message = message.replace(regexp, transMessage);
      }
    }
    return message;
  };

  GameStrings.GetMessage = function (text) {
    // $languageがenなら"text.en"として、出力する
    // 初めはスイッチ文で分けていたが、こっちのほうが変更容易なため
    return eval("text." + $language);
  };
  //-----------------------------------------------------------------------------
  // コモンイベントＩＤの記録
  //-----------------------------------------------------------------------------
  // ゲームスタート時、コモンイベントを全て調べて文章があるコモンイベントＩＤを抽出
  const _Scene_Boot_prototype_start = Scene_Boot.prototype.start;
  Scene_Boot.prototype.start = function () {
    _Scene_Boot_prototype_start.call(this);
    if (!Lang.reflectSentence) return;
    $gameCommonText._commonIdsHasSerif = [];
    for (let i = 1; i < $dataCommonEvents.length; i++) {
      let data = $dataCommonEvents[i];
      for (let i = 0; i < data.list.length; i++) {
        let code = data.list[i].code;
        if (code == 401) {
          $gameCommonText._commonIdsHasSerif.push(data.id);
          break;
        }
      }
    }
  };
  Game_Interpreter.prototype.command117 = function () {
    let commonId = this._params[0];
    var commonEvent = $dataCommonEvents[commonId];
    if (commonEvent) {
      var eventId = this.isOnCurrentMap() ? this._eventId : 0;
      // セリフを持つコモンイベントIDのみ記憶する
      if ($gameCommonText._commonIdsHasSerif.includes(commonId)) {
        Lang.useCommonId = commonId;
      }
      this.setupChild(commonEvent.list, eventId);
    }
    return true;
  };
  const _Game_Interpreter_prototype_terminate =
    Game_Interpreter.prototype.terminate;
  Game_Interpreter.prototype.terminate = function () {
    _Game_Interpreter_prototype_terminate.call(this);
    Lang.useCommonId = 0;
  };
  //-----------------------------------------------------------------------------
  // 言語jsonのロード
  //-----------------------------------------------------------------------------
  const _Scene_Boot_create = Scene_Boot.prototype.create;
  Scene_Boot.prototype.create = function () {
    if (Lang.reflectSentence) {
      DataManager.loadMapText();
      DataManager.loadCommonText();
    }
    _Scene_Boot_create.apply(this, arguments);
  };
  DataManager.loadMapText = function () {
    var filename = Lang.dirName + "/MapSerif.json";
    this.loadDataFile("$gameMapText", filename);
  };
  DataManager.loadCommonText = function () {
    var filename = Lang.dirName + "/CommonSerif.json";
    this.loadDataFile("$gameCommonText", filename);
  };
  DataManager.isMapLoaded = function () {
    this.checkError();
    if (!Lang.reflectSentence) {
      return !!$dataMap;
    }
    return !!$dataMap && !!$gameMapText && !!$gameCommonText;
  };
})();


code:
//=============================================================================
// VariableControlItem.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2020/11/23 変数操作の実行条件に実行者を指定できる機能を追加
// 1.1.1 2017/04/19 範囲が「なし」の場合も操作できるよう修正
// 1.1.0 2016/10/21 加算と代入を別々のメモ欄で設定できるよう変更
// 1.0.0 2016/10/21 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc VariableControlItemPlugin
 * @author triacontane
 *
 * @help アイテムもしくはスキルを使用し、かつ
 * 行動が成功した場合に、変数を操作できます。
 *
 * アイテムもしくはスキルのメモ欄に以下の通り指定してください。
 *
 * <VCI変数番号:3>  # 変数番号[3]に値を設定します。
 * <VCIVarNumber:3> # 同上
 * <VCI代入値:5>    # 指定した変数に値[5]を代入します。
 * <VCISetValue:5>  # 同上
 * <VCI加算値:5>    # 指定した変数に値[5]を加算します。
 * <VCIAddValue:5>  # 同上
 * <VCI実行者:actor>   # 実行者がアクターの場合のみ変数操作します。
 * <VCISubject:actor> # 同上
 * <VCI実行者:enemy>   # 実行者が敵キャラの場合のみ変数操作します。
 * <VCISubject:enemy> # 同上
 * ※加算値に負の値を指定すると減算になります。
 *
 * 設定値は、制御文字を適用した上でJavaScript計算式として評価されます。
 * たとえば、アイテムの使用で変数[1]に[5]を乗算したい場合は以下の通り設定します。
 * <VCI変数番号:1>
 * <VCI代入値:\v[1] * 5> # 変数[1]の値に[5]を乗算した結果を変数[1]に設定
 *
 * このプラグインにはプラグインコマンドはありません。
 */
/*:ja
 * @plugindesc 変数操作アイテムプラグイン
 * @author トリアコンタン
 *
 * @help アイテムもしくはスキルを使用し、かつ
 * 行動が成功した場合に、変数を操作できます。
 *
 * アイテムもしくはスキルのメモ欄に以下の通り指定してください。
 *
 * <VCI変数番号:3>  # 変数番号[3]に値を設定します。
 * <VCIVarNumber:3> # 同上
 * <VCI代入値:5>    # 指定した変数に値[5]を代入します。
 * <VCISetValue:5>  # 同上
 * <VCI加算値:5>    # 指定した変数に値[5]を加算します。
 * <VCIAddValue:5>  # 同上
 * <VCI実行者:actor>   # 実行者がアクターの場合のみ変数操作します。
 * <VCISubject:actor> # 同上
 * <VCI実行者:enemy>   # 実行者が敵キャラの場合のみ変数操作します。
 * <VCISubject:enemy> # 同上
 * ※加算値に負の値を指定すると減算になります。
 *
 * 設定値は、制御文字を適用した上でJavaScript計算式として評価されます。
 * たとえば、アイテムの使用で変数[1]に[5]を乗算したい場合は以下の通り設定します。
 * <VCI変数番号:1>
 * <VCI代入値:\v[1] * 5> # 変数[1]の値に[5]を乗算した結果を変数[1]に設定
 *
 * このプラグインにはプラグインコマンドはありません。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(function () {
  "use strict";
  var metaTagPrefix = "VCI";

  var getArgNumber = function (arg, min, max) {
    if (arguments.length < 2) min = -Infinity;
    if (arguments.length < 3) max = Infinity;
    return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max);
  };

  var getArgEval = function (arg, min, max) {
    if (arguments.length < 2) min = -Infinity;
    if (arguments.length < 3) max = Infinity;
    return (eval(convertEscapeCharacters(arg)) || 0).clamp(min, max);
  };

  var getMetaValue = function (object, name) {
    var metaTagName = metaTagPrefix + (name ? name : "");
    return object.meta.hasOwnProperty(metaTagName)
      ? object.meta[metaTagName]
      : undefined;
  };

  var getMetaValues = function (object, names) {
    if (!Array.isArray(names)) return getMetaValue(object, names);
    for (var i = 0, n = names.length; i < n; i++) {
      var value = getMetaValue(object, names[i]);
      if (value !== undefined) return value;
    }
    return undefined;
  };

  var convertEscapeCharacters = function (text) {
    if (text == null) text = "";
    var windowLayer = SceneManager._scene._windowLayer;
    return windowLayer
      ? windowLayer.children[0].convertEscapeCharacters(text)
      : text;
  };

  //=============================================================================
  // Game_Action
  //  行動が成功した場合、変数の操作を実行します。
  //=============================================================================
  var _Game_Action_applyItemUserEffect =
    Game_Action.prototype.applyItemUserEffect;
  Game_Action.prototype.applyItemUserEffect = function (target) {
    _Game_Action_applyItemUserEffect.apply(this, arguments);
    if (!this.isForNone()) {
      this.applyVariableControl();
    }
  };

  var _Game_Action_applyGlobal = Game_Action.prototype.applyGlobal;
  Game_Action.prototype.applyGlobal = function (target) {
    _Game_Action_applyGlobal.apply(this, arguments);
    if (this.isForNone()) {
      this.applyVariableControl();
    }
  };

  Game_Action.prototype.isForNone = function () {
    return this.checkItemScope([0]);
  };

  Game_Action.prototype.applyVariableControl = function () {
    if (!this.isVariableControlSubject()) {
      return;
    }
    var varNumberStr = getMetaValues(this.item(), ["VarNumber", "変数番号"]);
    if (varNumberStr) {
      var varNumber = getArgNumber(varNumberStr, 0);
      var setValue = getMetaValues(this.item(), ["SetValue", "代入値"]);
      if (setValue) {
        $gameVariables.setValue(varNumber, getArgEval(setValue));
        return;
      }
      var addValue = getMetaValues(this.item(), ["AddValue", "加算値"]);
      if (addValue) {
        var originalValue = $gameVariables.value(varNumber);
        $gameVariables.setValue(
          varNumber,
          originalValue + getArgEval(addValue)
        );
      }
    }
  };

  Game_Action.prototype.isVariableControlSubject = function () {
    var subject = getMetaValues(this.item(), ["Subject", "実行者"]);
    if (!subject || subject === true) {
      return true;
    }
    subject = subject.toLowerCase();
    if (subject === "actor" && this._subjectEnemyIndex >= 0) {
      return false;
    }
    if (subject === "enemy" && this._subjectActorId > 0) {
      return false;
    }
    return true;
  };
})();


code:
/******************************************************************************/
//
// Wataridori_AutoSave.js
//
/******************************************************************************/
//プラグインの説明
//「オートセーブプラグイン」
//
//更新履歴(ver1.0)
//
//2019_12_08   ver1.0リリース
//
/******************************************************************************/
//This software is released under the MIT License.
//http://opensource.org/licenses/mit-license.php
//
//Copyright(c) 渡り鳥の楽園
/******************************************************************************/

/*:
 * @plugindesc 「オートセーブプラグイン」
 * @author 「渡り鳥の楽園」飯尾隼人
 *
 * @param autoSaveNumber
 * @desc セーブIDを指定しない場合のオートセーブ先のセーブデータのID
 * @default 20
 * @type Number
 *
 * @param show_Console
 * @desc オートセーブに失敗した場合、コンソールに情報を表示させます。
 * @default true
 * @type boolean
 *
 * @help
 * 説明：
 * 本プラグインはオートセーブを提供します。
 * プラグインコマンドの引数にセーブデータの番号を設定することで、指定されたセーブデータにセーブを実行します。
 * 何も指定しない場合、いま現在のセーブデータにセーブを実行します。
 * セーブデータIdの数字を引数に下記関数からも実行可能です。
 * $gameSystem.autoSave(savefileId);
 *
 * Deny_AutoSaveのプラグインコマンドを実行することで、オートセーブの実行を不可能にできます。
 * 次にAllow_AutoSaveのプラグインコマンドを実行するまでオートセーブの実行を拒否し続けます。
 *
 * プラグインコマンド：AutoSave
 * 　最新アクセスのセーブデータにセーブを実行します。
 *
 * プラグインコマンド：AutoSave Number
 * 　Numberで指定された数字のセーブデータにセーブを実行します。
 * 　有効なセーブデータID以外（0を除く）を指定すると、プラグインパラメータで設定されているセーブデータにセーブを実行します。
 *
 * プラグインコマンド：Allow_AutoSave
 * 　オートセーブの実行を許可状態します。
 *
 * プラグインコマンド：Deny_AutoSave
 * 　オートセーブの実行を拒否状態にします。拒否状態ではプラグインコマンドでオートセーブを実行しても実施されません。
 *
 * 注意事項：
 * 本プラグインの使用によって生じたいかなる損失・損害、トラブルについても
 * 一切責任を負いかねます。
 *
 * 利用規約：
 * 無断で改変、再配布が可能で商用、１８禁利用等を問わずにご利用が可能です。
 * 改良して頂いた場合、報告して頂けると喜びます。
 *
 * 「渡り鳥の楽園」飯尾隼人
 * Twitter: https://twitter.com/wataridori_raku
 * Ci-en  : https://ci-en.dlsite.com/creator/2449
 */

(function () {
  /******************************************************************************/
  //
  // Plugin_Parameters
  //
  /******************************************************************************/

  var p_parameters = PluginManager.parameters("Wataridori_AutoSave");
  var p_autoSaveNumber = Number(p_parameters.autoSaveNumber) || 20;
  var p_show_Console = p_parameters.show_Console == "true";

  /******************************************************************************/
  //
  // PluginCommand
  //
  /******************************************************************************/

  var _Game_Interpreter_pluginCommand =
    Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command == "AutoSave") {
      $gameSystem.autoSave(args[0]);
    }
    if (command == "Allow_AutoSave") {
      $gameSystem.setAutoSaveStatement(true);
    }
    if (command == "Deny_AutoSave") {
      $gameSystem.setAutoSaveStatement(false);
    }
  };

  /******************************************************************************/
  //
  // Game_System
  //
  /******************************************************************************/

  var _Game_System_prototype_initialize = Game_System.prototype.initialize;
  Game_System.prototype.initialize = function () {
    _Game_System_prototype_initialize.call(this);
    this._autoSaveStatement = true;
  };

  Game_System.prototype.getAutoSaveStatement = function () {
    return this._autoSaveStatement;
  };

  Game_System.prototype.setAutoSaveStatement = function (bool) {
    this._autoSaveStatement = !!bool;
  };

  Game_System.prototype.autoSave = function (saveFileIdString) {
    if (this.getAutoSaveStatement()) {
      this.onBeforeSave();
      DataManager.autoSave(saveFileIdString);
    } else {
      if (p_show_Console) {
        console.log(
          "オートセーブの許可状態：" +
            this.getAutoSaveStatement() +
            " （true:実行可能です。false:実行できません。オートセーブを実行可能にするためにはAllow_AutoSaveをプラグインコマンドで実行してください）"
        );
      }
    }
  };

  /******************************************************************************/
  //
  // DataManager
  //
  /******************************************************************************/

  DataManager.getAutoSavefileId = function () {
    return p_autoSaveNumber;
  };

  DataManager.autoSave = function (saveFileId) {
    // オートセーブを実行するセーブデータIDの取得
    var _saveFileId = function (id) {
      if (typeof id === "undefined") {
        // 最後にアクセスしたセーブデータのID
        return this.lastAccessedSavefileId();
      } else if (
        !isNaN(Number(id)) && // idが数字か判定
        Number(id) > 0 && // idが0以上の数か判定
        this.maxSavefiles() >= Number(id) // idがセーブできる最大個数以下か判定
      ) {
        // 念のため指定された数字から小数点を切り捨てたId
        return Math.floor(Number(id));
      } else if (id == "auto") {
        // プラグインパラメータで設定したId
        return this.getAutoSavefileId();
      } else {
        // 不正な値の場合は、プラグインパラメータで設定したId
        console.log("不正なセーブデータIDです。");
        return this.getAutoSavefileId();
      }
    }.bind(this)(saveFileId);

    // セーブ実行
    if (DataManager.saveGame(_saveFileId)) {
      StorageManager.cleanBackup(_saveFileId);
      console.log("セーブに成功しました。セーブデータID:" + _saveFileId);
      return true;
    }

    // オートセーブに失敗した場合に状態を表示
    if (p_show_Console) {
      console.log("オートセーブに失敗しました。");
      console.log("指定したセーブデータのID:" + saveFileId);
      console.log("プログラム内で変換後のID:" + _saveFileId);
    }

    return false;
  };
})();


code:
//=============================================================================
// WeaponSkill.js
//=============================================================================

/*:
 * @plugindesc Change skill id of attack for each weapon.
 * @author Sasuke KANNAZUKI
 *
 * @help This plugin does not provide plugin commands.
 *
 * When <skill_id:3> is written in a weapon's note field,
 * skill id # 3 is used for the weapon's attack.
 * If nothing is written, default id(=1) is used.
 *
 * Check Points:
 * - When multiple weapons are equipped, the skill id of the weapon
 *  held in the dominant hand (previously defined) is used.
 * - It is most favorable for "skill type" to be "none"(=0),
 *  otherwise you cannot attack when your skill is blocked.
 *
 * Usage examples of this plugin:
 * - to create all-range weapons
 * - to create dual-attack or triple-attack weapons
 * - If healing skill is set when actor attacks, you can choose a friend to heal.
 * - It is possible to make a weapon that functions similar to a guard command.
 */

/*:ja
 * @plugindesc 武器ごとに通常攻撃のスキルIDを変更します。
 * @author 神無月サスケ
 *
 * @help このプラグインにはプラグインコマンドはありません。
 *
 *  武器の「メモ」欄に、<skill_id:3> と書いた場合、
 * 通常攻撃の際、3番のスキルが発動します。
 * ※特に記述がなければ、通常通り1番のスキルが採用されます。
 *
 * チェックポイント:
 * - 二刀流の場合、利き腕(先に定義された方)に持っているスキルIDが採用されます。
 * - スキルタイプは「なし」にするのが望ましいです。
 * さもなくば、技などを封じられたとき、攻撃が出来なくなります。
 *
 * 想定される用途:
 * - 全体攻撃可能な武器
 * - 2回攻撃、3回攻撃する武器
 * - 回復魔法をスキルに指定した場合、
 * 「攻撃」を選んだ際、味方の選択が出来、その仲間を回復します
 * - 防御コマンドなどと同等になる武器も実現可能です。
 */

(function () {
  //
  // set skill id for attack.
  //
  Game_Actor.prototype.attackSkillId = function () {
    var normalId = Game_BattlerBase.prototype.attackSkillId.call(this);
    if (this.hasNoWeapons()) {
      return normalId;
    }
    var weapon = this.weapons()[0]; // at plural weapon, one's first skill.
    var id = weapon.meta.skill_id;
    return id ? Number(id) : normalId;
  };

  //
  // for command at battle
  //
  var _Scene_Battle_commandAttack = Scene_Battle.prototype.commandAttack;
  Scene_Battle.prototype.commandAttack = function () {
    BattleManager.inputtingAction().setAttack();
    // normal attack weapon (or other single attack weapon)
    var action = BattleManager.inputtingAction();
    if (action.needsSelection() && action.isForOpponent()) {
      _Scene_Battle_commandAttack.call(this);
      return;
    }
    // special skill weapon
    this.onSelectAction();
  };
})();