1
0

DungeonJob.PostGenEntranceFlank.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System.Threading.Tasks;
  2. using Content.Shared.Maps;
  3. using Content.Shared.Procedural;
  4. using Content.Shared.Procedural.PostGeneration;
  5. using Content.Shared.Storage;
  6. using Robust.Shared.Collections;
  7. using Robust.Shared.Map;
  8. namespace Content.Server.Procedural.DungeonJob;
  9. public sealed partial class DungeonJob
  10. {
  11. /// <summary>
  12. /// <see cref="EntranceFlankDunGen"/>
  13. /// </summary>
  14. private async Task PostGen(EntranceFlankDunGen gen, DungeonData data, Dungeon dungeon, HashSet<Vector2i> reservedTiles, Random random)
  15. {
  16. if (!data.Tiles.TryGetValue(DungeonDataKey.FallbackTile, out var tileProto) ||
  17. !data.SpawnGroups.TryGetValue(DungeonDataKey.EntranceFlank, out var flankProto))
  18. {
  19. _sawmill.Error($"Unable to get dungeon data for {nameof(gen)}");
  20. return;
  21. }
  22. var tiles = new List<(Vector2i Index, Tile)>();
  23. var tileDef = _tileDefManager[tileProto];
  24. var spawnPositions = new ValueList<Vector2i>(dungeon.Rooms.Count);
  25. foreach (var room in dungeon.Rooms)
  26. {
  27. foreach (var entrance in room.Entrances)
  28. {
  29. for (var i = 0; i < 8; i++)
  30. {
  31. var dir = (Direction) i;
  32. var neighbor = entrance + dir.ToIntVec();
  33. if (!dungeon.RoomExteriorTiles.Contains(neighbor))
  34. continue;
  35. if (reservedTiles.Contains(neighbor))
  36. continue;
  37. tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
  38. spawnPositions.Add(neighbor);
  39. }
  40. }
  41. }
  42. _maps.SetTiles(_gridUid, _grid, tiles);
  43. var entGroup = _prototype.Index(flankProto);
  44. foreach (var entrance in spawnPositions)
  45. {
  46. _entManager.SpawnEntities(_maps.GridTileToLocal(_gridUid, _grid, entrance), EntitySpawnCollection.GetSpawns(entGroup.Entries, random));
  47. }
  48. }
  49. }