From 6ba732b304cead56fe6c599c72802743836114c3 Mon Sep 17 00:00:00 2001 From: izawartka <59137928+izawartka@users.noreply.github.com> Date: Mon, 9 Jun 2025 14:32:38 +0200 Subject: [PATCH] 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 --- src/helpers/constants.js | 7 ++++++- src/model/scenery-info.js | 33 +++++++++++++++++++++++++++++++++ src/model/scenery-parser-log.js | 4 ++++ src/model/scenery.js | 31 ++++++++++++++++++++++++++++++- 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/model/scenery-info.js diff --git a/src/helpers/constants.js b/src/helpers/constants.js index 7a207e0..37b77b8 100644 --- a/src/helpers/constants.js +++ b/src/helpers/constants.js @@ -5,7 +5,8 @@ const Constants = { }, parser: { forceAutoSwitches: false, - logNewAutoSwitches: true + logNewAutoSwitches: true, + sceneryInfoVersion: 29 }, warnings: { all: false, // enable all warnings @@ -20,6 +21,10 @@ const Constants = { switchInvalidDataFormat: true, switchNoModel: true, signalBoxUndefinedPrefabName: true, + invalidSceneryInfoVersion: true, + }, + errors: { + invalidSceneryInfo: true }, layers: [ { diff --git a/src/model/scenery-info.js b/src/model/scenery-info.js new file mode 100644 index 0000000..12c478e --- /dev/null +++ b/src/model/scenery-info.js @@ -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; + } +} \ No newline at end of file diff --git a/src/model/scenery-parser-log.js b/src/model/scenery-parser-log.js index 6e279aa..cd631c6 100644 --- a/src/model/scenery-parser-log.js +++ b/src/model/scenery-parser-log.js @@ -6,4 +6,8 @@ export default class SceneryParserLog { console.warn(`[SceneryParserLog] ${message}`); } + + static error(type, message) { + throw new Error(`[SceneryParserLog] ${message}`); + } } diff --git a/src/model/scenery.js b/src/model/scenery.js index 6cb3264..cdeb0d7 100644 --- a/src/model/scenery.js +++ b/src/model/scenery.js @@ -7,9 +7,19 @@ import Route from './route'; import Misc from './misc'; import SceneryParserLog from './scenery-parser-log'; 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 { + sceneryInfo = null; // SceneryInfo object objects = {}; signalBoxes = []; spawnSignals = []; @@ -25,8 +35,13 @@ export default class Scenery const lines = scText.split("\n").map(line => line.trim()); const scenery = new Scenery(); - lines.forEach(line => { + lines.forEach((line, index) => { if(!line?.length) return; + if(index === 0) { + this.sceneryInfo = Scenery._parseSceneryInfo(line); + return; + } + const object = Scenery._parseObject(line); if(!object) return; // skip null objects scenery.addObject(object); @@ -87,6 +102,20 @@ export default class Scenery 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) { const type = text.split(";", 2)[0]; switch(type) {