#==============================================================================
# ★ RGSS3_自動戦闘 Ver1.01
#==============================================================================
=begin

作者:tomoaky
webサイト:ひきも記 ([url]http://hikimoki.sakura.ne.jp/[/url])

增加命令“自动”和“重复”,两种指令追加。
自动全体演员这回合只自动战斗的状态,
重复的全体演员前面的回合采取的行动自动选择。
附加功能全自动战斗开关(初期设定在7号)开了间
遇敌从地图场面回到为止都是自动化。
===注意点===
・前的回合一样行动成本不足等不能实行的场合攻击
、1回合中重复选择的情况全演员的行动,攻击
・前回合开始时被选择的行动重复的对象,
成本不足重复的内容发生变化时,下一次的回合以后也变化了
使用游戏(初期设定)开关
0007,0008
2012.01.17版本1.01
・逃跑指令失败后重复的命令不正确动作极化
2011.12.15版本1.0
公开

=end

#==============================================================================
# □ 設定項目
#==============================================================================
module TMATBTL
  SW_FULLAUTO = 7     # 完全自動戦闘フラグとして扱うゲームスイッチ番号
  SW_FULLFAST = 8     # 完全自動戦闘の早送りフラグとして扱うゲームスイッチ番号
end

#==============================================================================
# ■ Vocab
#==============================================================================
module Vocab
  AutoBattle    = "自动"         # 自動戦闘コマンド名
  RepeatBattle  = "重复"       # 繰り返し戦闘コマンド名
end

#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :repeat_commands          # 前ターンの行動内容
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias tmatbtl_game_temp_initialize initialize
  def initialize
    tmatbtl_game_temp_initialize
    @repeat_commands = []
  end
end

#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message
  #--------------------------------------------------------------------------
  # ● 入力待ち処理
  #--------------------------------------------------------------------------
  alias tmatbtl_window_message_input_pause input_pause
  def input_pause
    if $game_party.in_battle && $game_switches[TMATBTL::SW_FULLAUTO]
      wait($game_switches[TMATBTL::SW_FULLFAST] ? 30 : 60)
    else
      tmatbtl_window_message_input_pause
    end
  end
end

#==============================================================================
# ■ Window_PartyCommand
#==============================================================================
class Window_PartyCommand
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  alias tmatbtl_window_partycommand_make_command_list make_command_list
  def make_command_list
    tmatbtl_window_partycommand_make_command_list
    add_command(Vocab::AutoBattle,   :auto)
    add_command(Vocab::RepeatBattle, :repeat)
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  # ● 早送り判定
  #--------------------------------------------------------------------------
  alias tmatbtl_scene_battle_show_fast? show_fast?
  def show_fast?
    tmatbtl_scene_battle_show_fast? || ($game_switches[TMATBTL::SW_FULLAUTO] &&
      $game_switches[TMATBTL::SW_FULLFAST])
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias tmatbtl_scene_battle_create_party_command_window create_party_command_window
  def create_party_command_window
    tmatbtl_scene_battle_create_party_command_window
    @party_command_window.set_handler(:auto,   method(:command_auto))
    @party_command_window.set_handler(:repeat, method(:command_repeat))
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の開始
  #--------------------------------------------------------------------------
  alias tmatbtl_scene_battle_start_party_command_selection start_party_command_selection
  def start_party_command_selection
    tmatbtl_scene_battle_start_party_command_selection
    if $game_switches[TMATBTL::SW_FULLAUTO]
      command_auto unless scene_changing?
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘開始
  #--------------------------------------------------------------------------
  alias tmatbtl_scene_battle_battle_start battle_start
  def battle_start
    tmatbtl_scene_battle_battle_start
    $game_temp.repeat_commands = []
  end
  #--------------------------------------------------------------------------
  # ● ターン開始
  #--------------------------------------------------------------------------
  alias tmatbtl_scene_battle_turn_start turn_start
  def turn_start
    $game_party.members.each_with_index do |actor, i|
      next unless actor.inputable?
      $game_temp.repeat_commands[i] = []
      actor.actions.each do |action|
        $game_temp.repeat_commands[i].push(action.clone)
      end
    end
    tmatbtl_scene_battle_turn_start
  end
  #--------------------------------------------------------------------------
  # ○ コマンド[オート]
  #--------------------------------------------------------------------------
  def command_auto
    $game_party.members.each do |actor|
      actor.make_auto_battle_actions if actor.inputable?
    end
    @party_command_window.deactivate
    turn_start
  end
  #--------------------------------------------------------------------------
  # ○ コマンド[リピート]
  #--------------------------------------------------------------------------
  def command_repeat
    $game_party.members.each_with_index do |actor, i|
      next unless actor.inputable?
      actor.actions.clear
      if !$game_temp.repeat_commands[i] || $game_temp.repeat_commands[i].empty?
        $game_temp.repeat_commands[i] =
          [Game_Action.new(actor).set_attack.evaluate]
      end
      $game_temp.repeat_commands[i].each do |action|
        actor.actions.push(action.clone)
        actor.actions[actor.actions.size - 1].set_attack unless action.valid?
      end
    end
    @party_command_window.deactivate
    turn_start
  end
end