- Introduced separation between `tool` (for gathering) and `weaponTool` (for combat) in minigames. - Adjusted durability reduction logic to apply a 50% reduction for weapons used in combat to prevent instant breakage. - Updated `RunResult` type to include `weaponTool` information. - Enhanced `runMinigame` logic to handle weapon degradation during combat scenarios. - Updated user commands to reflect both tool and weapon durability in outputs. - Modified scheduled mob attacks to respect the new durability system. - Added comprehensive documentation on the new dual durability feature and its implications for gameplay balance.
6.2 KiB
🔧⚔️ 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ámetrousage:"gather"(default): desgaste completo (actividades de recolección/minería)."combat": desgaste reducido al 50% (arma usada en combate).
Implementación:
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:
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:
- Obtener
weapondel slot equipment. - Validar que sea tipo
swordy no sea la misma herramienta principal (evitar doble degradación en pelear). - Degradarla con
usage: "combat". - Adjuntar info a
weaponToolen el resultado.
Código clave (en service.ts):
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.tsahora se leeresult.weaponTooladicional. - Se construye
weaponInfoconformatToolLabely 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:
await reduceToolDurability(job.userId, job.guildId, full.key, "combat");
Asegura que ataques programados en background también respeten el balance del 50%.
🎯 Resultados
- Claridad: Jugadores ven explícitamente qué herramienta se usó para recolectar y cuál para combate.
- Balance económico: Armas duran el doble en combate, reduciendo costo operativo sin eliminar totalmente el desgaste.
- 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:
-
Herramientas de recolección (picos, cañas):
durabilityPerUse: 3-5 (se aplica completo en gather).
-
Armas (espadas):
durabilityPerUse: 2-4 (se reduce a 1-2 en combate por factor 0.5).
-
Eventos extremos:
- Puedes crear ítems especiales con
durabilityPerUse: 1para mayor longevidad o eventos sin desgaste (enabled: false).
- Puedes crear ítems especiales con
🔮 Próximos Pasos
- Extender sistema a herramientas agrícolas (
hoe,watering_can) conusage: "farming"y factor ajustable. - Añadir mutaciones de ítems que reduzcan
durabilityPerUse(ej: encantamiento "Durabilidad+" reduce desgaste en 25%). - Implementar
ToolBreakLog(migración propuesta enPROPUESTA_MIGRACIONES_RPG.md) para auditoría completa.
Fecha: Octubre 2025
Autor: Sistema RPG Integrado v2
Archivo: README/DOBLE_DURABILIDAD_MINIJUEGOS.md