/** Calls all drawing routines in order */ void engine_draw(game_s* g) { WINDOW* board = engine.screen.board.win; werase(board); switch (g->state) { case PLAYING: engine_draw_board(&(g->board)); engine_draw_piece(&(g->piece_ghost), board); engine_draw_piece(&(g->piece_current), board); if (global.game_next_no > 0) engine_draw_next_pieces(g); if (global.game_can_hold) engine_draw_hold(g); engine_draw_score(g); engine_draw_info(g); break; case PAUSED: engine_draw_board(&(g->board)); engine_draw_pause(); engine_draw_info(g); /* refresh the current time */ break; case GAME_OVER: engine_draw_board(&(g->board)); engine_draw_gameover(); engine_draw_info(g); break; case HELP: engine_draw_board(&(g->board)); engine_draw_info(g); engine_draw_help(); break; case HSCORES: engine_draw_board(&(g->board)); engine_draw_info(g); engine_draw_hscores(); break; default: /* Umm... Nothing, I guess...? */ break; } wnoutrefresh(board); doupdate(); }
/** Deletes all the lines specified by the array #lines. * * @note I know this function's ugly... I'll fix that later */ void board_delete_lines(board_s* b, bool lines[]) { int i, j, k; char clear1, clear2; /* The appearance of the line just before it's deleted */ if (global.theme_clear_line[0] != '\0') { clear1 = global.theme_clear_line[0]; clear2 = global.theme_clear_line[1]; } else { clear1 = ':'; clear2 = ':'; } /* loop through all lines, doing something only on those marked 'true' */ for (k = 0; k < BOARD_HEIGHT; k++) { if (!lines[k]) continue; /* A nice little animation for destroyed lines */ for (i = 0; i < BOARD_WIDTH; i++) { b->block[i][k].theme[0] = clear1; b->block[i][k].theme[1] = clear2; b->block[i][k].color = engine_get_color(WHITE_BLACK, true); } } engine_draw_board(b); wrefresh(engine.screen.board.win); usleep(200 * 1000); for (k = 0; k < BOARD_HEIGHT; k++) { if (!lines[k]) continue; /* Moves all upper lines one row down */ for (j = k; j > 0; j--) { for (i = 0; i < BOARD_WIDTH; i++) { b->block[i][j] = b->block[i][j - 1]; b->block[i][j].y += 1; } } } }