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 }