RPG Maker VX Ace
TimeZowned
Everybody loves real-time time progression, and most do that by adding a day-night cycle. Harder would be however to add a calendar system.
Now, this script doesn't add a day-night cycle or an actual calendar, but it does provide you with a framework to work with.
Download (48.69 kB, 2287 times downloaded)
Demo (1.32 MB, 529 times downloaded)
When left alone, TimeZowned will run at a set pace as long as the global variable $cxj_timezowned_running or a defined switch is enabled. The total amount of seconds passed since the start of a new game is stored in an array called $cxj_timezowned_time, and the amount of frames between each second is stored as an integer in $cxj_timezowned_frame.
The amount of seconds passed are stored in an array because this would allow for a very big amount of seconds, larger than even a 64-bit long could store. The smallest number is stored at index 0, with each being at most 999,999,999 long. So, if the amount of seconds is 122,333,444,455,555, then index 0 contains 444455555 while index 1 contains 122333.
This information is required when you're writing your own date format. There are five methods that zones use. The first method calculates the current date from the amount of seconds and the given data. The second converts this date to a readable string. The third calculates the current time, and the fourth converts the time to a readable string. Finally, the fifth method converts the date to a readable string using a format string.
This script already is preloaded with two sets of these methods. The first one emulates the Earth calendar without the leap years, the second does this with leap years. Use these as a reference for your own system, although you could always just fall back on the default.
When writing your own script, you are always free in your choice of output format, but do know that the second, fourth and fifth method (all three used to display the date and time in a readable format) are used in the text output.
To display the current date in a dialog, you can use either of the three text strings:
[[timezowned_date zone]] [[timezowned_time zone]] [[timezowned_datef zone format]]
The formatted date in the default scripts works similar to most other date formatting strings.
d - Day of the month, two digits with leading zeros D - Textual representation of the day of the week, three letters (Mon, Tue..) j - Day of the month, no leading zeros l - Full textual representation of the day of the week (Monday, Tuesday...) F - Full representation of the month (January, February...) m - Numeric representation of the month, two digits with leading zeros M - Short textual representation of the month, three letters (Jan, Feb...) n - Numeric representation of the month, no leading zeros Y - Year, four digits H - 24-hour format of the hour, two digits with leading zeros i - Minutes, two digits with leading zeros s - Seconds, two digits with leading zeros
This script adds aliases for several methods. If you are sure no method that is used by other scripts get overridden, you can place it anywhere, otherwise, make sure this script is loaded after any other script overriding these methods, otherwise this script stops working.
-
module DataManager
- self.create_game_objects
- self.make_save_header (Without Savedata Extender)
- self.make_save_contents (Without Savedata Extender)
- self.extract_save_contents (Without Savedata Extender)
-
class Window_Base
- convert_escape_characters
-
class Scene_Base
- update
#==============================================================================
#
# GaryCXJk - TimeZowned v1.00
# * Last Updated: 2013.06.17
# * Level: Hard
# * Requires: N/A
# * Optional: CXJ - Savedata Extender v1.01+
#
#==============================================================================
$imported = {} if $imported.nil?
$imported["CXJ-TimeZowned"] = "1.00"
#==============================================================================
#
# Changelog:
#
#------------------------------------------------------------------------------
# 2013.06.17 - v1.00
#
# * Initial release
#
#==============================================================================
#
# Everybody loves real-time time progression, and most do that by adding a
# day-night cycle. Harder would be however to add a calendar system.
#
# Now, this script doesn't add a day-night cycle or an actual calendar, but
# it does provide you with a framework to work with.
#
#==============================================================================
#
# Installation:
#
# Make sure to put this below Materials, but above Main Process.
#
# This script adds aliases for several methods. If you are sure no method that
# is used by other scripts get overridden, you can place it anywhere,
# otherwise, make sure this script is loaded after any other script overriding
# these methods, otherwise this script stops working.
#
#------------------------------------------------------------------------------
# Aliased methods:
#
# * module DataManager
# - self.create_game_objects
# - self.make_save_header (Without Savedata Extender)
# - self.make_save_contents (Without Savedata Extender)
# - self.extract_save_contents (Without Savedata Extender)
# * class Window_Base
# - convert_escape_characters
# * class Scene_Base
# - update
#
#==============================================================================
#
# Usage:
#
# When left alone, TimeZowned will run at a set pace as long as the global
# variable $cxj_timezowned_running or a defined switch is enabled. The total
# amount of seconds passed since the start of a new game is stored in an array
# called $cxj_timezowned_time, and the amount of frames between each second
# is stored as an integer in $cxj_timezowned_frame.
#
# The amount of seconds passed are stored in an array because this would allow
# for a very big amount of seconds, larger than even a 64-bit long could store.
# The smallest number is stored at index 0, with each being at most 999,999,999
# long. So, if the amount of seconds is 122,333,444,455,555, then index 0
# contains 444455555 while index 1 contains 122333.
#
# This information is required when you're writing your own date format. There
# are five methods that zones use. The first method calculates the current
# date from the amount of seconds and the given data. The second converts this
# date to a readable string. The third calculates the current time, and the
# fourth converts the time to a readable string. Finally, the fifth method
# converts the date to a readable string using a format string.
#
# This script already is preloaded with two sets of these methods. The first
# one emulates the Earth calendar without the leap years, the second does this
# with leap years. Use these as a reference for your own system, although you
# could always just fall back on the default.
#
# When writing your own script, you are always free in your choice of output
# format, but do know that the second, fourth and fifth method (all three
# used to display the date and time in a readable format) are used in the text
# output.
#
# To display the current date in a dialog, you can use either of the three
# text strings:
#
# [[timezowned_date zone]]
# [[timezowned_time zone]]
# [[timezowned_datef zone format]]
#
# The formatted date in the default scripts works similar to most other date
# formatting strings.
#
# d - Day of the month, two digits with leading zeros
# D - Textual representation of the day of the week, three letters (Mon, Tue..)
# j - Day of the month, no leading zeros
# l - Full textual representation of the day of the week (Monday, Tuesday...)
# F - Full representation of the month (January, February...)
# m - Numeric representation of the month, two digits with leading zeros
# M - Short textual representation of the month, three letters (Jan, Feb...)
# n - Numeric representation of the month, no leading zeros
# Y - Year, four digits
# H - 24-hour format of the hour, two digits with leading zeros
# i - Minutes, two digits with leading zeros
# s - Seconds, two digits with leading zeros
#
#==============================================================================
#
# License:
#
# Creative Commons Attribution 3.0 Unported
#
# The complete license can be read here:
# http://creativecommons.org/licenses/by/3.0/legalcode
#
# The license as it is described below can be read here:
# http://creativecommons.org/licenses/by/3.0/deed
#
# You are free:
#
# to Share — to copy, distribute and transmit the work
# to Remix — to adapt the work
# to make commercial use of the work
#
# Under the following conditions:
#
# Attribution — You must attribute the work in the manner specified by the
# author or licensor (but not in any way that suggests that they endorse you or
# your use of the work).
#
# With the understanding that:
#
# Waiver — Any of the above conditions can be waived if you get permission from
# the copyright holder.
#
# Public Domain — Where the work or any of its elements is in the public domain
# under applicable law, that status is in no way affected by the license.
#
# Other Rights — In no way are any of the following rights affected by the
# license:
#
# * Your fair dealing or fair use rights, or other applicable copyright
# exceptions and limitations;
# * The author's moral rights;
# * Rights other persons may have either in the work itself or in how the work
# is used, such as publicity or privacy rights.
#
# Notice — For any reuse or distribution, you must make clear to others the
# license terms of this work. The best way to do this is with a link to this
# web page.
#
#------------------------------------------------------------------------------
# Extra notes:
#
# Despite what the license tells you, I will not hunt down anybody who doesn't
# follow the license in regards to giving credits. However, as it is common
# courtesy to actually do give credits, it is recommended that you do.
#
# As I picked this license, you are free to share this script through any
# means, which includes hosting it on your own website, selling it on eBay and
# hang it in the bathroom as toilet paper. Well, not selling it on eBay, that's
# a dick move, but you are still free to redistribute the work.
#
# Yes, this license means that you can use it for both non-commercial as well
# as commercial software.
#
# You are free to pick the following names when you give credit:
#
# * GaryCXJk
# * Gary A.M. Kertopermono
# * G.A.M. Kertopermono
# * GARYCXJK
#
# Personally, when used in commercial games, I prefer you would use the second
# option. Not only will it actually give me more name recognition in real
# life, which also works well for my portfolio, it will also look more
# professional. Also, do note that I actually care about capitalization if you
# decide to use my username, meaning, capital C, capital X, capital J, lower
# case k. Yes, it might seem stupid, but it's one thing I absolutely care
# about.
#
# Finally, if you want my endorsement for your product, if it's good enough
# and I have the game in my possession, I might endorse it. Do note that if you
# give me the game for free, it will not affect my opinion of the game. It
# would be nice, but if I really did care for the game I'd actually purchase
# it. Remember, the best way to get any satisfaction is if you get people to
# purchase the game, so in a way, I prefer it if you don't actually give me
# a free copy.
#
# This script was originally hosted on:
# http://area91.multiverseworks.com
#
#==============================================================================
#
# The code below defines the settings of this script, and are there to be
# modified.
#
#==============================================================================
module CXJ
module TIMEZOWNED
#------------------------------------------------------------------------
# Basic settings.
#------------------------------------------------------------------------
TIME_RUNS_ON_NEW_GAME = true # Whether it will run on a new game
TIME_ON_MENU = false # Whether it will run on menus
TIME_DURING_BATTLE = true # Whether it will run during combat
# Switch ID that enables / disables TimeZowned (0 to use global variable)
TIME_SWITCH = 0
# The amount of seconds per real-life second.
TIME_PER_SECOND = 1
#------------------------------------------------------------------------
# Time zones
# These define the different zones of time. This however isn't
# restricted to actual time zones, you can define different types of
# date / time systems.
#
# Usage:
#
# :zone => [
# [:date, :display_date, :time, :display_time, :formatted_date]], data
# ]
#
# Data can be of any type, as you yourself need to define what the type
# is in your own methods. Also, if you aren't planning on using a certain
# method or that method isn't implemented, you should set it to nil.
#------------------------------------------------------------------------
ZONES = {
:default=> [[:date_default, :disp_date_default, :time_default, :disp_time_default, :disp_datef_default], [1970, 1, 1, 0, 0, 0, :thu, :EARTH_MONTHS, :EARTH_DAYS]],
:earth => [[:date_earth, :disp_date_earth, :time_earth, :disp_time_earth, :disp_datef_earth], [1970, 1, 1, 0, 0, 0, :thu]],
:bttf2 => [[:date_earth, :disp_date_earth, :time_earth, :disp_time_earth, :disp_datef_earth], [2015, 10, 21, 12, 0, 0, :wed]],
}
#------------------------------------------------------------------------
# Use this module (CXJ::HT_CREDITS::METHODS) to add new methods.
#------------------------------------------------------------------------
module METHODS
EARTH_MONTHS = [
[31, :jan, "January", "Jan"],
[28, :feb, "February", "Feb"],
[31, :mar, "March", "Mar"],
[30, :apr, "April", "Apr"],
[31, :may, "May", "May"],
[30, :jun, "June", "Jun"],
[31, :jul, "July", "Jul"],
[31, :aug, "August", "Aug"],
[30, :sep, "September", "Sep"],
[31, :oct, "October", "Oct"],
[30, :nov, "November", "Nov"],
[31, :dec, "December", "Dec"]
]
EARTH_DAYS = [
[:mon, "Monday", "Mon"],
[:tue, "Tuesday", "Tue"],
[:wed, "Wednesday", "Wed"],
[:thu, "Thursday", "Thu"],
[:fri, "Friday", "Fri"],
[:sat, "Saturday", "Sat"],
[:sun, "Sunday", "Sun"]
]
#----------------------------------------------------------------------
# * Get the current date (Default)
#----------------------------------------------------------------------
def self.date_default(zone, base_data = nil, current_time = $cxj_timezowned_time)
if base_data.nil?
data = [1970, 1, 1, 0, 0, 0]
month_data = EARTH_MONTHS
else
data = [base_data[0], base_data[1], base_data[2], base_data[3], base_data[4], base_data[5]]
month_data = (base_data[7].nil? ? EARTH_MONTHS : const_get(base_data[7]))
end
data[1]-= 1
data[2]-= 1
total_days = 0
for i in 0..(month_data.size - 1)
total_days+= month_data[i][0]
end
#....................................................................
# Calculate the total amount of days passed.
#....................................................................
spd = 60 * 60 * 24
i = current_time.size - 1
num = 0
days = []
cur = current_time[i]
remainder = 0
while i >= 0
num+= cur / spd
days.unshift(num)
num = 0
remainder = cur % spd
i-= 1
break if i < 0
cur = current_time[i]
next if remainder == 0
maxval = 100000000
minval = 10
while cur / maxval + remainder * minval < spd
maxval/= 10
minval*= 10
end
num = ((cur / maxval + remainder * minval) / spd) * maxval
cur-= (cur / maxval) * maxval
end
while days[-1] == 0
days.pop
end
remsec = remainder
#....................................................................
# Calculate the total amount of years passed.
#....................................................................
dpy = spd * total_days
i = days.size - 1
num = 0
years = []
cur = days[i]
remainder = 0
while i>= 0
num+= cur / dpy
years.unshift(num)
num = 0
remainder = cur % dpy
i-= 1
break if i < 0
cur = days[i]
next if remainder == 0
maxval = 100000000
minval = 10
while cur / maxval + remainder * minval < dpy
maxval/= 10
minval*= 10
end
num = ((cur / maxval + remainder * minval) / dpy) * maxval
cur-= (cur / maxval) * maxval
end
while years[-1] == 0
years.pop
end
remdays = remainder
#....................................................................
# Calculate the current date.
#....................................................................
years[0] = 0 if years.empty?
date = [data[0] + years[0],data[1],data[2],data[3],data[4],data[5]]
remdays+= date[2]
date[2] = 0
while remdays > month_data[date[1]][0] - date[2]
remdays-= month_data[date[1]][0] - date[2]
date[1] += 1
date[2] = 0
if date[1] >= month_data.size
date[1]-= month_data.size
date[0]+= 1
end
end
date[2] = remdays
date[3] = date[3] + remsec / (60 * 60)
date[4] = date[4] + (remsec % 3600) / 60
date[5] = date[5] + remsec % 60
while date[5] >= 60
date[5]-= 60
date[4]+= 1
end
while date[4] >= 60
date[4]-= 60
date[3]+= 1
end
while date[3] >= 24
date[3]-= 24
date[2]+= 1
end
while date[2] >= month_data[date[1]][0]
date[2]-= month_data[date[1]][0]
date[1]+= 1
if date[1] >= month_data.size
date[1]-= month_data.size
date[0]+= 1
end
end
while date[1] >= month_data.size
date[1]-= month_data.size
date[0]+= 1
end
i = 0
years[0] = date[0]
while years[i] > 999999999
years[i]-= 999999999
years[i + 1] = 0 if years[i + 1].nil?
years[i + 1]+= 1
next if years[i] > 999999999
i+= 1
end
date[0] = years
date[1]+= 1
date[2]+= 1
return_date = {
:year => date[0],
:month => date[1],
:day => date[2],
:hour => date[3],
:minute => date[4],
:second => date[5]
}
end
#----------------------------------------------------------------------
# * Display the current date (Default)
#----------------------------------------------------------------------
def self.disp_date_default(zone, base_data = nil, current_time = $cxj_timezowned_time)
data = date_default(zone, base_data, current_time)
month_data = (base_data[7].nil? ? EARTH_MONTHS : const_get(base_data[7]))
years = data[:year]
str_y = ""
while !years.empty?
str_y+= sprintf((str_y.empty? ? "%d" : "%09d"), years.pop)
end
str_year = ""
if(str_y.size > 4)
str_year = str_y[0, str_y.size % 3] if str_y.size % 3 != 0
for i in 0..str_y.size / 3 - 1
str_year+= "," if !str_year.empty?
str_year+= str_y[str_y.size % 3 + i * 3, 3]
end
else
str_year = str_y
end
str = sprintf("%s %d %s, %02d:%02d:%02d", month_data[data[:month] - 1][2], data[:day], str_year, data[:hour], data[:minute], data[:second])
str
end
#----------------------------------------------------------------------
# * Get the current time (Default)
#----------------------------------------------------------------------
def self.time_default(zone, base_data = nil, current_time = $cxj_timezowned_time)
if base_data == nil
data = [1970, 1, 1, 0, 0, 0]
else
data = [base_data[0], base_data[1], base_data[2], base_data[3], base_data[4], base_data[5]]
end
spd = 60 * 60 * 24
i = current_time.size - 1
cur = current_time[i]
remainder = 0
while i >= 0
remainder = cur % spd
i-= 1
next if remainder == 0
cur = current_time[i]
break if i < 0
maxval = 100000000
minval = 10
while (cur / maxval + remainder * minval) % spd >= minval
maxval/= 10
minval*= 10
end
cur = ((cur / maxval + remainder * minval) % spd) * maxval + cur % maxval
end
time = {
:hour => data[3],
:minute => data[4],
:second => data[5]
}
time[:hour] = time[:hour] + remainder / (60 * 60)
time[:minute] = time[:minute] + (remainder % 3600) / 60
time[:second] = time[:second] + remainder % 60
while time[:second] >= 60
time[:second]-= 60
time[:minute]+= 1
end
while time[:minute] >= 60
time[:minute]-= 60
time[:hour]+= 1
end
time[:hour] = time[:hour] % 24
return time
end
#----------------------------------------------------------------------
# * Display the current time (Default)
#----------------------------------------------------------------------
def self.disp_time_default(zone, base_data = nil, current_time = $cxj_timezowned_time)
data = time_default(zone, base_data, current_time)
str = sprintf("%02d:%02d:%02d", data[:hour], data[:minute], data[:second])
str
end
#----------------------------------------------------------------------
# * Display the current formatted date (Default)
# Does not implement everything.
#----------------------------------------------------------------------
def self.disp_datef_default(zone, format = "D, d M Y H:i:s", base_data = nil, current_time = $cxj_timezowned_time)
data = date_default(zone, base_data, current_time)
month_data = (base_data[7].nil? ? EARTH_MONTHS : const_get(base_data[7]))
day_data = (base_data[8].nil? ? EARTH_DAYS : const_get(base_data[8]))
str = ""
spw = 3600 * 24 * day_data.size
i = current_time.size - 1
cur = current_time[i]
remainder = 0
while i >= 0
remainder = cur % spw
i-= 1
next if remainder == 0
cur = current_time[i]
break if i < 0
maxval = 100000000
minval = 10
while (cur / maxval + remainder * minval) % spw>= minval
maxval/= 10
minval*= 10
end
cur = ((cur / maxval + remainder * minval) % spw) * maxval + cur % maxval
end
start_day = 0
for i in 0..(day_data.size - 1)
start_day = i if base_data[6] == day_data[i][0]
end
dayofweek = (remainder / (3600 * 24) + start_day) % day_data.size
full_year = ""
for j in 0..(data[:year].size - 1)
if data[:year].size > 1 && j == 0
full_year+= sprintf("%d", data[:year][j])
elsif data[:year].size == 1 && j == 0
full_year+= sprintf("%04d", data[:year][j])
else
full_year+= sprintf("%d09d", data[:year][j])
end
end
for i in 0..(format.size - 1)
case format[i,1]
when "d"
str+= sprintf("%02d", data[:day])
when "D"
str+= day_data[dayofweek][2]
when "j"
str+= sprintf("%d", data[:day])
when "l"
str+= day_data[dayofweek][1]
when "N"
str+= sprintf("%d", dayofweek + 1)
when "S"
if data[:day] % 10 == 1 && data[:day] != 11
str+= "st"
elsif data[:day] %10 == 2 && data[:day] !=12
str+= "nd"
elsif data[:day] %10 == 3 && data[:day] != 13
str+= "rd"
else
str+= "th"
end
when "w"
str+= sprintf("%d", (dayofweek + 1) % day_data.size)
when "z"
j = 0
month = data[:month]
day = data[:day]
dayofyear = 0
while j < month - 2
dayofyear+=month_data[j][0]
end
dayofyear+= day - 1
str+= sprintf("%d", dayofyear)
when "F"
str+= month_data[data[:month] - 1][2]
when "M"
str+= month_data[data[:month] - 1][3]
when "Y"
str+= full_year
when "y"
str+= full_year[-2, 2] if full_year.size >= 2
str+= full_year if full_year.size < 2
when "H"
str+= sprintf("%02d", data[:hour])
when "i"
str+= sprintf("%02d", data[:minute])
when "s"
str+= sprintf("%02d", data[:second])
else
str+= format[i,1]
end
end
str
end
#----------------------------------------------------------------------
# The following pieces of code tries to emulate the Earth time cycle,
# including leap years. The script itself has been specifically made
# with Earth leap years in mind. This means that even though it's
# very possible to adjust it to your own system, it would require quite
# some tinkering.
#
# If you aren't planning on using this code, you are free to remove it,
# given that you remove any references to these methods in the
# CXJ::TIMEZOWNED::ZONES constant.
#----------------------------------------------------------------------
#----------------------------------------------------------------------
# * Get the current date (Earth)
#----------------------------------------------------------------------
def self.date_earth(zone, base_data = nil, current_time = $cxj_timezowned_time)
if base_data.nil?
data = [1970, 1, 1, 0, 0, 0]
else
data = [base_data[0], base_data[1], base_data[2], base_data[3], base_data[4], base_data[5]]
end
data[1]-= 1
data[2]-= 1
#....................................................................
# Calculate the total amount of days passed.
#....................................................................
spd = 60 * 60 * 24
i = current_time.size - 1
num = 0
days = []
cur = current_time[i]
remainder = 0
while i >= 0
num+= cur / spd
days.unshift(num)
num = 0
remainder = cur % spd
i-= 1
break if i < 0
cur = current_time[i]
next if remainder == 0
maxval = 100000000
minval = 10
while cur / maxval + remainder * minval < spd
maxval/= 10
minval*= 10
end
num = ((cur / maxval + remainder * minval) / spd) * maxval
cur-= (cur / maxval) * maxval
end
while days[-1] == 0
days.pop
end
remsec = remainder
#....................................................................
# Calculate the amount of years.
#....................................................................
# First, calculate per four centuries.
#....................................................................
dpc = (365 * 4 + 1) * 25 - 1
dpfc = (dpc) * 4 + 1
i = days.size - 1
num = 0
fyears = []
cur = days[i]
remainder = 0
while i>= 0
num+= (cur / dpfc)
fyears.unshift(num)
remainder = cur % dpfc
i-= 1
break if i < 0
cur = days[i]
next if remainder == 0
maxval = 100000000
minval = 10
while cur / maxval + remainder * minval < dpfc
maxval/= 10
minval*= 10
end
num = ((cur / maxval + remainder * minval) / dpfc) * maxval
cur-= (cur / maxval) * maxval
end
while fyears[-1] == 0
fyears.pop
end
remdays = remainder
#....................................................................
# Convert to years.
#....................................................................
years = []
i = 0
oldrem = 0
while i < fyears.size
rem = ((fyears[i] / 1000000) * 4)
years.push((fyears[i] % 1000000) * 400 + (rem % 10) * 1000000 + oldrem)
oldrem = rem / 10
end
years.push(oldrem)
#....................................................................
# Centuries.
#....................................................................
while remdays >= dpc + ((data[0] + years[0] + 100) / 100 % 4 == 0 && ((data[0] + years[0] + 100) % 100 != 0 || data[1] > 2) ? 1 : 0)
remdays-= dpc + ((data[0] + years[0] + 100) / 100 % 4 == 0 && ((data[0] + years[0] + 100) % 100 != 0 || data[1] > 2) ? 1 : 0)
years[0] += 100
end
#....................................................................
# Every four years.
#....................................................................
dpfy = 365 * 4 + 1
while remdays >= dpfy - (((data[0] + years[0] + 4) % 400 == 0 && data[1] > 2) || ((data[0] + years[0] + 4) % 100 == 0 && data[1] <= 2) ? 1 : 0)
remdays-= dpfy - (((data[0] + years[0] + 4) % 400 == 0 && data[1] > 2) || ((data[0] + years[0] + 4) % 100 == 0 && data[1] <= 2) ? 1 : 0)
years[0] += 4
end
#....................................................................
# Years.
#....................................................................
while remdays >= 365 + ((data[1] >= 2 && (data[0] + years[0] + 1) % 4 == 0 && ((data[0] + years[0] + 1) % 100 != 0 || (data[0] + years[0] + 1) % 400 == 0)) || (data[1] < 2 && (data[0] + years[0]) % 4 == 0 && ((data[0] + years[0]) % 100 != 0 || (data[0] + years[0]) % 400 == 0)) ? 1 : 0)
remdays-= 365 + ((data[1] >= 2 && (data[0] + years[0] + 1) % 4 == 0 && ((data[0] + years[0] + 1) % 100 != 0 || (data[0] + years[0] + 1) % 400 == 0)) || (data[1] < 2 && (data[0] + years[0]) % 4 == 0 && ((data[0] + years[0]) % 100 != 0 || (data[0] + years[0]) % 400 == 0)) ? 1 : 0)
years[0] += 1
end
#....................................................................
# Calculate the current date.
#....................................................................
date = [data[0] + years[0],data[1],data[2],data[3],data[4],data[5]]
remdays+= date[2]
date[2] = 0
while remdays > EARTH_MONTHS[date[1]][0] - date[2] + (date[1] == 2 && date[0] % 4 == 0 && (date[0] % 100 != 0 || date[0] % 400 == 0) ? 1 : 0)
remdays-= EARTH_MONTHS[date[1]][0] - (date[1] == 2 && date[0] % 4 == 0 && (date[0] % 100 != 0 || date[0] % 400 == 0) ? 1 : 0)
date[1] += 1
date[2] = 0
if date[1] >= 12
date[1]-= 12
date[0]+= 1
end
end
date[2] = remdays
date[3] = date[3] + remsec / (60 * 60)
date[4] = date[4] + (remsec % 3600) / 60
date[5] = date[5] + remsec % 60
while date[5] >= 60
date[5]-= 60
date[4]+= 1
end
while date[4] >= 60
date[4]-= 60
date[3]+= 1
end
while date[3] >= 24
date[3]-= 24
date[2]+= 1
end
while date[2] >= EARTH_MONTHS[date[1]][0] + (date[1] == 2 && date[0] % 4 == 0 && (date[0] % 100 != 0 || date[0] % 400 == 0) ? 1 : 0)
date[2]-= EARTH_MONTHS[date[1]][0] + (date[1] == 2 && date[0] % 4 == 0 && (date[0] % 100 != 0 || date[0] % 400 == 0) ? 1 : 0)
date[1]+= 1
end
while date[1] >= 12
date[1]-= 12
date[0]+= 1
end
i = 0
years[0] = date[0]
while years[i] > 999999999
years[i]-= 999999999
years[i + 1] = 0 if years[i + 1].nil?
years[i + 1]+= 1
next if years[i] > 999999999
i+= 1
end
date[0] = years
date[1]+= 1
date[2]+= 1
return_date = {
:year => date[0],
:month => date[1],
:day => date[2],
:hour => date[3],
:minute => date[4],
:second => date[5]
}
return return_date
end
#----------------------------------------------------------------------
# * Display the current date (Earth)
#----------------------------------------------------------------------
def self.disp_date_earth(zone, data = nil, current_time = $cxj_timezowned_time)
data = date_earth(zone, data, current_time)
years = data[:year]
str_y = ""
while !years.empty?
str_y+= sprintf((str_y.empty? ? "%d" : "%09d"), years.pop)
end
str_year = ""
if(str_y.size > 4)
str_year = str_y[0, str_y.size % 3] if str_y.size % 3 != 0
for i in 0..str_y.size / 3 - 1
str_year+= "," if !str_year.empty?
str_year+= str_y[str_y.size % 3 + i * 3, 3]
end
else
str_year = str_y
end
str = sprintf("%s %d %s, %02d:%02d:%02d", EARTH_MONTHS[data[:month] - 1][2], data[:day], str_year, data[:hour], data[:minute], data[:second])
str
end
#----------------------------------------------------------------------
# * Get the current time (Earth)
#----------------------------------------------------------------------
def self.time_earth(zone, data = nil, current_time = $cxj_timezowned_time)
if data == nil
data = [1970, 1, 1, 0, 0, 0]
end
spd = 60 * 60 * 24
i = current_time.size - 1
cur = current_time[i]
remainder = 0
while i >= 0
remainder = cur % spd
i-= 1
next if remainder == 0
cur = current_time[i]
break if i < 0
maxval = 100000000
minval = 10
while (cur / maxval + remainder * minval) % spd >= minval
maxval/= 10
minval*= 10
end
cur = ((cur / maxval + remainder * minval) % spd) * maxval + cur % maxval
end
time = {
:hour => data[3],
:minute => data[4],
:second => data[5]
}
time[:hour] = time[:hour] + remainder / (60 * 60)
time[:minute] = time[:minute] + (remainder % 3600) / 60
time[:second] = time[:second] + remainder % 60
while time[:second] >= 60
time[:second]-= 60
time[:minute]+= 1
end
while time[:minute] >= 60
time[:minute]-= 60
time[:hour]+= 1
end
time[:hour] = time[:hour] % 24
return time
end
#----------------------------------------------------------------------
# * Display the current time (Earth)
#----------------------------------------------------------------------
def self.disp_time_earth(zone, data = nil, current_time = $cxj_timezowned_time)
data = time_earth(zone, data, current_time)
str = sprintf("%02d:%02d:%02d", data[:hour], data[:minute], data[:second])
str
end
#----------------------------------------------------------------------
# * Display the current formatted date (Earth)
# Does not implement everything.
#----------------------------------------------------------------------
def self.disp_datef_earth(zone, format = "D, d M Y H:i:s", base_data = nil, current_time = $cxj_timezowned_time)
data = date_earth(zone, base_data, current_time)
str = ""
leap = (data[:year][0] % 4 == 0 && (data[:year][0] % 100 != 0 || data[:year][0] % 400 == 0) ? 1 : 0)
spw = 3600 * 24 * 7
i = current_time.size - 1
cur = current_time[i]
remainder = 0
while i >= 0
remainder = cur % spw
i-= 1
next if remainder == 0
cur = current_time[i]
break if i < 0
maxval = 100000000
minval = 10
while (cur / maxval + remainder * minval) % spw>= minval
maxval/= 10
minval*= 10
end
cur = ((cur / maxval + remainder * minval) % spw) * maxval + cur % maxval
end
start_day = 0
for i in 0..(EARTH_DAYS.size - 1)
start_day = i if base_data[6] == EARTH_DAYS[i][0]
end
dayofweek = (remainder / (3600 * 24) + start_day) % 7
full_year = ""
for j in 0..(data[:year].size - 1)
if data[:year].size > 1 && j == 0
full_year+= sprintf("%d", data[:year][j])
elsif data[:year].size == 1 && j == 0
full_year+= sprintf("%04d", data[:year][j])
else
full_year+= sprintf("%d09d", data[:year][j])
end
end
for i in 0..(format.size - 1)
case format[i,1]
when "d"
str+= sprintf("%02d", data[:day])
when "D"
str+= EARTH_DAYS[dayofweek][2]
when "j"
str+= sprintf("%d", data[:day])
when "l"
str+= EARTH_DAYS[dayofweek][1]
when "N"
str+= sprintf("%d", dayofweek + 1)
when "S"
if data[:day] % 10 == 1 && data[:day] != 11
str+= "st"
elsif data[:day] %10 == 2 && data[:day] !=12
str+= "nd"
elsif data[:day] %10 == 3 && data[:day] != 13
str+= "rd"
else
str+= "th"
end
when "w"
str+= sprintf("%d", (dayofweek + 1) % 7)
when "z"
j = 0
month = data[:month]
day = data[:day]
dayofyear = 0
while j < month - 2
dayofyear+=EARTH_MONTHS[j][0]
dayofyear+=1 if j == 1 && leap == 1
end
dayofyear+= day - 1
str+= sprintf("%d", dayofyear)
when "F"
str+= EARTH_MONTHS[data[:month] - 1][2]
when "M"
str+= EARTH_MONTHS[data[:month] - 1][3]
when "L"
str+= sprintf("%d", leap)
when "Y"
str+= full_year
when "y"
str+= full_year[-2, 2] if full_year.size >= 2
str+= full_year if full_year.size < 2
when "H"
str+= sprintf("%02d", data[:hour])
when "i"
str+= sprintf("%02d", data[:minute])
when "s"
str+= sprintf("%02d", data[:second])
else
str+= format[i,1]
end
end
str
end
end
end
end
#==============================================================================
#
# The code below should not be altered unless you know what you're doing.
#
#==============================================================================
module CXJ
module TIMEZOWNED
#------------------------------------------------------------------------
# * TimeZowned save handler
#------------------------------------------------------------------------
def self.timezowned_saver
data = {}
data[:timezowned_time] = $cxj_timezowned_time
data[:timezowned_frame] = $cxj_timezowned_frame
data[:timezowned_running] = $cxj_timezowned_running
return data
end
#------------------------------------------------------------------------
# * TimeZowned load handler
#------------------------------------------------------------------------
def self.timezowned_loader(data)
$cxj_timezowned_time = data[:timezowned_time]
$cxj_timezowned_frame = data[:timezowned_frame]
$cxj_timezowned_running = data[:timezowned_running]
end
#------------------------------------------------------------------------
# * Increase time by a certain amount of frames
#------------------------------------------------------------------------
def self.increase(amount = 1, frame_increase = false)
if amount == 0
return
end
if frame_increase == true
$cxj_timezowned_frame+= amount
amount = 0
while !(0..(Graphics.frame_rate - 1)).include?($cxj_timezowned_frame)
if $cxj_timezowned_frame < 0
amount-= 1 * CXJ::TIMEZOWNED::TIME_PER_SECOND
$cxj_timezowned_frame += Graphics.frame_rate
end
if $cxj_timezowned_frame > Graphics.frame_rate - 1
amount+= 1 * CXJ::TIMEZOWNED::TIME_PER_SECOND
$cxj_timezowned_frame -= Graphics.frame_rate
end
end
end
$cxj_timezowned_time[0] += amount
i = 0
while !(0..999999999).include?($cxj_timezowned_time[i])
mod = 0
while $cxj_timezowned_time[i] < 0
$cxj_timezowned_time[i]+= 1000000000
mod-= 1
end
while $cxj_timezowned_time[i] > 999999999
$cxj_timezowned_time[i]-= 1000000000
mod+= 1
end
i+= 1
if i >= $cxj_timezowned_time.size
if mod < 0
$cxj_timezowned_time = [0]
else
$cxj_timezowned_time[i] = mod
end
end
end
while $cxj_timezowned_time.size > 1 && $cxj_timezowned_time[-1] == 0
$cxj_timezowned_time.pop
end
end
#------------------------------------------------------------------------
# * Get the current date of a certain timezone
#------------------------------------------------------------------------
def self.get_date(sym, type = 0)
zone = CXJ::TIMEZOWNED::ZONES[sym]
return nil if zone.nil?
data = nil
data = zone[1]
return nil if(zone[0].nil?)
return nil if(zone[0][type].nil?)
return CXJ::TIMEZOWNED::METHODS.method(zone[0][type]).call(sym, data)
end
#------------------------------------------------------------------------
# * Get the current date of a certain timezone, formatted
#------------------------------------------------------------------------
def self.get_datef(sym, format = "D, d M Y H:i:s")
zone = CXJ::TIMEZOWNED::ZONES[sym]
return nil if zone.nil?
data = nil
data = zone[1]
return nil if(zone[0].nil?)
return nil if(zone[0][4].nil?)
return CXJ::TIMEZOWNED::METHODS.method(zone[0][4]).call(sym, format, data)
end
#------------------------------------------------------------------------
# * Bind save and load handlers
#------------------------------------------------------------------------
if($imported["CXJ-SavedataExtender"])
CXJ::SAVEDATA_EXTENDER::add_save_handler(self.method(:timezowned_saver), true, true)
CXJ::SAVEDATA_EXTENDER::add_load_handler(self.method(:timezowned_loader))
end
end
end
#==============================================================================
# ** DataManager
#------------------------------------------------------------------------------
# This module manages the database and game objects. Almost all of the
# global variables used by the game are initialized by this module.
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# * Alias: Create Save Header
#--------------------------------------------------------------------------
class << self
datamanager_create_game_objects_cxj_tz = instance_method(:create_game_objects)
define_method :create_game_objects do
$cxj_timezowned_time = [0]
$cxj_timezowned_frame = 0
$cxj_timezowned_running = CXJ::TIMEZOWNED::TIME_RUNS_ON_NEW_GAME
datamanager_create_game_objects_cxj_tz.bind(self).call
$game_switches[CXJ::TIMEZOWNED::TIME_SWITCH] = CXJ::TIMEZOWNED::TIME_RUNS_ON_NEW_GAME if CXJ::TIMEZOWNED::TIME_SWITCH > 0
end
end
#--------------------------------------------------------------------------
# Savedata Extender compatibility
#--------------------------------------------------------------------------
if(!$imported["CXJ-SavedataExtender"])
#------------------------------------------------------------------------
# * Alias: Create Save Header
#------------------------------------------------------------------------
class << self
datamanager_make_save_header_cxj_tz = instance_method(:make_save_header)
define_method :make_save_header do
header = datamanager_make_save_header_cxj_tz.bind(self).call
data = CXJ::TIMEZOWNED.timezowned_saver
data.each {|key, value|
header[key]= value
}
header
end
#----------------------------------------------------------------------
# * Alias: Create Save Contents
#----------------------------------------------------------------------
datamanager_make_save_contents_cxj_tz = instance_method(:make_save_contents)
define_method :make_save_contents do
contents = datamanager_make_save_contents_cxj_tz.bind(self).call
data = CXJ::TIMEZOWNED.timezowned_saver
data.each {|key, value|
contents[key]= value
}
contents
end
#----------------------------------------------------------------------
# * Alias: Extract Save Contents
#----------------------------------------------------------------------
datamanager_extract_save_contents_cxj_tz = instance_method(:extract_save_contents)
define_method :extract_save_contents do|contents|
datamanager_extract_save_contents_cxj_tz.bind(self).call(contents)
CXJ::TIMEZOWNED.timezowned_loader(contents)
end
end
end
end
#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
# This is a super class of all windows within the game.
#==============================================================================
class Window_Base < Window
#--------------------------------------------------------------------------
# * Alias: Preconvert Control Characters
# As a rule, replace only what will be changed into text strings before
# starting actual drawing. The character "\" is replaced with the escape
# character (\e).
#--------------------------------------------------------------------------
window_base_convert_escape_characters_cxj_tz = instance_method(:convert_escape_characters)
define_method :convert_escape_characters do |text|
result = window_base_convert_escape_characters_cxj_tz.bind(self).call(text)
result = timezowned_convert_escape_characters(result)
return result
end
#--------------------------------------------------------------------------
# * New: Adds new text commands for TimeZowned.
#--------------------------------------------------------------------------
def timezowned_convert_escape_characters(result)
result.gsub!(/\[\[timezowned_date (\w+)\]\]/i) { CXJ::TIMEZOWNED.get_date($1.to_sym, 1) }
result.gsub!(/\[\[timezowned_time (\w+)\]\]/i) { CXJ::TIMEZOWNED.get_date($1.to_sym, 3) }
result.gsub!(/\[\[timezowned_datef (\w+) (.*?)\]\]/i) { CXJ::TIMEZOWNED.get_datef($1.to_sym, $2) }
return result
end
end
#==============================================================================
# ** Scene_Base
#------------------------------------------------------------------------------
# This is a super class of all scenes within the game.
#==============================================================================
class Scene_Base
#--------------------------------------------------------------------------
# * Alias: Frame Update
#--------------------------------------------------------------------------
scene_base_update_cxj_tz = instance_method(:update)
define_method :update do
update_timezowned
scene_base_update_cxj_tz.bind(self).call
end
#--------------------------------------------------------------------------
# * New: Updates TimeZowned
#--------------------------------------------------------------------------
def update_timezowned
return if !timezowned_enabled
return if (CXJ::TIMEZOWNED::TIME_SWITCH == 0 && !$cxj_timezowned_running) || (CXJ::TIMEZOWNED::TIME_SWITCH > 0 && !$game_switches[CXJ::TIMEZOWNED::TIME_SWITCH])
CXJ::TIMEZOWNED.increase(1, true)
end
#--------------------------------------------------------------------------
# * New: Determines if TimeZowned should be enabled for this screen
#--------------------------------------------------------------------------
def timezowned_enabled
return false
end
end
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs the map screen processing.
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# * New: Determines if TimeZowned should be enabled for this screen
#--------------------------------------------------------------------------
def timezowned_enabled
return true
end
end
#==============================================================================
# ** Scene_MenuBase
#------------------------------------------------------------------------------
# This class performs basic processing related to the menu screen.
#==============================================================================
class Scene_MenuBase < Scene_Base
#--------------------------------------------------------------------------
# * New: Determines if TimeZowned should be enabled for this screen
#--------------------------------------------------------------------------
def timezowned_enabled
return CXJ::TIMEZOWNED::TIME_ON_MENU
end
end
#==============================================================================
# ** Scene_Battle
#------------------------------------------------------------------------------
# This class performs battle screen processing.
#==============================================================================
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# * New: Determines if TimeZowned should be enabled for this screen
#--------------------------------------------------------------------------
def timezowned_enabled
return CXJ::TIMEZOWNED::TIME_DURING_BATTLE
end
end

