From 86d28301f013304695c982c4e3402a852211cb0c Mon Sep 17 00:00:00 2001 From: kvan7 Date: Fri, 4 Sep 2026 07:28:21 -0500 Subject: [PATCH 1/2] fix regex node change --- renderer/specs/Parser/augment.test.ts | 168 +++++++++++++++++++++++++- renderer/src/parser/Parser.ts | 10 +- renderer/src/parser/utils.ts | 4 + 3 files changed, 177 insertions(+), 5 deletions(-) diff --git a/renderer/specs/Parser/augment.test.ts b/renderer/specs/Parser/augment.test.ts index 7717f6c3..5103334b 100644 --- a/renderer/specs/Parser/augment.test.ts +++ b/renderer/specs/Parser/augment.test.ts @@ -1,7 +1,7 @@ import { init } from "@/assets/data"; import { ItemCategory } from "@/parser"; import { ParsedModifier } from "@/parser/advanced-mod-desc"; -import { ModifierType } from "@/parser/modifiers"; +import { ModifierType, StatCalculated } from "@/parser/modifiers"; import { __testExports } from "@/parser/Parser"; import { createTestItem, makeCalcStat } from "@specs/helper"; import { setupTests } from "@specs/vitest.setup"; @@ -42,6 +42,160 @@ describe("determineAugments", () => { expect(result.map((augment) => augment.refName)).toEqual(expectedRef); }); + + it("handles range mods correctly", () => { + const mod = { + info: { + type: "rune", + tags: [], + }, + stats: [ + { + stat: { + ref: "Adds # to # Lightning Damage", + better: 1, + matchers: [ + { + string: "Adds # to # Lightning Damage", + }, + ], + trade: { + ids: { + explicit: ["explicit.stat_3336890334"], + fractured: ["fractured.stat_3336890334"], + enchant: ["enchant.stat_3336890334"], + rune: ["rune.stat_3336890334"], + desecrated: ["desecrated.stat_3336890334"], + crafted: ["crafted.stat_3336890334"], + }, + }, + id: "local_minimum_added_lightning_damage", + }, + translation: { + string: "Adds # to # Lightning Damage", + }, + roll: { + unscalable: false, + dp: false, + value: 15.5, + min: 15.5, + max: 15.5, + }, + }, + ], + } as unknown as ParsedModifier; + + const statCalcs = [ + { + stat: { + ref: "Adds # to # Lightning Damage", + better: 1, + matchers: [ + { + string: "Adds # to # Lightning Damage", + }, + ], + trade: { + ids: { + explicit: ["explicit.stat_3336890334"], + fractured: ["fractured.stat_3336890334"], + enchant: ["enchant.stat_3336890334"], + rune: ["rune.stat_3336890334"], + desecrated: ["desecrated.stat_3336890334"], + crafted: ["crafted.stat_3336890334"], + }, + }, + id: "local_minimum_added_lightning_damage", + }, + type: "rune", + sources: [ + { + modifier: { + info: { + type: "rune", + tags: [], + }, + stats: [ + { + stat: { + ref: "Adds # to # Lightning Damage", + better: 1, + matchers: [ + { + string: "Adds # to # Lightning Damage", + }, + ], + trade: { + ids: { + explicit: ["explicit.stat_3336890334"], + fractured: ["fractured.stat_3336890334"], + enchant: ["enchant.stat_3336890334"], + rune: ["rune.stat_3336890334"], + desecrated: ["desecrated.stat_3336890334"], + crafted: ["crafted.stat_3336890334"], + }, + }, + id: "local_minimum_added_lightning_damage", + }, + translation: { + string: "Adds # to # Lightning Damage", + }, + roll: { + unscalable: false, + dp: false, + value: 15.5, + min: 15.5, + max: 15.5, + }, + }, + ], + }, + stat: { + stat: { + ref: "Adds # to # Lightning Damage", + better: 1, + matchers: [ + { + string: "Adds # to # Lightning Damage", + }, + ], + trade: { + ids: { + explicit: ["explicit.stat_3336890334"], + fractured: ["fractured.stat_3336890334"], + enchant: ["enchant.stat_3336890334"], + rune: ["rune.stat_3336890334"], + desecrated: ["desecrated.stat_3336890334"], + crafted: ["crafted.stat_3336890334"], + }, + }, + id: "local_minimum_added_lightning_damage", + }, + translation: { + string: "Adds # to # Lightning Damage", + }, + roll: { + unscalable: false, + dp: false, + value: 15.5, + min: 15.5, + max: 15.5, + }, + }, + contributes: { + value: 15.5, + min: 15.5, + max: 15.5, + }, + }, + ], + }, + ] as unknown as StatCalculated[]; + const result = __testExports.determineAugments(mod, statCalcs); + + expect(result).toHaveLength(1); + expect(result[0].refName).toEqual("Greater Storm Rune"); + }); }); describe("BFS", () => { @@ -73,6 +227,18 @@ describe("BFS", () => { expect(result).toEqual(expected); }, ); + + it("should not infinite loop", () => { + const result = __testExports.modifiedBfs(100, [], Array(100).fill(0)); + + expect(result).toHaveLength(0); + }, 50); + + it("should not infinite loop2", () => { + const result = __testExports.modifiedBfs(15.5, [], Array(4).fill(1)); + + expect(result).toHaveLength(0); + }, 50); }); describe("parseAugmentSockets", () => { diff --git a/renderer/src/parser/Parser.ts b/renderer/src/parser/Parser.ts index 632e510f..264d8bf9 100644 --- a/renderer/src/parser/Parser.ts +++ b/renderer/src/parser/Parser.ts @@ -44,7 +44,7 @@ import { calcPropPercentile, QUALITY_STATS } from "./calc-q20"; import { AppConfig } from "@/web/Config"; import { buildEditorItems, getSavedAugments } from "./augment-builder"; import { useAugment } from "@/web/price-check/item-editor/augment"; -import { combinations } from "./utils"; +import { avg, combinations } from "./utils"; type SectionParseResult = | "SECTION_PARSED" @@ -2116,6 +2116,7 @@ function modifiedBfs( available: number[], ): number[] | null { if (remaining === 0) return [...combo]; + if (combo.length >= 7 || available.length > 8) return []; let best: number[] | null = null; for (const augValue of available) { @@ -2209,7 +2210,7 @@ function determineAugments( if (augment.values.length === 1) return augment.values[0]; // stats like "# to # added Lightning Damage" - if ((augment.baseStat.match(/#/) || []).length > 1) { + if ((augment.baseStat.match(/#/g) || []).length > 1) { const sum = augment.values.reduce((a, b) => a + b, 0); return sum / augment.values.length || 0; } @@ -2224,8 +2225,9 @@ function determineAugments( modifiedBfs(augmentAppliedValue[0], [], availableAugmentValues) ?? []; return likelyValues.map((v) => { - const augment = possibleAugments.find((aug) => - aug.values.some((augVal) => augVal === v), + const augment = possibleAugments.find( + (aug) => + aug.values.some((augVal) => augVal === v) || avg(aug.values) === v, )!; return ITEM_BY_REF("ITEM", augment.refName)![0]; }); diff --git a/renderer/src/parser/utils.ts b/renderer/src/parser/utils.ts index 696c0f8d..d95b608f 100644 --- a/renderer/src/parser/utils.ts +++ b/renderer/src/parser/utils.ts @@ -4,3 +4,7 @@ export function combinations(arr: T[]): T[][] { [[]], ); } + +export function avg(arr: number[]): number { + return arr.reduce((a, b) => a + b, 0) / arr.length; +} From bd037b3b919c66fbafd284cb13ee392cf6b6e7dd Mon Sep 17 00:00:00 2001 From: kvan7 Date: Fri, 4 Sep 2026 07:34:41 -0500 Subject: [PATCH 2/2] version bump --- .github/ISSUE_TEMPLATE/bug-report.yml | 3 ++- README.md | 2 +- docs/.vitepress/config.js | 2 +- main/package-lock.json | 4 ++-- main/package.json | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 5cf93575..a7724edf 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -58,6 +58,7 @@ body: label: Version description: What version of EE2 are you running? You can see this in Settings -> About options: + - 0.16.1 - 0.16.0 - 0.15.8 - 0.15.7 @@ -69,7 +70,7 @@ body: - 0.15.1 - 0.15.0 - Change me - default: 10 + default: 11 validations: required: true - type: textarea diff --git a/README.md b/README.md index ced4d268..9e94022b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ![Perfect Jewelers Orb](./renderer/public/images/jeweler.png) Exiled Exchange 2 -[![GitHub Downloads (specific asset, latest release)](https://img.shields.io/github/downloads/kvan7/exiled-exchange-2/latest/Exiled-Exchange-2-Setup-0.16.0.exe?style=plastic&link=https%3A%2F%2Ftooomm.github.io%2Fgithub-release-stats%2F%3Fusername%3Dkvan7%26repository%3DExiled-Exchange-2)](https://tooomm.github.io/github-release-stats/?username=kvan7&repository=Exiled-Exchange-2) +[![GitHub Downloads (specific asset, latest release)](https://img.shields.io/github/downloads/kvan7/exiled-exchange-2/latest/Exiled-Exchange-2-Setup-0.16.1.exe?style=plastic&link=https%3A%2F%2Ftooomm.github.io%2Fgithub-release-stats%2F%3Fusername%3Dkvan7%26repository%3DExiled-Exchange-2)](https://tooomm.github.io/github-release-stats/?username=kvan7&repository=Exiled-Exchange-2) [![GitHub Tag](https://img.shields.io/github/v/tag/kvan7/exiled-exchange-2?style=plastic&label=latest%20version)](https://github.com/Kvan7/Exiled-Exchange-2/releases/latest) [![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/kvan7/exiled-exchange-2/latest/dev?style=plastic)](https://github.com/Kvan7/Exiled-Exchange-2/commits/dev/) [![Translation status](https://translate.codeberg.org/widget/exiled-exchange-2/svg-badge.svg)](https://translate.codeberg.org/engage/exiled-exchange-2/) diff --git a/docs/.vitepress/config.js b/docs/.vitepress/config.js index 83064422..87ed4cc8 100644 --- a/docs/.vitepress/config.js +++ b/docs/.vitepress/config.js @@ -20,7 +20,7 @@ export default defineConfig({ }, themeConfig: { // logo: 'TODO', https://github.com/vuejs/vitepress/issues/1401 - appVersion: '0.16.0', + appVersion: '0.16.1', github: { releasesUrl: 'https://github.com/Kvan7/Exiled-Exchange-2/releases' }, diff --git a/main/package-lock.json b/main/package-lock.json index 505d3b41..b8e98fea 100644 --- a/main/package-lock.json +++ b/main/package-lock.json @@ -1,12 +1,12 @@ { "name": "exiled-exchange-2", - "version": "0.16.0", + "version": "0.16.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "exiled-exchange-2", - "version": "0.16.0", + "version": "0.16.1", "dependencies": { "electron-overlay-window": "4.0.2", "uiohook-napi": "1.5.x" diff --git a/main/package.json b/main/package.json index be141704..e4deb900 100644 --- a/main/package.json +++ b/main/package.json @@ -1,6 +1,6 @@ { "name": "exiled-exchange-2", - "version": "0.16.0", + "version": "0.16.1", "private": true, "scripts": { "dev": "node build/script.mjs",