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 = "";
  33. #endif
  34. EventManager.AddEventListener(EventEnum.OnEditorSave, OnRoomSave);
  35. }
  36.  
  37. //房间保存时回调
  38. private static void OnRoomSave(object obj)
  39. {
  40. SaveGroupMap();
  41. }
  42.  
  43. /// <summary>
  44. /// 刷新组数据
  45. /// </summary>
  46. public static void RefreshMapGroup()
  47. {
  48. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  49. if (File.Exists(configFile))
  50. {
  51. var configText = File.ReadAllText(configFile);
  52. GroupMap = JsonSerializer.Deserialize<Dictionary<string, DungeonRoomGroup>>(configText);
  53. foreach (var item in GroupMap)
  54. {
  55. var config = item.Value;
  56. foreach (var roomSplit in config.BattleList)
  57. {
  58. _ = roomSplit.RoomInfo;
  59. }
  60.  
  61. foreach (var roomSplit in config.BossList)
  62. {
  63. _ = roomSplit.RoomInfo;
  64. }
  65.  
  66. foreach (var roomSplit in config.InletList)
  67. {
  68. _ = roomSplit.RoomInfo;
  69. }
  70.  
  71. foreach (var roomSplit in config.OutletList)
  72. {
  73. _ = roomSplit.RoomInfo;
  74. }
  75.  
  76. foreach (var roomSplit in config.EventList)
  77. {
  78. _ = roomSplit.RoomInfo;
  79. }
  80.  
  81. foreach (var roomSplit in config.RewardList)
  82. {
  83. _ = roomSplit.RoomInfo;
  84. }
  85.  
  86. foreach (var roomSplit in config.ShopList)
  87. {
  88. _ = roomSplit.RoomInfo;
  89. }
  90. }
  91. }
  92. else
  93. {
  94. GD.Print("刷新地图组时未找到配置文件: " + configFile + ", 执行创建文件");
  95. GroupMap = new Dictionary<string, DungeonRoomGroup>();
  96. File.WriteAllText(configFile, "{}");
  97. }
  98. }
  99. /// <summary>
  100. /// 获取地牢房间配置文件加载路径
  101. /// </summary>
  102. /// <param name="groupName">组名</param>
  103. /// <param name="roomType">房间类型</param>
  104. /// <param name="roomName">房间名称</param>
  105. public static string GetConfigPath(string groupName, DungeonRoomType roomType, string roomName)
  106. {
  107. return CustomMapPath + groupName + "/" + DungeonManager.DungeonRoomTypeToString(roomType) + "/" + roomName;
  108. }
  109.  
  110. /// <summary>
  111. /// 获取房间地块配置文件名称
  112. /// </summary>
  113. public static string GetTileInfoConfigName(string roomName)
  114. {
  115. return roomName + "_tileInfo.json";
  116. }
  117. /// <summary>
  118. /// 获取房间基础配置文件名称
  119. /// </summary>
  120. public static string GetRoomInfoConfigName(string roomName)
  121. {
  122. return roomName + "_roomInfo.json";
  123. }
  124.  
  125. /// <summary>
  126. /// 获取房间预设数据配置文件名称
  127. /// </summary>
  128. public static string GetRoomPreinstallConfigName(string roomName)
  129. {
  130. return roomName + "_preinstall.json";
  131. }
  132.  
  133. /// <summary>
  134. /// 创建地牢组
  135. /// </summary>
  136. public static void CreateGroup(DungeonRoomGroup group)
  137. {
  138. if (GroupMap.ContainsKey(group.GroupName))
  139. {
  140. GD.PrintErr($"已经存在相同的地牢组: {group.GroupName}");
  141. return;
  142. }
  143. GroupMap.Add(group.GroupName, group);
  144. //将组数据保存为json
  145. SaveGroupMap();
  146. //创建完成事件
  147. EventManager.EmitEvent(EventEnum.OnCreateGroupFinish, group);
  148. }
  149.  
  150. /// <summary>
  151. /// 创建地牢房间
  152. /// </summary>
  153. public static void CreateRoom(DungeonRoomSplit roomSplit)
  154. {
  155. var groupName = roomSplit.RoomInfo.GroupName;
  156. if (GroupMap.TryGetValue(groupName, out var group))
  157. {
  158. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  159. var roomList = group.GetRoomList(roomSplit.RoomInfo.RoomType);
  160. roomList.Add(roomSplit);
  161.  
  162. var configPath = GetConfigPath(roomSplit.RoomInfo.GroupName, roomSplit.RoomInfo.RoomType, roomSplit.RoomInfo.RoomName);
  163. if (!Directory.Exists(configPath))
  164. {
  165. Directory.CreateDirectory(configPath);
  166. }
  167.  
  168. //将组数据保存为json
  169. var options = new JsonSerializerOptions();
  170. options.WriteIndented = true;
  171. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  172. File.WriteAllText(configFile, jsonText);
  173. //将房间数据保存为json
  174. var jsonText2 = JsonSerializer.Serialize(roomSplit.RoomInfo);
  175. File.WriteAllText(roomSplit.RoomPath, jsonText2);
  176. //将房间地块保存为json
  177. var jsonText3 = JsonSerializer.Serialize(roomSplit.TileInfo);
  178. File.WriteAllText(roomSplit.TilePath, jsonText3);
  179. //将预设保存为json
  180. var jsonText4 = JsonSerializer.Serialize(roomSplit.Preinstall);
  181. File.WriteAllText(roomSplit.PreinstallPath, jsonText4);
  182. //创建完成事件
  183. EventManager.EmitEvent(EventEnum.OnCreateRoomFinish, roomSplit);
  184. }
  185. else
  186. {
  187. GD.PrintErr($"未找到地牢组: {groupName}");
  188. }
  189. }
  190.  
  191. /// <summary>
  192. /// 保存所有组数据
  193. /// </summary>
  194. public static void SaveGroupMap()
  195. {
  196. var configFile = CustomMapPath + GameConfig.RoomGroupConfigFile;
  197. var options = new JsonSerializerOptions();
  198. options.WriteIndented = true;
  199. var jsonText = JsonSerializer.Serialize(GroupMap, options);
  200. File.WriteAllText(configFile, jsonText);
  201. //更新GameApplication中的房间数据
  202. var dic = new Dictionary<string, DungeonRoomGroup>();
  203. foreach (var dungeonRoomGroup in GroupMap)
  204. {
  205. dic.Add(dungeonRoomGroup.Key, dungeonRoomGroup.Value.Clone());
  206. }
  207. GameApplication.Instance.SetRoomConfig(dic);
  208. }
  209. }