public virtual async Task <Tuple <Tile, MapDirection> > GetTargetTile(Point?target, MapDirection requesteDirection) { MapDirection invertMessageDirection = requesteDirection; if (target == null) { return(null); } await tileInitialized.Task; Tile tile = null; TilePositions.TryGetValue(target.Value, out tile); if (tile == null) { var targetTileData = CurrentMap.GetTileData(target.Value); if (targetTileData.Actuators.Any() && targetTileData.Actuators.All(x => x.ActuatorType == 5 || x.ActuatorType == 6)) { throw new InvalidOperationException("this should not be possible"); } else if (targetTileData.Actuators.Any() && !targetTileData.Actuators.All(x => x.ActuatorType != 5 && x.ActuatorType != 6)) { throw new InvalidOperationException("mixture of wall and virtual actuators"); } else {//find floor tile where is wall actuator put & thus invert message direction invertMessageDirection = requesteDirection.Opposite; TilePositions.TryGetValue(target.Value + requesteDirection.RelativeShift, out tile); if (tile == null) { throw new InvalidOperationException(); } } } return(Tuple.Create(tile, invertMessageDirection)); }