03-08-2008, 12:48 AM
(This post was last modified: 09-02-2024, 05:42 PM by DerVVulfman.)
Kylock's Time System VX 1.3
by Kylock
by Kylock
This script will track game time as well as automatically tint the screen for a day/night effect.
You can make events dependent on time thanks to game variable output support.
You can customize how dark you want it to be at what time.
You can designate certain maps as "outside" so they are the only ones that are dark at night! (Add [KTS] to map name.)
You can choose the speed of your game's clock.
Because the entire time system is an object, its possible to instance or have more than one game clock. PM me for details if you really need this functionality.
Detailed installation and script usage instructions are included in the script header, just like all my other scripts. The usage is VERY similar to the XP version that I wrote over a year ago - if you are familiar with it at all.
To answer a few question before they are asked:
- I am not including weeks, months and years because it gets too complicated when you have a different amount of days in each month for example. The primary intention of this script is to allow you to build your events based on hours in the day and time periods throughout the day. (Ex: The time-locked vault can only be opened between 2 and 3. or The guy with the password can only be found drinking in the bar at midnight.)
- The [KTS] that you put in your map names remains hidden to other scripts, like Map Name Popups and such.
- For script compatibility reasons, if you use a CMS, you might get better results if this script is located ABOVE your CMS. If you have a CMS and want a time window added to it, this is a really easy hack for any scripter, so please make a request in the appropriate Script Requests Forum.
- There are no screenshots because that would be pointless. You can define your own screen tones and there is an added window for time right above the gold window in the default menu. That's all there is, I promise!
Now, the script itself:
Script
Code:
#==============================================================================
# ? Kylock's Time System VX 1.3
# 10.5.2008
#------------------------------------------------------------------------------
# Script by: Kylock
#==============================================================================
# Mostly rewritten since XP version. Cleaner code and less intrusive (more
# compatible). This is my comprehensive time and day/night system. This
# script adds a new window to the game menu, so if you use a CMS, then place
# this script ABOVE it so that it won't mess up your CMS. Other than that,
# there shouldn't be any other script compatibility issues.
# I've tried to make this script as customizable as possible, the settings
# are found immediately following this header. Although time output to game
# variables is optional, I strongly suggest using it so that its easier to
# build your events based on the time in the game.
#==============================================================================
# ? Change Log
# 1.0 - Original Release.
# 1.1 - Corrected tinting issue at the start of a battle. Place this script
# below any battle background scripts if you experience "jumpy tinting"
# 1.2 - Corrected the accuracy of $kts.stop and $kts.go
# 1.3 - $kts.stop really stops everything now. Also added game switches for
# even easier eventing.
#==============================================================================
# ? Auto-tone Instructions
#------------------------------------------------------------------------------
# Maps designated as outdoors are the only maps to be affected by this
# scripts use of auto-toning. To signify a map to be "outdoors", you must
# include [KTS] In the name of the map. For example, you world map could be
# named "World Map [KTS]" or "[KTS] World Map". Provisions are made later in
# the script to remove [KTS] from the map name when it's read by another
# script. This means that "[KTS]" won't show up in your Map Name Popup
# windows.
#==============================================================================
# ? Script Function Calls
#------------------------------------------------------------------------------
# The following are script commands that can be executed by using the
# "Script..." command in your events.
# ? $kts.stop - Stops time (can be used for cutscenes)
# ? $kts.go - Resumes time (don't forget to use this!)
# ? $kts.sec(n) - progresses time forward (n) seconds
# ? $kts.min(n) - progresses time forward (n) minutes
# ? $kts.hours(n) - progresses time forward (n) hours
# ? $kts.days(n) - progresses time forward (n) days
# ? $kts.jump_to_hour(n) - progresses time forward TO the specified hour.
# Particularly useful in a situation where you
# want a certain event to happen at a certain time,
# or an Innkeeper who should wake the party up at
# a certain hour. This command MAY cause your game
# to appear to freeze for a few seconds on slower
# computers.
#==============================================================================
# ? Game Database Setup
#------------------------------------------------------------------------------
# This script, by defult, uses the following game variables and switches:
# Database Variables:
# [1] The Current Time [4] The Current Hour
# [2] The Current Second [5] The Current Day
# [3] The Current Minute [6] Name of the Current Day
# Database Switches
# [1] ON during night hours (2200-0400)(10pm-4am)
# [2] ON during dawn hours (0500-0800)( 5am-8am)
# [3] ON during daytime hours (0900-1800)( 9am-6pm)
# [4] ON during sunset hours (1900-2100)( 7pm-9pm)
#==============================================================================
#==============================================================================
# Stores variables and user defined settings for the time system.
#==============================================================================
module KTS
#-----------------------------------------------------------------------
# User Definable Clock Settings
#-----------------------------------------------------------------------
# Sets the speed multiplier of the clock. 1 is real time. A higher
# value will give you a faster clock. Default is 100.
SPEED = 100
#AMPM (True: 12-hour clock, False: 24-hour clock)
AMPM = false
# Sets the time at the start of your game.
START_HOUR = 0
START_DAY = 1
#-----------------------------------------------------------------------
# If you want custom day names, edit away!
#-----------------------------------------------------------------------
DAY_NAMES = ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]
#-----------------------------------------------------------------------
# Settings for Time Periods
#-----------------------------------------------------------------------
T1 = [ 0,5 ] # Night # Sets time periods for tinting effects
T2 = [ 6,8 ] # Dawn # [Start Hour, End Hour] for time period
T3 = [ 9,18] # Day # Use 24-hour values for time periods
T4 = [19,21] # Sunset
T5 = [22,24] # Night # <- Ex: Night is between 23:00 and 24:00
#-----------------------------------------------------------------------
# Settings for Output to Game Variables option.
#-----------------------------------------------------------------------
# Set this to true to output the current time to game variables.
DATABASE_OUTPUT = true
# Game Variable to be used for time output.
TIME = 1 #(Time in string format. Ex: "2:48 AM" or "02:48")
SECONDS = 2
MINUTES = 3
HOURS = 4
DAYS = 5
DAYNAME = 6
# Game Switches to be used for time output.
NIGHT = 1 # This switch is on during night hours (2200-0400)(10pm-4am)
DAWN = 2 # This switch is on during dawn hours (0500-0800)( 5am-8am)
DAY = 3 # This switch is on during daytime hours (0900-1800)( 9am-6pm)
SUNSET = 4 # This switch is on during sunset hours (1900-2100)( 7pm-9pm)
#-----------------------------------------------------------------------
# Settings for time controlled screen toning
#-----------------------------------------------------------------------
# True will enable screen toning to be used by the script.
USE_TONE = true
# Sets the duration of tone changes (in frames)
FADE_LENGTH = 120
# Defines tones to be used in the corresponding time periods defined above.
# RED, GREEN, BLUE, GREY
C1 = Tone.new(-187, -119, -17, 68)
C2 = Tone.new( 17, -51, -102, 0)
C3 = Tone.new( 0, 0, 0, 0)
C4 = Tone.new( -68, -136, -34, 0)
C5 = Tone.new(-187, -119, -17, 68)
end
#==============================================================================
# Core Time System Engine
#==============================================================================
class Kylock_Time_System
# sets instance variables
def initialize
$kts_map_data = load_data("Data/MapInfos.rvdata")
@event_offset = (KTS::START_HOUR * 3600) + (KTS::START_DAY * 86400)
@kts_stop = false
$kts_event_tone = false
$kts_battle_tone = true
end
# Computes current time and updates variables if used
def update
if !@kts_stop
@total_seconds = (Graphics.frame_count * KTS::SPEED / 60) + @event_offset
@seconds = (@total_seconds) % 60
@minutes = (@total_seconds / 60) % 60
@hours = (@total_seconds / 3600) % 24
@days = (@total_seconds / 86400)
update_tint
if KTS::DATABASE_OUTPUT
update_variables
update_switches
end
end
end
def update_variables
$game_variables[KTS::TIME] = getTime
$game_variables[KTS::SECONDS] = @seconds
$game_variables[KTS::MINUTES] = @minutes
$game_variables[KTS::HOURS] = @hours
$game_variables[KTS::DAYS] = @days
$game_variables[KTS::DAYNAME] = getDayName
end
def update_switches
if @period == 1 || @period == 5
$game_switches[KTS::NIGHT] = true
else
$game_switches[KTS::NIGHT] = false
end
if @period == 2
$game_switches[KTS::DAWN] = true
else
$game_switches[KTS::DAWN] = false
end
if @period == 3
$game_switches[KTS::DAY] = true
else
$game_switches[KTS::DAY] = false
end
if @period == 4
$game_switches[KTS::SUNSET] = true
else
$game_switches[KTS::SUNSET] = false
end
end
def getTime
if KTS::AMPM
# Formats a 12-Hour Clock
if @hours > 12
hours1 = @hours - 12
if hours1 > 9
time = sprintf("%02d:%02d" + " PM", hours1, @minutes)
else
time = sprintf("%01d:%02d" + " PM", hours1, @minutes)
end
else
if @hours > 9
time = sprintf("%02d:%02d" + " AM", @hours, @minutes)
else
time = sprintf("%01d:%02d" + " AM", @hours, @minutes)
end
end
return time
else
# Formats a 24-Hour Clock
time = sprintf("%02d:%02d", @hours, @minutes)
return time
end
end
#-----------------------------------------------------------------------
# Script Command Functions
#-----------------------------------------------------------------------
def stop
@time_stopped = @total_seconds
@kts_stop = true
end
def go
total_seconds = (Graphics.frame_count * KTS::SPEED / 60) + @event_offset
@event_offset -= (total_seconds - @time_stopped)
@kts_stop = false
end
def sec(sec = 0)
@event_offset += sec
end
def min(min = 0)
@event_offset += min * 60
end
def hours(hours = 0)
@event_offset += hours * 3600
end
def days(days = 0)
@event_offset += days * 86400
end
def jump_to_hour(jhour = 0)
while @hours != jhour
@event_offset += 1
$kts.update
end
end
#-----------------------------------------------------------------------
# Script Support/Misc Functions
#-----------------------------------------------------------------------
def getDayName
weekday = (@days % KTS::DAY_NAMES.length)
return KTS::DAY_NAMES[weekday]
end
#-----------------------------------------------------------------------
# Screen Tone Functions
#-----------------------------------------------------------------------
def update_tint(duration = KTS::FADE_LENGTH)
if KTS::USE_TONE && !$kts_event_tone && $kts_map_data[$game_map.map_id].outside_tint?
if @hours >= KTS::T1[0] and @hours <= KTS::T1[1]
@period = 1
screen.start_tone_change(KTS::C1,duration)
elsif @hours >= KTS::T2[0] and @hours <= KTS::T2[1]
@period = 2
screen.start_tone_change(KTS::C2,duration)
elsif @hours >= KTS::T3[0] and @hours <= KTS::T3[1]
@period = 3
screen.start_tone_change(KTS::C3,duration)
elsif @hours >= KTS::T4[0] and @hours <= KTS::T4[1]
@period = 4
screen.start_tone_change(KTS::C4,duration)
elsif @hours >= KTS::T5[0] and @hours <= KTS::T5[1]
@period = 5
screen.start_tone_change(KTS::C5,duration)
end
else
# no tone if indoors
if !$kts_map_data[$game_map.map_id].outside_tint?
screen.start_tone_change(Tone.new(0,0,0,0),duration)
end
end
end
def screen
if $game_temp.in_battle
return $game_troop.screen
else
return $game_map.screen
end
end
end
#==============================================================================
# Instantly updates screen tone when a new map is loaded.
#==============================================================================
class Game_Map
alias kts_setup setup
def setup(map_id)
kts_setup(map_id)
$kts_event_tone = false
$kts.update
$kts.update_tint(0)
end
end
#==============================================================================
# Instantly updates screen tone when a battle starts.
#==============================================================================
class Spriteset_Battle
alias kts_create_battleback create_battleback
def create_battleback
$kts.update_tint(0)
kts_create_battleback
end
end
#==============================================================================
# Temporarily disables auto-toning if an event tints the screen.
#==============================================================================
class Game_Interpreter
alias kts_Interpreter_command_223 command_223
def command_223
$kts_event_tone = true
kts_Interpreter_command_223
end
end
#==============================================================================
# Integrates the Time System into the Game System.
#==============================================================================
class Game_System
# inits a KTS object
alias kts_initialize initialize
def initialize
$kts=Kylock_Time_System.new
kts_initialize
end
# Updates kts every game frame
alias kts_update update
def update
$kts.update
kts_update
end
end
#==============================================================================
# Scans Map Names for Toning
#==============================================================================
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(/[\KTS]/).size > 0
end
end
#==============================================================================
# Sets up the time window for the menu.
#==============================================================================
class Window_KTS < Window_Base
def initialize(x, y)
super(x, y, 160, WLH + 32)
refresh
end
def refresh
self.contents.clear
self.contents.draw_text(4, -6, 120, 32, $kts.getTime, 2)
end
def update
super
$kts.update
self.contents.clear
self.contents.draw_text(4, -6, 120, 32, $kts.getTime, 2)
end
end
#==============================================================================
# Adds the time window to the menu.
#==============================================================================
class Scene_Menu < Scene_Base
alias kts_start start
def start
kts_start
@kts_window = Window_KTS.new(0,305)
end
alias kts_terminate terminate
def terminate
kts_terminate
@kts_window.dispose
end
alias kts_update update
def update
kts_update
@kts_window.update
end
end
#==============================================================================
# Saves and Loads game time to/from save game file.
#==============================================================================
class Scene_File
alias kts_write_save_data write_save_data
def write_save_data(file)
kts_write_save_data(file)
Marshal.dump($kts, file)
end
alias kts_read_save_data read_save_data
def read_save_data(file)
kts_read_save_data(file)
$kts = Marshal.load(file)
end
end
Sample Event
For my example, I'll make a set of events that only exist at night after 9pm and 5am.
First, make a common event that looks like this:
You'll notice that Switch 9 has to be on for this event to work, so you need to make sure that you turn it on before any important maps show up. So maybe turn on Switch 9 in your game opening sequence.
Now, for any event you want to show up only at night, all you have to do is this:
Piece of cake for any self-proclaimed eventers out there!
First, make a common event that looks like this:
You'll notice that Switch 9 has to be on for this event to work, so you need to make sure that you turn it on before any important maps show up. So maybe turn on Switch 9 in your game opening sequence.
Now, for any event you want to show up only at night, all you have to do is this:
Piece of cake for any self-proclaimed eventers out there!
I am open to requests not covered above.
Enjoy,
Kylock