Releases: odegaard12/Saga-Engine
Release list
v5.36.0
- Reagrupa el catálogo de minijuegos del admin en 5 familias claras en
español ("Llegar y escanear", "Puzles", "Movimiento", "Orientación",
"Sonido") en vez de las 5 familias técnicas del runtime, que mezclaban
motor interno con lo que ve el organizador. Es solo una capa de
presentación (frontend/src/admin/lib/displayFamilies.ts): ningún
interaction_type,game_idni family del runtime del jugador cambia, así
que las misiones existentes cargan y se juegan exactamente igual. El
selector de juego del editor guiado (AdminGameEditor.tsx) y las tarjetas
de familia (FamiliesPanel.tsx) ahora muestran esas 5 familias; el backend
(/api/admin/react-overview) añadedisplay_family_countsy
display_familiessin quitar las claves técnicas de siempre. spark_radaryteam_relaydejan de ofrecerse para un nodo nuevo.
Ninguno de los dos está probado de punta a punta con jugadores reales -sus
README (frontend/src/player/minigames/families/sparkRadary
.../teamRelay) los describen como trabajo a medias o prototipo huérfano-,
así que se marcanruntimeStatus: 'runtime_partial'en lugar del
'runtime_ready'optimista que tenían. Un nodo antiguo que ya los use
sigue abriéndose y editándose con normalidad -con un aviso en el editor-,
y el organizador puede seguir eligiéndolos a mano con "Mostrar
experimentales" si quiere probarlos.- Actualizado
docs/gameplay/minigames-and-physical-interactions-audit.md
con la reagrupación y una nota sobre una contradicción encontrada en el
propio código:FamilyRuntimeHost.tsxya tiene ramas paraspark_radary
team_relayque sus README dicen que no existen. Pendiente de que alguien
lo confirme de punta a punta antes de reabrirlos en el selector.
v5.35.1
- Corrige inyección de fórmulas (CSV injection) en la exportación del
Registro de partida./api/admin/match-log/export?formato=csvescribía
user,display_nameypayloadtal cual: un nombre de jugador o un
texto libre del payload que empezara por=,+,-o@se abre como
fórmula, no como texto, en Excel/Sheets/LibreOffice -el vector clásico de
CSV injection (OWASP)-.backend/app/runtime/match_log.py::to_csvahora
antepone una comilla simple a cualquier celda que empiece por uno de esos
caracteres (o por tabulador/retorno de carro). Revisadas el resto de capas
del motor antitrampas (cliente, transporte offline, motor de servidor,
almacenamiento JSON/SQLite y panel de administración): sin más hallazgos
que corregir.
v5.35.0
- Nuevo: Registro de partida. Bitácora por jugador para revisar después
de la ruta y detectar trampas: sesión abierta, muestras de posición de
heartbeat (máx. una cada 30 s, con precisión y origen real/manual),
nodo abierto, avance/completado (con o sin cobertura), QR, mochila,
minijuegos, sincronización de la cola offline (cuántos eventos y con
cuánto retraso) y las sospechas/notas del motor antitrampas. Sólo se
escribe mientras la misión está PROGRAMADA (mission_launch_atpuesta) y
ACTIVA -fuera de esa ventana no se anota nada-. Almacén SQLite propio
(data/match_log.sqlite3, fuera del repo) con tope de tamaño y poda de
lo más antiguo. Incluido en la purga de "Datos personales". Panel nuevo
en el admin ("Registro de partida", grupo Seguimiento): línea de tiempo
filtrable por jugador y fechas, con sospechas resaltadas, y exportación a
JSON y CSV.
v5.34.1
- Corrige el mínimo de tiempo de minijuego (regresión de 5.34.0). La
tabla por familia derivaba el umbral de la duración "típica" del catálogo
del organizador (p.ej. team_relay ≈66 s), pero con datos reales los
circuitos se completaban en ~17 s y otros minijuegos en ~1 s: flagueaba a
jugadores honestos. Se sustituye por un suelo único y conservador de 2 s
(MIN_PLAUSIBLE_STAGE_MS), sin mínimos "por duración típica"; sólo
sequence_codeconserva un suelo propio, y calculado de un límite físico
real (nº de pasos de la secuencia del nodo), no de una media. Se añade una
red de seguridad basada en datos: con 5 o más partidas ya vistas de ese
minijuego en esta misión, sólo se flaguea si el tiempo está por debajo del
20 % de la mediana observada, así que un récord rápido pero cercano a
otros tiempos reales nunca queda marcado. Se quitan las entradas de
spark_radaryteam_relay(prototipos sin cablear en la ruta real).
Ningún registro se invalida: sigue siendo FLAG, no bloqueo.
v5.34.0
- Motor antitrampas SAGA Engine: posición manual/debug excluida. Un
latido consource: "manual"(modo prueba, verPlayerApp.tsx
handleDebugSetPosition) ya no puede disparar "velocidad imposible": el
salto real→manual→real es justo lo que se espera de ese modo. Se anota,
como mucho una vez por sesión de uso manual, una nota NEUTRA ("usó
posición manual") separada de las sospechas en el panel. - Mínimo de tiempo de minijuego, por familia. El suelo único de 5 s pasa
a ser un suelo porgame_id(≈20-25 % de la duración mínima real de cada
minijuego, vergameCatalog.ts), nunca por debajo de 5 s. Checkpoint, QR
y coleccionables siguen exentos, como antes. - Rebranding: "Motor antitrampas SAGA Engine". Un único módulo
(backend/app/runtime/anti_cheat.py) con toda la política y los
umbrales documentados, y el panel de admin ahora separa sospechas de
notas neutras (con su recuento por jugador) bajo esa cabecera. - Doc: se deja explícito que un
blursinhiddenmás corto que
SALIDA_MINIMA_MS(1,5 s) -como deslizar el Centro de Control en iOS- no
penaliza, con el mismo umbral que ya usaba Android.
v5.33.1
- Antitrampas del servidor, revisado. Velocidad imposible sólo se mira
ENTRE NODOS -no en el trayecto de casa al primer nodo, que puede ser en
coche- y sólo si se sostiene en 2 tramos consecutivos: un salto suelto de
GPS ya no se flaguea. Se quita del todo "nodo completado lejos de su
sitio": el GPS en el monte falla demasiado a menudo y acusaba a jugadores
honestos. El tiempo mínimo de reto sólo se comprueba en minijuegos -no en
checkpoints, QR ni coleccionables, que no tienen partida que jugar- y sube
a 5 s. - Antitrampas del cliente, más señales.
useAntiTrampas.tsdistingue
salir de la app (visibilitychange/pagehide) de abrir el selector de
apps sin soltar la pestaña (blursinhidden), ignora los avisos de
permiso que pide la propia app (cámara, movimiento, GPS), y reporta cada
salida al servidor por la misma cola offline-first de siempre para que
salga en el panel, en "Sospechas de trampa".
v5.33.0
-
Antitrampas en el servidor. Hasta ahora sólo existía en el móvil
(salir de la app durante un minijuego). Ahora el servidor MARCA, sin
bloquear nunca a nadie: velocidades imposibles entre posiciones (más de
40 km/h descontando la precisión del GPS), completar un nodo lejos de
él, completar un nodo en menos de 1,5 s y eventos sin cobertura con la
hora en el futuro. Las sospechas se ven en el admin, en Actividad ›
"Sospechas de trampa". Un jugador honrado con el GPS poco preciso no sale
marcado (hay test para eso). -
El latido del jugador envía también la precisión del GPS, que es lo que
permite no castigar a quien tiene mala señal. -
Revisados carga, cobertura, sincronización y clasificación: sin fallos
nuevos reproducibles. -
Sincronización sin cobertura que se caía entera. Si un solo evento de
la cola traía el tiempo del nodo corrupto (un texto en vez de un número),
el servidor daba error 500 y NO se sincronizaba ninguno de los hasta 100
eventos de la tanda, aunque los demás estuvieran bien. Lo mismo al
avanzar nodo con conexión. Ahora ese tiempo se ignora y el resto sigue. -
Traducción al gallego del jugador. Unos 70 textos salían en el idioma
equivocado: avisos con números dentro (el puente de idioma no podía
traducirlos), algunos fijos en inglés ("Centered on node.") y otros fijos
en gallego que veía también quien jugaba en castellano ("Saíches do
camiño", "Sen cobertura…"). Ahora salen en el idioma de la misión. -
TODO.md: el acceso escalonado ya estaba hecho (lo decía PROGRESS.md).
-
Los minijuegos sparkRadar y teamRelay llevan un README: son prototipos
sin terminar y sin conectar al juego. -
Misión en gallego: el aviso "Activa GPS para obtener una posición…"
salía en castellano; ya tiene su traducción. -
Panel "Antes de salir" en un solo idioma. Mezclaba gallego
("Movemento", "Seguir sen iso") y castellano ("Lo denegaste…"). Ahora
cada texto sale en el idioma de la misión. -
El aviso de permiso denegado dice qué tocar según el móvil: en
iPhone, Ajustes › Safari; en Android, el candado de la barra de
direcciones › Permisos. Antes decía Safari a todo el mundo.
Admin: funciones del servidor que el panel no usaba.
-
Actividad (menú "Seguimiento"): el registro de eventos del servidor
(latidos, QR escaneados, acciones de admin), con filtro por estado y
"marcar como leído". -
Datos personales (en Jugadores): ver cuántas fotos de campo y
posiciones GPS hay guardadas y borrarlas. La misión, los nodos y el
progreso no se tocan. Borra datos de personas reales sin vuelta atrás,
así que hay que escribir BORRAR para confirmarlo. -
Editor de nodos: fuera 120 líneas muertas (pestañas que nunca se
conectaron, un panel sin usar y una cabecera duplicada oculta). -
Sin halos en los nodos completados ni en los pendientes. Su halo de
color en el suelo "quedaba fatal sobre el terreno". Ahora sólo llevan la
sombra de contacto, y el único halo es el del nodo que toca: su radio
real de entrada. -
Primera carga del mapa mucho más rápida. El paquete offline (unas
3.000 teselas) se bajaba tesela a tesela, y cada una tardaba ~0,7 s en ir
y volver por el túnel de Cloudflare aunque la Pi la sirviera de su disco
en 60 ms: medido en un móvil nuevo, más de 20 minutos. Ahora se baja por
lotes de 120 (nueva ruta /api/teselas/lote), tres a la vez; si el
servidor no sabe dar lotes, se vuelve a la descarga de una en una. -
Relieve de cerca sin cobertura. El paquete apenas traía el relieve
z12 (3 teselas), que es el que usa la forma del terreno: sin cobertura
el monte de cerca salía plano. Ahora entra el de toda la zona de misión. -
Relieve menos exagerado (×1,5, era ×2,2). Con 2,2, cerca de un monte
la cámara quedaba dentro del relieve y MapLibre le bajaba a la fuerza la
inclinación y el zoom: saltos al ampliar y centrado descolocado. -
Las fotos de cada nodo, en un montón al lado de su base. No se veían
hasta ampliar mucho (zoom 18) y entonces salían en fila, pequeñas y encima
del camino. Ahora cada nodo con fotos lleva un montón con la primera y
cuántas hay, que crece con el nodo y se ve desde lejos; al tocarlo se
abren todas en grande. Las fotos sueltas por el campo, como antes. -
Centrado exacto también al volver de "ver la ruta". Medido con un
móvil simulado en la ruta real: tras ver la ruta (centro en un alto) y
volver a ti, el centro del mapa estaba en tus coordenadas pero tú salías
100 px más abajo, porque MapLibre dejaba la cámara con la altura del
terreno del sitio anterior. Al acabar cada movimiento se iguala la altura
del centro con la del terreno. -
"Centrar en mí" ya centra. El precalentado de la pantalla de carga
(pasa por varios zooms y vuelve) seguía moviendo la cámara si la carga se
quitaba por tope antes de acabar, y al terminar devolvía la cámara a
donde estaba al empezar: pisaba el centrado y el seguimiento del GPS, y
al entrar el jugador podía quedar fuera de la pantalla. Ahora se para en
cuanto tocas el mapa, pides encuadrar o el GPS te sigue, y no restaura
nada.
Repaso del panel de administración, que estaba abandonado:
-
Menú por grupos: Misión (Crear, Ajustes) · Contenido (Juegos,
Objetos) · Personas y pruebas (Jugadores, Simular). "Crear" (el asistente
de plantillas) sólo existía en el menú del móvil; ahora también en
escritorio. "Familias" pasa a llamarse "Juegos". -
Cambio de contraseña: si el servidor pide cambiarla, el panel ya
tiene pantalla para hacerlo (antes se quedaba en "Access denied" sin
salida). Pantalla de acceso en castellano y centrada. -
Seguridad: fuera un último intento de carga que mandaba la
contraseña en la dirección (?password=…) a una ruta que ni existía. -
Barra de datos de la ruta (distancia, tiempo, desnivel, PLAY): tapaba
la fila de botones cuando éstos ocupaban dos líneas y se metía bajo el
menú. Ahora se coloca debajo, midiendo la barra de verdad. -
Las cinco familias de juego en los recuentos del servidor (contaba tres)
y sus nombres en castellano (Reto de movimiento, Caza de rumbo, Matriz de
circuitos, Reto de sonido). -
Textos que no se actualizaban, en toda la app. El puente de idioma
(traduce los textos de la página por detrás de React) guardaba el texto
de la primera vez y, cuando React lo cambiaba, lo devolvía a aquel: un
estado, un contador o la etiqueta de un botón que alterna se quedaban
congelados con el primer valor. Ahora acepta el texto nuevo. -
Un bucle que no paraba. El mismo puente reescribía cada texto aunque
fuera igual, eso volvía a dispararlo y recorría la página entera en cada
fotograma, siempre. Ahora sólo escribe si cambia: menos trabajo para el
móvil y más fluidez. -
Fotos de los nodos, sólo de cerca. De lejos quedaban apiladas y
clavadas en el poste del nodo. Ahora no se ven hasta el zoom 18, donde
salen repartidas bajo el nodo; tocar el nodo de lejos ya no las abre.
Las fotos en campo abierto siguen viéndose (una por sitio). -
El nodo en juego marca su radio de entrada real. Su halo medía lo
mismo en pantalla a cualquier zoom y de lejos quedaba enorme, más grande
que el trazado. Ahora es el círculo donde el juego te deja entrar, a su
tamaño de verdad sobre el mapa: velo suave y un anillo que late en el
borde, del color del tipo. -
Fotos juntas de lejos. Repartidas a cualquier zoom quedaban fatal.
Ahora se ve una por sitio hasta el zoom 18 y sólo de muy cerca se
reparten bajo el nodo para poder tocarlas. Tocar la de lejos abre todas. -
Los nodos ya no "se recargan" más grandes al ampliar. MapLibre topaba
el tamaño de cada símbolo en el del zoom siguiente a su tesela: ampliando
deprisa, el nodo se quedaba quieto hasta que llegaba la tesela y pegaba
el salto. Ahora el tamaño crece sin escalones (nodos, fotos y jugador),
con la misma curva. -
Fotos de los nodos, que se pueden tocar. Estaban todas en el mismo
punto, apiladas y debajo del nodo: al ampliar no se separaban. Ahora las
de cada sitio se reparten en filas bajo la peana del nodo, por encima del
halo, y al tocar una se abre el visor con todas empezando por esa. -
La guía por caminos se guarda. Al volver a abrir la app en el mismo
sitio sale al instante, sin esperar a que se cargue la red y se calcule. -
Centrar en mí encuadra una sola vez: el punto nuevo del GPS ya no
vuelve a mover el mapa con otro encuadre. -
El mapa no se vuelve a cargar al desampliar. Guarda en memoria ocho
niveles de zoom en vez de cinco, pide 32 teselas a la vez en vez de 16
(salen de la caché, no de la red) y las enseña sin fundido. La pantalla
de carga pasa por cada nivel de zoom hacia fuera, no a saltos. -
Botones de posición. "Centrar en mí" centra al momento con la
última posición. Antes pedía el GPS de nuevo cada vez: reiniciaba la
escucha, avisaba "Solicitando permiso de ubicación…" aunque funcionara y
no centraba hasta el punto siguiente. Si el punto es viejo, se pide otro
en silencio. "Ver la ruta" ya no pide GPS: no lo necesita. -
Quieto más de 45 s ya no desapareces del mapa: se te pinta en tu última
posición de esta sesión. Para abrir nodos sigue haciendo falta un punto
reciente. -
Zoom y arrastre más fluidos. Las animaciones del mapa (pulso del
trazado, moneda que flota, halo, guía) se pausan mientras el mapa se
mueve. Cada una cambia el estilo, y con relieve MapLibre repinta
entonces todas las texturas del terreno: diez veces por segundo en pleno
pellizco eran tirones. -
Nodos y fotos que aparecían y desaparecían. Con cada cambio de
estilo -diez por segundo, por las animaciones- se volvían a cargar todos
los datos del mapa: trazado, nodos, fotos y guía se recortaban y
recolocaban sin parar. Ahora sólo se cargan cuando cambian de verdad. -
La guía late en opacidad con un trazo fijo. Su "trazo que crece"
cambiabaline-dasharrayc...
v5.32.1
-
Sincronización sin cobertura que se caía entera. Si un solo evento de
la cola traía el tiempo del nodo corrupto (un texto en vez de un número),
el servidor daba error 500 y NO se sincronizaba ninguno de los hasta 100
eventos de la tanda, aunque los demás estuvieran bien. Lo mismo al
avanzar nodo con conexión. Ahora ese tiempo se ignora y el resto sigue. -
Traducción al gallego del jugador. Unos 70 textos salían en el idioma
equivocado: avisos con números dentro (el puente de idioma no podía
traducirlos), algunos fijos en inglés ("Centered on node.") y otros fijos
en gallego que veía también quien jugaba en castellano ("Saíches do
camiño", "Sen cobertura…"). Ahora salen en el idioma de la misión. -
TODO.md: el acceso escalonado ya estaba hecho (lo decía PROGRESS.md).
-
Los minijuegos sparkRadar y teamRelay llevan un README: son prototipos
sin terminar y sin conectar al juego. -
Misión en gallego: el aviso "Activa GPS para obtener una posición…"
salía en castellano; ya tiene su traducción. -
Panel "Antes de salir" en un solo idioma. Mezclaba gallego
("Movemento", "Seguir sen iso") y castellano ("Lo denegaste…"). Ahora
cada texto sale en el idioma de la misión. -
El aviso de permiso denegado dice qué tocar según el móvil: en
iPhone, Ajustes › Safari; en Android, el candado de la barra de
direcciones › Permisos. Antes decía Safari a todo el mundo.
Admin: funciones del servidor que el panel no usaba.
-
Actividad (menú "Seguimiento"): el registro de eventos del servidor
(latidos, QR escaneados, acciones de admin), con filtro por estado y
"marcar como leído". -
Datos personales (en Jugadores): ver cuántas fotos de campo y
posiciones GPS hay guardadas y borrarlas. La misión, los nodos y el
progreso no se tocan. Borra datos de personas reales sin vuelta atrás,
así que hay que escribir BORRAR para confirmarlo. -
Editor de nodos: fuera 120 líneas muertas (pestañas que nunca se
conectaron, un panel sin usar y una cabecera duplicada oculta). -
Sin halos en los nodos completados ni en los pendientes. Su halo de
color en el suelo "quedaba fatal sobre el terreno". Ahora sólo llevan la
sombra de contacto, y el único halo es el del nodo que toca: su radio
real de entrada. -
Primera carga del mapa mucho más rápida. El paquete offline (unas
3.000 teselas) se bajaba tesela a tesela, y cada una tardaba ~0,7 s en ir
y volver por el túnel de Cloudflare aunque la Pi la sirviera de su disco
en 60 ms: medido en un móvil nuevo, más de 20 minutos. Ahora se baja por
lotes de 120 (nueva ruta /api/teselas/lote), tres a la vez; si el
servidor no sabe dar lotes, se vuelve a la descarga de una en una. -
Relieve de cerca sin cobertura. El paquete apenas traía el relieve
z12 (3 teselas), que es el que usa la forma del terreno: sin cobertura
el monte de cerca salía plano. Ahora entra el de toda la zona de misión. -
Relieve menos exagerado (×1,5, era ×2,2). Con 2,2, cerca de un monte
la cámara quedaba dentro del relieve y MapLibre le bajaba a la fuerza la
inclinación y el zoom: saltos al ampliar y centrado descolocado. -
Las fotos de cada nodo, en un montón al lado de su base. No se veían
hasta ampliar mucho (zoom 18) y entonces salían en fila, pequeñas y encima
del camino. Ahora cada nodo con fotos lleva un montón con la primera y
cuántas hay, que crece con el nodo y se ve desde lejos; al tocarlo se
abren todas en grande. Las fotos sueltas por el campo, como antes. -
Centrado exacto también al volver de "ver la ruta". Medido con un
móvil simulado en la ruta real: tras ver la ruta (centro en un alto) y
volver a ti, el centro del mapa estaba en tus coordenadas pero tú salías
100 px más abajo, porque MapLibre dejaba la cámara con la altura del
terreno del sitio anterior. Al acabar cada movimiento se iguala la altura
del centro con la del terreno. -
"Centrar en mí" ya centra. El precalentado de la pantalla de carga
(pasa por varios zooms y vuelve) seguía moviendo la cámara si la carga se
quitaba por tope antes de acabar, y al terminar devolvía la cámara a
donde estaba al empezar: pisaba el centrado y el seguimiento del GPS, y
al entrar el jugador podía quedar fuera de la pantalla. Ahora se para en
cuanto tocas el mapa, pides encuadrar o el GPS te sigue, y no restaura
nada.
Repaso del panel de administración, que estaba abandonado:
-
Menú por grupos: Misión (Crear, Ajustes) · Contenido (Juegos,
Objetos) · Personas y pruebas (Jugadores, Simular). "Crear" (el asistente
de plantillas) sólo existía en el menú del móvil; ahora también en
escritorio. "Familias" pasa a llamarse "Juegos". -
Cambio de contraseña: si el servidor pide cambiarla, el panel ya
tiene pantalla para hacerlo (antes se quedaba en "Access denied" sin
salida). Pantalla de acceso en castellano y centrada. -
Seguridad: fuera un último intento de carga que mandaba la
contraseña en la dirección (?password=…) a una ruta que ni existía. -
Barra de datos de la ruta (distancia, tiempo, desnivel, PLAY): tapaba
la fila de botones cuando éstos ocupaban dos líneas y se metía bajo el
menú. Ahora se coloca debajo, midiendo la barra de verdad. -
Las cinco familias de juego en los recuentos del servidor (contaba tres)
y sus nombres en castellano (Reto de movimiento, Caza de rumbo, Matriz de
circuitos, Reto de sonido). -
Textos que no se actualizaban, en toda la app. El puente de idioma
(traduce los textos de la página por detrás de React) guardaba el texto
de la primera vez y, cuando React lo cambiaba, lo devolvía a aquel: un
estado, un contador o la etiqueta de un botón que alterna se quedaban
congelados con el primer valor. Ahora acepta el texto nuevo. -
Un bucle que no paraba. El mismo puente reescribía cada texto aunque
fuera igual, eso volvía a dispararlo y recorría la página entera en cada
fotograma, siempre. Ahora sólo escribe si cambia: menos trabajo para el
móvil y más fluidez. -
Fotos de los nodos, sólo de cerca. De lejos quedaban apiladas y
clavadas en el poste del nodo. Ahora no se ven hasta el zoom 18, donde
salen repartidas bajo el nodo; tocar el nodo de lejos ya no las abre.
Las fotos en campo abierto siguen viéndose (una por sitio). -
El nodo en juego marca su radio de entrada real. Su halo medía lo
mismo en pantalla a cualquier zoom y de lejos quedaba enorme, más grande
que el trazado. Ahora es el círculo donde el juego te deja entrar, a su
tamaño de verdad sobre el mapa: velo suave y un anillo que late en el
borde, del color del tipo. -
Fotos juntas de lejos. Repartidas a cualquier zoom quedaban fatal.
Ahora se ve una por sitio hasta el zoom 18 y sólo de muy cerca se
reparten bajo el nodo para poder tocarlas. Tocar la de lejos abre todas. -
Los nodos ya no "se recargan" más grandes al ampliar. MapLibre topaba
el tamaño de cada símbolo en el del zoom siguiente a su tesela: ampliando
deprisa, el nodo se quedaba quieto hasta que llegaba la tesela y pegaba
el salto. Ahora el tamaño crece sin escalones (nodos, fotos y jugador),
con la misma curva. -
Fotos de los nodos, que se pueden tocar. Estaban todas en el mismo
punto, apiladas y debajo del nodo: al ampliar no se separaban. Ahora las
de cada sitio se reparten en filas bajo la peana del nodo, por encima del
halo, y al tocar una se abre el visor con todas empezando por esa. -
La guía por caminos se guarda. Al volver a abrir la app en el mismo
sitio sale al instante, sin esperar a que se cargue la red y se calcule. -
Centrar en mí encuadra una sola vez: el punto nuevo del GPS ya no
vuelve a mover el mapa con otro encuadre. -
El mapa no se vuelve a cargar al desampliar. Guarda en memoria ocho
niveles de zoom en vez de cinco, pide 32 teselas a la vez en vez de 16
(salen de la caché, no de la red) y las enseña sin fundido. La pantalla
de carga pasa por cada nivel de zoom hacia fuera, no a saltos. -
Botones de posición. "Centrar en mí" centra al momento con la
última posición. Antes pedía el GPS de nuevo cada vez: reiniciaba la
escucha, avisaba "Solicitando permiso de ubicación…" aunque funcionara y
no centraba hasta el punto siguiente. Si el punto es viejo, se pide otro
en silencio. "Ver la ruta" ya no pide GPS: no lo necesita. -
Quieto más de 45 s ya no desapareces del mapa: se te pinta en tu última
posición de esta sesión. Para abrir nodos sigue haciendo falta un punto
reciente. -
Zoom y arrastre más fluidos. Las animaciones del mapa (pulso del
trazado, moneda que flota, halo, guía) se pausan mientras el mapa se
mueve. Cada una cambia el estilo, y con relieve MapLibre repinta
entonces todas las texturas del terreno: diez veces por segundo en pleno
pellizco eran tirones. -
Nodos y fotos que aparecían y desaparecían. Con cada cambio de
estilo -diez por segundo, por las animaciones- se volvían a cargar todos
los datos del mapa: trazado, nodos, fotos y guía se recortaban y
recolocaban sin parar. Ahora sólo se cargan cuando cambian de verdad. -
La guía late en opacidad con un trazo fijo. Su "trazo que crece"
cambiabaline-dasharraycada 160 ms, y esa propiedad obliga a
recargar la fuente entera cada vez. -
Sin saltos al ampliar y desampliar. La forma del relieve se queda
en una sola resolución desde el zoom 12: el dato es de ~30 m y los
niveles 13 y 14 eran ese mismo dato remuestreado, distinto en cada uno;
con la exageración, al cruzar de zoom el suelo y los nodos saltaban.
De cerca, además, el relieve sale más suave. El sombreado sigue a z14. -
Nodos asentados. El halo y la sombra de cada nodo van tumbados
sobre el mapa, con su perspectiva real en cualquier punto de la
pantalla, y los nodos van a 2 m del suelo en vez de 3. -
Check integrado. Es una chapa verde en 3D pegada al canto de la
moneda: gira, flota y se ilumina con ella. Antes era una pe...
v5.32.0
-
Traducción al gallego del jugador. Unos 70 textos salían en el idioma
equivocado: avisos con números dentro (el puente de idioma no podía
traducirlos), algunos fijos en inglés ("Centered on node.") y otros fijos
en gallego que veía también quien jugaba en castellano ("Saíches do
camiño", "Sen cobertura…"). Ahora salen en el idioma de la misión. -
TODO.md: el acceso escalonado ya estaba hecho (lo decía PROGRESS.md).
-
Los minijuegos sparkRadar y teamRelay llevan un README: son prototipos
sin terminar y sin conectar al juego. -
Misión en gallego: el aviso "Activa GPS para obtener una posición…"
salía en castellano; ya tiene su traducción. -
Panel "Antes de salir" en un solo idioma. Mezclaba gallego
("Movemento", "Seguir sen iso") y castellano ("Lo denegaste…"). Ahora
cada texto sale en el idioma de la misión. -
El aviso de permiso denegado dice qué tocar según el móvil: en
iPhone, Ajustes › Safari; en Android, el candado de la barra de
direcciones › Permisos. Antes decía Safari a todo el mundo.
Admin: funciones del servidor que el panel no usaba.
-
Actividad (menú "Seguimiento"): el registro de eventos del servidor
(latidos, QR escaneados, acciones de admin), con filtro por estado y
"marcar como leído". -
Datos personales (en Jugadores): ver cuántas fotos de campo y
posiciones GPS hay guardadas y borrarlas. La misión, los nodos y el
progreso no se tocan. Borra datos de personas reales sin vuelta atrás,
así que hay que escribir BORRAR para confirmarlo. -
Editor de nodos: fuera 120 líneas muertas (pestañas que nunca se
conectaron, un panel sin usar y una cabecera duplicada oculta). -
Sin halos en los nodos completados ni en los pendientes. Su halo de
color en el suelo "quedaba fatal sobre el terreno". Ahora sólo llevan la
sombra de contacto, y el único halo es el del nodo que toca: su radio
real de entrada. -
Primera carga del mapa mucho más rápida. El paquete offline (unas
3.000 teselas) se bajaba tesela a tesela, y cada una tardaba ~0,7 s en ir
y volver por el túnel de Cloudflare aunque la Pi la sirviera de su disco
en 60 ms: medido en un móvil nuevo, más de 20 minutos. Ahora se baja por
lotes de 120 (nueva ruta /api/teselas/lote), tres a la vez; si el
servidor no sabe dar lotes, se vuelve a la descarga de una en una. -
Relieve de cerca sin cobertura. El paquete apenas traía el relieve
z12 (3 teselas), que es el que usa la forma del terreno: sin cobertura
el monte de cerca salía plano. Ahora entra el de toda la zona de misión. -
Relieve menos exagerado (×1,5, era ×2,2). Con 2,2, cerca de un monte
la cámara quedaba dentro del relieve y MapLibre le bajaba a la fuerza la
inclinación y el zoom: saltos al ampliar y centrado descolocado. -
Las fotos de cada nodo, en un montón al lado de su base. No se veían
hasta ampliar mucho (zoom 18) y entonces salían en fila, pequeñas y encima
del camino. Ahora cada nodo con fotos lleva un montón con la primera y
cuántas hay, que crece con el nodo y se ve desde lejos; al tocarlo se
abren todas en grande. Las fotos sueltas por el campo, como antes. -
Centrado exacto también al volver de "ver la ruta". Medido con un
móvil simulado en la ruta real: tras ver la ruta (centro en un alto) y
volver a ti, el centro del mapa estaba en tus coordenadas pero tú salías
100 px más abajo, porque MapLibre dejaba la cámara con la altura del
terreno del sitio anterior. Al acabar cada movimiento se iguala la altura
del centro con la del terreno. -
"Centrar en mí" ya centra. El precalentado de la pantalla de carga
(pasa por varios zooms y vuelve) seguía moviendo la cámara si la carga se
quitaba por tope antes de acabar, y al terminar devolvía la cámara a
donde estaba al empezar: pisaba el centrado y el seguimiento del GPS, y
al entrar el jugador podía quedar fuera de la pantalla. Ahora se para en
cuanto tocas el mapa, pides encuadrar o el GPS te sigue, y no restaura
nada.
Repaso del panel de administración, que estaba abandonado:
-
Menú por grupos: Misión (Crear, Ajustes) · Contenido (Juegos,
Objetos) · Personas y pruebas (Jugadores, Simular). "Crear" (el asistente
de plantillas) sólo existía en el menú del móvil; ahora también en
escritorio. "Familias" pasa a llamarse "Juegos". -
Cambio de contraseña: si el servidor pide cambiarla, el panel ya
tiene pantalla para hacerlo (antes se quedaba en "Access denied" sin
salida). Pantalla de acceso en castellano y centrada. -
Seguridad: fuera un último intento de carga que mandaba la
contraseña en la dirección (?password=…) a una ruta que ni existía. -
Barra de datos de la ruta (distancia, tiempo, desnivel, PLAY): tapaba
la fila de botones cuando éstos ocupaban dos líneas y se metía bajo el
menú. Ahora se coloca debajo, midiendo la barra de verdad. -
Las cinco familias de juego en los recuentos del servidor (contaba tres)
y sus nombres en castellano (Reto de movimiento, Caza de rumbo, Matriz de
circuitos, Reto de sonido). -
Textos que no se actualizaban, en toda la app. El puente de idioma
(traduce los textos de la página por detrás de React) guardaba el texto
de la primera vez y, cuando React lo cambiaba, lo devolvía a aquel: un
estado, un contador o la etiqueta de un botón que alterna se quedaban
congelados con el primer valor. Ahora acepta el texto nuevo. -
Un bucle que no paraba. El mismo puente reescribía cada texto aunque
fuera igual, eso volvía a dispararlo y recorría la página entera en cada
fotograma, siempre. Ahora sólo escribe si cambia: menos trabajo para el
móvil y más fluidez. -
Fotos de los nodos, sólo de cerca. De lejos quedaban apiladas y
clavadas en el poste del nodo. Ahora no se ven hasta el zoom 18, donde
salen repartidas bajo el nodo; tocar el nodo de lejos ya no las abre.
Las fotos en campo abierto siguen viéndose (una por sitio). -
El nodo en juego marca su radio de entrada real. Su halo medía lo
mismo en pantalla a cualquier zoom y de lejos quedaba enorme, más grande
que el trazado. Ahora es el círculo donde el juego te deja entrar, a su
tamaño de verdad sobre el mapa: velo suave y un anillo que late en el
borde, del color del tipo. -
Fotos juntas de lejos. Repartidas a cualquier zoom quedaban fatal.
Ahora se ve una por sitio hasta el zoom 18 y sólo de muy cerca se
reparten bajo el nodo para poder tocarlas. Tocar la de lejos abre todas. -
Los nodos ya no "se recargan" más grandes al ampliar. MapLibre topaba
el tamaño de cada símbolo en el del zoom siguiente a su tesela: ampliando
deprisa, el nodo se quedaba quieto hasta que llegaba la tesela y pegaba
el salto. Ahora el tamaño crece sin escalones (nodos, fotos y jugador),
con la misma curva. -
Fotos de los nodos, que se pueden tocar. Estaban todas en el mismo
punto, apiladas y debajo del nodo: al ampliar no se separaban. Ahora las
de cada sitio se reparten en filas bajo la peana del nodo, por encima del
halo, y al tocar una se abre el visor con todas empezando por esa. -
La guía por caminos se guarda. Al volver a abrir la app en el mismo
sitio sale al instante, sin esperar a que se cargue la red y se calcule. -
Centrar en mí encuadra una sola vez: el punto nuevo del GPS ya no
vuelve a mover el mapa con otro encuadre. -
El mapa no se vuelve a cargar al desampliar. Guarda en memoria ocho
niveles de zoom en vez de cinco, pide 32 teselas a la vez en vez de 16
(salen de la caché, no de la red) y las enseña sin fundido. La pantalla
de carga pasa por cada nivel de zoom hacia fuera, no a saltos. -
Botones de posición. "Centrar en mí" centra al momento con la
última posición. Antes pedía el GPS de nuevo cada vez: reiniciaba la
escucha, avisaba "Solicitando permiso de ubicación…" aunque funcionara y
no centraba hasta el punto siguiente. Si el punto es viejo, se pide otro
en silencio. "Ver la ruta" ya no pide GPS: no lo necesita. -
Quieto más de 45 s ya no desapareces del mapa: se te pinta en tu última
posición de esta sesión. Para abrir nodos sigue haciendo falta un punto
reciente. -
Zoom y arrastre más fluidos. Las animaciones del mapa (pulso del
trazado, moneda que flota, halo, guía) se pausan mientras el mapa se
mueve. Cada una cambia el estilo, y con relieve MapLibre repinta
entonces todas las texturas del terreno: diez veces por segundo en pleno
pellizco eran tirones. -
Nodos y fotos que aparecían y desaparecían. Con cada cambio de
estilo -diez por segundo, por las animaciones- se volvían a cargar todos
los datos del mapa: trazado, nodos, fotos y guía se recortaban y
recolocaban sin parar. Ahora sólo se cargan cuando cambian de verdad. -
La guía late en opacidad con un trazo fijo. Su "trazo que crece"
cambiabaline-dasharraycada 160 ms, y esa propiedad obliga a
recargar la fuente entera cada vez. -
Sin saltos al ampliar y desampliar. La forma del relieve se queda
en una sola resolución desde el zoom 12: el dato es de ~30 m y los
niveles 13 y 14 eran ese mismo dato remuestreado, distinto en cada uno;
con la exageración, al cruzar de zoom el suelo y los nodos saltaban.
De cerca, además, el relieve sale más suave. El sombreado sigue a z14. -
Nodos asentados. El halo y la sombra de cada nodo van tumbados
sobre el mapa, con su perspectiva real en cualquier punto de la
pantalla, y los nodos van a 2 m del suelo en vez de 3. -
Check integrado. Es una chapa verde en 3D pegada al canto de la
moneda: gira, flota y se ilumina con ella. Antes era una pegatina plana. -
La pantalla de carga deja el mapa preparado. Antes de quitarse
hornea todos los nodos (salían tarde, al llegar a la zona, y el mapa se
trababa mientras) y pasa por dos zooms más lejanos y por la ruta entera,
así que al desampliar ya no se queda en blanco 2-3 segundos. -
Nodos y fotos sin fundido al cambiar de zoom: ya no desaparecen y
apare...
v5.31.2
-
Misión en gallego: el aviso "Activa GPS para obtener una posición…"
salía en castellano; ya tiene su traducción. -
Panel "Antes de salir" en un solo idioma. Mezclaba gallego
("Movemento", "Seguir sen iso") y castellano ("Lo denegaste…"). Ahora
cada texto sale en el idioma de la misión. -
El aviso de permiso denegado dice qué tocar según el móvil: en
iPhone, Ajustes › Safari; en Android, el candado de la barra de
direcciones › Permisos. Antes decía Safari a todo el mundo.
Admin: funciones del servidor que el panel no usaba.
-
Actividad (menú "Seguimiento"): el registro de eventos del servidor
(latidos, QR escaneados, acciones de admin), con filtro por estado y
"marcar como leído". -
Datos personales (en Jugadores): ver cuántas fotos de campo y
posiciones GPS hay guardadas y borrarlas. La misión, los nodos y el
progreso no se tocan. Borra datos de personas reales sin vuelta atrás,
así que hay que escribir BORRAR para confirmarlo. -
Editor de nodos: fuera 120 líneas muertas (pestañas que nunca se
conectaron, un panel sin usar y una cabecera duplicada oculta). -
Sin halos en los nodos completados ni en los pendientes. Su halo de
color en el suelo "quedaba fatal sobre el terreno". Ahora sólo llevan la
sombra de contacto, y el único halo es el del nodo que toca: su radio
real de entrada. -
Primera carga del mapa mucho más rápida. El paquete offline (unas
3.000 teselas) se bajaba tesela a tesela, y cada una tardaba ~0,7 s en ir
y volver por el túnel de Cloudflare aunque la Pi la sirviera de su disco
en 60 ms: medido en un móvil nuevo, más de 20 minutos. Ahora se baja por
lotes de 120 (nueva ruta /api/teselas/lote), tres a la vez; si el
servidor no sabe dar lotes, se vuelve a la descarga de una en una. -
Relieve de cerca sin cobertura. El paquete apenas traía el relieve
z12 (3 teselas), que es el que usa la forma del terreno: sin cobertura
el monte de cerca salía plano. Ahora entra el de toda la zona de misión. -
Relieve menos exagerado (×1,5, era ×2,2). Con 2,2, cerca de un monte
la cámara quedaba dentro del relieve y MapLibre le bajaba a la fuerza la
inclinación y el zoom: saltos al ampliar y centrado descolocado. -
Las fotos de cada nodo, en un montón al lado de su base. No se veían
hasta ampliar mucho (zoom 18) y entonces salían en fila, pequeñas y encima
del camino. Ahora cada nodo con fotos lleva un montón con la primera y
cuántas hay, que crece con el nodo y se ve desde lejos; al tocarlo se
abren todas en grande. Las fotos sueltas por el campo, como antes. -
Centrado exacto también al volver de "ver la ruta". Medido con un
móvil simulado en la ruta real: tras ver la ruta (centro en un alto) y
volver a ti, el centro del mapa estaba en tus coordenadas pero tú salías
100 px más abajo, porque MapLibre dejaba la cámara con la altura del
terreno del sitio anterior. Al acabar cada movimiento se iguala la altura
del centro con la del terreno. -
"Centrar en mí" ya centra. El precalentado de la pantalla de carga
(pasa por varios zooms y vuelve) seguía moviendo la cámara si la carga se
quitaba por tope antes de acabar, y al terminar devolvía la cámara a
donde estaba al empezar: pisaba el centrado y el seguimiento del GPS, y
al entrar el jugador podía quedar fuera de la pantalla. Ahora se para en
cuanto tocas el mapa, pides encuadrar o el GPS te sigue, y no restaura
nada.
Repaso del panel de administración, que estaba abandonado:
-
Menú por grupos: Misión (Crear, Ajustes) · Contenido (Juegos,
Objetos) · Personas y pruebas (Jugadores, Simular). "Crear" (el asistente
de plantillas) sólo existía en el menú del móvil; ahora también en
escritorio. "Familias" pasa a llamarse "Juegos". -
Cambio de contraseña: si el servidor pide cambiarla, el panel ya
tiene pantalla para hacerlo (antes se quedaba en "Access denied" sin
salida). Pantalla de acceso en castellano y centrada. -
Seguridad: fuera un último intento de carga que mandaba la
contraseña en la dirección (?password=…) a una ruta que ni existía. -
Barra de datos de la ruta (distancia, tiempo, desnivel, PLAY): tapaba
la fila de botones cuando éstos ocupaban dos líneas y se metía bajo el
menú. Ahora se coloca debajo, midiendo la barra de verdad. -
Las cinco familias de juego en los recuentos del servidor (contaba tres)
y sus nombres en castellano (Reto de movimiento, Caza de rumbo, Matriz de
circuitos, Reto de sonido). -
Textos que no se actualizaban, en toda la app. El puente de idioma
(traduce los textos de la página por detrás de React) guardaba el texto
de la primera vez y, cuando React lo cambiaba, lo devolvía a aquel: un
estado, un contador o la etiqueta de un botón que alterna se quedaban
congelados con el primer valor. Ahora acepta el texto nuevo. -
Un bucle que no paraba. El mismo puente reescribía cada texto aunque
fuera igual, eso volvía a dispararlo y recorría la página entera en cada
fotograma, siempre. Ahora sólo escribe si cambia: menos trabajo para el
móvil y más fluidez. -
Fotos de los nodos, sólo de cerca. De lejos quedaban apiladas y
clavadas en el poste del nodo. Ahora no se ven hasta el zoom 18, donde
salen repartidas bajo el nodo; tocar el nodo de lejos ya no las abre.
Las fotos en campo abierto siguen viéndose (una por sitio). -
El nodo en juego marca su radio de entrada real. Su halo medía lo
mismo en pantalla a cualquier zoom y de lejos quedaba enorme, más grande
que el trazado. Ahora es el círculo donde el juego te deja entrar, a su
tamaño de verdad sobre el mapa: velo suave y un anillo que late en el
borde, del color del tipo. -
Fotos juntas de lejos. Repartidas a cualquier zoom quedaban fatal.
Ahora se ve una por sitio hasta el zoom 18 y sólo de muy cerca se
reparten bajo el nodo para poder tocarlas. Tocar la de lejos abre todas. -
Los nodos ya no "se recargan" más grandes al ampliar. MapLibre topaba
el tamaño de cada símbolo en el del zoom siguiente a su tesela: ampliando
deprisa, el nodo se quedaba quieto hasta que llegaba la tesela y pegaba
el salto. Ahora el tamaño crece sin escalones (nodos, fotos y jugador),
con la misma curva. -
Fotos de los nodos, que se pueden tocar. Estaban todas en el mismo
punto, apiladas y debajo del nodo: al ampliar no se separaban. Ahora las
de cada sitio se reparten en filas bajo la peana del nodo, por encima del
halo, y al tocar una se abre el visor con todas empezando por esa. -
La guía por caminos se guarda. Al volver a abrir la app en el mismo
sitio sale al instante, sin esperar a que se cargue la red y se calcule. -
Centrar en mí encuadra una sola vez: el punto nuevo del GPS ya no
vuelve a mover el mapa con otro encuadre. -
El mapa no se vuelve a cargar al desampliar. Guarda en memoria ocho
niveles de zoom en vez de cinco, pide 32 teselas a la vez en vez de 16
(salen de la caché, no de la red) y las enseña sin fundido. La pantalla
de carga pasa por cada nivel de zoom hacia fuera, no a saltos. -
Botones de posición. "Centrar en mí" centra al momento con la
última posición. Antes pedía el GPS de nuevo cada vez: reiniciaba la
escucha, avisaba "Solicitando permiso de ubicación…" aunque funcionara y
no centraba hasta el punto siguiente. Si el punto es viejo, se pide otro
en silencio. "Ver la ruta" ya no pide GPS: no lo necesita. -
Quieto más de 45 s ya no desapareces del mapa: se te pinta en tu última
posición de esta sesión. Para abrir nodos sigue haciendo falta un punto
reciente. -
Zoom y arrastre más fluidos. Las animaciones del mapa (pulso del
trazado, moneda que flota, halo, guía) se pausan mientras el mapa se
mueve. Cada una cambia el estilo, y con relieve MapLibre repinta
entonces todas las texturas del terreno: diez veces por segundo en pleno
pellizco eran tirones. -
Nodos y fotos que aparecían y desaparecían. Con cada cambio de
estilo -diez por segundo, por las animaciones- se volvían a cargar todos
los datos del mapa: trazado, nodos, fotos y guía se recortaban y
recolocaban sin parar. Ahora sólo se cargan cuando cambian de verdad. -
La guía late en opacidad con un trazo fijo. Su "trazo que crece"
cambiabaline-dasharraycada 160 ms, y esa propiedad obliga a
recargar la fuente entera cada vez. -
Sin saltos al ampliar y desampliar. La forma del relieve se queda
en una sola resolución desde el zoom 12: el dato es de ~30 m y los
niveles 13 y 14 eran ese mismo dato remuestreado, distinto en cada uno;
con la exageración, al cruzar de zoom el suelo y los nodos saltaban.
De cerca, además, el relieve sale más suave. El sombreado sigue a z14. -
Nodos asentados. El halo y la sombra de cada nodo van tumbados
sobre el mapa, con su perspectiva real en cualquier punto de la
pantalla, y los nodos van a 2 m del suelo en vez de 3. -
Check integrado. Es una chapa verde en 3D pegada al canto de la
moneda: gira, flota y se ilumina con ella. Antes era una pegatina plana. -
La pantalla de carga deja el mapa preparado. Antes de quitarse
hornea todos los nodos (salían tarde, al llegar a la zona, y el mapa se
trababa mientras) y pasa por dos zooms más lejanos y por la ruta entera,
así que al desampliar ya no se queda en blanco 2-3 segundos. -
Nodos y fotos sin fundido al cambiar de zoom: ya no desaparecen y
aparecen al desampliar. Las teselas pedidas no se cancelan a mitad del
pellizco. -
Nodos más grandes a zoom medio (de 15 a 17), sin cambiar el de cerca.
-
Halo del suelo más ancho, y el trazado cosido a sus nodos: la línea del
camino llega hasta el nodo aunque el track se grabara a unos metros. -
Los nodos, un 30 % más grandes, con la peana y el aro de la base más
anchos. -
Los completados, en gris del todo (poste, cubo, moneda y brillo del
suelo) y con el check verde más grande. A medio apagar quedaban raros. -
**Los nodos son poképa...