most edit functions are avaliable
authorLaurent Mazet <mazet@softndesign.org>
Sat, 22 Jun 2024 20:10:28 +0000 (22:10 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 22 Jun 2024 20:10:28 +0000 (22:10 +0200)
display.c
display.h
function.c
function.h
gameoflife.c

index 36eb132ecb1cb4665bc17b203d0a3d5d2fb01f02..f52febf674c69c68cc29edee485a4d74541bc1f7 100644 (file)
--- a/display.c
+++ b/display.c
@@ -133,4 +133,19 @@ void boardwindow (board_t *board, int xoffset, int yoffset, int bound)
     }
 }
 
+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: */
index 555fb1973aff69480ae46e49c4f5fd767a5eb60b..f4006db1dfbfdf86a785841168fe6f70a0e7f7d6 100644 (file)
--- a/display.h
+++ b/display.h
@@ -7,6 +7,8 @@ int helpwindow (char *msg, int xoffset, int yoffset);
 
 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: */
index 95ff8fdb5d8ba300ec4885110118dc74a6a3f1d3..6a579c1982e0e1f350ffe566dad9c2ffe0f8ad07 100644 (file)
@@ -220,7 +220,7 @@ void computenextgen (board_t *board)
     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;
 
@@ -260,14 +260,50 @@ void putelement (board_t *board, board_t *element, int x, int y, int rot)
         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: */
index 67c868d48aba7b9ef1f1608cfd7a5955b9b70bac..d7f34e1d8aa80356de66be97c3b762c12235d4fc 100644 (file)
@@ -31,7 +31,11 @@ char *getcell (board_t *board, int x, int y);
 
 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__ */
 
index 691533269eb81e374e3479cb0a5ea4036d1db0dd..28f01dc32f14213d721c9dd38b324301a7707ce1 100644 (file)
@@ -25,18 +25,23 @@ char *version = "0.1";
 
 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)
@@ -129,87 +134,120 @@ int main (int argc, char *argv[])
         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: