summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2025-05-19 23:07:32 +0200
committerRichard Braun <rbraun@sceen.net>2025-05-19 23:07:32 +0200
commitb3347b6be13139b10b87b97793f2f5ec9243b33a (patch)
tree473e52630c72d98e86ef3604ac52aa922f021a29
parent287416bb25190723d3fe98349ae2e02fda2153d7 (diff)
Add next piece queue
-rw-r--r--src/eetg.c8
-rw-r--r--src/eetg.h1
-rw-r--r--src/et/et.c52
-rw-r--r--src/et/et.h6
4 files changed, 52 insertions, 15 deletions
diff --git a/src/eetg.c b/src/eetg.c
index 6bc2129..1b317fa 100644
--- a/src/eetg.c
+++ b/src/eetg.c
@@ -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)
{
diff --git a/src/eetg.h b/src/eetg.h
index 2ad9436..aef5916 100644
--- a/src/eetg.h
+++ b/src/eetg.h
@@ -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;