#==============================================================================
# ■ Roulette vol.1.02 (分割定義1)
#------------------------------------------------------------------------------
# ※『Game_Party_Coin』(必須)
# ※『Window_digits_number』(必須)
# ※『Coin_Game_Base 4.00以上』(必須)より下に挿入
# 11/10/03
#==============================================================================
module HIDE_ROULETTE
  #==============================================================================
  # ■ デバッグ(開発者用)
  #==============================================================================
  DEBUG = false
  # □Hitするナンバーを指定 0〜37(00)
  DEBUG_NUMBER = nil
  #==============================================================================
  # ■ グラフィック設定 ※Windowskinsフォルダ内のファイル名を指定
  #==============================================================================
  TOP = "roulette_table"           # テーブル画像
  BACK = "coin_background"         # ルーレットの背景画像
  ROULETTE = "roulette"            # ルーレット盤の画像
  ROULETTE2 = "roulette_w"         # ルーレット盤枠の画像
  BALL = "roulette_ball"           # ボール画像
  POCKEET = "roulette_pocket"      # ポケット画像
  BET = "bet_coin"                 # コイン画像
  SELECT = "poker_back"            # カーソル画像
  #==============================================================================
  # ■ 選択肢とヘルプの設定
  #==============================================================================
  GAME_COMS = ["Bet","Spin","End"]
  GAME_HELPS = ["賭け金を決めます。","ルーレットを回します。",
  "ゲームを終了します。"]
  #==============================================================================
  # ■ 音の設定 ※ファイル名を指定 ※Audioフォルダ内 #()のファイル名
  #==============================================================================
  BGM = "019-Field02"              # ルーレット実行中のBGM(BGM)
  BALL_SE = ""                     # ルーレットの回る効果音(SE) ※動作が重い ""で無効
  BED_SE = "006-System06"          # コインを賭けた効果音(SE)
  DECISION_SE = "002-System02"     # 決定キーの効果音(SE)
  CANCEL_SE = "003-System03"       # キャンセルキーの効果音(SE)
  BUZZER_SE = "004-System04"       # ブザー音の効果音(SE)
  HIT_ME_MAX = "009-Fanfare03"     # 大当りの効果音(ME)
  HIT_ME = "007-Fanfare01"         # 当りの効果音(ME)
  
  ME_MAX_TIME = 16                 # 大当りの待ち時間(HIT_ME_MAXの演奏時間(秒))
  ME_TIME = 6                      # 当りの待ち時間(HIT_MEの演奏時間(秒))
  #==============================================================================
  # ■ ルーレットの設定
  #==============================================================================
  MAX_BET = 15                     # 一箇所に賭けられるコイン数(最大15)
  HELP = true                      # 勝率と最大配当を表示する[true/false]
  AVERAGE = true                   # ポケット確立を描画する[true/false]
  #==============================================================================
  # ■ テーブル選択の点滅
  # Blink_Window_Command 3.00以上』必須
  #==============================================================================
  BLINK = false                    # テーブル選択の点滅色有り[true/false]
  #==============================================================================
  # ■ ルーレットタイプの設定(COIN,RATE,ME_RATE_MAX)
  # COIN[n] = value　※n=タイプ番号($game_temp.roulette_type から参照される)
  #==============================================================================
  COIN = [] # value=消費コイン数
  COIN[0] = 100 #100枚賭け
  COIN[1] = 10
  COIN[2] = 1
  #--------------------------------------------------------------------------
  # □大当りの効果音(HIT_ME_MAX)を演奏する獲得コイン数 (Payout - Bet)n以上
  ME_RATE_MAX = []
  ME_RATE_MAX[0] = 6000
  ME_RATE_MAX[1] = 600
  ME_RATE_MAX[2] = 60
  #==============================================================================
  # ■ 文字設定
  #==============================================================================
  A_COLOR = Color.new(255,255,255,255)     # 通常色
  B_COLOR = Color.new(0,0,0,255)           # 影色
  S_COLOR = Color.new(255,255,0,255)       # システム色
  H_COLOR = Color.new(255,106,181,255)     # 最高値(AVERAGE = true)
  L_COLOR = Color.new(  0,213,213,255)     # 最低値(AVERAGE = true)
  #==============================================================================
  # ■ メニュー文字設定
  #==============================================================================
  WORD1 = "Coin"
  WORD2 = "Bet"
  WORD3 = "Payout"
  #--------------------------------------------------------------------------
  # Help の文字設定
  #--------------------------------------------------------------------------
  H_SIZE = 16                              # 文字サイズ
  H_BOLD = false                           # 太文字フラグ[true/false]
  H_ITALIC = false                         # 斜め文字フラグ[true/false]
  H_SHADOW = false                         # 影文字フラグ[true/false]
  H_ROUND = false                          # 囲み文字フラグ[true/false]
  H_NAME = ["ＭＳ ゴシック"]               # フォント名
  #--------------------------------------------------------------------------
  # コイン の文字設定
  #--------------------------------------------------------------------------
  C_SIZE = 26                              # 文字サイズ
  C_BOLD = true                            # 太文字フラグ[true/false]
  C_ITALIC = false                         # 斜め文字フラグ[true/false]
  C_SHADOW = false                         # 影文字フラグ[true/false]
  C_ROUND = false                          # 囲み文字フラグ[true/false]
  C_NAME = ["Arial","ＭＳ ゴシック"]       # フォント名
  #--------------------------------------------------------------------------
  # 選択肢 の文字設定
  #--------------------------------------------------------------------------
  S_SIZE = 22                              # 文字サイズ
  S_BOLD = true                            # 太文字フラグ[true/false]
  S_ITALIC = false                         # 斜め文字フラグ[true/false]
  S_SHADOW = true                          # 影文字フラグ[true/false]
  S_ROUND = false                          # 囲み文字フラグ[true/false]
  S_NAME = ["Georgia","ＭＳ ゴシック"]     # フォント名
  #--------------------------------------------------------------------------
  # テーブル の文字設定
  #--------------------------------------------------------------------------
  T_SIZE = 24                              # 文字サイズ
  T_BOLD = true                            # 太文字フラグ[true/false]
  T_ITALIC = false                         # 斜め文字フラグ[true/false]
  T_SHADOW = false                         # 影文字フラグ[true/false]
  T_ROUND = false                          # 囲み文字フラグ[true/false]
  T_NAME = ["Arial","ＭＳ ゴシック"]       # フォント名
  #==============================================================================
  S_FONT = Copy_Font.new(S_SIZE,S_BOLD,S_ITALIC,S_SHADOW,S_ROUND,S_NAME,A_COLOR,B_COLOR)
  C_FONT = Copy_Font.new(C_SIZE,C_BOLD,C_ITALIC,C_SHADOW,C_ROUND,C_NAME,A_COLOR,B_COLOR)
  H_FONT = Copy_Font.new(H_SIZE,H_BOLD,H_ITALIC,H_SHADOW,H_ROUND,H_NAME,A_COLOR,B_COLOR)
  T_FONT = Copy_Font.new(T_SIZE,T_BOLD,T_ITALIC,T_SHADOW,T_ROUND,T_NAME,A_COLOR,B_COLOR)
  #==============================================================================
end

#==============================================================================
# ■ Window_Roulette_hit
#==============================================================================
class Window_Roulette_hit
  include HIDE_ROULETTE
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @roulette_hit = Sprite.new
    @roulette_hit.bitmap = Bitmap.new(640,480)
    @roulette_hit.opacity = 15
    @count_on = false
    @count = 0
    refresh([false]*8)
  end
  #--------------------------------------------------------------------------
  # ■ 当りの描画
  #--------------------------------------------------------------------------
  def refresh(hits)
    @roulette_hit.bitmap.clear
    @count_on = true
    pic = RPG::Cache.windowskin(HIDE_ROULETTE::BET)
    for i in 0..6
      if hits[i]
        @roulette_hit.bitmap.blt(455+i*27,430,pic,Rect.new(7*32,48,18,22))
      end
    end
  end
  #--------------------------------------------------------------------------
  # ■ Bitmapの消去
  #--------------------------------------------------------------------------
  def reset
    if @roulette_hit.bitmap != nil
      @roulette_hit.bitmap.clear
      @roulette_hit.opacity = 10
      @count_on = false
    end
  end
  #--------------------------------------------------------------------------
  # ■ 更新
  #--------------------------------------------------------------------------
  def update
    if @count_on
      if @roulette_hit.opacity > 10
        @roulette_hit.opacity -= 10
      else
        @count_on = false
      end
    else
      if @roulette_hit.opacity < 250
        @roulette_hit.opacity += 10
      else
        @count_on = true
      end
    end
  end
  #--------------------------------------------------------------------------
  # ■ 透明度を返す(Bitmapの点滅)
  #--------------------------------------------------------------------------
  def opacity?
    return @roulette_hit.opacity
  end
  #--------------------------------------------------------------------------
  # ■ 解放
  #--------------------------------------------------------------------------
  def dispose
    if @roulette_hit.bitmap != nil
      @roulette_hit.bitmap.dispose
    end
    @roulette_hit.dispose
  end
end  
#==============================================================================
# ■ Window_Roulette
#==============================================================================
class Window_Roulette
  include HIDE_ROULETTE
  attr_accessor :angle       # ルーレットの回転フラグ
  attr_accessor :numbers     # ルーレット盤の並び順
  attr_accessor :move        # ルーレットの停止フラグ
  attr_accessor :number      # ルーレット番号を取得
  attr_accessor :turn        # ルーレット回転数を取得
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x = 0,y = 0)
    # □ルーレット盤の回転を初期化
    @move = false
    @angle_count = 0
    @num = 0
    # □0=緑 1=黒  2=赤
    @numbers = {0=>[0,0],1=>[28,1],2=>[9,2],3=>[26,1],4=>[30,2],
    5=>[11,1],6=>[7,2],7=>[20,1],8=>[32,2],9=>[17,1],10=>[5,2],
    11=>[22,1],12=>[34,2],13=>[15,1],14=>[3,2],15=>[24,1],
    16=>[36,2],17=>[13,1],18=>[1,2],19=>[37,0],20=>[27,2],
    21=>[10,1],22=>[25,2],23=>[29,1],24=>[12,2],25=>[8,1],26=>[19,2],
    27=>[31,1],28=>[18,2],29=>[6,1],30=>[21,2],31=>[33,1],
    32=>[16,2],33=>[4,1],34=>[23,2],35=>[35,1],36=>[14,2],37=>[2,1]}
    # □ルーレット番号/回転数
    @number = 0 ; @turn = 0
    # □ルーレット画像を取得
    pic = RPG::Cache.windowskin(HIDE_ROULETTE::ROULETTE)
    # □ルーレット画像の幅/高さを取得
    @width = pic.width
    @height = pic.height
    # □ルーレット画像の作成
    @roulette_window = Sprite.new(Viewport.new(x,y,@width,@height))
    @roulette_window.bitmap = pic
    # □ルーレット座標を中央に指定
    @roulette_window.ox = @width/2.0
    @roulette_window.oy = @height/2.0
    @roulette_window.x = @height/2.0+4
    @roulette_window.y = @width/2.0+4
    # □ルーレットZ座標を指定
    @roulette_window.viewport.z = 2
    # □ルーレット枠画像の作成
    @roulette_top = Sprite.new(Viewport.new(x+3,y+3,@width+2,@height+2))
    @roulette_top.bitmap = RPG::Cache.windowskin(HIDE_ROULETTE::ROULETTE2)
    @roulette_top.viewport.z = 3
    # □ポケット画像の作成
    @roulette_pocket = Sprite.new(Viewport.new(20,320-16,32,64))
    @roulette_pocket.bitmap = Bitmap.new(32*38,64)
    pic = RPG::Cache.windowskin(HIDE_ROULETTE::POCKEET)
    @roulette_pocket.viewport.z = 5
    font = Copy_Font.new(22,false,false,false,false,["Georgia","ＭＳ ゴシック"])
    for i in 0..37 # 37=00
      number = @numbers[i][0] == 37 ? "00" : @numbers[i][0].to_s
      color = @numbers[i][1]
      @roulette_pocket.bitmap.blt(i*32,0,pic,Rect.new(color*32,0,32,64))
      @roulette_pocket.bitmap.draw_cache_text(32*i,6,32,32,number,1,font)
    end
    # □ボール画像を取得
    pic = RPG::Cache.windowskin(HIDE_ROULETTE::BALL)
    # □ボール画像の幅/高さを取得
    @bw = pic.width
    @bh = pic.height
    # □ボール画像の作成
    @roulette_ball = Sprite.new(Viewport.new(x,y,@bw,@bh))
    @roulette_ball.bitmap = pic
    @roulette_ball.viewport.z = 30
    # □ポケットボール画像の作成
    @pocket_ball = Sprite.new(Viewport.new(20,320-16,32,64))
    @pocket_ball.bitmap = Bitmap.new(32,64)
    @pocket_ball.viewport.z = 6
    @pocket_ball.bitmap.blt((32-@bw)/2,42,pic,Rect.new(0,0,@bw,@bh))
    # □デバッグ表示
    if HIDE_ROULETTE::DEBUG
      @roulette_back = Sprite.new(Viewport.new(0,0,640,480))
      @roulette_back.viewport.z = 50
      @roulette_back.bitmap = Bitmap.new(640,480)
      rect = Rect.new(0,0,640,480)
      #@roulette_back.bitmap.fill_rect(rect, Color.new(0,0,0,255))
    end
    # □更新
    refresh
    # □ポケットボールの更新
    @roulette_pocket.ox = (((@num % 38) + (@angle_count % 38)+9) % 38) * 32
    # □ルーレットを初期化
    stop_roulette?
  end
  #--------------------------------------------------------------------------
  # ■ 更新
  #--------------------------------------------------------------------------
  def refresh
    t = $game_temp.roulette_type
    # □初期化して0を１番目に
    @num = -(@angle_count+17)
    # □乱数を取得
    @num = rand(38) ; rand = rand(5)+1
    if @turn % (rand) == 0 && @turn != 0 && rand != 1 && rand != 2
      @num = -(@angle_count+17)
      b = $game_party.roulette_average[t].min
      keys = []
      for i in @numbers.keys
        if $game_party.roulette_average[t][@numbers[i][0]] == b
          keys.push(i)
        end
      end
      if keys.size != 0
        key = rand(keys.size)
        @num += keys[key]
      else
        @num = rand(38)
      end
    end
    # □デバッグ(Hitナンバーを直接指定)
    if HIDE_ROULETTE::DEBUG_NUMBER != nil
      for i in @numbers.keys
        if @numbers[i][0] === HIDE_ROULETTE::DEBUG_NUMBER
          @num = i - (@angle_count+17)
          break
        end
      end
    end
    num =  @num * (360/38.000)
    move_ball?((328-238)/2,238/2,num)
    @stop = 10
  end
  #--------------------------------------------------------------------------
  # ■ 座標の描画(DEBUG)
  #--------------------------------------------------------------------------
  def debug_ball?(n,r,a)
    rect = Rect.new(rx(n,r,a),ry(n,r,a),1,1)
    @roulette_back.bitmap.fill_rect(rect, Color.new(255,255,255,255))
  end
  #--------------------------------------------------------------------------
  # ■ X座標の更新(DEBUG)
  #--------------------------------------------------------------------------
  def rx(n,r,a)
    m = point_x(r,a)
    m += r + n
    return m
  end
  #--------------------------------------------------------------------------
  # ■ Y座標の更新(DEBUG)
  #--------------------------------------------------------------------------
  def ry(n,r,a)
    m = point_y(r,a)
    m += r + n
    return m
  end
  #--------------------------------------------------------------------------
  # ■ ボール座標の更新
  #--------------------------------------------------------------------------
  def move_ball?(n,r,a)
    move_x(n,r,a) ; move_y(n,r,a)
    # □ボール座標の描画(DEBUG)
    if HIDE_ROULETTE::DEBUG
      rx = @roulette_ball.viewport.rect.x
      ry = @roulette_ball.viewport.rect.y
      rect = Rect.new(rx+10,ry+10,1,1)
      @roulette_back.bitmap.fill_rect(rect, Color.new(255,255,0,255))
    end
  end
  #--------------------------------------------------------------------------
  # ■ ボールX座標の更新 10=ボール画像の半分 4=ルーレット盤の位置
  #--------------------------------------------------------------------------
  def move_x(n,r,a)
    m = point_x(r,a)
    m += (r + n - 10 + 4)
    @roulette_ball.viewport.rect.x = m
  end
  #--------------------------------------------------------------------------
  # ■ ボールY座標の更新
  #--------------------------------------------------------------------------
  def move_y(n,r,a)
    m = point_y(r,a)
    m += (r + n - 10 + 4)
    @roulette_ball.viewport.rect.y = m
  end
  #--------------------------------------------------------------------------
  # ■ X座標の取得 r :半径 a :角度
  #--------------------------------------------------------------------------
  def point_x(r,a)
    return r * Math.cos(a / 180.0 * Math::PI)
  end
  #--------------------------------------------------------------------------
  # ■ Y座標の取得 r :半径 a :角度
  #--------------------------------------------------------------------------
  def point_y(r,a)
    return r * Math.sin(a / 180.0 * Math::PI)
  end
  #--------------------------------------------------------------------------
  # ■ ルーレットの回転
  #--------------------------------------------------------------------------
  def spin_roulette?
    n = 360/38.00
    @roulette_window.angle += n
    @roulette_window.angle %= 360
    @roulette_window.ox = @width/2.0
    @roulette_window.oy = @height/2.0
    @angle_count += 1
#    Graphics.update
  end
  #--------------------------------------------------------------------------
  # ■ ルーレットの停止(初期化)
  #--------------------------------------------------------------------------
  def stop_roulette?
    @angle = false ; @count = 0
    @stop = 0 ; @spin = 0
    @angle_count % 99
  end
  #--------------------------------------------------------------------------
  # ■ 更新
  #--------------------------------------------------------------------------
  def update
    if @angle
      # □ポケットボールの更新
      @pocket_ball.ox = 32
      @count += 1
      if @count % 10 == 0
        @spin += 1
      end
      #…………………………………………………………………………………………………
      # ■ボールの回転/ポケットの更新(32=固定値)
      #…………………………………………………………………………………………………
      s0 = (32 + (@num % 38) + (@angle_count % 38)) % 38
      @roulette_pocket.ox = s0*32
      #…………………………………………………………………………………………………
      # ■ルーレットの停止
      #…………………………………………………………………………………………………
      if @stop == @spin
        # □ポケットボールの更新(停止アニメ)
        wait = 4
        while wait > 0
          @pocket_ball.ox = 12
          wait -= 1
          Graphics.update
        end
        wait = 4
        while wait > 0
          @pocket_ball.ox = 8
          wait -= 1
          Graphics.update
        end
        @pocket_ball.ox = 0
        # □ルーレット番号を取得
        @number = @numbers[s0][0]
        t = $game_temp.roulette_type
        $game_party.roulette_average[t][@number] += 1
        @turn += 1
        # □ルーレットの停止(初期化)
        stop_roulette?
        @move = true
        return
      end
      #…………………………………………………………………………………………………
      # ■ルーレットの回転
      #…………………………………………………………………………………………………
      wait_list = [0,0,0,0,1,1,1,2,2,4,5]
      ball_list = [300,300,260,260,200,200,200,200,200,200,200]
      wait = wait_list[@spin]
      # □ウェイト
      if wait != nil
        while wait > 0
          Graphics.update
          wait -= 1
        end
      end
      #…………………………………………………………………………………………………
      # ■ルーレットの回転の更新
      #…………………………………………………………………………………………………
      spin_roulette?
      #…………………………………………………………………………………………………
      # ■ボールの回転
      #…………………………………………………………………………………………………
      num = (@count + @num)*(360/38.000)
      list = [298,298,298,278,278,258,258,258,238,238,238]
      d1 = 328 ; d2 = list[@spin]
      move_ball?((d1-d2)/2,d2/2,num)
      #…………………………………………………………………………………………………
      # ■ルーレット回転SEを演奏
      #…………………………………………………………………………………………………
      if HIDE_ROULETTE::BALL_SE != ""
        $game_system.se_play(RPG::AudioFile.new(HIDE_ROULETTE::BALL_SE))
      end
      #…………………………………………………………………………………………………
      # ■デバッグ表示
      #…………………………………………………………………………………………………
      if HIDE_ROULETTE::DEBUG
        # □座標の描画(DEBUG)
        debug_ball?((d1-d1)/2,d1/2,num)
        for i in 1...328
          #debug_ball?((328-i)/2,i/2,num)
        end
        p @count.to_s + "count[x" + @roulette_ball.viewport.rect.x.to_s + ",y" + 
        @roulette_ball.viewport.rect.y.to_s + "]" + @roulette_window.angle.to_s + "度"
      end
    end
  end
  #--------------------------------------------------------------------------
  # ■ 解放
  #--------------------------------------------------------------------------
  def dispose
    @roulette_window.viewport.dispose
    @roulette_window.bitmap.dispose
    @roulette_window.dispose
    @roulette_top.viewport.dispose
    @roulette_top.bitmap.dispose
    @roulette_top.dispose
    @roulette_ball.viewport.dispose
    @roulette_ball.bitmap.dispose
    @roulette_ball.dispose
    @roulette_pocket.viewport.dispose
    @roulette_pocket.bitmap.dispose
    @roulette_pocket.dispose
    @pocket_ball.viewport.dispose
    @pocket_ball.bitmap.dispose
    @pocket_ball.dispose
    # □デバッグ表示
    if HIDE_ROULETTE::DEBUG
      @roulette_ball.viewport.dispose
      @roulette_ball.bitmap.dispose
      @roulette_ball.dispose
    end
  end
end