#============================================================================== # ミニゲーム:ブラックジャック Plus in VX Ace By 貪藻矢射妥← #------------------------------------------------------------------------------ # 普通のブラックジャックDeath。 # 一人遊びようなのでつまらないことこの上なかったりします。 # # SceneManager.call(Scene_BlackJack) # にてゲームを開始できます。 # # 外部カスタマイズポイントについて # シーンをブラックジャック Plusに移す前に以下を設定することでオリジナルなルール # でゲームを実行可能です # # EX) # $game_system.bj_setting = [14, "ブラッククィーン"] # →Aが取り得るもう一つの数値, ゲームの名称 # # ※ちなみに、普通のカスタマイズポイントにしてないのは、数種類のブラックジャック # を設定したい際にスクリプトをコピペして使用しなくてもいいようにとの配慮です。 #============================================================================== # 変更履歴 # 2012:11:10 # 掛け金を設定し、ゲームを 開始、1枚カードを引いた後にキャンセルをすると、 # 次に決定ボタンを押した際強制終了するバグを修正 # 賭け金を設定してゲームを開始した際にボトムキーヘルプが変わらないバグを修正 # # 2013:06:16 # ・所持金ベット方式と変数ベット方式を選択可能に # # 2013:10:06 # ・賭け金が所持金を上回っていてもゲーム開始できるバグを修正 module BlackJack include BM # トランプの図柄セット CARD_ROOT="tr_set" # トランプ一枚のサイズ TR_WIDTH = 72 TR_HEIGHT = 100 # トランプ一枚の描画倍率 TR_DRAW_RATE = 0.8 # ベット方式 BJ_BET_TYPE = MINI_GAME::MG_BET_TYPE_COIN #-------------------------------------------------------------------------- # トランプセッティング #-------------------------------------------------------------------------- def set_tranp $card = [[], [], [], []] for i in 0...4 for j in 0...15 # 0の場合、カードの裏を設定(未使用) if j == 0 $card[i][j] = Rect.new(13 * TR_WIDTH, 0, TR_WIDTH, TR_HEIGHT) # 14の場合、ジョーカーを設定 elsif j == 14 if i / 2 == 0 $card[i][j] = Rect.new(13 * TR_WIDTH, 1 * TR_HEIGHT, TR_WIDTH, TR_HEIGHT) else $card[i][j] = Rect.new(13 * TR_WIDTH, 2 * TR_HEIGHT, TR_WIDTH, TR_HEIGHT) end # 13の場合、エースを設定 elsif j == 13 $card[i][j] = Rect.new(0, i * TR_HEIGHT, TR_WIDTH, TR_HEIGHT) # それ以外の場合 else $card[i][j] = Rect.new(j * TR_WIDTH, i * TR_HEIGHT, TR_WIDTH, TR_HEIGHT) end end end end #-------------------------------------------------------------------------- # 重複しない乱数を造る。 # ・・・実は今まで、乱数を無限に発生させ、それを配列に格納していって、 # 次に作成する乱数が格納した配列に無い乱数だったら・・・ってのを繰り返して # 造ろうとして大挫折。 # ・・・はじめに連続する数値の配列を作成して、ランダムにシャッフルすれば # よかったのね・・・orz・・・ #-------------------------------------------------------------------------- def change_make_rnd $rand_list = [] cnt1 = 0 cnt2 = 1 for i in 0...52 $rand_list[i] = [cnt1, cnt2] cnt2 += 1 if cnt2 == 14 cnt2 = 1 cnt1 += 1 end end for j in 0...50 rnd1 = rand(52) rnd2 = rand(52) if rnd1 != rnd2 tmp = $rand_list[rnd1] $rand_list[rnd1] = $rand_list[rnd2] $rand_list[rnd2] = tmp end end end #-------------------------------------------------------------------------- # 点数設定:ブラックジャック #-------------------------------------------------------------------------- def chagne_black_jack if $game_system.bj_setting.nil? msgbox "エラー 初期設定がされていません" exit end if $game_system.bj_setting.size != 2 msgbox "エラー 初期設定パラメータ異常です" exit end return 10 + $game_system.bj_setting[0] end #-------------------------------------------------------------------------- # 点数設定:ニアピン #-------------------------------------------------------------------------- def near_black_jack return (chagne_black_jack * 0.8).to_i end #-------------------------------------------------------------------------- # 点数設定:バッドポイント #-------------------------------------------------------------------------- def bad_black_jack return (chagne_black_jack * 0.5).to_i end # ブラックジャックを終える時に外部カスタマイズポイントをnilに戻すか? BJ_END_FLAG = true end class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :bj_point # BlackJack用ポイント attr_accessor :bj_setting # BlackJack Plus用設定 end class Window_Info_Space2_BJ < Window_Base include TITLE_BM #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 320 + 8 - 48, 384, 48) refresh(nil) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(text = nil) contents.clear pos = Rect.new(4, 0, 300, line_height) if text != nil draw_text(pos, text) else if $game_system.bj_point != nil && $game_system.bj_point != 0 draw_text(pos, "[" + $game_system.bj_point.to_s + "] Hit or Stand ?") end end end end class Window_BlackJack < Window_Base include TITLE_BM include BlackJack #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 48, 384, 272 + 8 - 48) $game_system.bj_point = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(cards) contents.clear @list = [] for one_card in cards @list.push([one_card[0].to_i, one_card[1].to_i]) end buble_sort draw_blackjack end #-------------------------------------------------------------------------- # ● トランプのソート #-------------------------------------------------------------------------- def buble_sort @list.sort! {|a, b| a[1] <=> b[1] } end #-------------------------------------------------------------------------- # ● トランプの描画 #-------------------------------------------------------------------------- def draw_blackjack self.contents.clear for i in 0...@list.size draw_card($card[@list[i][0]][@list[i][1]], 15 + i * 30, 30) end get_total_point end #-------------------------------------------------------------------------- # ● グラフィックの描画 #-------------------------------------------------------------------------- def draw_card(card, x, y, opacity = MAX8BIT) @cw = card.width self.contents.stretch_blt(Rect.new(x, y, TR_WIDTH , TR_HEIGHT), Cache.picture(CARD_ROOT), card, opacity) end #-------------------------------------------------------------------------- # ● トランプの追加 #-------------------------------------------------------------------------- def card_add @list.push($rand_list[@list.size]) buble_sort draw_blackjack end #-------------------------------------------------------------------------- # ● ブラックジャック ポイント加算 #-------------------------------------------------------------------------- def get_total_point $game_system.bj_point = 0 @ace_cnt = 0 # ポイント加算 for one_card in @list if one_card[1].to_i == 13 @ace_cnt += 1 else if one_card[1].to_i <= 9 $game_system.bj_point += one_card[1].to_i + 1 else $game_system.bj_point += 10 end end end # A加算 if @ace_cnt > 0 for cnt in 0...@ace_cnt if $game_system.bj_point + $game_system.bj_setting[0] > chagne_black_jack $game_system.bj_point += 1 # Aが複数枚ある場合で合計結果が chagne_black_jack を # 超える場合はもとに戻す if $game_system.bj_point > chagne_black_jack $game_system.bj_point -= $game_system.bj_setting[0] $game_system.bj_point += 1 end else $game_system.bj_point += $game_system.bj_setting[0] end end end end #-------------------------------------------------------------------------- # ● ブラックジャック ポイント加算 #-------------------------------------------------------------------------- def blackjack_judg # end end class Scene_BlackJack < Scene_Minigame_Base include BM include BlackJack include MINI_GAME #-------------------------------------------------------------------------- # ● ブラックジャック初期化 #-------------------------------------------------------------------------- def blackjack_init(flg = true) @start_flg = false @set_flg = false @bet_gold = 0 @index = 0 $game_system.bj_point = 0 set_tranp @sp_card = [[0, 0], [1, 0]] change_make_rnd if flg == true @blackjack_window.refresh(@sp_card) end # 外部カスタマイズポイントの設定(未設定の場合) if $game_system.bj_setting == nil $game_system.bj_setting = [11, "ブラックジャック"] end end #-------------------------------------------------------------------------- # ● ブラックジャック 清算 #-------------------------------------------------------------------------- def get_gold if $game_system.bj_point <= chagne_black_jack if $game_system.bj_point >= near_black_jack get = Integer(@bet_gold * $game_system.bj_point / 20.0) elsif $game_system.bj_point > bad_black_jack get = Integer(@bet_gold * $game_system.bj_point / 40.0) else get = 0 end else get = 0 end if get > MAX_GOLD get = MAX_GOLD end if get > 0 get_lost_gold_coin(get, MG_GOLDCOIN_GET, BJ_BET_TYPE) text = GET_GOLD[BJ_BET_TYPE] + get.to_s @info_window.refresh(text) else get_lost_gold_coin(@bet_gold, MG_GOLDCOIN_LOST, BJ_BET_TYPE) text = LOST_GOLD[BJ_BET_TYPE] + @bet_gold.to_s @info_window.refresh(text) end text = "[" + $game_system.bj_point.to_s + "] point" if $game_system.bj_point > chagne_black_jack text += " バースト" se = LOOSE_ME elsif $game_system.bj_point == chagne_black_jack text += " " + $game_system.bj_setting[1] se = JACK_POT_ME1 else if $game_system.bj_point >= near_black_jack se = JACK_POT_ME3 elsif $game_system.bj_point > bad_black_jack se = JACK_POT_ME6 else se = LOOSE_ME end end @change_info_window.refresh(text) se.play end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_minigame_window(BJ_BET_TYPE) # インフォウィンドウ その2 @change_info_window = Window_Info_Space2_BJ.new # ブラックジャックメインウィンドウ @blackjack_window = Window_BlackJack.new @blackjack_window.activate set_keyhelp1 blackjack_init @bet_window.refresh(@bet_gold) @title_window.refresh($game_system.bj_setting[1]) end #-------------------------------------------------------------------------- # ● フレーム更新(基本) #-------------------------------------------------------------------------- def update_basic super if @start_flg == true if @set_flg == false @sp_card = [$rand_list[0], $rand_list[1]] @blackjack_window.refresh(@sp_card) @change_info_window.refresh @set_flg = true set_keyhelp2 end end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if @blackjack_window.active update_main end if @value_window.active update_value end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_main # B ボタンが押された場合 if Input.trigger?(:B) # キャンセル SE を演奏 Sound.play_cancel if @start_flg set_keyhelp1 @start_flg = false else if BJ_END_FLAG $game_system.bj_setting = nil end blackjack_init(false) return_scene end return end if !@start_flg # A ボタンが押された場合 if Input.trigger?(:A) # 決定 SE を演奏 Sound.play_ok # 念の為 @blackjack_window.refresh(@sp_card) value_window_activate @value_window.number = @bet_gold @blackjack_window.deactivate set_keyhelp3 return end end if @start_flg # X ボタンが押された場合 if Input.trigger?(:X) # 決定 SE を演奏 Sound.play_ok @blackjack_window.blackjack_judg get_gold blackjack_init(false) @bet_window.refresh(@bet_gold) @gold_window.refresh set_keyhelp1 return end end # C ボタンが押された場合 if Input.trigger?(:C) if @bet_gold == 0 # エラー SE を演奏 ERROR_SE.play text = "まずは" + MG_ERR_BET_ZERO[BJ_BET_TYPE] @info_window.refresh(text) else # 決定 SE を演奏 Sound.play_ok @info_window.refresh("") @change_info_window.refresh if !@start_flg @start_flg = true set_keyhelp2 elsif @start_flg @blackjack_window.card_add @change_info_window.refresh if $game_system.bj_point > chagne_black_jack @blackjack_window.blackjack_judg get_gold blackjack_init(false) @bet_window.refresh(@bet_gold) @gold_window.refresh set_keyhelp1 end end return end end end #-------------------------------------------------------------------------- # ● フレーム更新 (バリューウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_value #refresh # C ボタンが押された場合 if Input.trigger?(:C) if (MG_BET_TYPE_GOLD == BJ_BET_TYPE && @bet_gold > $game_party.gold) || (MG_BET_TYPE_COIN == BJ_BET_TYPE && @bet_gold > $game_variables[MG_COIN_INDEX]) # エラー SE を演奏 ERROR_SE.play @info_window.refresh(MG_ERR_BET_UPPER[BJ_BET_TYPE]) elsif @bet_gold == 0 # エラー SE を演奏 ERROR_SE.play @info_window.refresh(MG_ERR_BET_ZERO[BJ_BET_TYPE]) else # 決定 SE を演奏 Sound.play_ok @info_window.refresh("") value_window_deactivate @blackjack_window.activate @bet_window.refresh(@bet_gold) set_keyhelp1 return end end # B ボタンが押された場合 if Input.trigger?(:B) # キャンセル SE を演奏 Sound.play_cancel value_window_deactivate @blackjack_window.activate set_keyhelp1 return end @bet_gold = @value_window.number end #-------------------------------------------------------------------------- # ○ キーヘルプを設定 #-------------------------------------------------------------------------- def set_keyhelp1 @bottomkeyhelp_window.clear @bottomkeyhelp_window.set_bottom_help({"B"=>"キャンセル", "A"=>"コインベット", "C"=>"ゲーム開始"}) end #-------------------------------------------------------------------------- # ○ キーヘルプを設定 2 #-------------------------------------------------------------------------- def set_keyhelp2 @bottomkeyhelp_window.clear @bottomkeyhelp_window.set_bottom_help({"C" =>"カードをひく", "X" =>"勝負", "B" =>"キャンセル"}) end #-------------------------------------------------------------------------- # ○ キーヘルプを設定 3 #-------------------------------------------------------------------------- def set_keyhelp3 @bottomkeyhelp_window.clear @bottomkeyhelp_window.set_bottom_help({"矢印"=>"ベット", "C" =>"決定", "B" =>"キャンセル"}) end end |