From fa2b562e4420a74320c4b14e3c1f5266f0448f85 Mon Sep 17 00:00:00 2001 From: kvan7 Date: Sat, 25 Jan 2025 15:22:21 -0600 Subject: [PATCH] Add options to choose which numbering system to use #357 --- renderer/public/data/cmn-Hant/app_i18n.json | 9 +++++++-- renderer/public/data/de/app_i18n.json | 9 +++++++-- renderer/public/data/en/app_i18n.json | 9 +++++++-- renderer/public/data/es/app_i18n.json | 9 +++++++-- renderer/public/data/ja/app_i18n.json | 9 +++++++-- renderer/public/data/ko/app_i18n.json | 9 +++++++-- renderer/public/data/ru/app_i18n.json | 9 +++++++-- renderer/src/parser/Parser.ts | 3 ++- renderer/src/parser/mod-tiers.ts | 10 +++++----- renderer/src/parser/stat-translations.ts | 8 +++++--- renderer/src/web/Config.ts | 4 ++++ renderer/src/web/overlay/widgets.ts | 1 + .../src/web/price-check/PriceCheckWindow.vue | 1 + .../filters/FilterModifierTiers.vue | 18 +++++++++++++----- .../web/price-check/settings-price-check.vue | 19 +++++++++++++++++++ 15 files changed, 99 insertions(+), 28 deletions(-) diff --git a/renderer/public/data/cmn-Hant/app_i18n.json b/renderer/public/data/cmn-Hant/app_i18n.json index 7b2dde29..30f77169 100644 --- a/renderer/public/data/cmn-Hant/app_i18n.json +++ b/renderer/public/data/cmn-Hant/app_i18n.json @@ -174,7 +174,8 @@ "tag_explicit_incursion": "穿越", "tag_rune": "符文", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "離線 & 在線", @@ -358,7 +359,11 @@ "use_tooltip_hover": "將滑鼠懸停在價格上時顯示物品", "use_tooltip_keybind": "SHIFT + 懸停", "use_tooltip_always": "始終懸停顯示", - "use_tooltip_off": "關閉" + "use_tooltip_off": "關閉", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "這是 POE2 的測試版,某些功能可能無法正常運作。", diff --git a/renderer/public/data/de/app_i18n.json b/renderer/public/data/de/app_i18n.json index 20f596ca..828f1d37 100644 --- a/renderer/public/data/de/app_i18n.json +++ b/renderer/public/data/de/app_i18n.json @@ -178,7 +178,8 @@ "tag_explicit_incursion": "Incursion", "tag_rune": "Rune", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "Offline & Online", @@ -347,7 +348,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "Dies ist eine BETA für POE2, es wird nicht immer wie erwartet funktionieren.", diff --git a/renderer/public/data/en/app_i18n.json b/renderer/public/data/en/app_i18n.json index f57a1b3d..a47c2987 100644 --- a/renderer/public/data/en/app_i18n.json +++ b/renderer/public/data/en/app_i18n.json @@ -178,7 +178,8 @@ "tag_explicit_incursion": "Incursion", "tag_rune": "Rune", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "Offline & Online", @@ -374,7 +375,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "This is in BETA for POE2, things will not work always as expected.", diff --git a/renderer/public/data/es/app_i18n.json b/renderer/public/data/es/app_i18n.json index c926150a..fdcba4e2 100644 --- a/renderer/public/data/es/app_i18n.json +++ b/renderer/public/data/es/app_i18n.json @@ -178,7 +178,8 @@ "tag_explicit_incursion": "Incursión", "tag_rune": "Runa", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "Desconectado & En línea", @@ -374,7 +375,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "Esto está en BETA para POE2, las cosas no siempre funcionarán como se espera.", diff --git a/renderer/public/data/ja/app_i18n.json b/renderer/public/data/ja/app_i18n.json index 34ab65a1..d02ecb04 100644 --- a/renderer/public/data/ja/app_i18n.json +++ b/renderer/public/data/ja/app_i18n.json @@ -174,7 +174,8 @@ "tag_explicit_incursion": "インカージョン", "tag_rune": "ルーン", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "オフライン & オンライン", @@ -358,7 +359,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "これはPOE2のベータ版です、期待通りに動作しないことがあります。", diff --git a/renderer/public/data/ko/app_i18n.json b/renderer/public/data/ko/app_i18n.json index f1c81f1d..a5a4c757 100644 --- a/renderer/public/data/ko/app_i18n.json +++ b/renderer/public/data/ko/app_i18n.json @@ -171,7 +171,8 @@ "tag_explicit_incursion": "기습", "tag_rune": "룬", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "오프라인 & 온라인", @@ -354,7 +355,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "이 버전은 베타버전입니다. 예기치 못한 버그가 있을 수 있습니다.", diff --git a/renderer/public/data/ru/app_i18n.json b/renderer/public/data/ru/app_i18n.json index 7ae04783..965136b4 100644 --- a/renderer/public/data/ru/app_i18n.json +++ b/renderer/public/data/ru/app_i18n.json @@ -190,7 +190,8 @@ "tag_explicit_incursion": "Вмешательство", "tag_rune": "Руна", "tag_sanctum": "Sanctum", - "fill_rune_iron": "Fill Runes(Iron)" + "fill_rune_iron": "Fill Runes(Iron)", + "grade": "Grade {0}" }, "online_filter": { "offline_toggle": "Офлайн и Онлайн", @@ -373,7 +374,11 @@ "use_tooltip_hover": "Show item when hovering over price", "use_tooltip_keybind": "SHIFT + hover", "use_tooltip_always": "hover", - "use_tooltip_off": "off" + "use_tooltip_off": "off", + "tier_numbering": "Tier numbering style", + "tier_numbering_poe1": "PoE1 (lower is better)", + "tier_numbering_poe2": "PoE2 (higher is better)", + "tier_numbering_help": "To try to reduce confusion due to conflicting naming conventions with the game, PoE1 tiers will use the name \"Grade\" instead of \"Tier\". " }, "poe2_new": { "beta_warning": "Функционал для PoE2 находится в стадии бета тестирования и не всегда работает так, как задумано.", diff --git a/renderer/src/parser/Parser.ts b/renderer/src/parser/Parser.ts index 834b64a1..9ca88818 100644 --- a/renderer/src/parser/Parser.ts +++ b/renderer/src/parser/Parser.ts @@ -1401,7 +1401,8 @@ function parseStatsFromMod( const { stat: parsedStat, tier } = parsedStatAndTier; modifier.stats.push(parsedStat); if (tier) { - modifier.info.tier = tier; + modifier.info.tier = tier.poe1; + modifier.info.rank = tier.poe2; } stat = statIterator.next(true); } else { diff --git a/renderer/src/parser/mod-tiers.ts b/renderer/src/parser/mod-tiers.ts index a70b3470..3c28de1b 100644 --- a/renderer/src/parser/mod-tiers.ts +++ b/renderer/src/parser/mod-tiers.ts @@ -295,15 +295,15 @@ export function getTierNumber( mod: StatTierMod, itemCategory: ItemCategory, tierArray: StatTierMod[], -): number { +): { poe1: number; poe2: number } | undefined { if (mod === undefined || mod.mods === undefined || !mod.mods) { console.warn("No mods found for mod", mod); - return -1; + return; } if (tier === undefined || itemCategory === undefined) { console.warn("No tier or itemCategory found"); - return -1; + return; } // Map the itemCategory to its corresponding key(s) @@ -315,7 +315,7 @@ export function getTierNumber( ); if (!categoryExists || !primaryCategoryKey) { - return -1; // Return -1 if the category is not found in any mod + return; // Return if the category is not found in any mod } // Find the index of the given tier in mod.mods @@ -331,5 +331,5 @@ export function getTierNumber( .filter((t) => t.items.includes(primaryCategoryKey)).length; // Return the tier number (1-based) - return matchingTiersAfter + 1; + return { poe1: matchingTiersAfter + 1, poe2: tierIndex + 1 }; } diff --git a/renderer/src/parser/stat-translations.ts b/renderer/src/parser/stat-translations.ts index 0e4fa959..a3171e3a 100644 --- a/renderer/src/parser/stat-translations.ts +++ b/renderer/src/parser/stat-translations.ts @@ -161,7 +161,9 @@ export function tryParseTranslation( stat: StatString, modType: ModifierType, item?: ParsedItem, -): { stat: ParsedStat; tier: number | undefined } | undefined { +): + | { stat: ParsedStat; tier: { poe1: number; poe2: number } | undefined } + | undefined { let itemRarity: ItemRarity | undefined; let itemCategory: ItemCategory | undefined; if (item) { @@ -195,7 +197,7 @@ export function tryParseTranslation( }; } - let foundTier: number | undefined; + let foundTier: { poe1: number; poe2: number } | undefined; if ( modType === ModifierType.Explicit && @@ -226,7 +228,7 @@ export function tryParseTranslation( const tierNumber = getTierNumber(tierMatch, modTiers, itemCategory, [ modTiers, ]); - if (tierNumber !== -1) { + if (tierNumber) { foundTier = tierNumber; } } diff --git a/renderer/src/web/Config.ts b/renderer/src/web/Config.ts index a4a2d379..fec53e30 100644 --- a/renderer/src/web/Config.ts +++ b/renderer/src/web/Config.ts @@ -490,6 +490,7 @@ function upgradeConfig(_config: Config): Config { } if (config.configVersion < 22) { + // NOTE: v0.7.0 config.widgets.find( (w) => w.wmType === "price-check", )!.autoFillEmptyRuneSockets = "Iron Rune"; @@ -518,6 +519,9 @@ function upgradeConfig(_config: Config): Config { return 0; }); + config.widgets.find((w) => w.wmType === "price-check")!.tierNumbering = + "poe2"; + config.configVersion = 22; } diff --git a/renderer/src/web/overlay/widgets.ts b/renderer/src/web/overlay/widgets.ts index fc441bdf..cde1b317 100644 --- a/renderer/src/web/overlay/widgets.ts +++ b/renderer/src/web/overlay/widgets.ts @@ -55,6 +55,7 @@ export interface PriceCheckWidget extends Widget { defaultAllSelected: boolean; itemHoverTooltip: "off" | "keybind" | "always"; autoFillEmptyRuneSockets: "Iron Rune" | false; + tierNumbering: "poe1" | "poe2"; } export interface StopwatchWidget extends Widget { diff --git a/renderer/src/web/price-check/PriceCheckWindow.vue b/renderer/src/web/price-check/PriceCheckWindow.vue index 7a6ba235..30624cf7 100644 --- a/renderer/src/web/price-check/PriceCheckWindow.vue +++ b/renderer/src/web/price-check/PriceCheckWindow.vue @@ -191,6 +191,7 @@ export default defineComponent({ defaultAllSelected: false, itemHoverTooltip: "keybind", autoFillEmptyRuneSockets: false, + tierNumbering: "poe2", }; }, } satisfies WidgetSpec, diff --git a/renderer/src/web/price-check/filters/FilterModifierTiers.vue b/renderer/src/web/price-check/filters/FilterModifierTiers.vue index cb9dcf61..db91bfa8 100644 --- a/renderer/src/web/price-check/filters/FilterModifierTiers.vue +++ b/renderer/src/web/price-check/filters/FilterModifierTiers.vue @@ -14,6 +14,8 @@ import { defineComponent, PropType, computed } from "vue"; import { useI18n } from "vue-i18n"; import { ItemCategory, ParsedItem } from "@/parser"; import { FilterTag, StatFilter } from "./interfaces"; +import { AppConfig } from "@/web/Config"; +import { PriceCheckWidget } from "@/web/overlay/widgets"; export default defineComponent({ props: { @@ -27,12 +29,18 @@ export default defineComponent({ }, }, setup(props) { + const tierOption = computed( + () => AppConfig("price-check")!.tierNumbering, + ); + const tags = computed(() => { const { filter, item } = props; const out: Array<{ type: string; tier: number }> = []; for (const source of filter.sources) { const tier = source.modifier.info.tier; - if (!tier) continue; + const rank = source.modifier.info.rank; + if (!tier || !rank) continue; + const usedTier = tierOption.value === "poe1" ? tier : rank; if ( (filter.tag === FilterTag.Explicit || @@ -42,11 +50,11 @@ export default defineComponent({ item.category !== ItemCategory.ClusterJewel && item.category !== ItemCategory.MemoryLine ) { - if (tier === 1) out.push({ type: "tier-1", tier }); - else if (tier === 2) out.push({ type: "tier-2", tier }); + if (tier === 1) out.push({ type: "tier-1", tier: usedTier }); + else if (tier === 2) out.push({ type: "tier-2", tier: usedTier }); } else if (tier >= 2) { // fractured, explicit-* filters - out.push({ type: "not-tier-1", tier }); + out.push({ type: "not-tier-1", tier: usedTier }); } } out.sort((a, b) => a.tier - b.tier); @@ -54,7 +62,7 @@ export default defineComponent({ }); const { t } = useI18n(); - return { t, tags }; + return { t, tags, tierOption }; }, }); diff --git a/renderer/src/web/price-check/settings-price-check.vue b/renderer/src/web/price-check/settings-price-check.vue index 093e0161..3dbd5b89 100644 --- a/renderer/src/web/price-check/settings-price-check.vue +++ b/renderer/src/web/price-check/settings-price-check.vue @@ -82,6 +82,21 @@ }} +
+
{{ t(":tier_numbering") }}
+
+ {{ + t(":tier_numbering_poe1") + }} + {{ + t(":tier_numbering_poe2") + }} +
+
+ {{ t(":tier_numbering_help") }} +
+
+ {{ t(":remember_currency") }} @@ -296,6 +311,10 @@ export default defineComponent({ () => configWidget.value, "autoFillEmptyRuneSockets", ), + tierNumbering: configModelValue( + () => configWidget.value, + "tierNumbering", + ), }; }, });