From 2fc0d25d458b69a49d9c4d9dcd172a79d1abc2b3 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 1 Jan 2023 19:55:02 -0500 Subject: [PATCH] introduce support for coloring the frame behind a map location 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. --- dat/opthelp | 2 +- include/config.h | 4 +- include/decl.h | 5 +- include/display.h | 6 +- include/extern.h | 3 +- include/global.h | 8 +- include/optlist.h | 6 +- include/pcconf.h | 2 +- include/winX.h | 3 + include/wincurs.h | 4 +- include/wintty.h | 6 +- include/wintype.h | 17 ++++ outdated/sys/amiga/winchar.c | 2 +- outdated/sys/msdos/Makefile.BC | 2 +- outdated/sys/msdos/Makefile.MSC | 4 +- .../sys/unix/hints/include/cross-amiga-pre | 2 +- src/decl.c | 4 + src/display.c | 63 ++++++------ src/do_name.c | 47 ++++++++- src/mdlib.c | 2 +- src/o_init.c | 8 +- src/symbols.c | 4 +- sys/msdos/Makefile.GCC | 4 +- sys/msdos/msdos.c | 4 +- sys/msdos/pckeys.c | 4 +- sys/msdos/pctiles.c | 4 +- sys/msdos/pctiles.h | 4 +- sys/msdos/pcvideo.h | 4 +- sys/msdos/video.c | 30 +++++- sys/msdos/vidvesa.c | 45 ++++++--- sys/msdos/vidvga.c | 40 +++++--- sys/unix/hints/include/cross-pre.370 | 3 +- sys/windows/Makefile.nmake | 1 + sys/windows/consoletty.c | 97 ++++++++++++++++--- util/mdgrep.h | 6 +- util/mdgrep.pl | 2 +- win/tty/termcap.c | 8 ++ win/tty/wintty.c | 38 +++++--- 38 files changed, 365 insertions(+), 133 deletions(-) diff --git a/dat/opthelp b/dat/opthelp index 1ee667f77..c48dd72f9 100644 --- a/dat/opthelp +++ b/dat/opthelp @@ -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. diff --git a/include/config.h b/include/config.h index 211afa134..922683612 100644 --- a/include/config.h +++ b/include/config.h @@ -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 diff --git a/include/decl.h b/include/decl.h index 0cac00374..90c3232fa 100644 --- a/include/decl.h +++ b/include/decl.h @@ -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 */ }; diff --git a/include/display.h b/include/display.h index 021fd0d1c..1a193fd60 100644 --- a/include/display.h +++ b/include/display.h @@ -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; diff --git a/include/extern.h b/include/extern.h index 2c9c32171..f3dd64ed3 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 diff --git a/include/global.h b/include/global.h index bdef8fb05..bb49feb77 100644 --- a/include/global.h +++ b/include/global.h @@ -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 diff --git a/include/optlist.h b/include/optlist.h index 8d47ae35b..c383afb06 100644 --- a/include/optlist.h +++ b/include/optlist.h @@ -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 diff --git a/include/pcconf.h b/include/pcconf.h index 8362efaf2..14eda0be1 100644 --- a/include/pcconf.h +++ b/include/pcconf.h @@ -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 diff --git a/include/winX.h b/include/winX.h index 830131ee8..98bf68e9f 100644 --- a/include/winX.h +++ b/include/winX.h @@ -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 { diff --git a/include/wincurs.h b/include/wincurs.h index 88b4da29a..5e057fae9 100644 --- a/include/wincurs.h +++ b/include/wincurs.h @@ -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); diff --git a/include/wintty.h b/include/wintty.h index 7973776a1..b8446f906 100644 --- a/include/wintty.h +++ b/include/wintty.h @@ -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 *); diff --git a/include/wintype.h b/include/wintype.h index 893620d2b..77b8af6c0 100644 --- a/include/wintype.h +++ b/include/wintype.h @@ -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 */ diff --git a/outdated/sys/amiga/winchar.c b/outdated/sys/amiga/winchar.c index 222d7952a..245eaee41 100644 --- a/outdated/sys/amiga/winchar.c +++ b/outdated/sys/amiga/winchar.c @@ -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 diff --git a/outdated/sys/msdos/Makefile.BC b/outdated/sys/msdos/Makefile.BC index 5d727c405..f798e15c7 100644 --- a/outdated/sys/msdos/Makefile.BC +++ b/outdated/sys/msdos/Makefile.BC @@ -363,7 +363,7 @@ DLBFLG = # ! IF ("$(TILESUPPORT)"=="Y") -TILFLG = $(CDEFINE)USE_TILES +TILFLG = $(CDEFINE)TILES_IN_GLYPHMAP ! ELSE TILFLG = ! ENDIF diff --git a/outdated/sys/msdos/Makefile.MSC b/outdated/sys/msdos/Makefile.MSC index 9d843d36b..3d3e44435 100644 --- a/outdated/sys/msdos/Makefile.MSC +++ b/outdated/sys/msdos/Makefile.MSC @@ -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 diff --git a/outdated/sys/unix/hints/include/cross-amiga-pre b/outdated/sys/unix/hints/include/cross-amiga-pre index 95e1af165..fb04be1c2 100644 --- a/outdated/sys/unix/hints/include/cross-amiga-pre +++ b/outdated/sys/unix/hints/include/cross-amiga-pre @@ -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 diff --git a/src/decl.c b/src/decl.c index 8362d0862..43586368c 100644 --- a/src/decl.c +++ b/src/decl.c @@ -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 */ }; diff --git a/src/display.c b/src/display.c index 66b4c35d1..763777e3c 100644 --- a/src/display.c +++ b/src/display.c @@ -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 diff --git a/src/do_name.c b/src/do_name.c index 3145b296a..ba1b35257 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -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; } diff --git a/src/mdlib.c b/src/mdlib.c index df3eb84d4..d85c0dd0a 100644 --- a/src/mdlib.c +++ b/src/mdlib.c @@ -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 diff --git a/src/o_init.c b/src/o_init.c index 1b88b80a3..196bb3ed1 100644 --- a/src/o_init.c +++ b/src/o_init.c @@ -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 } diff --git a/src/symbols.c b/src/symbols.c index 383d8b8eb..e35b41703 100644 --- a/src/symbols.c +++ b/src/symbols.c @@ -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 diff --git a/sys/msdos/Makefile.GCC b/sys/msdos/Makefile.GCC index 92c4737fc..74c14523a 100644 --- a/sys/msdos/Makefile.GCC +++ b/sys/msdos/Makefile.GCC @@ -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 = #========================================== diff --git a/sys/msdos/msdos.c b/sys/msdos/msdos.c index b6d08b478..735e84dd9 100644 --- a/sys/msdos/msdos.c +++ b/sys/msdos/msdos.c @@ -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; diff --git a/sys/msdos/pckeys.c b/sys/msdos/pckeys.c index 776e0286c..3c66cb6b7 100644 --- a/sys/msdos/pckeys.c +++ b/sys/msdos/pckeys.c @@ -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*/ diff --git a/sys/msdos/pctiles.c b/sys/msdos/pctiles.c index 5609db1be..4e942e534 100644 --- a/sys/msdos/pctiles.c +++ b/sys/msdos/pctiles.c @@ -12,7 +12,7 @@ #include "hack.h" -#ifdef USE_TILES +#ifdef TILES_IN_GLYPHMAP #if defined(__GO32__) || defined(__DJGPP__) #include @@ -247,6 +247,6 @@ ReadPackedTileFile(int tilenum, char (*pta)[TILE_X]) return 0; } #endif -#endif /* USE_TILES */ +#endif /* TILES_IN_GLYPHMAP */ /* pctiles.c */ diff --git a/sys/msdos/pctiles.h b/sys/msdos/pctiles.h index 5241be4dc..eed5a87ec 100644 --- a/sys/msdos/pctiles.h +++ b/sys/msdos/pctiles.h @@ -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 */ diff --git a/sys/msdos/pcvideo.h b/sys/msdos/pcvideo.h index cee982c22..dfd9fc1c2 100644 --- a/sys/msdos/pcvideo.h +++ b/sys/msdos/pcvideo.h @@ -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); diff --git a/sys/msdos/video.c b/sys/msdos/video.c index 04f9060e3..24362cfc6 100644 --- a/sys/msdos/video.c +++ b/sys/msdos/video.c @@ -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 } } diff --git a/sys/msdos/vidvesa.c b/sys/msdos/vidvesa.c index 8c382fe5d..e616636e5 100644 --- a/sys/msdos/vidvesa.c +++ b/sys/msdos/vidvesa.c @@ -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) { diff --git a/sys/msdos/vidvga.c b/sys/msdos/vidvga.c index c9e4ba293..7752770ec 100644 --- a/sys/msdos/vidvga.c +++ b/sys/msdos/vidvga.c @@ -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) { diff --git a/sys/unix/hints/include/cross-pre.370 b/sys/unix/hints/include/cross-pre.370 index 11e0ab135..2bd09ba31 100644 --- a/sys/unix/hints/include/cross-pre.370 +++ b/sys/unix/hints/include/cross-pre.370 @@ -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 \ diff --git a/sys/windows/Makefile.nmake b/sys/windows/Makefile.nmake index 0877f49fd..3484334e1 100644 --- a/sys/windows/Makefile.nmake +++ b/sys/windows/Makefile.nmake @@ -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) diff --git a/sys/windows/consoletty.c b/sys/windows/consoletty.c index b9ecb6692..35e552734 100644 --- a/sys/windows/consoletty.c +++ b/sys/windows/consoletty.c @@ -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) { diff --git a/util/mdgrep.h b/util/mdgrep.h index 66fd6d1b1..16022e83d 100644 --- a/util/mdgrep.h +++ b/util/mdgrep.h @@ -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 }, diff --git a/util/mdgrep.pl b/util/mdgrep.pl index 72c06efb7..244730108 100644 --- a/util/mdgrep.pl +++ b/util/mdgrep.pl @@ -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 diff --git a/win/tty/termcap.c b/win/tty/termcap.c index 334314bb0..2eab34028 100644 --- a/win/tty/termcap.c +++ b/win/tty/termcap.c @@ -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 diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 95ce1aa6d..aa83f5b8f 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -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) { -- 2.40.0