diff options
author | Richard Braun <rbraun@sceen.net> | 2025-05-19 23:07:32 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2025-05-19 23:07:32 +0200 |
commit | b3347b6be13139b10b87b97793f2f5ec9243b33a (patch) | |
tree | 473e52630c72d98e86ef3604ac52aa922f021a29 | |
parent | 287416bb25190723d3fe98349ae2e02fda2153d7 (diff) |
Add next piece queue
-rw-r--r-- | src/eetg.c | 8 | ||||
-rw-r--r-- | src/eetg.h | 1 | ||||
-rw-r--r-- | src/et/et.c | 52 | ||||
-rw-r--r-- | src/et/et.h | 6 |
4 files changed, 52 insertions, 15 deletions
@@ -815,14 +815,6 @@ eetg_object_get_height(const struct eetg_object *object) return object->height; } -int -eetg_object_get_layer_id(const struct eetg_object *object) -{ - assert(object); - - return object->layer_id; -} - bool eetg_object_is_empty(const struct eetg_object *object) { @@ -113,7 +113,6 @@ int eetg_object_get_x(const struct eetg_object *object); int eetg_object_get_y(const struct eetg_object *object); int eetg_object_get_width(const struct eetg_object *object); int eetg_object_get_height(const struct eetg_object *object); -int eetg_object_get_layer_id(const struct eetg_object *object); bool eetg_object_is_empty(const struct eetg_object *object); bool eetg_object_move(struct eetg_object *object, int x, int y); bool eetg_object_update(struct eetg_object *object); diff --git a/src/et/et.c b/src/et/et.c index 4319490..d628ac1 100644 --- a/src/et/et.c +++ b/src/et/et.c @@ -43,6 +43,10 @@ #define ET_FRAME_WIDTH 10 #define ET_FRAME_HEIGHT 20 +#define ET_NEXT_QUEUE_HSPACE 10 +#define ET_NEXT_QUEUE_VSPACE 5 +#define ET_NEXT_QUEUE_PIECE_HEIGHT 3 + #define ET_CURRENT_PIECE_SPEED 1 #define ET_LOCKDOWN_DELAY 2 @@ -786,6 +790,31 @@ et_game_end(struct et_game *game) } static void +et_game_repaint_queue(struct et_game *game) +{ + assert(game); + + for (size_t i = 0; i < ARRAY_SIZE(game->next_pieces); i++) { + const struct eetg_world *world; + struct eetg_object *object; + int index, x, y; + + index = (game->next_index + i) % ARRAY_SIZE(game->next_pieces); + x = ET_FRAME_X + (ET_FRAME_WIDTH * 2) + ET_NEXT_QUEUE_HSPACE; + y = ET_FRAME_Y + ET_NEXT_QUEUE_VSPACE + (i * ET_NEXT_QUEUE_PIECE_HEIGHT); + + object = et_piece_get_object(game->next_pieces[index]); + world = eetg_object_get_world(object); + + if (world) { + eetg_object_move(object, x, y); + } else { + eetg_world_add(&game->world, object, x, y, 1); + } + } +} + +static void et_game_switch_to_next_piece(struct et_game *game) { struct eetg_object *object; @@ -794,16 +823,22 @@ et_game_switch_to_next_piece(struct et_game *game) assert(game); - game->current_piece = et_game_get_next_piece(game); + game->current_piece = game->next_pieces[game->next_index]; object = et_piece_get_object(game->current_piece); width = eetg_object_get_width(object) / 2; x = ET_FRAME_X + (((ET_FRAME_WIDTH - width) / 2) * 2); - hit = eetg_world_add(&game->world, object, x, ET_FRAME_Y, 1); + hit = eetg_object_move(object, x, ET_FRAME_Y); if (hit) { et_game_end(game); + return; } + + game->next_pieces[game->next_index] = et_game_get_next_piece(game); + game->next_index = (game->next_index + 1) % ARRAY_SIZE(game->next_pieces); + + et_game_repaint_queue(game); } static bool @@ -933,11 +968,17 @@ et_game_start(struct et_game *game) et_piece_init(&game->pieces[i]); } - game->current_piece = NULL; - game->held_piece = NULL; - et_bag_init(&game->bag); + for (size_t i = 0; i < ARRAY_SIZE(game->next_pieces); i++) { + game->next_pieces[i] = et_game_get_next_piece(game); + } + + et_game_repaint_queue(game); + + game->held_piece = NULL; + game->current_piece = NULL; + eetg_world_add(&game->world, &game->left_wall, ET_FRAME_X - 2, ET_FRAME_Y, 0); eetg_world_add(&game->world, &game->bg, @@ -953,6 +994,7 @@ et_game_start(struct et_game *game) game->gravity_counter = game->gravity_counter_reload; game->lockdown_counter_reload = ET_FPS / ET_LOCKDOWN_DELAY; game->nr_lockdown_moves = -1; + game->next_index = 0; game->state = ET_STATE_PLAYING; } diff --git a/src/et/et.h b/src/et/et.h index 1f86a60..db9dd04 100644 --- a/src/et/et.h +++ b/src/et/et.h @@ -26,6 +26,8 @@ #define ET_FPS 50 +#define ET_NEXT_QUEUE_SIZE 3 + #define ET_STATE_INTRO 0 #define ET_STATE_PREPARED 1 #define ET_STATE_PLAYING 2 @@ -87,14 +89,16 @@ struct et_game { struct eetg_object status; struct et_piece pieces[256]; struct et_bag bag; - struct et_piece *current_piece; + struct et_piece *next_pieces[ET_NEXT_QUEUE_SIZE]; struct et_piece *held_piece; + struct et_piece *current_piece; struct eetg_object end_title; unsigned int score; int8_t gravity_counter_reload; int8_t lockdown_counter_reload; int8_t gravity_counter; int8_t nr_lockdown_moves; + int8_t next_index; int8_t state; int8_t level; int8_t sync_counter_reload; |