When the current tetrimino is being lowered (via any method) such that a cell above the lowest row cannot move down, but the lowest row can move down, a panic will be thrown stating the higher (blocked) cell could not be moved down. An example of this situation can be seen in the following diagram, where the orange "J" tetrimino will cause a panic once it attempts to lower beyond the blue "I" tetrimino.
I believe this is caused by Tetrimino.CanMoveDown which is currently checking for collisions on the bottom row only. A better approach would be to check collisions for the bottom cell of each column.
When the current tetrimino is being lowered (via any method) such that a cell above the lowest row cannot move down, but the lowest row can move down, a panic will be thrown stating the higher (blocked) cell could not be moved down. An example of this situation can be seen in the following diagram, where the orange "J" tetrimino will cause a panic once it attempts to lower beyond the blue "I" tetrimino.
I believe this is caused by
Tetrimino.CanMoveDown
which is currently checking for collisions on the bottom row only. A better approach would be to check collisions for the bottom cell of each column.