From 0f061683996c2f17e92d91285694d78930337202 Mon Sep 17 00:00:00 2001 From: shni Date: Mon, 6 Oct 2025 11:30:43 -0500 Subject: [PATCH] feat: update Procfile for optimized production start and remove New Relic import from main.ts --- Mas Ejemplos.md | 950 ++++++++++++++++++++++++++++++++++++++++++++++++ Procfile | 2 +- src/main.ts | 1 - 3 files changed, 951 insertions(+), 2 deletions(-) create mode 100644 Mas Ejemplos.md diff --git a/Mas Ejemplos.md b/Mas Ejemplos.md new file mode 100644 index 0000000..42581ec --- /dev/null +++ b/Mas Ejemplos.md @@ -0,0 +1,950 @@ +# Guía rápida para el staff: crear y ajustar contenido desde Discord + +Este documento reúne## Mutaciones y encantamientos + +Las mutaciones permiten mejorar ítems agregándoles bonificaciones especiales. Son consumibles permanentes que se aplican a un ítem específico. + +### Crear mutaciones (requiere equipo dev) + +Las mutaciones se crean directamente en la base de datos. Envía al equipo dev: + +- **Key**: identificador único (ej. `ruby_core`, `sharpness_enchant`) +- **Nombre**: nombre visible +- **Efectos** (JSON): + ```json + { + "damageBonus": 15, + "defenseBonus": 0, + "maxHpBonus": 0 + } + ``` + +### Configurar políticas de mutación en ítems + +Decide qué mutaciones puede recibir cada ítem editando sus **Props**: + +1. Ejecuta `!item-editar` y selecciona el ítem (ej. `iron_sword`). +2. Abre **Props (JSON)** y agrega o modifica: + +```json +"mutationPolicy": { + "allowedKeys": ["ruby_core", "emerald_core", "sharpness_enchant"], + "deniedKeys": ["curse_weakness"] +} +``` + +- `allowedKeys`: solo estas mutaciones se pueden aplicar (si está vacío o ausente, acepta todas excepto las denegadas). +- `deniedKeys`: estas mutaciones están prohibidas explícitamente. + +### Ejemplos de mutaciones por tipo de ítem + +#### Armas (espadas, arcos, alabardas) +```json +"mutationPolicy": { + "allowedKeys": [ + "sharpness_enchant", + "fire_aspect", + "vampire_core", + "ruby_core" + ], + "deniedKeys": ["defense_boost", "hp_regen"] +} +``` + +#### Armaduras (petos, cascos, botas) +```json +"mutationPolicy": { + "allowedKeys": [ + "defense_boost", + "hp_regen", + "emerald_core", + "thorns_enchant" + ], + "deniedKeys": ["sharpness_enchant", "fire_aspect"] +} +``` + +#### Herramientas (picos, hachas) +```json +"mutationPolicy": { + "allowedKeys": [ + "efficiency_boost", + "unbreaking_core", + "fortune_enchant" + ], + "deniedKeys": ["combat_related"] +} +``` + +### Aplicar mutaciones como staff (para pruebas) + +1. Asegúrate de tener el ítem en tu inventario (`!inventario`). +2. Ejecuta: + ``` + !encantar iron_sword ruby_core + ``` +3. El bot verificará: + - Que tienes el ítem. + - Que la mutación existe. + - Que la política del ítem lo permite. +4. Si todo es correcto: "✨ Aplicada mutación `ruby_core` a **Espada de Hierro**." + +### Verificar mutaciones aplicadas + +- Usa `!player <@usuario>` o `!stats` para ver bonificaciones de combate. +- Las mutaciones aparecen sumadas en `damage`, `defense` o `maxHp` según corresponda. + +### Catálogo de mutaciones sugeridas + +| Mutación Key | Nombre | Efectos | Tipo de Ítem | +| --- | --- | --- | --- | +| `ruby_core` | Núcleo de Rubí | +15 damage | Armas | +| `emerald_core` | Núcleo de Esmeralda | +10 defense, +20 maxHp | Armaduras | +| `sapphire_core` | Núcleo de Zafiro | +25 maxHp | Capas/Accesorios | +| `sharpness_enchant` | Filo Mejorado | +8 damage | Armas cortantes | +| `fire_aspect` | Aspecto ígneo | +12 damage | Armas de fuego | +| `defense_boost` | Refuerzo Defensivo | +7 defense | Armaduras | +| `hp_regen` | Regeneración | +30 maxHp | Armaduras/Capas | +| `efficiency_boost` | Eficiencia | (lógica custom) | Herramientas | +| `fortune_enchant` | Fortuna | (lógica custom) | Picos | +| `unbreaking_core` | Irrompible | +50% durabilidad | Herramientas | +| `vampire_core` | Vampirismo | +10 damage, lifesteal | Armas | +| `thorns_enchant` | Espinas | refleja daño | Armaduras | + +> 💡 **Tip**: las mutaciones con efectos custom (como `fortune_enchant` que aumenta drops) requieren lógica adicional en el código. Consulta con el equipo dev antes de anunciarlas.ados **para el equipo de staff**. Todo lo que ves aquí se realiza directamente con los comandos del bot (prefijo `!`), sin tocar código ni ejecutar scripts. Los comandos viven en `src/commands/messages/admin` y `src/commands/messages/game`, pero no necesitas abrir esos archivos: la idea es que puedas hacerlo todo desde Discord siguiendo estos pasos. + +--- + +## Antes de empezar + +- Asegúrate de tener el permiso `Manage Guild` o el rol de staff configurado; varios comandos lo revisan con `hasManageGuildOrStaff`. +- Siempre usa claves (`key`) en minúsculas y sin espacios. Son únicas por servidor y no se pueden repetir. +- Todos los editores funcionan con botones + modales. Si cierras la ventana o pasa más de 30 min sin responder, el editor caduca y debes reabrirlo. +- Cuando un modal pida JSON, puedes copiar los ejemplos de esta guía y ajustarlos. Si el JSON no es válido, el bot te avisará y no guardará los cambios. + +--- + +## Items: creación, edición y revisión + +### Crear un ítem nuevo — `!item-crear ` +1. Escribe `!item-crear piedra_mistica` (usa la key que necesites). +2. Pulsa **Base** y completa: + - **Nombre** y **Descripción**: lo que verán los jugadores. + - **Categoría** (opcional) para agrupar en listados (`weapon`, `material`, `consumible`, etc.). + - **Icon URL** si tienes una imagen. + - **Stackable y Máx inventario** en formato `true,10`. Ejemplos: `true,64`, `false,1`, o deja vacío para infinito. +3. Pulsa **Tags** y agrega etiquetas separadas por coma (`rare, evento`); sirven para filtrar en `!items-lista`. +4. Pulsa **Props (JSON)** y pega solo lo que necesites. Ejemplo rápido para una herramienta que también cura al uso: + +```json +{ + "tool": { "type": "pickaxe", "tier": 2 }, + "breakable": { "enabled": true, "maxDurability": 120 }, + "food": { "healHp": 25, "cooldownSeconds": 180 } +} +``` + +5. Cuando todo esté listo, pulsa **Guardar**. El bot confirmará con “✅ Item creado”. + +### Editar, listar y borrar + +- `!item-editar` abre el mismo editor, pero cargando un ítem existente. +- `!item-eliminar ` borra la versión local (solicita confirmación). +- `!items-lista` y `!item-ver ` sirven para revisar lo que ya existe. + +> 💡 Tip: si solo quieres revisar las propiedades de un ítem, usa `!item-ver `; mostrará los `props` formateados en JSON. + +### Preparar ítems especiales + +- **Consumibles**: en Props agrega + + ```json + "food": { + "healHp": 40, + "healPercent": 10, + "cooldownKey": "food:pocion_epica", + "cooldownSeconds": 120 + } + ``` + + Luego prueba con `!comer pocion_epica` (usa la key real) para ver el mensaje de curación y el cooldown. + +- **Cofres**: añade + + ```json + "chest": { + "enabled": true, + "consumeOnOpen": true, + "rewards": [ + { "type": "coins", "amount": 500 }, + { "type": "item", "itemKey": "token_evento", "qty": 3 } + ] + } + ``` + + Después abre el cofre con `!abrir `. + +- **Armas/armaduras**: usa `damage`, `defense` o `maxHpBonus`. Si quieres limitar mutaciones, agrega `mutationPolicy` (ver sección más abajo). + +--- + +## Crafteos y materiales + +El crafteo permite combinar materiales para crear ítems más valiosos. A diferencia de la fundición, el crafteo es instantáneo y no requiere tiempo de espera. + +### Cómo funciona el crafteo + +1. El jugador ejecuta `!craftear `. +2. El bot verifica que tenga todos los ingredientes. +3. Si los tiene, los descuenta del inventario y entrega el producto inmediatamente. +4. Las estadísticas del jugador se actualizan (`itemsCrafted`). + +### Crear nuevas recetas de crafteo + +#### Paso 1: Crear todos los ítems involucrados + +**Ejemplo: Espada de Hierro** + +1. **Ingredientes**: + ``` + !item-crear iron_ingot + ``` + - Nombre: Lingote de Hierro + - Stackable: true,999 + - Props: `{"craftingOnly": true}` + + ``` + !item-crear wood_plank + ``` + - Nombre: Tablón de Madera + - Stackable: true,999 + - Props: `{"craftingOnly": true}` + +2. **Producto final**: + ``` + !item-crear iron_sword + ``` + - Nombre: Espada de Hierro + - Descripción: Espada básica de hierro forjado + - Stackable: false,1 + - Props: + ```json + { + "craftable": {"enabled": true}, + "tool": {"type": "sword", "tier": 2}, + "damage": 15, + "breakable": {"enabled": true, "maxDurability": 200} + } + ``` + +#### Paso 2: Enviar receta al equipo dev + +**Receta: Espada de Hierro** +- **Product**: `iron_sword` +- **Product Quantity**: 1 +- **Ingredientes**: + - `iron_ingot`: 3 + - `wood_plank`: 1 + +El equipo dev ejecutará: +```typescript +await prisma.itemRecipe.create({ + data: { + productItemId: ironSwordItem.id, + productQuantity: 1, + ingredients: { + create: [ + { itemId: ironIngotItem.id, quantity: 3 }, + { itemId: woodPlankItem.id, quantity: 1 } + ] + } + } +}); +``` + +#### Paso 3: Probar la receta + +1. Asegúrate de tener los ingredientes en tu inventario. +2. Ejecuta: + ``` + !craftear iron_sword + ``` +3. El bot responderá: + - ✅ Si tienes todo: "✨ Crafteaste **Espada de Hierro** x1" + - ❌ Si falta algo: "No tienes suficientes ingredientes: necesitas 3 iron_ingot, 1 wood_plank" + +### Categorías de recetas sugeridas + +#### 🛠️ Herramientas + +**Pico de Hierro** +- Ingredientes: 3 iron_ingot + 2 wood_plank +- Output: 1 iron_pickaxe (tier 2, 150 durabilidad) + +**Caña de Pescar Mejorada** +- Ingredientes: 2 wood_plank + 1 string + 1 iron_ingot +- Output: 1 advanced_fishing_rod (tier 2, bonus catch rate) + +**Hacha de Batalla** +- Ingredientes: 4 steel_ingot + 2 leather + 1 ruby +- Output: 1 battle_axe (tier 3, 20 damage) + +#### ⚔️ Armas + +**Daga de Bronce** +- Ingredientes: 2 bronze_ingot + 1 leather +- Output: 1 bronze_dagger (10 damage, tier 1) + +**Espada de Acero** +- Ingredientes: 5 steel_ingot + 2 leather + 1 gold_ingot +- Output: 1 steel_sword (25 damage, tier 3) + +**Arco Largo** +- Ingredientes: 3 wood_plank + 2 string + 1 iron_ingot +- Output: 1 longbow (18 damage, tier 2) + +#### 🛡️ Armaduras + +**Peto de Cuero** +- Ingredientes: 8 leather + 2 string +- Output: 1 leather_chestplate (5 defense, tier 1) + +**Casco de Hierro** +- Ingredientes: 5 iron_ingot + 1 leather +- Output: 1 iron_helmet (8 defense, tier 2) + +**Botas de Acero** +- Ingredientes: 4 steel_ingot + 2 leather +- Output: 1 steel_boots (10 defense, tier 3) + +#### 🍖 Consumibles + +**Poción de Curación Menor** +- Ingredientes: 1 red_herb + 1 water_bottle +- Output: 1 minor_healing_potion (cura 25 HP) + +**Poción de Curación Mayor** +- Ingredientes: 2 red_herb + 1 magic_dust + 1 glass_bottle +- Output: 1 major_healing_potion (cura 75 HP) + +**Pan** +- Ingredientes: 3 wheat + 1 water +- Output: 5 bread (cura 15 HP cada uno) + +#### 🎨 Decorativos y Utilidad + +**Antorcha** +- Ingredientes: 1 wood_plank + 1 coal +- Output: 8 torch + +**Cofre de Madera** +- Ingredientes: 8 wood_plank +- Output: 1 wooden_chest (container) + +**Llave Maestra** +- Ingredientes: 3 gold_ingot + 1 ruby + 1 magic_dust +- Output: 1 master_key (abre cofres especiales) + +### Árbol de progresión de crafteo + +``` +Nivel 1 (Principiante) +├─ Herramientas de Madera (wood_pickaxe, wood_axe) +├─ Armas Básicas (wooden_sword, stone_dagger) +└─ Comida Simple (bread, cooked_fish) + +Nivel 2 (Aprendiz) +├─ Herramientas de Cobre/Bronce (copper_pickaxe, bronze_axe) +├─ Armadura de Cuero (leather_armor set) +├─ Armas de Hierro (iron_sword, iron_bow) +└─ Pociones Menores (minor_healing_potion) + +Nivel 3 (Artesano) +├─ Herramientas de Hierro (iron_pickaxe tier 2) +├─ Armadura de Hierro (iron_armor set) +├─ Armas de Acero (steel_sword, steel_halberd) +└─ Pociones Mayores (major_healing_potion) + +Nivel 4 (Maestro) +├─ Herramientas Encantadas (enchanted_pickaxe tier 3) +├─ Armadura de Acero (steel_armor set) +├─ Armas Legendarias (legendary_sword, dragon_bow) +└─ Pociones Épicas (epic_elixir, immortality_potion) + +Nivel 5 (Legendario) +├─ Herramientas Míticas (mythril_pickaxe tier 4) +├─ Armadura Divina (divine_armor set) +├─ Armas Divinas (godslayer_sword, infinity_bow) +└─ Elixires Divinos (phoenix_tears, gods_blessing) +``` + +### Materiales base recomendados + +| Material | Key | Obtención | Uso Principal | +| --- | --- | --- | --- | +| Madera | `wood_plank` | Talar árboles | Herramientas tier 1 | +| Cuero | `leather` | Mobs, caza | Armaduras tier 1 | +| Cobre | `copper_ingot` | Fundir copper_ore | Herramientas tier 1-2 | +| Estaño | `tin_ingot` | Fundir tin_ore | Aleaciones (bronce) | +| Bronce | `bronze_ingot` | Fundir copper+tin | Herramientas tier 2 | +| Hierro | `iron_ingot` | Fundir iron_ore | Armas/armor tier 2 | +| Carbón | `coal` | Minar | Fundición universal | +| Acero | `steel_ingot` | Fundir hierro+carbón | Armas/armor tier 3 | +| Oro | `gold_ingot` | Fundir gold_ore | Joyería, ítems raros | +| Rubí | `ruby` | Mobs raros, cofres | Encantamientos | +| Esmeralda | `emerald` | Mobs raros, cofres | Encantamientos | +| Zafiro | `sapphire` | Mobs raros, cofres | Encantamientos | +| Polvo Mágico | `magic_dust` | Bosses, eventos | Crafteo avanzado | +| Cristal de Lava | `lava_crystal` | Área volcánica | Crafteo legendario | +| Mythril | `mythril_ingot` | Fundir mythril_ore | Armas/armor tier 4 | + +### Cadenas de crafteo complejas + +**Ejemplo: Espada Legendaria** + +1. **Recolectar materiales base**: + - Minar 20 iron_ore + - Minar 15 coal + - Derrotar boss para obtener 3 magic_dust + +2. **Fundición (fase 1)**: + - Fundir iron_ore → iron_ingot (15 unidades) + - Tiempo total: ~40 minutos + +3. **Fundición (fase 2)**: + - Fundir iron_ingot + coal + carbon → steel_ingot (8 unidades) + - Tiempo total: ~60 minutos + +4. **Crafteo (fase 1)**: + - Craftear steel_ingot + leather → steel_sword_base + +5. **Encantamiento**: + - Aplicar ruby_core al steel_sword_base (+15 damage) + +6. **Crafteo final**: + - Craftear steel_sword_base(enchanted) + magic_dust + dragon_scale → legendary_dragon_slayer + - Resultado: Arma tier 4 con 45 damage, 300 durabilidad, efectos especiales + +### Marcado de ítems crafteable-only + +Para materiales que **solo** sirven para craftear y no tienen uso directo: + +```json +{ + "craftingOnly": true, + "description": "Material usado únicamente para crafteo" +} +``` + +Esto ayuda a los jugadores a entender que deben combinarlo con otros ítems para obtener valor. + +--- + +## Mutaciones y encantamientos + +1. Asegúrate de que existe la mutación (pide la `mutationKey` al equipo dev si aún no está en la base). +2. Desde `!item-editar`, abre **Props (JSON)** y agrega: + +```json +"mutationPolicy": { + "allowedKeys": ["ruby_core", "emerald_core"], + "deniedKeys": ["curse_core"] +} +``` + +3. Entrega al jugador la mutación correspondiente y pídele que use `!encantar `. +4. Para probarlo tú mismo, equipa el ítem y ejecuta `!encantar`. Si la política lo permite, el bot responde con “✨ Aplicada mutación…”. + +--- + +## Fundición y refinado + +La fundición es un proceso que transforma materiales crudos en recursos refinados con un tiempo de espera. Es útil para economías más realistas donde los jugadores deben planificar. + +### Cómo funciona la fundición + +1. El jugador ejecuta `!fundir` especificando inputs y output. +2. El bot verifica que tenga los materiales, los descuenta del inventario y crea un **job** con tiempo de espera. +3. Cuando el tiempo expira, el jugador usa `!fundir-reclamar` para obtener el resultado. + +### Crear nuevas recetas de fundición + +#### Paso 1: Crear los ítems necesarios + +1. **Materiales de entrada** (ej. minerales crudos): + ``` + !item-crear copper_ore + ``` + - Nombre: Mineral de Cobre + - Descripción: Mineral sin refinar extraído de las minas + - Stackable: true,999 + - Props: `{"craftingOnly": true}` + + ``` + !item-crear coal + ``` + - Nombre: Carbón + - Descripción: Combustible para fundición + - Stackable: true,999 + +2. **Material de salida** (ej. lingote refinado): + ``` + !item-crear copper_ingot + ``` + - Nombre: Lingote de Cobre + - Descripción: Cobre puro listo para craftear + - Stackable: true,999 + +#### Paso 2: Coordinar con el equipo dev + +Envía la siguiente información al equipo de desarrollo: + +**Receta de fundición: Lingote de Cobre** +- **Inputs**: + - `copper_ore`: 5 unidades + - `coal`: 2 unidades +- **Output**: + - `copper_ingot`: 2 unidades +- **Duración**: 300 segundos (5 minutos) + +El equipo dev ejecutará: +```typescript +// Ejemplo de lo que hará el dev (tú no necesitas hacerlo) +await createSmeltJob(userId, guildId, + [ + { itemKey: 'copper_ore', qty: 5 }, + { itemKey: 'coal', qty: 2 } + ], + 'copper_ingot', + 2, + 300 +); +``` + +#### Paso 3: Probar la receta + +1. Asegúrate de tener los materiales: + ``` + !inventario + ``` +2. Inicia la fundición: + ``` + !fundir copper_ore:5,coal:2 copper_ingot:2 300 + ``` + (El comando exacto puede variar, verifica con `!help fundir`) + +3. Espera el tiempo configurado o usa un comando de admin para acelerar (si existe). + +4. Reclama el resultado: + ``` + !fundir-reclamar + ``` + +### Ejemplos de recetas de fundición por nivel + +#### Nivel Básico (5-10 minutos) +| Entrada | Salida | Tiempo | Uso | +| --- | --- | --- | --- | +| 5 copper_ore + 2 coal | 2 copper_ingot | 5 min | Crafteo básico | +| 5 iron_ore + 3 coal | 2 iron_ingot | 8 min | Armas tier 1 | +| 3 sand + 1 coal | 2 glass | 3 min | Construcción | + +#### Nivel Intermedio (15-30 minutos) +| Entrada | Salida | Tiempo | Uso | +| --- | --- | --- | --- | +| 8 iron_ore + 5 coal | 3 steel_ingot | 20 min | Armas tier 2 | +| 10 gold_ore + 5 coal | 3 gold_ingot | 25 min | Joyería | +| 5 copper_ingot + 5 tin_ingot | 8 bronze_ingot | 15 min | Aleaciones | + +#### Nivel Avanzado (1-2 horas) +| Entrada | Salida | Tiempo | Uso | +| --- | --- | --- | --- | +| 15 iron_ingot + 10 coal + 5 carbon | 5 steel_alloy | 60 min | Armas legendarias | +| 20 mythril_ore + 10 coal + 3 magic_dust | 3 mythril_ingot | 90 min | Equipo épico | +| 10 diamond_ore + 15 coal + 5 lava_crystal | 2 diamond_refined | 120 min | Crafteo endgame | + +### Cadenas de producción + +Puedes crear economías complejas encadenando fundiciones: + +**Ejemplo: Espada de Acero** +1. Fundir `copper_ore` → `copper_ingot` (5 min) +2. Fundir `tin_ore` → `tin_ingot` (5 min) +3. Fundir `copper_ingot + tin_ingot` → `bronze_ingot` (15 min) +4. Fundir `iron_ore` → `iron_ingot` (8 min) +5. Fundir `iron_ingot + coal + carbon` → `steel_ingot` (20 min) +6. Craftear `steel_ingot + bronze_ingot + wood` → `steel_sword` + +### Fundición para eventos + +**Ejemplo: Evento de Halloween** +``` +!item-crear pumpkin_ore +``` +- Nombre: Mineral de Calabaza Maldita +- Props: `{"eventCurrency": {"enabled": true, "eventKey": "halloween2025"}}` + +**Receta especial (temporal):** +- Inputs: 10 pumpkin_ore + 5 coal + 1 cursed_essence +- Output: 1 halloween_legendary_sword +- Duración: 60 min +- Ventana: solo durante octubre 2025 + +### Consejos de balance + +- **Fundiciones rápidas (1-5 min)**: para materiales básicos que se usan constantemente. +- **Fundiciones medias (10-30 min)**: para recursos intermedios, fomenta planificación. +- **Fundiciones largas (1-3 horas)**: para ítems raros/épicos, crea anticipación. +- **Usa carbón/coal**: como costo fijo universal para evitar fundiciones sin límite. +- **Output menor que input**: ej. 5 mineral → 2 lingotes, crea escasez y valor. + +--- + +## Logros (Achievements) + +### Crear un logro — `!logro-crear ` +1. Ejecuta el comando y completa el editor: + - **Base**: Nombre, descripción, categoría, icono y puntos. + - **Requisitos**: JSON con `type` y `value`. Ejemplo: + + ```json + { "type": "mine_count", "value": 100 } + ``` + + - **Recompensas**: JSON con monedas, ítems o títulos. Ejemplo: + + ```json + { "coins": 1000, "items": [{ "key": "pickaxe_mythic", "quantity": 1 }] } + ``` + +2. Pulsa **Guardar**. El bot mostrará “✅ Logro creado”. +3. Usa `!logro-ver ` y `!logros-lista` para revisar lo que quedó configurado. + +Cuando anuncies el logro, recuerda qué acción lo desbloquea (`mine_count`, `fish_count`, `craft_count`, etc.). + +--- + +## Misiones (Quests) + +### Crear una misión — `!mision-crear ` +1. Completa la pestaña **Base** (nombre, descripción, categoría y tipo: `daily`, `weekly`, `permanent` o `event`). +2. En **Requisitos**, indica el contador que debe alcanzar: + + ```json + { "type": "craft_count", "count": 3 } + ``` + + También puedes usar `variety` con varias condiciones. + +3. En **Recompensas**, define el premio (mismo formato que los logros). +4. Guarda y revisa con `!mision-ver ` o `!misiones-lista`. +5. Para pruebas, `!misiones` muestra al jugador su progreso y si puede reclamar con `!mision-reclamar `. + +--- + +## Tienda y economía + +- **Crear oferta** — `!offer-crear` + 1. En **Base**, especifica `itemKey` y si la oferta está habilitada. + 2. En **Precio (JSON)**, indica monedas y/o ítems de pago: + + ```json + { "coins": 1500, "items": [{ "itemKey": "token_evento", "qty": 2 }] } + ``` + + 3. En **Ventana**, puedes fijar fechas `YYYY-MM-DD` o dejarlas vacías. + 4. En **Límites**, define cupo por usuario o stock global. + 5. Guarda y revisa la tienda con `!tienda`. + +- **Monedas y recursos**: usa `!monedas <@usuario>` para revisar balances y `!inventario <@usuario>` para confirmar que recibieron lo esperado. + +--- + +## Resumen rápido de comandos útiles + +| Acción | Comando | Notas | +| --- | --- | --- | +| Crear/editar ítems | `!item-crear`, `!item-editar`, `!item-eliminar` | Requiere staff. Props en JSON. | +| Revisar ítems | `!items-lista`, `!item-ver ` | Incluye props y tags. | +| Consumir o probar ítems | `!comer `, `!encantar ` | Útiles para QA. | +| Ofertas de tienda | `!offer-crear`, `!offer-editar` | Define precios, stock y ventanas. | +| Logros | `!logro-crear`, `!logro-ver`, `!logros-lista`, `!logro-eliminar` | Requisitos y recompensas en JSON. | +| Misiones | `!mision-crear`, `!mision-ver`, `!misiones-lista`, `!mision-eliminar` | Tipos: daily/weekly/permanent/event. | +| Progreso de jugadores | `!stats`, `!player <@usuario>`, `!racha` | Ayuda a validar nuevas recompensas. | + +--- + +## Áreas de juego y niveles + +Las áreas son lugares donde los jugadores realizan actividades (minar, pescar, pelear, plantar). Cada área tiene varios niveles, y cada nivel puede tener requisitos, recompensas y mobs específicos. + +### Crear un área — `!area-crear ` + +1. Ejecuta el comando con la key deseada (ej. `!area-crear mina_profunda`). +2. Pulsa **Base** y completa: + - **Nombre**: Lo que verán los jugadores. + - **Tipo**: `MINE`, `LAGOON`, `FIGHT` o `FARM` (en mayúsculas). +3. Pulsa **Config (JSON)** si necesitas configuración técnica adicional (raramente usado, pregunta al equipo dev). +4. Pulsa **Meta (JSON)** para metadatos adicionales (opcional). +5. Guarda. Usa `!areas-lista` para verificar. + +### Editar un área — `!area-editar` + +Abre un selector con todas las áreas del servidor, elige una y usa el mismo editor que en crear. + +### Configurar niveles de área — `!area-nivel ` + +Cada nivel puede tener: +- **Requisitos**: herramienta mínima, nivel de personaje, etc. +- **Recompensas**: qué se obtiene al completar (monedas, ítems, XP). +- **Mobs**: lista de enemigos que aparecen en ese nivel. +- **Ventana**: fechas ISO para eventos temporales. + +#### Ejemplo: crear el nivel 1 de una mina + +```bash +!area-nivel mina_profunda 1 +``` + +1. **Requisitos** (JSON): + +```json +{ + "toolType": "pickaxe", + "minToolTier": 1, + "minLevel": 1 +} +``` + +2. **Recompensas** (JSON): + +```json +{ + "coins": 50, + "items": [ + { "key": "copper_ore", "quantity": 3 } + ], + "xp": 10 +} +``` + +3. **Mobs** (JSON) — Aquí defines qué mobs aparecen y su peso: + +```json +{ + "draws": 1, + "table": [ + { "mobKey": "slime_verde", "weight": 10 }, + { "mobKey": "murcielago", "weight": 5 } + ] +} +``` + +> 💡 **Importante**: los mobs deben existir previamente. Créalos con `!mob-crear` antes de referenciarlos aquí. + +4. **Ventana** (opcional): si quieres que este nivel solo esté disponible durante un evento, agrega fechas ISO: + - Desde: `2025-12-01T00:00:00Z` + - Hasta: `2025-12-31T23:59:59Z` + +5. Guarda. Verifica con `!mina mina_profunda` (o el comando correspondiente al tipo de área). + +### Borrar áreas y niveles + +- `!area-eliminar ` borra el área completa (solicita confirmación). +- Para borrar un nivel específico, coordina con el equipo dev o edita manualmente la base de datos (por seguridad no hay comando público). + +--- + +## Mobs (enemigos) + +Los mobs son enemigos que aparecen en áreas de tipo `FIGHT` o en niveles de minas/lagunas. También se pueden usar en eventos especiales. + +### Crear un mob — `!mob-crear ` + +1. Ejecuta el comando (ej. `!mob-crear slime_verde`). +2. Pulsa **Base** y completa: + - **Nombre**: Nombre visible del mob. + - **Categoría** (opcional): para agrupar (ej. `slime`, `undead`, `boss`). +3. Pulsa **Stats (JSON)** y define las estadísticas: + +```json +{ + "attack": 8, + "hp": 50, + "defense": 2, + "xpReward": 15 +} +``` + +4. Pulsa **Drops (JSON)** para configurar la tabla de recompensas: + +```json +{ + "draws": 2, + "table": [ + { "type": "coins", "amount": 25, "weight": 10 }, + { "type": "item", "itemKey": "slime_gel", "qty": 1, "weight": 7 }, + { "type": "item", "itemKey": "healing_potion", "qty": 1, "weight": 3 } + ] +} +``` + + - `draws`: cuántos premios saca al morir. + - `table`: lista de posibles recompensas con su peso (más peso = más probable). + +5. Guarda y revisa con `!mobs-lista` o `!mob-ver `. + +### Editar y borrar mobs + +- `!mob-editar` abre el mismo editor, pero cargando un mob existente. +- `!mob-eliminar ` borra el mob (solicita confirmación). + +### Probar mobs en combate + +- Usa `!pelear ` para simular un combate. El bot mostrará el resultado, daño infligido, drops recibidos y XP ganado. +- Ajusta `attack`, `hp` y `defense` según el balance deseado. + +--- + +## Recetas de crafteo y fundición + +Aunque el crafteo funciona con `!craftear ` y la fundición con `!fundir`, las **recetas** (`itemRecipe`) y los **trabajos de fundición** se administran desde backoffice o scripts porque involucran múltiples relaciones. + +### ¿Cómo agrego una nueva receta de crafteo? + +1. Asegúrate de que el producto final y todos los ingredientes existen (créalos con `!item-crear`). +2. Envía al equipo dev la siguiente información: + - **Product Key**: ej. `iron_sword` + - **Product Quantity**: cuánto entrega (normalmente 1). + - **Ingredientes**: lista con `itemKey` y cantidad. Ejemplo: + ``` + - iron_ingot: 3 + - wood_plank: 1 + ``` +3. El equipo dev ejecutará el seed o script correspondiente. +4. Verifica con `!craftear iron_sword` que funcione correctamente. + +### ¿Cómo agrego una nueva receta de fundición? + +1. Crea los ítems de entrada (ej. `iron_ore`, `coal`) y el de salida (ej. `iron_ingot`). +2. Coordina con el equipo dev para que configuren el `smeltJob` indicando: + - **Inputs**: lista de `itemKey` + cantidad. + - **Output**: `itemKey` + cantidad. + - **Duración**: segundos que tarda el proceso. +3. Prueba con `!fundir` y verifica el tiempo restante con `!fundir-reclamar`. + +> 📌 **Nota**: si necesitas muchas recetas, considera crear un archivo JSON con todas y enviarlo al equipo dev para carga masiva. + +--- + +## Checklist para lanzar contenido nuevo + +- [ ] El ítem tiene nombre, descripción, tags y props correctos en `!item-ver`. +- [ ] Hay una forma de conseguirlo (oferta, misión, logro, drop o craft). +- [ ] Si es un mob, tiene stats y drops configurados; pruébalo con `!pelear`. +- [ ] Si es un área con niveles, cada nivel tiene requisitos, recompensas y mobs válidos. +- [ ] Probaste el flujo como jugador (`!craftear`, `!fundir`, `!comprar`, `!mina`, `!pelear`, etc.). +- [ ] Los requisitos y recompensas de logros/misiones muestran JSON válido. +- [ ] Comunicaste al equipo cuándo entra y cómo se consigue. + +Si algo falla, copia el mensaje de error completo y súbelo al canal de soporte interno; así el equipo de desarrollo puede ayudarte sin reproducir todo desde cero. + +--- + +## Comandos de consulta rápida + +Estos comandos te ayudan a revisar lo que ya está configurado sin abrir editores: + +| Comando | Descripción | +| --- | --- | +| `!items-lista` | Lista todos los ítems del servidor. | +| `!item-ver ` | Muestra detalles completos de un ítem (props, tags, etc.). | +| `!mobs-lista` | Lista todos los mobs del servidor. | +| `!areas-lista` | Lista todas las áreas del servidor. | +| `!logros-lista` | Lista todos los logros disponibles. | +| `!logro-ver ` | Muestra requisitos y recompensas de un logro. | +| `!misiones-lista` | Lista todas las misiones del servidor. | +| `!mision-ver ` | Muestra detalles de una misión específica. | + +--- + +## Ejemplos completos de flujos comunes + +### Ejemplo 1: Crear una zona de combate con mobs + +1. Crea los mobs: + ``` + !mob-crear goblin_scout + ``` + - Nombre: Goblin Explorador + - Stats: `{"attack": 10, "hp": 60, "defense": 3, "xpReward": 20}` + - Drops: `{"draws": 1, "table": [{"type": "coins", "amount": 30, "weight": 10}, {"type": "item", "itemKey": "goblin_ear", "qty": 1, "weight": 5}]}` + +2. Crea el área: + ``` + !area-crear bosque_oscuro + ``` + - Nombre: Bosque Oscuro + - Tipo: FIGHT + +3. Crea el nivel 1: + ``` + !area-nivel bosque_oscuro 1 + ``` + - Requisitos: `{"minLevel": 3}` + - Recompensas: `{"coins": 100, "xp": 30}` + - Mobs: `{"draws": 1, "table": [{"mobKey": "goblin_scout", "weight": 10}]}` + +4. Prueba con `!pelear bosque_oscuro` (si el comando acepta áreas) o `!pelear goblin_scout` directamente. + +### Ejemplo 2: Crear una misión diaria de minería + +1. Asegúrate de que existe el área de mina (`!areas-lista`). +2. Crea la misión: + ``` + !mision-crear daily_mine_10 + ``` + - Nombre: Minero Diario + - Descripción: Mina 10 veces hoy + - Tipo: daily + - Categoría: mining + - Requisitos: `{"type": "mine_count", "count": 10}` + - Recompensas: `{"coins": 500, "items": [{"key": "mining_token", "quantity": 1}]}` + +3. Los jugadores verán la misión en `!misiones` y podrán reclamarla con `!mision-reclamar daily_mine_10` cuando completen los 10 minados. + +### Ejemplo 3: Crear un cofre de evento + +1. Crea el ítem cofre: + ``` + !item-crear event_chest_winter + ``` + - Nombre: Cofre de Invierno + - Descripción: Un cofre especial lleno de sorpresas invernales + - Stackable: true,10 + - Props: + ```json + { + "chest": { + "enabled": true, + "consumeOnOpen": true, + "rewards": [ + { "type": "coins", "amount": 1000 }, + { "type": "item", "itemKey": "snowflake_rare", "qty": 5 }, + { "type": "item", "itemKey": "ice_sword", "qty": 1 } + ] + } + } + ``` + +2. Crea una oferta para venderlo: + ``` + !offer-crear + ``` + - Item Key: event_chest_winter + - Habilitada: true + - Precio: `{"coins": 2500}` + - Ventana: desde `2025-12-01` hasta `2025-12-31` + - Límite por usuario: 3 + +3. Anuncia el cofre en el servidor y los jugadores podrán comprarlo con `!comprar` y abrirlo con `!abrir event_chest_winter`. diff --git a/Procfile b/Procfile index 67f7c20..881468f 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: npm run start:optimize-relic +web: npm run start:prod-optimized diff --git a/src/main.ts b/src/main.ts index 3507e01..e118b59 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,6 @@ import { ensureRemindersSchema } from "./core/api/remindersSchema"; import logger from "./core/lib/logger"; import { applyModalSubmitInteractionPatch } from "./core/patches/discordModalPatch"; import { server } from "./server/server"; -import 'newrelic'; // Activar monitor de memoria si se define la variable const __memInt = parseInt(process.env.MEMORY_LOG_INTERVAL_SECONDS || '0', 10);