#==============================================================================
#                   「パーティコマンド拡張」(ACE) ver1.0
#   製作者:奈々(なな)
#   へぷたなすくろーる http://heptanas.mamagoto.com/
#
#   ◇使用規約
#   使用される場合はスクリプト作成者として「奈々」を明記して下さい。
#   このスクリプトを改変したり、改変したものを配布するなどは自由ですが
#   その場合も元のスクリプトの作成者として名前は載せて下さい。
#   その他、詳しい利用規約はブログを参照して下さい。
#
#------------------------------------------------------------------------------
#
#   戦闘時のパーティコマンド「戦う」を最大3つまで拡張します。
#   コマンド選択時に、指定したステートを付与できます。
#   これにより自動戦闘や陣形のようなシステムを実装できます。
#   
#   
#   使い方は、初期設定で行います。
#   
#   TAC1_NAME = "○○"
#   コマンド名を設定します。
#   これを空白("")にすると、そのコマンドは未使用になります。
#   
#   TAC1_SW = n
#   条件スイッチを設定します。nはスイッチNoです。
#   0を指定した場合は、そのコマンドは常に表示されます。
#   それ以外の場合、n番のスイッチがONの場合のみ表示されます。
#   
#   TAC1_STATE = n
#   TAC1_STATE = [n,n,n,n]
#   付与ステートを設定します。nはステートIDです。
#   1つの数値を指定した場合、パーティ全員にそのステートを付与します。
#   []の配列で指定した場合、順番通りにそれぞれのステートを付与します。
#   どちらも0を指定した場合は、ステートを付与しません。
#   
#   ※基本的に付与するステートはコマンド専用にして下さい。
#
#==============================================================================
#◇初期設定
module Nana
module EZ_Tactics
  
  # コマンド名、""でコマンド不使用
  TAC1_NAME = "戦う"
  
  # 条件スイッチNo、0で常に表示
  TAC1_SW = 0
  
  # 付与ステートID、0で付与なし
  TAC1_STATE = 0
  
  
  # 作戦2の設定
  TAC2_NAME = "自動戦闘"
  
  TAC2_SW = 1
  
  TAC2_STATE = 5
  
  # 作戦3の設定
  TAC3_NAME = ""
  
  TAC3_SW = 0
  
  TAC3_STATE = [17,21,22,23]
  
end
end
#==============================================================================


#==============================================================================
# ■ Window_PartyCommand
#------------------------------------------------------------------------------
#  バトル画面で、戦うか逃げるかを選択するウィンドウです。
#==============================================================================

class Window_PartyCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  def make_command_list
    add_command(Nana::EZ_Tactics::TAC1_NAME,  :tac1, Nana::EZ_Tactics::TAC1_SW == 0 || $game_switches[Nana::EZ_Tactics::TAC1_SW]) unless Nana::EZ_Tactics::TAC1_NAME == ""
    add_command(Nana::EZ_Tactics::TAC2_NAME,  :tac2, Nana::EZ_Tactics::TAC2_SW == 0 || $game_switches[Nana::EZ_Tactics::TAC2_SW]) unless Nana::EZ_Tactics::TAC2_NAME == ""
    add_command(Nana::EZ_Tactics::TAC3_NAME,  :tac3, Nana::EZ_Tactics::TAC3_SW == 0 || $game_switches[Nana::EZ_Tactics::TAC3_SW]) unless Nana::EZ_Tactics::TAC3_NAME == ""
    add_command(Vocab::escape, :escape, BattleManager.can_escape?)
  end
end

#==============================================================================
# ■ RPG::State
#------------------------------------------------------------------------------
#  ステートのデータクラス。
#==============================================================================

class RPG::State < RPG::BaseItem
  #--------------------------------------------------------------------------
  # ● 作戦ステートかどうか
  #--------------------------------------------------------------------------
  def tactics?
    list = []
    Nana::EZ_Tactics::TAC1_STATE.class == Array ?
      list += Nana::EZ_Tactics::TAC1_STATE : list += [Nana::EZ_Tactics::TAC1_STATE]
    Nana::EZ_Tactics::TAC2_STATE.class == Array ?
      list += Nana::EZ_Tactics::TAC2_STATE : list += [Nana::EZ_Tactics::TAC2_STATE]
    Nana::EZ_Tactics::TAC3_STATE.class == Array ?
      list += Nana::EZ_Tactics::TAC3_STATE : list += [Nana::EZ_Tactics::TAC3_STATE]
    list.include?(self.id)
  end
end


#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● パーティコマンドウィンドウの作成
  #--------------------------------------------------------------------------
  def create_party_command_window
    @party_command_window = Window_PartyCommand.new
    @party_command_window.viewport = @info_viewport
    @party_command_window.set_handler(:tac1,  method(:command_tac1)) unless Nana::EZ_Tactics::TAC1_NAME == ""
    @party_command_window.set_handler(:tac2,  method(:command_tac2)) unless Nana::EZ_Tactics::TAC2_NAME == ""
    @party_command_window.set_handler(:tac3,  method(:command_tac3)) unless Nana::EZ_Tactics::TAC3_NAME == ""
    @party_command_window.set_handler(:escape, method(:command_escape))
    @party_command_window.unselect
  end
  #--------------------------------------------------------------------------
  # ● コマンド[作戦1]
  #--------------------------------------------------------------------------
  def command_tac1
    if Nana::EZ_Tactics::TAC1_STATE.class == Array
      $game_party.members.each_with_index do |actor,index|
        actor.add_state(Nana::EZ_Tactics::TAC1_STATE[index]) if Nana::EZ_Tactics::TAC1_STATE[index] && Nana::EZ_Tactics::TAC1_STATE[index] != 0
      end
    else
      $game_party.members.each do |actor|
        actor.add_state(Nana::EZ_Tactics::TAC1_STATE) if Nana::EZ_Tactics::TAC1_STATE != 0
      end
    end
    refresh_status
    $game_party.make_actions
    next_command
  end
  #--------------------------------------------------------------------------
  # ● コマンド[作戦2]
  #--------------------------------------------------------------------------
  def command_tac2
    if Nana::EZ_Tactics::TAC2_STATE.class == Array
      $game_party.members.each_with_index do |actor,index|
        actor.add_state(Nana::EZ_Tactics::TAC2_STATE[index]) if Nana::EZ_Tactics::TAC2_STATE[index] && Nana::EZ_Tactics::TAC2_STATE[index] != 0
      end
    else
      $game_party.members.each do |actor|
        actor.add_state(Nana::EZ_Tactics::TAC2_STATE) if Nana::EZ_Tactics::TAC2_STATE != 0
      end
    end
    p $game_party.members[0].states
    refresh_status
    $game_party.make_actions
    next_command
  end
  #--------------------------------------------------------------------------
  # ● コマンド[作戦3]
  #--------------------------------------------------------------------------
  def command_tac3
    if Nana::EZ_Tactics::TAC3_STATE.class == Array
      $game_party.members.each_with_index do |actor,index|
        actor.add_state(Nana::EZ_Tactics::TAC3_STATE[index]) if Nana::EZ_Tactics::TAC3_STATE[index] && Nana::EZ_Tactics::TAC3_STATE[index] != 0
      end
    else
      $game_party.members.each do |actor|
        actor.add_state(Nana::EZ_Tactics::TAC3_STATE) if Nana::EZ_Tactics::TAC3_STATE != 0
      end
    end
    p $game_party.members[0].states
    refresh_status
    $game_party.make_actions
    next_command
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の開始
  #--------------------------------------------------------------------------
  alias start_party_command_selection_n7eztac start_party_command_selection
  def start_party_command_selection
    unless scene_changing?
      $data_states.each do |state|
        next unless state && state.tactics?
        $game_party.members.each do |actor|
          actor.remove_state(state.id)
        end
      end
    end
    start_party_command_selection_n7eztac
  end
end

#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス
# は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。
#==============================================================================

class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● ステートの解除
  #--------------------------------------------------------------------------
  def remove_state(state_id)
    if state?(state_id)
      revive if state_id == death_state_id
      erase_state(state_id)
      refresh
      @result.removed_states.push(state_id).uniq! unless $data_states[state_id].tactics?
    end
  end
end