# #=============================================================================== # # * Unreal Time System - by FL (Credits will be apreciated) # #=============================================================================== # # # # This script is for Pokémon Essentials. It makes the time in game uses its # # own clock that only pass when you are in game instead of using real time # # (like Minecraft and Zelda: Ocarina of Time). # # # #== INSTALLATION =============================================================== # # # # To this script works, put it above main OR convert into a plugin. # # # #== HOW TO USE ================================================================= # # # # This script automatic works after installed. # # # # If you wish to add/reduce time, there are 3 ways: # # # # 1. EXTRA_SECONDS/EXTRA_DAYS are variables numbers that hold time passage; # # The time in these variable isn't affected by PROPORTION. # # Example: When the player sleeps you wish to the time in game advance # # 8 hours, so put in EXTRA_SECONDS a game variable number and sum # # 28800 (60*60*8) in this variable every time that the players sleeps. # # # # 2. 'UnrealTime.add_seconds(seconds)' and 'UnrealTime.add_days(days)' does the # # same thing, in fact, EXTRA_SECONDS/EXTRA_DAYS call these methods. # # # # 3. 'UnrealTime.advance_to(16,17,18)' advance the time to a fixed time of day, # # 16:17:18 on this example. # # # #== NOTES ====================================================================== # # # # If you wish to some parts still use real time like the Trainer Card start time # # and Pokémon Trainer Memo, just change 'pbGetTimeNow' to 'Time.now' in their # # scripts. # # # # This script uses the Ruby Time class. Before Essentials version 19 (who came # # with 64-bit ruby) it can only have 1901-2038 range. # # # # Some time methods: # # 'pbGetTimeNow.year', 'pbGetTimeNow.mon' (the numbers from 1-12), # # 'pbGetTimeNow.day','pbGetTimeNow.hour', 'pbGetTimeNow.min', # # 'pbGetTimeNow.sec', 'pbGetAbbrevMonthName(pbGetTimeNow.mon)', # # 'pbGetTimeNow.strftime("%A")' (displays weekday name), # # 'pbGetTimeNow.strftime("%I:%M %p")' (displays Hours:Minutes pm/am) # # # #=============================================================================== # # if defined?(PluginManager) && !PluginManager.installed?("Unreal Time System") # PluginManager.register({ # :name => "Unreal Time System", # :version => "1.1", # :link => "https://www.pokecommunity.com/showthread.php?t=285831", # :credits => "FL" # }) # end # # module UnrealTime # # Set false to disable this system (returns Time.now) # ENABLED=true # # # Time proportion here. # # So if it is 100, one second in real time will be 100 seconds in game. # # If it is 60, one second in real time will be one minute in game. # PROPORTION=60 # # # Starting on Essentials v17, the map tone only try to refresh tone each 30 # # real time seconds. # # If this variable number isn't -1, the game use this number instead of 30. # # When time is changed with advance_to or add_seconds, the tone refreshes. # TONE_CHECK_INTERVAL = 10.0 # # # Make this true to time only pass at field (Scene_Map) # # A note to scripters: To make time pass on other scenes, put line # # '$PokemonGlobal.addNewFrameCount' near to line 'Graphics.update' # TIME_STOPS=true # # # Make this true to time pass in battle, during turns and command selection. # # This won't affect the Pokémon and Bag submenus. # # Only works if TIME_STOPS=true. # BATTLE_PASS=true # # # Make this true to time pass when the Dialog box or the main menu are open. # # This won't affect the submenus like Pokémon and Bag. # # Only works if TIME_STOPS=true. # TALK_PASS=true # # # Choose switch number that when true the time won't pass (or -1 to cancel). # # Only works if TIME_STOPS=true. # SWITCH_STOPS=-1 # # # Choose variable(s) number(s) that can hold time passage (or -1 to cancel). # # Look at description for more details. # EXTRA_SECONDS=79 # EXTRA_DAYS=-1 # # # Initial date. In sequence: Year, month, day, hour and minutes. # # Method UnrealTime.reset resets time back to this time. # def self.initial_date # return Time.local(2000,1,1, 12,0) # end # # # Advance to next time. If time already passed, advance # # into the time on the next day. # # Hour is 0..23 # def self.advance_to(hour,min=0,sec=0) # if hour < 0 || hour > 23 # raise RangeError, "hour is #{hour}, should be 0..23" # end # day_seconds = 60*60*24 # seconds_now = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec # target_seconds = hour*60*60+min*60+sec # seconds_added = target_seconds-seconds_now # seconds_added += day_seconds if seconds_added<0 # $PokemonGlobal.newFrameCount+=seconds_added # PBDayNight.sheduleToneRefresh # end # # # Resets time to initial_date. # def self.reset # raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS # $game_variables[EXTRA_SECONDS]=0 if EXTRA_DAYS>0 # $game_variables[EXTRA_DAYS]=0 if EXTRA_DAYS>0 # $PokemonGlobal.newFrameCount=0 # $PokemonGlobal.extraYears=0 # PBDayNight.sheduleToneRefresh # end # # # Does the same thing as EXTRA_SECONDS variable. # def self.add_seconds(seconds) # raise "Method doesn't work when TIME_STOPS is false!" if !TIME_STOPS # $PokemonGlobal.newFrameCount+=(seconds*Graphics.frame_rate)/PROPORTION.to_f # PBDayNight.sheduleToneRefresh # end # # def self.add_days(days) # add_seconds(60*60*24*days) # end # # NEED_32_BIT_FIX = [''].pack('p').size <= 4 # end # # # Essentials V18 and lower compatibility # module Settings # TIME_SHADING = defined?(ENABLESHADING) ? ENABLESHADING : ::TIME_SHADING # end if defined?(TIME_SHADING) || defined?(ENABLESHADING) # # module PBDayNight # class << self # if method_defined?(:getTone) && UnrealTime::TONE_CHECK_INTERVAL > 0 # def getTone # @cachedTone = Tone.new(0,0,0) if !@cachedTone # return @cachedTone if !Settings::TIME_SHADING # toneNeedUpdate = (!@dayNightToneLastUpdate || # Graphics.frame_count-@dayNightToneLastUpdate >= # Graphics.frame_rate*UnrealTime::TONE_CHECK_INTERVAL # ) # if toneNeedUpdate # getToneInternal # @dayNightToneLastUpdate = Graphics.frame_count # end # return @cachedTone # end # end # # # Shedule a tone refresh on the next try (probably next frame) # def sheduleToneRefresh # @dayNightToneLastUpdate = nil # end # end # end # # def pbGetTimeNow # return Time.now if !$PokemonGlobal || !UnrealTime::ENABLED # day_seconds = 60*60*24 # if UnrealTime::TIME_STOPS # # Sum the extra values to newFrameCount # if UnrealTime::EXTRA_SECONDS>0 # UnrealTime.add_seconds(pbGet(UnrealTime::EXTRA_SECONDS)) # $game_variables[UnrealTime::EXTRA_SECONDS]=0 # end # if UnrealTime::EXTRA_DAYS>0 # UnrealTime.add_seconds(day_seconds*pbGet(UnrealTime::EXTRA_DAYS)) # $game_variables[UnrealTime::EXTRA_DAYS]=0 # end # elsif UnrealTime::EXTRA_SECONDS>0 && UnrealTime::EXTRA_DAYS>0 # # Checks to regulate the max/min values at UnrealTime::EXTRA_SECONDS # while pbGet(UnrealTime::EXTRA_SECONDS)>=day_seconds # $game_variables[UnrealTime::EXTRA_SECONDS]-=day_seconds # $game_variables[UnrealTime::EXTRA_DAYS]+=1 # end # while pbGet(UnrealTime::EXTRA_SECONDS)<=-day_seconds # $game_variables[UnrealTime::EXTRA_SECONDS]+=day_seconds # $game_variables[UnrealTime::EXTRA_DAYS]-=1 # end # end # start_time=UnrealTime.initial_date # if UnrealTime::TIME_STOPS # time_played=$PokemonGlobal.newFrameCount # else # time_played=Graphics.frame_count # end # time_played=(time_played*UnrealTime::PROPORTION)/Graphics.frame_rate # time_jumped=0 # if UnrealTime::EXTRA_SECONDS>-1 # time_jumped+=pbGet(UnrealTime::EXTRA_SECONDS) # end # if UnrealTime::EXTRA_DAYS>-1 # time_jumped+=pbGet(UnrealTime::EXTRA_DAYS)*day_seconds # end # time_ret = 0 # # Before Essentials V19, there is a year limit. To prevent crashes due to this # # limit, every time that you reach in year 2036 the system will subtract 6 # # years (to works with leap year) from your date and sum in # # $PokemonGlobal.extraYears. You can sum your actual year with this extraYears # # when displaying years. # loop do # time_fix=0 # if $PokemonGlobal.extraYears!=0 # time_fix = $PokemonGlobal.extraYears*day_seconds*(365*6+1)/6 # end # time_ret=start_time+(time_played+time_jumped-time_fix) # break if !UnrealTime::NEED_32_BIT_FIX || time_ret.year<2036 # $PokemonGlobal.extraYears+=6 # end # return time_ret # end # # if UnrealTime::ENABLED # class PokemonGlobalMetadata # attr_accessor :newFrameCount # Became float when using extra values # attr_accessor :extraYears # # def addNewFrameCount # return if (UnrealTime::SWITCH_STOPS>0 && # $game_switches[UnrealTime::SWITCH_STOPS]) # self.newFrameCount+=1 # end # # def newFrameCount # @newFrameCount=0 if !@newFrameCount # return @newFrameCount # end # # def extraYears # @extraYears=0 if !@extraYears # return @extraYears # end # end # # if UnrealTime::TIME_STOPS # class Scene_Map # alias :updateold :update # def update # $PokemonGlobal.addNewFrameCount # updateold # end # # if UnrealTime::TALK_PASS # alias :miniupdateold :miniupdate # def miniupdate # $PokemonGlobal.addNewFrameCount # miniupdateold # end # end # end # # if UnrealTime::BATTLE_PASS # class PokeBattle_Scene # alias :pbGraphicsUpdateold :pbGraphicsUpdate # def pbGraphicsUpdate # $PokemonGlobal.addNewFrameCount # pbGraphicsUpdateold # end # end # end # end # end