using Newtonsoft.Json.Linq; using System.IO; using System.Text; namespace H5MotaUpdate.ViewModels { internal class FloorsMigrator { string sourcePath, destPath; Version version; readonly string FILENAME = "floors"; string?[] mapsIndexArray; int mapWidth, mapHeight; /// /// 请输入新旧Project文件夹的路径 /// public FloorsMigrator(string oldProjectDirectory, string newProjectDirectory, Version ver, int width, int height) { sourcePath = Path.Combine(oldProjectDirectory, FILENAME); destPath = Path.Combine(newProjectDirectory, FILENAME); this.version = ver; this.mapWidth = width; this.mapHeight = height; } public void Migrate(string?[] mapsIndexArray) { try { if (version.CompareTo(new Version(2, 7)) >= 0) { MigrateDirect(); } else { this.mapsIndexArray = mapsIndexArray; MigrateFloors(); } ErrorLogger.LogError("迁移project/" + FILENAME + "文件夹完成。"); } catch (Exception e) { ErrorLogger.LogError("迁移project/" + FILENAME + $"文件夹过程中出现错误: {e.Message}", "red"); } } void MigrateDirect() { FileUtils.CopyFolderContents(sourcePath, destPath); } void MigrateFloors() { string[] files = Directory.GetFiles(sourcePath); foreach (string file in files) { string sourceFilePath = System.IO.Path.Combine(sourcePath, System.IO.Path.GetFileName(file)), destFilePath = System.IO.Path.Combine(destPath, System.IO.Path.GetFileName(file)); MigrateOneFloor(sourceFilePath, destFilePath); } } void MigrateOneFloor(string sourceFilePath, string destFilePath) { // 每一层try catch一次,一层出错不影响其它层继续复制 try { string floorName = System.IO.Path.GetFileNameWithoutExtension(sourceFilePath); JObject jsonObject = StringUtils.getValidJson(sourceFilePath); if (version.CompareTo(new Version(2, 7)) <= 0) { Convert(jsonObject); } StringBuilder newJsContent = new StringBuilder(); newJsContent.Append("main.floors." + floorName + " = \n"); newJsContent.Append(jsonObject.ToString()); File.WriteAllText(destFilePath, newJsContent.ToString()); } catch (Exception e) { ErrorLogger.LogError("迁移楼层文件" + System.IO.Path.GetFileName(sourceFilePath) + $"时出现错误: {e.Message}", "red"); } } void Convert(JObject jsonObject) { jsonObject["canFlyFrom"] = jsonObject["canFlyTo"]; jsonObject["ratio"] = jsonObject["item_ratio"]; jsonObject.Remove("item_ratio"); jsonObject["autoEvent"] = new JObject(); // 设置每张地图的尺寸。如果自己有就用自己的,否则设为默认长宽。 int width, height; if (jsonObject["width"] != null && jsonObject["width"].Type == JTokenType.Integer) { width = (int)jsonObject["width"]; } else { width = mapWidth; jsonObject["width"] = width; } if (jsonObject["height"] != null && jsonObject["height"].Type == JTokenType.Integer) { height = (int)jsonObject["height"]; } else { height = mapHeight; jsonObject["height"] = height; } #region 楼层贴图 // 楼层贴图:老版本为一字符串或数组,字符串会被自动转为[0,0,str] // 其中t[0],t[1]分别为x,y,t[2]为贴图名字 剩下的不知道干嘛的 JToken oldImages = jsonObject["images"]; string imageName = null; if (oldImages is JArray oldImagesArr) { if (oldImagesArr.Count >= 3) { imageName = oldImagesArr[2].ToString(); } } else { imageName = oldImages.ToString(); } if (imageName == null) { jsonObject["images"] = new JArray(); } JObject newImages = new JObject(new JProperty("name", imageName), new JProperty("canvas", "bg"), new JProperty("sx", 0), new JProperty("sy", 0), new JProperty("w", 32 * width), new JProperty("h", 32 * height) ); jsonObject["images"] = new JArray(newImages); #endregion #region JArray mapMatrix = (JArray)jsonObject["map"]; JArray zeroBgMatrix = StringUtils.CreateMatrix(width, height); for (int i = 0; i < mapMatrix.Count; i++) { JArray lineArr = (JArray)mapMatrix[i]; for (int j = 0; j < lineArr.Count; j++) { int onePoint = lineArr[j].Value(); if (onePoint >= 81 && onePoint <= 86 && mapsIndexArray != null) { // 将terrains门替换为animates门 lineArr[j] = mapsIndexArray[onePoint - 81]; } if (onePoint == 167 && version.CompareTo(new Version(2, 6)) < 0) { // 2.6以后,滑冰转移到背景层 if (jsonObject["bgmap"] == null) { jsonObject["bgmap"] = zeroBgMatrix.DeepClone(); } else { JArray bgMatrix = (JArray)jsonObject["bgmap"]; if (bgMatrix.Count == 0) { jsonObject["bgmap"] = zeroBgMatrix.DeepClone(); } } jsonObject["bgmap"][i][j] = 167; mapMatrix[i][j] = 0; } } } #endregion } } }