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")} + +