// // Copyright (c) 2023 Timothy Schenk. Subject to the GNU AGPL Version 3 License. using System.Reflection; namespace Wonderking.Game; public abstract class DataReader { private readonly string _datFileName; private readonly byte _xorKey; protected readonly ushort SizeOfEntry; protected DataReader(string path) { Path = path; _xorKey = GetXorKey(); SizeOfEntry = GetSizeOfEntry(); _datFileName = GetDatFileName(); DatFileContent = GetDatFileContent(path).ToArray(); } private protected string Path { get; init; } protected byte[] DatFileContent { get; } public abstract uint GetAmountOfEntries(); public abstract T GetEntry(uint entryId); private static ushort GetSizeOfEntry() { return typeof(T).GetCustomAttribute()?.DataEntrySize ?? throw new NotSupportedException("DataEntrySize is null"); } private static string GetDatFileName() { return typeof(T).GetCustomAttribute()?.DatFileName ?? throw new NotSupportedException("DatFileName is null"); } private static byte GetXorKey() { return typeof(T).GetCustomAttribute()?.XorKey ?? throw new NotSupportedException("XorKey is null"); } private Span GetDatFileContent(string path) { var fileData = File.ReadAllBytes(path + _datFileName); var data = new byte[fileData.Length]; for (var i = 0; i < fileData.Length; i++) { data[i] = (byte)(fileData[i] ^ _xorKey); } return data; } }