From 22980d81712c2639c4c477aae0e4196e44038e71 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 16 Nov 2019 18:31:30 -0800 Subject: [PATCH 1/2] gas cloud fix remove_region() calls newsym() when removing gas clouds, but when newsym() checked whether it was updating a gas cloud location it always got a false 'yes' because the region hadn't been removed yet. Fixing this didn't seem to make any observable difference so it must be followed fairly rapidly by a full vision recalc. --- src/region.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/region.c b/src/region.c index 9422de20c..fae8883ff 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. */ @@ -340,6 +340,11 @@ NhRegion *reg; if (i == n_regions) return; + /* remove region before potential newsym() calls, but don't free it yet */ + if (--n_regions != i) + regions[i] = regions[n_regions]; + regions[n_regions] = (NhRegion *) 0; + /* Update screen if necessary */ reg->ttl = -2L; /* for visible_region_at */ if (reg->visible) @@ -349,9 +354,6 @@ NhRegion *reg; newsym(x, y); free_region(reg); - regions[i] = regions[n_regions - 1]; - regions[n_regions - 1] = (NhRegion *) 0; - n_regions--; } /* From a364348098b054e615aad709d670896110282223 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 16 Nov 2019 22:49:36 -0500 Subject: [PATCH 2/2] add an mgflags parameter to mapglyph() to alter how it behaves internally avoid a recent save-value,call,restore-value kludge by adding an mgflags parameter to mapglyph() to control its behavior Changes to be committed: modified: doc/window.doc modified: include/extern.h modified: include/hack.h modified: src/detect.c modified: src/mapglyph.c modified: src/pager.c modified: sys/amiga/winfuncs.c modified: sys/wince/mhmap.c modified: win/Qt/qt_win.cpp modified: win/Qt4/qt4map.cpp modified: win/X11/winmap.c modified: win/curses/cursdial.c modified: win/curses/cursinvt.c modified: win/curses/cursmain.c modified: win/gem/wingem.c modified: win/tty/wintty.c modified: win/win32/mhmap.c modified: win/win32/mswproc.c --- doc/window.doc | 3 ++- include/extern.h | 2 +- include/hack.h | 4 ++++ src/detect.c | 2 +- src/mapglyph.c | 7 ++++--- src/pager.c | 17 +++-------------- sys/amiga/winfuncs.c | 2 +- sys/wince/mhmap.c | 2 +- win/Qt/qt_win.cpp | 2 +- win/Qt4/qt4map.cpp | 8 ++++---- win/X11/winmap.c | 2 +- win/curses/cursdial.c | 2 +- win/curses/cursinvt.c | 2 +- win/curses/cursmain.c | 2 +- win/gem/wingem.c | 2 +- win/tty/wintty.c | 2 +- win/win32/mhmap.c | 6 +++--- win/win32/mswproc.c | 2 +- 18 files changed, 32 insertions(+), 37 deletions(-) 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 0a2fa788d..4316a6f62 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 5ba3bb9a0..b0e44dde6 100644 --- a/include/hack.h +++ b/include/hack.h @@ -69,6 +69,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 0afaa9373..8ddf0a061 100644 --- a/src/detect.c +++ b/src/detect.c @@ -1934,7 +1934,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 d6a78bc22..388e318a0 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++ = 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 647df5150..a7a3b2006 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 = ov_rogue_syms[idx]; - ov_rogue_syms[idx] = 0; - } else { - save_override = ov_primary_syms[idx]; - 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)) - ov_rogue_syms[idx] = save_override; - else - 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/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 28a68207a..ca2e59343 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 3d5ab1d99..b0eb620f8 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 864b29687..7858ee618 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 6cf98fcb2..447255343 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 09567cda6..a83c7760f 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 c4deaa151..7c95bfc3f 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3378,7 +3378,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 18bca2571..fdd7b3a33 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 38b4b0b29..65a729891 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) {