From 001b91e335b90d5a0c8557f8d88377613d163c33 Mon Sep 17 00:00:00 2001 From: orangerot Date: Wed, 15 Oct 2025 12:18:10 +0200 Subject: [PATCH] fix: preview --- domino.h | 2 +- game.c | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/domino.h b/domino.h index 4cf02b9..31f3084 100644 --- a/domino.h +++ b/domino.h @@ -4,7 +4,7 @@ #define DOMINO_H struct eye { - size_t x,y,val,vertical; + int x,y,val,vertical; }; struct brick { diff --git a/game.c b/game.c index 4d00c57..35e7fa7 100644 --- a/game.c +++ b/game.c @@ -27,40 +27,52 @@ bool has_active = 0; struct brick preview[256] = {0}; size_t preview_count = 0; -struct eye direction[4] = { +#define DIRECTIONS 6 +struct eye direction[DIRECTIONS] = { {.x = 0, .y = -1}, {.x = -2, .y = 0}, {.x = 1, .y = 0}, {.x = 0, .y = 1}, + {.x = -1, .y = -1}, + {.x = -1, .y = 1}, }; void get_prewiews() { preview_count = 0; for (size_t i = 0; i < bricks.count * 2; i++) { struct eye e = bricks.items.eye[i]; - if (e.val != active.front.val) continue; + if (e.val != active.front.val && e.val != active.back.val) continue; struct brick p = active; + p.front.x = e.x; p.front.y = e.y; - p.back.x = e.x + 1; - p.back.y = e.y; - struct brick previews[4] = {p, p, p, p}; - for (size_t ii = 0; ii < 4; ii++) { - previews[ii].front.x += direction[ii].x; - previews[ii].front.y += direction[ii].y; + p.back.x = e.x + !active.front.vertical; + p.back.y = e.y + active.front.vertical; + + struct brick previews[DIRECTIONS] = {0}; + for (size_t ii = 0; ii < DIRECTIONS; ii++) { + int offset_x = active.front.vertical ? direction[ii].y : direction[ii].x; + int offset_y = active.front.vertical ? direction[ii].x : direction[ii].y; + previews[ii] = p; + previews[ii].front.x += offset_x; + previews[ii].front.y += offset_y; previews[ii].front.val = 0; - previews[ii].back.x += direction[ii].x; - previews[ii].back.y += direction[ii].y; + previews[ii].back.x += offset_x; + previews[ii].back.y += offset_y; for (size_t iii = 0; iii < bricks.count * 2; iii++) { - previews[ii].front.val |= ((bricks.items.eye[iii].x == previews[ii].back.x && bricks.items.eye[iii].y == previews[ii].back.y) || - (bricks.items.eye[iii].x == previews[ii].front.x && bricks.items.eye[iii].y == previews[ii].front.y)); + previews[ii].front.val |= ( + (bricks.items.eye[iii].x == previews[ii].back.x && bricks.items.eye[iii].y == previews[ii].back.y) || + (bricks.items.eye[iii].x == previews[ii].front.x && bricks.items.eye[iii].y == previews[ii].front.y) + || (e.val == active.front.val && direction[ii].x < 0) + || (e.val == active.back.val && direction[ii].x >= 0) + ); } } - for (size_t ii = 0; ii < 4; ii++) { + for (size_t ii = 0; ii < DIRECTIONS; ii++) { if (!previews[ii].front.val) preview[preview_count++] = previews[ii]; } @@ -86,9 +98,9 @@ void key_callback(int key, int scancode, int action, int mods) { struct eye tmp = active.front; active.front.val = active.back.val; active.back.val = tmp.val; - get_prewiews(); } active.front.vertical = !active.front.vertical; + get_prewiews(); printf("rotate\n"); break; case GLFW_KEY_ENTER: