From 88aedaee81f7aa32c070bb29ac0d0d28f1fe1877 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 11 Jul 2026 16:41:35 +0300 Subject: [PATCH] Comp analyzer single weapon combos --- .../comp-analyzer/comp-analyzer-hooks.ts | 9 +++ .../components/DamageComboBar.module.css | 7 +++ .../components/DamageComboBar.tsx | 24 ++++++- .../core/damage-combinations.test.ts | 63 +++++++++++++++++++ .../comp-analyzer/core/damage-combinations.ts | 60 +++++++++++++++--- locales/da/analyzer.json | 3 +- locales/de/analyzer.json | 3 +- locales/en/analyzer.json | 3 +- locales/es-ES/analyzer.json | 3 +- locales/es-US/analyzer.json | 3 +- locales/fr-CA/analyzer.json | 3 +- locales/fr-EU/analyzer.json | 3 +- locales/he/analyzer.json | 3 +- locales/it/analyzer.json | 3 +- locales/ja/analyzer.json | 3 +- locales/ko/analyzer.json | 3 +- locales/nl/analyzer.json | 3 +- locales/pl/analyzer.json | 3 +- locales/pt-BR/analyzer.json | 3 +- locales/ru/analyzer.json | 3 +- locales/zh/analyzer.json | 3 +- 21 files changed, 184 insertions(+), 27 deletions(-) diff --git a/app/features/comp-analyzer/comp-analyzer-hooks.ts b/app/features/comp-analyzer/comp-analyzer-hooks.ts index 8fe01712e..61427ab26 100644 --- a/app/features/comp-analyzer/comp-analyzer-hooks.ts +++ b/app/features/comp-analyzer/comp-analyzer-hooks.ts @@ -43,6 +43,15 @@ export function useSelectedWeapons() { }); } +export function useSingleWeaponCombos() { + return useSearchParamStateEncoder({ + defaultValue: false, + name: "singleCombos", + revive: (value) => value === "true", + encode: (val) => String(val), + }); +} + export function useTargetSubDefenseAp() { return useSearchParamStateEncoder({ defaultValue: 0, diff --git a/app/features/comp-analyzer/components/DamageComboBar.module.css b/app/features/comp-analyzer/components/DamageComboBar.module.css index b09991340..279ce9a69 100644 --- a/app/features/comp-analyzer/components/DamageComboBar.module.css +++ b/app/features/comp-analyzer/components/DamageComboBar.module.css @@ -167,6 +167,13 @@ color: var(--color-text-high); } +.singleWeaponToggleRow { + display: flex; + padding-block-end: var(--s-3); + border-block-end: 1px solid var(--color-border); + margin-block-end: var(--s-1); +} + .filterControlsRow { display: flex; gap: var(--s-2); diff --git a/app/features/comp-analyzer/components/DamageComboBar.tsx b/app/features/comp-analyzer/components/DamageComboBar.tsx index bd2ea540b..4afd51853 100644 --- a/app/features/comp-analyzer/components/DamageComboBar.tsx +++ b/app/features/comp-analyzer/components/DamageComboBar.tsx @@ -1,5 +1,6 @@ import { useState } from "react"; import { useTranslation } from "react-i18next"; +import { SendouSwitch } from "~/components/elements/Switch"; import { Image, WeaponImage } from "~/components/Image"; import { MAX_AP } from "~/features/build-analyzer/analyzer-constants"; import { mainWeaponParams } from "~/features/build-analyzer/core/utils"; @@ -14,7 +15,11 @@ import { subWeaponImageUrl, } from "~/utils/urls"; import { LETHAL_DAMAGE } from "../comp-analyzer-constants"; -import { useTargetResAp, useTargetSubDefenseAp } from "../comp-analyzer-hooks"; +import { + useSingleWeaponCombos, + useTargetResAp, + useTargetSubDefenseAp, +} from "../comp-analyzer-hooks"; import type { DamageCombo, DamageSegment } from "../comp-analyzer-types"; import { calculateDamageCombos, @@ -268,6 +273,10 @@ export function DamageComboList({ weaponIds }: DamageComboListProps) { initialTargetSubDefenseAp, ); const [isCollapsed, setIsCollapsed] = useState(false); + const [singleWeaponCombos, setSingleWeaponCombos] = useSingleWeaponCombos(); + + const singleWeaponOnly = weaponIds.length === 1; + const includeSingleWeaponCombos = singleWeaponOnly || singleWeaponCombos; const allDamageKeys = getAllDamageKeys(weaponIds, targetSubDefenseAp); const allDamageKeyStrings = new Set(allDamageKeys.map(filterKeyToString)); @@ -279,9 +288,11 @@ export function DamageComboList({ weaponIds }: DamageComboListProps) { weaponIds, validExcludedKeys, targetSubDefenseAp, + undefined, + includeSingleWeaponCombos, ); - if (weaponIds.length < 2) { + if (weaponIds.length < 1) { return null; } @@ -357,6 +368,15 @@ export function DamageComboList({ weaponIds }: DamageComboListProps) { /> {targetResAp} AP +
+ + {t("analyzer:comp.singleWeaponCombos")} + +