/*
* Netris -- A free networked version of T*tris
- * Copyright (C) 1994,1995,1996 Mark H. Weaver <mhw@netris.org>
+ * Copyright (C) 1994-1996,1999 Mark H. Weaver <mhw@netris.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
- * $Id: curses.c,v 1.32 1996/02/09 08:47:25 mhw Exp $
+ * $Id: curses.c,v 1.33 1999/05/16 06:56:25 mhw Exp $
*/
#include "netris.h"
#include <string.h>
#include <stdlib.h>
-static void PlotBlock1(int scr, int y, int x, BlockType type);
+#ifdef NCURSES_VERSION
+# define HAVE_NCURSES
+#endif
+
+#ifdef HAVE_NCURSES
+static struct
+{
+ BlockType type;
+ short color;
+} myColorTable[] =
+{
+ { BT_white, COLOR_WHITE },
+ { BT_blue, COLOR_BLUE },
+ { BT_magenta, COLOR_MAGENTA },
+ { BT_cyan, COLOR_CYAN },
+ { BT_yellow, COLOR_YELLOW },
+ { BT_green, COLOR_GREEN },
+ { BT_red, COLOR_RED },
+ { BT_none, 0 }
+};
+#endif
+
+ExtFunc void PlotBlock1(int scr, int y, int x, BlockType type);
static MyEventType KeyGenFunc(EventGenRec *gen, MyEvent *event);
static EventGenRec keyGen =
static int boardYPos[MAX_SCREENS], boardXPos[MAX_SCREENS];
static int statusYPos, statusXPos;
+static int haveColor;
static char *term_vi; /* String to make cursor invisible */
static char *term_ve; /* String to make cursor visible */
GetTermcapInfo();
/*
- * Do this atomically. Otherwise a badly timed Ctrl-C during
- * initialization will leave your terminal in a bad state.
+ * Block signals while initializing curses. Otherwise a badly timed
+ * Ctrl-C during initialization might leave the terminal in a bad state.
*/
BlockSignals(&oldMask, SIGINT, 0);
initscr();
+
+#ifdef CURSES_HACK
+ {
+ extern char *CS;
+
+ CS = 0;
+ }
+#endif
+
+#ifdef HAVE_NCURSES
+ haveColor = colorEnable && has_colors();
+ if (haveColor)
+ {
+ int i = 0;
+
+ start_color();
+ for (i = 0; myColorTable[i].type != BT_none; ++i)
+ init_pair(myColorTable[i].type, COLOR_BLACK,
+ myColorTable[i].color);
+ }
+#else
+ haveColor = 0;
+#endif
+
AtExit(CleanupScreens);
RestoreSignals(NULL, &oldMask);
move(0, 0);
addstr("Netris ");
addstr(version_string);
- addstr(" (C) 1994,1995,1996 Mark H. Weaver "
+ addstr(" (C) 1994-1996,1999 Mark H. Weaver "
"\"netris -h\" for more info");
statusYPos = 22;
statusXPos = 0;
else
boardXPos[scr] = boardXPos[scr - 1] +
2 * boardWidth[scr - 1] + 3;
+ if (scr == 1)
+ boardXPos[scr] += 24;
boardYPos[scr] = 22;
- if (statusXPos < boardXPos[scr] + 2 * boardWidth[scr] + 3)
- statusXPos = boardXPos[scr] + 2 * boardWidth[scr] + 3;
+ 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('|');
{
}
-static void PlotBlock1(int scr, int y, int x, BlockType type)
+ExtFunc void PlotBlock1(int scr, int y, int x, BlockType type)
{
+ int colorIndex = abs(type);
+
move(boardYPos[scr] - y, boardXPos[scr] + 2 * x);
- switch (type) {
- case BT_none:
- addstr(" ");
- break;
- case -BT_piece1:
- if (standoutEnable)
- standout();
- addstr("$$");
- if (standoutEnable)
- standend();
- break;
- case BT_piece1:
- if (standoutEnable)
+
+ if (type == BT_none)
+ addstr(" ");
+ else
+ {
+ if (standoutEnable)
+ {
+#ifdef HAVE_NCURSES
+ if (haveColor)
+ attrset(COLOR_PAIR(colorIndex));
+ else
+#endif
standout();
- addstr("[]");
- if (standoutEnable)
- standend();
- break;
- default:
- assert(0);
+ }
+
+ addstr(type ? "[]" : "$$");
+ standend();
}
}
ExtFunc void ShowDisplayInfo(void)
{
move(statusYPos - 9, statusXPos);
- printw("Seed: %d", initSeed);
- clrtoeol();
+ printw("Seed: %010d", initSeed);
move(statusYPos - 8, statusXPos);
- printw("Speed: %dms", speed / 1000);
- clrtoeol();
+ 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();
+// clrtoeol();
}
if (opponentFlags & SCF_usingRobot) {
move(statusYPos - 5, statusXPos);
addstr("The opponent is a fair robot");
else
addstr("The opponent is a robot");
- clrtoeol();
+// clrtoeol();
}
}
+ExtFunc void ShowScore(int scr, int totalDrops, int totalLines, int totalAdds)
+{
+ 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(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);
if (pausedByThem)
addstr("Game paused by opponent");
else
- clrtoeol();
+ addstr(" ");
move(statusYPos - 2, statusXPos);
if (pausedByMe)
addstr("Game paused by you");
else
- clrtoeol();
+ addstr(" ");
}
ExtFunc void Message(char *s)
{
static int line = 0;
- move(statusYPos - 20 + line, statusXPos);
+// move(statusYPos - 20 + line, statusXPos);
+ move(statusYPos + 2 + line, 1);
addstr(s); /* XXX Should truncate long lines */
clrtoeol();
line = (line + 1) % 10;
- move(statusYPos - 20 + line, statusXPos);
+// move(statusYPos - 20 + line, statusXPos);
+ move(statusYPos + 2 + line, 1);
clrtoeol();
}
ExtFunc void RefreshScreen(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 */
+ // Just in case the local curses library sucks
if (strcmp(timeStr[0], timeStr[1]))
{
move(statusYPos, statusXPos);
}
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();
}
ExtFunc void ScheduleFullRedraw(void)