diff --git a/libs/pando/engine/src/tag/dedup.ts b/libs/pando/engine/src/tag/dedup.ts index d283c64492..0cb8b204df 100644 --- a/libs/pando/engine/src/tag/dedup.ts +++ b/libs/pando/engine/src/tag/dedup.ts @@ -15,7 +15,7 @@ export class DedupTags { } /** Object associated with `tag` */ - at(tag: Tag): DedupTag { + at(tag: Tag): Leaf { const id = this.keys.get(tag) const cur = id.reduce((cur, id) => cur.child(id), this.root) if (!cur.leaf) cur.leaf = new Leaf(tag, id, this.keys, cur) diff --git a/libs/pando/ui-sheet/src/types/field.ts b/libs/pando/ui-sheet/src/types/field.ts index 07ff71d33a..6f82abf447 100644 --- a/libs/pando/ui-sheet/src/types/field.ts +++ b/libs/pando/ui-sheet/src/types/field.ts @@ -20,3 +20,7 @@ export type TextField = { } export type Field = TagField | TextField + +export function isTagField(field: Field): field is TagField { + return 'fieldRef' in field +} diff --git a/libs/sr/consts/src/relic.ts b/libs/sr/consts/src/relic.ts index 43ac97b7af..111971c19b 100644 --- a/libs/sr/consts/src/relic.ts +++ b/libs/sr/consts/src/relic.ts @@ -75,7 +75,15 @@ export const allRelicSubStatKeys = [ 'brEffect_', ] as const export type RelicSubStatKey = (typeof allRelicSubStatKeys)[number] - +export const allElementalDmgMainStatKeys = [ + 'physical_dmg_', + 'fire_dmg_', + 'ice_dmg_', + 'lightning_dmg_', + 'wind_dmg_', + 'quantum_dmg_', + 'imaginary_dmg_', +] as const export const allRelicMainStatKeys = [ 'hp', 'atk', @@ -87,16 +95,11 @@ export const allRelicMainStatKeys = [ 'heal_', 'eff_', 'spd', - 'physical_dmg_', - 'fire_dmg_', - 'ice_dmg_', - 'lightning_dmg_', - 'wind_dmg_', - 'quantum_dmg_', - 'imaginary_dmg_', + ...allElementalDmgMainStatKeys, 'brEffect_', 'enerRegen_', ] as const + export type RelicMainStatKey = (typeof allRelicMainStatKeys)[number] export const allRelicRarityKeys = [2, 3, 4, 5] as const @@ -142,3 +145,8 @@ export const relicSlotToMainStatKeys: Record = ], rope: ['hp_', 'atk_', 'def_', 'brEffect_', 'enerRegen_'], } + +export const allRelicMainSubStatKeys = Array.from( + new Set([...allRelicSubStatKeys, ...allRelicMainStatKeys] as const) +) +export type RelicMainSubStatKey = (typeof allRelicMainSubStatKeys)[number] diff --git a/libs/sr/formula-ui/src/char/index.ts b/libs/sr/formula-ui/src/char/index.ts index c64f2ab526..cdadd3aad5 100644 --- a/libs/sr/formula-ui/src/char/index.ts +++ b/libs/sr/formula-ui/src/char/index.ts @@ -1,2 +1,4 @@ export * from './consts' export * from './sheets' +export * from './tagFieldMap' +export * from './util' diff --git a/libs/sr/formula-ui/src/char/sheets/CharBase.tsx b/libs/sr/formula-ui/src/char/sheets/CharBase.tsx new file mode 100644 index 0000000000..a8ef04e16c --- /dev/null +++ b/libs/sr/formula-ui/src/char/sheets/CharBase.tsx @@ -0,0 +1,33 @@ +import type { TagField } from '@genshin-optimizer/pando/ui-sheet' +import type { ElementalTypeKey } from '@genshin-optimizer/sr/consts' +import { + allElementalDmgMainStatKeys, + allRelicMainSubStatKeys, +} from '@genshin-optimizer/sr/consts' +import type { Tag } from '@genshin-optimizer/sr/formula' +import { own } from '@genshin-optimizer/sr/formula' +import { RelicStatWithUnit } from '@genshin-optimizer/sr/ui' + +export const charBaseUiSheet: TagField[] = allRelicMainSubStatKeys.map( + (statKey) => { + if ( + allElementalDmgMainStatKeys.includes( + statKey as (typeof allElementalDmgMainStatKeys)[number] + ) + ) { + const tag = { + ...own.final.dmg_, + elementalType: statKey.slice(0, -5) as ElementalTypeKey, + } as Tag + return { + title: , + fieldRef: tag, + } as TagField + } + console.log({ statKey }) + return { + fieldRef: own.final[statKey as keyof typeof own.final].tag as Tag, + title: , + } + } +) diff --git a/libs/sr/formula-ui/src/char/tagFieldMap.ts b/libs/sr/formula-ui/src/char/tagFieldMap.ts new file mode 100644 index 0000000000..4855254590 --- /dev/null +++ b/libs/sr/formula-ui/src/char/tagFieldMap.ts @@ -0,0 +1,31 @@ +import { + compileTagMapValues, + TagMapSubset, +} from '@genshin-optimizer/pando/engine' +import type { TagField } from '@genshin-optimizer/pando/ui-sheet' +import { isTagField } from '@genshin-optimizer/pando/ui-sheet' +import type { Tag } from '@genshin-optimizer/sr/formula' +import { keys } from '@genshin-optimizer/sr/formula' +import { uiSheets } from './sheets' + +const tagValue: Array<{ tag: Tag; value: TagField }> = [] +Object.values(uiSheets).forEach((sheet) => { + Object.values(sheet).forEach(({ documents }) => { + documents.forEach((document) => { + if (document.type === 'fields') + document.fields.forEach((field) => { + if (!isTagField(field)) return + tagValue.push({ tag: field.fieldRef, value: field }) + }) + }) + }) +}) + +//TODO: This breaks? wtf? +// charBaseUiSheet.forEach((field) => { +// tagValue.push({ tag: field.fieldRef, value: field }) +// }) +export const tagFieldMap = new TagMapSubset( + keys, + compileTagMapValues(keys, tagValue) +) diff --git a/libs/sr/formula-ui/src/char/util.ts b/libs/sr/formula-ui/src/char/util.ts new file mode 100644 index 0000000000..a964c43c56 --- /dev/null +++ b/libs/sr/formula-ui/src/char/util.ts @@ -0,0 +1,23 @@ +import type { DamageType, Tag } from '@genshin-optimizer/sr/formula' + +export function getVariant(tag: Tag) { + const { qt, q, elementalType } = tag + if (qt === 'prep' && q === 'heal') return 'heal' + else if (isDmg(tag)) { + if (elementalType) return elementalType + } + return +} +export function isDmg(tag: Tag) { + const { q } = tag + return q === 'dmg' +} + +export function getDmgType(tag: Tag) { + const { damageType1, damageType2 } = tag + const dmgType: Array = [] + if (!isDmg(tag)) return [] + if (damageType1) dmgType.push(damageType1) + if (damageType2) dmgType.push(damageType2) + return dmgType +} diff --git a/libs/sr/formula/src/index.ts b/libs/sr/formula/src/index.ts index c7035ad2e0..93472607c1 100644 --- a/libs/sr/formula/src/index.ts +++ b/libs/sr/formula/src/index.ts @@ -11,6 +11,7 @@ export type { SrcCondInfo } from './calculator' export * from './data/util' export * from './meta' export * from './util' +export { keys } export function srCalculatorWithValues(extras: TagMapEntries) { return srCalculatorWithEntries( diff --git a/libs/sr/ui/src/Optimization/OptimizationTargetEditorList.tsx b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/OptimizationTargetEditorList.tsx similarity index 100% rename from libs/sr/ui/src/Optimization/OptimizationTargetEditorList.tsx rename to libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/OptimizationTargetEditorList.tsx diff --git a/libs/sr/ui/src/Optimization/OptimizationTargetSelector.tsx b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/OptimizationTargetSelector.tsx similarity index 52% rename from libs/sr/ui/src/Optimization/OptimizationTargetSelector.tsx rename to libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/OptimizationTargetSelector.tsx index 7a742ffaf2..64ea74019c 100644 --- a/libs/sr/ui/src/Optimization/OptimizationTargetSelector.tsx +++ b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/OptimizationTargetSelector.tsx @@ -1,8 +1,17 @@ -import { DropdownButton } from '@genshin-optimizer/common/ui' +import { + ColorText, + DropdownButton, + SqBadge, +} from '@genshin-optimizer/common/ui' import type { Read } from '@genshin-optimizer/sr/formula' import { own } from '@genshin-optimizer/sr/formula' -import { useSrCalcContext } from '@genshin-optimizer/sr/formula-ui' -import { MenuItem } from '@mui/material' +import { + getDmgType, + getVariant, + tagFieldMap, + useSrCalcContext, +} from '@genshin-optimizer/sr/formula-ui' +import { Box, ListItemText, MenuItem } from '@mui/material' import { useTranslation } from 'react-i18next' export function OptimizationTargetSelector({ @@ -25,7 +34,19 @@ export function OptimizationTargetSelector({ key={`${index}_${read.tag.name || read.tag.q}`} onClick={() => setOptTarget(read)} > - {read.tag.name || read.tag.q} + + + {tagFieldMap.subset(read.tag)[0]?.title || + read.tag.name || + read.tag.q} + + + {/* Show DMG type */} + + {getDmgType(read.tag).map((dmgType) => ( + {dmgType} + ))} + ))} diff --git a/libs/sr/ui/src/Optimization/StatFilterCard.tsx b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/StatFilterCard.tsx similarity index 100% rename from libs/sr/ui/src/Optimization/StatFilterCard.tsx rename to libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/StatFilterCard.tsx diff --git a/libs/sr/ui/src/Optimization/WorkerSelector.tsx b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/WorkerSelector.tsx similarity index 100% rename from libs/sr/ui/src/Optimization/WorkerSelector.tsx rename to libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/WorkerSelector.tsx diff --git a/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/index.tsx b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/index.tsx index 9f6f78a402..220388a34b 100644 --- a/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/index.tsx +++ b/libs/sr/page-team/src/TeammateDisplay/Tabs/Optimize/index.tsx @@ -5,13 +5,7 @@ import type { Read } from '@genshin-optimizer/sr/formula' import { useSrCalcContext } from '@genshin-optimizer/sr/formula-ui' import type { BuildResult, ProgressResult } from '@genshin-optimizer/sr/solver' import { MAX_BUILDS, Solver } from '@genshin-optimizer/sr/solver' -import { - BuildDisplay, - OptimizationTargetSelector, - StatFilterCard, - WorkerSelector, - useDatabaseContext, -} from '@genshin-optimizer/sr/ui' +import { BuildDisplay, useDatabaseContext } from '@genshin-optimizer/sr/ui' import CloseIcon from '@mui/icons-material/Close' import TrendingUpIcon from '@mui/icons-material/TrendingUp' import { @@ -24,6 +18,9 @@ import { } from '@mui/material' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' +import { OptimizationTargetSelector } from './OptimizationTargetSelector' +import { StatFilterCard } from './StatFilterCard' +import { WorkerSelector } from './WorkerSelector' export default function Optimize() { const { t } = useTranslation('optimize') diff --git a/libs/sr/theme/src/Theme.tsx b/libs/sr/theme/src/Theme.tsx index 09c97983f9..f529989608 100644 --- a/libs/sr/theme/src/Theme.tsx +++ b/libs/sr/theme/src/Theme.tsx @@ -12,6 +12,7 @@ declare module '@mui/material/styles' { quantum: Palette['primary'] wind: Palette['primary'] orange: Palette['primary'] + heal: Palette['primary'] } interface PaletteOptions { @@ -23,6 +24,7 @@ declare module '@mui/material/styles' { quantum?: PaletteOptions['primary'] wind?: PaletteOptions['primary'] orange?: Palette['primary'] + heal?: Palette['primary'] } } @@ -35,6 +37,7 @@ declare module '@mui/material/Button' { physical: true quantum: true wind: true + heal: true } } @@ -47,6 +50,7 @@ declare module '@mui/material/Chip' { physical: true quantum: true wind: true + heal: true } } @@ -59,6 +63,7 @@ declare module '@mui/material/InputBase' { physical: true quantum: true wind: true + heal: true } } @@ -110,5 +115,9 @@ export const theme = createTheme({ color: { main: '#f29e38', contrastText: '#fff' }, name: 'orange', }), + heal: commonTheme.palette.augmentColor({ + color: { main: '#c0e86c' }, + name: 'heal', + }), }, }) diff --git a/libs/sr/ui/src/Optimization/index.tsx b/libs/sr/ui/src/Optimization/index.tsx deleted file mode 100644 index ac752e9caf..0000000000 --- a/libs/sr/ui/src/Optimization/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -export * from './OptimizationTargetEditorList' -export * from './OptimizationTargetSelector' -export * from './StatFilterCard' -export * from './WorkerSelector' diff --git a/libs/sr/ui/src/Relic/RelicEditor/index.tsx b/libs/sr/ui/src/Relic/RelicEditor/index.tsx index 53fa20f5a7..76eac1a27a 100644 --- a/libs/sr/ui/src/Relic/RelicEditor/index.tsx +++ b/libs/sr/ui/src/Relic/RelicEditor/index.tsx @@ -1 +1,2 @@ export * from './RelicEditor' +export * from './RelicStatKeyDisplay' diff --git a/libs/sr/ui/src/index.tsx b/libs/sr/ui/src/index.tsx index 87e71dabe8..e045de77c4 100644 --- a/libs/sr/ui/src/index.tsx +++ b/libs/sr/ui/src/index.tsx @@ -2,7 +2,6 @@ export * from './Character' export * from './Context' export * from './Hook' export * from './LightCone' -export * from './Optimization' export * from './Provider' export * from './Relic' export * from './Settings'