using DatReaderWriter;
using DatReaderWriter.DBObjs;
using DatReaderWriter.Enums;
using AcDream.Content;
namespace AcDream.App.Streaming;
internal interface ISealedDungeonCellClassifier
{
bool IsSealedDungeon(uint cellId);
}
///
/// Classifies a server-supplied full cell ID using the EnvCell's retail
/// bit. Missing, outdoor, and structural
/// shell IDs are never guessed to be sealed.
///
internal sealed class DatSealedDungeonCellClassifier
: ISealedDungeonCellClassifier
{
private readonly IDatReaderWriter _dats;
private readonly object _datLock;
public DatSealedDungeonCellClassifier(
IDatReaderWriter dats,
object datLock)
{
_dats = dats ?? throw new ArgumentNullException(nameof(dats));
_datLock = datLock ?? throw new ArgumentNullException(nameof(datLock));
}
public bool IsSealedDungeon(uint cellId)
{
uint low = cellId & 0xFFFFu;
if (low < 0x0100u || low >= 0xFFFEu)
return false;
EnvCell? envCell;
lock (_datLock)
envCell = _dats.Get(cellId);
return envCell is not null
&& !envCell.Flags.HasFlag(EnvCellFlags.SeenOutside);
}
}