private static string GetSymbolName(uint id) { if (_SymbolNames.Contains(id) == false) { return("0x" + id.ToString("X8")); } return(_SymbolNames[id]); }
public string Compose(ProjectData.HashList <uint> names) { string key = this._Value.Key.ToString("X8", CultureInfo.InvariantCulture); string value = this._Value.Value.ToString("X8", CultureInfo.InvariantCulture); if (names.Contains(this._Value.Key) && names[this._Value.Key].IndexOf('=') == -1) { key = "$" + names[this._Value.Key]; } if (names.Contains(this._Value.Value) && names[this._Value.Value].IndexOf('=') == -1) { value = "$" + names[this._Value.Value]; } if (key == value) { return(key); } return(String.Format( "{0}={1}", key, value)); }
private static string Compose(KeyValuePair <uint, uint> kv, ProjectData.HashList <uint> names) { string key = kv.Key.ToString("X8", CultureInfo.InvariantCulture); string value = kv.Value.ToString("X8", CultureInfo.InvariantCulture); if (names.Contains(kv.Key) && names[kv.Key].IndexOf('=') == -1 && names[kv.Key].IndexOf(',') == -1) { key = names[kv.Key]; } if (names.Contains(kv.Value) && names[kv.Value].IndexOf('=') == -1 && names[kv.Value].IndexOf(',') == -1) { value = names[kv.Value]; } if (key == value) { return(key); } return(String.Format( "{0}={1}", key, value)); }
private static void WriteObject(XmlWriter writer, FileFormats.Property.Node node) { if (node.Tag != null) { writer.WriteAttributeString("tag", node.Tag); } // is this ridiculous? // yeeeeep. var nodesByName = node.Nodes .Where(kv => node.KnownNames.ContainsKey(kv.Key) == true) .Select(kv => new KeyValuePair <string, FileFormats.Property.Node>(node.KnownNames[kv.Key], kv.Value)) .Concat( node.Nodes .Where(kv => node.KnownNames.ContainsKey(kv.Key) == false && _Names.Contains(kv.Key) == true) .Select(kv => new KeyValuePair <string, FileFormats.Property.Node>(_Names[kv.Key], kv.Value))) .ToArray(); var nodesByHash = node.Nodes .Where(kv => node.KnownNames.ContainsKey(kv.Key) == false && _Names.Contains(kv.Key) == false) .Select(kv => kv) .ToArray(); var variantsByName = node.Variants .Where(kv => node.KnownNames.ContainsKey(kv.Key) == true) .Select(kv => new KeyValuePair <string, FileFormats.Property.IVariant>(node.KnownNames[kv.Key], kv.Value)) .Concat( node.Variants .Where(kv => node.KnownNames.ContainsKey(kv.Key) == false && _Names.Contains(kv.Key) == true) .Select(kv => new KeyValuePair <string, FileFormats.Property.IVariant>(_Names[kv.Key], kv.Value))) .ToArray(); var variantsByHash = node.Variants .Where(kv => node.KnownNames.ContainsKey(kv.Key) == false && _Names.Contains(kv.Key) == false) .Select(kv => kv) .ToArray(); if (variantsByName.Length > 0) { foreach (var kv in variantsByName.OrderBy(kv => kv.Key)) { writer.WriteStartElement("value"); writer.WriteAttributeString("name", kv.Key); WriteProperty(writer, kv.Value); writer.WriteEndElement(); } } if (nodesByName.Length > 0) { foreach (var kv in nodesByName.OrderBy(kv => kv.Key)) { writer.WriteStartElement("object"); writer.WriteAttributeString("name", kv.Key); WriteObject(writer, kv.Value); writer.WriteEndElement(); } } if (variantsByHash.Length > 0) { foreach (var kv in variantsByHash.OrderBy(p => p.Key, new NameComparer(_Names))) { writer.WriteStartElement("value"); if (_Names.Contains(kv.Key) == true) { writer.WriteAttributeString("name", _Names[kv.Key]); } else { writer.WriteAttributeString("id", kv.Key.ToString("X8")); } WriteProperty(writer, kv.Value); writer.WriteEndElement(); } } if (nodesByHash.Length > 0) { foreach (var kv in nodesByHash.OrderBy(n => n.Key, new NameComparer(_Names))) { writer.WriteStartElement("object"); if (_Names.Contains(kv.Key) == true) { writer.WriteAttributeString("name", _Names[kv.Key]); } else { writer.WriteAttributeString("id", kv.Key.ToString("X8")); } WriteObject(writer, kv.Value); writer.WriteEndElement(); } } }
private static void WriteObject(XmlWriter writer, Node node) { if (_Names.Contains(node.NameHash) == true) { writer.WriteAttributeString("name", _Names[node.NameHash]); } else { writer.WriteAttributeString("id", node.NameHash.ToString("X8")); } // is this ridiculous? // yeeeeep. var childrenByName = node.Children .Where(c => _Names.Contains(c.NameHash) == true) .Select(c => new KeyValuePair <string, Node>(_Names[c.NameHash], c)) .ToArray(); var childrenByNameHash = node.Children .Where(c => _Names.Contains(c.NameHash) == false) .Select(c => c) .ToArray(); var propertiesByName = node.Properties .Where(kv => _Names.Contains(kv.Key) == true) .Select(kv => new KeyValuePair <string, IVariant>(_Names[kv.Key], kv.Value)) .ToArray(); var propertiesByNameHash = node.Properties .Where(kv => _Names.Contains(kv.Key) == false) .Select(kv => kv) .ToArray(); if (propertiesByName.Length > 0) { foreach (var kv in propertiesByName.OrderBy(kv => kv.Key)) { writer.WriteStartElement("value"); writer.WriteAttributeString("name", kv.Key); WriteProperty(writer, kv.Value); writer.WriteEndElement(); } } if (childrenByName.Length > 0) { foreach (var kv in childrenByName.OrderBy(kv => kv.Key)) { writer.WriteStartElement("object"); //writer.WriteAttributeString("name", kv.Key); WriteObject(writer, kv.Value); writer.WriteEndElement(); } } if (propertiesByNameHash.Length > 0) { foreach (var kv in propertiesByNameHash.OrderBy(p => p.Key, new NameComparer(_Names))) { writer.WriteStartElement("value"); writer.WriteAttributeString("id", kv.Key.ToString("X8")); WriteProperty(writer, kv.Value); writer.WriteEndElement(); } } if (childrenByNameHash.Length > 0) { foreach (var child in childrenByNameHash.OrderBy(c => c.NameHash, new NameComparer(_Names))) { writer.WriteStartElement("object"); WriteObject(writer, child); writer.WriteEndElement(); } } }
public static void Run(string currentProject, List <string> extras) { var manager = ProjectData.Manager.Load(currentProject); if (manager.ActiveProject == null) { Console.WriteLine("Warning: no active project loaded."); } _PropertyNames = manager.LoadListsPropertySetPropertyNames(); _SymbolNames = manager.LoadListsPropertySetSymbolNames(); string inputPath = extras[0]; string outputPath = extras.Count > 1 ? extras[1] : Path.ChangeExtension(inputPath, null) + "_unpack"; Directory.CreateDirectory(outputPath); var inventory = new PropertySetInventory(); using (var input = File.OpenRead(inputPath)) { inventory.Deserialize(input, Endian.Little); } foreach (var item in inventory.Items) { if (item.Name.HashSymbol() == item.Id && _SymbolNames.Contains(item.Id) == false) { _SymbolNames.Add(item.Id, item.Name); } } var settings = new XmlWriterSettings { Indent = true, IndentChars = "\t", CheckCharacters = false, }; var indexPath = Path.Combine(outputPath, "@resource.xml"); using (var indexWriter = XmlWriter.Create(indexPath, settings)) { indexWriter.WriteStartDocument(); indexWriter.WriteStartElement("Resources"); foreach (var item in inventory.Items) { string xmlName; if (_SymbolNames.Contains(item.Id) == false) { if ((uint)item.Name.HashSymbol() != item.Id) { // todo: make this look up correct names from lists Console.WriteLine( "Hash of {0:X8} doesn't match hash of '{1}' -- name probably got truncated!", item.Id, item.Name); xmlName = string.Format(@"__TRUNCATED\{0}_{1:X8}.xml", item.Name, item.Id); } else { xmlName = item.Name + ".xml"; } } else { xmlName = _SymbolNames[item.Id] + ".xml"; } if (item.Id != item.Root.Name.Id) { throw new InvalidOperationException(); } indexWriter.WriteStartElement("Resource"); indexWriter.WriteAttributeString("name", item.Name); indexWriter.WriteAttributeString("flags", item.Flags.ToString()); indexWriter.WriteValue(xmlName); indexWriter.WriteEndElement(); var itemPath = Path.Combine(outputPath, xmlName); using (var itemWriter = XmlWriter.Create(itemPath, settings)) { itemWriter.WriteStartDocument(); itemWriter.WriteStartElement("Resource"); WritePropertySet(itemWriter, item.Root); itemWriter.WriteEndElement(); itemWriter.WriteEndDocument(); itemWriter.Flush(); } } indexWriter.WriteEndElement(); indexWriter.WriteEndDocument(); indexWriter.Flush(); } }