PDA

View Full Version : [Essentials script] Unreal time system (like Haverst Moon)


FL
August 3rd, 2012, 04:30 AM
#===============================================================================
# * Unreal time system - by FL (Credits will be apreciated)
#===============================================================================
#
# This script is for Pokémon Essentials. It makes the time in game have its
# own clock that only pass when you are in game instead of using real time
# (like Harvest Moon and Zelda: Ocarina of Time).
#
#===============================================================================
#
# To this script works, put it above main. 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 (in this example,
# PokemonMap and PokeBattle_Pokemon scripts sections).
#
# This script use the Ruby Time class that can only hold years around
# 1970-2038 range. If you wish to have other years values, sum/subtract when
# displaying the year. Examples:
# If you wants year 1000, start in 1970 and, when displaying year name use
# 'pbGetTimeNow.year-970'.
# If you wants year 5000, start in 1970 and, when displaying year name use
# 'pbGetTimeNow.year+3030'.
#
# 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)
#
#===============================================================================

# Set false to disable this system (returns Time.now)
NTN_ENABLED=true

# 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'
NTN_TIMESTOPS=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 NTN_TIMESTOPS=true.
NTN_BATTLEPASS=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 NTN_TIMESTOPS=true.
NTN_TALKPASS=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.
NTS_TIMEPROPORTION=60

# Choose switch number that when true the time won't pass (or -1 to cancel).
# Only works if NTN_TIMESTOPS=true.
NTN_SWITCHSTOPS=-1

# Choose variable(s) number(s) that can hold time passage (or -1 to cancel).
# The time in this variable isn't affected by NTS_TIMEPROPORTION.
# Example: When the player sleeps you wish to the time in game advance
# 8 hours, so put in NTN_EXTRASECONDS a game variable number and sum
# 28800 (60*60*8) in this variable every time that the players sleeps.
NTN_EXTRASECONDS=-1
NTN_EXTRADAYS=-1

# Initial values
NTN_INITIALYEAR=2000 # Can ONLY holds around range 1970-2038
NTN_INITIALMONTH=1
NTN_INITIALDAY=1
NTN_INITIALHOUR=12
NTN_INITIALMINUTE=0

def pbGetTimeNow
return Time.now if !NTN_ENABLED

if(NTN_TIMESTOPS)
# Sum the extra values to newFrameCount
if(NTN_EXTRASECONDS>0)
$PokemonGlobal.newFrameCount+=(
pbGet(NTN_EXTRASECONDS)*Graphics.frame_rate)/NTS_TIMEPROPORTION
$game_variables[NTN_EXTRASECONDS]=0
end
if(NTN_EXTRADAYS>0)
$PokemonGlobal.newFrameCount+=((60*60*24)*
pbGet(NTN_EXTRADAYS)*Graphics.frame_rate)/NTS_TIMEPROPORTION
$game_variables[NTN_EXTRADAYS]=0
end
elsif(NTN_EXTRASECONDS>0 && NTN_EXTRADAYS>0)
# Checks to regulate the max/min values at NTN_EXTRASECONDS
while (pbGet(NTN_EXTRASECONDS)>=(60*60*24))
$game_variables[NTN_EXTRASECONDS]-=(60*60*24)
$game_variables[NTN_EXTRADAYS]+=1
end
while (pbGet(NTN_EXTRASECONDS)<=-(60*60*24))
$game_variables[NTN_EXTRASECONDS]+=(60*60*24)
$game_variables[NTN_EXTRADAYS]-=1
end
end
start_time=Time.utc(NTN_INITIALYEAR,NTN_INITIALMONTH,NTN_INITIALDAY,
NTN_INITIALHOUR,NTN_INITIALMINUTE)
time_played=(NTN_TIMESTOPS && $PokemonGlobal) ?
$PokemonGlobal.newFrameCount : Graphics.frame_count
time_played=(time_played*NTS_TIMEPROPORTION)/Graphics.frame_rate
time_jumped=0
time_jumped+=pbGet(NTN_EXTRASECONDS) if NTN_EXTRASECONDS>-1
time_jumped+=pbGet(NTN_EXTRADAYS)*(60*60*24) if NTN_EXTRADAYS>-1
time_ret = nil
# To prevent crashes due to year 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
extraYears=($PokemonGlobal) ? $PokemonGlobal.extraYears : 0
time_fix=extraYears*60*60*24*(365*6+1)/6
time_ret=start_time+(time_played+time_jumped-time_fix)
break if time_ret.year<2036
$PokemonGlobal.extraYears+=6
end
return time_ret
end

if NTN_ENABLED
class PokemonGlobalMetadata
attr_accessor :newFrameCount
attr_accessor :extraYears

def addNewFrameCount
self.newFrameCount+=1 if !(
NTN_SWITCHSTOPS>0 && $game_switches[NTN_SWITCHSTOPS])
end

def newFrameCount
@newFrameCount=0 if !@newFrameCount
return @newFrameCount
end

def extraYears
@extraYears=0 if !@extraYears
return @extraYears
end
end

if NTN_TIMESTOPS
class Scene_Map
alias :updateold :update

def update
$PokemonGlobal.addNewFrameCount
updateold
end

if NTN_TALKPASS
alias :miniupdateold :miniupdate

def miniupdate
$PokemonGlobal.addNewFrameCount
miniupdateold
end
end
end

if NTN_BATTLEPASS
class PokeBattle_Scene
alias :pbGraphicsUpdateold :pbGraphicsUpdate

def pbGraphicsUpdate
$PokemonGlobal.addNewFrameCount
pbGraphicsUpdateold
end
end
end
end
end

Qwertyis666
December 22nd, 2014, 09:28 AM
Hi, I just found this awesome script and he work fine but I have a little question:
how exaclty can you pass time with a event? I want the time to pass went you go to bed(the player will choose between morning or night) and when you heal your pokemon in a Pokecenter(pass 6h).

Thanks in advance and sorry for my bad english.

FL
December 23rd, 2014, 05:18 AM
Hi, I just found this awesome script and he work fine but I have a little question:
how exaclty can you pass time with a event? I want the time to pass went you go to bed(the player will choose between morning or night) and when you heal your pokemon in a Pokecenter(pass 6h).

Thanks in advance and sorry for my bad english.When the player sleeps you wish to the time in game advance
# 8 hours, so put in NTN_EXTRASECONDS a game variable number and sum
# 28800 (60*60*8) in this variable every time that the players sleeps.
NTN_EXTRASECONDS=-1
NTN_EXTRADAYS=-1So, if you make NTN_EXTRASECONDS=87 and sum 21600 into variable 87, the time will pass six hours.

Qwertyis666
December 23rd, 2014, 10:01 AM
So, if you make NTN_EXTRASECONDS=87 and sum 21600 into variable 87, the time will pass six hours.


Ok, thanks (I guess I did not notice that comment part).
I just don't understand what is ''sum''? example in 28800, 60*60*8 is the sum?

And what if I want the player to choose to skip to the morning or the night?
Do the script will be difficult to call?

Thanks in advance and sorry for my bad english.

FL
December 26th, 2014, 04:01 AM
Just add 21600 (6 hours in seconds) to variable 87, you can even use event scripts.

For forcing to the player pass the time until it reach into a certain time, there serveral ways, three examples (the first is the worst) that make the player going into 6:00:00 PM (both are doable with events, but I use scripts for better performance).

hour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
while (timeNow.hour != hour &&
timeNow.min != min &&
timeNow.sec != sec)
$game_variables[87]+=1
timeNow = pbGetTimeNow
end

hour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
secInDay = 60*60*24
timeDifference = Time.new(
timeNow.year, timeNow.mon, timeNow.day,
hour, min, sec)
timeDifference += secInDay # Add a day
secondsAdded = (timeDifference-timeNow)%secInDay
$game_variables[87]+=secondsAdded

hour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
secInDay = 60*60*24
secNow = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec
secWished = hour*60*60+min*60+sec
timeDifference += secInDay # Add a day
secondsAdded = secWished-secNow
secondsAdded +=secInDay if secondsAdded<0
$game_variables[87]+=secondsAdded

All untested.

Qwertyis666
December 26th, 2014, 09:18 AM
Just add 21600 (6 hours in seconds) to variable 87, you can even use event scripts.

For forcing to the player pass the time until it reach into a certain time, there serveral ways, three examples (the first is the worst) that make the player going into 6:00:00 PM (both are doable with events, but I use scripts for better performance).

hour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
while (timeNow.hour != hour &&
timeNow.min != min &&
timeNow.sec != sec)
$game_variables[87]+=1
timeNow = pbGetTimeNow
endhour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
secInDay = 60*60*24
timeDifference = Time.new(
timeNow.year, timeNow.mon, timeNow.day,
hour, min, sec)
timeDifference += secInDay # Add a day
secondsAdded = (timeDifference-timeNow)%secInDay
$game_variables[87]+=secondsAddedhour = 18 # 0..23
min = 0
sec = 0
timeNow = pbGetTimeNow
secInDay = 60*60*24
secNow = pbGetTimeNow.hour*60*60+pbGetTimeNow.min*60+pbGetTimeNow.sec
secWished = hour*60*60+min*60+sec
timeDifference += secInDay # Add a day
secondsAdded = secWished-secNow
secondsAdded +=secInDay if secondsAdded<0
$game_variables[87]+=secondsAddedAll untested.


Thanks! I used to make work the time pass in a Pokecenter meanwhile, basicly when you heal your Pokemon in a Pokecenter, one hour pass per Pokemon in your team (If you have 2 poke, 2 hours pass, etc) Anyways these script will help me alot since I try so many things to skip to a specific time and none of them work.

Thanks again FL and sorry for my bad english

mcscottyg
June 17th, 2015, 10:44 AM
When you say paste this script above main, do you mean make a new script above main, or paste this within the main script?

----
June 17th, 2015, 11:30 AM
When you say paste this script above main, do you mean make a new script above main, or paste this within the main script?

Above. Never ever ever ever paste anything in to Main.

mcscottyg
June 17th, 2015, 12:45 PM
Thanks :) got it working well now

FL
June 24th, 2015, 02:19 PM
When you say paste this script above main, do you mean make a new script above main, or paste this within the main script?Make a new script above main, but both actually work.