Skip to content

Commit

Permalink
ZO add advanced Set Filters (#2654)
Browse files Browse the repository at this point in the history
* ZO add advanced Set Filters

* minor styling

* fixes
  • Loading branch information
frzyc authored Jan 31, 2025
1 parent 7627ec7 commit dd08f03
Show file tree
Hide file tree
Showing 13 changed files with 557 additions and 280 deletions.
23 changes: 23 additions & 0 deletions libs/common/util/src/lib/object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,3 +247,26 @@ export function objFindValue<K extends string, V extends string>(
): K | undefined {
return Object.keys(obj).find((k) => obj[k as K] === value) as K | undefined
}

/**
* Returns a new object that is the sum of `a` and `b`
*/
export function objSum(
a: Record<string, number>,
b: Record<string, number>
): Record<string, number> {
const sum = { ...a }
for (const k in b) sum[k] = (sum[k] ?? 0) + b[k]
return sum
}

/**
* Apply obj `add` to the `base` object
*/
export function objSumInPlace(
base: Record<string, number>,
add: Record<string, number>
): Record<string, number> {
for (const k in add) base[k] = (base[k] ?? 0) + add[k]
return base
}
14 changes: 14 additions & 0 deletions libs/zzz/db/src/Database/DataManagers/CharacterDataManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import { clamp, objFilter, validateArr } from '@genshin-optimizer/common/util'
import type {
CharacterKey,
DiscMainStatKey,
DiscSetKey,
FormulaKey,
WengineKey,
} from '@genshin-optimizer/zzz/consts'
import {
allCharacterKeys,
allDiscSetKeys,
allFormulaKeys,
allWengineKeys,
discSlotToMainStatKeys,
Expand All @@ -32,6 +34,8 @@ export type CharacterData = {
slot6: DiscMainStatKey[]
levelLow: number
levelHigh: number
setFilter2: DiscSetKey[]
setFilter4: DiscSetKey[]
}

function initialCharacterData(key: CharacterKey): CharacterData {
Expand All @@ -53,6 +57,8 @@ function initialCharacterData(key: CharacterKey): CharacterData {
slot6: [...discSlotToMainStatKeys['6']],
levelLow: 15,
levelHigh: 15,
setFilter2: [],
setFilter4: [],
}
}
export class CharacterDataManager extends DataManager<
Expand Down Expand Up @@ -81,6 +87,8 @@ export class CharacterDataManager extends DataManager<
slot6,
levelLow,
levelHigh,
setFilter2,
setFilter4,
} = obj as CharacterData

if (!allCharacterKeys.includes(characterKey)) return undefined // non-recoverable
Expand Down Expand Up @@ -122,6 +130,10 @@ export class CharacterDataManager extends DataManager<

if (typeof levelHigh !== 'number') levelHigh = 15
levelHigh = clamp(levelHigh, 0, 15)

setFilter2 = validateArr(setFilter2, allDiscSetKeys, [])
setFilter4 = validateArr(setFilter4, allDiscSetKeys, [])

const char: CharacterData = {
key: characterKey,
level,
Expand All @@ -137,6 +149,8 @@ export class CharacterDataManager extends DataManager<
slot6,
levelLow,
levelHigh,
setFilter2,
setFilter4,
}
return char
}
Expand Down
4 changes: 2 additions & 2 deletions libs/zzz/page-optimize/src/BuildsDisplay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { LocationKey } from '@genshin-optimizer/zzz/consts'
import type { Stats } from '@genshin-optimizer/zzz/db'
import { useDatabaseContext, useDisc } from '@genshin-optimizer/zzz/db-ui'
import type { BuildResult } from '@genshin-optimizer/zzz/solver'
import { convertDiscToStats, getSum } from '@genshin-optimizer/zzz/solver'
import { applyCalc, convertDiscToStats } from '@genshin-optimizer/zzz/solver'
import { DiscCard } from '@genshin-optimizer/zzz/ui'
import { Box, Button, CardContent, Stack, Typography } from '@mui/material'
import { useCallback, useMemo } from 'react'
Expand Down Expand Up @@ -48,7 +48,7 @@ function Build({
const { database } = useDatabaseContext()
const sum = useMemo(
() =>
getSum(
applyCalc(
baseStats,
Object.values(build.discIds)
.map((d) => database.discs.get(d))
Expand Down
10 changes: 10 additions & 0 deletions libs/zzz/page-optimize/src/CharacterContext.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { CharacterData } from '@genshin-optimizer/zzz/db'
import { createContext, useContext } from 'react'

export const CharacterContext = createContext(
undefined as CharacterData | undefined
)

export function useCharacterContext() {
return useContext(CharacterContext)
}
3 changes: 2 additions & 1 deletion libs/zzz/page-optimize/src/LevelFilter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ export const LevelFilter = memo(function LevelFilter({
<CardThemed bgt="light">
<CardContent sx={{ display: 'flex', gap: 1 }}>
<Typography sx={{ fontWeight: 'bold' }}>
Artifact Level Filter
Disc Level Filter
{/* TODO: Translate */}
{/* {t('levelFilter')} */}
</Typography>
</CardContent>
Expand Down
Loading

0 comments on commit dd08f03

Please sign in to comment.