/// <summary> /// If cells in m_highlightPositions forms one block, add block in m_puzzle, and draw the block. Otherwise, do nothing. /// </summary> /// <returns>PlacedBlock if block is found, null otherwise</returns> private PlacedBlock FindAndHighlightBlockMaybe() { if (m_highlightPositions.Count == 0) { return(null); } int minX = m_highlightPositions.Select(pos => pos.x).Min(); int minY = m_highlightPositions.Select(pos => pos.y).Min(); int maxX = m_highlightPositions.Select(pos => pos.x).Max(); int maxY = m_highlightPositions.Select(pos => pos.y).Max(); if (maxX - minX > 3 || maxY - minY > 3) { return(null); } int[,] hlBlockIndex = new int[4, 4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (m_highlightPositions.Contains(new Position(minX + i, minY + j))) { hlBlockIndex[i, j] = 1; } } } foreach (string name in BlockFactory.m_blockNames) { Block b = BlockFactory.GetBlockByName(name); for (int i = 0; i < b.m_varients.Count; i++) { if (BlockFactory.ArrayEquals(b.m_varients[i], hlBlockIndex)) { PlacedBlock pb = new PlacedBlock(b, i, minX, minY); return(pb); } } } return(null); }