SharedSalvageSystem.Magnet.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Content.Shared.Destructible.Thresholds;
  2. using Content.Shared.Procedural;
  3. using Content.Shared.Procedural.DungeonLayers;
  4. using Content.Shared.Random;
  5. using Content.Shared.Random.Helpers;
  6. using Content.Shared.Salvage.Magnet;
  7. using Robust.Shared.Prototypes;
  8. using Robust.Shared.Random;
  9. using Robust.Shared.Utility;
  10. namespace Content.Shared.Salvage;
  11. public abstract partial class SharedSalvageSystem
  12. {
  13. private readonly List<SalvageMapPrototype> _salvageMaps = new();
  14. private readonly Dictionary<ISalvageMagnetOffering, float> _offeringWeights = new()
  15. {
  16. { new AsteroidOffering(), 4.5f },
  17. { new DebrisOffering(), 3.5f },
  18. { new SalvageOffering(), 2.0f },
  19. };
  20. private readonly List<ProtoId<DungeonConfigPrototype>> _asteroidConfigs = new()
  21. {
  22. "BlobAsteroid",
  23. "ClusterAsteroid",
  24. "SpindlyAsteroid",
  25. "SwissCheeseAsteroid"
  26. };
  27. private readonly ProtoId<WeightedRandomPrototype> _asteroidOreWeights = "AsteroidOre";
  28. private readonly MinMax _asteroidOreCount = new(5, 7);
  29. private readonly List<ProtoId<DungeonConfigPrototype>> _debrisConfigs = new()
  30. {
  31. "ChunkDebris"
  32. };
  33. public ISalvageMagnetOffering GetSalvageOffering(int seed)
  34. {
  35. var rand = new System.Random(seed);
  36. var type = SharedRandomExtensions.Pick(_offeringWeights, rand);
  37. switch (type)
  38. {
  39. case AsteroidOffering:
  40. var configId = _asteroidConfigs[rand.Next(_asteroidConfigs.Count)];
  41. var configProto =_proto.Index(configId);
  42. var layers = new Dictionary<string, int>();
  43. var data = new DungeonData();
  44. data.Apply(configProto.Data);
  45. var config = new DungeonConfig
  46. {
  47. Data = data,
  48. Layers = new(configProto.Layers),
  49. MaxCount = configProto.MaxCount,
  50. MaxOffset = configProto.MaxOffset,
  51. MinCount = configProto.MinCount,
  52. MinOffset = configProto.MinOffset,
  53. ReserveTiles = configProto.ReserveTiles
  54. };
  55. var count = _asteroidOreCount.Next(rand);
  56. var weightedProto = _proto.Index(_asteroidOreWeights);
  57. for (var i = 0; i < count; i++)
  58. {
  59. var ore = weightedProto.Pick(rand);
  60. config.Layers.Add(_proto.Index<OreDunGenPrototype>(ore));
  61. var layerCount = layers.GetOrNew(ore);
  62. layerCount++;
  63. layers[ore] = layerCount;
  64. }
  65. return new AsteroidOffering
  66. {
  67. Id = configId,
  68. DungeonConfig = config,
  69. MarkerLayers = layers,
  70. };
  71. case DebrisOffering:
  72. var id = rand.Pick(_debrisConfigs);
  73. return new DebrisOffering
  74. {
  75. Id = id
  76. };
  77. case SalvageOffering:
  78. // Salvage map seed
  79. _salvageMaps.Clear();
  80. _salvageMaps.AddRange(_proto.EnumeratePrototypes<SalvageMapPrototype>());
  81. _salvageMaps.Sort((x, y) => string.Compare(x.ID, y.ID, StringComparison.Ordinal));
  82. var mapIndex = rand.Next(_salvageMaps.Count);
  83. var map = _salvageMaps[mapIndex];
  84. return new SalvageOffering
  85. {
  86. SalvageMap = map,
  87. };
  88. default:
  89. throw new NotImplementedException($"Salvage type {type} not implemented!");
  90. }
  91. }
  92. }