Updating PSO/XML conversion

This commit is contained in:
dexy 2019-12-07 01:33:27 +11:00
parent 5fb8d25770
commit 85f0fa1e36

View File

@ -661,6 +661,10 @@ namespace CodeWalker.GameFiles
return; return;
} }
if (offset >= block.Length)
{
offset = offset >> 8; //how to tell when to do this??
}
var boffset = offset + block.Offset; var boffset = offset + block.Offset;
@ -1245,7 +1249,20 @@ namespace CodeWalker.GameFiles
if (x1 != 0x1000000) if (x1 != 0x1000000)
{ } {
var c1 = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset));
var c2 = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset + 2));
var u1 = MetaTypes.SwapBytes(BitConverter.ToUInt32(data, eoffset + 4));
var c3 = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset + 8));
var c4 = MetaTypes.SwapBytes(BitConverter.ToUInt16(data, eoffset + 10));
var u3 = MetaTypes.SwapBytes(BitConverter.ToUInt32(data, eoffset + 12));
ulong ptr = MetaTypes.SwapBytes(BitConverter.ToUInt64(data, eoffset + 16));
sptr = new Array_Structure(ptr, c2);
if (c3 != 256)
{ }
if (c1 != c2)
{ }
}
if (x2 != 0) if (x2 != 0)
{ } { }
if (mapreftype2.ReferenceKey != 0) if (mapreftype2.ReferenceKey != 0)
@ -1268,15 +1285,14 @@ namespace CodeWalker.GameFiles
if (xCount1 > 0) if (xCount1 > 0)
{ {
var xStruct = cont.GetStructureInfo(xBlock.NameHash); var xStruct = cont.GetStructureInfo(xBlock.NameHash);
var xOffset1 = xOffset;
var xind = indent + 1; var xind = indent + 1;
var aind = indent + 2; var aind = indent + 2;
var kEntry = xStruct?.FindEntry(MetaName.Key); var kEntry = xStruct?.FindEntry(MetaName.Key);
var iEntry = xStruct?.FindEntry(MetaName.Item); var iEntry = xStruct?.FindEntry(MetaName.Item);
if (xOffset1 >= xBlock.Length) if (xOffset >= xBlock.Length)
{ {
xOffset1 = xOffset1 >> 8; //how to tell when to do this?? xOffset = xOffset >> 8; //how to tell when to do this??
} }
if ((xStruct == null) && (xBlock.NameHash == 0)) if ((xStruct == null) && (xBlock.NameHash == 0))
@ -1310,19 +1326,17 @@ namespace CodeWalker.GameFiles
else else
{ {
OpenTag(sb, xind, ename); OpenTag(sb, xind, ename);
int xOffset2 = (int)xOffset1;
int xCount = xCount1;
for (int n = 0; n < xCount; n++) for (int n = 0; n < xCount1; n++)
{ {
if (xOffset2 >= xBlock.Length) if (xOffset >= xBlock.Length)
{ {
ErrorXml(sb, aind, "Offset out of range! Count is " + xCount.ToString()); ErrorXml(sb, aind, "Offset out of range! Count is " + xCount1.ToString());
break; //out of range... break; //out of range...
} }
//WriteNode(sb, aind, cont, xBlockId, xOffset, XmlTagMode.Item, xStruct.IndexInfo.NameHash); //WriteNode(sb, aind, cont, xBlockId, xOffset, XmlTagMode.Item, xStruct.IndexInfo.NameHash);
int sOffset = xOffset2 + xBlock.Offset; int sOffset = (int)xOffset + xBlock.Offset;
var kOffset = sOffset + kEntry.DataOffset; var kOffset = sOffset + kEntry.DataOffset;
var iOffset = sOffset + iEntry.DataOffset; var iOffset = sOffset + iEntry.DataOffset;
var kStr = GetStringValue(cont.Pso, kEntry, data, kOffset); var kStr = GetStringValue(cont.Pso, kEntry, data, kOffset);
@ -1336,7 +1350,7 @@ namespace CodeWalker.GameFiles
else if (iEntry.ReferenceKey != 0)//(xBlock.NameHash != (MetaName)MetaTypeName.ARRAYINFO)//257,258,259 else if (iEntry.ReferenceKey != 0)//(xBlock.NameHash != (MetaName)MetaTypeName.ARRAYINFO)//257,258,259
{ {
//embedded map values //embedded map values
var vOffset = xOffset2 + iEntry.DataOffset; var vOffset = (int)xOffset + iEntry.DataOffset;
OpenTag(sb, aind, "Item type=\"" + HashString((MetaName)iEntry.ReferenceKey) + "\" key=\"" + kStr + "\""); OpenTag(sb, aind, "Item type=\"" + HashString((MetaName)iEntry.ReferenceKey) + "\" key=\"" + kStr + "\"");
WriteNode(sb, aind, cont, xBlockId, vOffset, XmlTagMode.None, (MetaName)iEntry.ReferenceKey); WriteNode(sb, aind, cont, xBlockId, vOffset, XmlTagMode.None, (MetaName)iEntry.ReferenceKey);
CloseTag(sb, aind, "Item"); CloseTag(sb, aind, "Item");
@ -1363,17 +1377,13 @@ namespace CodeWalker.GameFiles
else else
{ {
var iOff = (int)iPtr.ItemOffset; var iOff = (int)iPtr.ItemOffset;
if (iOff >= iBlock.Length)
{
iOff = iOff >> 8; //how to tell when to do this??
}
OpenTag(sb, aind, iStr); OpenTag(sb, aind, iStr);
WriteNode(sb, aind, cont, iPtr.BlockID, iOff, XmlTagMode.None);//, (MetaName)entry.ReferenceKey); WriteNode(sb, aind, cont, iPtr.BlockID, iOff, XmlTagMode.None);//, (MetaName)entry.ReferenceKey);
CloseTag(sb, aind, "Item"); CloseTag(sb, aind, "Item");
} }
} }
} }
xOffset2 += xStruct.StructureLength; xOffset += (uint)xStruct.StructureLength;
} }
CloseTag(sb, xind, ename); CloseTag(sb, xind, ename);
} }