From 86611e4906c95b82439cb25019f68e227dc86131 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 12 Sep 2024 00:31:29 +0200 Subject: [PATCH] wide board mode --- display.c | 14 +++++-- display.h | 2 + function.c | 29 ++++++++++++++ function.h | 2 + oneplayer.c | 112 +++++++++++++++++++++++++++++++++++++--------------- oneplayer.h | 2 +- tetris.c | 2 +- 7 files changed, 127 insertions(+), 36 deletions(-) diff --git a/display.c b/display.c index 509ca09..e82fbf2 100644 --- 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 { diff --git a/display.h b/display.h index 2b3db4c..0503f66 100644 --- 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); diff --git a/function.c b/function.c index c9609fe..1550b67 100644 --- a/function.c +++ b/function.c @@ -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) { diff --git a/function.h b/function.h index 1cb9065..88cf8fa 100644 --- a/function.h +++ b/function.h @@ -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); diff --git a/oneplayer.c b/oneplayer.c index 29405c6..ea5b619 100644 --- a/oneplayer.c +++ b/oneplayer.c @@ -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, ¤t, &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, ¤t, &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 to start"); + if (!wide) { + boardwindow (nextblock, 1); + displayblock (nextblock, blocks + current, -1, -1); + } + sprintf (msg, "Get ready player One"); + sprintf (msg2, "Press to start"); break; case 0: - boardwindow (nextblock, 1); - displayblock (nextblock, blocks + current, -1, -1); - sprintf (msg, "Game in pause. Pause

to continue"); + if (!wide) { + boardwindow (nextblock, 1); + displayblock (nextblock, blocks + current, -1, -1); + } + sprintf (msg, "Game in pause"); + sprintf (msg2, "Pause

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, ¤t, &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 to quit"); + sprintf (msg, "End of game"); + sprintf (msg2, "Press 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: diff --git a/oneplayer.h b/oneplayer.h index cbf130c..997e9a9 100644 --- a/oneplayer.h +++ b/oneplayer.h @@ -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__ */ diff --git a/tetris.c b/tetris.c index 24de7d7..8417132 100644 --- 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); -- 2.30.2