Skip to content

Commit b729e50

Browse files
committed
Allow selection of vehicles with invalid ride, disable edit ride button when nothing is selected
1 parent 46e7ac8 commit b729e50

File tree

6 files changed

+92
-33
lines changed

6 files changed

+92
-33
lines changed

src/objects/parkRide.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export class ParkRide
2626
private _rideObj?: Ride | null;
2727
private _trainsObj?: RideTrain[] | null;
2828

29+
_missing?: boolean;
30+
2931

3032
/**
3133
* Creates a new park ride object.

src/objects/rideTrain.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ export function createTrainFromAnyCar(car: Car): [RideTrain, number]
3636
}
3737
vehicles.push(new RideVehicle(currentCar));
3838
}
39-
return [new RideTrain(vehicles, true), carIndex];
39+
40+
const train = new RideTrain(vehicles);
41+
train._special = true;
42+
return [train, carIndex];
4043
}
4144

4245

@@ -46,9 +49,9 @@ export function createTrainFromAnyCar(car: Car): [RideTrain, number]
4649
export class RideTrain
4750
{
4851
readonly _carId: number;
49-
readonly _special?: boolean;
5052
private _rideVehicles?: RideVehicle[] | null;
5153

54+
_special?: boolean;
5255

5356
/**
5457
* Creates a new train for a ride.
@@ -57,9 +60,9 @@ export class RideTrain
5760
* @param special Sets it as a special hidden train, which does not show up in
5861
* the regular ride window (like Giga lifthill entities).
5962
*/
60-
constructor(frontCarId: number, special?: boolean);
61-
constructor(vehicles: RideVehicle[], special?: boolean);
62-
constructor(param: number | RideVehicle[], special?: boolean)
63+
constructor(frontCarId: number);
64+
constructor(vehicles: RideVehicle[]);
65+
constructor(param: number | RideVehicle[])
6366
{
6467
if (isNumber(param))
6568
{
@@ -73,7 +76,6 @@ export class RideTrain
7376
this._carId = param[0]._id;
7477
this._rideVehicles = param;
7578
}
76-
this._special = special;
7779
}
7880

7981

@@ -126,4 +128,4 @@ export class RideTrain
126128
Log.assert(0 <= index && index < vehicles.length, "Vehicle index", index, "out of range for train of length", vehicles.length);
127129
return vehicles[index];
128130
}
129-
}
131+
}

src/services/actions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function register<T>(name: string, action: Action<T>): Action<T>
2222
registeredActions[name] = action;
2323
return (args: T): void =>
2424
{
25-
Log.debug("Execute action", name, "with args:", JSON.stringify(args));
25+
Log.debug("[EXECUTE]", name, "with args:", JSON.stringify(args));
2626
context.executeAction(name, <never>args);
2727
};
2828
}

src/ui/mainWindow.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ const mainWindow = window({
6969
tooltip: "Changes properties of the ride, that are not related to its vehicles.",
7070
width: 100,
7171
height: 14,
72+
disabled: compute(model._selectedRide, r => !r || !!r[0]._missing),
7273
onClick: () =>
7374
{
7475
const ride = model._selectedRide.get();

src/utilities/logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const isDuktapeAvailable = (typeof Duktape !== "undefined");
2222
function print(level: LogLevel, messages: unknown[]): void
2323
{
2424
const message = messages
25-
.map(v => (Array.isArray(v) ? `[${v}]` : typeof v == "object" ? Duktape.enc('jx', v) : v))
25+
.map(v => typeof v === "string" ? v : Duktape.enc('jx', v))
2626
.join(" ");
2727

2828
console.log(`\x1b[1;33m<RVE/${level}>\x1b[37m ${message}`);

src/viewmodels/vehicleViewModel.ts

Lines changed: 78 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)