{
switch (symb) {
case ' ':
- set_color (black);
- break;
- case '.':
set_color (white);
break;
- case '/':
- set_color (byellow);
- break;
- case '0':
- case '6':
- set_color (wgreen);
- break;
case '1':
- case '7':
- set_color (wred);
+ set_color (black);
break;
case '2':
- case '8':
- set_color (green);
+ set_color (wred);
break;
case '3':
- case '9':
- set_color (red);
+ set_color (wgreen);
break;
case '4':
- case ':':
- set_color (bgreen);
+ set_color (wblue);
break;
case '5':
- case ';':
- set_color (bred);
+ set_color (wcyan);
break;
- case 'S':
- set_color (byellow);
+ case '6':
+ set_color (wmagenta);
break;
- case 'Z':
- set_color (bblue);
+ case '7':
+ set_color (wyellow);
break;
}
}
void _element0 (board_t *board, int x, int y, int symb)
{
- int element = ' ';
- switch (symb) {
- case '/':
- element = 'X';
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- element = '0';
- break;
- case '6':
- case '7':
- case '8':
- case '9':
- case ':':
- case ';':
- element = ACS_DIAMOND;
- break;
- }
_set_symb_color (symb);
- mvaddch (board->yoffset + y, board->xoffset + x, element);
+ mvaddch (board->yoffset + y, board->xoffset + x, ' ');
set_color (white);
}
void _element1 (board_t *board, int x, int y, int symb)
{
- int element0 = ' ';
- int element1 = ' ';
- switch (symb) {
- case '/':
- element0 = '>';
- element1 = '<';
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- element0 = '[';
- element1 = ']';
- break;
- case '6':
- case '7':
- case '8':
- case '9':
- case ':':
- case ';':
- element0 = '<';
- element1 = '>';
- break;
- }
_set_symb_color (symb);
- mvaddch (board->yoffset + y, board->xoffset + 2 * x, element0);
- mvaddch (board->yoffset + y, board->xoffset + 2 * x + 1, element1);
+ mvaddch (board->yoffset + y, board->xoffset + 2 * x, ' ');
+ mvaddch (board->yoffset + y, board->xoffset + 2 * x + 1, ' ');
set_color (white);
}
void _element2 (board_t *board, int x, int y, int symb)
{
- int element00 = ' ';
- int element10 = ' ';
- int element01 = ' ';
- int element11 = ' ';
- switch (symb) {
- case '/':
- element00 = '\\';
- element01 = '/';
- element10 = '/';
- element11 = '\\';
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- element00 = ACS_ULCORNER;
- element01 = ACS_URCORNER;
- element10 = ACS_LLCORNER;
- element11 = ACS_LRCORNER;
- break;
- case '6':
- case '7':
- case '8':
- case '9':
- case ':':
- case ';':
- element00 = '/';
- element01 = '\\';
- element10 = '\\';
- element11 = '/';
- break;
- }
_set_symb_color (symb);
- mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, element00);
- mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, element01);
- mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, element10);
- mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, element11);
+ mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, ' ');
+ mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x + 1, ' ');
+ mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x, ' ');
+ mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 2 * x + 1, ' ');
set_color (white);
}
void _element3 (board_t *board, int x, int y, int symb)
{
- int element00 = ' ';
- int element10 = ' ';
- int element01 = ' ';
- int element11 = ' ';
- int element02 = ' ';
- int element12 = ' ';
- switch (symb) {
- case '/':
- element00 = '\\';
- element01 = '|';
- element02 = '/';
- element10 = '/';
- element11 = '|';
- element12 = '\\';
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- element00 = ACS_ULCORNER;
- element01 = ACS_HLINE;
- element02 = ACS_URCORNER;
- element10 = ACS_LLCORNER;
- element11 = ACS_HLINE;
- element12 = ACS_LRCORNER;
- break;
- case '6':
- case '7':
- case '8':
- case '9':
- case ':':
- case ';':
- element00 = '/';
- element01 = 'T';
- element02 = '\\';
- element10 = '\\';
- element11 = '_';
- element12 = '/';
- break;
- }
_set_symb_color (symb);
- mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x, element00);
- mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, element01);
- mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, element02);
- mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, element10);
- mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, element11);
- mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, element12);
+ mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x, ' ');
+ mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 1, ' ');
+ mvaddch (board->yoffset + 2 * y, board->xoffset + 3 * x + 2, ' ');
+ mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x, ' ');
+ mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 1, ' ');
+ mvaddch (board->yoffset + 2 * y + 1, board->xoffset + 3 * x + 2, ' ');
set_color (white);
}
_dobound (board->xsize, board->ysize, board->xoffset, board->yoffset);
set_color (white);
- for (i = 0; i < board->width; i++) {
+ for (i = 0; i < board->width; i++) {
for (j = 0; j < board->height; j++) {
- _element (board, i, j, getvalue (board, i, j));
+ _element (board, i, j, *getcell (board, i, j));
+ }
+ }
+}
+
+void displayblock (board_t *board, block_t *block, int x, int y)
+{
+ int i, j;
+ for (i = 0; i < block->width; i++) {
+ for (j = 0; j < block->height; j++) {
+ if (*getcell (block, i, j) != ' ') {
+ _element (board, x + i, y + j, '0' + block->color);
+ }
}
}
}
void boardwindow (board_t *board);
+void displayblock (board_t *board, block_t *block, int x, int y);
+
char *savewindow (int length, int xoffset, int yoffset);
void msgwindow (char *msg, int xoffset, int yoffset, int length);
free (block);
}
-block_t *rotateelement (block_t *element, int rot)
+block_t *rotateblock (block_t *block, int rot)
{
int i, j;
rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
- block_t *newelement = NULL;
+ block_t *newblock = NULL;
switch (rot) {
case 0:
- newelement = copyblock (element);
+ newblock = copyblock (block);
break;
case 1:
- newelement = initblock (element->height, element->width);
- for (i = 0; i < element->width; i++) {
- for (j = 0; j < element->height; j++) {
- *getcell (newelement, element->height - 1 - j, i) = *getcell (element, i, j);
+ newblock = initblock (block->height, block->width);
+ for (i = 0; i < block->width; i++) {
+ for (j = 0; j < block->height; j++) {
+ *getcell (newblock, block->height - 1 - j, i) = *getcell (block, i, j);
}
}
break;
case 2:
- newelement = initblock (element->width, element->height);
- for (i = 0; i < element->width; i++) {
- for (j = 0; j < element->height; j++) {
- *getcell (newelement, element->width - 1 - i, element->height - 1 - j) = *getcell (element, i, j);
+ newblock = initblock (block->width, block->height);
+ for (i = 0; i < block->width; i++) {
+ for (j = 0; j < block->height; j++) {
+ *getcell (newblock, block->width - 1 - i, block->height - 1 - j) = *getcell (block, i, j);
}
}
break;
case 3:
- newelement = initblock (element->height, element->width);
- for (i = 0; i < element->width; i++) {
- for (j = 0; j < element->height; j++) {
- *getcell (newelement, j, element->width - 1 - i) = *getcell (element, i, j);
+ newblock = initblock (block->height, block->width);
+ for (i = 0; i < block->width; i++) {
+ for (j = 0; j < block->height; j++) {
+ *getcell (newblock, j, block->width - 1 - i) = *getcell (block, i, j);
}
}
break;
}
- changeblock (element, newelement);
- freeblock (newelement);
+ changeblock (block, newblock);
+ freeblock (newblock);
- return element;
+ return block;
}
/* vim: set ts=4 sw=4 et: */
#define getcell(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y);_b->tab + _x + _b->width * _y; })
-#define getvalue(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y); (_x >= 0) && (_x < _b->width) && (_y >= 0) && (_y < _b->height) ? *getcell (_b, _x, _y) : 0; })
+#define getvalue(b, x, y) ({ __typeof__ (b) _b = (b); int _x = (x), _y = (y); (_x >= 0) && (_x < _b->width) && (_y >= 0) && (_y < _b->height) ? *(getcell (_b, _x, _y)) : 0; })
block_t *initblock (int xsize, int ysize);
void freeblock (block_t *block);
-block_t *rotateelement (block_t *element, int rot);
+block_t *rotateblock (block_t *block, int rot);
#endif /* __FUNCTION_H__ */
/* get blocks */
int nb_blocks = 0;
- block_t *block_t = getblocks ("std", &nb_blocks);
+ block_t *blocks = getblocks ("std", &nb_blocks);
int current = rand () % nb_blocks;
+ block_t *cblock = copyblock (blocks + current);
+ int xblock = (board->width - cblock->width) / 2;
+ int yblock = 0;
int next = rand () % nb_blocks;
+ VERBOSE (DEBUG, fprintf (stderr, "%d/%d: (%d, %d)\n", current, nb_blocks, xblock, yblock));
/* init curses window */
initscr ();
/* event loop */
int mode = 0;
int speed = 255;
-
+ int rot = 0;
int stop = 0;
while (!stop) {
char msg[128] = {0};
switch (mode) {
case 0:
+freeblock (cblock);
+current = next;
+cblock = copyblock (blocks + current);
+xblock = (board->width - cblock->width) / 2;
+yblock = 0;
+next = rand () % nb_blocks;
+sprintf (msg, "%d/%d: (%d, %d)\n", current, nb_blocks, xblock, yblock);
halfdelay (0);
- sprintf (msg, "Get ready player One");
+ //sprintf (msg, "Get ready player One");
break;
case 1:
halfdelay (speed);
+ rotateblock (cblock, rot);
+ displayblock (board, cblock, xblock, yblock);
+ rot = 0;
break;
}
msgwindow (msg, xmsg, ymsg, lmsg);
case ' ':
case 'i':
case 'o':
+ rot = 1;
break;
case 'p':
mode = (mode == 0) ? 1 : 0;
case 127:
case '\b':
case 'u':
+ rot = -1;
break;
//case ERR:
//default: