Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / MapProjectManager.cs
@小李xl 小李xl on 11 Oct 2023 8 KB 日志系统
  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.OnEditorSave, 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. //将组数据保存为json
  147. var options = new JsonSerializerOptions();
  148. options.WriteIndented = true;
  149. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  150. File.WriteAllText(configFile, jsonText);
  151. //将房间数据保存为json
  152. SaveRoomInfo(roomSplit);
  153. //将房间地块保存为json
  154. SaveRoomTileInfo(roomSplit);
  155. //将预设保存为json
  156. SaveRoomPreinstall(roomSplit);
  157. //创建完成事件
  158. EventManager.EmitEvent(EventEnum.OnCreateRoomFinish, roomSplit);
  159. }
  160. else
  161. {
  162. Debug.LogError($"未找到地牢组: {groupName}");
  163. }
  164. }
  165.  
  166. /// <summary>
  167. /// 保存所有组数据
  168. /// </summary>
  169. public static void SaveGroupMap()
  170. {
  171. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  172. var options = new JsonSerializerOptions();
  173. options.WriteIndented = true;
  174. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  175. File.WriteAllText(configFile, jsonText);
  176. //更新GameApplication中的房间数据
  177. var dic = new Dictionary<string, DungeonRoomGroup>();
  178. foreach (var dungeonRoomGroup in GroupMap)
  179. {
  180. dic.Add(dungeonRoomGroup.Key, dungeonRoomGroup.Value.Clone());
  181. }
  182. GameApplication.Instance.SetRoomConfig(dic);
  183. }
  184.  
  185. /// <summary>
  186. /// 保存房间数据
  187. /// </summary>
  188. public static void SaveRoomInfo(DungeonRoomSplit roomSplit)
  189. {
  190. var roomInfo = roomSplit.RoomInfo;
  191. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  192. if (!Directory.Exists(path))
  193. {
  194. Directory.CreateDirectory(path);
  195. }
  196. var jsonText = JsonSerializer.Serialize(roomInfo);
  197. File.WriteAllText(roomSplit.RoomPath, jsonText);
  198. }
  199. /// <summary>
  200. /// 保存房间地块数据
  201. /// </summary>
  202. public static void SaveRoomTileInfo(DungeonRoomSplit roomSplit)
  203. {
  204. var roomInfo = roomSplit.RoomInfo;
  205. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  206. if (!Directory.Exists(path))
  207. {
  208. Directory.CreateDirectory(path);
  209. }
  210. var jsonText = JsonSerializer.Serialize(roomSplit.TileInfo);
  211. File.WriteAllText(roomSplit.TilePath, jsonText);
  212. }
  213. /// <summary>
  214. /// 保存房间预设数据
  215. /// </summary>
  216. public static void SaveRoomPreinstall(DungeonRoomSplit roomSplit)
  217. {
  218. var roomInfo = roomSplit.RoomInfo;
  219. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  220. if (!Directory.Exists(path))
  221. {
  222. Directory.CreateDirectory(path);
  223. }
  224. var jsonText = JsonSerializer.Serialize(roomSplit.Preinstall);
  225. File.WriteAllText(roomSplit.PreinstallPath, jsonText);
  226. }
  227.  
  228. /// <summary>
  229. /// 保存预览图
  230. /// </summary>
  231. public static void SaveRoomPreviewImage(DungeonRoomSplit roomSplit, Image image)
  232. {
  233. var roomInfo = roomSplit.RoomInfo;
  234. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  235. if (!Directory.Exists(path))
  236. {
  237. Directory.CreateDirectory(path);
  238. }
  239.  
  240. image.SavePng(roomSplit.PreviewPath);
  241. }
  242.  
  243. /// <summary>
  244. /// 从指定组中删除房间, 返回是否删除成功
  245. /// </summary>
  246. public static bool DeleteRoom(DungeonRoomGroup group, DungeonRoomSplit roomSplit)
  247. {
  248. if (group.RemoveRoom(roomSplit))
  249. {
  250. var path = GetConfigPath(group.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  251. if (Directory.Exists(path))
  252. {
  253. Directory.Delete(path, true);
  254. }
  255.  
  256. return true;
  257. }
  258.  
  259. return false;
  260. }
  261. }