Files
amayo/README/DOBLE_DURABILIDAD_MINIJUEGOS.md
shni 646f62d2e9 feat(minigames): implement dual durability system for tools and weapons
- 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.
2025-10-09 02:23:51 -05:00

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ámetro usage:
    • "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:

  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):

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:

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