X11: Hilight piles of objects

This commit is contained in:
Pasi Kallinen
2015-06-09 19:59:38 +03:00
parent e15f7be909
commit b4cc349a46
11 changed files with 70 additions and 14 deletions
+3 -3
View File
@@ -230,9 +230,9 @@ win/X11:
(files for X versions) (files for X versions)
Install.X11 NetHack.ad Window.c dialogs.c ibm.bdf Install.X11 NetHack.ad Window.c dialogs.c ibm.bdf
nethack.rc nh10.bdf nh32icon nh56icon nh72icon nethack.rc nh10.bdf nh32icon nh56icon nh72icon
nh_icon.xpm pet_mark.xbm rip.xpm tile2x11.c winX.c nh_icon.xpm pet_mark.xbm pilemark.xbm rip.xpm tile2x11.c
winmap.c winmenu.c winmesg.c winmisc.c winstat.c winX.c winmap.c winmenu.c winmesg.c winmisc.c
wintext.c winval.c winstat.c wintext.c winval.c
win/gem: win/gem:
(files for GEM versions) (files for GEM versions)
+2
View 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: fix segfault when MD termcap is not defined
tty: do not cut off statuslines at 80 characters for wider term tty: do not cut off statuslines at 80 characters for wider term
tty: prevent accidental escapes from string entries tty: prevent accidental escapes from string entries
tty: hilight object piles
unix: remove use of parentheses in nethack man page usage that confused a unix: remove use of parentheses in nethack man page usage that confused a
man page conversion tool man page conversion tool
unix: new -wwindowtype option 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: ensure vertical scrollbar shows up in text display windows
X11: fix typo in mouse click sanity check; result might have pointed to X11: fix typo in mouse click sanity check; result might have pointed to
spurious location after window resizing 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 platforms that support hangup: SAFERHANGUP to avoid losing objects in transit
between lists when hangup occurs, and also avoid cheats due to between lists when hangup occurs, and also avoid cheats due to
well-timed hangups to stop a long melee well-timed hangups to stop a long melee
+8 -1
View File
@@ -56,8 +56,13 @@ struct text_map_info_t {
square_lbearing; square_lbearing;
}; };
struct tile_glyph_info_t {
unsigned short glyph;
unsigned special;
};
struct tile_map_info_t { 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 white_gc;
GC black_gc; GC black_gc;
unsigned long image_width; /* dimensions of tile image */ unsigned long image_width; /* dimensions of tile image */
@@ -247,6 +252,8 @@ typedef struct {
int message_lines; /* number of lines to attempt to show */ int message_lines; /* number of lines to attempt to show */
String pet_mark_bitmap; /* X11 bitmap file used to mark pets */ String pet_mark_bitmap; /* X11 bitmap file used to mark pets */
Pixel pet_mark_color; /* color of pet mark */ 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 #ifdef GRAPHIC_TOMBSTONE
String tombstone; /* name of XPM file for tombstone */ String tombstone; /* name of XPM file for tombstone */
int tombtext_x; /* x-coord of center of first tombstone text */ int tombtext_x; /* x-coord of center of first tombstone text */
+4 -1
View File
@@ -50,6 +50,9 @@ NetHack.ad: ../win/X11/NetHack.ad
pet_mark.xbm: ../win/X11/pet_mark.xbm pet_mark.xbm: ../win/X11/pet_mark.xbm
cp ../win/X11/pet_mark.xbm 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 rip.xpm: ../win/X11/rip.xpm
cp ../win/X11/rip.xpm rip.xpm cp ../win/X11/rip.xpm rip.xpm
@@ -152,5 +155,5 @@ dungeon: dungeon.def ../util/makedefs ../util/dgn_comp
spotless: spotless:
-rm -f spec_levs quest_levs *.lev $(VARDAT) dungeon dungeon.pdf -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 -rm -f rip.img GEM_RSC.RSC title.img nh16.img NetHack.ad
+3
View File
@@ -156,6 +156,9 @@ NetHack.ad: $(GAME)
pet_mark.xbm: pet_mark.xbm:
( cd dat ; $(MAKE) pet_mark.xbm ) ( cd dat ; $(MAKE) pet_mark.xbm )
pilemark.xbm:
( cd dat ; $(MAKE) pilemark.xbm )
rip.xpm: rip.xpm:
( cd dat ; $(MAKE) rip.xpm ) ( cd dat ; $(MAKE) rip.xpm )
+1 -1
View File
@@ -29,7 +29,7 @@ WINSRC = $(WINX11SRC)
WINOBJ = $(WINX11OBJ) WINOBJ = $(WINX11OBJ)
WINLIB = $(WINX11LIB) WINLIB = $(WINX11LIB)
VARDATND = x11tiles NetHack.ad pet_mark.xbm VARDATND = x11tiles NetHack.ad pet_mark.xbm pilemark.xbm
#WINTTYLIB=-lcurses #WINTTYLIB=-lcurses
+1
View 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 Theisen. This is from his Ghostview program (which is under
the GNU public license, v2 or higher). the GNU public license, v2 or higher).
pet_mark.xbm - A pet indicator bitmap for tiles. pet_mark.xbm - A pet indicator bitmap for tiles.
pilemark.xbm - Item pile indicator for tiles.
rip.xpm - A graphical tombstone. rip.xpm - A graphical tombstone.
tile2x11.c - Converts win/share tiles for X11 use. tile2x11.c - Converts win/share tiles for X11 use.
+3
View File
@@ -27,6 +27,9 @@ NetHack.tile_file: x11tiles
! The annotation of pets. ! The annotation of pets.
!NetHack.pet_mark_bitmap: pet_mark.xbm !NetHack.pet_mark_bitmap: pet_mark.xbm
!NetHack.pet_mark_color: Red !NetHack.pet_mark_color: Red
! The annotation of item piles.
!NetHack.pilemark_bitmap: pilemark.xbm
!NetHack.pilemark_color: Green
! Tombstone ! Tombstone
! The image file ! The image file
+6
View File
@@ -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 };
+6
View File
@@ -980,6 +980,12 @@ static XtResource resources[] = {
{ nhStr("pet_mark_color"), nhStr("Pet_mark_color"), XtRPixel, { nhStr("pet_mark_color"), nhStr("Pet_mark_color"), XtRPixel,
sizeof(XtRPixel), XtOffset(AppResources *, pet_mark_color), XtRString, sizeof(XtRPixel), XtOffset(AppResources *, pet_mark_color), XtRString,
nhStr("Red") }, 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 #ifdef GRAPHIC_TOMBSTONE
{ nhStr("tombstone"), "Tombstone", XtRString, sizeof(String), { nhStr("tombstone"), "Tombstone", XtRString, sizeof(String),
XtOffset(AppResources *, tombstone), XtRString, "rip.xpm" }, XtOffset(AppResources *, tombstone), XtRString, "rip.xpm" },
+33 -8
View File
@@ -88,7 +88,7 @@ int glyph, bkglyph;
/* update both the tile and text backing stores */ /* 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) { if (*t_ptr != glyph) {
*t_ptr = glyph; *t_ptr = glyph;
@@ -108,6 +108,11 @@ int glyph, bkglyph;
(void) mapglyph(glyph, &och, &color, &special, x, y); (void) mapglyph(glyph, &och, &color, &special, x, y);
ch = (uchar) och; 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. */ /* Only update if we need to. */
ch_ptr = &map_info->text_map.text[y][x]; ch_ptr = &map_info->text_map.text[y][x];
@@ -122,6 +127,7 @@ int glyph, bkglyph;
#ifdef TEXTCOLOR #ifdef TEXTCOLOR
if ((special & MG_PET) && iflags.hilite_pet) if ((special & MG_PET) && iflags.hilite_pet)
color += CLR_MAX; color += CLR_MAX;
if ((special & MG_OBJPILE) && iflags.use_inverse)
*co_ptr = color; *co_ptr = color;
#endif #endif
if (!map_info->is_tile) if (!map_info->is_tile)
@@ -178,6 +184,7 @@ struct tile_annotation {
}; };
static struct tile_annotation pet_annotation; static struct tile_annotation pet_annotation;
static struct tile_annotation pile_annotation;
static void static void
init_annotation(annotation, filename, colorpixel) init_annotation(annotation, filename, colorpixel)
@@ -232,6 +239,8 @@ post_process_tiles()
init_annotation(&pet_annotation, appResources.pet_mark_bitmap, init_annotation(&pet_annotation, appResources.pet_mark_bitmap,
appResources.pet_mark_color); 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) map_all_stone(map_info)
struct map_info_t *map_info; struct map_info_t *map_info;
{ {
int i; int x,y;
unsigned short *sp, stone; unsigned short *sp, stone;
stone = cmap_to_glyph(S_stone); stone = cmap_to_glyph(S_stone);
for (sp = (unsigned short *) map_info->tile_map.glyphs, i = 0; for (x = 0; x < COLNO; x++)
i < ROWNO * COLNO; sp++, i++) { for (y = 0; y < ROWNO; y++) {
*sp = stone; 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 (row = start_row; row <= stop_row; row++) {
for (cur_col = start_col; cur_col <= stop_col; cur_col++) { 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 tile = glyph2tile[glyph];
int src_x, src_y; int src_x, src_y;
int dest_x = cur_col * tile_map->square_width; int dest_x = cur_col * tile_map->square_width;
@@ -1276,6 +1286,21 @@ boolean inverted;
XSetForeground(dpy, tile_map->black_gc, XSetForeground(dpy, tile_map->black_gc,
BlackPixelOfScreen(screen)); 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), XtDisplay(wp->w), XtWindow(wp->w),
#ifdef USE_WHITE #ifdef USE_WHITE
/* kludge for white square... */ /* 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->black_gc
: tile_map->white_gc, : tile_map->white_gc,
#else #else