From b4cc349a4634da27e54fc30937c14d1b5cf4b248 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Tue, 9 Jun 2015 19:59:38 +0300 Subject: [PATCH] X11: Hilight piles of objects --- Files | 6 +++--- doc/fixes36.0 | 2 ++ include/winX.h | 9 ++++++++- sys/unix/Makefile.dat | 5 ++++- sys/unix/Makefile.top | 3 +++ sys/unix/hints/linux-x11 | 2 +- win/X11/Install.X11 | 1 + win/X11/NetHack.ad | 3 +++ win/X11/pilemark.xbm | 6 ++++++ win/X11/winX.c | 6 ++++++ win/X11/winmap.c | 41 ++++++++++++++++++++++++++++++++-------- 11 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 win/X11/pilemark.xbm diff --git a/Files b/Files index 5bc69942c..03a7bc8d1 100644 --- a/Files +++ b/Files @@ -230,9 +230,9 @@ win/X11: (files for X versions) Install.X11 NetHack.ad Window.c dialogs.c ibm.bdf nethack.rc nh10.bdf nh32icon nh56icon nh72icon -nh_icon.xpm pet_mark.xbm rip.xpm tile2x11.c winX.c -winmap.c winmenu.c winmesg.c winmisc.c winstat.c -wintext.c winval.c +nh_icon.xpm pet_mark.xbm pilemark.xbm rip.xpm tile2x11.c +winX.c winmap.c winmenu.c winmesg.c winmisc.c +winstat.c wintext.c winval.c win/gem: (files for GEM versions) diff --git a/doc/fixes36.0 b/doc/fixes36.0 index e7ce73bdf..89152817f 100644 --- a/doc/fixes36.0 +++ b/doc/fixes36.0 @@ -941,6 +941,7 @@ tty: fix crashing when a location has more than 32k items tty: fix segfault when MD termcap is not defined tty: do not cut off statuslines at 80 characters for wider term tty: prevent accidental escapes from string entries +tty: hilight object piles unix: remove use of parentheses in nethack man page usage that confused a man page conversion tool unix: new -wwindowtype option @@ -990,6 +991,7 @@ X11: added support for hilite_pet to text map mode X11: ensure vertical scrollbar shows up in text display windows X11: fix typo in mouse click sanity check; result might have pointed to spurious location after window resizing +X11: use a plus sign to mark piles of objects platforms that support hangup: SAFERHANGUP to avoid losing objects in transit between lists when hangup occurs, and also avoid cheats due to well-timed hangups to stop a long melee diff --git a/include/winX.h b/include/winX.h index 4b132582a..b2fba46f1 100644 --- a/include/winX.h +++ b/include/winX.h @@ -56,8 +56,13 @@ struct text_map_info_t { square_lbearing; }; +struct tile_glyph_info_t { + unsigned short glyph; + unsigned special; +}; + struct tile_map_info_t { - unsigned short glyphs[ROWNO][COLNO]; /* Saved glyph numbers. */ + struct tile_glyph_info_t glyphs[ROWNO][COLNO]; /* Saved glyph numbers. */ GC white_gc; GC black_gc; unsigned long image_width; /* dimensions of tile image */ @@ -247,6 +252,8 @@ typedef struct { int message_lines; /* number of lines to attempt to show */ String pet_mark_bitmap; /* X11 bitmap file used to mark pets */ Pixel pet_mark_color; /* color of pet mark */ + String pilemark_bitmap; /* X11 bitmap file used to mark item piles */ + Pixel pilemark_color; /* color of item pile mark */ #ifdef GRAPHIC_TOMBSTONE String tombstone; /* name of XPM file for tombstone */ int tombtext_x; /* x-coord of center of first tombstone text */ diff --git a/sys/unix/Makefile.dat b/sys/unix/Makefile.dat index 90a9971de..6e65bcfef 100644 --- a/sys/unix/Makefile.dat +++ b/sys/unix/Makefile.dat @@ -50,6 +50,9 @@ NetHack.ad: ../win/X11/NetHack.ad pet_mark.xbm: ../win/X11/pet_mark.xbm cp ../win/X11/pet_mark.xbm pet_mark.xbm +pilemark.xbm: ../win/X11/pilemark.xbm + cp ../win/X11/pilemark.xbm pilemark.xbm + rip.xpm: ../win/X11/rip.xpm cp ../win/X11/rip.xpm rip.xpm @@ -152,5 +155,5 @@ dungeon: dungeon.def ../util/makedefs ../util/dgn_comp spotless: -rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf - -rm -f nhdat x11tiles beostiles pet_mark.xbm rip.xpm mapbg.xpm + -rm -f nhdat x11tiles beostiles pet_mark.xbm pilemark.xbm rip.xpm mapbg.xpm -rm -f rip.img GEM_RSC.RSC title.img nh16.img NetHack.ad diff --git a/sys/unix/Makefile.top b/sys/unix/Makefile.top index 40399fb9a..61669e7f2 100644 --- a/sys/unix/Makefile.top +++ b/sys/unix/Makefile.top @@ -156,6 +156,9 @@ NetHack.ad: $(GAME) pet_mark.xbm: ( cd dat ; $(MAKE) pet_mark.xbm ) +pilemark.xbm: + ( cd dat ; $(MAKE) pilemark.xbm ) + rip.xpm: ( cd dat ; $(MAKE) rip.xpm ) diff --git a/sys/unix/hints/linux-x11 b/sys/unix/hints/linux-x11 index cef4f95d9..4a18a8bd1 100644 --- a/sys/unix/hints/linux-x11 +++ b/sys/unix/hints/linux-x11 @@ -29,7 +29,7 @@ WINSRC = $(WINX11SRC) WINOBJ = $(WINX11OBJ) WINLIB = $(WINX11LIB) -VARDATND = x11tiles NetHack.ad pet_mark.xbm +VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm #WINTTYLIB=-lcurses diff --git a/win/X11/Install.X11 b/win/X11/Install.X11 index af9c21f19..dff03f84b 100644 --- a/win/X11/Install.X11 +++ b/win/X11/Install.X11 @@ -197,5 +197,6 @@ dialogs.c - A better dialog widget. Original code (modified slightly Theisen. This is from his Ghostview program (which is under the GNU public license, v2 or higher). pet_mark.xbm - A pet indicator bitmap for tiles. +pilemark.xbm - Item pile indicator for tiles. rip.xpm - A graphical tombstone. tile2x11.c - Converts win/share tiles for X11 use. diff --git a/win/X11/NetHack.ad b/win/X11/NetHack.ad index 65d2c052c..19c9a17cd 100644 --- a/win/X11/NetHack.ad +++ b/win/X11/NetHack.ad @@ -27,6 +27,9 @@ NetHack.tile_file: x11tiles ! The annotation of pets. !NetHack.pet_mark_bitmap: pet_mark.xbm !NetHack.pet_mark_color: Red +! The annotation of item piles. +!NetHack.pilemark_bitmap: pilemark.xbm +!NetHack.pilemark_color: Green ! Tombstone ! The image file diff --git a/win/X11/pilemark.xbm b/win/X11/pilemark.xbm new file mode 100644 index 000000000..e45330472 --- /dev/null +++ b/win/X11/pilemark.xbm @@ -0,0 +1,6 @@ +#define pilemark_width 16 +#define pilemark_height 16 +static unsigned char pilemark_bits[] = { + 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x18, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/win/X11/winX.c b/win/X11/winX.c index 27b4ffbe9..6cf4dd5de 100644 --- a/win/X11/winX.c +++ b/win/X11/winX.c @@ -980,6 +980,12 @@ static XtResource resources[] = { { nhStr("pet_mark_color"), nhStr("Pet_mark_color"), XtRPixel, sizeof(XtRPixel), XtOffset(AppResources *, pet_mark_color), XtRString, nhStr("Red") }, + { nhStr("pilemark_bitmap"), nhStr("Pilemark_bitmap"), XtRString, + sizeof(String), XtOffset(AppResources *, pilemark_bitmap), XtRString, + nhStr("pilemark.xbm") }, + { nhStr("pilemark_color"), nhStr("Pilemark_color"), XtRPixel, + sizeof(XtRPixel), XtOffset(AppResources *, pilemark_color), XtRString, + nhStr("Green") }, #ifdef GRAPHIC_TOMBSTONE { nhStr("tombstone"), "Tombstone", XtRString, sizeof(String), XtOffset(AppResources *, tombstone), XtRString, "rip.xpm" }, diff --git a/win/X11/winmap.c b/win/X11/winmap.c index 73745efb6..f8a663fc4 100644 --- a/win/X11/winmap.c +++ b/win/X11/winmap.c @@ -88,7 +88,7 @@ int glyph, bkglyph; /* update both the tile and text backing stores */ { - unsigned short *t_ptr = &map_info->tile_map.glyphs[y][x]; + unsigned short *t_ptr = &map_info->tile_map.glyphs[y][x].glyph; if (*t_ptr != glyph) { *t_ptr = glyph; @@ -108,6 +108,11 @@ int glyph, bkglyph; (void) mapglyph(glyph, &och, &color, &special, x, y); ch = (uchar) och; + if (special != map_info->tile_map.glyphs[y][x].special) { + map_info->tile_map.glyphs[y][x].special = special; + update_bbox = TRUE; + } + /* Only update if we need to. */ ch_ptr = &map_info->text_map.text[y][x]; @@ -122,6 +127,7 @@ int glyph, bkglyph; #ifdef TEXTCOLOR if ((special & MG_PET) && iflags.hilite_pet) color += CLR_MAX; + if ((special & MG_OBJPILE) && iflags.use_inverse) *co_ptr = color; #endif if (!map_info->is_tile) @@ -178,6 +184,7 @@ struct tile_annotation { }; static struct tile_annotation pet_annotation; +static struct tile_annotation pile_annotation; static void init_annotation(annotation, filename, colorpixel) @@ -232,6 +239,8 @@ post_process_tiles() init_annotation(&pet_annotation, appResources.pet_mark_bitmap, appResources.pet_mark_color); + init_annotation(&pile_annotation, appResources.pilemark_bitmap, + appResources.pilemark_color); } /* @@ -902,14 +911,15 @@ static void map_all_stone(map_info) struct map_info_t *map_info; { - int i; + int x,y; unsigned short *sp, stone; stone = cmap_to_glyph(S_stone); - for (sp = (unsigned short *) map_info->tile_map.glyphs, i = 0; - i < ROWNO * COLNO; sp++, i++) { - *sp = stone; - } + for (x = 0; x < COLNO; x++) + for (y = 0; y < ROWNO; y++) { + map_info->tile_map.glyphs[y][x].glyph = stone; + map_info->tile_map.glyphs[y][x].special = 0; + } } /* @@ -1248,7 +1258,7 @@ boolean inverted; for (row = start_row; row <= stop_row; row++) { for (cur_col = start_col; cur_col <= stop_col; cur_col++) { - int glyph = tile_map->glyphs[row][cur_col]; + int glyph = tile_map->glyphs[row][cur_col].glyph; int tile = glyph2tile[glyph]; int src_x, src_y; int dest_x = cur_col * tile_map->square_width; @@ -1276,6 +1286,21 @@ boolean inverted; XSetForeground(dpy, tile_map->black_gc, BlackPixelOfScreen(screen)); } + if ((tile_map->glyphs[row][cur_col].special & MG_OBJPILE)) { + /* draw object pile annotation (a plus sign) */ + XSetForeground(dpy, tile_map->black_gc, + pile_annotation.foreground); + XSetClipOrigin(dpy, tile_map->black_gc, dest_x, dest_y); + XSetClipMask(dpy, tile_map->black_gc, + pile_annotation.bitmap); + XCopyPlane(dpy, pile_annotation.bitmap, XtWindow(wp->w), + tile_map->black_gc, 0, 0, pile_annotation.width, + pile_annotation.height, dest_x, dest_y, 1); + XSetClipOrigin(dpy, tile_map->black_gc, 0, 0); + XSetClipMask(dpy, tile_map->black_gc, None); + XSetForeground(dpy, tile_map->black_gc, + BlackPixelOfScreen(screen)); + } } } @@ -1284,7 +1309,7 @@ boolean inverted; XtDisplay(wp->w), XtWindow(wp->w), #ifdef USE_WHITE /* kludge for white square... */ - tile_map->glyphs[start_row][start_col] == cmap_to_glyph(S_ice) + tile_map->glyphs[start_row][start_col].glyph == cmap_to_glyph(S_ice) ? tile_map->black_gc : tile_map->white_gc, #else