Added SceneryInfo parsing

+Added scv (SceneryInfo) block parser and scenery format version check. If the block is invalid, an error is thrown, if the version is not 29, a warning is logged
+Added errors to SceneryParserLog
This commit is contained in:
izawartka 2025-06-09 14:32:38 +02:00
parent 6a9cba7630
commit 6ba732b304
4 changed files with 73 additions and 2 deletions

View File

@ -5,7 +5,8 @@ const Constants = {
}, },
parser: { parser: {
forceAutoSwitches: false, forceAutoSwitches: false,
logNewAutoSwitches: true logNewAutoSwitches: true,
sceneryInfoVersion: 29
}, },
warnings: { warnings: {
all: false, // enable all warnings all: false, // enable all warnings
@ -20,6 +21,10 @@ const Constants = {
switchInvalidDataFormat: true, switchInvalidDataFormat: true,
switchNoModel: true, switchNoModel: true,
signalBoxUndefinedPrefabName: true, signalBoxUndefinedPrefabName: true,
invalidSceneryInfoVersion: true,
},
errors: {
invalidSceneryInfo: true
}, },
layers: [ layers: [
{ {

33
src/model/scenery-info.js Normal file
View File

@ -0,0 +1,33 @@
export default class SceneryInfo {
name;
version;
description;
link;
author;
main_signalbox;
constructor(name, version, description, link, author, main_signalbox) {
Object.assign(this, {
name,
version,
description,
link,
author,
main_signalbox
});
}
static fromText(text) {
const values = text.split(";");
const sceneryInfo = new SceneryInfo(
values[1], // name
parseInt(values[2]), // version
values[3], // description
values[4], // link
values[5], // author
values[6] // main_signalbox
);
return sceneryInfo;
}
}

View File

@ -6,4 +6,8 @@ export default class SceneryParserLog {
console.warn(`[SceneryParserLog] ${message}`); console.warn(`[SceneryParserLog] ${message}`);
} }
static error(type, message) {
throw new Error(`[SceneryParserLog] ${message}`);
}
} }

View File

@ -7,9 +7,19 @@ import Route from './route';
import Misc from './misc'; import Misc from './misc';
import SceneryParserLog from './scenery-parser-log'; import SceneryParserLog from './scenery-parser-log';
import SignalBox from './signalbox'; import SignalBox from './signalbox';
import Constants from '../helpers/constants';
import SceneryInfo from './scenery-info';
/*
TODO: move parsers to another static class
TODO: add support for scenery info entries
TODO: add support for WorldRotation and WorldTranslation
TODO: check CameraHome and MainCamera
*/
export default class Scenery export default class Scenery
{ {
sceneryInfo = null; // SceneryInfo object
objects = {}; objects = {};
signalBoxes = []; signalBoxes = [];
spawnSignals = []; spawnSignals = [];
@ -25,8 +35,13 @@ export default class Scenery
const lines = scText.split("\n").map(line => line.trim()); const lines = scText.split("\n").map(line => line.trim());
const scenery = new Scenery(); const scenery = new Scenery();
lines.forEach(line => { lines.forEach((line, index) => {
if(!line?.length) return; if(!line?.length) return;
if(index === 0) {
this.sceneryInfo = Scenery._parseSceneryInfo(line);
return;
}
const object = Scenery._parseObject(line); const object = Scenery._parseObject(line);
if(!object) return; // skip null objects if(!object) return; // skip null objects
scenery.addObject(object); scenery.addObject(object);
@ -87,6 +102,20 @@ export default class Scenery
return this.trackAliases[idOrAlias] || idOrAlias; return this.trackAliases[idOrAlias] || idOrAlias;
} }
static _parseSceneryInfo(text) {
const infoHeader = text.split(";", 2)[0];
if(!infoHeader.startsWith("scv")) {
SceneryParserLog.error('invalidSceneryInfo', `Invalid scenery info header: ${infoHeader}`);
}
const version = parseInt(infoHeader.split("v")[1]);
if(version !== Constants.parser.sceneryInfoVersion) {
SceneryParserLog.warn('invalidSceneryInfoVersion', `Invalid scenery info version: ${version}. Expected: ${Constants.parser.sceneryInfoVersion}`);
}
return SceneryInfo.fromText(text);
}
static _parseObject(text) { static _parseObject(text) {
const type = text.split(";", 2)[0]; const type = text.split(";", 2)[0];
switch(type) { switch(type) {