銀行システム



ありそうでなかった銀行のスクリプト

$scene = Scene_Bank_Sys.new(銀行名変数, "支部名")
にてシーンが移動します。

※以下のモジュール/スクリプトが別途導入必要です。
 縁取り文字
 貪藻矢射妥←ダイヤモンドベースモジュール
 ミニゲーム用共通処理モジュール
 ボトムキーヘルプ
 Window VXA

変更点
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対応

#==============================================================================
# 銀行システム 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対応

$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, "%", 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("%02d : %02d : %02d", hour, min, sec)
    else
      $game_system.root_time2 = nil
      text = "-"
    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, "所持金")
        @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
こんな感じになります。

戻る