じ☆ve冰风 发表于 2026-8-1 18:07:49

Yet Another Time System

Yet Another Time System
by Rinobi​

Yet another time system script! There's many to choose from already, and here's another one. It's super easy to use with lots of customization options to fiddle around with.

Spoiler: CHANGE LOG

[*] 1.00 Public Release
[*] 1.01 Map Transition Update
Spoiler: FEATURES

[*]Crappy UI... it can be disabled.
[*]Customizable time scale.
[*]Customizable calendar settings.
[*]Customizable seasons and weather effects.
[*]Lightning flashes and sounds added to storms.
[*]Day/Night tinting with automatic tint distribution for smooth transitions
[*]Variable settings and script calls to integrate system into game play.
[*]Plug & Play. This script functions without any additional hassle
Spoiler: SCREENSHOTS
https://forums.rpgmakerweb.com/attachments/storm-png.59535/




Spoiler: SCRIPT                Code:       
module RINOBI module TimeSystem # DO NOT MODIFY
#==============================================================================
#                        YET ANOTHER TIME SYSTEM
# -----------------------------------------------------------------------------
# This script adds a totally customizable time and weather system complete with
# day/night cycles, seasonal weather patterns and tilesets, and much more.
# The developer now has complete control over how time flows in their project.
#==============================================================================
# # VERSION HISTORY
# -----------------------------------------------------------------------------
# @ 0.60 Finished alpha version.
# @ 0.61 Added lightning & thunder effects.
# @ 0.62 Time process method reliability update.
# @ 0.63 Added time freeze method.
# @ 0.64 Updated set_weather method.
# @ 0.69 Added Time Display UI
# @ 0.70 Updated time_process method.
# @ 1.00 Public release.
# @ 1.01 Map Transition Update
#==============================================================================
# ** Settings Module
#------------------------------------------------------------------------------
# Adjust the below settings to your liking.
#------------------------------------------------------------------------------

#============================================================================
# * Time Variables
# ---------------------------------------------------------------------------
# Set variable IDs to keep track of time. Modifying the chosen variables
# will not influence time passage. Please use script calls for that.
# Set to false to disable.
#============================================================================
Var_Season    = false   # Season number in order listed in Settings Module.
Var_Year      = false   # The Current Year.
Var_Month   = false   # Month number in order listed in Settings Module.
Var_Day       = false   # Day number within month.
Var_Hour      = false   # The current hour.
Var_Minute    = false   # The current minute.
Var_Second    = false   # The current second.
Var_Season_N= false   # Current season name.
Var_Month_N   = false   # Current month name.
Var_Day_N   = false   # Current day name.

#============================================================================
# * Time Display Window (Work In Progress)
# ---------------------------------------------------------------------------
# A window displaying the current date and season.
#============================================================================
Display_Toggle = true    # Set to false to disable display window.
Display_Key = :L         # See gamepad buttons for reference.
Toggle_Key = :R          # See gamepad buttons for reference.
Window_X = 0             # The X position of the display window.
Window_Y = 0             # The Y position of the display window.
Toggle_Variable = 99   # Variable used to toggle between window options.
Display_Switch = 100   # Switch used to troggle time display.
Date_Display_Width = 276 # Width of date only display window. (does nothing)
Time_Display_Width = 186 # Width of time only display window. (does nothing)

#============================================================================
# * Start Date
# ---------------------------------------------------------------------------
# The initial date upon beginning a new game.
#============================================================================
# Year = Any integer you desire
# Month = See 'Months' settings below.
# Day = The day within the current month. See 'Months' settings below.
# Hour = A number within 'Day_Length' setting below.
# Minute = A number within 'Hour_Length' setting below.
# Second = A number within 'Minute_Length' setting below.
# ---------------------------------------------------------------------------
Start_Date = {
    :Year => 2015, :Month=> 12, :Day    => 23,
    :Hour =>   19, :Minute => 30, :Second =>0,
} # StartDate

Start_Weather = 0 # Default weather upon starting a new game.

#============================================================================
# * Timescale
# ---------------------------------------------------------------------------
# The rate at which time flows.
#============================================================================
Time_Scale    = 60 # A speed multiplier for time flow.

Second_Length = 60 # Number of frames in a second.
Minute_Length = 60 # Number of seconds in a minute.
Hour_Length   = 60 # Number of minutes in an hour.
Day_Length    = 23 # Number of hours in a day.

#============================================================================
# * Battle Time
# ---------------------------------------------------------------------------
# Set the passage of time per turn in battle.
#============================================================================
#
# ---------------------------------------------------------------------------
Battle_Time = true # Set to false to disable time passage during battle.
Time_Per_Turn = ['minute', 10] # year, month, day, hour, minute, second.

#============================================================================
# * Indoor Settings
# ---------------------------------------------------------------------------
# For maps which should be unaffected or affected differently by
# Day/Night screen tints and weather patterens
#============================================================================
# Indoor_Maps = An array of map IDs to be considered indoors.
# Indoor_Tiles = An array of tileset IDs to be considered indoors.
# Indoor_Tint = The screen tone used for indoor maps
# ---------------------------------------------------------------------------
Indoor_Maps= # ID, ID, ID, ID
Indoor_Tiles = # ID, ID, ID, ID
Indoor_Tint= # Red, Green, Blue, Grey

#============================================================================
# * Day/Night Cycle
# ---------------------------------------------------------------------------
# Adjust the outdoor tint levels based on a range of hours below. Each hour
# of the day will be filled in automatically. See example below.
#-
# Module Setting Example
# 1 => {:Tint => [ -75,-75, 0,50], :Range => (5..10)},
# 2 => {:Tint => [   0,    0, 0,   0], :Range => ( 10..10)},
#-
# Hours filled in for smooth transitions automatically
# Hour 5[ -75,-75, 0,50]
# Hour 6[ -60,-60, 0,40]
# Hour 7[ -45,-45, 0,30]
# Hour 8[ -30,-30, 0,20]
# Hour 9[ -15,-15, 0,10]
# Hour 10 [   0,    0, 0,   0]
#============================================================================
Tint_Interval = 300 # Number of frames to fade from one tint to the next.

Day_Cycle = { # Add or remove lines as you see fit.
    #         (Start_Hour..End_Hour)
    1 => {:Tint => [ -75,-75, 0,50], :Range => (5..9)}, # Dawn
    2 => {:Tint => [   0,    0, 0,   0], :Range => ( 9..11)}, # Morning
    3 => {:Tint => , :Range => (11..16)}, # Noon
    4 => {:Tint => [   0,    0, 0,   0], :Range => (16..20)}, # Afternoon
    5 => {:Tint => [ -50,-50, 0,25], :Range => (20..22)}, # Evening
    6 => {:Tint => [ -75, -100, 0,75], :Range => ( 22..0)}, # Night
    7 => {:Tint => [-125, -125, 0, 125], :Range => (0..5)}, # Midnight
} # <=== DO NOT REMOVE

#============================================================================
# * Week Days
# ---------------------------------------------------------------------------
# Adjust the length of one week by adding or removing week days.
# Set the names of each week day and the order in which they appear.
#============================================================================
Days = {
    1 => 'Sunday',
    2 => 'Monday',
    3 => 'Tuesday',
    4 => 'Wednesday',
    5 => 'Thursday',
    6 => 'Friday',
    7 => 'Saturday',
} # Days

#============================================================================
# * Month Settings
# ---------------------------------------------------------------------------
# Adjust the number of months in a year by adding or removing keys. Set the
# names of each month and the order in which they appear. Set the number of
# days each month has and the season each month appears within.
#============================================================================
# Name = A string containing the name of this month.
# Days = The number of days within this month.
# Season = Which season this month is a part of.
# ---------------------------------------------------------------------------
Months = {
    1 =>{:Name => 'January', :Days => 31, :Season => 4},
    2 =>{:Name => 'February' , :Days => 28, :Season => 4},
    3 =>{:Name => 'March'    , :Days => 31, :Season => 1},
    4 =>{:Name => 'April'    , :Days => 30, :Season => 1},
    5 =>{:Name => 'May'      , :Days => 31, :Season => 1},
    6 =>{:Name => 'June'   , :Days => 30, :Season => 2},
    7 =>{:Name => 'July'   , :Days => 31, :Season => 2},
    8 =>{:Name => 'August'   , :Days => 31, :Season => 2},
    9 =>{:Name => 'September', :Days => 30, :Season => 3},
    10 => {:Name => 'October', :Days => 31, :Season => 3},
    11 => {:Name => 'November' , :Days => 30, :Season => 3},
    12 => {:Name => 'December' , :Days => 31, :Season => 4},
} # Months

#============================================================================
# * Season Settings
# ---------------------------------------------------------------------------
# Adjust the number of seasons avaliable by adding or removing keys. Set the
# names of each season; the order in which they appear within this hash is
# unimportant. Set the tileset this season uses and the likelyhood of
# pre-specified weather patterns to occur.
#============================================================================
# Automatically adjust tilesets during seasons?
# ---------------------------------------------------------------------------
Use_Tilesets = false # Set to true or false.

# ---------------------------------------------------------------------------
# IDs of seasonal tilesets. Add all tilesets elgible for change
# during the seasons here.
# ---------------------------------------------------------------------------
Season_Tilesets =

# ---------------------------------------------------------------------------
# Name = A string containing the name of this season.
# Tileset = The tileset used while this season is active.
# Weathers = The type and likelyhood that this weather will affect the
# outdoor maps. See 'Weather Settings' below.
# ---------------------------------------------------------------------------
Seasons = {
    1 => {
    :Name => 'Spring',
    :Tileset =>9,
    :Weathers => {
      0 => {:Weight => 4}, # Clear       4/17
      1 => {:Weight => 5}, # Light Rain5/17
      2 => {:Weight => 5}, # Normal Rain 5/17
      3 => {:Weight => 2}, # Heavy Rain2/17
      4 => {:Weight => 1}, # Storm       1/17
    }}, # Spring
   
    2 => {
    :Name => 'Summer',
    :Tileset =>5,
    :Weathers => {
      0 => {:Weight => 5}, # Clear       5/15
      1 => {:Weight => 1}, # Light Rain1/15
      2 => {:Weight => 2}, # Normal Rain 2/15
      3 => {:Weight => 3}, # Heavy Rain3/15
      4 => {:Weight => 4}, # Storm       4/15
    }}, # Summer
   
    3 => {
    :Name => 'Autumn',
    :Tileset =>8,
    :Weathers => {
      0 => {:Weight => 5}, # Clear       5/12
      1 => {:Weight => 1}, # Light Rain1/12
      2 => {:Weight => 1}, # Normal Rain 1/12
      5 => {:Weight => 1}, # Snow      1/12
      6 => {:Weight => 4}, # Windy       4/12
    }}, # Autumn
   
    4 => {
    :Name => 'Winter',
    :Tileset => 10,
    :Weathers => {
      0 => {:Weight => 1}, # Clear       1/10
      1 => {:Weight => 3}, # Light Rain3/10
      2 => {:Weight => 1}, # Normal Rain 1/10
      5 => {:Weight => 5}, # Snow      5/10
    }}, # Winter
} # Seasons

#============================================================================
# * Weather Settings
# ---------------------------------------------------------------------------
# Below is the selection of weathers accessible by script call or seasonal
# weather patterns. Ensure that this hash includes any weathers listed above.
#============================================================================
BGS_Indoors    = 60.00   # Percentage to reduce weather sounds while indoors.

Daily_Weather= 50.00   # Chance per day that weather may change.
Hourly_Weather = 10.00   # Chance per hour that weather may change.
Minute_Weather =1.00   # Chance per minute that weather may change.
Second_Weather =0.00   # Chance per second that weather may change.

# ---------------------------------------------------------------------------
# type = :none, :rain, :storm, :snow
# power = 1 - 9, or 0 if type is set to :none
# duration = frames to fade in/out
# ---------------------------------------------------------------------------
Weathers = { # Clear, Light Rain, Rain, Heavy Rain, Storm, Snow, Windy
    0 => {:Type => :none,:Power => 0, :Duration =>   0,
          :Sound => ['',      0,   0],
          }, # Clear Weather / Indoors
    1 => {:Type => :rain,:Power => 4, :Duration => 600,
          :Sound => ['Rain',   56, 100],
          }, # Light Rain
    2 => {:Type => :rain,:Power => 9, :Duration => 600,
          :Sound => ['Rain',100, 100],
          }, # Moderate Rain
    3 => {:Type => :storm, :Power => 7, :Duration => 600,
          :Sound => ['Storm',70, 100],
          }, # Heavy Rain / Storm
    4 => {:Type => :storm, :Power => 9, :Duration => 600,
          :Sound => ['Storm', 100, 100],
          }, # Thunder Storm
    5 => {:Type => :snow,:Power => 9, :Duration => 600,
          :Sound => ['',      0,   0],
          }, # Heavy Snow
    6 => {:Type => :none,:Power => 0, :Duration => 600,
          :Sound => ['Wind',100, 100],
          }, # Very Windy
} # Weather

# ---------------------------------------------------------------------------
# How often lightning strikes occur during storms
# Lower values increase the frequency of lightning strikes.
# ---------------------------------------------------------------------------
Frequency = 10

# ---------------------------------------------------------------------------
# The color of lightning flashes.
#
# ---------------------------------------------------------------------------
Flash_Lightning =

# ---------------------------------------------------------------------------
# The sound effects played when lightning strikes. The sound is chosen at
# at random from the list below. Have as many or as few as you like.
# File   = Sound Effect file name as string.
# Volume = 0 - 100
# Pitch= 0 - 200, 100 is normal.
# ---------------------------------------------------------------------------
SE_Thunder = {
    1 => {:File => 'Thunder1', :Volume => 100, :Pitch =>55},
    2 => {:File => 'Thunder5', :Volume => 100, :Pitch =>35},
    3 => {:File => 'Thunder7', :Volume => 100, :Pitch =>55},
    4 => {:File => 'Thunder9', :Volume => 100, :Pitch =>55},
} # SE_Thunder

#==============================================================================
# # SCRIPT CALLS
# -----------------------------------------------------------------------------
#

#-----------------------------------------------
# >> Basic Information
#-----------------------------------------------
# year       - Get the current year.
# month      - Get the current month. (integer)
# day      - Get the current day. (integer)
# hour       - Get the current hour.
# minute   - Get the current minute.
# second   - Get the current second.
# season   - Get the current season. (integer)
# weather    - Get the current weather.
# time_scale - Get the current time scale value.

#-----------------------------------------------
# >> set_weather(value)
# >> set_weather(value, fast)
#-----------------------------------------------
# @ sets the weather to a value within the module settings below.
# @ setting fast to true changes the weather instantly.

#-----------------------------------------------
# >> set_time(key, value)
#-----------------------------------------------
# @ Sets the current time to a chosen value.
# @ Where key is 'year', 'month', 'day', 'hour', 'minute', 'second'
# @ EX: set_time('month', 11)

#-----------------------------------------------
# >> add_time(key, value)
#-----------------------------------------------
# @ Adds to the current time.
# @ Where key is 'year', 'month', 'day', 'hour', 'minute', 'second'
# @ EX: add_time('hour', 8)

#-----------------------------------------------
# >> get_day_name
# >> get_day_name(day)
# >> get_day_name(day, month)
#-----------------------------------------------
# @ Returns the current or chosen day's name set in module settings below.

#-----------------------------------------------
# >> get_month_name
# >> get_month_name(month_number)
#-----------------------------------------------
# @ Returns the current or chosen month's name set in module settings below.

#-----------------------------------------------
# >> set_time_scale(value)
#-----------------------------------------------
# @ Allows the time scale to be modified in-game. See module settings below.

#-----------------------------------------------
# >> time_freeze
#-----------------------------------------------
# @ Toggles time progression.

#-----------------------------------------------
# >> set_due_date(name, date)
#-----------------------------------------------
# @ Sets a date for later reference.
# @ Where name is any string or symbol and date is an array.
# @ date
# @ EX: set_due_date('rental', year, month, day + 3, 8)

#-----------------------------------------------
# >> add_due_date(name, key, date)
#-----------------------------------------------
# @ Instead of setting a date manually, this method adds to the current time.
# @ name is any string EX: 'dinner party'.
# @ key is :year, :month, :day, :hour, :minute, or :second.
# @ date is an array of numbers.
#
# @ EX: add_due_date('paycheck!', :day, 3, 12)
#   Due date in 3 days and 12 hours.

#-----------------------------------------------
# >> get_due_date(name)
#-----------------------------------------------
# @ Simply returns a date array by name.

#-----------------------------------------------
# >> due_date?(name)
#-----------------------------------------------
# @ Returns true if date has arrived or passed

#-----------------------------------------------
# >> indoors?
#-----------------------------------------------
# @ returns true if the player is inside based on module settings below.

#==============================================================================
# # COMPATIBILITY
# -----------------------------------------------------------------------------
#
# Alias Methods:
#-
#@ change_weather       in Game_Screen
#@ initialize         in Game_Map
#@ setup                in Game_Map
#@ update_events      in Game_Map
#@ update_sprite_stormin Spriteset_Weather
#@ create_spriteset   in Scene_Map
#@ update               in Scene_Map
#==============================================================================
# # TERMS OF USE
#------------------------------------------------------------------------------
# 1. Preserve this header.
# 2. Do not re-upload this script.
# 3. Do not claim this script as your own work.
# 4. Do not release modified versions of this script.
# 5. Do not use this script within commercial projects.
#==============================================================================
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # END OF SETTINGS # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#------------------------------------------------------------------------------
#         Editing beyond this point may produce unintended results
#==============================================================================
end end # No Touchie!
#==============================================================================
# ** End of Settings
#------------------------------------------------------------------------------
$imported = {} if $imported.nil?
$imported[:RIN_RUDNWS] = true

#==============================================================================
# ** Game_Screen
#------------------------------------------------------------------------------
#This class handles screen maintenance data, such as changes in color tone,
# flashes, etc. It's used within the Game_Map and Game_Troop classes.
#==============================================================================
class Game_Screen
#--------------------------------------------------------------------------
# * Alias Method: change_weather
#--------------------------------------------------------------------------
alias :rinchange_weather :change_weather
def change_weather(type, power, duration)
    rinchange_weather(type, power, duration)
    if $game_map.indoors?
      dampen = RINOBI::TimeSystem::BGS_Indoors / 100.0
      file = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      volume = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      pitch = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      volume *= dampen ; RPG::BGS.new(file, volume, pitch).play
    else
      file = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      volume = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      pitch = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound]
      RPG::BGS.new(file, volume, pitch).play
    end
end # change_weather
end # Game_Screen

#==============================================================================
# ** Game_Battler
#------------------------------------------------------------------------------
#A battler class with methods for sprites and actions added. This class
# is used as a super class of the Game_Actor class and Game_Enemy class.
#==============================================================================
class Game_Battler < Game_BattlerBase
alias :rinbattle_end :on_battle_end
def on_battle_end
    return rinbattle_end unless RINOBI::TimeSystem::Battle_Time
    btime = RINOBI::TimeSystem::Time_Per_Turn
    $game_map.add_time(btime, $game_troop.turn_count * btime)
    rinbattle_end
end # on_battle_end
end # Game_Battler

#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#This class handles maps. It includes scrolling and passage determination
# functions. The instance of this class is referenced by $game_map.
#==============================================================================
class Game_Map

#--------------------------------------------------------------------------
# * Attributes: year, month, day, hour, minute, calendar
#--------------------------------------------------------------------------
attr_accessor :season
attr_accessor :year
attr_accessor :month
attr_accessor :day
attr_accessor :hour
attr_accessor :minute
attr_accessor :second
attr_accessor :weather
attr_accessor :calendar
attr_accessor :dates_hash
attr_accessor :time_scale

#--------------------------------------------------------------------------
# * Alias Methods: initialize, update_events, setup
#--------------------------------------------------------------------------
alias :time_init :initialize
alias :time_setup :setup
alias :time_update_events :update_events

#--------------------------------------------------------------------------
# * Alias Method: initialize
#--------------------------------------------------------------------------
def initialize
    time_init ; @frame = 0
    @time_scale = RINOBI::TimeSystem::Time_Scale
    start_date = RINOBI::TimeSystem::Start_Date
    months   = RINOBI::TimeSystem::Months
    days       = RINOBI::TimeSystem::Days
    @weather   = RINOBI::TimeSystem::Start_Weather
    @year   = start_date[:Year]
    @month= start_date[:Month]
    @day    = start_date[:Day]
    @hour   = start_date[:Hour]
    @minute = start_date[:Minute]
    @second = start_date[:Second]
    @season = months[@month][:Season]
    @week   = days.count
    @time_freeze = false
    @dates_hash = Hash.new
    generate_calendar
end # initialize

#--------------------------------------------------------------------------
# * Alias Method: setup
#--------------------------------------------------------------------------
def setup(map_id)
    time_setup(map_id) ; light_cycle
    set_weather(@weather, true)
    return if indoors?
    return unless RINOBI::TimeSystem::Use_Tilesets
    return unless RINOBI::TimeSystem::Season_Tilesets.include?(@tileset_id)
    change_tileset(RINOBI::TimeSystem::Seasons[:Tileset])
end # setup

#--------------------------------------------------------------------------
# * New Method: Generate Calendar
#--------------------------------------------------------------------------
def generate_calendar
    days = RINOBI::TimeSystem::Days
    @calendar = Hash.new ; m_start = 0, m_end = 0 ; month = 1 ; count = 0
    while month <= RINOBI::TimeSystem::Months.count
      cmonth = month
      while cmonth > 0
      m_end += RINOBI::TimeSystem::Months[:Days]
      cmonth -= 1
      end # cmonth > 0
      m_start = (1 + m_end) - RINOBI::TimeSystem::Months[:Days]
      @calendar = Hash[(m_start..m_end).map {|n|]}]
      @calendar.count.times do |s|
      count = 0 unless count < @week
      count += 1 ; @calendar = RINOBI::TimeSystem::Days
      end # @calendarcount.times do |s|
      month += 1 ; m_end = 0
    end # month <= RINOBI::TimeSystem::Months.count
end

#--------------------------------------------------------------------------
# * New Methods: year, month, day, hour, minute, calendar
#--------------------------------------------------------------------------
define_method(:year)   {@year}
define_method(:month){@month}
define_method(:day)    {@day}
define_method(:hour)   {@hour}
define_method(:minute) {@minute}
define_method(:second) {@second}
define_method(:weather) {@weather}
define_method(:calendar) {@calendar}
define_method(:total_days) {@total_days}
define_method(:time_scale) {@time_scale}
define_method(:season) {@season = RINOBI::TimeSystem::Months[:Season]}

#--------------------------------------------------------------------------
# * New Method: distribute
#--------------------------------------------------------------------------
def distribute(begin_value, end_value, array_size, return_ints = false)
    diff = 1.0 * (end_value - begin_value)
    n = .max
    (0..(array_size-1)).map do |i|
      v = begin_value + i * diff / n
      return_ints ? v.round : v
    end
end # distribute

#--------------------------------------------------------------------------
# * New Method: time_process
#--------------------------------------------------------------------------
def time_process
    until @frame < RINOBI::TimeSystem::Second_Length
      @frame -= RINOBI::TimeSystem::Second_Length
      add_time("second", 1)
      auto_weather if rand(100.0) < RINOBI::TimeSystem::Second_Weather
    end #- Frames to Seconds
    until second < RINOBI::TimeSystem::Minute_Length
      @second -= RINOBI::TimeSystem::Minute_Length
      add_time("minute", 1)
      auto_weather if rand(100.0) < RINOBI::TimeSystem::Minute_Weather
    end #- Seconds to Minutes
    until minute < RINOBI::TimeSystem::Hour_Length
      @minute -= RINOBI::TimeSystem::Hour_Length
      add_time("hour", 1) ; light_cycle
      auto_weather if rand(100.0) < RINOBI::TimeSystem::Hourly_Weather
    end #- Minutes to Hours
    until hour < RINOBI::TimeSystem::Day_Length
      @hour -= RINOBI::TimeSystem::Day_Length
      add_time("day", 1)
      auto_weather if rand(100.0) < RINOBI::TimeSystem::Daily_Weather
    end #- Hours to Days
    until day <= RINOBI::TimeSystem::Months[:Days]
      @day -= RINOBI::TimeSystem::Months[:Days]
      add_time("month", 1)
      until month <= RINOBI::TimeSystem::Months.count
      @month -= RINOBI::TimeSystem::Months.count
      add_time("year", 1)
      end #- Months to Years
    end #- Days to Months
    until month <= RINOBI::TimeSystem::Months.count
      @month -= RINOBI::TimeSystem::Months.count
      add_time("year", 1)
    end #- Months to Years
    update_variables
end # time_process

#--------------------------------------------------------------------------
# * New Method: update_variables
#--------------------------------------------------------------------------
def update_variables
    ts = RINOBI::TimeSystem
    $game_variables   = season if ts::Var_Season
    $game_variables   = year if ts::Var_Year
    $game_variables    = month if ts::Var_Month
    $game_variables      = day if ts::Var_Day
    $game_variables   = hour if ts::Var_Hour
    $game_variables   = minute if ts::Var_Minute
    $game_variables   = second if ts::Var_Second
    $game_variables = get_season_name if ts::Var_Season_N
    $game_variables= get_month_name if ts::Var_Month_N
    $game_variables    = get_day_name if ts::Var_Day_N
end

#--------------------------------------------------------------------------
# * New Method: light_cycle
#--------------------------------------------------------------------------
def light_cycle
    range = RINOBI::TimeSystem::Day_Cycle
    range.count.times do |r|
      if range[:Range].include?(hour)
      return tint_level(r+1)
      end
    end
end # light_cycle

#--------------------------------------------------------------------------
# * New Method: tint_level
#--------------------------------------------------------------------------
def tint_level(value)
    cycle = RINOBI::TimeSystem::Day_Cycle
    it = RINOBI::TimeSystem::Indoor_Tint
    if indoors?
      return @screen.start_tone_change(Tone.new(it,it,it,it),0)
    end
    tint1 = RINOBI::TimeSystem::Day_Cycle[:Tint]
    if value == cycle.count then tint2 = RINOBI::TimeSystem::Day_Cycle[:Tint]
    else tint2 = RINOBI::TimeSystem::Day_Cycle[:Tint] end
    range = RINOBI::TimeSystem::Day_Cycle[:Range].to_a
    t = []
    t << distribute(tint1, tint2, range.count, true)
    t << distribute(tint1, tint2, range.count, true)
    t << distribute(tint1, tint2, range.count, true)
    t << distribute(tint1, tint2, range.count, true)
    r = range.index(hour)
    i = RINOBI::TimeSystem::Tint_Interval
    i = 0 if $game_player.transferring
    screen.start_tone_change(Tone.new(t,t,t,t),i)
end # tint_level

#--------------------------------------------------------------------------
# * New Method: auto_weather
#--------------------------------------------------------------------------
def auto_weather
    weather = []
    RINOBI::TimeSystem::Seasons[:Weathers].keys.each do |s|
      RINOBI::TimeSystem::Seasons[:Weathers][:Weight].times do
      index = RINOBI::TimeSystem::Seasons[:Weathers].keys.index(s)
      weather << RINOBI::TimeSystem::Seasons[:Weathers].keys
      end #---
    end #--
    set_weather(weather.sample)
end # auto_weather

#--------------------------------------------------------------------------
# * New Method: calculate_date
#--------------------------------------------------------------------------
def calculate_date(value)
    ts = RINOBI::TimeSystem
    ts_current_month = ts::Months[:Days]
    until value < ts::Second_Length
      value -= ts::Second_Length
      value += 1
    end
    until value < ts::Minute_Length
      value -= ts::Minute_Length
      value += 1
    end
    until value < ts::Hour_Length
      value -= ts::Hour_Length
      value += 1
    end
    until value < ts::Day_Length
      value -= ts::Day_Length
      value += 1
    end
    until value < ts_current_month
      value -= ts_current_month
      value += 1
    end
    return value
end

#--------------------------------------------------------------------------
# * New Method: set_weather
#--------------------------------------------------------------------------
def set_weather(value, fast = false)
    @weather = value
    if indoors?
      type = RINOBI::TimeSystem::Weathers[:Type]
      power = RINOBI::TimeSystem::Weathers[:Power]
      duration = RINOBI::TimeSystem::Weathers[:Duration]
      screen.change_weather(type, power, duration)
    else
      type = RINOBI::TimeSystem::Weathers[:Type]
      power = RINOBI::TimeSystem::Weathers[:Power]
      if fast then duration = 0
      else duration = RINOBI::TimeSystem::Weathers[:Duration] end
      screen.change_weather(type, power, duration)
    end
end # set_weather

#--------------------------------------------------------------------------
# * New Method: set_time
#--------------------------------------------------------------------------
def set_time(key, value)
    return unless instance_variable_defined?(("@" + key).intern)
    instance_variable_set(("@" + key).intern, value)
end # set_time

#--------------------------------------------------------------------------
# * New Method: add_time
#--------------------------------------------------------------------------
def add_time(key, value)
    return unless instance_variable_defined?(("@" + key).intern)
    current = instance_variable_get(("@" + key).intern)
    instance_variable_set(("@" + key).intern, current + value)
end # add_time

#--------------------------------------------------------------------------
# * New Method: get_time
#--------------------------------------------------------------------------
def get_time(key)
    return unless instance_variable_defined?(("@" + key).intern)
    return instance_variable_get(("@" + key).intern)
end # get_time

#--------------------------------------------------------------------------
# * New Method: get week day
#--------------------------------------------------------------------------
def get_day_name(day = @day, month = @month)
    calendar
end # get_week_day

#--------------------------------------------------------------------------
# * New Method: get_month_name
#--------------------------------------------------------------------------
def get_month_name(month = @month)
    RINOBI::TimeSystem::Months[:Name]
end # get_month_name

#--------------------------------------------------------------------------
# * New Method: get_season_name (necessary?)
#--------------------------------------------------------------------------
def get_season_name
    seasons = RINOBI::TimeSystem::Seasons ; months = RINOBI::TimeSystem::Months
    return seasons[:Season]][:Name]
end # get_season

#--------------------------------------------------------------------------
# * New Method: set_due_date
# >> year, month, day, hour, minute, second
# >> set_due_date('dinner', year, month, day, 20, 30)
#--------------------------------------------------------------------------
def set_due_date(name, *date)
    @dates_hash = date
end

#--------------------------------------------------------------------------
# * New Method: add_due_date
# >> Adjusts date automatically
# >> add_due_date('holliday', :months, 2, 10)
#--------------------------------------------------------------------------
def add_due_date(name, key, *value)
    case key
    when :monthsthen value.insert(0, 0)
    when :days    then value.insert(0, 0, 0) ; print value
    when :hours   then value.insert(0, 0, 0, 0)
    when :minutes then value.insert(0, 0, 0, 0, 0)
    when :seconds then value.insert(0, 0, 0, 0, 0, 0)
    end
    value.push(0) until value.size > 6
    set_due_date(name, calculate_date(value))
end

#--------------------------------------------------------------------------
# * New Method: get_due_date
# >> year, month, day, hour, minute, second
#--------------------------------------------------------------------------
def get_due_date(name)
    @dates_hash
end

#--------------------------------------------------------------------------
# * New Method: due_date (testing)
#--------------------------------------------------------------------------
def due_date?(name)
    return unless @dates_hash
    array = @dates_hash
    return true if year > array
    return true if year   == array && month> array
    return true if month== array && day    > array
    return true if day    == array && hour   > array
    return true if hour   == array && minute > array
    return true if minute == array && second > array
    return false
end # due_date?

#--------------------------------------------------------------------------
# * New Method: freeze_time
#--------------------------------------------------------------------------
def time_freeze
    @time_freeze ? @time_freeze = false : @time_freeze = true
end # freeze_time

#--------------------------------------------------------------------------
# * New Method: time_frozen?
#--------------------------------------------------------------------------
def time_frozen?
    return @time_freeze
end # time_frozen?

#--------------------------------------------------------------------------
# * New Method: indoors?
#--------------------------------------------------------------------------
def indoors?
    return true if RINOBI::TimeSystem::Indoor_Maps.include?(map_id)
    return true if RINOBI::TimeSystem::Indoor_Tiles.include?(tileset.id)
    return false
end # indoors?

#--------------------------------------------------------------------------
# * Alias Method: update_events
#--------------------------------------------------------------------------
def update_events
    time_update_events
    @frame += time_scale unless time_frozen?
    time_process
end
end # Game_Map

#==============================================================================
# ** Game_Player
#------------------------------------------------------------------------------
#This class handles the player. It includes event starting determinants and
# map scrolling functions. The instance of this class is referenced by
# $game_player.
#==============================================================================
class Game_Player < Game_Character
attr_reader :transferring
end # Game_Player

#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader   :year
attr_reader   :month
attr_reader   :day
attr_reader   :hour
attr_reader   :minute
attr_reader   :second
attr_reader   :season
attr_reader   :weather
attr_reader   :time_scale
#--------------------------------------------------------------------------
# * Simple Methods
#--------------------------------------------------------------------------
define_method(:year)      {$game_map.year      }
define_method(:month)       {$game_map.month   }
define_method(:day)         {$game_map.day       }
define_method(:hour)      {$game_map.hour      }
define_method(:minute)      {$game_map.minute    }
define_method(:second)      {$game_map.second    }
define_method(:season)      {$game_map.season    }
define_method(:weather)   {$game_map.weather   }
define_method(:time_scale){$game_map.time_scale}
#--------------------------------------------------------------------------
# * Set Weather
#--------------------------------------------------------------------------
def set_weather(value, fast = false)
    $game_map.set_weather(value, fast)
end
#--------------------------------------------------------------------------
# * Set Time
#--------------------------------------------------------------------------
def set_time(key, value)
    $game_map.set_time(key, value)
end
#--------------------------------------------------------------------------
# * Add Time
#--------------------------------------------------------------------------
def add_time(key, value)
    $game_map.add_time(key, value)
end
#--------------------------------------------------------------------------
# * Get Time
#--------------------------------------------------------------------------
def get_time(key)
    $game_map.get_time(key)
end
#--------------------------------------------------------------------------
# * Get Day Name
#--------------------------------------------------------------------------
def get_day_name(day = $game_map.day, month = $game_map.month)
    $game_map.get_day_name(day, month)
end
#--------------------------------------------------------------------------
# * Get Month Name
#--------------------------------------------------------------------------
def get_month_name(month = @month)
    RINOBI::TimeSystem::Months[:Name]
end
#--------------------------------------------------------------------------
# * Set Time Scale
#--------------------------------------------------------------------------
def set_time_scale(value)
    $game_map.time_scale = value
end
#--------------------------------------------------------------------------
# * Time Freeze
#--------------------------------------------------------------------------
def time_freeze
    if $game_map.time_frozen?
      $game_map.time_freeze = false
    else
      $game_map.time_freeze = true
    end
end
#--------------------------------------------------------------------------
# * Set Due Date
#--------------------------------------------------------------------------
def set_due_date(name, *date)
    $game_map.set_due_date(name, *date)
end

#--------------------------------------------------------------------------
# * Add Due Date
#--------------------------------------------------------------------------
def add_due_date(name, key, *value)
    $game_map.add_due_date(name, key, *value)
end

#--------------------------------------------------------------------------
# * Get Due Date
#--------------------------------------------------------------------------
def get_due_date(name)
    $game_map.get_due_date(name)
end
#--------------------------------------------------------------------------
# * Check Due Date
#--------------------------------------------------------------------------
def due_date?(name)
    $game_map.due_date?(name)
end
#--------------------------------------------------------------------------
# * Indoors?
#--------------------------------------------------------------------------
def indoors?
    $game_map.indoors?
end
end

#==============================================================================
# ** Spriteset_Weather
#------------------------------------------------------------------------------
#A class for weather effects (rain, storm, and snow). It is used within the
# Spriteset_Map class.
#==============================================================================
class Spriteset_Weather
#--------------------------------------------------------------------------
# * Alias Method: Update Sprite
#--------------------------------------------------------------------------
alias :time_update_storm :update_sprite_storm
def update_sprite_storm(sprite)
    time_update_storm(sprite)
    return unless rand((RINOBI::TimeSystem::Frequency * 10000.0) / @power) < 1
    total = RINOBI::TimeSystem::SE_Thunder.count
    selection = 1 + rand(total - 1)
    red   = RINOBI::TimeSystem::Flash_Lightning
    green   = RINOBI::TimeSystem::Flash_Lightning
    blue    = RINOBI::TimeSystem::Flash_Lightning
    opacity = RINOBI::TimeSystem::Flash_Lightning
    frames= RINOBI::TimeSystem::Flash_Lightning
    file   = RINOBI::TimeSystem::SE_Thunder[:File]
    volume = RINOBI::TimeSystem::SE_Thunder[:Volume]
    pitch= RINOBI::TimeSystem::SE_Thunder[:Pitch]
    $game_map.screen.start_flash(Color.new(red,green,blue,opacity),frames)
    RPG::SE.new(file, volume, pitch).play
end # update_sprite_storm
end # Spriteset_Weather

#==============================================================================
# ** Class: Time Window Option 1
#==============================================================================
class Time_Window1 < Window_Base
#--------------------------------------------------------------------------
# * New Method: Initialize
#--------------------------------------------------------------------------
def initialize
    window_x = RINOBI::TimeSystem::Window_X
    window_y = RINOBI::TimeSystem::Window_Y
    super(window_x, window_y, window_width, fitting_height(2))
    self.openness = 255
    self.opacity = 255
    refresh
end # initialize
#--------------------------------------------------------------------------
# * New Method: Window Width
#--------------------------------------------------------------------------
def window_width
    return 276
end # window_width
#--------------------------------------------------------------------------
# * New Method: Refresh
#--------------------------------------------------------------------------
def refresh
    contents.clear
    change_color(text_color(0))
    season = $game_map.get_season_name
    year = $game_map.get_time('year')
    month_integer = $game_map.get_time('month')
    month_string = RINOBI::TimeSystem::Months[$game_map.get_time('month')][:Name]
    day_integer = $game_map.get_time('day')
    day_string = $game_map.calendar
    hour = $game_map.get_time('hour')
    minute = sprintf("%02d", $game_map.get_time('minute'))
    apm = '' ; if hour > 11 then apm = 'PM' else apm = 'AM' end
    if hour < 1then hour += 12 end ; if hour > 12 then hour -= 12 end
    hour = sprintf("%02d", hour)
    line1 = "#{month_string} #{day_integer}, #{year}[#{season}]"
    line2 = "#{day_string}, #{hour}:#{minute}#{apm}"
    draw_text(0, 0, contents.width, line_height, line1)
    draw_text(0, 0, contents.width, fitting_height(2), line2)
end # refresh
end # Time_Window1 < Window_Base

#==============================================================================
# ** Class: Time Window Option 2
#==============================================================================
class Time_Window2 < Window_Base
#--------------------------------------------------------------------------
# * New Method: Initialize
#--------------------------------------------------------------------------
def initialize
    window_x = RINOBI::TimeSystem::Window_X
    window_y = RINOBI::TimeSystem::Window_Y
    super(window_x, window_y, window_width, fitting_height(1))
    self.openness = 255
    self.opacity = 255
    refresh
end # initialize
#--------------------------------------------------------------------------
# * New Method: Window Width
#--------------------------------------------------------------------------
def window_width
    return 186
end # window_width
#--------------------------------------------------------------------------
# * New Method: Refresh
#--------------------------------------------------------------------------
def refresh
    contents.clear
    change_color(text_color(0))
    month_integer = $game_map.get_time('month')
    day_integer = $game_map.get_time('day')
    day_string = $game_map.calendar
    hour = $game_map.get_time('hour')
    minute = sprintf("%02d", $game_map.get_time('minute'))
    apm = '' ; if hour > 11 then apm = 'PM' else apm = 'AM' end
    if hour < 1then hour += 12 end ; if hour > 12 then hour -= 12 end
    hour = sprintf("%02d", hour)
    line1 = "#{day_string}, #{hour}:#{minute}#{apm}"
    draw_text(0, 0, contents.width, line_height, line1)
end # refresh
end # Time_Window2 < Window_Base

#==============================================================================
# ** Class: Time Window Option 3
#==============================================================================
class Time_Window3 < Window_Base
#--------------------------------------------------------------------------
# * New Method: Initialize
#--------------------------------------------------------------------------
def initialize
    window_x = RINOBI::TimeSystem::Window_X
    window_y = RINOBI::TimeSystem::Window_Y
    super(window_x, window_y, window_width, fitting_height(1))
    self.openness = 255
    self.opacity = 255
    refresh
end # initialize
#--------------------------------------------------------------------------
# * New Method: Window Width
#--------------------------------------------------------------------------
def window_width
    return 276
end # window_width
#--------------------------------------------------------------------------
# * New Method: Refresh
#--------------------------------------------------------------------------
def refresh
    contents.clear
    change_color(text_color(0))
    season = $game_map.get_season_name
    year = $game_map.get_time('year')
    month_integer = $game_map.get_time('month')
    month_string = RINOBI::TimeSystem::Months[$game_map.get_time('month')][:Name]
    day_integer = $game_map.get_time('day')
    line1 = "#{month_string} #{day_integer}, #{year}[#{season}]"
    draw_text(0, 0, contents.width, line_height, line1)
end # refresh
end # Time_Window3 < Window_Base

#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#This class performs the map screen processing.
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# * Alias Method: Create Spriteset
#--------------------------------------------------------------------------
alias :time_spriteset :create_spriteset
def create_spriteset
    time_spriteset
    create_time_hud if RINOBI::TimeSystem::Display_Toggle
end # create_spriteset
#--------------------------------------------------------------------------
# * New Method: Create Intial HUD Display
#--------------------------------------------------------------------------
def create_time_hud
    @time_hud = Time_Window1.new
    $game_switches = true
end # create_time_hud
#--------------------------------------------------------------------------
# * New Method: Toggle Time HUD Display
#--------------------------------------------------------------------------
def time_hud_toggle
    if Input.trigger?(RINOBI::TimeSystem::Display_Key)
      $game_switches ^= true
    end
end # time_hud_toggle
#--------------------------------------------------------------------------
# * New Method: Toggle Time Type Display
#--------------------------------------------------------------------------
def time_type_toggle
    if Input.trigger?(RINOBI::TimeSystem::Toggle_Key)
      $game_variables += 1
      if $game_variables > 2
      $game_variables = 0
      end
      adjust_time_window
    end
end # time_type_toggle
#--------------------------------------------------------------------------
# * New Method: Adjust Time Window
#--------------------------------------------------------------------------
def adjust_time_window
    case $game_variables
    when 0 then @time_hud = Time_Window1.new
    when 1 then @time_hud = Time_Window2.new
    when 2 then @time_hud = Time_Window3.new
    end
    @time_hud.refresh
end # adjust_time_window
#--------------------------------------------------------------------------
# * New Method: Close Time Window
#--------------------------------------------------------------------------
def close_time_window
    return if $game_switches
    @time_hud.close
end # close_time_window
#--------------------------------------------------------------------------
# * New Method: Open Time Window
#--------------------------------------------------------------------------
def open_time_window
    return unless $game_switches
    @time_hud.open
end # open_time_window
#--------------------------------------------------------------------------
# * Alias Method: Update
#--------------------------------------------------------------------------
alias :time_hud_update :update
def update
    time_hud_update
    return unless RINOBI::TimeSystem::Display_Toggle
    time_hud_toggle
    time_type_toggle
    close_time_window
    open_time_window
    return unless @track != $game_map.minute
    @time_hud.refresh
    @track = $game_map.minute
end # update
end # Scene_Map < Scene_Base

Spoiler: DOWNLOADSRinobi_YATS.txtSpoiler: PLANNING

[*]Redesign UI. It was originally designed for testing.
[*]Update calendar generation. It's a mess.
[*]Create calendar display. The data is there already.
[*]Design a demo making use of script calls.



本贴来自国际rpgmaker官方论坛作者:Rinobi处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/yet-another-time-system.75564/
页: [1]
查看完整版本: Yet Another Time System