自動昼夜変更



現在時刻を取得して、(多分)適切に昼夜を変更します。
また、オマケとしてプレイタイムに日付を追加します。

※このスクリプトを使用すると色調変更が無効となります。
 色調変更を有効にしたい場合は、スクリプトで
  $game_system.day_change_cancel = true
 を実行してください。
(再び無効にする場合はfalseにする。また、自動的に色調が変更されるので元に戻す操作は不要となります。)

※draw_text拡張 カスタムが必要です。

変更点
2010:07:17
・昼夜用トーンを増設
・昼夜の時間帯をカスタマイズポイントで設定可能に
 
2012:08:11
・トーンチェンジ用待ち時間を設定可能に
・季節によるトーンチェンジを実装

2012:10:01
・第五世代ポケモン風季節表示

#==============================================================================
# ■ 自動昼夜変更スクリプト β By 貪藻矢射妥←
# 
#  現在時刻を取得して、自動的に昼夜を変更します。
# 
#  また、$game_system.get_today で現在の時刻を取得することができます。
#  (Window_PlayTime などで使用してみるのもいいかも・・・)
#  
#  ※このスクリプトを使用すると色調変更が無効となります。
#   色調変更を有効にしたい場合は、スクリプトで
#    $game_system.day_change_cancel = true
#   を実行してください。
#   (再び無効にする場合はfalseにする。また、自動的に色調が変更されるので
#     元に戻す操作は不要となります。)
# 
#==============================================================================
# 更新っぽいもの
# 
# 2010:07:17
# ・昼夜用トーンを増設
# ・昼夜の時間帯をカスタマイズポイントで設定可能に
# 
# 2012:08:11
# ・トーンチェンジ用待ち時間を設定可能に
# ・季節によるトーンチェンジを実装
# 
# 2012:10:01
# ・第五世代ポケモン風季節表示

module DATE_C
  # 昼夜用トーン
  # 『昼間用(デフォルト)』は変更しないでください。
  DAYNIGHT_TONE = [Tone.new(   0,    0,    0,    0),  # 昼間用(デフォルト)
                   Tone.new(  17,  -68,  -68,    0),  # 夕方用
                   Tone.new( -68, -119,  -34,    0),  # 夜間用
                   Tone.new(-153, -187, -119,  -17),  # 深夜用
                   Tone.new( -34,  -34,    0,   51),  # 明方用
                   Tone.new(  17,   17,   34,    0)]  # 午前用
  # 昼夜用時間配列
  # 春用は季節を使用しない場合のデフォルトになります
  # 春用
  EVENING_SPL  = [11, 12, 13, 14]
  DUSK_SPL     = [15, 16, 17]
  NIGHT_SPL    = [18, 19, 20, 21]
  MIDNIGHT_SPL = [22, 23,  0,  1,  2,  3]
  DAWN_SPL     = [ 4,  5,  6,  7]
  MORNING_SPL  = [ 8,  9, 10]
  DAY_NIGHT_LISTs_SPL = [EVENING_SPL, DUSK_SPL, NIGHT_SPL, MIDNIGHT_SPL, 
                         DAWN_SPL, MORNING_SPL]
  # 夏用
  EVENING_SMR  = [ 7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
  DUSK_SMR     = [19]
  NIGHT_SMR    = [20, 21]
  MIDNIGHT_SMR = [22, 23,  0,  1]
  DAWN_SMR     = [ 2,  3]
  MORNING_SMR  = [ 4,  5,  6]
  DAY_NIGHT_LISTs_SMR = [EVENING_SMR, DUSK_SMR, NIGHT_SMR, MIDNIGHT_SMR, 
                         DAWN_SMR, MORNING_SMR]
  # 秋用
  EVENING_OTM  = [11, 12, 13, 14]
  DUSK_OTM     = [15, 16, 17]
  NIGHT_OTM    = [18, 19, 20, 21]
  MIDNIGHT_OTM = [22, 23,  0,  1,  2,  3]
  DAWN_OTM     = [ 4,  5,  6,  7]
  MORNING_OTM  = [ 8,  9, 10]
  DAY_NIGHT_LISTs_OTM = [EVENING_OTM, DUSK_OTM, NIGHT_OTM, MIDNIGHT_OTM, 
                         DAWN_OTM, MORNING_OTM]
  # 冬用
  EVENING_WIN  = [12, 13]
  DUSK_WIN     = [14, 15, 16, 17]
  NIGHT_WIN    = [18, 19, 20]
  MIDNIGHT_WIN = [21, 22, 23,  0,  1,  2,  3]
  DAWN_WIN     = [ 4,  5,  6,  7]
  MORNING_WIN  = [ 8,  9, 10, 11]
  DAY_NIGHT_LISTs_WIN = [EVENING_WIN, DUSK_WIN, NIGHT_WIN, MIDNIGHT_WIN, 
                         DAWN_WIN, MORNING_WIN]
  
  # 春夏秋冬
  DAY_NIGHT_LISTs_SEASON = [DAY_NIGHT_LISTs_SPL, DAY_NIGHT_LISTs_SMR, 
                            DAY_NIGHT_LISTs_OTM, DAY_NIGHT_LISTs_WIN]
  # 季節設定
  SPL = [ 4,  5,  6]
  SMR = [ 7,  8,  9]
  OTM = [10, 11, 12]
  WIN = [ 1,  2,  3]
  SEASON = [SPL, SMR, OTM, WIN]
  
  # 昼夜変更フラグ
  # trueの場合、マップIDがCHANGE_MAP_IDの場合のみ、昼夜変更を行います。
  # falseの場合はその逆です。
  CHANGE_FLG = true
  
  # 昼夜変更を行うマップID/行わないマップID
  CHANGE_MAP_ID = [25, 29, 30, 31, 61, 117, 129, 133, 134, 149, 315, 466, 530]
  
  # 曜日
  YOBI = ["\\c[2]日\\c[0]", "月", "火", "水", "木", "金", "\\c[1]土\\c[0]"]
  
  # 月の名前を変更するかどうかのフラグ
  MN_CHANGE_FLG = true
  
  # 月の名前リスト
  MN_LIST = [nil, "睦月", "如月", "弥生", "卯月", "皐月", "水無月", 
                  "文月", "葉月", "長月", "神無月", "霜月", "師走"]
  # 年を使用するか否かのフラグ
  USE_YEAR_FLG = false
  
  # トーンチェンジ用待ち時間
  CHG_TIME = 10
  
  # 季節を使用するかどうかのフラグ
  USE_SEASON_FLG = true
  
  # 季節と文字色
  SEASON_SETS = [["春", "spring", Color.new(0xff, 0x69, 0xb6, 255)], 
                 ["夏", "summer", Color.new(0x1E, 0x90, 0xFF, 255)], 
                 ["秋", "autumn", Color.new(0xFF, 0x8C, 0x00, 255)], 
                 ["冬", "winter", Color.new(0xF8, 0xF8, 0xFF, 255)]]
  
  # 文字色その2
  ENG_CLOR = Color.new(180, 180, 180, 255)
  
  #--------------------------------------------------------------------------
  # ● 表示用日付取得
  #--------------------------------------------------------------------------
  def get_today
    t = Time.now
    day_list = []
    
    if USE_YEAR_FLG
      year_text = t.year.to_s + "年 "
    else
      year_text = ""
    end
    
    if MN_CHANGE_FLG
      month_text = MN_LIST[t.month] + " "
    else
      month_text = t.month.to_s + "月 "
    end
    
    day_list.push(year_text + month_text + t.day.to_s + "夜")
    day_list.push(t.hour.to_s + "時" + t.min.to_s + "分" + t.sec.to_s + "秒")
    day_list.push(transfer(YOBI[t.wday]))
    
    return day_list
  end
  #--------------------------------------------------------------------------
  # ● 時間ゲット関数 (時間に応じてイベントを起こしたい場合に?)
  #--------------------------------------------------------------------------
  def get_h
    t = Time.now
    return t.hour
  end
  #--------------------------------------------------------------------------
  # ● 日付ゲット関数 (日付に応じてイベントを起こしたい場合に?)
  #--------------------------------------------------------------------------
  def get_day
    t = Time.now
    return t.day
  end
  #--------------------------------------------------------------------------
  # ● 月付ゲット関数 (月に応じてイベントを起こしたい場合に?)
  #--------------------------------------------------------------------------
  def get_month
    t = Time.now
    return t.month
  end
end

class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :fade_values_dia
end

class Game_System
  include DATE_C
  include RUBY_SYS
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :day_change_cancel
  #--------------------------------------------------------------------------
  # ● 昼夜自動変更処理
  #--------------------------------------------------------------------------
  def change_day
    # 一応初期化しておく
    if $game_system.day_change_cancel == nil
      $game_system.day_change_cancel = false
    end
    
    if USE_SEASON_FLG
      @M = get_month
    
      for i in 0...SEASON.size
        if SEASON[i].include?(@M)
          @chg_toons = DAY_NIGHT_LISTs_SEASON[i]
        end
      end
    else
      @chg_toons = DAY_NIGHT_LISTs_SEASON[0]
    end
    
    @H = get_h
    
    for i in 0...@chg_toons.size
      if @chg_toons[i].include?(@H)
        index = i
      end
    end
    
    # 昼夜変更
    if $game_system.day_change_cancel != true
      if CHANGE_FLG && CHANGE_MAP_ID.include?($game_map.map_id) || 
        !CHANGE_FLG && !CHANGE_MAP_ID.include?($game_map.map_id)
        $game_screen.start_tone_change(DAYNIGHT_TONE[index], CHG_TIME * 2)
      elsif CHANGE_FLG && !CHANGE_MAP_ID.include?($game_map.map_id) || 
        !CHANGE_FLG && CHANGE_MAP_ID.include?($game_map.map_id)
        $game_screen.start_tone_change(DAYNIGHT_TONE[0], CHG_TIME * 2)
      end
    end
  end
end


class Window_MenuPlayTime < Window_Base
  include DATE_C
  include DIAMOND
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  alias refresh_Dia_DayC refresh
  def refresh
    refresh_Dia_DayC
    
    days = $game_system.get_today
    
    d_size = self.contents.font.size
    self.contents.font.size = 12
    draw_shadow_text([0,  3], days[0] + " [" + days[2] + "]")
    #draw_shadow_text([0, 15], days[1])
    self.contents.font.size = d_size
    
  end
end

class Window_Siki < Window_Base
  include DATE_C
  include DIAMOND
  include BM
  include RUBY_SYS
  #--------------------------------------------------------------------------
  # ○ 季節ゲット
  #--------------------------------------------------------------------------
  def get_siki_str    
    @M = get_month
    
    for i in 0...SEASON.size
      if SEASON[i].include?(@M)
        return SEASON_SETS[i]
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ オブジェクト初期
  #--------------------------------------------------------------------------
  def initialize
    super(320 - 128 / 2, 240 - 128 / 2, 128, 128)
    set_text
  end
  #--------------------------------------------------------------------------
  # ○ テキスト設定
  #     text  : ウィンドウに表示する文字列
  #--------------------------------------------------------------------------
  def set_text
    
    # 設定
    text = get_siki_str
    
    # 描写
    self.contents = Bitmap.new(width - 32, height - 32)
    d_size = self.contents.font.size
    self.contents.font.size = 48
    draw_shadow_text([0,  0, 128 - 32, 128 - 32], text[0], text[2], 1)
    self.contents.font.size = 20
    draw_shadow_text([0, 32, 128 - 32, 128 - 32], text[1], ENG_CLOR, 1)
    self.contents.font.size = d_size
    
    self.opacity = 0
    self.back_opacity = 0
    self.visible   = false
    
    # 位置の更新
    fade_relocation
  end
  #--------------------------------------------------------------------------
  # ○ フェード時間による更新
  #--------------------------------------------------------------------------
  def fade_relocation
    # フェード時間の設定
    if $game_temp.fade_values_dia.nil?
      $game_temp.fade_values_dia = 120
    end
    #
    # フェードイン
    #
    d = $game_temp.fade_values_dia - 80
    if d > 0
      self.visible = true
      amount = ((16 - d) * 255.0 / 16).ceil
      self.contents_opacity = [amount*5/8, 255].min
      $game_temp.fade_values_dia -= 1
    #
    # 通常表示
    #
    elsif $game_temp.fade_values_dia > 20
      self.visible = true
      self.contents_opacity = 255
      
      $game_temp.fade_values_dia -= 1 if $game_temp.fade_values_dia > 0
    #
    # フェードアウト
    #
    elsif $game_temp.fade_values_dia > 0
      self.visible = true
      amount = ($game_temp.fade_values_dia * 255.0 / 24).ceil
      self.contents_opacity = amount * 5/8
      $game_temp.fade_values_dia -= 1
      
      self.visible = false if $game_temp.fade_values_dia == 0
    end
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新 [オーバーライド]
  #--------------------------------------------------------------------------
  def update
    fade_relocation
    super
  end
end
class Scene_Map
  include DATE_C
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias main_Dia_DayC main
  def main
    if USE_SEASON_FLG
      # 四季ウィンドウを作成
      @siki_window = Window_Siki.new
      @siki_window.set_text
    end
    
    # 戻す
    main_Dia_DayC
    
    if USE_SEASON_FLG
      # 四季ウィンドウを解放
      @siki_window.dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_Dia_DayC update
  def update
    $game_system.change_day
    
    if USE_SEASON_FLG
      # 四季ウィンドウの更新
      @siki_window.update
    end
    
    update_Dia_DayC
  end
end
〜カスタマイズポイント〜
CHANGE_FLG 昼夜変更フラグ
trueの場合、マップIDがCHANGE_MAP_IDの場合のみ、昼夜変更を行います。
falseの場合はそのです。
CHANGE_MAP_ID CHANGE_FLGがtrueの場合:昼夜変更を行うマップID
CHANGE_FLGがfalseの場合:昼夜変更を行わないマップID
を記述
MN_CHANGE_FLG 月の名前を変更するかどうかのフラグ
月の名前を変更する場合はその下の月の名前リストを必ず記載してください。
USE_YEAR_FLG プレイタイムにて年まで表示するか否かのフラグ
USE_SIKI_FLG 季節ごとの日照時間変更を使用するかどうかのフラグ

戻る