🎮 Componentes del Juego
37 archivos en _components/ — documentación de cada componente, sistema, hook, modelo y utilidad.
🧩Componentes(16)
GameScene
Escena principal del juego. Orquesta todos los sistemas y componentes 3D.
componente- ▸Canvas R3F con física Rapier
- ▸Carga y orquesta: SkySphere, WaterSphere, CloudSphere, AtmosphereSphere
- ▸Gestión de chunks, NPCs, rocas, árboles GLB
- ▸Sistema de construcción (BuildMenu)
- ▸Ciclo día/noche, cámara planetaria
- ▸Manejo de selección de NPCs y chat
frontend/app/admin/game/_components/GameScene.tsx
LoadingScreen
Pantalla de carga con progreso de pasos animados.
componente- ▸Muestra 6 pasos de carga secuenciales
- ▸Espera a que los chunks estén listos (chunksReady)
- ▸Spinner animado y detección de móvil
- ▸Auto-oculta al completar la carga
frontend/app/admin/game/_components/LoadingScreen.tsx
SceneSetup
Configuración de la escena 3D: luces, niebla, fondo.
componente- ▸Luz ambiental, hemisférica y direccional con sombras
- ▸Niebla con transición día/noche suave
- ▸Sincronización con gameTimeRef para colores dinámicos
frontend/app/admin/game/_components/SceneSetup.tsx
DebugOverlay
Ventana flotante de debug con FPS, zoom, render distance y total de bloques.
componente- ▸Se muestra/oculta con la tecla O
- ▸Muestra FPS, distancia de cámara, render distance dinámico
- ▸Total de bloques renderizados y radio de isla
- ▸Threshold del noise ajustable
frontend/app/admin/game/_components/DebugOverlay.tsx
MusicPlayer
Reproductor de música en la esquina superior derecha.
componente- ▸Select con canciones disponibles desde API /api/game/songs
- ▸Controles de play/pause y mute
- ▸Reproducción automática en orden aleatorio (shuffle)
frontend/app/admin/game/_components/MusicPlayer.tsx
GameClock
Reloj de 24h que avanza 1 minuto cada 250ms (15s reales = 1h en el juego).
componente- ▸Formato HH:MM en esquina superior derecha
- ▸Actualiza gameTimeRef para ciclo día/noche
- ▸Incrementa gameDayRef al pasar de 23:59 a 00:00
frontend/app/admin/game/_components/GameClock.tsx
BuildMenu
Menú de construcción con materiales, prefabs, árboles y modo destrucción.
componente- ▸Selección de material (piedra, madera, arena, hierba, cristal, etc.)
- ▸Estilo de textura (default/lisa)
- ▸Prefabs de construcción (mesa, silla, cama, escaleras, etc.)
- ▸Selección de variantes de árbol para plantar
- ▸Modo destrucción de bloques
- ▸Categorías: Materiales, Prefabs, Árboles, Destruir
frontend/app/admin/game/_components/BuildMenu.tsx
PowersMenu
Menú de poderes del juego: crear NPCs y establecer zona de base.
componente- ▸Poder 'Crear NPC': click izquierdo en bloque para crear NPC con su forma
- ▸Poder 'Establecer zona': marca zona de base (100 bloques a la redonda)
- ▸Cada poder tiene nombre, descripción, costo y emoji
frontend/app/admin/game/_components/PowersMenu.tsx
NpcChatPanel
Panel de chat en la esquina inferior izquierda. Muestra mensajes de NPCs.
componente- ▸Solo lectura — muestra mensajes que los NPCs envían al jugador
- ▸Auto-scroll al último mensaje
- ▸Sincronizado con npcChatState
frontend/app/admin/game/_components/NpcChatPanel.tsx
Chunk
Renderiza un chunk completo con sus bloques y árboles GLB.
componente- ▸Memoizado para evitar re-renderizados innecesarios
- ▸Renderiza InstancedBlocks y GlbTreeModel
- ▸Soporta bloque destacado (highlightedBlock)
- ▸Posicionamiento esférico opcional
frontend/app/admin/game/_components/Chunk.tsx
GlbRockRenderer
Renderiza todas las rocas del mundo como modelos GLB decorativos.
componente- ▸Rocas decorativas NO agarrables
- ▸Posicionadas cerca de montañas
frontend/app/admin/game/_components/GlbRockRenderer.tsx
SkySphere
Esfera de cielo con ciclo día/noche, estrellas parpadeantes y sol/luna.
componente- ▸320 estrellas con twinkle cada ~2s
- ▸Transiciones de color día/noche progresivas
- ▸Sol y luna posicionados dinámicamente
- ▸Sincronizado con gameTimeRef
frontend/app/admin/game/_components/SkySphere.tsx
WaterSphere
Esfera de agua que envuelve el mundo con dos capas para ocultar bordes.
componente- ▸Dos capas: exterior semitransparente e interior más opaca
- ▸48 segmentos para esfera suave
- ▸Capa interior con radio ligeramente menor para evitar z-fighting
frontend/app/admin/game/_components/WaterSphere.tsx
CloudSphere
Esfera de nubes procedurales con textura seamless y rotación lenta.
componente- ▸Radio 170 (SPHERE_RADIUS + 20) para flotar sobre el terreno
- ▸Textura procedural de nubes sin costuras
- ▸Rotación muy lenta (0.0003 rad/s) para sensación de movimiento
- ▸24 segmentos para optimizar
frontend/app/admin/game/_components/CloudSphere.tsx
AtmosphereSphere
Esfera de atmósfera con efecto Fresnel para halo brillante alrededor del planeta.
componente- ▸Radio 200 (SPHERE_RADIUS + 50) para visible desde el espacio
- ▸Efecto Fresnel: más brillante en los bordes
- ▸Color azul cielo sutil con tono violáceo en bordes
- ▸32 segmentos para Fresnel suave
frontend/app/admin/game/_components/AtmosphereSphere.tsx
TerrainColliders
Colliders de física Rapier para el terreno.
componente- ▸CuboidCollider para cada bloque sólido
- ▸Bloques decorativos (flower, mushroom, leaves, water) NO tienen collider
- ▸Sincronizado con chunks para física en tiempo real
frontend/app/admin/game/_components/TerrainColliders.tsx
⚙️Sistemas(7)
PlanetCamera
Cámara planetaria AAA con base ortonormal local. Sin gimbal lock.
sistema- ▸Movimiento en espacio 3D real sobre la esfera
- ▸Base ortonormal local (forward, right, up) recalculada cada frame
- ▸W/S: avanzar/retroceder, A/D: yaw local, Q/E: strafe
- ▸Sin gimbal lock, sin flips en polos, sin roll aleatorio
frontend/app/admin/game/_components/PlanetCamera.ts
noise
Sistema de generación de terreno por ruido (terrain noise).
sistema- ▸Tipos de bloques: grass, dirt, stone, sand, water, wood, leaves, snow, bedrock, minerales, etc.
- ▸Generación de semilla aleatoria para cada carga de página
- ▸Función hash para valores deterministas
- ▸Sistema FBM (Fractional Brownian Motion) para ruido
frontend/app/admin/game/_components/noise.ts
chunkManager
Gestor de chunks: generación, coordenadas, NPCs, árboles, rocas.
sistema- ▸Tamaño de chunk: 16 bloques
- ▸Altura máxima del terreno: 7 bloques
- ▸Render distance configurable (escritorio/móvil)
- ▸Generación de NPCs, árboles GLB y rocas
- ▸Sistema de coordenadas de chunks
frontend/app/admin/game/_components/chunkManager.ts
npcMovementSystem
Sistema centralizado de movimiento de NPCs con colisión, detección de atasco y registro.
sistema- ▸Movimiento independiente del renderizado (los NPCs se mueven siempre)
- ▸Colisión volumétrica con radio de esfera (ESFERA_RADIUS = 0.5)
- ▸Altura máxima de escalón: 1 bloque
- ▸Registro y desregistro de NPCs
- ▸Sistema de agarre y lanzamiento
- ▸Detección de atasco: si no avanza 1 bloque en 2s, cancela destino
- ▸Repulsión entre NPCs para evitar solapamiento
frontend/app/admin/game/_components/npcMovementSystem.ts
npcChatState
Estado compartido para el sistema de chat de NPCs y zona de base.
sistema- ▸Mensajes de chat con NPC name, key, mensaje, timestamp, hora del juego y día
- ▸Sistema de zona de base (getBaseZone, setBaseRequestedBy)
- ▸Notificaciones de cambio vía callbacks
frontend/app/admin/game/_components/npcChatState.ts
protaFaceState
Estado compartido para la textura de la cara del prota.
sistema- ▸Comunicación entre componentes dentro/fuera del canvas
- ▸Notificación de cambios vía callback
frontend/app/admin/game/_components/protaFaceState.ts
sharedRefs
Referencias compartidas entre componentes del juego.
sistema- ▸cameraDistRef: distancia de cámara al centro
- ▸gameTimeRef: hora del juego (0-23)
- ▸gameTimeContinuousRef: hora con minutos como decimal
- ▸gameDayRef: día del juego
- ▸dynamicRenderDistRef, totalBlocksRef, islandRadiusRef, thresholdRef
- ▸fogOverrideRef, chunkGenerationPausedRef
frontend/app/admin/game/_components/sharedRefs.ts
🪝Hooks(4)
useChunkManager
Hook React que gestiona chunks, terreno, NPCs, árboles y rocas en tiempo real.
hook- ▸Generación procedural de chunks con TerrainNoise
- ▸Spawn de NPCs, árboles GLB y rocas
- ▸Sistema de espíritus de animales
- ▸Renderizado por frustum (visibleChunksFrustum)
- ▸Gestión de almacenes (treeStore, rockStore)
frontend/app/admin/game/_components/useChunkManager.ts
usePlayerMovement
Hook que controla el movimiento de la cámara planetaria con auto-rotación y zoom.
hook- ▸Auto-rotación orbital alrededor del planeta
- ▸Zoom con rueda del ratón
- ▸Movimiento manual WASD/flechas con inercia
- ▸Detección de inactividad para reanudar auto-rotación
- ▸Sincronización con sharedRefs (cameraDistRef)
frontend/app/admin/game/_components/usePlayerMovement.ts
useKeyboardControls
Hook que rastrea el estado del teclado para movimiento WASD/flechas.
hook- ▸Expone un ref con el conjunto de teclas actualmente presionadas
- ▸Previene scroll con teclas de flecha
frontend/app/admin/game/_components/useKeyboardControls.ts
useMusicPlayer
Hook que gestiona la lista de canciones y reproducción shuffle.
hook- ▸Obtiene canciones desde API /api/game/songs
- ▸Reproducción automática en orden aleatorio
- ▸Control de play/pause y mute
frontend/app/admin/game/_components/useMusicPlayer.ts
🎨Modelos 3D(5)
VoxelModel
Cargador de modelos GLB voxel con animación procedural y outline.
modelo- ▸Carga modelos GLB con caché global
- ▸Soporta animación procedural (idle, walk, attack, collect, death)
- ▸Outline negro alrededor del modelo
- ▸Soporte para Z-up (Blender) y Y-up (Three.js)
- ▸Color tint opcional para el modelo
frontend/app/admin/game/_components/VoxelModel.tsx
Block
Sistema de bloques instanciados con múltiples texturas y estilos.
modelo- ▸Renderiza bloques con InstancedMesh para alto rendimiento
- ▸Soporta múltiples tipos: grass, dirt, stone, sand, wood, leaves, snow, etc.
- ▸Estilos de textura: default (perfilado) y lisa
- ▸Colocación esférica con rotación radial
- ▸Sistema de color por bioma (flower power)
frontend/app/admin/game/_components/Block.tsx
GlbTreeModel
Carga modelos GLB de árboles con caché global y posicionamiento esférico.
modelo- ▸Caché global: cada modelo se carga UNA VEZ y se clona
- ▸Soporta múltiples variantes (roble, invierno, otoño, palmera, pantano)
- ▸Rotación radial para mundo esférico
frontend/app/admin/game/_components/GlbTreeModel.tsx
GlbRockModel
Carga modelos GLB de rocas (rock-1 a rock-8) con caché global.
modelo- ▸Caché global: cada modelo se carga UNA VEZ y se clona
- ▸8 variantes de roca diferentes
- ▸Sombras desactivadas para rendimiento
frontend/app/admin/game/_components/GlbRockModel.tsx
BlockNpcModel
NPC de bloque con estadísticas, selección, chat, patrulla y movimiento por zona.
modelo- ▸Renderiza un NPC con forma de bloque y cara expresiva
- ▸Estadísticas: vida, daño, velocidad, visión, edad, felicidad, energía
- ▸Seleccionable con clic (onSelect)
- ▸Muestra barra de vida y nombre
- ▸Movimiento por zona (ZONE_RADIUS = 2.5) en lugar de punto exacto
- ▸Patrulla autónoma con cambio de dirección al colisionar
- ▸Detección de atasco: si no avanza 1 bloque en 2s, reinicia patrulla
- ▸Integrado con chat (npcChatState)
frontend/app/admin/game/_components/BlockNpcModel.tsx
🔧Utilidades(5)
SphericalWorld
Sistema de coordenadas esféricas para el mundo planeta.
utilidad- ▸Convierte coordenadas planas (x,y,z) a esféricas
- ▸Calcula rotación radial para alinear objetos con la superficie
- ▸Objetos reutilizables para evitar GC pressure
frontend/app/admin/game/_components/SphericalWorld.tsx
blockPrefabs
Definiciones de prefabs de construcción (conjuntos de bloques).
utilidad- ▸Cada prefab es un conjunto de bloques en posiciones relativas
- ▸Soporta: medio bloque, escalera, rotación X/Y
- ▸Usado por BuildMenu para construir estructuras predefinidas
frontend/app/admin/game/_components/blockPrefabs.ts
blockNpcStats
Tipos y estadísticas de NPCs de bloque (stone, wood, sand, grass).
utilidad- ▸Estadísticas: vidaMax, damage, speed, vision, age, maxAge, happiness, energy
- ▸Felicidad (0-100): afecta expresión facial
- ▸Energía (0-100): se reduce 10 por hora, a 0 se convierte en bloque inmóvil
frontend/app/admin/game/_components/blockNpcStats.ts
findGreenZones
Escanea el terreno para encontrar áreas verdes y planas ideales para construir ciudades.
utilidad- ▸Busca zonas con tierra firme, no montaña, terreno plano, no costa
- ▸Evalúa densidad de puntos verdes en área circular
- ▸Retorna las 3 mejores zonas verdes encontradas
frontend/app/admin/game/_components/findGreenZones.ts
constants
Constantes globales del juego: radio de esfera, nivel del mar.
utilidad- ▸SPHERE_RADIUS = 150 (radio del mundo)
- ▸SEA_LEVEL = 4 (altura del agua)
- ▸WATER_RADIUS = SPHERE_RADIUS + SEA_LEVEL
frontend/app/admin/game/_components/constants.ts