}
}
+void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y)
+{
+ int i, j;
+
+ for (i = 0; i < element->xsize; i++) {
+ for (j = 0; j < element->ysize; j++) {
+ if (*getcell (element, i, j) == 'X') {
+ set_color (blue);
+ mvaddch (yoffset + (y + j) % board->ysize, xoffset + (x + i) % board->xsize, ' ');
+ set_color (white);
+ }
+ }
+ }
+}
+
/* vim: set ts=4 sw=4 et: */
void boardwindow (board_t *board, int xboard, int yboard, int bound);
+void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y);
+
#endif /* __DISPLAY_H__ */
/* vim: set ts=4 sw=4 et: */
freeboard (nextboard);
}
-void putelement (board_t *board, board_t *element, int x, int y, int rot)
+void rotateelement (board_t *element, int rot)
{
int i, j;
break;
}
+ strcpy (element->tab, newelement->tab);
+
+ freeboard (newelement);
+}
+
+void mirrorelement (board_t *element, int mode)
+{
+ int i, j;
+
+ if (mode > 0) { /* verticaly */
+ for (i = 0; i < element->xsize; i++) {
+ for (j = 0; j < element->ysize / 2; j++) {
+ char *pt1 = getcell (element, i, j);
+ char *pt2 = getcell (element, i, element->ysize - 1 - j);
+ char temp = *pt1;
+ *pt1 = *pt2;
+ *pt2 = temp;
+ }
+ }
+ }
+ if (mode < 0) { /* horizontaly */
+ for (i = 0; i < element->xsize / 2 ; i++) {
+ for (j = 0; j < element->ysize; j++) {
+ char *pt1 = getcell (element, i, j);
+ char *pt2 = getcell (element, element->xsize - 1 - i, j);
+ char temp = *pt1;
+ *pt1 = *pt2;
+ *pt2 = temp;
+ }
+ }
+ }
+}
+
+void putelement (board_t *board, board_t *element, int x, int y, int mode)
+{
+ int i, j;
+
for (i = 0; i < element->xsize; i++) {
for (j = 0; j < element->ysize; j++) {
- *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = *getcell (newelement, i, j);
+ if (*getcell (element, i, j) != ' ') {
+ *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = (mode) ? 'X' : ' ';
+ }
}
}
-
- freeboard (newelement);
}
-
/* vim: set ts=4 sw=4 et: */
void computenextgen (board_t *board);
-void putelement (board_t *board, board_t *element, int x, int y, int rot);
+void rotateelement (board_t *element, int rot);
+
+void mirrorelement (board_t *element, int mode);
+
+void putelement (board_t *board, board_t *element, int x, int y, int mode);
#endif /* __FUNCTION_H__ */
char *file = NULL;
char mode = '\0';
-int xdefault = 60;
-int ydefault = 20;
+int xoffset = 1;
+int yoffset = 1;
char *help =
- "<i> Move up tile\n"
- "<j> Move left tile\n"
- "<k> Move down tile\n"
- "<l> Move right tile\n"
+ "< > Next generation\n"
+ "<c> Put cells\n"
+ "<d> Mirror up/down\n"
+ "<e> Rotate counter cw\n"
+ "<f> Mirror left/right\n"
+ "<i> Move up cells\n"
+ "<j> Move left cells\n"
+ "<k> Move down cells\n"
+ "<l> Move right cells\n"
"<q> Quit\n"
+ "<r> Rotate clockwise\n"
"<s> Save file\n"
- "<v> Put tile\n"
- "<x> Retrieve tile\n"
+ "<x> Erase cells\n"
;
int usage (int ret)
return 1;
}
+ /* init curses window */
+ initscr ();
+ noecho ();
+ cbreak ();
+ nonl ();
+ keypad (stdscr, TRUE);
+ curs_set (0);
+ start_color ();
+
/* init board */
+ int xmax, ymax;
+ getmaxyx(stdscr, ymax, xmax);
if (xsize <= 0) {
- xsize = xdefault;
+ xsize = xmax - (3 * xoffset + 2 + strmaxlen (help, '\n'));
}
if (ysize <= 0) {
- ysize = ydefault;
+ ysize = ymax - 2 * (yoffset + 1);
}
board_t *board = initboard (xsize, ysize);
+ /* load data */
char *buffer = readdata (file);
board_t *element = NULL;
- int rot = 0;
+ int xelement = 0;
+ int yelement = 0;
if (buffer) {
element = loadboard (buffer);
free (buffer);
- if (board == NULL) {
+ if (element == NULL) {
VERBOSE (ERROR, fprintf (stderr, "incorrect file (%s)\n", file));
return 1;
}
- putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot);
+ xelement = (xsize - element->xsize) / 2;
+ yelement = (ysize - element->ysize) / 2;
}
/* window positions */
- int xboard = 3;
- int yboard = 3;
- int xhelp = xboard + board->xsize + 3;
+ int xboard = xoffset + 1;
+ int yboard = xoffset + 1;
+ int xhelp = xboard + xoffset + 1 + board->xsize;
int yhelp = yboard;
- /* init curses window */
- initscr ();
- noecho ();
- cbreak ();
- nonl ();
- keypad (stdscr, TRUE);
- curs_set (0);
-
- start_color ();
-
+ /* init windows */
helpwindow (help, xhelp, yhelp);
/* event loop */
+ int rotate = 0;
+ int mirror = 0;
int stop = 0;
while (!stop) {
boardwindow (board, xboard, yboard, 1);
+ if (element) {
+ rotateelement (element, rotate);
+ mirrorelement (element, mirror);
+ elementwindow (board, xboard, yboard, element, xelement, yelement);
+ }
+ rotate = 0;
+ mirror = 0;
switch (getch ()) {
+ case ' ':
case '\n':
case '\r':
computenextgen (board);
break;
+ case 'c':
+ if (element) {
+ putelement (board, element, xelement, yelement, 1);
+ }
+ break;
+ case 'd':
+ mirror = -1;
+ break;
+ case 'e':
+ rotate = -1;
+ break;
+ case 'f':
+ mirror = 1;
+ break;
case KEY_UP:
case 'i':
+ yelement = (yelement + board->ysize - 1) % board->ysize;
break;
case KEY_LEFT:
case 'j':
+ xelement = (xelement + board->xsize - 1) % board->xsize;
break;
case KEY_DOWN:
case 'k':
+ yelement = (yelement + 1) % board->ysize;
break;
case KEY_RIGHT:
case 'l':
+ xelement = (xelement + 1) % board->xsize;
break;
case KEY_ESC:
case 'q':
stop = 1;
break;
- case 's':
+ case 'r':
+ rotate = 1;
break;
- case ' ':
- case 'v':
- if (element) {
- cleanboard (board);
- rot = (rot + 1) % 4;
- putelement (board, element, (xsize - element->xsize) / 2, (ysize - element->ysize) / 2, rot);
- }
+ case 's':
+ /* save */
break;
case KEY_BACKSPACE:
case KEY_DELETE:
case 127:
case '\b':
case 'x':
+ if (element) {
+ putelement (board, element, xelement, yelement, 0);
+ }
+ break;
break;
//case ERR:
//default: