#============================================================================== # 霧雨式簡易ルーレット。 # 作成者:misty_rain (http://page.freett.com/misty_rain/) # ★★★★★概要など★★★★★ # 2006/09/27~09/29 # 参加人数は一人。プレイヤーのみ。現金でやり取り。 # 賭け金、賭け方を選んだ後、ルーレットが回転します。 # Cボタンを押して自分で止めます。 # イベントコマンドのスクリプトで、$scene = Roulette.newと記述すると始められます。 # 何かバグっぽいのが出たら教えてください。 # ★★★★★手順★★★★★ # ・するかしないかの最終確認を行なう。 # ・賭け金を選択する。最低1G、最高100G。キャンセル可。 # ・賭け方を選択する。数字一つor赤or黒or他色々。賭け方により配当が違う。 # ・ルーレット回転。自分で止められる。 # ・ルーレット停止。判定。配当支払 # ・再びするかを聞く。するなら賭け金選択へ。 # #============================================================================== # ▲ Roulette #------------------------------------------------------------------------------ #  霧雨式簡易ルーレットの本体です。 #============================================================================== class Roulette #-------------------------------------------------------------------------- # ★ファイル名 #-------------------------------------------------------------------------- # ルーレット画像の名前 RouletteIMGFile = "Graphics/Pictures/Roulette" # 数字を指す画像の名前 Cursor = "Graphics/Pictures/RouletteCursor" #背景画像の名前 RoulBackFile = "Graphics/Titles/001-Title01" #敗北時SE Lse = "Audio/SE/057-Wrong01" #勝利時SE Wse = "Audio/SE/056-Right02" #-------------------------------------------------------------------------- # ★ オブジェクト初期化 # menu_index : コマンドのカーソル初期位置 #-------------------------------------------------------------------------- def initialize(menu_index = 0) #乱数初期化しちゃう srand end #-------------------------------------------------------------------------- # ★ メイン処理 #-------------------------------------------------------------------------- def main # 背景 @RoulBack = Sprite.new @RoulBack.bitmap = Bitmap.new(RoulBackFile) # ルーレット本体 @RouletteIMG = Sprite.new @RouletteIMG.bitmap = Bitmap.new(RouletteIMGFile) @RouletteIMG.visible = false # 回る数字,本体から一数字ずつ @Line = [] for k in 0..36 @Line[k] = Sprite.new @Line[k].bitmap = Bitmap.new(54,54) @Line[k].bitmap.blt(0, 0, @RouletteIMG.bitmap, Rect.new( (k % 6) * 54,(k / 6)*54,54 ,54)) @Line[k].x = @Line[k].bitmap.width * k @Line[k].y = 240 - (@Line[k].bitmap.height / 2) end #数字を指す画像 @CursorIMG = Sprite.new @CursorIMG.bitmap = Bitmap.new(Cursor) @CursorIMG.x = @Line[5].bitmap.width * 5 @CursorIMG.y = 240 - (@CursorIMG.bitmap.height / 2) -54 #回転速度配列 @KaitenHairetsu = [1,2,3,6,9,18,27,54] @nowSpeed = 0 #ゲームのフェイズを零にする。 @RoulPhase = 0 #賭け金配列 @Bet = [] #数字配列 この並びが回ります。画像に対応させてください。 @Num = [ 0,32,15,19, 4,21, 2,25,17,34, 6,27, 13,36,11,30, 8,23, 10, 5,24,16,33, 1, 20,14,31, 9,22,18, 29, 7,28,12,35, 3, 26 ] #色 "無"だと止まったときに色を言わない @Color = [ "無","赤","黒","赤","黒","赤", "黒","赤","黒","赤","黒","赤", "黒","赤","黒","赤","黒","赤", "黒","赤","黒","赤","黒","赤", "黒","赤","黒","赤","黒","赤", "黒","赤","黒","赤","黒","赤", "黒", ] #賭け方配列 @Kake = [ "一数字(×10.6)", "二数字(× 8.5)", "三数字(× 6.4)", "四数字(× 4.3)", "1〜12 (× 2.2)", "13〜24(× 2.2)", "25〜36(× 2.2)", "赤 (× 1.1)", "黒 (× 1.1)", "偶数 (× 1.1)", "奇数 (× 1.1)", ] #配当倍率配列 @Odds = [ 10.6, 8.5, 6.4, 4.3, 2.2, 2.2, 2.2, 1.1, 1.1, 1.1, 1.1, ] # コマンドウィンドウを作成 s1 = "はい" s2 = "いいえ" @command_window = Window_Command.new(100, [s1,s2]) @command_window.index = 0 @command_window.x = 320 - (@command_window.width / 2) @command_window.y = 240 - (@command_window.height / 2) @command_window.active = TRUE @command_window.opacity = 160 #ヘルプウィンドウを作成 @Help_window = Window_Help.new @Help_window.opacity = 160 # ゴールドウィンドウを作成 @gold_window = Window_Gold.new @gold_window.x = 640 - @gold_window.width @gold_window.y = @Help_window.height @gold_window.opacity = 160 #賭け金を決めるウィンドウ @Bet_windowPare = Window_Base.new(640-128,480-64,128,64) @Bet_windowPare.opacity = 160 @Bet_window = Window_InputNumber.new(4) @Bet_window.visible = FALSE @Bet_window.active = FALSE @Bet_window.x = 640 - @Bet_window.width @Bet_window.y = 480 - @Bet_window.height #賭け方を決めるウィンドウ @kakekata_window = Window_Command.new(200, @Kake) @kakekata_window.index = 0 @kakekata_window.x = 0 @kakekata_window.y = 480 - (@gold_window.height * 2) @kakekata_window.height = @gold_window.height * 2 @kakekata_window.active = false @kakekata_window.opacity = 160 #賭け方の詳細を決めるウィンドウ @suji = [ " 0"," 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9", "10","11","12","13","14","15","16","17","18","19", "20","21","22","23","24","25","26","27","28","29", "30","31","32","33","34","35","36" ] #数字選択ウィンドウ @suji_window = [] @sujisw = [] @i = 0 for @i in 0..3 @suji_window[@i] = Window_Command.new(70,@suji) @suji_window[@i].active = false @suji_window[@i].visible = false @suji_window[@i].index = 0 @suji_window[@i].x = (@i * 70) + @kakekata_window.width @suji_window[@i].y = 480 - (@gold_window.height * 2) @suji_window[@i].height = @gold_window.height * 2 @suji_window[@i].opacity = 160 @sujisw[@i] = 0 end #初期回転速度 @kaitenSPD = 1 @Help_window.set_text("ルーレットをやりますか?") # トランジション実行 Graphics.transition # メインループ loop do case @RoulPhase when 0 #やるか、やらないか・・・? when 1 @Help_window.set_text("賭け金を決めてください。") @Bet_window.visible = TRUE @Bet_window.active = TRUE @RoulPhase = 2 when 2 #BET・フェイズ #何もしません。 #賭け金の入力を待ちます。 when 3 #賭け方選択 #何もしません。 ##賭け方の選択を待ちます。 when 4 #賭け方詳細選択 #何もしません。 #賭け方詳細の選択を待ちます。 when 5 #回転開始 @Line[0].x = @Line[0].x - @KaitenHairetsu[@kaitenSPD/8] for k in 1..36 if (@Line[k].x < 0 && @Line[k].x >= -108) @Line[k].x = @Line[k].x - @KaitenHairetsu[@kaitenSPD/8] else @Line[k].x = @Line[k-1].x + 54 end end if (@Line[0].x <= -108) @Line[0].x = @Line[36].x + 54 end @kaitenSPD = @kaitenSPD + 1 if(@kaitenSPD == 64) @Help_window.set_text("Cボタンで回転を止めます。") @RoulPhase = 6 end when 6 #回転中・ストップ入力受付 @Line[0].x = @Line[0].x - @KaitenHairetsu[7] for k in 1..36 if (@Line[k].x < 0 && @Line[k].x >= -108) @Line[k].x = @Line[k].x - @KaitenHairetsu[7] else @Line[k].x = @Line[k-1].x + 54 end end if (@Line[0].x <= -108) @Line[0].x = @Line[36].x + 54 end if Input.trigger?(Input::C) @Help_window.set_text("停止中です・・・") @RoulPhase = 7 @kaitenSPD = 54 @StopSW = 0 @StopNumber = -1 end when 7 #停止中 @Line[0].x = @Line[0].x - @KaitenHairetsu[@kaitenSPD/8] for k in 1..36 if (@Line[k].x < 0 && @Line[k].x >= -108) @Line[k].x = @Line[k].x - @KaitenHairetsu[@kaitenSPD/8] else @Line[k].x = @Line[k-1].x + 54 end end if (@Line[0].x <= -108) @Line[0].x = @Line[36].x + 54 end if(@kaitenSPD == 0 ) @RoulPhase = 8 else @kaitenSPD = @kaitenSPD - 1 end when 8 #完全停止 if(@Line[0].x % 54 == 0) @StopNumber = 0 for k in 0..36 if ( @Line[k].x == (54 * 5) ) @StopNumber = k break end end if (@Color[@StopNumber] == "無") @Help_window.set_text("#{@Num[@StopNumber]}") else @Help_window.set_text("#{@Num[@StopNumber]}の#{@Color[@StopNumber]}") end @RoulPhase = 9 @Roulwait = 100 else @Line[0].x = @Line[0].x - @KaitenHairetsu[0] for k in 1..36 if (@Line[k].x < 0 && @Line[k].x >= -108) @Line[k].x = @Line[k].x - @KaitenHairetsu[0] else @Line[k].x = @Line[k-1].x + 54 end end if (@Line[0].x <= -108) @Line[0].x = @Line[36].x + 54 end end when 9 #停止&判定&支払い if (@Roulwait > 0) @Roulwait = @Roulwait -1 else #判定 @Atari = 0 case @kakekata_window.index when 0 # 一数字 if (@Num[@StopNumber] == @suji_window[0].index) @Atari = 1 end when 1 # 二数字 if (@Num[@StopNumber] == @suji_window[0].index || @Num[@StopNumber] == @suji_window[1].index ) @Atari = 1 end when 2 # 三数字 if (@Num[@StopNumber] == @suji_window[0].index || @Num[@StopNumber] == @suji_window[1].index || @Num[@StopNumber] == @suji_window[2].index ) @Atari = 1 end when 3 # 四数字 if (@Num[@StopNumber] == @suji_window[0].index || @Num[@StopNumber] == @suji_window[1].index || @Num[@StopNumber] == @suji_window[2].index || @Num[@StopNumber] == @suji_window[3].index) @Atari = 1 end when 4 # 1-12 if (@Num[@StopNumber] >= 1 && @Num[@StopNumber] <=12 ) @Atari = 1 end when 5 # 13-24 if (@Num[@StopNumber] >= 13 && @Num[@StopNumber] <=24 ) @Atari = 1 end when 6 # 25-36 if (@Num[@StopNumber] >= 25 && @Num[@StopNumber] <=36 ) @Atari = 1 end when 7 # rouge if (@Color[@StopNumber] == "赤") @Atari = 1 end when 8 # noir if (@Color[@StopNumber] == "黒") @Atari = 1 end when 9 # 偶数 if (@Num[@StopNumber] % 2 == 0) @Atari = 1 end when 10 # 奇数 if (@Num[@StopNumber] % 2 == 1) @Atari = 1 end end if(@Atari == 1) #当り Audio.se_play(Wse, 80, 100) $game_party.gain_gold((@Bet * @Odds[@kakekata_window.index]).truncate) @gold_window.refresh # 支払い else # 外れ Audio.se_play(Lse, 80, 100) end @RoulPhase = 10 @Help_window.set_text("続けますか?") @command_window.active = TRUE @command_window.visible = TRUE end when 10 # 続けるか? when 11 # 続けます @suji_window[0].visible = FALSE @suji_window[1].visible = FALSE @suji_window[2].visible = FALSE @suji_window[3].visible = FALSE @command_window.active = FALSE @command_window.visible = FALSE @RoulPhase = 1 when 12 # 終了する # マップ画面に切り替え $scene = Scene_Map.new end # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze #開放します @command_window.dispose @gold_window.dispose @Help_window.dispose @Bet_window.dispose @Bet_windowPare.dispose @kakekata_window.dispose @CursorIMG.bitmap.dispose @CursorIMG.dispose for @i in 0..3 @suji_window[@i].dispose end for k in 0..36 @Line[k].bitmap.dispose @Line[k].dispose end @RoulBack.bitmap.dispose @RoulBack.dispose @RouletteIMG.bitmap.dispose @RouletteIMG.dispose end #-------------------------------------------------------------------------- # ★ フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 @gold_window.update #ベットウィンドウの更新 if @Bet_window.active @Bet_window.update @Bet_windowPare.update update_Bet end #コマンドウィンドウの更新 if @command_window.active @command_window.update update_command end if @kakekata_window.active @kakekata_window.update update_kakekata end if @suji_window[0].active @suji_window[0].update update_suji1 end if @suji_window[1].active @suji_window[1].update update_suji2 end if @suji_window[2].active @suji_window[2].update update_suji3 end if @suji_window[3].active @suji_window[3].update update_suji4 end end #---------------------- ---------------------------------------------------- # ★ フレーム更新(賭け金入力ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_Bet if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @RoulPhase = 12 end # C ボタンが押された場合 if Input.trigger?(Input::C) #所持金以下か? if @Bet_window.number <= $game_party.gold if @Bet_window.number > 0 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @Bet_window.active = FALSE @Bet = @Bet_window.number $game_party.lose_gold(@Bet) @gold_window.refresh toKakekataSentaku else #ブザー $game_system.se_play($data_system.buzzer_se ) @Help_window.set_text("1#{$data_system.words.gold}以上を指定してください。") end else #ブザー $game_system.se_play($data_system.buzzer_se ) @Help_window.set_text("お金が足りないようです。") end return end end #-------------------------------------------------------------------------- # ● 賭け方選択へ #-------------------------------------------------------------------------- def toKakekataSentaku @Help_window.set_text(" ") @RoulPhase = 3 @sujisw[0] = 0 @sujisw[1] = 0 @sujisw[2] = 0 @sujisw[3] = 0 @kakekata_window.active = true @Help_window.set_text("賭け方を選択してください。") end #-------------------------------------------------------------------------- # ● 回す! #-------------------------------------------------------------------------- def toKaiten @Help_window.set_text("回転します・・・") @RoulPhase = 5 @nowSpeed = 0 @kaitenSPD = 1 end #-------------------------------------------------------------------------- # ● フレーム更新 (賭け方ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_kakekata # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @Help_window.set_text("賭け金を決めてください。") @Bet_window.active = true $game_party.gain_gold(@Bet) @gold_window.refresh @kakekata_window.active = false @RoulPhase = 2 return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) #@Help_window.set_text("賭け金:#{@Bet},賭け方:#{@Odds[@kakekata_window.index]}") if(@kakekata_window.index > 3 && @sujisw[0] != 0) @sujisw[0] = 0 @kakekata_window.active = false toKaiten elsif( @sujisw[0] != 0) @sujisw[0] = 0 @kakekata_window.active = false @Help_window.set_text("どの数字に賭けますか?") @suji_window[0].active = true @suji_window[0].visible= true @RoulPhase = 4 return end @sujisw[0] = 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 (数字選択ウィンドウ1がアクティブの場合) #-------------------------------------------------------------------------- def update_suji1 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @suji_window[0].active = false @suji_window[0].visible= false toKakekataSentaku @sujisw[0] = 1 return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) if(@kakekata_window.index > 0 && @sujisw[0] != 0) @sujisw[0] = 0 @suji_window[0].active = false @suji_window[1].active = true @suji_window[1].visible= true return elsif( @sujisw[0] != 0) @suji_window[0].active = false toKaiten return end @sujisw[0] = 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 (数字選択ウィンドウ2がアクティブの場合) #-------------------------------------------------------------------------- def update_suji2 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @suji_window[1].active = false @suji_window[1].visible= false @suji_window[0].active = true @suji_window[0].visible= true @sujisw[0] = 1 return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) if(@kakekata_window.index > 1 && @sujisw[0] != 0) @sujisw[0] = 0 @suji_window[1].active = false @suji_window[2].active = true @suji_window[2].visible= true return elsif( @sujisw[0] != 0) @sujisw[0] = 0 @suji_window[1].active = false toKaiten return end @sujisw[0] = 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 (数字選択ウィンドウ3がアクティブの場合) #-------------------------------------------------------------------------- def update_suji3 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @suji_window[2].active = false @suji_window[2].visible= false @suji_window[1].active = true @suji_window[1].visible= true @sujisw[0] = 1 return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) if(@kakekata_window.index > 2 && @sujisw[0] != 0) @sujisw[0] = 0 @suji_window[2].active = false @suji_window[3].active = true @suji_window[3].visible= true return elsif( @sujisw[0] != 0) @sujisw[0] = 0 @suji_window[2].active = false toKaiten return end @sujisw[0] = 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 (数字選択ウィンドウ4がアクティブの場合) #-------------------------------------------------------------------------- def update_suji4 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @suji_window[3].active = false @suji_window[3].visible= false @suji_window[2].active = true @suji_window[2].visible= true @sujisw[0] = 1 return end if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) if(@sujisw[0] != 0) @sujisw[0] = 0 @suji_window[3].active = false toKaiten return end @sujisw[0] = 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_command # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # マップ画面に切り替え $scene = Scene_Map.new return end # C ボタンが押された場合 if Input.trigger?(Input::C) if @RoulPhase == 10 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) case @command_window.index when 0 # 続けます @RoulPhase = 11 when 1 # やめます。(賞金支払いフェイズへ) @RoulPhase = 12 end else # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # やります #一文無しならダメです。 if $game_party.gold == 0 #ブザー $game_system.se_play($data_system.buzzer_se ) @Help_window.set_text("お金が足りないようです。") else # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @Help_window.set_text(" ") @command_window.active = FALSE @command_window.visible = FALSE @RoulPhase = 1 end when 1 # やりません # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # マップ画面に切り替え $scene = Scene_Map.new end end return end end end