Você está na página 1de 10

#==============================================================================

# Fases do dia | v1.0.1 | por Brandt


#
# para RPG Maker VX Ace
#------------------------------------------------------------------------------
# O script cria um sistema de dia e noite baseando-se no hor�rio do computador.
# Conforme o hor�rio for atingindo os n�meros definidos nas configura��es, o
# tom da tela muda para o tom definido para o hor�rio. O tom da tela muda
# gradualmente, interpolando entre os tons de cada per�odo do dia.
#==============================================================================
#==============================================================================
# Features
#------------------------------------------------------------------------------
# - Configur�vel: � poss�vel criar quantos per�odos do dia quanto desejado,
# al�m de atribuir uma dura��o espec�fica para cada um;
#
# - Intera��o com o Khas Awesome Light Effects: Os scripts s�o compat�veis!
# Basta que o script do Khas esteja presente no projeto que esse se ajusta
# automaticamente para usar fun��es compat�veis;
#
# - Amig�vel a eventos: O script permite alterar valores de vari�veis e
# switches do jogo conforme os per�odos do dia acontecem.
#==============================================================================
#==============================================================================
# Modo de uso
#------------------------------------------------------------------------------
# S� configure o script, logo abaixo, e t� tudo certo.
# Em alguns casos, pode ser interessante fixar o per�odo do dia (ou ignorar o
# per�odo) em alguns mapas (dungeons, interiores, ...). Para isso, adicione �s
# notas do mapa o seguinte:
#
# <notime>
#
# Ou, para fixar o mapa em um per�odo:
#
# <time: ...>
#
# Trocando o "..." pelo nome do per�odo, configurado no script.
# Mai�sculas e min�sculas e espa�os em branco n�o fazem diferen�a.
#==============================================================================
($modules ||= {})[:day_and_night] = "1.0.1"
#==============================================================================
# ** Configura��es
#==============================================================================
module DayAndNight
#--------------------------------------------------------------------------
# * Modo de c�lculo do tempo
#
# Valores poss�veis:
# :computer ~> Usa o rel�gio do computador
# :game ~> Usa um rel�gio interno do jogo
#--------------------------------------------------------------------------
TIME_MODE = :game
#--------------------------------------------------------------------------
# * Multiplicador de tempo no jogo
#
# Ignore a menos que esteja usando TIME_MODE = :game
#--------------------------------------------------------------------------
TIME_MULTIPLIER = 60*60
#--------------------------------------------------------------------------
# * Atraso em frames da transi��o entre os per�odos.
# Serve para evitar mudan�as demasiado bruscas entre as tonalidades da
# tela.
#--------------------------------------------------------------------------
PERIOD_TRANSITION_DELAY = 60
#--------------------------------------------------------------------------
# * ID da vari�vel do jogo que recebe a hora atual, seja no rel�gio interno
# do jogo ou no do computador. (0 = Nenhuma)
#--------------------------------------------------------------------------
HOUR_VARIABLE_ID = 0
#--------------------------------------------------------------------------
# * Per�odos
#
# Cada per�odo � composto, primariamente, por um nome identificador, uma
# hora de in�cio, seguindo o sistema 24h, e uma tonalidade para a tela.
# Tamb�m � poss�vel configurar uma switch para ser ativada enquanto o
# per�odo estiver em efeito.
# Os per�odos n�o precisam estar em ordem.
#
# Para adicionar novos per�odos, copie um dos existentes e modifique os
# valores. Note que, mesmo se dois per�odos tiverem o mesmo hor�rio,
# apenas um deles ser� ativado por vez.
#--------------------------------------------------------------------------
PERIODS = {
#----------------------------------------------------------------------
# Nascer do Sol
#----------------------------------------------------------------------
sunrise: {
# Hora de in�cio
start: 6,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [-110, -110, -110],

# Switch que ativa


switch: 16
},
#----------------------------------------------------------------------
# Manh�
#----------------------------------------------------------------------
morning: {
# Hora de in�cio
start: 7,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [0, -5, -50],

# Switch que ativa


switch: 17
},
#----------------------------------------------------------------------
# Meio-Dia
#----------------------------------------------------------------------
noon: {
# Hora de in�cio
start: 12,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [0, 0, 0],

# Switch que ativa


switch: 18
},
#----------------------------------------------------------------------
# Tarde
#----------------------------------------------------------------------
afternoon: {
# Hora de in�cio
start: 16,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [0, -30, -55],

# Switch que ativa


switch: 19
},
#----------------------------------------------------------------------
# P�r do Sol
#----------------------------------------------------------------------
sunset: {
# Hora de in�cio
start: 18,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [-100, -130, -155],

# Switch que ativa


switch: 20
},
#----------------------------------------------------------------------
# Noite
#----------------------------------------------------------------------
night: {
# Hora de in�cio
start: 19,

# Tonalidade da tela (Vermelho, Verde, Azul[, Cinza])


tone: [-175, -175, -125],

# Switch que ativa


switch: 21
},
}
#==============================================================================
# ** Fim das Configura��es
#------------------------------------------------------------------------------
# Daqui pra baixo, � festa. N�o � recomendado mexer nessa parte, a menos que se
# saiba bem o que est� fazendo.
#==============================================================================
module_function
#--------------------------------------------------------------------------
# * Obt�m uma lista com os nomes de cada per�odo configurado no script,
# em ordem de hor�rio
#--------------------------------------------------------------------------
def periods
return PERIODS.keys.sort_by do |k|
PERIODS[k][:hour]
end
end
#--------------------------------------------------------------------------
# * Obt�m o en�simo per�odo, por ordem de hor�rio
#--------------------------------------------------------------------------
def nth_period(n)
return periods[n] || raise("Per�odo do dia ##{n} n�o encontrado")
end
#--------------------------------------------------------------------------
# * Obt�m uma informa��o de determinado per�odo pelo nome ou pelo �ndice
# period : Nome ou �ndice do per�odo
# info : Chave de informa��o na configura��o do script
#--------------------------------------------------------------------------
def period_info(period, info)
period = nth_period(period) if period.is_a?(Integer)
return PERIODS[period][info]
end
private :period_info
#--------------------------------------------------------------------------
# * Obt�m o tom da tela para determinado per�odo
# period : Nome do per�odo na configura��o do script
#--------------------------------------------------------------------------
def tone(period)
return Tone.new(0, 0, 0, 0) if period.nil?
return Tone.new(*period_info(period, :tone))
end
#--------------------------------------------------------------------------
# * Obt�m o hor�rio de in�cio de determinado per�odo
# period : Nome do per�odo na configura��o do script
#--------------------------------------------------------------------------
def hour(period)
period_info(period, :start)
end
#--------------------------------------------------------------------------
# * Obt�m a switch ativada por determinado per�odo
# period : Nome do per�odo na configura��o do script
#--------------------------------------------------------------------------
def switch(period)
period_info(period, :switch)
end
#--------------------------------------------------------------------------
# * Determina se deve usar o rel�gio do computador com o script
#--------------------------------------------------------------------------
def real_time?
case TIME_MODE
when :computer
return true
when :game
return false
else
raise 'Fases do dia: Configura��o inv�lida em `TIME_MODE`'
end
end
end
#==============================================================================
# ** Game_Clock
#------------------------------------------------------------------------------
# Esta classe gerencia o rel�gio interno do jogo. Serve apenas para quando a
# configura��o TIME_MODE for igual a :game
#==============================================================================
class Game_Clock
#--------------------------------------------------------------------------
# * Vari�veis p�blicas
#--------------------------------------------------------------------------
attr_reader :time # Tempo decorrido desde o in�cio do jogo
attr_reader :period # Per�odo do dia atual
#--------------------------------------------------------------------------
# * Inicializa��o do objeto
#--------------------------------------------------------------------------
def initialize
initialize_time
initialize_period
end
#--------------------------------------------------------------------------
# * Inicializa o contador de tempo do rel�gio
#--------------------------------------------------------------------------
def initialize_time
if DayAndNight.real_time?
@time = Time.now
else
@creation_time = Time.now
@time = Time.at(12*60*60)
end
end
#--------------------------------------------------------------------------
# * Inicializa a vari�vel de controle do per�odo atual
#--------------------------------------------------------------------------
def initialize_period
@period = -1

DayAndNight.periods.each_with_index do |period, i|
break if DayAndNight.hour(period) > @time.hour
@period = i
end
end
#--------------------------------------------------------------------------
# * Serializa��o do objeto
#--------------------------------------------------------------------------
def marshal_dump
[@time, @period]
end
#--------------------------------------------------------------------------
# * Desserializa��o do objeto
# data : Dados lidos do arquivo
#--------------------------------------------------------------------------
def marshal_load(data)
@time, @period = data

if DayAndNight.real_time?
@time = Time.now
else
@creation_time = Time.now
end
end
#--------------------------------------------------------------------------
# * Atualiza o rel�gio do jogo e a vari�vel ligada a ele
#--------------------------------------------------------------------------
def update
update_time
update_period
update_game_variable unless DayAndNight::HOUR_VARIABLE_ID.zero?
end
#--------------------------------------------------------------------------
# * Atualiza o tempo do jogo
#--------------------------------------------------------------------------
def update_time
if DayAndNight.real_time?
@time = Time.now
else
delta = Time.now - @creation_time
@time = Time.at(delta.to_f * DayAndNight::TIME_MULTIPLIER)
end
end
#--------------------------------------------------------------------------
# * Atualiza a vari�vel do jogo que guarda a hora atual
#--------------------------------------------------------------------------
def update_game_variable
$game_variables[DayAndNight::HOUR_VARIABLE_ID] = @time.hour
end
#--------------------------------------------------------------------------
# * Pr�ximo per�odo do dia
#--------------------------------------------------------------------------
def next_period
(@period + 1) % DayAndNight.periods.size
end
#--------------------------------------------------------------------------
# * Determina se deveria trocar de per�odo
#--------------------------------------------------------------------------
def should_change_periods?
if next_period < @period
return false unless @time.hour < DayAndNight.hour(@period)
return @time.hour >= DayAndNight.hour(next_period)
end
return true if @time.hour < DayAndNight.hour(@period)
return @time.hour >= DayAndNight.hour(next_period)
end
#--------------------------------------------------------------------------
# * Determina o per�odo atual do dia usando o rel�gio
#--------------------------------------------------------------------------
def update_period
return unless should_change_periods?
update_game_switches
@period = next_period
end
#--------------------------------------------------------------------------
# * Atualiza as switches que identificam os per�odos do dia
#--------------------------------------------------------------------------
def update_game_switches
$game_switches[DayAndNight.switch(@period)] = false
$game_switches[DayAndNight.switch(next_period)] = true
end
end
#==============================================================================
# ** DataManager
#------------------------------------------------------------------------------
# Este m�dulo gerencia o jogo e objetos do banco de dados utilizados no jogo.
# Quase todas as vari�veis globais s�o inicializadas no m�dulo.
# Modificado para salvar no arquivo de Save do jogo o rel�gio interno usado
# para controlar o sistema de dia e noite.
#==============================================================================
class << DataManager
#--------------------------------------------------------------------------
# * Cria��o dos objetos do jogo
#--------------------------------------------------------------------------
alias day_and_night_create_game_objects create_game_objects
def create_game_objects(*args, &block)
day_and_night_create_game_objects(*args, &block)
$game_clock = Game_Clock.new
end
#--------------------------------------------------------------------------
# * Salvar a cria��o de conte�do
#--------------------------------------------------------------------------
alias day_and_night_make_save_contents make_save_contents
def make_save_contents(*args, &block)
contents = day_and_night_make_save_contents(*args, &block)
contents[:clock] = $game_clock
contents
end
#--------------------------------------------------------------------------
# * Extrair conte�do salvo
#--------------------------------------------------------------------------
alias day_and_night_extract_save_contents extract_save_contents
def extract_save_contents(contents, *args, &block)
day_and_night_extract_save_contents(contents, *args, &block)
$game_clock = contents[:clock]
end
end
#==============================================================================
# ** Color
#------------------------------------------------------------------------------
# Classe usada para representar uma cor.
# Modificada para possibilitar obter uma cor a partir de um Tone, necess�rio
# para compatibilidade com o Khas Awesome Light Effects
#==============================================================================
class << Color
#--------------------------------------------------------------------------
# * Cria uma cor a partir de um Tone
# tone : Tone a ser usado de refer�ncia para a cor
#--------------------------------------------------------------------------
def from_tone(tone)
red = 0
green = 0
blue = 0

if tone.red < 0
red += tone.red
green -= tone.red
blue -= tone.red
else
red += tone.red * 2
end

if tone.green < 0
red -= tone.green
green += tone.green
blue -= tone.green
else
green += tone.green * 2
end

if tone.blue < 0
red -= tone.blue
green -= tone.blue
blue += tone.blue
else
blue += tone.blue * 2
end

alpha = tone.red.abs + tone.green.abs + tone.blue.abs

return Color.new(red, green, blue, alpha)


end
end
#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
# Esta classe gerencia o mapa. Inclui fun��es de rolagem e defini��o de
# passagens. A inst�ncia desta classe � referenciada por $game_map.
# Modificado para expor as notas do mapa (Isso devia ser padr�o!!)
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# * Obt�m as notas do mapa
#--------------------------------------------------------------------------
def note
@map.note
end
end
#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# Esta classe reune os sprites da tela de mapa e tilesets. Esta classe �
# usada internamente pela classe Scene_Map.
# Modificada para atualizar a tonalidade da tela de acordo com o per�odo do
# dia. Na verdade, o ideal era modificar a Game_Map, mas assim n�o seria
# poss�vel utilizar o script junto do Khas Awesome Light Effects.
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# * Constantes (Express�es regulares)
#--------------------------------------------------------------------------
MAP_NOTIME_TAG = /<\s*no(?:\s*|-|_?)time\s*>/i
MAP_TIME_FIX_TAG = /<\s*time\s*(?:\:|=)\s*(?:\:)?(\S+)\s*>/i
#--------------------------------------------------------------------------
# * Inicializa��o do objeto
#--------------------------------------------------------------------------
alias day_and_night_initialize initialize
def initialize(*args, &block)
day_and_night_initialize(*args, &block)
refresh_period_tone
end
#--------------------------------------------------------------------------
# * Obt�m o per�odo atual do mapa
#--------------------------------------------------------------------------
def map_period
return nil if $game_map.note =~ MAP_NOTIME_TAG
if $game_map.note =~ MAP_TIME_FIX_TAG
period = $1.to_sym
unless DayAndNight.periods.include?(period)
map_id = $game_map.map_id
raise "Fases do dia: Per�odo inv�lido `#{period}` no mapa #{map_id}"
end
return period
end
return $game_clock.period
end
#--------------------------------------------------------------------------
# * Obt�m o Tone para o per�odo atual do mapa
#--------------------------------------------------------------------------
def map_tone
return DayAndNight.tone(map_period)
end
#--------------------------------------------------------------------------
# * Inicializa a tela com o tem do per�odo atual do dia
#--------------------------------------------------------------------------
def refresh_period_tone
if defined? $game_map.effect_surface
color = Color.from_tone(map_tone)
$game_map.effect_surface.set_color(color.red, color.green, color.blue)
$game_map.effect_surface.set_alpha(color.alpha)
else
$game_map.screen.start_tone_change(map_tone, 0)
end
end
#--------------------------------------------------------------------------
# * Atualiza��o da tela
#--------------------------------------------------------------------------
alias day_and_night_update update
def update(*args, &block)
update_period_tone
day_and_night_update(*args, &block)
end
#--------------------------------------------------------------------------
# * Atualiza o per�odo do dia
#--------------------------------------------------------------------------
def update_period_tone
return refresh_period_tone if @map_id != $game_map.map_id
return unless should_update_period_tone?

delay = DayAndNight::PERIOD_TRANSITION_DELAY

if defined? $game_map.effect_surface
color = Color.from_tone(map_tone)
r, g, b, a = color.red, color.green, color.blue, color.alpha
$game_map.effect_surface.change_color(delay, r, g, b, a)
else
$game_map.screen.start_tone_change(map_tone, delay)
end
end
#--------------------------------------------------------------------------
# * Determina se deveria atualizar o tom do per�odo
# Por padr�o, atualiza a cada 15 minutos
#--------------------------------------------------------------------------
def should_update_period_tone?
return @period != map_period
end
end
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# Esta classe executa o processamento da tela de mapa. Modificado para
# atualizar o rel�gio do jogo.
#==============================================================================
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# * Atualiza��o da tela
#--------------------------------------------------------------------------
alias day_and_night_update update
def update
day_and_night_update
$game_clock.update
end
end

Você também pode gostar