diff --git a/config/i18n.json b/config/i18n.json index 26892347a7..f9caccb654 100644 --- a/config/i18n.json +++ b/config/i18n.json @@ -193,6 +193,7 @@ "Ascended": "Shows items that have an ascend node which have been ascended.", "Unascended": "Shows items that have an ascend node which have not been ascended.", "Breaker": "Filter by breaker type or corresponding champion type.", + "BreakerMod": "Filter by available anti-champion artifact mods for this breaker type or corresponding champion type.", "BulkClear": "Removed tag from 1 item.", "BulkClear_plural": "Removed tags from {{count}} items.", "BulkRevert": "Reverted tag on 1 item.", diff --git a/src/app/search/search-filters/known-values.tsx b/src/app/search/search-filters/known-values.tsx index a907e306c0..13ef7ea971 100644 --- a/src/app/search/search-filters/known-values.tsx +++ b/src/app/search/search-filters/known-values.tsx @@ -6,8 +6,10 @@ import { getEvent } from 'app/inventory/store/season'; import { getItemDamageShortName } from 'app/utils/item-utils'; import { DestinyAmmunitionType, DestinyClass, DestinyRecordState } from 'bungie-api-ts/destiny2'; import { D2EventPredicateLookup } from 'data/d2/d2-event-info'; +import { BreakerTypeHashes } from 'data/d2/generated-enums'; import missingSources from 'data/d2/missing-source-info'; import D2Sources from 'data/d2/source-info'; +import artifactBreakerMods from '../../../data/d2/artifact-breaker-weapon-types.json'; import { D1ItemCategoryHashes } from '../d1-known-values'; import { breakerTypes, @@ -166,11 +168,29 @@ const knownValuesFilters: FilterDefinition[] = [ suggestions: Object.keys(breakerTypes), destinyVersion: 2, filter: ({ filterValue }) => { - const breakerType = breakerTypes[filterValue]; + const breakerType: BreakerTypeHashes[] | undefined = breakerTypes[filterValue]; if (!breakerType) { throw new Error('Unknown breaker type ' + breakerType); } - return (item) => breakerType.includes(item.breakerType?.hash); + return (item) => item.breakerType && breakerType.includes(item.breakerType.hash); + }, + }, + { + keywords: 'breakermod', + description: tl('Filter.BreakerMod'), + format: 'query', + suggestions: Object.keys(breakerTypes), + destinyVersion: 2, + filter: ({ filterValue }) => { + const breakerType: BreakerTypeHashes[] | undefined = breakerTypes[filterValue]; + if (!breakerType) { + throw new Error('Unknown breaker type ' + breakerType); + } + const breakingIchs = breakerType.flatMap((ty) => artifactBreakerMods[ty] || []); + return (item) => + Boolean( + !item.breakerType && item.itemCategoryHashes.some((ich) => breakingIchs.includes(ich)) + ); }, }, { diff --git a/src/data/d2/artifact-breaker-weapon-types.json b/src/data/d2/artifact-breaker-weapon-types.json new file mode 100644 index 0000000000..b0258eef62 --- /dev/null +++ b/src/data/d2/artifact-breaker-weapon-types.json @@ -0,0 +1,15 @@ +{ + "485622768": [ + 3317538576, + 7 + ], + "2611060930": [ + 8, + 5, + 3954685534 + ], + "3178805705": [ + 6, + 153950757 + ] +} diff --git a/src/locale/en.json b/src/locale/en.json index 43a8e7d97d..bcc23bab1e 100644 --- a/src/locale/en.json +++ b/src/locale/en.json @@ -187,6 +187,7 @@ "ArmorIntrinsic": "Shows legendary armor which has an intrinsic perk, such as Artifice Armor.", "Ascended": "Shows items that have an ascend node which have been ascended.", "Breaker": "Filter by breaker type or corresponding champion type.", + "BreakerMod": "Filter by available anti-champion artifact mods for this breaker type or corresponding champion type.", "BulkClear": "Removed tag from 1 item.", "BulkClear_plural": "Removed tags from {{count}} items.", "BulkRevert": "Reverted tag on 1 item.",