# 🔧 Guía de Corrección de Bugs de Durabilidad y Combate

**Fecha:** 2025-10-09  
**Problemas Resueltos:**
1. Items degradándose por cantidad (x16→x15) en lugar de durabilidad
2. Combate ganado sin arma equipada

---

## ✅ Cambios Implementados

### 1. **Migración de Base de Datos**
- ✅ **10 items actualizados** a `stackable: false` (herramientas/armas/armaduras/capas)
- ✅ Script de migración ejecutado: `scripts/migrateStackableToInstanced.ts`
- ✅ Schema sincronizado con `prisma db push`

### 2. **Corrección de Lógica de Combate**
**Archivo:** `src/game/minigames/service.ts` (línea 470)

**Cambio:**
```typescript
// ANTES (ambiguo):
if (!eff.damage || eff.damage <= 0) {

// DESPUÉS (explícito):
const hasWeapon = eff.damage > 0;
if (!hasWeapon) {
```

Ahora el jugador **pierde automáticamente** si no tiene arma equipada al enfrentar mobs.

### 3. **Nuevos Comandos de Admin**

#### `!debug-inv [@user]`
Muestra información detallada del inventario para diagnóstico:
- Stackable status de cada item
- Quantity vs Instances
- Durabilidad de cada instancia
- Equipo actual

#### `!reset-inventory [@user]`
Migra inventarios corruptos de stackable a non-stackable con durabilidad correcta.

---

## 🚀 Pasos Para Probar

### 1. **Reiniciar el Bot**
```bash
# Detener bot actual (Ctrl+C o kill process)
npm run dev
```

### 2. **Verificar Inventario Actual**
En Discord, ejecuta:
```
a!debug-inv
```

**Salida esperada (items correctos):**
```
**Pico Básico** (`tool.pickaxe.basic`)
• Stackable: false
• Quantity: 16
• Instances: 16
  └ [0] dur: 100
  └ [1] dur: 95
  └ [2] dur: 100
  ...
```

**Salida problemática (items corruptos):**
```
**Pico Básico** (`tool.pickaxe.basic`)
• Stackable: false
• Quantity: 16
• Instances: 0
⚠️ CORRUPTO: Non-stackable con qty>1 sin instances
```

### 3. **Si Aparece Inventario Corrupto**
Ejecuta el comando de migración manual:
```
a!reset-inventory @TuUsuario
```

Este comando:
- Convierte `quantity` a `state.instances[]`
- Inicializa durabilidad máxima en cada instancia
- Actualiza items en DB a `stackable: false`

### 4. **Probar Combate Sin Arma (Debe Perder)**
```
a!desequipar weapon
a!minar
```

**Resultado esperado:**
```
❌ Combate (🪦 Derrota)
• Mobs: 1 | Derrotados: 0/1
• Daño hecho: 0 | Daño recibido: 0
• HP: 50 → 25 (regenerado al 50%)
• Penalización: -X monedas, FATIGUE aplicada
```

### 5. **Probar Combate Con Arma (Debe Ganar)**
```
a!equipar weapon weapon.sword.iron
a!minar
```

**Resultado esperado:**
```
✅ Combate (🏆 Victoria)
• Mobs: 1 | Derrotados: 1/1
• Daño hecho: 15-20 | Daño recibido: 5-10
• HP: 50 → 40
```

### 6. **Probar Degradación de Durabilidad**
Ejecuta `a!minar` varias veces y verifica con `a!inventario` o `a!debug-inv`:

**Progresión esperada:**
```
Ejecución 1: Pico (95/100) - Espada (149/150)
Ejecución 2: Pico (90/100) - Espada (148/150)
Ejecución 3: Pico (85/100) - Espada (148/150)  [espada no usada si no hay mobs]
```

---

## 🐛 Diagnóstico de Problemas

### Problema: "Sigue mostrando (x16) en lugar de durabilidad"

**Causa Posible:** El comando `a!minar` muestra cantidad de instancias, no durabilidad individual.

**Verificación:**
```typescript
// En src/commands/messages/game/mina.ts
// Buscar la línea que formatea el tool display
formatToolLabel(tool, { /* ... */ })
```

**Solución:** Modificar formato para mostrar durabilidad de la instancia usada:
```typescript
// ANTES:
`${toolName} (x${instances.length})`

// DESPUÉS:
`${toolName} (${usedInstance.durability}/${maxDurability}) [x${instances.length}]`
```

### Problema: "Item se rompe al primer uso"

**Causa:** `durabilityPerUse > maxDurability` o durabilidad no inicializada.

**Verificación:**
```
a!debug-inv
```

Busca:
```
• Breakable: enabled=true, max=100
  └ [0] dur: N/A    <-- ❌ PROBLEMA
```

**Solución:**
```
a!reset-inventory @Usuario
```

---

## 📝 Archivos Modificados

```
src/game/minigames/service.ts          # Línea 470: Fix combate sin arma
src/commands/messages/admin/
  ├── resetInventory.ts                # Comando migración manual
  └── debugInv.ts                      # Comando debug inventario
scripts/
  ├── migrateStackableToInstanced.ts   # Script migración automática
  └── debugInventory.ts                # Script CLI debug
prisma/migrations/
  └── fix_stackable_items.sql          # Migración SQL (solo referencia)
README/
  ├── AUDITORIA_ECOSISTEMA_GAME.md     # Auditoría completa
  └── FIX_DURABILIDAD_STACKABLE.md     # Este documento
```

---

## 🎯 Checklist Final

- [ ] Bot reiniciado con nuevos comandos cargados
- [ ] `a!debug-inv` ejecutado y verificado
- [ ] Inventario corrupto migrado con `a!reset-inventory` (si aplica)
- [ ] Combate sin arma testado (debe perder)
- [ ] Combate con arma testado (debe ganar)
- [ ] Durabilidad degrada progresivamente (100→95→90)
- [ ] Mensaje muestra durabilidad correctamente en lugar de cantidad

---

**Si persisten problemas después de seguir esta guía:**
1. Ejecuta `a!debug-inv` y comparte la salida
2. Verifica logs del bot durante `a!minar`
3. Revisa que `formatToolLabel` en `_helpers.ts` muestre durabilidad correctamente
