private void Write11Content(XmlTextWriter writer, PsoType11 value) { if (value.Value == null) { writer.WriteString(GetNameForHash(value.ValueHash)); } else { writer.WriteString(value.Value); } }
private PsoType11 ReadType11(XmlNode node, bool fullString) { if (fullString) { PsoType11 v = new PsoType11(64); v.Value = node.InnerText; return(v); } else { PsoType11 v = new PsoType11(0); v.Value = null; v.ValueHash = GetHashForName(node.InnerText); return(v); } }
private PsoArray Read11Array(XmlNode node) { var arrayValue = new PsoArray(); if (node.ChildNodes.Count > 0) { arrayValue.Entries = new List <IPsoValue>(); foreach (XmlNode arrent in node.ChildNodes) { var y = new PsoType11(0); y.Value = null; y.ValueHash = GetHashForName(arrent.InnerText); arrayValue.Entries.Add(y); } } return(arrayValue); }
public IPsoValue Parse(PsoFile meta) { var blockKeys = new List <int>(); var blocks = new List <List <IPsoValue> >(); var resultStructure = new PsoStructure(); resultStructure.pso = meta; var rootHash = meta.DataMappingSection.Entries[meta.DataMappingSection.RootIndex - 1].NameHash; for (int i = 0; i < meta.DefinitionSection.Count; i++) { if (meta.DefinitionSection.EntriesIdx[i].NameHash == rootHash) { resultStructure.psoSection = (PsoStructureInfo)meta.DefinitionSection.Entries[i]; resultStructure.psoEntryInfo = meta.DefinitionSection.EntriesIdx[i]; } } var reader = new DataReader(new MemoryStream(meta.DataSection.Data), Endianess.BigEndian); reader.Position = meta.DataMappingSection.Entries[meta.DataMappingSection.RootIndex - 1].Offset; resultStructure.Read(reader); var stack = new Stack <PsoStructure>(); stack.Push(resultStructure); while (stack.Count > 0) { var x = stack.Pop(); foreach (var ee in x.psoSection.Entries) { if (ee.EntryNameHash == 0x100) { continue; } var value = x.Values[ee.EntryNameHash]; if (value is PsoStructure) { stack.Push((PsoStructure)value); } if (value is PsoArray) { var arrayValue = (PsoArray)value; switch (arrayValue.psoSection.Type) { case DataType.Structure: { if (arrayValue.NumberOfEntries > 0) { arrayValue.Entries = new List <IPsoValue>(); reader.Position = meta.DataMappingSection.Entries[arrayValue.BlockIndex - 1].Offset + arrayValue.Offset; for (int i = 0; i < arrayValue.NumberOfEntries; i++) { PsoStructure item = new PsoStructure(); item.pso = meta; item.psoSection = null; for (int y = 0; y < meta.DefinitionSection.Count; y++) { if (meta.DefinitionSection.EntriesIdx[y].NameHash == arrayValue.psoSection.ReferenceKey) { item.psoSection = (PsoStructureInfo)meta.DefinitionSection.Entries[y]; item.psoEntryInfo = meta.DefinitionSection.EntriesIdx[y]; } } item.Read(reader); arrayValue.Entries.Add(item); stack.Push(item); } } break; } case DataType.INT_0Bh: { if (arrayValue.NumberOfEntries > 0) { arrayValue.Entries = new List <IPsoValue>(); reader.Position = meta.DataMappingSection.Entries[arrayValue.BlockIndex - 1].Offset + arrayValue.Offset; for (int i = 0; i < arrayValue.NumberOfEntries; i++) { PsoType11 item = new PsoType11(0); item.Read(reader); arrayValue.Entries.Add(item); } } break; } default: throw new System.Exception("Unknown array type."); } } } } return(resultStructure); }