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
This commit is contained in:
nhmall
2019-11-16 22:49:36 -05:00
parent 2a07924063
commit a364348098
18 changed files with 32 additions and 37 deletions

View File

@@ -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

View File

@@ -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 *));

View File

@@ -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

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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) );

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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. */

View File

@@ -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);

View File

@@ -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))

View File

@@ -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) {