module relations and module staging
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user