Make procgen use weighted variants (#24669)

This commit is contained in:
Nemanja
2024-01-28 21:41:59 -05:00
committed by GitHub
parent bd100344a2
commit 2a6705818b
11 changed files with 68 additions and 64 deletions

View File

@@ -25,12 +25,29 @@ public sealed class TileSystem : EntitySystem
/// Returns a weighted pick of a tile variant.
/// </summary>
public byte PickVariant(ContentTileDefinition tile)
{
return PickVariant(tile, _robustRandom.GetRandom());
}
/// <summary>
/// Returns a weighted pick of a tile variant.
/// </summary>
public byte PickVariant(ContentTileDefinition tile, int seed)
{
var rand = new System.Random(seed);
return PickVariant(tile, rand);
}
/// <summary>
/// Returns a weighted pick of a tile variant.
/// </summary>
public byte PickVariant(ContentTileDefinition tile, System.Random random)
{
var variants = tile.PlacementVariants;
var sum = variants.Sum();
var accumulated = 0f;
var rand = _robustRandom.NextFloat() * sum;
var rand = random.NextFloat() * sum;
for (byte i = 0; i < variants.Length; ++i)
{
@@ -44,6 +61,23 @@ public sealed class TileSystem : EntitySystem
throw new InvalidOperationException($"Invalid weighted variantize tile pick for {tile.ID}!");
}
/// <summary>
/// Returns a tile with a weighted random variant.
/// </summary>
public Tile GetVariantTile(ContentTileDefinition tile, System.Random random)
{
return new Tile(tile.TileId, variant: PickVariant(tile, random));
}
/// <summary>
/// Returns a tile with a weighted random variant.
/// </summary>
public Tile GetVariantTile(ContentTileDefinition tile, int seed)
{
var rand = new System.Random(seed);
return new Tile(tile.TileId, variant: PickVariant(tile, rand));
}
public bool PryTile(Vector2i indices, EntityUid gridId)
{
var grid = Comp<MapGridComponent>(gridId);