- Updated database schema to set stackable items as non-stackable. - Implemented migration script to convert existing stackable items to instances with durability. - Fixed combat logic to ensure players lose if no weapon is equipped. - Added admin commands for inventory debugging and resetting. - Enhanced item display to show durability instead of quantity. - Conducted thorough testing and validation of changes.
212 lines
5.1 KiB
Markdown
212 lines
5.1 KiB
Markdown
# 🔧 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
|