From d8527068604c83e195e9cd7881b8b6d36df71378 Mon Sep 17 00:00:00 2001 From: Benjamin Sutas Date: Tue, 25 Nov 2025 17:17:21 +0000 Subject: [PATCH] fix gog/steam obj detection --- Dat/Converters/ObjectSourceConverter.cs | 4 ++-- Dat/Converters/ObjectTypeConverter.cs | 2 +- Dat/FileParsing/LocoBinaryReader.cs | 6 +++++- Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs | 6 ++++-- Tests/IdempotenceTests.cs | 7 ++++--- Tests/LoadSaveTests.cs | 4 ++-- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Dat/Converters/ObjectSourceConverter.cs b/Dat/Converters/ObjectSourceConverter.cs index a40562a9..ac609f06 100644 --- a/Dat/Converters/ObjectSourceConverter.cs +++ b/Dat/Converters/ObjectSourceConverter.cs @@ -15,11 +15,11 @@ public static DatObjectSource Convert(this ObjectSource objectSource) _ => throw new NotImplementedException(), }; - public static ObjectSource Convert(this DatObjectSource objectSource) + public static ObjectSource Convert(this DatObjectSource objectSource, string datName, uint32_t datChecksum) => objectSource switch { DatObjectSource.Custom => ObjectSource.Custom, - DatObjectSource.Vanilla => ObjectSource.LocomotionSteam, // todo - can check the file checksum to determine if it's GoG or Steam + DatObjectSource.Vanilla => OriginalObjectFiles.GetFileSource(datName, datChecksum), DatObjectSource.OpenLoco => ObjectSource.OpenLoco, _ => throw new NotImplementedException(), }; diff --git a/Dat/Converters/ObjectTypeConverter.cs b/Dat/Converters/ObjectTypeConverter.cs index 0db0b7ff..17bb1fe5 100644 --- a/Dat/Converters/ObjectTypeConverter.cs +++ b/Dat/Converters/ObjectTypeConverter.cs @@ -17,7 +17,7 @@ public static ObjectModelHeader Convert(this S5Header s5Header) => new( s5Header.Name, s5Header.ObjectType.Convert(), - s5Header.ObjectSource.Convert(), + s5Header.ObjectSource.Convert(s5Header.Name, s5Header.Checksum), s5Header.Checksum); } diff --git a/Dat/FileParsing/LocoBinaryReader.cs b/Dat/FileParsing/LocoBinaryReader.cs index c3719703..0c9ffa0a 100644 --- a/Dat/FileParsing/LocoBinaryReader.cs +++ b/Dat/FileParsing/LocoBinaryReader.cs @@ -116,7 +116,11 @@ public IEnumerable ReadS5HeaderList() var header = S5Header.Read(ReadBytes(S5Header.StructLength)); // vanilla objects will have sourcegameflag == 0 and checksum == 0. custom objects will have a checksum specified - may need custom handling return header.Checksum != 0 || header.Flags != 255 - ? new ObjectModelHeader(header.Name, header.ObjectType.Convert(), header.ObjectSource.Convert(), header.Checksum) + ? new ObjectModelHeader( + header.Name, + header.ObjectType.Convert(), + header.ObjectSource.Convert(header.Name, header.Checksum), + header.Checksum) : default; } diff --git a/Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs b/Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs index c162123f..b38b98bf 100644 --- a/Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs +++ b/Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs @@ -315,9 +315,11 @@ void SaveCore(string filename, SawyerEncoding? encodingToUse = null) //}; } + var header = CurrentObject.DatFileInfo.S5Header; + SawyerStreamWriter.Save(filename, - ObjectModelHeaderViewModel?.Name ?? CurrentObject.DatFileInfo.S5Header.Name, - ObjectModelHeaderViewModel?.ObjectSource ?? CurrentObject.DatFileInfo.S5Header.ObjectSource.Convert(), + ObjectModelHeaderViewModel?.Name ?? header.Name, + ObjectModelHeaderViewModel?.ObjectSource ?? header.ObjectSource.Convert(header.Name, header.Checksum), encodingToUse ?? ObjectHeaderViewModel?.DatEncoding ?? SawyerEncoding.Uncompressed, CurrentObject.LocoObject, logger, diff --git a/Tests/IdempotenceTests.cs b/Tests/IdempotenceTests.cs index a948ed72..f41b488c 100644 --- a/Tests/IdempotenceTests.cs +++ b/Tests/IdempotenceTests.cs @@ -47,11 +47,12 @@ public void LoadSaveLoad(string filename) { var logger = new Logger(); var obj1 = SawyerStreamReader.LoadFullObject(filename, logger)!; + var header = obj1.DatFileInfo.S5Header; using var stream = SawyerStreamWriter.WriteLocoObject( - obj1.DatFileInfo.S5Header.Name, - obj1.DatFileInfo.S5Header.ObjectType.Convert(), - obj1.DatFileInfo.S5Header.ObjectSource.Convert(), + header.Name, + header.ObjectType.Convert(), + header.ObjectSource.Convert(header.Name, header.Checksum), obj1.DatFileInfo.ObjectHeader.Encoding, logger, obj1.LocoObject!, diff --git a/Tests/LoadSaveTests.cs b/Tests/LoadSaveTests.cs index 4ec62244..5c16f282 100644 --- a/Tests/LoadSaveTests.cs +++ b/Tests/LoadSaveTests.cs @@ -72,11 +72,11 @@ static void LoadSaveGenericTest(string filename, Action assert var (datInfo1, obj1, struc1) = LoadObject(filename); assertFunc(obj1, struc1); - var bytes1 = SawyerStreamWriter.WriteLocoObject(datInfo1.S5Header.Name, obj1.ObjectType, datInfo1.S5Header.ObjectSource.Convert(), datInfo1.ObjectHeader.Encoding, logger, obj1, true).ToArray(); + var bytes1 = SawyerStreamWriter.WriteLocoObject(datInfo1.S5Header.Name, obj1.ObjectType, datInfo1.S5Header.ObjectSource.Convert(datInfo1.S5Header.Name, datInfo1.S5Header.Checksum), datInfo1.ObjectHeader.Encoding, logger, obj1, true).ToArray(); var (datInfo2, obj2, struc2) = LoadObject(bytes1); assertFunc(obj2, struc2); - var bytes2 = SawyerStreamWriter.WriteLocoObject(datInfo2.S5Header.Name, obj2.ObjectType, datInfo2.S5Header.ObjectSource.Convert(), datInfo2.ObjectHeader.Encoding, logger, obj2, true).ToArray(); + var bytes2 = SawyerStreamWriter.WriteLocoObject(datInfo2.S5Header.Name, obj2.ObjectType, datInfo2.S5Header.ObjectSource.Convert(datInfo2.S5Header.Name, datInfo2.S5Header.Checksum), datInfo2.ObjectHeader.Encoding, logger, obj2, true).ToArray(); // grab headers first var s5Header1 = S5Header.Read(bytes1.AsSpan()[0..S5Header.StructLength]);