module relations and module staging

This commit is contained in:
2022-11-21 11:40:54 +01:00
parent 95e447e8ef
commit eeb90ac24c
7 changed files with 69 additions and 21 deletions

View File

@@ -15,10 +15,30 @@ namespace EscapeRoomEngine.Engine.Runtime
/// The room relative (<i>RR</i>) dimensions of this space.
/// </summary>
internal readonly Dimensions rrDimensions;
internal List<Module> Modules { get; } = new(2);
internal readonly Room room;
/// <summary>
/// A list of all modules.
/// </summary>
internal List<Module> Modules { get; } = new(2);
/// <summary>
/// A list of all staged and added modules.
/// </summary>
internal List<Module> AllModules
{
get
{
var modules = new List<Module>(Modules);
if (_stagedModules.Count > 0)
{
modules.AddRange(_stagedModules);
}
return modules;
}
}
private GameObject _spaceObject, _spaceTiles;
private List<Module> _stagedModules = new();
internal Space(Room room, Passage entrance)
{
@@ -31,24 +51,41 @@ namespace EscapeRoomEngine.Engine.Runtime
// connect the space to its passage
entrance.ConnectTo(new DoorModule(this,
((DoorModuleDescription)entrance.fromOut.description).connectedDoorDescription));
AddModule(entrance.toIn);
}
internal void AddModule(Module module)
{
Modules.Add(module);
Modules.Add(entrance.toIn);
}
internal bool AddModuleWithRequirements(Module module)
{
var requirementsFulfilled =
PreconditionRequirement.CheckPreconditions(module, this) &&
PlacementRequirement.TryPlacing(module, this) &&
OrientationRequirement.TryOrienting(module, this);
var requirementsFulfilled = module.CheckRequirements();
if (requirementsFulfilled)
{
AddModule(module);
// add all previously staged modules first ...
for (var i = _stagedModules.Count - 1; i >= 0; i--)
{
Modules.Add(_stagedModules[i]);
}
// ... and then add the module itself
Modules.Add(module);
}
// always clear the staged modules. if a module isn't added, its corresponding staged modules should be discarded
_stagedModules = new List<Module>();
return requirementsFulfilled;
}
/// <summary>
/// Stage a module if its requirements are currently met. It will be added as soon as the next module is added by <see cref="AddModuleWithRequirements"/>.
/// </summary>
/// <param name="module">The module to stage</param>
/// <returns>Whether the requirements were met and the module was staged</returns>
internal bool StageModuleWithRequirements(Module module)
{
var requirementsFulfilled = module.CheckRequirements();
if (requirementsFulfilled)
{
_stagedModules.Add(module);
}
return requirementsFulfilled;