void SetStringsIndexes(ref BymlFile File, GenericNode Node) { for (int i = 0; i < Node.SubNodes.Count; i++) { if (Node.SubNodes[i].Name != null) { Node.SubNodes[i].StringIndex = (uint)File.NodeNames.Strings.IndexOf(Node.SubNodes[i].Name); Node.SubNodes[i].Name = null; } else { Node.SubNodes[i].StringIndex = 0; } if (Node.SubNodes[i].NodeType == (byte)SubNodeValTypes.String) { if (Node.SubNodes[i].StringValue != null && Node.SubNodes[i].StringValue.Trim() != "") { Node.SubNodes[i].Value = BitConverter.GetBytes((UInt32)File.StringRes.Strings.IndexOf(StringFromXml(Node.SubNodes[i].StringValue))); } else { Node.SubNodes[i].Value = new byte[4]; } } if (Node.SubNodes[i].NodeType == 0xC0 || Node.SubNodes[i].NodeType == 0xC1) { SetStringsIndexes(ref File, Node.SubNodes[i]); } } }
BymlFile ImportFromXml(string file) { BymlFile ret = new BymlFile(); XmlDocument xml = new XmlDocument(); xml.LoadXml(file); XmlNode n = xml.SelectSingleNode("/Root/isBigEndian"); ret.header = new Header(); ret.header.BigEndian = Convert.ToBoolean(n.Attributes["Value"].Value); n = xml.SelectSingleNode("/Root/BymlFormatVersion"); if (n == null) { ret.header.Version = 1; } else { ret.header.Version = UInt16.Parse(n.Attributes["Value"].Value); } n = xml.SelectSingleNode("/Root"); ret.RootNode.NodeType = n.LastChild.Name == "C1" ? (byte)0xC1 : (byte)0xC0; ret.RootNode.SubNodes.AddRange(XmlToNode(n.LastChild.ChildNodes)); ProcessStrings(ref ret, ret.RootNode); List <string> tmp = new List <string>(); for (int i = 0; i < ret.StringRes.Strings.Count; i++) { ret.StringRes.Strings[i] = StringToJapChar(ret.StringRes.Strings[i]); //Some tricks to get the right order, i HATE text encondings } for (int i = 0; i < ret.NodeNames.Strings.Count; i++) { ret.NodeNames.Strings[i] = StringToJapChar(ret.NodeNames.Strings[i]); } ret.StringRes.Strings.Sort(StringComparer.Ordinal); ret.NodeNames.Strings.Sort(StringComparer.Ordinal); if (ret.StringRes.Strings.Count == 0) { ret.StringRes.IsNull = true; } if (ret.NodeNames.Strings.Count == 0) { ret.NodeNames.IsNull = true; } for (int i = 0; i < ret.StringRes.Strings.Count; i++) { ret.StringRes.Strings[i] = StringFromXml(ret.StringRes.Strings[i]); } for (int i = 0; i < ret.NodeNames.Strings.Count; i++) { ret.NodeNames.Strings[i] = StringFromXml(ret.NodeNames.Strings[i]); } SetStringsIndexes(ref ret, ret.RootNode); return(ret); }
string exportToXml(BymlFile File) { CustomStringWriter str = new CustomStringWriter(Encoding.GetEncoding(932)); XmlTextWriter xr; xr = new XmlTextWriter(str); xr.Formatting = System.Xml.Formatting.Indented; xr.WriteStartDocument(); xr.WriteStartElement("Root"); xr.WriteStartElement("isBigEndian"); xr.WriteAttributeString("Value", File.header.BigEndian.ToString()); xr.WriteEndElement(); xr.WriteStartElement("BymlFormatVersion"); xr.WriteAttributeString("Value", File.header.Version.ToString()); xr.WriteEndElement(); GenericNode RootNode = File.RootNode; xr.WriteStartElement(RootNode.NodeType == (byte)0xC1 ? "C1" : "C0"); saveNode(RootNode.SubNodes.ToArray(), xr); xr.WriteEndElement(); xr.WriteEndElement(); xr.Close(); return(str.ToString()); }
void ProcessStrings(ref BymlFile File, GenericNode Node) { for (int i = 0; i < Node.SubNodes.Count; i++) { if (Node.SubNodes[i].Name != null) { if (!File.NodeNames.Strings.Contains(Node.SubNodes[i].Name)) { File.NodeNames.Strings.Add(Node.SubNodes[i].Name); } } if (Node.SubNodes[i].NodeType == (byte)SubNodeValTypes.String) { if (!File.StringRes.Strings.Contains(StringFromXml(Node.SubNodes[i].StringValue))) { File.StringRes.Strings.Add(StringFromXml(Node.SubNodes[i].StringValue)); } } if (Node.SubNodes[i].NodeType == 0xC0 || Node.SubNodes[i].NodeType == 0xC1) { ProcessStrings(ref File, Node.SubNodes[i]); } } }