feat: agregar registro de muertes y penalizaciones dinámicas en minijuegos; implementar comandos para gestionar efectos de estado

This commit is contained in:
2025-10-09 01:26:29 -05:00
parent 519e905384
commit ae12b50aa1
7 changed files with 251 additions and 16 deletions

View File

@@ -0,0 +1,104 @@
import type { CommandMessage } from "../../../core/types/commands";
import type Amayo from "../../../core/client";
import {
getActiveStatusEffects,
removeStatusEffect,
clearAllStatusEffects,
} from "../../../game/combat/statusEffectsService";
import { consumeItemByKey } from "../../../game/economy/service";
// Item key que permite purgar efectos. Configurable más adelante.
const PURGE_ITEM_KEY = "potion.purga"; // placeholder
export const command: CommandMessage = {
name: "efectos",
aliases: ["effects"],
type: "message",
cooldown: 5,
category: "Economía",
description:
"Lista tus efectos de estado activos y permite purgarlos con un ítem de purga.",
usage: "efectos [purgar|remover <TIPO>|todo]",
run: async (message, args, _client: Amayo) => {
const userId = message.author.id;
const guildId = message.guild!.id;
const sub = (args[0] || "").toLowerCase();
if (
sub === "purgar" ||
sub === "purga" ||
sub === "remover" ||
sub === "remove" ||
sub === "todo"
) {
// Requiere el item de purga
try {
const consume = await consumeItemByKey(
userId,
guildId,
PURGE_ITEM_KEY,
1
);
if (!consume.consumed) {
await message.reply(
`Necesitas 1 **${PURGE_ITEM_KEY}** en tu inventario para purgar efectos.`
);
return;
}
} catch {
await message.reply(
`No se pudo consumir el ítem de purga (${PURGE_ITEM_KEY}). Asegúrate de que existe.`
);
return;
}
// Modo remover tipo específico: efectos remover <TIPO>
if (sub === "remover" || sub === "remove") {
const typeArg = args[1];
if (!typeArg) {
await message.reply("Debes indicar el tipo: efectos remover FATIGUE");
return;
}
await removeStatusEffect(userId, guildId, typeArg.toUpperCase());
await message.reply(`Efecto **${typeArg.toUpperCase()}** eliminado.`);
return;
}
// Modo todo
if (sub === "todo" || sub === "purgar" || sub === "purga") {
await clearAllStatusEffects(userId, guildId);
await message.reply("Todos los efectos han sido purgados.");
return;
}
}
// Listar efectos
const effects = await getActiveStatusEffects(userId, guildId);
if (!effects.length) {
await message.reply("No tienes efectos activos.");
return;
}
const now = Date.now();
const lines = effects.map((e) => {
let remain = "permanente";
if (e.expiresAt) {
const ms = e.expiresAt.getTime() - now;
if (ms > 0) {
const m = Math.floor(ms / 60000);
const s = Math.floor((ms % 60000) / 1000);
remain = `${m}m ${s}s`;
} else remain = "exp";
}
const pct = e.magnitude ? ` (${Math.round(e.magnitude * 100)}%)` : "";
return `${e.type}${pct} - ${remain}`;
});
await message.reply(
`**Efectos Activos:**\n${lines.join(
"\n"
)}\n\nUsa: efectos purgar | efectos remover <TIPO> | efectos todo (requiere ${PURGE_ITEM_KEY}).`
);
return;
},
};

View File

@@ -33,6 +33,14 @@ export const command: CommandMessage = {
const wallet = await getOrCreateWallet(userId, guildId);
const { eq, weapon, armor, cape } = await getEquipment(userId, guildId);
const stats = await getEffectiveStats(userId, guildId);
const showDefense =
stats.baseDefense != null && stats.baseDefense !== stats.defense
? `${stats.defense} (_${stats.baseDefense}_ base)`
: `${stats.defense}`;
const showDamage =
stats.baseDamage != null && stats.baseDamage !== stats.damage
? `${stats.damage} (_${stats.baseDamage}_ base)`
: `${stats.damage}`;
const playerStats = await getPlayerStatsFormatted(userId, guildId);
const rawStats = await getOrCreatePlayerStats(userId, guildId);
const streak = rawStats.currentWinStreak;
@@ -101,8 +109,8 @@ export const command: CommandMessage = {
`<:healbonus:1425671499792121877> HP: **${stats.hp}/${
stats.maxHp
}** ${heartsBar(stats.hp, stats.maxHp)}\n` +
`<:damage:1425670476449189998> ATK: **${stats.damage}** ${damageBonusDisplay}\n` +
`<:defens:1425670433910427862> DEF: **${stats.defense}**\n` +
`<:damage:1425670476449189998> ATK: **${showDamage}** ${damageBonusDisplay}\n` +
`<:defens:1425670433910427862> DEF: **${showDefense}**\n` +
`🏆 Racha: **${streak}** (mejor: ${rawStats.longestWinStreak})\n` +
`<a:9470coin:1425694135607885906> Monedas: **${wallet.coins.toLocaleString()}**`,
},