Newer
Older
DungeonShooting / DungeonShooting_Godot / addons / dungeonShooting_plugin / Automation.cs
  1. #if TOOLS
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text.Json;
  7. using System.Text.RegularExpressions;
  8. using Godot;
  9. using File = System.IO.File;
  10.  
  11. [Tool]
  12. public partial class Automation : Control
  13. {
  14. //支持后缀
  15. private string[] suffix =
  16. {
  17. ".png", ".jpg", ".txt", ".json", ".ini", ".tscn", ".tres", ".otf", ".gdshader", ".ogg", ".mp3", ".wav", ".svg"
  18. };
  19. //排除第一层的文件夹
  20. private string[] exclude =
  21. {
  22. ".vscode", ".idea", ".git", ".import", ".mono", "android", "addons", ".godot"
  23. };
  24. private string currDir = System.Environment.CurrentDirectory;
  25.  
  26. private string resultStr = "";
  27. /// <summary>
  28. /// 更新 ResourcePath
  29. /// </summary>
  30. private void _on_Button_pressed()
  31. {
  32. resultStr = "/// <summary>\n" +
  33. "/// 编辑器下所有资源路径, 该类为 Automation 面板下自动生成的, 请不要手动编辑!\n" +
  34. "/// </summary>\n" +
  35. "public class ResourcePath\n" +
  36. "{\n";
  37.  
  38. GD.Print("更新 ResourcePath...");
  39.  
  40. var directoryInfo = new DirectoryInfo(currDir);
  41.  
  42. var directories = directoryInfo.GetDirectories();
  43. for (int i = 0; i < directories.Length; i++)
  44. {
  45. var directory = directories[i];
  46. if (!exclude.Contains(directory.Name))
  47. {
  48. EachDir(directory);
  49. }
  50. }
  51.  
  52. var fileInfos = directoryInfo.GetFiles();
  53. for (var i = 0; i < fileInfos.Length; i++)
  54. {
  55. HandleFile(fileInfos[i]);
  56. }
  57.  
  58. resultStr += "}";
  59. File.WriteAllText("src/game/manager/ResourcePath.cs", resultStr);
  60. GD.Print("ResourcePath.cs 写出完成!");
  61. }
  62.  
  63. /// <summary>
  64. /// 重新打包房间配置
  65. /// </summary>
  66. private void _on_Button2_pressed()
  67. {
  68. //地图路径
  69. var tileDir = DungeonRoomTemplate.RoomTileDir;
  70. //地图描述数据路径
  71. var tileDataDir = DungeonRoomTemplate.RoomTileDataDir;
  72. var tileDirInfo = new DirectoryInfo(tileDir);
  73. var tileDataDirInfo = new DirectoryInfo(tileDataDir);
  74.  
  75. //所有地图列表
  76. var mapList = new HashSet<string>();
  77. //收集所有名称
  78. var fileDataInfos = tileDataDirInfo.GetFiles();
  79. foreach (var fileInfo in fileDataInfos)
  80. {
  81. mapList.Add(RemoveExtension(fileInfo.Name));
  82. }
  83. //收集所有名称
  84. var fileInfos = tileDirInfo.GetFiles();
  85. foreach (var fileInfo in fileInfos)
  86. {
  87. if (fileInfo.Extension == ".tscn")
  88. {
  89. mapList.Add(RemoveExtension(fileInfo.Name));
  90. }
  91. }
  92. //剔除多余的 tile.json
  93. var arrays = mapList.ToArray();
  94. foreach (var item in arrays)
  95. {
  96. if (!File.Exists(tileDir + item + ".tscn"))
  97. {
  98. mapList.Remove(item);
  99. var filePath = tileDataDir + item + ".json";
  100. if (File.Exists(filePath))
  101. {
  102. GD.Print($"未找到'{tileDir + item}.tscn', 删除配置文件: {filePath}");
  103. File.Delete(filePath);
  104. }
  105. }
  106. }
  107.  
  108. //手动生成缺失的 tile.json
  109. foreach (var item in mapList)
  110. {
  111. if (!File.Exists(tileDataDir + item + ".json"))
  112. {
  113. var tscnName = tileDir + item + ".tscn";
  114. var packedScene = ResourceManager.Load<PackedScene>(tscnName, false);
  115. if (packedScene != null)
  116. {
  117. var dungeonRoomTemplate = packedScene.Instantiate<DungeonRoomTemplate>();
  118. var usedRect = dungeonRoomTemplate.GetUsedRect();
  119. var dungeonTile = new DungeonTile(dungeonRoomTemplate);
  120. dungeonTile.SetFloorAtlasCoords(new List<Vector2I>() { new Vector2I(0, 8) });
  121. //计算导航网格
  122. dungeonTile.GenerateNavigationPolygon(0);
  123. var polygonData = dungeonTile.GetPolygonData();
  124. DungeonRoomTemplate.SaveConfig(new List<DoorAreaInfo>(), usedRect.Position, usedRect.Size, polygonData.ToList(), item);
  125. dungeonRoomTemplate.QueueFree();
  126. }
  127. }
  128. }
  129.  
  130. var list = new List<DungeonRoomSplit>();
  131. //整合操作
  132. foreach (var item in mapList)
  133. {
  134. var configPath = tileDataDir + item + ".json";
  135. var configText = File.ReadAllText(configPath);
  136. var roomInfo = DungeonRoomTemplate.DeserializeDungeonRoomInfo(configText);
  137. var split = new DungeonRoomSplit();
  138. split.ScenePath = ToResPath(tileDir + item + ".tscn");
  139. split.ConfigPath = ToResPath(configPath);
  140. split.RoomInfo = roomInfo;
  141. list.Add(split);
  142. }
  143.  
  144. //写出配置
  145. var config = new JsonSerializerOptions();
  146. config.WriteIndented = true;
  147. var text = JsonSerializer.Serialize(list, config);
  148. File.WriteAllText(DungeonRoomTemplate.RoomTileConfigFile, text);
  149.  
  150. GD.Print("地牢房间配置, 重新打包完成!");
  151. }
  152. private void EachDir(DirectoryInfo directoryInfos)
  153. {
  154. var fileInfos = directoryInfos.GetFiles();
  155. for (var i = 0; i < fileInfos.Length; i++)
  156. {
  157. HandleFile(fileInfos[i]);
  158. }
  159.  
  160. var directories = directoryInfos.GetDirectories();
  161. for (var i = 0; i < directories.Length; i++)
  162. {
  163. EachDir(directories[i]);
  164. }
  165. }
  166.  
  167. private void HandleFile(FileInfo fileInfo)
  168. {
  169. if (suffix.Contains(fileInfo.Extension))
  170. {
  171. var field = fileInfo.FullName.Substring(currDir.Length + 1);
  172. field = field.Replace("\\", "/");
  173. var resPath = "res://" + field;
  174. field = field.Replace(".", "_");
  175. field = field.Replace("/", "_");
  176. field = Regex.Replace(field, "[^\\w_]", "");
  177. resultStr += $" public const string {field} = \"{resPath}\";\n";
  178. }
  179. }
  180.  
  181. private string ToResPath(string path)
  182. {
  183. var field = path.Substring(currDir.Length + 1);
  184. field = field.Replace("\\", "/");
  185. return "res://" + field;
  186. }
  187.  
  188. private string RemoveExtension(string name)
  189. {
  190. var index = name.LastIndexOf(".", StringComparison.Ordinal);
  191. if (index >= 0)
  192. {
  193. return name.Substring(0, index);
  194. }
  195.  
  196. return name;
  197. }
  198. }
  199. #endif