Exemplo n.º 1
0
        public static void Main(string[] args)
        {
            var  mode     = Mode.Unknown;
            bool showHelp = false;

            var options = new OptionSet()
            {
                { "stb", "convert XML to STB", v => mode = v != null ? Mode.ToStb : mode },
                { "xml", "convert STB to XML", v => mode = v != null ? Mode.ToXml : mode },
                { "h|help", "show this message and exit", v => showHelp = v != null },
            };

            List <string> extras;

            try
            {
                extras = options.Parse(args);
            }
            catch (OptionException e)
            {
                Console.Write("{0}: ", GetExecutableName());
                Console.WriteLine(e.Message);
                Console.WriteLine("Try `{0} --help' for more information.", GetExecutableName());
                return;
            }

            if (mode == Mode.Unknown &&
                extras.Count >= 1)
            {
                var extension = Path.GetExtension(extras[0]);

                if (extension == ".stb")
                {
                    mode = Mode.ToXml;
                }
                else if (extension == ".xml")
                {
                    mode = Mode.ToStb;
                }
            }

            if (showHelp == true ||
                mode == Mode.Unknown ||
                extras.Count < 1 ||
                extras.Count > 2)
            {
                Console.WriteLine("Usage: {0} [OPTIONS]+ input [output]", GetExecutableName());
                Console.WriteLine();
                Console.WriteLine("Options:");
                options.WriteOptionDescriptions(Console.Out);
                return;
            }

            if (mode == Mode.ToStb)
            {
                string inputPath  = extras[0];
                string outputPath = extras.Count > 1
                                        ? extras[1]
                                        : Path.ChangeExtension(inputPath, null) + "_converted.stb";

                var culture = CultureInfo.InvariantCulture;
                var stb     = new StageBinaryFile();
                using (var input = File.OpenRead(inputPath))
                {
                    var doc  = new XPathDocument(input);
                    var nav  = doc.CreateNavigator();
                    var root = nav.SelectSingleNode("/stage");
                    if (root == null)
                    {
                        throw new InvalidOperationException();
                    }

                    var rawRooms = root.Select("room");
                    var rooms    = new List <StageBinaryFile.Room>();
                    while (rawRooms.MoveNext() == true)
                    {
                        var rawRoom = rawRooms.Current;
                        var room    = new StageBinaryFile.Room();
                        ParseAttribute(rawRoom, "type", out room.Type, culture);
                        ParseAttribute(rawRoom, "variant", out room.Variant, culture);
                        ParseAttribute(rawRoom, "name", out room.Name);
                        ParseAttribute(rawRoom, "difficulty", out room.Difficulty, culture);
                        ParseAttribute(rawRoom, "weight", out room.Weight, culture);
                        ParseAttribute(rawRoom, "width", out room.Width, culture);
                        ParseAttribute(rawRoom, "height", out room.Height, culture);

                        var rawDoors = rawRoom.Select("door");
                        var doors    = new List <StageBinaryFile.Door>();
                        while (rawDoors.MoveNext() == true)
                        {
                            var rawDoor = rawDoors.Current;
                            var door    = new StageBinaryFile.Door();
                            ParseAttribute(rawDoor, "x", out door.X, culture);
                            ParseAttribute(rawDoor, "y", out door.Y, culture);
                            ParseAttribute(rawDoor, "exists", out door.Exists);
                            doors.Add(door);
                        }
                        room.Doors = doors.ToArray();

                        var rawSpawns = rawRoom.Select("spawn");
                        var spawns    = new List <StageBinaryFile.Spawn>();
                        while (rawSpawns.MoveNext() == true)
                        {
                            var rawSpawn = rawSpawns.Current;
                            var spawn    = new StageBinaryFile.Spawn();
                            ParseAttribute(rawSpawn, "x", out spawn.X, culture);
                            ParseAttribute(rawSpawn, "y", out spawn.Y, culture);

                            var rawEntities = rawSpawn.Select("entity");
                            var entities    = new List <StageBinaryFile.Entity>();
                            while (rawEntities.MoveNext() == true)
                            {
                                var rawEntity = rawEntities.Current;
                                var entity    = new StageBinaryFile.Entity();
                                ParseAttribute(rawEntity, "type", out entity.Type, culture);
                                ParseAttribute(rawEntity, "variant", out entity.Variant, culture);
                                ParseAttribute(rawEntity, "subtype", out entity.Subtype, culture);
                                ParseAttribute(rawEntity, "weight", out entity.Weight, culture);
                                entities.Add(entity);
                            }
                            spawn.Entities = entities.ToArray();

                            spawns.Add(spawn);
                        }
                        room.Spawns = spawns.ToArray();
                        rooms.Add(room);
                    }

                    stb.Rooms.Clear();
                    stb.Rooms.AddRange(rooms);
                }

                using (var output = File.Create(outputPath))
                {
                    stb.Serialize(output);
                    output.Flush();
                }
            }
            else if (mode == Mode.ToXml)
            {
                string inputPath  = extras[0];
                string outputPath = extras.Count > 1
                                        ? extras[1]
                                        : Path.ChangeExtension(inputPath, null) + "_converted.xml";

                var stb = new StageBinaryFile();
                using (var input = File.OpenRead(inputPath))
                {
                    stb.Deserialize(input);
                }

                var settings = new XmlWriterSettings
                {
                    Encoding           = Encoding.UTF8,
                    Indent             = true,
                    OmitXmlDeclaration = true
                };

                var culture = CultureInfo.InvariantCulture;
                using (var writer = XmlWriter.Create(outputPath, settings))
                {
                    writer.WriteStartDocument();
                    writer.WriteComment("Converted to ANM2 by Gibbed.Rebirth.ConvertStage");

                    writer.WriteStartElement("stage");

                    foreach (var room in stb.Rooms)
                    {
                        writer.WriteStartElement("room");
                        writer.WriteAttributeString("type", room.Type.ToString(culture));
                        writer.WriteAttributeString("variant", room.Variant.ToString(culture));
                        writer.WriteAttributeString("name", room.Name);
                        writer.WriteAttributeString("difficulty", room.Difficulty.ToString(culture));
                        writer.WriteAttributeString("weight", room.Weight.ToString(culture));
                        writer.WriteAttributeString("width", room.Width.ToString(culture));
                        writer.WriteAttributeString("height", room.Height.ToString(culture));

                        foreach (var door in room.Doors)
                        {
                            writer.WriteStartElement("door");
                            writer.WriteAttributeString("x", door.X.ToString(culture));
                            writer.WriteAttributeString("y", door.Y.ToString(culture));

                            if (door.Exists == true)
                            {
                                writer.WriteAttributeString("exists", door.Exists.ToString(culture));
                            }

                            writer.WriteEndElement();
                        }

                        foreach (var spawn in room.Spawns)
                        {
                            writer.WriteStartElement("spawn");
                            writer.WriteAttributeString("x", spawn.X.ToString(culture));
                            writer.WriteAttributeString("y", spawn.Y.ToString(culture));

                            foreach (var entity in spawn.Entities)
                            {
                                writer.WriteStartElement("entity");
                                writer.WriteAttributeString("type", entity.Type.ToString(culture));
                                writer.WriteAttributeString("variant", entity.Variant.ToString(culture));
                                writer.WriteAttributeString("subtype", entity.Subtype.ToString(culture));
                                writer.WriteAttributeString("weight", entity.Weight.ToString(culture));
                                writer.WriteEndElement();
                            }

                            writer.WriteEndElement();
                        }

                        writer.WriteEndElement();
                    }

                    writer.WriteEndElement();
                    writer.WriteEndDocument();
                }
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
Exemplo n.º 2
0
        private void LoadFileClick(object sender, EventArgs e)
        {
            FileDialog loadDialog = new OpenFileDialog();

            loadDialog.ShowDialog();
            if (loadDialog.FileName.Equals(""))
            {
                return;
            }
            XmlReaderSettings settings = new XmlReaderSettings();

            settings.CloseInput = true;
            if (!loadDialog.FileName.Equals(""))
            {
                if (loadDialog.FileName.EndsWith("entities2.xml"))
                {
                    var fileToLoad = XmlReader.Create(File.Open(loadDialog.FileName, FileMode.Open), settings);
                    EntityStore.LoadEntities(fileToLoad);
                    this.EntityBox.DataSource = EntityStore.getNames();
                }
                else if (loadDialog.FileName.EndsWith("animations.b"))
                {
                    AnimationBinaryFile file = new AnimationBinaryFile();
                    file.Deserialize(File.Open(loadDialog.FileName, FileMode.Open));
                    XmlWriterSettings mySettings = new XmlWriterSettings();
                    mySettings.CloseOutput        = true;
                    mySettings.Indent             = true;
                    mySettings.OmitXmlDeclaration = true;
                    mySettings.ConformanceLevel   = ConformanceLevel.Auto;
                    StreamReader reader =
                        new StreamReader(
                            File.Open(
                                Path.Combine(
                                    Path.GetDirectoryName(Application.ExecutablePath),
                                    "animations.animlist"),
                                FileMode.Open));
                    reader.ReadLine();
                    int a = 0;
                    foreach (var type2 in file.result.unknown1)
                    {
                        a++;

                        string filename = a + ".anm2";
                        if (!reader.EndOfStream)
                        {
                            filename = reader.ReadLine();
                        }
                        filename = Path.Combine(loadDialog.FileName.Replace(".b", "_unpacked"), filename);
                        Directory.CreateDirectory(Path.GetDirectoryName(filename));

                        XmlWriter writer = XmlWriter.Create(filename, mySettings);
                        writer.WriteStartElement("AnimatedActor");
                        writer.WriteWhitespace("\n\t");
                        writer.WriteStartElement("info");
                        writer.WriteAttributeString("NameHash", type2.unknown1.ToString());
                        writer.WriteAttributeString("BasePath", type2.unknown2);
                        writer.WriteAttributeString("DefaultAnimation", type2.unknown7);
                        writer.WriteEndElement();
                        writer.WriteWhitespace("\n\t");

                        writer.WriteStartElement("content");
                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteStartElement("Spritesheets");
                        foreach (var type3 in type2.unknown3)
                        {
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Spritesheet");
                            writer.WriteAttributeString("Path", type3.unknown1.ToString());
                            writer.WriteAttributeString("Id", type3.unknown2);
                            writer.WriteEndElement();
                        }
                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteEndElement();

                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteStartElement("Layers");
                        foreach (var type4 in type2.unknown4)
                        {
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Layer");
                            writer.WriteAttributeString("Name", type4.unknown1.ToString());
                            writer.WriteAttributeString("Id", type4.unknown2.ToString());
                            writer.WriteAttributeString("SpritesheetId", type4.unknown3);
                            writer.WriteEndElement();
                        }
                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteEndElement();



                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteStartElement("Nulls");
                        foreach (var type5 in type2.unknown5)
                        {
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Null");
                            writer.WriteAttributeString("Id", type5.unknown1.ToString());
                            writer.WriteAttributeString("Name", type5.unknown2);
                            writer.WriteEndElement();
                        }

                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteEndElement();

                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteStartElement("Events");
                        foreach (var type6 in type2.unknown6)
                        {
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Event");
                            writer.WriteAttributeString("Id", type6.unknown1.ToString());
                            writer.WriteAttributeString("Name", type6.unknown2);
                            writer.WriteEndElement();
                        }
                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteEndElement();

                        writer.WriteWhitespace("\n\t\t");
                        writer.WriteStartElement("Animations");
                        foreach (var type7 in type2.unknown8)
                        {
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Animation");
                            writer.WriteAttributeString("Name", type7.unknown1);
                            writer.WriteAttributeString("FrameNum", type7.unknown2.ToString());
                            writer.WriteAttributeString("Loop", type7.unknown3.ToString());
                            writer.WriteStartElement("RootAnimation");
                            foreach (var type8 in type7.unknown4)
                            {
                                writer.WriteWhitespace("\n\t\t\t\t");
                                writer.WriteStartElement("RootFrame");
                                writer.WriteAttributeString("XPosition", type8.unknown1.ToString());
                                writer.WriteAttributeString("YPosition", type8.unknown2.ToString());
                                writer.WriteAttributeString("Delay", type8.unknown3.ToString());
                                writer.WriteAttributeString("Visible", type8.unknown4.ToString());
                                writer.WriteAttributeString("XScale", type8.unknown5.ToString());
                                writer.WriteAttributeString("YScale", type8.unknown6.ToString());
                                writer.WriteAttributeString("RedTint", type8.unknown7.ToString());
                                writer.WriteAttributeString("GreenTint", type8.unknown8.ToString());
                                writer.WriteAttributeString("BlueTint", type8.unknown9.ToString());
                                writer.WriteAttributeString("AlphaTint", type8.unknown10.ToString());
                                writer.WriteAttributeString("RedOffset", type8.unknown11.ToString());
                                writer.WriteAttributeString("GreenOffset", type8.unknown12.ToString());
                                writer.WriteAttributeString("BlueOffset", type8.unknown13.ToString());
                                writer.WriteAttributeString("Rotation", type8.unknown14.ToString());
                                writer.WriteAttributeString("Interpolated", type8.unknown15.ToString());
                                writer.WriteEndElement();
                            }

                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteEndElement();
                            writer.WriteWhitespace("\n\t\t\t");

                            writer.WriteStartElement("LayerAnimations");
                            foreach (var type9 in type7.unknown5)
                            {
                                writer.WriteWhitespace("\n\t\t\t\t");
                                writer.WriteStartElement("Layer");
                                writer.WriteAttributeString("LayerID", type9.unknown1.ToString());
                                writer.WriteAttributeString("Visible", type9.unknown2.ToString());
                                writer.WriteWhitespace("\n\t\t\t\t\t");
                                writer.WriteStartElement("KeyFrames");
                                foreach (var type10 in type9.unknown3)
                                {
                                    writer.WriteWhitespace("\n\t\t\t\t\t\t");
                                    writer.WriteStartElement("Frame");
                                    writer.WriteAttributeString("XPosition", type10.unknown1.ToString());
                                    writer.WriteAttributeString("YPosition", type10.unknown2.ToString());
                                    writer.WriteAttributeString("XPivot", type10.unknown3.ToString());
                                    writer.WriteAttributeString("YPivot", type10.unknown4.ToString());
                                    writer.WriteAttributeString("Width", type10.unknown5.ToString());
                                    writer.WriteAttributeString("Height", type10.unknown6.ToString());
                                    writer.WriteAttributeString("XScale", type10.unknown7.ToString());
                                    writer.WriteAttributeString("YScale", type10.unknown8.ToString());
                                    writer.WriteAttributeString("Delay", type10.unknown9.ToString());
                                    writer.WriteAttributeString("Visible", type10.unknown10.ToString());
                                    writer.WriteAttributeString("XCrop", type10.unknown11.ToString());
                                    writer.WriteAttributeString("YCrop", type10.unknown12.ToString());
                                    writer.WriteAttributeString("RedTint", type10.unknown13.ToString());
                                    writer.WriteAttributeString("GreenTint", type10.unknown14.ToString());
                                    writer.WriteAttributeString("BlueTint", type10.unknown15.ToString());
                                    writer.WriteAttributeString("AlphaTint", type10.unknown16.ToString());
                                    writer.WriteAttributeString("RedOffset", type10.unknown17.ToString());
                                    writer.WriteAttributeString("GreenOffset", type10.unknown18.ToString());
                                    writer.WriteAttributeString("BlueOffset", type10.unknown19.ToString());
                                    writer.WriteAttributeString("AlphaOffset", type10.unknown20.ToString());
                                    writer.WriteAttributeString("Rotation", type10.unknown21.ToString());
                                    writer.WriteAttributeString("Interpolated", type10.unknown21.ToString());
                                    writer.WriteEndElement();
                                }

                                writer.WriteWhitespace("\n\t\t\t\t\t");
                                writer.WriteEndElement();
                                writer.WriteWhitespace("\n\t\t\t\t");
                                writer.WriteEndElement();
                            }

                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteEndElement();
                            foreach (var type11 in type7.unknown6)
                            {
                                writer.WriteWhitespace("\n\t\t\t");
                                writer.WriteStartElement("NullAnimations");
                                writer.WriteAttributeString("NullId", type7.unknown2.ToString());
                                writer.WriteAttributeString("Visible", type7.unknown3.ToString());
                                foreach (var type8 in type11.unknown3)
                                {
                                    writer.WriteWhitespace("\n\t\t\t\t");
                                    writer.WriteStartElement("NullFrame");
                                    writer.WriteAttributeString("XPosition", type8.unknown1.ToString());
                                    writer.WriteAttributeString("YPosition", type8.unknown2.ToString());
                                    writer.WriteAttributeString("Delay", type8.unknown3.ToString());
                                    writer.WriteAttributeString("Visible", type8.unknown4.ToString());
                                    writer.WriteAttributeString("XScale", type8.unknown5.ToString());
                                    writer.WriteAttributeString("YScale", type8.unknown6.ToString());
                                    writer.WriteAttributeString("RedTint", type8.unknown7.ToString());
                                    writer.WriteAttributeString("GreenTint", type8.unknown8.ToString());
                                    writer.WriteAttributeString("BlueTint", type8.unknown9.ToString());
                                    writer.WriteAttributeString("AlphaTint", type8.unknown10.ToString());
                                    writer.WriteAttributeString("RedOffset", type8.unknown11.ToString());
                                    writer.WriteAttributeString("GreenOffset", type8.unknown12.ToString());
                                    writer.WriteAttributeString("BlueOffset", type8.unknown13.ToString());
                                    writer.WriteAttributeString("Rotation", type8.unknown14.ToString());
                                    writer.WriteAttributeString("Interpolated", type8.unknown15.ToString());
                                    writer.WriteEndElement();
                                }
                                writer.WriteWhitespace("\n\t\t\t");
                                writer.WriteEndElement();
                            }


                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteStartElement("Triggers");
                            foreach (var type11 in type7.unknown7)
                            {
                                writer.WriteWhitespace("\n\t\t\t\t");
                                writer.WriteStartElement("Trigger");
                                writer.WriteAttributeString("EventId", type11.unknown1.ToString());
                                writer.WriteAttributeString("AtFrame", type11.unknown2.ToString());
                                writer.WriteEndElement();
                            }
                            writer.WriteWhitespace("\n\t\t\t");
                            writer.WriteEndElement();
                            writer.WriteWhitespace("\n\t\t");
                            writer.WriteEndElement();
                        }
                        writer.WriteWhitespace("\n\t");
                        writer.WriteEndElement();
                        writer.WriteWhitespace("\n");
                        writer.WriteEndElement();
                        writer.Close();
                    }
                    reader.Close();
                }
                else
                {
                    loadedFile = new StageBinaryFile();
                    loadedFile.Deserialize(File.Open(loadDialog.FileName, FileMode.Open));


                    this.Text = "Binding of isaac: Rebirth level editor - "
                                + Path.GetFileNameWithoutExtension(loadDialog.FileName);
                    this.roomComboBox.DataSource = loadedFile.RoomNames;
                }
            }
        }