|
1 | | -# Pirámide Mobile Multijugador |
| 1 | +# Pirámide Mobile Multijugador — beta Spark |
2 | 2 |
|
3 | | -Versión online de Pirámide con salas para 3 a 12 jugadores, anfitrión, sincronización en tiempo real y manos privadas o visibles para todos. |
| 3 | +Versión online de Pirámide para 2 a 8 jugadores. Funciona con Firebase Authentication anónima, Realtime Database y GitHub Pages, sin Cloud Functions, Cloud Run, servidores propios ni servicios que requieran facturación. |
4 | 4 |
|
5 | | -## Funciones incluidas |
| 5 | +> Esta implementación está diseñada para pruebas privadas. La lógica crítica se ejecuta en los clientes y no ofrece seguridad equivalente a un backend confiable. |
6 | 6 |
|
7 | | -- Autenticación anónima persistente. |
8 | | -- Creación y acceso mediante códigos de seis caracteres. |
9 | | -- Lobby con configuración exclusiva del anfitrión. |
10 | | -- Selector `settings.handVisibility` con valores `private` y `public`. |
11 | | -- Bloqueo de configuración al comenzar. |
12 | | -- Reparto y acciones validadas por Cloud Functions. |
13 | | -- Manos privadas en `privateHands/{roomCode}/{playerUid}/cards`. |
14 | | -- Manos públicas en `rooms/{roomCode}/publicHands/{playerUid}/cards`. |
15 | | -- Bluff automático desactivado en modalidad pública. |
16 | | -- Declaraciones, aceptación, desafío y consumo autoritativo de cartas. |
17 | | -- Presencia, reconexión y limpieza de listeners. |
18 | | -- Nueva ronda con regreso al lobby. |
19 | | -- Reglas que impiden editar configuraciones, cartas, cargas o puntajes desde el cliente. |
| 7 | +La advertencia anterior es parte de la documentación y no se muestra dentro de la interfaz normal del juego. La versión local continúa aislada en `../PIRAMIDE-MOBILE-SIMPLE`. |
20 | 8 |
|
21 | | -La versión local continúa aislada en `../PIRAMIDE-MOBILE-SIMPLE`. |
| 9 | +## Qué incluye |
22 | 10 |
|
23 | | -## Requisitos |
| 11 | +- Salas con códigos únicos de seis caracteres, sin `O`, `0`, `I` ni `1`. |
| 12 | +- Autenticación anónima persistente y reconexión después de actualizar. |
| 13 | +- Lobby, presencia con `.info/connected` y configuración exclusiva del host. |
| 14 | +- Reparto desde el navegador del host con manos privadas o públicas. |
| 15 | +- Mazo oculto de la pirámide en `hostState/{roomCode}` y cartas reveladas en la sala. |
| 16 | +- Declaraciones, bluff, aceptación, desafío, cargas y puntajes sincronizados. |
| 17 | +- Cierre manual de sala y vencimiento lógico después de 12 horas. |
| 18 | +- Reglas para reducir modificaciones accidentales y limitar manos privadas. |
24 | 19 |
|
25 | | -- Node.js 20. |
26 | | -- Firebase CLI. |
27 | | -- Un proyecto Firebase con plan compatible con Cloud Functions. |
28 | | -- Authentication anónima activada. |
29 | | -- Realtime Database creada. |
| 20 | +La carpeta `functions/` se conserva únicamente como respaldo histórico. No forma parte del frontend, de `firebase.json` ni del despliegue beta. |
30 | 21 |
|
31 | | -## Configuración |
| 22 | +## Arquitectura de datos |
32 | 23 |
|
33 | | -1. El frontend ya está configurado para el proyecto `vacila-cb462`. |
34 | | -2. Verifica que Realtime Database use `https://vacila-cb462-default-rtdb.firebaseio.com/`. |
35 | | -3. Activa el proveedor **Anónimo** en Authentication. |
36 | | -4. Copia `.firebaserc.example` como `.firebaserc` si quieres usar comandos manuales de Firebase sin pasar `--project vacila-cb462`. |
37 | | -5. Instala dependencias: |
| 24 | +- `rooms/{roomCode}`: lobby, jugadores, configuración y estado público. |
| 25 | +- `privateHands/{roomCode}/{uid}/cards`: mano legible solamente por su dueño. |
| 26 | +- `rooms/{roomCode}/publicHands`: manos visibles para integrantes de la sala. |
| 27 | +- `hostState/{roomCode}/pyramidDeck`: pirámide oculta, legible solamente por el host. |
| 28 | +- `claimProofs/{roomCode}/{claimId}`: carta puntual usada para resolver un desafío privado. |
38 | 29 |
|
39 | | -```bash |
40 | | -npm install |
41 | | -npm --prefix functions install |
42 | | -``` |
| 30 | +El host genera el mazo y escribe temporalmente las manos. `clearSensitiveDealData()` limpia los arrays de reparto al finalizar. Esto mejora la privacidad cotidiana, pero un usuario avanzado aún podría manipular su cliente. |
43 | 31 |
|
44 | | -La región configurada es `southamerica-west1`. Si la cambias en `functions/index.js`, actualiza también `functionsRegion` en `js/firebase-config.js`. |
| 32 | +## Preparar Firebase en Spark |
45 | 33 |
|
46 | | -## Emuladores y pruebas |
| 34 | +1. Crea un proyecto en [Firebase Console](https://console.firebase.google.com/). |
| 35 | +2. En **Authentication → Sign-in method**, activa el proveedor **Anónimo** y agrega tu dominio de GitHub Pages en **Authorized domains**. |
| 36 | +3. Crea una **Realtime Database**. |
| 37 | +4. Registra una aplicación web y pega su `firebaseConfig` en `js/firebase-config.js`. Este repositorio ya contiene la configuración de `vacila-cb462`. |
| 38 | +5. Instala Firebase CLI si todavía no lo tienes e inicia sesión. |
| 39 | +6. Desde esta carpeta publica solamente las reglas: |
47 | 40 |
|
48 | 41 | ```bash |
49 | | -npm run emulators |
50 | | -npm test |
| 42 | +firebase deploy --project vacila-cb462 --only database |
51 | 43 | ``` |
52 | 44 |
|
53 | | -Las pruebas cubren reparto, compatibilidad de bluff, consumo único de cartas, privacidad, permisos de sala, presencia y rechazo de escrituras ilegales. |
| 45 | +También puedes usar: |
54 | 46 |
|
55 | | -Vistas sin Firebase: |
| 47 | +```bash |
| 48 | +npm install |
| 49 | +npm run deploy |
| 50 | +``` |
56 | 51 |
|
57 | | -- `index.html?demo=lobby` |
58 | | -- `index.html?demo=private` |
59 | | -- `index.html?demo=public` |
| 52 | +El script `deploy` ejecuta exclusivamente el despliegue de Realtime Database. No uses `firebase deploy --only functions` para esta beta. |
60 | 53 |
|
61 | | -## Despliegue |
| 54 | +## Publicar el frontend |
62 | 55 |
|
63 | | -Ejecuta desde la carpeta `PIRAMIDE-MOBILE-MULTIJUGADOR`: |
| 56 | +Publica la carpeta del repositorio con GitHub Pages. El juego carga los módulos Firebase desde el CDN oficial y no necesita un proceso de compilación. Si Pages sirve el repositorio completo, la entrada es: |
64 | 57 |
|
65 | | -```bash |
66 | | -cd functions |
67 | | -npm install |
68 | | -cd .. |
69 | | -firebase deploy --project vacila-cb462 --only functions |
| 58 | +```text |
| 59 | +PIRAMIDE-MOBILE-MULTIJUGADOR/index.html |
70 | 60 | ``` |
71 | 61 |
|
72 | | -Las funciones usan Cloud Functions de segunda generación en `southamerica-west1`, son callable mediante el SDK de Firebase y tienen CORS habilitado. El frontend usa Firebase JavaScript SDK modular 12.15.0. |
| 62 | +## Desarrollo y pruebas |
73 | 63 |
|
74 | | -Para publicar además Hosting y las reglas de Realtime Database puedes usar: |
| 64 | +Con Node.js, Firebase CLI y las dependencias instaladas: |
75 | 65 |
|
76 | 66 | ```bash |
77 | | -npm run deploy |
| 67 | +npm run emulators |
| 68 | +npm test |
78 | 69 | ``` |
79 | 70 |
|
80 | | -El script ya apunta al proyecto `vacila-cb462`. |
| 71 | +Vistas visuales sin Firebase: |
81 | 72 |
|
82 | | -### Verificación posterior al despliegue |
83 | | - |
84 | | -1. Crear una sala desde `http://127.0.0.1:5500`. |
85 | | -2. Unirse desde `http://localhost:5500` en otra pestaña. |
86 | | -3. Unirse desde otro teléfono. |
87 | | -4. Repetir la prueba desde `https://juegosparavacilar.cl` y GitHub Pages. |
88 | | -5. Confirmar en la consola que no aparezcan errores CORS. |
89 | | -6. Comprobar que las callables reciban `request.auth.uid`. |
90 | | -7. Confirmar que un invitado no pueda cambiar ajustes, iniciar, revelar cartas ni finalizar la partida. |
91 | | - |
92 | | -## Modelo de seguridad |
| 73 | +- `index.html?demo=lobby` |
| 74 | +- `index.html?demo=private` |
| 75 | +- `index.html?demo=public` |
93 | 76 |
|
94 | | -Los clientes solo pueden: |
| 77 | +## Lista de comprobación |
95 | 78 |
|
96 | | -- Leer una sala a la que pertenecen. |
97 | | -- Leer su propia mano privada. |
98 | | -- Leer las manos públicas de su sala. |
99 | | -- Actualizar sus campos de presencia. |
100 | | -- Invocar funciones autenticadas. |
| 79 | +1. Crear una sala y confirmar que el código tenga seis caracteres válidos. |
| 80 | +2. Entrar desde dos teléfonos adicionales con cuentas anónimas distintas. |
| 81 | +3. Ver los tres jugadores y sus cambios de conexión en tiempo real. |
| 82 | +4. Probar manos privadas; cada teléfono debe leer solo la propia. |
| 83 | +5. Probar manos públicas; todos deben ver cartas disponibles y usadas. |
| 84 | +6. Confirmar que un invitado no pueda configurar, iniciar, revelar, reiniciar ni cerrar. |
| 85 | +7. Revelar las 15 cartas y comprobar la sincronización de pisos y multiplicadores. |
| 86 | +8. Probar una coincidencia real, un bluff aceptado y un bluff desafiado. |
| 87 | +9. Actualizar una página y confirmar la reconexión sin abrir automáticamente la mano. |
| 88 | +10. Cerrar la sala como host y comprobar que desaparezcan sala, manos y estado oculto. |
| 89 | +11. Verificar en la consola de red que no existan solicitudes a `cloudfunctions.net`. |
101 | 90 |
|
102 | | -Todos los cambios de configuración y partida se ejecutan con Admin SDK dentro de Cloud Functions. Las rutas `roomSecrets` nunca son legibles por clientes y almacenan temporalmente la verdad de una declaración para que un bluff no pueda descubrirse inspeccionando la sala. |
| 91 | +No existe una tarea programada en Spark para borrar salas exactamente al vencer. La aplicación rechaza salas de más de 12 horas y el host puede cerrarlas manualmente. |
103 | 92 |
|
104 | 93 | ## Archivos principales |
105 | 94 |
|
106 | | -- `js/app.js`: interfaz, listeners y privacidad al perder foco. |
107 | | -- `js/firebase-service.js`: Authentication, Database y callables. |
108 | | -- `functions/index.js`: servidor autoritativo. |
109 | | -- `functions/src/game.js`: reparto y reglas puras. |
110 | | -- `database.rules.json`: autorización de clientes. |
111 | | -- `tests/rules.test.mjs`: pruebas de reglas con Emulator Suite. |
| 95 | +- `js/app.js`: interfaz, estado visual y listeners. |
| 96 | +- `js/firebase-service.js`: Auth, transacciones, presencia y lógica beta. |
| 97 | +- `database.rules.json`: permisos de Realtime Database. |
| 98 | +- `firebase.json`: reglas, hosting opcional y emuladores sin Functions. |
| 99 | +- `tests/rules.test.mjs`: pruebas de privacidad y permisos. |
0 commit comments