Ore + entitytable fixes (#37675)
* Ore + entitytable fixes Iterate every dungeon not just last. * Big shot * Fixes
This commit is contained in:
@@ -14,22 +14,31 @@ public sealed partial class DungeonJob
|
||||
{
|
||||
private async Task PostGen(
|
||||
EntityTableDunGen gen,
|
||||
Dungeon dungeon,
|
||||
List<Dungeon> dungeons,
|
||||
HashSet<Vector2i> reservedTiles,
|
||||
Random random)
|
||||
{
|
||||
var count = random.Next(gen.MinCount, gen.MaxCount + 1);
|
||||
var npcs = _entManager.System<NPCSystem>();
|
||||
|
||||
foreach (var dungeon in dungeons)
|
||||
{
|
||||
var availableRooms = new ValueList<DungeonRoom>();
|
||||
availableRooms.AddRange(dungeon.Rooms);
|
||||
var availableTiles = new ValueList<Vector2i>(dungeon.AllTiles);
|
||||
|
||||
var count = random.Next(gen.MinCount, gen.MaxCount + 1);
|
||||
var npcs = _entManager.System<NPCSystem>();
|
||||
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
while (availableTiles.Count > 0)
|
||||
while (availableTiles.Count > 0 && count > 0)
|
||||
{
|
||||
var tile = availableTiles.RemoveSwap(random.Next(availableTiles.Count));
|
||||
|
||||
await SuspendDungeon();
|
||||
|
||||
if (!ValidateResume())
|
||||
return;
|
||||
|
||||
if (reservedTiles.Contains(tile))
|
||||
continue;
|
||||
|
||||
if (!_anchorable.TileFree(_grid,
|
||||
tile,
|
||||
(int) CollisionGroup.MachineLayer,
|
||||
@@ -47,13 +56,18 @@ public sealed partial class DungeonJob
|
||||
npcs.SleepNPC(uid);
|
||||
}
|
||||
|
||||
break;
|
||||
count--;
|
||||
}
|
||||
|
||||
await SuspendDungeon();
|
||||
|
||||
if (!ValidateResume())
|
||||
if (gen.PerDungeon)
|
||||
{
|
||||
count = random.Next(gen.MinCount, gen.MaxCount + 1);
|
||||
}
|
||||
// Stop if count is 0, otherwise go to next dungeon.
|
||||
else if (count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,17 +15,21 @@ public sealed partial class DungeonJob
|
||||
/// </summary>
|
||||
private async Task PostGen(
|
||||
OreDunGen gen,
|
||||
Dungeon dungeon,
|
||||
List<Dungeon> dungeons,
|
||||
HashSet<Vector2i> reservedTiles,
|
||||
Random random)
|
||||
{
|
||||
// Doesn't use dungeon data because layers and we don't need top-down support at the moment.
|
||||
|
||||
foreach (var dungeon in dungeons)
|
||||
{
|
||||
var emptyTiles = false;
|
||||
var replaceEntities = new Dictionary<Vector2i, EntityUid>();
|
||||
var availableTiles = new List<Vector2i>();
|
||||
|
||||
foreach (var node in dungeon.AllTiles)
|
||||
{
|
||||
if (reservedTiles.Contains(node))
|
||||
continue;
|
||||
|
||||
// Empty tile, skip if relevant.
|
||||
if (!emptyTiles && (!_maps.TryGetTile(_grid, node, out var tile) || tile.IsEmpty))
|
||||
continue;
|
||||
@@ -144,3 +148,4 @@ public sealed partial class DungeonJob
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,27 +134,15 @@ public sealed partial class DungeonJob : Job<List<Dungeon>>
|
||||
|
||||
foreach (var layer in layers)
|
||||
{
|
||||
var dungCount = dungeons.Count;
|
||||
await RunLayer(dungeons, position, layer, reservedTiles, seed, random);
|
||||
|
||||
if (config.ReserveTiles)
|
||||
{
|
||||
// Remove any dungeons passed in so we don't interfere with them
|
||||
// This is kinda goofy but okay for now.
|
||||
if (existing != null)
|
||||
{
|
||||
for (var j = 0; j < dungeons.Count; j++)
|
||||
{
|
||||
var dung = dungeons[j];
|
||||
|
||||
if (existing.Contains(dung))
|
||||
{
|
||||
dungeons.RemoveSwap(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var dungeon in dungeons)
|
||||
// Reserve tiles on any new dungeons.
|
||||
for (var d = dungCount; d < dungeons.Count; d++)
|
||||
{
|
||||
var dungeon = dungeons[d];
|
||||
reservedTiles.UnionWith(dungeon.AllTiles);
|
||||
}
|
||||
}
|
||||
@@ -202,6 +190,7 @@ public sealed partial class DungeonJob : Job<List<Dungeon>>
|
||||
npcSystem.WakeNPC(npc.Owner, npc.Comp);
|
||||
}
|
||||
|
||||
_sawmill.Info($"Finished generating dungeon {_gen} with seed {_seed}");
|
||||
return dungeons;
|
||||
}
|
||||
|
||||
@@ -276,7 +265,7 @@ public sealed partial class DungeonJob : Job<List<Dungeon>>
|
||||
await PostGen(mob, dungeons[^1], random);
|
||||
break;
|
||||
case EntityTableDunGen entityTable:
|
||||
await PostGen(entityTable, dungeons[^1], random);
|
||||
await PostGen(entityTable, dungeons, reservedTiles, random);
|
||||
break;
|
||||
case NoiseDistanceDunGen distance:
|
||||
dungeons.Add(await GenerateNoiseDistanceDunGen(position, distance, reservedTiles, seed, random));
|
||||
@@ -285,7 +274,7 @@ public sealed partial class DungeonJob : Job<List<Dungeon>>
|
||||
dungeons.Add(await GenerateNoiseDunGen(position, noise, reservedTiles, seed, random));
|
||||
break;
|
||||
case OreDunGen ore:
|
||||
await PostGen(ore, dungeons[^1], random);
|
||||
await PostGen(ore, dungeons, reservedTiles, random);
|
||||
break;
|
||||
case PrefabDunGen prefab:
|
||||
dungeons.Add(await GeneratePrefabDunGen(position, prefab, reservedTiles, random));
|
||||
|
||||
@@ -18,4 +18,10 @@ public sealed partial class EntityTableDunGen : IDunGenLayer
|
||||
|
||||
[DataField(required: true)]
|
||||
public EntityTableSelector Table;
|
||||
|
||||
/// <summary>
|
||||
/// Should the count be per dungeon or across all dungeons.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool PerDungeon;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user