1
0

DungeonJob.PostGen.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. using System.Numerics;
  2. using Content.Shared.Procedural;
  3. using Robust.Shared.Collections;
  4. using Robust.Shared.Map.Components;
  5. using Robust.Shared.Physics.Components;
  6. namespace Content.Server.Procedural.DungeonJob;
  7. public sealed partial class DungeonJob
  8. {
  9. /*
  10. * Run after the main dungeon generation
  11. */
  12. private bool HasWall(Vector2i tile)
  13. {
  14. var anchored = _maps.GetAnchoredEntitiesEnumerator(_gridUid, _grid, tile);
  15. while (anchored.MoveNext(out var uid))
  16. {
  17. if (_tags.HasTag(uid.Value, "Wall"))
  18. return true;
  19. }
  20. return false;
  21. }
  22. private void BuildCorridorExterior(Dungeon dungeon)
  23. {
  24. var exterior = dungeon.CorridorExteriorTiles;
  25. // Just ignore entrances or whatever for now.
  26. foreach (var tile in dungeon.CorridorTiles)
  27. {
  28. for (var x = -1; x <= 1; x++)
  29. {
  30. for (var y = -1; y <= 1; y++)
  31. {
  32. var neighbor = new Vector2i(tile.X + x, tile.Y + y);
  33. if (dungeon.CorridorTiles.Contains(neighbor) ||
  34. dungeon.RoomExteriorTiles.Contains(neighbor) ||
  35. dungeon.RoomTiles.Contains(neighbor) ||
  36. dungeon.Entrances.Contains(neighbor))
  37. {
  38. continue;
  39. }
  40. exterior.Add(neighbor);
  41. }
  42. }
  43. }
  44. }
  45. private void WidenCorridor(Dungeon dungeon, float width, ICollection<Vector2i> corridorTiles)
  46. {
  47. var expansion = width - 2;
  48. // Widen the path
  49. if (expansion >= 1)
  50. {
  51. var toAdd = new ValueList<Vector2i>();
  52. foreach (var node in corridorTiles)
  53. {
  54. // Uhhh not sure on the cleanest way to do this but tl;dr we don't want to hug
  55. // exterior walls and make the path smaller.
  56. for (var x = -expansion; x <= expansion; x++)
  57. {
  58. for (var y = -expansion; y <= expansion; y++)
  59. {
  60. var neighbor = new Vector2(node.X + x, node.Y + y).Floored();
  61. // Diagonals still matter here.
  62. if (dungeon.RoomTiles.Contains(neighbor) ||
  63. dungeon.RoomExteriorTiles.Contains(neighbor))
  64. {
  65. // Try
  66. continue;
  67. }
  68. toAdd.Add(neighbor);
  69. }
  70. }
  71. }
  72. foreach (var node in toAdd)
  73. {
  74. corridorTiles.Add(node);
  75. }
  76. }
  77. }
  78. /// <summary>
  79. /// Removes any unwanted obstacles around a door tile.
  80. /// </summary>
  81. private void ClearDoor(Dungeon dungeon, MapGridComponent grid, Vector2i indices, bool strict = false)
  82. {
  83. var flags = strict
  84. ? LookupFlags.Dynamic | LookupFlags.Static | LookupFlags.StaticSundries
  85. : LookupFlags.Dynamic | LookupFlags.Static;
  86. for (var x = -1; x <= 1; x++)
  87. {
  88. for (var y = -1; y <= 1; y++)
  89. {
  90. if (x != 0 && y != 0)
  91. continue;
  92. var neighbor = new Vector2i(indices.X + x, indices.Y + y);
  93. if (!dungeon.RoomTiles.Contains(neighbor))
  94. continue;
  95. // Shrink by 0.01 to avoid polygon overlap from neighboring tiles.
  96. // TODO: Uhh entityset re-usage.
  97. foreach (var ent in _lookup.GetEntitiesIntersecting(_gridUid, new Box2(neighbor * grid.TileSize, (neighbor + 1) * grid.TileSize).Enlarged(-0.1f), flags))
  98. {
  99. if (!_physicsQuery.TryGetComponent(ent, out var physics) ||
  100. !physics.Hard ||
  101. (DungeonSystem.CollisionMask & physics.CollisionLayer) == 0x0 &&
  102. (DungeonSystem.CollisionLayer & physics.CollisionMask) == 0x0)
  103. {
  104. continue;
  105. }
  106. _entManager.DeleteEntity(ent);
  107. }
  108. }
  109. }
  110. }
  111. }