From f85b76410d548bf6acb0021089bd4b0b6e59784a Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sat, 2 Nov 2019 21:42:38 +0800 Subject: [PATCH 1/7] Update ExportToProject.csx --- ExportToProject.csx | 123 ++++++++++++++------------------------------ 1 file changed, 39 insertions(+), 84 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index c00ef5f..555a4b6 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -4,6 +4,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; +using System.Xml.Linq; using System.Drawing; using UndertaleModLib.Models; using UndertaleModLib.Util; @@ -14,6 +15,7 @@ string projFolder = GetFolder(FilePath) + "Export_Project" + Path.DirectorySepar var context = new DecompileContext(Data, true); TextureWorker worker = new TextureWorker(); ThreadLocal DECOMPILE_CONTEXT = new ThreadLocal(() => new DecompileContext(Data, false)); +string gmxDeclaration = "This Document is generated by GameMaker, if you edit it by hand then you do so at your own risk!"; if (Directory.Exists(projFolder)) { @@ -81,104 +83,56 @@ async Task ExportSprites() void ExportSprite(UndertaleSprite sprite) { // Save the sprite GMX - var xmlWriter = XmlWriter.Create(projFolder + "/sprites/" + sprite.Name.Content + ".sprite.gmx"); - xmlWriter.WriteStartDocument(); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("sprite", + new XElement("type", "0"), + new XElement("xorig", sprite.OriginX.ToString()), + new XElement("yorigin", sprite.OriginY.ToString()), + new XElement("colkind", sprite.BBoxMode.ToString()), + new XElement("coltolerance", "0"), + new XElement("sepmasks", sprite.SepMasks.ToString("D")), + new XElement("bboxmode", sprite.BBoxMode.ToString()), + new XElement("bbox_left", sprite.MarginLeft.ToString()), + new XElement("bbox_right", sprite.MarginRight.ToString()), + new XElement("bbox_top", sprite.MarginTop.ToString()), + new XElement("bbox_bottom", sprite.MarginBottom.ToString()), + new XElement("HTile", "0"), + new XElement("VTile", "0"), + new XElement("TextureGroups", + new XElement("TextureGroup0", "0") + ), + new XElement("For3D", "0"), + new XElement("width", sprite.Width.ToString()), + new XElement("height", sprite.Height.ToString()), + new XElement("frames"), + new XElement("bbox_right", sprite.MarginRight.ToString()) + ) + ); - xmlWriter.WriteStartElement("sprite"); - - xmlWriter.WriteStartElement("type"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("xorig"); - xmlWriter.WriteString(sprite.OriginX.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("yorigin"); - xmlWriter.WriteString(sprite.OriginY.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("colkind"); - xmlWriter.WriteString(sprite.BBoxMode.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("coltolerance"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("sepmasks"); - xmlWriter.WriteString(sprite.SepMasks.ToString("D")); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bboxmode"); - xmlWriter.WriteString(sprite.BBoxMode.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bbox_left"); - xmlWriter.WriteString(sprite.MarginLeft.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bbox_right"); - xmlWriter.WriteString(sprite.MarginRight.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bbox_top"); - xmlWriter.WriteString(sprite.MarginTop.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bbox_bottom"); - xmlWriter.WriteString(sprite.MarginBottom.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("HTile"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("VTile"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("TextureGroups"); - xmlWriter.WriteStartElement("TextureGroup0"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("For3D"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("width"); - xmlWriter.WriteString(sprite.Width.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("height"); - xmlWriter.WriteString(sprite.Height.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("frames"); for (int i = 0; i < sprite.Textures.Count; i++) { if (sprite.Textures[i]?.Texture != null) { - xmlWriter.WriteStartElement("frame"); - xmlWriter.WriteAttributeString("index", i.ToString()); - xmlWriter.WriteString("images\\" + sprite.Name.Content + "_" + i + ".png"); - xmlWriter.WriteEndElement(); + gmx.Element("sprite").Element("frames").Add( + new XElement( + "frame", + new XAttribute("index", i.ToString()), + "images\\" + sprite.Name.Content + "_" + i + ".png" + ) + ); } } - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); + File.WriteAllText(projFolder + "/sprites/" + sprite.Name.Content + ".sprite.gmx", gmx.ToString()); // Save sprite images for (int i = 0; i < sprite.Textures.Count; i++) + { if (sprite.Textures[i]?.Texture != null) { // Fix sprite size - var bitmapNew = new Bitmap((int)sprite.Width,(int)sprite.Height); + var bitmapNew = new Bitmap((int)sprite.Width, (int)sprite.Height); var bitmapOrigin = worker.GetTextureFor(sprite.Textures[i].Texture, Path.GetFileNameWithoutExtension(projFolder + "/sprites/images/" + sprite.Name.Content + "_" + i + ".png")); //worker.ExportAsPNG(sprite.Textures[i].Texture, projFolder + "/sprites/images/" + sprite.Name.Content + "_" + i + ".png"); var g = Graphics.FromImage(bitmapNew); @@ -187,6 +141,7 @@ void ExportSprite(UndertaleSprite sprite) bitmapNew.Dispose(); bitmapOrigin.Dispose(); } + } } // --------------- Export Background --------------- From 048499e8c09e24c9e38e85f1b5a4046dc983d97f Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sat, 2 Nov 2019 23:00:41 +0800 Subject: [PATCH 2/7] Update ExportToProject.csx --- ExportToProject.csx | 696 ++++++++++++++------------------------------ 1 file changed, 217 insertions(+), 479 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index 555a4b6..a21ca80 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -153,73 +153,30 @@ async Task ExportBackground() void ExportBackground(UndertaleBackground background) { // Save the backgound GMX - var xmlWriter = XmlWriter.Create(projFolder + "/background/" + background.Name.Content + ".background.gmx"); - xmlWriter.WriteStartDocument(); - - xmlWriter.WriteStartElement("background"); - - xmlWriter.WriteStartElement("istileset"); - xmlWriter.WriteString("-1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tilewidth"); - xmlWriter.WriteString(background.Texture.BoundingWidth.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tileheight"); - xmlWriter.WriteString(background.Texture.BoundingHeight.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tilexoff"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tileyoff"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tilehsep"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("tilevsep"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("HTile"); - xmlWriter.WriteString("-1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("VTile"); - xmlWriter.WriteString("-1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("TextureGroups"); - xmlWriter.WriteStartElement("TextureGroup0"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("For3D"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("width"); - xmlWriter.WriteString(background.Texture.BoundingWidth.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("height"); - xmlWriter.WriteString(background.Texture.BoundingHeight.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("data"); - xmlWriter.WriteString("images\\" + background.Name.Content + ".png"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("background", + new XElement("istileset", "-1"), + new XElement("tilewidth", background.Texture.BoundingWidth.ToString()), + new XElement("tileheight", background.Texture.BoundingHeight.ToString()), + new XElement("tilexoff", "0"), + new XElement("tileyoff", "0"), + new XElement("tilehsep", "0"), + new XElement("tilevsep", "0"), + new XElement("HTile", "-1"), + new XElement("VTile", "-1"), + new XElement("TextureGroups", + new XElement("TextureGroup0", "0") + ), + new XElement("For3D", "0"), + new XElement("width", background.Texture.BoundingWidth.ToString()), + new XElement("height", background.Texture.BoundingHeight.ToString()), + new XElement("data", "images\\" + background.Name.Content + ".png") + ) + ); + File.WriteAllText(projFolder + "/background/" + background.Name.Content + ".background.gmx", gmx.ToString()); + // Save background images worker.ExportAsPNG(background.Texture, projFolder + "/background/images/" + background.Name.Content + ".png"); } @@ -232,41 +189,19 @@ async Task ExportGameObjects() void ExportGameObject(UndertaleGameObject gameObject) { // Save the object GMX - var xmlWriter = XmlWriter.Create(projFolder + "/objects/" + gameObject.Name.Content + ".object.gmx"); - xmlWriter.WriteStartDocument(); - - xmlWriter.WriteStartElement("object"); - - xmlWriter.WriteStartElement("spriteName"); - xmlWriter.WriteString(gameObject.Sprite is null ? "" : gameObject.Sprite.Name.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("solid"); - xmlWriter.WriteString(BoolToString(gameObject.Solid)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("visible"); - xmlWriter.WriteString(BoolToString(gameObject.Visible)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("depth"); - xmlWriter.WriteString(gameObject.Depth.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("persistent"); - xmlWriter.WriteString(BoolToString(gameObject.Persistent)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("parentName"); - xmlWriter.WriteString(gameObject.ParentId is null ? "" : gameObject.ParentId.Name.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("maskName"); - xmlWriter.WriteString(gameObject.TextureMaskId is null ? "" : gameObject.TextureMaskId.Name.Content); - xmlWriter.WriteEndElement(); - - // Save events - xmlWriter.WriteStartElement("events"); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("object", + new XElement("spriteName", gameObject.Sprite is null ? "" : gameObject.Sprite.Name.Content), + new XElement("solid", BoolToString(gameObject.Solid)), + new XElement("visible", BoolToString(gameObject.Visible)), + new XElement("depth", gameObject.Depth.ToString()), + new XElement("persistent", BoolToString(gameObject.Persistent)), + new XElement("parentName", gameObject.ParentId is null ? "" : gameObject.ParentId.Name.Content), + new XElement("maskName", gameObject.TextureMaskId is null ? "" : gameObject.TextureMaskId.Name.Content), + new XElement("events") + ) + ); // Traversing the event type list for (int i = 0; i < gameObject.Events.Count; i++) @@ -277,104 +212,60 @@ void ExportGameObject(UndertaleGameObject gameObject) // Traversing event list foreach (var j in gameObject.Events[i]) { - xmlWriter.WriteStartElement("event"); + var eventsNode = gmx.Element("object").Element("events"); - xmlWriter.WriteAttributeString("eventtype", i.ToString()); + var eventNode = new XElement("event", + new XAttribute("eventtype", i.ToString()) + ); if (j.EventSubtype == 4) { // To get the actual name of the collision object when the event type is a collision event - xmlWriter.WriteAttributeString("ename", Data.GameObjects[(int)j.EventSubtype].Name.Content); + eventNode.Add(new XAttribute("ename", Data.GameObjects[(int)j.EventSubtype].Name.Content)); } else { // Get the sub-event number directly - xmlWriter.WriteAttributeString("enumb", j.EventSubtype.ToString()); + eventNode.Add(new XAttribute("enumb", j.EventSubtype.ToString())); } // Save action - xmlWriter.WriteStartElement("action"); + var actionNode = new XElement("action"); // Traversing the action list foreach (var k in j.Actions) { - xmlWriter.WriteStartElement("libid"); - xmlWriter.WriteString(k.LibID.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("id"); - xmlWriter.WriteString(k.ID.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("kind"); - xmlWriter.WriteString(k.Kind.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("userelative"); - xmlWriter.WriteString(BoolToString(k.UseRelative)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("isquestion"); - xmlWriter.WriteString(BoolToString(k.IsQuestion)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("useapplyto"); - xmlWriter.WriteString(BoolToString(k.UseApplyTo)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("exetype"); - xmlWriter.WriteString(k.ExeType.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("functionname"); - xmlWriter.WriteString(k.ActionName.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("codestring"); - xmlWriter.WriteString(""); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("whoName"); - // All DND actions in data.win are converted to assembly code, automatically processing the performer - xmlWriter.WriteString("self"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("relative"); - xmlWriter.WriteString(BoolToString(k.Relative)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("isnot"); - xmlWriter.WriteString(BoolToString(k.IsNot)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("arguments"); - xmlWriter.WriteStartElement("argument"); - - xmlWriter.WriteStartElement("kind"); - xmlWriter.WriteString("1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("string"); - xmlWriter.WriteString(k.CodeId != null ? Decompiler.Decompile(k.CodeId, DECOMPILE_CONTEXT.Value) : ""); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); + actionNode.Add( + new XElement("libid", k.LibID.ToString()), + new XElement("id", k.ID.ToString()), + new XElement("kind", k.Kind.ToString()), + new XElement("userelative", k.LibID.ToString()), + new XElement("libid", BoolToString(k.UseRelative)), + new XElement("isquestion", BoolToString(k.IsQuestion)), + new XElement("useapplyto", BoolToString(k.UseApplyTo)), + new XElement("exetype", k.ExeType.ToString()), + new XElement("functionname", k.ActionName.Content), + new XElement("codestring", ""), + new XElement("whoName", "self"), + new XElement("relative", BoolToString(k.Relative)), + new XElement("isnot", BoolToString(k.IsNot)), + new XElement("arguments", + new XElement("argument", + new XElement("kind", "1"), + new XElement("string", k.CodeId != null ? Decompiler.Decompile(k.CodeId, DECOMPILE_CONTEXT.Value) : "") + ) + ) + ); } + eventNode.Add(actionNode); + eventsNode.Add(eventNode); + // TODO:Physics - - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); } } } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); + File.WriteAllText(projFolder + "/objects/" + gameObject.Name.Content + ".object.gmx", gmx.ToString()); } // --------------- Export Room --------------- @@ -386,170 +277,116 @@ async Task ExportRooms() void ExportRoom(UndertaleRoom room) { // Save the room GMX - var xmlWriter = XmlWriter.Create(projFolder + "/rooms/" + room.Name.Content + ".room.gmx"); - xmlWriter.WriteStartDocument(); - - xmlWriter.WriteStartElement("room"); - - // Room settings - xmlWriter.WriteStartElement("caption"); - xmlWriter.WriteString(room.Caption.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("width"); - xmlWriter.WriteString(room.Width.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("height"); - xmlWriter.WriteString(room.Height.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("vsnap"); - xmlWriter.WriteString("32"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("hsnap"); - xmlWriter.WriteString("32"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("isometric"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("speed"); - xmlWriter.WriteString(room.Speed.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("persistent"); - xmlWriter.WriteString(BoolToString(room.Persistent)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("colour"); - xmlWriter.WriteString(room.BackgroundColor.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("showcolour"); - xmlWriter.WriteString(BoolToString(room.DrawBackgroundColor)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("code"); - xmlWriter.WriteString(room.CreationCodeId is null ? "" : Decompiler.Decompile(room.CreationCodeId, context)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("enableViews"); - xmlWriter.WriteString(BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.EnableViews))); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("clearViewBackground"); - xmlWriter.WriteString(BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ShowColor))); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("clearDisplayBuffer"); - xmlWriter.WriteString(BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ClearDisplayBuffer))); - xmlWriter.WriteEndElement(); - + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("room", + new XElement("caption", room.Caption.Content), + new XElement("width", room.Width.ToString()), + new XElement("height", room.Height.ToString()), + new XElement("vsnap", "32"), + new XElement("hsnap", "32"), + new XElement("isometric", "0"), + new XElement("speed", room.Speed.ToString()), + new XElement("persistent", BoolToString(room.Persistent)), + new XElement("colour", room.BackgroundColor.ToString()), + new XElement("code", room.CreationCodeId is null ? "" : Decompiler.Decompile(room.CreationCodeId, context)), + new XElement("enableViews", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.EnableViews))), + new XElement("clearViewBackground", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ShowColor))), + new XElement("clearDisplayBuffer", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ClearDisplayBuffer))) + ) + ); // TODO:MakerSettings // Room backgrounds - xmlWriter.WriteStartElement("backgrounds"); + var backgroundsNode = new XElement("backgrounds"); foreach (var i in room.Backgrounds) { - xmlWriter.WriteStartElement("background"); - - xmlWriter.WriteAttributeString("visible", BoolToString(i.Enabled)); - xmlWriter.WriteAttributeString("foreground", BoolToString(i.Foreground)); - xmlWriter.WriteAttributeString("name", i.BackgroundDefinition is null ? "" : i.BackgroundDefinition.Name.Content); - xmlWriter.WriteAttributeString("x", i.X.ToString()); - xmlWriter.WriteAttributeString("y", i.Y.ToString()); - xmlWriter.WriteAttributeString("htiled", i.TileX.ToString()); - xmlWriter.WriteAttributeString("vtiled", i.TileY.ToString()); - xmlWriter.WriteAttributeString("hspeed", i.SpeedX.ToString()); - xmlWriter.WriteAttributeString("vspeed", i.SpeedY.ToString()); - // TODO:Stretch - xmlWriter.WriteAttributeString("stretch", "0"); - - xmlWriter.WriteEndElement(); + var backgroundNode = new XElement("background", + new XAttribute("visible", BoolToString(i.Enabled)), + new XAttribute("foreground", BoolToString(i.Foreground)), + new XAttribute("name", i.BackgroundDefinition is null ? "" : i.BackgroundDefinition.Name.Content), + new XAttribute("x", i.X.ToString()), + new XAttribute("y", i.Y.ToString()), + new XAttribute("htiled", i.TileX.ToString()), + new XAttribute("vtiled", i.TileY.ToString()), + new XAttribute("hspeed", i.SpeedX.ToString()), + new XAttribute("vspeed", i.SpeedY.ToString()), + new XAttribute("stretch", "0") + ); + backgroundsNode.Add(backgroundNode); } - xmlWriter.WriteEndElement(); + gmx.Element("room").Add(backgroundsNode); // Room views - xmlWriter.WriteStartElement("views"); + var viewsNode = new XElement("views"); foreach (var i in room.Views) { - xmlWriter.WriteStartElement("view"); - - xmlWriter.WriteAttributeString("visible", BoolToString(i.Enabled)); - xmlWriter.WriteAttributeString("objName", i.ObjectId is null ? "" : i.ObjectId.Name.Content); - xmlWriter.WriteAttributeString("xview", i.ViewX.ToString()); - xmlWriter.WriteAttributeString("yview", i.ViewY.ToString()); - xmlWriter.WriteAttributeString("wview", i.ViewWidth.ToString()); - xmlWriter.WriteAttributeString("hview", i.ViewHeight.ToString()); - xmlWriter.WriteAttributeString("xport", i.PortX.ToString()); - xmlWriter.WriteAttributeString("yport", i.PortY.ToString()); - xmlWriter.WriteAttributeString("wport", i.PortWidth.ToString()); - xmlWriter.WriteAttributeString("hport", i.PortHeight.ToString()); - xmlWriter.WriteAttributeString("hborder", i.BorderX.ToString()); - xmlWriter.WriteAttributeString("vborder", i.BorderY.ToString()); - xmlWriter.WriteAttributeString("hspeed", i.SpeedX.ToString()); - xmlWriter.WriteAttributeString("vspeed", i.SpeedY.ToString()); - - xmlWriter.WriteEndElement(); + var viewNode = new XElement("view", + new XAttribute("visible", BoolToString(i.Enabled)), + new XAttribute("objName", i.ObjectId is null ? "" : i.ObjectId.Name.Content), + new XAttribute("xview", i.ViewX.ToString()), + new XAttribute("yview", i.ViewY.ToString()), + new XAttribute("wview", i.ViewHeight.ToString()), + new XAttribute("xport", i.PortX.ToString()), + new XAttribute("yport", i.PortY.ToString()), + new XAttribute("wport", i.PortWidth.ToString()), + new XAttribute("hport", i.PortHeight.ToString()), + new XAttribute("hborder", i.BorderX.ToString()), + new XAttribute("vborder", i.BorderY.ToString()), + new XAttribute("hspeed", i.SpeedX.ToString()), + new XAttribute("vspeed", i.SpeedY.ToString()) + ); + viewsNode.Add(viewNode); } - xmlWriter.WriteEndElement(); + gmx.Element("room").Add(viewsNode); // Room instances - xmlWriter.WriteStartElement("instances"); + var instancesNode = new XElement("instances"); foreach (var i in room.GameObjects) { - xmlWriter.WriteStartElement("instance"); - - xmlWriter.WriteAttributeString("objName", i.ObjectDefinition.Name.Content); - xmlWriter.WriteAttributeString("x", i.X.ToString()); - xmlWriter.WriteAttributeString("y", i.Y.ToString()); - xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X")); - // TODO:Locked - xmlWriter.WriteAttributeString("locked", "0"); - xmlWriter.WriteAttributeString("code", i.CreationCode != null ? Decompiler.Decompile(i.CreationCode, DECOMPILE_CONTEXT.Value) : ""); - xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString()); - xmlWriter.WriteAttributeString("scaleY", i.ScaleY.ToString()); - xmlWriter.WriteAttributeString("colour", i.Color.ToString()); - xmlWriter.WriteAttributeString("rotation", i.Rotation.ToString()); - - xmlWriter.WriteEndElement(); + var instanceNode = new XElement("instance", + new XAttribute("objName", i.ObjectDefinition.Name.Content), + new XAttribute("x", i.X.ToString()), + new XAttribute("y", i.Y.ToString()), + new XAttribute("name", "inst_" + i.InstanceID.ToString("X")), + new XAttribute("locked", "0"), + new XAttribute("code", i.CreationCode != null ? Decompiler.Decompile(i.CreationCode, DECOMPILE_CONTEXT.Value) : ""), + new XAttribute("scaleX", i.ScaleX.ToString()), + new XAttribute("scaleY", i.ScaleY.ToString()), + new XAttribute("colour", i.Color.ToString()), + new XAttribute("rotation", i.Rotation.ToString()) + ); + instancesNode.Add(instanceNode); } - xmlWriter.WriteEndElement(); + gmx.Element("room").Add(instancesNode); // Room tiles - xmlWriter.WriteStartElement("tiles"); + var tilesNode = new XElement("tiles"); foreach (var i in room.Tiles) { - xmlWriter.WriteStartElement("tile"); - - xmlWriter.WriteAttributeString("bgName", i.BackgroundDefinition.Name.Content); - xmlWriter.WriteAttributeString("x", i.X.ToString()); - xmlWriter.WriteAttributeString("y", i.Y.ToString()); - xmlWriter.WriteAttributeString("w", i.Width.ToString()); - xmlWriter.WriteAttributeString("h", i.Height.ToString()); - xmlWriter.WriteAttributeString("xo", i.SourceX.ToString()); - xmlWriter.WriteAttributeString("yo", i.SourceY.ToString()); - xmlWriter.WriteAttributeString("id", i.InstanceID.ToString()); - xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X")); - xmlWriter.WriteAttributeString("depth", i.TileDepth.ToString()); - // TODO:Locked - xmlWriter.WriteAttributeString("locked", "0"); - xmlWriter.WriteAttributeString("colour", i.Color.ToString()); - xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString()); - xmlWriter.WriteAttributeString("scaleY", i.ScaleY.ToString()); - - xmlWriter.WriteEndElement(); + var tileNode = new XElement("tile", + new XAttribute("bgName", i.BackgroundDefinition.Name.Content), + new XAttribute("x", i.X.ToString()), + new XAttribute("y", i.Y.ToString()), + new XAttribute("w", i.Width.ToString()), + new XAttribute("h", i.Height.ToString()), + new XAttribute("xo", i.SourceX.ToString()), + new XAttribute("yo", i.SourceY.ToString()), + new XAttribute("id", i.InstanceID.ToString()), + new XAttribute("name", "inst_" + i.InstanceID.ToString("X")), + new XAttribute("depth", i.TileDepth.ToString()), + new XAttribute("locked", "0"), + new XAttribute("colour", i.Color.ToString()), + new XAttribute("scaleX", i.ScaleX.ToString()), + new XAttribute("scaleY", i.ScaleY.ToString()) + ); + tilesNode.Add(tileNode); } - xmlWriter.WriteEndElement(); + gmx.Element("room").Add(tilesNode); // TODO:Room physics - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); + File.WriteAllText(projFolder + "/rooms/" + room.Name.Content + ".room.gmx", gmx.ToString()); } // --------------- Export Sound --------------- @@ -561,95 +398,35 @@ async Task ExportSounds() void ExportSound(UndertaleSound sound) { // Save the sound GMX - var xmlWriter = XmlWriter.Create(projFolder + "/sound/" + sound.Name.Content + ".sound.gmx"); - xmlWriter.WriteStartDocument(); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("sound", + new XElement("kind", Path.GetExtension(sound.File.Content) == ".ogg" ? "3" : "0"), + new XElement("extension", Path.GetExtension(sound.File.Content)), + new XElement("origname", "sound\\audio\\" + sound.File.Content), + new XElement("effects", sound.Effects.ToString()), + new XElement("volume", sound.Volume.ToString()), + new XElement("pan", "0"), + new XElement("bitRates", "192"), + new XElement("sampleRates", + new XElement("sampleRate", "44100") + ), + new XElement("types", + new XElement("type", "1") + ), + new XElement("bitDepths", + new XElement("bitDepth", "16") + ), + new XElement("preload", "-1"), + new XElement("data", Path.GetFileName(sound.File.Content)), + new XElement("compressed", Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0"), + new XElement("streamed", Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0"), + new XElement("uncompressOnLoad", "0"), + new XElement("audioGroup", "0") + ) + ); - xmlWriter.WriteStartElement("sound"); - - xmlWriter.WriteStartElement("kind"); - // Inferred by file extension - xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "3" : "0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("extension"); - xmlWriter.WriteString(Path.GetExtension(sound.File.Content)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("origname"); - xmlWriter.WriteString("sound\\audio\\" + sound.File.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("effects"); - xmlWriter.WriteString(sound.Effects.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("volume"); - xmlWriter.WriteString(sound.Volume.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("pan"); - // TODO:Pan - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bitRates"); - // TODO:BitRates - xmlWriter.WriteString("192"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("sampleRates"); - // TODO:SampleRates - xmlWriter.WriteStartElement("sampleRate"); - xmlWriter.WriteString("44100"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("types"); - // TODO:Types - xmlWriter.WriteStartElement("type"); - xmlWriter.WriteString("1"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bitDepths"); - // TODO:BitDepths - xmlWriter.WriteStartElement("bitDepth"); - xmlWriter.WriteString("16"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("preload"); - // TODO:Preload - xmlWriter.WriteString("-1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("data"); - xmlWriter.WriteString(Path.GetFileName(sound.File.Content)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("compressed"); - // Inferred by file extension - xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("streamed"); - // Inferred by file extension - xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("uncompressOnLoad"); - // TODO:UncompressOnLoad - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("audioGroup"); - // TODO:AudioGroup - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); + File.WriteAllText(projFolder + "/sound/" + sound.Name.Content + ".sound.gmx", gmx.ToString()); // Save sound files if (sound.AudioFile != null) @@ -677,84 +454,45 @@ async Task ExportFonts() void ExportFont(UndertaleFont font) { // Save the font GMX - var xmlWriter = XmlWriter.Create(projFolder + "/fonts/" + font.Name.Content + ".font.gmx"); - xmlWriter.WriteStartDocument(); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("font", + new XElement("name", font.Name.Content), + new XElement("size", font.EmSize.ToString()), + new XElement("bold", BoolToString(font.Bold)), + new XElement("renderhq", "-1"), + new XElement("italic", BoolToString(font.Italic)), + new XElement("charset", font.Charset.ToString()), + new XElement("aa", font.AntiAliasing.ToString()), + new XElement("includeTTF", "0"), + new XElement("TTFName", ""), + new XElement("texgroups", + new XElement("texgroup", "0") + ), + new XElement("ranges", + new XElement("range0", font.RangeStart.ToString() + "," + font.RangeEnd.ToString()) + ), + new XElement("glyphs"), + new XElement("kerningPairs"), + new XElement("image", font.Name.Content + ".png") + ) + ); - xmlWriter.WriteStartElement("font"); - - xmlWriter.WriteStartElement("name"); - xmlWriter.WriteString(font.Name.Content); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("size"); - xmlWriter.WriteString(font.EmSize.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("bold"); - xmlWriter.WriteString(BoolToString(font.Bold)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("renderhq"); - xmlWriter.WriteString("-1"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("italic"); - xmlWriter.WriteString(BoolToString(font.Italic)); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("charset"); - xmlWriter.WriteString(font.Charset.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("aa"); - xmlWriter.WriteString(font.AntiAliasing.ToString()); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("includeTTF"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("TTFName"); - xmlWriter.WriteString(""); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("texgroups"); - xmlWriter.WriteStartElement("texgroup"); - xmlWriter.WriteString("0"); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("ranges"); - xmlWriter.WriteStartElement("range0"); - xmlWriter.WriteString(font.RangeStart.ToString() + "," + font.RangeEnd.ToString()); - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("glyphs"); + File.WriteAllText(projFolder + "/fonts/" + font.Name.Content + ".font.gmx", gmx.ToString()); + + var glyphsNode = gmx.Element("font").Element("glyphs"); foreach (var i in font.Glyphs) { - xmlWriter.WriteStartElement("glyph"); - xmlWriter.WriteAttributeString("character", i.Character.ToString()); - xmlWriter.WriteAttributeString("x", i.SourceX.ToString()); - xmlWriter.WriteAttributeString("y", i.SourceY.ToString()); - xmlWriter.WriteAttributeString("w", i.SourceWidth.ToString()); - xmlWriter.WriteAttributeString("h", i.SourceHeight.ToString()); - xmlWriter.WriteAttributeString("shift", i.Shift.ToString()); - xmlWriter.WriteAttributeString("offset", i.Offset.ToString()); - xmlWriter.WriteEndElement(); + var glyphNode = new XElement("glyph"); + glyphNode.Add(new XElement("character", i.Character.ToString())); + glyphNode.Add(new XElement("x", i.SourceX.ToString())); + glyphNode.Add(new XElement("y", i.SourceY.ToString())); + glyphNode.Add(new XElement("w", i.SourceWidth.ToString())); + glyphNode.Add(new XElement("h", i.SourceHeight.ToString())); + glyphNode.Add(new XElement("shift", i.Shift.ToString())); + glyphNode.Add(new XElement("offset", i.Offset.ToString())); + glyphsNode.Add(glyphNode); } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("kerningPairs"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("image"); - xmlWriter.WriteString(font.Name.Content + ".png"); - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); // Save font textures worker.ExportAsPNG(font.Texture, projFolder + "/fonts/" + font.Name.Content + ".png"); From 20f0c3f837dc426847530673b62ba71ddea5e1ef Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sat, 2 Nov 2019 23:23:14 +0800 Subject: [PATCH 3/7] Update ExportToProject.csx --- ExportToProject.csx | 79 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index a21ca80..a4d27d5 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -478,8 +478,6 @@ void ExportFont(UndertaleFont font) ) ); - File.WriteAllText(projFolder + "/fonts/" + font.Name.Content + ".font.gmx", gmx.ToString()); - var glyphsNode = gmx.Element("font").Element("glyphs"); foreach (var i in font.Glyphs) { @@ -494,6 +492,8 @@ void ExportFont(UndertaleFont font) glyphsNode.Add(glyphNode); } + File.WriteAllText(projFolder + "/fonts/" + font.Name.Content + ".font.gmx", gmx.ToString()); + // Save font textures worker.ExportAsPNG(font.Texture, projFolder + "/fonts/" + font.Name.Content + ".png"); } @@ -502,11 +502,68 @@ void ExportFont(UndertaleFont font) void ExportProjectFile() { // Write all resource indexes to project.gmx - var xmlWriter = XmlWriter.Create(projFolder + "Export_Project.project.gmx"); - xmlWriter.WriteStartDocument(); + var gmx = new XDocument( + new XComment(gmxDeclaration), + new XElement("assets") + ); - xmlWriter.WriteStartElement("assets"); + // Write sound indexes + var soundsNode = new XElement("sounds", + new XAttribute("name", "sound") + ); + foreach (var i in Data.Sounds) + { + var soundNode = new XElement("sound", "sound\\" + i.Name.Content); + soundsNode.Add(soundNode); + } + gmx.Element("assets").Add(soundsNode); + // Write sprite indexes + var spritesNode = new XElement("sprites", + new XAttribute("name", "sprites") + ); + foreach (var i in Data.Sprites) + { + var spriteNode = new XElement("sprite", "sprites\\" + i.Name.Content); + spritesNode.Add(spriteNode); + } + gmx.Element("assets").Add(spritesNode); + + // Write background indexes + var backgroundsNode = new XElement("backgrounds", + new XAttribute("name", "background") + ); + foreach (var i in Data.Backgrounds) + { + var backgroundNode = new XElement("background", "background\\" + i.Name.Content); + backgroundsNode.Add(backgroundNode); + } + gmx.Element("assets").Add(backgroundsNode); + + // Write script indexes + var scriptsNode = new XElement("scripts", + new XAttribute("name", "scripts") + ); + foreach (var i in Data.Scripts) + { + var scriptNode = new XElement("script", "scripts\\" + i.Name.Content + ".gml"); + scriptsNode.Add(scriptNode); + } + gmx.Element("assets").Add(scriptsNode); + + // Write font indexes + var scriptsNode = new XElement("scripts", + new XAttribute("name", "scripts") + ); + foreach (var i in Data.Scripts) + { + var scriptNode = new XElement("script", "scripts\\" + i.Name.Content + ".gml"); + scriptsNode.Add(scriptNode); + } + gmx.Element("assets").Add(scriptsNode); + + File.WriteAllText(projFolder + "Export_Project.project.gmx", gmx.ToString()); +/////////////////////////////////////////// xmlWriter.WriteStartElement("sounds"); xmlWriter.WriteAttributeString("name", "sound"); foreach (var i in Data.Sounds) @@ -582,3 +639,15 @@ void ExportProjectFile() xmlWriter.Close(); } +void WriteIndexes(string elementName, string attributeName, List dataList, string oneName, string fileName, XElement rootNode) +{ + var datasNode = new XElement( + new XAttribute(elementName, attributeName) + ); + foreach (var i in dataList) + { + var dataNode = new XElement(oneName, fileName); + datasNode.Add(dataNode); + } + rootNode.Add(datasNode); +} \ No newline at end of file From 0faff0eb3df2c5ca52a29093d05cc15f69da7f90 Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sat, 2 Nov 2019 23:30:38 +0800 Subject: [PATCH 4/7] Update ExportToProject.csx --- ExportToProject.csx | 135 +++----------------------------------------- 1 file changed, 7 insertions(+), 128 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index a4d27d5..a023827 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -507,136 +507,15 @@ void ExportProjectFile() new XElement("assets") ); - // Write sound indexes - var soundsNode = new XElement("sounds", - new XAttribute("name", "sound") - ); - foreach (var i in Data.Sounds) - { - var soundNode = new XElement("sound", "sound\\" + i.Name.Content); - soundsNode.Add(soundNode); - } - gmx.Element("assets").Add(soundsNode); - - // Write sprite indexes - var spritesNode = new XElement("sprites", - new XAttribute("name", "sprites") - ); - foreach (var i in Data.Sprites) - { - var spriteNode = new XElement("sprite", "sprites\\" + i.Name.Content); - spritesNode.Add(spriteNode); - } - gmx.Element("assets").Add(spritesNode); - - // Write background indexes - var backgroundsNode = new XElement("backgrounds", - new XAttribute("name", "background") - ); - foreach (var i in Data.Backgrounds) - { - var backgroundNode = new XElement("background", "background\\" + i.Name.Content); - backgroundsNode.Add(backgroundNode); - } - gmx.Element("assets").Add(backgroundsNode); - - // Write script indexes - var scriptsNode = new XElement("scripts", - new XAttribute("name", "scripts") - ); - foreach (var i in Data.Scripts) - { - var scriptNode = new XElement("script", "scripts\\" + i.Name.Content + ".gml"); - scriptsNode.Add(scriptNode); - } - gmx.Element("assets").Add(scriptsNode); - - // Write font indexes - var scriptsNode = new XElement("scripts", - new XAttribute("name", "scripts") - ); - foreach (var i in Data.Scripts) - { - var scriptNode = new XElement("script", "scripts\\" + i.Name.Content + ".gml"); - scriptsNode.Add(scriptNode); - } - gmx.Element("assets").Add(scriptsNode); + WriteIndexes("sounds", "sound", Data.Sounds, "sound", "sound\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("sprites", "sprites", Data.Sprites, "sprite", "sprites\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("backgrounds", "background", Data.Backgrounds, "background", "background\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("scripts", "scripts", Data.Scripts, "script", "scripts\\" + i.Name.Content + ".gml", gmx.Element("assets")); + WriteIndexes("fonts", "fonts", Data.Fonts, "font", "fonts\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("objects", "objects", Data.GameObjects, "object", "objects\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("rooms", "rooms", Data.Rooms, "room", "rooms\\" + i.Name.Content, gmx.Element("assets")); File.WriteAllText(projFolder + "Export_Project.project.gmx", gmx.ToString()); -/////////////////////////////////////////// - xmlWriter.WriteStartElement("sounds"); - xmlWriter.WriteAttributeString("name", "sound"); - foreach (var i in Data.Sounds) - { - xmlWriter.WriteStartElement("sound"); - xmlWriter.WriteString("sound\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("sprites"); - xmlWriter.WriteAttributeString("name", "sprites"); - foreach (var i in Data.Sprites) - { - xmlWriter.WriteStartElement("sprite"); - xmlWriter.WriteString("sprites\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("backgrounds"); - xmlWriter.WriteAttributeString("name", "background"); - foreach (var i in Data.Backgrounds) - { - xmlWriter.WriteStartElement("background"); - xmlWriter.WriteString("background\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("scripts"); - xmlWriter.WriteAttributeString("name", "scripts"); - foreach (var i in Data.Scripts) - { - xmlWriter.WriteStartElement("script"); - xmlWriter.WriteString("scripts\\" + i.Name.Content + ".gml"); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("fonts"); - xmlWriter.WriteAttributeString("name", "fonts"); - foreach (var i in Data.Fonts) - { - xmlWriter.WriteStartElement("font"); - xmlWriter.WriteString("fonts\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("objects"); - xmlWriter.WriteAttributeString("name", "objects"); - foreach (var i in Data.GameObjects) - { - xmlWriter.WriteStartElement("object"); - xmlWriter.WriteString("objects\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteStartElement("rooms"); - xmlWriter.WriteAttributeString("name", "rooms"); - foreach (var i in Data.Rooms) - { - xmlWriter.WriteStartElement("room"); - xmlWriter.WriteString("rooms\\" + i.Name.Content); - xmlWriter.WriteEndElement(); - } - xmlWriter.WriteEndElement(); - - xmlWriter.WriteEndElement(); - xmlWriter.WriteEndDocument(); - xmlWriter.Close(); } void WriteIndexes(string elementName, string attributeName, List dataList, string oneName, string fileName, XElement rootNode) From e6140c935c03818363bcd67f00355ae7f55ae8df Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sat, 2 Nov 2019 23:34:19 +0800 Subject: [PATCH 5/7] Update ExportToProject.csx --- ExportToProject.csx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index a023827..949f997 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -507,18 +507,18 @@ void ExportProjectFile() new XElement("assets") ); - WriteIndexes("sounds", "sound", Data.Sounds, "sound", "sound\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("sprites", "sprites", Data.Sprites, "sprite", "sprites\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("backgrounds", "background", Data.Backgrounds, "background", "background\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("scripts", "scripts", Data.Scripts, "script", "scripts\\" + i.Name.Content + ".gml", gmx.Element("assets")); - WriteIndexes("fonts", "fonts", Data.Fonts, "font", "fonts\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("objects", "objects", Data.GameObjects, "object", "objects\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("rooms", "rooms", Data.Rooms, "room", "rooms\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("sounds", "sound", Data.Sounds, "sound", "sound\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("sprites", "sprites", Data.Sprites, "sprite", "sprites\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("backgrounds", "background", Data.Backgrounds, "background", "background\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("scripts", "scripts", Data.Scripts, "script", "scripts\\" + i.Name.Content + ".gml", gmx.Element("assets")); + WriteIndexes("fonts", "fonts", Data.Fonts, "font", "fonts\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("objects", "objects", Data.GameObjects, "object", "objects\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes("rooms", "rooms", Data.Rooms, "room", "rooms\\" + i.Name.Content, gmx.Element("assets")); File.WriteAllText(projFolder + "Export_Project.project.gmx", gmx.ToString()); } -void WriteIndexes(string elementName, string attributeName, List dataList, string oneName, string fileName, XElement rootNode) +void WriteIndexes(string elementName, string attributeName, List dataList, string oneName, string fileName, XElement rootNode) { var datasNode = new XElement( new XAttribute(elementName, attributeName) From c409bb75723b95fb931c40297925a8c1dce8ddce Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sun, 3 Nov 2019 00:10:21 +0800 Subject: [PATCH 6/7] Update ExportToProject.csx --- ExportToProject.csx | 57 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index 949f997..504fdbb 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -6,6 +6,7 @@ using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using System.Drawing; +using System.Reflection; using UndertaleModLib.Models; using UndertaleModLib.Util; using UndertaleModLib.Decompiler; @@ -85,7 +86,7 @@ void ExportSprite(UndertaleSprite sprite) // Save the sprite GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("sprite", + new XElement("sprite", new XElement("type", "0"), new XElement("xorig", sprite.OriginX.ToString()), new XElement("yorigin", sprite.OriginY.ToString()), @@ -99,7 +100,7 @@ void ExportSprite(UndertaleSprite sprite) new XElement("bbox_bottom", sprite.MarginBottom.ToString()), new XElement("HTile", "0"), new XElement("VTile", "0"), - new XElement("TextureGroups", + new XElement("TextureGroups", new XElement("TextureGroup0", "0") ), new XElement("For3D", "0"), @@ -155,7 +156,7 @@ void ExportBackground(UndertaleBackground background) // Save the backgound GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("background", + new XElement("background", new XElement("istileset", "-1"), new XElement("tilewidth", background.Texture.BoundingWidth.ToString()), new XElement("tileheight", background.Texture.BoundingHeight.ToString()), @@ -165,7 +166,7 @@ void ExportBackground(UndertaleBackground background) new XElement("tilevsep", "0"), new XElement("HTile", "-1"), new XElement("VTile", "-1"), - new XElement("TextureGroups", + new XElement("TextureGroups", new XElement("TextureGroup0", "0") ), new XElement("For3D", "0"), @@ -176,7 +177,7 @@ void ExportBackground(UndertaleBackground background) ); File.WriteAllText(projFolder + "/background/" + background.Name.Content + ".background.gmx", gmx.ToString()); - + // Save background images worker.ExportAsPNG(background.Texture, projFolder + "/background/images/" + background.Name.Content + ".png"); } @@ -191,7 +192,7 @@ void ExportGameObject(UndertaleGameObject gameObject) // Save the object GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("object", + new XElement("object", new XElement("spriteName", gameObject.Sprite is null ? "" : gameObject.Sprite.Name.Content), new XElement("solid", BoolToString(gameObject.Solid)), new XElement("visible", BoolToString(gameObject.Visible)), @@ -250,9 +251,9 @@ void ExportGameObject(UndertaleGameObject gameObject) new XElement("relative", BoolToString(k.Relative)), new XElement("isnot", BoolToString(k.IsNot)), new XElement("arguments", - new XElement("argument", + new XElement("argument", new XElement("kind", "1"), - new XElement("string", k.CodeId != null ? Decompiler.Decompile(k.CodeId, DECOMPILE_CONTEXT.Value) : "") + new XElement("string", k.CodeId != null ? Decompiler.Decompile(k.CodeId, DECOMPILE_CONTEXT.Value) : "") ) ) ); @@ -279,7 +280,7 @@ void ExportRoom(UndertaleRoom room) // Save the room GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("room", + new XElement("room", new XElement("caption", room.Caption.Content), new XElement("width", room.Width.ToString()), new XElement("height", room.Height.ToString()), @@ -400,7 +401,7 @@ void ExportSound(UndertaleSound sound) // Save the sound GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("sound", + new XElement("sound", new XElement("kind", Path.GetExtension(sound.File.Content) == ".ogg" ? "3" : "0"), new XElement("extension", Path.GetExtension(sound.File.Content)), new XElement("origname", "sound\\audio\\" + sound.File.Content), @@ -408,13 +409,13 @@ void ExportSound(UndertaleSound sound) new XElement("volume", sound.Volume.ToString()), new XElement("pan", "0"), new XElement("bitRates", "192"), - new XElement("sampleRates", + new XElement("sampleRates", new XElement("sampleRate", "44100") ), - new XElement("types", + new XElement("types", new XElement("type", "1") ), - new XElement("bitDepths", + new XElement("bitDepths", new XElement("bitDepth", "16") ), new XElement("preload", "-1"), @@ -456,7 +457,7 @@ void ExportFont(UndertaleFont font) // Save the font GMX var gmx = new XDocument( new XComment(gmxDeclaration), - new XElement("font", + new XElement("font", new XElement("name", font.Name.Content), new XElement("size", font.EmSize.ToString()), new XElement("bold", BoolToString(font.Bold)), @@ -466,10 +467,10 @@ void ExportFont(UndertaleFont font) new XElement("aa", font.AntiAliasing.ToString()), new XElement("includeTTF", "0"), new XElement("TTFName", ""), - new XElement("texgroups", + new XElement("texgroups", new XElement("texgroup", "0") ), - new XElement("ranges", + new XElement("ranges", new XElement("range0", font.RangeStart.ToString() + "," + font.RangeEnd.ToString()) ), new XElement("glyphs"), @@ -507,25 +508,25 @@ void ExportProjectFile() new XElement("assets") ); - WriteIndexes("sounds", "sound", Data.Sounds, "sound", "sound\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("sprites", "sprites", Data.Sprites, "sprite", "sprites\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("backgrounds", "background", Data.Backgrounds, "background", "background\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("scripts", "scripts", Data.Scripts, "script", "scripts\\" + i.Name.Content + ".gml", gmx.Element("assets")); - WriteIndexes("fonts", "fonts", Data.Fonts, "font", "fonts\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("objects", "objects", Data.GameObjects, "object", "objects\\" + i.Name.Content, gmx.Element("assets")); - WriteIndexes("rooms", "rooms", Data.Rooms, "room", "rooms\\" + i.Name.Content, gmx.Element("assets")); + WriteIndexes(gmx.Element("assets"), "sounds", "sound", Data.Sounds, "sound", "sound\\"); + WriteIndexes(gmx.Element("assets"), "sprites", "sprites", Data.Sprites, "sprite", "sprites\\"); + WriteIndexes(gmx.Element("assets"), "backgrounds", "background", Data.Backgrounds, "background", "background\\"); + WriteIndexes(gmx.Element("assets"), "scripts", "scripts", Data.Scripts, "script", "scripts\\", ".gml"); + WriteIndexes(gmx.Element("assets"), "fonts", "fonts", Data.Fonts, "font", "fonts\\"); + WriteIndexes(gmx.Element("assets"), "objects", "objects", Data.GameObjects, "object", "objects\\"); + WriteIndexes(gmx.Element("assets"), "rooms", "rooms", Data.Rooms, "room", "rooms\\"); File.WriteAllText(projFolder + "Export_Project.project.gmx", gmx.ToString()); } -void WriteIndexes(string elementName, string attributeName, List dataList, string oneName, string fileName, XElement rootNode) +void WriteIndexes(XElement rootNode, string elementName, string attributeName, IList dataList, string oneName, string resourcePath, string fileExtension = "") { - var datasNode = new XElement( - new XAttribute(elementName, attributeName) + var datasNode = new XElement(elementName, + new XAttribute("name", attributeName) ); - foreach (var i in dataList) + foreach (UndertaleNamedResource i in dataList) { - var dataNode = new XElement(oneName, fileName); + var dataNode = new XElement(oneName, resourcePath + i.Name.Content + fileExtension); datasNode.Add(dataNode); } rootNode.Add(datasNode); From 9facbed8f42c3360f0fed1bb3f7839488faafc69 Mon Sep 17 00:00:00 2001 From: cubeww <761397398@qq.com> Date: Sun, 3 Nov 2019 00:11:42 +0800 Subject: [PATCH 7/7] Update ExportToProject.csx --- ExportToProject.csx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ExportToProject.csx b/ExportToProject.csx index 504fdbb..06d7d3a 100644 --- a/ExportToProject.csx +++ b/ExportToProject.csx @@ -502,12 +502,12 @@ void ExportFont(UndertaleFont font) // --------------- Generate project file --------------- void ExportProjectFile() { - // Write all resource indexes to project.gmx var gmx = new XDocument( new XComment(gmxDeclaration), new XElement("assets") ); + // Write all resource indexes to project.gmx WriteIndexes(gmx.Element("assets"), "sounds", "sound", Data.Sounds, "sound", "sound\\"); WriteIndexes(gmx.Element("assets"), "sprites", "sprites", Data.Sprites, "sprite", "sprites\\"); WriteIndexes(gmx.Element("assets"), "backgrounds", "background", Data.Backgrounds, "background", "background\\"); @@ -521,13 +521,13 @@ void ExportProjectFile() void WriteIndexes(XElement rootNode, string elementName, string attributeName, IList dataList, string oneName, string resourcePath, string fileExtension = "") { - var datasNode = new XElement(elementName, + var resourcesNode = new XElement(elementName, new XAttribute("name", attributeName) ); foreach (UndertaleNamedResource i in dataList) { - var dataNode = new XElement(oneName, resourcePath + i.Name.Content + fileExtension); - datasNode.Add(dataNode); + var resourceNode = new XElement(oneName, resourcePath + i.Name.Content + fileExtension); + resourcesNode.Add(resourceNode); } - rootNode.Add(datasNode); + rootNode.Add(resourcesNode); } \ No newline at end of file