- Implemented Game Server (game-server.js) with Socket.io - Added JSON Schemas for Campaigns and Missions - Updated Docker configurations for multi-service setup - Refactored main.js to allow local network connections - Removed legacy code (main_old.js) - Updated dependencies
5.2 KiB
5.2 KiB
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.ymlpara 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.
- Creada función unificada
-
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
wallOffsetpara ambas paredes E/W:wallOffset = -(doorWorldPos.z - centerZ). - Resultado: Puertas y huecos perfectamente alineados en todas las direcciones (N, S, E, W).
- Identificado problema: Las paredes Este y Oeste tienen
-
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.
- Devuelve:
- Modificado raycast de puertas para excluir meshes invisibles (línea 1388).
- Commits:
8025d66,5852a97,57f6312.
Lecciones Aprendidas
- Geometría Rotada: Cuando un
PlaneGeometryse 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 = falsesolo oculta visualmente un objeto, pero Three.js sigue detectándolo en raycasts. Siempre filtrar objetos invisibles antes deintersectObjects().
[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.jspara incluircheckDoorInteractional finalizar el movimiento. - Nuevo estado en
SESSION:selectedDoorId. - Actualización de
isWalkablepara considerar el estadoisOpende 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
setCameraViewpara refrescar opacidades al girar la vista. - Los muros ahora tienen la propiedad
userData.wallSideasignada 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).