11import  {  useMemo  }  from  'react' ; 
22import  { 
33  useDriverCarIdx , 
4+   useSessionStore , 
45  useTelemetryValues , 
56}  from  '@irdashies/context' ; 
67import  {  useDriverStandings  }  from  './useDriverPositions' ; 
78
89export  const  useDriverRelatives  =  ( {  buffer } : {  buffer : number  } )  =>  { 
9-   const  carIdxEstTime  =  useTelemetryValues ( 'CarIdxEstTime' ) ; 
1010  const  drivers  =  useDriverStandings ( ) ; 
1111  const  carIdxLapDistPct  =  useTelemetryValues ( 'CarIdxLapDistPct' ) ; 
12+   const  carIdxLap  =  useTelemetryValues ( 'CarIdxLap' ) ; 
13+ 
1214  const  playerIndex  =  useDriverCarIdx ( ) ; 
15+   const  driverCarEstLapTime  =  useSessionStore ( 
16+     ( s )  =>  s . session ?. DriverInfo ?. DriverCarEstLapTime  ??  0 
17+   ) ; 
1318
1419  const  standings  =  useMemo ( ( )  =>  { 
15-     const  player  =  drivers . find ( ( d )  =>  d . carIdx  ===  playerIndex ) ; 
16-     if  ( ! player )  { 
17-       return  [ ] ; 
18-     } 
20+     const  calculateDelta  =  ( otherCarIdx : number )  =>  { 
21+       const  playerCarIdx  =  playerIndex  ??  0 ; 
1922
20-     const  driverEstLapTime  =  player . carClass . estLapTime  ??  0 ; 
23+       const  playerLapNum  =  carIdxLap ?. [ playerCarIdx ] ; 
24+       const  playerDistPct  =  carIdxLapDistPct ?. [ playerCarIdx ] ; 
2125
22-     const  calculateDelta  =  ( carIdx : number ,  isAhead : boolean )  =>  { 
23-       const  playerEstTime  =  carIdxEstTime ?. [ playerIndex  ??  0 ] ; 
24-       const  oppositionEstTime  =  carIdxEstTime ?. [ carIdx ] ; 
25-       const  opposition  =  drivers . find ( ( d )  =>  d . carIdx  ===  carIdx ) ; 
26+       const  otherLapNum  =  carIdxLap ?. [ otherCarIdx ] ; 
27+       const  otherDistPct  =  carIdxLapDistPct ?. [ otherCarIdx ] ; 
2628
27-       if  ( ! opposition )  { 
28-         return  0 ; 
29+       if  ( 
30+         playerLapNum  ===  undefined  ||  playerLapNum  <  0  || 
31+         playerDistPct  ===  undefined  ||  playerDistPct  <  0  ||  playerDistPct  >  1  || 
32+         otherLapNum  ===  undefined  ||  otherLapNum  <  0  || 
33+         otherDistPct  ===  undefined  ||  otherDistPct  <  0  ||  otherDistPct  >  1  || 
34+         driverCarEstLapTime  <=  0 
35+       )  { 
36+         return  NaN ; 
2937      } 
3038
31-       let  delta  =  ( oppositionEstTime  -  playerEstTime ) ; 
39+       let  distPctDifference  =  otherDistPct  -  playerDistPct ; 
3240
33-       if  ( isAhead )  { 
34-         // For cars ahead, use their lap time since they determine the full lap duration 
35-         while  ( delta  <  0 )  delta  +=  driverEstLapTime ; 
36-         while  ( delta  >  0.5  *  driverEstLapTime )  delta  -=  driverEstLapTime ; 
37-       }  else  { 
38-         // For cars behind, use player's lap time since we're measuring against our lap 
39-         while  ( delta  >  0 )  delta  -=  driverEstLapTime ; 
40-         while  ( delta  <  - 0.5  *  driverEstLapTime )  delta  +=  driverEstLapTime ; 
41+       if  ( distPctDifference  >  0.5 )  { 
42+         distPctDifference  -=  1.0 ; 
43+       }  else  if  ( distPctDifference  <  - 0.5 )  { 
44+         distPctDifference  +=  1.0 ; 
4145      } 
46+       
47+       const  timeDelta  =  distPctDifference  *  driverCarEstLapTime ; 
4248
43-       return  delta ; 
49+       return  timeDelta ; 
4450    } ; 
4551
4652    const  isHalfLapDifference  =  ( car1 : number ,  car2 : number )  =>  { 
47-       const  diff  =  ( car1  -  car2  +  1 )  %  1 ;   // Normalize the difference to [0, 1) 
53+       const  diff  =  ( car1  -  car2  +  1 )  %  1 ; 
4854      return  diff  <=  0.5 ; 
4955    } ; 
5056
@@ -60,7 +66,7 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
6066        } ) 
6167        . map ( ( result )  =>  ( { 
6268          ...result , 
63-           delta : calculateDelta ( result . carIdx ,   isAhead ) , 
69+           delta : calculateDelta ( result . carIdx ) , 
6470        } ) ) 
6571        . filter ( ( result )  =>  ( isAhead  ? result . delta  >  0  : result . delta  <  0 ) ) 
6672        . sort ( ( a ,  b )  =>  ( isAhead  ? a . delta  -  b . delta  : b . delta  -  a . delta ) ) 
@@ -69,14 +75,24 @@ export const useDriverRelatives = ({ buffer }: { buffer: number }) => {
6975    } ; 
7076
7177    const  carsAhead  =  filterAndMapDrivers ( true ) ; 
78+     const  player  =  drivers . find ( ( result )  =>  result . carIdx  ===  playerIndex ) ; 
7279    const  carsBehind  =  filterAndMapDrivers ( false ) ; 
7380
74-     const  relatives  =  [ ...carsAhead ,  {  ...player ,  delta : 0  } ,  ...carsBehind ] ; 
81+     if  ( ! player )  { 
82+       return  [ ] ; 
83+     } 
7584
76-     // TODO: remove pace car if not under caution or pacing 
85+     const   relatives   =   [ ... carsAhead ,   {  ... player ,   delta :  0   } ,  ... carsBehind ] ; 
7786
7887    return  relatives ; 
79-   } ,  [ drivers ,  buffer ,  carIdxEstTime ,  playerIndex ,  carIdxLapDistPct ] ) ; 
88+   } ,  [ 
89+     drivers , 
90+     buffer , 
91+     playerIndex , 
92+     driverCarEstLapTime , 
93+     carIdxLapDistPct , 
94+     carIdxLap , 
95+   ] ) ; 
8096
8197  return  standings ; 
8298} ; 
0 commit comments