#==============================================================================
# ■ Escape_Effect vol.1.11
#------------------------------------------------------------------------------
# 戦闘から逃走する効果集
# 08/10/11
#==============================================================================
module HIDE_ESC
  #==============================================================================
  # …スキルに追加(アクター専用) 効果範囲：味方単体 威力:0
  #==============================================================================
  # SEN…システム属性に追加した属性名(武器に付加することで攻撃時にランダムに逃げ出す)
  # ATK_R…攻撃時にランダムで『逃走』する確率(%)
  # OK…『逃走』が成功した場合、描画するメッセージ
  # NO…『逃走』が失敗した場合、描画するメッセージ
  # WAIT…『成功/失敗』を描画する時間
  # RATE…『逃走』を実行する度にUPする成功確率(%)
  # PAR…逃走の成功率に影響を与えるステータスを設定
  # ※[0:MaxHP,1:MaxSP,2:腕力,3:器用さ,4:素早さ,5:魔力,6攻撃力,7:防御力,8:魔法防御,9:回避]
  # ※PAR = [素早さ]だけなら [4]、[腕力/素早さ]ならば [2,4]
  #==============================================================================
    SEN = "逃走"
    ATK_R = 25
    OK = "逃走成功"
    NO = "逃走失敗"
    WAIT = 20
    RATE = 25
    PAR = [2,3,4,5,6]
       
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # ■ 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :escape                   # 『逃走』フラグを格納
  #--------------------------------------------------------------------------
  # ■ オリジナル変数の初期化
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_escape_game_temp initialize;end
  def initialize
    # □元の処理を呼び出し
    hidesp_escape_game_temp
    @escape = [false,0]
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ■ 通常攻撃の効果適用
  # 攻撃時にランダムで『逃走』する(知ってるかな？...チキンナイフ)
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_escape_attack attack_effect;end
  def attack_effect(attacker)
    if attacker.is_a?(Game_Actor)
      if attacker.element_set.include?($data_system.elements.index(HIDE_ESC::SEN))
        # 攻撃時にランダムで『逃走』する
        if rand(100) < HIDE_ESC::ATK_R && $game_temp.battle_can_escape
          # □逃走の効果適用
          escape_effect
          return true
        end
      end
    end
    # □元の処理を呼び出し
    hidesp_escape_attack(attacker)
  end
  #--------------------------------------------------------------------------
  # ■ スキルの効果適用
  # 『逃走』を実行するスキル(知ってるかな？...とんずら)
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_escape_skill skill_effect;end
  def skill_effect(user, skill)
    if skill != nil && user.is_a?(Game_Actor)
      if skill.element_set.include?($data_system.elements.index(HIDE_ESC::SEN))
        # 逃走可能ではない場合
        if $game_temp.battle_can_escape == false
          # 逃走不可
          self.damage = "Miss"
          $game_temp.escape[0] = false
        else
          # □逃走の効果適用
          self.damage = "Escape"
          escape_effect
        end
        return true
      end
    end
    # □元の処理を呼び出し
    hidesp_escape_skill(user, skill)
  end
  #--------------------------------------------------------------------------
  # ■ 逃走の効果適用
  #--------------------------------------------------------------------------
  def escape_effect
    # [逃走]フラグをON
    $game_temp.escape[0] = true
    
    # アクター全体のアクションをクリア
    $game_party.clear_actions
    # エネミー全体のアクションをクリア
    for enemy in $game_troop.enemies
      enemy.current_action.clear
    end
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ■ (再定義)パーティコマンドフェーズ開始
  #--------------------------------------------------------------------------
  def start_phase2 #(再定義)
    # フェーズ 2 に移行
    @phase = 2
    # アクターを非選択状態に設定
    @actor_index = -1
    @active_battler = nil
    # パーティコマンドウィンドウを有効化
    @party_command_window.active = true
    if $game_temp.escape[0] == false
      # ■先読み不可視化(ウィンドウが一瞬表示される為)
      @party_command_window.visible = true
    end
    # アクターコマンドウィンドウを無効化
    @actor_command_window.active = false
    @actor_command_window.visible = false
    # メインフェーズフラグをクリア
    $game_temp.battle_main_phase = false
    # パーティ全員のアクションをクリア
    $game_party.clear_actions
    # コマンド入力不可能な場合
    unless $game_party.inputable?
      # メインフェーズ開始
      start_phase4
    end
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新 (パーティコマンドフェーズ)
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_update_p2_escape update_phase2;end
  def update_phase2
    #…………………………………………………………………………………………………
    # ■[逃走]コマンドを実行した場合
    #…………………………………………………………………………………………………
    if $game_temp.escape[0] == true
      # □『逃走成功』処理の開始
      @help_window.set_text(HIDE_ESC::OK, 1)
      @wait_count = HIDE_ESC::WAIT
      
      $game_temp.escape[0] = false
      # □『逃走成功』処理の開始
      start_ok_escape
      return
    else
      # □元の処理を呼び出し
      hidesp_update_p2_escape
    end
  end
  #--------------------------------------------------------------------------
  # ■ (再定義)フレーム更新 (パーティコマンドフェーズ : 逃げる)
  #--------------------------------------------------------------------------
  def update_phase2_escape #(再定義)
    #…………………………………………………………………………………………………
    # ■エネミーのステータス合計の平均値を計算
    #…………………………………………………………………………………………………
    enemies_par = 0
    enemies_number = 0
    for enemy in $game_troop.enemies
      if enemy.exist?
        # □全ステータスを取得
        enemy_par = [enemy.maxhp,enemy.maxsp,enemy.str,enemy.dex,enemy.agi,enemy.int,enemy.atk,enemy.pdef,enemy.mdef,enemy.eva]
        for i in 0...enemy_par.size
          if HIDE_ESC::PAR.include?(i)
            enemies_par += enemy_par[i]
          end
        end
        # □存在するエネミー数を取得
        enemies_number += 1
      end
    end
    if enemies_number > 0
      enemies_par /= enemies_number
    end
    #…………………………………………………………………………………………………
    # ■アクターのステータス合計の平均値を計算
    #…………………………………………………………………………………………………
    actors_par = 0
    actors_number = 0
    for actor in $game_party.actors
      if actor.exist?
        # □全ステータスを取得
        actor_par = [actor.maxhp,actor.maxsp,actor.str,actor.dex,actor.agi,actor.int,actor.atk,actor.pdef,actor.mdef,actor.eva]
        for i in 0...actor_par.size
          if HIDE_ESC::PAR.include?(i)
            actors_par += actor_par[i]
          end
        end
        # 存在するアクター数を取得
        actors_number += 1
      end
    end
    if actors_number > 0
      actors_par /= actors_number
    end
    #…………………………………………………………………………………………………
    # ■エネミーよりも総合的に強ければ、逃走確率が高い
    #…………………………………………………………………………………………………
    escape_rate = [actors_par / enemies_par * 100,10].max + $game_temp.escape[1]
    # □逃走を実行するたびに成功率UP(+n%)
    $game_temp.escape[1] += (escape_rate * HIDE_ESC::RATE / 100)
    # □逃走成功の判定
    success = rand(100) < rand(escape_rate)
    #…………………………………………………………………………………………………
    # ■逃走成功の場合
    #…………………………………………………………………………………………………
    if success
      # □ヘルプウィンドウに描画
      @help_window.set_text(HIDE_ESC::OK, 1)
      @wait_count = HIDE_ESC::WAIT
      # □パーティコマンドウィンドウの不可視化
      if @party_command_window != nil
        # ウィンドウが一瞬表示される為
        @party_command_window.visible = false
      end
      # □『逃走成功』処理の開始
      start_ok_escape
    #…………………………………………………………………………………………………
    # ■逃走失敗の場合
    #…………………………………………………………………………………………………
    else
      # □『逃走失敗』処理の開始
      start_no_escape
    end
  end
  #--------------------------------------------------------------------------
  # ■ 『逃走成功』処理の開始
  #--------------------------------------------------------------------------
  def start_ok_escape
    # □ウェイトが完了するまで待つ
    while @wait_count > 0
      Graphics.update
      @wait_count -= 1
    end
    # 逃走 SE を演奏
    $game_system.se_play($data_system.escape_se)
    # バトル開始前の BGM に戻す
    $game_system.bgm_play($game_temp.map_bgm)
    # バトル終了
    battle_end(1)
  end
  #--------------------------------------------------------------------------
  # ■ 『逃走失敗』処理の開始
  #--------------------------------------------------------------------------
  def start_no_escape
    # ヘルプウィンドウに描画
    @help_window.set_text(HIDE_ESC::NO, 1)
    @wait_count = HIDE_ESC::WAIT
    # パーティ全員のアクションをクリア
    $game_party.clear_actions
    # メインフェーズ開始
    start_phase4
  end
  #--------------------------------------------------------------------------
  # ■ バトル終了
  #     result : 結果 (0:勝利 1:敗北 2:逃走)
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_battle_end_escape battle_end;end
  def battle_end(result)
    # □[逃走]フラグの初期化
    $game_temp.escape = [false,0]
    # □元の処理を呼び出し
    hidesp_battle_end_escape(result)
  end
end