@@ -180,6 +180,7 @@ type ReducedSim = {
180180}
181181
182182type GachaTarget = {
183+ id : string
183184 banner : Banner
184185 current : number
185186 target : number
@@ -189,8 +190,10 @@ type GachaTarget = {
189190 lostPity : number
190191}
191192
193+ let gtCounter = 0
192194function createDefaultTarget ( banner : Banner ) : GachaTarget {
193195 return {
196+ id : gtCounter ++ + Math . random ( ) . toString ( 36 ) . substring ( 2 , 15 ) ,
194197 banner,
195198 current : banner . minConst ,
196199 target : banner . maxConst ,
@@ -241,7 +244,7 @@ export default function GachaCalc({ location }: { location: string }) {
241244 < h1 className = "text-5xl font-bold pb-2" > Gacha rate calculator</ h1 >
242245
243246 < NumberInput label = "Pulls" set = { setPulls } value = { pulls } min = { 0 } max = { 1260 * gachaTargets . length } />
244- { gachaTargets . map ( ( gachaTarget , index ) => < div key = { index * 100 + gachaTargets . length } className = "bg-blend-multiply bg-slate-600 rounded-xl p-1 my-2" >
247+ { gachaTargets . map ( ( gachaTarget , index ) => < div key = { gachaTarget . id } className = "bg-blend-multiply bg-slate-600 rounded-xl p-1 my-2" >
245248 { gachaTargets . length > 1 &&
246249 < button className = "bg-red-700 text-slate-50 cursor-pointer text-center rounded-lg px-2 py-1 my-2 float-right"
247250 onClick = { ( ) =>
@@ -483,7 +486,7 @@ function GachaTargetInput({
483486
484487 const [ gachaName , setGacha ] = useState ( value . banner . bannerName )
485488
486- const banner = value . banner
489+ const banner = Object . values ( gachas ) . find ( ( x ) => x . bannerName == gachaName ) ?? Object . values ( gachas ) [ 0 ]
487490 useEffect ( ( ) => delayed ( ( ) => { if ( pity >= banner . maxPity ) setPity ( banner . maxPity - 1 ) } ) , [ banner , pity ] )
488491 useEffect ( ( ) => delayed ( ( ) => { if ( banner . guaranteedPity && guaranteedPity >= banner . guaranteedPity ) setGuaranteedPity ( banner . guaranteedPity ) } ) , [ banner , guaranteedPity ] )
489492 useEffect ( ( ) => delayed ( ( ) => { if ( Array . isArray ( banner . banner ) && lostPity >= banner . banner . length ) setLostPity ( banner . banner . length - 1 ) } ) , [ banner , lostPity ] )
@@ -494,7 +497,7 @@ function GachaTargetInput({
494497 useEffect ( ( ) => delayed ( ( ) => { if ( current >= target ) setCurrent ( target - 1 ) } ) , [ target , current ] )
495498
496499 useEffect ( ( ) => {
497- if ( gachaName != value . banner . bannerName ) { }
500+ if ( banner . bannerName != value . banner . bannerName ) { }
498501 else if ( current != value . current ) { }
499502 else if ( target != value . target ) { }
500503 else if ( pity != value . pity ) { }
@@ -504,15 +507,16 @@ function GachaTargetInput({
504507 else return
505508
506509 set ( {
507- banner : Object . values ( gachas ) . find ( ( x ) => x . bannerName == gachaName ) ?? Object . values ( gachas ) [ 0 ] ,
510+ id : value . id ,
511+ banner,
508512 current,
509513 target,
510514 pity,
511515 guaranteed,
512516 guaranteedPity,
513517 lostPity,
514518 } )
515- } , [ set , value , gachaName , current , target , pity , guaranteed , guaranteedPity , lostPity ] )
519+ } , [ set , value , banner , current , target , pity , guaranteed , guaranteedPity , lostPity ] )
516520 return (
517521 < >
518522 < SelectInput label = "Banner type" set = { ( g ) => {
0 commit comments