242 lines
6.2 KiB
Markdown
242 lines
6.2 KiB
Markdown
# 🎮 Snatch or Share - Cliente
|
|
|
|
Cliente web para el juego multijugador Snatch or Share, basado en el trabajo de Elinor Ostrom sobre instituciones y cooperación.
|
|
|
|
## 🛠️ Stack Tecnológico
|
|
|
|
- **Vue 3** (Composition API, vanilla sin build tools)
|
|
- **TypeScript** (tipado estricto)
|
|
- **Vite** (development server)
|
|
- **Colyseus.js** (cliente WebSocket)
|
|
- **Express** (servidor estático en producción)
|
|
|
|
## 🚀 Inicio Rápido
|
|
|
|
### Prerrequisitos
|
|
- Node.js 18+
|
|
- npm 9+
|
|
- Servidor Snatch or Share ejecutándose (puerto 2567)
|
|
|
|
### Instalación y Desarrollo
|
|
|
|
```bash
|
|
# Instalar dependencias
|
|
npm install
|
|
|
|
# Generar tipos TypeScript desde el servidor
|
|
npm run generate-types
|
|
|
|
# Iniciar servidor de desarrollo (puerto 3000)
|
|
npm run dev
|
|
```
|
|
|
|
### Comandos Disponibles
|
|
|
|
```bash
|
|
# Desarrollo
|
|
npm run dev # Servidor de desarrollo con hot reload
|
|
npm run generate-types # Generar tipos desde servidor Colyseus
|
|
|
|
# Producción
|
|
npm run build # Compilar proyecto para producción
|
|
npm run preview # Vista previa del build
|
|
npm run start # Servidor Express en producción
|
|
|
|
# Utilidades
|
|
npm run serve # Servidor Express con nodemon
|
|
```
|
|
|
|
## 🏗️ Arquitectura del Cliente
|
|
|
|
### Estructura de Directorios
|
|
|
|
```
|
|
client/
|
|
├── src/
|
|
│ ├── components/ # Componentes Vue
|
|
│ │ ├── Game.vue # Componente principal del juego
|
|
│ │ ├── PlayerCard.vue # Tarjeta de jugador
|
|
│ │ ├── TradeOfferCard.vue # Tarjeta de oferta comercial
|
|
│ │ ├── MakeOfferForm.vue # Formulario para ofertas
|
|
│ │ ├── ScrollableOffers.vue # Contenedor de ofertas con scroll
|
|
│ │ └── OfferModal.vue # Modal para hacer ofertas
|
|
│ ├── services/ # Servicios y lógica de negocio
|
|
│ │ ├── gameClient.ts # Cliente Colyseus
|
|
│ │ └── logger.ts # Sistema de logging
|
|
│ ├── types/ # Tipos TypeScript
|
|
│ │ ├── GameState.ts # (Auto-generado)
|
|
│ │ ├── Player.ts # (Auto-generado)
|
|
│ │ ├── TradeOffer.ts # (Auto-generado)
|
|
│ │ ├── TokenInventory.ts # (Auto-generado)
|
|
│ │ └── index.ts # Tipos auxiliares
|
|
│ ├── App.vue # Componente raíz
|
|
│ └── main.ts # Punto de entrada
|
|
├── index.html # Template HTML
|
|
├── server.js # Servidor Express (producción)
|
|
└── vite.config.ts # Configuración Vite
|
|
```
|
|
|
|
### Componentes Principales
|
|
|
|
#### Game.vue
|
|
Componente principal que maneja:
|
|
- Layout responsivo (desktop/móvil)
|
|
- Estado del juego en tiempo real
|
|
- Coordinación entre componentes hijos
|
|
|
|
#### PlayerCard.vue
|
|
Tarjeta de jugador con:
|
|
- Modo compacto para otros jugadores
|
|
- Modo expandido para jugador actual
|
|
- Click para hacer ofertas
|
|
|
|
#### TradeOfferCard.vue
|
|
Muestra ofertas comerciales:
|
|
- Información de tokens ofrecidos/solicitados
|
|
- Botones de acción (Aceptar/Rechazar/Snatch)
|
|
- Estados visuales según tipo de oferta
|
|
|
|
#### MakeOfferForm.vue
|
|
Formulario optimizado con:
|
|
- Botones +/- prominentes
|
|
- Input compacto para números
|
|
- Validación en tiempo real
|
|
|
|
## 🔄 Generación de Tipos
|
|
|
|
El cliente utiliza tipos auto-generados desde el servidor Colyseus:
|
|
|
|
```bash
|
|
# Generar tipos automáticamente
|
|
npm run generate-types
|
|
|
|
# Comando manual equivalente
|
|
cd ../server && npx schema-codegen src/rooms/GameRoom.ts --ts --output ../client/src/types/
|
|
```
|
|
|
|
**Tipos Auto-generados:**
|
|
- `GameState.ts` - Estado principal del juego
|
|
- `Player.ts` - Información del jugador
|
|
- `TradeOffer.ts` - Ofertas comerciales
|
|
- `TokenInventory.ts` - Inventario de tokens
|
|
|
|
**Tipos Manuales:**
|
|
- `GameRoomOptions` - Opciones de sala
|
|
- Interfaces auxiliares en `index.ts`
|
|
|
|
## 🎯 Funcionalidades del Cliente
|
|
|
|
### Layout Responsivo
|
|
|
|
**Desktop:**
|
|
- Layout de 2 columnas (jugadores | ofertas)
|
|
- Jugador actual prominente abajo
|
|
- Panel de ofertas con scroll customizado
|
|
|
|
**Móvil:**
|
|
- Layout vertical adaptativo
|
|
- Cards de jugadores compactas
|
|
- Ofertas optimizadas horizontalmente
|
|
|
|
### Interacciones
|
|
|
|
- **Click en PlayerCard** → Abre modal de oferta
|
|
- **Botones +/-** → Incrementar/decrementar tokens
|
|
- **Formulario modal** → Crear ofertas dirigidas
|
|
- **Scroll customizado** → Navegación suave de ofertas
|
|
|
|
### Estado en Tiempo Real
|
|
|
|
- Conexión WebSocket con Colyseus
|
|
- Sincronización automática de estado
|
|
- Reactivity de Vue 3 con estado del servidor
|
|
|
|
## 🔧 Configuración
|
|
|
|
### Variables de Entorno
|
|
|
|
```env
|
|
# Desarrollo (.env.development)
|
|
VITE_SERVER_URL=ws://localhost:2567
|
|
|
|
# Producción (.env.production)
|
|
VITE_SERVER_URL=ws://tu-servidor-produccion:2567
|
|
```
|
|
|
|
### Configuración del Servidor
|
|
|
|
El cliente incluye un servidor Express para producción:
|
|
|
|
```javascript
|
|
// server.js
|
|
const express = require('express');
|
|
const path = require('path');
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3000;
|
|
|
|
// Servir archivos estáticos
|
|
app.use(express.static(path.join(__dirname, 'dist')));
|
|
|
|
// SPA fallback
|
|
app.get('*', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'dist', 'index.html'));
|
|
});
|
|
```
|
|
|
|
## 🔍 Debugging
|
|
|
|
### Logger del Cliente
|
|
|
|
```typescript
|
|
import { logger } from '@/services/logger'
|
|
|
|
// Logs automáticos del estado del juego
|
|
logger.gameStateChange(state)
|
|
logger.gameComponentUpdate(updates)
|
|
logger.clickSent()
|
|
```
|
|
|
|
### DevTools
|
|
|
|
- Vue DevTools para componentes
|
|
- Network tab para conexiones WebSocket
|
|
- Console para logs del gameClient
|
|
|
|
## 📱 Compatibilidad
|
|
|
|
- **Navegadores**: Chrome 90+, Firefox 88+, Safari 14+
|
|
- **Dispositivos**: Desktop, tablet, móvil
|
|
- **Resoluciones**: 320px - 1920px+
|
|
|
|
## 🎮 Uso del Cliente
|
|
|
|
1. **Espera**: Pantalla de espera hasta 3 jugadores
|
|
2. **Asignación**: Roles de productor asignados aleatoriamente
|
|
3. **Trading**: Interfaz de intercambio con ofertas
|
|
4. **Ofertas**: Click en jugadores para hacer ofertas
|
|
5. **Respuestas**: Aceptar, rechazar o hacer "snatch"
|
|
|
|
## 🚀 Despliegue
|
|
|
|
### Desarrollo
|
|
```bash
|
|
npm run dev
|
|
# Cliente disponible en http://localhost:3000
|
|
```
|
|
|
|
### Producción
|
|
```bash
|
|
npm run build
|
|
npm run start
|
|
# Servidor Express sirviendo build estático
|
|
```
|
|
|
|
### Docker (desde raíz del proyecto)
|
|
```bash
|
|
docker-compose up client
|
|
```
|
|
|
|
## 🤝 Contribución
|
|
|
|
Ver [CLAUDE.md](../CLAUDE.md) para guías de desarrollo y convenciones del proyecto. |