Files
amayo/src/server/public/index.html

644 lines
45 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Amayo Docs | Guía de Contenido</title>
<meta
name="description"
content="Documentación interactiva para crear items, mobs, áreas, logros, misiones y más en Amayo."
/>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
rel="stylesheet"
/>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'ui-sans-serif', 'system-ui', 'Segoe UI', 'sans-serif'],
mono: [
'JetBrains Mono',
'ui-monospace',
'SFMono-Regular',
'SFMono',
'Menlo',
'Monaco',
'Consolas',
'Liberation Mono',
'Courier New',
'monospace'
]
},
boxShadow: {
glow: '0 40px 120px -45px rgba(99, 102, 241, 0.45)'
}
}
}
};
</script>
<link rel="stylesheet" href="./assets/css/styles.css" />
</head>
<body class="min-h-screen bg-gradient-to-b from-slate-950 via-slate-950 to-slate-900 text-slate-100 antialiased">
<div class="flex min-h-screen flex-col">
<header class="relative overflow-hidden">
<div class="pointer-events-none absolute inset-0">
<div class="absolute -top-32 left-1/2 h-96 w-96 -translate-x-1/2 rounded-full bg-indigo-600/40 blur-3xl"></div>
<div class="absolute top-16 -left-28 h-72 w-72 rounded-full bg-sky-500/25 blur-3xl"></div>
<div class="absolute bottom-0 right-0 h-80 w-80 translate-y-1/3 rounded-full bg-fuchsia-500/20 blur-3xl"></div>
</div>
<div class="relative mx-auto flex max-w-5xl flex-col items-center px-6 pb-20 pt-16 text-center lg:px-8">
<p class="inline-flex items-center gap-2 rounded-full border border-white/10 bg-white/5 px-4 py-1 text-xs font-semibold uppercase tracking-[0.35em] text-slate-200">
Amayo • Docs
</p>
<h1 class="mt-6 text-4xl font-bold text-white sm:text-5xl md:text-6xl">
Documentación de Contenido Amayo
</h1>
<p class="mt-4 max-w-2xl text-base text-slate-200 sm:text-lg">
Crea y gestiona items, enemigos, áreas, niveles, logros, misiones, cofres,
mutaciones y más usando los comandos del bot. Esta guía reúne los flujos
completos y plantillas listas para copiar.
</p>
<div class="mt-8 flex flex-wrap items-center justify-center gap-3">
<a
class="inline-flex items-center justify-center rounded-full bg-gradient-to-r from-indigo-500 to-fuchsia-500 px-6 py-3 text-sm font-semibold text-white shadow-xl shadow-indigo-500/30 transition hover:-translate-y-0.5 hover:shadow-indigo-500/40"
href="#items"
>
Empezar ahora
</a>
<button
class="inline-flex items-center justify-center rounded-full border border-white/10 bg-white/5 px-6 py-3 text-sm font-semibold text-slate-100 transition hover:border-indigo-400/70 hover:text-white"
id="toggle-nav"
>
Abrir índice
</button>
</div>
<div class="mt-6 flex flex-wrap items-center justify-center gap-3 text-xs text-slate-300">
<span class="inline-flex items-center rounded-full border border-white/10 bg-white/5 px-3 py-1">
Actualizado: 5 Oct 2025
</span>
<span class="inline-flex items-center rounded-full border border-white/10 bg-white/5 px-3 py-1">
Compatible con DisplayComponents V2
</span>
</div>
</div>
</header>
<div class="mx-auto flex w-full max-w-6xl flex-1 flex-col gap-10 px-6 pb-16 lg:flex-row lg:px-10">
<nav
id="toc"
class="hidden w-full max-w-xs rounded-3xl border border-white/10 bg-slate-900/80 p-6 text-left shadow-2xl shadow-indigo-500/20 backdrop-blur lg:sticky lg:top-24 lg:block lg:max-h-[calc(100vh-6rem)] lg:w-72 lg:overflow-y-auto"
>
<div class="text-xs font-semibold uppercase tracking-[0.3em] text-slate-400">
Índice
</div>
<ul class="mt-4 space-y-3 text-sm">
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#overview">Conceptos básicos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#items">Items</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#mobs">Mobs</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#areas">Áreas de juego</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#levels">Niveles de área</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#offers">Ofertas de tienda</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#achievements">Logros</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#missions">Misiones</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#chests">Cofres y recompensas</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#crafting">Crafteos</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#mutations">Mutaciones</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#potions">Pociones y consumibles</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#tools">Herramientas y durabilidad</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#services">Servicios del sistema</a></li>
<li><a class="text-slate-200 transition hover:text-indigo-300" href="#faq">Preguntas frecuentes</a></li>
</ul>
</nav>
<main class="flex-1">
<div class="mx-auto flex w-full max-w-3xl flex-col gap-8">
<section id="overview" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Conceptos básicos</h2>
<p class="text-slate-200">
Toda pieza de contenido en Amayo se identifica mediante una <strong class="text-white">key</strong>
única. Estas keys se usan en comandos, relaciones y validaciones. Usa un formato consistente como
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">categoria_nombre</code>
(ej: <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">item_iron_sword</code>).
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Permisos necesarios</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Permiso de Discord <strong class="text-white">Administrar Servidor</strong>.</li>
<li>O un rol Staff configurado para los comandos del bot.</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Sistema de pesos</h3>
<p class="text-sm text-slate-200">
Al definir tablas de recompensas o aparición de enemigos, usa un campo <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">weight</code>.
Cuanto mayor sea el peso, mayor la probabilidad de ser seleccionado.
</p>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{ "itemKey": "iron_ore", "weight": 10 }
{ "itemKey": "gold_ore", "weight": 3 }</code></pre>
</div>
</div>
</section>
<section id="items" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Items (EconomyItem)</h2>
<p class="text-slate-200">
Administra todo el inventario del juego. Usa <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!item-crear</code>
para abrir el editor interactivo y completa cada pestaña antes de guardar.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Comandos clave</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!item-crear &lt;key&gt;</code> — Crear un item nuevo.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!item-editar &lt;key&gt;</code> — Editar un item existente.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!items-lista [página]</code> — Ver listado paginado.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!item-ver &lt;key&gt;</code> — Ver detalles completos.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!item-eliminar &lt;key&gt;</code> — Eliminar un item.</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Campos del modal Base</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><strong class="text-white">Nombre:</strong> Texto visible para jugadores.</li>
<li><strong class="text-white">Descripción:</strong> Lore o efectos.</li>
<li><strong class="text-white">Categoría:</strong> Agrupa items (ej. <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">weapons</code>).</li>
<li><strong class="text-white">Icon URL:</strong> Imagen opcional.</li>
<li><strong class="text-white">Stackable y Máx inventario:</strong> Usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">true,10</code>,
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">false,1</code> o deja el límite vacío para infinito.
</li>
</ul>
</div>
</div>
<div class="space-y-4 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Props disponibles</h3>
<div class="grid gap-4 md:grid-cols-2">
<details open class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Herramientas (<code class="font-mono text-xs">tool</code>)</summary>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"tool": { "type": "pickaxe|rod|sword|bow|halberd|net", "tier": 1 }
}</code></pre>
<p class="text-sm">Define el tipo de actividad que habilita tu item. El campo <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">tier</code> controla los requisitos mínimos.</p>
</details>
<details class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Durabilidad (<code class="font-mono text-xs">breakable</code>)</summary>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"breakable": {
"enabled": true,
"maxDurability": 100,
"durabilityPerUse": 1
}
}</code></pre>
<p class="text-sm">Sólo funciona con items <em>no apilables</em>. Ajusta la pérdida de durabilidad por uso para balancear actividades.</p>
</details>
<details class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Cofres (<code class="font-mono text-xs">chest</code>)</summary>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"chest": {
"enabled": true,
"rewards": [ ... ],
"consumeOnOpen": true
}
}</code></pre>
<p class="text-sm">Permite definir loot tables internas, recompensas de monedas, items o roles.</p>
</details>
<details class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Comida y pociones (<code class="font-mono text-xs">food</code>)</summary>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"food": {
"healHp": 50,
"healPercent": 25,
"cooldownSeconds": 60
}
}</code></pre>
<p class="text-sm">Útil para pociones curativas o consumibles con cooldown.</p>
</details>
<details class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Bonos de combate</summary>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"damage": 10,
"defense": 5,
"maxHpBonus": 20
}</code></pre>
<p class="text-sm">Configura stats extra para armas, armaduras o capas.</p>
</details>
<details class="space-y-3 rounded-2xl border border-indigo-500/25 bg-indigo-500/5 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-indigo-200">Etiquetas y metadatos</summary>
<p class="text-sm">Usa el modal <em>Tags</em> para añadir etiquetas separadas por coma, como <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">weapon,rare,crafteable</code>. Sirven para filtrar o aplicar reglas.</p>
</details>
</div>
</div>
</section>
<section id="mobs" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Mobs (Enemigos)</h2>
<p class="text-slate-200">
Los enemigos definen los encuentros durante minijuegos y niveles de área. Se crean con
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!mob-crear</code> y usan stats y tablas de drop en formato JSON.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Campos principales</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><strong class="text-white">Base:</strong> Nombre y categoría opcional.</li>
<li><strong class="text-white">Stats:</strong> Define <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">attack</code>,
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">hp</code>, <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">defense</code>, <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">xpReward</code>.</li>
<li><strong class="text-white">Drops:</strong> Incluye <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">draws</code> y una tabla con premios ponderados.</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Ejemplo de configuración</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"attack": 10,
"hp": 100,
"defense": 5,
"xpReward": 50
}</code></pre>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"draws": 2,
"table": [
{ "type": "coins", "amount": 50, "weight": 10 },
{ "type": "item", "itemKey": "leather", "qty": 1, "weight": 5 }
]
}</code></pre>
</div>
</div>
<div class="rounded-2xl border border-sky-500/30 bg-sky-500/10 p-5 text-sm text-sky-200">
<strong class="block text-base font-semibold text-sky-100">Tip:</strong>
Usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!mobs-lista</code> para auditar stats rápidamente y
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!mob-ver &lt;key&gt;</code> para revisar drops antes de activar un área.
</div>
</section>
<section id="areas" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Áreas de juego (GameArea)</h2>
<p class="text-slate-200">
Las áreas definen dónde se desarrollan las actividades principales (minar, pescar, pelear, plantar). Cada área puede tener múltiples niveles configurables.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Modal Base</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><strong class="text-white">Nombre:</strong> Ej. <em>Caverna de Hierro</em>.</li>
<li><strong class="text-white">Tipo:</strong> <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">MINE</code>,
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">LAGOON</code>, <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">FIGHT</code> o <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">FARM</code>.
</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Modal Config (JSON)</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"cooldownSeconds": 60,
"description": "Una mina profunda",
"icon": "⛏️"
}</code></pre>
<p class="text-sm text-slate-200">El ícono se mostrará en las tarjetas generadas por DisplayComponents.</p>
</div>
</div>
<div class="rounded-2xl border border-amber-500/30 bg-amber-500/10 p-5 text-sm text-amber-100">
<strong class="block text-base font-semibold text-amber-200">Recuerda:</strong>
Si eliminas un área con <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!area-eliminar</code>, revisa niveles asociados para evitar referencias rotas.
</div>
</section>
<section id="levels" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Niveles de área (GameAreaLevel)</h2>
<p class="text-slate-200">
Cada nivel controla requisitos, mobs, recompensas y vigencia. Gestiona niveles con
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!area-nivel &lt;areaKey&gt; &lt;level&gt;</code>.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Requisitos</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"tool": {
"required": true,
"toolType": "pickaxe",
"minTier": 2,
"allowedKeys": ["iron_pickaxe", "diamond_pickaxe"]
}
}</code></pre>
<p class="text-sm text-slate-200">Sirve para validar herramientas necesarias. Combínalo con los tiers definidos en los items.</p>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Recompensas</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"draws": 3,
"table": [
{ "type": "coins", "amount": 100, "weight": 10 },
{ "type": "item", "itemKey": "iron_ore", "qty": 2, "weight": 5 }
]
}</code></pre>
<p class="text-sm text-slate-200">Define múltiples extracciones de la tabla con pesos personalizados.</p>
</div>
</div>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Mobs</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"mobPool": {
"draws": 2,
"table": [
{ "mobKey": "goblin", "weight": 10 },
{ "mobKey": "troll", "weight": 3 }
]
}
}</code></pre>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Ventana</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"window": {
"from": "2025-01-01T00:00:00Z",
"to": "2025-01-31T23:59:59Z"
}
}</code></pre>
</div>
</div>
</section>
<section id="offers" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Ofertas de tienda (ShopOffer)</h2>
<p class="text-slate-200">
Usa <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!offer-crear</code> para lanzar nuevas ofertas con stock limitado,
precios compuestos y ventanas temporales.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Precio (JSON)</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"coins": 100,
"items": [
{ "itemKey": "iron_ore", "qty": 5 },
{ "itemKey": "wood", "qty": 10 }
]
}</code></pre>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Límites y ventana</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><strong class="text-white">Límite por usuario:</strong> Máximo por jugador.</li>
<li><strong class="text-white">Stock global:</strong> Total disponible.</li>
<li><strong class="text-white">Ventana:</strong> Fechas ISO de inicio y fin.</li>
</ul>
</div>
</div>
</section>
<section id="achievements" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Logros</h2>
<p class="text-slate-200">
Motiva a los jugadores con hitos permanentes. Crea logros con
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!logro-crear</code> y configúralos usando el editor DisplayComponents.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Requisitos comunes</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">collect_items</code>: Recolectar items específicos.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">complete_missions</code>: Completar misiones listadas.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">reach_level</code>: Alcanzar cierto nivel o racha.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">stat_value</code>: Llegar a un valor en estadísticas.</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Recompensas posibles</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Monedas</li>
<li>Items entregados automáticamente</li>
<li>Roles (usa ID de Discord)</li>
<li>Puntos de logro</li>
</ul>
</div>
</div>
<div class="rounded-2xl border border-emerald-500/30 bg-emerald-500/10 p-5 text-sm text-emerald-100">
<strong class="block text-base font-semibold text-emerald-200">Nota:</strong>
Usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!logros-lista</code> para auditar logros y
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!logro-ver &lt;key&gt;</code> para validar estructura antes de publicarlos.
</div>
</section>
<section id="missions" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Misiones</h2>
<p class="text-slate-200">
Las misiones permiten objetivos diarios, semanales o repetibles. Adminístralas con
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!mision-crear</code> y
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">!misiones-lista</code>.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Tipos de misión</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><strong class="text-white">daily:</strong> Reinicia cada día.</li>
<li><strong class="text-white">weekly:</strong> Reinicia cada semana.</li>
<li><strong class="text-white">one_time:</strong> Se completa una vez.</li>
<li><strong class="text-white">repeatable:</strong> Puede repetirse sin límite.</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Requisitos combinables</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Consumir items o recursos.</li>
<li>Completar minijuegos específicos.</li>
<li>Derrotar mobs concretos.</li>
<li>Lograr cantidades de monedas.</li>
</ul>
</div>
</div>
<div class="rounded-2xl border border-sky-500/30 bg-sky-500/10 p-5 text-sm text-sky-100">
<strong class="block text-base font-semibold text-sky-200">Tip:</strong>
Aprovecha la ventana de disponibilidad para crear eventos temáticos limitados.
</div>
</section>
<section id="chests" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Cofres y recompensas</h2>
<p class="text-slate-200">
Configura cofres usando props <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">chest</code> en los items y define tablas de recompensas con pesos.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Recompensas soportadas</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Monedas (<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">coins</code>)</li>
<li>Items (usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">itemKey</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">qty</code>)</li>
<li>Roles de Discord (<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">roleId</code>)</li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Consejos</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">consumeOnOpen</code> para cofres desechables.</li>
<li>Combina cofres con logros y eventos para mejores recompensas.</li>
<li>Define varias entradas con pesos distintos para crear rarezas.</li>
</ul>
</div>
</div>
</section>
<section id="crafting" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Crafteos</h2>
<p class="text-slate-200">
Gestiona recetas desde la base de datos o crea comandos personalizados. El servicio de economía incluye
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">craftByProductKey</code> para validar materiales y entregar productos.
</p>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Define recetas en Prisma con entradas y productos.</li>
<li>Usa misiones o eventos para desbloquear recetas temporales combinando props y tags.</li>
<li>Considera usar <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">craftingOnly: true</code> en items que no se consiguen por drops.</li>
</ul>
</section>
<section id="mutations" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Mutaciones</h2>
<p class="text-slate-200">
Las mutaciones permiten modificar items existentes con efectos adicionales (ej. reforjar armas). Usa
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">findMutationByKey</code> y
<code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">applyMutationToInventory</code> desde el servicio de economía.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Políticas</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"mutationPolicy": {
"allowedKeys": ["fire_upgrade", "ice_upgrade"],
"deniedKeys": ["cursed_upgrade"]
}
}</code></pre>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Sugerencias</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Crea mutaciones exclusivas por eventos.</li>
<li>Combínalas con logros o misiones épicas.</li>
<li>Controla conflictos usando <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">deniedKeys</code>.</li>
</ul>
</div>
</div>
</section>
<section id="potions" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Pociones y consumibles</h2>
<p class="text-slate-200">
Usa props <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">food</code> para crear pociones curativas, boosters temporales o consumibles con cooldown.
</p>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Ejemplo de poción</h3>
<pre class="overflow-x-auto rounded-xl border border-indigo-500/30 bg-slate-900/70 p-4 text-xs text-indigo-100"><code>{
"food": {
"healHp": 75,
"healPercent": 15,
"cooldownKey": "healing_potion",
"cooldownSeconds": 45
}
}</code></pre>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Buenas prácticas</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>Usa <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">cooldownKey</code> para compartir cooldown.</li>
<li>Balancea <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">healHp</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">healPercent</code> para distintos niveles.</li>
<li>Combina con logros para recompensar uso estratégico.</li>
</ul>
</div>
</div>
</section>
<section id="tools" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Herramientas y durabilidad</h2>
<p class="text-slate-200">
La durabilidad se administra a través de la combinación de props <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">tool</code>
y <code class="rounded bg-indigo-500/15 px-1.5 py-0.5 font-mono text-xs text-indigo-200">breakable</code>. Para que un item pierda durabilidad, debe ser
<strong class="text-white">no apilable</strong> (<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">stackable=false</code>).
</p>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li>La función <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">reduceToolDurability</code> descuenta <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">durabilityPerUse</code> tras cada minijuego.</li>
<li>Cuando la durabilidad llega a 0, el item se elimina del inventario.</li>
<li>Si <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">breakable.enabled</code> es <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">false</code>, la herramienta es indestructible.</li>
<li>Usa tiers para bloquear áreas avanzadas. Ejemplo: Un área puede requerir una herramienta <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">pickaxe</code> con <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">tier &gt;= 2</code>.</li>
</ul>
<div class="rounded-2xl border border-amber-500/30 bg-amber-500/10 p-5 text-sm text-amber-100">
<strong class="block text-base font-semibold text-amber-200">Importante:</strong>
Después de cambiar items apilables a no apilables, recrea el item en los inventarios existentes para evitar stacks rotos.
</div>
</section>
<section id="services" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Servicios del sistema</h2>
<div class="grid gap-6 md:grid-cols-2">
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Economy Service</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">findItemByKey</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">addItemByKey</code></li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">consumeItemByKey</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">getInventoryEntry</code></li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">craftByProductKey</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">buyFromOffer</code></li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">findMutationByKey</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">applyMutationToInventory</code></li>
</ul>
</div>
<div class="space-y-3 rounded-2xl border border-white/5 bg-slate-900/60 p-5">
<h3 class="text-lg font-semibold text-white">Minigames Service</h3>
<ul class="list-disc space-y-1 pl-5 text-sm text-slate-200">
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">runMinigame</code> para ejecutar cualquier actividad.</li>
<li><code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">runMining</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">runFishing</code> como atajos.</li>
<li>Valida cooldowns, requisitos de herramientas y entrega recompensas.</li>
<li>Reduce durabilidad automáticamente cuando corresponde.</li>
</ul>
</div>
</div>
</section>
<section id="faq" class="space-y-6 rounded-3xl border border-white/5 bg-slate-900/80 p-8 shadow-2xl shadow-indigo-500/10 backdrop-blur">
<h2 class="text-3xl font-semibold text-white">Preguntas frecuentes</h2>
<div class="space-y-4">
<details class="rounded-2xl border border-white/5 bg-slate-900/60 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-white">¿Qué pasa si olvido definir <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">stackable</code>?</summary>
<p class="mt-3 text-sm">
Por defecto los items son apilables. Si tu herramienta pierde durabilidad, asegúrate de marcarla como <em>no apilable</em> en el modal Base.
</p>
</details>
<details class="rounded-2xl border border-white/5 bg-slate-900/60 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-white">¿Cómo pruebo mis configuraciones?</summary>
<p class="mt-3 text-sm">
Usa comandos de prueba en un servidor privado con el bot y confirma con
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!player</code>,
<code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!stats</code> y <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">!inventario</code>.
</p>
</details>
<details class="rounded-2xl border border-white/5 bg-slate-900/60 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-white">¿Puedo clonar contenido entre servidores?</summary>
<p class="mt-3 text-sm">
Sí. Los items globales están disponibles en todos los servidores; los locales se limitan a su guild. Usa las herramientas de exportación de Prisma si necesitas migraciones masivas.
</p>
</details>
<details class="rounded-2xl border border-white/5 bg-slate-900/60 p-4 text-slate-200">
<summary class="cursor-pointer text-base font-semibold text-white">¿Cómo despliego esta documentación?</summary>
<p class="mt-3 text-sm">
Consulta las instrucciones en <code class="rounded bg-indigo-500/15 px-1 py-0.5 font-mono text-xs text-indigo-200">server/README.md</code> para publicar en Heroku como app independiente.
</p>
</details>
</div>
</section>
</div>
</main>
</div>
<footer class="border-t border-white/5 bg-slate-950/80 py-10 text-center text-sm text-slate-400">
<p>Amayo © 2025 — Documentación no oficial para administradores de comunidad.</p>
<a class="mt-3 inline-flex items-center gap-2 text-indigo-300 transition hover:text-indigo-200" href="#overview">
Volver arriba
<span aria-hidden="true"></span>
</a>
</footer>
</div>
<script src="./assets/js/main.js" type="module"></script>
</body>
</html>