#==============================================================================
#                         「わざタイプ」(ACE) ver1.2
#   製作者:奈々(なな)
#   へぷたなすくろーる http://heptanas.mamagoto.com/
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#
#------------------------------------------------------------------------------
#
#   スキルの必要武器タイプを「わざタイプ」として独立化させます。
#   これにより武器タイプと防具タイプの設定はスキルの使用に関わらなくなります。
#
#
#   アクター・職業・武器・防具・ステートのメモ欄に「わざタイプ」を設定します。
#
# <わざタイプ ○○>    :○○に好きな名前を入れます。
#                       この名前がわざタイプの識別名称になります。
#
#
#   スキルのメモ欄に使用条件となるわざタイプを設定します。
#   
# <要求わざタイプ ○○>:設定したもののうち「どれか1つ」あれば使用可能。
#
# <必須わざタイプ ○○>:設定したもののうち「全て」揃っていれば使用可能。
#
# <禁止わざタイプ ○○>:設定したもののうち「1つも無ければ」使用可能。
#
#
#   「わざタイプ」は色々なものに好きなだけ設定できますので上手く活用して下さい。
#   例えば伝説の剣にだけ<わざタイプ 剣>と<わざタイプ 伝説の剣>の2つを設定し
#   勇者の専用必殺技には<要求わざタイプ 伝説の剣>を追加するなどです。
#   基本的にはこのわざタイプを増やして要求わざタイプで対応する方法が簡単です。
#   必須わざタイプは2つ以上の装備品が必要なスキルなどを作りたいときに使います。
#   また、ステートに<わざタイプ 魔法封印>という設定をして
#   魔法スキルには<禁止わざタイプ 魔法封印>という条件を追加する方法で
#   より細かいスキルの封印設定なども作れるようになっています。
#
#==============================================================================
#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス($game_actors)
# の内部で使用され、Game_Party クラス($game_party)からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● スキルの必要武器を装備しているか(再定義)
  #--------------------------------------------------------------------------
  def skill_wtype_ok?(skill)
    any_wazatype_id = skill.required_any_wazatype_id
    all_wazatype_id = skill.required_all_wazatype_id
    notany_wazatype_id = skill.required_notany_wazatype_id

    return false if any_wazatype_ok?(notany_wazatype_id) && notany_wazatype_id != []
    return false if !all_wazatype_ok?(all_wazatype_id) && all_wazatype_id != []
    return false if !any_wazatype_ok?(any_wazatype_id) && any_wazatype_id != []
    return true
  end
  #--------------------------------------------------------------------------
  # ● 特定のわざタイプをどれか1つでも満たしているか(新規メソッド)
  #--------------------------------------------------------------------------
  def any_wazatype_ok?(any_wazatype_id)
    any_wazatype_id.any? {|id|
      final_waza_type.include?(id)
    }
  end
  #--------------------------------------------------------------------------
  # ● 特定のわざタイプを全て満たしているか(新規メソッド)
  #--------------------------------------------------------------------------
  def all_wazatype_ok?(all_wazatype_id)
    all_wazatype_id.all? {|id|
      final_waza_type.include?(id)
    }
  end
  
  #--------------------------------------------------------------------------
  # ● アクターの持つわざタイプ一覧
  #--------------------------------------------------------------------------
  def final_waza_type
    list = self.actor.waza_type
    list |= self.class.waza_type
    self.equips.each do |equip|
      next unless equip
      list |= equip.waza_type
    end
    self.states.each do |state|
      list |= state.waza_type
    end
    return list
  end
end

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● わざタイプ
  #--------------------------------------------------------------------------
  def waza_type
    list = []
    @note.scan(/<わざタイプ\s?(.*)>/) {|s| list.push($1.to_s) if $1}
    return list
  end
end


class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ● 要求わざタイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_any_wazatype_id
    list = []
    @note.scan(/<要求わざタイプ\s?(.*)>/) {|s| list.push($1.to_s) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 必須わざタイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_all_wazatype_id
    list = []
    @note.scan(/<必須わざタイプ\s?(.*)>/) {|s| list.push($1.to_s) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● 禁止わざタイプの定義(追加定義)
  #--------------------------------------------------------------------------  
  def required_notany_wazatype_id
    list = []
    @note.scan(/<禁止わざタイプ\s?(.*)>/) {|s| list.push($1.to_s) if $1}
    return list
  end
end