Tiempo

Pokémon Essentials incluye un sistema completo de día y noche que afecta la apariencia visual del juego, los encuentros salvajes, los eventos y más. Por defecto, el sistema usa la hora real del ordenador del jugador.

Sistema de día y noche

El ciclo de día y noche aplica un tinte de color (overlay) sobre los mapas exteriores para simular diferentes momentos del día. Este efecto es automático en todos los mapas que no sean interiores o cuevas.

Los mapas interiores, cuevas y edificios no reciben el tinte de tiempo por defecto. Esto se controla con el tipo de mapa en los metadatos:

[010]
Name = Ciudad Celeste
MapType = Town    # Mapas exteriores reciben tinte de tiempo

[011]
Name = Casa del Jugador
MapType = Indoor  # Los interiores NO reciben tinte

Períodos del día

Essentials divide el día en varios períodos, cada uno con su propio tinte visual:

Período Horario Tinte Método de comprobación
Mañana 05:00 - 09:59 Anaranjado suave pbIsMorning?
Día 10:00 - 16:59 Sin tinte (luminosidad plena) pbIsDay?
Tarde 17:00 - 19:59 Naranja/rojizo pbIsAfternoon?
Atardecer 20:00 - 20:59 Rojizo oscuro pbIsEvening?
Noche 21:00 - 04:59 Azul oscuro pbIsNight?

Métodos útiles de tiempo

Essentials proporciona varios métodos para consultar y trabajar con el tiempo del juego:

Obtener la hora actual

# Obtener el objeto Time actual del juego
time = pbGetTimeNow

# Obtener la hora (0-23)
hora = time.hour

# Obtener los minutos
minutos = time.min

# Obtener el día de la semana (0=Domingo, 6=Sábado)
dia_semana = time.wday

# Obtener el mes (1-12)
mes = time.mon

Comprobar el período del día

# ¿Es de día? (incluye mañana, día y tarde)
if pbIsDay?
  pbMessage("Es de día.")
end

# ¿Es de noche? (21:00 - 04:59)
if pbIsNight?
  pbMessage("Es de noche.")
end

# ¿Es por la mañana? (05:00 - 09:59)
if pbIsMorning?
  pbMessage("Es por la mañana.")
end

# ¿Es por la tarde? (17:00 - 19:59)
if pbIsAfternoon?
  pbMessage("Es por la tarde.")
end

# ¿Es por la noche/atardecer? (20:00 - 20:59)
if pbIsEvening?
  pbMessage("Está atardeciendo.")
end

Tintes del tiempo

Los tintes de color se aplican automáticamente a los mapas exteriores. Los colores y las transiciones se definen en el script Game_Map y en las clases de tinte.

Personalizar los tintes

Los tintes de cada período se pueden modificar en el módulo Settings o en los scripts relacionados. Cada tinte se define como un Tone con valores de rojo, verde, azul y gris:

# Formato: Tone.new(rojo, verde, azul, gris)
# Ejemplo de tinte nocturno
NIGHT_TONE = Tone.new(-70, -90, 15, 55)

# Ejemplo de tinte matutino
MORNING_TONE = Tone.new(-15, -30, -10, 20)

Los valores negativos oscurecen el color, los positivos lo intensifican. El cuarto valor (gris) controla la desaturación.

Desactivar el tinte en un mapa

# En los metadatos del mapa
[012]
Name = Casino
MapType = Indoor           # No aplica tinte automáticamente
NoTimeTone = true          # Fuerza que no se aplique tinte

Eventos basados en el tiempo

Puedes crear eventos que se comporten de forma diferente según la hora del día:

NPC que cambia de diálogo

# En un evento de NPC
if pbIsMorning?
  pbMessage("¡Buenos días! El sol está saliendo.")
elsif pbIsDay?
  pbMessage("¡Buenas tardes! ¡Qué buen día hace!")
elsif pbIsAfternoon?
  pbMessage("Ya está cayendo la tarde...")
elsif pbIsEvening?
  pbMessage("¡Qué bonito atardecer!")
else
  pbMessage("Buenas noches. Deberías descansar.")
end

Encuentros diferentes según la hora

Los encuentros salvajes pueden variar según el período del día. En el archivo PBS encounters.txt:

[010]   # Ruta 1
Land,21
  RATTATA,3,5
  PIDGEY,3,5

LandDay,21
  SENTRET,3,5
  PIDGEY,4,6

LandNight,21
  HOOTHOOT,3,5
  RATTATA,4,6

LandMorning,21
  PIDGEY,3,5
  LEDYBA,3,5

Los tipos de encuentro con sufijo temporal (LandDay, LandNight, LandMorning) solo se activan en el período correspondiente.

Tiendas con stock variable

# Una tienda que vende objetos diferentes de noche
if pbIsNight?
  pbPokemonMart([:DUSKBALL, :REPEL, :SUPERREPEL, :ESCAPEROPE])
else
  pbPokemonMart([:POKEBALL, :GREATBALL, :POTION, :SUPERPOTION])
end

Configuración en Settings

El módulo Settings contiene varias constantes relacionadas con el tiempo:

# Si el juego usa tiempo real del ordenador
Settings::TIME_BASED_EVENTS = true

# Si se desactiva, no hay ciclo día/noche ni eventos temporales
# Establecer en false para juegos sin sistema de tiempo

Si TIME_BASED_EVENTS es false:

Tiempo real vs. tiempo de juego

Por defecto, Essentials usa el tiempo real del ordenador del jugador. Esto significa que si son las 22:00 en el reloj del sistema, será de noche en el juego.

Ventajas del tiempo real

Usar un sistema de tiempo propio

Si prefieres que el tiempo del juego avance independientemente de la hora real, puedes modificar el método pbGetTimeNow:

# Ejemplo: Tiempo de juego basado en pasos
# Cada 100 pasos = 1 hora de juego
def pbGetTimeNow
  steps = $player.step_count
  hours = (steps / 100) % 24
  # Crear un objeto Time con la hora calculada
  base = Time.local(2024, 1, 1, hours, 0, 0)
  return base
end

Este enfoque requiere más trabajo pero permite un control total sobre el flujo del tiempo en el juego.

Evoluciones por tiempo

Algunos Pokémon evolucionan solo a ciertas horas del día. Esto se configura en el PBS pokemon.txt:

# Eevee evoluciona a Espeon de día y a Umbreon de noche
Evolutions = ESPEON,Happiness,Day,UMBREON,Happiness,Night

Las condiciones de tiempo para evolución son: