Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / RandomPool.cs
  1.  
  2. using System.Collections.Generic;
  3. using Config;
  4. using Godot;
  5.  
  6. public class RandomPool
  7. {
  8. /// <summary>
  9. /// 随机数生成器
  10. /// </summary>
  11. public SeedRandom Random { get; }
  12. /// <summary>
  13. /// 所属世界
  14. /// </summary>
  15. public World World { get; }
  16. public RandomPool(World world)
  17. {
  18. World = world;
  19. Random = world.Random;
  20. }
  21.  
  22. /// <summary>
  23. /// 获取随机武器
  24. /// </summary>
  25. public ExcelConfig.ActivityBase GetRandomWeapon()
  26. {
  27. return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Weapon));
  28. }
  29.  
  30. /// <summary>
  31. /// 获取随机敌人
  32. /// </summary>
  33. public ExcelConfig.ActivityBase GetRandomEnemy()
  34. {
  35. return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Enemy));
  36. }
  37.  
  38. /// <summary>
  39. /// 获取随机道具
  40. /// </summary>
  41. public ExcelConfig.ActivityBase GetRandomProp()
  42. {
  43. return Random.RandomChoose(PreinstallMarkManager.GetMarkConfigsByType(ActivityType.Prop));
  44. }
  45.  
  46. /// <summary>
  47. /// 填充自动波次数据
  48. /// </summary>
  49. public void FillAutoWave(RoomPreinstall preinstall)
  50. {
  51. if (preinstall.RoomInfo.RoomType == DungeonRoomType.Battle)
  52. {
  53. FillBattleRoom(preinstall);
  54. }
  55. else if (preinstall.RoomInfo.RoomType == DungeonRoomType.Reward)
  56. {
  57. FillRewardRoom(preinstall);
  58. }
  59. }
  60.  
  61. //填充战斗房间
  62. private void FillBattleRoom(RoomPreinstall preinstall)
  63. {
  64. var count = World.Random.RandomRangeInt(3, 10);
  65. var tileInfo = preinstall.RoomInfo.RoomSplit.TileInfo;
  66. var serializeVector2s = tileInfo.NavigationVertices;
  67. var vertices = new List<Vector2>();
  68. foreach (var sv2 in serializeVector2s)
  69. {
  70. vertices.Add(sv2.AsVector2());
  71. }
  72. var positionArray = World.Random.GetRandomPositionInPolygon(vertices, tileInfo.NavigationPolygon, count);
  73. var arr = new ActivityType[] { ActivityType.Enemy, ActivityType.Weapon, ActivityType.Prop };
  74. var weight = new int[] { 15, 2, 1 };
  75. for (var i = 0; i < count; i++)
  76. {
  77. var tempWave = GetOrCreateWave(preinstall, World.Random.RandomRangeInt(0, 2));
  78. var index = World.Random.RandomWeight(weight);
  79. var activityType = arr[index];
  80. //创建标记
  81. var mark = CreateMark(activityType, i * 0.3f, preinstall.RoomInfo.ToGlobalPosition(positionArray[i]));
  82. if (activityType == ActivityType.Enemy) //敌人
  83. {
  84. mark.Id = GetRandomEnemy().Id;
  85. mark.Attr.Add("Face", "0");
  86. mark.DerivedAttr = new Dictionary<string, string>();
  87. mark.DerivedAttr.Add("Face", World.Random.RandomChoose((int)FaceDirection.Left, (int)FaceDirection.Right).ToString()); //链朝向
  88. if (World.Random.RandomBoolean(0.8f)) //手持武器
  89. {
  90. var weapon = GetRandomWeapon();
  91. var weaponAttribute = Weapon.GetWeaponAttribute(weapon.Id);
  92. mark.Attr.Add("Weapon", weapon.Id); //武器id
  93. mark.Attr.Add("CurrAmmon", weaponAttribute.AmmoCapacity.ToString()); //弹夹弹药量
  94. mark.Attr.Add("ResidueAmmo", weaponAttribute.AmmoCapacity.ToString()); //剩余弹药量
  95. }
  96. }
  97. else if (activityType == ActivityType.Weapon) //武器
  98. {
  99. mark.Id = GetRandomWeapon().Id;
  100. }
  101. else if (activityType == ActivityType.Prop) //道具
  102. {
  103. mark.Id = GetRandomProp().Id;
  104. }
  105. tempWave.Add(mark);
  106. }
  107. }
  108.  
  109. //填充奖励房间
  110. private void FillRewardRoom(RoomPreinstall preinstall)
  111. {
  112. var wave = GetOrCreateWave(preinstall, 0);
  113. var mark = CreateMark(ActivityType.Treasure, 0, (preinstall.RoomInfo.Waypoints + new Vector2(0.5f, 0.5f)) * GameConfig.TileCellSize);
  114. mark.Id = "treasure_box0001";
  115. wave.Add(mark);
  116. }
  117. private List<ActivityMark> GetOrCreateWave(RoomPreinstall preinstall,int waveIndex)
  118. {
  119. while (preinstall.WaveList.Count <= waveIndex)
  120. {
  121. preinstall.WaveList.Add(new List<ActivityMark>());
  122. }
  123. return preinstall.WaveList[waveIndex];
  124. }
  125.  
  126. //创建标记
  127. private ActivityMark CreateMark(ActivityType activityType, float delayTime, Vector2 pos)
  128. {
  129. var mark = new ActivityMark();
  130. mark.Attr = new Dictionary<string, string>();
  131. mark.ActivityType = activityType;
  132. mark.MarkType = SpecialMarkType.Normal;
  133. mark.VerticalSpeed = 0;
  134. mark.Altitude = activityType == ActivityType.Enemy ? 0 : 8;
  135. mark.DelayTime = delayTime;
  136. mark.Position = pos;
  137. return mark;
  138. }
  139. }