Flip derailer icon depending on the derailing direction

This commit is contained in:
dominik-korsa 2025-07-16 23:54:28 +02:00
parent 17435b829e
commit 4c4da95016
No known key found for this signature in database
GPG Key ID: 5A24D76EE0A30974
3 changed files with 25 additions and 2 deletions

View File

@ -5,9 +5,14 @@ export default function DerailerRenderer(props) {
const { object } = props;
const [x, y] = object.pos.toSVGCoords();
let icon_transform = `translate(-2.835, -2.835)`;
if (object.is_left) {
icon_transform = 'scale(-1, 1) ' + icon_transform;
}
return (
<g className="derailer" transform={`translate(${x}, ${y}) rotate(${object.rot.y})`}>
<g className="derailer-icon" transform={`translate(-2.835, -2.835)`}>
<g className="derailer-icon" transform={icon_transform}>
<ReactSVG
src={`${process.env.PUBLIC_URL}/assets/derailer.svg`}
wrapper='svg'

View File

@ -49,6 +49,7 @@ const Constants = {
signalElemsUnknownSignText: true,
connectTracksFailed: true,
routeInvalidSegment: true,
derailerUnknownDirection: true,
},
errors: {
invalidSceneryInfo: true

View File

@ -1,9 +1,16 @@
import TrackObject from './track-object';
import Vector3 from '../vector3';
import SceneryParserLog from "../scenery-parser-log";
export default class Derailer extends TrackObject {
type = "Derailer";
is_left;
constructor(id, prefab_name, pos, rot, track_id, name) {
super(id, prefab_name, pos, rot, track_id, name);
this.is_left = Derailer._isLeft(prefab_name);
}
getPrintableDerailerName() {
return this.name || "Derailer";
}
@ -14,6 +21,16 @@ export default class Derailer extends TrackObject {
return regex.test(prefabName);
}
static _isLeft(prefabName) {
const regex = /^wykolejnica(?!_(?:latarnia|belka)).*_([lr])(?:[_,].+)?$/;
const match = regex.exec(prefabName);
if (match === null) {
SceneryParserLog.warn('derailerUnknownDirection', `Failed to determine the direction of derailer: ${prefabName}`);
return false;
}
return match[1] === 'l';
}
static fromText(text) {
const values = text.split(";");
const obj = new Derailer(