class Game_Actor < Game_Battler

  #--------------------------------------------------------------------------
  # ● 戦闘行動の作成
  #--------------------------------------------------------------------------
  alias tako09yyuttinitialize initialize
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(actor_id)
    tako09yyuttinitialize(actor_id)
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の作成
  #--------------------------------------------------------------------------
  alias tako09yyumake_actions make_actions
  def make_actions
    tako09yyumake_actions 
    if state?($prepare_skill_state_id)
      clear_actions
      execute_prepare_skill_actions
      @prepare_skill = [0,0]
    end
  end    

end  

class Game_Battler < Game_BattlerBase
  attr_accessor :prepare_skill  
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias tako314596initialize initialize
  def initialize
    tako314596initialize
    @prepare_skill = [0,0]
  end    
  #--------------------------------------------------------------------------
  # ● スキル／アイテムの使用
  #    行動側に対して呼び出され、使用対象以外に対する効果を適用する。
  #--------------------------------------------------------------------------
  alias tako6559659use_item use_item
  def use_item(item)
  
    tako6559659use_item(item)
    if state?($prepare_skill_state_id)
      erase_state($prepare_skill_state_id) 
    end  
 
  end
  
  #--------------------------------------------------------------------------
  # ● 魔法準備時の戦闘行動を作成
  #--------------------------------------------------------------------------
  def execute_prepare_skill_actions
    force_action(@prepare_skill[0]  , @prepare_skill[1] )
  end  

  #--------------------------------------------------------------------------
  # ● ターン終了処理
  #--------------------------------------------------------------------------
  def on_turn_end
    @result.clear    
    
  end
  
  def prepare_skill_item
    aa if @prepare_skill[0] == 0
    $data_skills[@prepare_skill[0]]
  end  
  
  def prepare_skill_time
    return (-1) * prepare_skill_item.speed * $prepare_skill_degree if prepare_skill_item
    return 10000000
  end    
  
  def check_battle_turn(value)
    (@turn_value >= value) || check_battle_turn_magic
  end 
  
  def check_battle_turn_magic
    state?($prepare_skill_state_id) && (@turn_value_magic >= prepare_skill_time)

  end  
  
  def check_battle_turn_t(value)
    (@turn_value_t >= value) || check_battle_turn_magic_t
  end   

  def check_battle_turn_magic_t
    return @turn_value_magic_t >= turn_skill_speed_value if  turn_skill_speed_value > 0
    return (state?($prepare_skill_state_id)) && @turn_value_magic_t >= prepare_skill_time
  end    
  
  def check_skill_state
    state?($prepare_skill_state_id) #&& !state?($prepare_skill_state_id + 1)
  end  
    
  
  def clear_turn_state_flag
    @turn_state_flag = 0
  end  

#--------------------------------------------------------------------------
  # ● スキル／アイテムの効果適用
  #--------------------------------------------------------------------------
  def item_apply(user, item)
    @result.clear
    @result.used = item_test(user, item)
    @result.missed = (@result.used && rand >= item_hit(user, item))
    @result.evaded = (!@result.missed && rand < item_eva(user, item))
    if @result.hit?
      unless item.damage.none?
        @result.critical = (rand < item_cri(user, item))
        make_damage_value(user, item)
        execute_damage(user)
        change_turn_count(item)
      end
      item.effects.each {|effect| item_effect_apply(user, item, effect) }
      item_user_effect(user, item)
      
    end
  end
  def change_turn_count(item)

    return unless $change_turn_count_list.include?(item.id)
    self.turn_value /= 2  
    self.turn_value_magic /= 2  
  end    

end  
class Game_BattlerBase  
  attr_accessor :turn_value
  attr_accessor :turn_value_t
  attr_accessor :turn_value_magic
  attr_accessor :turn_value_magic_t  
  attr_accessor :turn_count
  attr_accessor :turn_state_flag
  attr_accessor :turn_skill_speed_value
  attr_reader :turn_color
  
  alias tako3initialize initialize
  def initialize
    tako3initialize
    @turn_value = 0
    @turn_value_t = 0
    @turn_value_magic = 0
    @turn_value_magic_t = 0    
    @turn_state_flag = 0
    @turn_count = 0
    @skill_used_actions_value = 0
    @turn_color = 0
    @turn_skill_speed_value = 0
  end 
end  

class Game_Enemy < Game_Battler
  
  #--------------------------------------------------------------------------
  # ● 行動条件合致判定［ターン数］
  #--------------------------------------------------------------------------
  def conditions_met_turns?(param1, param2)
    n = @turn_count 
    if param2 == 0
      n == param1
    else
      n > 0 && n >= param1 && n % param2 == param1 % param2
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘終了処理
  #--------------------------------------------------------------------------
  def on_battle_end
    @result.clear
    remove_battle_states
    remove_all_buffs
    clear_actions
    clear_tp unless preserve_tp?
  end
  
  #--------------------------------------------------------------------------
  # ● 戦闘行動の作成
  #--------------------------------------------------------------------------
  alias tako5454548989make_actions make_actions
  def make_actions
    tako5454548989make_actions ##unless state?($prepare_skill_state_id)
    if state?($prepare_skill_state_id)
      clear_actions
      execute_prepare_skill_actions
      @prepare_skill = [0,0]
      return
    end
    return unless @actions[0]
    pitem = @actions[0].item
    tindex = @actions[0].target_index
    if pitem.class == RPG::Skill && pitem.speed < 0
      clear_actions      
      @prepare_skill = [pitem.id , tindex]
      add_state($prepare_skill_state_id)     
    end  
  end  
  
end 

class Game_Unit
  #--------------------------------------------------------------------------
  # ● 戦闘開始処理
  #--------------------------------------------------------------------------
  def on_battle_start
    @in_battle = true
  end
end  

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  

class Window_BattleEnemy < Window_Selectable
  attr_reader   :turn_table_window  
  
  alias tako666u66initialize initialize
  def initialize(info_viewport)
    tako666u66initialize(info_viewport)
    call_update_turn_table
  end  
  
  #--------------------------------------------------------------------------
  # ● ターンテーブルウィンドウの設定
  #--------------------------------------------------------------------------
  def turn_table_window=(turn_table_window)
    @turn_table_window = turn_table_window
    call_update_turn_table
  end  
  #--------------------------------------------------------------------------
  # ● ターンテーブル更新メソッドの呼び出し
  #--------------------------------------------------------------------------
  def call_update_turn_table
    update_turn_table if active && @turn_table_window
    
  end
  #--------------------------------------------------------------------------
  # ● ターンテーブルの更新
  #--------------------------------------------------------------------------
  def update_turn_table
    
    @turn_table_window.target_enemy = [enemy]

  end  
  #--------------------------------------------------------------------------
  # ● ターンテーブルのクリア
  #--------------------------------------------------------------------------
  def clear_turn_table
    @turn_table_window.target_enemy = []
    
  end    
  #--------------------------------------------------------------------------
  # ● キャンセルボタンが押されたときの処理
  #--------------------------------------------------------------------------
  alias tako99876process_cancel process_cancel
  def process_cancel
    clear_turn_table
    @turn_table_window.turnList = BattleManager.make_turnSquence 
    tako99876process_cancel
  end  
  
  #--------------------------------------------------------------------------
  # ● カーソルを下に移動
  #--------------------------------------------------------------------------
  alias tako99876cursor_down cursor_down
  def cursor_down(wrap = false)
    tako99876cursor_down(wrap)
    call_update_turn_table
  end
  #--------------------------------------------------------------------------
  # ● カーソルを上に移動
  #--------------------------------------------------------------------------
  alias tako99876cursor_up cursor_up
  def cursor_up(wrap = false)
    tako99876cursor_up(wrap)
    call_update_turn_table
  end
  #--------------------------------------------------------------------------
  # ● カーソルを右に移動
  #--------------------------------------------------------------------------
  alias tako99876cursor_right cursor_right
  def cursor_right(wrap = false)
    tako99876cursor_right(wrap)
    call_update_turn_table
    
  end
  #--------------------------------------------------------------------------
  # ● カーソルを左に移動
  #--------------------------------------------------------------------------
  alias tako99876cursor_left cursor_left
  def cursor_left(wrap = false)
    tako99876cursor_left(wrap)
    call_update_turn_table    
  end  
  
end  

class Window_Turn_Table < Window_Base
  attr_reader   :target_enemy 
  attr_accessor :debug_value

  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, window_width, window_height)
    @turnList = []
    @target_enemy = []
    @debug_value = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 標準パディングサイズの取得
  #--------------------------------------------------------------------------
  def standard_padding
    return 8
  end  
  
  def target_enemy=(target_enemy)
    @target_enemy = target_enemy
    refresh
  end  
  
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    return 32 * 8
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    return 36 + standard_padding * 2 + 32
  end
  #--------------------------------------------------------------------------
  # ● 表示行数の取得
  #--------------------------------------------------------------------------
  def visible_line_number
    return 1
  end
  #--------------------------------------------------------------------------
  # ● ターンリストの設定
  #--------------------------------------------------------------------------
  def turnList=(turnList)
    return if @turnList == turnList
    @turnList = turnList
    refresh
  end
  
  def clear_target_enemy
    @target_enemy = []
    refresh
  end    
  
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    @turnList.size.times {|i| draw_item(32 * i, 0, i) }
  end

  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(x, y, i)
    charadata = @turnList[i]
    return unless charadata 
    if charadata && charadata.actor?
      cname = charadata.character_name
      cindex = charadata.character_index
    else 

      if $enemy_character[charadata.enemy_id]
        charad = $enemy_character[charadata.enemy_id]      
      else
        charad = $default_enemy_character
 
      end  
      cname = charad[0]
      cindex = charad[1]  
    end   

    draw_character(cname, cindex , x , y + 6)
    
    if @target_enemy.include?(charadata )
      draw_character(cname, cindex , x , y + 6)
  
      draw_square(x , y + 6 )
    end
    
    if charadata.state?($prepare_skill_state_id)
      draw_icon(136, x + 6 , y + 36+ standard_padding, enabled = true)
    end  

  end
  
  #--------------------------------------------------------------------------
  # ● 歩行グラフィックの描画
  #--------------------------------------------------------------------------
  def draw_character(character_name, character_index, x, y)
    return unless character_name
    bitmap = Cache.character(character_name)
    sign = character_name[/^[\!\$]./]
    if sign && sign.include?('$')
      cw = bitmap.width / 3
      ch = bitmap.height / 4
    else
      cw = bitmap.width / 12
      ch = bitmap.height / 8
    end
    n = character_index
    src_rect = Rect.new((n%4*3+1)*cw, (n/4*4)*ch, cw, ch)
    
    contents.blt(x , y , bitmap, src_rect)

  end

  def draw_square(x, y )

    bitmap = Cache.system("Window.png")

    src_rect = Rect.new(32 * 2,32 * 2, 32, 32)
    contents.blt(x , y , bitmap, src_rect)
  end  
  
  #--------------------------------------------------------------------------
  # ● 能力値の名前を描画
  #--------------------------------------------------------------------------
  def draw_param_name(x, y, param_id)
    change_color(system_color)
    draw_text(x, y, 80, line_height, Vocab::param(param_id))
  end
  #--------------------------------------------------------------------------
  # ● 現在の能力値を描画
  #--------------------------------------------------------------------------
  def draw_current_param(x, y, param_id)
    change_color(normal_color)
    draw_text(x, y, 32, line_height, @actor.param(param_id), 2)
  end
  #--------------------------------------------------------------------------
  # ● 右向き矢印を描画
  #--------------------------------------------------------------------------
  def draw_right_arrow(x, y)
    change_color(system_color)
    draw_text(x, y, 22, line_height, "→", 1)
  end
  #--------------------------------------------------------------------------
  # ● 装備変更後の能力値を描画
  #--------------------------------------------------------------------------
  def draw_new_param(x, y, param_id)
    new_value = @temp_actor.param(param_id)
    change_color(param_change_color(new_value - @actor.param(param_id)))
    draw_text(x, y, 32, line_height, new_value, 2)
  end
  
  
end