@@ -10,7 +10,7 @@ import {
10
10
import { Popover2 } from '@blueprintjs/popover2'
11
11
12
12
import clsx from 'clsx'
13
- import { useSetAtom } from 'jotai'
13
+ import { useAtom , useSetAtom } from 'jotai'
14
14
import { clamp } from 'lodash-es'
15
15
import { FC , memo } from 'react'
16
16
@@ -34,7 +34,7 @@ import { SortableItemProps } from '../../dnd'
34
34
import { DetailedSelect } from '../../editor/DetailedSelect'
35
35
import { NumericInput2 } from '../../editor/NumericInput2'
36
36
import { OperatorAvatar } from '../../editor/operator/EditorOperator'
37
- import { EditorOperator , useEdit } from '../editor-state'
37
+ import { EditorOperator , editorAtoms , useEdit } from '../editor-state'
38
38
import { editorFavOperatorsAtom } from '../reconciliation'
39
39
40
40
interface OperatorItemProps extends Partial < SortableItemProps > {
@@ -64,17 +64,16 @@ export const OperatorItem: FC<OperatorItemProps> = memo(
64
64
} ) => {
65
65
const t = useTranslation ( )
66
66
const edit = useEdit ( )
67
+ const [ skillLevels , setSkillLevels ] = useAtom (
68
+ editorAtoms . skillLevelOverrides ( operator . id ) ,
69
+ )
67
70
const setFavOperators = useSetAtom ( editorFavOperatorsAtom )
68
71
const info = OPERATORS . find ( ( { name } ) => name === operator . name )
69
72
const skillCount = info ? getSkillCount ( info ) : 3
70
73
const requirements = withDefaultRequirements (
71
74
operator . requirements ,
72
75
info ?. rarity ,
73
76
)
74
- const detailedSkills = Array . from ( { length : skillCount } , ( _ , index ) => ( {
75
- available : index <= requirements . elite ,
76
- defaultLevel : getDefaultRequirements ( info ?. rarity ) . skillLevel ,
77
- } ) )
78
77
const controlsEnabled = ! onOverlay && ! isDragging && ! isSorting
79
78
80
79
return (
@@ -307,13 +306,16 @@ export const OperatorItem: FC<OperatorItemProps> = memo(
307
306
308
307
< ul className = "w-8 grid grid-rows-4 gap-1 ml-1 mt-1" >
309
308
{ controlsEnabled &&
310
- detailedSkills . map ( ( { defaultLevel, available } , index ) => {
309
+ Array . from ( { length : skillCount } , ( _ , index ) => {
310
+ const available = index <= requirements . elite
311
311
const skillNumber = index + 1
312
312
const selected = operator . skill === skillNumber
313
+ const maxSkillLevel = requirements . elite === 2 ? 10 : 7
313
314
const skillLevel = selected
314
315
? requirements . skillLevel
315
- : defaultLevel
316
- const maxLevel = requirements . elite === 2 ? 10 : 7
316
+ : skillLevels [ skillNumber ] ??
317
+ getDefaultRequirements ( info ?. rarity ) . skillLevel
318
+
317
319
return (
318
320
< li
319
321
key = { index }
@@ -343,7 +345,15 @@ export const OperatorItem: FC<OperatorItemProps> = memo(
343
345
onFocus = { ( ) => {
344
346
if ( operator . skill !== skillNumber ) {
345
347
edit ( ( ) => {
346
- onChange ?.( { ...operator , skill : skillNumber } )
348
+ onChange ?.( {
349
+ ...operator ,
350
+ skill : skillNumber ,
351
+ requirements : {
352
+ ...operator . requirements ,
353
+ // override with the current skill level
354
+ skillLevel,
355
+ } ,
356
+ } )
347
357
return {
348
358
action : 'set-operator-skill' ,
349
359
desc : i18n . actions . editor2 . set_operator_skill ,
@@ -362,8 +372,12 @@ export const OperatorItem: FC<OperatorItemProps> = memo(
362
372
if ( newLevel === 0 ) {
363
373
newLevel = 10
364
374
}
365
- newLevel = clamp ( newLevel , 1 , maxLevel )
375
+ newLevel = clamp ( newLevel , 1 , maxSkillLevel )
366
376
377
+ setSkillLevels ( ( prev ) => ( {
378
+ ...prev ,
379
+ [ skillNumber ] : newLevel ,
380
+ } ) )
367
381
onChange ?.( {
368
382
...operator ,
369
383
requirements : {
@@ -381,15 +395,20 @@ export const OperatorItem: FC<OperatorItemProps> = memo(
381
395
onWheelFocused = { ( e ) => {
382
396
e . preventDefault ( )
383
397
edit ( ( ) => {
398
+ const newLevel = clamp (
399
+ requirements . skillLevel + ( e . deltaY > 0 ? - 1 : 1 ) ,
400
+ 1 ,
401
+ maxSkillLevel ,
402
+ )
403
+ setSkillLevels ( ( prev ) => ( {
404
+ ...prev ,
405
+ [ skillNumber ] : newLevel ,
406
+ } ) )
384
407
onChange ?.( {
385
408
...operator ,
386
409
requirements : {
387
410
...operator . requirements ,
388
- skillLevel : clamp (
389
- requirements . skillLevel + ( e . deltaY > 0 ? - 1 : 1 ) ,
390
- 1 ,
391
- maxLevel ,
392
- ) ,
411
+ skillLevel : newLevel ,
393
412
} ,
394
413
} )
395
414
return {
0 commit comments