#==============================================================================
#                   「スキル必要武器タイプ拡張」(ACE) ver2.1  by奈々
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#
#------------------------------------------------------------------------------
#
#   スキルの必要武器タイプを拡張します。
#   使い方は、スキルのメモ欄にタグを記入して下さい。
#   
# <要求武器タイプ n>:設定した武器タイプを「1つでも」装備していれば使用可能。
#                     デフォルトの必要武器タイプはこれと同じ扱いになります。
#
# <要求防具タイプ n>:設定した防具タイプを「1つでも」装備していれば使用可能。
#                     要求武器タイプを含めてどれか1つあればOKの判定です。
#
# <必須武器タイプ n>:設定した武器タイプを「全て」装備していれば使用可能。
#
# <必須防具タイプ n>:設定した防具タイプを「全て」装備していれば使用可能。
#
#
# <禁止武器タイプ n>:設定した武器タイプを「装備していなければ」使用可能。
#
# <禁止防具タイプ n>:設定した防具タイプを「装備していなければ」使用可能。
#
#   タグは何個でも追加できます。またどのタイプも併用が可能です。
#   併用する場合は
#   禁止タイプの判定→必須タイプの判定→要求タイプの判定
#   とタイプ毎にそれぞれ独立したチェックをして
#   全て満たしていた場合のみ使用可能になります。
#
#==============================================================================
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors)
# の内部で使用され、Game_Party クラス($game_party)からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの必要武器を装備しているか(再定義)
  #--------------------------------------------------------------------------
  def skill_wtype_ok?(skill)
    #要求武器タイプはデータベースの設定も反映
    any_wtype_id = []
    any_wtype_id.push skill.required_wtype_id1
    any_wtype_id.push skill.required_wtype_id2
    #無設定が0で入っているので、それを除外
    any_wtype_id -= [0]
    any_wtype_id += skill.required_any_wtype_id
    
    #他も参照しやすいように取り出す
    any_atype_id = skill.required_any_atype_id
    all_wtype_id = skill.required_all_wtype_id
    all_atype_id = skill.required_all_atype_id
    notany_wtype_id = skill.required_notany_wtype_id
    notany_atype_id = skill.required_notany_atype_id
    
    #    武器タイプと防具タイプの複合判定
    
    #要求タイプの判定
    any_etype_ok = false
    any_etype_ok = true if any_wtype_id == [] && any_atype_id == []
    any_etype_ok = true if any_wtype_equipped?(any_wtype_id) || any_atype_equipped?(any_atype_id)
    #any判定を武器か防具のどちらかで満たせばtrue
    #もしくは両方指定なしの場合もtrue
    #それ以外がfalse
    
    #必須タイプの判定
    all_etype_ok = true
    all_etype_ok = false if !(all_wtype_equipped?(all_wtype_id) || all_wtype_id == [])
    all_etype_ok = false if !(all_wtype_equipped?(all_wtype_id) || all_wtype_id == [])
    #all判定か指定なしか、これを武器と防具の両方で満たすならtrue
    #これを逆にしたfalseを洗い出すことで判定を簡単にしている
    
    #禁止タイプの判定
    notany_etype_ok = true
    notany_etype_ok = false if any_wtype_equipped?(notany_wtype_id) || any_atype_equipped?(notany_atype_id)
    #any判定を武器か防具のどちらかで満たせばfalse
    #そうでなければtrue

    return false if !any_etype_ok
    return false if !all_etype_ok
    return false if !notany_etype_ok
    return true
  end
  #--------------------------------------------------------------------------
  # ● 特定のタイプの武器をどれか1つでも装備しているか(新規メソッド)
  #--------------------------------------------------------------------------
  def any_wtype_equipped?(any_wtype_id)
    any_wtype_id.each {|wtype|
      return true if weapons.any? {|weapon| weapon.wtype_id == wtype }
    }
    return false
  end
  #--------------------------------------------------------------------------
  # ● 特定のタイプの防具をどれか1つでも装備しているか(新規メソッド)
  #--------------------------------------------------------------------------
  def any_atype_equipped?(any_atype_id)
    any_atype_id.each {|atype|
      return true if armors.any? {|armor| armor.atype_id == atype }
    }
    return false
  end
  #--------------------------------------------------------------------------
  # ● 特定のタイプの武器を全て装備しているか(新規メソッド)
  #--------------------------------------------------------------------------
  def all_wtype_equipped?(all_wtype_id)
    all_wtype_id.each {|wtype|
      return false if not weapons.any? {|weapon| weapon.wtype_id == wtype }
    }
    return true
  end
  #--------------------------------------------------------------------------
  # ● 特定のタイプの防具を全て装備しているか(新規メソッド)
  #--------------------------------------------------------------------------
  def all_atype_equipped?(all_atype_id)
    all_atype_id.each {|atype|
      return false if not armors.any? {|armor| armor.atype_id == atype }
    }
    return true
  end
end

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ● 要求武器タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_any_wtype_id
    list = []
    @note.scan(/<要求武器タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 要求防具タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_any_atype_id
    list = []
    @note.scan(/<要求防具タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 必須武器タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_all_wtype_id
    list = []
    @note.scan(/<必須武器タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 必須防具タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_all_atype_id
    list = []
    @note.scan(/<必須防具タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 禁止武器タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_notany_wtype_id
    list = []
    @note.scan(/<禁止武器タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 禁止防具タイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_notany_atype_id
    list = []
    @note.scan(/<禁止防具タイプ\s?(\d*)>/) {|s| list.push($1.to_i) if $1}
    return list
  end
end