From 374ce8b10284e5b786b5bd1262112762aec524f7 Mon Sep 17 00:00:00 2001 From: FI00ds <122728302+FI00ds@users.noreply.github.com> Date: Fri, 12 Jul 2024 01:28:12 +0200 Subject: [PATCH 01/16] generalise multiselect version of CharacterSelect --- .../optimizerTab/optimizerForm/CharacterSelect.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/optimizerTab/optimizerForm/CharacterSelect.tsx b/src/components/optimizerTab/optimizerForm/CharacterSelect.tsx index bb4a9b076..a604bdab1 100644 --- a/src/components/optimizerTab/optimizerForm/CharacterSelect.tsx +++ b/src/components/optimizerTab/optimizerForm/CharacterSelect.tsx @@ -35,7 +35,6 @@ const CharacterSelect: React.FC = ({ value, onChange, sele const [currentFilters, setCurrentFilters] = useState(Utils.clone(defaultFilters)) const characterOptions = useMemo(() => Utils.generateCharacterOptions(), []) const [selected, setSelected] = useState>(new Map()) - const excludedRelicPotentialCharacters = window.store((s) => s.excludedRelicPotentialCharacters) const labelledOptions: { value: string; label }[] = [] for (const option of characterOptions) { @@ -58,7 +57,7 @@ const CharacterSelect: React.FC = ({ value, onChange, sele setTimeout(() => inputRef?.current?.focus(), 100) if (multipleSelect) { - const newSelected = new Map(excludedRelicPotentialCharacters.map((characterId: string) => [characterId, true])) + const newSelected = new Map(value.map((characterId: string) => [characterId, true])) setSelected(newSelected) } } @@ -114,7 +113,7 @@ const CharacterSelect: React.FC = ({ value, onChange, sele allowClear maxTagCount={0} maxTagPlaceholder={() => ( - {excludedRelicPotentialCharacters.length ? `${excludedRelicPotentialCharacters.length} characters excluded` : 'All characters enabled'} + {value.length ? `${value.length} characters excluded` : 'All characters enabled'} )} onClear={() => { if (onChange) onChange(null) From c40009eb5ef36bee4196329d517f7b0b72aa52d8 Mon Sep 17 00:00:00 2001 From: FI00ds <122728302+FI00ds@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:06:10 +0200 Subject: [PATCH 02/16] add restriction control to relic modal --- src/components/RelicModal.tsx | 34 ++++++++++++++++++++++++++++++++- src/lib/db.js | 6 ++++++ src/lib/relicModalController.ts | 6 ++++++ src/types/Relic.d.ts | 6 ++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/components/RelicModal.tsx b/src/components/RelicModal.tsx index ec4acf037..33ff1a13c 100644 --- a/src/components/RelicModal.tsx +++ b/src/components/RelicModal.tsx @@ -1,5 +1,5 @@ import styled from 'styled-components' -import { Button, Flex, Form, Image, InputNumber, Modal, Radio, Select, theme } from 'antd' +import { Button, Flex, Form, Image, InputNumber, Modal, Radio, Select, Switch, theme } from 'antd' import React, { ReactElement, useEffect, useMemo, useState } from 'react' import { Constants } from 'lib/constants' import { HeaderText } from './HeaderText' @@ -15,6 +15,7 @@ import { calculateUpgradeValues, RelicForm, RelicUpgradeValues, validateRelic } import { CaretRightOutlined } from '@ant-design/icons' import { FormInstance } from 'antd/es/form/hooks/useForm' import { generateCharacterList } from 'lib/displayUtils' +import CharacterSelect from './optimizerTab/optimizerForm/CharacterSelect' const { useToken } = theme @@ -92,6 +93,8 @@ export default function RelicModal(props: { const equippedBy: string = Form.useWatch('equippedBy', relicForm) const [upgradeValues, setUpgradeValues] = useState([]) + const [restrictionList, setRestrictionList] = useState([]) + useEffect(() => { let defaultValues = { grade: 5, @@ -121,7 +124,10 @@ export default function RelicModal(props: { substatValue2: renderSubstat(relic, 2).value, substatType3: renderSubstat(relic, 3).stat, substatValue3: renderSubstat(relic, 3).value, + restrictionEnabled: relic.restriction.enabled, + restrictionList: relic.restriction.list, } + setRestrictionList(relic.restriction.list) } onValuesChange(defaultValues) relicForm.setFieldsValue(defaultValues) @@ -363,6 +369,32 @@ export default function RelicModal(props: { + + Restrict in Optimiser + + + { + const excludedCharacterIds = Array.from(x || new Map()) + .filter((entry) => entry[1] == true) + .map((entry) => entry[0]) + relicForm.setFieldValue('restrictionList', excludedCharacterIds) + setRestrictionList(excludedCharacterIds) + }} + multipleSelect={true} + /> + + + + + + diff --git a/src/lib/db.js b/src/lib/db.js index d730b7a7c..98c90510d 100644 --- a/src/lib/db.js +++ b/src/lib/db.js @@ -409,6 +409,12 @@ export const DB = { } else { relic.equippedBy = undefined } + if (!relic.restriction) { + relic.restriction = { + enabled: false, + list: [], + } + } } if (x.scoringMetadataOverrides) { diff --git a/src/lib/relicModalController.ts b/src/lib/relicModalController.ts index 25a44cbf8..9e6f68ce6 100644 --- a/src/lib/relicModalController.ts +++ b/src/lib/relicModalController.ts @@ -45,6 +45,8 @@ export type RelicForm = { substatValue2: number substatValue3: number equippedBy: string + restrictionEnabled: boolean + restrictionList: string[] } export function validateRelic(relicForm: RelicForm): Relic | void { @@ -170,6 +172,10 @@ export function validateRelic(relicForm: RelicForm): Relic | void { } relic.substats = substats RelicAugmenter.augment(relic) + relic.restriction = { + enabled: relicForm.restrictionEnabled, + list: relicForm.restrictionList, + } return relic } diff --git a/src/types/Relic.d.ts b/src/types/Relic.d.ts index eb8edfff4..a4423477b 100644 --- a/src/types/Relic.d.ts +++ b/src/types/Relic.d.ts @@ -21,6 +21,7 @@ export type Relic = { grade: RelicGrade id: GUID verified?: boolean + restriction?: RelicOptimizerRestriction main: { stat: MainStats @@ -50,3 +51,8 @@ export type Stat = { stat: string value: number } + +type RelicOptimizerRestriction = { + enabled: boolean + list: string[] +} From c1e34bf15abd004735610b9f6cebafec967f7e57 Mon Sep 17 00:00:00 2001 From: FI00ds <122728302+FI00ds@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:43:27 +0200 Subject: [PATCH 03/16] filter by restricted in relics tab --- src/components/RelicFilterBar.jsx | 14 +++++++++ src/components/RelicsTab.jsx | 48 +++++++++++++++++++++++++++++++ src/lib/db.js | 1 + src/lib/renderer.jsx | 14 ++++++++- src/types/store.ts | 1 + 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/components/RelicFilterBar.jsx b/src/components/RelicFilterBar.jsx index 3de9584f3..8b31aa87e 100644 --- a/src/components/RelicFilterBar.jsx +++ b/src/components/RelicFilterBar.jsx @@ -101,8 +101,18 @@ export default function RelicFilterBar(props) { }) } + function generateRestrictedTags(arr) { + return arr.map((x) => { + return { + key: x, + display: Renderer.renderFilter(x), + } + }) + } + const gradeData = generateGradeTags([2, 3, 4, 5]) const verifiedData = generateVerifiedTags([false, true]) + const restrictedData = generateRestrictedTags([false, true]) const setsData = generateImageTags(Object.values(Constants.SetsRelics).concat(Object.values(Constants.SetsOrnaments)).filter((x) => !UnreleasedSets[x]), (x) => Assets.getSetImage(x, Constants.Parts.PlanarSphere), true) const partsData = generateImageTags(Object.values(Constants.Parts), (x) => Assets.getPart(x), false) @@ -225,6 +235,10 @@ export default function RelicFilterBar(props) { Verified + + Restricted + + Clear