#==============================================================================
#                「アクター・キーワード・システム」(ACE) ver2.2  by奈々
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#
#------------------------------------------------------------------------------
#
#   アクター毎に「キーワード」を付けることができます。
#   キーワードはそれ単体ではゲームに何も影響を与えませんが
#   イベントコマンドで判定ができるので幅広い応用が可能です。
#
#   ・キーワードの追加と削除
#   イベントコマンドの「スクリプト」に書く。
#   nak_add(ID, "○○"):ID番のアクターに「○○」というキーワードを追加
#   nak_add_p(No, "○○"):No番のパーティメンバーにキーワードを追加
#   nak_add_all("○○"):アクター全員に「○○」というキーワードを追加
#   
#   nak_remove(ID, "○○"):ID番のアクターから「○○」のキーワードを削除
#   nak_remove_p(No, "○○"):No番のパーティメンバーからキーワードを削除
#   nak_remove_all("○○"):アクター全員から「○○」のキーワードを削除
#   
#   nak_reset(ID):ID番のアクターのキーワードを全て削除
#   nak_reset_p(No):No番のパーティメンバーのキーワードを全て削除
#   nak_reset_all:アクター全員のキーワードを全て削除
#
#   ・初期キーワードの追加
#   データベースのアクター・職業のメモ欄に書く。
#   <初期キーワード "○○">:ゲーム開始時に「○○」というキーワードを追加
#   
#   ・常時キーワードの追加
#   データベースのアクター・職業・武器・防具・ステートに書く。
#   <常時キーワード "○○">:アクターに「○○」というキーワードを付与
#   *常時キーワードはコマンドで削除することはできない。
#   *装備中はキーワードが付与され、装備を外すとキーワードも消える。
#   
#   ・キーワードの判定
#   イベントコマンドの条件分岐「スクリプト」に書く。
#   nak_check(ID, "○○"):ID番のアクターに「○○」というキーワードがあるか
#   nak_check_p(No, "○○"):No番のパーティメンバーにキーワードがあるか
#   nak_check_pa("○○"):パーティメンバーの誰かがキーワードを持っているか
#   これらはコマンドの頭に!をつけると、そのキーワードがないか、という条件になり
#   また&&(and)や||(or)で繋げることで複数の条件をまとめることも可能。
#   
#   ・キーワード判定+ID取得
#   イベントコマンドの「スクリプト」に書く。
#   XX番の変数に「キーワードを持つアクターのID」を代入するコマンド
#   nak_who(XX, "○○"):アクターリストから検索する(ID順)
#   nak_who_p(XX, "○○"):パーティメンバーから検索する(隊列順)
#   
#   「○○」を持つアクターがいなかった場合は0が代入される。
#   通常は検索して最初にヒットした候補のIDが代入されるが
#   nak_who(XX, "○○", 2)やnak_who_p(XX, "○○", 3)のように
#   3つ目の引数を設定することで1番目以外の候補を探すこともできる。
#
#   ・一部合致コマンド
#   nak_remove2(ID, "○○"):ID番のアクターから「○○」を含むキーワードを全て削除
#   nak_remove2_p(No, "○○"):No番のパーティメンバーからキーワードを全て削除
#   nak_remove2_all("○○"):アクター全員から「○○」を含むキーワードを全て削除
#
#   nak_check(ID, "○○"):ID番のアクターに「○○」を含むキーワードがあるか
#   nak_check_p(No, "○○"):No番のパーティメンバーにキーワードがあるか
#   nak_check_pa("○○"):パーティメンバーの誰かがキーワードを持っているか
#
#   ・備考
#   キーワードは文字列であり、ユーザーが自由に追加することができます。
#   アクター1人につき、何個でもキーワードを保持できますが
#   同じ名前のキーワードは1つに纏められます。複数追加する意味はありません。
#   スクリプトコマンドに「p $game_actors[ID].nana_actor_keyword」と入れることで
#   ID番のアクターのキーワード一覧をコンソールに表示できます。確認用にどうぞ。
#   キーワードの具体的な使用例はブログをご覧下さい。
#
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● アクターキーワード(常時)
  #--------------------------------------------------------------------------
  def actor_keyword_a
    list = []
    @note.scan(/<常時キーワード\s?"(.*)"\s?>/) {|s| list.push($1.to_s) if $1}
    return list
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワード(初期)
  #--------------------------------------------------------------------------
  def actor_keyword_f
    list = []
    @note.scan(/<初期キーワード\s?"(.*)"\s?>/) {|s| list.push($1.to_s) if $1}
    return list
  end
end


class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :actor_keyword_t                 # アクターキーワード(一時)
  #--------------------------------------------------------------------------
  # ○ セットアップ(エイリアス再定義)
  #--------------------------------------------------------------------------
  alias nak_setup setup
  def setup(actor_id)
    nak_setup(actor_id)
    set_nak_f
  end
  #--------------------------------------------------------------------------
  # ● アクターの初期キーワードをセット
  #--------------------------------------------------------------------------
  def set_nak_f
    @actor_keyword_t = []
    list = self.actor.actor_keyword_f
    list |= self.class.actor_keyword_f
    @actor_keyword_t |= list
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの参照
  #--------------------------------------------------------------------------
  def nana_actor_keyword
    list = @actor_keyword_t
    list |= self.actor.actor_keyword_a
    list |= self.class.actor_keyword_a
    self.equips.each do |equip|
      next unless equip
      list |= equip.actor_keyword_a
    end
    self.states.each do |state|
      list |= state.actor_keyword_a
    end
    return list
  end
end

class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● アクターキーワードの追加
  #--------------------------------------------------------------------------
  def nak_add(actor, keyword)
    t = [keyword]
    $game_actors[actor].actor_keyword_t |= t if $game_actors[actor]
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの追加(パーティ)
  #--------------------------------------------------------------------------
  def nak_add_p(actor, keyword)
    t = [keyword]
    $game_party.members[actor].actor_keyword_t |= t if $game_party.members[actor]
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの追加(全員)
  #--------------------------------------------------------------------------
  def nak_add_all(keyword)
    t = [keyword]
    for actor in 1...$data_actors.size
      $game_actors[actor].actor_keyword_t |= t
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除
  #--------------------------------------------------------------------------
  def nak_remove(actor, keyword)
    t = [keyword]
    $game_actors[actor].actor_keyword_t -= t if $game_actors[actor]
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除(パーティ)
  #--------------------------------------------------------------------------
  def nak_remove_p(actor, keyword)
    t = [keyword]
    $game_party.members[actor].actor_keyword_t -= t if $game_party.members[actor]
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除(全員)
  #--------------------------------------------------------------------------
  def nak_remove_all(keyword)
    t = [keyword]
    for actor in 1...$data_actors.size
      $game_actors[actor].actor_keyword_t -= t
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除(一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_remove2(actor, keyword)
    $game_actors[actor].actor_keyword_t.delete_if{|key|
    key.include?(keyword)
    }
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除(パーティ、一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_remove2_p(actor, keyword)
    $game_party.members[actor].actor_keyword_t.delete_if{|key|
    key.include?(keyword)
    }
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの削除(全員、一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_remove2_all(keyword)
    for actor in 1...$data_actors.size
      $game_actors[actor].actor_keyword_t.delete_if{|key|
      key.include?(keyword)
      }
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードのリセット
  #--------------------------------------------------------------------------
  def nak_reset(actor)
    $game_actors[actor].actor_keyword_t = []
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードのリセット(パーティ)
  #--------------------------------------------------------------------------
  def nak_reset_p(actor)
    $game_party.members[actor].actor_keyword_t = []
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードのリセット(全員)
  #--------------------------------------------------------------------------
  def nak_reset_all
    for actor in 1...$data_actors.size
      $game_actors[actor].actor_keyword_t = []
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定
  #--------------------------------------------------------------------------
  def nak_check(actor, keyword)
    if $game_actors[actor]
      return $game_actors[actor].nana_actor_keyword.include?(keyword)
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定(パーティ)
  #--------------------------------------------------------------------------
  def nak_check_p(actor, keyword)
    if $game_party.members[actor]
      return $game_party.members[actor].nana_actor_keyword.include?(keyword)
    else
      return false
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定(パーティ全体)
  #--------------------------------------------------------------------------
  def nak_check_pa(keyword)
    $game_party.members.each{|member|
      return true if member.nana_actor_keyword.include?(keyword)
    }
    return false
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定(一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_check2(actor, keyword)
    if $game_actors[actor]
      $game_actors[actor].nana_actor_keyword.each{|key|
        return true if key.include?(keyword)
      }
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定(パーティ、一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_check2_p(actor, keyword)
    if $game_party.members[actor]
      $game_party.members[actor].nana_actor_keyword.each{|key|
        return true if key.include?(keyword)
      }
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● アクターキーワードの判定(パーティ全体、一部合致、アドバンスド)
  #--------------------------------------------------------------------------
  def nak_check2_pa(keyword)
    $game_party.members.each{|member|
      member.nana_actor_keyword.each{|key|
        return true if key.include?(keyword)
      }
    }
    return false
  end
  #--------------------------------------------------------------------------
  # ● キーワード所持アクターのID特定
  #--------------------------------------------------------------------------
  def nak_who(val, keyword, number = 1)
    number = 1 if number < 1
    temp = 0
    for actor in 1...$data_actors.size
      if $game_actors[actor].nana_actor_keyword.include?(keyword)
        temp = actor.id
        number -= 1
        if number == 0 
          $game_variables[val] = temp
          return
        end
      end
    end
    $game_variables[val] = temp
  end
  #--------------------------------------------------------------------------
  # ● キーワード所持アクターのID特定(パーティ)
  #--------------------------------------------------------------------------
  def nak_who_p(val, keyword, number = 1)
    number = 1 if number < 1
    temp = 0
    $game_party.members.each{|member|
      if member.nana_actor_keyword.include?(keyword)
        temp = member.id
        number -= 1
        if number == 0 
          $game_variables[val] = temp
          return
        end
      end
    }
    $game_variables[val] = temp
  end
end