Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / MapProjectManager.cs
  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 DeleteGroup(string name)
  132. {
  133. if (GroupMap.Remove(name))
  134. {
  135. try
  136. {
  137. //删除文件
  138. var path = CustomMapPath + name;
  139. if (Directory.Exists(path))
  140. {
  141. Directory.Delete(path, true);
  142. }
  143. }
  144. catch (Exception e)
  145. {
  146. Debug.LogError(e);
  147. }
  148. //将组数据保存为json
  149. SaveGroupMap();
  150. //删除地牢组事件
  151. EventManager.EmitEvent(EventEnum.OnDeleteGroupFinish, name);
  152. }
  153. }
  154.  
  155. /// <summary>
  156. /// 创建地牢房间
  157. /// </summary>
  158. public static void CreateRoom(DungeonRoomSplit roomSplit)
  159. {
  160. var groupName = roomSplit.RoomInfo.GroupName;
  161. if (GroupMap.TryGetValue(groupName, out var group))
  162. {
  163. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  164. var roomList = group.GetRoomList(roomSplit.RoomInfo.RoomType);
  165. roomList.Add(roomSplit);
  166.  
  167. var configPath = GetConfigPath(roomSplit.RoomInfo.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  168. if (!Directory.Exists(configPath))
  169. {
  170. Directory.CreateDirectory(configPath);
  171. }
  172. //给房间添加默认预设
  173. var preinstallInfo = new RoomPreinstallInfo();
  174. preinstallInfo.Name = "Preinstall1";
  175. preinstallInfo.Weight = 100;
  176. preinstallInfo.Remark = "";
  177. preinstallInfo.InitWaveList();
  178. preinstallInfo.InitSpecialMark(roomSplit.RoomInfo.RoomType);
  179. roomSplit.Preinstall.Add(preinstallInfo);
  180.  
  181. //将组数据保存为json
  182. var options = new JsonSerializerOptions();
  183. options.WriteIndented = true;
  184. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  185. File.WriteAllText(configFile, jsonText);
  186. //将房间数据保存为json
  187. SaveRoomInfo(roomSplit);
  188. //将房间地块保存为json
  189. SaveRoomTileInfo(roomSplit);
  190. //将预设保存为json
  191. SaveRoomPreinstall(roomSplit);
  192. //创建完成事件
  193. EventManager.EmitEvent(EventEnum.OnCreateRoomFinish, roomSplit);
  194. }
  195. else
  196. {
  197. Debug.LogError($"未找到地牢组: {groupName}");
  198. }
  199. }
  200.  
  201. /// <summary>
  202. /// 保存所有组数据
  203. /// </summary>
  204. public static void SaveGroupMap()
  205. {
  206. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  207. var options = new JsonSerializerOptions();
  208. options.WriteIndented = true;
  209. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  210. File.WriteAllText(configFile, jsonText);
  211. //更新GameApplication中的房间数据
  212. var dic = new Dictionary<string, DungeonRoomGroup>();
  213. foreach (var dungeonRoomGroup in GroupMap)
  214. {
  215. dic.Add(dungeonRoomGroup.Key, dungeonRoomGroup.Value.Clone());
  216. }
  217. GameApplication.Instance.SetRoomConfig(dic);
  218. }
  219.  
  220. /// <summary>
  221. /// 保存房间数据
  222. /// </summary>
  223. public static void SaveRoomInfo(DungeonRoomSplit roomSplit)
  224. {
  225. var roomInfo = roomSplit.RoomInfo;
  226. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  227. if (!Directory.Exists(path))
  228. {
  229. Directory.CreateDirectory(path);
  230. }
  231. var jsonText = JsonSerializer.Serialize(roomInfo);
  232. File.WriteAllText(roomSplit.RoomPath, jsonText);
  233. }
  234. /// <summary>
  235. /// 保存房间地块数据
  236. /// </summary>
  237. public static void SaveRoomTileInfo(DungeonRoomSplit roomSplit)
  238. {
  239. var roomInfo = roomSplit.RoomInfo;
  240. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  241. if (!Directory.Exists(path))
  242. {
  243. Directory.CreateDirectory(path);
  244. }
  245. var jsonText = JsonSerializer.Serialize(roomSplit.TileInfo);
  246. File.WriteAllText(roomSplit.TilePath, jsonText);
  247. }
  248. /// <summary>
  249. /// 保存房间预设数据
  250. /// </summary>
  251. public static void SaveRoomPreinstall(DungeonRoomSplit roomSplit)
  252. {
  253. var roomInfo = roomSplit.RoomInfo;
  254. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  255. if (!Directory.Exists(path))
  256. {
  257. Directory.CreateDirectory(path);
  258. }
  259. var jsonText = JsonSerializer.Serialize(roomSplit.Preinstall);
  260. File.WriteAllText(roomSplit.PreinstallPath, jsonText);
  261. }
  262.  
  263. /// <summary>
  264. /// 保存预览图
  265. /// </summary>
  266. public static void SaveRoomPreviewImage(DungeonRoomSplit roomSplit, Image image)
  267. {
  268. var roomInfo = roomSplit.RoomInfo;
  269. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  270. if (!Directory.Exists(path))
  271. {
  272. Directory.CreateDirectory(path);
  273. }
  274.  
  275. image.SavePng(roomSplit.PreviewPath);
  276. }
  277.  
  278. /// <summary>
  279. /// 从指定组中删除房间, 返回是否删除成功
  280. /// </summary>
  281. public static bool DeleteRoom(DungeonRoomGroup group, DungeonRoomSplit roomSplit)
  282. {
  283. if (group.RemoveRoom(roomSplit))
  284. {
  285. var path = GetConfigPath(group.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  286. if (Directory.Exists(path))
  287. {
  288. Directory.Delete(path, true);
  289. }
  290.  
  291. return true;
  292. }
  293.  
  294. return false;
  295. }
  296. }