/*:
 * @target MZ
 * @plugindesc 敵IDが出現中のときだけ逃走禁止（デフォルト: 敵55） v1.0
 * @author You
 * @help
 * 戦闘中に「指定した敵ID」が出現している場合のみ、逃走を禁止します。
 * それ以外の戦闘では通常どおり逃走できます。
 *
 * 既存の逃走可否（バトルイベントの「逃走許可」や他プラグイン）も尊重し、
 * もともと逃走不可の場合はそのまま不可のままです。
 *
 * ■判定仕様（既定）
 *  - 敵が「生存中」かつ「出現中（非隠れ）」のときに逃走を禁止
 *
 * @param EnemyId
 * @text 逃走を禁止する敵ID
 * @type enemy
 * @default 55
 *
 * @param RequireAlive
 * @text 生存している時のみ禁止
 * @type boolean
 * @on はい（HP>0のとき）
 * @off いいえ（生死を問わず）
 * @default true
 *
 * @param RequireAppeared
 * @text 出現している時のみ禁止
 * @type boolean
 * @on はい（非Hiddenのみ）
 * @off いいえ（Hiddenでも禁止）
 * @default true
 */

(() => {
  "use strict";
  const PN = document.currentScript?.src?.match(/([^\/]+)\.js$/)?.[1] || "BlockEscapeWhenEnemyPresent";
  const P  = PluginManager.parameters(PN);

  const ENEMY_ID       = Number(P.EnemyId || 55);
  const REQ_ALIVE      = String(P.RequireAlive || "true") === "true";
  const REQ_APPEARED   = String(P.RequireAppeared || "true") === "true";

  function isBlockingEnemyPresent() {
    if (!$gameParty.inBattle()) return false;
    // 現在の敵グループ内をチェック
    return $gameTroop.members().some(e => {
      // e は Game_Enemy
      if (!e || e.enemyId() !== ENEMY_ID) return false;
      if (REQ_ALIVE && !e.isAlive()) return false;        // 生存必須なら死んでたらNG
      if (REQ_APPEARED && !e.isAppeared()) return false;  // 出現必須なら隠れてたらNG
      return true; // 条件を満たす敵がいる → 逃走禁止
    });
  }

  const _canEscape = BattleManager.canEscape;
  BattleManager.canEscape = function() {
    // まず元の判定（データベース側の「逃走許可」など）を尊重
    const base = _canEscape.call(this);
    if (!base) return false;
    // 指定敵が条件を満たして存在するなら禁止
    if (isBlockingEnemyPresent()) return false;
    return true;
  };
})();
