Kylock's Time Script
#1
Kylock's Time Script v1.3 *22 October 2006


This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given. If you are the owner of the thread, please contact administration.


My first publicly released script! Now with 3 revisions.

*Release notes are now in the header of the script.

Features - "Just the facts ma'am"
Everything is in the header of the script. You probably know by now, it started as a basic thing, and evolved from feature requests. There is probably tons more to come.

I wanted my time system to be a bit more complicated, but not so much as other time systems out there. I guess I just have never before written a script on my own, but just have done modifications to others, and after seeing the simplicity of mikah's recently posted time system, I was inspired!

Anyway, I've read all the comments before, people want variable output so they can easily tie events to their time system, and a pause/cutscene feature, and other things.

I also wanted to make a time system that just did the time, and not be overly complicated to the point that it becomes what could be called an Environment System (see Near's ATS). Anyway, if you want just the time, there are options to easily disable the variable output and automatic tinting.

This is my first script (that I've publicly released) so I'd very greatly appreciate feedback and problems.

Thanks.

PLEASE NOTE THIS WILL NOT WORK WITH EXISTING SAVES - YOU MUST START A NEW GAME
The reason for this is that to have the ability to pause time, change time, etc.. requires the ability to save the time-related information to the game savefile. Sorry, but that's just how it is. If you absolutely require the ability to use this script without that functionality, delete the Classes: Scene_Save and Scene_Load from the bottom of the script. I warn you though that if you make custom changes to your time after doing this, your clock will be very VERY off when you re-load your game.


Code:
#==============================================================================
# Kylock's Time System
#==============================================================================
# Kylock
# Version 1.3
# 10-22-2006
#------------------------------------------------------------------------------
# Based in small parts from Dubealex's ATS and VERY small parts of
# mikah's Time Day/Night System.
#==============================================================================
# What it does!
#   Game Time will be displayed in the Play Time window.
#   Current day will be displayed in the Steps Window
#
# Script assumes 1m=60s 1h=60m 1d=24h
# If you use game variables, hours are stored in the 24-hr format
# Also note that time CANNOT be controlled by setting the variables, they are
#   updated(constantly) only.
#==============================================================================
# To adjust game time from the game (commands identical to Dube's ATS):
#     "Script: $kts.hours(5)"  <- Advances time by 5 hours
#     "Script: $kts.hours(-5)" <- Rewinds time by 5 hours
# Available clock adjustment methods:
#  $kts.stop        - Stops time (can be used for cutscenes)
#  $kts.go          - Resumes Time (if time is not stopped, no effect)
#  $kts.sec(n) - skips secs # Note that while the clock still appears to run
#  $kts.min(n) - skips nims # after $kts.stop, when you execute $kts.go, it will
#  $kts.hours(n)-skips hrs  # revert to the time when it was stopped.
#  $kts.days(n) - skips days
#  $kts.inn_rest(n) - Advances the clock FORWARD to time specified (use 24-hour notation)
#    Example: It's 06:08 => $kts.inn_rest(7) => Time is now 07:00 same day
#    Example: It's 06:08 => $kts.inn_rest(6) => Time is now 06:00 the next day
#    Could be used for anything, but practically limited to immediate 24 hours.
#    .inn_rest may also cause a couple seconds of lag when used on slower
#    systems.
#==============================================================================
# Default varialbes for time output:
# Variables: [1] Clock Seconds
#            [2] Clock Minutes
#            [3] Clock Hours
#            [4] Clock Days
#            [5] Day Name (for events based on day of week)
# To control screen tinting, place [*] in the name of your outdoor maps.  This
# will enable tinting.
#==============================================================================
# Release Notes:
#
#   1.3 - Several bugs related to the auto-tinting feature have been fixed
#           thanks to the dilliget whining- er I mean bug reporting of
#           Mike Portnoy on the rmxp.org forums. =P
#
#   1.2 - Modified the tint code so that there would be smoother tinting during
#           transitions from indoor to outdoor[*] areas and vice versa.  You
#           will no longer see situations where you see the normal tone, then
#           a quick switch to the outdoor tone.  It's much smoother and less
#           jittery looking now.
#       - Added global variable $kts_current_tone that stores the current tone
#           formatted as: Tone.new(x,x,x,x) This is useful for setting the tone
#           for pictures and sprites in outdoor areas for uniformity purposes.
#       - Fixed a bug that completely killed event driven tinting when indoors.
#
#   1.1 - Removed dependancy on a game switch to determine indoor/outdoor area
#           status.  Now you simply have to add "[*]" to the name of outdoor
#           areas.
#
#   1.0 - Original release.
#==============================================================================

$data_map = load_data("Data/MapInfos.rxdata")

class Kylock_Time
  
  #========================
  # Configuration Settings
  #========================
  def initialize
    @start_clock = 1         # in hours (24-hr format) - First hour of your game
    @start_day = 0           # in days                 - First day of your game
    @clock_speed = 30        # in frames (default: 30) - 0 = real time
    @clock_ampm = false      # time display setting: true = 12 hr clock

    #===========================
    # Script-controlled Tinting
    #===========================
    # To use auto-tinting, place "[*]" in tht name of your outdoors maps.
    # Example: "Outdoors[*]" will get tinting, but "Outdoors" or
    # "Outdoors[BLAH]" will not.
    $tint_during_battle = true      # If set to false, battles will have no tint
                                    # may slightly reduce battle lag
    
    @t1 = [0, 4]   # Early Morning  # Sets time periods for tinting effects
    @t2 = [5, 11]  # Morning        # [Start Hour, End Hour] for time period
    @t3 = [12, 18] # Day            # Use 24-hour values for time periods
    @t4 = [19, 22] # Evening
    @t5 = [23, 24] # Night          # <- Ex: Night is between 23:00 and 24:00

    @c1 = [-187, -119, -17, 68, 20] # Defines tints to be used in time periods
    @c2 = [17, -51, -102, 0, 20]    # defined above.
    @c3 = [0, 0, 0, 0, 20]          # [Red, Green, Blue, Grey, Time(in frames)]
    @c4 = [-68, -136, -34, 0, 20]  
    @c5 = [-187, -119, -17, 68, 20]

    #==========================================
    # If you want custom day names, edit away!
    #==========================================
    @day_name = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
    
    #====================================
    # Time System: Game Variable Options
    #====================================
    @use_vars = true      # assign time to game play variables
    @sec_var = 1          # Variable to which to store Seconds
    @min_var = 2          # Variable to which to store Minutes
    @hr_var = 3   # Variable to which to store Hours (stored using 24-hr format)
    @day_var = 4          # Variable to which to store Days
    @weekday_var = 5      # Variable to which to store Name of the Day
    
    #==============================================
    # Used for time adjustments called from events
    #==============================================
    @game_time_offset = (@start_clock * 3600) + (@start_day * 86400)
    $kts_tint_update_pause = false
  end

  #========================
  #  End of Configuration
  #========================

  def update
    # Calculate total number of seconds
    @total_seconds = (Graphics.frame_count / (Graphics.frame_rate - @clock_speed)) + @game_time_offset
    
    # Calculate seconds, minutes, hours and days
    total_minutes = @total_seconds / 60
    total_hours = @total_seconds / 3600
    @total_days =  @total_seconds / 86400
    @clock_seconds = @total_seconds % 60
    @clock_minutes = total_minutes % 60
    @clock_hours = total_hours % 24

    # Update Game Variables if used
    if @use_vars
      $game_variables[@sec_var] = @clock_seconds
      $game_variables[@min_var] = @clock_minutes
      $game_variables[@hr_var] = @clock_hours
      $game_variables[@day_var] = @clock_days
      $game_variables[@weekday_var] = today_name
    end
  end

  def update_tint
    #updates screen tinting
    if $data_map[$game_map.map_id].outside_tint? and $kts_tint_update_pause == false
      if @clock_hours >= @t1[0] and @clock_hours <= @t1[1]
        $game_screen.start_tone_change(Tone.new(@c1[0],@c1[1],@c1[2],@c1[3]),@c1[4])
        $kts_current_tone = Tone.new(@c1[0],@c1[1],@c1[2],@c1[3])
      elsif @clock_hours >= @t2[0] and @clock_hours <= @t2[1]
        $game_screen.start_tone_change(Tone.new(@c2[0],@c2[1],@c2[2],@c2[3]),@c2[4])
        $kts_current_tone = Tone.new(@c2[0],@c2[1],@c2[2],@c2[3])
      elsif @clock_hours >= @t3[0] and @clock_hours <= @t3[1]
        $game_screen.start_tone_change(Tone.new(@c3[0],@c3[1],@c3[2],@c3[3]),@c3[4])
        $kts_current_tone = Tone.new(@c3[0],@c3[1],@c3[2],@c3[3])
      elsif @clock_hours >= @t4[0] and @clock_hours <= @t4[1]
        $game_screen.start_tone_change(Tone.new(@c4[0],@c4[1],@c4[2],@c4[3]),@c4[4])
        $kts_current_tone = Tone.new(@c4[0],@c4[1],@c4[2],@c4[3])
      elsif @clock_hours >= @t5[0] and @clock_hours <= @t5[1]
        $game_screen.start_tone_change(Tone.new(@c5[0],@c5[1],@c5[2],@c5[3]),@c5[4])
        $kts_current_tone = Tone.new(@c5[0],@c5[1],@c5[2],@c5[3])
      end
    else
      $kts_current_tone = Tone.new(0,0,0,0)
    end
  end
  
  def instant_tint
    #updates screen tinting
    if $data_map[$game_map.map_id].outside_tint? and $kts_tint_update_pause == false
      $kts_manual_tone = false
      if @clock_hours >= @t1[0] and @clock_hours <= @t1[1]
        $game_screen.start_tone_change(Tone.new(@c1[0],@c1[1],@c1[2],@c1[3]),0)
        $kts_current_tone = Tone.new(@c1[0],@c1[1],@c1[2],@c1[3])
      elsif @clock_hours >= @t2[0] and @clock_hours <= @t2[1]
        $game_screen.start_tone_change(Tone.new(@c2[0],@c2[1],@c2[2],@c2[3]),0)
        $kts_current_tone = Tone.new(@c2[0],@c2[1],@c2[2],@c2[3])
      elsif @clock_hours >= @t3[0] and @clock_hours <= @t3[1]
        $game_screen.start_tone_change(Tone.new(@c3[0],@c3[1],@c3[2],@c3[3]),0)
        $kts_current_tone = Tone.new(@c3[0],@c3[1],@c3[2],@c3[3])
      elsif @clock_hours >= @t4[0] and @clock_hours <= @t4[1]
        $game_screen.start_tone_change(Tone.new(@c4[0],@c4[1],@c4[2],@c4[3]),0)
        $kts_current_tone = Tone.new(@c4[0],@c4[1],@c4[2],@c4[3])
      elsif @clock_hours >= @t5[0] and @clock_hours <= @t5[1]
        $game_screen.start_tone_change(Tone.new(@c5[0],@c5[1],@c5[2],@c5[3]),0)
        $kts_current_tone = Tone.new(@c5[0],@c5[1],@c5[2],@c5[3])
      end
    else
      if $kts_manual_tone == false
        $game_screen.start_tone_change(Tone.new(0,0,0,0),0)
        $kts_current_tone = Tone.new(0,0,0,0)
      end
    end
  end

  # Returns the name of the current day  
  def today_name
    weekday = (@total_days % @day_name.length)
    return @day_name[weekday]
  end
  
  # Returns the number of the current day
  def game_days
    return @total_days.to_s
  end
  
  # Formats the time string  
  def time
    if @clock_ampm
      # Formats 12-hour clock
      if @clock_hours > 12
        clock_hours_ampm = @clock_hours - 12
        if clock_hours_ampm > 9
          time = sprintf("%02d:%02d" + " PM", clock_hours_ampm, @clock_minutes)
        else
          time = sprintf("%01d:%02d" + " PM", clock_hours_ampm, @clock_minutes)
        end
        return time
      else
        if @clock_hours > 9
          time = sprintf("%02d:%02d" + " AM", @clock_hours, @clock_minutes)
        else
          time = sprintf("%01d:%02d" + " AM", @clock_hours, @clock_minutes)
        end
        return time
      end
    else
      # Formats 24-hour clock
      time = sprintf("%02d:%02d" + " ", @clock_hours, @clock_minutes)
      return time
    end
  end
  
  # Manual clock adjustment methods  
  def stop
    #capture stopping point
    @time_stopped = @total_seconds
  end

  def go
    #determine time passage while time was stopped and compensate using offset
    @total_seconds = (Graphics.frame_count / (Graphics.frame_rate - @clock_speed)) + @game_time_offset
    @game_time_offset -= @total_seconds - @time_stopped
  end

  def sec(sec = 0)
    @game_time_offest += sec
  end
  
  def min(min = 0)
    @game_time_offset += min * 60
  end
  
  def hours(hours = 0)
    @game_time_offset += hours * 3600
  end  
  
  def days(days = 0)
    @game_time_offset += days * 86400
  end
  
  def inn_rest(inn_time = 0)
    while @clock_hours != inn_time
      @game_time_offset += 1
      total_seconds = (Graphics.frame_count / (Graphics.frame_rate - @clock_speed)) + (@start_clock * 3600) + (@start_day * 86400) + @game_time_offset
      @clock_hours = total_seconds / 3600 % 24
    end
  end
end

class Interpreter
  #--------------------------------------------------------------------------
  # * Change Screen Color Tone
  #--------------------------------------------------------------------------
  alias kts_Interpreter_command_223 command_223
  def command_223
    $kts_manual_tone = true
    kts_Interpreter_command_223
  end
end

#==============================================================================
#  Creates the kylock_time object
#==============================================================================
class Scene_Title
  $kts=Kylock_Time.new
end  

#==============================================================================
#  Updates the clock using Game_System
#==============================================================================
class Game_System
  alias kts_game_system_update update
  def update      
    kts_game_system_update
    $kts.update
  end  
end

#==============================================================================
#  Initializes new map tinting using Game_Map
#==============================================================================
class Game_Map
  alias kts_game_map_setup setup
  def setup(map_id)
    kts_game_map_setup(map_id)
    $kts.update
    $kts.instant_tint
  end  
end

#==============================================================================
#  Updates screen tinting using Scene_Map
#==============================================================================
class Scene_Map
  alias kts_scene_map_update update
  def update
    kts_scene_map_update
    $kts.update_tint
  end  
end
  
class Scene_Map
  alias kts_call_battle call_battle
  def call_battle
    if $tint_during_battle == false
      $kts_tint_update_pause = true
      $game_screen.start_tone_change(Tone.new(0,0,0,0),0)
    end
    kts_call_battle
  end
end

class Scene_Battle
  alias kts_battle_end battle_end
  def battle_end(result)
    $kts_tint_update_pause = false
    kts_battle_end(result)
  end
end

#==============================================================================
#  Scans Map Names for Tinting
#==============================================================================
class RPG::MapInfo
  def name # Definition prevents location scripts from reading anything within
    return @name.gsub(/\[.*\]/) {""} # brackets, including the brackets
  end
  def original_name
    return @name
  end
  def outside_tint?
    return @name.scan(/[\*]/).size > 0
  end
end

#==============================================================================
#  Changes the Play Time Window to Game Time!
#==============================================================================
class Window_PlayTime < Window_Base
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "Game Time")
    $kts.update
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 32, 120, 32, $kts.time, 2)
  end
end

#==============================================================================
#  Changes Steps Window to Day
#==============================================================================
class Window_Steps < Window_Base
  def refresh
    self.contents.clear
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 120, 32, "Day")
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, 120, 32, $kts.game_days, 2)
    self.contents.draw_text(4, 32, 120, 32, $kts.today_name, 2)
  end
end

#==============================================================================
#  Saves time to save game file
#==============================================================================
class Scene_Save
  alias kts_write_save_data write_save_data
  def write_save_data(file)
    kts_write_save_data(file)
    Marshal.dump($kts, file)
  end
end  

#==============================================================================
#  Loads time from save game file
#==============================================================================
class Scene_Load
  alias kts_read_save_data read_save_data
  def read_save_data(file)
    kts_read_save_data(file)
    $kts = Marshal.load(file)
  end
end
}


Possibly Related Threads…
Thread Author Replies Views Last Post
  Dynamic Weather and Time System ThallionDarkshine 0 2,849 05-25-2012, 01:00 PM
Last Post: ThallionDarkshine
  SP drain/increase over time Cavi 0 2,788 05-20-2011, 01:00 PM
Last Post: Cavi
  Emotion Script Ánemus 0 2,542 08-29-2008, 01:00 PM
Last Post: Ánemus
  Beran's iPod script Sniper308 0 3,008 08-09-2008, 01:00 PM
Last Post: Sniper308
  NeoABS & NeoSABS ()enemy processes script azrith001 0 2,706 04-04-2008, 01:00 PM
Last Post: azrith001
  Blur Effect Script Hadriel 0 2,953 01-30-2008, 01:00 PM
Last Post: Hadriel
  Warp Script Sheol 0 2,874 12-28-2007, 01:00 PM
Last Post: Sheol
  AIM Script Pack vgvgf 0 3,192 09-13-2007, 01:00 PM
Last Post: vgvgf
  Audio Encryption Script InfiniteSpawn 0 2,579 05-09-2007, 01:00 PM
Last Post: InfiniteSpawn
  Credits Script Remake avatarmonkeykirby 0 2,590 03-10-2007, 01:00 PM
Last Post: avatarmonkeykirby



Users browsing this thread: 1 Guest(s)