diff --git a/.yarn/cache/eslint-plugin-libram-npm-0.4.13-da13d56f41-745e5588e1.zip b/.yarn/cache/eslint-plugin-libram-npm-0.4.14-a672e7ccb8-5395edbb43.zip similarity index 89% rename from .yarn/cache/eslint-plugin-libram-npm-0.4.13-da13d56f41-745e5588e1.zip rename to .yarn/cache/eslint-plugin-libram-npm-0.4.14-a672e7ccb8-5395edbb43.zip index eb62a984c..025d03256 100644 Binary files a/.yarn/cache/eslint-plugin-libram-npm-0.4.13-da13d56f41-745e5588e1.zip and b/.yarn/cache/eslint-plugin-libram-npm-0.4.14-a672e7ccb8-5395edbb43.zip differ diff --git a/.yarn/cache/libram-npm-0.9.10-9e89503100-26e7513a92.zip b/.yarn/cache/libram-npm-0.9.11-64b70cce6b-2746b9b102.zip similarity index 81% rename from .yarn/cache/libram-npm-0.9.10-9e89503100-26e7513a92.zip rename to .yarn/cache/libram-npm-0.9.11-64b70cce6b-2746b9b102.zip index b2e8ded76..9593b2f7a 100644 Binary files a/.yarn/cache/libram-npm-0.9.10-9e89503100-26e7513a92.zip and b/.yarn/cache/libram-npm-0.9.11-64b70cce6b-2746b9b102.zip differ diff --git a/packages/eslint-config-garbo/package.json b/packages/eslint-config-garbo/package.json index af8ec431b..6b44d43f2 100644 --- a/packages/eslint-config-garbo/package.json +++ b/packages/eslint-config-garbo/package.json @@ -25,7 +25,7 @@ "dependencies": { "@eslint/js": "^9.9.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-libram": "^0.4.13", + "eslint-plugin-libram": "^0.4.14", "typescript-eslint": "^8.2.0" }, "devDependencies": { diff --git a/packages/garbo-lib/package.json b/packages/garbo-lib/package.json index 67c8bf07a..ca2e6aa48 100644 --- a/packages/garbo-lib/package.json +++ b/packages/garbo-lib/package.json @@ -30,7 +30,7 @@ "eslint": "^9.9.0", "eslint-config-garbo": "^0.0.1", "kolmafia": "^5.28067.0", - "libram": "^0.9.10", + "libram": "^0.9.11", "lint-staged": "^15.2.9", "madge": "^8.0.0", "prettier": "^3.3.3", diff --git a/packages/garbo-lib/src/wanderer/lib.ts b/packages/garbo-lib/src/wanderer/lib.ts index 907de50aa..6c4723448 100644 --- a/packages/garbo-lib/src/wanderer/lib.ts +++ b/packages/garbo-lib/src/wanderer/lib.ts @@ -184,7 +184,7 @@ function canWanderTypeBackup(location: Location): boolean { function canWanderTypeFreeFight(location: Location): boolean { if ( location === $location`The Fun-Guy Mansion` && - get("funGuyMansionKills", 0) >= 100 + get("funGuyMansionKills") >= 100 ) { return false; } diff --git a/packages/garbo/package.json b/packages/garbo/package.json index 974b313de..48061bae6 100644 --- a/packages/garbo/package.json +++ b/packages/garbo/package.json @@ -29,7 +29,7 @@ "garbo-lib": "*", "grimoire-kolmafia": "^0.3.26", "kolmafia": "^5.28067.0", - "libram": "^0.9.10" + "libram": "^0.9.11" }, "devDependencies": { "@babel/cli": "^7.24.8", diff --git a/packages/garbo/src/familiar/barfFamiliar.ts b/packages/garbo/src/familiar/barfFamiliar.ts index 10cac05d6..e87f336fe 100644 --- a/packages/garbo/src/familiar/barfFamiliar.ts +++ b/packages/garbo/src/familiar/barfFamiliar.ts @@ -93,7 +93,7 @@ function getCachedOutfitValues(fam: Familiar) { computeBarfOutfit( { familiar: fam, - avoid: $items`Kramco Sausage-o-Maticâ„¢, cursed magnifying glass, protonic accelerator pack, "I Voted!" sticker, li'l pirate costume, bag of many confections`, + avoid: $items`Kramco Sausage-o-Maticâ„¢, cursed magnifying glass, protonic accelerator pack, "I Voted!" sticker, li'l pirate costume, bag of many confections, bat wings`, }, true, ).dress(); diff --git a/packages/garbo/src/fights.ts b/packages/garbo/src/fights.ts index 3f2808c7c..e14f79c52 100644 --- a/packages/garbo/src/fights.ts +++ b/packages/garbo/src/fights.ts @@ -1263,6 +1263,7 @@ const freeRunFightSources = [ ((have($item`industrial fire extinguisher`) && get("_fireExtinguisherCharge") >= 10) || (have($familiar`XO Skeleton`) && get("_xoHugsUsed") < 11) || + (have($item`bat wings`) && get("_batWingsSwoopUsed") < 11) || (have($skill`Perpetrate Mild Evil`) && get("_mildEvilPerpetrated") < 3)) && get("_VYKEACompanionLevel") === 0 && // don't attempt this in case you re-run garbo after making a vykea furniture @@ -1297,6 +1298,7 @@ const freeRunFightSources = [ .trySkillRepeat( $skill`Fire Extinguisher: Polar Vortex`, $skill`Perpetrate Mild Evil`, + $skill`Swoop like a Bat`, ) .step(runSource.macro) .setAutoAttack(); @@ -1314,13 +1316,16 @@ const freeRunFightSources = [ const zone = getBestItemStealZone(); const spec: OutfitSpec = have($familiar`XO Skeleton`) && get("_xoHugsUsed") < 11 - ? { familiar: $familiar`XO Skeleton` } - : {}; + ? { familiar: $familiar`XO Skeleton`, equip: [] } + : { equip: [] }; if ( have($item`industrial fire extinguisher`) && get("_fireExtinguisherCharge") >= 10 ) { - spec.equip = $items`industrial fire extinguisher`; + spec.equip?.push($item`industrial fire extinguisher`); + } + if (have($item`bat wings`) && get("_batWingsSwoopUsed") < 11) { + spec.equip?.push($item`bat wings`); } spec.modifier = zone?.maximize ?? []; return spec; @@ -1973,12 +1978,7 @@ function getBestItemStealZone(mappingMonster = false): ItemStealZone | null { (zone) => zone.isOpen() && (mappingMonster || !zone.requireMapTheMonsters) && - asArray(zone.monster).some( - (m) => - !isBanished(m) || - get("olfactedMonster") === m || - get("_gallapagosMonster") === m, - ), + asArray(zone.monster).some((m) => !isBanished(m)), ); const vorticesAvail = have($item`industrial fire extinguisher`) ? Math.floor(get("_fireExtinguisherCharge") / 10) diff --git a/packages/garbo/src/index.ts b/packages/garbo/src/index.ts index 6a07eb919..15070029e 100644 --- a/packages/garbo/src/index.ts +++ b/packages/garbo/src/index.ts @@ -117,7 +117,7 @@ function defaultTarget() { } export function main(argString = ""): void { - sinceKolmafiaRevision(28067); // yes, can haz is like o hai + sinceKolmafiaRevision(28078); // track remaining bat wing skills checkGithubVersion(); // Hit up main.php to get out of easily escapable choices diff --git a/packages/garbo/src/outfit/dropsgear.ts b/packages/garbo/src/outfit/dropsgear.ts index 0ab34fd81..2231a06ef 100644 --- a/packages/garbo/src/outfit/dropsgear.ts +++ b/packages/garbo/src/outfit/dropsgear.ts @@ -285,6 +285,20 @@ function simpleTargetCrits(mode: BonusEquipMode): Map { ]); } +function batWings(mode: BonusEquipMode): Map { + const batWings = $item`bat wings`; + if ( + !have(batWings) || + mode !== BonusEquipMode.BARF || + get("_batWingsFreeFights") >= 5 + ) { + return new Map(); + } + const batWingsRate = 0.25; + const value = batWingsRate * get("valueOfAdventure"); + return new Map([[batWings, value]]); +} + export function bonusGear( mode: BonusEquipMode, valueCircumstantialBonus = true, @@ -299,6 +313,7 @@ export function bonusGear( ...sneegleebs(), ...bindlestocking(mode), ...simpleTargetCrits(mode), + ...batWings(mode), ...(valueCircumstantialBonus ? new Map([ ...pantsgiving(mode), diff --git a/packages/garbo/src/outfit/lib.ts b/packages/garbo/src/outfit/lib.ts index 15e0dec20..bcf6b440e 100644 --- a/packages/garbo/src/outfit/lib.ts +++ b/packages/garbo/src/outfit/lib.ts @@ -42,6 +42,8 @@ export function bestBjornalike(outfit: Outfit): Item | null { if (bjornalikes.length === 0) return null; if (bjornalikes.length === 1) return bjornalikes[0]; + if (outfit.bonuses.has($item`bat wings`)) return $item`Crown of Thrones`; + const hasStrongLep = findLeprechaunMultiplier(meatFamiliar()) >= 2; const goodRobortHats = $items`crumpled felt fedora`; if (myClass() === $class`Turtle Tamer`) { diff --git a/packages/garbo/src/tasks/dailyItems.ts b/packages/garbo/src/tasks/dailyItems.ts index e73cdba57..872c86abf 100644 --- a/packages/garbo/src/tasks/dailyItems.ts +++ b/packages/garbo/src/tasks/dailyItems.ts @@ -44,7 +44,6 @@ import { have, maxBy, questStep, - set, SourceTerminal, sum, withChoice, @@ -186,8 +185,8 @@ const DailyItemTasks: GarboTask[] = [ name: "2002 Mr. Store", ready: () => have($item`2002 Mr. Store Catalog`), completed: () => - get("availableMrStore2002Credits", 0) === 0 && - get("_2002MrStoreCreditsCollected", true), + get("availableMrStore2002Credits") === 0 && + get("_2002MrStoreCreditsCollected"), do: (): void => { const bestItem = maxBy( Item.all().filter((i) => sellsItem($coinmaster`Mr. Store 2002`, i)), @@ -195,26 +194,16 @@ const DailyItemTasks: GarboTask[] = [ ); buy( $coinmaster`Mr. Store 2002`, - get("availableMrStore2002Credits", 0), + get("availableMrStore2002Credits"), bestItem, ); }, spendsTurn: false, }, - { - name: "Check Sept-Ember", - ready: () => have($item`Sept-Ember Censer`), - completed: () => get("_septEmbersCollected", false), - do: (): void => { - visitUrl("shop.php?whichshop=september", false); - set("_septEmbersCollected", true); - }, - spendsTurn: false, - }, { name: "Spend Sept-Ember Embers", ready: () => have($item`Sept-Ember Censer`) && globalOptions.ascend, - completed: () => get("availableSeptEmbers", 0) === 0, + completed: () => get("availableSeptEmbers") === 0, do: (): void => { const itemsWithCosts = Item.all() .filter((i) => sellsItem($coinmaster`Sept-Ember Censer`, i)) @@ -225,14 +214,14 @@ const DailyItemTasks: GarboTask[] = [ garboValue(item) / sellPrice($coinmaster`Sept-Ember Censer`, item), })); - while (get("availableSeptEmbers", 0) > 0) { + while (get("availableSeptEmbers") > 0) { const { item, cost } = maxBy( itemsWithCosts.filter( - ({ cost }) => cost <= get("availableSeptEmbers", 0), + ({ cost }) => cost <= get("availableSeptEmbers"), ), "value", ); - const toBuy = Math.floor(get("availableSeptEmbers", 0) / cost); + const toBuy = Math.floor(get("availableSeptEmbers") / cost); buy($coinmaster`Sept-Ember Censer`, toBuy, item); } }, @@ -524,7 +513,7 @@ const DailyItemTasks: GarboTask[] = [ (!(myInebriety() > inebrietyLimit()) || (have($item`Drunkula's wineglass`) && canEquip($item`Drunkula's wineglass`))), - completed: () => get("_candyCaneSwordOvergrownShrine", true), + completed: () => get("_candyCaneSwordOvergrownShrine"), do: () => { visitUrl("adventure.php?snarfblat=348"); runChoice(4); diff --git a/yarn.lock b/yarn.lock index dd6b14f94..a0427af54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3888,7 +3888,7 @@ __metadata: "@types/eslint__js": ^8.42.3 eslint: ^9.9.0 eslint-config-prettier: ^9.1.0 - eslint-plugin-libram: ^0.4.13 + eslint-plugin-libram: ^0.4.14 lint-staged: ^15.2.9 madge: ^8.0.0 prettier: ^3.3.3 @@ -3912,13 +3912,13 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-libram@npm:^0.4.13": - version: 0.4.13 - resolution: "eslint-plugin-libram@npm:0.4.13" +"eslint-plugin-libram@npm:^0.4.14": + version: 0.4.14 + resolution: "eslint-plugin-libram@npm:0.4.14" dependencies: html-entities: ^2.5.2 requireindex: ~1.2.0 - checksum: 745e5588e1695080313bd2a9b4d723c6a17652693f205d571c9c2fef7270e30ee0389416997d6047f812bcfe8da4f2a0ceca171b9bc153156a422f91ec27aa8b + checksum: 5395edbb43cc849010365bfacc0090e9a5111040abbfb934b965112021ac61449e25f6002ee4093f0cfd3ade4b3bf612aa7a804ec37b339f347a161d2aa287c1 languageName: node linkType: hard @@ -4335,7 +4335,7 @@ __metadata: eslint: ^9.9.0 eslint-config-garbo: ^0.0.1 kolmafia: ^5.28067.0 - libram: ^0.9.10 + libram: ^0.9.11 lint-staged: ^15.2.9 madge: ^8.0.0 prettier: ^3.3.3 @@ -4390,7 +4390,7 @@ __metadata: garbo-lib: "*" grimoire-kolmafia: ^0.3.26 kolmafia: ^5.28067.0 - libram: ^0.9.10 + libram: ^0.9.11 lint-staged: ^15.2.9 madge: ^8.0.0 prettier: ^3.3.3 @@ -5054,14 +5054,14 @@ __metadata: languageName: node linkType: hard -"libram@npm:^0.9.10": - version: 0.9.10 - resolution: "libram@npm:0.9.10" +"libram@npm:^0.9.11": + version: 0.9.11 + resolution: "libram@npm:0.9.11" dependencies: html-entities: ^2.5.2 peerDependencies: kolmafia: ^5.27668.0 - checksum: 26e7513a92c89a0d85b59cbe32def8ec690e84c5d93e66af8db253208028cb93a5285803f1ac93dcf876b57f35be185513095683400407c63ac8e9da730351ca + checksum: 2746b9b102bf882ef0ce58794347068d6082aad9bbb1ba5dd1ac8d876c0d2beb3690350c4bb0cd3b350b44855ce5f16315e16939303045d47e892aa7d881764d languageName: node linkType: hard