# Devlog del Proyecto: Masmorres (Physical-Web Crawler) Este documento sirve para llevar un control diario del desarrollo, decisiones técnicas y nuevas funcionalidades implementadas en el proyecto. ## [2025-12-28] - Fase 1: Arquitectura Híbrida y Servidor ### Infraestructura - **Game Server (`game-server.js`):** Implementado servidor WebSocket (Socket.io) en puerto 3001 para gestionar la comunicación PC-Móvil. - **Docker:** Actualizado `docker-compose.yml` para ejecutar el servidor juego como servicio independiente. - **Networking:** Configuración dinámica de IP en el cliente para permitir conexión desde dispositivos en la red local. ### Datos - **Esquemas JSON:** Definidos contratos de datos iniciales en `src/schemas/`: - `CampaignSchema.js`: Estructura para campañas multijugador. - `MissionSchema.js`: Configuración para generación procedural y scripting. ## [2025-12-28] - Corrección Completa del Sistema de Puertas ### Funcionalidades Implementadas - **Refactorización de Posicionamiento de Puertas:** - Creada función unificada `getDoorWorldPosition()` que centraliza el cálculo de posiciones. - Eliminada duplicación de lógica entre generación de huecos en paredes y posicionamiento de meshes de puertas. - Reducción de ~45 líneas de código duplicado. - **Corrección de Alineamiento E/W:** - Identificado problema: Las paredes Este y Oeste tienen `rotation = π/2`, lo que hace que su eje X local apunte hacia -Z. - Solución: Invertir el `wallOffset` para ambas paredes E/W: `wallOffset = -(doorWorldPos.z - centerZ)`. - **Resultado:** Puertas y huecos perfectamente alineados en todas las direcciones (N, S, E, W). - **Corrección de Interacción con Puertas Abiertas:** - Problema detectado: Las puertas abiertas (invisibles) seguían bloqueando clics del ratón. - Solución: Filtrar puertas invisibles del raycast: `allDoors.push(...roomData.doors.filter(door => door.visible))`. - **Resultado:** Los jugadores ahora pueden hacer clic "a través" de puertas abiertas para seleccionar baldosas. ### Cambios Técnicos - Nueva función `getDoorWorldPosition(room, door, centerX, centerZ, halfSizeX, halfSizeZ)`: - Devuelve: `{ worldPos, meshPos, rotation, wallOffset }` - Garantiza coherencia entre geometría de huecos y meshes visuales. - Modificado raycast de puertas para excluir meshes invisibles (línea 1388). - Commits: `8025d66`, `5852a97`, `57f6312`. ### Lecciones Aprendidas - **Geometría Rotada:** Cuando un `PlaneGeometry` se rota (e.g., π/2), su sistema de coordenadas local cambia. Es crucial calcular offsets considerando la dirección del eje X local tras la rotación. - **Raycast e Invisibilidad:** `mesh.visible = false` solo oculta visualmente un objeto, pero Three.js sigue detectándolo en raycasts. Siempre filtrar objetos invisibles antes de `intersectObjects()`. ## [2025-12-23] - Interacción con Puertas y Navegación ### Funcionalidades Implementadas - **Sistema de Puertas Interactivas:** - Se eliminó la transición automática entre salas al pisar una puerta. - Ahora las puertas actúan como bloqueos físicos hasta que son "abiertas" explícitamente. - Lógica de selección: Click en una puerta cerrada para seleccionarla (feedback visual amarillo). - **Modal de Interacción:** - Al mover una unidad adyacente a una puerta seleccionada, se dispara un modal UI: "¿Quieres abrir la puerta?". - **Confirmar:** La puerta visual se oculta, la sala destino se renderiza (si no lo estaba) y se permite el paso. - **Cancelar:** Se deselecciona la puerta y se mantiene cerrada. ### Cambios Técnicos - Modificado `main.js` para incluir `checkDoorInteraction` al finalizar el movimiento. - Nuevo estado en `SESSION`: `selectedDoorId`. - Actualización de `isWalkable` para considerar el estado `isOpen` de las puertas. ## [2025-12-20] - Sistema Visual Dinámico (Dynamic Wall Opacity) ### Funcionalidades Implementadas - **Opacidad de Muros Contextual:** - Los muros ahora ajustan su opacidad dinámicamente basándose en la rotación de la cámara (N, S, E, W) para evitar obstruir la visión del jugador. - **Regla General:** Los muros "frontales" a la cámara se vuelven semitransparentes (50%), mientras que los "traseros" permanecen opacos. ### Cambios Técnicos - Implementada función `getWallOpacity(wallSide, viewDirection)`. - Integración en `setCameraView` para refrescar opacidades al girar la vista. - Los muros ahora tienen la propiedad `userData.wallSide` asignada durante la generación. ## [2025-12-19] - Feedback de Selección y UI ### Funcionalidades Implementadas - **Resaltado de Selección (Highlighting):** - Unidades y objetos interactivos ahora muestran un aura/color amarillo al ser seleccionados. - Opacidad reducida al 50% para indicar estado de selección activo. - **Mejoras de Animación:** - Refinamiento del "salto" de los standees al moverse entre casillas. ## [Inicio del Proyecto] - Manifiesto y Core Loop ### Visión General - Definido el **Manifiesto Técnico (v2.0)**: Visión de un "Puente Híbrido" entre juego de mesa físico y motor narrativo digital (LLM). - **Generación Procedural:** Algoritmo de mazmorras basado en tiles de 4x4 con expansión orgánica. - **Motor Gráfico:** Three.js con cámara isométrica ortográfica y controles restringidos (N, S, E, W).