Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / DungeonRoomGroup.cs
@小李xl 小李xl on 7 Apr 2023 3 KB 房间添加权重功能
  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
  11. {
  12. /// <summary>
  13. /// 组名称
  14. /// </summary>
  15. [JsonInclude]
  16. public string GroupName;
  17. /// <summary>
  18. /// 普通战斗房间, 进入该房间时会关上门, 并刷出若干波敌人, 消灭所有敌人后开门
  19. /// </summary>
  20. [JsonInclude]
  21. public List<DungeonRoomSplit> BattleList = new List<DungeonRoomSplit>();
  22.  
  23. /// <summary>
  24. /// 起始房间, 由上一层地牢的结束房间进入该房间, 每层包含一个起始房间
  25. /// </summary>
  26. [JsonInclude]
  27. public List<DungeonRoomSplit> InletList = new List<DungeonRoomSplit>();
  28.  
  29. /// <summary>
  30. /// 结束房间, 进入另一层地牢, 每层只是包含一个结束房间
  31. /// </summary>
  32. [JsonInclude]
  33. public List<DungeonRoomSplit> OutletList = new List<DungeonRoomSplit>();
  34.  
  35. /// <summary>
  36. /// boss战房间, 进入房间时会关上没, 刷出boss, 消灭boss后开门
  37. /// </summary>
  38. [JsonInclude]
  39. public List<DungeonRoomSplit> BossList = new List<DungeonRoomSplit>();
  40.  
  41. /// <summary>
  42. /// 奖励房间, 给予玩家武器或者道具奖励的房间
  43. /// </summary>
  44. [JsonInclude]
  45. public List<DungeonRoomSplit> RewardList = new List<DungeonRoomSplit>();
  46.  
  47. /// <summary>
  48. /// 商店, 玩家买卖道具装备的房间
  49. /// </summary>
  50. [JsonInclude]
  51. public List<DungeonRoomSplit> ShopList = new List<DungeonRoomSplit>();
  52.  
  53. /// <summary>
  54. /// 事件房间, 触发剧情或者解锁NPC的房间
  55. /// </summary>
  56. [JsonInclude]
  57. public List<DungeonRoomSplit> EventList = new List<DungeonRoomSplit>();
  58.  
  59. private bool _init = false;
  60. private Dictionary<DungeonRoomType, WeightRandom> _weightRandomMap;
  61.  
  62. /// <summary>
  63. /// 获取指定类型房间集合
  64. /// </summary>
  65. public List<DungeonRoomSplit> GetRoomList(DungeonRoomType roomType)
  66. {
  67. switch (roomType)
  68. {
  69. case DungeonRoomType.Battle: return BattleList;
  70. case DungeonRoomType.Inlet: return InletList;
  71. case DungeonRoomType.Outlet: return OutletList;
  72. case DungeonRoomType.Boss: return BossList;
  73. case DungeonRoomType.Reward: return RewardList;
  74. case DungeonRoomType.Shop: return ShopList;
  75. case DungeonRoomType.Event: return EventList;
  76. }
  77.  
  78. return null;
  79. }
  80.  
  81. /// <summary>
  82. /// 初始化权重处理
  83. /// </summary>
  84. public void InitWeight()
  85. {
  86. if (_init)
  87. {
  88. return;
  89. }
  90.  
  91. _init = true;
  92. _weightRandomMap = new Dictionary<DungeonRoomType, WeightRandom>();
  93. foreach (var roomType in Enum.GetValues<DungeonRoomType>())
  94. {
  95. InitAdRewardWeight(roomType);
  96. }
  97. }
  98.  
  99. private void InitAdRewardWeight(DungeonRoomType roomType)
  100. {
  101. var dungeonRoomSplits = GetRoomList(roomType);
  102. var weightRandom = new WeightRandom();
  103. _weightRandomMap.Add(roomType, weightRandom);
  104.  
  105. var list = new List<int>();
  106. foreach (var roomSplit in dungeonRoomSplits)
  107. {
  108. list.Add(roomSplit.RoomInfo.Weight);
  109. }
  110. weightRandom.InitAdRewardWeight(list.ToArray());
  111. }
  112.  
  113. /// <summary>
  114. /// 根据房间类型和权重获取随机房间
  115. /// </summary>
  116. public DungeonRoomSplit GetRandomRoom(DungeonRoomType roomType)
  117. {
  118. if (!_init)
  119. {
  120. GD.PrintErr("未调用DungeonRoomGroup.InitWeight()来初始化权重!");
  121. return null;
  122. }
  123.  
  124. if (_weightRandomMap.TryGetValue(roomType, out var weightRandom))
  125. {
  126. return GetRoomList(roomType)[weightRandom.GetRandomIndex()];
  127. }
  128.  
  129. return null;
  130. }
  131. }