class Game_Action
#--------------------------------------------------------------------------
  # ● 敵キャラの戦闘行動を設定
  #     action : RPG::Enemy::Action
  #--------------------------------------------------------------------------
  def set_enemy_action(action)
    if action
      set_skill(action.skill_id)
    else
      clear
    end
    return unless action 
    return unless action.target_index 
    @target_index = action.target_index if action.target_index >= 0
  end
end  

class Game_Enemy < Game_Battler
  attr_accessor :state_turns
  #--------------------------------------------------------------------------
  # ● 現在の状況で戦闘行動が有効か否かを判定
  #     action : RPG::Enemy::Action
  #--------------------------------------------------------------------------
  alias takoee2w2action_valid? action_valid?
  def action_valid?(action)
    takoee2w2action_valid?(action) && plus_conditions_met?(action)
    
  end
  #--------------------------------------------------------------------------
  # ● 行動条件合致判定
  #     action : RPG::Enemy::Action
  #--------------------------------------------------------------------------
  def plus_conditions_met?(action)
    return true unless action.plus_condition_list
    return true if action.plus_condition_list.empty?
    method_table = {
      1 => :conditions_met_turns?,
      2 => :conditions_met_hp?,
      3 => :conditions_met_mp?,
      4 => :conditions_met_state?,
      5 => :conditions_met_party_level?,
      6 => :conditions_met_switch?,
      7 => :conditions_party_state?,
      8 => :conditions_friend_hp?,
      9 => :conditions_friend_state?,  
    }

    t = true 
    
    action.plus_condition_list.each_with_index do |cs , i|
      
      method_name = method_table[cs[0]]
      if cs[0] <= 6
        t &&= send(method_name, cs[1], cs[2])
      else 
        t &&= send(method_name, action , cs[1], cs[2])
      end  
      
    end
    return t
  end  
  
  def conditions_party_state?(action , param1, param2 )
    $game_party.members.each do |member|
      return false unless member.state?(param1)
    end  
    return true
  end  
  
  def conditions_friend_hp?(action , param1, param2)
    ary = []
    $game_troop.members.each_with_index do |member , index|
      ary.push(index) if member.alive? && member.hp < member.mhp * param1 / 100
    end
    if ary.empty?
      action.target_index = -1
      return false
    else
      if param2 == 0
        action.target_index = ary[rand(ary.size)]
      else
        action.target_index = ary.min_by{|id| $game_troop.members[id].hp}
      end  
      return true
    end
  end  
  
  def conditions_friend_state?(action , param1, param2)
    ary = []
    $game_troop.members.each_with_index do |member , index|
      ary.push(index) if member.state?(param1)
    end
    if ary.empty?
      action.target_index = -1
      return false
    else
      case param2 
      when 0
        action.target_index = ary[rand(ary.size)]
      when 1
        action.target_index = ary.max_by{|id| $game_troop.members[id].state_turns[param1]}
      when 2
        action.target_index = ary.min_by{|id| $game_troop.members[id].state_turns[param1]}        
      end  
      return true
    end    
  end  
    
end  

class RPG::Enemy::Action
  attr_accessor :plus_condition_list
  attr_accessor :plus_condition_param_list  
  attr_accessor :target_index   
  alias tako4da444rinitialize initialize
  def initialize
    tako4da444rinitialize
    @plus_condition_list = [0]
    @plus_condition_param1 = [[0]]
    @target_index = -1
    
  end

end  