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, 1905 times downloaded)

Demo (1.32 MB, 460 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                                
TimeZowned

Creator: GaryCXJk

Release date: 2013-06-17

Last updated: 2013-06-17

Downloads: 1905

License: Creative Commons Attribution 4.0 International Public License

Optional compatibility:

  • CXJ - Savedata Extender v1.01+