Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / MapProjectManager.cs
@小李xl 小李xl on 6 Jan 2024 8 KB 保存TileSet数据,开发中
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text.Json;
  6. using Godot;
  7.  
  8. public static class MapProjectManager
  9. {
  10. /// <summary>
  11. /// 扫描路径
  12. /// </summary>
  13. public static string CustomMapPath { get; private set; }
  14.  
  15. /// <summary>
  16. /// 地牢组数据, key: 组名称
  17. /// </summary>
  18. public static Dictionary<string, DungeonRoomGroup> GroupMap { get; private set; }
  19.  
  20. private static bool _init;
  21. public static void Init()
  22. {
  23. if (_init)
  24. {
  25. return;
  26. }
  27.  
  28. _init = true;
  29. #if TOOLS
  30. CustomMapPath = GameConfig.RoomTileDir;
  31. #else
  32. CustomMapPath = GameConfig.RoomTileDir;
  33. //CustomMapPath = "";
  34. #endif
  35. EventManager.AddEventListener(EventEnum.OnTileMapSave, OnRoomSave);
  36. }
  37.  
  38. //房间保存时回调
  39. private static void OnRoomSave(object obj)
  40. {
  41. SaveGroupMap();
  42. }
  43.  
  44. /// <summary>
  45. /// 刷新组数据
  46. /// </summary>
  47. public static void RefreshMapGroup()
  48. {
  49. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  50. if (File.Exists(configFile))
  51. {
  52. var configText = File.ReadAllText(configFile);
  53. GroupMap = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(configText);
  54. foreach (var item in GroupMap)
  55. {
  56. var config = item.Value;
  57. foreach (var roomSplit in config.BattleList)
  58. {
  59. _ = roomSplit.RoomInfo;
  60. }
  61.  
  62. foreach (var roomSplit in config.BossList)
  63. {
  64. _ = roomSplit.RoomInfo;
  65. }
  66.  
  67. foreach (var roomSplit in config.InletList)
  68. {
  69. _ = roomSplit.RoomInfo;
  70. }
  71.  
  72. foreach (var roomSplit in config.OutletList)
  73. {
  74. _ = roomSplit.RoomInfo;
  75. }
  76.  
  77. foreach (var roomSplit in config.EventList)
  78. {
  79. _ = roomSplit.RoomInfo;
  80. }
  81.  
  82. foreach (var roomSplit in config.RewardList)
  83. {
  84. _ = roomSplit.RoomInfo;
  85. }
  86.  
  87. foreach (var roomSplit in config.ShopList)
  88. {
  89. _ = roomSplit.RoomInfo;
  90. }
  91. }
  92. }
  93. else
  94. {
  95. Debug.Log("刷新地图组时未找到配置文件: " + configFile + ", 执行创建文件");
  96. GroupMap = new Dictionary<string, DungeonRoomGroup>();
  97. File.WriteAllText(configFile, "{}");
  98. }
  99. }
  100. /// <summary>
  101. /// 获取地牢房间配置文件加载路径
  102. /// </summary>
  103. /// <param name="groupName">组名</param>
  104. /// <param name="roomType">房间类型</param>
  105. /// <param name="roomName">房间名称</param>
  106. public static string GetConfigPath(string groupName, DungeonRoomType roomType, string roomName)
  107. {
  108. return CustomMapPath + groupName + "/" + DungeonManager.DungeonRoomTypeToString(roomType) + "/" + roomName;
  109. }
  110.  
  111. /// <summary>
  112. /// 创建地牢组
  113. /// </summary>
  114. public static void CreateGroup(DungeonRoomGroup group)
  115. {
  116. if (GroupMap.ContainsKey(group.GroupName))
  117. {
  118. Debug.LogError($"已经存在相同的地牢组: {group.GroupName}");
  119. return;
  120. }
  121. GroupMap.Add(group.GroupName, group);
  122. //将组数据保存为json
  123. SaveGroupMap();
  124. //创建完成事件
  125. EventManager.EmitEvent(EventEnum.OnCreateGroupFinish, group);
  126. }
  127.  
  128. /// <summary>
  129. /// 创建地牢房间
  130. /// </summary>
  131. public static void CreateRoom(DungeonRoomSplit roomSplit)
  132. {
  133. var groupName = roomSplit.RoomInfo.GroupName;
  134. if (GroupMap.TryGetValue(groupName, out var group))
  135. {
  136. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  137. var roomList = group.GetRoomList(roomSplit.RoomInfo.RoomType);
  138. roomList.Add(roomSplit);
  139.  
  140. var configPath = GetConfigPath(roomSplit.RoomInfo.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  141. if (!Directory.Exists(configPath))
  142. {
  143. Directory.CreateDirectory(configPath);
  144. }
  145. //给房间添加默认预设
  146. var preinstallInfo = new RoomPreinstallInfo();
  147. preinstallInfo.Name = "Preinstall1";
  148. preinstallInfo.Weight = 100;
  149. preinstallInfo.Remark = "";
  150. preinstallInfo.InitWaveList();
  151. preinstallInfo.InitSpecialMark(roomSplit.RoomInfo.RoomType);
  152. roomSplit.Preinstall.Add(preinstallInfo);
  153.  
  154. //将组数据保存为json
  155. var options = new JsonSerializerOptions();
  156. options.WriteIndented = true;
  157. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  158. File.WriteAllText(configFile, jsonText);
  159. //将房间数据保存为json
  160. SaveRoomInfo(roomSplit);
  161. //将房间地块保存为json
  162. SaveRoomTileInfo(roomSplit);
  163. //将预设保存为json
  164. SaveRoomPreinstall(roomSplit);
  165. //创建完成事件
  166. EventManager.EmitEvent(EventEnum.OnCreateRoomFinish, roomSplit);
  167. }
  168. else
  169. {
  170. Debug.LogError($"未找到地牢组: {groupName}");
  171. }
  172. }
  173.  
  174. /// <summary>
  175. /// 保存所有组数据
  176. /// </summary>
  177. public static void SaveGroupMap()
  178. {
  179. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  180. var options = new JsonSerializerOptions();
  181. options.WriteIndented = true;
  182. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  183. File.WriteAllText(configFile, jsonText);
  184. //更新GameApplication中的房间数据
  185. var dic = new Dictionary<string, DungeonRoomGroup>();
  186. foreach (var dungeonRoomGroup in GroupMap)
  187. {
  188. dic.Add(dungeonRoomGroup.Key, dungeonRoomGroup.Value.Clone());
  189. }
  190. GameApplication.Instance.SetRoomConfig(dic);
  191. }
  192.  
  193. /// <summary>
  194. /// 保存房间数据
  195. /// </summary>
  196. public static void SaveRoomInfo(DungeonRoomSplit roomSplit)
  197. {
  198. var roomInfo = roomSplit.RoomInfo;
  199. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  200. if (!Directory.Exists(path))
  201. {
  202. Directory.CreateDirectory(path);
  203. }
  204. var jsonText = JsonSerializer.Serialize(roomInfo);
  205. File.WriteAllText(roomSplit.RoomPath, jsonText);
  206. }
  207. /// <summary>
  208. /// 保存房间地块数据
  209. /// </summary>
  210. public static void SaveRoomTileInfo(DungeonRoomSplit roomSplit)
  211. {
  212. var roomInfo = roomSplit.RoomInfo;
  213. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  214. if (!Directory.Exists(path))
  215. {
  216. Directory.CreateDirectory(path);
  217. }
  218. var jsonText = JsonSerializer.Serialize(roomSplit.TileInfo);
  219. File.WriteAllText(roomSplit.TilePath, jsonText);
  220. }
  221. /// <summary>
  222. /// 保存房间预设数据
  223. /// </summary>
  224. public static void SaveRoomPreinstall(DungeonRoomSplit roomSplit)
  225. {
  226. var roomInfo = roomSplit.RoomInfo;
  227. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  228. if (!Directory.Exists(path))
  229. {
  230. Directory.CreateDirectory(path);
  231. }
  232. var jsonText = JsonSerializer.Serialize(roomSplit.Preinstall);
  233. File.WriteAllText(roomSplit.PreinstallPath, jsonText);
  234. }
  235.  
  236. /// <summary>
  237. /// 保存预览图
  238. /// </summary>
  239. public static void SaveRoomPreviewImage(DungeonRoomSplit roomSplit, Image image)
  240. {
  241. var roomInfo = roomSplit.RoomInfo;
  242. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  243. if (!Directory.Exists(path))
  244. {
  245. Directory.CreateDirectory(path);
  246. }
  247.  
  248. image.SavePng(roomSplit.PreviewPath);
  249. }
  250.  
  251. /// <summary>
  252. /// 从指定组中删除房间, 返回是否删除成功
  253. /// </summary>
  254. public static bool DeleteRoom(DungeonRoomGroup group, DungeonRoomSplit roomSplit)
  255. {
  256. if (group.RemoveRoom(roomSplit))
  257. {
  258. var path = GetConfigPath(group.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  259. if (Directory.Exists(path))
  260. {
  261. Directory.Delete(path, true);
  262. }
  263.  
  264. return true;
  265. }
  266.  
  267. return false;
  268. }
  269. }