class Scene_Battle < Scene_Base
  attr_accessor :turn_state_flag
  attr_accessor :turn_sequence_update
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if BattleManager.in_turn?
      process_event
      process_action
    end
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias tako3245start start
  def start
    BattleManager.init_turn 
    BattleManager.get_chara_battle_turn    
    @turn_sequence_update = -1
    tako3245start
   
  end  
  #--------------------------------------------------------------------------
  # ● 戦闘開始u
  #--------------------------------------------------------------------------
  def battle_start
    BattleManager.battle_start
    process_event
    @subject = BattleManager.battler
    battler_command 
  end 
  
  #--------------------------------------------------------------------------
  # ● ターン開始 
  #--------------------------------------------------------------------------
  def turn_start
    @party_command_window.close
    @actor_command_window.close
    @status_window.unselect
    BattleManager.turn_start    
    @subject = BattleManager.battler 
    @log_window.wait
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● ターン終了u
  #--------------------------------------------------------------------------
  def turn_end
    @subject.on_turn_end if @subject
    all_battle_members.each do |battler|
      battler.on_turn_end
      refresh_status
      @log_window.wait_and_clear
    end
    BattleManager.turn_end
    process_event
  end 
  
  def set_battle_turn
    BattleManager.get_chara_battle_turn
    @turn_table_window.clear_target_enemy    
    @turn_table_window.turnList = BattleManager.make_turnSquence if  check_turn_sequence
    @subject = BattleManager.battler
    chara_state_update if @subject
    @subject.turn_count += 1 if @subject 
    battler_command     
  end 

  def check_turn_sequence
    @turn_sequence_update += 1 
    if @turn_sequence_update == BattleManager.turn_count 
      return true
    else  
      @turn_sequence_update = BattleManager.turn_count 
      return false
    end
  end  
      
  def add_debug_value
    @turn_table_window.debug_value += 1
    @turn_table_window.refresh
  end
  
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    if !@subject || !@subject.current_action
      turn_end      
    end
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        @status_window.open
        execute_action
      end
      @subject.remove_current_action
    end    
    process_action_end unless @subject.current_action
  end

  #--------------------------------------------------------------------------
  # ● 戦闘行動終了時の処理
  #--------------------------------------------------------------------------
  alias tako3process_action_end process_action_end
  def process_action_end
    tako3process_action_end
    BattleManager.turn_end
    process_event
    @subject.on_turn_end if @subject
    set_battle_turn if !BattleManager.judge_win_loss_bool && BattleManager.phase
  end

  #キャラがアクターか否かによる分岐
  def battler_command
    
    if @subject && @subject.actor?
      start_party_command_selection
    elsif @subject
      @subject.make_actions 
      turn_start
    else 
      set_battle_turn
    end      
  end
  
  def chara_state_update
    @subject.update_state_turns    
    @subject.update_buff_turns 
    @subject.regenerate_all
    @subject.result.clear
    @subject.remove_states_auto(2)    
    @log_window.display_auto_affected_status(@subject)
  end

  #--------------------------------------------------------------------------
  # ● ターンテーブルウィンドウの作成
  #--------------------------------------------------------------------------
  def turn_table_window
    @turn_table_window = Window_Turn_Table.new(0,0)
    @turn_table_window.turnList = BattleManager.make_turnSquence
  end  
  #--------------------------------------------------------------------------
  # ● 全ウィンドウの作成
  #--------------------------------------------------------------------------
  alias tako3344create_all_windows create_all_windows
  def create_all_windows
    turn_table_window
    tako3344create_all_windows
  end  
  #--------------------------------------------------------------------------
  # ● 敵キャラウィンドウの作成
  #--------------------------------------------------------------------------
  def create_enemy_window
    @enemy_window = Window_BattleEnemy.new(@info_viewport)
    @enemy_window.set_handler(:ok,     method(:on_enemy_ok))
    @enemy_window.set_handler(:cancel, method(:on_enemy_cancel))
    @enemy_window.turn_table_window = @turn_table_window
    
  end  

  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  alias tako34564select_enemy_selection select_enemy_selection
  def select_enemy_selection
    tako34564select_enemy_selection
    speed_value = - BattleManager.actor.input.item.speed * $prepare_skill_degree 
    @turn_table_window.turnList = BattleManager.make_turnSquence(speed_value) 
    @enemy_window.update_turn_table
    
  end  

  def set_prepare_skill(target)
    pAction = BattleManager.actor.input
    pSkillIndex = pAction.item.id
    BattleManager.actor.prepare_skill = [pSkillIndex,target]
    BattleManager.actor.clear_actions
    BattleManager.actor.add_state($prepare_skill_state_id)    
  end  
  
  #--------------------------------------------------------------------------
  # ● 敵キャラ［決定］
  #--------------------------------------------------------------------------
  alias tako4554tttttte1on_enemy_ok on_enemy_ok
  def on_enemy_ok
    pitem = BattleManager.actor.input.item
    if pitem.class == RPG::Skill && pitem.speed < 0
      set_prepare_skill(@enemy_window.enemy.index)
      @enemy_window.hide
      @skill_window.hide
      @item_window.hide
      next_command      
    else  
      tako4554tttttte1on_enemy_ok 
    end  
  end  
  
  #--------------------------------------------------------------------------
  # ● アクター［決定］
  #--------------------------------------------------------------------------
  alias tako4554tttttte1on_actor_ok on_actor_ok
  def on_actor_ok
    pitem = BattleManager.actor.input.item
    if pitem.class == RPG::Skill && pitem.speed < 0
      set_prepare_skill(@actor_window.index)
      @actor_window.hide
      @skill_window.hide
      @item_window.hide
      next_command      
    else  
      tako4554tttttte1on_actor_ok 
    end      
  end    
  
  #--------------------------------------------------------------------------
  # ● スキル［決定］
  #--------------------------------------------------------------------------
  def on_skill_ok

    @skill = @skill_window.item
    BattleManager.actor.input.set_skill(@skill.id)
    BattleManager.actor.last_skill.object = @skill

    if !@skill.need_selection?
      
      pitem = BattleManager.actor.input.item
           
      set_prepare_skill(-1) if @skill.class == RPG::Skill && @skill.speed < 0 
      @skill_window.hide
      next_command
    elsif @skill.for_opponent?
      select_enemy_selection
    else
      select_actor_selection
    end
  end      
end  