Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / room / DungeonRoomGroup.cs
  1.  
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text.Json.Serialization;
  5. using Godot;
  6.  
  7. /// <summary>
  8. /// 房间组数据
  9. /// </summary>
  10. public class DungeonRoomGroup : IClone<DungeonRoomGroup>
  11. {
  12. /// <summary>
  13. /// 组名称
  14. /// </summary>
  15. [JsonInclude]
  16. public string GroupName;
  17.  
  18. /// <summary>
  19. /// 图块集
  20. /// </summary>
  21. [JsonInclude]
  22. public string TileSet;
  23. /// <summary>
  24. /// 普通战斗房间, 进入该房间时会关上门, 并刷出若干波敌人, 消灭所有敌人后开门
  25. /// </summary>
  26. [JsonInclude]
  27. public List<DungeonRoomSplit> BattleList = new List<DungeonRoomSplit>();
  28.  
  29. /// <summary>
  30. /// 起始房间, 由上一层地牢的结束房间进入该房间, 每层包含一个起始房间
  31. /// </summary>
  32. [JsonInclude]
  33. public List<DungeonRoomSplit> InletList = new List<DungeonRoomSplit>();
  34.  
  35. /// <summary>
  36. /// 结束房间, 进入另一层地牢, 每层只是包含一个结束房间
  37. /// </summary>
  38. [JsonInclude]
  39. public List<DungeonRoomSplit> OutletList = new List<DungeonRoomSplit>();
  40.  
  41. /// <summary>
  42. /// boss战房间, 进入房间时会关上没, 刷出boss, 消灭boss后开门
  43. /// </summary>
  44. [JsonInclude]
  45. public List<DungeonRoomSplit> BossList = new List<DungeonRoomSplit>();
  46.  
  47. /// <summary>
  48. /// 奖励房间, 给予玩家武器或者道具奖励的房间
  49. /// </summary>
  50. [JsonInclude]
  51. public List<DungeonRoomSplit> RewardList = new List<DungeonRoomSplit>();
  52.  
  53. /// <summary>
  54. /// 商店, 玩家买卖道具装备的房间
  55. /// </summary>
  56. [JsonInclude]
  57. public List<DungeonRoomSplit> ShopList = new List<DungeonRoomSplit>();
  58.  
  59. /// <summary>
  60. /// 事件房间, 触发剧情或者解锁NPC的房间
  61. /// </summary>
  62. [JsonInclude]
  63. public List<DungeonRoomSplit> EventList = new List<DungeonRoomSplit>();
  64.  
  65. /// <summary>
  66. /// 组包住
  67. /// </summary>
  68. [JsonInclude]
  69. public string Remark;
  70. private bool _init = false;
  71. private Dictionary<DungeonRoomType, WeightRandom> _weightRandomMap;
  72. private List<DungeonRoomSplit> _readyBattleList;
  73. /// <summary>
  74. /// 获取所有房间数据
  75. /// </summary>
  76. public List<DungeonRoomSplit> GetAllRoomList()
  77. {
  78. var list = new List<DungeonRoomSplit>();
  79. list.AddRange(BattleList);
  80. list.AddRange(InletList);
  81. list.AddRange(OutletList);
  82. list.AddRange(BossList);
  83. list.AddRange(ShopList);
  84. list.AddRange(RewardList);
  85. list.AddRange(EventList);
  86. return list;
  87. }
  88.  
  89. /// <summary>
  90. /// 获取指定类型房间集合
  91. /// </summary>
  92. public List<DungeonRoomSplit> GetRoomList(DungeonRoomType roomType)
  93. {
  94. switch (roomType)
  95. {
  96. case DungeonRoomType.Battle: return BattleList;
  97. case DungeonRoomType.Inlet: return InletList;
  98. case DungeonRoomType.Outlet: return OutletList;
  99. case DungeonRoomType.Boss: return BossList;
  100. case DungeonRoomType.Reward: return RewardList;
  101. case DungeonRoomType.Shop: return ShopList;
  102. case DungeonRoomType.Event: return EventList;
  103. }
  104.  
  105. return null;
  106. }
  107.  
  108. /// <summary>
  109. /// 移除一个房间, 返回是否移除成功
  110. /// </summary>
  111. public bool RemoveRoom(DungeonRoomSplit roomSplit)
  112. {
  113. if (BattleList.Remove(roomSplit))
  114. {
  115. return true;
  116. }
  117. if (InletList.Remove(roomSplit))
  118. {
  119. return true;
  120. }
  121. if (OutletList.Remove(roomSplit))
  122. {
  123. return true;
  124. }
  125. if (BossList.Remove(roomSplit))
  126. {
  127. return true;
  128. }
  129. if (RewardList.Remove(roomSplit))
  130. {
  131. return true;
  132. }
  133. if (ShopList.Remove(roomSplit))
  134. {
  135. return true;
  136. }
  137. if (EventList.Remove(roomSplit))
  138. {
  139. return true;
  140. }
  141. return false;
  142. }
  143.  
  144. /// <summary>
  145. /// 初始化权重处理
  146. /// </summary>
  147. public void InitWeight(SeedRandom random)
  148. {
  149. if (_init)
  150. {
  151. return;
  152. }
  153.  
  154. _init = true;
  155. _weightRandomMap = new Dictionary<DungeonRoomType, WeightRandom>();
  156. foreach (var roomType in Enum.GetValues<DungeonRoomType>())
  157. {
  158. if (roomType == DungeonRoomType.None) continue;
  159. InitAdRewardWeight(roomType, random);
  160. }
  161. }
  162.  
  163. private void InitAdRewardWeight(DungeonRoomType roomType, SeedRandom random)
  164. {
  165. var dungeonRoomSplits = GetRoomList(roomType);
  166. var weightRandom = new WeightRandom(random);
  167. _weightRandomMap.Add(roomType, weightRandom);
  168.  
  169. var list = new List<int>();
  170. foreach (var roomSplit in dungeonRoomSplits)
  171. {
  172. list.Add(roomSplit.RoomInfo.Weight);
  173. }
  174. weightRandom.InitAdRewardWeight(list.ToArray());
  175. }
  176.  
  177. /// <summary>
  178. /// 根据房间类型和权重获取随机房间
  179. /// </summary>
  180. public DungeonRoomSplit GetRandomRoom(DungeonRoomType roomType)
  181. {
  182. if (!_init)
  183. {
  184. Debug.LogError("未调用DungeonRoomGroup.InitWeight()来初始化权重!");
  185. return null;
  186. }
  187.  
  188. if (_weightRandomMap.TryGetValue(roomType, out var weightRandom))
  189. {
  190. return GetRoomList(roomType)[weightRandom.GetRandomIndex()];
  191. }
  192.  
  193. return null;
  194. }
  195. public DungeonRoomGroup Clone()
  196. {
  197. var inst = new DungeonRoomGroup();
  198. inst.GroupName = GroupName;
  199. inst.TileSet = TileSet;
  200. inst.BattleList.AddRange(BattleList);
  201. inst.InletList.AddRange(InletList);
  202. inst.OutletList.AddRange(OutletList);
  203. inst.BossList.AddRange(BossList);
  204. inst.ShopList.AddRange(ShopList);
  205. inst.RewardList.AddRange(RewardList);
  206. inst.EventList.AddRange(EventList);
  207. return inst;
  208. }
  209. }