#==============================================================================
# ■ Keno vol.1.10
#------------------------------------------------------------------------------
# ※『Window_digits_number 5.90以上』(必須)
# ※『Picture_Blink_Cursor 1.60以上』(必須)
# ※『Coin_Base 5.00以上』(必須)より下に挿入
# 12/04/22
#==============================================================================
module HIDE_KENO
  #==============================================================================
  # ■ デバッグ(開発者用)
  #==============================================================================
  DEBUG = false                    # [true/false]
  #==============================================================================
  # ■ イベントコマンド『スクリプト』に以下を追加
  #------------------------------------------------------------------------------
  #   make_keno(type)
  #------------------------------------------------------------------------------
  #   type=ケノタイプの設定を参照
  #==============================================================================
  # ■ ゲーム設定
  #==============================================================================
  SPEED = 2                       # ボールが転がる速度(大=遅い)
  FALL = 2                        # ボールが落下する速度(大=速い)
  #==============================================================================
  # ■ グラフィック設定 ※Windowskinsフォルダ内のファイル名を指定
  #==============================================================================
  BACK = "keno_background"         # ケノの背景画像
  PANEL = "keno_panel"             # ケノパネル画像
  BALL = "keno_ball"               # ボール画像
  HIT = "flash_yellow"             # 当たり効果画像
  SELECT = "cursor_back"           # カーソル画像
  CURSOR = "cursor_anim"           # カーソルアイコン画像
  NUMBER = "number_image3"         # パネル数値画像
  #==============================================================================
  # ■ 選択肢とヘルプの設定
  #==============================================================================
  GAME_COMS = ["Draw","Choice","Random","Clear","Quick","End"]
  GAME_HELPS = ["ゲームを開始します。", "数値を選択します。","数値をランダムに配置します。",
  "数値の選択を全て解除します。","簡易アニメをON/OFFします。","ゲームを終了します。"]
  
  HELP1 = ""
  HELP2 = "を選択します。"
  HELP3 = "の選択を解除します。"
  HELP4 = "は選択できません。"
  #==============================================================================
  # ■ 音の設定 ※ファイル名を指定 ※Audioフォルダ内 #()のファイル名
  #==============================================================================
  BGM = "019-Field02"              # ケノ実行中のBGM(BGM)
  BALL_SE = "041-Knock02"          # 落下衝撃音(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 = 12                 # 大当りの待ち時間(HIT_ME_MAXの演奏時間(秒))
  ME_TIME = 4                      # 当りの待ち時間(HIT_MEの演奏時間(秒))
  #==============================================================================
  # ■ ケノタイプの設定(COIN,RATE,ME_RATE_MAX)
  # COIN[n] = value　※n=タイプ番号($game_temp.keno_type から参照される)
  #==============================================================================
  COIN = [] # value=消費コイン数(賭けるコイン枚数)
  COIN[0] = 10
  COIN[1] = 20
  COIN[2] = 30
  #==============================================================================
  # ■ 通常アニメ(Quick=OFF 低速)のHit率上昇値(アニメが長いので確率UP?)
  # LUCK[n] = value
  # n=タイプ番号($game_temp.keno_type から参照される)
  # ※Hit確率 n%アップ
  #==============================================================================
  LUCK = [] # value=プレイヤーの優位度(大=優位 0〜100) 0=通常確率
  LUCK[0] = 20
  LUCK[1] = 10
  LUCK[2] = 0
  #--------------------------------------------------------------------------
  # ■ 配当 ※指定した数値(n) 1/nの確率でHit
  #--------------------------------------------------------------------------
  CHECK = []# □選択数 = {Hit数=>倍率}
  CHECK[1] = {1=>4,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0}
  CHECK[2] = {1=>2,2=>8,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0}
  CHECK[3] = {1=>1,2=>4,3=>16,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0}
  CHECK[4] = {1=>0.5,2=>2,3=>8,4=>32,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0}
  CHECK[5] = {1=>0,2=>1,3=>4,4=>16,5=>64,6=>0,7=>0,8=>0,9=>0,10=>0}
  CHECK[6] = {1=>0,2=>0.5,3=>2,4=>8,5=>32,6=>128,7=>0,8=>0,9=>0,10=>0}
  CHECK[7] = {1=>0,2=>0,3=>1,4=>4,5=>16,6=>64,7=>256,8=>0,9=>0,10=>0}
  CHECK[8] = {1=>0,2=>0,3=>0.5,4=>2,5=>8,6=>32,7=>128,8=>512,9=>0,10=>0}
  CHECK[9] = {1=>0,2=>0,3=>0,4=>1,5=>4,6=>16,7=>64,8=>256,9=>1024,10=>0}
  CHECK[10] = {1=>0,2=>0,3=>0,4=>0.5,5=>2,6=>8,7=>32,8=>128,9=>512,10=>2048}
  #--------------------------------------------------------------------------
  # □大当りの効果音(HIT_ME_MAX)を演奏する獲得コイン数(n以上)
  ME_RATE_MAX = []
  ME_RATE_MAX[0] = 320
  ME_RATE_MAX[1] = 640
  ME_RATE_MAX[2] = 960
  #==============================================================================
  # ■ 文字色設定
  #==============================================================================
  A_COLOR = Color.new(255,255,255,255)     # 通常色
  B_COLOR = Color.new(0,0,0,255)           # 影色
  S_COLOR = Color.new(255,255,0,255)       # システム色
  M_COLOR = Color.new(250,220,180,255)     # 通常色(配当)
  N_COLOR = Color.new(150,120,80,255)      # 無効色(配当)
  #==============================================================================
  # ■ メニュー文字設定
  #==============================================================================
  WORD0 = "Ante"
  WORD1 = "Coin"
  WORD2 = "------"
  WORD3 = "Draw"
  WORD4 = "Quick"
  #--------------------------------------------------------------------------
  # 選択肢 の文字設定
  #--------------------------------------------------------------------------
  S_SIZE = 20                              # 文字サイズ
  S_BOLD = true                            # 太文字フラグ[true/false]
  S_ITALIC = false                         # 斜め文字フラグ[true/false]
  S_SHADOW = true                          # 影文字フラグ[true/false]
  S_ROUND = false                          # 囲み文字フラグ[true/false]
  S_NAME = ["Georgia","ＭＳ ゴシック"]     # フォント名
  #--------------------------------------------------------------------------
  # 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 = ["ＭＳ ゴシック"]               # フォント名
  #--------------------------------------------------------------------------
  # RATE の文字設定Arial
  #--------------------------------------------------------------------------
  R_SIZE = 18                              # 文字サイズ
  R_BOLD = true                            # 太文字フラグ[true/false]
  R_ITALIC = false                         # 斜め文字フラグ[true/false]
  R_SHADOW = false                          # 影文字フラグ[true/false]
  R_ROUND = false                          # 囲み文字フラグ[true/false]
  R_NAME = ["Georgia","ＭＳ ゴシック"]       # フォント名
  #--------------------------------------------------------------------------
  # コイン の文字設定
  #--------------------------------------------------------------------------
  C_SIZE = 24                              # 文字サイズ
  C_BOLD = true                            # 太文字フラグ[true/false]
  C_ITALIC = false                         # 斜め文字フラグ[true/false]
  C_SHADOW = true                         # 影文字フラグ[true/false]
  C_ROUND = false                          # 囲み文字フラグ[true/false]
  C_NAME = ["Arial","ＭＳ ゴシック"]       # フォント名
  #--------------------------------------------------------------------------
  # システム の文字設定
  #--------------------------------------------------------------------------
  T_SIZE = 18                              # 文字サイズ
  T_BOLD = true                            # 太文字フラグ[true/false]
  T_ITALIC = false                         # 斜め文字フラグ[true/false]
  T_SHADOW = true                         # 影文字フラグ[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,S_COLOR,B_COLOR)
  A_FONT = Copy_Font.new(18,true,false,false,false,["Georgia","ＭＳ ゴシック"],S_COLOR,B_COLOR)
  M_FONT = Copy_Font.new(18,true,false,false,false,["Arial","ＭＳ ゴシック"],A_COLOR,B_COLOR)
  R_FONT = Copy_Font.new(R_SIZE,R_BOLD,R_ITALIC,R_SHADOW,R_ROUND,R_NAME,A_COLOR,B_COLOR)
end
#==============================================================================
# ■ Scene_Keno
#==============================================================================
class Scene_Keno
  include HIDE_KENO
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    game_reset?
    # □マップ BGM を記憶し、BGM を停止
    $game_temp.map_bgm = $game_system.playing_bgm
    $game_system.bgm_stop
    # □ケノ BGM を演奏
    $game_system.bgm_play(RPG::AudioFile.new(HIDE_KENO::BGM))
  end
  #--------------------------------------------------------------------------
  # ■ 競合対策(初期化)
  #--------------------------------------------------------------------------
  def format?
    if $game_party.keno_data == nil
      $game_party.keno_data = []
    end
    if $game_party.keno_quick == nil
      $game_party.keno_quick = []
    end
  end
  #--------------------------------------------------------------------------
  # ■ ケノの初期化
  #--------------------------------------------------------------------------
  def game_reset?
    @keno_step = 0
    # □ゲーム実行中フラグをOFF
    @playing = false
  end
  #--------------------------------------------------------------------------
  # ■ メイン処理
  #--------------------------------------------------------------------------
  def main
    # □タイプを取得
    t = $game_temp.keno_type
    # □競合対策(初期化)
    format?
    # □初期化
    if $game_party.keno_data[t] == nil
      $game_party.keno_data[t] = [0]*81
    end
    if $game_party.keno_quick[t] == nil
      $game_party.keno_quick[t] = false
    end
    # □掛け金を取得
    @coin = HIDE_KENO::COIN[t]
    # □配当を取得
    @rate = HIDE_KENO::CHECK
    @choice = [] ; @old_choice = [] ; @balls = []
    icon = RPG::Cache.windowskin(HIDE_KENO::CURSOR)
    #…………………………………………………………………………………………………
    # ■文字装飾を取得
    #…………………………………………………………………………………………………
    s_font = HIDE_KENO::S_FONT ; @h_font = HIDE_KENO::H_FONT
    c_font = HIDE_KENO::C_FONT ; @t_font = HIDE_KENO::T_FONT
    @a_font = HIDE_KENO::A_FONT ; @m_font = HIDE_KENO::M_FONT
    b_font = HIDE_KENO::T_FONT ; @r_font = HIDE_KENO::R_FONT
    #…………………………………………………………………………………………………
    # ■ケノウィンドウ背景を作成
    #…………………………………………………………………………………………………
    @keno_window_back = Picture_Blink_Cursor.new(RPG::Cache.windowskin(HIDE_KENO::BACK))
    @keno_window_back.draw_text(440+32,32,0,0,HIDE_KENO::WORD0 + "  " + @coin.to_s,0,@t_font)
    #…………………………………………………………………………………………………
    # ■パネル下を描画
    #…………………………………………………………………………………………………
    @keno_window_under = Picture_Blink_Cursor.new(Bitmap.new(640,480))
    @keno_window_under.z = 100
    #…………………………………………………………………………………………………
    # ■当たり演出ウィンドウを作成
    #…………………………………………………………………………………………………
    @keno_window_hit = Picture_Blink_Cursor.new
    @keno_window_hit.start(100)
    #…………………………………………………………………………………………………
    # ■パネル選択ウィンドウを作成
    #…………………………………………………………………………………………………
    @keno_window_check = Picture_Blink_Cursor.new(105+1,64+1,30,30,1,1,80,10)
    @keno_window_check.draw_color_cursor(HIDE_KENO::A_COLOR.dup)
    @keno_window_check.draw_icon_cursor(icon,100)
    @keno_window_check.cz = 2
    @helps = [""]*240 ; @rand = []
    for i in 0...80
      @rand.push(i)
    end
    # □ヘルプウィンドウの関連付け
    @keno_window_check.make_helps(16+4,356+50,@helps,@h_font)
    #…………………………………………………………………………………………………
    # ■配当ウィンドウを作成
    #…………………………………………………………………………………………………
    @keno_window_rate = Picture_Blink_Cursor.new(Bitmap.new(640,480))
    @keno_window_rate.z = 100
    #…………………………………………………………………………………………………
    # ■配当を描画
    #…………………………………………………………………………………………………
    make_rate
    #…………………………………………………………………………………………………
    # ■パネル上ウィンドウを作成
    #…………………………………………………………………………………………………
    @keno_window_top = Picture_Blink_Cursor.new(Bitmap.new(640,480))
    @keno_window_top.z = 100
    #…………………………………………………………………………………………………
    # ■Hit率を描画
    #…………………………………………………………………………………………………
    @keno_window_average = Picture_Blink_Cursor.new(Bitmap.new(640,480))
    @keno_window_average.z = 100+2
    # □Hit確率を更新
    average?
    draw_average
    #…………………………………………………………………………………………………
    # ■パネルを描画
    #…………………………………………………………………………………………………
    make_panel
    #…………………………………………………………………………………………………
    # ■コイン数値ウィンドウを作成
    #…………………………………………………………………………………………………
    @keno_window_back.draw_text(440+8,375,160,0,HIDE_KENO::WORD1,0,@t_font)
    @coin_window = Window_digits_number.new(500,358,100,$game_party.coin,10,10,c_font)
    #…………………………………………………………………………………………………
    # ■ゲーム開始選択ウィンドウを作成
    #…………………………………………………………………………………………………
    select = RPG::Cache.windowskin(HIDE_KENO::SELECT)
    com = HIDE_KENO::GAME_COMS
    helps = HIDE_KENO::GAME_HELPS
    @game_select_window = Picture_Blink_Cursor.new(16,420+16,96,32,2,0,helps.size,helps.size)
    @game_select_window.draw_cursor(select,com,s_font,icon)
    @game_select_window.start
    @game_select_window.index = 1
    # □ヘルプウィンドウの関連付け
    @game_select_window.make_helps(16+4,356+50,helps,@h_font)
    #…………………………………………………………………………………………………
    # ■ケノボールを作成
    #…………………………………………………………………………………………………
    @ball_move = false
    @keno_ball = []
    for i in 0...20
      @keno_ball[i] = Keno_Ball.new(26+2,60+8,i,i+1)
    end
    # □簡易アニメ表示を描画
    draw_quick(t)
    # □Draw回数を描画
    draw_spin(t,0)
    # □選択肢の文字色を初期化
    exchange_colors?
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @keno_window_back.dispose
    @keno_window_hit.dispose
    @keno_window_under.dispose
    @keno_window_average.dispose
    @keno_window_top.dispose
    @keno_window_rate.dispose
    @game_select_window.dispose
    @keno_window_check.dispose
    @coin_window.dispose
  end
  #--------------------------------------------------------------------------
  # ■ パネル選択indexの補正値を取得
  #--------------------------------------------------------------------------
  def index_new(i)
    n = (i%10)*8+(i/10)
    return n
  end
  #--------------------------------------------------------------------------
  # ■ 簡易アニメ表示を描画
  #--------------------------------------------------------------------------
  def draw_quick(t)
    cw = @t_font.text_width(HIDE_KENO::WORD4)
    ch = @t_font.text_height(HIDE_KENO::WORD4)
    if $game_party.keno_quick[t]
      @keno_window_back.draw_text(20,32,cw,ch,HIDE_KENO::WORD4,0,@t_font)
    else
      @keno_window_back.draw_text(20,32,cw,ch,"",0,@t_font)
    end
  end
  #--------------------------------------------------------------------------
  # ■ Draw回数を描画
  #--------------------------------------------------------------------------
  def draw_spin(t = $game_temp.keno_type,num = 1)
    t_font = @t_font.dup
    t_font.color = A_COLOR
    n = $game_party.keno_data[t][0]
    $game_party.keno_data[t][0] = [n + num,999999].min
    @keno_window_back.draw_text(20+48,375,160,32,$game_party.keno_data[t][0].to_s,0,t_font)
    @keno_window_back.draw_text(20,375,0,0,HIDE_KENO::WORD3,0,@t_font)
  end
  #--------------------------------------------------------------------------
  # ■ 確率を描画
  #--------------------------------------------------------------------------
  def draw_average(t = $game_temp.keno_type)
    average = $game_party.keno_data[t]
    max = average.dup
    max.delete_at(0)
    image = RPG::Cache.windowskin(HIDE_KENO::NUMBER)
    @average = []
    # □確率を描画
    for i in 0...average.size
      if i != 0
        a = average[i]
        v = average[0]
        n = a == 0 ? 0 : ((a * 100.00 / v) * 100).floor / 100.0
        # □Hit率を取得
        @average[i] = n
        c = i-1
        d = (n == 100) ? 0 : 1
        color = 7
        if average[i] == max.max && average[i] > 0
          color = 8
        elsif average[i] == max.min
          color = 9
        end
        x = 27+105+((i-1)/8)*32
        y = 23+64+((i-1)%8)*32
        @keno_window_average.bitmap.draw_numbers(x,y,24,6,6,image,n,2,color,0,0,d,d)
      end
    end
    # □平均Hit率の取得
    v = 0
    for a in 0...@average.size
      if a != 0
        v += @average[a]
      end
    end
    @average[0] = v == 0 ? 0 : v/80
  end
  #--------------------------------------------------------------------------
  # ■ Hit率を更新
  #--------------------------------------------------------------------------
  def average?(t = $game_temp.keno_type)
    if @balls == []
      return
    end
    for i in @balls
      $game_party.keno_data[t][i+1] += 1
    end
  end
  #--------------------------------------------------------------------------
  # ■ パネルを描画
  #--------------------------------------------------------------------------
  def make_panel(n = nil,c = 0,color = 10)
    if n == nil
      for i in 1..80
        draw_panel(i,c,color)
      end
    else
      draw_panel(n,c,color)
    end
  end
  #--------------------------------------------------------------------------
  # ■ パネルを更新
  #--------------------------------------------------------------------------
  def refresh_panel
    # □ｏ炎化
    panel_numbers?
    for i in 1..80
      if @numbers.include?(i-1)
        c = 1 ; color = 6
      else
        c = 0 ; color = 10
      end
      # □パネルを描画
      draw_panel(i,c,color)
    end
  end
  #--------------------------------------------------------------------------
  # ■ パネルを描画
  #--------------------------------------------------------------------------
  def draw_panel(i,c = 0,color = 10)
    panel = RPG::Cache.windowskin(HIDE_KENO::PANEL)
    image = RPG::Cache.windowskin(HIDE_KENO::NUMBER)
    bitmap = Bitmap.new(image.width*2,image.height*2)
    stretch = Rect.new(0,0,image.width*2,image.height*2)
    rect = Rect.new(0,0,image.width,image.height)
    bitmap.stretch_blt(stretch,image,rect,255)
    # □透明に塗り潰し
    @keno_window_under.bitmap.fill_rect(Rect.new(105+((i-1)/8)*32,64+((i-1)%8)*32,32,32),Color.new(0,0,0,0))
    @keno_window_top.bitmap.fill_rect(Rect.new(105+((i-1)/8)*32,64+((i-1)%8)*32,32,32),Color.new(0,0,0,0))
    # □パネル背景を描画
    @keno_window_under.bitmap.blt(105+((i-1)/8)*32,64+((i-1)%8)*32,panel,Rect.new(32,c*32,32,32))
    # □パネル枠を描画
    @keno_window_top.bitmap.blt(105+((i-1)/8)*32,64+((i-1)%8)*32,panel,Rect.new(0,c*32,32,32))
    # □数値を描画
    if @average[i] == @average.max
      color = 8
    elsif @average[i] == @average.min
      color = 9
    end
    @keno_window_top.bitmap.draw_numbers(110+((i-1)/8)*32,75+((i-1)%8)*32,24,12,12,bitmap,i,0,color,0,1)
  end
  #--------------------------------------------------------------------------
  # ■ 配当を描画
  #--------------------------------------------------------------------------
  def make_rate
    if @choice.size == @old_choice.size && @old_choice != []
      return
    end
    @old_choice = @choice.dup
    r_font = @r_font.dup
    r_font.color = HIDE_KENO::M_COLOR.dup
    n_font = @r_font.dup
    n_font.color = HIDE_KENO::N_COLOR.dup
    if @choice.size == 0
      @keno_window_rate.bitmap.clear
    end
    for i in 1...@rate.size
      if @choice.size > 0 && @choice.size > (i-1)
        rate = @rate[@choice.size][i]
        if rate == nil or rate == 0
          r_font.color = HIDE_KENO::M_COLOR.dup
          n_font.color = HIDE_KENO::N_COLOR.dup
          n = HIDE_KENO::WORD2
        else
          r_font.color = HIDE_KENO::S_COLOR.dup
          n_font.color = HIDE_KENO::M_COLOR.dup
          n = ((@rate[@choice.size][i] * @coin).floor).to_s
        end
      else
        r_font.color = HIDE_KENO::N_COLOR.dup
        n_font.color = HIDE_KENO::N_COLOR.dup
        n = HIDE_KENO::WORD2
      end
      cy = 260/(@rate.size-1)
      @keno_window_rate.draw_text(440+48,58+cy*(i-1),120,0,n,2,n_font)
      @keno_window_rate.draw_text(440+40,58+cy*(i-1),0,0,sprintf("%02d",i),0,r_font)
    end
  end
  #--------------------------------------------------------------------------
  # ■ 選択肢の色更新
  #--------------------------------------------------------------------------
  def exchange_colors?
    @game_select_window.exchange[0] = @choice == []
    @game_select_window.exchange[1] = $game_party.coin < @coin
    @game_select_window.exchange[2] = @choice == []
    @game_select_window.exchange[3] = @choice == []
    @game_select_window.refresh
  end
  #--------------------------------------------------------------------------
  # ■ ｑI択の初期化
  #--------------------------------------------------------------------------
  def panel_clear
    @choice = [] ; @numbers = []
    # □パネルを描画
    make_panel
    # □配当を描画
    make_rate
  end
  #--------------------------------------------------------------------------
  # ■ 初期化
  #--------------------------------------------------------------------------
  def panel_reset
    @balls = []
    @hits = 0
    panel_numbers?
  end
  #--------------------------------------------------------------------------
  # ■ ｏ炎化
  #--------------------------------------------------------------------------
  def panel_numbers?
    @numbers = []
    for i in @choice
      @numbers.push(index_new(i))
    end
  end
  #--------------------------------------------------------------------------
  # ■ ボール初期化
  #--------------------------------------------------------------------------
  def ball_reset
    @ball_move = false
    @keno_ball.each{|a| a.reset }
  end
  #--------------------------------------------------------------------------
  # ■ ｒ椛I開始
  #--------------------------------------------------------------------------
  def draw_ball
    hit = false
    rate = @rate[@choice.size]
    keys = [] ; numbers = [] ; choice = []
    # □乱数用の配列を取得
    num = @rand.dup
    # □配当の選択(Hit数)
    for i in rate.keys
      if rate[i] != 0
        keys.push(i)
      end
    end
    keys = keys.sort!
    # □Hit数をランダムに選択
    hit_n = keys[rand(keys.size)]
    # □選択ｂランダムにHit数だけ取得
    panel_numbers?
    hit_choice = @numbers.dup
    while hit_n != numbers.size
      n = hit_choice[rand(hit_choice.size)]
      if n != nil
        numbers.push(n)
        hit_choice.delete(n)
      end
    end
    numbers = numbers.sort!
    # □Hit率の操作(Hit率が平均以下の場合Hit率UP)
    new = []
    for a in numbers
      if @average[a+1] >= @average[0] + 10
        # □Hit率が平均より10以上の場合は25%の確率でHit
        if rand(4) == 1
          new.push(a)
        end
      elsif @average[a+1] + 10 <= @average[0]
        # □Hit率が平均より10以下場合は100%の確率でHit
        new.push(a)
      else
        # □75%の確率でHit
        if rand(4) != 1
          new.push(a)
        end
      end
      # □デバッグ
      if HIDE_KENO::DEBUG
        p "" + (a+1).to_s + ": " + @average[a+1].to_s + "%"
      end
    end
    numbers = new.sort!
    # □通常アニメの確率UP
    if $game_party.keno_quick[$game_temp.keno_type]
      quick = 1
    else
      luck = [[HIDE_KENO::LUCK[$game_temp.keno_type],0].max,100].min
      quick = (100 - luck) / 10.0
    end
    # □当たり判定(x分の1の確率)
    if rate[hit_n] != nil && numbers != []
      x = [((rate[hit_n] / numbers.size) * quick).floor,1].max
      hit = rand(x) == 1
    end
    # □デバッグ(必ず当たり)
    if HIDE_KENO::DEBUG
      p "Hit数" + hit_n.to_s + "/" + @choice.size.to_s + "個" + 
      "(" + rate[hit_n].to_s + "倍)"
      p numbers
      hit = true
    end
    #…………………………………………………………………………………………………
    # ■ ｒ椛I開始(確率操作)
    #…………………………………………………………………………………………………
    if hit
      # □選択ｂ除外
      for d in numbers
        if num.include?(d)
          num.delete(d)
        end
      end
      # □ｂﾌ取得
      while (20 - numbers.size) != choice.size
        n = num[rand(num.size)]
        if n != nil
          choice.push(n)
          num.delete(n)
        end
      end
      choice += numbers
      shuffle = []
      # □選択ｂﾌシャッフル
      while 20 != shuffle.size
        n = choice[rand(choice.size)]
        if n != nil
          shuffle.push(n)
          choice.delete(n)
        end
      end
      balls = shuffle
    #…………………………………………………………………………………………………
    # ■ ｒ椛I開始(通常確率)
    #…………………………………………………………………………………………………
    else
      average = $game_party.keno_data[$game_temp.keno_type]
      max = average.dup
      max.delete_at(0)
      min = []
      for m in 0...max.size
        # □最小のHit率を75%の確率で抽出
        if max[m] == max.min && rand(4) != 1
          min.push(m)
        end
      end
      # □最小のHit率からランダムに1個を選択
      if min != []
        r = min[rand(min.size)]
        choice.push(r)
        num.delete(r)
      end
      # □ランダムに選択
      while 20 != choice.size
        n = num[rand(num.size)]
        if n != nil
          choice.push(n)
          num.delete(n)
        end
      end
      balls = choice
    end
    return balls
  end
  #--------------------------------------------------------------------------
  # ■ 当たりの処理
  #--------------------------------------------------------------------------
  def keno_hit
    rate = @rate[@choice.size][@hits]
    @keno_window_hit.bitmap.clear
    #…………………………………………………………………………………………………
    # ■ 当りの場合の効果音を演奏(ME)
    #…………………………………………………………………………………………………
    gain = 0
    if rate == nil
      # □ハズレの場合、待ち時間無し
      gain = 0
    else
      gain = ((rate * @coin) * 100).floor / 100
    end
    #…………………………………………………………………………………………………
    # ■ 当りの場合の点滅
    #…………………………………………………………………………………………………
    flash = RPG::Cache.windowskin(HIDE_KENO::HIT)
    # □選ばれたパネルを点滅
    for i in @balls
      color = Color.new(255,255,255,200)
      @keno_window_hit.bitmap.fill_rect(Rect.new(105+((i)/8)*32,64+((i)%8)*32,32,32),color)
    end
    # □当たりの出たレートを点滅
    if @hits > 0
      cy = 260/(@rate.size-1)
      @keno_window_hit.draw_flash(flash,440+32,2+58+cy*(@hits-1),145,cy+4,(cy+4)/2)
    end
    # □Hit確率を更新
    average?
    # □確率を描画
    draw_average
    # □パネルを更新
    refresh_panel
    #…………………………………………………………………………………………………
    # ■ 所持コインを増やす
    #…………………………………………………………………………………………………
    $game_party.gain_coin(gain)
    time_up = 1
    if gain > 0 && gain > @coin && ! HIDE_KENO::DEBUG
      # □大当たりの場合
      if gain >= HIDE_KENO::ME_RATE_MAX[$game_temp.keno_type]
        $game_system.me_play(RPG::AudioFile.new(HIDE_KENO::HIT_ME_MAX))
        # □次のゲーム開始まで待つ(MEの演奏時間)
        time_up = HIDE_KENO::ME_MAX_TIME
      else
        $game_system.me_play(RPG::AudioFile.new(HIDE_KENO::HIT_ME))
        # □次のゲーム開始まで待つ(MEの演奏時間)
        time_up = HIDE_KENO::ME_TIME
      end
    end
    #…………………………………………………………………………………………………
    # ■ 次の開始まで待つ
    #…………………………………………………………………………………………………
    time = 0
    @keno_window_hit.blink_active = true
    @keno_window_hit.blink_start
    while @keno_window_hit.blink_active
      # □ゲーム画面を更新
      Graphics.update
      # □回転数値の更新(所持コイン)
      @coin_window.update($game_party.coin)
      # □当りの演出を更新
      if time < time_up
        if @keno_window_hit.count?
          time += 1
        end
        @keno_window_hit.update
      else
        @keno_window_hit.blink_end
      end
    end
    @keno_window_hit.blink_active = false
    # □選択色を変更
    exchange_colors?
    @ball_move = false
    @game_select_window.active = true
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新
  #--------------------------------------------------------------------------
  def update
    #…………………………………………………………………………………………………
    # ■ 回転数値の更新(所持コイン)
    #…………………………………………………………………………………………………
    @coin_window.update($game_party.coin)
    #…………………………………………………………………………………………………
    # ■ ケノボールの更新
    #…………………………………………………………………………………………………
    if @ball_move
      for i in 1...@keno_ball.size
        if @keno_ball[i-1].follow
          @keno_ball[i].active = true
          @keno_ball[i].visible = true
        end
      end
      # □最終ボールが停止した場合
      if @keno_ball[@keno_ball.size-1].stop
        # □当たりの処理
        keno_hit
        return
      end
    end
    @keno_ball.each{|a| a.update }
    #…………………………………………………………………………………………………
    # ■ ゲーム開始ウィンドウの更新
    #…………………………………………………………………………………………………
    if @keno_window_check.active
      @keno_window_check.update
      update_check
      return
    end
    #…………………………………………………………………………………………………
    # ■ ゲーム開始ウィンドウの更新
    #…………………………………………………………………………………………………
    if @game_select_window.active
      @game_select_window.update
      update_select
      return
    end
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新(ｑI択)
  #--------------------------------------------------------------------------
  def update_check
    #…………………………………………………………………………………………………
    # ■ ヘルプを描画(高速起動)
    #…………………………………………………………………………………………………
    if @helps[@keno_window_check.index] == ""
      i = @keno_window_check.index
      index = index_new(i)
      n = sprintf("%02d",(index+1))
      @helps[i] = HIDE_KENO::HELP1 + n + HIDE_KENO::HELP2
      @helps[i+80] = HIDE_KENO::HELP1 + n + HIDE_KENO::HELP3
      @helps[i+160] = HIDE_KENO::HELP1 + n + HIDE_KENO::HELP4
      # □ヘルプを描画
      @keno_window_check.draw_help(i,@helps)
      @keno_window_check.draw_help(i+80,@helps)
      @keno_window_check.draw_help(i+160,@helps)
    end
    #…………………………………………………………………………………………………
    # ■ ヘルプの更新
    #…………………………………………………………………………………………………
    if ! @choice.include?(@keno_window_check.index) && @choice.size < @rate.size-1
      @keno_window_check.help_id = @keno_window_check.index
    elsif @choice.include?(@keno_window_check.index)
      @keno_window_check.help_id = @keno_window_check.index + 80
    else
      @keno_window_check.help_id = @keno_window_check.index + 160
    end
    #…………………………………………………………………………………………………
    # ■ C ボタンが押された場合
    #…………………………………………………………………………………………………
    if Input.trigger?(Input::C)
      i = @keno_window_check.index
      if ! @choice.include?(i) && @choice.size < @rate.size-1
        # □決定SEを演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
        @choice.push(i)
        c = 1 ; color = 6
      elsif @choice.include?(i)
        # □キャンセルSEを演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::CANCEL_SE))
        @choice.delete(i)
        c = 0 ; color = 10
      else
        # □ブザー SE を演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BUZZER_SE))
        return
      end
      index = index_new(i)
      # □パネルを描画
      make_panel(index+1,c,color)
      # □配当を描画
      make_rate
      # □選択肢の文字色を初期化
      exchange_colors?
    end
    #…………………………………………………………………………………………………
    # ■ B ボタンが押された場合
    #…………………………………………………………………………………………………
    if Input.trigger?(Input::B)
      # □キャンセルSEを演奏
      $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::CANCEL_SE))
      @game_select_window.active = true
      @keno_window_check.visible = false
      @keno_window_check.active = false
    end
  end
  #--------------------------------------------------------------------------
  # ■ フレーム更新(ゲーム開始)
  #--------------------------------------------------------------------------
  def update_select
    #…………………………………………………………………………………………………
    # ■ C ボタンが押された場合
    #…………………………………………………………………………………………………
    if Input.trigger?(Input::C)
      case @game_select_window.index
      when 0 #□ゲーム開始
        if $game_party.coin >= @coin && @choice != []
          @game_select_window.active = false
          # □コインを減らす(賭け金)
          $game_party.lose_coin(@coin)
          # □選択肢の文字色を初期化
          exchange_colors?
          @playing = true
          # □回数を描画
          draw_spin
          # □ボール初期化
          ball_reset
          # □ｒ椛I開始
          balls = draw_ball
          # □初期化
          panel_reset
          for i in 0...@keno_ball.size
            n = balls[i] ; type = 0
            @balls.push(n)
            if @numbers.include?(n)
              @hits += 1
              type = 1
            end
            @keno_ball[i].make_ball?(n+1,type)
          end
          @ball_move = true
          @keno_ball[0].active = true
        # □コインが足りない/選択無し場合
        else
          # □ブザー SE を演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BUZZER_SE))
          return
        end
      when 1 #□ｑI択
        if $game_party.coin >= @coin
          # □決定SEを演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
          @game_select_window.active = false
          @keno_window_check.start(100)
          @keno_window_check.active = true
        else
          # □ブザー SE を演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BUZZER_SE))
        end
      when 2 #□ランダムｑI択
        if @choice != []
          # □決定SEを演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
          size = @choice.size
          #□ｑI択の初期化
          panel_clear
          choice = []
          num = @rand.dup
          while size != choice.size
            n = num[rand(num.size)]
            choice.push(n)
            num.delete(n)
          end
          @choice = choice
          # □選択ｂ変換(index補正)
          @numbers = []
          for i in @choice
            index = index_new(i)
            @numbers.push(index)
            # □パネルを描画
            make_panel(index+1,1,6)
          end
          # □配当を描画
          make_rate
        else
          # □ブザー SE を演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BUZZER_SE))
        end
      when 3 #□ｑI択の初期化
        if @choice != []
          # □決定SEを演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
          #□ｑI択の初期化
          panel_clear
        else
          # □ブザー SE を演奏
          $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BUZZER_SE))
        end
        # □選択肢の文字色を初期化
        exchange_colors?
      when 4 #□アニメの切り替え
        # □決定SEを演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
        t = $game_temp.keno_type
        $game_party.keno_quick[t] ^= true
        draw_quick(t)
      when 5 #□ゲーム終了
        # □決定SEを演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::DECISION_SE))
        @playing = false
        keno_end
      end
      return
    end
    #…………………………………………………………………………………………………
    # ■ B ボタンが押された場合
    #…………………………………………………………………………………………………
    if Input.trigger?(Input::B)
      # □キャンセルSEを演奏
      $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::CANCEL_SE))
      @playing = false
      keno_end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ■ ゲームの終了
  #--------------------------------------------------------------------------
  def keno_end
    unless @playing
      # □ ケノ開始前の BGM に戻す
      $game_system.bgm_play($game_temp.map_bgm)
      # マップ画面に切り替え
      $scene = Scene_Map.new
      return
    end
  end
end
#==============================================================================
# ■ Keno_Ball
#==============================================================================
class Keno_Ball
  include HIDE_KENO
  attr_accessor :active                   # 更新フラグ
  attr_accessor :stop
  attr_accessor :follow
  attr_accessor :x
  attr_accessor :y
  attr_accessor :number                   #番号
  attr_accessor :value                    #値
  attr_accessor :step
  #--------------------------------------------------------------------------
  # ■ オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x,y,number,value)
    @x = x ; @y = y
    @number = number
    @value = value
    make_ball?(@value,rand(2))
    reset
  end
  #--------------------------------------------------------------------------
  # ■ 初期化
  #--------------------------------------------------------------------------
  def reset
    @active = false
    @stop = false
    @follow = false
    @ball_fall = 1
    @ball_bound = 0
    @count = 0
    @move = 0
    @step = 0
    @ball_step = 0
    @ball_window.visible = false
    @number_window.visible = false
    move_x(0) ; move_y(0)
    @ball_window.oy = 0
  end
  #--------------------------------------------------------------------------
  # ■ ボールの作成
  #--------------------------------------------------------------------------
  def make_ball?(n,type = 0)
    # □簡易アニメフラグを取得
    t = $game_temp.keno_type
    @quick = $game_party.keno_quick[t]
    pic = RPG::Cache.windowskin(HIDE_KENO::BALL)
    # □ボール画像ウィンドウの作成
    if @ball_window == nil
      @width = pic.width/8 ; @height = pic.height/2
      @ball_window = Sprite.new(Viewport.new(0,0,@width,@height))
      @ball_window.bitmap = Bitmap.new(@width*8,@height*2)
      @ball_window.bitmap.blt(0,0,pic,Rect.new(0,0,@width*8,@height*2))
      @ball_window.visible = false
    end
    # □□ボール数字ウィンドウの作成
    if @number_window == nil
      @number_window = Sprite.new(Viewport.new(0,0,@width,@height))
      @number_window.bitmap = Bitmap.new(@width,@height)
      @number_window.visible = false
    end
    # □□ボール数字の描画
    @number_window.bitmap.clear
    t_font = Copy_Font.new(16,true,false,false,false,["Arial","ＭＳ ゴシック"])
    t_font.color = type == 0 ? pic.get_pixel(6,6) : pic.get_pixel(6,6+28)
    @number_window.bitmap.draw_cache_text(11,0,@width,@height,sprintf("%02d",n),0,t_font)
    move_x(0) ; move_y(0)
    @ball_window.oy = type*@height
  end
  #--------------------------------------------------------------------------
  # ■ ボールの更新
  #--------------------------------------------------------------------------
  def update
    unless @active
      return
    end
    case @step
    when 0 # □自由落下
      # □簡易アニメ
      if @quick
        move_x(560 - @number*@width)
        move_y(276)
        @ball_step = 0
        @follow = true
      end
      # □1番目のボールを可視化
      if @number == 0
        @ball_window.visible = true
        @number_window.visible = true
      end
      if @ball_window.viewport.rect.y < 276
        move_y(@ball_fall)
        @ball_fall *= HIDE_KENO::FALL
      else
        @ball_fall = 276
        move_y(@ball_fall)
        # □落下衝撃SEの演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BALL_SE))
        @step = 1
      end
    when 1 # □Yバウンド
      @ball_step += 1
      case @ball_step
      when 1
        @ball_bound = 276 - 1
      when 2
        @ball_bound = 276 - 3
      when 3
        @ball_bound = 276 - 6
      when 4
        @ball_bound = 276 - 10
      when 5
        @ball_bound = 276 - 9
      when 6
        @ball_bound = 276 - 7
      when 7
        @ball_bound = 276 - 4
      when 8
        @ball_bound = 276
      else
        # □バウンドSEの演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BALL_SE,80))
        @ball_step = 0
        @step = 2
        return
      end
      move_y(@ball_bound)
    when 2 # □回転X移動
      # □簡易アニメ
      if @quick
        @step = 3
        return
      end
      @count += 1
      if @count == 8*HIDE_KENO::SPEED
        @count = 0
      end
      @move += 1
      # □次のボールを更新するフラグをON
      if @move > 5
        @follow = true
      end
      if @move_x < 554 - @number*@width + @width
        # □ボール画像の回転
        @ball_window.ox = (@count/HIDE_KENO::SPEED)*@width
        # □ボール数字の回転
        @number_window.angle = 360-(@count/HIDE_KENO::SPEED)*45
        @number_window.angle %= 360
        @number_window.ox = @width/2 ; @number_window.oy = @height/2
        @number_window.x = @width/2 ; @number_window.y = @height/2
        move_x((@move/HIDE_KENO::SPEED)*4)
      else
        @number_window.angle = 45
        @ball_window.ox = @width*7
        # □バウンドSEの演奏
        $game_system.se_play(RPG::AudioFile.new(HIDE_KENO::BALL_SE,80))
        @step = 3
        return
      end
    when 3 # □Xバウンド
      # □簡易アニメ
      if @quick
        @step = 4
        return
      end
      @ball_step += 1
      bx = 560 - @number*@width
      case @ball_step
      when 1
        @ball_bound = bx - 1
      when 2
        @ball_bound = bx - 3
      when 3
        @ball_bound = bx - 6
        # □ボール数字の回転
        @number_window.angle = 90
        @ball_window.ox = @width*6
      when 4
        @ball_bound = bx - 10
      when 5
        @ball_bound = bx - 9
      when 6
        @ball_bound = bx - 7
        # □ボール数字の回転
        @number_window.angle = 45
        @ball_window.ox = @width*7
      when 7
        @ball_bound = bx - 4
      when 8
        @ball_bound = bx
      else
        # □ボール数字の初期化
        @number_window.angle = 0
        @ball_window.ox = 0
        @ball_step = 0
        @step = 4
        return
      end
      move_x(@ball_bound)
      return
    when 4
      @stop = true
    end
    return
  end
  #--------------------------------------------------------------------------
  # ■ ボールの可視化
  #--------------------------------------------------------------------------
  def visible=(visible)
    @ball_window.visible = visible
    @number_window.visible = visible
  end
  #--------------------------------------------------------------------------
  # ■ X座標の更新
  #--------------------------------------------------------------------------
  def move_x(x)
    @ball_window.viewport.rect.x = x + @x
    @number_window.viewport.rect.x = x + @x
    @move_x = x + @x
  end
  #--------------------------------------------------------------------------
  # ■ Y座標の更新
  #--------------------------------------------------------------------------
  def move_y(y)
    @ball_window.viewport.rect.y = y + @y
    @number_window.viewport.rect.y = y + @y
    @move_y = y + @y
  end
  #--------------------------------------------------------------------------
  # ■ 解放
  #--------------------------------------------------------------------------
  def dispose
    if @ball_window.bitmap != nil
      @ball_window.bitmap.dispose
    end
    if @ball_window.viewport != nil
      @ball_window.viewport.dispose
    end
    @ball_window.dispose
    if @number_window.bitmap != nil
      @number_window.bitmap.dispose
    end
    if @number_window.viewport != nil
      @number_window.viewport.dispose
    end
    @number_window.dispose
  end
end