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.
This commit is contained in:
220
README/DOBLE_DURABILIDAD_MINIJUEGOS.md
Normal file
220
README/DOBLE_DURABILIDAD_MINIJUEGOS.md
Normal file
@@ -0,0 +1,220 @@
|
||||
# 🔧⚔️ 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`
|
||||
Reference in New Issue
Block a user