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));
        }