private T Pick<T>(List<T> collection, float value)
{
// Listen I don't need this exact and I'm too lazy to finetune just for random ent picking.
@@ -89,13+80,13 @@ public abstract class SharedBiomeSystem : EntitySystem
return false;
}
- return TryGetBiomeTile(indices, biome.Layers, biome.Noise, grid, out tile);
+ return TryGetBiomeTile(indices, biome.Layers, biome.Seed, grid, out tile);
}
/// <summary>
/// Tries to get the tile, real or otherwise, for the specified indices.
/// </summary>
- public bool TryGetBiomeTile(Vector2i indices, List<IBiomeLayer> layers, FastNoiseLite noise, MapGridComponent? grid, [NotNullWhen(true)] out Tile? tile)
+ public bool TryGetBiomeTile(Vector2i indices, List<IBiomeLayer> layers, int seed, MapGridComponent? grid, [NotNullWhen(true)] out Tile? tile)
{
if (grid?.TryGetTileRef(indices, out var tileRef) == true && !tileRef.Tile.IsEmpty)
{
@@ -103,23+94,23 @@ public abstract class SharedBiomeSystem : EntitySystem
return true;
}
- var oldSeed = noise.GetSeed();
-
for (var i = layers.Count - 1; i >= 0; i--)
{
var layer = layers[i];
+ var noiseCopy = GetNoise(layer.Noise, seed);
+
+ var invert = layer.Invert;
+ var value = noiseCopy.GetNoise(indices.X, indices.Y);
+ value = invert ? value * -1 : value;
+
+ if (value < layer.Threshold)
+ continue;
// Check if the tile is from meta layer, otherwise fall back to default layers.
if (layer is BiomeMetaLayer meta)
{
- SetNoise(noise, oldSeed, layer.Noise);
- var found = noise.GetNoise(indices.X, indices.Y);
- found *= layer.Invert ? -1 : 1;
-
- if (found > layer.Threshold && TryGetBiomeTile(indices, ProtoManager.Index<BiomeTemplatePrototype>(meta.Template).Layers, noise,
- grid, out tile))
+ if (TryGetBiomeTile(indices, ProtoManager.Index<BiomeTemplatePrototype>(meta.Template).Layers, seed, grid, out tile))
{
- noise.SetSeed(oldSeed);
return true;
}
@@ -129,16+120,12 @@ public abstract class SharedBiomeSystem : EntitySystem
if (layer is not BiomeTileLayer tileLayer)
continue;
- SetNoise(noise, oldSeed, layer.Noise);
-
- if (TryGetTile(indices, noise, tileLayer.Invert, tileLayer.Threshold, ProtoManager.Index<ContentTileDefinition>(tileLayer.Tile), tileLayer.Variants, out tile))
+ if (TryGetTile(indices, noiseCopy, tileLayer.Invert, tileLayer.Threshold, ProtoManager.Index<ContentTileDefinition>(tileLayer.Tile), tileLayer.Variants, out tile))
{
- noise.SetSeed(oldSeed);
return true;
}
}
- noise.SetSeed(oldSeed);
tile = null;
return false;
}
@@ -146,9+133,9 @@ public abstract class SharedBiomeSystem : EntitySystem
/// <summary>
/// Gets the underlying biome tile, ignoring any existing tile that may be there.