/*:
 * @target MZ
 * @plugindesc [MZ] 変数181–300, 342–364, 382–400, 501–580 の最大値を9999に制限します
 * @author You
 * @help
 * 指定の範囲に含まれる「変数ID」について、値が数値のときだけ
 * 最大値を 9999 にキャップします（10,000 以上にならない）。
 * - 最小値（マイナス方向）は制限しません。
 * - 数値以外（文字列・配列・オブジェクト等）は変更しません。
 *
 * 対象範囲:
 *  - 181〜300
 *  - 342〜364
 *  - 382〜400
 *  - 501〜580
 *
 * 導入方法:
 *  ファイルを js/plugins に置き、プラグイン管理で有効化してください。
 *  互換のため、同様に setValue を変更するプラグインよりも「下（後）」に置くと確実です。
 *
 * 仕様・注意:
 *  - $gameVariables.addValue() からの加算も最終的に setValue を通るため自動的にキャップされます。
 *  - 既存セーブを読み込んだ際に、対象変数に 10000 以上の値が残っていても、
 *    そのままでは即時に丸めません（書き込み/加算が行われた時点でキャップ）。
 *    もし読み込み直後に即時で丸めたい場合は、イベントで「変数の操作：+0」を一括実行すると確実です。
 */

(() => {
  "use strict";

  // === 設定（必要なら編集可） ===
  const MAX_VALUE = 9999;

  // 対象範囲を列挙（開始, 終了）ペア
  const RANGES = [
    [181, 300],
    [342, 364],
    [382, 400],
    [501, 580],
  ];

  // 変数IDが対象か判定
  function isCappedVariable(varId) {
    for (const [a, b] of RANGES) {
      if (varId >= a && varId <= b) return true;
    }
    return false;
  }

  // 数値を上限キャップ
  function capValue(value) {
    if (typeof value !== "number") return value;
    if (!Number.isFinite(value)) return value; // Infinity/NaN は触らない
    return value > MAX_VALUE ? MAX_VALUE : value;
  }

  // setValue をフック
  const _Game_Variables_setValue = Game_Variables.prototype.setValue;
  Game_Variables.prototype.setValue = function(variableId, value) {
    if (isCappedVariable(variableId)) {
      value = capValue(value);
    }
    _Game_Variables_setValue.call(this, variableId, value);
  };

  // （参考）必要であれば addValue も保険的にフック
  //  ※ MZ 標準は setValue を経由するが、独自実装対策
  const _Game_Variables_addValue = Game_Variables.prototype.addValue;
  if (_Game_Variables_addValue) {
    Game_Variables.prototype.addValue = function(variableId, value) {
      _Game_Variables_addValue.call(this, variableId, value);
      // 加算後の値を再キャップ（独自実装でも最終的に丸める）
      if (isCappedVariable(variableId)) {
        const v = this.value(variableId);
        if (typeof v === "number" && Number.isFinite(v) && v > MAX_VALUE) {
          _Game_Variables_setValue.call(this, variableId, MAX_VALUE);
        }
      }
    };
  }
})();
