private static void BeginTagBlock(StreamWriter streamWriter, Struct structure) { streamWriter.Write( @"public class {0} : TagBlock {{ public {0}() : base({1}", structure.Name, structure.Size); if (structure.Children.Count > 0) { streamWriter.WriteLine(", new TagBlockField[] {"); int offset = 0; foreach (var child in structure.Children) { if (offset < child.Offset) { var shift = child.Offset - offset; streamWriter.WriteLine(" new TagBlockField(null, {0}),", shift); offset += shift; } else if (offset > child.Offset) throw new InvalidProgramException(); ProcessName(child); streamWriter.WriteLine(" new TagBlockField(new {0}()),", child.TypeName); offset += child.FieldSize; } streamWriter.WriteLine("}) { }"); foreach(var child in structure.Children) { BeginTagBlock(streamWriter, child); } } else { streamWriter.WriteLine(") { }"); } streamWriter.WriteLine(@"}"); }
private static void ProcessName(Struct child) { if (!Names.ContainsKey(child.Name)) { Names[child.Name] = 0; } else { Names[child.Name]++; child.Name = child.Name + Names[child.Name]; } }
public static void ConvertEnt(Stream plugin, Stream output) { Names.Clear(); pluginStructure = new Struct(); using (XmlReader xmlReader = XmlReader.Create(plugin)) { while (xmlReader.Read()) { switch (xmlReader.NodeType) { case XmlNodeType.Element: switch (xmlReader.Name.ToLower()) { case "plugin": pluginStructure.Read(xmlReader.ReadSubtree()); break; } break; } } } using (StreamWriter streamWriter = new StreamWriter(output)) { streamWriter.WriteLine( @"using Moonfish; using Moonfish.Definitions; using Moonfish.Structures; namespace Moonfish {{ [TagClass(""{0}"")]", pluginStructure.Name); BeginTagBlock(streamWriter, pluginStructure); streamWriter.WriteLine("}"); } }