#define _nb_blocks_std 12
block_t _blocks_std[_nb_blocks_std] = {
- {3, 3, yellow, " .... . "}, // F
- {1, 5, blue, "...."}, // I
+ {3, 3, yellow, " .... . "}, // F
+ {1, 5, blue, "....."}, // I
{2, 4, lightmagenta, ". . . .."}, // L
- {2, 4, lightblue, " .... . "}, // N
- {2, 3, lightgreen, " ....."}, // P
- {3, 3, lightcyan, "... . . "}, // T
- {3, 2, magenta, ". ...."}, // U
- {3, 3, cyan, ". . ..."}, // V
+ {2, 4, lightblue, " .... . "}, // N
+ {2, 3, lightgreen, " ....."}, // P
+ {3, 3, lightcyan, "... . . "}, // T
+ {3, 2, magenta, ". ...."}, // U
+ {3, 3, cyan, ". . ..."}, // V
{3, 3, lightergreen, ". .. .."}, // W
- {3, 3, red, " . ... . "}, // X
- {2, 4, darkblue, " ... . ."}, // Y
- {3, 3, brown, ".. . .."}, // Z
+ {3, 3, red, " . ... . "}, // X
+ {2, 4, darkblue, " ... . ."}, // Y
+ {3, 3, brown, ".. . .."}, // Z
};
blocks_t *getblocks (char *name)
+#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
board->ysize = board->height = height;
board->xoffset = 0;
board->yoffset = 0;
- board->current = -1;
- board->next = -1;
return board;
}
return l;
}
-char *saveboard (board_t *board)
+char _itoz (int x)
{
- int size = 6 * (8 + 3) + 8 + board->width * board->height + 1;
+ return (x < 10) ? '0' + x : 'A' + x - 10;
+}
+
+int _sprinttab (char *buffer, char *name, int *tab, int nb)
+{
+ int i;
+ int l = sprintf (buffer, "%s: \"", name);
+ for (i = 0; i < nb; i++) {
+ l += sprintf (buffer + l, "%c", _itoz (tab[i]));
+ }
+ l += sprintf (buffer + l, "\"\n");
+ return l;
+}
+
+int _sprintblock (char *buffer, int id, block_t *block)
+{
+ int i;
+ int l = sprintf (buffer, "width[%d]: %d\n", id, block->width);
+ l += sprintf (buffer + l, "height[%d]: %d\n", id, block->height);
+ l += sprintf (buffer + l, "color[%d]: %d\n", id, block->color);
+ l += sprintf (buffer + l, "block[%d]: \"", id);
+ for (i = 0; i < block->width * block->height; i++) {
+ l += sprintf (buffer + l, "%c", block->tab[i]);
+ }
+ l += sprintf (buffer + l, "\"\n");
+ return l;
+}
+
+char *saveboard (board_t *board, blocks_t *blocks)
+{
+ int i;
+ int size = 3 * (8 + 3) + 8 + board->width * board->height + 1;
+ size += 3 * (8 + blocks->nb + 1);
+ for (i = 0; i < blocks->nb; i++) {
+ size += 3 * (13 + 3) + 14 + blocks->block[i]->width * blocks->block[i]->height + 1;
+ }
VERBOSE (INFO, size += board->height * (8 + board->width));
char *buffer = (char *) calloc (size, 1);
int l = sprintf (buffer, "width: %d\n", board->width);
l += sprintf (buffer + l, "height: %d\n", board->height);
l += sprintf (buffer + l, "tab: \"%s\"\n", board->tab);
- l += sprintf (buffer + l, "current: %d\n", board->current);
- l += sprintf (buffer + l, "lines: %d\n", board->lines);
- l += sprintf (buffer + l, "next: %d\n", board->next);
- l += sprintf (buffer + l, "score: %d\n", board->score);
+ l += sprintf (buffer + l, "nb: %d\n", blocks->nb);
+ l += _sprinttab (buffer + l, "x", blocks->x, blocks->nb);
+ l += _sprinttab (buffer + l, "y", blocks->y, blocks->nb);
+ l += _sprinttab (buffer + l, "settle", blocks->settle, blocks->nb);
+ for (i = 0; i < blocks->nb; i++) {
+ l += _sprintblock (buffer + l, i, blocks->block[i]);
+ }
+ assert (l <= size);
VERBOSE (INFO, _makecomments (buffer + l, board));
int width = 0;
int height = 0;
char *tab = NULL;
- int current = -1;
- int lines = 0;
- int next = -1;
- int score = 0;
char *saveptr1, *saveptr2;
height = atoi (value);
} else if (strcmp (keyword, "tab") == 0) {
tab = atos (value);
- } else if (strcmp (keyword, "current") == 0) {
- current = atoi (value);
- } else if (strcmp (keyword, "lines") == 0) {
- lines = atoi (value);
- } else if (strcmp (keyword, "next") == 0) {
- next = atoi (value);
- } else if (strcmp (keyword, "score") == 0) {
- score = atoi (value);
} else if (strcmp (keyword, "rem") == 0) {
/* nothing to do with remark */
} else {
if ((tab) && (strlen (tab) == (size_t)(width * height))) {
board = initboard (width, height);
memcpy (board->tab, tab, width * height);
- board->current = current;
- board->lines = lines;
- board->next = next;
- board->score = score;
}
return board;
int _makecomments (char *buffer, board_t *board);
-char *saveboard (board_t *board);
+char *saveboard (board_t *board, blocks_t *blocks);
int writedata (char *filename, char *data);
}
}
VERBOSE (DEBUG, fprintf (stderr, "block: %dx%d\n", wblock, hblock));
- board_t *bench;
int n = 0;
switch (scale) {
case 0:
n = 3;
break;
}
- bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * yoffset + n * hblock);
+ board_t *bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (n - 1) * yoffset + n * hblock);
VERBOSE (DEBUG, fprintf (stderr, "windows: %dx%d\n", xoffset + (xoffset + wblock) * (blocks->nb + n - 1) / n, (1 + n) * yoffset + n * hblock));
setscale (bench, scale);
- for (i = 0; i < blocks->nb; i++) {
- blocks->x[i] = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2;
- blocks->y[i] = (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2;
- }
/* init curses window */
initscr ();
int ycursor = (board->height - blocks->block[cursor]->height) / 2;
/* window positions (next) */
- board_t *next = initboard (wblock + 2 * xoffset, hblock);
+ board_t *next = initboard (max (wblock, hblock) + 2 * xoffset, max (wblock, hblock));
setscale (next, scale);
int xnext = next->xoffset = xboard + board->xsize + xoffset + 2;
int ynext = next->yoffset = yboard;
/* window positions (bench) */
int xbench = bench->xoffset = xboard;
- int ybench = bench->yoffset = yboard + max (board->ysize, next->ysize) + 1 + yoffset;
+ int ybench = bench->yoffset = max (yboard + board->ysize, ynext + next->ysize) + 1 + yoffset;
/* window positions (help) */
- int xhelp = xbench + bench->xsize + xoffset + 1;
+ int xhelp = max (xbench + bench->xsize, xnext + next->xsize) + xoffset + 1;
int yhelp = yboard - 1;
- int lhelp = helpwindow (help, xhelp, yhelp);
+ helpwindow (help, xhelp, yhelp);
/* window positions (msg) */
int xmsg = xbench;
/* blocks positions */
boardwindow (bench, 1);
for (i = 0; i < blocks->nb; i++) {
- displayblock (bench, blocks->block[i], blocks->x[i], blocks->y[i]);
+ int x = xoffset + (xoffset + wblock) * (i / n) + (wblock - blocks->block[i]->width + 1) / 2;
+ int y = (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2;
+ displayblock (bench, blocks->block[i], x, y);
}
/* event loop */
boardwindow (next, 0);
displayblock (board, block, xcursor, ycursor);
}
- displayblock (next, block, xoffset + (wblock - block->width) / 2, (hblock - block->height) / 2);
+ int x = xoffset + (max (wblock, hblock) - block->width + 1) / 2;
+ int y = (max (wblock, hblock) - block->height) / 2;
+ displayblock (next, block, x, y);
msgwindow ("Can you solve this puzzle?", xmsg, ymsg, lmsg);
break;
case 1:
case 's':
savename = savewindow (savelen, xsave, ysave);
if (savename != NULL) {
- char *ptr = saveboard (board);
+ char *ptr = saveboard (board, blocks);
if (writedata (savename, ptr)) {
VERBOSE (WARNING, printf ("issue writing Board\n"));
}
free (rec);
freeboard (board);
+ freeboard (bench);
+ freeboard (next);
freeblocks (blocks);
return 0;
int ysize;
int xoffset;
int yoffset;
- int current;
- int lines;
- int next;
- int score;
} board_t;
typedef struct {