]> granicus.if.org Git - nethack/commitdiff
X11: Hilight piles of objects
authorPasi Kallinen <paxed@alt.org>
Tue, 9 Jun 2015 16:59:38 +0000 (19:59 +0300)
committerPasi Kallinen <paxed@alt.org>
Tue, 9 Jun 2015 16:59:38 +0000 (19:59 +0300)
Files
doc/fixes36.0
include/winX.h
sys/unix/Makefile.dat
sys/unix/Makefile.top
sys/unix/hints/linux-x11
win/X11/Install.X11
win/X11/NetHack.ad
win/X11/pilemark.xbm [new file with mode: 0644]
win/X11/winX.c
win/X11/winmap.c

diff --git a/Files b/Files
index 5bc69942c07cf9e3661d9856acdeeba97be4c4d3..03a7bc8d12b1160efd35e627e7d1b9aec588c5c3 100644 (file)
--- 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)
index e7ce73bdfe928c5245676a6ebdbcecd858393e1c..89152817ff0076b26a514e25c0dbcf92fef14ac0 100644 (file)
@@ -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
index 4b132582a3249343d80d4f36c5b9e2e24b3c5746..b2fba46f1f8c27c99212c3d8b88fded9ed91cce4 100644 (file)
@@ -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 */
index 90a9971de2a9a8b1120912c3cf70ae3b52ddb984..6e65bcfefbcbcd5c36cabeb6690034d2ba885783 100644 (file)
@@ -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
index 40399fb9a42e19af9a0a5d9ed1923c16540b1c6e..61669e7f2300fffbe0011535f2156fd2b7c8813e 100644 (file)
@@ -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 )
 
index cef4f95d9edcfbf5640af5f6d038b7349ac8d814..4a18a8bd178aab0f6840133441673e3f613490e0 100644 (file)
@@ -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
 
index af9c21f196d240726f77f3059f941b37ebb9e152..dff03f84ba445ae09e57758533629e7343928d5c 100644 (file)
@@ -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.
index 65d2c052c7d7ba3dabca573a0deaa3d090ba4b6c..19c9a17cd47c957543e312c6dae39957af0b5ddd 100644 (file)
@@ -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 (file)
index 0000000..e453304
--- /dev/null
@@ -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 };
index 27b4ffbe9cf379a1e6d9c9b7a75da5a9447c6724..6cf4dd5de1bdf85548f03100d8457bcc386a1ee6 100644 (file)
@@ -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" },
index 73745efb6573d43b6cb2d7cbc07b511310120f20..f8a663fc445823453d273aaf4bcca571a6d380c4 100644 (file)
@@ -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