From 5673ad7ca1e27dfd513805d439a7681decd8c7ab Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 19 Aug 2025 00:21:26 +0100 Subject: [PATCH 1/3] feat: accept negative modifier weights For example, `busker-solver modifiers="-Mana Cost" allbusks` now works and shows that power 130, busk 3 gives Dreams and Lights. --- src/main.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main.ts b/src/main.ts index 2efc055..52da4e7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -71,14 +71,12 @@ function parseWeightedModifiers(input: string): Partial Date: Tue, 19 Aug 2025 16:05:51 +0100 Subject: [PATCH 2/3] fix: display useful effects with negative weights --- src/main.ts | 4 ++-- src/utils.ts | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main.ts b/src/main.ts index 52da4e7..063c536 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,5 @@ import { Args } from "grimoire-kolmafia"; -import { Effect, Modifier, myPath, print, toEffect, toModifier } from "kolmafia"; +import { Effect, Modifier, myPath, print, toEffect } from "kolmafia"; import { $effects, $path, get, have, NumericModifier, sinceKolmafiaRevision } from "libram"; import { findOptimalOutfitPower, @@ -154,7 +154,7 @@ export function main(command?: string): void { printBuskResult( result, - Object.keys(weightedModifiers).map((mod) => toModifier(mod)), + weightedModifiers, desiredEffects ); } diff --git a/src/utils.ts b/src/utils.ts index ff71887..70db78a 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -13,6 +13,7 @@ import { print, Slot, toEffect, + toModifier, toSlot, } from "kolmafia"; import { @@ -73,7 +74,7 @@ function multipliers(slot: Slot): number { export function printBuskResult( result: BuskResult | null, - modifiers: Modifier[], + modifiers: Partial>, desiredEffects: Effect[] = [] ): void { if (!result) { @@ -94,13 +95,15 @@ export function printBuskResult( $modifier`Familiar Experience`, ]; + const modKeys = Object.keys(modifiers).map((mod) => toModifier(mod)); + for (const { effects, daRaw, buskIndex } of bestBusks) { const desiredMatches = effects.filter((e) => desiredEffects.includes(e)); print(`Power ${daRaw} Busk ${buskIndex + 1}`); // Calculate total buff per weighted modifier const weightedTotals = new Map(); - for (const mod of modifiers) { + for (const mod of modKeys) { const total = sum(effects, (ef) => numericModifier(ef, mod)); weightedTotals.set(mod, total); } @@ -120,8 +123,8 @@ export function printBuskResult( print(`Total buffs: ${totalBuffsStr}`); // For each weighted modifier, print contributing effects - for (const mod of modifiers) { - const contributingEffects = effects.filter((e) => numericModifier(e, mod) > 0); + for (const mod of modKeys) { + const contributingEffects = effects.filter((e) => numericModifier(e, mod) * modifiers[mod.name as NumericModifier]! > 0); if (contributingEffects.length === 0) continue; print(`${mod.name}:`); @@ -130,7 +133,7 @@ export function printBuskResult( // Optionally print other useful modifiers if args.othermodifiers is true if (othermodifiers) { - const otherMods = otherModifiersList.filter((mod) => !modifiers.includes(mod)); + const otherMods = otherModifiersList.filter((mod) => !modKeys.includes(mod)); if (otherMods.length > 0) { print(`Other Useful Modifiers:`); for (const mod of otherMods) { @@ -142,7 +145,7 @@ export function printBuskResult( } } const usefulEffects = effects.filter((e) => - modifiers.some((mod) => numericModifier(e, mod) > 0) + modKeys.some((mod) => numericModifier(e, mod) * modifiers[mod.name as NumericModifier]! > 0) ); const otherEffects = effects.filter( (e) => !desiredEffects.includes(e) && !usefulEffects.includes(e) From d4315d0015da4e74bfb6c0bf9c1e3c572e0e404c Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 19 Aug 2025 16:06:08 +0100 Subject: [PATCH 3/3] chore: prettier --- src/main.ts | 6 +----- src/utils.ts | 4 +++- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main.ts b/src/main.ts index 063c536..1f268f1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -152,10 +152,6 @@ export function main(command?: string): void { .join(", ")}]` ); - printBuskResult( - result, - weightedModifiers, - desiredEffects - ); + printBuskResult(result, weightedModifiers, desiredEffects); } } diff --git a/src/utils.ts b/src/utils.ts index 70db78a..e44db01 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -124,7 +124,9 @@ export function printBuskResult( // For each weighted modifier, print contributing effects for (const mod of modKeys) { - const contributingEffects = effects.filter((e) => numericModifier(e, mod) * modifiers[mod.name as NumericModifier]! > 0); + const contributingEffects = effects.filter( + (e) => numericModifier(e, mod) * modifiers[mod.name as NumericModifier]! > 0 + ); if (contributingEffects.length === 0) continue; print(`${mod.name}:`);