#==============================================================================
# ■ ORIGINAL_ACT vol.1.20
# 盗む/変化/変身/召喚/状態
# 12/01/08
# @『仲間をたくさん呼びつつＡＢＣ_vol.03』→A『Enemy_Ex vol.1.01』→B『ORIGINAL_ACT vol.1.02』
#==============================================================================
class Game_Enemy < Game_Battler
  include Enemy_Ex
  attr_accessor :enemy_id                 # エネミーID
  attr_accessor :steal_item               # 盗めるアイテム
  attr_accessor :change_item              # アイテムに変化
  attr_accessor :enemy_change             # 変身する
  attr_accessor :auto_states              # オートステート
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  alias hidesp2_initialize initialize
  def initialize(troop_id, member_index)
    super()
    # 元の処理を呼び出し
    hidesp2_initialize(troop_id, member_index)
    # ■ オリジナル変数
    original_variable(@enemy_id)
  end
  #--------------------------------------------------------------------------
  # ■ オリジナル変数の初期化
  #--------------------------------------------------------------------------
  def original_variable(enemy_id)
    @enemy_id = enemy_id
    @change_item = [false,{},nil,false,false]
    @steal_item = [false,{},nil,false,false]
    # □Enemy_Ex未設定の場合Ex[0]を代入
    Enemy_Ex::Ex[enemy_id] == nil ? e = 0 : e = @enemy_id
    # □盗むアイテム
    Enemy_Ex::Ex[e]["盗む"][0].scan(/([iwag])([0-9]+)/)
    $1 != nil ? @steal_item[1][$1 + "n"] = $2.to_i : nil
    Enemy_Ex::Ex[e]["盗む"][1].scan(/([iwag])([0-9]+)/)
    $1 != nil ? @steal_item[1][$1 + "r"] = $2.to_i : nil
    # □変化アイテム
    Enemy_Ex::Ex[e]["変化"][0].scan(/([iwag])([0-9]+)/)
    $1 != nil ? @change_item[1][$1 + "r"] = $2.to_i : nil
    # □変身の初期化
    @enemy_change = [false,Enemy_Ex::Ex[e]["変身"]]
    # □状態を初期化
    if @auto_states != nil
      for i in @auto_states
        remove_state(i,true)
      end
    end
    # □状態の設定
    @auto_states = Enemy_Ex::Ex[e]["状態"]
    if auto_states != []
      for i in @auto_states
        add_state(i, true)
      end
    end
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  include Enemy_Ex
  #--------------------------------------------------------------------------
  # ■ スキルの効果適用
  #--------------------------------------------------------------------------
  alias hidesp2_skill_effect skill_effect
  def skill_effect(user, skill)
    # □ [アクター]→[エネミー]
    if skill != nil && user.is_a?(Game_Actor) && self.is_a?(Game_Enemy)
      #…………………………………………………………………………………………………
      # ■[ぬすむ]の場合
      #…………………………………………………………………………………………………
      if Enemy_Ex::STEAL.include?(skill.name)
        self.damage = Enemy_Ex::STEAL_DAMAGE
        self.steal_item[0] = true
        return true
      #…………………………………………………………………………………………………
      # ■[ぶんどる]の場合
      #…………………………………………………………………………………………………
      elsif Enemy_Ex::STEAL_ATTACK.include?(skill.name)
        if self.steal_item[4] == true
          self.damage = Enemy_Ex::STEAL_DAMAGE
          self.steal_item[0] = true
          self.steal_item[4] = false
          return true
        else
          self.steal_item[4] = true
        end
      #…………………………………………………………………………………………………
      # ■[へんか]の場合
      #…………………………………………………………………………………………………
      elsif  Enemy_Ex::CHANGE_ITEM.include?(skill.name)
        self.damage = Enemy_Ex::CHANGE_DAMAGE
        self.change_item[0] = true
        return true
      end
    # □ [エネミー]→[エネミー]
    elsif skill != nil && user.is_a?(Game_Enemy) && self.is_a?(Game_Enemy)
      #…………………………………………………………………………………………………
      # ■[変身]の場合
      #…………………………………………………………………………………………………
      if Enemy_Ex::CHENGE.include?(skill.name)
        self.damage = ""
        self.enemy_change[0] = true
        return true
      end
    end
    # 元の処理を呼び出し
    hidesp2_skill_effect(user, skill)
  end
  #--------------------------------------------------------------------------
  # ■[仲間を呼ぶ]の対象/エネミーIDを決定
  #--------------------------------------------------------------------------
  if Enemy_Ex::ORIGINAL_ACT == false
    def call_select(user,call_type = 0)
    end
  end
  #--------------------------------------------------------------------------
  # ■ 『仲間をたくさん呼びつつＡＢＣ_vol.03』の拡張機構
  #--------------------------------------------------------------------------
  alias hidesp2_call_select call_select
  def call_select(user,call_type = 0)
    calls = []
    # □指定がない場合は、Ex[0]を代入
    if Enemy_Ex::Ex[user.enemy_id] == nil
      call = Enemy_Ex::Ex[0]["召喚"]
    elsif Enemy_Ex::Ex[user.enemy_id]["召喚"] != []
      call = Enemy_Ex::Ex[user.enemy_id]["召喚"]
    else
      call = Enemy_Ex::Ex[0]["召喚"]
    end
    for x in 0...call.size
      # □トループの順番を取得(出現位置)
      call[x].scan(/([nt])([+-]*[0-9]+)/)
      if $1 == nil or $2 == nil
        p "仲間を呼ぶトループ順番が無効！" ;Error!
      elsif $1 == "n"
        num = $2.to_i
      elsif $1 == "t"
        num = user.member_index + $2.to_i + 1
        if num > $game_troop.enemies.size or num <= 0
          p "仲間を呼ぶトループ順番が無効！" ;Error!
        end
      end
      # □エネミーの種類を取得(エネミーID)
      call[x].scan(/([i])([0-9]+)/)
      if $1 == nil or $2 == nil
        p "仲間を呼ぶトループ番号が無効！" ;Error!
      else
        $2.to_i == 0 ? id = user.enemy_id : id = $2.to_i
      end
      
      
      # □呼び出すエネミーの設定(ランダム)
      if num == 0
        for ep in 0...$game_troop.enemies.size
          call_id = rand($game_troop.enemies.size)
          enemy_p = $game_troop.enemies[call_id]
          if enemy_p != nil && enemy_p != user && ! enemy_p.exist?
            calls.push({"開始"=>true,"対象"=>[enemy_p],"使用者ID"=>id})
            break
          end
        end
      # □呼び出すエネミーの設定(指定)
      else
        # □無効なトループ番号を指定した場合
        if num > $game_troop.enemies.size
          enemy_p = user
        else
          enemy_p = $game_troop.enemies[num - 1]
        end
        calls.push({"開始"=>true,"対象"=>[enemy_p],"使用者ID"=>id})
      end
    end
    # □"召喚"配列の左側ほど、選択確率が高い
    rata = 2
    r_rata = 1
    while $game_troop.enemies.size > r_rata
      for e in calls
        enemy = e["対象"][0]
        # □失敗の場合を含める
        if rand(100 * r_rata) > (100 / rata) && (! enemy.exist? or enemy == user)
          return e
          break
        end
        rata += 1
      end
      r_rata += 1
    end
    # □失敗の場合を代入
    return {"開始"=>true,"対象"=>[user],"使用者ID"=>user.enemy_id}
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  include Enemy_Ex
  #--------------------------------------------------------------------------
  # ■ フレーム更新 (メインフェーズ ステップ 3 : 行動側アニメーション)
  #--------------------------------------------------------------------------
  alias hidesp_update_phase4_step3 update_phase4_step3
  def update_phase4_step3
    if @return_action == nil
      # 元の処理を呼び出し
      hidesp_update_phase4_step3
      return
    end
    # □ヘルプウィンドウを隠す
    @help_window.visible = false
    # □行動側アニメーション無し
    @active_battler.animation_id = 0
    @active_battler.animation_hit = false
    @phase4_step = 4
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション)
  #--------------------------------------------------------------------------
  alias hidesp_update_phase4_step4 update_phase4_step4
  def update_phase4_step4
    if @return_action == nil
      # 元の処理を呼び出し
      hidesp_update_phase4_step4
      return
    end
    # □対象側アニメーション無し
    @return_action.animation_id = 0
    @return_action.animation_hit = false
    # □連続行動フラグOFF
    @return_action = nil
    @phase4_step = 5
  end
  #--------------------------------------------------------------------------
  # ■ スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias hidesp_make_skill_action_result make_skill_action_result
  def make_skill_action_result
    if @return_action == nil
      # 元の処理を呼び出し
      hidesp_make_skill_action_result
      return
    end
    # スキルを取得
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # 対象側バトラーを設定
    set_target_battlers(@skill.scope)
    # スキルの効果を適用
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill)
    end
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  alias hidesp2_update_phase4_step5 update_phase4_step5
  def update_phase4_step5
    # スキルの効果範囲を敵単体に設定している為ターゲットは[0]
    tc = @target_battlers[0]
    if tc != nil
      if tc.is_a?(Game_Enemy)
        #…………………………………………………………………………………………………
        # ■[へんか]の場合
        #…………………………………………………………………………………………………
        if tc.change_item[0] == true
          # アイテムデータの取得
          tc.change_item_effect(tc,@active_battler)
          @help_window.set_text_icon(tc,tc.change_item[2], 1)
          @wait_count = 40
          # [へんか]フラグOFF
          tc.change_item[0] = false
          # [へんか]成功の場合
          if tc.change_item[4] == true
            # 変化したモンスターの行動をクリア
            tc.current_action.clear
            # 隠れフラグをON(隠れる)
            tc.hidden = true
          end
        #…………………………………………………………………………………………………
        # ■[ぬすむ]の場合
        #…………………………………………………………………………………………………
        elsif tc.steal_item[0] == true
          # アイテムデータの取得
          tc.steal_item_effect(tc,@active_battler)
          @help_window.set_text_icon(tc,tc.steal_item[2], 1)
          @wait_count = 40
          # [ぬすむ]フラグOFF
          tc.steal_item[0] = false
        #…………………………………………………………………………………………………
        # ■[ぶんどる]の場合
        #…………………………………………………………………………………………………
        elsif tc.steal_item[4] == true
          if ! tc.exist?
            # [ぶんどる]フラグOFF
            tc.steal_item[4] = false
            @return_action = nil
          else
            @return_action = tc
            hidesp2_update_phase4_step5
            @phase4_step = 2
            return
          end
        #…………………………………………………………………………………………………
        # ■[変身]の場合
        #…………………………………………………………………………………………………
        elsif tc.enemy_change[0] == true
          # アニメの表示
          tc.animation_id = Enemy_Ex::CHENGE_ANIM
          @wait_count = 16
          tc.animation_hit = true
          if tc.enemy_change[1] != nil or tc.enemy_change[1] != []
            # □変身の候補が複数の場合ランダムに決定
            rd = rand(tc.enemy_change[1].size)
            # □トループの順番を取得(出現位置)
            tc.enemy_change[1][rd].scan(/([nr])([0-9]+)/)
            if $1 == nil or $2 == nil
              p "変身後のエネミーIDが無効！" ;Error!
            elsif $1 == "n"
              recover = false
            elsif $1 == "r"
              recover = true
            end
            new_enemy = $2.to_i
            # □変身処理の実行
            if new_enemy == 0 or new_enemy >= $data_enemies.size
              p "変身後のエネミーIDが無効！" ;Error!
              return
            end
            # □エネミーの変身
            tc.transform(new_enemy)
            # □盗み済みフラグを格納
            old_steal = tc.steal_item[3]
            # □オリジナル変数の初期化
            tc.original_variable(new_enemy)
            if recover == true
              # □ステータスの初期化(全回復)
              tc.recover_all
            else
              # □盗み済みフラグを戻す
              tc.steal_item[3] = old_steal
            end
            #…………………………………………………………………………………………………
            # ■[変身]の場合
            #…………………………………………………………………………………………………
            if Enemy_Ex::ORIGINAL_ACT
              tc.enemy_call_hidden[tc.enemy_call_count] = true
              # □呼び出し回数を加算/plus_nameの初期化
              tc.plus_name = ""
              tc.enemy_call_count += 1
              # □隠れフラグ配列に格納
              tc.enemy_call_hidden.push(false)
              # □経験値を獲得する為にエネミーを格納
              $call_enemies.push([tc.member_index,tc.enemy_id,tc.enemy_call_count])
              # □エネミー名+アルファベットの実行
              make_abc_name($call_enemies)
            end
            return
          else
            p "変身後のエネミーIDが無効！" ;Error!
          end
        else
          # 元の処理を呼び出し
          hidesp2_update_phase4_step5
          return
        end
        tc.damage_pop = true
        # ステップ 6 に移行
        @phase4_step = 6
        return
      end
    end
    # 元の処理を呼び出し
    hidesp2_update_phase4_step5
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ■装備品の名前配列を取得
  #--------------------------------------------------------------------------
  def equip_as?(a)
    equip_as = []
    if $data_weapons[a.weapon_id] != nil
      equip_as.push($data_weapons[a.weapon_id].name)
    end
    for i in [a.armor1_id,a.armor2_id,a.armor3_id,a.armor4_id]
      if $data_armors[i] != nil
        equip_as.push($data_armors[i].name)
      end
    end
    return equip_as
  end
  #--------------------------------------------------------------------------
  # ■[ぬすむ]アイテムの選択
  #--------------------------------------------------------------------------
  def steal_item_effect(enemy,actor)
    # □既に盗んでいる場合、分岐の終了
    if enemy.steal_item[3] == true or enemy.steal_item[1] == {}
      enemy.steal_item[2] = nil
      enemy.steal_item[3] = true
      return
    end
    #…………………………………………………………………………………………………
    # ■[ぬすむ]成功率(器用さに依存)
    #…………………………………………………………………………………………………
    actor_dex = (actor.dex / 100) + 1
    enemy_dex = (enemy.dex / 100) + 1
    #…………………………………………………………………………………………………
    # ■装備品による補正
    #…………………………………………………………………………………………………
    item_rata = Enemy_Ex::STEAL_RATA
    item_rea = Enemy_Ex::STEAL_REA_UP_RATA
    # □装備品の名前配列を取得
    equip_as = equip_as?(actor)
    for i in equip_as
      if Enemy_Ex::STEAL_UP.include?(i)
        item_rata *= Enemy_Ex::STEAL_UP_RATA
      end
      if Enemy_Ex::STEAL_REA.include?(i)
        item_rea *= Enemy_Ex::STEAL_REA_UP_RATA
      end
    end
    #…………………………………………………………………………………………………
    # ■盗みの成功判定
    #…………………………………………………………………………………………………
    if rand(enemy_dex * 10) < (actor_dex * item_rata)
      # □0:レア/1:ノーマル判定
      rand(100) < item_rea ? type = 0 : type = 1
    else
      type = 2 #失敗
    end
    # □アイテムの決定[ノーマル/レア]
    enemy.steal_item[2] = item_select?(enemy.steal_item[1],enemy.steal_item[2],type)
  end
  #--------------------------------------------------------------------------
  # ■[へんか]アイテムの選択
  #--------------------------------------------------------------------------
  def change_item_effect(enemy,actor)
    #…………………………………………………………………………………………………
    # ■残りHP(%)/成功判定の初期化
    #…………………………………………………………………………………………………
    rata = 100 / Enemy_Ex::CHANGE_HP
    # □装備品の名前配列を取得
    equip_as = equip_as?(actor)
    for i in equip_as
      if Enemy_Ex::CHANGE_UP.include?(i)
        rata = 100 / Enemy_Ex::CHANGE_UP_HP
      end
    end
    #…………………………………………………………………………………………………
    # ■変化の成功判定(HPがMAXHPのrata(%)以下の場合)
    #…………………………………………………………………………………………………
    enemy.hp <= enemy.maxhp / rata ? enemy.change_item[3] = true : enemy.change_item[3] = false
    enemy.change_item[3] == true  ? type = 0 : type = 2
    # □アイテムの決定
    enemy.change_item[2] = item_select?(enemy.change_item[1],enemy.change_item[2],type)
  end
  #--------------------------------------------------------------------------
  # ■アイテムの決定[ノーマル/レア]
  #--------------------------------------------------------------------------
  def item_select?(s_item,gain,type)
    if (s_item.include?(a = "ir") && type == 0) or (s_item.include?(a = "in") && type == 1)
      gain = $data_items[s_item[a]]
      $game_party.gain_item(s_item[a],1)
    elsif (s_item.include?(a = "wr") && type == 0) or (s_item.include?(a = "wn") && type == 1)
      gain = $data_weapons[s_item[a]]
      $game_party.gain_weapon(s_item[a],1)
    elsif (s_item.include?(a = "ar") && type == 0) or (s_item.include?(a = "an") && type == 1)
      gain = $data_armors[s_item[a]]
      $game_party.gain_armor(s_item[a],1)
    elsif (s_item.include?(a = "gr") && type == 0) or (s_item.include?(a = "gn") && type == 1)
      gain = s_item[a].to_s + $data_system.words.gold
      $game_party.gain_gold(s_item[a])
    else
      gain = nil
    end
    return gain
  end
end
#==============================================================================
# ■ Window_Help
#==============================================================================
class Window_Help < Window_Base
  #--------------------------------------------------------------------------
  # ■ アイコン+テキスト設定
  #--------------------------------------------------------------------------
  def set_text_icon(user,data,align = 0)
    # テキストを再描画
    self.contents.clear
    text,text_back = "",""
    icon_on = false
    # □アイコン描画のチェック
    if data.is_a?(RPG::Item) or data.is_a?(RPG::Weapon) or 
      data.is_a?(RPG::Armor) or data.is_a?(RPG::Skill)
      if data.icon_name != ""
        text = data.name
        icon_on = true
      end
    end
    if user.is_a?(Game_Enemy)
      #…………………………………………………………………………………………………
      # ■ [へんか]の場合
      #…………………………………………………………………………………………………
      if user.change_item[0] == true
        if data != nil && user.change_item[3] == true
          # □変化した場合（成功）
          text_back = Enemy_Ex::CHANGE_OK
          user.change_item[4] = true
        else
          # □変化しない場合（失敗/未設定）
          text_back = Enemy_Ex::CHANGE_NO
        end 
      end
      #…………………………………………………………………………………………………
      # ■ [ぬすむ]の場合
      #…………………………………………………………………………………………………
      if user.steal_item[0] == true
        # □既に盗んでいる場合/未設定
        if user.steal_item[3] == true
          text = ""
          text_back = Enemy_Ex::STEAL_NOT
        # □盗めなかった場合(失敗)
        elsif data == nil
          text_back = Enemy_Ex::STEAL_NO
        # □[アイテム/武器/防具]を盗んだ場合(成功フラグをON)
        elsif icon_on
          text_back = Enemy_Ex::STEAL_OK
          user.steal_item[3] = true
        # □お金を盗んだ場合(成功フラグをON)
        else
          text = data
          text_back = Enemy_Ex::STEAL_OK
          user.steal_item[3] = true
        end
      end
    end
    # □テキストを合成
    text_x = text + text_back
    # □半角数字を全角数字に書き変える
    if text_x != ""
      num = "０１２３４５６７８９"
      text_x.gsub!(/\d/) { |n| num.scan(/./)[n.to_i] }
    end
    # □テキストの文字幅を取得
    cx = contents.text_size(text_x.to_s).width
    # □アイコンの描画
    if icon_on == true
      if data != nil
        icon = RPG::Cache.icon(data.icon_name)
        case align
        when 0
          cxx = 4
          tx = 24 + 8
        when 1
          cxx = 320 - 28 - (cx / 2)
          tx = 8
        when 2
          cxx = 640 - cx - 64
          tx = 4 - 28
        end
          # □アイコンの描画
        self.contents.blt(cxx,4,icon,Rect.new(0,0,24,24))
      end
      # □テキストの描画
      self.contents.draw_text(tx,0,28 + self.width - 40, 32, text_x.to_s,align)
    else
      # □テキストの描画
      self.contents.draw_text(4,0,self.width - 40, 32, text_x.to_s,align)
    end
    self.visible = true
  end
end
#==============================================================================
# ■ Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
  #--------------------------------------------------------------------------
  # ■ エスケープ音をコラプス音に変更
  #--------------------------------------------------------------------------
  alias hidesp2_update update
  def update
    # 変化させた場合、コラプス音がエスケープ音だと変なので変更！
    if @battler.is_a?(Game_Enemy) && $escape_se == nil
      if @battler.change_item[4] == true
        $escape_se = $data_system.escape_se
        $data_system.escape_se = $data_system.enemy_collapse_se
      end
    end
    hidesp2_update
    # エスケープ音を変更している場合、戻す
    if $data_system.escape_se ==  $data_system.enemy_collapse_se
      $data_system.escape_se = $escape_se
      $escape_se = nil
    end
  end
end