diff --git a/src/commands/cheapestfffe.ts b/src/commands/cheapestfffe.ts index 742f5de..76f439b 100644 --- a/src/commands/cheapestfffe.ts +++ b/src/commands/cheapestfffe.ts @@ -20,7 +20,8 @@ function bonusName(bonus: string) { async function asyncHandler( message: Message, - fuse?: number + fuse?: number, + skirmish?: boolean ) { // This is just to break up the flow and make sure any exceptions end up in the .catch, not thrown during yargs command execution await new Promise(resolve => setImmediate(() => resolve())); @@ -38,7 +39,7 @@ async function asyncHandler( let candidatesForImmortalisation = profileCrew.filter((c: any) => { if (c.level >= 90) { if (c.equipment.length === 4) return false; - let needed = getNeededItems(c.symbol, 90, c.level); + let needed = getNeededItems(c.symbol, 90, c.level, skirmish); if (!needed) { return false; } @@ -71,7 +72,7 @@ async function asyncHandler( }); candidatesForImmortalisation = candidatesForImmortalisation.map((c: any) => { - let needed = c.level >= 90 ? getNeededItems(c.symbol, 90, c.level) : getNeededItems(c.symbol, c.level); + let needed = c.level >= 90 ? getNeededItems(c.symbol, 90, c.level, skirmish) : getNeededItems(c.symbol, c.level, undefined, skirmish); if (!needed) { return c; } @@ -172,7 +173,7 @@ async function asyncHandler( class CheapestFFFE implements Definitions.Command { name = 'cheapestfffe'; - command = 'cheapestfffe [fuseneed]'; + command = 'cheapestfffe [fuseneed] [skirmish]'; aliases = []; describe = 'Shows FF crew on your roster who are cheapest to FE'; options = [{ @@ -188,18 +189,38 @@ class CheapestFFFE implements Definitions.Command { { name: '4', value: 4 }, { name: '5', value: 5 }, ] + }, + { + name: 'skirmish', + type: ApplicationCommandOptionType.Boolean, + description: 'optimize for skirmish (ship battles and faction missions, only)', + required: false, + default: false }] builder(yp: yargs.Argv): yargs.Argv { return yp.option('fuseneed', { alias: 'f', - desc: 'show crew with the specified needed fuses' + desc: 'show crew with the specified needed fuses', + type: 'number' + }).option('skirmish', { + alias: 's', + desc: 'optimize for skirmish (ship battles and faction missions, only)', + type: 'boolean' }); } handler(args: yargs.Arguments) { let message = args.message; let fuse = args.fuseneed as number; - args.promisedResult = asyncHandler(message, fuse); + let skirmish = false; + if (typeof args.skirmish === 'string') { + skirmish = args.skirmish.trim().toLowerCase() === 'true'; + } + else if (typeof args.skirmish === 'boolean') { + skirmish = args.skirmish; + } + + args.promisedResult = asyncHandler(message, fuse, skirmish); } } diff --git a/src/utils/equipment.ts b/src/utils/equipment.ts index df38330..a026d17 100644 --- a/src/utils/equipment.ts +++ b/src/utils/equipment.ts @@ -9,11 +9,11 @@ export interface IDemand { avgChronCost: number; } -function bestChronCost(item: Definitions.Item) { +function bestChronCost(item: Definitions.Item, skirmish?: boolean) { let bestCost = 0; if (!item.factionOnly) { - let bestMissions = item.item_sources.filter((s) => s.avg_cost && s.avg_cost >= 1).sort((a, b) => (a.avg_cost || 9999) - (b.avg_cost || 9999)); + let bestMissions = item.item_sources.filter((s) => (!skirmish || s.type !== 0) && s.avg_cost && s.avg_cost >= 1).sort((a, b) => (a.avg_cost || 9999) - (b.avg_cost || 9999)); if (bestMissions.length > 0) { bestCost = bestMissions[0].avg_cost || 0; } @@ -23,7 +23,7 @@ function bestChronCost(item: Definitions.Item) { } -export function demandsPerSlot(es: any, items: Definitions.Item[], dupeChecker: Set, demands: IDemand[]): number { +export function demandsPerSlot(es: any, items: Definitions.Item[], dupeChecker: Set, demands: IDemand[], skirmish?: boolean): number { let equipment = items.find((item) => item.symbol === es.symbol); if (!equipment) { return 0; @@ -40,7 +40,7 @@ export function demandsPerSlot(es: any, items: Definitions.Item[], dupeChecker: symbol: equipment.symbol, equipment: equipment, factionOnly: equipment.factionOnly, - avgChronCost: bestChronCost(equipment), + avgChronCost: bestChronCost(equipment, skirmish), }); } @@ -69,14 +69,14 @@ export function demandsPerSlot(es: any, items: Definitions.Item[], dupeChecker: symbol: iter.symbol, equipment: recipeEquipment, factionOnly: iter.factionOnly, - avgChronCost: bestChronCost(recipeEquipment), + avgChronCost: bestChronCost(recipeEquipment, skirmish), }); } return equipment.recipe.craftCost; } -export function getNeededItems(crew_symbol: string, min_level: number, max_level: number = 100) { +export function getNeededItems(crew_symbol: string, min_level: number, max_level: number = 100, skirmish?: boolean) { let crew = DCData.getBotCrew().find((c) => c.symbol === crew_symbol); if (!crew) { @@ -92,7 +92,7 @@ export function getNeededItems(crew_symbol: string, min_level: number, max_level crew.equipment_slots .filter((es: any) => es.level >= min_level && es.level <= max_level) .forEach((es: any) => { - craftCost += demandsPerSlot(es, DCData.getItems(), dupeChecker, demands); + craftCost += demandsPerSlot(es, DCData.getItems(), dupeChecker, demands, skirmish); }); demands = demands.sort((a, b) => b.count - a.count);