Eventos Temporales

Los eventos temporales permiten que ciertos eventos, NPCs o sucesos en tu juego aparezcan o se comporten de forma diferente según la hora del día, el día de la semana, la fecha o la estación del año. Pokémon Essentials usa el reloj del sistema para determinar el tiempo, lo que permite crear un mundo dinámico.

Apariencia Basada en la Hora del Día

Essentials divide el día en varios períodos que puedes usar para controlar eventos:

Período Horario Función de comprobación
Mañana 05:00 - 09:59 PBDayNight.isMorning?
Día 10:00 - 16:59 PBDayNight.isDay?
Tarde 17:00 - 19:59 PBDayNight.isEvening?
Noche 20:00 - 04:59 PBDayNight.isNight?

Ejemplo: NPC que solo aparece de noche

# Condición de página del evento en Script:
PBDayNight.isNight?

# Este NPC solo será visible y activo durante la noche

Ejemplo: Diálogo diferente según la hora

if PBDayNight.isMorning?
  pbMessage("¡Buenos días! ¡Qué bonita mañana!")
elsif PBDayNight.isDay?
  pbMessage("¡Buenas tardes! ¡Hace un día espléndido!")
elsif PBDayNight.isEvening?
  pbMessage("¡Buenas tardes! Ya está atardeciendo.")
else
  pbMessage("¡Buenas noches! Ten cuidado, hay Pokémon nocturnos por aquí.")
end

Eventos por Día de la Semana

Puedes hacer que eventos ocurran solo en ciertos días de la semana usando la función pbIsWeekday?:

# Comprobar si es un día específico
# 0=Domingo, 1=Lunes, 2=Martes, 3=Miércoles,
# 4=Jueves, 5=Viernes, 6=Sábado

pbIsWeekday?(5)   # ¿Es viernes?
pbIsWeekday?(0,6) # ¿Es fin de semana? (domingo o sábado)

Ejemplo: Mercado de los viernes

# Condición de página del evento:
pbIsWeekday?(5)

# Evento del vendedor especial de viernes
pbMessage("¡Bienvenido al Mercado del Viernes!")
pbMessage("Solo estoy aquí los viernes. ¡Tengo ofertas especiales!")
pbPokemonMart([
  [:RARECANDY, 4800],
  [:PPUP, 4800],
  [:NUGGET, 1000]
], "¡Ofertas especiales de viernes!", false)

Ejemplo: Hermanos de la semana (estilo Pokémon G/S/C)

# Cada día de la semana, un hermano diferente da un objeto
dia = pbGetTimeNow.wday  # 0-6

case dia
when 0   # Domingo
  pbMessage("¡Soy Domingo! Toma esto.")
  pbReceiveItem(:RARECANDY)
when 1   # Lunes
  pbMessage("¡Soy Lunes! Aquí tienes.")
  pbReceiveItem(:SHARPBEAK)
when 2   # Martes
  pbMessage("¡Soy Martes! Un regalo para ti.")
  pbReceiveItem(:PINKBOW)
when 3   # Miércoles
  pbMessage("¡Soy Miércoles! Llévate esto.")
  pbReceiveItem(:BLACKBELT)
when 4   # Jueves
  pbMessage("¡Soy Jueves! Para ti.")
  pbReceiveItem(:HARDSTONE)
when 5   # Viernes
  pbMessage("¡Soy Viernes! Toma.")
  pbReceiveItem(:POISONBARB)
when 6   # Sábado
  pbMessage("¡Soy Sábado! Que lo disfrutes.")
  pbReceiveItem(:SPELLTAG)
end

Eventos por Fecha Específica

Puedes crear eventos que ocurran en una fecha concreta del calendario:

# Obtener la fecha actual
ahora = pbGetTimeNow
mes = ahora.mon    # Mes (1-12)
dia = ahora.day    # Día del mes (1-31)

# Evento de Navidad (25 de diciembre)
if mes == 12 && dia == 25
  pbMessage("¡Feliz Navidad! Toma este regalo especial.")
  pbReceiveItem(:MASTERBALL)
end

# Evento de Halloween (31 de octubre)
if mes == 10 && dia == 31
  pbMessage("¡Feliz Halloween! Los Pokémon fantasma están más activos hoy.")
end

Funciones Útiles de Tiempo

Función Descripción
pbGetTimeNow Devuelve el objeto Time actual del sistema.
pbIsWeekday?(d1, d2, ...) Devuelve true si hoy es uno de los días indicados (0=Dom, 6=Sáb).
pbGetAbbrevMonthName(mes) Devuelve el nombre abreviado del mes (1-12).
PBDayNight.isMorning? ¿Es de mañana? (05:00-09:59)
PBDayNight.isDay? ¿Es de día? (10:00-16:59)
PBDayNight.isEvening? ¿Es por la tarde? (17:00-19:59)
PBDayNight.isNight? ¿Es de noche? (20:00-04:59)

Sistema de Estaciones

Essentials soporta un sistema de estaciones (primavera, verano, otoño, invierno) que puede afectar visualmente los mapas y los encuentros Pokémon:

# Obtener la estación actual
# Las estaciones cambian cada mes en el juego:
# Enero/Mayo/Septiembre = Primavera
# Febrero/Junio/Octubre = Verano
# Marzo/Julio/Noviembre = Otoño
# Abril/Agosto/Diciembre = Invierno

estacion = pbGetSeason
# 0 = Primavera, 1 = Verano, 2 = Otoño, 3 = Invierno

case estacion
when 0
  pbMessage("Es primavera. Las flores están floreciendo.")
when 1
  pbMessage("Es verano. Hace mucho calor.")
when 2
  pbMessage("Es otoño. Las hojas cambian de color.")
when 3
  pbMessage("Es invierno. Todo está cubierto de nieve.")
end

Tiempo Real vs Tiempo del Juego

Essentials usa el reloj del sistema operativo por defecto (tiempo real). Esto significa que:

Si prefieres usar un sistema de tiempo propio del juego (independiente del reloj real), necesitarás crear un sistema personalizado que use variables del juego como reloj interno.

Eventos de Reinicio Diario

Para crear eventos que se puedan repetir una vez al día (como recibir un objeto diario), puedes usar variables para guardar la última fecha:

# Evento de regalo diario
ahora = pbGetTimeNow
ultimo_dia = $game_variables[50]  # Variable que guarda el último día

if ultimo_dia != ahora.yday  # yday = día del año (1-366)
  pbMessage("¡Toma tu regalo diario!")
  pbReceiveItem(:POTION)
  $game_variables[50] = ahora.yday  # Guardar el día actual
else
  pbMessage("Ya recibiste tu regalo de hoy. ¡Vuelve mañana!")
end

Reinicio semanal

# Evento que se puede hacer una vez por semana
ahora = pbGetTimeNow
semana_actual = ahora.strftime("%U").to_i  # Número de semana del año
ultima_semana = $game_variables[51]

if ultima_semana != semana_actual
  pbMessage("¡El desafío semanal está disponible!")
  # ... lógica del desafío ...
  $game_variables[51] = semana_actual
else
  pbMessage("Ya completaste el desafío de esta semana.")
end
Consejo: Usar el reloj del sistema puede ser manipulado por el jugador cambiando la hora de su computadora. Si esto es un problema para tu juego, considera implementar un sistema anti-trampa que detecte cambios bruscos en el reloj del sistema y penalice al jugador o desactive los eventos temporales por un período.