mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
2c73bbf9(Fix for tiles being invisible after a map transfer if they were on screen before it) dc01031a(prevent unknown_items from being obtained in randomizer) ee906fb3(previous commit also included new attack animations) 4dba7c02(Fixes unreal time and footprint scripts being accidentally disabled)
278 lines
9.5 KiB
Ruby
278 lines
9.5 KiB
Ruby
# #===============================================================================
|
|
# # * 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 |