using System.Collections.Generic; using EscapeRoomEngine.Engine.Runtime.Modules; using EscapeRoomEngine.Engine.Runtime.Modules.State; using EscapeRoomEngine.Engine.Runtime.Utilities; using UnityEngine; namespace EscapeRoomEngine.Engine.Runtime.Requirements.Placement { /// /// This requirement guarantees that the back side of the module is placed on the bottom row of an even-numbered space or on the top row of an odd-numbered space. /// [CreateAssetMenu(menuName = "Requirements/Place On Bottom Or Top Row Alternating")] public class PlaceOnBottomOrTopRowAlternating : PlacementRequirement { protected override List FilterCandidates(List candidates, Module module, Space space) { if (!module.description.HasType(ModuleType.DoorExit)) { throw new WrongTypeException(module.description.types[0], ModuleType.DoorExit); } var number = FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).Length; if (number / 2 % 2 == 0) { candidates.RemoveAll(candidate => { var (left, right) = candidate.BackCorners; return !(left.z == 0 && right.z == 0); }); } else { var sizeMinusOne = space.rrPlacement.size - Vector2Int.one; candidates.RemoveAll(candidate => { var (left, right) = candidate.BackCorners; return !(left.z == sizeMinusOne.y && right.z == sizeMinusOne.y); }); } return candidates; } } }