+static dvonn_bool_t
+dvonn_board_player_has_legal_move (dvonn_board_t *board)
+{
+ int x, y, height;
+ char *error;
+
+ for (x = 0; x < DVONN_BOARD_X_SIZE; x++) {
+ for (y = 0; y < DVONN_BOARD_X_SIZE; y++) {
+ if (! dvonn_board_cell_occupied (board, x, y))
+ continue;
+ if (! (board->cells[x][y].type == (dvonn_cell_type_t) board->player))
+ continue;
+ height = board->cells[x][y].height;
+ if (dvonn_board_move_legal (board, x, y,
+ x + height, y, &error))
+ return TRUE;
+ if (dvonn_board_move_legal (board, x, y,
+ x - height, y, &error))
+ return TRUE;
+ if (dvonn_board_move_legal (board, x, y,
+ x, y + height, &error))
+ return TRUE;
+ if (dvonn_board_move_legal (board, x, y,
+ x, y - height, &error))
+ return TRUE;
+ if (dvonn_board_move_legal (board, x, y,
+ x + height, y - height, &error))
+ return TRUE;
+ if (dvonn_board_move_legal (board, x, y,
+ x - height, y + height, &error))
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+static dvonn_phase_t