feat: agregar comando de registro de muertes y penalizaciones; implementar ítem de purga de efectos y mejorar la documentación de creación de contenido
This commit is contained in:
49
src/commands/messages/game/deathlog.ts
Normal file
49
src/commands/messages/game/deathlog.ts
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import type { CommandMessage } from "../../../core/types/commands";
|
||||||
|
import type Amayo from "../../../core/client";
|
||||||
|
import { prisma } from "../../../core/database/prisma";
|
||||||
|
|
||||||
|
export const command: CommandMessage = {
|
||||||
|
name: "deathlog",
|
||||||
|
aliases: ["muertes"],
|
||||||
|
type: "message",
|
||||||
|
cooldown: 8,
|
||||||
|
category: "Economía",
|
||||||
|
description: "Muestra tus últimas muertes y penalizaciones aplicadas.",
|
||||||
|
usage: "deathlog [cantidad<=20]",
|
||||||
|
run: async (message, args, _client: Amayo) => {
|
||||||
|
const userId = message.author.id;
|
||||||
|
const guildId = message.guild!.id;
|
||||||
|
let take = 10;
|
||||||
|
if (args[0]) {
|
||||||
|
const n = parseInt(args[0], 10);
|
||||||
|
if (!isNaN(n) && n > 0) take = Math.min(20, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
const logs = await prisma.deathLog.findMany({
|
||||||
|
where: { userId, guildId },
|
||||||
|
orderBy: { createdAt: "desc" },
|
||||||
|
take,
|
||||||
|
});
|
||||||
|
if (!logs.length) {
|
||||||
|
await message.reply("No hay registros de muerte.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lines = logs.map((l) => {
|
||||||
|
const pct = Math.round((l.percentApplied || 0) * 100);
|
||||||
|
const parts: string[] = [];
|
||||||
|
parts.push(`💰-${l.goldLost}`);
|
||||||
|
if (pct) parts.push(`${pct}%`);
|
||||||
|
if (l.fatigueMagnitude)
|
||||||
|
parts.push(`Fatiga ${Math.round(l.fatigueMagnitude * 100)}%`);
|
||||||
|
const area = l.areaKey ? l.areaKey : "?";
|
||||||
|
return `${l.createdAt.toISOString().slice(11, 19)} | ${area} L${
|
||||||
|
l.level ?? "-"
|
||||||
|
} | ${parts.join(" | ")}${l.autoDefeatNoWeapon ? " | sin arma" : ""}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
await message.reply(
|
||||||
|
`**DeathLog (últimos ${logs.length})**\n${lines.join("\n")}`
|
||||||
|
);
|
||||||
|
},
|
||||||
|
};
|
||||||
35
src/game/economy/seedPurgePotion.ts
Normal file
35
src/game/economy/seedPurgePotion.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { prisma } from "../../core/database/prisma";
|
||||||
|
|
||||||
|
// Seed para crear el ítem de purga de efectos (potion.purga)
|
||||||
|
// Ejecutar manualmente una vez.
|
||||||
|
// node -r ts-node/register src/game/economy/seedPurgePotion.ts (según tu setup)
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const key = "potion.purga";
|
||||||
|
const existing = await prisma.economyItem.findFirst({
|
||||||
|
where: { key, guildId: null },
|
||||||
|
});
|
||||||
|
if (existing) {
|
||||||
|
console.log("Ya existe potion.purga (global)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const item = await prisma.economyItem.create({
|
||||||
|
data: {
|
||||||
|
key,
|
||||||
|
name: "Poción de Purga",
|
||||||
|
description:
|
||||||
|
"Elimina todos tus efectos de estado activos al usar el comando !efectos purgar.",
|
||||||
|
category: "consumable",
|
||||||
|
icon: "🧪",
|
||||||
|
stackable: true,
|
||||||
|
props: { usable: true, purgeAllEffects: true },
|
||||||
|
tags: ["purge", "status", "utility"],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
console.log("Creado:", item.id, item.key);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((e) => {
|
||||||
|
console.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
@@ -87,6 +87,7 @@ export function combatSummaryRPG(c: {
|
|||||||
goldLost?: number;
|
goldLost?: number;
|
||||||
fatigueAppliedMinutes?: number;
|
fatigueAppliedMinutes?: number;
|
||||||
fatigueMagnitude?: number;
|
fatigueMagnitude?: number;
|
||||||
|
percentApplied?: number;
|
||||||
};
|
};
|
||||||
}) {
|
}) {
|
||||||
const header = `**Combate (${outcomeLabel(c.outcome)})**`;
|
const header = `**Combate (${outcomeLabel(c.outcome)})**`;
|
||||||
@@ -112,6 +113,9 @@ export function combatSummaryRPG(c: {
|
|||||||
: 15;
|
: 15;
|
||||||
parts.push(`Fatiga ${pct}% ${c.deathPenalty.fatigueAppliedMinutes}m`);
|
parts.push(`Fatiga ${pct}% ${c.deathPenalty.fatigueAppliedMinutes}m`);
|
||||||
}
|
}
|
||||||
|
if (typeof c.deathPenalty.percentApplied === "number") {
|
||||||
|
parts.push(`(${Math.round(c.deathPenalty.percentApplied * 100)}% oro)`);
|
||||||
|
}
|
||||||
if (parts.length) lines.push(`• Penalización: ${parts.join(" | ")}`);
|
if (parts.length) lines.push(`• Penalización: ${parts.join(" | ")}`);
|
||||||
}
|
}
|
||||||
if (c.playerStartHp != null && c.playerEndHp != null) {
|
if (c.playerStartHp != null && c.playerEndHp != null) {
|
||||||
|
|||||||
@@ -451,7 +451,19 @@ export async function runMinigame(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const fatigueMagnitude = 0.15;
|
// Fatiga escalada: base 15%, +1% cada 5 de racha previa (cap +10%)
|
||||||
|
let previousStreak = 0;
|
||||||
|
try {
|
||||||
|
const ps = await prisma.playerStats.findUnique({
|
||||||
|
where: { userId_guildId: { userId, guildId } },
|
||||||
|
});
|
||||||
|
previousStreak = ps?.currentWinStreak || 0;
|
||||||
|
} catch {}
|
||||||
|
const extraFatigue = Math.min(
|
||||||
|
0.1,
|
||||||
|
Math.floor(previousStreak / 5) * 0.01
|
||||||
|
);
|
||||||
|
const fatigueMagnitude = 0.15 + extraFatigue;
|
||||||
const fatigueMinutes = 5;
|
const fatigueMinutes = 5;
|
||||||
await applyDeathFatigue(
|
await applyDeathFatigue(
|
||||||
userId,
|
userId,
|
||||||
@@ -632,7 +644,19 @@ export async function runMinigame(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const fatigueMagnitude = 0.15;
|
// Fatiga escalada
|
||||||
|
let previousStreak = 0;
|
||||||
|
try {
|
||||||
|
const ps = await prisma.playerStats.findUnique({
|
||||||
|
where: { userId_guildId: { userId, guildId } },
|
||||||
|
});
|
||||||
|
previousStreak = ps?.currentWinStreak || 0;
|
||||||
|
} catch {}
|
||||||
|
const extraFatigue = Math.min(
|
||||||
|
0.1,
|
||||||
|
Math.floor(previousStreak / 5) * 0.01
|
||||||
|
);
|
||||||
|
const fatigueMagnitude = 0.15 + extraFatigue;
|
||||||
const fatigueMinutes = 5;
|
const fatigueMinutes = 5;
|
||||||
await applyDeathFatigue(
|
await applyDeathFatigue(
|
||||||
userId,
|
userId,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<section id="creacion-contenido" class="rounded-3xl bg-gradient-to-br from-red-900/20 to-orange-900/20 backdrop-blur-xl border border-red-500/30 p-8 shadow-2xl">
|
<section id="creacion-contenido" class="rounded-3xl bg-gradient-to-br from-red-900/20 to-orange-900/20 backdrop-blur-xl border border-red-500/30 p-8 shadow-2xl">
|
||||||
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-red-200 to-orange-200">🎨 Creación de Contenido</h2>
|
<h2 class="text-3xl sm:text-4xl font-bold mb-3 bg-clip-text text-transparent bg-gradient-to-r from-red-200 to-orange-200">🎨 Creación de Contenido</h2>
|
||||||
<p class="text-slate-100">Guía técnica paso a paso para crear <strong>items</strong>, <strong>áreas/niveles</strong>, <strong>mobs</strong> y <strong>ofertas</strong> directamente desde Discord. Requiere permiso <span class="font-mono">Manage Guild</span> o rol de staff.</p>
|
<p class="text-slate-100">Guía técnica paso a paso para crear <strong>items</strong>, <strong>áreas/niveles</strong>, <strong>mobs</strong>, <strong>ofertas</strong> y ahora <strong>componentes RPG avanzados</strong> (durabilidad por instancia, efectos de estado, penalizaciones de muerte, rachas, riskFactor de áreas). Requiere permiso <span class="font-mono">Manage Guild</span> o rol de staff.</p>
|
||||||
|
|
||||||
<div class="grid gap-6 md:grid-cols-2">
|
<div class="grid gap-6 md:grid-cols-2">
|
||||||
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
||||||
@@ -26,7 +26,15 @@ Ingredientes: iron_ingot:3, wood_plank:1
|
|||||||
4) Guardar → ✅ Item creado
|
4) Guardar → ✅ Item creado
|
||||||
Prueba: !craftear iron_sword</pre>
|
Prueba: !craftear iron_sword</pre>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-slate-300 text-sm">Usa <span class="font-mono">!item-editar</span>, <span class="font-mono">!item-ver</span>, <span class="font-mono">!items-lista</span> para gestionar.</p>
|
<p class="text-slate-300 text-sm">Usa <span class="font-mono">!item-editar</span>, <span class="font-mono">!item-ver</span>, <span class="font-mono">!items-lista</span>. Para herramientas NO apilables la durabilidad se gestiona por <em>instancias</em> dentro de <span class="font-mono">inventory.state.instances</span>.</p>
|
||||||
|
<div class="mt-3 bg-black/40 rounded-lg p-3 text-xs text-orange-100 space-y-2">
|
||||||
|
<div class="font-semibold">Novedades RPG (Items)</div>
|
||||||
|
<ul class="list-disc pl-5 space-y-1">
|
||||||
|
<li><strong>Durabilidad por instancia:</strong> si <span class="font-mono">stackable=false</span> y <span class="font-mono">breakable.enabled=true</span>, cada unidad es una instancia con su propia durabilidad.</li>
|
||||||
|
<li><strong>Mutaciones / Encantamientos:</strong> se reflejan sumando bonuses (damageBonus, defenseBonus, maxHpBonus).</li>
|
||||||
|
<li><strong>Ítem purga efectos:</strong> puedes crear tu propia poción local: <code>{ "usable": true, "purgeAllEffects": true }</code> y usarla con <span class="font-mono">!efectos purgar</span>.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
||||||
<h3 class="text-lg font-semibold text-white">🧭 Áreas y Niveles (MINE/LAGOON/FIGHT/FARM)</h3>
|
<h3 class="text-lg font-semibold text-white">🧭 Áreas y Niveles (MINE/LAGOON/FIGHT/FARM)</h3>
|
||||||
@@ -36,7 +44,8 @@ Prueba: !craftear iron_sword</pre>
|
|||||||
Config (JSON): {
|
Config (JSON): {
|
||||||
"cooldownSeconds": 60,
|
"cooldownSeconds": 60,
|
||||||
"description": "Caverna rica en hierro",
|
"description": "Caverna rica en hierro",
|
||||||
"icon": "⛏️"
|
"icon": "⛏️",
|
||||||
|
"riskFactor": 2
|
||||||
}
|
}
|
||||||
Guardar → ✅ Área creada
|
Guardar → ✅ Área creada
|
||||||
|
|
||||||
@@ -64,6 +73,7 @@ Guardar → ✅ Nivel guardado</pre>
|
|||||||
<li><span class="font-mono">mobKey</span> o <span class="font-mono">itemKey</span> inexistente → crea primero o corrige la key</li>
|
<li><span class="font-mono">mobKey</span> o <span class="font-mono">itemKey</span> inexistente → crea primero o corrige la key</li>
|
||||||
<li>Pesos mal balanceados → revisa <span class="font-mono">weight</span> (no negativos; no tienen que sumar 100)</li>
|
<li>Pesos mal balanceados → revisa <span class="font-mono">weight</span> (no negativos; no tienen que sumar 100)</li>
|
||||||
<li>Herramienta requerida mal configurada → revisa <span class="font-mono">toolType</span> y <span class="font-mono">minTier</span></li>
|
<li>Herramienta requerida mal configurada → revisa <span class="font-mono">toolType</span> y <span class="font-mono">minTier</span></li>
|
||||||
|
<li><span class="font-mono">riskFactor</span> (0-3) afecta % de oro que pierdes al morir (escala hasta 25% total con nivel).</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,6 +97,14 @@ Drops (JSON): {
|
|||||||
Guardar → ✅ Mob creado</pre>
|
Guardar → ✅ Mob creado</pre>
|
||||||
</div>
|
</div>
|
||||||
<p class="text-slate-300 text-xs">Revisa con <span class="font-mono">!mobs-lista</span> y <span class="font-mono">!mob-eliminar <key></span> si necesitas limpiar datos de prueba.</p>
|
<p class="text-slate-300 text-xs">Revisa con <span class="font-mono">!mobs-lista</span> y <span class="font-mono">!mob-eliminar <key></span> si necesitas limpiar datos de prueba.</p>
|
||||||
|
<div class="mt-3 bg-black/40 rounded-lg p-3 text-xs text-orange-100 space-y-2">
|
||||||
|
<div class="font-semibold">Integración combate</div>
|
||||||
|
<ul class="list-disc pl-5 space-y-1">
|
||||||
|
<li>El daño del jugador usa arma + mutaciones + racha (1% cada 3 victorias, cap 30%).</li>
|
||||||
|
<li>Defensa reduce daño hasta 60% (5% por punto, cap).</li>
|
||||||
|
<li>Si daño efectivo = 0 → derrota automática (flag <span class="font-mono">autoDefeatNoWeapon</span>).</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
<div class="space-y-3 rounded-2xl border border-white/5 bg-black/20 p-5">
|
||||||
<h3 class="text-lg font-semibold text-white">🛒 Ofertas de Tienda</h3>
|
<h3 class="text-lg font-semibold text-white">🛒 Ofertas de Tienda</h3>
|
||||||
@@ -110,6 +128,7 @@ Guardar → ✅ Oferta guardada</pre>
|
|||||||
<li><span class="font-mono">itemKey</span> no existe → crea el ítem primero</li>
|
<li><span class="font-mono">itemKey</span> no existe → crea el ítem primero</li>
|
||||||
<li>Formato de precio inválido → respeta estructura de <span class="font-mono">coins</span> e <span class="font-mono">items</span></li>
|
<li>Formato de precio inválido → respeta estructura de <span class="font-mono">coins</span> e <span class="font-mono">items</span></li>
|
||||||
<li>Ventana inválida → usa fechas ISO: <span class="font-mono">YYYY-MM-DDTHH:MM:SSZ</span></li>
|
<li>Ventana inválida → usa fechas ISO: <span class="font-mono">YYYY-MM-DDTHH:MM:SSZ</span></li>
|
||||||
|
<li>Para vender una poción de purga local crea un ítem consumible y ofrece en la tienda.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -120,7 +139,18 @@ Guardar → ✅ Oferta guardada</pre>
|
|||||||
<ul class="list-disc pl-5 space-y-1">
|
<ul class="list-disc pl-5 space-y-1">
|
||||||
<li>Usa keys en minúsculas y sin espacios (únicas por servidor).</li>
|
<li>Usa keys en minúsculas y sin espacios (únicas por servidor).</li>
|
||||||
<li>Guarda plantillas de Props JSON para acelerar creación.</li>
|
<li>Guarda plantillas de Props JSON para acelerar creación.</li>
|
||||||
<li>Prueba inmediatamente tras crear: <span class="font-mono">!craftear</span>, <span class="font-mono">!abrir</span>, <span class="font-mono">!equipar</span>.</li>
|
<li>Prueba tras crear: <span class="font-mono">!craftear</span>, <span class="font-mono">!abrir</span>, <span class="font-mono">!equipar</span>, <span class="font-mono">!efectos</span>, <span class="font-mono">!deathlog</span>.</li>
|
||||||
|
<li>Si ajustas valores de riesgo o nivel alto prueba la pérdida real (usa un alt) para validar balance.</li>
|
||||||
|
<li>Consulta auditoría de muertes: <span class="font-mono">!deathlog</span> para detectar abusos o mal balance.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<div class="mt-4 bg-black/30 p-3 rounded-lg text-xs space-y-1">
|
||||||
|
<div class="font-semibold">Resumen rápido nuevas claves JSON</div>
|
||||||
|
<code class="block">area.config.riskFactor: 0-3 (aumenta % oro perdido)</code>
|
||||||
|
<code class="block">item.props.breakable.maxDurability / durabilityPerUse</code>
|
||||||
|
<code class="block">item.props.tool { type, tier }</code>
|
||||||
|
<code class="block">item.props.purgeAllEffects = true (ítem purga)</code>
|
||||||
|
<code class="block">status effects: almacenados en DB (PlayerStatusEffect)</code>
|
||||||
|
<code class="block">death penalty: porcentaje dinámico + fatiga escalada</code>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -51,5 +51,74 @@ Props (JSON): {"tool": {"type": "sword", "tier": 3}, "damage": 25}
|
|||||||
Props (JSON): {"damage": 45, "breakable": {"enabled": true, "maxDurability": 300}}
|
Props (JSON): {"damage": 45, "breakable": {"enabled": true, "maxDurability": 300}}
|
||||||
Receta (modal): steel_sword_base:1, magic_dust:3, dragon_scale:1</pre>
|
Receta (modal): steel_sword_base:1, magic_dust:3, dragon_scale:1</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
|
||||||
|
<h3 class="text-lg font-semibold text-white">4) Área Avanzada con Riesgo y Mobs</h3>
|
||||||
|
<pre class="text-indigo-200 text-sm whitespace-pre-wrap bg-slate-900/40 p-3 rounded-lg"># Área con factor de riesgo (aumenta penalización oro al morir)
|
||||||
|
!area-crear arena.blood_pit
|
||||||
|
Config (JSON): {"cooldownSeconds": 90, "icon": "⚔️", "riskFactor": 3, "description": "La fosa sangrienta"}
|
||||||
|
!area-nivel arena.blood_pit 1
|
||||||
|
Requisitos (JSON): {"tool": {"required": true, "toolType": "sword", "minTier": 2}}
|
||||||
|
Recompensas (JSON): {"draws": 2, "table": [
|
||||||
|
{"type": "coins", "amount": 120, "weight": 10},
|
||||||
|
{"type": "item", "itemKey": "blood_shard", "qty": 1, "weight": 4}
|
||||||
|
]}
|
||||||
|
Mobs (JSON): {"draws": 2, "table": [
|
||||||
|
{"mobKey": "goblin", "weight": 8},
|
||||||
|
{"mobKey": "cave_spider", "weight": 5}
|
||||||
|
]}</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
|
||||||
|
<h3 class="text-lg font-semibold text-white">5) Ítem Poción de Purga Local</h3>
|
||||||
|
<pre class="text-indigo-200 text-sm whitespace-pre-wrap bg-slate-900/40 p-3 rounded-lg">!item-crear purge_potion
|
||||||
|
Props (JSON): {"usable": true, "purgeAllEffects": true, "icon": "🧪"}
|
||||||
|
# Se consume al usar: !efectos purgar
|
||||||
|
# Para venderla: crear oferta o poner drop en cofre.</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
|
||||||
|
<h3 class="text-lg font-semibold text-white">6) Introducción a Status Effects Manuales</h3>
|
||||||
|
<pre class="text-indigo-200 text-sm whitespace-pre-wrap bg-slate-900/40 p-3 rounded-lg"># (Opcional) Aplicar un efecto custom vía comando admin futuro
|
||||||
|
# Ejemplo conceptual JSON (guardado server-side):
|
||||||
|
{
|
||||||
|
"type": "BLESSING",
|
||||||
|
"magnitude": 0.10, # +10% daño (interpretación futura)
|
||||||
|
"durationMs": 600000 # 10 min
|
||||||
|
}
|
||||||
|
# Los efectos actuales: FATIGUE (reduce daño y defensa)
|
||||||
|
# Ver activos: !efectos</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
|
||||||
|
<h3 class="text-lg font-semibold text-white">7) Auditoría de Muertes</h3>
|
||||||
|
<pre class="text-indigo-200 text-sm whitespace-pre-wrap bg-slate-900/40 p-3 rounded-lg"># Ver últimas muertes y penalizaciones
|
||||||
|
!deathlog # por defecto 10
|
||||||
|
!deathlog 20 # máximo 20
|
||||||
|
|
||||||
|
# Interpreta columnas
|
||||||
|
# HH:MM:SS | areaKey Lnivel | -oro | % | Fatiga | sin arma?
|
||||||
|
|
||||||
|
# Ajusta balance si ves pérdidas demasiado altas en cierto nivel/riskFactor.</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="space-y-2 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
|
||||||
|
<h3 class="text-lg font-semibold text-white">8) Cadena Completa: Creación → Riesgo → Muerte</h3>
|
||||||
|
<pre class="text-indigo-200 text-sm whitespace-pre-wrap bg-slate-900/40 p-3 rounded-lg"># 1. Crear arma y área con riesgo
|
||||||
|
!item-crear bone_sword
|
||||||
|
Props (JSON): {"tool": {"type": "sword", "tier": 1}, "damage": 9, "breakable": {"enabled": true, "maxDurability": 80}}
|
||||||
|
!area-crear arena.bone_trial
|
||||||
|
Config (JSON): {"cooldownSeconds": 45, "riskFactor": 1, "icon": "🗡️"}
|
||||||
|
!area-nivel arena.bone_trial 1
|
||||||
|
Requisitos (JSON): {"tool": {"required": true, "toolType": "sword", "minTier": 1}}
|
||||||
|
Mobs (JSON): {"draws":1, "table":[{"mobKey":"goblin","weight":10}]}
|
||||||
|
|
||||||
|
# 2. Pelear varias veces para subir racha y ver bonus daño (!player)
|
||||||
|
# 3. Morir intencionalmente con monedas => verifica !deathlog
|
||||||
|
# 4. Aplicar purga de efectos si acumulaste FATIGUE
|
||||||
|
!efectos purgar
|
||||||
|
|
||||||
|
# Ajusta riskFactor o nivel si la penalización % es muy baja/alta.</pre>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
Reference in New Issue
Block a user