Skip to content

Commit f40f1b6

Browse files
committed
Fix spin and XYZ not updating properly when synchronizing, limit spin to 0-31 visible frames
1 parent b0a43ce commit f40f1b6

File tree

4 files changed

+30
-11
lines changed

4 files changed

+30
-11
lines changed

src/objects/rideVehicle.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,12 @@ export class RideVehicle
116116
}
117117

118118
/**
119-
* Returns true if this car is considered a "spinning" ride type.
119+
* Returns the mask for getting spin frames if this car is considered a "spinning" ride type.
120120
*/
121-
_isSpinning(): boolean
121+
_getSpinFrames(): number
122122
{
123123
const type = this._type();
124-
return !!type && ((type.flags & CAR_ENTRY_FLAG_SPINNING) !== 0);
124+
// todo: OpenRCT2 only supports/reports 32 at the moment.
125+
return !!type && ((type.flags & CAR_ENTRY_FLAG_SPINNING) !== 0) ? 32 : 0;
125126
}
126127
}

src/services/vehicleEditor.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,14 +231,30 @@ function updateVehicleSetting(args: UpdateVehicleSettingArgs): void
231231
case massKey:
232232
case poweredAccelerationKey:
233233
case poweredMaxSpeedKey:
234+
{
235+
callback = (car): void =>
236+
{
237+
car[key] = <never>value;
238+
};
239+
break;
240+
}
234241
case xPosition:
235242
case yPosition:
236243
case zPosition:
244+
{
245+
callback = (car): void =>
246+
{
247+
car[key] += value;
248+
};
249+
break;
250+
}
237251
case spinKey:
238252
{
239253
callback = (car): void =>
240254
{
241-
car[key] = <never>value;
255+
// Spin does not support negative numbers and must be wrapped
256+
const result = car[key] + value;
257+
car[key] = (result < 0) ? (256 + result) : result;
242258
};
243259
break;
244260
}

src/ui/mainWindow.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { applyToTargets, CopyFilter, getTargets, getVehicleSettings } from "../s
77
import { changeSpacing, changeTrackProgress, setMass, setPositionX, setPositionY, setPositionZ, setPoweredAcceleration, setPoweredMaximumSpeed, setPrimaryColour, setReversed, setRideType, setSeatCount, setSecondaryColour, setSpin, setTertiaryColour, setVariant } from "../services/vehicleEditor";
88
import { VehicleSpan } from "../services/vehicleSpan";
99
import { isValidGameVersion } from "../services/versionChecker";
10+
import { floor } from "../utilities/math";
1011
import { VehicleViewModel } from "../viewmodels/vehicleViewModel";
1112
import { model as rideModel, rideWindow } from "./rideWindow";
1213
import { labelled, labelledSpinner, LabelledSpinnerParams, multiplier } from "./utilityControls";
@@ -353,32 +354,32 @@ const mainWindow = window({
353354
step: model._multiplier,
354355
value: model._x,
355356
format: model._formatPosition,
356-
onChange: value => model._modifyVehicle(setPositionX, value)
357+
onChange: (_, incr) => model._modifyVehicle(setPositionX, incr)
357358
}),
358359
positionSpinner({
359360
_label: { text: "Y position:" },
360361
disabled: model._isPositionDisabled,
361362
step: model._multiplier,
362363
value: model._y,
363364
format: model._formatPosition,
364-
onChange: value => model._modifyVehicle(setPositionY, value)
365+
onChange: (_, incr) => model._modifyVehicle(setPositionY, incr)
365366
}),
366367
positionSpinner({
367368
_label: { text: "Z position:" },
368369
disabled: model._isPositionDisabled,
369370
step: model._multiplier,
370371
value: model._z,
371372
format: model._formatPosition,
372-
onChange: value => model._modifyVehicle(setPositionZ, value)
373+
onChange: (_, incr) => model._modifyVehicle(setPositionZ, incr)
373374
}),
374375
labelSpinner({
375376
_label: { text: "Spin angle:" },
376377
minimum: 0,
377-
maximum: 255,
378+
maximum: compute(model._spinFrames, frames => frames > 0 ? frames - 1 : 0),
378379
disabled: model._isSpinDisabled,
379380
step: model._multiplier,
380-
value: model._spin,
381-
onChange: value => model._modifyVehicle(setSpin, value)
381+
value: compute(model._spin, model._spinFrames, (spin, frames) => floor((spin * frames) / 256)),
382+
onChange: (_, incr) => model._modifyVehicle(setSpin, floor((incr * 256) / model._spinFrames.get()))
382383
})
383384
]
384385
}),

src/viewmodels/vehicleViewModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class VehicleViewModel
4545
readonly _y = store<number>(0);
4646
readonly _z = store<number>(0);
4747
readonly _spin = store<number>(0);
48+
readonly _spinFrames = compute(this._selectedVehicle, this._type, this._variant, v => v ? v[0]._getSpinFrames() : 0);
4849

4950
readonly _primaryColour = store<Colour>(0);
5051
readonly _secondaryColour = store<Colour>(0);
@@ -55,7 +56,7 @@ export class VehicleViewModel
5556
readonly _isPicking = store<boolean>(false);
5657
readonly _isDragging = store<boolean>(false);
5758
readonly _isEditDisabled = compute(this._selectedVehicle, v => !v);
58-
readonly _isSpinDisabled = compute(this._selectedVehicle, v => !v || !v[0]._isSpinning());
59+
readonly _isSpinDisabled = compute(this._spinFrames, v => !v);
5960
readonly _isPositionDisabled = compute(this._isMoving, this._isEditDisabled, (m, e) => m || e);
6061
readonly _formatPosition = (pos: number): string => (this._isEditDisabled.get() ? "Not available" : pos.toString());
6162
readonly _multiplierIndex = store<number>(0);

0 commit comments

Comments
 (0)