#include #include #include #include "domino.h" #define DIRECTIONS 6 const 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 bricks_append(struct bricks *bricks, struct brick brick) { if (bricks->count+1 > bricks->capacity) { if (bricks->capacity == 0) bricks->capacity = 256; while (bricks->count+1 > bricks->capacity) bricks->capacity *= 2; bricks->items.brick = realloc(bricks->items.brick, bricks->capacity * sizeof(*bricks->items.brick)); } bricks->items.brick[bricks->count++] = brick; } void brick_print(const struct brick b) { struct eye *eyes = (struct eye*) &b; for (size_t i = 0; i < 2; i++) { printf("{.x = %d, .y = %d, .val = %d, .vertical = %d}" , eyes[i].x, eyes[i].y, eyes[i].val, eyes[i].vertical); } printf("\n"); } void brick_previews(const struct brick active, const struct bricks bricks, struct bricks *preview) { 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 && 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 + !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 += 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) || ( (active.front.val != active.back.val) && ((e.val == active.front.val && direction[ii].x < 0) || (e.val == active.back.val && direction[ii].x >= 0)) ) ); } if (!previews[ii].front.val) { previews[ii].front.val = p.front.val; bricks_append(preview, previews[ii]); } } } }