break;
case '*': /* box docked */
case '+': /* sokoban on dock */
- set_color (cyan);
+ set_color (blue);
break;
case '@': /* sokoban */
set_color (green);
case '*': /* box docked */
element = ACS_DIAMOND;
break;
+ case '@': /* sokoban */
+ case '+': /* sokoban on dock */
+ element = 'O';
+ break;
case '.': /* empty dock */
- element = 'X';
+ element = 'x';
break;
}
_set_symb_color (symb);
switch (symb) {
case '$':
case '*':
- element0 = ACS_LARROW;
- element1 = ACS_RARROW;
+ element0 = '<';
+ element1 = '>';
+ break;
+ case '@':
+ case '+':
+ element0 = ACS_LTEE;
+ element1 = ACS_RTEE;
break;
case '.':
- element0 = '-';
- element1 = '-';
+ element0 = ACS_HLINE;
+ element1 = ACS_HLINE;
}
_set_symb_color (symb);
mvaddch (board->yoffset + y, board->xoffset + 2 * x, element0);
element10 = ACS_LLCORNER;
element11 = ACS_LRCORNER;
break;
+ case '@':
+ case '+':
+ element00 = 'O';
+ element01 = ' ';
+ element10 = ACS_LTEE;
+ element11 = ACS_URCORNER;
+ break;
case '.':
- element00 = '.';
- element01 = '.';
- element10 = '.';
- element11 = '.';
+ element00 = ACS_PLUS;
+ element01 = ACS_PLUS;
+ element10 = ACS_PLUS;
+ element11 = ACS_PLUS;
}
_set_symb_color (symb);
mvaddch (board->yoffset + 2 * y, board->xoffset + 2 * x, element00);
element11 = ACS_HLINE;
element12 = ACS_LRCORNER;
break;
- case '.':
- element00 = ACS_VLINE;
+ case '@':
+ case '+':
+ element00 = 'O';
element01 = ' ';
element02 = ACS_VLINE;
- element10 = ACS_LLCORNER;
- element11 = ACS_HLINE;
- element12 = ACS_LRCORNER;
+ element10 = ACS_LTEE;
+ element11 = ACS_URCORNER;
+ element12 = ACS_LLCORNER;
+ break;
+ case '.':
+ element00 = ACS_PLUS;
+ element01 = ACS_PLUS;
+ element02 = ACS_PLUS;
+ element10 = ACS_PLUS;
+ element11 = ACS_PLUS;
+ element12 = ACS_PLUS;
break;
}
_set_symb_color (symb);
}
/* check 2 next positions in line */
- int rc = 1;
+ int rc = 0;
char next = getvalue (board, pt->x + move->x, pt->y + move->y);
char next2 = getvalue (board, pt->x + 2 * move->x, pt->y + 2 * move->y);
switch (next) {
switch (next2) {
case ' ':
*getcell (board, pt->x + 2 * move->x, pt->y + 2 * move->y) = '$';
+ rc = 1;
break;
case '.':
*getcell (board, pt->x + 2 * move->x, pt->y + 2 * move->y) = '*';
+ rc = 1;
break;
- default:
- rc = 0;
}
}
}
/* move sokoban */
+ next = getvalue (board, pt->x + move->x, pt->y + move->y);
switch (next) {
case ' ':
*getcell (board, pt->x + move->x, pt->y + move->y) = '@';
*getcell (board, pt->x + move->x, pt->y + move->y) = '+';
rc = 1;
break;
- default:
- rc = 0;
}
/* clean old sokoban position */
return rc;
}
-void _findsokoban (board_t *board, point *pt)
+int _findelements (board_t *board, char *symbs, point *pt)
{
- int x, y;
- for (x = 0; x < board->width; x++) {
- for (y = 0; y < board->height; y++) {
- switch (getvalue (board, x, y)) {
- case '@':
- case '+':
- pt->x = x;
- pt->y = y;
- break;
+ char *str = NULL;
+ while (*symbs) {
+ str = strchr (board->tab, *symbs++);
+ if (str != NULL) {
+ int i = (int)(str - board->tab);
+ if (pt) {
+ pt->x = i % board->width;
+ pt->y = i / board->width;
}
+ break;
}
}
+ return (str != NULL);
}
void movesokoban (board_t *board, int dir)
{
point sokoban = {-1, -1};
- _findsokoban (board, &sokoban);
- if (sokoban.x != -1) {
+ if (_findelements (board, "@+", &sokoban)) {
_moveelements (board, &sokoban, dir);
}
}
+int endofgame (board_t *board)
+{
+ return (!_findelements (board, ".+", NULL));
+}
+
/* vim: set ts=4 sw=4 et: */