213 lines
8.7 KiB
C#
213 lines
8.7 KiB
C#
using Newtonsoft.Json.Linq;
|
||
using System.IO;
|
||
|
||
namespace H5MotaUpdate.ViewModels
|
||
{
|
||
public class MediaSourceMigrator
|
||
{
|
||
string oldProjectDirectory, newProjectDirectory;
|
||
Version version;
|
||
|
||
/// <summary>
|
||
/// 请输入新旧Project文件夹的路径
|
||
/// </summary>
|
||
public MediaSourceMigrator(string oldProjectDirectory, string newProjectDirectory, Version ver)
|
||
{
|
||
this.oldProjectDirectory = oldProjectDirectory;
|
||
this.newProjectDirectory = newProjectDirectory;
|
||
this.version = ver;
|
||
}
|
||
|
||
public void Migrate()
|
||
{
|
||
try
|
||
{
|
||
if (version.CompareTo(new Version(2, 7)) >= 0)
|
||
{
|
||
MigrateDirect();
|
||
}
|
||
else
|
||
{
|
||
Convert();
|
||
}
|
||
ErrorLogger.LogError("迁移素材文件完成。");
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
ErrorLogger.LogError("迁移素材文件过程中出现错误: " + $"{e.Message}", "red");
|
||
}
|
||
}
|
||
|
||
public void MigrateDirect()
|
||
{
|
||
string[] subFolderNames = ["animates", "autotiles", "bgms", "fonts", "images", "materials", "sounds", "tilesets"];
|
||
foreach (string folderName in subFolderNames)
|
||
{
|
||
try
|
||
{
|
||
string sourcePath = Path.Combine(oldProjectDirectory, folderName),
|
||
destPath = Path.Combine(newProjectDirectory, folderName);
|
||
FileUtils.CopyFolderContents(sourcePath, destPath);
|
||
ErrorLogger.LogError("project/" + folderName + "文件夹迁移完成");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ErrorLogger.LogError("project/" + folderName + $"文件夹迁移失败,原因:{ex.Message}", "red");
|
||
}
|
||
}
|
||
}
|
||
|
||
public void Convert()
|
||
{
|
||
try
|
||
{
|
||
string datasJsPath = Path.Combine(oldProjectDirectory, "data.js"),
|
||
iconsJsPath = Path.Combine(oldProjectDirectory, "icons.js");
|
||
|
||
List<string> imagesList = [],
|
||
bgmsList = [],
|
||
soundsList = [],
|
||
autotilesList = [],
|
||
tilesetsList = [];
|
||
JObject datasJObject = StringUtils.getValidJson(datasJsPath),
|
||
iconsJObject = StringUtils.getValidJson(iconsJsPath);
|
||
|
||
if (datasJObject["main"]["images"] is JArray imagesJsonList && imagesJsonList.Count > 0)
|
||
{
|
||
imagesList = imagesJsonList.ToObject<List<string>>();
|
||
imagesList.Add("hero.png"); // 2.7以前hero.png硬编码在loader.prototype._loadExtraImages中
|
||
imagesList.Add("ground.png");
|
||
|
||
}
|
||
if (datasJObject["main"]["bgms"] is JArray bgmsJsonList && bgmsJsonList.Count > 0)
|
||
{
|
||
bgmsList = bgmsJsonList.ToObject<List<string>>();
|
||
}
|
||
if (datasJObject["main"]["sounds"] is JArray soundsJsonList && soundsJsonList.Count > 0)
|
||
{
|
||
soundsList = soundsJsonList.ToObject<List<string>>();
|
||
}
|
||
if (datasJObject["main"]["tilesets"] is JArray tilesetsJsonList && tilesetsJsonList.Count > 0)
|
||
{
|
||
tilesetsList = tilesetsJsonList.ToObject<List<string>>();
|
||
}
|
||
if (iconsJObject["autotile"] is JObject autotilesJsonList && autotilesJsonList.Count > 0)
|
||
{
|
||
autotilesList = autotilesJsonList.Properties().Select(prop => prop.Name + ".png").ToList(); //autotile只允许是.png格式
|
||
}
|
||
TransferOldAnimate();
|
||
TransferOldImages(imagesList, autotilesList, tilesetsList);
|
||
TransferSounds(bgmsList, soundsList);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ErrorLogger.LogError($"素材文件夹迁移出错,原因:{ex.Message}", "red");
|
||
}
|
||
}
|
||
|
||
void TransferOldAnimate()
|
||
{
|
||
try
|
||
{
|
||
string inputDirectory = Path.Combine(oldProjectDirectory, "animates"),
|
||
outputDirectory = Path.Combine(newProjectDirectory, "animates");
|
||
FileUtils.CopyFolderContents(inputDirectory, outputDirectory);
|
||
ErrorLogger.LogError("project/animates文件夹迁移完成");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ErrorLogger.LogError($"project/animates文件夹迁移出错,原因:{ex.Message}", "red");
|
||
}
|
||
}
|
||
|
||
void TransferOldImages(List<string> imagesList, List<string> autotilesList, List<string> tilesetsList)
|
||
{
|
||
try
|
||
{
|
||
string inputDirectory = Path.Combine(oldProjectDirectory, "images");
|
||
string[] files = Directory.GetFiles(inputDirectory);
|
||
|
||
string[] materialsFiles = ["airwall.png",
|
||
"animates.png",
|
||
"enemy48.png",
|
||
"enemys.png",
|
||
"fog.png",
|
||
"ground.png",
|
||
"icons.png",
|
||
"icons_old.png",
|
||
"items.png",
|
||
"keyboard.png",
|
||
"npc48.png",
|
||
"npcs.png",
|
||
"terrains.png"];
|
||
foreach (string filePath in files)
|
||
{
|
||
string fileName = Path.GetFileName(filePath);
|
||
if (fileName == "icons.png" && version < new Version(2, 5, 4)) //检查icons长度
|
||
{
|
||
using (Bitmap image = new Bitmap(filePath))
|
||
{
|
||
int width = image.Width;
|
||
int height = image.Height;
|
||
if (height < 1120)
|
||
{
|
||
ErrorLogger.LogError("警告:原塔的icons.png长度不足!请对照最新样板使用PS工具补齐数字键和Alt图标等。", "red");
|
||
MessageBox.Show("警告:原塔的icons.png长度不足!请对照最新样板使用PS工具补齐数字键和Alt图标等。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (imagesList.Contains(fileName))
|
||
{
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "images/" + fileName), true);
|
||
}
|
||
if (materialsFiles.Contains(fileName))
|
||
{
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "materials/" + fileName), true);
|
||
}
|
||
if (autotilesList.Contains(fileName))
|
||
{ // 样板会将autotile强制转换为.png
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "autotiles/" + fileName), true);
|
||
}
|
||
if (tilesetsList.Contains(fileName))
|
||
{
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "tilesets/" + fileName), true);
|
||
}
|
||
}
|
||
ErrorLogger.LogError("project/images文件夹迁移完成");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ErrorLogger.LogError($"project/images文件夹迁移出错,原因:{ex.Message}", "red");
|
||
}
|
||
}
|
||
|
||
void TransferSounds(List<string> bgmsList, List<string> soundsList)
|
||
{
|
||
try
|
||
{
|
||
string inputDirectory = Path.Combine(oldProjectDirectory, "sounds");
|
||
string[] files = Directory.GetFiles(inputDirectory);
|
||
|
||
foreach (string filePath in files)
|
||
{
|
||
string fileName = Path.GetFileName(filePath);
|
||
if (bgmsList.Contains(fileName))
|
||
{
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "bgms/" + fileName), true);
|
||
}
|
||
if (soundsList.Contains(fileName))
|
||
{
|
||
File.Copy(filePath, Path.Combine(newProjectDirectory, "sounds/" + fileName), true);
|
||
}
|
||
}
|
||
ErrorLogger.LogError("project/sounds文件夹迁移完成");
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
ErrorLogger.LogError($"project/sounds文件夹迁移出错,原因:{ex.Message}", "red");
|
||
}
|
||
}
|
||
}
|
||
}
|