diff --git a/doc/window.doc b/doc/window.doc index 0b7cbf52f..da1790253 100644 --- a/doc/window.doc +++ b/doc/window.doc @@ -926,7 +926,8 @@ These are not part of the interface. They may be called by your window port routines to perform the desired task, instead of duplicating the necessary code in each window port. -int mapglyph(int glyph, int *ochar, int *ocolor, unsigned *special, int x, int y) +int mapglyph(int glyph, int *ochar, int *ocolor, unsigned *special, + int x, int y, unsigned mgflags) -- Maps glyph at x,y to NetHack ascii character and color. The return value is an index into the showsyms[] array, in case a port wants to index into its own alternative diff --git a/include/extern.h b/include/extern.h index 8be649565..aba2bdcfd 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1209,7 +1209,7 @@ E boolean FDECL(usmellmon, (struct permonst *)); /* ### mapglyph.c ### */ -E int FDECL(mapglyph, (int, int *, int *, unsigned *, int, int)); +E int FDECL(mapglyph, (int, int *, int *, unsigned *, int, int, unsigned)); E char *FDECL(encglyph, (int)); E char *FDECL(decode_mixed, (char *, const char *)); E void FDECL(genl_putmixed, (winid, int, const char *)); diff --git a/include/hack.h b/include/hack.h index 369519479..57600414f 100644 --- a/include/hack.h +++ b/include/hack.h @@ -78,6 +78,10 @@ enum dismount_types { DISMOUNT_BYCHOICE = 6 }; +/* mgflags for mapglyph() */ +#define MG_FLAG_NORMAL 0x00 +#define MG_FLAG_NOOVERRIDE 0x01 + /* Special returns from mapglyph() */ #define MG_CORPSE 0x01 #define MG_INVIS 0x02 diff --git a/src/detect.c b/src/detect.c index 6b4cd342a..c874dd47d 100644 --- a/src/detect.c +++ b/src/detect.c @@ -1932,7 +1932,7 @@ dump_map() glyph = reveal_terrain_getglyph(x, y, FALSE, u.uswallow, default_glyph, subset); - (void) mapglyph(glyph, &ch, &color, &special, x, y); + (void) mapglyph(glyph, &ch, &color, &special, x, y, 0); buf[x - 1] = ch; if (ch != ' ') { blankrow = FALSE; diff --git a/src/mapglyph.c b/src/mapglyph.c index 912c003b6..c324d43d5 100644 --- a/src/mapglyph.c +++ b/src/mapglyph.c @@ -59,10 +59,11 @@ static const int explcolors[] = { /*ARGSUSED*/ int -mapglyph(glyph, ochar, ocolor, ospecial, x, y) +mapglyph(glyph, ochar, ocolor, ospecial, x, y, mgflags) int glyph, *ocolor, x, y; int *ochar; unsigned *ospecial; +unsigned mgflags; { register int offset, idx; int color = NO_COLOR; @@ -223,7 +224,7 @@ unsigned *ospecial; } /* These were requested by a blind player to enhance screen reader use */ - if (sysopt.accessibility == 1) { + if (sysopt.accessibility == 1 && !(mgflags & MG_FLAG_NOOVERRIDE)) { int ovidx; if ((special & MG_PET) != 0) { @@ -300,7 +301,7 @@ const char *str; gv = (gv * 16) + ((int) (dp - hex) / 2); else break; - so = mapglyph(gv, &ch, &oc, &os, 0, 0); + so = mapglyph(gv, &ch, &oc, &os, 0, 0, 0); *put++ = g.showsyms[so]; /* 'str' is ready for the next loop iteration and '*str' should not be copied at the end of this iteration */ diff --git a/src/pager.c b/src/pager.c index a0119aa2d..ab2e154d0 100644 --- a/src/pager.c +++ b/src/pager.c @@ -826,7 +826,7 @@ struct permonst **for_supplement; glyph = glyph_at(cc.x, cc.y); /* Convert glyph at selected position to a symbol for use below. */ - (void) mapglyph(glyph, &sym, &oc, &os, cc.x, cc.y); + (void) mapglyph(glyph, &sym, &oc, &os, cc.x, cc.y, 0); Sprintf(prefix, "%s ", encglyph(glyph)); } else @@ -1055,21 +1055,10 @@ struct permonst **for_supplement; if (looked) { int oc = 0, idx = SYM_PET_OVERRIDE + SYM_OFF_X; unsigned os = 0; - nhsym save_override; - if (Is_rogue_level(&u.uz)) { - save_override = g.ov_rogue_syms[idx]; - g.ov_rogue_syms[idx] = 0; - } else { - save_override = g.ov_primary_syms[idx]; - g.ov_primary_syms[idx] = 0; - } /* convert to symbol without override in effect */ - (void) mapglyph(glyph, &sym, &oc, &os, cc.x, cc.y); - if (Is_rogue_level(&u.uz)) - g.ov_rogue_syms[idx] = save_override; - else - g.ov_primary_syms[idx] = save_override; + (void) mapglyph(glyph, &sym, &oc, &os, + cc.x, cc.y, MG_FLAG_NOOVERRIDE); goto check_monsters; } break; diff --git a/src/region.c b/src/region.c index 2e177291f..63cb9ca29 100644 --- a/src/region.c +++ b/src/region.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 region.c $NHDT-Date: 1573933605 2019/11/16 19:46:45 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.44 $ */ +/* NetHack 3.6 region.c $NHDT-Date: 1573957877 2019/11/17 02:31:17 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.45 $ */ /* Copyright (c) 1996 by Jean-Christophe Collet */ /* NetHack may be freely redistributed. See license for details. */ @@ -338,6 +338,11 @@ NhRegion *reg; if (i == g.n_regions) return; + /* remove region before potential newsym() calls, but don't free it yet */ + if (--g.n_regions != i) + g.regions[i] = g.regions[g.n_regions]; + g.regions[g.n_regions] = (NhRegion *) 0; + /* Update screen if necessary */ reg->ttl = -2L; /* for visible_region_at */ if (reg->visible) @@ -347,9 +352,6 @@ NhRegion *reg; newsym(x, y); free_region(reg); - g.regions[i] = g.regions[g.n_regions - 1]; - g.regions[g.n_regions - 1] = (NhRegion *) 0; - g.n_regions--; } /* diff --git a/sys/amiga/winfuncs.c b/sys/amiga/winfuncs.c index 84838ed22..380954681 100644 --- a/sys/amiga/winfuncs.c +++ b/sys/amiga/winfuncs.c @@ -1978,7 +1978,7 @@ if(u.uz.dlevel != x){ } else /* AMII, or Rogue level in either version */ { /* map glyph to character and color */ - (void) mapglyph(glyph, &och, &color, &special, x, y); + (void) mapglyph(glyph, &och, &color, &special, x, y, 0); ch = (uchar) och; if (WINVERS_AMIV) { /* implies Rogue level here */ amii_curs(win, x, y); diff --git a/sys/wince/mhmap.c b/sys/wince/mhmap.c index 61a2b9f52..dbdbb5f0b 100644 --- a/sys/wince/mhmap.c +++ b/sys/wince/mhmap.c @@ -632,7 +632,7 @@ onPaint(HWND hWnd) #else /* rely on NetHack core helper routine */ (void) mapglyph(data->map[i][j], &mgch, &color, - &special, i, j); + &special, i, j, 0); ch = (char) mgch; if (((special & MG_PET) && iflags.hilite_pet) || ((special & MG_DETECT) diff --git a/win/Qt/qt_win.cpp b/win/Qt/qt_win.cpp index a431a5736..46237679a 100644 --- a/win/Qt/qt_win.cpp +++ b/win/Qt/qt_win.cpp @@ -1688,7 +1688,7 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event) painter.setPen( green ); /* map glyph to character and color */ - (void)mapglyph(g, &och, &color, &special, i, j); + (void)mapglyph(g, &och, &color, &special, i, j, 0); ch = (uchar)och; #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); diff --git a/win/Qt4/qt4map.cpp b/win/Qt4/qt4map.cpp index f3425bab2..00598e79b 100644 --- a/win/Qt4/qt4map.cpp +++ b/win/Qt4/qt4map.cpp @@ -137,7 +137,7 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) painter.setPen( Qt::green ); /* map glyph to character and color */ - mapglyph(g, &ch, &color, &special, i, j); + mapglyph(g, &ch, &color, &special, i, j, 0); ch = cp437(ch); #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); @@ -176,7 +176,7 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) int color; int ch; unsigned special; - mapglyph(g, &ch, &color, &special, i, j); + mapglyph(g, &ch, &color, &special, i, j, 0); qt_settings->glyphs().drawCell(painter, g, i, j); #ifdef TEXTCOLOR if (((special & MG_PET) != 0) && ::iflags.hilite_pet) { @@ -829,7 +829,7 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event) painter.setPen( Qt::green ); /* map glyph to character and color */ - mapglyph(g, &ch, &color, &special, i, j); + mapglyph(g, &ch, &color, &special, i, j, 0); #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); #endif @@ -859,7 +859,7 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event) int color; int ch; unsigned special; - mapglyph(g, &ch, &color, &special, i, j); + mapglyph(g, &ch, &color, &special, i, j, 0); qt_settings->glyphs().drawCell(painter, g, i, j); #ifdef TEXTCOLOR if (((special & MG_PET) != 0) && ::iflags.hilite_pet) { diff --git a/win/X11/winmap.c b/win/X11/winmap.c index b8f0be3d4..f8571af91 100644 --- a/win/X11/winmap.c +++ b/win/X11/winmap.c @@ -107,7 +107,7 @@ int bkglyph UNUSED; #endif /* map glyph to character and color */ - (void) mapglyph(glyph, &och, &color, &special, x, y); + (void) mapglyph(glyph, &och, &color, &special, x, y, 0); ch = (uchar) och; if (special != map_info->tile_map.glyphs[y][x].special) { diff --git a/win/curses/cursdial.c b/win/curses/cursdial.c index 72c5f23e7..cf88c022b 100644 --- a/win/curses/cursdial.c +++ b/win/curses/cursdial.c @@ -1176,7 +1176,7 @@ menu_display_page(nhmenu *menu, WINDOW * win, int page_num, char *selectors) if (menu_item_ptr->glyph != NO_GLYPH && iflags.use_menu_glyphs) { unsigned special; /*notused */ - mapglyph(menu_item_ptr->glyph, &curletter, &color, &special, 0, 0); + mapglyph(menu_item_ptr->glyph, &curletter, &color, &special, 0, 0, 0); curses_toggle_color_attr(win, color, NONE, ON); mvwaddch(win, menu_item_ptr->line_num + 1, start_col, curletter); curses_toggle_color_attr(win, color, NONE, OFF); diff --git a/win/curses/cursinvt.c b/win/curses/cursinvt.c index c31effe48..64fd0197d 100644 --- a/win/curses/cursinvt.c +++ b/win/curses/cursinvt.c @@ -125,7 +125,7 @@ curses_add_inv(int y, int symbol = 0; attr_t glyphclr; - mapglyph(glyph, &symbol, &color, &dummy, u.ux, u.uy); + mapglyph(glyph, &symbol, &color, &dummy, u.ux, u.uy, 0); glyphclr = curses_color_attr(color, 0); wattron(win, glyphclr); wprintw(win, "%c ", symbol); diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c index aaf343f3f..9d3a1ccb2 100644 --- a/win/curses/cursmain.c +++ b/win/curses/cursmain.c @@ -665,7 +665,7 @@ curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int attr = -1; /* map glyph to character and color */ - mapglyph(glyph, &ch, &color, &special, x, y); + mapglyph(glyph, &ch, &color, &special, x, y, 0); if ((special & MG_PET) && iflags.hilite_pet) { attr = iflags.wc2_petattr; } diff --git a/win/gem/wingem.c b/win/gem/wingem.c index 4d3143837..a578b1fb0 100644 --- a/win/gem/wingem.c +++ b/win/gem/wingem.c @@ -930,7 +930,7 @@ int glyph; unsigned special; /* map glyph to character and color */ - (void) mapglyph(glyph, &ch, &color, &special, x, y); + (void) mapglyph(glyph, &ch, &color, &special, x, y, 0); #ifdef TEXTCOLOR /* Turn off color if rogue level. */ diff --git a/win/tty/wintty.c b/win/tty/wintty.c index a86768b9e..011763499 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3376,7 +3376,7 @@ int bkglyph UNUSED; } #endif /* map glyph to character and color */ - (void) mapglyph(glyph, &ch, &color, &special, x, y); + (void) mapglyph(glyph, &ch, &color, &special, x, y, 0); print_vt_code2(AVTC_SELECT_WINDOW, window); diff --git a/win/win32/mhmap.c b/win/win32/mhmap.c index 315de0719..28308913d 100644 --- a/win/win32/mhmap.c +++ b/win/win32/mhmap.c @@ -710,7 +710,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) mgch = ' '; } else { (void) mapglyph(data->map[col][row], &mgch, &color, - &special, col, row); + &special, col, row, 0); } msg_data->buffer[index] = mgch; index++; @@ -824,7 +824,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect) #ifdef USE_PILEMARK /* rely on NetHack core helper routine */ (void) mapglyph(data->map[i][j], &mgch, &color, &special, - i, j); + i, j, 0); if ((glyph != NO_GLYPH) && (special & MG_PET) #else if ((glyph != NO_GLYPH) && glyph_is_pet(glyph) @@ -899,7 +899,7 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect) #else /* rely on NetHack core helper routine */ (void) mapglyph(data->map[i][j], &mgch, &color, - &special, i, j); + &special, i, j, 0); ch = (char) mgch; if (((special & MG_PET) && iflags.hilite_pet) || ((special & (MG_DETECT | MG_BW_LAVA)) diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index df7fc4432..d763a0a1b 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -3091,7 +3091,7 @@ mswin_status_update(int idx, genericptr_t ptr, int chg, int percent, int color, ochar = GOLD_SYM; else mapglyph(objnum_to_glyph(GOLD_PIECE), - &ochar, &ocolor, &ospecial, 0, 0); + &ochar, &ocolor, &ospecial, 0, 0, 0); buf[0] = ochar; p = strchr(text, ':'); if (p) {