#============================================================================== # ■ RGSS3 ゲーム内時間管理 Ver2.02 by 星潟 #------------------------------------------------------------------------------ # ゲーム内にゲーム内時間を追加すると共に #「夜明け」・「朝」・「昼」・「夕方」・「夜」・「深夜」の概念を追加します。 # なお、時間経過はマップ上でのみ計算されます。 # イベント中は時間経過を行わせないようにする機能等もあります。 # # また、時間操作のイベントコマンド「スクリプト」で使用できるコマンドに #「time_control(a,b,c,d)」が追加されます。 # aには"+"か"-"か"="の何れかを入れてください。 # bには0から23までの数(時間)、 # cには0から59までの数(分)、 # dにも0から59までの数(秒)を入れてください。 # # aに"+"を入れた場合、現在時間から指定した時間分、時間が経過します。 # aに"-"を入れた場合、現在時間から指定した時間分、時間が巻戻ります。 # ("+"と"-"で午前0時を跨いだ場合、日数変数を指定しているとその変数も変化します) # aに"="を入れた場合、現在時間を無視してその時間ぴったりに変更されます。 # # 使用例 # time_control("+",1,30,25) # 現在時間+1時間30分25秒 # # time_control("-",1,30,25) # 現在時間+1時間30分25秒 # # time_control("=",19,43,22) # 現在時間を19時43分22秒にする #------------------------------------------------------------------------------ # Ver2.00 # # - 注釈を大量に加筆しました。 # - 時間帯が切り替わった際の色調変化速度が、時間帯別に設定可能になりました。 # - 名前に設定していた色調変化無効設定をマップのメモ欄に記入するように変更しました。 # - 選択肢ウィンドウ等に色調変化の影響を及ぼさないように変更しました。 # - イベントコマンドで数日分の時間変更を行った場合の処理を修正しました。 # - いくつかの処理を軽量化しました。 # # 本更新により、「ゲーム内時間管理拡張 戦闘背景」を導入している場合 # そちらもVer2.00以降に更新する必要があります。 # # Ver2.01 # # - メニュー画面の開閉で色調変化禁止マップでも # 色調変化してしまう不具合を修正しました。 # - ゲーム内時間管理のスクリプトを導入していない状態のセーブデータも # ロードすることができるようになりました。 # (この場合、ロード直後に時間関係のデータが設定されます) # # Ver2.02 # # - 開始時の時間帯が昼の場合にエラーになる不具合を修正。 #============================================================================== module TIME_SCHEDULE #フレーム更新毎の時間経過量 #100で1秒。6000で1分。360000で1時間。 PLUS = 100 #ゲーム開始時の1日の中の時間経過量(0〜8639999で指定) #経過量8640000到達で1日経過し、リセットされて0に戻る。 START = 3600000 #イベント実行中でも問答無用で時間を経過させるか? #true 経過させる false 経過させない INTPRT = false #時間経過による色調変更を行うか #true 行う false 行わない COLOR = true #時間変化を強制停止するスイッチ番号の指定(増加も減少も無効化) #0 強制停止機能の無効化 1〜 該当のスイッチがONの時、時間変化停止 SWITCH = 1000 #時間経過による色調補正を実行しないマップの #メモ欄に記入するキーワード。 MAP = "<時間経過色調無効>" #特定の変数に対し、常に時間帯の区分を代入し続けるか? #0 代入しない 1〜 指定した数字のIDの変数に代入し続ける。 #代入された数字の対応は以下の通り #0……夜明け #1……朝 #2……昼 #3……夕方 #4……夜 #5……深夜 VAR1 = 4 #特定の変数に対し、常に現在何時かを代入し続けるか? #(0で機能を無効化) VAR2 = 5 #特定の変数に対し、常に現在何分かを代入し続けるか? #(0で機能を無効化) VAR3 = 6 #特定の変数に対し、常に現在何秒かを代入し続けるか? #(0で機能を無効化) VAR4 = 7 #ゲーム中にプレイヤーに見える形で日付を表す変数を用意していて #なおかつ日数の経過で自動的に変数を変えたい場合、ここにその変数番号を記入 #(0で機能を無効化) VAR5 = 8 #以下、時間帯別の設定を行います。 #色調は[R, G, B, alpha, 色調変化速度]の5要素で成り立ちます。 #R, G, B, alphaは0〜255の値で設定して下さい。 #色調変化速度は、0より大きく1以下の値で設定して下さい。 #夜明け時間設定(デフォルト 午前4時〜) Dawn = 1440000 #夜明け色調[R, G, B, alpha, 色調変化速度] DaC = [0, 0, 50, 100, 0.1] #朝時間設定(デフォルト 午前5時30分〜) Morning = 1980000 #朝色調(R, G, B, alpha) MoC = [0, 0, 0, 15, 0.1] #昼時間設定(デフォルト 正午〜) Noon = 4320000 #昼色調(R, G, B, alpha) NoC = [0, 0, 0, 0, 0.1] #夕方時間設定(デフォルト 午後16時30分〜) Evening = 5940000 #夕方色調(R, G, B, alpha) EvC = [50, 0, 0, 150, 0.1] #夜時間設定(デフォルト 午後18時30分〜) Night = 6660000 #夜色調(R, G, B, alpha) NiC = [0, 0, 50, 200, 0.1] #深夜時間設定(デフォルト 深夜0時〜) MNight = 0 #深夜色調(R, G, B, alpha) MNC = [0, 0, 75, 225, 0.1] end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。所持金やアイテムなどの情報が含まれます。このクラ # スのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :time # 時間管理 attr_accessor :time_mode # 時間帯データ attr_accessor :day_red # R attr_accessor :day_green # G attr_accessor :day_blue # B attr_accessor :day_alpha # alpha attr_accessor :daytimeview_force_change# ビューポート強制更新フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_time initialize def initialize #本来の処理を実行。 initialize_time #時間のセットアップ time_setup end #-------------------------------------------------------------------------- # 時間のセットアップ #-------------------------------------------------------------------------- def time_setup #ゲーム開始時の時間を設定。 @time = TIME_SCHEDULE::START #時間を元に時間帯データと時間帯の色データを取得。 case @time #深夜 when TIME_SCHEDULE::MNight...TIME_SCHEDULE::Dawn @time_mode = 5 d = TIME_SCHEDULE::MNC #夜明け when TIME_SCHEDULE::Dawn...TIME_SCHEDULE::Morning @time_mode = 0 d = TIME_SCHEDULE::DaC #朝 when TIME_SCHEDULE::Morning...TIME_SCHEDULE::Noon @time_mode = 1 d = TIME_SCHEDULE::MoC #昼 when TIME_SCHEDULE::Noon...TIME_SCHEDULE::Evening @time_mode = 2 d = TIME_SCHEDULE::NoC #夕方 when TIME_SCHEDULE::Evening...TIME_SCHEDULE::Night @time_mode = 3 d = TIME_SCHEDULE::EvC #夜 else @time_mode = 4 d = TIME_SCHEDULE::NiC end #時間帯の色データを元に画面上の色を変更する。 @day_red = d[0] @day_green = d[1] @day_blue = d[2] @day_alpha = d[3] end end class Game_Map attr_accessor :ts_update_seal attr_accessor :ts_update_seal_first #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias setup_ts_update_seal_first setup def setup(map_id) #本来の処理を実行。 setup_ts_update_seal_first(map_id) #マップのメモ欄に色調変更禁止設定が記入されているか? data = @map.note.include?(TIME_SCHEDULE::MAP) #色調変更禁止設定の可否を元にフラグを設定。 @ts_update_seal = data @ts_update_seal_first = !data end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_time update def update(main = false) #本来の処理を実行。 update_time(main) #時間変化強制停止スイッチが有効かつONの場合は処理を中断する。 return if TIME_SCHEDULE::SWITCH > 0 && $game_switches[TIME_SCHEDULE::SWITCH] #イベント中は時間変化を行わない設定かつイベント中の場合は処理を中断する。 return if !TIME_SCHEDULE::INTPRT && @interpreter.running? #時間を更新する。 ts_update_base end #-------------------------------------------------------------------------- # 時間の更新 #-------------------------------------------------------------------------- def ts_update_base #時間を加算する。 $game_party.time += TIME_SCHEDULE::PLUS #一日の時間経過量を超過した場合は時間を0に戻す。 if $game_party.time >= 8640000 $game_variables[TIME_SCHEDULE::VAR5] += 1 if TIME_SCHEDULE::VAR5 > 0 $game_party.time = 0 end #時間帯データ等を更新する。 ts_update end #-------------------------------------------------------------------------- # 時間の更新(イベントコマンドでも使用する、時間帯データ等の変更部分) #-------------------------------------------------------------------------- def ts_update #時間データを元に時間帯データを更新する。 case $game_party.time #深夜 when TIME_SCHEDULE::MNight...TIME_SCHEDULE::Dawn $game_party.time_mode = 5 if $game_party.time_mode != 5 #夜明け when TIME_SCHEDULE::Dawn...TIME_SCHEDULE::Morning $game_party.time_mode = 0 if $game_party.time_mode != 0 #朝 when TIME_SCHEDULE::Morning...TIME_SCHEDULE::Noon $game_party.time_mode = 1 if $game_party.time_mode != 1 #昼 when TIME_SCHEDULE::Noon...TIME_SCHEDULE::Evening $game_party.time_mode = 2 if $game_party.time_mode != 2 #夕方 when TIME_SCHEDULE::Evening...TIME_SCHEDULE::Night $game_party.time_mode = 3 if $game_party.time_mode != 3 #夜 else $game_party.time_mode = 4 if $game_party.time_mode != 4 end #各変数に時間データを代入する。 $game_variables[TIME_SCHEDULE::VAR1] = $game_party.time_mode if TIME_SCHEDULE::VAR1 > 0 $game_variables[TIME_SCHEDULE::VAR2] = $game_party.time / 100 / 60 / 60 if TIME_SCHEDULE::VAR2 > 0 $game_variables[TIME_SCHEDULE::VAR3] = $game_party.time / 100 / 60 % 60 if TIME_SCHEDULE::VAR3 > 0 $game_variables[TIME_SCHEDULE::VAR4] = $game_party.time / 100 % 60 if TIME_SCHEDULE::VAR4 > 0 end end class Spriteset_Map #-------------------------------------------------------------------------- # ● ビューポートの作成 #-------------------------------------------------------------------------- alias create_viewports_daytime create_viewports def create_viewports #本来の処理を実行する。 create_viewports_daytime #時間経過で変化するビューポートを作成する。 create_daytime_viewports end #-------------------------------------------------------------------------- # 時間経過で変化するビューポートの作成 #-------------------------------------------------------------------------- def create_daytime_viewports #ビューポートを作成する。 @viewport_daytime = Viewport.new #Z座標を調整する。 @viewport_daytime.z = 75 #時間経過による画面の色調変化を行わない場合は処理を中断する。 return if !TIME_SCHEDULE::COLOR or $game_map.ts_update_seal #画面の色調変化を実行する。イベントの色調変更ではなく、独自の物を使用。 @viewport_daytime.color.set($game_party.day_red, $game_party.day_green, $game_party.day_blue, $game_party.day_alpha) end #-------------------------------------------------------------------------- # ● ビューポートの解放 #-------------------------------------------------------------------------- alias dispose_viewports_daytime dispose_viewports def dispose_viewports #本来の処理を実行する。 dispose_viewports_daytime #時間経過で変化するビューポートを解放する。 @viewport_daytime.dispose end #-------------------------------------------------------------------------- # ● 天候の更新 #-------------------------------------------------------------------------- alias update_weather_daytime update_weather def update_weather #本来の処理を実行する。 update_weather_daytime #時間経過で変化するビューポートを更新する。 update_daytime end #-------------------------------------------------------------------------- # 時間による画面の更新 #-------------------------------------------------------------------------- def update_daytime #時間経過による画面の色調変化を行わない場合は処理を中断する。 return if TIME_SCHEDULE::COLOR == false #時間経過による画面の色調変更が無効なマップの場合 if $game_map.ts_update_seal #このマップに移動後、最初に処理を行う場合 if !$game_map.ts_update_seal_first #処理済みフラグを立てる。 $game_map.ts_update_seal_first = true #色調変化を無効にする。 @viewport_daytime.color.set(0, 0, 0, 0) #色調変化の無効を反映させる。 $game_party.daytimeview_force_change = true end #処理を中断する。 return end #現在の時間帯次第で色調を変更する。 case $game_party.time_mode when 0;d = TIME_SCHEDULE::DaC#夜明け when 1;d = TIME_SCHEDULE::MoC#朝 when 2;d = TIME_SCHEDULE::NoC#昼 when 3;d = TIME_SCHEDULE::EvC#夕方 when 4;d = TIME_SCHEDULE::NiC#夜 when 5;d = TIME_SCHEDULE::MNC#深夜 end #色調データから各要素のデータを取得。 rdn = d[0] #R gdn = d[1] #G bdn = d[2] #B adn = d[3] #alpha spd = d[4] #色調変化速度 #強制変更が有効な場合 if $game_party.daytimeview_force_change #色調変更速度を無視して設定します。 @viewport_daytime.color.set(rdn, gdn, bdn, adn) #強制変更フラグを無効にします。 $game_party.daytimeview_force_change = false else #元々の各要素を取得します。 rdo = @viewport_daytime.color.red #R gdo = @viewport_daytime.color.green #G bdo = @viewport_daytime.color.blue #B ado = @viewport_daytime.color.alpha #alpha #それぞれ、新たな要素より大きいか小さいかで #要素を加減算するか、そのままにするかを決定します。 #加減算する値は色調変化速度の値です。 #判定用の配列を作成します。 array1 = [[rdo, rdo - rdn], [gdo, gdo - gdn], [bdo, bdo - bdn], [ado, ado - adn]] #結果を保存する為の空の配列を作成します。 array2 = [] #判定用配列のデータを元に結果を作成します。 array1.each {|data| #元々の要素の方が大きい場合は減算。 if data[1] > 0;array2.push(data[0] - spd) #元々の要素の方が小さい場合は加算。 elsif data[1] < 0;array2.push(data[0] + spd) #元々の要素と同じ場合はそのまま。 else;array2.push(data[0]) end } #色調変化のデータを保存する。 $game_party.day_red = array2[0] $game_party.day_green = array2[1] $game_party.day_blue = array2[2] $game_party.day_alpha = array2[3] #色調変化を行う。 @viewport_daytime.color.set(array2[0], array2[1], array2[2], array2[3]) end end end class Scene_Load < Scene_File #-------------------------------------------------------------------------- # ロード成功時の処理 #-------------------------------------------------------------------------- alias on_load_success_daytime on_load_success def on_load_success $game_party.time_setup if $game_party.time == nil on_load_success_daytime end end class Game_Interpreter #-------------------------------------------------------------------------- # 時間の変更 #-------------------------------------------------------------------------- def time_control(n1,n2,n3,n4) #時間変化強制停止スイッチが有効かつONの場合は処理を中断する。 return if TIME_SCHEDULE::SWITCH > 0 && $game_switches[TIME_SCHEDULE::SWITCH] == true #変更用の時間データを作成。 tcd = tcd(n2,n3,n4) case n1 #時間を進ませる。 when "+";data = tcd + $game_party.time #時間を巻き戻す。 when "-";data = $game_party.time - tcd #指定した時間にする。 when "=";data = tcd #不正なデータの場合。 else;return end loop do break if data >= 0 && data < 8640000 #1日の時間を上回る場合、1日の時間分の数を引く。 if data >= 8640000;data = data - 8640000 #経過日数が有効な場合は1日分足す。 $game_variables[TIME_SCHEDULE::VAR5] += 1 if TIME_SCHEDULE::VAR5 > 0 #1日の時間を下回る場合、1日の時間分の数を足す。 elsif 0 < data;data = data + 8640000 #経過日数が有効な場合は1日分引く。 $game_variables[TIME_SCHEDULE::VAR5] -= 1 if TIME_SCHEDULE::VAR5 > 0 end end #時間を設定する。 $game_party.time = data #時間帯データに合わせて画面を更新する。 $game_map.ts_update $game_party.daytimeview_force_change = true end #-------------------------------------------------------------------------- # 変更用の時間データ作成 #-------------------------------------------------------------------------- def tcd(nd1,nd2,nd3) #時間 data = nd1 * 60 * 60 * 100 #分 data += nd2 * 60 * 100 #秒 data += nd3 * 100 #データを返す。 data end end