示例#1
0
        public async Task CheckIsCastleClosed(BoardComponent bc, int currentTileX, int currentTileY)
        {
            if (bc.TerrainType != TerrainType.Castle)
            {
                return;
            }

            // castle is closed if each component has a neighbouring tile on each tile side
            foreach (var component in bc.Components)
            {
                var tile = component.Tile;

                if (tile.TileId != 0)
                {
                    await _tileRepository.GetTileWithTileType(tile.TileId);
                }

                if (tile.GetComponentAt(TilePosition.Top).TileTypeComponentId == component.TileTypeComponentId)
                {
                    bool existNeighbour = await _tileRepository.ExistTile(bc.BoardId, tile.X, tile.Y - 1);

                    bool isClosedByCurrentTile = tile.X == currentTileX && tile.Y - 1 == currentTileY;
                    if (!existNeighbour && !isClosedByCurrentTile)
                    {
                        return;
                    }
                }

                if (tile.GetComponentAt(TilePosition.Right).TileTypeComponentId == component.TileTypeComponentId)
                {
                    bool existNeighbour = await _tileRepository.ExistTile(bc.BoardId, tile.X + 1, tile.Y);

                    bool isClosedByCurrentTile = tile.X + 1 == currentTileX && tile.Y == currentTileY;
                    if (!existNeighbour && !isClosedByCurrentTile)
                    {
                        return;
                    }
                }

                if (tile.GetComponentAt(TilePosition.Bottom).TileTypeComponentId == component.TileTypeComponentId)
                {
                    bool existNeighbour = await _tileRepository.ExistTile(bc.BoardId, tile.X, tile.Y + 1);

                    bool isClosedByCurrentTile = tile.X == currentTileX && tile.Y + 1 == currentTileY;
                    if (!existNeighbour && !isClosedByCurrentTile)
                    {
                        return;
                    }
                }

                if (tile.GetComponentAt(TilePosition.Left).TileTypeComponentId == component.TileTypeComponentId)
                {
                    bool existNeighbour = await _tileRepository.ExistTile(bc.BoardId, tile.X - 1, tile.Y);

                    bool isClosedByCurrentTile = tile.X - 1 == currentTileX && tile.Y == currentTileY;
                    if (!existNeighbour && !isClosedByCurrentTile)
                    {
                        return;
                    }
                }
            }

            // castle is closed
            bc.IsOpen = false;
            bc.Points = bc.Components.Count(); // should be tiles count
        }