Example #1
0
        public async Task <bool> VerifyMapCompletion(Guid mapId)
        {
            var map = await _mapsRepository.GetMapById(mapId);

            var mapTiles = map.ColumnCount * map.RowCount;

            return(mapTiles == await _mapsRepository.MapImagePartsUploaded(mapId));
        }
Example #2
0
        public async Task <IList <Error> > ValidateMapEntry(MapData mapData)
        {
            var errors = new List <Error>();

            var map = await _mapsRepository.GetMapById(mapData.MapId);

            if (map == null)
            {
                errors.Add(new Error("map", "Could not find a map with that Id."));

                return(errors);
            }

            if (!PointWithinMap(mapData.Coordinates, map.ColumnCount, map.RowCount))
            {
                errors.Add(new Error("map", $"Selected map coordinate: ({mapData.Coordinates.X},{mapData.Coordinates.Y}) is not within the map boundaries."));
            }
            if (await _mapsRepository.GetMapImagePartByIdAndLocation(map.Id, mapData.Coordinates.X, mapData.Coordinates.Y) != null)
            {
                errors.Add(new Error("map", $"Selected map coordinate: ({mapData.Coordinates.X},{mapData.Coordinates.Y}) is already occupied."));
            }

            return(errors);
        }
Example #3
0
        public async Task <Guid> SelectNextImageId(Guid mapId, IList <Guid> imageIds)
        {
            var map = await _mapsRepository.GetMapById(mapId);

            var mapImageParts = new List <MapImagePart>();

            foreach (var imageId in imageIds)
            {
                mapImageParts.Add(await _mapsRepository.GetMapImagePartByImageId(imageId));
            }

            if (mapImageParts.Count == map.ColumnCount * map.RowCount)
            {
                return(Guid.Empty);
            }

            var nextImageId         = Guid.Empty;
            var primaryMapPart      = mapImageParts.First(imagePart => imagePart.ImageId == imageIds.First());
            var pastPrimaryMapParts = new List <MapImagePart>();

            while (nextImageId == Guid.Empty)
            {
                //When creating a compound image, this code will look for the next map tile to add. If there are no remaining images to add, it will stop.
                if (primaryMapPart.CoordinateY + 1 <= map.RowCount && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX && imagePart.CoordinateY == primaryMapPart.CoordinateY + 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX, primaryMapPart.CoordinateY + 1)).ImageId;
                }
                else if (primaryMapPart.CoordinateX + 1 <= map.ColumnCount && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX + 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX + 1, primaryMapPart.CoordinateY)).ImageId;
                }
                else if (primaryMapPart.CoordinateX - 1 >= 1 && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX - 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX - 1, primaryMapPart.CoordinateY)).ImageId;
                }
                else if (primaryMapPart.CoordinateY - 1 >= 1 && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX && imagePart.CoordinateY == primaryMapPart.CoordinateY - 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX, primaryMapPart.CoordinateY - 1)).ImageId;
                }
                else if (primaryMapPart.CoordinateX + 1 <= map.ColumnCount && primaryMapPart.CoordinateY + 1 <= map.RowCount && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX + 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY + 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX + 1, primaryMapPart.CoordinateY + 1)).ImageId;
                }
                else if (primaryMapPart.CoordinateX - 1 >= 1 && primaryMapPart.CoordinateY + 1 <= map.RowCount && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX - 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY + 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX - 1, primaryMapPart.CoordinateY + 1)).ImageId;
                }
                else if (primaryMapPart.CoordinateX + 1 <= map.ColumnCount && primaryMapPart.CoordinateY - 1 >= 1 && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX + 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY - 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX + 1, primaryMapPart.CoordinateY - 1)).ImageId;
                }
                else if (primaryMapPart.CoordinateX - 1 >= 1 && primaryMapPart.CoordinateY - 1 >= 1 && !mapImageParts.Any(imagePart => imagePart.CoordinateX == primaryMapPart.CoordinateX - 1 && imagePart.CoordinateY == primaryMapPart.CoordinateY - 1))
                {
                    nextImageId = (await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX - 1, primaryMapPart.CoordinateY - 1)).ImageId;
                }
                else
                {
                    if (primaryMapPart.CoordinateY + 1 <= map.RowCount && pastPrimaryMapParts.All(part => part.CoordinateY == primaryMapPart.CoordinateY + 1 && part.CoordinateX == primaryMapPart.CoordinateX))
                    {
                        var upperMapPart = await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX, primaryMapPart.CoordinateY + 1);

                        if (imageIds.Any(imageId => imageId == upperMapPart.ImageId))
                        {
                            pastPrimaryMapParts.Add(primaryMapPart);
                            primaryMapPart = await _mapsRepository.GetMapImagePartByImageId(imageIds.First(imageId => imageId == upperMapPart.ImageId));
                        }
                    }
                    else if (primaryMapPart.CoordinateY - 1 >= 1 && pastPrimaryMapParts.All(part => part.CoordinateY == primaryMapPart.CoordinateY - 1 && part.CoordinateX == primaryMapPart.CoordinateX))
                    {
                        var lowerMapPart = await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX, primaryMapPart.CoordinateY - 1);

                        if (imageIds.Any(imageId => imageId == lowerMapPart.ImageId))
                        {
                            pastPrimaryMapParts.Add(primaryMapPart);
                            primaryMapPart = await _mapsRepository.GetMapImagePartByImageId(imageIds.First(imageId => imageId == lowerMapPart.ImageId));
                        }
                    }
                    else if (primaryMapPart.CoordinateX + 1 <= map.ColumnCount && pastPrimaryMapParts.All(part => part.CoordinateX == primaryMapPart.CoordinateX + 1 && part.CoordinateY == primaryMapPart.CoordinateY))
                    {
                        var rightMapPart = await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX + 1, primaryMapPart.CoordinateY);

                        if (imageIds.Any(imageId => imageId == rightMapPart.ImageId))
                        {
                            pastPrimaryMapParts.Add(primaryMapPart);
                            primaryMapPart = await _mapsRepository.GetMapImagePartByImageId(imageIds.First(imageId => imageId == rightMapPart.ImageId));
                        }
                    }
                    else if (primaryMapPart.CoordinateX - 1 >= 1 && pastPrimaryMapParts.All(part => part.CoordinateX == primaryMapPart.CoordinateX - 1 && part.CoordinateY == primaryMapPart.CoordinateY))
                    {
                        var leftMapPart = await _mapsRepository.GetMapImagePartByIdAndLocation(mapId, primaryMapPart.CoordinateX - 1, primaryMapPart.CoordinateY);

                        if (imageIds.Any(imageId => imageId == leftMapPart.ImageId))
                        {
                            pastPrimaryMapParts.Add(primaryMapPart);
                            primaryMapPart = await _mapsRepository.GetMapImagePartByImageId(imageIds.First(imageId => imageId == leftMapPart.ImageId));
                        }
                    }
                    else
                    {
                        return(Guid.Empty);
                    }
                }
            }

            return(nextImageId);
        }