# さる管理
SaruCollision = []

module SaruManager

  # 初期化
  def SaruManager.initAll
    # 全部のさる配列
    @objects = []
    SaruCollision.clear
    SaruManager.create
  end

  def SaruManager.create
    $saru = Saru.new
    @objects.push($saru)
  end

  # 全部のさるを移動
  def SaruManager.moveAll
    # 移動＆消えたさるを配列から削除
    @objects.each do |t|
      t.move
    end
  end

  # 全部のさるを描画
  def SaruManager.drawAll
    # 描画
    @objects.each do |t|
      t.draw
    end
  end

  def SaruManager.objects
    @objects
  end

  # フラグがたっているオブジェクトを削除する
  def SaruManager.clear
    @objects.delete_if do |t|
      t.delflag
    end
  end
end


# さるクラス
class Saru

  # 初期化関数
  def initialize
    # さる座標
    @x = 100
    @y = 220

    # さる速度
    @speed = 3

    # たま間隔
    @wait1 = 12
    @count1 = 0

    # 爆弾間隔
    @wait2 = 40
    @count2 = 0

    # さる頭角度
    @headangle = 0
    @dha = 1

    @delflag = false

    @hp = 100

    # 子ザル配列
    @option = []

    @count = 0
    @rot = 0
    @formation = 0
    @formationcount = 0
    @collision = CollisionBox.new(self, IMAGE_sarubody.x1, IMAGE_sarubody.y1,
                                        IMAGE_sarubody.x2, IMAGE_sarubody.y2)
    @changecount = 0
    @data = nil
  end

  # 移動関数
  def move
    # キー状態によるｘとｙの増分を取得
    dx, dy = Input.x, Input.y

    # たま間隔処理
    @count1 = @count1 - 1 if @count1 > 0

    # 爆弾間隔処理
    @count2 = @count2 - 1 if @count2 > 0

    # Zキー判定
    if Input.padDown?(P_BUTTON0) == true then
      if @count1 == 0 then
        SE_shot.play
        Sarutama1.create(@x, @y)
        if @changecount == 0 then
          @option.each do |op|
            op.shot
          end
        end
        @count1 = @wait1
      end
      if @count2 == 0 then
        Sarutama3.create(@x, @y, dx)
        @count2 = @wait2
      end
    end

    # Xキー判定
    if Input.padPush?(P_BUTTON1) == true and @option.size != 0 then
      @formationcount = 0
      @changecount = 30
      @option.each do |op|
        op.oldx = op.x
        op.oldy = op.y
      end
      @formation = @formation + 1
      if @formation == 3 then
        @formation = 0
      end
    end

    if @changecount > 0 then
      @option.each do |op|
        op.move(true)
        # この計算式はStarFrameのソースを参考にしました。http://coderepos.org/share/browser/lang/ruby/starframe?rev=27505
        op.x = (op.x - op.oldx) * (900 - @changecount ** 2) / 900.0 + op.oldx
        op.y = (op.y - op.oldy) * (900 - @changecount ** 2) / 900.0 + op.oldy
      end
      @changecount -=1
    else
      @formationcount += 4
      @formationcount = @formationcount >= 360 ? 0 : @formationcount
    end

    # 移動
    if dx == 0 or dy == 0 then
      # 縦もしくは横の場合はそのまま移動
      @x = @x + dx * @speed
      @y = @y + dy * @speed
    else
      # 斜めの場合は0.707(sin45)をかける
      @x = @x + dx * @speed * 0.707
      @y = @y + dy * @speed * 0.707
    end

    # 移動範囲チェック
    if @x < 0 then
      @x = 0
    end

    if @x + IMAGE_sarubody.width > 640 then
      @x = 640 - IMAGE_sarubody.width
    end

    if @y < 0 then
      @y = 0
    end

    if @y + IMAGE_sarubody.height > 480 then
      @y = 480 - IMAGE_sarubody.height
    end

    @data = [[@x, @y]]

    # 頭を振る
    @headangle = @headangle + @dha
    if @headangle == 20 or @headangle == -20 then
      @dha = -@dha
    end

    if @count > 0 then
      @count = @count - 1
    else
      # あたり判定範囲設定
      @collision.set(@x, @y)
      SaruCollision.push(@collision)
    end

    # HP自動回復
    @hp = @hp + 0.03
    if @hp > 100 then
      @hp = 100
    end

  end

  # たまにあたった
  def hit(opponent)
    OtherUki.create(@x, @y)
    SE_damage.play
    @hp = @hp - opponent.damage
    if @hp < 0 then
      $saru = nil
      OtherSaruDead.create(@x, @y)
      SE_deth.play
      @collision.delete
      @delflag = true
    else
      @count = 72
    end
  end

  # アイテムゲット
  def shot(d)
  end

  # 描画関数
  def draw
    # さるを描画する
    if @count > 0 then
      Window.draw(@x + (@count % 7) - 3, @y, IMAGE_sarubody, 6)
      Window.draw(@x + 4 + (@count % 7) - 3, @y - 9, IMAGE_saruhead, 6)
    else
      Window.draw(@x, @y, IMAGE_sarubody, 6)
      Window.drawEx(@x + 4, @y - 9, IMAGE_saruhead, :angle => @headangle, :centery => 16, :z => 6)
    end
  end

  def lastoption
    if option.size == 0 then
      return self
    else
      return option[-1]
    end
  end
  
# クラス外に公開する変数
attr_accessor :x, :y, :delflag, :hp, :option, :formation, :formationcount, :changecount, :data

end





