private Direction?DetermineExpectedDirection(ClonePos clonePos, ElementPos posOfElement) { Direction?expectedDirection = null; if (clonePos.XPos < posOfElement.XPos) { expectedDirection = Direction.Right; } if (clonePos.XPos > posOfElement.XPos) { expectedDirection = Direction.Left; } return(expectedDirection); }
private CloneAction GetAction(ClonePos clonePos, ElementPos exit, List <ElementPos> elevators) { if (clonePos.XPos == -1 && clonePos.Floor == -1) { Log("Invalid clone pos, wait!"); return(CloneAction.Wait); } bool cloneOnExitFloor = clonePos.Floor == exit.Floor; Log($"Drone is on exit floor: {cloneOnExitFloor}"); var elementToNavTo = cloneOnExitFloor ? exit : elevators.FirstOrDefault(e => e.Floor == clonePos.Floor); if (elementToNavTo == null) { Log("We want to move to an elevator on floor {}, but none is found, creating an elevator here!"); var newEl = new ElementPos() { Floor = clonePos.Floor, XPos = clonePos.XPos, ElementType = "Own Elevator" }; elevators.Add(newEl); return(CloneAction.Elevator); } Log($"Moving drone to {elementToNavTo}"); var expectedDirection = DetermineExpectedDirection(clonePos, elementToNavTo); Log($"We expect the drone to navigate: {expectedDirection}"); if (expectedDirection == null) { Log("No direction expected, spot on location, wait"); return(CloneAction.Wait); } if (expectedDirection == clonePos.Direction) { Log("Same floor, going correct way!"); return(CloneAction.Wait); } if (expectedDirection != clonePos.Direction) { Log("Same floor, but going wrong way!"); return(CloneAction.Block); } Log("No condition hit, just waiting this one!"); return(CloneAction.Wait); }