Shooter táctico 3D en primera persona inspirado en CS:GO, hecho con Three.js y Vite.
Sin assets externos: el mapa, las armas, los bots, los efectos y los sonidos son 100%
procedurales — texturas dibujadas en <canvas>, modelos con geometrías primitivas y
audio sintetizado con la Web Audio API.
⚠️ Prototipo. Proyecto de exploración técnica, no un juego terminado. Nombres y armas son un homenaje a CS:GO; ningún asset original de Valve está incluido.
npm install
npm run devBuild de producción: npm run build y npm run preview.
| Tecla | Acción |
|---|---|
| WASD | Moverse |
| Ratón | Apuntar · Click izq. disparar |
| R | Recargar |
| Espacio / Ctrl / Shift | Saltar / agacharse / caminar |
| 1 · 2 · 3 / Q / Rueda | Cambiar de arma |
| B | Menú de compra (primeros 20s de ronda) |
| Tab | Marcador |
| ESC | Pausa |
- Rondas de 1:55 contra bots terroristas; gana al eliminarlos a todos.
- Economía estilo CS: +$300 por baja (+$1500 con cuchillo), +$3250 por ronda ganada, +$1400 por perdida.
- Armas: USP-S (inicial), Desert Eagle, AK-47, M4A4 y cuchillo; retroceso con patrón, spread por movimiento, headshots ×4.
- Chaleco + casco absorbe daño. Los bots patrullan por waypoints, cazan por sonido y combaten con ráfagas.
src/
├─ main.js Arranque: menú, pointer lock y bucle principal
├─ core/
│ ├─ game.js Estado de ronda, economía, spawns y orquestación
│ ├─ input.js Teclado, ratón y pointer lock
│ ├─ physics.js Colisionadores AABB y resolución de movimiento (moveBody)
│ └─ audio.js Síntesis Web Audio: disparos, pasos, recargas, impactos
├─ world/
│ ├─ map.js Mapa procedural + grafo de waypoints y pathfinding
│ └─ effects.js Partículas, impactos, fogonazos y trazadoras
├─ player/
│ ├─ player.js Cámara, movimiento, agacharse, salto y daño
│ └─ weapons.js Tabla de armas (daño, RPM, spread, retroceso) y viewmodels
├─ enemies/bot.js IA: patrulla, percepción visual/auditiva y combate
└─ ui/hud.js HUD, marcador, menú de compra y killfeed
Física propia, sin motor externo: PhysicsWorld mantiene una lista de cajas AABB y
moveBody resuelve el desplazamiento eje a eje, lo que da colisiones estables contra
paredes y cajas sin necesidad de Ammo/Cannon.
IA por waypoints: map.js publica el grafo de navegación del nivel y los bots
buscan ruta con findPath, alternando entre patrulla, investigación de un sonido y
combate según lo que ven u oyen.
Todo procedural: makeTexture pinta las texturas en un canvas 2D y las sube como
CanvasTexture; el audio se genera con osciladores y buffers de ruido. El resultado es
un juego completo que no descarga ni un solo archivo de assets.