diff --git a/packages/excavator-projects/projects/designerSweatpants.ts b/packages/excavator-projects/projects/designerSweatpants.ts index 37223e5..bc201b0 100644 --- a/packages/excavator-projects/projects/designerSweatpants.ts +++ b/packages/excavator-projects/projects/designerSweatpants.ts @@ -1,17 +1,19 @@ -import { currentRound, Item, equippedItem, Slot, myLocation } from "kolmafia"; +import { Item, myLocation } from "kolmafia"; import { ExcavatorProject } from "../type"; -import { shouldDiscardData, toNormalisedString } from "../utils"; +import { + isEquippedAtEndOfCombat, + shouldDiscardData, + toNormalisedString, +} from "../utils"; function spadeSweatpants(encounter: string, page: string) { - if (currentRound() !== 0) return null; if ( - !Item.get(["designer sweatpants", "replica designer sweatpants"]).includes( - equippedItem(Slot.get("pants")), + !isEquippedAtEndOfCombat( + Item.get(["designer sweatpants", "replica designer sweatpants"]), ) - ) { + ) return null; - } const sweat = Number(page.match(/You get (\d)% Sweatier/)?.[1]); if (!sweat) return null; diff --git a/packages/excavator-projects/projects/dropConSnowglobe.ts b/packages/excavator-projects/projects/dropConSnowglobe.ts index 5592713..73bed8d 100644 --- a/packages/excavator-projects/projects/dropConSnowglobe.ts +++ b/packages/excavator-projects/projects/dropConSnowglobe.ts @@ -1,8 +1,8 @@ import "core-js/modules/es.string.match-all"; -import { currentRound, equippedAmount, Item } from "kolmafia"; +import { Item } from "kolmafia"; import { ExcavatorProject } from "../type"; -import { toNormalisedItem } from "../utils"; +import { isEquippedAtEndOfCombat, toNormalisedItem } from "../utils"; export const DROP_CON_SNOWGLOBE: ExcavatorProject = { name: "KoL Con 13 Snowglobe", @@ -72,10 +72,7 @@ function spadeSnowglobe( encounter: string, page: string, ): SnowglobeData[] | null { - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing KoL Con 13 snowglobe - if (equippedAmount(Item.get("KoL Con 13 snowglobe")) < 1) return null; + if (!isEquippedAtEndOfCombat(Item.get("KoL Con 13 snowglobe"))) return null; const data = []; diff --git a/packages/excavator-projects/projects/dropMixedEverything.ts b/packages/excavator-projects/projects/dropMixedEverything.ts index fdbe8e2..b888548 100644 --- a/packages/excavator-projects/projects/dropMixedEverything.ts +++ b/packages/excavator-projects/projects/dropMixedEverything.ts @@ -1,7 +1,7 @@ import { currentRound, equippedAmount, Item } from "kolmafia"; import { ExcavatorProject } from "../type"; -import { toNormalisedItem } from "../utils"; +import { isEquippedAtEndOfCombat, toNormalisedItem } from "../utils"; export const DROP_MIXED_EVERYTHING: ExcavatorProject = { name: "Can Of Mixed Everything", @@ -9,10 +9,8 @@ export const DROP_MIXED_EVERYTHING: ExcavatorProject = { author: "Rinn", hooks: { COMBAT_ROUND: (encounter: string, page: string) => { - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing the can of mixed everything - if (equippedAmount(Item.get("can of mixed everything")) < 1) return null; + if (!isEquippedAtEndOfCombat(Item.get("can of mixed everything"))) + return null; const result = page.match( /Something falls out of your can of mixed everything.*?You acquire an item: (.*?)<\/b>/, ); diff --git a/packages/excavator-projects/projects/dropMrCheengs.ts b/packages/excavator-projects/projects/dropMrCheengs.ts index cc02bc7..c1058f6 100644 --- a/packages/excavator-projects/projects/dropMrCheengs.ts +++ b/packages/excavator-projects/projects/dropMrCheengs.ts @@ -1,7 +1,7 @@ -import { currentRound, equippedAmount, Item } from "kolmafia"; +import { Item } from "kolmafia"; import { ExcavatorProject } from "../type"; -import { toNormalisedItem } from "../utils"; +import { isEquippedAtEndOfCombat, toNormalisedItem } from "../utils"; export const DROP_MR_CHEENGS: ExcavatorProject = { name: "Mr. Cheeng's Spectacles", @@ -10,10 +10,8 @@ export const DROP_MR_CHEENGS: ExcavatorProject = { author: "Rinn", hooks: { COMBAT_ROUND: (encounter: string, page: string) => { - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing Mr. Cheeng's spectacles - if (equippedAmount(Item.get("Mr. Cheeng's spectacles")) < 1) return null; + if (!isEquippedAtEndOfCombat(Item.get("Mr. Cheeng's spectacles"))) + return null; const result = page.match( /You see a weird thing out of the corner of your eye, and you grab it.\s+Far out, man!.*?You acquire an item: (.*?)<\/b>/, ); diff --git a/packages/excavator-projects/projects/dropMrScreeges.ts b/packages/excavator-projects/projects/dropMrScreeges.ts index b0548a1..38e9a62 100644 --- a/packages/excavator-projects/projects/dropMrScreeges.ts +++ b/packages/excavator-projects/projects/dropMrScreeges.ts @@ -1,7 +1,7 @@ import { currentRound, equippedAmount, Item } from "kolmafia"; import { ExcavatorProject } from "../type"; -import { toNormalisedItem } from "../utils"; +import { isEquippedAtEndOfCombat, toNormalisedItem } from "../utils"; export const DROP_MR_SCREEGES: ExcavatorProject = { name: "Mr. Screege's Spectacles", @@ -10,10 +10,8 @@ export const DROP_MR_SCREEGES: ExcavatorProject = { author: "Rinn", hooks: { COMBAT_ROUND: (encounter: string, page: string) => { - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing Mr. Screege's spectacles - if (equippedAmount(Item.get("Mr. Screege's spectacles")) < 1) return null; + if (!isEquippedAtEndOfCombat(Item.get("Mr. Screege's spectacles"))) + return null; const result = page.match( /You notice something valuable hidden .*?You acquire an item: (.*?)<\/b>/, ); diff --git a/packages/excavator-projects/projects/outOfOrder.ts b/packages/excavator-projects/projects/outOfOrder.ts index 09ded6c..0ec5a5e 100644 --- a/packages/excavator-projects/projects/outOfOrder.ts +++ b/packages/excavator-projects/projects/outOfOrder.ts @@ -10,6 +10,7 @@ import { } from "kolmafia"; import { ExcavatorProject } from "../type"; +import { isEquippedAtEndOfCombat } from "../utils"; export const OUT_OF_ORDER: ExcavatorProject = { name: "Out of Order", @@ -20,10 +21,9 @@ export const OUT_OF_ORDER: ExcavatorProject = { COMBAT_ROUND: (encounter: string, page: string) => { // Must be on the quest if (getProperty("questEspOutOfOrder") === "unstarted") return null; - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing the wristwatch - if (equippedAmount(Item.get("GPS-tracking wristwatch")) < 1) return null; + // Must be equipped and at the end of a combat + if (!isEquippedAtEndOfCombat(Item.get("GPS-tracking wristwatch"))) + return null; // Must be in the jungle if (myLocation() !== Location.get("The Deep Dark Jungle")) return null; const beeps = page.match( diff --git a/packages/excavator-projects/projects/summonMayflySwarm.ts b/packages/excavator-projects/projects/summonMayflySwarm.ts index f1fdedb..46dfd83 100644 --- a/packages/excavator-projects/projects/summonMayflySwarm.ts +++ b/packages/excavator-projects/projects/summonMayflySwarm.ts @@ -7,6 +7,7 @@ import { } from "kolmafia"; import { ExcavatorProject } from "../type"; +import { isEquippedAtEndOfCombat } from "../utils"; const ZONE_PATTERNS = new Map([ [ @@ -76,10 +77,8 @@ export const SUMMON_MAYFLY_SWARM: ExcavatorProject = { author: "Rinn", hooks: { COMBAT_ROUND: (_: string, page: string) => { - // Must be end of battle - if (currentRound() !== 0) return null; - // Must be wearing mayfly bait necklace - if (equippedAmount(Item.get("mayfly bait necklace")) < 1) return null; + if (!isEquippedAtEndOfCombat(Item.get("mayfly bait necklace"))) + return null; // Must be in a tracked zone or location const specialPattern = ZONE_PATTERNS.get(myLocation().zone) ?? diff --git a/packages/excavator-projects/utils.ts b/packages/excavator-projects/utils.ts index 0289e0b..242176f 100644 --- a/packages/excavator-projects/utils.ts +++ b/packages/excavator-projects/utils.ts @@ -1,6 +1,8 @@ import { canInteract, + currentRound, Effect, + equippedAmount, gamedayToInt, getProperty, haveEffect, @@ -102,3 +104,9 @@ export function shouldDiscardData(property: string, data: string) { sessionStorage.setItem(property, [...sentData, data].join("|")); return false; } + +export function isEquippedAtEndOfCombat(item: Item | Item[]) { + if (currentRound() !== 0) return false; + const items = Array.isArray(item) ? item : [item]; + return items.some((i) => equippedAmount(i) > 0); +} diff --git a/packages/excavator-web/package.json b/packages/excavator-web/package.json index d4592b8..cde901d 100644 --- a/packages/excavator-web/package.json +++ b/packages/excavator-web/package.json @@ -6,9 +6,9 @@ "type": "module", "scripts": { "build": "remix vite:build", - "dev": "node --loader tsm ./server.ts", - "start": "NODE_ENV=production node --loader tsm ./server.ts", - "etl": "node --loader tsm ./etl.ts", + "dev": "node --import tsx ./server.ts", + "start": "NODE_ENV=production node --import tsx ./server.ts", + "etl": "node --import tsx ./etl.ts", "format": "prettier --write .", "lint": "prettier --check ." }, @@ -32,7 +32,8 @@ "isbot": "5.1.9", "react": "^18.3.1", "react-dom": "^18.3.1", - "spin-delay": "^2.0.0" + "spin-delay": "^2.0.0", + "tsx": "^4.15.6" }, "devDependencies": { "@remix-run/dev": "^2.9.2", @@ -43,7 +44,6 @@ "excavator-prettier-config": "^0.0.0", "prettier": "^3.3.2", "prisma": "^5.15.0", - "tsm": "^2.3.0", "typescript": "^5.4.5", "vite": "^5.3.1" }, diff --git a/yarn.lock b/yarn.lock index de73550..7a4e472 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3279,13 +3279,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.15.18": - version: 0.15.18 - resolution: "@esbuild/android-arm@npm:0.15.18" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.17.6": version: 0.17.6 resolution: "@esbuild/android-arm@npm:0.17.6" @@ -3538,13 +3531,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.15.18": - version: 0.15.18 - resolution: "@esbuild/linux-loong64@npm:0.15.18" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.17.6": version: 0.17.6 resolution: "@esbuild/linux-loong64@npm:0.17.6" @@ -6134,118 +6120,6 @@ __metadata: languageName: node linkType: hard -"esbuild-android-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-android-64@npm:0.15.18" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"esbuild-android-arm64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-android-arm64@npm:0.15.18" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-darwin-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-darwin-64@npm:0.15.18" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"esbuild-darwin-arm64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-darwin-arm64@npm:0.15.18" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-freebsd-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-freebsd-64@npm:0.15.18" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"esbuild-freebsd-arm64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-freebsd-arm64@npm:0.15.18" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-linux-32@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-32@npm:0.15.18" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"esbuild-linux-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-64@npm:0.15.18" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"esbuild-linux-arm64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-arm64@npm:0.15.18" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-linux-arm@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-arm@npm:0.15.18" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"esbuild-linux-mips64le@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-mips64le@npm:0.15.18" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"esbuild-linux-ppc64le@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-ppc64le@npm:0.15.18" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"esbuild-linux-riscv64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-riscv64@npm:0.15.18" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"esbuild-linux-s390x@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-linux-s390x@npm:0.15.18" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"esbuild-netbsd-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-netbsd-64@npm:0.15.18" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"esbuild-openbsd-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-openbsd-64@npm:0.15.18" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "esbuild-plugin-babel@npm:^0.2.3": version: 0.2.3 resolution: "esbuild-plugin-babel@npm:0.2.3" @@ -6268,34 +6142,6 @@ __metadata: languageName: node linkType: hard -"esbuild-sunos-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-sunos-64@npm:0.15.18" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"esbuild-windows-32@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-windows-32@npm:0.15.18" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"esbuild-windows-64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-windows-64@npm:0.15.18" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"esbuild-windows-arm64@npm:0.15.18": - version: 0.15.18 - resolution: "esbuild-windows-arm64@npm:0.15.18" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "esbuild@npm:0.17.6": version: 0.17.6 resolution: "esbuild@npm:0.17.6" @@ -6373,83 +6219,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.15.16": - version: 0.15.18 - resolution: "esbuild@npm:0.15.18" - dependencies: - "@esbuild/android-arm": "npm:0.15.18" - "@esbuild/linux-loong64": "npm:0.15.18" - esbuild-android-64: "npm:0.15.18" - esbuild-android-arm64: "npm:0.15.18" - esbuild-darwin-64: "npm:0.15.18" - esbuild-darwin-arm64: "npm:0.15.18" - esbuild-freebsd-64: "npm:0.15.18" - esbuild-freebsd-arm64: "npm:0.15.18" - esbuild-linux-32: "npm:0.15.18" - esbuild-linux-64: "npm:0.15.18" - esbuild-linux-arm: "npm:0.15.18" - esbuild-linux-arm64: "npm:0.15.18" - esbuild-linux-mips64le: "npm:0.15.18" - esbuild-linux-ppc64le: "npm:0.15.18" - esbuild-linux-riscv64: "npm:0.15.18" - esbuild-linux-s390x: "npm:0.15.18" - esbuild-netbsd-64: "npm:0.15.18" - esbuild-openbsd-64: "npm:0.15.18" - esbuild-sunos-64: "npm:0.15.18" - esbuild-windows-32: "npm:0.15.18" - esbuild-windows-64: "npm:0.15.18" - esbuild-windows-arm64: "npm:0.15.18" - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/linux-loong64": - optional: true - esbuild-android-64: - optional: true - esbuild-android-arm64: - optional: true - esbuild-darwin-64: - optional: true - esbuild-darwin-arm64: - optional: true - esbuild-freebsd-64: - optional: true - esbuild-freebsd-arm64: - optional: true - esbuild-linux-32: - optional: true - esbuild-linux-64: - optional: true - esbuild-linux-arm: - optional: true - esbuild-linux-arm64: - optional: true - esbuild-linux-mips64le: - optional: true - esbuild-linux-ppc64le: - optional: true - esbuild-linux-riscv64: - optional: true - esbuild-linux-s390x: - optional: true - esbuild-netbsd-64: - optional: true - esbuild-openbsd-64: - optional: true - esbuild-sunos-64: - optional: true - esbuild-windows-32: - optional: true - esbuild-windows-64: - optional: true - esbuild-windows-arm64: - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/4eb13979ae2e52eab529b79a0f236e03d08a7bd90c46924d60af73ea4de32d819abf916d0fd7a12b4908f91297e1477739f3ea9c53a68fbcc47a08ab173c41b0 - languageName: node - linkType: hard - "esbuild@npm:^0.20.1": version: 0.20.2 resolution: "esbuild@npm:0.20.2" @@ -6530,7 +6299,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.21.3, esbuild@npm:^0.21.5": +"esbuild@npm:^0.21.3, esbuild@npm:^0.21.5, esbuild@npm:~0.21.4": version: 0.21.5 resolution: "esbuild@npm:0.21.5" dependencies: @@ -7055,7 +6824,7 @@ __metadata: react: "npm:^18.3.1" react-dom: "npm:^18.3.1" spin-delay: "npm:^2.0.0" - tsm: "npm:^2.3.0" + tsx: "npm:^4.15.6" typescript: "npm:^5.4.5" vite: "npm:^5.3.1" languageName: unknown @@ -7472,6 +7241,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.7.5": + version: 4.7.5 + resolution: "get-tsconfig@npm:4.7.5" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -10396,6 +10174,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve.exports@npm:^2.0.2": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" @@ -11197,14 +10982,19 @@ __metadata: languageName: node linkType: hard -"tsm@npm:^2.3.0": - version: 2.3.0 - resolution: "tsm@npm:2.3.0" +"tsx@npm:^4.15.6": + version: 4.15.6 + resolution: "tsx@npm:4.15.6" dependencies: - esbuild: "npm:^0.15.16" + esbuild: "npm:~0.21.4" + fsevents: "npm:~2.3.3" + get-tsconfig: "npm:^4.7.5" + dependenciesMeta: + fsevents: + optional: true bin: - tsm: bin.js - checksum: 10c0/f099e218625730d77271be120bb7a9b30619d5b1da3df59c61c53ecd56c42b51aa4e36ade5f7d963ce588df4675c657f827eb12361967a5b5316bd889a365b40 + tsx: dist/cli.mjs + checksum: 10c0/c44e489d35b8b4795d68164572eb9e322a707290aa0786c2aac0f5c7782a884dfec38d557d74471b981a8314b2c7f6612078451d0429db028a23cb54a37e83a0 languageName: node linkType: hard