@@ -71,13 +71,25 @@ export class VehicleViewModel
7171 private _isRefreshing ?: boolean ;
7272 private _onPlayerAction ?: IDisposable ;
7373 private _onGameTick ?: IDisposable ;
74+ private _missingRideEntity ?: ParkRide ;
7475
7576 constructor ( )
7677 {
77- this . _rides . subscribe ( r => updateSelectionOrNull ( this . _selectedRide , r ) ) ;
78- this . _trains . subscribe ( t => updateSelectionOrNull ( this . _selectedTrain , t ) ) ;
79- this . _vehicles . subscribe ( v => updateSelectionOrNull ( this . _selectedVehicle , v ) ) ;
80-
78+ this . _rides . subscribe ( r =>
79+ {
80+ Log . debug ( "rides.set():" , r ) ;
81+ updateSelectionOrNull ( this . _selectedRide , r ) ;
82+ } ) ;
83+ this . _trains . subscribe ( t =>
84+ {
85+ Log . debug ( "trains.set():" , t ) ;
86+ updateSelectionOrNull ( this . _selectedTrain , t ) ;
87+ } ) ;
88+ this . _vehicles . subscribe ( v =>
89+ {
90+ Log . debug ( "vehicles.set():" , v ) ;
91+ updateSelectionOrNull ( this . _selectedVehicle , v ) ;
92+ } ) ;
8193 this . _selectedVehicle . subscribe ( vehicle =>
8294 {
8395 cancelTools ( dragToolId ) ;
@@ -156,6 +168,7 @@ export class VehicleViewModel
156168 }
157169
158170 this . _selectedRide . set ( [ rides [ idx ] , idx ] ) ;
171+ this . _checkMissingRideEntry ( this . _missingRideEntity , rides ) ;
159172 }
160173
161174 /**
@@ -197,36 +210,65 @@ export class VehicleViewModel
197210 */
198211 _selectCar ( car : Car ) : void
199212 {
200- const
201- rides = this . _rides . get ( ) ,
202- carId = car . id ,
203- rideId = car . ride ,
204- carRideIndex = findIndex ( rides , r => r . _id === rideId ) ;
213+ const rides = this . _rides . get ( ) ;
214+ const carId = car . id ;
215+ const rideId = car . ride ;
216+ const carRideIndex = findIndex ( rides , r => r . _id === rideId ) ;
217+ const selectedRide = this . _selectedRide ;
218+ let trains : RideTrain [ ] ;
205219
206- if ( isNull ( carRideIndex ) )
220+ if ( isNull ( carRideIndex ) ) // Fallback for missing ride id.
207221 {
208- Log . debug ( "Could not find ride id" , rideId , "for selected entity id" , carId ) ;
209- return ;
222+ Log . debug ( "Could not find ride id" , rideId , "for selected entity id" , carId , ", adding special ride" ) ;
223+ const missingRide = this . _missingRideEntity ||= new ParkRide ( < never > {
224+ id : - 1 ,
225+ name : "(missing ride)" ,
226+ vehicles : [ ]
227+ } ) ;
228+ const missingRideIdx = rides . indexOf ( missingRide ) ;
229+ missingRide . _missing = true ;
230+
231+ if ( missingRideIdx === - 1 ) // Add to rides list, if not there yet.
232+ {
233+ this . _rides . set ( rides . concat ( missingRide ) ) ;
234+ selectedRide . set ( [ missingRide , rides . length ] ) ;
235+ }
236+ else // Else try to select it if not yet selected
237+ {
238+ const selected = selectedRide . get ( ) ;
239+ if ( ! selected || selected [ 0 ] !== missingRide )
240+ {
241+ selectedRide . set ( [ missingRide , missingRideIdx ] ) ;
242+ }
243+ }
244+
245+ trains = [ ] ;
210246 }
247+ else
248+ {
249+ this . _checkMissingRideEntry ( this . _missingRideEntity , rides ) ;
211250
212- this . _selectedRide . set ( [ rides [ carRideIndex ] , carRideIndex ] ) ;
251+ selectedRide . set ( [ rides [ carRideIndex ] , carRideIndex ] ) ;
252+ trains = this . _trains . get ( ) ;
213253
214- const trains = this . _trains . get ( ) ;
215- for ( let t = 0 ; t < trains . length ; t ++ )
216- {
217- const vehicles = trains [ t ] . _vehicles ( ) ;
218- for ( let v = 0 ; v < vehicles . length ; v ++ )
254+ for ( let t = 0 ; t < trains . length ; t ++ )
219255 {
220- if ( vehicles [ v ] . _id === carId )
256+ const vehicles = trains [ t ] . _vehicles ( ) ;
257+ for ( let v = 0 ; v < vehicles . length ; v ++ )
221258 {
222- this . _selectedTrain . set ( [ trains [ t ] , t ] ) ;
223- this . _selectedVehicle . set ( [ vehicles [ v ] , v ] ) ;
224- return ;
259+ if ( vehicles [ v ] . _id === carId )
260+ {
261+ this . _selectedTrain . set ( [ trains [ t ] , t ] ) ;
262+ this . _selectedVehicle . set ( [ vehicles [ v ] , v ] ) ;
263+ return ;
264+ }
225265 }
226266 }
267+
268+ Log . debug ( "Could not find vehicle entity id" , carId , "on ride id" , rideId , ", adding special train" ) ;
227269 }
228270
229- Log . debug ( "Could not find vehicle entity id" , carId , "on ride id" , rideId , ", adding special train" ) ;
271+ // Fallback for creating unknown train.
230272 const [ specialTrain , carIndex ] = createTrainFromAnyCar ( car ) ;
231273 const vehicle = specialTrain . _vehicles ( ) [ carIndex ] ;
232274
@@ -504,6 +546,18 @@ export class VehicleViewModel
504546
505547 Log . debug ( "<" , action , ">\n\t- type:" , event . type , "(client:" , event . isClientOnly , ")\n\t- args:" , JSON . stringify ( event . args ) , "\n\t- result:" , JSON . stringify ( event . result ) ) ;
506548 }
549+
550+ /**
551+ * Removes the missing ride entry if it is present in the rides list.
552+ */
553+ private _checkMissingRideEntry ( missingRide : ParkRide | undefined , rides : ParkRide [ ] ) : void
554+ {
555+ if ( missingRide && rides . indexOf ( missingRide ) != - 1 )
556+ {
557+ Log . debug ( "Clearing missing ride entry from rides list" ) ;
558+ this . _rides . set ( rides . filter ( ride => ride !== missingRide ) ) ;
559+ }
560+ }
507561}
508562
509563
@@ -519,7 +573,7 @@ function updateSelectionOrNull<T>(value: WritableStore<[T, number] | null>, item
519573 const selectedIdx = ( previous && previous [ 1 ] < items . length ) ? previous [ 1 ] : 0 ;
520574 selection = [ items [ selectedIdx ] , selectedIdx ] ;
521575 }
522- Log . debug ( "[ updateSelectionOrNull] => " , selection ) ;
576+ Log . debug ( "updateSelectionOrNull(): " , selection ) ;
523577 value . set ( selection ) ;
524578}
525579
0 commit comments