Skip to content

Repository files navigation

SAGA Engine — Field Mission Platform

SAGA Engine

Un motor de misiones de campo geolocalizado, en tiempo real y offline-first.
Diseñado para experiencias de juego presencial con equipos, QR físicos, GPS y minijuegos.

VersionLicensePythonReactDocker


¿Qué es SAGA Engine?

SAGA Engine es una plataforma completa para diseñar y ejecutar misiones de campo gamificadas en el mundo real. Los jugadores reciben una ruta de nodos GPS, escanean QRs físicos, completan minijuegos y acumulan logros — todo ello funciona tanto con conexión como sin ella.

Pensado para escape rooms urbanos, gymkhanas, formaciones corporativas, tours guiados y cualquier experiencia donde quieras convertir el espacio real en un tablero de juego.


Características principales

🗺️ Mapa en tiempo real

  • Mapa interactivo basado en Leaflet + OpenStreetMap con nodos de misión geolocalizados
  • Indicador de posición GPS del jugador con seguimiento dinámico
  • Cálculo de distancia al nodo activo y radio de activación configurable
  • Vista de ruta completa y modo "overview" de toda la misión
  • Marcadores de equipo en tiempo real sobre el mapa

📡 GPS y localización

  • Soporte completo de GPS del navegador con retroalimentación de precisión
  • Modo debug de geolocalización para pruebas desde escritorio (permite mover manualmente la posición)
  • Petición de GPS en el Login con flujo de permiso claro
  • Entrada sin GPS permitida, con solicitud de posición simulada en debug

📦 Offline-first

  • Service Worker PWA con caché de assets y shell del jugador
  • Mission Pack: descarga completa de la misión para jugar sin conexión
  • Caché de teselas de mapa (tiles) con precarga configurable antes de salir al campo
  • Sincronización automática de progreso offline cuando vuelve la conexión
  • Pruebas de campo (fotos) almacenadas localmente y sincronizadas después

🎮 Minijuegos

Sistema de dos niveles: familias (los motores de ejecución) y juegos (preajustes configurables que apuntan a una familia).

JuegoQué haceSensores
Checkpoint / Texto rápidoLlegar al punto y leer la pistaGPS
Matriz de circuitosReparar una ruta de energía en una cuadrícula
Simón DiceMemorizar y repetir una secuencia de cuadrados de colores
Mosaico del lugarReconstruir una foto real del sitio intercambiando piezas
Laberinto de equilibrioGuiar una bola inclinando el móvil, con botones de respaldoAcelerómetro
Caza-SeñalesRadar de reflejos: tocar chispas verdes y esquivar los ecos rojos
Desafío de audioSoplar o hacer ruido para cargar una barraMicrófono
Objeto QR / Llave QREscanear una pegatina física del mundo realCámara
Relevo de equipoPrueba pensada para varios jugadores o roles

Cada juego tiene editor propio en el panel de administración, con topes que impiden guardar una configuración injugable, y todos funcionan sin conexión.

🔎 Lector de pegatinas QR con logo

Las tarjetas impresas con un logo grande encima no las lee ningún escáner estándar: el logo tapa la información de formato y las pautas de temporización, que no están protegidas por corrección de errores.

SAGA incluye un lector propio para esos casos:

  • OpenCV (WASM) aislado en un Web Worker, para que un problema de memoria no se lleve por delante la pestaña del jugador.
  • Localiza el código, corrige la perspectiva, muestrea la matriz de módulos y la compara con los payloads de la misión ignorando la zona del logo.
  • Análisis multi-escala y realces (contraste, escalado) para fotos de campo.
  • Umbrales calibrados para que ante una foto dudosa prefiera no leer antes que devolver el código de otro nodo.
  • /qr-selftest: página de autocomprobación que ejecuta el motor real sobre fotos de referencia y dice si ese móvil concreto reconoce las pegatinas antes de salir al campo.

⚒️ Mesa de trabajo

  • Recetas que combinan objetos de la mochila en piezas más potentes
  • Los ingredientes que ya tienes se distinguen de los que faltan
  • Una pieza fabricada puede ser requisito para desbloquear un nodo

🔑 Códigos de respaldo

Todo nodo acepta un código de rescate para no dejar a nadie bloqueado en el monte: completa el nodo aplicando una penalización de tiempo. El código impreso en la pegatina es también el código del nodo.

Cada familia tiene editor visual en el panel de administración y runtime propio en el cliente.

🎒 Mochila del jugador

  • Inventario con objetos recolectables (coleccionables, pistas, ítems de misión)
  • Previsualización del siguiente nodo y su juego asociado
  • Descripción contextual de cómo se juega cada minijuego
  • Guía de herramientas integrada (asistente de campo)
  • Descarga de fotos de campo como ZIP

👥 Multijugador y equipos

  • Perfiles de jugador y equipos configurables desde el admin
  • Presencia de equipo en tiempo real (posiciones en el mapa)
  • Soporte para modos solo y equipo

🔑 Nodos físicos y QR

  • Generación de tarjetas QR físicas desde el admin (QR Studio)
  • Validación de QR con lógica de distancia — aviso centrado en pantalla si el jugador está demasiado lejos
  • Soporte para tipos de nodo físico: Objeto QR, Llave QR, Pista QR, Bonus Oculto
  • Panel de preview de requisitos antes de activar un nodo

📸 Pruebas de campo (Field Proofs)

  • Captura de fotos geolocalizadas desde el cliente jugador
  • Visor de fotos sobre el mapa con superposición de posición
  • Eliminación de fotos propias
  • Descarga en ZIP desde el panel de herramientas del jugador y desde el admin

🌐 Idiomas

Interfaz en galego, castellano e inglés, conmutable desde el propio juego. Los textos de la misión se guardan en el idioma que elija quien la diseña; la interfaz se traduce al vuelo al cambiar de idioma.

🛠️ Panel de administración

  • Constructor de misiones con nodos, etapas y rutas
  • Editor visual de minijuegos por familia
  • Gestión de jugadores y perfiles de equipo
  • Mapa de misión en admin con vista de posiciones en vivo
  • QR Studio para generar y gestionar tarjetas QR imprimibles
  • Configuración de la misión, idioma y parámetros globales
  • Offline Vault: resumen del estado de preparación offline de cada jugador

Arquitectura

saga_engine/
├── main.py # FastAPI app principal
├── requirements.txt # Dependencias Python
├── Dockerfile # Imagen Docker (Python 3.13-slim)
├── frontend/ # App React (Vite + TypeScript)
│ ├── src/
│ │ ├── App.tsx # Router raíz (Login / Player / Admin)
│ │ ├── login/ # LoginApp — selección de jugador + GPS
│ │ ├── player/ # PlayerApp — mapa, HUD, mochila, minijuegos
│ │ │ ├── components/ # PlayerHud, PlayerShell, MapSurface…
│ │ │ ├── minigames/ # Core + familias de minijuegos
│ │ │ ├── offline/ # PWA, Mission Pack, GPS cache…
│ │ │ └── utils/ # GPS, geo, stagePosition…
│ │ ├── admin/ # AdminApp — panel de administración
│ │ └── shared/ # API, tipos, identidad, offline vault…
│ └── public/ # Assets estáticos, manifest PWA, SW
├── scripts/ # Scripts de despliegue y auditoría
└── tests/ # Tests de backend (pytest)

Stack:

  • Backend: Python 3.13 + FastAPI + SQLite (vía adaptadores)
  • Frontend: React 19 + TypeScript + Vite + Leaflet
  • Deploy: Docker (imagen única), desplegable en Raspberry Pi 4 o cualquier servidor Linux
  • PWA: Service Worker con estrategia offline-first

Inicio rápido

Prerrequisitos

  • Docker
  • (Opcional) Node.js 20+ para desarrollo frontend local

Producción (Docker)

# Clonar
git clone https://github.com/tu-usuario/saga_engine.git
cd saga_engine
# Configurar entorno
cp prod.env.example prod.env
# Editar prod.env con tus valores# Construir y arrancar
docker build -t saga_engine:latest .
docker run -d \
--name saga_engine_app \
-p 8096:5000 \
--env-file prod.env \
-v $(pwd)/data:/app/data \
saga_engine:latest

Deploy seguro (con smoke test)

El script deploy_saga_safe.sh levanta primero un candidato en puerto alternativo, hace smoke test, y solo promueve si todo va bien:

bash scripts/deploy_saga_safe.sh saga_engine:latest --build --promote

Desarrollo local (frontend)

cd frontend
npm install
npm run dev
# → http://localhost:5173

Variables de entorno

VariableDescripciónEjemplo
SECRET_KEYClave secreta para sesiones admincambiar-en-produccion
ADMIN_PASSWORDContraseña del panel de adminmi-password
SAGA_VERSIONVersión mostrada en el cliente3.0.0
SAGA_BUILD_TIMETimestamp de compilación2026-07-07T14:00:00+0200
DATA_DIRDirectorio de datos persistentes/app/data

Configuración de misión

La misión se configura desde el panel de administración (/admin-react):

  1. Settings → Nombre de la misión, historia, idioma, jugadores
  2. Mission Builder → Crear nodos con coordenadas GPS y radio de activación
  3. Node Editor → Asignar familia de minijuego y configurar sus parámetros
  4. Physical QR → Generar y descargar tarjetas QR imprimibles
  5. Players → Gestionar perfiles de jugador y equipos
  6. Offline Prep → Verificar que todos los jugadores tienen la misión descargada

GPS y modo debug

En entornos sin GPS real (escritorio, pruebas):

  1. Entra al jugador desde /player/TU-JUGADOR
  2. En la barra inferior → botón de debug 🐛
  3. Pulsa en el mapa para simular tu posición

Para pruebas de distancia a nodos, usa el modo debug para colocarte dentro del radio del nodo activo.


Despliegue en Raspberry Pi

El sistema está optimizado para correr en una Raspberry Pi 4 (arm64):

# En la Pi
git clone https://github.com/tu-usuario/saga_engine.git
cd saga_engine
# Primera vez
docker build -t saga_engine:latest .
bash scripts/deploy_saga_safe.sh saga_engine:latest --promote
# Actualizaciones# (desde el PC de desarrollo, subir los cambios a la Pi y re-ejecutar)
bash scripts/deploy_saga_safe.sh saga_engine:latest --build --promote

El script gestiona automáticamente:

  • Construcción de imagen nueva
  • Prueba en puerto alternativo (18096)
  • Smoke test de las rutas principales
  • Promoción a producción (8096) solo si todo va bien
  • Limpieza del candidato

Tests

# Instalar dependencias de test
pip install -r requirements-dev.txt
# Ejecutar todos los tests
pytest tests/ -v
# Tests específicos
pytest tests/test_game_state_repository.py -v
pytest tests/test_offline_progression_sync_api.py -v

Changelog

Ver CHANGELOG.md para el historial completo de versiones.


Licencia

MIT — ver LICENSE


Construido con ❤️ para misiones de campo reales.
SAGA Engine v3.0.0 — 2026

About

Self-hosted engine for geolocated games and real-world interactive routes

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages