{3, 3, brown, ".. . .."}, // Z
};
-block_t *getblocks (char *name, int *nb)
+blocks_t *getblocks (char *name)
{
block_t *pt = NULL;
+ int nb;
+ int i;
if (strcmp (name, "std") == 0) {
+ nb = _nb_blocks_std;
pt = _blocks_std;
- *nb = _nb_blocks_std;
}
- return pt;
+ blocks_t *blocks = initblocks (nb);
+ for (i = 0; i < nb; i++) {
+ blocks->block[i] = copyblock (pt + i);
+ }
+
+ return blocks;
}
/* board */
board_t *board = NULL;
if (strcmp (name, "6x10") == 0) {
- board = initboard (6, 10);
+ board = initboard (10, 6);
} else if (strcmp (name, "5x12") == 0) {
- board = initboard (5, 12);
+ board = initboard (12, 5);
} else if (strcmp (name, "4x15") == 0) {
- board = initboard (4, 15);
+ board = initboard (15, 4);
} else if (strcmp (name, "3x20") == 0) {
- board = initboard (3, 20);
+ board = initboard (20, 3);
} else if (strcmp (name, "list") == 0) {
printf ("board: 6x10 5x12 4x15 3x20\n");
board = (board_t *)(-1);
/* block definitions */
-block_t *getblocks (char *name, int *nb);
+blocks_t *getblocks (char *name);
board_t *getboard (char *name);
return j;
}
-void _put_color_block (int y, int x, char symb)
+void _element0 (board_t *board, int x, int y, cblock_t color)
{
- switch (symb) {
- case ' ':
- mvaddcb (y, x, black);
- break;
- case '1':
- mvaddcb (y, x, cyan);
- break;
- case '2':
- mvaddcb (y, x, yellow);
- break;
- case '3':
- mvaddcb (y, x, magenta);
- break;
- case '4':
- mvaddcb (y, x, brown);
- break;
- case '5':
- mvaddcb (y, x, blue);
- break;
- case '6':
- mvaddcb (y, x, red);
- break;
- case '7':
- mvaddcb (y, x, green);
- break;
- case '8':
- mvaddcb (y, x, white);
- break;
- }
+ mvaddcb (board->yoffset + y, board->xoffset + x, color);
}
-void _element0 (board_t *board, int x, int y, int symb)
+void _element1 (board_t *board, int x, int y, cblock_t color)
{
- _put_color_block (board->yoffset + y, board->xoffset + x, symb);
+ mvaddcb (board->yoffset + y, board->xoffset + 2 * x, color);
+ mvaddcb (board->yoffset + y, board->xoffset + 2 * x + 1, color);
}
-void _element1 (board_t *board, int x, int y, int symb)
+void _element2 (board_t *board, int x, int y, cblock_t color)
{
- _put_color_block (board->yoffset + y, board->xoffset + 2 * x, symb);
- _put_color_block (board->yoffset + y, board->xoffset + 2 * x + 1, symb);
+ mvaddcb (board->yoffset + 2 * y, board->xoffset + 2 * x, color);
+ mvaddcb (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, color);
+ mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, color);
+ mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, color);
}
-void _element2 (board_t *board, int x, int y, int symb)
+void _element3 (board_t *board, int x, int y, cblock_t color)
{
- _put_color_block (board->yoffset + 2 * y, board->xoffset + 2 * x, symb);
- _put_color_block (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, symb);
- _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, symb);
- _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, symb);
+ mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x, color);
+ mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, color);
+ mvaddcb (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, color);
+ mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, color);
+ mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, color);
+ mvaddcb (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, color);
}
-void _element3 (board_t *board, int x, int y, int symb)
-{
- _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x, symb);
- _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, symb);
- _put_color_block (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, symb);
- _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, symb);
- _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, symb);
- _put_color_block (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, symb);
-}
-
-void _element (board_t *board, int x, int y, int symb)
+void _element (board_t *board, int x, int y, cblock_t color)
{
+ if ((x < 0) || (x >= board->width) || (y < 0) || (y >= board->height)) {
+ return;
+ }
switch (board->scale) {
case 0:
- _element0 (board, x, y, symb);
+ _element0 (board, x, y, color);
break;
case 1:
- _element1 (board, x, y, symb);
+ _element1 (board, x, y, color);
break;
case 2:
- _element2 (board, x, y, symb);
+ _element2 (board, x, y, color);
break;
case 3:
- _element3 (board, x, y, symb);
+ _element3 (board, x, y, color);
break;
}
}
for (i = 0; i < board->width; i++) {
for (j = 0; j < board->height; j++) {
- _element (board, i, j, *getcell (board, i, j));
+ _element (board, i, j, *getcell (board, i, j) - ' ');
}
}
}
{
int i, j;
- if (x == -1) {
- x = board->width / 2;
- }
-
- if (y == -1) {
- y = (board->height - block->height) / 2;
- }
-
for (i = 0; i < block->width; i++) {
for (j = 0; j < block->height; j++) {
if (*getcell (block, i, j) != ' ') {
- _element (board, x - block->width / 2 + i, y + j, '0' + block->color);
+ _element (board, x + i, y + j, block->color);
}
}
}
int helpwindow (char *msg, int xoffset, int yoffset);
-void _put_color_block (int y, int x, char symb);
-
-void _element0 (board_t *board, int x, int y, int symb);
-
-void _element1 (board_t *board, int x, int y, int symb);
-
-void _element2 (board_t *board, int x, int y, int symb);
-
-void _element3 (board_t *board, int x, int y, int symb);
-
-void _element (board_t *board, int x, int y, int symb);
-
void boardwindow (board_t *board, int mode);
void displayblock (board_t *board, block_t *block, int x, int y);
return block;
}
+blocks_t *initblocks (int nb)
+{
+ blocks_t *blocks = (blocks_t *) calloc (1, sizeof (blocks_t));
+ CHECKALLOC (blocks);
+
+ blocks->nb = nb;
+ blocks->x = (int *) calloc (nb, sizeof (int));
+ CHECKALLOC (blocks->x);
+ blocks->y = (int *) calloc (nb, sizeof (int));
+ CHECKALLOC (blocks->y);
+ blocks->block = (block_t **) calloc (nb, sizeof (block_t *));
+ CHECKALLOC (blocks->block);
+
+ return (blocks);
+}
+
+void freeblocks (blocks_t *blocks)
+{
+ int i;
+ for (i = 0; i < blocks->nb; i++) {
+ freeblock (blocks->block[i]);
+ }
+ free (blocks->x);
+ free (blocks->y);
+ free (blocks->block);
+ free (blocks);
+}
+
/* vim: set ts=4 sw=4 et: */
block_t *rotateblock (block_t *block, int rot);
+blocks_t *initblocks (int nb);
+
+void freeblocks (blocks_t *blocks);
+
#endif /* __FUNCTION_H__ */
/* vim: set ts=4 sw=4 et: */
/* main function */
int main (int argc, char *argv[])
{
+ int i;
/* get basename */
char *pt = progname = argv[0];
return 1;
}
- /* load playground */
+ /* load playground or define it */
board_t *board = NULL;
if (filename) {
char *buffer = readdata (filename);
VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", filename));
return 1;
}
- } else if (boardname) {
+ } else {
board = getboard (boardname);
if (board == (board_t *)(-1)) {
return 0;
}
setscale (board, scale);
+ /* gets blocks */
+ blocks_t *blocks = getblocks ("std");
+
+ /* define work bench */
+ int wblock = 0;
+ int hblock = 0;
+ for (i = 0; i < blocks->nb; i++) {
+ block_t *block = blocks->block[i];
+ if (wblock < block->width) {
+ wblock = block->width;
+ }
+ if (hblock < block->height) {
+ hblock = block->height;
+ }
+ }
+ VERBOSE (DEBUG, fprintf (stderr, "block: %dx%d\n", wblock, hblock));
+ board_t *bench;
+ int n = 0;
+ switch (scale) {
+ case 0:
+ n = 1;
+ break;
+ case 1:
+ case 2:
+ n = 2;
+ break;
+ case 3:
+ n = 3;
+ break;
+ }
+ bench = initboard (xoffset + (xoffset + wblock) * (blocks->nb) / n, (1 + n) * 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 + (yoffset + hblock) * (i % n) + (hblock - blocks->block[i]->height + 1) / 2;
+ }
+
/* init curses window */
initscr ();
noecho ();
int xboard = board->xoffset = xoffset + 1;
int yboard = board->yoffset = xoffset + 1;
int xhelp = xboard + xoffset + 1 + board->xsize;
- int xcursor = 0;
- int ycursor = 0;
+ int xcursor = board->width / 2;
+ int ycursor = board->height / 2;
+ int cursor = 0;
int yhelp = yboard - 1;
int xsave = max (xboard + (board->xsize - savelen) / 2, 1);
int ysave = yboard + (board->ysize - 1) / 2;
+
char *savename = NULL;
/* help window */
int lhelp = helpwindow (help, xhelp, yhelp);
/* window positions */
- int xmsg = xboard;
- int ymsg = max (yboard + xoffset + 1 + board->ysize, yhelp + lhelp + yoffset + 1);
+ int xblocks = bench->xoffset = xboard;
+ int yblocks = bench->yoffset = max (yboard + board->ysize + 1, yhelp + lhelp) + yoffset + 1;
+ int xmsg = xblocks;
+ int ymsg = yblocks + yoffset + 2;
int lmsg = xhelp - xmsg + strmaxlen (help, '\n');
+ /* blocks positions */
+ /* event loop */
+ int stop = 0;
+ while (!stop) {
+ boardwindow (board, 0);
+ boardwindow (bench, 0);
+ for (i = 0; i < blocks->nb; i++) {
+ displayblock (bench, blocks->block[i], blocks->x[i], blocks->y[i]);
+ VERBOSE (DEBUG, fprintf (stderr, "block %d: %dx%d (%d, %d)\n", i, blocks->block[i]->width, blocks->block[i]->height, blocks->x[i], blocks->y[i]));
+ }
+ block_t *block = blocks->block[cursor];
+ displayblock (board, block, xcursor, ycursor);
+ if (1) { //if (!endofgame (board)) {
+ // cursorwindow (board, xcursor, ycursor, mode);
+ } else {
+ msgwindow ("End of game", xmsg, ymsg, lmsg);
+ }
+ int ch = getch ();
+ switch (ch) {
+ case ' ':
+ case 'u':
+ cursor++;
+ if (cursor >= blocks->nb) {
+ cursor = 0;
+ }
+ case '\n':
+ case '\r':
+ case 'o':
+ break;
+ case KEY_UP:
+ case 'i':
+ if (ycursor > - (block->height + 0) / 2) {
+ ycursor--;
+ }
+ break;
+ case KEY_LEFT:
+ case 'j':
+ if (xcursor > - (block->width + 0) / 2) {
+ xcursor--;
+ }
+ break;
+ case KEY_DOWN:
+ case 'k':
+ VERBOSE (DEBUG, fprintf (stderr, "DOWN: %d %d\n", ycursor, board->height - (block->height) / 1 + (block->height % 2 ? 0 : 1)));
+ if (ycursor < board->height - (block->height + 1) / 2) {
+ ycursor++;
+ }
+ break;
+ case KEY_RIGHT:
+ case 'l':
+ VERBOSE (DEBUG, fprintf (stderr, "RIGHT: %d %d\n", xcursor, board->width - (block->width) / 1 + (block->width % 2 ? 0 : 1)));
+ if (xcursor < board->width - (block->width + 1) / 2) {
+ xcursor++;
+ }
+ break;
+ case KEY_ESC:
+ case 'q':
+ stop = 1;
+ break;
+ case 's':
+ savename = savewindow (savelen, xsave, ysave);
+ if (savename != NULL) {
+ char *ptr = saveboard (board);
+ if (writedata (savename, ptr)) {
+ VERBOSE (WARNING, printf ("issue writing Board\n"));
+ }
+ free (ptr);
+ free (savename);
+ }
+ break;
+ case KEY_BACKSPACE:
+ case KEY_DELETE:
+ case 127:
+ case '\b':
+ break;
+ //case ERR:
+ //default:
+ }
+ }
+ /* cleaning before quiting */
endwin ();
freeboard (board);
char *tab;
} block_t;
+typedef struct {
+ int nb;
+ int *x;
+ int *y;
+ block_t **block;
+} blocks_t;
+
#endif /* __TYPE_H__ */
/* vim: set ts=4 sw=4 et: */