#==============================================================================
# ミニゲーム:ブラックジャック Plus By 貪藻矢射妥←
#------------------------------------------------------------------------------
# 普通のブラックジャックDeath。
# 一人遊びようなのでつまらないことこの上なかったりします。
#
# $scene = Scene_BlackJack.new
# にてゲームを開始できます。
#
# 外部カスタマイズポイントについて
# シーンをブラックジャック Plusに移す前に以下を設定することでオリジナルなルール
# でゲームを実行可能です
#
# EX)
# $game_system.bj_setting = [14, "ブラッククィーン"]
# →Aが取り得るもう一つの数値, ゲームの名称
#
# ※ちなみに、普通のカスタマイズポイントにしてないのは、数種類のブラックジャック
# を設定したい際にスクリプトをコピペして使用しなくてもいいようにとの配慮です。
#==============================================================================
# 変更履歴
# 2012:03:03
# ・トランプを1デッキのみ使用に変更(カードの重複の排除)
# ・一部の共通モジュールのクラス化
#
# 2013:06:01
# ・オリジナルルール様に外部カスタマイズポイントを追加
# ・オーディオファイルの設定を変更
#
# 2015:10:01
# VXA風Sound対応
# よく考えたら別にソートして表示する必要がないのでソート処理をオミット
#
# 2020:09:03
# ・Window VXA対応
#
# 2024:06:01
# ・スクリプト中で使用されてる文字列の定義化追加
#
# 2025:02:01
# ・ミニゲーム中で使用する文字定義の修正対応
module BlackJack
# トランプの図柄セット
CARD_ROOT="tr_set"
# トランプ一枚のサイズ
TR_WIDTH = 72
TR_HEIGHT = 100
#--------------------------------------------------------------------------
# トランプセッティング
#--------------------------------------------------------------------------
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?
p "エラー 初期設定がされていません"
exit
end
if $game_system.bj_setting.size != 2
p "エラー 初期設定パラメータ異常です"
exit
end
return change_bj = 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_BlackJack < Window_Base
include RUBY_SYS
include TITLE_BM
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 380 - 64, 480 - 10, 64)
refresh(nil)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh(text = nil)
clear
rectr = [4, 0, 300, 32]
if text != nil
draw_shadow_text(rectr, text)
else
if $game_system.bj_point != nil && $game_system.bj_point != 0
draw_shadow_text(rectr, "[" + $game_system.bj_point.to_s +
"] Hit or Stand ?")
end
end
end
end
class Window_BlackJack < Window_Base#Window_Selectable
include TITLE_BM
include BlackJack
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 64, 480 - 10, 380 - 128)
$game_system.bj_point = 0
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh(cards)
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
include S_PORKAR
#--------------------------------------------------------------------------
# ● トランプの描画
#--------------------------------------------------------------------------
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),
RPG::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
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
$game_party.gain_gold(get)
text = sprintf(MG_NML_GET_GOLD, get)
@info_window.refresh(text)
else
$game_party.lose_gold(@bet_gold)
text = sprintf(MG_NML_LOST_GOLD, @bet_gold)
@info_window.refresh(text)
end
text = "[" + $game_system.bj_point.to_s + "] point"
if $game_system.bj_point > chagne_black_jack
text += Vocab::BLANK_WORD + "バースト"
se = LOOSE_ME
elsif $game_system.bj_point == chagne_black_jack
text += Vocab::BLANK_WORD + $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)
if se == LOOSE_ME
$game_system.se_play(se)
else
$game_system.me_play(se)
end
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
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def initialize
@bottomkeyhelp_window = Window_BottomKeyHelp.new
set_keyhelp1
end
def main
# ウィンドウを作成
@title_window = Window_Title_Root.new
@blackjack_window = Window_BlackJack.new
@change_info_window = Window_Info_Space2_BlackJack.new
@info_window = Window_Info_Space.new
@gold_info_window = Window_Info_Gold.new
@gold_window = Window_Gold.new
@gold_window.x = 480 - 10
@gold_window.y = 128
@bet_info_window = Window_Info_Bet.new
@bet_window = Window_Bet_Gold.new
@value_window2 = Window_Base.new(200, 200, 240, 64)
@value_window2.z = 1000
@value_window = Window_InputNumber.new(MAX_DIG)
@value_window.x = 200
@value_window.y = 200
@value_window2.hide
@value_window.hide
@value_window.deactivate
blackjack_init
@title_window.refresh($game_system.bj_setting[1])
@bet_window.refresh(@bet_gold)
# トランジション実行
Graphics.transition
# メインループ
loop do
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
end
end
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレーム更新
update
# 画面が切り替わったらループを中断
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@title_window.dispose
@blackjack_window.dispose
@gold_window.dispose
@bet_window.dispose
@value_window.dispose
@value_window2.dispose
@info_window.dispose
@gold_info_window.dispose
@bet_info_window.dispose
@change_info_window.dispose
@bottomkeyhelp_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @blackjack_window.active
update_main
return
end
if @value_window.active
@value_window.number = @bet_gold
update_value
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_main
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
if @start_flg == true
set_keyhelp1
@start_flg = false
else
$game_system.windowskin_name = WINDOW_SKIN_ROOT
$scene = Scene_Map.new
end
if BJ_END_FLAG
$game_system.bj_setting = nil
end
return
end
if @start_flg == false
# A ボタンが押された場合
if Input.trigger?(Input::A)
# 決定 SE を演奏
Sound.play_ok
# 念の為
@blackjack_window.refresh(@sp_card)
@value_window.show
@value_window.activate
@value_window2.show
@blackjack_window.deactivate
set_keyhelp3
return
end
end
if @start_flg == true
# X ボタンが押された場合
if Input.trigger?(Input::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?(Input::C)
if @bet_gold == 0
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
text = "まずは" + MG_ERR_BET_ZERO
@info_window.refresh(text)
else
# 決定 SE を演奏
Sound.play_ok
@info_window.refresh("")
@change_info_window.refresh
if @start_flg == false
@start_flg = true
set_keyhelp2
elsif @start_flg == true
@blackjack_window.card_add
@change_info_window.refresh
end
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
return
end
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (バリューウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_value
#refresh
# C ボタンが押された場合
if Input.trigger?(Input::C)
if @bet_gold > $game_party.gold
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
@info_window.refresh(MG_ERR_BET_UPPER)
elsif @bet_gold == 0
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
@info_window.refresh(MG_ERR_BET_ZERO)
else
# 決定 SE を演奏
Sound.play_ok
@info_window.refresh("")
@value_window.hide
@value_window.deactivate
@value_window2.hide
@blackjack_window.activate
@bet_window.refresh(@bet_gold)
set_keyhelp1
return
end
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
@value_window.hide
@value_window.deactivate
@value_window2.hide
@blackjack_window.activate
set_keyhelp1
return
end
# Window_InputNumberに処理を移す
@value_window.update
@bet_gold = @value_window.number
end
end
|