{"tombstone",&flags.tombstone, TRUE, SET_IN_GAME},
{"toptenwin",&iflags.toptenwin, FALSE, SET_IN_GAME},
{"travel", &flags.travelcmd, TRUE, SET_IN_GAME},
+ {"use_darkgray", &iflags.wc2_darkgray, TRUE, SET_IN_FILE},
#ifdef WIN32CON
{"use_inverse", &iflags.wc_inverse, TRUE, SET_IN_GAME}, /*WC*/
#else
{"fullscreen", WC2_FULLSCREEN},
{"softkeyboard", WC2_SOFTKEYBOARD},
{"wraptext", WC2_WRAPTEXT},
+ {"use_darkgray", WC2_DARKGRAY},
#ifdef STATUS_VIA_WINDOWPORT
{"hilite_status", WC2_HILITE_STATUS},
#endif
extern char *tparm();
#endif
-# ifdef COLOR_BLACK /* trust include file */
-#undef COLOR_BLACK
-# else
+# ifndef COLOR_BLACK /* trust include file */
# ifndef _M_UNIX /* guess BGR */
+#define COLOR_BLACK 0
#define COLOR_BLUE 1
#define COLOR_GREEN 2
#define COLOR_CYAN 3
#define COLOR_YELLOW 6
#define COLOR_WHITE 7
# else /* guess RGB */
+#define COLOR_BLACK 0
#define COLOR_RED 1
#define COLOR_GREEN 2
#define COLOR_YELLOW 3
#define COLOR_WHITE 7
# endif
# endif
-#define COLOR_BLACK COLOR_BLUE
-const int ti_map[8] = {
- COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
- COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE };
+/* Mapping data for the six terminfo colors that resolve to pairs of nethack
+ * colors. Black and white are handled specially.
+ */
+const struct {int ti_color, nh_color, nh_bright_color;} ti_map[6] =
+{
+ {COLOR_RED,CLR_RED,CLR_ORANGE},
+ {COLOR_GREEN,CLR_GREEN,CLR_BRIGHT_GREEN},
+ {COLOR_YELLOW,CLR_BROWN,CLR_YELLOW},
+ {COLOR_BLUE,CLR_BLUE,CLR_BRIGHT_BLUE},
+ {COLOR_MAGENTA,CLR_MAGENTA,CLR_BRIGHT_MAGENTA},
+ {COLOR_CYAN,CLR_CYAN,CLR_BRIGHT_CYAN}
+};
+
static void
init_hilite()
{
register int c;
char *setf, *scratch;
-
- for (c = 0; c < SIZE(hilites); c++)
- hilites[c] = nh_HI;
- hilites[CLR_GRAY] = hilites[NO_COLOR] = (char *)0;
+ int md_len;
if (tgetnum("Co") < 8
|| (MD == NULL) || (strlen(MD) == 0)
|| ((setf = tgetstr("AF", (char **)0)) == (char *)0
&& (setf = tgetstr("Sf", (char **)0)) == (char *)0))
+ {
+ /* Fallback when colors not available
+ * It's arbitrary to collapse all colors except gray
+ * together, but that's what the previous code did.
+ */
+ hilites[CLR_BLACK] = nh_HI;
+ hilites[CLR_RED] = nh_HI;
+ hilites[CLR_GREEN] = nh_HI;
+ hilites[CLR_BROWN] = nh_HI;
+ hilites[CLR_BLUE] = nh_HI;
+ hilites[CLR_MAGENTA] = nh_HI;
+ hilites[CLR_CYAN] = nh_HI;
+ hilites[CLR_GRAY] = "";
+ hilites[NO_COLOR] = "";
+ hilites[CLR_ORANGE] = nh_HI;
+ hilites[CLR_BRIGHT_GREEN] = nh_HI;
+ hilites[CLR_YELLOW] = nh_HI;
+ hilites[CLR_BRIGHT_BLUE] = nh_HI;
+ hilites[CLR_BRIGHT_MAGENTA] = nh_HI;
+ hilites[CLR_BRIGHT_CYAN] = nh_HI;
+ hilites[CLR_WHITE] = nh_HI;
return;
-
- for (c = 0; c < CLR_MAX / 2; c++) {
- scratch = tparm(setf, ti_map[c]);
- if (c != CLR_GRAY) {
- hilites[c] = (char *) alloc(strlen(scratch) + 1);
- Strcpy(hilites[c], scratch);
- }
- if (c != CLR_BLACK) {
- hilites[c|BRIGHT] = (char*) alloc(strlen(scratch)+strlen(MD)+1);
- Strcpy(hilites[c|BRIGHT], MD);
- Strcat(hilites[c|BRIGHT], scratch);
}
+ md_len = strlen(MD);
+
+ c = 6;
+ while (c--) {
+ char *work;
+ scratch = tparm(setf,ti_map[c].ti_color);
+ work = (char *) alloc(strlen(scratch) + md_len + 1);
+ Strcpy(work,MD);
+ hilites[ti_map[c].nh_bright_color] = work;
+ work += md_len;
+ Strcpy(work,scratch);
+ hilites[ti_map[c].nh_color] = work;
}
+
+ scratch = tparm(setf,COLOR_WHITE);
+ hilites[CLR_WHITE] = (char *) alloc(strlen(scratch) + md_len + 1);
+ Strcpy(hilites[CLR_WHITE],MD);
+ Strcat(hilites[CLR_WHITE],scratch);
+
+ hilites[CLR_GRAY] = "";
+ hilites[NO_COLOR] = "";
+
+ if (iflags.wc2_darkgray) {
+ /* On many terminals, esp. those using classic PC CGA/EGA/VGA
+ * textmode, specifying "hilight" and "black" simultaneously
+ * produces a dark shade of gray that is visible against a
+ * black background. We can use it to represent black objects.
+ */
+ scratch = tparm(setf,COLOR_BLACK);
+ hilites[CLR_BLACK] = (char *) alloc(strlen(scratch) + md_len + 1);
+ Strcpy(hilites[CLR_BLACK],MD);
+ Strcat(hilites[CLR_BLACK],scratch);
+ } else {
+ /* But it's concievable that hilighted black-on-black could
+ * still be invisible on many others. We substitute blue for
+ * black.
+ */
+ hilites[CLR_BLACK] = hilites[CLR_BLUE];
+ }
+}
+
+static void
+kill_hilite()
+{
+ /* if colors weren't available, no freeing needed */
+ if (hilites[CLR_BLACK] == nh_HI)
+ return;
+
+ if (hilites[CLR_BLACK] != hilites[CLR_BLUE])
+ free(hilites[CLR_BLACK]);
+
+ /* CLR_BLUE overlaps CLR_BRIGHT_BLUE, do not free */
+ /* CLR_GREEN overlaps CLR_BRIGHT_GREEN, do not free */
+ /* CLR_CYAN overlaps CLR_BRIGHT_CYAN, do not free */
+ /* CLR_RED overlaps CLR_ORANGE, do not free */
+ /* CLR_MAGENTA overlaps CLR_BRIGHT_MAGENTA, do not free */
+ /* CLR_BROWN overlaps CLR_YELLOW, do not free */
+ /* CLR_GRAY is a constant "", do not free */
+ /* NO_COLOR is a constant "", do not free */
+ free(hilites[CLR_BRIGHT_BLUE]);
+ free(hilites[CLR_BRIGHT_GREEN]);
+ free(hilites[CLR_BRIGHT_CYAN]);
+ free(hilites[CLR_YELLOW]);
+ free(hilites[CLR_ORANGE]);
+ free(hilites[CLR_BRIGHT_MAGENTA]);
+ free(hilites[CLR_WHITE]);
}
+
# else /* UNIX && TERMINFO */
# ifndef TOS
# endif
# endif /* TOS */
}
-# endif /* UNIX */
static void
kill_hilite()
# endif
return;
}
+# endif /* UNIX */
#endif /* TEXTCOLOR */