private void removeFullLines() {
        int numFullLines = 0;

        for (int i = BOARD_HEIGHT - 1; i >= 0; i--) {
            boolean isLineFull = true;

            for (int j = 0; j < BOARD_WIDTH; j++) {
                if (getBlock(j, i) == Tetromino.None) {
                    isLineFull = false;
                    break;
                }
            }

            if (isLineFull) {
                numFullLines++;

                for (int j = 0; j < BOARD_WIDTH; j++) {
                    Tetromino tetromino = getBlock(j, i);
                    // todo: BOARD_HEIGHT - i is shitty
                    particleSystem.addEmitter(50, j, BOARD_HEIGHT - i, BoardRenderer.colors[tetromino.ordinal()]);
                }

                for (int k = i; k < BOARD_HEIGHT - 1; k++) {
                    for (int j = 0; j < BOARD_WIDTH; j++) {
                        setBlock(j, k, getBlock(j, k + 1)); //Shift blocks down
                    }
                }
            }
        }

        if (numFullLines > 0) {
            score.setNumLinesRemoved(numFullLines, hardDropY);
            hardDropY = 0;
            isFallingFinished = true;
            curPiece.setBlock(Tetromino.None);
        }
    }