Update ExportToProject.csx

This commit is contained in:
cubeww 2019-11-02 23:00:41 +08:00
parent f85b76410d
commit 048499e8c0

View file

@ -153,72 +153,29 @@ async Task ExportBackground()
void ExportBackground(UndertaleBackground background) void ExportBackground(UndertaleBackground background)
{ {
// Save the backgound GMX // Save the backgound GMX
var xmlWriter = XmlWriter.Create(projFolder + "/background/" + background.Name.Content + ".background.gmx"); var gmx = new XDocument(
xmlWriter.WriteStartDocument(); 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")
)
);
xmlWriter.WriteStartElement("background"); File.WriteAllText(projFolder + "/background/" + background.Name.Content + ".background.gmx", gmx.ToString());
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();
// Save background images // Save background images
worker.ExportAsPNG(background.Texture, projFolder + "/background/images/" + background.Name.Content + ".png"); worker.ExportAsPNG(background.Texture, projFolder + "/background/images/" + background.Name.Content + ".png");
@ -232,41 +189,19 @@ async Task ExportGameObjects()
void ExportGameObject(UndertaleGameObject gameObject) void ExportGameObject(UndertaleGameObject gameObject)
{ {
// Save the object GMX // Save the object GMX
var xmlWriter = XmlWriter.Create(projFolder + "/objects/" + gameObject.Name.Content + ".object.gmx"); var gmx = new XDocument(
xmlWriter.WriteStartDocument(); new XComment(gmxDeclaration),
new XElement("object",
xmlWriter.WriteStartElement("object"); new XElement("spriteName", gameObject.Sprite is null ? "<undefined>" : gameObject.Sprite.Name.Content),
new XElement("solid", BoolToString(gameObject.Solid)),
xmlWriter.WriteStartElement("spriteName"); new XElement("visible", BoolToString(gameObject.Visible)),
xmlWriter.WriteString(gameObject.Sprite is null ? "<undefined>" : gameObject.Sprite.Name.Content); new XElement("depth", gameObject.Depth.ToString()),
xmlWriter.WriteEndElement(); new XElement("persistent", BoolToString(gameObject.Persistent)),
new XElement("parentName", gameObject.ParentId is null ? "<undefined>" : gameObject.ParentId.Name.Content),
xmlWriter.WriteStartElement("solid"); new XElement("maskName", gameObject.TextureMaskId is null ? "<undefined>" : gameObject.TextureMaskId.Name.Content),
xmlWriter.WriteString(BoolToString(gameObject.Solid)); new XElement("events")
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 ? "<undefined>" : gameObject.ParentId.Name.Content);
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("maskName");
xmlWriter.WriteString(gameObject.TextureMaskId is null ? "<undefined>" : gameObject.TextureMaskId.Name.Content);
xmlWriter.WriteEndElement();
// Save events
xmlWriter.WriteStartElement("events");
// Traversing the event type list // Traversing the event type list
for (int i = 0; i < gameObject.Events.Count; i++) for (int i = 0; i < gameObject.Events.Count; i++)
@ -277,104 +212,60 @@ void ExportGameObject(UndertaleGameObject gameObject)
// Traversing event list // Traversing event list
foreach (var j in gameObject.Events[i]) 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) if (j.EventSubtype == 4)
{ {
// To get the actual name of the collision object when the event type is a collision event // 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 else
{ {
// Get the sub-event number directly // Get the sub-event number directly
xmlWriter.WriteAttributeString("enumb", j.EventSubtype.ToString()); eventNode.Add(new XAttribute("enumb", j.EventSubtype.ToString()));
} }
// Save action // Save action
xmlWriter.WriteStartElement("action"); var actionNode = new XElement("action");
// Traversing the action list // Traversing the action list
foreach (var k in j.Actions) foreach (var k in j.Actions)
{ {
xmlWriter.WriteStartElement("libid"); actionNode.Add(
xmlWriter.WriteString(k.LibID.ToString()); new XElement("libid", k.LibID.ToString()),
xmlWriter.WriteEndElement(); new XElement("id", k.ID.ToString()),
new XElement("kind", k.Kind.ToString()),
xmlWriter.WriteStartElement("id"); new XElement("userelative", k.LibID.ToString()),
xmlWriter.WriteString(k.ID.ToString()); new XElement("libid", BoolToString(k.UseRelative)),
xmlWriter.WriteEndElement(); new XElement("isquestion", BoolToString(k.IsQuestion)),
new XElement("useapplyto", BoolToString(k.UseApplyTo)),
xmlWriter.WriteStartElement("kind"); new XElement("exetype", k.ExeType.ToString()),
xmlWriter.WriteString(k.Kind.ToString()); new XElement("functionname", k.ActionName.Content),
xmlWriter.WriteEndElement(); new XElement("codestring", ""),
new XElement("whoName", "self"),
xmlWriter.WriteStartElement("userelative"); new XElement("relative", BoolToString(k.Relative)),
xmlWriter.WriteString(BoolToString(k.UseRelative)); new XElement("isnot", BoolToString(k.IsNot)),
xmlWriter.WriteEndElement(); new XElement("arguments",
new XElement("argument",
xmlWriter.WriteStartElement("isquestion"); new XElement("kind", "1"),
xmlWriter.WriteString(BoolToString(k.IsQuestion)); new XElement("string", k.CodeId != null ? Decompiler.Decompile(k.CodeId, DECOMPILE_CONTEXT.Value) : "")
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();
} }
eventNode.Add(actionNode);
eventsNode.Add(eventNode);
// TODOPhysics // TODOPhysics
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
} }
} }
} }
xmlWriter.WriteEndElement(); File.WriteAllText(projFolder + "/objects/" + gameObject.Name.Content + ".object.gmx", gmx.ToString());
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
} }
// --------------- Export Room --------------- // --------------- Export Room ---------------
@ -386,170 +277,116 @@ async Task ExportRooms()
void ExportRoom(UndertaleRoom room) void ExportRoom(UndertaleRoom room)
{ {
// Save the room GMX // Save the room GMX
var xmlWriter = XmlWriter.Create(projFolder + "/rooms/" + room.Name.Content + ".room.gmx"); var gmx = new XDocument(
xmlWriter.WriteStartDocument(); new XComment(gmxDeclaration),
new XElement("room",
xmlWriter.WriteStartElement("room"); new XElement("caption", room.Caption.Content),
new XElement("width", room.Width.ToString()),
// Room settings new XElement("height", room.Height.ToString()),
xmlWriter.WriteStartElement("caption"); new XElement("vsnap", "32"),
xmlWriter.WriteString(room.Caption.Content); new XElement("hsnap", "32"),
xmlWriter.WriteEndElement(); new XElement("isometric", "0"),
new XElement("speed", room.Speed.ToString()),
xmlWriter.WriteStartElement("width"); new XElement("persistent", BoolToString(room.Persistent)),
xmlWriter.WriteString(room.Width.ToString()); new XElement("colour", room.BackgroundColor.ToString()),
xmlWriter.WriteEndElement(); new XElement("code", room.CreationCodeId is null ? "" : Decompiler.Decompile(room.CreationCodeId, context)),
new XElement("enableViews", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.EnableViews))),
xmlWriter.WriteStartElement("height"); new XElement("clearViewBackground", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ShowColor))),
xmlWriter.WriteString(room.Height.ToString()); new XElement("clearDisplayBuffer", BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ClearDisplayBuffer)))
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();
// TODOMakerSettings // TODOMakerSettings
// Room backgrounds // Room backgrounds
xmlWriter.WriteStartElement("backgrounds"); var backgroundsNode = new XElement("backgrounds");
foreach (var i in room.Backgrounds) foreach (var i in room.Backgrounds)
{ {
xmlWriter.WriteStartElement("background"); var backgroundNode = new XElement("background",
new XAttribute("visible", BoolToString(i.Enabled)),
xmlWriter.WriteAttributeString("visible", BoolToString(i.Enabled)); new XAttribute("foreground", BoolToString(i.Foreground)),
xmlWriter.WriteAttributeString("foreground", BoolToString(i.Foreground)); new XAttribute("name", i.BackgroundDefinition is null ? "" : i.BackgroundDefinition.Name.Content),
xmlWriter.WriteAttributeString("name", i.BackgroundDefinition is null ? "" : i.BackgroundDefinition.Name.Content); new XAttribute("x", i.X.ToString()),
xmlWriter.WriteAttributeString("x", i.X.ToString()); new XAttribute("y", i.Y.ToString()),
xmlWriter.WriteAttributeString("y", i.Y.ToString()); new XAttribute("htiled", i.TileX.ToString()),
xmlWriter.WriteAttributeString("htiled", i.TileX.ToString()); new XAttribute("vtiled", i.TileY.ToString()),
xmlWriter.WriteAttributeString("vtiled", i.TileY.ToString()); new XAttribute("hspeed", i.SpeedX.ToString()),
xmlWriter.WriteAttributeString("hspeed", i.SpeedX.ToString()); new XAttribute("vspeed", i.SpeedY.ToString()),
xmlWriter.WriteAttributeString("vspeed", i.SpeedY.ToString()); new XAttribute("stretch", "0")
// TODOStretch );
xmlWriter.WriteAttributeString("stretch", "0"); backgroundsNode.Add(backgroundNode);
xmlWriter.WriteEndElement();
} }
xmlWriter.WriteEndElement(); gmx.Element("room").Add(backgroundsNode);
// Room views // Room views
xmlWriter.WriteStartElement("views"); var viewsNode = new XElement("views");
foreach (var i in room.Views) foreach (var i in room.Views)
{ {
xmlWriter.WriteStartElement("view"); var viewNode = new XElement("view",
new XAttribute("visible", BoolToString(i.Enabled)),
xmlWriter.WriteAttributeString("visible", BoolToString(i.Enabled)); new XAttribute("objName", i.ObjectId is null ? "<undefined>" : i.ObjectId.Name.Content),
xmlWriter.WriteAttributeString("objName", i.ObjectId is null ? "<undefined>" : i.ObjectId.Name.Content); new XAttribute("xview", i.ViewX.ToString()),
xmlWriter.WriteAttributeString("xview", i.ViewX.ToString()); new XAttribute("yview", i.ViewY.ToString()),
xmlWriter.WriteAttributeString("yview", i.ViewY.ToString()); new XAttribute("wview", i.ViewHeight.ToString()),
xmlWriter.WriteAttributeString("wview", i.ViewWidth.ToString()); new XAttribute("xport", i.PortX.ToString()),
xmlWriter.WriteAttributeString("hview", i.ViewHeight.ToString()); new XAttribute("yport", i.PortY.ToString()),
xmlWriter.WriteAttributeString("xport", i.PortX.ToString()); new XAttribute("wport", i.PortWidth.ToString()),
xmlWriter.WriteAttributeString("yport", i.PortY.ToString()); new XAttribute("hport", i.PortHeight.ToString()),
xmlWriter.WriteAttributeString("wport", i.PortWidth.ToString()); new XAttribute("hborder", i.BorderX.ToString()),
xmlWriter.WriteAttributeString("hport", i.PortHeight.ToString()); new XAttribute("vborder", i.BorderY.ToString()),
xmlWriter.WriteAttributeString("hborder", i.BorderX.ToString()); new XAttribute("hspeed", i.SpeedX.ToString()),
xmlWriter.WriteAttributeString("vborder", i.BorderY.ToString()); new XAttribute("vspeed", i.SpeedY.ToString())
xmlWriter.WriteAttributeString("hspeed", i.SpeedX.ToString()); );
xmlWriter.WriteAttributeString("vspeed", i.SpeedY.ToString()); viewsNode.Add(viewNode);
xmlWriter.WriteEndElement();
} }
xmlWriter.WriteEndElement(); gmx.Element("room").Add(viewsNode);
// Room instances // Room instances
xmlWriter.WriteStartElement("instances"); var instancesNode = new XElement("instances");
foreach (var i in room.GameObjects) foreach (var i in room.GameObjects)
{ {
xmlWriter.WriteStartElement("instance"); var instanceNode = new XElement("instance",
new XAttribute("objName", i.ObjectDefinition.Name.Content),
xmlWriter.WriteAttributeString("objName", i.ObjectDefinition.Name.Content); new XAttribute("x", i.X.ToString()),
xmlWriter.WriteAttributeString("x", i.X.ToString()); new XAttribute("y", i.Y.ToString()),
xmlWriter.WriteAttributeString("y", i.Y.ToString()); new XAttribute("name", "inst_" + i.InstanceID.ToString("X")),
xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X")); new XAttribute("locked", "0"),
// TODOLocked new XAttribute("code", i.CreationCode != null ? Decompiler.Decompile(i.CreationCode, DECOMPILE_CONTEXT.Value) : ""),
xmlWriter.WriteAttributeString("locked", "0"); new XAttribute("scaleX", i.ScaleX.ToString()),
xmlWriter.WriteAttributeString("code", i.CreationCode != null ? Decompiler.Decompile(i.CreationCode, DECOMPILE_CONTEXT.Value) : ""); new XAttribute("scaleY", i.ScaleY.ToString()),
xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString()); new XAttribute("colour", i.Color.ToString()),
xmlWriter.WriteAttributeString("scaleY", i.ScaleY.ToString()); new XAttribute("rotation", i.Rotation.ToString())
xmlWriter.WriteAttributeString("colour", i.Color.ToString()); );
xmlWriter.WriteAttributeString("rotation", i.Rotation.ToString()); instancesNode.Add(instanceNode);
xmlWriter.WriteEndElement();
} }
xmlWriter.WriteEndElement(); gmx.Element("room").Add(instancesNode);
// Room tiles // Room tiles
xmlWriter.WriteStartElement("tiles"); var tilesNode = new XElement("tiles");
foreach (var i in room.Tiles) foreach (var i in room.Tiles)
{ {
xmlWriter.WriteStartElement("tile"); var tileNode = new XElement("tile",
new XAttribute("bgName", i.BackgroundDefinition.Name.Content),
xmlWriter.WriteAttributeString("bgName", i.BackgroundDefinition.Name.Content); new XAttribute("x", i.X.ToString()),
xmlWriter.WriteAttributeString("x", i.X.ToString()); new XAttribute("y", i.Y.ToString()),
xmlWriter.WriteAttributeString("y", i.Y.ToString()); new XAttribute("w", i.Width.ToString()),
xmlWriter.WriteAttributeString("w", i.Width.ToString()); new XAttribute("h", i.Height.ToString()),
xmlWriter.WriteAttributeString("h", i.Height.ToString()); new XAttribute("xo", i.SourceX.ToString()),
xmlWriter.WriteAttributeString("xo", i.SourceX.ToString()); new XAttribute("yo", i.SourceY.ToString()),
xmlWriter.WriteAttributeString("yo", i.SourceY.ToString()); new XAttribute("id", i.InstanceID.ToString()),
xmlWriter.WriteAttributeString("id", i.InstanceID.ToString()); new XAttribute("name", "inst_" + i.InstanceID.ToString("X")),
xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X")); new XAttribute("depth", i.TileDepth.ToString()),
xmlWriter.WriteAttributeString("depth", i.TileDepth.ToString()); new XAttribute("locked", "0"),
// TODOLocked new XAttribute("colour", i.Color.ToString()),
xmlWriter.WriteAttributeString("locked", "0"); new XAttribute("scaleX", i.ScaleX.ToString()),
xmlWriter.WriteAttributeString("colour", i.Color.ToString()); new XAttribute("scaleY", i.ScaleY.ToString())
xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString()); );
xmlWriter.WriteAttributeString("scaleY", i.ScaleY.ToString()); tilesNode.Add(tileNode);
xmlWriter.WriteEndElement();
} }
xmlWriter.WriteEndElement(); gmx.Element("room").Add(tilesNode);
// TODORoom physics // TODORoom physics
xmlWriter.WriteEndElement(); File.WriteAllText(projFolder + "/rooms/" + room.Name.Content + ".room.gmx", gmx.ToString());
xmlWriter.WriteEndDocument();
xmlWriter.Close();
} }
// --------------- Export Sound --------------- // --------------- Export Sound ---------------
@ -561,95 +398,35 @@ async Task ExportSounds()
void ExportSound(UndertaleSound sound) void ExportSound(UndertaleSound sound)
{ {
// Save the sound GMX // Save the sound GMX
var xmlWriter = XmlWriter.Create(projFolder + "/sound/" + sound.Name.Content + ".sound.gmx"); var gmx = new XDocument(
xmlWriter.WriteStartDocument(); 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"); File.WriteAllText(projFolder + "/sound/" + sound.Name.Content + ".sound.gmx", gmx.ToString());
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");
// TODOPan
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("bitRates");
// TODOBitRates
xmlWriter.WriteString("192");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("sampleRates");
// TODOSampleRates
xmlWriter.WriteStartElement("sampleRate");
xmlWriter.WriteString("44100");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("types");
// TODOTypes
xmlWriter.WriteStartElement("type");
xmlWriter.WriteString("1");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("bitDepths");
// TODOBitDepths
xmlWriter.WriteStartElement("bitDepth");
xmlWriter.WriteString("16");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("preload");
// TODOPreload
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");
// TODOUncompressOnLoad
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("audioGroup");
// TODOAudioGroup
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
// Save sound files // Save sound files
if (sound.AudioFile != null) if (sound.AudioFile != null)
@ -677,84 +454,45 @@ async Task ExportFonts()
void ExportFont(UndertaleFont font) void ExportFont(UndertaleFont font)
{ {
// Save the font GMX // Save the font GMX
var xmlWriter = XmlWriter.Create(projFolder + "/fonts/" + font.Name.Content + ".font.gmx"); var gmx = new XDocument(
xmlWriter.WriteStartDocument(); 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"); File.WriteAllText(projFolder + "/fonts/" + font.Name.Content + ".font.gmx", gmx.ToString());
xmlWriter.WriteStartElement("name"); var glyphsNode = gmx.Element("font").Element("glyphs");
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");
foreach (var i in font.Glyphs) foreach (var i in font.Glyphs)
{ {
xmlWriter.WriteStartElement("glyph"); var glyphNode = new XElement("glyph");
xmlWriter.WriteAttributeString("character", i.Character.ToString()); glyphNode.Add(new XElement("character", i.Character.ToString()));
xmlWriter.WriteAttributeString("x", i.SourceX.ToString()); glyphNode.Add(new XElement("x", i.SourceX.ToString()));
xmlWriter.WriteAttributeString("y", i.SourceY.ToString()); glyphNode.Add(new XElement("y", i.SourceY.ToString()));
xmlWriter.WriteAttributeString("w", i.SourceWidth.ToString()); glyphNode.Add(new XElement("w", i.SourceWidth.ToString()));
xmlWriter.WriteAttributeString("h", i.SourceHeight.ToString()); glyphNode.Add(new XElement("h", i.SourceHeight.ToString()));
xmlWriter.WriteAttributeString("shift", i.Shift.ToString()); glyphNode.Add(new XElement("shift", i.Shift.ToString()));
xmlWriter.WriteAttributeString("offset", i.Offset.ToString()); glyphNode.Add(new XElement("offset", i.Offset.ToString()));
xmlWriter.WriteEndElement(); 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 // Save font textures
worker.ExportAsPNG(font.Texture, projFolder + "/fonts/" + font.Name.Content + ".png"); worker.ExportAsPNG(font.Texture, projFolder + "/fonts/" + font.Name.Content + ".png");