# 制御オブジェクト管理
module ControlManager

  # 初期化
  def ControlManager.initAll
    # 全部の制御オブジェクト配列
    @objects = []
    @stagedata = {}
    @matome = {}
    @bossflag = false

    setcount = 0
    setx = 0
    sety = 0
    matomeflag = false
    matomename = nil
    matometemp = nil

    # ステージデータ読み込み
    Dir.foreach("stagedata") do |filename|
      next if filename == "." or filename == ".."

      stagedata = []
      open("stagedata/" + filename).each do |line|
        next if line.strip == "" or line.strip[0,1] == "#"

        # まとめオブジェクト終了
        if line.strip == "}" then
          raise "ステージデータが異常です" if matomeflag == false
          matomeflag = false
          @matome[matomename] = matometemp
          next
        end

        # まとめオブジェクト定義
        if line.strip[0,3] == "set" then
          raise "ステージデータが異常です" if matomeflag == true
          matomename = line.strip.split(' ')[1]
          matometemp = []
          matomeflag = true
          next
        end

        data = []
        line.split(',').each do |temp|
          if temp.index("=") == nil then
            data.push(temp.strip)
          else
            data.push(temp.strip.split("=")[1])
          end
        end

        data[0] = data[0].to_i
        for i in 2...data.size
          data[i] = data[i].to_i
        end

        # まとめオブジェクト内
        if matomeflag == true then
          matometemp.push(data)

        # まとめオブジェクト外（敵単体）
        else
          stagedata.push(data)
        end
      end
      @stagedata[filename.gsub(/\.txt/,"")] = stagedata
    end
  end

  # 全部の制御オブジェクトを実行
  def ControlManager.runAll
    # 移動
    @objects.hs_each(:run)
  end

  def ControlManager.objects
    @objects
  end

  def ControlManager.stagedata
    @stagedata
  end

  # まとめハッシュ
  def ControlManager.matome
    @matome
  end

  # フラグがたっているオブジェクトを削除する
  def ControlManager.clear
    @objects.hs_delete_if(:delflag)
  end

  # 出現
  def ControlManager.create(x, y, data)
    case data[1]
    when "おばけ１", "おばけ２"
      TekiObake.create(x, y, data[1])
    when "魔女"
      TekiMajo.create(x, y)
    when "おはか"
      TekiHaka.create(x, y)
    when "うさぎ"
      TekiUsagi.create(x, y)
    when "ジャック１", "ジャック２"
      TekiJack.create(x, y)
    when "ボス"
      TekiBoss.create(x, y)
    when "ボス音楽開始"
      BGM.setVolume(0, 8000)
      BOSSBGM.setVolume(0)
      BOSSBGM.bgmplay
      BOSSBGM.setVolume(240, 8000)
    when "STAGE1音楽停止"
      BGM.stop
    when "STAGE1音楽開始"
      # BGM再生
      BOSSBGM.stop
      BGM.start = 5000
      BGM.setVolume 255
      BGM.bgmplay
    when "ボスロック"
      @bossflag = true
    else
      raise 'ステージデータエラー : ' + data[0].to_s + " : " + data[1]
    end
  end

  def ControlManager.boss
    @bossflag
  end
end


# ステージ進行
class ControlStage

  def ControlStage.create(stage)
    ControlManager.objects.push(ControlStage.new(stage))
  end

  def initialize(stage)
    @stagedata = ControlManager.stagedata[stage]
    @stagecount = 0
    @stagedatacount = 0
    BgStage1.create(200, 180)
  end

  def run
    return if ControlManager.boss == true

    # オブジェクト出現
    while (@stagecount >= @stagedata[@stagedatacount][0].to_i)
      data = @stagedata[@stagedatacount]

      # まとめオブジェクトならまとめ出現オブジェクトを生成する
      if ControlManager.matome.key?(data[1]) then
        ControlMatome.create(data)
      else
        # 単体なら単体出現関数を呼ぶ
        ControlManager.create(data[2], data[3], data)
      end

      # ステージデータを進める
      @stagedatacount = @stagedatacount + 1

      # データが終わったら最初から
      if @stagedata.size == @stagedatacount then
        @stagedatacount = 0
        @stagecount = -1
        break
      end

    end

    # ステージカウントを進める
    @stagecount = @stagecount + 1
  end

  attr_accessor :delflag
end



# まとめオブジェクト
class ControlMatome

  def ControlMatome.create(data)
    ControlManager.objects.push(ControlMatome.new(data))
  end

  def initialize(data)
    @matomedata = ControlManager.matome[data[1]]
    @data = data
    @matomecount = 0
    @matomedatacount = 0
  end

  def run

    # オブジェクト出現
    while (@matomecount == @matomedata[@matomedatacount][0].to_i)
      data = @matomedata[@matomedatacount]

      # 単体出現
      ControlManager.create(data[2] + @data[2], data[3] + @data[3], data)

      # まとめデータを進める
      @matomedatacount = @matomedatacount + 1

      # データが終わったらまとめオブジェクトは消滅する
      if @matomedata.size == @matomedatacount then
        @delflag = true
        return
      end
    end

    # まとめカウントを進める
    @matomecount = @matomecount + 1
  end

  attr_accessor :delflag
end









