bool copy_block(Tile* tiles, const Block* block) { const p2i& p = block->position; int xp = (p.x - START_X + SQUARE_SIZE / 2) / SQUARE_SIZE; int yp = (p.y - START_Y + SQUARE_SIZE / 2) / SQUARE_SIZE; if (is_block_available(tiles, xp, yp)) { for (int i = 0; i < 4; ++i) { int cx = xp + MARK_STEPS[i * 2]; int cy = yp + MARK_STEPS[i * 2 + 1]; uint32_t idx = get_tiles_index(cx, cy); Tile& t = tiles[idx]; t.state.set(BIT_MARKED); t.color = block->colors[i]; PointList list; check(tiles, cx, cy, -1, list, true); list.add(cx, cy); if (list.size() > 2) { //LOG << "connected"; t.state.set(BIT_COHERENT); for (size_t j = 0; j < list.size(); ++j) { const p2i& p = list.get(j); //LOG << j << " = " << p.x << " " << p.y; set_state(tiles, p.x, p.y, BIT_COHERENT); } } } determineEdges(tiles); return true; } else { //LOG << "Block is not available"; } return false; }