Guardar y Cargar

El sistema de guardado de Pokémon Essentials permite al jugador guardar su progreso y cargarlo posteriormente. Este artículo cubre el funcionamiento del sistema de guardado, la ubicación de los archivos, el autoguardado y cómo personalizar el comportamiento.

Sistema de Guardado

Cuando el jugador selecciona "Guardar" en el menú de pausa, se ejecuta el proceso de guardado que serializa todos los datos del juego en un archivo.

Funciones principales

Función Descripción
pbSave Guarda la partida normalmente (con confirmación al jugador)
pbEmergencySave Guarda la partida de emergencia (sin confirmación, usado ante errores)
Game.save Método interno que realiza la escritura del archivo de guardado

Guardar por script

# Guardar la partida (muestra la pantalla de guardado al jugador)
pbSave

# Guardar silenciosamente (sin interfaz)
Game.save

# Guardado de emergencia (ante un error crítico)
pbEmergencySave

Ubicación del archivo de guardado

El archivo principal se llama Game.rxdata. La base lo guarda dentro de System.data_directory cuando esa carpeta existe; de lo contrario usa ./Game.rxdata. Consulta SaveData::FILE_PATH para obtener la ruta efectiva.

Archivo Descripción
Game.rxdata Archivo principal de guardado
Game.rxdata.bak Copia del guardado anterior. El guardado de emergencia y las conversiones de versión crean este archivo auxiliar.

La ruta se define en SaveData::FILE_PATH dentro de Data/Scripts/007_Save data/002_SaveData.rb. No supongas que siempre está junto al ejecutable.

La ubicación se puede consultar con:

# Obtener la ruta del archivo de guardado actual
ruta = SaveData::FILE_PATH

# Por defecto es:
# "Game.rxdata" (en la carpeta raíz del juego)

Datos que se guardan

El sistema de guardado serializa los siguientes datos globales:

Dato Variable global Contenido
Jugador $player Nombre, ID, equipo Pokémon, medallas, objetos clave, dinero
Sistema del juego $game_system Música actual, sonidos, temporizadores
Mapa $game_map ID del mapa actual, posición del jugador, eventos del mapa
Pantalla $game_screen Tono de pantalla, clima, flash
Switches $game_switches Estado de todos los interruptores del juego
Variables $game_variables Todas las variables del juego
Self Switches $game_self_switches Interruptores locales de cada evento
Opciones $PokemonSystem Preferencias del jugador (velocidad de texto, volumen, etc.)
Mochila $bag Inventario completo con cantidades
PC $PokemonStorage Pokémon almacenados en las cajas del PC
Estadísticas $stats Tiempo de juego, pasos, combates ganados, etc.

Pantalla de Carga

La pantalla de carga (Load Screen) aparece al iniciar el juego si existe un archivo de guardado. Muestra información básica de la partida guardada:

Opciones de la pantalla de carga

Opción Descripción
Continuar Carga la partida guardada
Nueva Partida Comienza una partida nueva (pide confirmación si hay partida guardada)
Opciones Abre la pantalla de opciones
Regalo Misterioso Acceso a regalos misteriosos (si está habilitado)
Debug Modo depuración (solo si $DEBUG es true)

Prevenir guardado en ciertas áreas

Puedes desactivar el guardado en mapas específicos o situaciones especiales:

Método 1: Desactivar desde un evento

# Desactivar el guardado
$game_system.save_disabled = true

# Volver a activar el guardado
$game_system.save_disabled = false

Bloqueo por mapa o situación

La pantalla del menú de pausa oculta la opción de guardar cuando $game_system.save_disabled está activo, durante la Zona Safari o durante el Concurso de Insectos. El sistema no define en map_metadata.txt una propiedad general de "no guardar" por mapa; si quieres bloquearlo en una zona, activa y desactiva save_disabled desde los eventos apropiados.

Método 3: Condicional en el menú

# Modificar la condición del botón Guardar en el menú de pausa
MenuHandlers.add(:pause_menu, :save, {
  "name"      => _INTL("Guardar"),
  "order"     => 60,
  "condition" => proc {
    # No permitir guardar si el interruptor 50 está activado
    # o si el guardado está desactivado globalmente
    next !$game_system.save_disabled && !$game_switches[50]
  },
  "effect"    => proc { |menu|
    scene = PokemonSave_Scene.new
    screen = PokemonSaveScreen.new(scene)
    screen.pbSaveScreen
    next false
  }
})

Convertir partidas antiguas

Si un cambio de versión modifica la estructura de datos guardada, registra una conversión con SaveData.register_conversion. La conversión se ejecuta al leer una partida cuya versión sea anterior a la indicada. Se puede actualizar un valor concreto con to_value o manipular el hash completo con to_all.

SaveData.register_conversion(:mi_conversion) do
  game_version "1.1.0"
  display_title "Actualizando datos de partida"

  to_value :player do |player|
    # Ajusta aquí el objeto del jugador a la nueva estructura.
  end

  to_all do |save_data|
    # Añade o transforma claves globales si hace falta.
  end
end

Para conversiones de la propia base también existe el criterio lbds_version; el sistema distingue conversiones de Essentials, del juego y de La Base de Sky. El código crea Game.rxdata.bak antes de ejecutar conversiones y vuelve a escribir el archivo tras convertirlo.

Antes de cambiar el formato: prueba la conversión con una copia de una partida real. No borres ni renombres claves que puedan faltar en partidas antiguas sin comprobar primero cómo se valida y carga cada valor.

Manejo de errores al cargar

Al cargar, si el archivo principal no supera la validación y existe el archivo .bak, la pantalla de carga intenta usar ese respaldo. El guardado de emergencia copia el archivo previo antes de escribir el nuevo, y las conversiones también crean una copia antes de modificar datos. Mantén copias externas si necesitas conservar versiones anteriores a ese único respaldo.

# Verificar si existe un archivo de guardado
if SaveData.exists?
  pbMessage(_INTL("Se encontró una partida guardada."))
else
  pbMessage(_INTL("No hay partida guardada."))
end

# Borrar la partida guardada (¡con confirmación!)
if pbConfirmMessage(_INTL("¿Borrar la partida guardada? Esto no se puede deshacer."))
  SaveData.delete_file
  pbMessage(_INTL("Partida borrada."))
end

Pantalla de guardado

La pantalla de guardado muestra información de la partida actual antes de confirmar:

# Abrir la pantalla de guardado directamente
scene = PokemonSave_Scene.new
screen = PokemonSaveScreen.new(scene)
screen.pbSaveScreen

Gráficos

Los gráficos de las pantallas de guardado y carga se encuentran en Graphics/UI/Save/ y Graphics/UI/Load/:

Archivo Ubicación Descripción
bg.png Graphics/UI/Save/ Fondo de la pantalla de guardado
bg.png Graphics/UI/Load/ Fondo de la pantalla de carga
panels.png Graphics/UI/Load/ Paneles de información de la partida
Importante: Nunca modifiques la estructura de los datos guardados sin proporcionar un mecanismo de migración. Essentials incluye un sistema de SaveData.register_conversion para convertir datos viejos al nuevo formato al cargar partidas antiguas.