diff --git a/src/commands/messages/game/_helpers.ts b/src/commands/messages/game/_helpers.ts index 6b3ab13..955e059 100644 --- a/src/commands/messages/game/_helpers.ts +++ b/src/commands/messages/game/_helpers.ts @@ -30,3 +30,38 @@ export async function findBestToolKey(userId: string, guildId: string, toolType: return best?.key ?? null; } +export interface ParsedGameArgs { + areaKey: string; + levelArg: number | null; + providedTool: string | null; +} + +const AREA_OVERRIDE_PREFIX = 'area:'; + +export function parseGameArgs(args: string[], defaultAreaKey: string): ParsedGameArgs { + const tokens = args.filter((arg): arg is string => typeof arg === 'string' && arg.trim().length > 0); + + let areaKey = defaultAreaKey; + let levelArg: number | null = null; + let providedTool: string | null = null; + + for (const token of tokens) { + if (token.startsWith(AREA_OVERRIDE_PREFIX)) { + const override = token.slice(AREA_OVERRIDE_PREFIX.length).trim(); + if (override) areaKey = override; + continue; + } + + if (levelArg === null && /^\d+$/.test(token)) { + levelArg = parseInt(token, 10); + continue; + } + + if (!providedTool) { + providedTool = token; + } + } + + return { areaKey, levelArg, providedTool }; +} + diff --git a/src/commands/messages/game/mina.ts b/src/commands/messages/game/mina.ts index 81690ff..485b42a 100644 --- a/src/commands/messages/game/mina.ts +++ b/src/commands/messages/game/mina.ts @@ -1,7 +1,7 @@ import type { CommandMessage } from '../../../core/types/commands'; import type Amayo from '../../../core/client'; import { runMinigame } from '../../../game/minigames/service'; -import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers'; +import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers'; import { updateStats } from '../../../game/stats/service'; import { updateQuestProgress } from '../../../game/quests/service'; import { checkAchievements } from '../../../game/achievements/service'; @@ -12,29 +12,29 @@ export const command: CommandMessage = { aliases: ['minar'], cooldown: 5, description: 'Ir a la mina (usa pico si está disponible) y obtener recompensas según el nivel.', - usage: 'mina [nivel] [toolKey] (ej: mina 2 tool.pickaxe.basic)', + usage: 'mina [nivel] [toolKey] [area:clave] (ej: mina 2 tool.pickaxe.basic)', run: async (message, args, _client: Amayo) => { const userId = message.author.id; const guildId = message.guild!.id; - const areaKey = args[0] === 'mine.cavern' ? args[0] : 'mine.cavern'; // Forzar key de área de mina + const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'mine.cavern'); const area = await resolveArea(guildId, areaKey); - if (!area) { await message.reply('⚠️ Área de mina no configurada. Pide a un admin crear `gameArea` con key `mine.cavern`.'); return; } - - const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null; - const providedTool = args.find((a) => a && !/^\d+$/.test(a)); + if (!area) { + await message.reply(`⚠️ Área de mina no configurada. Pide a un admin crear \`gameArea\` con key \`${areaKey}\`.`); + return; + } const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id); const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'pickaxe'); try { - const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined }); + const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined }); // Actualizar stats await updateStats(userId, guildId, { minesCompleted: 1 }); - // Actualizar progreso de misiones - await updateQuestProgress(userId, guildId, 'mine_count', 1); + // Actualizar progreso de misiones + await updateQuestProgress(userId, guildId, 'mine_count', 1); // Verificar logros const newAchievements = await checkAchievements(userId, guildId, 'mine_count'); diff --git a/src/commands/messages/game/pelear.ts b/src/commands/messages/game/pelear.ts index ffb15cf..ce53d7d 100644 --- a/src/commands/messages/game/pelear.ts +++ b/src/commands/messages/game/pelear.ts @@ -1,7 +1,7 @@ import type { CommandMessage } from '../../../core/types/commands'; import type Amayo from '../../../core/client'; import { runMinigame } from '../../../game/minigames/service'; -import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers'; +import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers'; import { updateStats } from '../../../game/stats/service'; import { updateQuestProgress } from '../../../game/quests/service'; import { checkAchievements } from '../../../game/achievements/service'; @@ -12,23 +12,23 @@ export const command: CommandMessage = { aliases: ['fight','arena'], cooldown: 8, description: 'Entra a la arena y pelea (usa espada si está disponible).', - usage: 'pelear [nivel] [toolKey] (ej: pelear 1 weapon.sword.iron)', + usage: 'pelear [nivel] [toolKey] [area:clave] (ej: pelear 1 weapon.sword.iron)', run: async (message, args, _client: Amayo) => { const userId = message.author.id; const guildId = message.guild!.id; - const areaKey = args[0] === 'fight.arena' ? args[0] : 'fight.arena'; // Forzar key de área de arena + const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'fight.arena'); const area = await resolveArea(guildId, areaKey); - if (!area) { await message.reply('⚠️ Área de arena no configurada. Crea `gameArea` con key `fight.arena`.'); return; } - - const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null; - const providedTool = args.find((a) => a && !/^\d+$/.test(a)); + if (!area) { + await message.reply(`⚠️ Área de arena no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`); + return; + } const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id); const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'sword'); try { - const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined }); + const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined }); // Actualizar stats y misiones await updateStats(userId, guildId, { fightsCompleted: 1 }); diff --git a/src/commands/messages/game/pescar.ts b/src/commands/messages/game/pescar.ts index 36045cc..7104e55 100644 --- a/src/commands/messages/game/pescar.ts +++ b/src/commands/messages/game/pescar.ts @@ -1,7 +1,7 @@ import type { CommandMessage } from '../../../core/types/commands'; import type Amayo from '../../../core/client'; import { runMinigame } from '../../../game/minigames/service'; -import { resolveArea, getDefaultLevel, findBestToolKey } from './_helpers'; +import { resolveArea, getDefaultLevel, findBestToolKey, parseGameArgs } from './_helpers'; import { updateStats } from '../../../game/stats/service'; import { updateQuestProgress } from '../../../game/quests/service'; import { checkAchievements } from '../../../game/achievements/service'; @@ -12,23 +12,23 @@ export const command: CommandMessage = { aliases: ['fish'], cooldown: 5, description: 'Pesca en la laguna (usa caña si está disponible) y obtén recompensas.', - usage: 'pescar [nivel] [toolKey] (ej: pescar 1 tool.rod.basic)', + usage: 'pescar [nivel] [toolKey] [area:clave] (ej: pescar 1 tool.rod.basic)', run: async (message, args, _client: Amayo) => { const userId = message.author.id; const guildId = message.guild!.id; - const areaKey = args[0] === 'lagoon.shore' ? args[0] : 'lagoon.shore'; // Forzar key de área de laguna + const { areaKey, levelArg, providedTool } = parseGameArgs(args, 'lagoon.shore'); const area = await resolveArea(guildId, areaKey); - if (!area) { await message.reply('⚠️ Área de laguna no configurada. Crea `gameArea` con key `lagoon.shore`.'); return; } - - const levelArg = args[0] && /^\d+$/.test(args[0]) ? parseInt(args[0], 10) : null; - const providedTool = args.find((a) => a && !/^\d+$/.test(a)); + if (!area) { + await message.reply(`⚠️ Área de laguna no configurada. Crea \`gameArea\` con key \`${areaKey}\`.`); + return; + } const level = levelArg ?? await getDefaultLevel(userId, guildId, area.id); const toolKey = providedTool ?? await findBestToolKey(userId, guildId, 'rod'); try { - const result = await runMinigame(userId, guildId, areaKey, level, { toolKey: toolKey ?? undefined }); + const result = await runMinigame(userId, guildId, area.key, level, { toolKey: toolKey ?? undefined }); // Actualizar stats y misiones await updateStats(userId, guildId, { fishingCompleted: 1 });