Saltar al contenido principal

Persistencia

Cómo Xindeler guarda el estado del mundo y de los jugadores. No hay base de datos relacional — el juego usa archivos binarios directos.


rtsim/data.dat — Estado del mundo

El archivo principal de persistencia. Contiene todo el estado del mundo simulado por rtsim:

  • Posición, inventario, relaciones y memoria de todos los NPCs persistentes
  • Estado de facciones y sus relaciones
  • Estado de sitios (ciudades, dungeons)
  • Variables de ORACLE (arcos narrativos activos, estado del ecosistema)
  • Estado de tiempo y astronomía

Formato: MessagePack — binario compacto, serializado con rmp-serde.

Cuándo se escribe: El servidor serializa data.dat periódicamente (cada N minutos) y siempre al apagar limpiamente. Si el servidor se mata con kill -9, los cambios desde el último guardado se pierden.

Ubicación: En el directorio de trabajo del servidor al arrancarlo, o en la ruta configurada.

xindeler-server
└── rtsim/
└── data.dat (~MB a GB según el tamaño del mundo)

Migraciones

Si el formato de data.dat cambia entre versiones, el servidor intenta migrar el archivo automáticamente al arrancar. Si la migración falla, el servidor arranca con un mundo nuevo y mueve el archivo corrupto a data.dat.bak.


chronicle/ — Log de eventos

Registro histórico de eventos del mundo. JSONL (una línea JSON por evento), rotado automáticamente cuando el archivo alcanza un tamaño máximo.

Cada línea es un evento serializado:

{"ts":1750000000,"kind":"FactionConquest","faction":"Bandits","site":"Ironholm","prev_owner":"Merchants"}
{"ts":1750000120,"kind":"NpcDeath","npc_id":4821,"cause":"PlayerKill","player":"Aerindel"}
{"ts":1750000300,"kind":"OracleArcAdvance","arc":"BanditRise","phase":3}

Uso: ORACLE lee el chronicle para construir contexto histórico. También útil para debugging y para generar estadísticas del servidor.

Ubicación:

chronicle/
├── events-2026-06-01.jsonl
├── events-2026-06-15.jsonl
└── events-current.jsonl ← archivo activo

Estado de jugadores

El estado de cada jugador (inventario, posición, stats, experiencia) se almacena como parte del estado del NPC rtsim correspondiente — no en un archivo separado por jugador.

Cuando un jugador se desconecta, su estado se serializa en data.dat en el próximo ciclo de guardado. Cuando vuelve a conectarse, se carga desde ahí.


Web (lista de espera y contributors)

El proceso FastAPI mantiene dos archivos CSV en el VPS:

ArchivoContenido
waitlist.csvEmails registrados en la lista de espera
contributors.csvFormularios de contribuidores

Estos no tienen relación con el estado del juego — son datos web independientes.


No hay base de datos relacional

Esta es una decisión de diseño explícita para v1:

OpciónEstado
MessagePack (data.dat)✅ En uso
JSONL (chronicle)✅ En uso
CSV (web)✅ En uso
RocksDB / SQLite / PostgreSQLDiseñado como seam futuro, no implementado en v1

La ventaja de MessagePack + JSONL es la simplicidad operacional: no hay proceso de base de datos que mantener, no hay migraciones SQL, no hay conexiones que configurar. El servidor es un binario que corre y guarda archivos.

La desventaja es que queries complejas sobre el estado histórico son difíciles. Si eso se vuelve necesario, el seam a RocksDB o SQLite está diseñado pero no implementado.


Backups

Para hacer backup del mundo completo, alcanza con copiar:

cp rtsim/data.dat backups/data-$(date +%Y%m%d).dat
cp -r chronicle/ backups/chronicle-$(date +%Y%m%d)/

No se necesita snapshot de base de datos ni dump SQL.