# 🔧⚔️ Doble Degradación de Herramientas en Minijuegos **Contexto**: Antes existía confusión: al minar, se mostraba que sólo se usaba la espada, cuando el jugador esperaba ver reflejado el pico usado + la espada degradándose por defenderse. --- ## ✅ Cambios Implementados ### 1. Separación de Herramientas (tool vs weaponTool) - **`tool`**: Herramienta requerida para la actividad (pico para minar, caña para pescar, espada para pelear). - **`weaponTool`**: Arma equipada que se degrada en **combate** (si hubo mobs y el jugador tenía espada equipada). **Beneficio**: Ahora minar usa el pico para recolectar minerales **y** la espada equipada para defenderse de mobs, cada una con su propia degradación. --- ### 2. Balanceo de Durabilidad en Combate (50%) **Problema original**: Las armas caras se rompían al instante tras combate (desgaste completo configurado en `durabilityPerUse`). **Solución**: - `reduceToolDurability()` ahora acepta parámetro `usage`: - `"gather"` (default): desgaste completo (actividades de recolección/minería). - `"combat"`: desgaste **reducido al 50%** (arma usada en combate). **Implementación**: ```typescript async function reduceToolDurability( userId: string, guildId: string, toolKey: string, usage: "gather" | "combat" = "gather" ) { let perUse = Math.max(1, breakable.durabilityPerUse ?? 1); if (usage === "combat") { perUse = Math.max(1, Math.ceil(perUse * 0.5)); // Reduce a la mitad, mínimo 1 } // ... resto de lógica } ``` **Resultado**: Armas ahora duran el doble en combate, mejorando economía sin eliminar costo operativo. --- ### 3. Extensión del Tipo `RunResult` Añadido campo opcional `weaponTool` al resultado de minijuegos: ```typescript export type RunResult = { // ... campos existentes (tool, combat, rewards, etc.) weaponTool?: { key?: string; durabilityDelta?: number; broken?: boolean; remaining?: number; max?: number; brokenInstance?: boolean; instancesRemaining?: number; toolSource?: "equipped"; }; }; ``` --- ### 4. Lógica de Degradación en `runMinigame` Tras ejecutar combate, si hay mobs y el jugador tiene arma equipada: 1. Obtener `weapon` del slot equipment. 2. Validar que sea tipo `sword` y **no sea la misma herramienta principal** (evitar doble degradación en pelear). 3. Degradarla con `usage: "combat"`. 4. Adjuntar info a `weaponTool` en el resultado. **Código clave** (en `service.ts`): ```typescript if (combatSummary && combatSummary.mobs.length > 0) { const { weapon } = await getEquipment(userId, guildId); if (weapon && weaponProps?.tool?.type === "sword") { const alreadyMain = toolInfo?.key === weapon.key; if (!alreadyMain) { const wt = await reduceToolDurability(userId, guildId, weapon.key, "combat"); weaponToolInfo = { ...wt, toolSource: "equipped" }; } } } ``` --- ### 5. Actualización de Comandos (UX) **Antes**: ``` Herramienta: Espada de Hierro (50/150) [⚔️ Equipado] ``` (El usuario pensaba que se estaba usando solo la espada para minar.) **Ahora** (comando `!mina` o `!pescar`): ``` Pico: Pico Básico (95/100) [🔧 Auto] Arma (defensa): Espada de Hierro (50/150) [⚔️ Equipado] ``` **Comando `!pelear`** (sin cambio visual, pues la espada es la herramienta principal): ``` Arma: Espada de Hierro (50/150) [⚔️ Equipado] ``` **Implementación**: - En `mina.ts`, `pescar.ts`, `pelear.ts` ahora se lee `result.weaponTool` adicional. - Se construye `weaponInfo` con `formatToolLabel` y se incluye en el bloque de visualización. --- ### 6. Ataques Programados (ScheduledMobAttack) Actualizado `attacksWorker.ts` para degradar arma equipada con `usage: "combat"` al recibir ataque de mobs. **Cambio**: ```typescript await reduceToolDurability(job.userId, job.guildId, full.key, "combat"); ``` Asegura que ataques programados en background también respeten el balance del 50%. --- ## 🎯 Resultados 1. **Claridad**: Jugadores ven explícitamente qué herramienta se usó para recolectar y cuál para combate. 2. **Balance económico**: Armas duran el doble en combate, reduciendo costo operativo sin eliminar totalmente el desgaste. 3. **Consistencia**: El mismo sistema de doble degradación aplica para ataques programados, minijuegos activos y combate. --- ## 📊 Ejemplos de Uso ### Minar con Pico y Espada Equipada ``` !mina 2 Área: mine.cavern • Nivel: 2 Pico: Pico Básico (90/100) [-5 usos] [🔧 Auto] Arma (defensa): Espada de Hierro (149/150) [-1 uso] [⚔️ Equipado] Recompensas: • 🪙 +50 • Mineral de Hierro x3 Mobs: • slime • goblin Combate: ⚔️ 2 mobs → 2 derrotados | 💀 Daño infligido: 45 | 🩹 Daño recibido: 8 HP: ❤️❤️❤️❤️🤍 (85/100) ``` ### Pescar con Caña y Arma ``` !pescar 1 Área: lagoon.shore • Nivel: 1 Caña: Caña Básica (77/80) [-3 usos] [🎣 Auto] Arma (defensa): Espada de Hierro (148/150) [-1 uso] [⚔️ Equipado] Recompensas: • Pez Común x2 • 🪙 +10 Mobs: — ``` ### Pelear (Espada como Tool Principal) ``` !pelear 1 Área: fight.arena • Nivel: 1 Arma: Espada de Hierro (148/150) [-2 usos] [⚔️ Equipado] Recompensas: • 🪙 +25 Enemigos: • slime Combate: ⚔️ 1 mob → 1 derrotado | 💀 Daño infligido: 18 | 🩹 Daño recibido: 3 Victoria ✅ HP: ❤️❤️❤️❤️❤️ (97/100) ``` --- ## ⚙️ Configuración Recomendada Para ajustar desgaste según dificultad de tu servidor: 1. **Herramientas de recolección** (picos, cañas): - `durabilityPerUse`: 3-5 (se aplica completo en gather). 2. **Armas** (espadas): - `durabilityPerUse`: 2-4 (se reduce a 1-2 en combate por factor 0.5). 3. **Eventos extremos**: - Puedes crear ítems especiales con `durabilityPerUse: 1` para mayor longevidad o eventos sin desgaste (`enabled: false`). --- ## 🔮 Próximos Pasos - [ ] Extender sistema a herramientas agrícolas (`hoe`, `watering_can`) con `usage: "farming"` y factor ajustable. - [ ] Añadir mutaciones de ítems que reduzcan `durabilityPerUse` (ej: encantamiento "Durabilidad+" reduce desgaste en 25%). - [ ] Implementar `ToolBreakLog` (migración propuesta en `PROPUESTA_MIGRACIONES_RPG.md`) para auditoría completa. --- **Fecha**: Octubre 2025 **Autor**: Sistema RPG Integrado v2 **Archivo**: `README/DOBLE_DURABILIDAD_MINIJUEGOS.md`