summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororangerot <orangerot@orangerot.dev>2025-10-15 12:18:10 +0200
committerorangerot <orangerot@orangerot.dev>2025-10-15 12:18:10 +0200
commit001b91e335b90d5a0c8557f8d88377613d163c33 (patch)
treee430e7e2635bf5151fac7cc92bfb3b2ef301e6d7
parentfd1b446f5a5dba76b90377091c6b172b4fa4bd93 (diff)
fix: preview
-rw-r--r--domino.h2
-rw-r--r--game.c40
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: