Core/Misc: Misc fixs

This commit is contained in:
hondacrx
2018-05-22 11:16:19 -04:00
parent dbd62e5c6f
commit a91973b1ff
2 changed files with 23 additions and 20 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ namespace Framework.Collections
return _str == null || _str.Length == 0; return _str == null || _str.Length == 0;
} }
public int Length => _str.Length; public int Length => _str != null ? _str.Length : 0;
string[] _str; string[] _str;
} }
@@ -203,8 +203,11 @@ namespace Game.DataStorage
Dictionary<int, int> OffsetDuplicates = new Dictionary<int, int>(); Dictionary<int, int> OffsetDuplicates = new Dictionary<int, int>();
Dictionary<int, List<int>> Copies = new Dictionary<int, List<int>>(); Dictionary<int, List<int>> Copies = new Dictionary<int, List<int>>();
bool hasOffsetTable = Header.HasOffsetTable();
bool hasIndexTable = Header.HasIndexTable();
byte[] recordData; byte[] recordData;
if (Header.HasOffsetTable()) if (hasOffsetTable)
recordData = reader.ReadBytes((int)(Header.OffsetTableOffset - 84 - 4 * Header.FieldCount)); recordData = reader.ReadBytes((int)(Header.OffsetTableOffset - 84 - 4 * Header.FieldCount));
else else
{ {
@@ -231,7 +234,7 @@ namespace Game.DataStorage
int[] m_indexes = null; int[] m_indexes = null;
// OffsetTable // OffsetTable
if (Header.HasOffsetTable() && Header.OffsetTableOffset > 0) if (hasOffsetTable && Header.OffsetTableOffset > 0)
{ {
reader.BaseStream.Position = Header.OffsetTableOffset; reader.BaseStream.Position = Header.OffsetTableOffset;
for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++) for (int i = 0; i < (Header.MaxId - Header.MinId + 1); i++)
@@ -256,7 +259,7 @@ namespace Game.DataStorage
} }
// IndexTable // IndexTable
if (Header.HasIndexTable()) if (hasIndexTable)
m_indexes = reader.ReadArray<int>(Header.RecordCount); m_indexes = reader.ReadArray<int>(Header.RecordCount);
// Copytable // Copytable
@@ -353,7 +356,7 @@ namespace Game.DataStorage
{ {
int id = 0; int id = 0;
if (Header.HasOffsetTable() && Header.HasIndexTable()) if (hasOffsetTable && hasIndexTable)
{ {
id = m_indexes[CopyTable.Count]; id = m_indexes[CopyTable.Count];
var map = offsetmap[i]; var map = offsetmap[i];
@@ -391,8 +394,10 @@ namespace Game.DataStorage
bitReader.Offset = i * (int)Header.RecordSize; bitReader.Offset = i * (int)Header.RecordSize;
List<byte> data = new List<byte>(); List<byte> data = new List<byte>();
MemoryStream stream = new MemoryStream();
BinaryWriter binaryWriter = new BinaryWriter(stream);
if (Header.HasIndexTable()) if (hasIndexTable)
id = m_indexes[i]; id = m_indexes[i];
for (int f = 0; f < Header.FieldCount; f++) for (int f = 0; f < Header.FieldCount; f++)
@@ -403,42 +408,40 @@ namespace Game.DataStorage
{ {
case DB2ColumnCompression.None: case DB2ColumnCompression.None:
int bitSize = FieldStructure[f].BitCount; int bitSize = FieldStructure[f].BitCount;
if (!Header.HasIndexTable() && f == Header.IdIndex) if (!hasIndexTable && f == Header.IdIndex)
{ {
id = (int)bitReader.ReadUInt32(bitSize);// always read Ids as ints id = (int)bitReader.ReadUInt32(bitSize);// always read Ids as ints
data.AddRange(BitConverter.GetBytes(id)); binaryWriter.Write(id);
} }
else else
{ {
for (int x = 0; x < ColumnMeta[f].ArraySize; x++) for (int x = 0; x < ColumnMeta[f].ArraySize; x++)
data.AddRange(bitReader.ReadValue(bitSize)); binaryWriter.Write(bitReader.ReadValue(bitSize));
} }
break; break;
case DB2ColumnCompression.Immediate: case DB2ColumnCompression.Immediate:
if (!Header.HasIndexTable() && f == Header.IdIndex) if (!hasIndexTable && f == Header.IdIndex)
{ {
id = (int)bitReader.ReadUInt32(bitWidth);// always read Ids as ints id = (int)bitReader.ReadUInt32(bitWidth);// always read Ids as ints
data.AddRange(BitConverter.GetBytes(id)); binaryWriter.Write(id);
continue; continue;
} }
else else
{ binaryWriter.Write(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1));
data.AddRange(bitReader.ReadValue(bitWidth, ColumnMeta[f].BitOffset, ColumnMeta[f].Cardinality == 1));
}
break; break;
case DB2ColumnCompression.CommonData: case DB2ColumnCompression.CommonData:
if (ColumnMeta[f].SparseValues.TryGetValue(id, out byte[] valBytes)) if (ColumnMeta[f].SparseValues.TryGetValue(id, out byte[] valBytes))
data.AddRange(valBytes); binaryWriter.Write(valBytes);
else else
data.AddRange(BitConverter.GetBytes(ColumnMeta[f].BitOffset)); binaryWriter.Write(ColumnMeta[f].BitOffset);
break; break;
case DB2ColumnCompression.Pallet: case DB2ColumnCompression.Pallet:
case DB2ColumnCompression.PalletArray: case DB2ColumnCompression.PalletArray:
uint palletIndex = bitReader.ReadUInt32(bitWidth); uint palletIndex = bitReader.ReadUInt32(bitWidth);
data.AddRange(ColumnMeta[f].PalletValues[(int)palletIndex]); binaryWriter.Write(ColumnMeta[f].PalletValues[(int)palletIndex]);
break; break;
default: default:
@@ -451,12 +454,12 @@ namespace Game.DataStorage
{ {
// seen cases of missing indicies // seen cases of missing indicies
if (RelationShipData.Entries.TryGetValue((uint)i, out byte[] foreignData)) if (RelationShipData.Entries.TryGetValue((uint)i, out byte[] foreignData))
data.AddRange(foreignData); binaryWriter.Write(foreignData);
else else
data.AddRange(new byte[4]); binaryWriter.Write(0);
} }
CopyTable.Add(id, data.ToArray()); CopyTable.Add(id, stream.ToArray());
if (Copies.ContainsKey(id)) if (Copies.ContainsKey(id))
{ {