Skip to content

Commit 0ee19db

Browse files
sala online beta
1 parent 639f10f commit 0ee19db

11 files changed

Lines changed: 4148 additions & 323 deletions

File tree

Lines changed: 65 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,99 @@
1-
# Pirámide Mobile Multijugador
1+
# Pirámide Mobile Multijugador — beta Spark
22

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.
44

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.
66
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`.
208

21-
La versión local continúa aislada en `../PIRAMIDE-MOBILE-SIMPLE`.
9+
## Qué incluye
2210

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.
2419

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.
3021

31-
## Configuración
22+
## Arquitectura de datos
3223

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.
3829

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.
4331

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
4533

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:
4740

4841
```bash
49-
npm run emulators
50-
npm test
42+
firebase deploy --project vacila-cb462 --only database
5143
```
5244

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:
5446

55-
Vistas sin Firebase:
47+
```bash
48+
npm install
49+
npm run deploy
50+
```
5651

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.
6053

61-
## Despliegue
54+
## Publicar el frontend
6255

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:
6457

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
7060
```
7161

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
7363

74-
Para publicar además Hosting y las reglas de Realtime Database puedes usar:
64+
Con Node.js, Firebase CLI y las dependencias instaladas:
7565

7666
```bash
77-
npm run deploy
67+
npm run emulators
68+
npm test
7869
```
7970

80-
El script ya apunta al proyecto `vacila-cb462`.
71+
Vistas visuales sin Firebase:
8172

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`
9376

94-
Los clientes solo pueden:
77+
## Lista de comprobación
9578

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`.
10190

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.
10392

10493
## Archivos principales
10594

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.

PIRAMIDE-MOBILE-MULTIJUGADOR/css/styles.css

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,45 @@ code {
622622
border-top: 1px solid var(--line);
623623
}
624624

625+
.multiplier-setting {
626+
padding: 10px 4px 16px;
627+
}
628+
629+
.multiplier-setting > span {
630+
display: grid;
631+
margin-bottom: 10px;
632+
}
633+
634+
.multiplier-setting small {
635+
color: var(--muted);
636+
font-size: .69rem;
637+
}
638+
639+
.multiplier-inputs {
640+
display: grid;
641+
grid-template-columns: repeat(5, minmax(0, 1fr));
642+
gap: 7px;
643+
}
644+
645+
.multiplier-inputs label {
646+
display: grid;
647+
gap: 4px;
648+
text-align: center;
649+
}
650+
651+
.multiplier-inputs input {
652+
width: 100%;
653+
min-width: 0;
654+
padding: 9px 4px;
655+
border: 1px solid var(--line);
656+
border-radius: 10px;
657+
color: var(--text);
658+
background: rgba(255, 255, 255, .04);
659+
font: inherit;
660+
font-weight: 800;
661+
text-align: center;
662+
}
663+
625664
.select-setting > span,
626665
.toggle-setting > span {
627666
display: grid;
@@ -1088,6 +1127,33 @@ code {
10881127
gap: 9px;
10891128
}
10901129

1130+
.claim-card-options {
1131+
margin: 14px 0 18px;
1132+
display: grid;
1133+
grid-template-columns: repeat(2, minmax(0, 1fr));
1134+
gap: 9px;
1135+
}
1136+
1137+
.claim-card-options .choice-card {
1138+
grid-template-columns: 1fr;
1139+
color: var(--text);
1140+
font: inherit;
1141+
font-weight: 800;
1142+
text-align: center;
1143+
}
1144+
1145+
.connection-warning {
1146+
margin: 0 0 14px;
1147+
padding: 11px 14px;
1148+
border: 1px solid rgba(255, 184, 77, .3);
1149+
border-radius: 14px;
1150+
color: #ffd39a;
1151+
background: rgba(255, 153, 51, .08);
1152+
font-size: .78rem;
1153+
font-weight: 750;
1154+
text-align: center;
1155+
}
1156+
10911157
.target-grid button {
10921158
min-height: 78px;
10931159
padding: 10px;

0 commit comments

Comments
 (0)