fix: correct HTML structure by moving <script> tag to the end of the body

This commit is contained in:
2025-10-05 23:18:13 -05:00
parent a255076e50
commit eae36f63e2

View File

@@ -637,597 +637,6 @@
</a>
</footer>
</div>
</body>
<script src="./assets/js/main.js" type="module"></script>
<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"
/>
<link rel="stylesheet" href="./assets/css/styles.css" />
</head>
<body>
<header class="hero">
<div class="hero__content">
<h1>Documentación de Contenido Amayo</h1>
<p>
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="hero__cta">
<a class="btn primary" href="#items">Empezar ahora</a>
<button class="btn ghost" id="toggle-nav">Abrir índice</button>
</div>
</div>
<div class="hero__meta">
<span class="badge">Actualizado: 5 Oct 2025</span>
<span class="badge">Compatible con DisplayComponents V2</span>
</div>
</header>
<div class="layout">
<nav class="toc" id="toc">
<div class="toc__title">Índice</div>
<ul>
<li><a href="#overview">Conceptos básicos</a></li>
<li><a href="#items">Items</a></li>
<li><a href="#mobs">Mobs</a></li>
<li><a href="#areas">Áreas de juego</a></li>
<li><a href="#levels">Niveles de área</a></li>
<li><a href="#offers">Ofertas de tienda</a></li>
<li><a href="#achievements">Logros</a></li>
<li><a href="#missions">Misiones</a></li>
<li><a href="#chests">Cofres y recompensas</a></li>
<li><a href="#crafting">Crafteos</a></li>
<li><a href="#mutations">Mutaciones</a></li>
<li><a href="#potions">Pociones y consumibles</a></li>
<li><a href="#tools">Herramientas y durabilidad</a></li>
<li><a href="#services">Servicios del sistema</a></li>
<li><a href="#faq">Preguntas frecuentes</a></li>
</ul>
</nav>
<main class="content">
<section id="overview" class="card">
<h2>Conceptos básicos</h2>
<p>
Toda pieza de contenido en Amayo se identifica mediante una <strong>key</strong>
única. Estas keys se usan en comandos, relaciones y validaciones. Usa un
formato consistente como <code>categoria_nombre</code> (ej:
<code>item_iron_sword</code>).
</p>
<div class="grid two">
<div class="card__sub">
<h3>Permisos necesarios</h3>
<ul>
<li>Permiso de Discord <strong>Administrar Servidor</strong>.</li>
<li>O bien un rol Staff configurado para los comandos del bot.</li>
</ul>
</div>
<div class="card__sub">
<h3>Sistema de pesos</h3>
<p>
Al definir tablas de recompensas o aparición de enemigos, usa un campo
<code>weight</code>. Cuanto mayor sea el peso, mayor la probabilidad de ser
seleccionado.
</p>
<pre><code>{ "itemKey": "iron_ore", "weight": 10 }
{ "itemKey": "gold_ore", "weight": 3 }</code></pre>
</div>
</div>
</section>
<section id="items" class="card">
<h2>Items (EconomyItem)</h2>
<p>
Administra todo el inventario del juego. Usa <code>!item-crear</code> para abrir
el editor interactivo y completa cada pestaña antes de guardar.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Comandos clave</h3>
<ul>
<li><code>!item-crear &lt;key&gt;</code> — Crear un item nuevo.</li>
<li><code>!item-editar &lt;key&gt;</code> — Editar un item existente.</li>
<li><code>!items-lista [página]</code> — Ver listado paginado.</li>
<li><code>!item-ver &lt;key&gt;</code> — Ver detalles completos.</li>
<li><code>!item-eliminar &lt;key&gt;</code> — Eliminar un item.</li>
</ul>
</div>
<div class="card__sub">
<h3>Campos del modal Base</h3>
<ul>
<li><strong>Nombre:</strong> Texto visible para jugadores.</li>
<li><strong>Descripción:</strong> Lore o efectos.</li>
<li><strong>Categoría:</strong> Agrupa items (ej. <code>weapons</code>).</li>
<li><strong>Icon URL:</strong> Imagen opcional.</li>
<li>
<strong>Stackable y Máx inventario:</strong> Usa
<code>true,10</code>, <code>false,1</code> o deja el límite vacío para
infinito.
</li>
</ul>
</div>
</div>
<div class="card__sub">
<h3>Props disponibles</h3>
<div class="grid two">
<details open>
<summary>Herramientas (<code>tool</code>)</summary>
<pre><code>{
"tool": { "type": "pickaxe|rod|sword|bow|halberd|net", "tier": 1 }
}</code></pre>
<p>
Define el tipo de actividad que habilita tu item. El campo
<code>tier</code> controla los requisitos mínimos de áreas y minijuegos.
</p>
</details>
<details>
<summary>Durabilidad (<code>breakable</code>)</summary>
<pre><code>{
"breakable": {
"enabled": true,
"maxDurability": 100,
"durabilityPerUse": 1
}
}</code></pre>
<p>
Sólo funciona con items <em>no apilables</em>. Ajusta la pérdida de
durabilidad por uso para balancear actividades.
</p>
</details>
<details>
<summary>Cofres (<code>chest</code>)</summary>
<pre><code>{
"chest": {
"enabled": true,
"rewards": [ ... ],
"consumeOnOpen": true
}
}</code></pre>
<p>
Permite definir loot tables internas, recompensas de monedas, items o roles.
</p>
</details>
<details>
<summary>Comida y pociones (<code>food</code>)</summary>
<pre><code>{
"food": {
"healHp": 50,
"healPercent": 25,
"cooldownSeconds": 60
}
}</code></pre>
<p>Útil para pociones curativas o consumibles con cooldown.</p>
</details>
<details>
<summary>Bonos de combate</summary>
<pre><code>{
"damage": 10,
"defense": 5,
"maxHpBonus": 20
}</code></pre>
<p>Configura stats extra para armas, armaduras o capas.</p>
</details>
<details>
<summary>Etiquetas y metadatos</summary>
<p>
Usa el modal <em>Tags</em> para añadir etiquetas separadas por coma, como
<code>weapon,rare,crafteable</code>. Sirven para filtrar o aplicar reglas.
</p>
</details>
</div>
</div>
</section>
<section id="mobs" class="card">
<h2>Mobs (Enemigos)</h2>
<p>
Los enemigos definen los encuentros durante minijuegos y niveles de área. Se
crean con <code>!mob-crear</code> y usan stats y tablas de drop en formato JSON.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Campos principales</h3>
<ul>
<li><strong>Base:</strong> Nombre y categoría opcional.</li>
<li>
<strong>Stats:</strong> Define <code>attack</code>, <code>hp</code>,
<code>defense</code>, <code>xpReward</code>.
</li>
<li>
<strong>Drops:</strong> Incluye <code>draws</code> y una tabla con premios
ponderados.
</li>
</ul>
</div>
<div class="card__sub">
<h3>Ejemplo de configuración</h3>
<pre><code>{
"attack": 10,
"hp": 100,
"defense": 5,
"xpReward": 50
}</code></pre>
<pre><code>{
"draws": 2,
"table": [
{ "type": "coins", "amount": 50, "weight": 10 },
{ "type": "item", "itemKey": "leather", "qty": 1, "weight": 5 }
]
}</code></pre>
</div>
</div>
<div class="callout info">
<strong>Tip:</strong> Usa <code>!mobs-lista</code> para auditar stats rápidamente y
<code>!mob-ver &lt;key&gt;</code> para revisar drops antes de activar un área.
</div>
</section>
<section id="areas" class="card">
<h2>Áreas de juego (GameArea)</h2>
<p>
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 two">
<div class="card__sub">
<h3>Modal Base</h3>
<ul>
<li><strong>Nombre:</strong> Ej. <em>Caverna de Hierro</em>.</li>
<li><strong>Tipo:</strong> <code>MINE</code>, <code>LAGOON</code>,
<code>FIGHT</code> o <code>FARM</code>.</li>
</ul>
</div>
<div class="card__sub">
<h3>Modal Config (JSON)</h3>
<pre><code>{
"cooldownSeconds": 60,
"description": "Una mina profunda",
"icon": "⛏️"
}</code></pre>
<p>El ícono se mostrará en las tarjetas generadas por DisplayComponents.</p>
</div>
</div>
<div class="callout warning">
<strong>Recuerda:</strong> Si eliminas un área con <code>!area-eliminar</code>,
revisa niveles asociados para evitar referencias rotas.
</div>
</section>
<section id="levels" class="card">
<h2>Niveles de área (GameAreaLevel)</h2>
<p>
Cada nivel controla requisitos, mobs, recompensas y vigencia. Gestiona niveles con
<code>!area-nivel &lt;areaKey&gt; &lt;level&gt;</code>.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Requisitos</h3>
<pre><code>{
"tool": {
"required": true,
"toolType": "pickaxe",
"minTier": 2,
"allowedKeys": ["iron_pickaxe", "diamond_pickaxe"]
}
}</code></pre>
<p>
Sirve para validar herramientas necesarias. Combínalo con los tiers definidos
en los items.
</p>
</div>
<div class="card__sub">
<h3>Recompensas</h3>
<pre><code>{
"draws": 3,
"table": [
{ "type": "coins", "amount": 100, "weight": 10 },
{ "type": "item", "itemKey": "iron_ore", "qty": 2, "weight": 5 }
]
}</code></pre>
<p>Define múltiples extracciones de la tabla con pesos personalizados.</p>
</div>
</div>
<div class="card__sub">
<h3>Mobs y ventana</h3>
<pre><code>{
"mobPool": {
"draws": 2,
"table": [
{ "mobKey": "goblin", "weight": 10 },
{ "mobKey": "troll", "weight": 3 }
]
}
}</code></pre>
<pre><code>{
"window": {
"from": "2025-01-01T00:00:00Z",
"to": "2025-01-31T23:59:59Z"
}
}</code></pre>
</div>
</section>
<section id="offers" class="card">
<h2>Ofertas de tienda (ShopOffer)</h2>
<p>
Usa <code>!offer-crear</code> para lanzar nuevas ofertas con stock limitado,
precios compuestos y ventanas temporales.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Precio (JSON)</h3>
<pre><code>{
"coins": 100,
"items": [
{ "itemKey": "iron_ore", "qty": 5 },
{ "itemKey": "wood", "qty": 10 }
]
}</code></pre>
</div>
<div class="card__sub">
<h3>Límites y ventana</h3>
<ul>
<li><strong>Límite por usuario:</strong> Máximo por jugador.</li>
<li><strong>Stock global:</strong> Total disponible.</li>
<li><strong>Ventana:</strong> Fechas ISO de inicio y fin.</li>
</ul>
</div>
</div>
</section>
<section id="achievements" class="card">
<h2>Logros</h2>
<p>
Motiva a los jugadores con hitos permanentes. Crea logros con
<code>!logro-crear</code> y configúralos usando el editor DisplayComponents.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Requisitos comunes</h3>
<ul>
<li><code>collect_items</code>: Recolectar items específicos.</li>
<li><code>complete_missions</code>: Completar misiones listadas.</li>
<li><code>reach_level</code>: Alcanzar cierto nivel o racha.</li>
<li><code>stat_value</code>: Llegar a un valor en estadísticas.</li>
</ul>
</div>
<div class="card__sub">
<h3>Recompensas posibles</h3>
<ul>
<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="callout success">
<strong>Nota:</strong> Usa <code>!logros-lista</code> para auditar logros y
<code>!logro-ver &lt;key&gt;</code> para validar estructura antes de publicarlos.
</div>
</section>
<section id="missions" class="card">
<h2>Misiones</h2>
<p>
Las misiones permiten objetivos diarios, semanales o repetibles. Adminístralas con
<code>!mision-crear</code> y <code>!misiones-lista</code>.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Tipos de misión</h3>
<ul>
<li><strong>daily:</strong> Reinicia cada día.</li>
<li><strong>weekly:</strong> Reinicia cada semana.</li>
<li><strong>one_time:</strong> Se completa una vez.</li>
<li><strong>repeatable:</strong> Puede repetirse sin límite.</li>
</ul>
</div>
<div class="card__sub">
<h3>Requisitos combinables</h3>
<ul>
<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="callout info">
<strong>Tip:</strong> Aprovecha la ventana de disponibilidad para crear eventos
temáticos limitados.
</div>
</section>
<section id="chests" class="card">
<h2>Cofres y recompensas</h2>
<p>
Configura cofres usando props <code>chest</code> en los items y define tablas de
recompensas con pesos. Ideal para loot boxes, recompensas diarias o drops raros.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Recompensas soportadas</h3>
<ul>
<li>Monedas (<code>coins</code>)</li>
<li>Items (usa <code>itemKey</code> y <code>qty</code>)</li>
<li>Roles de Discord (<code>roleId</code>)</li>
</ul>
</div>
<div class="card__sub">
<h3>Consejos</h3>
<ul>
<li>Usa <code>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="card">
<h2>Crafteos</h2>
<p>
Gestiona recetas desde la base de datos o crea comandos personalizados. El servicio
de economía incluye <code>craftByProductKey</code> para validar materiales y
entregar productos.
</p>
<ul>
<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>craftingOnly: true</code> en items que no se consiguen por
drops.
</li>
</ul>
</section>
<section id="mutations" class="card">
<h2>Mutaciones</h2>
<p>
Las mutaciones permiten modificar items existentes con efectos adicionales (ej.
reforjar armas). Usa <code>findMutationByKey</code> y
<code>applyMutationToInventory</code> desde el servicio de economía.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Políticas</h3>
<pre><code>{
"mutationPolicy": {
"allowedKeys": ["fire_upgrade", "ice_upgrade"],
"deniedKeys": ["cursed_upgrade"]
}
}</code></pre>
</div>
<div class="card__sub">
<h3>Sugerencias</h3>
<ul>
<li>Crea mutaciones exclusivas por eventos.</li>
<li>Combínalas con logros o misiones épicas.</li>
<li>Controla conflictos usando <code>deniedKeys</code>.</li>
</ul>
</div>
</div>
</section>
<section id="potions" class="card">
<h2>Pociones y consumibles</h2>
<p>
Usa props <code>food</code> para crear pociones curativas, boosters temporales o
consumibles con cooldown. Complementa con misiones diarias o drops específicos.
</p>
<div class="grid two">
<div class="card__sub">
<h3>Ejemplo de poción</h3>
<pre><code>{
"food": {
"healHp": 75,
"healPercent": 15,
"cooldownKey": "healing_potion",
"cooldownSeconds": 45
}
}</code></pre>
</div>
<div class="card__sub">
<h3>Buenas prácticas</h3>
<ul>
<li>Usa <code>cooldownKey</code> para compartir cooldown entre pociones similares.</li>
<li>Balancea <code>healHp</code> y <code>healPercent</code> para distintos niveles de jugador.</li>
<li>Combina con logros para recompensar uso estratégico.</li>
</ul>
</div>
</div>
</section>
<section id="tools" class="card">
<h2>Herramientas y durabilidad</h2>
<p>
La durabilidad se administra a través de la combinación de props <code>tool</code>
y <code>breakable</code>. Para que un item pierda durabilidad, debe ser
<strong>no apilable</strong> (<code>stackable=false</code> en el modal Base).
</p>
<ul>
<li>La función <code>reduceToolDurability</code> descuenta
<code>durabilityPerUse</code> tras cada minijuego.</li>
<li>Cuando la durabilidad llega a 0, el item se elimina del inventario.</li>
<li>Si <code>breakable.enabled</code> es <code>false</code>, la herramienta es indestructible.</li>
<li>
Usa tiers para bloquear áreas avanzadas. Ejemplo: Un área puede requerir una
herramienta <code>pickaxe</code> con <code>tier &gt;= 2</code>.
</li>
</ul>
<div class="callout warning">
<strong>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="card">
<h2>Servicios del sistema</h2>
<div class="grid two">
<div class="card__sub">
<h3>Economy Service</h3>
<ul>
<li><code>findItemByKey</code> y <code>addItemByKey</code></li>
<li><code>consumeItemByKey</code> y <code>getInventoryEntry</code></li>
<li><code>craftByProductKey</code> y <code>buyFromOffer</code></li>
<li><code>findMutationByKey</code> y <code>applyMutationToInventory</code></li>
</ul>
</div>
<div class="card__sub">
<h3>Minigames Service</h3>
<ul>
<li><code>runMinigame</code> para ejecutar cualquier actividad.</li>
<li><code>runMining</code> y <code>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="card">
<h2>Preguntas frecuentes</h2>
<details>
<summary>¿Qué pasa si olvido definir <code>stackable</code>?</summary>
<p>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>
<summary>¿Cómo pruebo mis configuraciones?</summary>
<p>Usa comandos de prueba en un servidor privado con el bot y confirma con <code>!player</code>, <code>!stats</code> y <code>!inventario</code>.</p>
</details>
<details>
<summary>¿Puedo clonar contenido entre servidores?</summary>
<p>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>
<summary>¿Cómo despliego esta documentación?</summary>
<p>Consulta las instrucciones en <code>server/README.md</code> para publicar en Heroku como app independiente.</p>
</details>
</section>
</main>
</div>
<footer class="footer">
<p>Amayo © 2025 — Documentación no oficial para administradores de comunidad.</p>
<a href="#overview">Volver arriba</a>
</footer>
<script src="./assets/js/main.js" type="module"></script>
</body>