mirror of
https://github.com/raphaeIl/Novaria.git
synced 2025-12-12 14:34:38 +01:00
143 lines
5.3 KiB
C#
143 lines
5.3 KiB
C#
using System.Text;
|
|
using Serilog;
|
|
|
|
namespace Novaria.Common.Crypto
|
|
{
|
|
public class GameDataExtraction
|
|
{
|
|
public enum GameDataType
|
|
{
|
|
PrimaryInt,
|
|
PrimaryLong,
|
|
PrimaryString,
|
|
NoPrimary
|
|
}
|
|
|
|
public class GameDataExtractionResult
|
|
{
|
|
public GameDataType DataType { get; set; }
|
|
public Dictionary<int, byte[]> PrimaryIntData { get; set; }
|
|
public Dictionary<long, byte[]> PrimaryLongData { get; set; }
|
|
public Dictionary<string, byte[]> PrimaryStringData { get; set; }
|
|
public List<byte[]> NoPrimaryData { get; set; }
|
|
}
|
|
|
|
private int _magicKey;
|
|
private string _binVersion;
|
|
|
|
public GameDataExtractionResult LoadCommonBinData(string filepath)
|
|
{
|
|
byte[] array = File.ReadAllBytes(filepath);
|
|
if (array == null || array.Length == 0)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
GameDataExtractionResult result = new GameDataExtractionResult();
|
|
|
|
using (MemoryStream memoryStream = new MemoryStream(array))
|
|
{
|
|
using (BinaryReader binaryReader = new BinaryReader(memoryStream))
|
|
{
|
|
// Uncomment and use actual validation if needed.
|
|
// if (binaryReader.ReadInt32() != _magicKey)
|
|
if (true)
|
|
{
|
|
int num = binaryReader.ReadInt16();
|
|
byte[] array2 = binaryReader.ReadBytes(num);
|
|
// Uncomment and use actual version check if needed.
|
|
// if (Encoding.UTF8.GetString(array2) != _binVersion)
|
|
if (true)
|
|
{
|
|
bool hasPrimary = binaryReader.ReadByte() == 1;
|
|
byte b = binaryReader.ReadByte();
|
|
bool isPrimaryInt = b == 1;
|
|
bool isPrimaryLong = b == 2;
|
|
num = binaryReader.ReadInt32();
|
|
|
|
if (hasPrimary)
|
|
{
|
|
if (isPrimaryInt)
|
|
{
|
|
result.DataType = GameDataType.PrimaryInt;
|
|
result.PrimaryIntData = LoadPrimaryKeyIntTable(binaryReader, num);
|
|
}
|
|
else if (isPrimaryLong)
|
|
{
|
|
result.DataType = GameDataType.PrimaryLong;
|
|
result.PrimaryLongData = LoadPrimaryLongIntTable(binaryReader, num);
|
|
}
|
|
else
|
|
{
|
|
result.DataType = GameDataType.PrimaryString;
|
|
result.PrimaryStringData = LoadPrimaryKeyStringTable(binaryReader, num);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
result.DataType = GameDataType.NoPrimary;
|
|
result.NoPrimaryData = LoadNoPrimaryKeyTable(binaryReader, num);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
private Dictionary<int, byte[]> LoadPrimaryKeyIntTable(BinaryReader br, int length)
|
|
{
|
|
Dictionary<int, byte[]> table = new Dictionary<int, byte[]>();
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int key = br.ReadInt32();
|
|
int valueLength = br.ReadInt16();
|
|
byte[] value = br.ReadBytes(valueLength);
|
|
table[key] = value;
|
|
}
|
|
return table;
|
|
}
|
|
|
|
private Dictionary<long, byte[]> LoadPrimaryLongIntTable(BinaryReader br, int length)
|
|
{
|
|
Dictionary<long, byte[]> table = new Dictionary<long, byte[]>();
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
long key = br.ReadInt64();
|
|
int valueLength = br.ReadInt16();
|
|
byte[] value = br.ReadBytes(valueLength);
|
|
table[key] = value;
|
|
}
|
|
return table;
|
|
}
|
|
|
|
private Dictionary<string, byte[]> LoadPrimaryKeyStringTable(BinaryReader br, int length)
|
|
{
|
|
Dictionary<string, byte[]> table = new Dictionary<string, byte[]>();
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int keyLength = br.ReadInt16();
|
|
byte[] keyBytes = br.ReadBytes(keyLength);
|
|
string key = Encoding.UTF8.GetString(keyBytes);
|
|
int valueLength = br.ReadInt16();
|
|
byte[] value = br.ReadBytes(valueLength);
|
|
table[key] = value;
|
|
}
|
|
return table;
|
|
}
|
|
|
|
private List<byte[]> LoadNoPrimaryKeyTable(BinaryReader br, int length)
|
|
{
|
|
List<byte[]> list = new List<byte[]>();
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int dataLength = br.ReadInt16();
|
|
byte[] data = br.ReadBytes(dataLength);
|
|
list.Add(data);
|
|
}
|
|
return list;
|
|
}
|
|
}
|
|
}
|