{"id":30730551,"url":"https://github.com/heedrox/who-lies","last_synced_at":"2026-02-13T11:29:34.136Z","repository":{"id":310066690,"uuid":"1038571626","full_name":"heedrox/who-lies","owner":"heedrox","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-23T14:26:56.000Z","size":944,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-23T18:51:32.595Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/heedrox.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-15T12:59:21.000Z","updated_at":"2025-08-23T14:26:59.000Z","dependencies_parsed_at":"2025-08-15T15:35:08.169Z","dependency_job_id":"39b50877-9c40-4e7e-bedf-a08f35d3988b","html_url":"https://github.com/heedrox/who-lies","commit_stats":null,"previous_names":["heedrox/who-lies"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/heedrox/who-lies","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heedrox%2Fwho-lies","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heedrox%2Fwho-lies/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heedrox%2Fwho-lies/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heedrox%2Fwho-lies/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/heedrox","download_url":"https://codeload.github.com/heedrox/who-lies/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heedrox%2Fwho-lies/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273473504,"owners_count":25112203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-09-03T16:35:51.400Z","updated_at":"2026-02-13T11:29:34.080Z","avatar_url":"https://github.com/heedrox.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WHO LIES - Murder Mystery Game\n\nUn juego de misterio tipo Cluedo donde debes triangular información para descubrir al asesino.\n\n## 🎯 ¿Qué es WHO LIES?\n\n**WHO LIES** es un juego de misterio y deducción donde los jugadores deben triangular información para descubrir quién es el asesino. El juego se desarrolla en un entorno de \"murder mystery\" similar a Cluedo, pero con un enfoque en la triangulación de pistas y la lógica deductiva.\n\n### 🎮 Concepto del juego\n- **Objetivo**: Descubrir al asesino mediante la triangulación de información\n- **Mecánica**: Los jugadores reciben información parcial y deben conectarla para resolver el misterio\n- **Ambiente**: Tema de \"murder mystery\" con estética de suspense\n- **Plataforma**: Web optimizada para móviles en modo vertical\n\n## 🏰 El mundo del juego\n\n### 📍 Estancias (9 ubicaciones)\nEl juego se desarrolla en una mansión dividida en 9 estancias organizadas en una cuadrícula 3x3:\n\n```\n┌─────────────────┬─────────────────┬─────────────────────┐\n│     COCINA      │  PASILLO NORTE  │  HABITACIÓN         │\n│                 │                 │   PRINCIPAL         │\n├─────────────────┼─────────────────┼─────────────────────┤\n│    COMEDOR      │                 │  HABITACIÓN         │\n│                 │                 │   INVITADOS         │\n├─────────────────┼─────────────────┼─────────────────────┤\n│  TORREÓN OESTE  │  PASILLO SUR    │   TORREÓN ESTE      │\n└─────────────────┴─────────────────┴─────────────────────┘\n```\n\n\n\n### 👥 Sistema de jugadores\n- Los jugadores se mueven entre estancias\n- Pueden ver a otros jugadores en estancias específicas\n- La información se comparte de forma parcial para fomentar la deducción\n- **Selección de jugador**: URL con formato `?/g/CODIGO_JUEGO/p/x/TOTAL_JUGADORES` muestra pantalla de selección\n- **Pantalla de selección**: Muestra opciones JUG. 1, JUG. 2, ..., JUG. N para elegir número de jugador\n- **Redirección automática**: Al seleccionar jugador, redirige a `?/g/CODIGO_JUEGO/p/NUMERO_JUGADOR/TOTAL_JUGADORES`\n\n## 🔍 Mecánicas de juego\n\n### 📋 Información del jugador\nCada jugador recibe información como:\n- **Ubicación actual**: \"Estás en HABITACIÓN INVITADOS\"\n- **Jugadores visibles**: \"Contigo ves a JUGADOR 2\"\n- **Vistas a distancia**: \"Puedes ver en la HABITACIÓN PRINCIPAL a JUGADOR 4\"\n\n### 🧩 Triangulación de pistas\n- Los jugadores deben combinar su información con la de otros\n- Cada pieza de información es una pista que debe ser conectada\n- La resolución del misterio requiere colaboración y deducción lógica\n\n### 👁️ Sistema de visibilidad por habitación\n- **Reglas de visibilidad**: Cada habitación solo puede ver a habitaciones contiguas específicas\n- **Distribución de visibilidad**:\n  - **Cocina**: Ve a Pasillo Norte y Comedor\n  - **Pasillo Norte**: Ve a Cocina y Habitación Principal\n  - **Habitación Principal**: Ve a Pasillo Norte y Habitación Invitados\n  - **Comedor**: Ve a Cocina y Torreón Oeste\n  - **Habitación Invitados**: Ve a Habitación Principal y Torreón Este\n  - **Torreón Oeste**: Ve a Comedor y Pasillo Sur\n  - **Pasillo Sur**: Ve a Torreón Oeste y Torreón Este\n  - **Torreón Este**: Ve a Pasillo Sur y Habitación Invitados\n- **Ventaja para roles especiales**: ASESINO y COMPLICE pueden ver a todos los jugadores en todas las habitaciones\n- **Sistema de visibilidad centralizado**: Se genera un diccionario `{ 1: [3,4], 2: [1,5], ... }` al crear la distribución\n- **Probabilidad del 60% para INVITADOS**: Se aplica una sola vez, no en cada actualización de la UI\n- **Almacenamiento en Firebase**: La visibilidad se guarda junto con la distribución y roles para consistencia\n- **Sin recálculo**: Cada jugador mantiene la misma visibilidad durante toda la partida\n\n### 🎲 Estructura de rondas\n- El juego se divide en rondas\n- Cada ronda proporciona nueva información\n- Los jugadores pueden \"TERMINAR RONDA\" para avanzar\n\n### 👥 Distribución de jugadores\n- **Inicialización automática**: Solo el jugador 1 (X=1) ejecuta la distribución\n- **Distribución aleatoria**: Los jugadores se colocan aleatoriamente en las 9 estancias\n- **Regla de validación**: Al menos una estancia debe tener 2 o más jugadores\n- **Formato de datos**: Diccionario JSON listo para integración con base de datos NoSQL\n- **Ejemplo de salida**: `{ 'cocina': [3,2], 'pasillo_norte': [1], ... }`\n\n### 🎭 Sistema de roles\n- **Asignación automática**: Los roles se asignan automáticamente al crear la distribución\n- **ASESINO**: Siempre se asigna 1 jugador aleatorio\n- **COMPLICE**: \n  - **4 jugadores**: 0 complices (array vacío)\n  - **5+ jugadores**: 1 complice (array con 1 elemento)\n- **Validación**: El COMPLICE siempre es diferente al ASESINO\n- **Formato de roles**: `{ \"ASESINO\": 3, \"COMPLICE\": [1] }`\n\n### 🎯 Sistema de acusaciones colectivas\n- **Director de juego**: Solo el jugador 1 puede ejecutar acusaciones\n- **Acusaciones grupales**: El jugador 1 representa la decisión colectiva del grupo\n- **Interfaz visual**: Celdas de estado de jugadores clickeables en la parte superior\n- **Modal de confirmación**: \"¿ACUSAR AL JUG. X?\" con botones SÍ/NO\n- **Resultados de acusación**:\n  - **Éxito**: \"¡FELICIDADES! ¡HABÉIS MATADO AL ASESINO!\" si el acusado es el ASESINO\n  - **Fracaso**: El jugador acusado se marca como muerto y la partida continúa\n- **Integración con Firebase**: Los jugadores muertos se sincronizan en tiempo real\n- **Prevención de auto-acusación**: El jugador 1 puede acusar a cualquier jugador, incluyendo J1\n\n### ❓ Sistema de anotación de preguntas\n- **Botón de anotación**: Botón \"ANOTAR PREGUNTA\" visible en el footer durante el turno de juego\n- **Contadores visuales**: Palos \"I\" (i mayúscula) se muestran debajo de cada avatar de jugador\n- **Acumulación ilimitada**: No hay límite en el número de preguntas que puede anotar cada jugador\n- **Sincronización en tiempo real**: Los contadores se actualizan automáticamente para todos los jugadores\n- **Almacenamiento en Firebase**: Los contadores se guardan en el campo `numberQuestionsMade` a nivel de `gameCode`\n- **Estructura de datos**: Diccionario `{ 1: 2, 2: 1, 3: 0, ... }` donde cada número representa las preguntas del jugador\n- **Persistencia**: Los contadores se mantienen al recargar la página\n- **Reset automático**: Al reiniciar el juego, todos los contadores se ponen a cero\n- **Visibilidad condicional**: El botón solo aparece durante el turno de juego, no durante el turno de movimiento\n\n### 🎮 Sistema de configuración de partida optimizado\n- **Acceso directo con código de juego**: URLs del formato `?/g/{CODIGO_JUEGO}` para iniciar partidas\n- **Selección de número de jugadores**: Pantalla para elegir entre 4 y 15 jugadores\n- **Flujo secuencial de configuración**: Sistema de pantallas paso a paso para configurar la partida\n- **Redirección automática**: Navegación fluida entre pantallas de configuración\n- **Integración con autenticación**: Flujo de login antes de la configuración de la partida\n- **Interfaz consistente**: Diseño uniforme con el resto del juego\n- **Validación de parámetros**: Solo acepta números de jugadores válidos (4-15)\n\n## 💻 Contexto de desarrollo\n\n### 🚀 Origen del proyecto\nEste proyecto nació de una conversación de desarrollo donde se conceptualizó un juego web de misterio para dispositivos móviles. La idea era crear una interfaz intuitiva que permitiera a los jugadores enfocarse en la lógica del juego sin distracciones.\n\n### 🎨 Decisiones de diseño\n- **Tema visual**: Colores oscuros con acentos rojos para crear atmósfera de misterio\n- **Layout**: Cuadrícula 3x3 para las estancias, fácil de entender en móvil\n- **Responsive**: Optimizado para pantallas verticales de dispositivos móviles\n- **Tipografía**: Fuente Georgia para dar un toque clásico y elegante\n\n### 🔧 Evolución técnica\n1. **Interfaz básica**: HTML simple con estancias\n2. **Guía de elementos**: Sistema de categorías (venenos, herramientas, armas)\n3. **Optimización**: Reducción de espaciado y tamaños para mejor ajuste móvil\n4. **Entorno de desarrollo**: Configuración completa con Node.js 20 y npm scripts\n5. **Sistema de jugadores**: Distribución aleatoria en estancias con parámetros de URL\n6. **Preparación para BD**: Estructura de datos lista para integración con NoSQL\n7. **Sistema de autenticación**: Firebase con login anónimo para gestión de sesiones\n8. **Interfaz de usuario**: Sistema de login/logout con transiciones suaves\n9. **Sistema de roles**: Asignación automática de ASESINO y COMPLICE con validaciones\n\n## 🚀 Requisitos del sistema\n\n- **Node.js**: Versión 20.x (recomendado 20.18.3+)\n- **npm**: Versión 10.x (recomendado 10.8.2+)\n- **Firebase**: Proyecto configurado con Authentication habilitado\n\n## 📦 Instalación\n\n### 1. Clonar el repositorio\n```bash\ngit clone \u003ctu-repositorio\u003e\ncd who-lies\n```\n\n### 2. Usar Node.js 20 (con nvm)\n```bash\n# Si usas nvm\nnvm use 20\n\n# O instalar Node.js 20 si no lo tienes\nnvm install 20\nnvm use 20\n```\n\n### 3. Instalar dependencias\n```bash\nnpm install\n```\n\n### 4. Configurar Firebase\n```bash\n# Crear proyecto en Firebase Console\n# Habilitar Authentication → Anonymous\n# Copiar configuración a web/firebase-config.js\n```\n\n**Ver archivo `FIREBASE_SETUP.md` para instrucciones detalladas.**\n\n## 🛠️ Desarrollo\n\n### Iniciar servidor\nPara iniciar el servidor de desarrollo:\n\n```bash\nnpm run dev\n```\n\nEsto abrirá automáticamente tu navegador en `http://localhost:3000`\n\n### Tests automatizados\nEl proyecto incluye tests automatizados generados con Playwright:\n\n```bash\n# Ejecutar todos los tests\nnpm run test:e2e\n\n# Ejecutar tests específicos\nnpm run test:e2e -- test/generated/5-test-annotate-making-questions.spec.js\n\n# Ejecutar tests en modo visible\nnpm run test:e2e -- --headed\n```\n\n**Tests implementados:**\n- ✅ **Funcionalidad \"ANOTAR PREGUNTA\"** - 5 tests que validan botón, contadores, sincronización y persistencia\n- ✅ **Patrón Page Object** - Tests refactorizados usando clases y métodos reutilizables\n- ✅ **Cobertura completa** - Todos los casos de uso documentados en `test/5-test-annotate-making-questions.md`\n\n### Funcionalidad de distribución de jugadores\nLa nueva funcionalidad se ejecuta automáticamente cuando:\n1. **URL contiene parámetros**: `?X/Y` (ej: `?1/6`)\n2. **X = 1**: Solo el jugador 1 ejecuta la distribución\n3. **Evento onload**: Se ejecuta al cargar la página\n\n**Funciones implementadas:**\n- `getUrlParams()`: Extrae parámetros X/Y de la URL\n- `distributePlayers(totalPlayers)`: Distribuye jugadores aleatoriamente\n- `assignPlayerRoles(totalPlayers)`: Asigna roles ASESINO y COMPLICE automáticamente\n- `initializeGame()`: Función principal que coordina la inicialización\n\n**Validaciones implementadas:**\n- Garantiza que al menos una estancia tenga 2+ jugadores\n- Distribuye el resto de jugadores aleatoriamente (0, 1, 2 o 3 por estancia)\n- Asigna roles según el número de jugadores (4 jugadores: solo ASESINO, 5+: ASESINO + COMPLICE)\n- Garantiza que ASESINO y COMPLICE sean jugadores diferentes\n- Genera diccionario JSON en consola para fácil copia\n\n### Servidor de desarrollo\n- **Puerto**: 3000\n- **Hot-reload**: Automático al cambiar archivos\n- **Directorio servido**: `web/`\n- **URL**: `http://127.0.0.1:3000`\n\n## 📜 Scripts disponibles\n\n- **`npm run dev`** - Inicia el servidor de desarrollo y abre el navegador\n- **`npm start`** - Inicia el servidor de desarrollo sin abrir el navegador\n- **`npm run build`** - Comando de build (placeholder para futuras funcionalidades)\n- **`npm test`** - Comando de tests (placeholder para futuras funcionalidades)\n\n## 🏗️ Tecnologías\n\n- **Frontend**: HTML5, CSS3 (con gradientes y efectos visuales), JavaScript vanilla\n- **Servidor de desarrollo**: Live Server\n- **Gestión de paquetes**: npm\n- **Entorno**: Node.js 20\n- **Lógica de juego**: Algoritmos de distribución aleatoria y validación de reglas\n- **Backend**: Firebase 12.1.0 (Authentication, Firestore) - **ACTUALIZADO**\n- **Autenticación**: Sistema de login anónimo con gestión de sesiones\n- **Arquitectura Firebase**: Patrón modular con singleton, caché persistente y soporte multi-tab\n\n## 📁 Estructura del proyecto\n\n```\nwho-lies/\n├── web/\n│   ├── index.html                    # Interfaz principal del juego\n│   ├── firebase-modular.js           # Sistema Firebase modular (NUEVO)\n│   └── firebase-config.js            # Configuración de Firebase (DEPRECADO)\n├── test/\n│   ├── 5-test-annotate-making-questions.md    # Especificaciones de tests (NUEVO)\n│   └── generated/\n│       └── 5-test-annotate-making-questions.spec.js  # Tests automatizados (NUEVO)\n├── package.json                       # Dependencias y scripts\n├── firebase.json                      # Configuración de Firebase\n├── FIREBASE_SETUP.md                  # Guía de configuración de Firebase\n├── README.md                          # Este archivo\n└── node_modules/                      # Dependencias (generado automáticamente)\n```\n\n## 🎮 Características del juego\n\n- **9 estancias** organizadas en cuadrícula 3x3\n- **Sistema de información** para triangular pistas\n- **Interfaz responsive** optimizada para móvil\n- **Tema visual** de misterio y suspense\n- **Modo vertical** para dispositivos móviles\n- **Guía de elementos** (venenos, herramientas, armas)\n- **Sistema de rondas** con botón \"TERMINAR RONDA\"\n- **Distribución aleatoria de jugadores** en estancias\n- **Sistema de parámetros de URL** para identificación de jugadores\n- **Autenticación anónima** con Firebase para gestión de sesiones\n- **Sistema de login/logout** con interfaz moderna y transiciones suaves\n- **Gestión de estado** de autenticación automática\n- **Sistema de roles automático** con asignación de ASESINO y COMPLICE\n- **Sistema de asesinatos del ASESINO** con interfaz de selección de víctima\n- **Sincronización en tiempo real** con Firebase para actualizaciones instantáneas\n- **Indicador de estado de conexión** visual para monitorear la conectividad\n- **Notificaciones automáticas** cuando hay cambios en el juego\n- **Actualización automática de la UI** sin necesidad de recargar la página\n- **Gestión inteligente de recursos** con limpieza automática de suscripciones\n- **Resaltado visual de ubicación** - La habitación del jugador actual se resalta en rojo con animaciones\n- **Sistema de visibilidad entre habitaciones** - Los jugadores solo ven a otros jugadores en habitaciones contiguas\n- **Ventaja táctica para roles especiales** - ASESINO y COMPLICE pueden ver a todos los jugadores en todas las habitaciones\n- **Sistema de visibilidad centralizado** - Diccionario de visibilidad generado una sola vez y almacenado en Firebase\n- **Probabilidad del 60% para INVITADOS** - Se aplica una sola vez al generar la distribución, garantizando consistencia\n- **Sistema de rondas completo** - Control de fases del juego con modo de movimiento\n- **Interfaz de movimiento inteligente** - Selección de habitaciones con restricciones por rol\n- **Seguimiento de movimientos en tiempo real** - Lista visual del estado de cada jugador\n- **Botón de control inteligente** - Cambia automáticamente según el estado de la ronda\n- **Finalización automática de rondas** - Sistema que detecta cuando todos han movido\n- **Botón de recarga rápida** - Botón circular con emoji 🔄 para recargar la página desde la esquina superior izquierda\n- **Sistema de acusaciones colectivas** - El jugador 1 actúa como director de juego para ejecutar acusaciones grupales\n- **Sistema de configuración de partida optimizado** - Acceso directo con código de juego y selección secuencial de número de jugadores (4-15)\n- **Sistema de anotación de preguntas** - Botón \"ANOTAR PREGUNTA\" en el footer para contabilizar preguntas de cada jugador\n- **Visualización de contadores** - Palos \"I\" (i mayúscula) debajo de avatares que muestran el número de preguntas realizadas\n- **Sincronización en tiempo real** - Los contadores se actualizan automáticamente entre todos los jugadores\n- **Persistencia de datos** - Los contadores se mantienen al recargar la página y se almacenan en Firebase\n- **Reset automático** - Los contadores se reinician a cero al reiniciar el juego\n\n## 🔧 Configuración del entorno\n\n### Usar Node.js 20 por defecto\n```bash\nnvm alias default 20\n```\n\n### Verificar versiones\n```bash\nnode --version  # Debe mostrar v20.x.x\nnpm --version   # Debe mostrar 10.x.x\n```\n\n## 🚨 Solución de problemas\n\n### Si tienes problemas con versiones de Node.js\n```bash\n# Limpiar instalación anterior\nrm -rf node_modules package-lock.json\n\n# Cambiar a Node.js 20\nnvm use 20\n\n# Reinstalar dependencias\nnpm install\n```\n\n### Si el puerto 3000 está ocupado\nEl servidor automáticamente buscará un puerto disponible, pero puedes especificar uno:\n```bash\nnpx live-server web --port=3001\n```\n\n### 🔥 **Problemas de Firebase (RESUELTOS)**\n\n#### ❌ **Error: \"FIRESTORE INTERNAL ASSERTION FAILED: Unexpected state\"**\n- **Causa**: Firebase 10.7.1 con compat mode y problemas de reconexión\n- **Solución**: ✅ **IMPLEMENTADA** - Migración completa a Firebase 12.1.0 modular\n- **Estado**: Resuelto completamente\n\n#### ❌ **Error: \"auth is not defined\"**\n- **Causa**: Observer de autenticación ejecutándose antes de que Firebase esté disponible\n- **Solución**: ✅ **IMPLEMENTADA** - Sistema de inicialización robusto con timing correcto\n- **Estado**: Resuelto completamente\n\n#### ❌ **Error: \"db is not defined\"**\n- **Causa**: Referencias directas a `db` sin obtenerla de Firebase Modular\n- **Solución**: ✅ **IMPLEMENTADA** - Todas las funciones ahora usan `window.FirebaseModular.getFirebaseServices()`\n- **Estado**: Resuelto completamente\n\n#### ❌ **Problema: Usuario autenticado pero juego no se muestra**\n- **Causa**: Conflictos entre observers de autenticación\n- **Solución**: ✅ **IMPLEMENTADA** - Sistema unificado de observers con lógica del juego integrada\n- **Estado**: Resuelto completamente\n\n### 🎯 **Verificación de Funcionamiento**\nPara verificar que Firebase funciona correctamente, busca estos logs en la consola:\n```javascript\n✅ Firebase 12.x inicializado con caché persistente y soporte multi-tab\n📦 Firebase Modular configurado y listo para usar\n🚀 Sistema Firebase completamente inicializado\n🎮 Usuario autenticado en el juego: [UID]\n✅ Listener de conexión de Firestore configurado\n```\n\n## 📱 Acceso al juego\n\n### URLs de acceso\nUna vez iniciado el servidor:\n- **URL local**: `http://localhost:3000`\n- **URL de red**: `http://127.0.0.1:3000`\n- **Acceso móvil**: Usa la IP de tu máquina en la misma red WiFi\n\n### Sistema de parámetros de jugadores\nEl juego utiliza parámetros de URL para identificar jugadores:\n\n#### Formato nuevo (recomendado)\n- **Formato**: `http://127.0.0.1:3000/?/g/{CODIGO_JUEGO}/p/{NUM_JUGADOR}/{TOTAL_JUGADORES}`\n- **Ejemplos**:\n  - `http://127.0.0.1:3000/?/g/ABC123/p/1/6` - Jugador 1 de 6 en partida ABC123\n  - `http://127.0.0.1:3000/?/g/ABC123/p/3/8` - Jugador 3 de 8 en partida ABC123\n  - `http://127.0.0.1:3000/?/g/ABC123/p/x/6` - Selección de jugador para partida ABC123 con 6 jugadores\n\n#### Formato de acceso directo\n- **Formato**: `http://127.0.0.1:3000/?/g/{CODIGO_JUEGO}`\n- **Ejemplo**: `http://127.0.0.1:3000/?/g/ABC123` - Acceso directo a partida ABC123 (selección automática de número de jugadores)\n\n#### Formato anterior (legacy)\n- **Formato**: `http://127.0.0.1:3000/?X/Y`\n- **X**: Número de jugador (1, 2, 3, ...)\n- **Y**: Total de jugadores en la partida\n- **Ejemplos**:\n  - `http://127.0.0.1:3000/?1/6` - Jugador 1 de 6\n  - `http://127.0.0.1:3000/?3/8` - Jugador 3 de 8\n  - `http://127.0.0.1:3000/?2/4` - Jugador 2 de 4\n\n## 🎯 Cómo jugar\n\n### 0. **Configurar la partida (nuevo)**\n- **Acceso directo**: Usa `?/g/{CODIGO_JUEGO}` para acceder directamente a una partida\n- **Selección de jugadores**: Elige el número de jugadores (4-15) para la partida\n- **Selección de jugador**: Elige tu número de jugador específico\n- **Autenticación**: El sistema te pedirá autenticación antes de la configuración\n\n### 1. **Entender tu posición**\n- Lee tu ubicación actual en la información del juego\n- Identifica qué jugadores están contigo\n\n### 2. **Observar el mapa**\n- Familiarízate con las 9 estancias\n- Identifica las ubicaciones mencionadas en tu información\n\n### 3. **Conectar pistas**\n- Comparte tu información con otros jugadores\n- Busca patrones y conexiones entre las pistas\n- Usa la lógica para triangular la información\n\n### 4. **Avanzar en rondas**\n- Cuando hayas procesado toda la información de una ronda\n- Haz clic en \"TERMINAR RONDA\" para continuar\n\n### 5. **Resolver el misterio**\n- Combina todas las pistas para identificar al asesino\n- El juego se resuelve mediante la colaboración y deducción\n\n## 🔐 Sistema de Autenticación\n\n### 🚀 Características implementadas\n- **Login anónimo**: Conexión sin información personal\n- **Gestión de sesiones**: Estado persistente durante la navegación\n- **Interfaz moderna**: Diseño limpio con transiciones suaves\n- **Logout funcional**: Cierre de sesión con botón dedicado\n- **Estado automático**: Cambio automático entre login y juego\n\n### 🎯 Cómo funciona\n1. **Al cargar la página**: Se muestra la pantalla de login\n2. **Al hacer clic en \"JUGAR ANÓNIMAMENTE\"**: Se crea una sesión anónima\n3. **Se genera un ID único**: Identificador único para la sesión\n4. **Se desbloquea el juego**: La interfaz cambia al modo de juego\n5. **Persistencia**: La sesión se mantiene hasta cerrar sesión o cerrar el navegador\n\n### 🔧 Configuración técnica\n- **Firebase SDK**: Integrado con CDN para máxima compatibilidad\n- **Authentication**: Configurado para autenticación anónima\n- **Estado reactivo**: Observer que maneja cambios de autenticación\n- **Manejo de errores**: Alertas informativas para problemas de conexión\n- **Firestore en tiempo real**: Suscripciones automáticas con `onSnapshot()`\n- **Gestión de estado**: Manejo automático de suscripciones y limpieza de recursos\n- **UI reactiva**: Actualización automática de la interfaz basada en cambios de Firebase\n\n### 🎭 Sistema de Roles y Almacenamiento\n- **Asignación automática**: Los roles se asignan al crear la distribución\n- **Almacenamiento en Firebase**: Distribución + roles se guardan en Firestore\n- **Estructura de datos**: `{ playerDistribution: {...}, roles: { ASESINO: X, COMPLICE: [Y] } }`\n- **Sincronización**: Todos los jugadores pueden acceder a la información de roles\n- **Sistema de asesinatos**: El ASESINO puede matar a otros jugadores durante el modo de movimiento\n\n### 🔪 Sistema de Asesinatos del ASESINO\n- **Activación automática**: Solo se activa en el turno de MOVIMIENTO\n- **Selección de víctima**: Interfaz especial para que el ASESINO seleccione a quién matar\n- **Restricciones de víctimas**: Solo puede matar a jugadores en su misma habitación\n- **Opciones de acción**: Puede elegir matar a UNO y SOLO UNO, o decidir no matar a nadie\n- **Flujo optimizado**: Selección de víctima y movimiento se ejecutan en un solo paso\n- **Interfaz compacta**: Modal de selección que aparece solo cuando es necesario\n- **Ejecución automática**: Al seleccionar víctima, el movimiento se ejecuta automáticamente\n- **Base de datos**: Campo `nextDeath: X` se actualiza al seleccionar víctima\n- **Procesamiento automático**: Al avanzar ronda, se actualiza el array `deads: []`\n- **Reset automático**: Array de muertos se vacía al reiniciar el juego\n- **Visualización de muertos**: Los jugadores muertos se muestran con emoji 💀 y estilo tachado\n- **Interfaz intuitiva**: Selección visual con opciones claras y ejecución automática\n\n### 🔄 Sincronización en Tiempo Real\n- **Suscripciones automáticas**: Los jugadores se suscriben automáticamente a cambios en Firebase\n- **Actualizaciones instantáneas**: La UI se actualiza automáticamente sin recargar la página\n- **Estado de conexión**: Indicador visual del estado de conexión con Firebase\n- **Notificaciones**: Alertas automáticas cuando hay actualizaciones del juego\n- **Gestión de recursos**: Limpieza automática de suscripciones al cerrar sesión\n- **Efectos visuales**: Animaciones y transiciones suaves en las actualizaciones\n\n### 🎯 Resaltado Visual de Ubicación\n- **Habitación resaltada**: La habitación donde está el jugador actual se muestra con fondo rojo\n- **Animaciones**: Efectos de pulso y sombras para destacar la ubicación actual\n- **Indicador visual**: Emoji de ubicación (📍) en la esquina superior derecha de la habitación\n- **Tag del jugador**: El número del jugador actual se resalta con animaciones especiales\n- **Información dinámica**: La UI se actualiza automáticamente mostrando la ubicación actual\n- **Perfil actualizado**: El perfil del jugador muestra su ubicación actual en tiempo real\n\n### 👤 Perfil de Jugador Personalizado\n- **Identificación automática**: El perfil muestra automáticamente \"JUG. X\" donde X es el número del jugador\n- **Actualización dinámica**: El título del perfil se actualiza automáticamente al cargar el juego\n- **Integración con parámetros URL**: Utiliza los parámetros de la URL (?X/Y) para identificar al jugador\n- **Formato conciso**: Utiliza la abreviatura \"JUG.\" para mantener la interfaz limpia y legible\n- **Persistencia de identidad**: El número de jugador se mantiene visible durante toda la sesión\n- **Información de roles para ASESINO y COMPLICE**: Los jugadores con roles especiales pueden ver información adicional sobre otros roles en su perfil\n- **Información del COMPLICE para ASESINO**: Si eres el ASESINO, verás \"COMPLICE: JUG. X\" en letra pequeña\n- **Información del ASESINO para COMPLICE**: Si eres el COMPLICE, verás \"ASESINO/A: JUG. X\" en letra pequeña\n- **Seguridad para INVITADOS**: Los jugadores normales no ven información adicional de roles, manteniendo el misterio\n\n### 👁️ Sistema de Visibilidad entre Habitaciones\n- **Visibilidad limitada**: Los jugadores solo pueden ver a otros jugadores en habitaciones contiguas\n- **Reglas de visibilidad**: Cada habitación tiene acceso visual a habitaciones específicas según su ubicación\n- **Ventaja táctica para roles especiales**: ASESINO y COMPLICE pueden ver a TODOS los jugadores en TODAS las habitaciones\n- **Información parcial**: Los INVITADOS solo ven jugadores en habitaciones visibles, fomentando la deducción\n- **Habitaciones ocultas**: Las habitaciones no visibles se muestran como vacías (sin spoilers)\n- **Diccionario de visibilidad**: Sistema configurable que define qué habitaciones puede ver cada estancia\n- **Sistema centralizado**: La visibilidad se genera una sola vez al crear la distribución y se almacena en Firebase\n- **Probabilidad del 60%**: Para INVITADOS, se aplica una sola vez al generar la distribución, no en cada actualización\n- **Consistencia garantizada**: La visibilidad de cada jugador se mantiene constante durante toda la partida\n\n### 🎯 Sistema de Rondas y Movimiento\n- **Control de rondas**: Solo el jugador 1 puede activar el modo de movimiento\n- **Modo de movimiento**: Interfaz especial que permite a los jugadores seleccionar su próxima ubicación\n- **Restricciones de movimiento**: Los jugadores normales pueden moverse a habitaciones contiguas o quedarse en la misma ubicación\n- **Movimiento libre del ASESINO**: El ASESINO puede moverse a cualquier habitación sin restricciones\n- **Confirmación de movimiento**: Alerta de confirmación antes de procesar cada movimiento\n- **Seguimiento en tiempo real**: El jugador 1 ve el estado de movimientos de todos los jugadores\n- **Lista de movimientos pendientes**: Visualización clara de quién se ha movido y quién está pendiente\n- **Protección de roles**: Solo se muestra el rol del jugador 1, los demás aparecen como \"❓\" para evitar trampas\n- **Botón inteligente**: Cambia de \"TERMINAR RONDA\" a \"SIGUIENTE RONDA\" según el estado\n- **Finalización automática**: La ronda se finaliza automáticamente cuando todos han movido\n- **Recálculo de visibilidad**: Nueva distribución y visibilidad se calculan automáticamente al finalizar\n\n### 🔪 Mecánica de Asesinato Optimizada\n- **Flujo unificado**: Selección de víctima y movimiento se ejecutan en un solo paso\n- **Interfaz compacta**: Modal de selección que aparece solo cuando el ASESINO intenta moverse\n- **Ejecución automática**: Al seleccionar víctima, el movimiento se ejecuta inmediatamente\n- **Sin confirmaciones adicionales**: Elimina la necesidad de botones separados de confirmación\n- **Mejor experiencia de usuario**: Interfaz más fluida y menos interruptiva\n- **Mantenimiento de funcionalidad**: Todas las opciones de asesinato siguen disponibles\n- **Integración perfecta**: El sistema de asesinato se integra naturalmente con el sistema de movimiento\n- **Filtro inteligente de víctimas**: Solo se muestran jugadores vivos como opciones de asesinato\n- **Modal adaptativo**: Interfaz simplificada cuando no hay víctimas disponibles\n- **Actualización garantizada de BD**: Siempre se registra la decisión del ASESINO en Firebase\n- **Sistema robusto**: Maneja casos edge como habitaciones sin víctimas vivas\n- **Prevención de movimiento de víctimas**: Los jugadores marcados en `nextDeath` no se mueven antes de ser procesados como muertos\n\n### 🎨 Interfaz de Usuario y Experiencia\n- **Botón centrado**: Botón \"TERMINAR RONDA\" perfectamente centrado en el footer\n- **Estados visuales del botón**: Cambios automáticos de color y estado según la fase del juego\n- **Sistema de clases CSS**: Gestión de estados del botón sin estilos hardcodeados\n- **Transiciones suaves**: Animaciones fluidas entre diferentes estados del juego\n- **Indicadores visuales**: Colores diferenciados para cada estado del botón\n- **Responsive design**: Interfaz optimizada para dispositivos móviles en modo vertical\n- **Botón de recarga**: Botón circular con emoji 🔄 en la esquina superior izquierda para recargar la página\n- **Navegación intuitiva**: Acceso rápido a funcionalidad de recarga sin interferir con el diseño principal\n\n### 🔧 Mejoras Técnicas y Arquitectura\n- **Probabilidad de visibilidad ajustada**: Cambio del 50% al 60% para mejor balance del juego\n- **Gestión de estados sin hardcoding**: Sistema de clases CSS para manejo de estados del botón\n- **Limpieza automática de estilos**: Eliminación de estilos inline para mejor mantenibilidad\n- **Sistema de probabilidad centralizado**: Aplicación única durante la generación de distribución\n- **Consistencia de datos**: Visibilidad mantenida constante durante toda la partida\n- **Optimización de rendimiento**: Sin recálculos innecesarios de visibilidad\n- **Eliminación de código obsoleto**: Remoción completa de interfaz antigua de asesinato\n- **Funciones modulares**: Separación clara entre modal completo y simplificado\n- **Logs de depuración**: Sistema de logging para facilitar el desarrollo y debugging\n- **Manejo de casos edge**: Validaciones robustas para situaciones especiales\n- **Información de roles para ASESINO y COMPLICE**: Los jugadores con roles especiales pueden ver información adicional sobre otros roles en su perfil\n- **Fix de distribución de víctimas**: La función `calculateNewDistribution` ahora ignora los movimientos de jugadores marcados en `nextDeath` para evitar inconsistencias en la ubicación antes de procesar la muerte\n\n### 🚀 **Migración a Firebase 12.x Modular (NUEVO)**\n- **Actualización completa**: Migración de Firebase 10.7.1 (compat) a Firebase 12.1.0 (modular)\n- **Patrón Singleton**: Una sola instancia de Firebase por sesión, evitando re-inicialización\n- **Caché persistente**: `persistentLocalCache` con `persistentMultipleTabManager` para soporte multi-tab\n- **Arquitectura \"a prueba de bombas\"**: Implementación del patrón recomendado por GPT5 para evitar errores de reconexión\n- **Sistema de inicialización robusto**: Verificación automática de disponibilidad de servicios con timeout de seguridad\n- **Observer de autenticación integrado**: Sistema unificado de manejo de estado de autenticación\n- **Manejo de errores mejorado**: Try-catch en todas las operaciones críticas con fallbacks robustos\n- **Limpieza automática de suscripciones**: Prevención de memory leaks y estados inconsistentes\n- **Compatibilidad con HMR**: Sistema resistente a hot-reload y cambios de ruta\n- **Logs de depuración avanzados**: Sistema completo de logging para diagnóstico de problemas\n\n### 🛡️ Seguridad y Balance del Juego\n- **Protección contra trampas**: Roles de otros jugadores ocultos para el jugador 1\n- **Balance de información**: ASESINO y COMPLICE mantienen ventajas tácticas justificadas\n- **Visibilidad controlada**: Sistema de probabilidad que mantiene el misterio sin ser frustrante\n- **Movimiento equilibrado**: Restricciones apropiadas según el rol del jugador\n- **Consistencia de reglas**: Todas las mecánicas se aplican uniformemente\n- **Prevención de exploits**: Sistema robusto que evita abusos de información\n\n## 🔮 Próximas funcionalidades\n\n- [x] **Autenticación de jugadores** - Sistema de usuarios y sesiones con Firebase\n- [x] **Sistema de roles automático** - Asignación automática de ASESINO y COMPLICE\n- [x] **Sincronización en tiempo real** - Suscripciones automáticas a Firebase para actualizaciones instantáneas\n- [x] **Sistema de rondas del juego** - Gestión completa de fases del juego con modo de movimiento\n- [x] **Sistema de asesinatos del ASESINO** - Interfaz de selección de víctima y gestión de muertes (optimizado)\n- [x] **Mecánica de asesinato unificada** - Ejecución automática de kill + movimiento en un paso\n- [x] **Información de roles para ASESINO y COMPLICE** - Los jugadores con roles especiales pueden ver información adicional sobre otros roles en su perfil\n- [x] **Sistema de acusaciones colectivas** - El jugador 1 actúa como director de juego para ejecutar acusaciones grupales\n- [x] **Fix de distribución de víctimas** - Los jugadores marcados para morir no se mueven antes de ser procesados como muertos\n- [x] **Sistema de configuración de partida optimizado** - Acceso directo con código de juego y selección secuencial de número de jugadores (4-15)\n- [x] **Migración a Firebase 12.x Modular** - Actualización completa del sistema Firebase con patrón modular y singleton\n- [x] **Sistema de caché persistente y multi-tab** - Soporte para múltiples pestañas con sincronización automática\n- [x] **Arquitectura Firebase \"a prueba de bombas\"** - Implementación del patrón recomendado por GPT5 para evitar errores de reconexión\n- [x] **Sistema de anotación de preguntas** - Botón \"ANOTAR PREGUNTA\" para contabilizar preguntas de cada jugador con visualización de palos \"I\" debajo de avatares\n- [ ] **Base de datos de pistas** - Sistema de pistas dinámicas y aleatorias\n- [x] **Modo multijugador** - Sincronización en tiempo real entre jugadores\n- [ ] **Sistema de puntuación** - Métricas de resolución y tiempo\n- [ ] **Historial de partidas** - Seguimiento de juegos anteriores\n- [ ] **Diferentes escenarios** - Múltiples casos de misterio\n- [ ] **Sistema de pistas** - Pistas físicas y digitales integradas\n- [x] **Integración con BD NoSQL** - Almacenamiento de distribuciones de jugadores y roles\n- [ ] **Sistema de partidas** - Gestión de múltiples sesiones de juego\n- [x] **Persistencia de datos** - Almacenamiento de progreso y estado del juego\n\n## 🤝 Contribuir al proyecto\n\n### 🐛 Reportar bugs\n- Usa los issues de GitHub para reportar problemas\n- Incluye detalles del dispositivo y navegador\n- Describe los pasos para reproducir el error\n\n### 💡 Sugerir mejoras\n- Las ideas para nuevas funcionalidades son bienvenidas\n- Considera la experiencia móvil en tus sugerencias\n- Mantén el enfoque en la mecánica de triangulación\n\n### 🔧 Desarrollo técnico\n- Fork el repositorio\n- Crea una rama para tu feature\n- Mantén el código limpio y documentado\n- Prueba en dispositivos móviles\n- Configura Firebase para funcionalidades de autenticación\n- Sigue las convenciones de commit del proyecto\n\n## 📚 Recursos adicionales\n\n### 🎮 Inspiración del juego\n- **Cluedo/Clue**: Juego de mesa clásico de misterio\n- **Among Us**: Mecánicas de deducción social\n- **Mafia/Werewolf**: Juegos de roles y deducción\n\n### 🛠️ Tecnologías relacionadas\n- **Live Server**: Para desarrollo web con hot-reload\n- **CSS Grid**: Para el layout de estancias\n- **Responsive Design**: Para optimización móvil\n- **Firebase**: Para autenticación y base de datos en tiempo real\n- **Firebase Authentication**: Para gestión de sesiones de usuario\n\n## 📄 Licencia\n\nEste proyecto está bajo la licencia MIT. Puedes usar, modificar y distribuir libremente.\n\n---\n\n**WHO LIES** - Donde la verdad se esconde entre las pistas, y solo la lógica puede revelar al asesino. 🕵️‍♂️🔍\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheedrox%2Fwho-lies","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fheedrox%2Fwho-lies","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheedrox%2Fwho-lies/lists"}