[설명]
Kylock 씨가 만든 시간 (밤낮전환) 스크립트에 달력 날짜 계산 및 표시 기능을 추가한 스크립트입니다.
원본 스크립트는 Kylock's Time System VX 1.5 인데 Kylock 씨가 귀찮다고 연도 및 날짜 계산 기능을 넣지 않아서 제가 추가해봤습니다.
아울러 Sojabird씨의 변수표시 HUD 스크립트를 개조해 결합시킴으로써 달력을 화면 오른쪽 상단부에 표시시킬수 있게 했습니다.
(스위치 30번을 키면 달력도 켜짐)
Kylock의 원본 스크립트 중 윗 부분을 부분 한글화 하고 날짜 및 시간 표시를 한국식으로 바꾸었으니 해당설명을 참고하시기 바랍니다.
그 외에도 초기 시작 요일을 변경하고 시작 연월일을 지정하는 등 몇가지 기능을 첨가했습니다.
오류나 호환성에 문제가 생기면 댓글로 연락주시기 바랍니다.
스크린샷
스크립트
#==============================================================================
# ■ Kylock's Time System VX 1.5(6.3.2008) + Calendar Mode (2009/2/14 by RMdude: RMdude@hotmail.com)
# Kylock 시간(밤낮) 시스템 VX 1.5 + RMdude 달력 모드 시스템
# Calendar Mode Version : BETA 1.00
#------------------------------------------------------------------------------
# Original Kylock's Time System VX 1.5 Script by: Kylock
# Calendar modification by: RMdude
# [Note] This script is created by combining and modifying Kylock's Time system and
# Sojabird's ten variables HUD script. I would keep Kylock's nots on script.
# However, Sojabird's script has been extensively modified to fit the purpose
# I also changed some variables so that you can also use Sojabird's script
#
# 원본 KTS VX 1.5 스크립트 제작: Kylock
# 달력 모드 업그레이드: RMDude
# [알림] 이 스크립트는 Kylock의 Kylock's Time System Script 와 Sojabird 의 변수 표시 HUD
# 스크립트를 결합, 변형시켜 제작한 것입니다.
#
#==============================================================================
# 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. If you use a custom
# script that makes changes to the battle background, place KTS below it so
# that you don't get the delayed-tone effect in you battles. 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.
# 1.4 - Fixed Battle Test compatibility (simulates normal daylight for battle
# test instead of darkness).
# Now switches and variables will only update when the map loads so that
# events don't suddenly dissappear when their time is up.
# Added $kts_anti_tone - returns an inverse tone color to allow sprites
# to appear normally on a tinted screen.
# 1.5 - Rewrote the regexp that finds the [KTS] in the map name. Hopefully
# this resolves the wrong maps being tinted problem.
#==============================================================================
# ● 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.
# 맵 이름에 [KTS]라고 들어가야만 밤낮 전환기능이 적용됩니다.
#==============================================================================
# ● 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 n초 만큼 진행
# ● $kts.min(n) - progresses time forward (n) minutes n분 만큼 진행
# ● $kts.hours(n) - progresses time forward (n) hours n시간 만큼 진행
# ● $kts.days(n) - progresses time forward (n) days n일 만큼 진행
# ● $kts.jump_to_hour(n) - progresses time forward TO the specified hour.
# n 시로 이동
# 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
#-----------------------------------------------------------------------
# 현실 시간보다 몇배 빨리 타이머가 돌아갈 것인지 지정합니다.
SPEED = 5000
#AMPM (True: 12시간 시스템(오전 오후 구분), False: 24시간 시스템)
AMPM = true
# 시작시 날짜와 시간 지정
START_HOUR = 1
START_DAY = 1
# designate number of days for each month 각 달의 일수
JAN = 31
FEB =28
MAR = 31
APR = 30
MAY = 31
JUN = 30
JUL = 31
AUG = 31
SEP = 30
OCT = 31
NOV = 30
DEC = 31
MON1 = JAN
MON2 = MON1 + FEB
MON3 = MON2 + MAR
MON4 = MON3 + APR
MON5 = MON4 + MAY
MON6 = MON5 + JUN
MON7 = MON6 + JUL
MON8 = MON7 + AUG
MON9 = MON8 + SEP
MON10 = MON9 + OCT
MON11 = MON10 + NOV
YRDY = MON11 + DEC
WKOS = 0 # 요일 보정. 0으로 하면 일요일로 시작. 1식 더하면 각각 월화수목금토
STYR =2009 # 시작하는 연도
STMON = 2 # 시작 하는 달
STDAY = 14 # 시작하는 일
HUD_SWITCH = 30 # 달력 표시 스위치번호
FILE = "Window" # 윈도우 스타일 파일이름 지정
#표시 위치
X_PLACEMENT = 2 # 왼쪽=1, 오른쪽=2
Y_PLACEMENT = 1 # 위쪽=1, 가운데=2, 아래쪽=3
WIDTH = 180 # HUD 창의 너비
#-----------------------------------------------------------------------
# If you want custom day names, edit away!
#-----------------------------------------------------------------------
# 요일 이름
DAY_NAMES = ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"]
# 요일 약칭
DAY_ABR = ["(일)","(월)","(화)","(수)","(목)","(금)","(토)"]
#-----------------------------------------------------------------------
# Settings for Time Periods
#-----------------------------------------------------------------------
T1 = [ 0,5 ] # 밤 # Sets time periods for tinting effects
T2 = [ 6,8 ] # 새벽 # [Start Hour, End Hour] for time period
T3 = [ 9,18] # 일 # Use 24-hour values for time periods
T4 = [19,21] # 황혼
T5 = [22,24] # 저녁 # <- 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
CALDAYNAME = 7
CALENDARDAY = 8
CALENDARMONTH = 9
CALENDARYEAR = 10
DATE = 11
# 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)
# Defines anti-tones
A1 = Tone.new( 187, 119, 17, -68)
A2 = Tone.new( -17, 51, 102, 0)
A3 = Tone.new( 0, 0, 0, 0)
A4 = Tone.new( 68, 136, 34, 0)
A5 = 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
$kts_anti_tone = Tone.new(0,0,0,0)
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)
# Calculate past days before game
@psday = KTS::STYR*365 + KTS::STDAY - KTS::START_DAY
if KTS::STMON == 2
@psday += KTS::MON1
elsif KTS::STMON ==3
@psday += KTS::MON2
elsif KTS::STMON == 4
@psday += KTS::MON3
elsif KTS::STMON == 5
@psday += KTS::MON4
elsif KTS::STMON == 6
@psday += KTS::MON5
elsif KTS::STMON == 7
@psday += KTS::MON6
elsif KTS::STMON == 8
@psday += KTS::MON7
elsif KTS::STMON == 9
@psday += KTS::MON8
elsif KTS::STMON == 10
@psday += KTS::MON9
elsif KTS::STMON == 11
@psday += KTS::MON10
elsif KTS::STMON == 12
@psday += KTS::MON11
else
@psday += 0
end
# calculate calendar
@yearday = @days + @psday
@yearday %= KTS::YRDY
@calendaryear = @days + @psday - @yearday
@calendaryear /= KTS::YRDY
if @yearday > KTS::MON11
@calendarmonth = 12
@calendarday = @yearday - KTS::MON11
elsif @yearday > KTS::MON10
@calendarmonth = 11
@calendarday = @yearday - KTS::MON10
elsif @yearday > KTS::MON9
@calendarmonth = 10
@calendarday = @yearday - KTS::MON9
elsif @yearday > KTS::MON8
@calendarmonth = 9
@calendarday = @yearday - KTS::MON8
elsif @yearday > KTS::MON7
@calendarmonth = 8
@calendarday = @yearday - KTS::MON7
elsif @yearday > KTS::MON6
@calendarmonth = 7
@calendarday = @yearday - KTS::MON6
elsif @yearday > KTS::MON5
@calendarmonth = 6
@calendarday = @yearday - KTS::MON5
elsif @yearday > KTS::MON4
@calendarmonth = 5
@calendarday = @yearday - KTS::MON4
elsif @yearday > KTS::MON3
@calendarmonth = 4
@calendarday = @yearday - KTS::MON3
elsif @yearday > KTS::MON2
@calendarmonth = 3
@calendarday = @yearday - KTS::MON2
elsif @yearday > KTS::MON1
@calendarmonth = 2
@calendarday = @yearday - KTS::MON1
else
@calendarmonth = 1
@calendarday = @yearday
end
update_tint
if KTS::DATABASE_OUTPUT
$game_variables[KTS::TIME] = getTime
$game_variables [KTS::DATE] = getDate
$game_variables[KTS::CALDAYNAME] = getDayNamespr
$game_variables[KTS::DAYNAME] = getDayName
end
end
end
def update_variables
$game_variables[KTS::SECONDS] = @seconds
$game_variables[KTS::MINUTES] = @minutes
$game_variables[KTS::HOURS] = @hours
$game_variables[KTS::DAYS] = @days
$game_variables[KTS::CALENDARDAY] = @calendarday
$game_variables[KTS::CALENDARMONTH] = @calendarmonth
$game_variables[KTS::CALENDARYEAR] = @calendaryear
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분", hours1, @minutes)
else
time = sprintf("오후" + " %01d시 %02d분", hours1, @minutes)
end
else
if @hours > 9
time = sprintf("오전" + " %02d시 %02d분", @hours, @minutes)
else
time = sprintf("오전" + " %01d시 %02d분", @hours, @minutes)
end
end
return time
else
# Formats a 24-Hour Clock
time = sprintf("%02d시 %02d분", @hours, @minutes)
return time
end
end
def getDate
if @calendaryear >999
date = sprintf("%04d/%02d/%02d", @calendaryear, @calendarmonth, @calendarday )
elsif @calendaryear >99
date = sprintf("%03d/%02d/%02d", @calendaryear, @calendarmonth, @calendarday)
elsif @calendaryear >9
date = sprintf("%02d/%02d/%02d", @calendaryear, @calendarmonth, @calendarday)
else
date = sprintf("%01d/%02d/%02d", @calendaryear, @calendarmonth, @calendarday)
end
return date
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::WKOS - KTS::START_DAY
weekday %= KTS::DAY_NAMES.length
return KTS::DAY_NAMES[weekday]
end
def getDayNamespr
weekdayspr = @days + KTS::WKOS - KTS::START_DAY
weekdayspr %= KTS::DAY_NAMES.length
return KTS::DAY_ABR[weekdayspr]
end
#-----------------------------------------------------------------------
# Screen Tone Functions
#-----------------------------------------------------------------------
def update_tint(duration = KTS::FADE_LENGTH)
return if $BTEST
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)
$kts_anti_tone = KTS::A1
elsif @hours >= KTS::T2[0] and @hours <= KTS::T2[1]
@period = 2
screen.start_tone_change(KTS::C2,duration)
$kts_anti_tone = KTS::A2
elsif @hours >= KTS::T3[0] and @hours <= KTS::T3[1]
@period = 3
screen.start_tone_change(KTS::C3,duration)
$kts_anti_tone = KTS::A3
elsif @hours >= KTS::T4[0] and @hours <= KTS::T4[1]
@period = 4
screen.start_tone_change(KTS::C4,duration)
$kts_anti_tone = KTS::A4
elsif @hours >= KTS::T5[0] and @hours <= KTS::T5[1]
@period = 5
screen.start_tone_change(KTS::C5,duration)
$kts_anti_tone = KTS::A5
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
class Spriteset_Map
#--------------------------------------------------------------------------
# * Object Initialization
#--------------------------------------------------------------------------
alias kts_initialize initialize
def initialize
$kts.update_switches if !@kts_stop && KTS::DATABASE_OUTPUT
$kts.update_variables if !@kts_stop && KTS::DATABASE_OUTPUT
kts_initialize
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
# old regexp: 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
class Window_HUD_VARS < Window_Base
def initialize
super(0, 0, KTS::WIDTH, 80)
case KTS::X_PLACEMENT
when 1
self.x = 0
when 2
self.x = 544 - KTS::WIDTH
end
case KTS::Y_PLACEMENT
when 1
self.y = 0
when 2
self.y = 208-(80)/2
when 3
self.y = 416-(80)
end
self.windowskin = Cache.system(KTS::FILE)
self.visible = $game_switches[KTS::HUD_SWITCH]
refresh
end
def refresh
contents.clear
# get values
@v1 = $game_variables[KTS::DATE]
@v2 = $game_variables[KTS::TIME]
@v3 = $game_variables[KTS::CALDAYNAME]
# draw values
contents.draw_text(0, 0, contents.width - 0, WLH, @v1, 0)
contents.draw_text(0, 24, contents.width - 0, WLH, @v2, 2)
contents.draw_text(0, 0, contents.width - 0, WLH, @v3, 2)
end
def update
self.visible = $game_switches[KTS::HUD_SWITCH]
return if !self.visible
if @v1 != $game_variables[KTS::DATE] or
@v2 != $game_variables[KTS::TIME] or
@v3 != $game_variables[KTS::CALDAYNAME]
refresh
end
end
end
#------------------------------------------------------------
# * Scene_Map: Attach HUD to map
#------------------------------------------------------------
class Scene_Map < Scene_Base
alias soja_scemap_sta_hudv start
alias soja_scemap_ter_hudv terminate
alias soja_scemap_upd_hudv update
def start
soja_scemap_sta_hudv
@soj_hudv = Window_HUD_VARS.new
end
def terminate
@soj_hudv.dispose
soja_scemap_ter_hudv
end
def update
soja_scemap_upd_hudv
@soj_hudv.update
end
end