#!ruby -Ks
# サルサル（仮）サンプルシューティングゲーム DXRuby1.0.3、DXRubyExtension0.0.5対応
require 'dxruby'
require 'dxrubyex'
require 'hitrangeview'

require 'stg_saru'      # さる
require 'stg_sarutama'  # さるたま
require 'stg_teki'      # てき
require 'stg_tekitama'  # てきたま
require 'stg_option'    # こざる
require 'stg_other'     # そのた
require 'stg_bg'        # 背景
require 'stg_item'      # アイテム
require 'stg_control'   # 制御

# 画像・効果音読み込み
require 'stg_data'

# ArrayExtensionモジュールを追加
class Array
  include ArrayExtension
end

# 窓設定
Window.caption = "さるさる（仮名）"

# スコア初期化
$score = 0

# さる残機設定
$zanki = 3

# さるオブジェクト参照用グローバル変数
$saru = nil

# 三角関数用定数
TO_RADIAN = Math::PI / 180.0

# オブジェクト配列
$obj = [BgManager,       # 背景オブジェクト
       SaruManager,     # さる
       OptionManager,   # こざるオブジェクト
       SarutamaManager, # さるたま
       OtherManager,    # そのたオブジェクト
       ItemManager,     # アイテム
       TekiManager,     # てき
       TekitamaManager, # てきたま
]

# オブジェクト初期化
$obj.each do |o|
  o.initAll
end

# 敵出現初期化
ControlManager.initAll
ControlStage.create("stage1")

font = Font.new(16)
Window.fps = 60

# 強制FPS切り替え用
fpsmode = 1

# 当たり判定表示用
hitviewmode = 1

$effectmode = 1

# ウィンドウが閉じられたら自動的に終了するループ。
Window.loop do
  # FPS強制切り替えコマンド
  if Input.keyPush?(K_F1) then
    if fpsmode == 1 then
      fpsmode = 2
    else
      fpsmode = 1
    end
    Window.fps = (3 - fpsmode) * 30
  end

  # 遅いパソコン用のエフェクトカット機能
  if Input.keyPush?(K_F2) then
    if $effectmode == 1 then
      $effectmode = 2
    else
      $effectmode = 1
    end
  end

  # 当たり判定表示機能
  if Input.keyPush?(K_F3) then
   if hitviewmode == 1 then
      hitviewmode = 2
    else
      hitviewmode = 1
    end
  end

  fpsmode.times do
    ControlManager.runAll # ゲーム進行制御
    ControlManager.clear  # ゲーム進行制御のゴミ掃除

    # 移動
    $obj.each do |o|
      o.moveAll
    end

    # あたり判定
    Collision.check(SarutamaCollision, TekiCollision) # さるたま と てき のあたり判定
    Collision.check(TekitamaCollision, SaruCollision) # てきたま と さる のあたり判定
    Collision.check(TekiCollision, SaruCollision)     # てき と さる のあたり判定
    Collision.check(SaruCollision, ItemCollision)     # さる と アイテム のあたり判定

    # あたり判定表示
    if hitviewmode == 2 then
      HitRange.view(SarutamaCollision)
      HitRange.view(TekitamaCollision)
      HitRange.view(TekiCollision)
      HitRange.view(SaruCollision)
    end

    TekitamaCollision.clear
    SarutamaCollision.clear
    TekiCollision.clear
    SaruCollision.clear
    ItemCollision.clear

    # 消えたオブジェクトの掃除
    $obj.each do |o|
      o.clear
    end
  end

  # 描画
  $obj.each do |o|
    o.drawAll
  end

  # エスケープキーで終了
  if Input.keyDown?(K_ESCAPE) == true then
    break
  end

  Window.drawFont(576, 0, Window.fps.to_s + " fps", font, :z=>100)
  Window.drawFont(576, 20,Window.getLoad.to_i.to_s + " %", font, :z=>100)
end
