Skip to content

Commit 2c6eb86

Browse files
committed
fix bug with indexing getting wrong object source, and add support for gog folder shortcut
1 parent 743662b commit 2c6eb86

File tree

13 files changed

+64
-46
lines changed

13 files changed

+64
-46
lines changed

Dat/Converters/ObjectSourceConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static ObjectSource Convert(this DatObjectSource objectSource, string dat
1919
=> objectSource switch
2020
{
2121
DatObjectSource.Custom => ObjectSource.Custom,
22-
DatObjectSource.Vanilla => OriginalObjectFiles.GetFileSource(datName, datChecksum),
22+
DatObjectSource.Vanilla => OriginalObjectFiles.GetFileSource(datName, datChecksum, objectSource),
2323
DatObjectSource.OpenLoco => ObjectSource.OpenLoco,
2424
_ => throw new NotImplementedException(),
2525
};

Dat/Data/OriginalObjectFiles.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ public record OriginalObjectFile(uint SteamChecksum, uint GoGChecksum, uint Open
66

77
public static class OriginalObjectFiles
88
{
9-
public static ObjectSource GetFileSource((string name, uint checksum) key)
10-
=> GetFileSource(key.name, key.checksum);
9+
public static ObjectSource GetFileSource((string name, uint checksum) key, DatObjectSource claimedSource)
10+
=> GetFileSource(key.name, key.checksum, claimedSource);
1111

12-
public static ObjectSource GetFileSource(string name, uint checksum)
12+
public static ObjectSource GetFileSource(string name, uint checksum, DatObjectSource claimedSource)
1313
{
14-
if (Names.TryGetValue(name, out var fileInfo))
14+
if (claimedSource == DatObjectSource.Vanilla && Names.TryGetValue(name, out var fileInfo))
1515
{
1616
if (checksum == fileInfo.SteamChecksum)
1717
{
@@ -21,14 +21,11 @@ public static ObjectSource GetFileSource(string name, uint checksum)
2121
{
2222
return ObjectSource.LocomotionGoG;
2323
}
24-
else if (checksum == fileInfo.OpenGraphicsChecksum)
25-
{
26-
return ObjectSource.OpenLoco;
27-
}
28-
else if (name == fileInfo.OpenGraphicsName)
29-
{
30-
return ObjectSource.OpenLoco;
31-
}
24+
}
25+
26+
if (claimedSource == DatObjectSource.OpenLoco || Names.Any(x => x.Value.OpenGraphicsName == name))
27+
{
28+
return ObjectSource.OpenLoco;
3229
}
3330

3431
return ObjectSource.Custom;

Dat/Types/S5Header.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Dat.Data;
33
using Dat.FileParsing;
44
using System.ComponentModel;
5+
using System.Xml.Linq;
56

67
namespace Dat.Types;
78

@@ -77,8 +78,6 @@ public ReadOnlySpan<byte> Write()
7778
public static readonly S5Header NullHeader = new(0x000000FF, " ", 0);
7879

7980
public bool IsVanilla()
80-
=> IsVanilla(Name, Checksum);
81+
=> OriginalObjectFiles.GetFileSource(Name, Checksum, ObjectSource).Convert() != DatObjectSource.Custom;
8182

82-
public static bool IsVanilla(string name, uint checksum)
83-
=> OriginalObjectFiles.GetFileSource(name, checksum).Convert() != DatObjectSource.Custom;
8483
}

DataSanitiser/Program.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ static void QueryBuildingProducedQuantity()
102102
{
103103
var struc = (BuildingObject)o.LocoObject.Object;
104104
var header = o.DatFileInfo.S5Header;
105-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
105+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
106106

107107
foreach (var cargo in struc.ProducedCargo.Zip(struc.ProducedQuantity))
108108
{
@@ -149,7 +149,7 @@ static void QueryHeadquarters()
149149
{
150150
var struc = (BuildingObject)o.LocoObject.Object;
151151
var header = o.DatFileInfo.S5Header;
152-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
152+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
153153

154154
if (struc.Flags.HasFlag(BuildingObjectFlags.IsHeadquarters))
155155
{
@@ -216,7 +216,7 @@ static void QueryCostIndex()
216216
var costIndex = (byte)costIndexProperty.GetValue(o.LocoObject.Object);
217217

218218
var header = o.DatFileInfo.S5Header;
219-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
219+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
220220

221221
results.Add((obj, source, o.LocoObject.ObjectType, costIndex));
222222
}
@@ -255,7 +255,7 @@ static void QueryTrackStationOneSidedTrack()
255255
{
256256
var struc = (TrackStationObject)o.LocoObject.Object;
257257
var header = o.DatFileInfo.S5Header;
258-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
258+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
259259

260260
// Build a list of all enabled TrackTraitFlags for this object
261261
var enabledFlags = new List<string>();
@@ -315,7 +315,7 @@ static void QueryIndustryHasShadows()
315315
{
316316
var struc = (IndustryObject)o.LocoObject.Object;
317317
var header = o.DatFileInfo.S5Header;
318-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
318+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
319319

320320
if (struc.Flags.HasFlag(IndustryObjectFlags.HasShadows))
321321
{
@@ -357,7 +357,7 @@ static void QueryVehicleBodyUnkSprites()
357357
{
358358
var struc = (VehicleObject)o.LocoObject.Object;
359359
var header = o.DatFileInfo.S5Header;
360-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
360+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
361361

362362
if (struc.Flags.HasFlag(VehicleObjectFlags.AlternatingCarSprite))
363363
{
@@ -400,7 +400,7 @@ static void QueryCargoCategories()
400400
var struc = (CargoObject)o.LocoObject.Object;
401401

402402
var header = o.DatFileInfo.S5Header;
403-
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum);
403+
var source = OriginalObjectFiles.GetFileSource(header.Name, header.Checksum, header.ObjectSource);
404404

405405
results.Add((obj, struc.CargoCategory, o.LocoObject.StringTable.Table["Name"][LanguageId.English_UK], source));
406406
}

Gui/EditorSettings.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,17 @@ public HashSet<string> ObjDataDirectories
4343
public string ObjectIndicesFolder { get; set; } = string.Empty;
4444
public string DownloadFolder { get; set; } = string.Empty;
4545

46+
public string LocomotionSteamObjDataFolder { get; set; } = string.Empty;
47+
public string LocomotionGoGObjDataFolder { get; set; } = string.Empty;
4648
public string AppDataObjDataFolder { get; set; } = string.Empty;
47-
public string LocomotionObjDataFolder { get; set; } = string.Empty;
4849
public string OpenLocoObjDataFolder { get; set; } = string.Empty;
4950

5051
public string GetGameObjDataFolder(GameObjDataFolder folder)
5152
=> folder switch
5253
{
5354
GameObjDataFolder.AppData => AppDataObjDataFolder,
54-
GameObjDataFolder.Locomotion => LocomotionObjDataFolder,
55+
GameObjDataFolder.LocomotionSteam => LocomotionSteamObjDataFolder,
56+
GameObjDataFolder.LocomotionGoG => LocomotionGoGObjDataFolder,
5557
GameObjDataFolder.OpenLoco => OpenLocoObjDataFolder,
5658
_ => throw new NotImplementedException(),
5759
};

Gui/GameObjDataFolder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
namespace Gui;
22

3-
public enum GameObjDataFolder { AppData, Locomotion, OpenLoco }
3+
public enum GameObjDataFolder { LocomotionSteam, LocomotionGoG, AppData, OpenLoco }

Gui/ViewModels/EditorSettingsWindowViewModel.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,27 @@ public bool ShowLogsOnError
4848
const string GameObjectFolderCategory = "Folders OpenLoco can use objects from";
4949
const string UserObjectFolderCategory = "Folders where you store custom objects";
5050

51+
[PathBrowsable(PathBrowsableType.Directory), Category(GameObjectFolderCategory), DisplayName("Locomotion (Steam) ObjData Folder"), Description("The ObjData folder in your Steam Locomotion installation.")]
52+
public string LocomotionSteamObjDataFolder
53+
{
54+
get => Model.LocomotionSteamObjDataFolder;
55+
set => Model.LocomotionSteamObjDataFolder = value;
56+
}
57+
58+
[PathBrowsable(PathBrowsableType.Directory), Category(GameObjectFolderCategory), DisplayName("Locomotion (GoG) ObjData Folder"), Description("The ObjData folder in your GoG Locomotion installation.")]
59+
public string LocomotionGoGObjDataFolder
60+
{
61+
get => Model.LocomotionGoGObjDataFolder;
62+
set => Model.LocomotionGoGObjDataFolder = value;
63+
}
64+
5165
[PathBrowsable(PathBrowsableType.Directory), Category(GameObjectFolderCategory), DisplayName("AppData ObjData Folder"), Description("The ObjData folder in %AppData%\\OpenLoco\\objects.")]
5266
public string AppDataObjDataFolder
5367
{
5468
get => Model.AppDataObjDataFolder;
5569
set => Model.AppDataObjDataFolder = value;
5670
}
5771

58-
[PathBrowsable(PathBrowsableType.Directory), Category(GameObjectFolderCategory), DisplayName("Locomotion ObjData Folder"), Description("The ObjData folder in your Locomotion installation.")]
59-
public string LocomotionObjDataFolder
60-
{
61-
get => Model.LocomotionObjDataFolder;
62-
set => Model.LocomotionObjDataFolder = value;
63-
}
64-
6572
[PathBrowsable(PathBrowsableType.Directory), Category(GameObjectFolderCategory), DisplayName("OpenLoco ObjData Folder"), Description("The ObjData folder in the OpenLoco\\Objects directory.")]
6673
public string OpenLocoObjDataFolder
6774
{

Gui/ViewModels/LocoTypes/ObjectEditorViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public class ObjectEditorViewModel : BaseLocoFileViewModel
6363
public ReactiveCommand<Unit, Unit> ValidateForOGCommand { get; }
6464

6565
[Reactive]
66-
public GameObjDataFolder LastGameObjDataFolder { get; set; } = GameObjDataFolder.Locomotion;
66+
public GameObjDataFolder LastGameObjDataFolder { get; set; } = GameObjDataFolder.LocomotionSteam;
6767

6868
//public ReactiveCommand<Unit, ObjectIndexEntry?> SelectObjectCommand { get; }
6969
public Interaction<ObjectSelectionWindowViewModel, ObjectSelectionWindowViewModel?> SelectObjectShowDialog { get; }

Gui/ViewModels/LocoTypes/SCV5ViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public ObservableCollection<TileElement> CurrentTileElements
5050
: [];
5151

5252
[Reactive]
53-
public GameObjDataFolder LastGameObjDataFolder { get; set; } = GameObjDataFolder.Locomotion;
53+
public GameObjDataFolder LastGameObjDataFolder { get; set; } = GameObjDataFolder.LocomotionSteam;
5454
public ReactiveCommand<GameObjDataFolder, Unit> DownloadMissingObjectsToGameObjDataCommand { get; }
5555

5656
public SCV5ViewModel(FileSystemItem currentFile, ObjectEditorModel model)
@@ -141,7 +141,7 @@ async Task DownloadMissingObjects(GameObjDataFolder targetFolder)
141141

142142
foreach (var obj in CurrentS5File.RequiredObjects)
143143
{
144-
if (OriginalObjectFiles.GetFileSource(obj.Name, obj.Checksum) is ObjectSource.LocomotionSteam or ObjectSource.LocomotionGoG)
144+
if (OriginalObjectFiles.GetFileSource(obj.Name, obj.Checksum, obj.ObjectSource) is ObjectSource.LocomotionSteam or ObjectSource.LocomotionGoG)
145145
{
146146
continue;
147147
}

Gui/ViewModels/MainWindowViewModel.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,14 @@ void PopulateObjDataMenu()
208208
ObjDataItems.Add(new MenuItemViewModel($"[{nameof(GameObjDataFolder.AppData)}] {Model.Settings.AppDataObjDataFolder}", ReactiveCommand.Create(() => FolderTreeViewModel.CurrentLocalDirectory = Model.Settings.AppDataObjDataFolder)));
209209
}
210210

211-
if (Directory.Exists(Model.Settings.LocomotionObjDataFolder))
211+
if (Directory.Exists(Model.Settings.LocomotionSteamObjDataFolder))
212212
{
213-
ObjDataItems.Add(new MenuItemViewModel($"[{nameof(GameObjDataFolder.Locomotion)}] {Model.Settings.LocomotionObjDataFolder}", ReactiveCommand.Create(() => FolderTreeViewModel.CurrentLocalDirectory = Model.Settings.LocomotionObjDataFolder)));
213+
ObjDataItems.Add(new MenuItemViewModel($"[{nameof(GameObjDataFolder.LocomotionSteam)}] {Model.Settings.LocomotionSteamObjDataFolder}", ReactiveCommand.Create(() => FolderTreeViewModel.CurrentLocalDirectory = Model.Settings.LocomotionSteamObjDataFolder)));
214+
}
215+
216+
if (Directory.Exists(Model.Settings.LocomotionGoGObjDataFolder))
217+
{
218+
ObjDataItems.Add(new MenuItemViewModel($"[{nameof(GameObjDataFolder.LocomotionGoG)}] {Model.Settings.LocomotionGoGObjDataFolder}", ReactiveCommand.Create(() => FolderTreeViewModel.CurrentLocalDirectory = Model.Settings.LocomotionGoGObjDataFolder)));
214219
}
215220

216221
if (Directory.Exists(Model.Settings.OpenLocoObjDataFolder))
@@ -283,7 +288,7 @@ public async Task LoadSingleObject()
283288
if (Model.TryLoadObject(new FileSystemItem(Path.GetFileName(fsi.FileName), fsi.FileName, fsi.Id, createdTime, modifiedTime, FileLocation.Local), out var uiLocoFile) && uiLocoFile != null)
284289
{
285290
Model.Logger.Warning($"Successfully loaded {fsi.FileName}");
286-
var source = OriginalObjectFiles.GetFileSource(uiLocoFile.DatInfo.S5Header.Name, uiLocoFile.DatInfo.S5Header.Checksum);
291+
var source = OriginalObjectFiles.GetFileSource(uiLocoFile.DatInfo.S5Header.Name, uiLocoFile.DatInfo.S5Header.Checksum, uiLocoFile.DatInfo.S5Header.ObjectSource);
287292
var fsi2 = new FileSystemItem(uiLocoFile!.DatInfo.S5Header.Name, fsi.FileName, fsi.Id, createdTime, modifiedTime, FileLocation.Local, source);
288293
SetObjectViewModel(fsi2);
289294
}
@@ -387,15 +392,15 @@ public async Task SelectNewFolder()
387392
return;
388393
}
389394

390-
if (Model.Settings.AppDataObjDataFolder == dirPath)
395+
if (Model.Settings.LocomotionSteamObjDataFolder == dirPath)
391396
{
392-
Model.Logger.Warning("No need to add - this is the predefined AppData folder");
397+
Model.Logger.Warning("No need to add - this is the predefined Locomotion (Steam) ObjData folder");
393398
return;
394399
}
395400

396-
if (Model.Settings.LocomotionObjDataFolder == dirPath)
401+
if (Model.Settings.LocomotionGoGObjDataFolder == dirPath)
397402
{
398-
Model.Logger.Warning("No need to add - this is the predefined Locomotion ObjData folder");
403+
Model.Logger.Warning("No need to add - this is the predefined Locomotion (GoG) ObjData folder");
399404
return;
400405
}
401406

@@ -405,6 +410,12 @@ public async Task SelectNewFolder()
405410
return;
406411
}
407412

413+
if (Model.Settings.AppDataObjDataFolder == dirPath)
414+
{
415+
Model.Logger.Warning("No need to add - this is the predefined AppData folder");
416+
return;
417+
}
418+
408419
FolderTreeViewModel.CurrentLocalDirectory = dirPath; // this will cause the reindexing
409420
var menuItem = new MenuItemViewModel(
410421
dirPath,

0 commit comments

Comments
 (0)