Update ExportToProject.csx

This commit is contained in:
cubeww 2019-11-02 17:48:07 +08:00
parent 80fc2d58bd
commit 524f0f8389

View file

@ -22,43 +22,41 @@ if (Directory.Exists(projFolder))
Directory.CreateDirectory(projFolder);
//UpdateProgressBar (null, "Exporting backgrounds...", progress++, 8);
// --------------- Start exporting ---------------
// --------------- 开始导出 ---------------
// 执行导出精灵
// Export sprites
UpdateProgressBar(null, "Exporting sprites...", progress++, 8);
await ExportSprites();
// 执行导出背景
// Export backgrounds
UpdateProgressBar(null, "Exporting backgrounds...", progress++, 8);
await ExportBackground();
// 执行导出对象
// Export objects
UpdateProgressBar(null, "Exporting objects...", progress++, 8);
await ExportGameObjects();
// 执行导出房间
// Export rooms
UpdateProgressBar(null, "Exporting rooms...", progress++, 8);
await ExportRooms();
// 执行导出声音
// Export sounds
UpdateProgressBar(null, "Exporting sounds...", progress++, 8);
await ExportSounds();
// 执行导出脚本
// Export scripts
UpdateProgressBar(null, "Exporting scripts...", progress++, 8);
await ExportScripts();
// 执行导出字体
// Export fonts
UpdateProgressBar(null, "Exporting fonts...", progress++, 8);
await ExportFonts();
// 执行导出项目文件
UpdateProgressBar(null, "Exporting project file...", progress++, 8);
// Generate project file
UpdateProgressBar(null, "Generating project file...", progress++, 8);
ExportProjectFile();
// --------------- 导出完毕 ---------------
// --------------- Export completed ---------------
worker.Cleanup();
HideProgressBar();
ScriptMessage("Export Complete.\n\nLocation: " + projFolder);
@ -69,10 +67,11 @@ string GetFolder(string path)
}
string BoolToString(bool value)
{
// In the GMX file, -1 is true and 0 is false.
return value ? "-1" : "0";
}
// --------------- 导出精灵 ---------------
// --------------- Export Sprite ---------------
async Task ExportSprites()
{
Directory.CreateDirectory(projFolder + "/sprites/images");
@ -80,7 +79,7 @@ async Task ExportSprites()
}
void ExportSprite(UndertaleSprite sprite)
{
// 保存精灵GMX
// Save the sprite GMX
var xmlWriter = XmlWriter.Create(projFolder + "/sprites/" + sprite.Name.Content + ".sprite.gmx");
xmlWriter.WriteStartDocument();
@ -173,13 +172,13 @@ void ExportSprite(UndertaleSprite sprite)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
// 保存精灵图像
// Save sprite images
for (int i = 0; i < sprite.Textures.Count; i++)
if (sprite.Textures[i]?.Texture != null)
worker.ExportAsPNG(sprite.Textures[i].Texture, projFolder + "/sprites/images/" + sprite.Name.Content + "_" + i + ".png");
}
// --------------- 导出背景 ---------------
// --------------- Export Background ---------------
async Task ExportBackground()
{
Directory.CreateDirectory(projFolder + "/backgrounds/images");
@ -187,7 +186,7 @@ async Task ExportBackground()
}
void ExportBackground(UndertaleBackground background)
{
// 保存背景GMX
// Save the backgound GMX
var xmlWriter = XmlWriter.Create(projFolder + "/backgrounds/" + background.Name.Content + ".background.gmx");
xmlWriter.WriteStartDocument();
@ -255,10 +254,10 @@ void ExportBackground(UndertaleBackground background)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
// 保存背景图像
// Save background images
worker.ExportAsPNG(background.Texture, projFolder + "/backgrounds/images/" + background.Name.Content + ".png");
}
// --------------- 导出对象 ---------------
// --------------- Export Object ---------------
async Task ExportGameObjects()
{
Directory.CreateDirectory(projFolder + "/objects");
@ -266,157 +265,153 @@ async Task ExportGameObjects()
}
void ExportGameObject(UndertaleGameObject gameObject)
{
//try
// 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 ? "<undefined>" : 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 ? "<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
for (int i = 0; i < gameObject.Events.Count; i++)
{
// 保存对象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 ? "<undefined>" : 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 ? "<undefined>" : gameObject.ParentId.Name.Content);
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("maskName");
xmlWriter.WriteString(gameObject.TextureMaskId is null ? "<undefined>" : gameObject.TextureMaskId.Name.Content);
xmlWriter.WriteEndElement();
// 保存事件
xmlWriter.WriteStartElement("events");
// 遍历事件类型列表
for (int i = 0; i < gameObject.Events.Count; i++)
// Determine if an event is empty
if (gameObject.Events[i].Count > 0)
{
// 判断某个事件类型是否为空
if (gameObject.Events[i].Count > 0)
// Traversing event list
foreach (var j in gameObject.Events[i])
{
// 遍历事件列表
foreach (var j in gameObject.Events[i])
xmlWriter.WriteStartElement("event");
xmlWriter.WriteAttributeString("eventtype", i.ToString());
if (j.EventSubtype == 4)
{
xmlWriter.WriteStartElement("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);
}
else
{
// Get the sub-event number directly
xmlWriter.WriteAttributeString("enumb", j.EventSubtype.ToString());
}
xmlWriter.WriteAttributeString("eventtype", i.ToString());
if (j.EventSubtype == 4)
{
// 当事件类型为碰撞事件时,要获取碰撞对象的实际名字
xmlWriter.WriteAttributeString("ename", Data.GameObjects[(int)j.EventSubtype].Name.Content);
}
else
{
// 直接获取子事件编号
xmlWriter.WriteAttributeString("enumb", j.EventSubtype.ToString());
}
// 保存动作
xmlWriter.WriteStartElement("action");
// 遍历动作列表
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");
// 在data.win中所有DND动作被转换为字节码自动处理执行者
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();
}
// TODOUTMT没有给出关于对象物理的属性
// Save action
xmlWriter.WriteStartElement("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();
}
// TODOPhysics
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
}
}
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
}
//catch { }
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
}
// --------------- 导出房间 ---------------
// --------------- Export Room ---------------
async Task ExportRooms()
{
Directory.CreateDirectory(projFolder + "/rooms");
@ -424,13 +419,13 @@ async Task ExportRooms()
}
void ExportRoom(UndertaleRoom room)
{
// 保存房间GMX
// 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();
@ -487,9 +482,9 @@ void ExportRoom(UndertaleRoom room)
xmlWriter.WriteString(BoolToString(room.Flags.HasFlag(UndertaleRoom.RoomEntryFlags.ClearDisplayBuffer)));
xmlWriter.WriteEndElement();
// TODO这里原room文件有一些makerSettings看似不必要就没有生成
// TODOMakerSettings
// 背景
// Room backgrounds
xmlWriter.WriteStartElement("backgrounds");
foreach (var i in room.Backgrounds)
{
@ -504,14 +499,14 @@ void ExportRoom(UndertaleRoom room)
xmlWriter.WriteAttributeString("vtiled", i.TileY.ToString());
xmlWriter.WriteAttributeString("hspeed", i.SpeedX.ToString());
xmlWriter.WriteAttributeString("vspeed", i.SpeedY.ToString());
// TODO这里stretch属性UTMT中没有给出
// TODOStretch
xmlWriter.WriteAttributeString("stretch", "0");
xmlWriter.WriteEndElement();
}
xmlWriter.WriteEndElement();
// 视野
// Room views
xmlWriter.WriteStartElement("views");
foreach (var i in room.Views)
{
@ -536,7 +531,7 @@ void ExportRoom(UndertaleRoom room)
}
xmlWriter.WriteEndElement();
// 实例
// Room instances
xmlWriter.WriteStartElement("instances");
foreach (var i in room.GameObjects)
{
@ -546,7 +541,7 @@ void ExportRoom(UndertaleRoom room)
xmlWriter.WriteAttributeString("x", i.X.ToString());
xmlWriter.WriteAttributeString("y", i.Y.ToString());
xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X"));
// TODO这里的locked属性UTMT里没有给出
// TODOLocked
xmlWriter.WriteAttributeString("locked", "0");
xmlWriter.WriteAttributeString("code", i.CreationCode != null ? Decompiler.Decompile(i.CreationCode, DECOMPILE_CONTEXT.Value) : "");
xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString());
@ -558,7 +553,7 @@ void ExportRoom(UndertaleRoom room)
}
xmlWriter.WriteEndElement();
// 贴图
// Room tiles
xmlWriter.WriteStartElement("tiles");
foreach (var i in room.Tiles)
{
@ -574,7 +569,7 @@ void ExportRoom(UndertaleRoom room)
xmlWriter.WriteAttributeString("id", i.InstanceID.ToString());
xmlWriter.WriteAttributeString("name", "inst_" + i.InstanceID.ToString("X"));
xmlWriter.WriteAttributeString("depth", i.TileDepth.ToString());
// TODO这里的locked属性UTMT里没有给出
// TODOLocked
xmlWriter.WriteAttributeString("locked", "0");
xmlWriter.WriteAttributeString("colour", i.Color.ToString());
xmlWriter.WriteAttributeString("scaleX", i.ScaleX.ToString());
@ -584,14 +579,14 @@ void ExportRoom(UndertaleRoom room)
}
xmlWriter.WriteEndElement();
// TODOUTMT没有给出关于房间物理的属性
// TODORoom physics
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
xmlWriter.Close();
}
// --------------- 导出声音 ---------------
// --------------- Export Sound ---------------
async Task ExportSounds()
{
Directory.CreateDirectory(projFolder + "/sound/audio");
@ -599,14 +594,14 @@ async Task ExportSounds()
}
void ExportSound(UndertaleSound sound)
{
// 保存声音GMX
// Save the sound GMX
var xmlWriter = XmlWriter.Create(projFolder + "/sound/" + sound.Name.Content + ".sound.gmx");
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("sound");
xmlWriter.WriteStartElement("kind");
// TODOUTMT没有给出kind属性这里通过文件扩展名进行推断
// Inferred by file extension
xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "3" : "0");
xmlWriter.WriteEndElement();
@ -627,38 +622,38 @@ void ExportSound(UndertaleSound sound)
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("pan");
// TODOUTMT中未给出声道属性
// TODOPan
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("bitRates");
// TODOUTMT中未给出比特率属性
// TODOBitRates
xmlWriter.WriteString("192");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("sampleRates");
// TODOUTMT中未给出采样率属性
// TODOSampleRates
xmlWriter.WriteStartElement("sampleRate");
xmlWriter.WriteString("44100");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("types");
// TODOUTMT中未给出类型属性
// TODOTypes
xmlWriter.WriteStartElement("type");
xmlWriter.WriteString("1");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("bitDepths");
// TODOUTMT中未给出bitDepths属性
// TODOBitDepths
xmlWriter.WriteStartElement("bitDepth");
xmlWriter.WriteString("16");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("preload");
// TODOUTMT中未给出preload属性
// TODOPreload
xmlWriter.WriteString("-1");
xmlWriter.WriteEndElement();
@ -667,22 +662,22 @@ void ExportSound(UndertaleSound sound)
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("compressed");
// TODOUTMT中未给出compressed属性这里通过文件扩展名进行推断
// Inferred by file extension
xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("streamed");
// TODOUTMT中未给出streamed属性这里通过文件扩展名进行推断
// Inferred by file extension
xmlWriter.WriteString(Path.GetExtension(sound.File.Content) == ".ogg" ? "1" : "0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("uncompressOnLoad");
// TODOUTMT中未给出uncompressOnLoad属性
// TODOUncompressOnLoad
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("audioGroup");
// TODOUTMT中给出了音频组但并不明确
// TODOAudioGroup
xmlWriter.WriteString("0");
xmlWriter.WriteEndElement();
@ -690,12 +685,12 @@ void ExportSound(UndertaleSound sound)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
// 保存音频文件
// Save sound files
if (sound.AudioFile != null)
File.WriteAllBytes(projFolder + "/sound/audio/" + sound.File.Content, sound.AudioFile.Data);
}
// --------------- 导出脚本 ---------------
// --------------- Export Script ---------------
async Task ExportScripts()
{
Directory.CreateDirectory(projFolder + "/scripts/");
@ -703,11 +698,11 @@ async Task ExportScripts()
}
void ExportScript(UndertaleScript script)
{
// 保存脚本GML
// Save GML files
File.WriteAllText(projFolder + "/scripts/" + script.Name.Content + ".gml", (script.Code != null ? Decompiler.Decompile(script.Code, DECOMPILE_CONTEXT.Value) : ""));
}
// --------------- 导出字体 ---------------
// --------------- Export Font ---------------
async Task ExportFonts()
{
Directory.CreateDirectory(projFolder + "/fonts/");
@ -715,7 +710,7 @@ async Task ExportFonts()
}
void ExportFont(UndertaleFont font)
{
// 保存字体GMX
// Save the font GMX
var xmlWriter = XmlWriter.Create(projFolder + "/fonts/" + font.Name.Content + ".font.gmx");
xmlWriter.WriteStartDocument();
@ -795,14 +790,14 @@ void ExportFont(UndertaleFont font)
xmlWriter.WriteEndDocument();
xmlWriter.Close();
// 保存字体图像
// Save font textures
worker.ExportAsPNG(font.Texture, projFolder + "/fonts/" + font.Name.Content + ".png");
}
// --------------- 导出项目文件 ---------------
// --------------- Generate project file ---------------
void ExportProjectFile()
{
// 保存字体GMX
// Write all resource indexes to project.gmx
var xmlWriter = XmlWriter.Create(projFolder + "Export_Project.project.gmx");
xmlWriter.WriteStartDocument();