]> granicus.if.org Git - nethack/commitdiff
introduce support for coloring the frame behind a map location
authornhmall <nhmall@nethack.org>
Mon, 2 Jan 2023 00:55:02 +0000 (19:55 -0500)
committernhmall <nhmall@nethack.org>
Mon, 2 Jan 2023 00:55:02 +0000 (19:55 -0500)
Also includes support by paxed for polearm targeting using the
frame color.

Also renames USE_TILES to TILES_IN_GLYPHMAP which is a more
accurate description.

Not all window interfaces have full support for the color framing
of the background square yet.

MS-DOS needs further work (to bring it to both VESA and VGA, with
and without tiles.

Windows GUI is missing support.

X11 and Qt have been started, but may require further refinement.

38 files changed:
dat/opthelp
include/config.h
include/decl.h
include/display.h
include/extern.h
include/global.h
include/optlist.h
include/pcconf.h
include/winX.h
include/wincurs.h
include/wintty.h
include/wintype.h
outdated/sys/amiga/winchar.c
outdated/sys/msdos/Makefile.BC
outdated/sys/msdos/Makefile.MSC
outdated/sys/unix/hints/include/cross-amiga-pre
src/decl.c
src/display.c
src/do_name.c
src/mdlib.c
src/o_init.c
src/symbols.c
sys/msdos/Makefile.GCC
sys/msdos/msdos.c
sys/msdos/pckeys.c
sys/msdos/pctiles.c
sys/msdos/pctiles.h
sys/msdos/pcvideo.h
sys/msdos/video.c
sys/msdos/vidvesa.c
sys/msdos/vidvga.c
sys/unix/hints/include/cross-pre.370
sys/windows/Makefile.nmake
sys/windows/consoletty.c
util/mdgrep.h
util/mdgrep.pl
win/tty/termcap.c
win/tty/wintty.c

index 1ee667f777157303b45d6b771a8e9c52b8feaeff..c48dd72f9e8e7c9c10bca3ceb6b6ef044fe2199f 100644 (file)
@@ -106,7 +106,7 @@ altmeta        For unix and VMS, treat two character sequence
                "ESC c" as M-c (Meta+c, 8th bit set) when nethack  [False]
                obtains a command from player's keyboard.
 
-Boolean option if USE_TILES was set at compile time (MSDOS protected mode):
+Boolean option if TILES_IN_GLYPHMAP set at compile time (MSDOS):
 preload_tiles  control whether tiles get pre-loaded into RAM at    [True]
                the start of the game.  Doing so enhances performance
                of the tile graphics, but uses more memory.
index 211afa13478c2b6a05b2b6e500e6d7113b1aac84..9226836121aac8b131f7f2068f7877969cb3b6f1 100644 (file)
@@ -669,8 +669,8 @@ typedef unsigned char uchar;
 /* End of Section 4 */
 
 #ifdef TTY_TILES_ESCCODES
-# ifndef USE_TILES
-#  define USE_TILES
+# ifndef TILES_IN_GLYPHMAP
+#  define TILES_IN_GLYPHMAP
 # endif
 #endif
 
index 0cac00374f1d77171271aae83c14dad8c93257b4..90c3232fa4d940ff29c977abf59637eab186948d 100644 (file)
@@ -830,7 +830,7 @@ struct instance_globals_c {
     char *config_section_current;
     boolean chosen_symset_start;
     boolean chosen_symset_end;
+
     /* invent.c */
     /* for perm_invent when operating on a partial inventory display, so that
        persistent one doesn't get shrunk during filtering for item selection
@@ -1603,6 +1603,9 @@ struct instance_globals_w {
     /* mkmaze.c */
     struct trap *wportal;
 
+    /* new */
+    struct win_settings wsettings;      /* wintype.h */
+
     boolean havestate;
     unsigned long magic; /* validate that structure layout is preserved */
 };
index 021fd0d1c1c98b780dd1eb3ea681ad26347c54f2..1a193fd6053ec52c02cb8c8828fac31877a98f0d 100644 (file)
@@ -1003,9 +1003,9 @@ extern const int explodecolors[];
 extern int wallcolors[];
 #endif
 
-/* If USE_TILES is defined during build, this comes from the generated
- * tile.c, complete with appropriate tile references in the initialization.
- * Otherwise, it comes from display.c.
+/* If TILES_IN_GLYPHMAP is defined during build, this is defined
+ * in the generated tile.c, complete with appropriate tile references in
+ * the initialization.  Otherwise, it gets defined in display.c.
  */
 extern const glyph_info nul_glyphinfo;
 
index 2c9c3217115a1e12a2068b64e7af4a29178224dc..f3dd64ed3653f5d51ceb2baa2847e86692274e1a 100644 (file)
@@ -545,6 +545,7 @@ extern const char *pmname(struct permonst *, int);
 #endif
 extern const char *mon_pmname(struct monst *);
 extern const char *obj_pmname(struct obj *);
+boolean mapxy_valid(coordxy x, coordxy y);
 
 /* ### do_wear.c ### */
 
@@ -2775,7 +2776,7 @@ extern boolean u_teleport_mon(struct monst *, boolean);
 
 /* ### tile.c ### */
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern void substitute_tiles(d_level *);
 #endif
 
index bdef8fb0522310bdb04e18cfab755ca59a18a475..bb49feb774187973929f9d33677b85781ed7ba95 100644 (file)
@@ -256,15 +256,15 @@ typedef uchar nhsym;
 #if defined(X11_GRAPHICS) || defined(QT_GRAPHICS) || defined(GNOME_GRAPHICS) \
     || defined(MSWIN_GRAPHICS)
 #ifndef NO_TILE_C
-#ifndef USE_TILES
-#define USE_TILES /* glyphmap[] with prefilled tile mappings will be available */
+#ifndef TILES_IN_GLYPHMAP
+#define TILES_IN_GLYPHMAP
 #endif
 #endif
 #endif
 #if defined(AMII_GRAPHICS) || defined(GEM_GRAPHICS)
 #ifndef NO_TILE_C
-#ifndef USE_TILES
-#define USE_TILES
+#ifndef TILES_IN_GLYPHMAP
+#define TILES_IN_GLYPHMAP
 #endif
 #endif
 #endif
index 8d47ae35b0ec76d8e627b7921b57b32766cfab42..c383afb0612ef4c93a3e20f5af713d475b51ca16 100644 (file)
@@ -78,9 +78,9 @@ static int optfn_##a(int, int, boolean, char *, char *);
     { m, OptS_##sec, 0, b, opt_##a, s, OthrOpt, n, v, d, No, c,         \
       (boolean *) 0, &optfn_##a, al, z, (const char *) 0, On, On, 0 },
 
-/* this is not reliable because USE_TILES might be defined in a
  multi-interface binary but not apply to the current interface */
-#ifdef USE_TILES
+/* this is not reliable because TILES_IN_GLYPHMAP might be defined
* in a multi-interface binary but not apply to the current interface */
+#ifdef TILES_IN_GLYPHMAP
 #define tiled_map_Def On
 #define ascii_map_Def Off
 #else
index 8362efaf242dda8804f0f92d09985302e0b88158..14eda0be1eb067d7bc272c1498c13462b5d48e80 100644 (file)
@@ -75,7 +75,7 @@
  */
 #ifndef SUPPRESS_GRAPHICS
 #if (defined(SCREEN_BIOS) || defined(SCREEN_DJGPPFAST)) && !defined(PC9800)
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 #define SCREEN_VGA /* Include VGA graphics routines in the build */
 #define SCREEN_VESA
 #endif
index 830131ee8075292794f902dba2706a88322450ae..98bf68e9f96791fba043ae4c9af26a796af07013 100644 (file)
@@ -51,6 +51,8 @@ struct text_map_info_t {
     X11_map_symbol text[ROWNO][COLNO];  /* Actual displayed screen. */
 #ifdef TEXTCOLOR
     X11_color colors[ROWNO][COLNO];     /* Color of each character. */
+    X11_color framecolors[ROWNO][COLNO];  /* Color of background
+                                                 behind text */
     GC color_gcs[CLR_MAX],              /* GC for each color */
         inv_color_gcs[CLR_MAX];         /* GC for each inverse color */
 #define copy_gc color_gcs[NO_COLOR]
@@ -74,6 +76,7 @@ struct tile_glyph_info_t {
     unsigned short glyph;
     unsigned short tileidx;
     unsigned glyphflags;
+    uint32 framecolor;
 };
 
 struct tile_map_info_t {
index 88b4da29a354b548c6b5bb3a0a0b5d7dcf75e9fd..5e057fae9188cec9199892d5a9ed0f8842451bbc 100644 (file)
@@ -129,10 +129,10 @@ extern void curs_destroy_all_wins(void);
 #ifdef ENHANCED_SYMBOLS
 extern void curses_putch(winid wid, int x, int y, int ch,
                          struct unicode_representation *u, int color,
-                         int attrs);
+                         int framecolor, int attrs);
 #else
 extern void curses_putch(winid wid, int x, int y, int ch, int color,
-                         int attrs);
+                         int framecolor, int attrs);
 #endif
 extern void curses_get_window_size(winid wid, int *height, int *width);
 extern boolean curses_window_has_border(winid wid);
index 7973776a17fe98cb18afba40e808ae15c37930d7..b8446f90618f7cb2f1ee248cf1889861caee8359 100644 (file)
@@ -92,6 +92,7 @@ struct DisplayDesc {
     short curx, cury; /* current cursor position on the screen */
 #ifdef TEXTCOLOR
     int color; /* current color */
+    uint32 framecolor; /* current background color */
 #endif
     int attrs;         /* attributes in effect */
     int toplin;        /* flag for topl stuff */
@@ -153,8 +154,8 @@ E void tty_shutdown(void);
 #endif
 E int xputc(int);
 E void xputs(const char *);
-#if defined(SCREEN_VGA) || defined(SCREEN_8514)
-E void xputg(const glyph_info *);
+#if defined(SCREEN_VGA) || defined(SCREEN_8514) || defined(SCREEN_VESA)
+E void xputg(const glyph_info *, const glyph_info *);
 #endif
 E void cl_end(void);
 E void clear_screen(void);
@@ -188,6 +189,7 @@ E void term_end_raw_bold(void);
 #ifdef TEXTCOLOR
 E void term_end_color(void);
 E void term_start_color(int color);
+E void term_start_bgcolor(int color);
 #endif /* TEXTCOLOR */
 #ifdef ENHANCED_SYMBOLS
 extern void term_start_24bitcolor(struct unicode_representation *);
index 893620d2be0468c84f82be6d779245a7bd6e25b1..77b8af6c0dbce84727d5f57a893da303e65e4472 100644 (file)
@@ -101,6 +101,7 @@ typedef struct glyph_map_entry {
 typedef struct gi {
     int glyph;            /* the display entity */
     int ttychar;
+    uint32 framecolor;
     glyph_map gm;
 } glyph_info;
 #define GLYPH_INFO_P struct gi
@@ -213,6 +214,22 @@ typedef struct win_request_info_t win_request_info;
 
 /* #define CORE_INVENT */
 
+/* In a binary with multiple window interfaces linked in, this is
+ * a structure to track certain interface capabilities that cannot be
+ * statically done at compile time. Some of them can be toggled and
+ * the core needs to know if they are active or not at the time.
+ */
+
+enum win_display_modes {
+    wdmode_traditional = 0,
+    wdmode_tiled
+};
+
+struct win_settings {
+    enum win_display_modes wdmode;
+    uint32 map_frame_color;
+};
+
 /* clang-format on */
 
 #endif /* WINTYPE_H */
index 222d7952ac2fc6e8307af129113fa396a985c725..245eaee41c45ed4277f3c70c7d3f0dd5af9804bd 100644 (file)
@@ -63,7 +63,7 @@ void MyFreeBitMap(struct BitMap *bmp);
 extern void display_map(struct Window *);
 #endif
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern int maxmontile, maxobjtile, maxothtile; /* from tile.c */
 #define MAXMONTILE maxmontile
 #define MAXOBJTILE maxobjtile
index 5d727c405360c730a4982cc294c1288df01e0ca8..f798e15c7170942e702eb9bd61c7b68a85c13235 100644 (file)
@@ -363,7 +363,7 @@ DLBFLG =
 #
 
 ! IF ("$(TILESUPPORT)"=="Y")
-TILFLG = $(CDEFINE)USE_TILES
+TILFLG = $(CDEFINE)TILES_IN_GLYPHMAP
 ! ELSE
 TILFLG =
 ! ENDIF
index 9d843d36b58c68d6cacf1509426b1993f99aa25e..3d3e44435f06d336f29a3e6484c67131073e96d7 100644 (file)
@@ -114,12 +114,12 @@ GAMEFILE = $(GAMEDIR)\$(GAME).exe
 #  Flags.
 #
 # Debugging
-#CFLAGS = /Zi /DFUNCTION_LEVEL_LINKING /DUSE_TILES /DDLB
+#CFLAGS = /Zi /DFUNCTION_LEVEL_LINKING /DTILES_IN_GLYPHMAP /DDLB
 #LFLAGS = /CODEVIEW /NOI/MAP /CPARM:1 /INFO
 
 #    Normal
 LFLAGS = /NOI/MAP /CPARM:1 /INFO
-CFLAGS = /DFUNCTION_LEVEL_LINKING /DUSE_TILES /DDLB
+CFLAGS = /DFUNCTION_LEVEL_LINKING /DTILES_IN_GLYPHMAP /DDLB
 SPECOPTS =
 #
 # Leaving MACHINE_CODE undefined will allow it to run
index 95e1af165126914c36a520217a7aa5a878244cd5..fb04be1c2ebc5b34ce3256f7419092dbec744f18 100644 (file)
@@ -139,7 +139,7 @@ override TARGET_STUBEDIT=
 override TARGET_CFLAGS = -c -O $(TOOLARCH) \
        -I../include -I../outdated/include \
        -I../outdated/sys/amiga -I../win/share \
-       $(LUAINCL) -DAMIGA -DUSE_TILES $(PDCURSESDEF) \
+       $(LUAINCL) -DAMIGA -DTILES_IN_GLYPHMAP $(PDCURSESDEF) \
        -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_AMIGA \
        -DAMIGA_VERSION_STRING=\""VER: NetHack 3.7.0\""
 #      -DMICRO -DPATHLEN=31 -DFILENAME=80
index 8362d086260e6e9ae0b61588d6b28d7aa3348b22..43586368c6b80a8678f6370a155c7aab4639ea16 100644 (file)
@@ -360,6 +360,7 @@ const struct instance_globals_g g_init_g = {
     { { { 0 } } }, /* gbuf */
     UNDEFINED_VALUES, /* gbuf_start */
     UNDEFINED_VALUES, /* gbug_stop */
+
     /* do_name.c */
     UNDEFINED_PTR, /* gloc_filter_map */
     UNDEFINED_VALUE, /* gloc_filter_floodfill_match_glyph */
@@ -834,6 +835,9 @@ const struct instance_globals_w g_init_w = {
     UNDEFINED_VALUE, /* wc */
     /* mkmaze.c */
     UNDEFINED_PTR, /* wportal */
+    /* new */
+    { wdmode_traditional, NO_COLOR },       /* wsettings */
+
     TRUE, /* havestate*/
     IVMAGIC  /* w_magic used to validate that structure layout has been preserved */
 };
index 66b4c35d1ce1c9f46445a839c4941e44f485febd..763777e3c86447bcb982916c1873837f4c19e93a 100644 (file)
@@ -129,7 +129,7 @@ static int swallow_to_glyph(int, int);
 static void display_warning(struct monst *);
 
 static int check_pos(coordxy, coordxy, int);
-static int get_bk_glyph(coordxy x, coordxy y);
+static void get_bkglyph_and_framecolor(coordxy x, coordxy y, int *, uint32 *);
 static int tether_glyph(coordxy, coordxy);
 static void mimic_light_blocking(struct monst *);
 #ifdef UNBUFFERED_GLYPHINFO
@@ -1444,7 +1444,7 @@ see_traps(void)
 /*  glyph, ttychar, { glyphflags, { sym.color, sym.symidx },
                       tileidx, u } */
 static glyph_info no_ginfo = {
-    NO_GLYPH, ' ', { MG_BADXY, { NO_COLOR, 0 }, 0
+    NO_GLYPH, ' ', NO_COLOR, { MG_BADXY, { NO_COLOR, 0 }, 0
 #ifdef ENHANCED_SYMBOLS
                                                  , 0
 #endif
@@ -1459,13 +1459,13 @@ static glyph_info ginfo;
 #define Glyphinfo_at(x, y, glyph) glyphinfo_at(x, y, glyph)
 #endif
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern const glyph_info nul_glyphinfo; /* tile.c */
 #else
 /* glyph, ttychar, { glyphflags, { sym.color, sym.symidx },
                      tileidx, 0} */
 const glyph_info nul_glyphinfo = {
-    NO_GLYPH, ' ',
+    NO_GLYPH, ' ', NO_COLOR,
         {  /* glyph_map */
             MG_UNEXPL,
             { NO_COLOR, SYM_UNEXPLORED + SYM_OFF_X },
@@ -1477,7 +1477,7 @@ const glyph_info nul_glyphinfo = {
 };
 #endif
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern glyph_map glyphmap[MAX_GLYPH]; /* from tile.c */
 #else
 glyph_map glyphmap[MAX_GLYPH] = {
@@ -1590,7 +1590,7 @@ redraw_map(void)
     for (y = 0; y < ROWNO; ++y)
         for (x = 1; x < COLNO; ++x) {
             glyph = glyph_at(x, y); /* not levl[x][y].glyph */
-            bkglyphinfo.glyph = get_bk_glyph(x, y);
+            get_bkglyph_and_framecolor(x, y, &bkglyphinfo.glyph, &bkglyphinfo.framecolor);
             print_glyph(WIN_MAP, x, y,
                         Glyphinfo_at(x, y, glyph), &bkglyphinfo);
         }
@@ -1826,7 +1826,7 @@ show_glyph(coordxy x, coordxy y, int glyph)
 
 static gbuf_entry nul_gbuf = {
     0,                                 /* gnew */
-    { GLYPH_UNEXPLORED, (unsigned) ' ', /* glyphinfo.glyph */
+    { GLYPH_UNEXPLORED, (unsigned) ' ', NO_COLOR, /* glyphinfo.glyph */
         /* glyphinfo.gm */
         { MG_UNEXPL, { (unsigned) NO_COLOR, 0 }, 0
 #ifdef ENHANCED_SYMBOLS
@@ -1906,8 +1906,10 @@ row_refresh(coordxy start, coordxy stop, coordxy y)
     for (x = start; x <= stop; x++) {
         gptr = &gg.gbuf[y][x];
         glyph = gptr->glyphinfo.glyph;
-        if (force || glyph != GLYPH_UNEXPLORED) {
-            bkglyphinfo.glyph = get_bk_glyph(x, y);
+        get_bkglyph_and_framecolor(x, y, &bkglyphinfo.glyph,
+                                   &bkglyphinfo.framecolor);
+        if (force || glyph != GLYPH_UNEXPLORED
+            || bkglyphinfo.framecolor != NO_COLOR) {
             print_glyph(WIN_MAP, x, y,
                         Glyphinfo_at(x, y, glyph), &bkglyphinfo);
         }
@@ -1943,6 +1945,7 @@ flush_screen(int cursor_on_u)
     static int delay_flushing = 0;
     register coordxy x, y;
     glyph_info bkglyphinfo = nul_glyphinfo;
+    int bkglyph;
 
     /* 3.7: don't update map, status, or perm_invent during save/restore */
     if (suppress_map_output())
@@ -1969,13 +1972,16 @@ flush_screen(int cursor_on_u)
     for (y = 0; y < ROWNO; y++) {
         register gbuf_entry *gptr = &gg.gbuf[y][x = gg.gbuf_start[y]];
 
-        for (; x <= gg.gbuf_stop[y]; gptr++, x++)
-            if (gptr->gnew) {
-                map_glyphinfo(x, y, get_bk_glyph(x, y), 0, &bkglyphinfo);
+        for (; x <= gg.gbuf_stop[y]; gptr++, x++) {
+            get_bkglyph_and_framecolor(x, y, &bkglyph, &bkglyphinfo.framecolor);
+            if (gptr->gnew
+                || (gw.wsettings.map_frame_color != NO_COLOR && bkglyphinfo.framecolor != NO_COLOR)) {
+                map_glyphinfo(x, y, bkglyph, 0, &bkglyphinfo); /* won't touch framecolor */
                 print_glyph(WIN_MAP, x, y,
                             Glyphinfo_at(x, y, gptr->glyph), &bkglyphinfo);
                 gptr->gnew = 0;
             }
+        }
     }
     reset_glyph_bbox();
 
@@ -2204,22 +2210,21 @@ glyphinfo_at(coordxy x, coordxy y, int glyph)
 #endif
 
 /*
- * This will be used to get the glyph for the background so that
- * it can potentially be merged into graphical window ports to
- * improve the appearance of stuff on dark room squares and the
- * plane of air etc.
- *
- * Until that is working correctly in the branch, however, for now
- * we just return NO_GLYPH as an indicator to ignore it.
- *
+ * Get the glyph for the background so that it can potentially
+ * be merged into graphical window ports to improve the appearance
+ * of stuff on dark room squares and the plane of air etc.
  * [This should be using background as recorded for #overview rather
  * than current data from the map.]
+ *
+ * Also get the frame color to use for highlighting the map location
+ * for some purpose.
+ *
  */
 
-static int
-get_bk_glyph(coordxy x, coordxy y)
+static void
+get_bkglyph_and_framecolor(coordxy x, coordxy y, int *bkglyph, uint32 *framecolor)
 {
-    int idx, bkglyph = GLYPH_UNEXPLORED;
+    int idx, tmp_bkglyph = GLYPH_UNEXPLORED;
     struct rm *lev = &levl[x][y];
 
     if (iflags.use_background_glyph && lev->seenv != 0
@@ -2267,14 +2272,18 @@ get_bk_glyph(coordxy x, coordxy y)
                 idx = (flags.dark_room && iflags.use_color)
                          ? DARKROOMSYM : S_stone;
         }
-
         if (idx != S_room)
-            bkglyph = cmap_to_glyph(idx);
+            tmp_bkglyph = cmap_to_glyph(idx);
     }
-    return bkglyph;
+    if (gw.wsettings.map_frame_color != NO_COLOR && framecolor && mapxy_valid(x, y))
+        *framecolor = gw.wsettings.map_frame_color;
+    else
+        *framecolor = NO_COLOR;
+
+    *bkglyph = tmp_bkglyph;
 }
 
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
 #define HAS_ROGUE_IBM_GRAPHICS \
     (gc.currentgraphics == ROGUESET && SYMHANDLING(H_IBM) && !iflags.grmode)
 #else
index 3145b296a805419c3fc6c106e78501b7149bc023..ba1b352574369db7ea1a4d841d49db11e456e09a 100644 (file)
@@ -6,6 +6,8 @@
 #include "hack.h"
 
 static char *nextmbuf(void);
+static void getpos_getvalids_selection(struct selectionvar *, boolean (*)(coordxy, coordxy));
+static void selection_force_newsyms(struct selectionvar *);
 static void getpos_help_keyxhelp(winid, const char *, const char *, int);
 static void getpos_help(boolean, const char *);
 static int QSORTCALLBACK cmp_coord_distu(const void *, const void *);
@@ -50,8 +52,50 @@ getpos_sethilite(
     void (*gp_hilitef)(int),
     boolean (*gp_getvalidf)(coordxy, coordxy))
 {
+    boolean was_valid = (getpos_getvalid != NULL);
+    struct selectionvar *sel = selection_new();
+
+    getpos_getvalids_selection(sel, getpos_getvalid);
     getpos_hilitefunc = gp_hilitef;
     getpos_getvalid = gp_getvalidf;
+    getpos_getvalids_selection(sel, getpos_getvalid);
+    gw.wsettings.map_frame_color = (getpos_getvalid != NULL) ? CLR_BLUE : NO_COLOR;
+    if ((boolean) (getpos_getvalid != NULL) != was_valid)
+        selection_force_newsyms(sel);
+    selection_free(sel, TRUE);
+}
+
+boolean
+mapxy_valid(coordxy x, coordxy y)
+{
+    if (getpos_getvalid)
+        return (*getpos_getvalid)(x, y);
+    return FALSE;
+}
+
+static void
+getpos_getvalids_selection(struct selectionvar *sel, boolean (*validf)(coordxy, coordxy))
+{
+    coordxy x, y;
+
+    if (!sel || !validf)
+        return;
+
+    for (x = 1; x < sel->wid; x++)
+        for (y = 0; y < sel->hei; y++)
+            if ((*validf)(x, y))
+                selection_setpoint(x, y, sel, 1);
+}
+
+static void
+selection_force_newsyms(struct selectionvar *sel)
+{
+    coordxy x, y;
+
+    for (x = 1; x < sel->wid; x++)
+        for (y = 0; y < sel->hei; y++)
+            if (selection_getpoint(x, y, sel))
+                newsym_force(x, y);
 }
 
 static const char *const gloc_descr[NUM_GLOCS][4] = {
@@ -1058,8 +1102,7 @@ getpos(coord *ccp, boolean force, const char *goal)
     for (i = 0; i < NUM_GLOCS; i++)
         if (garr[i])
             free((genericptr_t) garr[i]);
-    getpos_hilitefunc = (void (*)(int)) 0;
-    getpos_getvalid = (boolean (*)(coordxy, coordxy)) 0;
+    getpos_sethilite(NULL, NULL);
     u.dx = udx, u.dy = udy, u.dz = udz;
     return result;
 }
index df3eb84d4bbc26f79338ca70d7791c13d2584d71..d85c0dd0ab56d9507e236bce99e0d177cd48bb82 100644 (file)
@@ -107,7 +107,7 @@ struct win_information {
 static struct win_information window_opts[] = {
 #ifdef TTY_GRAPHICS
     { "tty",
-      /* testing 'USE_TILES' here would bring confusion because it could
+      /* testing 'TILES_IN_GLYPHMAP' here would bring confusion because it could
          apply to another interface such as X11, so check MSDOS explicitly
          instead; even checking TTY_TILES_ESCCODES would probably be
          confusing to most users (and it will already be listed separately
index 1b88b80a3685993560a947538b743e6ac38d57ce..196bb3ed1a90d090151be453fcfa1101257d7e36 100644 (file)
@@ -11,7 +11,7 @@ static void shuffle_all(void);
 static int QSORTCALLBACK discovered_cmp(const genericptr, const genericptr);
 static char *oclass_to_name(char, char *);
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern glyph_map glyphmap[MAX_GLYPH];
 static void shuffle_tiles(void);
 
@@ -39,7 +39,7 @@ shuffle_tiles(void)
         glyphmap[i + GLYPH_OBJ_PILETOP_OFF].tileidx = tmp_tilemap[1][i];
     }
 }
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 
 static void
 setgemprobs(d_level* dlev)
@@ -208,7 +208,7 @@ init_objects(void)
 
     /* shuffle descriptions */
     shuffle_all();
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     shuffle_tiles();
 #endif
     objects[WAN_NOTHING].oc_dir = rn2(2) ? NODIR : IMMEDIATE;
@@ -403,7 +403,7 @@ restnames(NHFILE* nhfp)
             }
         }
     }
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     shuffle_tiles();
 #endif
 }
index 383d8b8eb674e0a995c27cdd0059f288972393f8..e35b41703b00939ae58ef0c3a55b3a95b9d490b4 100644 (file)
@@ -229,7 +229,7 @@ assign_graphics(int whichset)
             gs.showsyms[i] = go.ov_rogue_syms[i] ? go.ov_rogue_syms[i]
                                            : gr.rogue_syms[i];
 
-#if defined(MSDOS) && defined(USE_TILES)
+#if defined(MSDOS) && defined(TILES_IN_GLYPHMAP)
         if (iflags.grmode)
             tileview(FALSE);
 #endif
@@ -242,7 +242,7 @@ assign_graphics(int whichset)
             gs.showsyms[i] = go.ov_primary_syms[i] ? go.ov_primary_syms[i]
                                              : gp.primary_syms[i];
 
-#if defined(MSDOS) && defined(USE_TILES)
+#if defined(MSDOS) && defined(TILES_IN_GLYPHMAP)
         if (iflags.grmode)
             tileview(TRUE);
 #endif
index 92c4737fcfb97497481d5f0a5754c43addb5b7ca..74c14523acc3b1aacc5b1b51ea5460ac6743dfdf 100644 (file)
@@ -460,11 +460,11 @@ cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DSUPPRESS_GRAPHICS
 LFLAGS =
 
 # Debugging
-#cflags = -g -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES
+#cflags = -g -c $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DTILES_IN_GLYPHMAP
 #LFLAGS = -g
 
 #    Normal
-cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DUSE_TILES
+cflags = -c -O $(INCLDIR) $(DLBFLG) $(CURSESDEF) -DTILES_IN_GLYPHMAP
 LFLAGS =
 
 #==========================================
index b6d08b478549713679de6a5e6092afd73b61c8d6..735e84dd9af2199d3ad9642e9eda5b8c1c4810d6 100644 (file)
@@ -58,7 +58,7 @@ unsigned long sys_random_seed(void);
 static char *getdta(void);
 #endif
 static unsigned int dos_ioctl(int, int, unsigned);
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern boolean pckeys(unsigned char, unsigned char); /* pckeys.c */
 #endif
 
@@ -281,7 +281,7 @@ BIOSgetch(void)
             else
                 ch = kpad[scan - KEYPADLO].normal;
         }
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
         /* Check for special interface manipulation keys */
         if (pckeys(scan, shift)) {
             ch = 0xFF;
index 776e0286c95d384c5f5d0a14a0fc661f82d50a9d..3c66cb6b7a41db55593c8b2e22a6d9cd73474af5 100644 (file)
@@ -9,7 +9,7 @@
 #include "hack.h"
 
 #ifdef MSDOS
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 #include "wintty.h"
 #include "pcvideo.h"
 
@@ -126,7 +126,7 @@ refresh(void)
         vesa_refresh();
 #endif
 }
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 #endif /* MSDOS */
 
 /*pckeys.c*/
index 5609db1bee8d84ded5d29797a51794b8067b392b..4e942e534800e9ec1efd137b26ac5bed23002eba 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "hack.h"
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 
 #if defined(__GO32__) || defined(__DJGPP__)
 #include <unistd.h>
@@ -247,6 +247,6 @@ ReadPackedTileFile(int tilenum, char (*pta)[TILE_X])
     return 0;
 }
 #endif
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 
 /* pctiles.c */
index 5241be4dc81a55f1eb254998834006b584841ad9..eed5a87ec808e5d58685626619a2ff1b48f8c56f 100644 (file)
@@ -10,7 +10,7 @@
  *
  */
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 #ifndef TILE_X
 #define TILE_X 16
 #endif
@@ -59,6 +59,6 @@ extern int ReadPlanarTileFile_O(int, struct overview_planar_cell_struct **);
 #ifdef PACKED_FILE
 extern int ReadPackedTileFile(int, char (*)[TILE_X]);
 #endif
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 
 /* pctiles.h */
index cee982c22b0823f6bebb5c2f9da127e3f4d83de8..dfd9fc1c2241b23a9f084852be7a818d88a49f25 100644 (file)
@@ -276,7 +276,7 @@ extern void vga_tty_end_screen(void);
 extern void vga_tty_startup(int *, int *);
 extern void vga_xputs(const char *, int, int);
 extern void vga_xputc(char, int);
-extern void vga_xputg(const glyph_info *);
+extern void vga_xputg(const glyph_info *, const glyph_info *);
 extern void vga_userpan(enum vga_pan_direction);
 extern void vga_overview(boolean);
 extern void vga_traditional(boolean);
@@ -305,7 +305,7 @@ extern void vesa_tty_end_screen(void);
 extern void vesa_tty_startup(int *, int *);
 extern void vesa_xputs(const char *, int, int);
 extern void vesa_xputc(char, int);
-extern void vesa_xputg(const glyph_info *);
+extern void vesa_xputg(const glyph_info *, const glyph_info *);
 extern void vesa_userpan(enum vga_pan_direction);
 extern void vesa_overview(boolean);
 extern void vesa_traditional(boolean);
index 04f9060e32fba3b3357a34d169aadeffc520c072..24362cfc61ccfff52574d1519b23b48223ef37a0 100644 (file)
@@ -132,6 +132,7 @@ int attrib_text_normal;      /* text mode normal attribute */
 int attrib_gr_normal;        /* graphics mode normal attribute */
 int attrib_text_intense;     /* text mode intense attribute */
 int attrib_gr_intense;       /* graphics mode intense attribute */
+uint32 curframecolor = NO_COLOR;   /* current background text color */
 boolean traditional = FALSE; /* traditonal TTY character mode */
 boolean inmap = FALSE;       /* in the map window */
 #ifdef TEXTCOLOR
@@ -165,7 +166,7 @@ clear_screen(void)
 #endif
 #ifdef SCREEN_VESA
     } else if (iflags.usevesa) {
-        vesa_clear_screen(BACKGROUND_VGA_COLOR);
+        vesa_clear_screen(BACKGROUND_VESA_COLOR);
 #endif
     }
 }
@@ -302,12 +303,14 @@ term_end_attr(int attr)
     default:
         g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal;
     }
+    curframecolor = NO_COLOR;
 }
 
 void
 term_end_color(void)
 {
     g_attribute = iflags.grmode ? attrib_gr_normal : attrib_text_normal;
+    curframecolor = NO_COLOR;
 }
 
 void
@@ -370,6 +373,19 @@ term_start_color(int color)
 #endif
 }
 
+void
+term_start_bgcolor(int bgcolor)
+{
+    // pline("before bgcolor = %d, curframecolor = %d", bgcolor, curframecolor);
+#ifdef TEXTCOLOR
+    if (!monoflag) {
+        if (bgcolor >= 0 && bgcolor < CLR_MAX)
+           curframecolor = bgcolor;
+    }
+#endif
+    // pline("after  bgcolor = %d, curframecolor = %d", bgcolor, curframecolor);
+}
+
 void
 term_start_raw_bold(void)
 {
@@ -577,8 +593,12 @@ xputc(int ch) /* write out character (and attribute) */
     char attribute;
 
     i = iflags.grmode ? attrib_gr_normal : attrib_text_normal;
-
     attribute = (char) ((g_attribute == 0) ? i : g_attribute);
+
+    if (curframecolor != NO_COLOR) {
+        attribute |= ((ttycolors[curframecolor]) << 4);
+    }
+
     if (!iflags.grmode) {
         txt_xputc(ch, attribute);
 #ifdef SCREEN_VGA
@@ -594,17 +614,17 @@ xputc(int ch) /* write out character (and attribute) */
 }
 
 /* write out a glyph picture at current location */
-void xputg(const glyph_info *glyphinfo)
+void xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo)
 {
     if (!iflags.grmode || !iflags.tile_view) {
         (void) xputc((char) glyphinfo->ttychar);
 #ifdef SCREEN_VGA
     } else if (iflags.grmode && iflags.usevga) {
-        vga_xputg(glyphinfo);
+        vga_xputg(glyphinfo, bkglyphinfo);
 #endif
 #ifdef SCREEN_VESA
     } else if (iflags.grmode && iflags.usevesa) {
-        vesa_xputg(glyphinfo);
+        vesa_xputg(glyphinfo, bkglyphinfo);
 #endif
     }
 }
index 8c382fe5d03642536869936c7f9526169f155b15..e616636e57a42e0347ee235ce0f5daf14a380f01 100644 (file)
@@ -22,7 +22,7 @@
 
 extern int total_tiles_used, Tile_corr, Tile_unexplored;  /* from tile.c */
 struct VesaCharacter {
-    uint32 colour;
+    uint32 colour, bgcolour;
     uint32 chr;
 };
 
@@ -86,6 +86,7 @@ static struct map_struct {
     uint32 attr;
     unsigned special;
     short int tileidx;
+    int framecolor;
 } map[ROWNO][COLNO]; /* track the glyphs */
 
 #define vesa_clearmap()                                         \
@@ -95,6 +96,7 @@ static struct map_struct {
             for (x = 0; x < COLNO; ++x) {                       \
                 map[y][x].glyph = GLYPH_UNEXPLORED;             \
                 map[y][x].ch = glyph2ttychar(GLYPH_UNEXPLORED); \
+               map[y][x].framecolor = NO_COLOR;                \
                 map[y][x].attr = 0;                             \
                 map[y][x].special = 0;                          \
                 map[y][x].tileidx = Tile_unexplored;            \
@@ -667,10 +669,10 @@ vesa_xputc(char ch, int attr)
     vesa_gotoloc(col, row);
 }
 
-#if defined(USE_TILES)
+#if defined(TILES_IN_GLYPHMAP)
 /* Place tile represent. a glyph at current location */
 void
-vesa_xputg(const glyph_info *glyphinfo)
+vesa_xputg(const glyph_info *glyphinfo, const glyph_info *bkglyphinfo UNUSED)
 {
     int glyphnum = glyphinfo->glyph;
     uint32 ch = (uchar) glyphinfo->ttychar;
@@ -701,6 +703,11 @@ vesa_xputg(const glyph_info *glyphinfo)
     map[ry][col].special = special;
     map[ry][col].tileidx = glyphinfo->gm.tileidx;
     map[ry][col].attr = attr;
+
+    if (bkglyphinfo->framecolor != NO_COLOR) {
+        map[ry][col].framecolor = bkglyphinfo->framecolor;
+    }
+
     if (iflags.traditional_view) {
         vesa_WriteChar(ch, col, row, attr);
     } else {
@@ -717,7 +724,7 @@ vesa_xputg(const glyph_info *glyphinfo)
         ++col;
     vesa_gotoloc(col, row);
 }
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 
 /*
  * Cursor location manipulation, and location information fetching
@@ -738,7 +745,7 @@ vesa_gotoloc(int col, int row)
     currow = min(row, LI - 1);
 }
 
-#if defined(USE_TILES) && defined(CLIPPING)
+#if defined(TILES_IN_GLYPHMAP) && defined(CLIPPING)
 static void
 vesa_cliparound(int x, int y)
 {
@@ -857,7 +864,8 @@ vesa_redrawmap(void)
 
     free(p_row);
 }
-#endif /* USE_TILES && CLIPPING */
+#endif /* TILES_IN_GLYPHMAP && CLIPPING */
+
 
 void
 vesa_userpan(enum vga_pan_direction pan)
@@ -1030,7 +1038,7 @@ vesa_Init(void)
     if (inited) return;
     inited = TRUE;
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     /*
      * Attempt to open the required tile files. If we can't
      * don't perform the video mode switch, use TTY code instead.
@@ -1082,7 +1090,7 @@ vesa_Init(void)
         windowprocs.wincap2 |= WC2_U_24BITCOLOR;
     }
 #endif
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     paletteptr = get_palette();
     iflags.tile_view = TRUE;
     iflags.over_view = FALSE;
@@ -1626,6 +1634,8 @@ vesa_flush_text(void)
     chr_cache_size = 0;
 }
 
+extern uint32 curframecolor;   /* video.c */
+
 static void
 vesa_WriteTextRow(int pixx, int pixy, struct VesaCharacter const *t_row,
                   unsigned t_row_width)
@@ -1637,6 +1647,7 @@ vesa_WriteTextRow(int pixx, int pixy, struct VesaCharacter const *t_row,
     unsigned long offset = pixy * (unsigned long)vesa_scan_line + pixx * vesa_pixel_bytes;
     unsigned char fg[4], bg[4];
 
+#if 0
     /* Preprocess the background color */
     if (vesa_pixel_bytes == 1) {
         bg[0] = BACKGROUND_VESA_COLOR;
@@ -1647,6 +1658,7 @@ vesa_WriteTextRow(int pixx, int pixy, struct VesaCharacter const *t_row,
         bg[2] = (pix >> 16) & 0xFF;
         bg[3] = (pix >> 24) & 0xFF;
     }
+#endif
 
     /* First loop: draw one raster line of all row entries */
     for (py = 0; py < (int) vesa_char_height; ++py) {
@@ -1655,6 +1667,17 @@ vesa_WriteTextRow(int pixx, int pixy, struct VesaCharacter const *t_row,
         for (i = 0; i < t_row_width; ++i) {
             uint32 chr = t_row[i].chr;
             uint32 colour = t_row[i].colour;
+
+            /* background color */
+            if (vesa_pixel_bytes == 1) {
+                bg[0] = BACKGROUND_VESA_COLOR;
+            } else {
+                unsigned long pix = vesa_palette[t_row[i].bgcolour];
+                bg[0] =  pix        & 0xFF;
+                bg[1] = (pix >>  8) & 0xFF;
+                bg[2] = (pix >> 16) & 0xFF;
+                bg[3] = (pix >> 24) & 0xFF;
+            }
             /* Preprocess the foreground color */
             if (colour & 0x80000000) {
                 fg[0] =  colour        & 0xFF;
@@ -1910,7 +1933,7 @@ vesa_SetHardPalette(const struct Pixel *palette)
 
     /* First, try the VESA palette function */
     /* Set the tile set and text colors */
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     for (i = 0; i < FIRST_TEXT_COLOR; ++i) {
         p2[i*4 + 0] = palette[i].b >> shift;
         p2[i*4 + 1] = palette[i].g >> shift;
@@ -1937,7 +1960,7 @@ vesa_SetHardPalette(const struct Pixel *palette)
     /* If that didn't work, use the original BIOS function */
     if (regs.x.ax != 0x004F) {
         /* Set the tile set and text colors */
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
         for (i = 0; i < FIRST_TEXT_COLOR; ++i) {
             p2[i*3 + 0] = palette[i].r >> shift;
             p2[i*3 + 1] = palette[i].g >> shift;
@@ -1976,7 +1999,7 @@ vesa_SetSoftPalette(const struct Pixel *palette)
     unsigned i;
 
     /* Set the tile set and text colors */
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     if (palette != NULL) {
         p = palette;
         for (i = 0; i < FIRST_TEXT_COLOR; ++i) {
index c9e4ba2935567229a4eb17e93c1b9ddc10153ca0..7752770ec73120a9343dbae8f826d586624eecad 100644 (file)
@@ -143,7 +143,7 @@ extern int attrib_gr_normal;    /* graphics mode normal attribute */
 extern int attrib_text_intense; /* text mode intense attribute */
 extern int attrib_gr_intense;   /* graphics mode intense attribute */
 extern boolean inmap;           /* in the map window */
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
 extern glyph_map glyphmap[MAX_GLYPH];
 #endif
 
@@ -162,6 +162,7 @@ static struct map_struct {
     int attr;
     unsigned special;
     short int tileidx;
+    uint32 framecolor;
 } map[ROWNO][COLNO]; /* track the glyphs */
 
 extern int total_tiles_used, Tile_corr, Tile_unexplored;  /* from tile.c */
@@ -173,6 +174,7 @@ extern int total_tiles_used, Tile_corr, Tile_unexplored;  /* from tile.c */
             for (x = 0; x < COLNO; ++x) {                       \
                 map[y][x].glyph = GLYPH_UNEXPLORED;             \
                 map[y][x].ch = glyph2ttychar(GLYPH_UNEXPLORED); \
+                map[y][x].framecolor = NO_COLOR;                \
                 map[y][x].attr = 0;                             \
                 map[y][x].special = 0;                          \
                 map[y][x].tileidx = Tile_unexplored;            \
@@ -361,10 +363,11 @@ void vga_xputc(char ch, int attr)
     vga_gotoloc(col, row);
 }
 
-#if defined(USE_TILES)
+#if defined(TILES_IN_GLYPHMAP)
 /* Place tile represent. a glyph at current location */
 void
-vga_xputg(const glyph_info *glyphinfo)
+vga_xputg(const glyph_info *glyphinfo,
+          const glyph_info *bkglyphinfo)
 {
     int glyphnum = glyphinfo->glyph;
     uint32 ch = glyphinfo->ttychar;
@@ -399,6 +402,10 @@ vga_xputg(const glyph_info *glyphinfo)
     attr = (g_attribute == 0) ? attrib_gr_normal : g_attribute;
     map[ry][col].attr = attr;
     map[ry][col].tileidx = glyphinfo->gm.tileidx;
+    if (bkglyphinfo->framecolor != NO_COLOR) {
+        map[ry][col].framecolor = bkglyphinfo->framecolor;
+    }
+
     if (iflags.traditional_view) {
         vga_WriteChar(ch, col, row, attr);
     } else if (!iflags.over_view) {
@@ -416,7 +423,7 @@ vga_xputg(const glyph_info *glyphinfo)
         ++col;
     vga_gotoloc(col, row);
 }
-#endif /* USE_TILES */
+#endif /* TILES_IN_GLYPHMAP */
 
 /*
  * Cursor location manipulation, and location information fetching
@@ -437,7 +444,7 @@ vga_gotoloc(int col, int row)
     currow = min(row, LI - 1);
 }
 
-#if defined(USE_TILES) && defined(CLIPPING)
+#if defined(TILES_IN_GLYPHMAP) && defined(CLIPPING)
 static void
 vga_cliparound(int x, int y UNUSED)
 {
@@ -506,7 +513,7 @@ vga_redrawmap(boolean clearfirst)
             }
         }
 }
-#endif /* USE_TILES && CLIPPING */
+#endif /* TILES_IN_GLYPHMAP && CLIPPING */
 
 void
 vga_userpan(enum vga_pan_direction pan)
@@ -736,7 +743,7 @@ vga_Init(void)
     int i;
     const char *font_name;
 
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     const char *tile_file;
     int tilefailure = 0;
     /*
@@ -776,7 +783,7 @@ vga_Init(void)
     windowprocs.win_cliparound = vga_cliparound;
     /*     vga_NoBorder(BACKGROUND_VGA_COLOR); */ /* Not needed after palette
                                                      mod */
-#ifdef USE_TILES
+#ifdef TILES_IN_GLYPHMAP
     paletteptr = get_palette();
     iflags.tile_view = TRUE;
     iflags.over_view = FALSE;
@@ -930,6 +937,8 @@ vga_detect(void)
     return 0;
 }
 
+extern int curframecolor;    /* video.c */
+
 /*
  * Write character 'ch', at (x,y) and
  * do it using the colour 'colour'.
@@ -944,16 +953,21 @@ vga_WriteChar(uint32 chr, int col, int row, int colour)
     char __far *cp;
     unsigned char fnt;
     int actual_colour = vgacmap[colour];
+    int bgcolor;
     int vplane;
     unsigned char bitmap[ROWS_PER_CELL];
 
     /* if (chr < ' ') chr = ' ';  */ /* assumes ASCII set */
     vga_GetBitmap(chr, bitmap);
 
+    if (curframecolor != NO_COLOR)
+        bgcolor = vgacmap[curframecolor];
+    else
+        bgcolor = BACKGROUND_VGA_COLOR;
+
     x = min(col, (CO - 1));         /* min() used protection from callers */
     pixy = min(row, (LI - 1)) * 16; /* assumes 8 x 16 char set */
-
-    vplane = ~actual_colour & ~BACKGROUND_VGA_COLOR & 0xF;
+    vplane = ~actual_colour & ~bgcolor & 0xF;
     if (vplane != 0) {
         egawriteplane(vplane);
         for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
@@ -961,7 +975,7 @@ vga_WriteChar(uint32 chr, int col, int row, int colour)
             WRITE_ABSOLUTE(cp, (char) 0x00);
         }
     }
-    vplane =  actual_colour & ~BACKGROUND_VGA_COLOR & 0xF;
+    vplane =  actual_colour & ~bgcolor & 0xF;
     if (vplane != 0) {
         egawriteplane(vplane);
         for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
@@ -970,7 +984,7 @@ vga_WriteChar(uint32 chr, int col, int row, int colour)
             WRITE_ABSOLUTE(cp, (char) fnt);
         }
     }
-    vplane = ~actual_colour &  BACKGROUND_VGA_COLOR & 0xF;
+    vplane = ~actual_colour & bgcolor & 0xF;
     if (vplane != 0) {
         egawriteplane(vplane);
         for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
@@ -979,7 +993,7 @@ vga_WriteChar(uint32 chr, int col, int row, int colour)
             WRITE_ABSOLUTE(cp, (char) fnt);
         }
     }
-    vplane =  actual_colour &  BACKGROUND_VGA_COLOR & 0xF;
+    vplane =  actual_colour & bgcolor & 0xF;
     if (vplane != 0) {
         egawriteplane(vplane);
         for (i = 0; i < MAX_ROWS_PER_CELL; ++i) {
index 11e0ab135d0bf423e955c363c9fcf26171c55005..2bd09ba31fc89e30e17bb4d8b78f8bba47f392e3 100644 (file)
@@ -155,7 +155,8 @@ override TARGET_AR = $(TOOLTOP1)/i586-pc-msdosdjgpp-gcc-ar
 override TARGET_STUBEDIT = ../lib/djgpp/i586-pc-msdosdjgpp/bin/stubedit
 MSDOS_TARGET_CFLAGS = -c -O -I../include -I../sys/msdos -I../win/share \
        $(LUAINCL) -DDLB $(PDCURSESDEF) \
-       -DUSE_TILES -DCROSSCOMPILE -DCROSSCOMPILE_TARGET -DCROSS_TO_MSDOS \
+       -DTILES_IN_GLYPHMAP -DCROSSCOMPILE -DCROSSCOMPILE_TARGET \
+       -DCROSS_TO_MSDOS \
         -Wall -Wextra -Wno-missing-field-initializers -Wreturn-type -Wunused \
         -Wformat -Wswitch -Wshadow -Wwrite-strings \
        -Wimplicit -Wimplicit-function-declaration -Wimplicit-int \
index 0877f49fd14b8d5bc5a6dca02ce08ceb4e53a042..3484334e1bead954ced1a2d6bf459337790ae26f 100644 (file)
@@ -2003,6 +2003,7 @@ clean:
 #   * -c (which is included in cflagsBuild) substituted with -Fo$@
 #   * "-o $@ " is removed
 #   * win/X11/Window.o commented due to conflict with pdcurses
+#   * win/share/cppregex.o commented out due to earlier rule
 #   * commented out $(TARGETPFX)tile.o: tile.c $(HACK_H)
 #   * commented out $(TARGETPFX)cppregex.o because it has its own rule already
 #   * $(TARGETPFX) becomes $(OTTY) in 1st batch with $(TTYDEF)
index b9ecb669223ad4baea1869cc96fbb955259a3ca5..35e5527344af4ff78652003e5b4367b40ad44afd 100644 (file)
@@ -86,6 +86,7 @@ typedef struct {
     WORD attr;
     long color24;
     int color256idx;
+    const char *bkcolorseq;
     const char *colorseq;
 #endif /* VIRTUAL_TERMINAL_SEQUENCES */
 } cell_t;
@@ -170,6 +171,7 @@ struct console_t {
     WORD foreground;
     WORD attr;
     int current_nhcolor;
+    int current_nhbkcolor;
     int current_nhattr[ATR_INVERSE+1];
     COORD cursor;
     HANDLE hConOut;
@@ -210,6 +212,7 @@ struct console_t {
     (FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED), /* foreground */
     0,                                                     /* attr */
     0,                                                     /* current_nhcolor */
+    0,                                                     /* current_nhbkcolor */
 #endif /* VIRTUAL_TERMINAL_SEQUENCES */
     {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE},
 #ifndef VIRTUAL_TERMINAL_SEQUENCES
@@ -313,6 +316,7 @@ static INPUT_RECORD bogus_key;
 #ifdef VIRTUAL_TERMINAL_SEQUENCES
 long customcolors[CLR_MAX];
 const char *esc_seq_colors[CLR_MAX];
+const char *esc_seq_bkcolors[CLR_MAX];
 
 struct rgbvalues {
     int idx;
@@ -471,6 +475,8 @@ rgbtable_to_long(struct rgbvalues *tbl)
 static void
 init_custom_colors(void)
 {
+    char bkcolorbuf[32];
+
     customcolors[CLR_BLACK] = rgbtable_to_long(&rgbtable[131]);
     customcolors[CLR_RED] = rgbtable_to_long(&rgbtable[5]);
     customcolors[CLR_GREEN] = rgbtable_to_long(&rgbtable[31]);
@@ -507,6 +513,40 @@ init_custom_colors(void)
     esc_seq_colors[CLR_BRIGHT_BLUE] = "\x1b[34m\x1b[94m";
     esc_seq_colors[CLR_BRIGHT_MAGENTA] = "\x1b[35m\x1b[95m";
     esc_seq_colors[CLR_BRIGHT_CYAN] = "\x1b[36m\x1b[96m";
+
+     /* Sprintf(tmp, "\033[%dm", ((color % 8) + 40)); */
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BLACK % 8) + 40));
+    esc_seq_bkcolors[CLR_BLACK] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_RED % 8) + 40));
+    esc_seq_bkcolors[CLR_RED] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_GREEN % 8) + 40));
+    esc_seq_bkcolors[CLR_GREEN] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_YELLOW % 8) + 40));
+    esc_seq_bkcolors[CLR_YELLOW] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BLUE % 8) + 40));
+    esc_seq_bkcolors[CLR_BLUE] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_MAGENTA % 8) + 40));
+    esc_seq_bkcolors[CLR_MAGENTA] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_CYAN % 8) + 40));
+    esc_seq_bkcolors[CLR_CYAN] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_WHITE % 8) + 40));
+    esc_seq_bkcolors[CLR_WHITE] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BROWN % 8) + 40));
+    esc_seq_bkcolors[CLR_BROWN] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_GRAY % 8) + 40));
+    esc_seq_bkcolors[CLR_GRAY] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((NO_COLOR % 8) + 40));
+    esc_seq_bkcolors[NO_COLOR] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_ORANGE % 8) + 40));
+    esc_seq_bkcolors[CLR_ORANGE] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_BLUE % 8) + 40));
+    esc_seq_bkcolors[CLR_BRIGHT_BLUE] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_GREEN % 8) + 40));
+    esc_seq_bkcolors[CLR_BRIGHT_GREEN] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_MAGENTA % 8) + 40));
+    esc_seq_bkcolors[CLR_BRIGHT_MAGENTA] = dupstr(bkcolorbuf);
+    Snprintf(bkcolorbuf, sizeof bkcolorbuf, "\x1b[%dm", ((CLR_BRIGHT_CYAN % 8) + 40));
+    esc_seq_bkcolors[CLR_BRIGHT_CYAN] = dupstr(bkcolorbuf);
 }
 
 void emit_start_bold(void);
@@ -715,18 +755,20 @@ DWORD error_result;
 /* Console buffer flipping support */
 #ifdef VIRTUAL_TERMINAL_SEQUENCES
 enum do_flags {
-    do_utf8_content = 1,
-    do_wide_content = 2,
-    do_colorseq = 4,
-    do_color24 = 8,
-    do_newattr = 16
+    do_utf8_content = 0x01,
+    do_wide_content = 0x02,
+    do_colorseq     = 0x04,
+    do_color24      = 0x08,
+    do_newattr      = 0x10,
+    do_bkcolorseq   = 0x20,
 };
 enum did_flags {
-    did_utf8_content = 1,
-    did_wide_content = 2,
-    did_colorseq = 4,
-    did_color24 = 8,
-    did_newattr = 16
+    did_utf8_content = 0x01,
+    did_wide_content = 0x02,
+    did_colorseq     = 0x04,
+    did_color24      = 0x08,
+    did_newattr      = 0x10,
+    did_bkcolorseq   = 0x20,
 };
 
 static void
@@ -753,6 +795,8 @@ back_buffer_flip(void)
                 do_anything |= do_colorseq;
             if (back->attr != front->attr)
                 do_anything |= do_newattr;
+            if (back->bkcolorseq != front->bkcolorseq)
+                do_anything |= do_bkcolorseq;
 #ifdef UTF8_FROM_CORE
             if (!SYMHANDLING(H_UTF8)) {
                 if (console.has_unicode
@@ -800,7 +844,15 @@ back_buffer_flip(void)
                     WriteConsoleA(console.hConOut, back->colorseq,
                                   (int) strlen(back->colorseq), &unused,
                                   &reserved);
-                } else {
+                }
+                if (back->bkcolorseq) {
+                    did_anything |= did_bkcolorseq;
+                    WriteConsoleA(console.hConOut, back->bkcolorseq,
+                                  (int) strlen(back->bkcolorseq), &unused,
+                                  &reserved);
+                }
+                if ((did_anything | (did_colorseq | did_bkcolorseq | did_color24)) == 0) {
+                    did_anything &= ~(did_bkcolorseq | did_color24);
                     did_anything |= did_colorseq;
                     emit_default_color();
                 }
@@ -1276,6 +1328,7 @@ xputc_core(int ch)
         /* this causes way too much performance degradation */
         /* cell.color24 = customcolors[console.current_nhcolor]; */
         cell.colorseq = esc_seq_colors[console.current_nhcolor];
+        cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor];
         cell.attr = console.attr;
         // if (console.color24)
         //    __debugbreak();
@@ -1370,6 +1423,7 @@ g_putch(int in_ch)
 #else
     cell.attr = console.attr;
     cell.colorseq = esc_seq_colors[console.current_nhcolor];
+    cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor];
     cell.color24 = console.color24 ? console.color24 : 0L;
     cell.color256idx = 0;
     wch[1] = 0;
@@ -1416,6 +1470,7 @@ g_pututf8(uint8 *sequence)
     cell_t cell;
     cell.attr = console.attr;
     cell.colorseq = esc_seq_colors[console.current_nhcolor];
+    cell.bkcolorseq = esc_seq_bkcolors[console.current_nhbkcolor];
     cell.color24 = console.color24 ? console.color24 : 0L;
     cell.color256idx =console.color256idx ? console.color256idx : 0;
     Snprintf((char *) cell.utf8str, sizeof cell.utf8str, "%s",
@@ -1718,6 +1773,17 @@ term_start_color(int color)
     console.current_nhcolor = NO_COLOR;
 }
 
+void
+term_start_bgcolor(int color)
+{
+#ifdef TEXTCOLOR
+    if (color >= 0 && color < CLR_MAX) {
+        console.current_nhbkcolor = color;
+    } else
+#endif
+    console.current_nhbkcolor = NO_COLOR;
+}
+
 void
 term_end_color(void)
 {
@@ -1728,6 +1794,7 @@ term_end_color(void)
     console.attr = (console.foreground | console.background);
 #endif /* ! VIRTUAL_TERMINAL_SEQUENCES */
     console.current_nhcolor = NO_COLOR;
+    console.current_nhbkcolor = NO_COLOR;
 }
 
 void
@@ -1849,7 +1916,7 @@ tty_utf8graphics_fixup(void)
         /* the locale */
         if (console.localestr)
             free(console.localestr);
-        console.localestr = strdup(setlocale(LC_ALL, ".UTF8"));
+        console.localestr = dupstr(setlocale(LC_ALL, ".UTF8"));
         /* the code page */
         SetConsoleOutputCP(65001);
         console.code_page = GetConsoleOutputCP();
@@ -1917,7 +1984,7 @@ tty_ibmgraphics_fixup(void)
     if (localestr) {
         if (console.localestr)
             free(console.localestr);
-        console.localestr = strdup(localestr);
+        console.localestr = dupstr(localestr);
     }
     set_known_good_console_font();
     /* the console mode */
@@ -2201,7 +2268,7 @@ restore_original_console_font(void)
         if (tmplocalestr) {
             if (console.localestr)
                 free(console.localestr);
-            console.localestr = strdup(tmplocalestr);
+            console.localestr = dupstr(tmplocalestr);
         }
         success = SetConsoleOutputCP(console.orig_code_page);
 #endif /* VIRTUAL_TERMINAL_SEQUENCES */
@@ -2455,7 +2522,7 @@ void nethack_enter_consoletty(void)
     if (localestr) {
         if (console.localestr)
             free(console.localestr);
-        console.localestr = strdup(localestr);
+        console.localestr = dupstr(localestr);
     }
     console.code_page = console.orig_code_page;
     if (console.has_unicode) {
index 66fd6d1b1afdd5a308e36ec480897b91075f51d5..16022e83d3c8ed7a7745d597369142adcea4436d 100644 (file)
@@ -200,10 +200,10 @@ static struct grep_var grep_vars[] = { { "0", 0 },
 #else
                                        { "USER_SOUNDS", 0 },
 #endif
-#if defined(USE_TILES)
-                                       { "USE_TILES", 1 },
+#if defined(TILES_IN_GLYPHMAP)
+                                       { "TILES_IN_GLYPHMAP", 1 },
 #else
-                                       { "USE_TILES", 0 },
+                                       { "TILES_IN_GLYPHMAP", 0 },
 #endif
 #if defined(VAR_PLAYGROUND)
                                        { "VAR_PLAYGROUND", 1 },
index 72c06efb7241b5ffdbdb343574fc9ba0045f25eb..244730108c59c927edc24da6d40f9c72a57940b9 100644 (file)
@@ -17,7 +17,7 @@
        QT_GRAPHICS GNOME_GRAPHICS GEM_GRAPHICS/;
 
 # Game Features:
-@feature = qw/ZEROCOMP USE_TILES ASCIIGRAPH CLIPPING TEXTCOLOR
+@feature = qw/ZEROCOMP TILES_IN_GLYPHMAP ASCIIGRAPH CLIPPING TEXTCOLOR
        COMPRESS ZLIB_COMP RANDOM SECURE USER_SOUNDS
        SAFERHANGUP MFLOPPY NOCWD_ASSUMPTIONS
        VAR_PLAYGROUND DLB SHELL SUSPEND NOSAVEONHANGUP HANGUPHANDLING
index 334314bb09a718260456d5ae4507c9d0fd9dd4cc..2eab34028c1e3f0a2eb54edd169bd529e101dbd4 100644 (file)
@@ -1438,6 +1438,14 @@ term_start_color(int color)
     if (color < CLR_MAX && hilites[color] && *hilites[color])
         xputs(hilites[color]);
 }
+
+void
+term_start_bgcolor(int color)
+{
+    char tmp[8];
+    Sprintf(tmp, "\033[%dm", ((color % 8) + 40));
+    xputs(tmp);
+}
 #endif /* TEXTCOLOR */
 
 #ifdef ENHANCED_SYMBOLS
index 95ce1aa6d5ded46e8e0e2a41f9ea4900a536a0a8..aa83f5b8fcd4263b8dd7698869bffbfbb28f0dc4 100644 (file)
@@ -185,7 +185,7 @@ static char winpanicstr[] = "Bad window id %d";
 char defmorestr[] = "--More--";
 
 #ifdef CLIPPING
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
 boolean clipping = FALSE; /* clipping on? */
 int clipx = 0, clipxmax = 0;
 int clipy = 0, clipymax = 0;
@@ -196,7 +196,7 @@ static int clipy = 0, clipymax = 0;
 #endif
 #endif /* CLIPPING */
 
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
 extern void adjust_cursor_flags(struct WinDesc *);
 #endif
 
@@ -835,7 +835,7 @@ tty_create_nhwindow(int type)
             iflags.wc2_statuslines = 2;
         newwin->offx = 0;
         rowoffset = ttyDisplay->rows - iflags.wc2_statuslines;
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
         if (iflags.grmode) {
             newwin->offy = rowoffset;
         } else
@@ -1946,7 +1946,7 @@ tty_curs(winid window,
 
     print_vt_code2(AVTC_SELECT_WINDOW, window);
 
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
     adjust_cursor_flags(cw);
 #endif
     cw->curx = --x; /* column 0 is never used */
@@ -3291,7 +3291,7 @@ docorner(register int xmin, register int ymax, int ystart_between_menu_pages)
 #ifdef CLIPPING
         if (y < (int) cw->offy || y + clipy > ROWNO)
             continue; /* only refresh board */
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
         if (iflags.tile_view)
             row_refresh((xmin / 2) + clipx - ((int) cw->offx / 2), COLNO - 1,
                         y + clipy - (int) cw->offy);
@@ -3441,7 +3441,7 @@ tty_print_glyph(
     winid window,
     coordxy x, coordxy y,
     const glyph_info *glyphinfo,
-    const glyph_info *bkglyphinfo UNUSED)
+    const glyph_info *bkglyphinfo)
 {
     boolean inverse_on = FALSE, colordone = FALSE, glyphdone = FALSE;
     int ch, color;
@@ -3508,7 +3508,13 @@ tty_print_glyph(
        BW_LAVA and BW_ICE won't ever be set when color is on;
        (tried bold for ice but it didn't look very good; inverse is easier
        to see although the Valkyrie quest ends up being hard on the eyes) */
-    if (((special & MG_PET) != 0 && iflags.hilite_pet)
+    if (iflags.use_color
+        && bkglyphinfo && bkglyphinfo->framecolor != NO_COLOR) {
+#ifdef TEXTCOLOR
+        ttyDisplay->framecolor = bkglyphinfo->framecolor;
+        term_start_bgcolor(bkglyphinfo->framecolor);
+#endif
+    } else if (((special & MG_PET) != 0 && iflags.hilite_pet)
         || ((special & MG_OBJPILE) != 0 && iflags.hilite_pile)
         || ((special & MG_FEMALE) != 0 && wizard && iflags.wizmgender)
         || ((special & (MG_DETECT | MG_BW_LAVA | MG_BW_ICE | MG_BW_SINK)) != 0
@@ -3517,9 +3523,9 @@ tty_print_glyph(
         inverse_on = TRUE;
     }
 
-#if defined(USE_TILES) && defined(MSDOS)
+#if defined(TILES_IN_GLYPHMAP) && defined(MSDOS)
     if (iflags.grmode && iflags.tile_view) {
-        xputg(glyphinfo);
+        xputg(glyphinfo, bkglyphinfo);
         glyphdone = TRUE;
     }
 #endif
@@ -3542,9 +3548,9 @@ tty_print_glyph(
         /* turn off color as well, turning off ATR_INVERSE may have done
           this already and if so, we won't know the current state unless
           we do it explicitly */
-        if (ttyDisplay->color != NO_COLOR) {
+        if (ttyDisplay->color != NO_COLOR || ttyDisplay->framecolor != NO_COLOR) {
             term_end_color();
-            ttyDisplay->color = NO_COLOR;
+            ttyDisplay->color = ttyDisplay->framecolor = NO_COLOR;
         }
 #endif
 #ifdef ENHANCED_SYMBOLS
@@ -3558,6 +3564,16 @@ tty_print_glyph(
     ttyDisplay->curx++;   /* the real cursor moved too */
 }
 
+#ifdef NO_TERMS  /* termcap.o isn't linked in */
+#if !defined(MSDOS) && !defined(WIN32)
+void
+term_start_bgcolor(int color)
+{
+    /* placeholder for now */
+}
+#endif  /* !MSDOS && !WIN32 */
+#endif  /* NO_TERMS */
+
 void
 tty_raw_print(const char *str)
 {