/*:-----------------------------------------------------------------------------------
 * NUUN_ChangeMaxLevel.js
 *
 * Copyright (C) 2020 NUUN
 * This software is released under the MIT License.
 * http://opensource.org/licenses/mit-license.php
 * -------------------------------------------------------------------------------------
 *
 * 更新履歴
 * 2020/12/13 Ver.1.0.1
 * 微修正
 * 2020/12/12 Ver.1.0.0
 * 初版
 *
 */
/*:
 * @target MZ
 * @plugindesc 最大レベル変動プラグイン
 * @author NUUN
 * @orderBefore NUUN_LevelUnlimited
 *
 * @help
 * アクターの最大レベルを任意のタイミングで変更できます。
 *
 * プラグインコマンド
 * MaxLevelSet　アクターの最大レベルを変更。
 *
 * 利用規約
 * このプラグインはMITライセンスで配布しています。
 *
 *
 * @command MaxLevelSet
 * @text 最大レベルの変更。
 * @desc 最大レベルを変更します。
 *
 * @arg changeMaxLevel
 * @type number
 * @min 1
 * @default 99
 * @text 最大レベル
 * @desc 最大レベルを変更します。
 *
 * @arg ActorId
 * @type actor
 * @default 1
 * @text アクター
 * @desc 変更するアクターを指定します。
 * @min 0
 * @max 9999
 *
 */
var Imported = Imported || {};
Imported.NUUN_ChangeMaxLevel = true;

(() => {
  const parameters = PluginManager.parameters("NUUN_ChangeMaxLevel");
  const pluginName = "NUUN_ChangeMaxLevel";

  PluginManager.registerCommand(pluginName, "MaxLevelSet", (args) => {
    $gameActors.actor(args.ActorId).changeMaxLevel(Number(args.changeMaxLevel));
  });

  const _Game_Actor_initMembers = Game_Actor.prototype.initMembers;
  Game_Actor.prototype.initMembers = function () {
    _Game_Actor_initMembers.call(this);
    this._maxLevel = 0;
  };

  Game_Actor.prototype.changeMaxLevel = function (changeMaxLevel) {
    if (!Imported.NUUN_LevelUnlimited && !Imported.VisuMZ_0_CoreEngine) {
      Math.min(changeMaxLevel, 99);
    }
    this._maxLevel =
      this._level <= changeMaxLevel ? changeMaxLevel : this._maxLevel;
  };

  const _Game_Actor_maxLevel = Game_Actor.prototype.maxLevel;
  Game_Actor.prototype.maxLevel = function () {
    return this._maxLevel > 0
      ? this._maxLevel
      : _Game_Actor_maxLevel.call(this);
  };

  const _Game_Actor_changeExp = Game_Actor.prototype.changeExp;
  Game_Actor.prototype.changeExp = function (exp, show) {
    exp = Math.min(this.expForLevel(this.maxLevel()), exp);
    _Game_Actor_changeExp.call(this, exp, show);
  };
})();
