Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / MapProjectManager.cs
@小李xl 小李xl on 24 Jan 2024 9 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.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.AutoFill = true;
  178. preinstallInfo.InitWaveList();
  179. preinstallInfo.InitSpecialMark(roomSplit.RoomInfo.RoomType);
  180. roomSplit.Preinstall.Add(preinstallInfo);
  181.  
  182. //将组数据保存为json
  183. var options = new JsonSerializerOptions();
  184. options.WriteIndented = true;
  185. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  186. File.WriteAllText(configFile, jsonText);
  187. //将房间数据保存为json
  188. SaveRoomInfo(roomSplit);
  189. //将房间地块保存为json
  190. SaveRoomTileInfo(roomSplit);
  191. //将预设保存为json
  192. SaveRoomPreinstall(roomSplit);
  193. //创建完成事件
  194. EventManager.EmitEvent(EventEnum.OnCreateRoomFinish, roomSplit);
  195. }
  196. else
  197. {
  198. Debug.LogError($"未找到地牢组: {groupName}");
  199. }
  200. }
  201.  
  202. /// <summary>
  203. /// 保存所有组数据
  204. /// </summary>
  205. public static void SaveGroupMap()
  206. {
  207. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  208. var options = new JsonSerializerOptions();
  209. options.WriteIndented = true;
  210. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  211. File.WriteAllText(configFile, jsonText);
  212. //更新GameApplication中的房间数据
  213. var dic = new Dictionary<string, DungeonRoomGroup>();
  214. foreach (var dungeonRoomGroup in GroupMap)
  215. {
  216. dic.Add(dungeonRoomGroup.Key, dungeonRoomGroup.Value.Clone());
  217. }
  218. GameApplication.Instance.SetRoomConfig(dic);
  219. }
  220.  
  221. /// <summary>
  222. /// 保存房间数据
  223. /// </summary>
  224. public static void SaveRoomInfo(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(roomInfo);
  233. File.WriteAllText(roomSplit.RoomPath, jsonText);
  234. }
  235. /// <summary>
  236. /// 保存房间地块数据
  237. /// </summary>
  238. public static void SaveRoomTileInfo(DungeonRoomSplit roomSplit)
  239. {
  240. var roomInfo = roomSplit.RoomInfo;
  241. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  242. if (!Directory.Exists(path))
  243. {
  244. Directory.CreateDirectory(path);
  245. }
  246. var jsonText = JsonSerializer.Serialize(roomSplit.TileInfo);
  247. File.WriteAllText(roomSplit.TilePath, jsonText);
  248. }
  249. /// <summary>
  250. /// 保存房间预设数据
  251. /// </summary>
  252. public static void SaveRoomPreinstall(DungeonRoomSplit roomSplit)
  253. {
  254. var roomInfo = roomSplit.RoomInfo;
  255. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  256. if (!Directory.Exists(path))
  257. {
  258. Directory.CreateDirectory(path);
  259. }
  260. var jsonText = JsonSerializer.Serialize(roomSplit.Preinstall);
  261. File.WriteAllText(roomSplit.PreinstallPath, jsonText);
  262. }
  263.  
  264. /// <summary>
  265. /// 保存预览图
  266. /// </summary>
  267. public static void SaveRoomPreviewImage(DungeonRoomSplit roomSplit, Image image)
  268. {
  269. var roomInfo = roomSplit.RoomInfo;
  270. var path = GetConfigPath(roomInfo.GroupName,roomInfo.RoomType, roomInfo.RoomName);
  271. if (!Directory.Exists(path))
  272. {
  273. Directory.CreateDirectory(path);
  274. }
  275.  
  276. image.SavePng(roomSplit.PreviewPath);
  277. }
  278.  
  279. /// <summary>
  280. /// 从指定组中删除房间, 返回是否删除成功
  281. /// </summary>
  282. public static bool DeleteRoom(DungeonRoomGroup group, DungeonRoomSplit roomSplit)
  283. {
  284. if (group.RemoveRoom(roomSplit))
  285. {
  286. var path = GetConfigPath(group.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  287. if (Directory.Exists(path))
  288. {
  289. Directory.Delete(path, true);
  290. }
  291.  
  292. return true;
  293. }
  294.  
  295. return false;
  296. }
  297. }