#==============================================================================
# 銀行システム By 貪藻矢射妥←
#------------------------------------------------------------------------------
# まぁ、銀行です。
#
# $scene = Scene_Bank_Sys.new(銀行名変数, "支部名")
# にて銀行に移ります。(銀行名変数、支部名は省略可能です。)
#
# 預金してから一定時間たつと利子がついたりします。
# ※しかし、あくまで銀行を呼び出したときだけ利子が加算されるので、ゲームの
# 最中にどんだけ利子が増えたカナ〜とか確認できないという・・・
#
# ※ちなみに利子は振り込んでから基本で2時間で金利分加算されます。
# →カスタマイズポイントで変更可能
# (流石に1年で利子がいくら・・・とかだと・・・そんなにゲームプレイする人
# いないし・・・)
#
# ※ちなみに、預金開始時刻とは現在時刻を入手しているのではなく、預金を開始した
# 時のプレイタイムを入手しています。
#==============================================================================
# 変更履歴
#
# 2008:11:23
# ・ちょこまかと修正
#
# 2008:12:24
# ・預金/引き出しを行わないと利子が加算されないバグを修正
# ・1時間おきとかいっときながら7時間くらいたたないと利子が加算されないバグを修正
# ・利子の発生する時間を設定可能に
# ・一度利子が発生すると無限に利子が発生するバグを修正
# ・銀行の名前を変更可能に
#
# 2010:03:20
# ・微修正
#
# 2011:12:08
# ・VX風Vocab対応
# ・ミニゲーム用共通処理モジュールを使用している場合、入出力用桁数が7固定になる
# バグを修正
#
# 2012:03:03
# ・一部の共通モジュールのクラス化
#
# 2019:03:02
# ・オーディオファイルの設定を変更
#
# 2020:09:03
# ・Window VXA対応
#
# 2024:06:01
# ・スクリプト中で使用されてる文字列の定義化追加
$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Bank_Sys"] = true
module BANK
# 金利
BANK_RATE = 0.13
# 入出力用桁数
BANK_MAX_DIG = 8
# 銀行で預金できる最大金額
MAX_BANK_GOLD = 9999999999999
# 金利分増える時間
# 0にしちゃダメです。また『.0』は必須
RATE_TIME = 2.0
# 各種エラーメッセージ
BANK_ERR_ZERO = "金額を設定してください!!"
BANK_ERR_UPPER = "金額が%sを上回ってます!!"
BANK_ERR_HOLD = "所持限界金額を上回ります!!"
#--------------------------------------------------------------------------
# ● 利息計算用モジュール
#--------------------------------------------------------------------------
def gold_plus
if $game_system.root_time2 == nil
$game_system.root_time2 = $game_system.root_time
end
if $game_system.bank_gold != 0
gold_tmp = $game_system.bank_gold
base_time = 3600 * RATE_TIME
time = ($game_system.absolute_time - $game_system.root_time2) / base_time
if time > 1.0
$game_system.bank_gold += Integer(time * BANK_RATE * gold_tmp)
$game_system.bank_gold = [$game_system.bank_gold, MAX_BANK_GOLD].min
$game_system.root_time2 = $game_system.absolute_time
end
end
end
end
class Game_System
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :bank_gold # 預かり総金額
attr_accessor :absolute_time # ゲームの絶対時間
attr_accessor :root_time # 利子計算用時間
attr_accessor :root_time2 # 利子計算用時間の退避
end
class Window_Time_Bank_Sys < Window_Bet_Gold
#--------------------------------------------------------------------------
# ● 時間取得
#--------------------------------------------------------------------------
def get_sec
$game_system.absolute_time = Graphics.frame_count / Graphics.frame_rate
end
end
class Window_Bank_Main_Bank_Sys < Window_Base
include BANK
include TITLE_BM
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 64, 480 - 10, 380 - 128)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh(text)
clear
rectr1 = [48, 0, 160, 32]
rectr2 = [rectr1[0], 32, rectr1[2], rectr1[3]]
rectr3 = rectr2.clone
rectr3[0] += 172
rectr3[2] = 32
rectr4 = rectr1.clone
rectr4[1] += 96
rectr5 = rectr2.clone
rectr5[1] += 64
rectr6 = rectr5.clone
rectr6[0] += 172
rectr6[2] = 32
rectr7 = rectr4.clone
rectr7[1] += 64
rectr8 = rectr7.clone
rectr8[0] += 128
draw_shadow_text(rectr1, "只今のお預かり", system_color)
draw_shadow_text(rectr2, text.to_s, normal_color, 2)
draw_shadow_text(rectr3, Vocab::gold, system_color)
draw_shadow_text(rectr4, "金利(/" + RATE_TIME.to_s + "h)", system_color)
draw_shadow_text(rectr5, BANK_RATE.to_s, normal_color, 2)
draw_shadow_text(rectr6, Vocab::PERCENT_WORD, system_color)
if $game_system.bank_gold != 0
hour = $game_system.root_time / 60 / 60
min = $game_system.root_time / 60 % 60
sec = $game_system.root_time % 60
text = sprintf(Vocab::PLAY_TIME_NUM, hour, min, sec)
else
$game_system.root_time2 = nil
text = Vocab::HYHN_WORD
end
draw_shadow_text(rectr7, "預金開始時刻", system_color)
draw_shadow_text(rectr8, text, normal_color, 2)
end
def gold_in(bet)
if $game_system.bank_gold == 0
$game_system.root_time = $game_system.absolute_time
end
$game_system.bank_gold += bet
$game_party.lose_gold(bet)
end
def gold_out(bet)
$game_system.bank_gold -= bet
$game_party.gain_gold(bet)
end
end
class Window_Gold_Change_Bank_Sys < Window_Base
include TITLE_BM
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(200, 200 - 64, 240, 64)
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh(text)
clear
rectr = [4, 0 , 240 - 32 - 8, 32]
draw_shadow_text(rectr, text.to_s, system_color, 1)
end
end
class Scene_Bank_Sys
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :bank_main_name # 銀行の名前の変数
attr_accessor :bank_sub_name # 支部の名前
include BM
include BANK
include MINI_GAME
#--------------------------------------------------------------------------
# ○ キーヘルプを設定
#--------------------------------------------------------------------------
def set_keyhelp1
@bottomkeyhelp_window.clear
@bottomkeyhelp_window.set_bottom_help({"B"=>"キャンセル",
"A"=>"振り込み",
"X"=>"引き落とし"})
end
#--------------------------------------------------------------------------
# ○ キーヘルプを設定 2
#--------------------------------------------------------------------------
def set_keyhelp2
@bottomkeyhelp_window.clear
@bottomkeyhelp_window.set_bottom_help({"矢印"=>"金額操作",
"C" =>"決定",
"B" =>"キャンセル"})
end
#--------------------------------------------------------------------------
# ● 初期化
#--------------------------------------------------------------------------
def initialize(main_name=0, sub_name=nil)
@bank_main_name = main_name
@bank_sub_name = sub_name
@bottomkeyhelp_window = Window_BottomKeyHelp.new
set_keyhelp1
$game_system.windowskin_name = "MGS ウィンドウスキン6"
end
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
@change_gold = 0
bank_name = nil
if $game_system.bank_gold == nil
$game_system.bank_gold = 0
end
# ウィンドウを作成
@title_window = Window_Title_Root.new
@bank_main_window = Window_Bank_Main_Bank_Sys.new
@bank_main_window.refresh($game_system.bank_gold)
@info_window = Window_Info_Space.new
@info_window.y -= 64
@gold_info_window = Window_Info_Gold.new
@gold_window = Window_Gold.new
@gold_window.x = 480 - 10
@gold_window.y = 128
@time_window = Window_Time_Bank_Sys.new
@time_window.hide
@time_window.deactivate
@time_window.get_sec
@gold_change_info_window = Window_Gold_Change_Bank_Sys.new
@gold_change_info_window.z = 1000
@value_window2 = Window_Base.new(200, 200, 240, 64)
@value_window2.z = 1000
@value_in_window = Window_InputNumber.new(BANK_MAX_DIG)
@value_in_window.x = 200
@value_in_window.y = 200
@value_out_window = Window_InputNumber.new(BANK_MAX_DIG)
@value_out_window.x = 200
@value_out_window.y = 200
@gold_change_info_window.hide
@value_window2.hide
@value_in_window.hide
@value_in_window.deactivate
@value_out_window.hide
@value_out_window.deactivate
case @bank_main_name
when 0
bank_name = "ばんく おぶ わぁるど・"
when 1
bank_name = "ばんく おぶ のいえ・"
end
if bank_name == nil
bank_name = "\\r[盗怪,とうかい]銀行・"
end
if @bank_sub_name == nil
@bank_sub_name = "せるだぁる本店"
end
@title_window.refresh_ex(bank_name + @bank_sub_name)
# トランジション実行
Graphics.transition
# メインループ
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレーム更新
update
@time_window.get_sec
gold_plus
@bank_main_window.refresh($game_system.bank_gold)
# 画面が切り替わったらループを中断
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@title_window.dispose
@gold_window.dispose
@bank_main_window.dispose
@value_in_window.dispose
@value_out_window.dispose
@value_window2.dispose
@gold_change_info_window.dispose
@info_window.dispose
@gold_info_window.dispose
@time_window.dispose
@bottomkeyhelp_window.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
if @bank_main_window.active
update_main
return
end
if @value_in_window.active
@value_in_window.number = @change_gold
update_value_in
return
end
if @value_out_window.active
@value_out_window.number = @change_gold
update_value_out
return
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (メインウィンドウがアクティブの場合)
#--------------------------------------------------------------------------
def update_main
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
$game_system.windowskin_name = WINDOW_SKIN_ROOT
$scene = Scene_Map.new
return
end
# A ボタンが押された場合
if Input.trigger?(Input::A)
# 決定 SE を演奏
Sound.play_ok
gold_plus
@value_in_window.show
@value_in_window.activate
@value_window2.show
@bank_main_window.deactivate
@gold_change_info_window.show
@gold_change_info_window.refresh("振り込み")
set_keyhelp2
return
end
# X ボタンが押された場合
if Input.trigger?(Input::X)
# 決定 SE を演奏
Sound.play_ok
gold_plus
@value_out_window.show
@value_out_window.activate
@value_window2.show
@bank_main_window.deactivate
@gold_change_info_window.show
@gold_change_info_window.refresh("引き落とし")
set_keyhelp2
end
end
#--------------------------------------------------------------------------
# ● フレーム更新 (バリューウィンドウ(in)がアクティブの場合)
#--------------------------------------------------------------------------
def update_value_in
# C ボタンが押された場合
if Input.trigger?(Input::C)
if @change_gold > $game_party.gold
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
text = sprintf(BANK_ERR_UPPER, Vocab::HAVE_GOLD)
@info_window.refresh(text)
elsif @change_gold == 0
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
@info_window.refresh(BANK_ERR_ZERO)
else
# 決定 SE を演奏
Sound.play_ok
@info_window.refresh("")
@value_in_window.hide
@value_in_window.deactivate
@value_window2.hide
@gold_change_info_window.hide
@bank_main_window.activate
@bank_main_window.gold_in(@change_gold)
@gold_window.refresh
@change_gold = 0
set_keyhelp1
return
end
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
@value_in_window.hide
@value_in_window.deactivate
@value_window2.hide
@gold_change_info_window.hide
@bank_main_window.activate
@change_gold = 0
set_keyhelp1
return
end
# Window_InputNumberに処理を移す
@value_in_window.update
@change_gold = @value_in_window.number
end
#--------------------------------------------------------------------------
# ● フレーム更新 (バリューウィンドウ(out)がアクティブの場合)
#--------------------------------------------------------------------------
def update_value_out
# C ボタンが押された場合
if Input.trigger?(Input::C)
if @change_gold > $game_system.bank_gold
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
text = sprintf(BANK_ERR_UPPER, "口座総額")
@info_window.refresh(text)
elsif @change_gold + $game_party.gold > MAX_GOLD
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
@info_window.refresh(BANK_ERR_HOLD)
elsif @change_gold == 0
# エラー SE を演奏
$game_system.se_play(ERROR_SE)
@info_window.refresh(BANK_ERR_ZERO)
else
# 決定 SE を演奏
Sound.play_ok
@info_window.refresh("")
@value_out_window.hide
@value_out_window.deactivate
@value_window2.hide
@gold_change_info_window.hide
@bank_main_window.activate
@bank_main_window.gold_out(@change_gold)
@gold_window.refresh
@change_gold = 0
set_keyhelp1
return
end
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
Sound.play_cancel
@value_out_window.hide
@value_out_window.deactivate
@value_window2.hide
@gold_change_info_window.hide
@bank_main_window.activate
@change_gold = 0
set_keyhelp1
return
end
# Window_InputNumberに処理を移す
@value_out_window.update
@change_gold = @value_out_window.number
end
end
|