10-22-2006, 01:00 PM
Kylock's Time Script v1.3 *22 October 2006
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.
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.
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