1
0

DungeonJob.DunGenReplaceTile.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System.Threading.Tasks;
  2. using Content.Shared.Procedural;
  3. using Content.Shared.Procedural.DungeonGenerators;
  4. using Content.Shared.Procedural.PostGeneration;
  5. using Robust.Shared.Map;
  6. using Robust.Shared.Random;
  7. namespace Content.Server.Procedural.DungeonJob;
  8. public sealed partial class DungeonJob
  9. {
  10. /// <summary>
  11. /// <see cref="ReplaceTileDunGen"/>
  12. /// </summary>
  13. private async Task<Dungeon> GenerateTileReplacementDunGen(ReplaceTileDunGen gen, DungeonData data, HashSet<Vector2i> reservedTiles, Random random)
  14. {
  15. var tiles = _maps.GetAllTilesEnumerator(_gridUid, _grid);
  16. var replacements = new List<(Vector2i Index, Tile Tile)>();
  17. var reserved = new HashSet<Vector2i>();
  18. while (tiles.MoveNext(out var tileRef))
  19. {
  20. var node = tileRef.Value.GridIndices;
  21. if (reservedTiles.Contains(node))
  22. continue;
  23. foreach (var layer in gen.Layers)
  24. {
  25. var value = layer.Noise.GetNoise(node.X, node.Y);
  26. if (value < layer.Threshold)
  27. continue;
  28. Tile tile;
  29. if (random.Prob(gen.VariantWeight))
  30. {
  31. tile = _tileDefManager.GetVariantTile(_prototype.Index(layer.Tile), random);
  32. }
  33. else
  34. {
  35. tile = new Tile(_prototype.Index(layer.Tile).TileId);
  36. }
  37. replacements.Add((node, tile));
  38. reserved.Add(node);
  39. break;
  40. }
  41. await SuspendDungeon();
  42. }
  43. _maps.SetTiles(_gridUid, _grid, replacements);
  44. return new Dungeon(new List<DungeonRoom>()
  45. {
  46. new DungeonRoom(reserved, _position, Box2i.Empty, new HashSet<Vector2i>()),
  47. });
  48. }
  49. }