diff options
| -rw-r--r-- | cetris.c | 17 | ||||
| -rw-r--r-- | cetris.h | 4 | ||||
| -rw-r--r-- | frontend/ncurses/ncurses_ui.c | 6 |
3 files changed, 20 insertions, 7 deletions
@@ -117,8 +117,8 @@ void move_current(struct cetris_game* g, vec2 offset) { g->current.pos.y -= offset.y;
g->current.pos.x -= offset.x;
- if (check == -1) {
- next_piece(g);
+ if (check == -1 && g->current.lock_tick == 0) {
+ g->current.lock_tick = g->tick + 30;
}
clear_move_queue(g);
@@ -361,7 +361,8 @@ void init_piece_queue(struct cetris_game* g) { }
memcpy(g->piece_queue[i].mat, default_matrices[i], sizeof(piece_matrix));
g->piece_queue[i].r = INIT;
- g->piece_queue[i].pos = (vec2){5, 0};
+ g->piece_queue[i].lock_tick = 0;
+ g->piece_queue[i].pos = (vec2){3, 20}; // y = 22 - 1 for matrix
}
}
@@ -377,6 +378,15 @@ void shuffle_queue(struct cetris_game* g) { void update_game_tick(struct cetris_game* g) {
if ((g->tick % CETRIS_HZ) == 0) move_down(g);
+ if (g->current.lock_tick && g->current.lock_tick <= g->tick) {
+ g->current.pos.y++;
+ if (check_new_matrix(g, g->current.mat) <= 0) {
+ next_piece(g);
+ }
+ g->current.pos.y--;
+ g->current.lock_tick = 0;
+ }
+
enum movements current_move = g->move_queue[g->move_queue_pos];
/* input independedent das movement */
@@ -412,6 +422,7 @@ void update_game_tick(struct cetris_game* g) { did_move = 0;
break;
}
+ //g->current.lock_tick = 0;
if (g->move_queue_count != 0) g->move_queue_pos++;
if (g->move_queue_pos >= 20) clear_move_queue(g);
}
@@ -1,7 +1,8 @@ #pragma once
#define BOARD_X 10
-#define BOARD_Y 20
+#define BOARD_Y 43
+#define BOARD_VISABLE 23
#define CETRIS_HZ 60
#define CETRIS_DAS_DELAY 11
@@ -43,6 +44,7 @@ struct tetrimino { color c;
piece_matrix mat;
vec2 pos;
+ int lock_tick;
};
typedef struct {
diff --git a/frontend/ncurses/ncurses_ui.c b/frontend/ncurses/ncurses_ui.c index 8eef158..9fdc83b 100644 --- a/frontend/ncurses/ncurses_ui.c +++ b/frontend/ncurses/ncurses_ui.c @@ -81,15 +81,15 @@ void curses_init() { void draw_board(struct cetris_game* g) {
mvaddstr(0, 0, PLAY_FIELD_STR);
for (int x = 0; x < BOARD_X; x++) {
- for (int y = 0; y < BOARD_Y; y++) {
+ for (int y = BOARD_VISABLE; y < BOARD_Y; y++) {
if (g->board[x][y].occupied) {
attron(COLOR_PAIR(g->board[x][y].c));
if (g->board[x][y].remove_tick > 0) {
if (g->tick % 2 == 0) {
- mvaddstr(y + 1, x * 2 + X_OFFSET, BLOCK);
+ mvaddstr((y - BOARD_VISABLE) + 1, x * 2 + X_OFFSET, BLOCK);
}
} else {
- mvaddstr(y + 1, x * 2 + X_OFFSET, BLOCK);
+ mvaddstr((y - BOARD_VISABLE) + 1, x * 2 + X_OFFSET, BLOCK);
}
attroff(COLOR_PAIR(g->board[x][y].c));
}
|