/*:
 * @target MZ
 * @plugindesc [MZ] 敵ID112が出現中はスキル336を選択不可（灰色）にする
 * @author you
 *
 * @help
 * 戦闘中、指定の敵（既定: ID112）が出現しているあいだは、
 * 指定のスキル（既定: ID336）を表示はするが選択不可（灰色）にします。
 * 既定では「生存中の敵」に限定して判定します。
 *
 * ●備考
 * - メニュー画面には影響しません（戦闘中のみ）。
 * - 「選択不可」表示に加え、実行直前の使用可否チェックも封じます。
 *
 * @param EnemyId
 * @text 対象の敵キャラID
 * @type number
 * @default 112
 * @desc このIDの敵が戦闘中に「出現」しているときに封印します。
 *
 * @param SkillId
 * @text 封印するスキルID
 * @type number
 * @default 336
 * @desc このスキルを選択不可（灰色）にします。
 *
 * @param OnlyAlive
 * @text 生存している敵のみ判定
 * @type boolean
 * @default true
 * @desc ON: 生きている敵がいる間だけ封印。OFF: 戦闘に含まれていれば常に封印。
 */

(() => {
  const PLUGIN_NAME = document.currentScript.src.split("/").pop().replace(/\.js$/, "");
  const P = PluginManager.parameters(PLUGIN_NAME);

  const ENEMY_ID = Number(P.EnemyId || 112);
  const SKILL_ID = Number(P.SkillId || 336);
  const ONLY_ALIVE = String(P.OnlyAlive || "true") === "true";

  function enemyPresentInBattle() {
    if (!$gameParty.inBattle()) return false;
    const troop = $gameTroop;
    if (!troop) return false;
    const members = ONLY_ALIVE ? troop.aliveMembers() : troop.members();
    return members.some(e => e && e.enemyId && e.enemyId() === ENEMY_ID);
  }

  // 見た目（灰色化）：スキルリストの「選択可能判定」を上書き
  const _Window_SkillList_isEnabled = Window_SkillList.prototype.isEnabled;
  Window_SkillList.prototype.isEnabled = function(item) {
    if ($gameParty.inBattle() && item && DataManager.isSkill(item) && item.id === SKILL_ID) {
      if (enemyPresentInBattle()) return false; // 灰色（選択不可）
    }
    return _Window_SkillList_isEnabled.call(this, item);
  };

  // 実行直前の保険：アクターの使用可否チェックにもフック（戦闘中のみ）
  const _Game_BattlerBase_meetsSkillConditions = Game_BattlerBase.prototype.meetsSkillConditions;
  Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
    if ($gameParty.inBattle() && this.isActor() && skill && skill.id === SKILL_ID) {
      if (enemyPresentInBattle()) return false;
    }
    return _Game_BattlerBase_meetsSkillConditions.call(this, skill);
  };
})();
