X-Git-Url: http://git.shiar.nl/netris.git/blobdiff_plain/776faa936ea4b3f5ccaacda0f05a2ed1e945d304..e3d58186949bfcdb149cc2a545ce6c14a8689268:/curses.c diff --git a/curses.c b/curses.c index 9649d85..4f8ddbd 100644 --- a/curses.c +++ b/curses.c @@ -83,9 +83,8 @@ ExtFunc void InitScreens(void) #endif #ifdef HAVE_NCURSES - haveColor = colorEnable && has_colors(); - if (haveColor) - { + haveColor = Game.color && has_colors(); + if (haveColor) { int i = 0; start_color(); @@ -105,11 +104,17 @@ ExtFunc void InitScreens(void) OutputTermStr(term_vi, 0); AddEventGen(&keyGen); - move(0, 0); - addstr("Netris "); + move(0, 1); + addstr("NETRIS "); addstr(version_string); - addstr(" (C) 1994-1996,1999 Mark H. Weaver " - "\"netris -h\" for more info"); + { + int rows, cols; + + getmaxyx(stdscr, rows, cols); + move(0, cols - 48); + addstr("(C)1994-1996,1999 Mark H. Weaver, (C)2002 Shiar"); +// addstr(" \"netris -h\" for more info"); + } statusYPos = 22; statusXPos = 0; } @@ -186,35 +191,62 @@ ExtFunc void OutputTermStr(char *str, int flush) } } -ExtFunc void InitScreen(int scr) +ExtFunc void DrawField(int scr) { - int y, x; + { + int y, x; + + for (y = Players[scr].boardVisible - 1; y >= 0; --y) { + mvaddch(boardYPos[scr] - y, boardXPos[scr] - 1, + Game.ascii ? '|' : ACS_VLINE); //left + mvaddch(boardYPos[scr] - y, + boardXPos[scr] + 2 * Players[scr].boardWidth, + Game.ascii ? '|' : ACS_VLINE); //right + } + move(2, boardXPos[scr] - 1); //top + addch(Game.ascii ? '+' : ACS_ULCORNER); + for (x = Players[scr].boardWidth * 2 - 1; x >= 0; --x) + addch(Game.ascii ? '-' : ACS_HLINE); + addch(Game.ascii ? '+' : ACS_URCORNER); + move(boardYPos[scr] + 1, boardXPos[scr] - 1); //bottom + addch(Game.ascii ? '+' : ACS_LLCORNER); + for (x = Players[scr].boardWidth * 2 - 1; x >= 0; --x) + addch(Game.ascii ? '-' : ACS_HLINE); + addch(Game.ascii ? '+' : ACS_LRCORNER); + } //draw field grid - if (scr == 0) - boardXPos[scr] = 1; - else - boardXPos[scr] = boardXPos[scr - 1] + - 2 * boardWidth[scr - 1] + 3; - if (scr == 1) - boardXPos[scr] += 24; - boardYPos[scr] = 22; - statusXPos = 2 * boardWidth[0] + 3; -// if (statusXPos < boardXPos[scr] + 2 * boardWidth[scr] + 3) -// statusXPos = boardXPos[scr] + 2 * boardWidth[scr] + 3; - for (y = boardVisible[scr] - 1; y >= 0; --y) { - move(boardYPos[scr] - y, boardXPos[scr] - 1); - addch('|'); - move(boardYPos[scr] - y, boardXPos[scr] + 2 * boardWidth[scr]); - addch('|'); - } - for (y = boardVisible[scr]; y >= -1; y -= boardVisible[scr] + 1) { - move(boardYPos[scr] - y, boardXPos[scr] - 1); - addch('+'); - for (x = boardWidth[scr] - 1; x >= 0; --x) - addstr("--"); - addch('+'); + { + char userstr[300]; + + sprintf(userstr, "%s <%s>", Players[scr].name, Players[scr].host); + userstr[20 - 7*((Players[scr].flags & SCF_usingRobot) != 0) + - 5*((Players[scr].flags & SCF_fairRobot) != 0)] = 0; + mvaddstr(1, boardXPos[scr], userstr); + + if (Players[scr].flags & SCF_usingRobot) { + addstr((Players[scr].flags & SCF_fairRobot) + ? "(fair robot)" : "(robot)"); + } + } //display playername/host +} //DrawScreen + +ExtFunc void InitFields() +{ + int scr, prevscr; + + boardXPos[me] = 1; + boardYPos[me] = 22; + prevscr = me; + for (scr = 1; scr <= totalPlayers + 1; scr++) if (scr != me) { + boardXPos[scr] = + boardXPos[prevscr] + 2 * Players[prevscr].boardWidth + 3; + if (prevscr == me) + boardXPos[scr] += 24; //scorebar + boardYPos[scr] = 22; + prevscr = scr; } -} + statusXPos = 2 * Players[me].boardWidth + 3; +} //InitScreen ExtFunc void CleanupScreen(int scr) { @@ -224,13 +256,13 @@ ExtFunc void PlotBlock1(int scr, int y, int x, BlockType type) { int colorIndex = abs(type); - move(boardYPos[scr] - y, boardXPos[scr] + 2 * x); + move(y, x); if (type == BT_none) addstr(" "); else { - if (standoutEnable) + if (Game.standout) { #ifdef HAVE_NCURSES if (haveColor) @@ -247,64 +279,68 @@ ExtFunc void PlotBlock1(int scr, int y, int x, BlockType type) ExtFunc void PlotBlock(int scr, int y, int x, BlockType type) { - if (y >= 0 && y < boardVisible[scr] && x >= 0 && x < boardWidth[scr]) - PlotBlock1(scr, y, x, type); + if (y >= 0 && y < Players[scr].boardVisible && + x >= 0 && x < Players[scr].boardWidth) + PlotBlock1(scr, boardYPos[scr] - y, boardXPos[scr] + 2 * x, type); } ExtFunc void PlotUnderline(int scr, int x, int flag) { - move(boardYPos[scr] + 1, boardXPos[scr] + 2 * x); + move(boardYPos[scr] + 1, boardXPos[scr] + 2 * x); + if (Game.ascii) addstr(flag ? "==" : "--"); + else { + addch(flag ? ACS_BTEE : ACS_HLINE); + addch(flag ? ACS_BTEE : ACS_HLINE); + } } ExtFunc void ShowDisplayInfo(void) { - move(statusYPos - 9, statusXPos); - printw("Seed: %010d", initSeed); - move(statusYPos - 8, statusXPos); - printw("Speed: %dms ", speed / 1000); - if (robotEnable) { - move(statusYPos - 6, statusXPos); - if (fairRobot) - addstr("Controlled by a fair robot"); - else - addstr("Controlled by a robot"); -// clrtoeol(); - } - if (opponentFlags & SCF_usingRobot) { - move(statusYPos - 5, statusXPos); - if (opponentFlags & SCF_fairRobot) - addstr("The opponent is a fair robot"); - else - addstr("The opponent is a robot"); -// clrtoeol(); - } + move(statusYPos - 9, statusXPos); + printw("Seed: %010d", Game.seed); + // move(statusYPos - 8, statusXPos); + // printw("Speed: %dms ", speed / 1000); + if (robotEnable) { + move(statusYPos - 6, statusXPos); + if (fairRobot) + addstr("Controlled by a fair robot"); + else + addstr("Controlled by a robot"); + // clrtoeol(); + } + if (Players[1].flags & SCF_usingRobot) { + move(statusYPos - 5, statusXPos); + if (Players[1].flags & SCF_fairRobot) + addstr("The opponent is a fair robot"); + else + addstr("The opponent is a robot"); + // clrtoeol(); + } } -ExtFunc void ShowScore(int scr, int totalDrops, int totalLines, int totalAdds) +ExtFunc void ShowScore(int scr, struct _Score score) { float timer; - move(6, statusXPos); addstr("Next: "); - move(7, statusXPos + 6); addstr(" "); - ShapeIterate(nextShape[scr], scr, - ShapeToNetNum(nextShape[scr]) == 15 ? 15 : 16, statusXPos/2 + 4, - 1, GlanceFunc, NULL); + + move(6, statusXPos); addstr("Next: "); + move(7, statusXPos + 7); addstr(" "); + ShapeIterate(Players[scr].nextShape, scr, + ShapeToNetNum(Players[scr].nextShape) == 15 ? 13 : 14, + statusXPos / 2 + 5, 1, GlanceFunc, NULL); + move(statusYPos - 21 + 1, statusXPos); + printw("Score:%6d level: %2d", score.score, score.level); move(statusYPos - 20 + 1, statusXPos); timer = CurTimeval() / 1e6; - printw("Lines: %05d", totalLines); - if (timer > 4) - printw(" (%.1f ppm)", totalDrops * 60 / timer); - move(statusYPos - 18, statusXPos); - printw("apm: %.1f", totalAdds * 60 / timer); - if (totalLines > 0) - printw(" (%d%% yield) ", 100 * totalAdds / totalLines); -} - -ExtFunc void UpdateOpponentDisplay(void) -{ - move(1, 0); - printw("Playing %s@%s", opponentName, opponentHost); - clrtoeol(); + printw("Lines:%6d", score.lines); + if (timer > 4) { + printw(" ppm:%5.1f", score.drops * 60 / timer); + move(statusYPos - 18, statusXPos); + if (score.lines > 0) + printw("yield: %3d%%", 100 * score.adds / score.lines); + else addstr(" "); + printw(" apm:%5.1f", score.adds * 60 / timer); + } } ExtFunc void ShowPause(int pausedByMe, int pausedByThem) @@ -335,28 +371,12 @@ ExtFunc void Message(char *s) clrtoeol(); } -ExtFunc void RefreshScreen(void) +ExtFunc void ShowTime(void) { -/* - static char timeStr[2][32]; - time_t theTime; - - time(&theTime); - strftime(timeStr[0], 30, "%I:%M %p", localtime(&theTime)); - // Just in case the local curses library sucks - if (strcmp(timeStr[0], timeStr[1])) - { - move(statusYPos, statusXPos); - addstr(timeStr[0]); - strcpy(timeStr[1], timeStr[0]); - } - move(boardYPos[0] + 1, boardXPos[0] + 2 * boardWidth[0] + 1); - refresh(); -*/ move(statusYPos, statusXPos); printw("Timer: %.0f ", CurTimeval() / 1e6); - move(boardYPos[0] + 1, boardXPos[0] + 2 * boardWidth[0] + 1); - refresh(); + move(boardYPos[0] + 1, boardXPos[0] + 2 * Players[0].boardWidth + 1); +// refresh(); } ExtFunc void ScheduleFullRedraw(void)