Files

192 lines
6.9 KiB
C#
Raw Permalink Normal View History

2023-03-10 16:41:22 +11:00
using System.Threading;
using System.Threading.Tasks;
using Content.Server.Construction;
2023-05-15 14:47:12 +12:00
using Robust.Shared.CPUJob.JobQueues;
2023-03-10 16:41:22 +11:00
using Content.Server.Decals;
using Content.Shared.Construction.EntitySystems;
using Content.Shared.Maps;
2023-03-10 16:41:22 +11:00
using Content.Shared.Procedural;
using Content.Shared.Procedural.DungeonGenerators;
using Content.Shared.Procedural.PostGeneration;
2023-06-27 19:17:42 +10:00
using Content.Shared.Tag;
2023-03-24 13:19:29 +11:00
using Robust.Server.Physics;
2023-03-10 16:41:22 +11:00
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Prototypes;
2023-06-27 19:17:42 +10:00
using Robust.Shared.Utility;
2023-03-10 16:41:22 +11:00
namespace Content.Server.Procedural;
public sealed partial class DungeonJob : Job<Dungeon>
{
private readonly IEntityManager _entManager;
private readonly IMapManager _mapManager;
private readonly IPrototypeManager _prototype;
private readonly ITileDefinitionManager _tileDefManager;
private readonly AnchorableSystem _anchorable;
private readonly DecalSystem _decals;
private readonly DungeonSystem _dungeon;
private readonly EntityLookupSystem _lookup;
private readonly TileSystem _tile;
private readonly SharedMapSystem _maps;
2023-03-10 16:41:22 +11:00
private readonly SharedTransformSystem _transform;
2023-06-27 19:17:42 +10:00
private EntityQuery<TagComponent> _tagQuery;
2023-03-10 16:41:22 +11:00
private readonly DungeonConfigPrototype _gen;
private readonly int _seed;
2023-04-20 10:43:13 +10:00
private readonly Vector2i _position;
2023-03-10 16:41:22 +11:00
private readonly MapGridComponent _grid;
private readonly EntityUid _gridUid;
private readonly ISawmill _sawmill;
public DungeonJob(
ISawmill sawmill,
double maxTime,
IEntityManager entManager,
IMapManager mapManager,
IPrototypeManager prototype,
ITileDefinitionManager tileDefManager,
AnchorableSystem anchorable,
DecalSystem decals,
DungeonSystem dungeon,
EntityLookupSystem lookup,
TileSystem tile,
2023-03-10 16:41:22 +11:00
SharedTransformSystem transform,
DungeonConfigPrototype gen,
MapGridComponent grid,
EntityUid gridUid,
int seed,
2023-04-20 10:43:13 +10:00
Vector2i position,
2023-03-10 16:41:22 +11:00
CancellationToken cancellation = default) : base(maxTime, cancellation)
{
_sawmill = sawmill;
_entManager = entManager;
_mapManager = mapManager;
_prototype = prototype;
_tileDefManager = tileDefManager;
_anchorable = anchorable;
_decals = decals;
_dungeon = dungeon;
_lookup = lookup;
_tile = tile;
_maps = _entManager.System<SharedMapSystem>();
2023-03-10 16:41:22 +11:00
_transform = transform;
2023-06-27 19:17:42 +10:00
_tagQuery = _entManager.GetEntityQuery<TagComponent>();
2023-03-10 16:41:22 +11:00
_gen = gen;
_grid = grid;
_gridUid = gridUid;
_seed = seed;
_position = position;
}
protected override async Task<Dungeon?> Process()
{
Dungeon dungeon;
_sawmill.Info($"Generating dungeon {_gen.ID} with seed {_seed} on {_entManager.ToPrettyString(_gridUid)}");
2023-03-24 13:19:29 +11:00
_grid.CanSplit = false;
2023-03-10 16:41:22 +11:00
switch (_gen.Generator)
{
case NoiseDunGen noise:
dungeon = await GenerateNoiseDungeon(noise, _gridUid, _grid, _seed);
break;
2023-03-10 16:41:22 +11:00
case PrefabDunGen prefab:
dungeon = await GeneratePrefabDungeon(prefab, _gridUid, _grid, _seed);
DebugTools.Assert(dungeon.RoomExteriorTiles.Count > 0);
2023-03-10 16:41:22 +11:00
break;
default:
throw new NotImplementedException();
}
2023-06-27 19:17:42 +10:00
DebugTools.Assert(dungeon.RoomTiles.Count > 0);
2023-03-10 16:41:22 +11:00
// To make it slightly more deterministic treat this RNG as separate ig.
var random = new Random(_seed);
foreach (var post in _gen.PostGeneration)
{
_sawmill.Debug($"Doing postgen {post.GetType()} for {_gen.ID} with seed {_seed}");
switch (post)
{
2023-06-27 19:17:42 +10:00
case AutoCablingPostGen cabling:
await PostGen(cabling, dungeon, _gridUid, _grid, random);
break;
case BiomePostGen biome:
await PostGen(biome, dungeon, _gridUid, _grid, random);
break;
2023-06-27 19:17:42 +10:00
case BoundaryWallPostGen boundary:
await PostGen(boundary, dungeon, _gridUid, _grid, random);
break;
case CornerClutterPostGen clutter:
await PostGen(clutter, dungeon, _gridUid, _grid, random);
break;
case CorridorClutterPostGen corClutter:
await PostGen(corClutter, dungeon, _gridUid, _grid, random);
break;
2023-06-27 19:17:42 +10:00
case CorridorPostGen cordor:
await PostGen(cordor, dungeon, _gridUid, _grid, random);
break;
case CorridorDecalSkirtingPostGen decks:
await PostGen(decks, dungeon, _gridUid, _grid, random);
break;
case EntranceFlankPostGen flank:
await PostGen(flank, dungeon, _gridUid, _grid, random);
break;
case JunctionPostGen junc:
await PostGen(junc, dungeon, _gridUid, _grid, random);
break;
2023-03-10 16:41:22 +11:00
case MiddleConnectionPostGen dordor:
await PostGen(dordor, dungeon, _gridUid, _grid, random);
break;
2023-06-27 19:17:42 +10:00
case DungeonEntrancePostGen entrance:
2023-03-10 16:41:22 +11:00
await PostGen(entrance, dungeon, _gridUid, _grid, random);
break;
case ExternalWindowPostGen externalWindow:
await PostGen(externalWindow, dungeon, _gridUid, _grid, random);
break;
case InternalWindowPostGen internalWindow:
await PostGen(internalWindow, dungeon, _gridUid, _grid, random);
break;
case BiomeMarkerLayerPostGen markerPost:
await PostGen(markerPost, dungeon, _gridUid, _grid, random);
break;
2023-06-27 19:17:42 +10:00
case RoomEntrancePostGen rEntrance:
await PostGen(rEntrance, dungeon, _gridUid, _grid, random);
2023-03-10 16:41:22 +11:00
break;
case WallMountPostGen wall:
await PostGen(wall, dungeon, _gridUid, _grid, random);
break;
case WormCorridorPostGen worm:
await PostGen(worm, dungeon, _gridUid, _grid, random);
break;
2023-03-10 16:41:22 +11:00
default:
throw new NotImplementedException();
}
await SuspendIfOutOfTime();
2023-06-27 19:17:42 +10:00
if (!ValidateResume())
break;
2023-03-10 16:41:22 +11:00
}
// Defer splitting so they don't get spammed and so we don't have to worry about tracking the grid along the way.
2023-03-24 13:19:29 +11:00
_grid.CanSplit = true;
_entManager.System<GridFixtureSystem>().CheckSplits(_gridUid);
2023-03-10 16:41:22 +11:00
return dungeon;
}
private bool ValidateResume()
{
if (_entManager.Deleted(_gridUid))
return false;
return true;
}
}