#==============================================================================
# ■ Call_EnemyABC vol.3.40
#------------------------------------------------------------------------------
# 仲間をたくさん仲間を呼ぶ/エネミー名にABC(番号)を付ける
# 12/07/15
#==============================================================================
module Call_EnemyABC
  #==============================================================================
  # ■『ORIGINAL_ACT』との併用[true/false]
  #==============================================================================
    ORIGINAL_ACT = false
  #==============================================================================
  # ■ エネミー名にABC(番号)を付ける[true/false]
  #==============================================================================
    ABC_NAME = true
  #==============================================================================
  # ■ 追加文字ABCに全角を使用する(false=半角)
  #==============================================================================
    ABC = true
  #==============================================================================
  # ■ スキルに追加した名前(効果範囲：自分自身)
  #==============================================================================
    # □仲間を呼ぶスキル名を設定
    CALL = []
    CALL[0] = "仲間を呼ぶ"
    CALL[1] = "召喚"
    # □呼び出された場合のアニメーションIDを設定
    CALL_ANIM = []
    CALL_ANIM[0] = 1 #CALL[0]のアニメ
    CALL_ANIM[1] = 2
    
  #==============================================================================
  # ■ 呼び出せるエネミーの最大数
  #==============================================================================
    # □無限に仲間を呼ぶことを禁止
    CALL_MAX = 32
  #==============================================================================
  # ■ 失敗した場合のダメージ文字
  #==============================================================================
    MISS = "miss!"
  #==============================================================================
  
  #--------------------------------------------------------------------------
  # ■ エネミー名+アルファベット
  #--------------------------------------------------------------------------
  def make_abc_name(troop)
    # □名前リストを作成
    names = []
    for i in troop
      names.push($data_enemies[i[1]].name)
    end
    names = names.uniq
    # □グループ数を取得
    group = [0]*names.size
    for i in 0...names.size
      for z in troop
        if $data_enemies[z[1]].name == names[i]
          group[i] += 1
        end
      end
    end
    # □リスト番号を設定
    for i in 0...names.size
      for x in 0...group[i]
        for n in 0...troop.size
          enemy = $game_troop.enemies[troop[n][0]]
          if names[i] == enemy.name && enemy.plus_name == ""
            # □隠れフラグがOFFの場合、バトル開始の場合
            if enemy.enemy_call_count == 0 && enemy.hidden == false
              enemy.plus_name = x
              break
            # □隠れフラグがONの場合、新たに呼び出された場合
            else
              enemy.plus_name = group[i] - 1
              break
            end
          end
        end
      end    
    end
    # □名前と出現数を取得
    $enemies_abc = {}
    for i in 0...names.size
      $enemies_abc[names[i]] = group[i]
    end
  end
end
#==============================================================================
# ■ Window_Help
#==============================================================================
class Window_Help < Window_Base
  #--------------------------------------------------------------------------
  # ■ エネミーの名前に通し番号(ABC..)
  #--------------------------------------------------------------------------
  if Call_EnemyABC::ABC_NAME
    if !$@;alias hidesp_name_plus_set_enemy set_enemy;end
    def set_enemy(enemy)
      if enemy.plus_name != ""
        # □ABC合成名を取得
        text = plus_name?(enemy)
        set_text(text, 1)
      else
        # □元の処理を呼び出し
        hidesp_name_plus_set_enemy(enemy)
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ■ ABC合成名を取得
  #--------------------------------------------------------------------------
  if Call_EnemyABC::ABC_NAME
    def plus_name?(enemy)
      # □グループ番号のアルファベット化
      plus = enemy.plus_name
      # □Zを超える場合は、Aに戻る
      plus > 25 ? plus -= 26 * (plus/26) : 
      # □出現数が1の場合は、ABCを付けない
      if (plus == 0 && $enemies_abc[enemy.name] == 1)
        plus = ""
      end
      plus_name = plus.to_s
      if Call_EnemyABC::ABC
        abc = "ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ"
      else
        abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      end
      plus_name.gsub!(/\d+/) { |n| abc.scan(/./)[n.to_i] }
      # □エネミー名の合成
      text = enemy.name + plus_name
      state_text = make_battler_state_text(enemy, 112, false)
      if state_text != ""
        text += "  " + state_text
      end
      return text
    end
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  include Call_EnemyABC
  attr_accessor :enemy_id                 # エネミーID
  attr_accessor :enemy_call               # 仲間を呼ぶ
  attr_accessor :plus_name                # エネミー名に付ける通し番号（ABC..）
  attr_accessor :enemy_call_count         # 呼び出された回数
  attr_accessor :enemy_call_hidden        # 仲間を呼ぶから除外するエネミー配列
  attr_accessor :member_index             # トループメンバーのインデックス
  attr_accessor :call_index               # 演出のindex
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_name_plus_initialize initialize;end
  def initialize(troop_id, member_index)
    # □初期化
    call_clear
    # □元の処理を呼び出し
    hidesp_name_plus_initialize(troop_id, member_index)
  end
  #--------------------------------------------------------------------------
  # ■ 初期化
  #--------------------------------------------------------------------------
  def call_clear
    @enemy_call = {"開始"=>false,"対象"=>nil,"使用者ID"=>nil}
    @plus_name = ""
    @enemy_call_count = 0
    @enemy_call_hidden = []
    @call_index = 0
    # □呼び出されたエネミーを含めたエネミー配列
    $call_enemies = []
  end
  #--------------------------------------------------------------------------
  # ■ 隠れフラグが変化した場合、エネミーグループの再構築
  #--------------------------------------------------------------------------
  def hidden=(hidden)
    if hidden == true
      # □隠れフラグ配列をON
      self.enemy_call_hidden[self.enemy_call_count] = true
    end
    super
  end
end
#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  #--------------------------------------------------------------------------
  # ■ スキルの効果適用
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_enemy_call_skill_effect skill_effect;end
  def skill_effect(user, skill)
    # □エネミー専用
    if skill != nil && user.is_a?(Game_Enemy)
      #…………………………………………………………………………………………………
      # ■[仲間を呼ぶ]の場合
      #…………………………………………………………………………………………………
      if Call_EnemyABC::CALL.include?(skill.name)
        user.call_index = Call_EnemyABC::CALL.index(skill.name)
        self.critical = false
        self.damage = ""
        # □無限に仲間を呼ぶことを禁止(最大数を指定する)
        if $call_enemies.size >= Call_EnemyABC::CALL_MAX
          # □変数の初期化
          user.enemy_call = {"開始"=>false,"対象"=>nil,"使用者ID"=>nil}
          # □元の処理を呼び出し
          hidesp_enemy_call_skill_effect(user, skill)
          return
        end
        # □仲間を呼ぶ
        self.enemy_call = call_select(user,0)
      end
    end
    # □元の処理を呼び出し
    hidesp_enemy_call_skill_effect(user, skill)
  end
  #--------------------------------------------------------------------------
  # ■[仲間を呼ぶ]の対象/エネミーIDを決定
  #--------------------------------------------------------------------------
  def call_select(user,call_type = 0)
    case call_type
    when 0 # □使用者と同じID/対象ランダム
      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
          c = {"開始"=>true,"対象"=>[enemy_p],"使用者ID"=>user.enemy_id}
          break
        end
      end
    end
    return c
  end
end
#==============================================================================
# ■ Scene_Battle
#==============================================================================
class Scene_Battle
  include Call_EnemyABC
  #--------------------------------------------------------------------------
  # ■ プレバトルフェーズ開始
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_name_plus_start_phase1 start_phase1;end
  def start_phase1
    hidesp_name_plus_start_phase1
    # □ABC名前配列の作成
    $call_enemies = []
    for i in $game_troop.enemies
      #…………………………………………………………………………………………………
      # ■ 競合対策(初期化)
      #…………………………………………………………………………………………………
      if i.enemy_call == nil
        i.call_clear
      end
      # □隠れフラグがONの場合を除外
      if i.hidden == false
        # □ABC名前配列に追加
        $call_enemies.push([i.member_index,i.enemy_id,0])
        # □隠れフラグ配列に格納
        i.enemy_call_hidden.push(false)
      else
        # □隠れフラグ配列に格納
        i.enemy_call_hidden.push(true)
      end
    end
    # □エネミー名+アルファベットの実行
    make_abc_name($call_enemies)
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示)
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_enemy_call_update_p4s5 update_phase4_step5;end
  def update_phase4_step5
    # □スキルの効果範囲を自分自身に設定している為ターゲットは[0]=使用者
    user = @target_battlers[0]
    if user != nil && user.is_a?(Game_Enemy)
      #…………………………………………………………………………………………………
      # ■ 競合対策(初期化)
      #…………………………………………………………………………………………………
      if user.enemy_call == nil
        for enemy in $game_troop.enemies
          if enemy.enemy_call == nil
            enemy.call_clear
          end
        end
        # □元の処理を呼び出し
        hidesp_enemy_call_update_p4s5
        return
      end
      #…………………………………………………………………………………………………
      # ■ 仲間を呼ぶの開始
      #…………………………………………………………………………………………………
      if user.enemy_call["開始"] == true
        # □呼び出されるエネミーを代入
        for target in user.enemy_call["対象"]
          #…………………………………………………………………………………………………
          # ■ 戦闘不能/隠れ状態のエネミーを呼び出す
          #…………………………………………………………………………………………………
          if ! target.exist?
            # □隠れフラグ配列をOFF
            target.enemy_call_hidden[target.enemy_call_count] = false
            # □変身させて呼び出す
            target.transform(user.enemy_call["使用者ID"])
            # □ステータスの初期化(全回復)
            target.recover_all
            # □呼び出された場合のアニメ
            target.animation_id = Call_EnemyABC::CALL_ANIM[user.call_index]
            target.animation_hit = true
            # □plus_nameの初期化
            target.plus_name = ""
            #…………………………………………………………………………………………………
            # ■ 既に呼び出されている場合/初めから隠れフラグがOFFの場合
            #…………………………………………………………………………………………………
            unless target.hidden == true && target.enemy_call_count == 0
              # □呼び出し回数を加算
              target.enemy_call_count += 1
              #…………………………………………………………………………………………………
              # ■ hidesp_オリジナル変数の初期化(module Enemy_Ex)
              #…………………………………………………………………………………………………
              if Call_EnemyABC::ORIGINAL_ACT
                target.original_variable(target.enemy_id)
              end
              # □呼び出されたエネミーの行動をクリア
              target.current_action.clear
              # □アクション配列から削除
              @action_battlers.delete(target)
              # □隠れフラグ配列に格納
              target.enemy_call_hidden.push(false)
            end
            # □ABC名前配列に追加
            $call_enemies.push([target.member_index,target.enemy_id,target.enemy_call_count])
            # □エネミー名+アルファベットの実行
            make_abc_name($call_enemies)
            # □隠れフラグをOFF
            target.hidden = false
            # □成功後の処理
            call_end(user,target)
          #…………………………………………………………………………………………………
          # ■ 条件に当てはまらない場合は、失敗
          #…………………………………………………………………………………………………
          else
            # □変数の初期化
            user.enemy_call = {"開始"=>false,"対象"=>nil,"使用者ID"=>nil}
            user.current_action.clear
            user.damage = Call_EnemyABC::MISS
            return
          end
        end
        #…………………………………………………………………………………………………
        # ■ 変数の初期化
        #…………………………………………………………………………………………………
        user.enemy_call = {"開始"=>false,"対象"=>nil,"使用者ID"=>nil}
        @active_battler.damage = nil
        @active_battler.damage_pop = false
        # ヘルプウィンドウを隠す
        @help_window.visible = false
        # ステップ 6 に移行
        @phase4_step = 6
        return
      end
    end
    # □元の処理を呼び出し
    hidesp_enemy_call_update_p4s5
  end
  #--------------------------------------------------------------------------
  # ■ [仲間を呼ぶ]成功後の処理
  #--------------------------------------------------------------------------
  def call_end(user,target)
    # □拡張用
  end
  #--------------------------------------------------------------------------
  # ■ アフターバトルフェーズ開始
  #--------------------------------------------------------------------------
  if !$@;alias hidesp_enemy_call_start_phase5 start_phase5;end
  def start_phase5
    # □除外するエネミー判別
    enemies = []
    for x in $call_enemies
      e = $game_troop.enemies[x[0]]
      if e.enemy_call_hidden[x[2]] == false
        # □エネミーIDを格納したIDに書き換え(変身の場合)
        e.enemy_id = x[1]
        enemies.push(e.dup)
      end
    end
    # □トループの初期値は全て除外
    $game_troop.enemies.each{|a| a.hidden = true}
    for i in enemies
      $game_troop.enemies.push(i)
    end
    # □初期化
    $call_enemies = []
    # □元の処理を呼び出し
    hidesp_enemy_call_start_phase5
  end
end