累计送礼: 0 个 累计收礼: 1 个 TA的每日心情 开心 2026-7-12 04:10
签到天数: 209 天
连续签到: 2 天
[LV.7]常住居民III
管理员
VIP
7
卡币
58883
OK点
16
推广点
0
同能卷
50
积分 68848
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
[03/03/2017] 1.00 Public Release
[03/08/2017] 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
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 [12/23/2015] Finished alpha version. # @ 0.61 [12/23/2015] Added lightning & thunder effects. # @ 0.62 [12/23/2015] Time process method reliability update. # @ 0.63 [12/23/2015] Added time freeze method. # @ 0.64 [12/25/2015] Updated set_weather method. # @ 0.69 [05/18/2016] Added Time Display UI # @ 0.70 [05/21/2016] Updated time_process method. # @ 1.00 [03/03/2017] Public release. # @ 1.01 [03/08/2017] 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. #============================================================================ # [time_unit, value] # --------------------------------------------------------------------------- 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 = [0, 0, 0, 0] # ID, ID, ID, ID Indoor_Tiles = [3, 4, 6, 7] # ID, ID, ID, ID Indoor_Tint = [0, 0, 0, 0] # 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. # [Red, Green, Blue, Grey] (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 => [ 45, 45, 0, 0], :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 = [5, 8, 9, 10] # --------------------------------------------------------------------------- # 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 Rain 5/17 2 => {:Weight => 5}, # Normal Rain 5/17 3 => {:Weight => 2}, # Heavy Rain 2/17 4 => {:Weight => 1}, # Storm 1/17 }}, # Spring 2 => { :Name => 'Summer', :Tileset => 5, :Weathers => { 0 => {:Weight => 5}, # Clear 5/15 1 => {:Weight => 1}, # Light Rain 1/15 2 => {:Weight => 2}, # Normal Rain 2/15 3 => {:Weight => 3}, # Heavy Rain 3/15 4 => {:Weight => 4}, # Storm 4/15 }}, # Summer 3 => { :Name => 'Autumn', :Tileset => 8, :Weathers => { 0 => {:Weight => 5}, # Clear 5/12 1 => {:Weight => 1}, # Light Rain 1/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 Rain 3/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. # [Red, Green, Blue, Opacity, Duration] # --------------------------------------------------------------------------- Flash_Lightning = [255, 255, 255, 255, 15] # --------------------------------------------------------------------------- # 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 [year, month, day, hour, minute, second] # @ 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_storm in 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][0] volume = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound][1] pitch = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound][2] volume *= dampen ; RPG::BGS.new(file, volume, pitch).play else file = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound][0] volume = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound][1] pitch = RINOBI::TimeSystem::Weathers[$game_map.weather][:Sound][2] 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[0], $game_troop.turn_count * btime[1]) 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[season][: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[cmonth][:Days] cmonth -= 1 end # cmonth > 0 m_start = (1 + m_end) - RINOBI::TimeSystem::Months[month][:Days] @calendar[month] = Hash[(m_start..m_end).map {|n|[n, days[count]]}] @calendar[month].count.times do |s| count = 0 unless count < @week count += 1 ; @calendar[month][s+1] = RINOBI::TimeSystem::Days[count] end # @calendar[month]count.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[month][:Season]} #-------------------------------------------------------------------------- # * New Method: distribute #-------------------------------------------------------------------------- def distribute(begin_value, end_value, array_size, return_ints = false) diff = 1.0 * (end_value - begin_value) n = [array_size-1, 1].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[month][:Days] @day -= RINOBI::TimeSystem::Months[month][: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[ts::Var_Season] = season if ts::Var_Season $game_variables[ts::Var_Year] = year if ts::Var_Year $game_variables[ts::Var_Month] = month if ts::Var_Month $game_variables[ts::Var_Day] = day if ts::Var_Day $game_variables[ts::Var_Hour] = hour if ts::Var_Hour $game_variables[ts::Var_Minute] = minute if ts::Var_Minute $game_variables[ts::Var_Second] = second if ts::Var_Second $game_variables[ts::Var_Season_N] = get_season_name if ts::Var_Season_N $game_variables[ts::Var_Month_N] = get_month_name if ts::Var_Month_N $game_variables[ts::Var_Day_N] = 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[r+1][: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[0],it[1],it[2],it[3]),0) end tint1 = RINOBI::TimeSystem::Day_Cycle[value][:Tint] if value == cycle.count then tint2 = RINOBI::TimeSystem::Day_Cycle[1][:Tint] else tint2 = RINOBI::TimeSystem::Day_Cycle[value+1][:Tint] end range = RINOBI::TimeSystem::Day_Cycle[value][:Range].to_a t = [] t << distribute(tint1[0], tint2[0], range.count, true) t << distribute(tint1[1], tint2[1], range.count, true) t << distribute(tint1[2], tint2[2], range.count, true) t << distribute(tint1[3], tint2[3], 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[0][r],t[1][r],t[2][r],t[3][r]),i) end # tint_level #-------------------------------------------------------------------------- # * New Method: auto_weather #-------------------------------------------------------------------------- def auto_weather weather = [] RINOBI::TimeSystem::Seasons[season][:Weathers].keys.each do |s| RINOBI::TimeSystem::Seasons[season][:Weathers][s][:Weight].times do index = RINOBI::TimeSystem::Seasons[season][:Weathers].keys.index(s) weather << RINOBI::TimeSystem::Seasons[season][:Weathers].keys[index] 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[month][:Days] until value[5] < ts::Second_Length value[5] -= ts::Second_Length value[4] += 1 end until value[4] < ts::Minute_Length value[4] -= ts::Minute_Length value[3] += 1 end until value[3] < ts::Hour_Length value[3] -= ts::Hour_Length value[2] += 1 end until value[2] < ts::Day_Length value[2] -= ts::Day_Length value[1] += 1 end until value[1] < ts_current_month value[1] -= ts_current_month value[0] += 1 end return value end #-------------------------------------------------------------------------- # * New Method: set_weather #-------------------------------------------------------------------------- def set_weather(value, fast = false) @weather = value if indoors? type = RINOBI::TimeSystem::Weathers[0][:Type] power = RINOBI::TimeSystem::Weathers[0][:Power] duration = RINOBI::TimeSystem::Weathers[0][:Duration] screen.change_weather(type, power, duration) else type = RINOBI::TimeSystem::Weathers[value][:Type] power = RINOBI::TimeSystem::Weathers[value][:Power] if fast then duration = 0 else duration = RINOBI::TimeSystem::Weathers[value][: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[month][day] end # get_week_day #-------------------------------------------------------------------------- # * New Method: get_month_name #-------------------------------------------------------------------------- def get_month_name(month = @month) RINOBI::TimeSystem::Months[month][: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[months[get_time('month')][: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[name] = 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 :months then 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[name] end #-------------------------------------------------------------------------- # * New Method: due_date (testing) #-------------------------------------------------------------------------- def due_date?(name) return unless @dates_hash array = @dates_hash[name] return true if year > array[0] return true if year == array[0] && month > array[1] return true if month == array[1] && day > array[2] return true if day == array[2] && hour > array[3] return true if hour == array[3] && minute > array[4] return true if minute == array[4] && second > array[5] 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[month][: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 [Storm] #-------------------------------------------------------------------------- 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[0] green = RINOBI::TimeSystem::Flash_Lightning[1] blue = RINOBI::TimeSystem::Flash_Lightning[2] opacity = RINOBI::TimeSystem::Flash_Lightning[3] frames = RINOBI::TimeSystem::Flash_Lightning[4] file = RINOBI::TimeSystem::SE_Thunder[selection][:File] volume = RINOBI::TimeSystem::SE_Thunder[selection][:Volume] pitch = RINOBI::TimeSystem::SE_Thunder[selection][: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[month_integer][day_integer] 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 < 1 then 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[month_integer][day_integer] 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 < 1 then 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[RINOBI::TimeSystem::Display_Switch] = true end # create_time_hud #-------------------------------------------------------------------------- # * New Method: Toggle Time HUD Display #-------------------------------------------------------------------------- def time_hud_toggle if Input.trigger?(RINOBI::TimeSystem::Display_Key) $game_switches[RINOBI::TimeSystem::Display_Switch] ^= 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[RINOBI::TimeSystem::Toggle_Variable] += 1 if $game_variables[RINOBI::TimeSystem::Toggle_Variable] > 2 $game_variables[RINOBI::TimeSystem::Toggle_Variable] = 0 end adjust_time_window end end # time_type_toggle #-------------------------------------------------------------------------- # * New Method: Adjust Time Window #-------------------------------------------------------------------------- def adjust_time_window case $game_variables[RINOBI::TimeSystem::Toggle_Variable] 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[RINOBI::TimeSystem::Display_Switch] @time_hud.close end # close_time_window #-------------------------------------------------------------------------- # * New Method: Open Time Window #-------------------------------------------------------------------------- def open_time_window return unless $game_switches[RINOBI::TimeSystem::Display_Switch] @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: DOWNLOADS
Spoiler: 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/
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x