using System.Threading.Tasks;
using Content.Shared.Procedural;
using Content.Shared.Procedural.DungeonLayers;
using Robust.Shared.Map;
using Robust.Shared.Noise;
using Robust.Shared.Random;
namespace Content.Server.Procedural.DungeonJob;
public sealed partial class DungeonJob
{
///
///
///
private async Task PostGen(SampleTileDunGen gen,
List dungeons,
HashSet reservedTiles,
Random random)
{
var noise = gen.Noise;
var oldSeed = noise.GetSeed();
noise.SetSeed(_seed + oldSeed);
var tiles = new List<(Vector2i Index, Tile Tile)>();
var tileDef = _prototype.Index(gen.Tile);
var variants = tileDef.PlacementVariants.Length;
foreach (var dungeon in dungeons)
{
foreach (var tile in dungeon.AllTiles)
{
if (reservedTiles.Contains(tile))
continue;
var invert = gen.Invert;
var value = noise.GetNoise(tile.X, tile.Y);
value = invert ? value * -1 : value;
if (value < gen.Threshold)
continue;
var variantValue = (noise.GetNoise(tile.X * 8, tile.Y * 8, variants) + 1f) * 100;
var variant = _tile.PickVariant(tileDef, (int)variantValue);
var tileVariant = new Tile(tileDef.TileId, variant: variant);
tiles.Add((tile, tileVariant));
AddLoadedTile(tile, tileVariant);
await SuspendDungeon();
if (!ValidateResume())
return;
}
}
gen.Noise.SetSeed(oldSeed);
_maps.SetTiles(_gridUid, _grid, tiles);
if (gen.ReserveTiles)
{
foreach (var tile in tiles)
{
reservedTiles.Add(tile.Index);
}
}
}
}