wide board mode
authorLaurent Mazet <mazet@softndesign.org>
Wed, 11 Sep 2024 22:31:29 +0000 (00:31 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Wed, 11 Sep 2024 22:31:29 +0000 (00:31 +0200)
display.c
display.h
function.c
function.h
oneplayer.c
oneplayer.h
tetris.c

index 509ca09727ccc99f8737cd97ab88843f5e8fe776..e82fbf21ae2afbde8411de2658335d861de122d9 100644 (file)
--- a/display.c
+++ b/display.c
@@ -183,7 +183,8 @@ void scorewindow (int xoffset, int yoffset, int length, int score, int score2, i
     }
     mvaddstr (yoffset, xoffset, msg);
 
-    sprintf (msg, " level: % 3d", level);
+    sprintf (msg, " level: ");
+    sprintf (msg + strlen (msg), fmt, level);
     mvaddstr (yoffset + 1, xoffset, msg);
 }
 
@@ -294,6 +295,13 @@ void msgwindow (char *msg, int xoffset, int yoffset, int length)
     setcolor (black_gray);
 }
 
+void msg2window (char *msg, int xoffset, int yoffset)
+{
+    int length = strlen (msg) + 2;
+    xoffset -= length / 2;
+    msgwindow (msg, xoffset, yoffset, length);
+}
+
 void removelines (board_t *board, int nblines, int tempo)
 {
     while (nblines-- > 0) {
@@ -318,9 +326,9 @@ int reparenextturn (board_t *board, block_t *blocks, int nb_blocks, block_t **pb
     int mode = 1;
     if (!testvalidpos (board, blocks + *pnext, board->width / 2, 0)) {
         if (player == 0) {
-            sprintf (msg, "To bad, you loose. Score is %d", *scores);
+            sprintf (msg, "Too bad, you loose");
         } else {
-            sprintf (msg, "To bad, %s. Score is %d / %d", (player == 1) ? "player One losses" : "player Two losses", scores[0], scores[1]);
+            sprintf (msg, "Too bad, %s. Score is %d / %d", (player == 1) ? "player One losses" : "player Two losses", scores[0], scores[1]);
         }
         mode = 2;
     } else {
index 2b3db4cce912cac9ec4484f9b3341160072a1224..0503f665d2e0b22d07ed1b597482f43d306812a8 100644 (file)
--- a/display.h
+++ b/display.h
@@ -18,6 +18,8 @@ char *savewindow (int length, int xoffset, int yoffset);
 
 void msgwindow (char *msg, int xoffset, int yoffset, int length);
 
+void msg2window (char *msg, int xoffset, int yoffset);
+
 void removelines (board_t *board, int nblines, int tempo);
 
 int processsettlement (board_t *board, block_t *block, int xblock, int yblock, int *pscore, int *plines, int tempo);
index c9609fef5ec26f223ed3834e4ab210959c5a25de..1550b671e070ec5e1cf84ee13c4f08fdabc830fb 100644 (file)
@@ -63,6 +63,35 @@ board_t *setscale (board_t *board, int scale)
     return board;
 }
 
+board_t *applyscale (board_t *board, int scale)
+{
+    board->scale = scale;
+    switch (scale) {
+    case 0:
+        board->width = board->xsize;
+        board->height = board->ysize;
+        break;
+    case 1:
+        board->width = board->xsize / 2;
+        board->xsize = board->width * 2;
+        board->height = board->ysize;
+        break;
+    case 2:
+        board->width = board->xsize / 2;
+        board->xsize = board->width * 2;
+        board->height = board->ysize / 2;
+        board->ysize = board->height * 2;
+        break;
+    case 3:
+        board->width = board->xsize / 3;
+        board->xsize = board->width * 3;
+        board->height = board->ysize / 2;
+        board->ysize = board->height * 2;
+        break;
+    }
+    return board;
+}
+
 void freeboard (board_t *board)
 {
     if (board) {
index 1cb906564b976a5762521920ea5f5330d5e8a89f..88cf8fa2f32a3e2433117cb73a539d5b7a61481d 100644 (file)
@@ -25,6 +25,8 @@ board_t *initplay (board_t *board);
 
 board_t *setscale (board_t *board, int scale);
 
+board_t *applyscale (board_t *board, int scale);
+
 void freeboard (board_t *board);
 
 char *saveboard (board_t *board);
index 29405c6018881736d82e0fcf2567d60d42e56620..ea5b61958027b8b921d71f240dd0401cff87a8d1 100644 (file)
@@ -27,7 +27,7 @@ static int computetempo (int lines)
 }
 
 /* main function for one player*/
-int oneplayer (int width, int height, int scale, int chrono, char *filename)
+int oneplayer (int width, int height, int scale, int wide, int chrono, char *filename)
 {
 
     /* init all variables */
@@ -38,6 +38,7 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
     int score = 0;
 
     /* read file */
+    int whelp = strmaxlen (help, '\n');
     if (filename) {
         char *buffer = readdata (filename);
         if (buffer == NULL) {
@@ -54,10 +55,8 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
         lines = board->lines;
         next = board->next;
         score = board->score;
-    } else {
-        board = initboard (width, height);
+        setscale (board, scale);
     }
-    setscale (board, scale);
 
     /* get blocks */
     int nb_blocks = 0;
@@ -66,10 +65,6 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
                                     maxblockheight (blocks, nb_blocks) + 2);
     setscale (nextblock, scale);
 
-    /* get first bloc */
-    int xblock, yblock;
-    block_t *cblock = drawblock (board, blocks, nb_blocks, NULL, &current, &xblock, &yblock, &next);
-
     /* init curses window */
     initscr ();
     noecho ();
@@ -79,26 +74,48 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
     curs_set (0);
     start_color ();
 
+    /* load playground */
+    if (!filename) {
+        if (wide) {
+            int w0board = COLS - 2 * (xoffset + 1);
+            int h0board = LINES - 3 - 2 * (yoffset + 1);
+            board = initboard (w0board, h0board);
+            applyscale (board, scale);
+        } else {
+            board = initboard (width, height);
+            setscale (board, scale);
+        }
+    }
+
+    /* get first bloc */
+    int xblock, yblock;
+    block_t *cblock = drawblock (board, blocks, nb_blocks, NULL, &current, &xblock, &yblock, &next);
+
     /* window positions */
     int xboard = board->xoffset = xoffset + 1;
-    int yboard = board->yoffset = xoffset + 1;
-    int xscore = xboard + xoffset + 2 + board->xsize;
-    int yscore = yboard;
+    int yboard = board->yoffset = yoffset + 1 + (wide ? 2 : 0);
+    int xscore = xboard + 2 + (wide ? -1 : xoffset + board->xsize);
+    int yscore = yboard - (wide ? 3 : 0);
+    int wscore = (wide ? 16 : whelp - 2);
     nextblock->xoffset = xscore + (9 + nbdigit + 1 - nextblock->xsize) / 2;
     int ynext = nextblock->yoffset = yscore + 1 + 2 + yoffset;
-    int xhelp = xscore - 1;
-    int yhelp = ynext + nextblock->ysize + yoffset;
+    int xhelp = (wide ? xboard + (board->xsize - 1) / 2 : xscore - 1);
+    int yhelp = (wide ? yboard + (board->ysize - 1) / 2 : ynext + nextblock->ysize + yoffset);
     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);
+    int lhelp = 0;
+    if (!wide) {
+        lhelp = helpwindow (help, xhelp, yhelp);
+    }
 
-    /* window positions */
-    int xmsg = xboard;
-    int ymsg = max (yboard + xoffset + 1 + board->ysize, yhelp + lhelp + yoffset);
-    int lmsg = xhelp - xmsg + strmaxlen (help, '\n');
+    /* window positions (msg) */
+    int lmsg = (wide ? 24 : whelp - 2);
+    int xmsg = (wide ? xboard + board->xsize - lmsg - 1 : xboard);
+    int ymsg = (wide ? yboard + board->ysize + 1 : yhelp + lhelp + 1 + xoffset);
 
     /* event loop */
     int mode = -1;
@@ -110,23 +127,32 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
     timeval_t lineend = {0, 0};
     while (!stop) {
         char msg[128] = {0};
+        char msg2[128] = {0};
         msgwindow (msg, xmsg, ymsg, lmsg);
 
         switch (mode) {
         case -1:
-            boardwindow (nextblock, 1);
-            displayblock (nextblock, blocks + current, -1, -1);
-            sprintf (msg, "Get ready player One. Press <s> to start");
+            if (!wide) {
+                boardwindow (nextblock, 1);
+                displayblock (nextblock, blocks + current, -1, -1);
+            }
+            sprintf (msg, "Get ready player One");
+            sprintf (msg2, "Press <s> to start");
             break;
         case 0:
-            boardwindow (nextblock, 1);
-            displayblock (nextblock, blocks + current, -1, -1);
-            sprintf (msg, "Game in pause. Pause <p> to continue");
+            if (!wide) {
+                boardwindow (nextblock, 1);
+                displayblock (nextblock, blocks + current, -1, -1);
+            }
+            sprintf (msg, "Game in pause");
+            sprintf (msg2, "Pause <p> to continue");
             break;
         case 1:
             halfdelay (1);
-            boardwindow (nextblock, 1);
-            displayblock (nextblock, blocks + next, -1, -1);
+            if (!wide) {
+                boardwindow (nextblock, 1);
+                displayblock (nextblock, blocks + next, -1, -1);
+            }
             if (blockend.tv_sec && isovertime (&blockend)) {
                 if (testvalidpos (board, cblock, xblock, yblock + 1)) {
                     yblock++;
@@ -150,7 +176,8 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
                 }
                 int isempty = addline (board, nbholes);
                 if (!isempty) {
-                    sprintf (msg, "Shame, you loose. Score is %d", score);
+                    sprintf (msg, "Shame, you loose");
+                    sprintf (msg2, "Score is %d", score);
                     mode = 2;
                     settle = 0;
                 }
@@ -158,6 +185,9 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
             }
             if (settle) {
                 mode = reparenextturn (board, blocks, nb_blocks, &cblock, &current, &xblock, &yblock, &next, 0, msg, &score, nextblock);
+                if (*msg) {
+                    sprintf (msg2, "Score is %d", score);
+                }
             }
             settle = 0;
 
@@ -165,13 +195,12 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
         case 2:
             freeblock (cblock);
             cblock = NULL;
-            sprintf (msg, "End of game. Press <q> to quit");
+            sprintf (msg, "End of game");
+            sprintf (msg2, "Press <q> to quit");
         }
 
         if (*msg) {
-            halfdelay (0);
             msgwindow (msg, xmsg, ymsg, lmsg);
-            msleep (800);
         }
 
         boardwindow (board, 0);
@@ -184,8 +213,20 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
                 setendtime (&lineend, chronoratio * speed);
             }
         }
-        if (mode == 1) {
+
+        if (*msg2) {
+            msg2window (msg2, xboard + board->xsize / 2, yboard + (board->ysize - 1) / 2);
+        }
+
+        switch (mode) {
+        case 0:
+        case 2:
+            halfdelay (0);
+            msleep (800);
+            break;
+        case 1:
             displayblock (board, cblock, xblock, yblock);
+            break;
         }
 
         int ch = getch ();
@@ -251,6 +292,15 @@ int oneplayer (int width, int height, int scale, int chrono, char *filename)
             break;
         }
         switch (ch) {
+        case 'h':
+            if (wide) {
+                helpwindow (help, xboard + (board->xsize - strmaxlen (help, '\n')) / 2, yboard + 1);
+                while (getch () == ERR) {
+                    msleep (200);
+                }
+                //tic (&turn);
+            }
+            break;
         case 'p':
             switch (mode) {
             case 0:
index cbf130c08f106fffebe47085f6ae27957f8e33a0..997e9a9ebd7b8ded9e3a0299e9154a37f6e38993 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef __ONEPLAYER_H__
 #define __ONEPLAYER_H__
 
-int oneplayer (int width, int height, int scale, int chrono, char *filename);
+int oneplayer (int width, int height, int scale, int wide, int chrono, char *filename);
 
 #endif /* __ONEPLAYER_H__ */
index 24de7d7239d862bd416e9144e1b83cc8e7893a04..84171322ebb534070460d25b89339147b42da833 100644 (file)
--- a/tetris.c
+++ b/tetris.c
@@ -140,7 +140,7 @@ int main (int argc, char *argv[])
     int ret = -1;
     switch (multi) {
     case 0:
-        ret = oneplayer (width, height, scale, chrono, filename);
+        ret = oneplayer (width, height, scale, wide, chrono, filename);
         break;
     case 1:
         ret = twoplayers (width, height, scale);