Skip to content

Commit 2b882a3

Browse files
authored
Add object sources for steam/gog and openloco (#107)
* add more object sources * cleanup * clean db, misc fixes
1 parent 877d177 commit 2b882a3

26 files changed

+718
-621
lines changed

Dat/Data/ObjectSource.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace OpenLoco.Dat.Data
2+
{
3+
public enum ObjectSource // note this is similar to the DAT enum `SourceGame`, but we need more definition now
4+
{
5+
Custom,
6+
LocomotionSteam,
7+
LocomotionGoG,
8+
OpenLoco,
9+
}
10+
}

Dat/Data/OriginalObjectFiles.cs

Lines changed: 558 additions & 552 deletions
Large diffs are not rendered by default.

Dat/ObjectIndex.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,20 @@ public void SaveIndex(string indexFile)
2626

2727
public void SaveIndex(string indexFile, JsonSerializerOptions options)
2828
=> File.WriteAllText(indexFile, JsonSerializer.Serialize(this, options));
29+
2930
public static async Task<ObjectIndexEntry> GetDatFileInfoFromBytesAsync((string Filename, byte[] Data) file)
3031
=> await Task.Run(() => GetDatFileInfoFromBytes(file));
3132

32-
public static async Task<ObjectIndex?> LoadOrCreateIndexAsync(string directory, IProgress<float>? progress = null)
33+
public static async Task<ObjectIndex> LoadOrCreateIndexAsync(string directory, IProgress<float>? progress = null)
3334
{
3435
var indexPath = Path.Combine(directory, DefaultIndexFileName);
35-
ObjectIndex? index;
36+
ObjectIndex? index = null;
3637
if (File.Exists(indexPath))
3738
{
3839
index = LoadIndex(indexPath);
3940
}
40-
else
41+
42+
if (index == null)
4143
{
4244
index = await CreateIndexAsync(directory, progress);
4345
index.SaveIndex(indexPath);
@@ -46,7 +48,7 @@ public static async Task<ObjectIndexEntry> GetDatFileInfoFromBytesAsync((string
4648
return index;
4749
}
4850

49-
public static ObjectIndex? LoadOrCreateIndex(string directory, IProgress<float>? progress = null)
51+
public static ObjectIndex LoadOrCreateIndex(string directory, IProgress<float>? progress = null)
5052
=> LoadOrCreateIndexAsync(directory, progress).Result;
5153

5254
public static Task<ObjectIndex> CreateIndexAsync(string directory, IProgress<float>? progress = null)
@@ -107,16 +109,16 @@ public static ObjectIndexEntry GetDatFileInfoFromBytes((string Filename, byte[]
107109
}
108110

109111
var remainingData = file.Data[(S5Header.StructLength + ObjectHeader.StructLength)..];
110-
var isVanilla = hdrs.S5.IsVanilla();
112+
var source = OriginalObjectFiles.GetFileSource(hdrs.S5.Name, hdrs.S5.Checksum);
111113

112114
if (hdrs.S5.ObjectType == ObjectType.Vehicle)
113115
{
114116
var decoded = SawyerStreamReader.Decode(hdrs.Obj.Encoding, remainingData, 4); // only need 4 bytes since vehicle type is in the 4th byte of a vehicle object
115-
return new ObjectIndexEntry(file.Filename, hdrs.S5.Name, hdrs.S5.Checksum, hdrs.S5.ObjectType, isVanilla, (VehicleType)decoded[3]);
117+
return new ObjectIndexEntry(file.Filename, hdrs.S5.Name, hdrs.S5.Checksum, hdrs.S5.ObjectType, source, (VehicleType)decoded[3]);
116118
}
117119
else
118120
{
119-
return new ObjectIndexEntry(file.Filename, hdrs.S5.Name, hdrs.S5.Checksum, hdrs.S5.ObjectType, isVanilla);
121+
return new ObjectIndexEntry(file.Filename, hdrs.S5.Name, hdrs.S5.Checksum, hdrs.S5.ObjectType, source);
120122
}
121123
}
122124
}
@@ -126,6 +128,6 @@ public record ObjectIndexEntry(
126128
string DatName,
127129
uint32_t DatChecksum,
128130
ObjectType ObjectType,
129-
bool IsVanilla,
131+
ObjectSource ObjectSource,
130132
VehicleType? VehicleType = null);
131133
}

Dat/Types/S5Header.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ public bool IsVanilla()
8080
=> IsVanilla(Name, Checksum);
8181

8282
public static bool IsVanilla(string name, uint checksum)
83-
=> OriginalObjectFiles.GetFileSource(name, checksum) != FileSource.Custom;
83+
=> OriginalObjectFiles.GetFileSource(name, checksum) != ObjectSource.Custom;
8484
}
8585
}

DataSanitiser/Program.cs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,42 @@
4545
var objectMetadata = JsonSerializer.Deserialize<IEnumerable<ObjectMetadata>>(File.ReadAllText("Q:\\Games\\Locomotion\\Server\\Objects\\objectMetadata.json"), jsonOptions)
4646
.ToDictionary(x => (x.DatName, x.DatChecksum), x => x);
4747

48-
Console.WriteLine($"MetadataCount={objectMetadata.Count()}");
48+
Console.WriteLine($"MetadataCount={objectMetadata.Count}");
4949

5050
var dir = "Q:\\Games\\Locomotion\\Server\\Objects";
5151
var index = ObjectIndex.LoadOrCreateIndex(dir);
5252
var logger = new Logger();
5353

54+
foreach (var meta in objectMetadata)
55+
{
56+
if (!index.TryFind(meta.Key, out var entry) || entry == null)
57+
{
58+
continue;
59+
}
60+
61+
var source = OriginalObjectFiles.GetFileSource(meta.Key);
62+
var sourceString = source switch
63+
{
64+
ObjectSource.Custom => "custom",
65+
ObjectSource.LocomotionSteam => "loco.steam",
66+
ObjectSource.LocomotionGoG => "loco.gog",
67+
ObjectSource.OpenLoco => "openloco",
68+
_ => throw new NotImplementedException(),
69+
};
70+
71+
var vehicleString = entry.ObjectType.ToString().ToLower();
72+
if (entry.VehicleType != null)
73+
{
74+
vehicleString += entry.VehicleType.ToString()!.ToLower();
75+
}
76+
77+
var uniqueName = string.Join('.', source.ToString(), entry.VehicleType.ToString(), entry.DatName);
78+
79+
// check uniqueness and append an identifier if necessary
80+
81+
objectMetadata[meta.Key] = meta.Value with { UniqueName = uniqueName };
82+
}
83+
5484
var objectList = new List<(DatFileInfo DatFileInfo, VehicleObject Vehicle)>();
5585
var count = 0;
5686
foreach (var obj in index.Objects.Where(x => x.ObjectType == ObjectType.Vehicle))
@@ -112,9 +142,11 @@ void AddNewObjectMetadataEntries()
112142
foreach (var obj in index.Objects)
113143
{
114144
var key = (obj.DatName, obj.DatChecksum);
145+
var source = OriginalObjectFiles.GetFileSource(key);
146+
115147
if (!objectMetadata.ContainsKey(key))
116148
{
117-
objectMetadata.Add(key, new ObjectMetadata(Path.GetFileNameWithoutExtension(obj.Filename), obj.DatName, obj.DatChecksum, null, [], [], [], null, OpenLoco.Definitions.ObjectAvailability.AllGames));
149+
objectMetadata.Add(key, new ObjectMetadata(Path.GetFileNameWithoutExtension(obj.Filename), obj.DatName, obj.DatChecksum, null, [], [], [], null, OpenLoco.Definitions.ObjectAvailability.AllGames, source));
118150
}
119151
}
120152

DatabaseExporter/Program.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
o.Tags.Select(t => t.Name).ToList(),
3636
o.Modpacks.Select(m => m.Name).ToList(),
3737
o.Object.Licence?.Name,
38-
o.Object.Availability);
38+
o.Object.Availability,
39+
o.Object.ObjectSource);
3940
objs.Add(obj);
4041
}
4142

DatabaseSeeder/Program.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.EntityFrameworkCore;
22
using OpenLoco.Dat;
3+
using OpenLoco.Dat.Data;
34
using OpenLoco.Definitions;
45
using OpenLoco.Definitions.Database;
56
using OpenLoco.Definitions.SourceData;
@@ -124,13 +125,15 @@ static void SeedDb(LocoDb db, bool deleteExisting)
124125
var metadataKey = (objIndex.DatName, objIndex.DatChecksum);
125126
if (!objectMetadataDict.TryGetValue(metadataKey, out var meta))
126127
{
127-
var newMetadata = new ObjectMetadata(Guid.NewGuid().ToString(), objIndex.DatName, objIndex.DatChecksum, null, [], [], [], null, ObjectAvailability.AllGames);
128+
var newMetadata = new ObjectMetadata(Guid.NewGuid().ToString(), objIndex.DatName, objIndex.DatChecksum, null, [], [], [], null, ObjectAvailability.AllGames, ObjectSource.Custom);
128129
meta = newMetadata;
129130
objectMetadataDict.Add((objIndex.DatName, objIndex.DatChecksum), newMetadata);
130131
}
131132

132133
var filename = Path.Combine(ObjDirectory, objIndex.Filename);
133-
var creationTime = objIndex.IsVanilla ? gameReleaseDate : File.GetLastWriteTimeUtc(filename); // this is the "Modified" time as shown in Windows
134+
var creationTime = objIndex.ObjectSource is ObjectSource.LocomotionSteam or ObjectSource.LocomotionGoG
135+
? gameReleaseDate
136+
: File.GetLastWriteTimeUtc(filename); // this is the "Modified" time as shown in Windows
134137

135138
var authors = meta.Authors == null ? null : db.Authors.Where(x => meta.Authors.Contains(x.Name)).ToList();
136139
var tags = meta.Tags == null ? null : db.Tags.Where(x => meta.Tags.Contains(x.Name)).ToList();
@@ -142,7 +145,7 @@ static void SeedDb(LocoDb db, bool deleteExisting)
142145
UniqueName = meta!.UniqueName,
143146
DatName = objIndex.DatName,
144147
DatChecksum = objIndex.DatChecksum,
145-
IsVanilla = objIndex.IsVanilla,
148+
ObjectSource = objIndex.ObjectSource,
146149
ObjectType = objIndex.ObjectType,
147150
VehicleType = objIndex.VehicleType,
148151
Description = meta?.Description,

Definitions/DTO/DtoDatObjectWithMetadata.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public record DtoDatObjectWithMetadata(
1010
string DatName,
1111
uint DatChecksum,
1212
string? DatBytes, // base64-encoded
13-
bool IsVanilla,
13+
ObjectSource ObjectSource,
1414
ObjectType ObjectType,
1515
VehicleType? VehicleType,
1616
string? Description,

Definitions/DTO/DtoObjectIndexEntry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ public record DtoObjectIndexEntry(
88
string DatName,
99
uint DatChecksum,
1010
ObjectType ObjectType,
11-
bool IsVanilla,
11+
ObjectSource ObjectSource,
1212
VehicleType? VehicleType);
1313
}

Definitions/Database/TblLocoObject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class TblLocoObject
2121

2222
#endregion
2323

24-
public bool IsVanilla { get; set; }
24+
public ObjectSource ObjectSource { get; set; }
2525

2626
public ObjectType ObjectType { get; set; }
2727

0 commit comments

Comments
 (0)