Skip to content

Commit

Permalink
check if datacore has changed since last codegen and throw
Browse files Browse the repository at this point in the history
  • Loading branch information
diogotr7 committed Jan 26, 2025
1 parent b95e06d commit c6e0179
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 9 deletions.
2 changes: 0 additions & 2 deletions src/StarBreaker.Common/Utilities/TimeLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,13 @@ public TimeLogger()
timestamp = Stopwatch.GetTimestamp();
}

[Conditional("DEBUG")]
public void LogReset(string message)
{
var elapsed = Stopwatch.GetElapsedTime(timestamp);
Console.WriteLine($"{message}: {elapsed.TotalMilliseconds}ms");
timestamp = Stopwatch.GetTimestamp();
}

[Conditional("DEBUG")]
public void LogContinue(string message)
{
var elapsed = Stopwatch.GetElapsedTime(timestamp);
Expand Down
22 changes: 16 additions & 6 deletions src/StarBreaker.DataCore.Generated/DataCoreBinaryGenerated.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
using StarBreaker.Common;
using System.Diagnostics;
using StarBreaker.Common;
using StarBreaker.DataCore;

namespace StarBreaker.DataCoreGenerated;

//TODO: come up with a way of hashing the types we generated, then verify that the datacore file we're reading matches the types we have.
// if they don't match we *WILL* fail to read it. We should throw before this.
public sealed partial class DataCoreBinaryGenerated : IDataCoreBinary<DataCoreTypedRecord>
{
public DataCoreDatabase Database { get; }

public DataCoreBinaryGenerated(DataCoreDatabase database)
{
if (DataCoreConstants.StructCount != database.StructDefinitions.Length)
throw new InvalidOperationException($"DataCoreBinaryGenerated: Struct count mismatch. Expected {DataCoreConstants.StructCount}, got {database.StructDefinitions.Length}");

if (DataCoreConstants.EnumCount != database.EnumDefinitions.Length)
throw new InvalidOperationException($"DataCoreBinaryGenerated: Enum count mismatch. Expected {DataCoreConstants.EnumCount}, got {database.EnumDefinitions.Length}");

if (DataCoreConstants.StructsHash != database.StructsHash)
throw new InvalidOperationException($"DataCoreBinaryGenerated: Structs hash mismatch. Expected {DataCoreConstants.StructsHash}, got {database.StructsHash}");

if (DataCoreConstants.EnumsHash != database.EnumsHash)
throw new InvalidOperationException($"DataCoreBinaryGenerated: Enums hash mismatch. Expected {DataCoreConstants.EnumsHash}, got {database.EnumsHash}");

Database = database;
}

Expand Down Expand Up @@ -58,14 +69,13 @@ public void SaveToFile(DataCoreRecord record, string path)
public T EnumParse<T>(DataCoreStringId stringId, T unknown) where T : struct, Enum
{
var value = stringId.ToString(Database);

if (value == "")
return unknown;

if (!Enum.TryParse<T>(value, out var eVal))
{
var type = typeof(T);
Console.WriteLine($"Error parsing Enum of type {type.Name} with value {value}. Setting to unknown.");
Debug.WriteLine($"Error parsing Enum of type {typeof(T).Name} with value {value}. Setting to unknown.");
return unknown;
}

Expand Down
17 changes: 17 additions & 0 deletions src/StarBreaker.DataCore.TypeGenerator/DataCoreCodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public void Generate(string path)
GenerateTypes(path);
GenerateEnums(path);
GenerateTypeMap(path);
GenerateConstantsFile(path);
}

private void GenerateTypeMap(string path)
Expand Down Expand Up @@ -386,4 +387,20 @@ private void WriteArrayRead(StringBuilder sb, DataCorePropertyDefinition propert
throw new ArgumentOutOfRangeException();
}
}

private void GenerateConstantsFile(string path)
{
var sb = new StringBuilder();
sb.AppendLine("namespace StarBreaker.DataCoreGenerated;");
sb.AppendLine();
sb.AppendLine("public static class DataCoreConstants");
sb.AppendLine("{");
sb.AppendLine($" public const int StructCount = {Database.StructDefinitions.Length};");
sb.AppendLine($" public const int EnumCount = {Database.EnumDefinitions.Length};");
sb.AppendLine($" public const int StructsHash = {Database.StructsHash};");
sb.AppendLine($" public const int EnumsHash = {Database.EnumsHash};");
sb.AppendLine("}");

File.WriteAllText(Path.Combine(path, "Constants.cs"), sb.ToString());
}
}
4 changes: 4 additions & 0 deletions src/StarBreaker.DataCore/DataCoreDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ public sealed class DataCoreDatabase
private readonly FrozenDictionary<int, string> CachedStrings2;
private readonly FrozenDictionary<CigGuid, DataCoreRecord> RecordMap;

public int StructsHash => StructDefinitions.Sum(x => x.FirstAttributeIndex ^ x.AttributeCount);

public int EnumsHash => EnumDefinitions.Sum(x => x.FirstValueIndex ^ x.ValueCount);

public DataCoreDatabase(Stream fs)
{
using var reader = new BinaryReader(fs);
Expand Down
3 changes: 2 additions & 1 deletion src/StarBreaker.Sandbox/DataCoreSandbox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ private static void ExtractGenerated()

var allRecords = df.DataCore.Database.MainRecords
.AsParallel()
.Select(x => df.GetFromRecord(x)).ToList();
.Select(x => df.GetFromRecord(x))
.ToList();
timer.LogReset("Extracted all records.");

var classDefinitions = allRecords.Where(r => r.Data is EntityClassDefinition).Select(r => r.Data as EntityClassDefinition).ToList();
Expand Down

0 comments on commit c6e0179

Please sign in to comment.