diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 36894c697..dea654380 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -1151,7 +1151,7 @@ tty,win32gui,win32tty: add menucolors NetHack Community Patches (or Variation) Included ------------------------------------------------- Roderick Schertler's pickup_thrown patch -Malcolm Ryan's Statue Glyphs patch +adopt/adapt/extend Malcolm Ryan's Statue Glyphs patch to work for tty and tiles adopt/adapt/improve the Paranoid_Quit patch; default is paranoid_confirm:pray paranoid_confirm:Confirm when requiring "yes" instead of y to confirm, also require explicit "no" to reject diff --git a/src/display.c b/src/display.c index 399bb1842..f2e18df61 100644 --- a/src/display.c +++ b/src/display.c @@ -564,15 +564,17 @@ feel_location(x, y) if (lev->typ != ROOM && lev->seenv) { map_background(x, y, 1); } else { - lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : - cmap_to_glyph(S_stone); + lev->glyph = flags.dark_room ? cmap_to_glyph(S_darkroom) : + (lev->waslit ? cmap_to_glyph(S_room) : + cmap_to_glyph(S_stone)); show_glyph(x,y,lev->glyph); } } else if ((lev->glyph >= cmap_to_glyph(S_stone) && - lev->glyph < cmap_to_glyph(S_room)) || + lev->glyph < cmap_to_glyph(S_darkroom)) || glyph_is_invisible(levl[x][y].glyph)) { - lev->glyph = lev->waslit ? cmap_to_glyph(S_room) : - cmap_to_glyph(S_stone); + lev->glyph = flags.dark_room ? cmap_to_glyph(S_darkroom) : + (lev->waslit ? cmap_to_glyph(S_room) : + cmap_to_glyph(S_stone)); show_glyph(x,y,lev->glyph); } } else { @@ -583,6 +585,9 @@ feel_location(x, y) if (lev->typ == CORR && lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) show_glyph(x, y, lev->glyph = cmap_to_glyph(S_corr)); + else if (lev->typ == ROOM && flags.dark_room && + lev->glyph == cmap_to_glyph(S_room)) + show_glyph(x, y, lev->glyph = cmap_to_glyph(S_darkroom)); } } else { _map_location(x, y, 1); @@ -610,9 +615,9 @@ feel_location(x, y) } /* Floor spaces are dark if unlit. Corridors are dark if unlit. */ - if (lev->typ == ROOM && - lev->glyph == cmap_to_glyph(S_room) && !lev->waslit) - show_glyph(x,y, lev->glyph = cmap_to_glyph(S_stone)); + if (lev->typ == ROOM && lev->glyph == cmap_to_glyph(S_room) && + (!lev->waslit || flags.dark_room)) + show_glyph(x,y, lev->glyph = cmap_to_glyph(flags.dark_room ? S_darkroom : S_stone)); else if (lev->typ == CORR && lev->glyph == cmap_to_glyph(S_litcorr) && !lev->waslit) show_glyph(x,y, lev->glyph = cmap_to_glyph(S_corr)); diff --git a/src/hack.c b/src/hack.c index e2e3e60dc..b943496b0 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 hack.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ +/* NetHack 3.5 hack.c $NHDT-Date: 1429412557 2015/04/19 03:02:37 $ $NHDT-Branch: master $:$NHDT-Revision: 1.143 $ */ /* NetHack 3.5 hack.c $Date: 2013/10/26 21:33:47 $ $Revision: 1.120 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1336,49 +1336,67 @@ domove() if (context.forcefight || /* remembered an 'I' && didn't use a move command */ (glyph_is_invisible(levl[x][y].glyph) && !context.nopick)) { - struct obj *boulder = sobj_at(BOULDER, x, y); + struct obj *boulder = 0; boolean explo = (Upolyd && attacktype(youmonst.data, AT_EXPL)), solid = !accessible(x, y); int glyph = glyph_at(x, y); /* might be monster */ char buf[BUFSZ]; - /* if a statue is displayed at the target location, - player is attempting to attack it [and boulder - handlng below is suitable for handling that] */ - if (glyph_is_statue(glyph) || - (Hallucination && glyph_is_monster(glyph))) - boulder = sobj_at(STATUE, x, y); + if (!Underwater) { + boulder = sobj_at(BOULDER, x, y); + /* if a statue is displayed at the target location, + player is attempting to attack it [and boulder + handlng below is suitable for handling that] */ + if (glyph_is_statue(glyph) || + (Hallucination && glyph_is_monster(glyph))) + boulder = sobj_at(STATUE, x, y); - /* force fight at boulder/statue or wall/door while wielding - pick: start digging to break the boulder or wall */ - if (context.forcefight && - /* can we dig? */ - uwep && dig_typ(uwep, x, y) && - /* should we dig? */ - !glyph_is_invisible(glyph) && - !glyph_is_monster(glyph)) { - (void)use_pick_axe2(uwep); - return; - } + /* force fight at boulder/statue or wall/door while wielding + pick: start digging to break the boulder or wall */ + if (context.forcefight && + /* can we dig? */ + uwep && dig_typ(uwep, x, y) && + /* should we dig? */ + !glyph_is_invisible(glyph) && + !glyph_is_monster(glyph)) { + (void)use_pick_axe2(uwep); + return; + } + } + + /* about to become known empty -- remove 'I' if present */ + unmap_object(x, y); + if (boulder) map_object(boulder, TRUE); + newsym(x, y); + glyph = glyph_at(x, y); /* might have just changed */ if (boulder) Strcpy(buf, ansimpleoname(boulder)); - else if (solid && glyph_is_cmap(glyph)) - Strcpy(buf, the(defsyms[glyph_to_cmap(glyph)].explanation)); - else if (!Underwater) - Strcpy(buf, "thin air"); - else if (is_pool(x, y)) - Strcpy(buf, "empty water"); - else /* Underwater, targetting non-water */ - Sprintf(buf, "a vacant spot on the %s", surface(x,y)); + else if (Underwater && !is_pool(x, y)) + /* Underwater, targetting non-water; the map just shows blank + because you don't see remembered terrain while underwater; + although the hero can attack an adjacent monster this way, + assume he can't reach out far enough to distinguish terrain */ + Sprintf(buf, (Is_waterlevel(&u.uz) && levl[x][y].typ == AIR) ? + "an air bubble" : "nothing"); + else if (solid) + /* glyph might indicate unseen terrain if hero is blind; + unlike searching, this won't reveal what that terrain is + (except for solid rock, where the glyph would otherwise + yield ludicrous "dark part of a room") */ + Strcpy(buf, (levl[x][y].typ == STONE) ? "solid rock" : + glyph_is_cmap(glyph) ? + the(defsyms[glyph_to_cmap(glyph)].explanation) : + (const char *)"an unknown obstacle"); + /* note: 'solid' is misleadingly named and catches pools + of water and lava as well as rock and walls */ + else + Strcpy(buf, "thin air"); You("%s%s %s.", - !(boulder || solid) ? "" : - !explo ? "harmlessly " : "futilely ", + !(boulder || solid) ? "" : !explo ? "harmlessly " : "futilely ", explo ? "explode at" : "attack", buf); - unmap_object(x, y); /* known empty -- remove 'I' if present */ - if (boulder) map_object(boulder, TRUE); - newsym(x, y); + nomul(0); if (explo) { wake_nearby(); diff --git a/src/objnam.c b/src/objnam.c index afc79662d..c2dbab642 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 objnam.c $NHDT-Date: 1426470349 2015/03/16 01:45:49 $ $NHDT-Branch: derek-farming $:$NHDT-Revision: 1.108 $ */ +/* NetHack 3.5 objnam.c $NHDT-Date: 1429413519 2015/04/19 03:18:39 $ $NHDT-Branch: master $:$NHDT-Revision: 1.128 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -567,6 +567,10 @@ struct obj *obj; !objects[otyp].oc_uses_known; bareobj.quan = 1L; /* don't want plural */ bareobj.corpsenm = NON_PM; /* suppress statue and figurine details */ + /* but suppressing fruit details leads to "bad fruit #0" + [perhaps we should force "slime mold" rather than use xname?] */ + if (obj->otyp == SLIME_MOLD) bareobj.spe = obj->spe; + bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */ if (!strncmp(bufp, "uncursed ", 9)) bufp += 9; /* Role_if(PM_PRIEST) */ diff --git a/src/pager.c b/src/pager.c index e8d7c168b..036ee018c 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 pager.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ +/* NetHack 3.5 pager.c $NHDT-Date: 1429408230 2015/04/19 01:50:30 $ $NHDT-Branch: master $:$NHDT-Revision: 1.62 $ */ /* NetHack 3.5 pager.c $Date: 2012/01/15 09:27:06 $ $Revision: 1.41 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -273,8 +273,7 @@ lookat(x, y, buf, monbuf) Strcpy(buf, Is_airlevel(&u.uz) ? "cloudy area" : "fog/vapor cloud"); break; default: - if (glyph_is_cmap(glyph)) - Strcpy(buf,defsyms[glyph_to_cmap(glyph)].explanation); + Strcpy(buf,defsyms[glyph_to_cmap(glyph)].explanation); break; } diff --git a/win/share/gifread.c b/win/share/gifread.c index 824393af9..8147c3380 100644 --- a/win/share/gifread.c +++ b/win/share/gifread.c @@ -13,7 +13,7 @@ /* +-------------------------------------------------------------------+ */ /* - * $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ + * $NHDT-Date: 1429464661 2015/04/19 17:31:01 $ $NHDT-Branch: master $:$NHDT-Revision: 1.2 $ * $Date: 2002/01/05 21:06:02 $ $Revision: 1.1 $ */ @@ -71,7 +71,7 @@ static void FDECL(ReadTileStrip, (FILE *fd, int len)); /* These should be in gif.h, but there isn't one. */ boolean FDECL(fopen_gif_file, (const char *, const char *)); -boolean FDECL(read_gif_tile, (pixel(*)[])); +boolean FDECL(read_gif_tile, (pixel(*)[TILE_X])); int NDECL(fclose_gif_file); static int diff --git a/win/share/monsters.txt b/win/share/monsters.txt index 92aea0bf1..975ba1d7c 100644 --- a/win/share/monsters.txt +++ b/win/share/monsters.txt @@ -12,8 +12,19 @@ K = (204, 79, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) -O = (218, 218, 182) +O = (215, 215, 215) P = (108, 145, 182) +Q = (18, 18, 18) +R = (54, 54, 54) +S = (73, 73, 73) +T = (82, 82, 82) +U = (71, 108, 108) +V = (104, 104, 104) +W = (131, 131, 131) +X = (140, 140, 140) +Y = (149, 149, 149) +Z = (195, 195, 195) + # tile 0 (giant ant) { MMMMMMMMMMMMMMMM diff --git a/win/share/objects.txt b/win/share/objects.txt index 7a1c5c7f6..7ee156c55 100644 --- a/win/share/objects.txt +++ b/win/share/objects.txt @@ -12,8 +12,19 @@ K = (204, 79, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) -O = (218, 218, 182) +O = (215, 215, 215) P = (108, 145, 182) +Q = (18, 18, 18) +R = (54, 54, 54) +S = (73, 73, 73) +T = (82, 82, 82) +U = (71, 108, 108) +V = (104, 104, 104) +W = (131, 131, 131) +X = (140, 140, 140) +Y = (149, 149, 149) +Z = (195, 195, 195) + # tile 0 (strange object) { MMMMMMMMMMMMMMMM diff --git a/win/share/other.txt b/win/share/other.txt index 292295085..71132f522 100644 --- a/win/share/other.txt +++ b/win/share/other.txt @@ -12,8 +12,19 @@ K = (204, 79, 0) L = (255, 182, 145) M = (71, 108, 108) N = (255, 255, 255) -O = (218, 218, 182) +O = (215, 215, 215) P = (108, 145, 182) +Q = (18, 18, 18) +R = (54, 54, 54) +S = (73, 73, 73) +T = (82, 82, 82) +U = (71, 108, 108) +V = (104, 104, 104) +W = (131, 131, 131) +X = (140, 140, 140) +Y = (149, 149, 149) +Z = (195, 195, 195) + # tile 0 (dark part of a room) { AAAAAAAAAAAAAAAA diff --git a/win/share/tile2bmp.c b/win/share/tile2bmp.c index fde808967..752720c80 100644 --- a/win/share/tile2bmp.c +++ b/win/share/tile2bmp.c @@ -1,6 +1,4 @@ -/* NetHack 3.5 tile2bmp.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ -/* NetHack 3.5 tile2bmp.c $Date: 2009/05/06 10:59:00 $ $Revision: 1.6 $ */ -/* SCCS Id: @(#)tile2bmp.c 3.5 2002/03/14 */ +/* NetHack 3.5 tile2bmp.c $NHDT-Date: 1429464667 2015/04/19 17:31:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ /* Copyright (c) NetHack PC Development Team 1995 */ /* NetHack may be freely redistributed. See license for details. */ @@ -8,6 +6,7 @@ * Edit History: * * Initial Creation M.Allison 1994/01/11 + * 256 colour bmp and statue support M.Allison 2015/04/19 * */ @@ -19,27 +18,29 @@ #include "win32api.h" #endif -/* #define COLORS_IN_USE MAXCOLORMAPSIZE /* 256 colors */ #if (TILE_X==32) #define COLORS_IN_USE 256 #else -#define COLORS_IN_USE 16 /* 16 colors */ +/*#define COLORS_IN_USE 16 */ /* 16 colors */ +#define COLORS_IN_USE 256 /* 256 colors */ #endif #define BITCOUNT 8 extern char *FDECL(tilename, (int, int)); +#define MAGICTILENO (340 + 440 + 231 + 340) + #if BITCOUNT==4 #define MAX_X 320 /* 2 per byte, 4 bits per pixel */ #define MAX_Y 480 #else # if (TILE_X==32) #define MAX_X (32 * 40) -#define MAX_Y 960 +#define MAX_Y ((MAGICTILENO * 32) / 40) * 2 # else -#define MAX_X 640 /* 1 per byte, 8 bits per pixel */ -#define MAX_Y 480 +#define MAX_X (16 * 40) +#define MAX_Y ((MAGICTILENO * 16) / 40) * 2 # endif #endif @@ -119,7 +120,8 @@ struct tagBMP{ #if (TILE_X==32) #define RGBQUAD_COUNT 256 #else -#define RGBQUAD_COUNT 16 +/*#define RGBQUAD_COUNT 16 */ +#define RGBQUAD_COUNT 256 #endif RGBQUAD bmaColors[RGBQUAD_COUNT]; #endif @@ -146,11 +148,11 @@ char *tilefiles[] = { #if (TILE_X == 32) "../win/share/mon32.txt", "../win/share/obj32.txt", - "../win/share/oth32.txt" + "../win/share/oth32.txt", #else "../win/share/monsters.txt", "../win/share/objects.txt", - "../win/share/other.txt" + "../win/share/other.txt", #endif }; @@ -160,6 +162,7 @@ int max_tiles_in_row = 40; int tiles_in_row; int filenum; int initflag; +int pass; int yoffset,xoffset; char bmpname[128]; FILE *fp; @@ -190,12 +193,14 @@ char *argv[]; xoffset = yoffset = 0; initflag = 0; filenum = 0; + pass = 0; fp = fopen(bmpname,"wb"); if (!fp) { printf("Error creating tile file %s, aborting.\n",bmpname); exit(1); } - while (filenum < (sizeof(tilefiles) / sizeof(char *))) { + while (pass < 4) { + filenum =pass % (sizeof(tilefiles) / sizeof(char *)); if (!fopen_text_file(tilefiles[filenum], RDTMODE)) { Fprintf(stderr, "usage: tile2bmp (from the util directory)\n"); @@ -235,7 +240,7 @@ char *argv[]; } } (void) fclose_text_file(); - ++filenum; + ++pass; } fwrite(&bmp, sizeof(bmp), 1, fp); fclose(fp); @@ -303,18 +308,23 @@ BITMAPINFOHEADER *pbmih; #endif #if (TILE_X==16) - pbmih->biSizeImage = lelong(0); + /* pbmih->biSizeImage = lelong(0); */ + pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h); #else pbmih->biSizeImage = lelong(((w * cClrBits +31) & ~31) /8 * h); #endif pbmih->biClrImportant = (DWORD)0; } +static int graymappings[] = { + /*A B C D E F G H I J K L M N O P*/ + 0, 16, 17, 18, 19, 12, 21, 22, 23, 24, 25, 14, 12, 13, 13, 13}; + static void build_bmptile(pixels) pixel (*pixels)[TILE_X]; { - int cur_x, cur_y, cur_color; + int cur_x, cur_y, cur_color, apply_color; int x,y; for (cur_y = 0; cur_y < TILE_Y; cur_y++) { @@ -328,6 +338,15 @@ pixel (*pixels)[TILE_X]; if (cur_color >= num_colors) Fprintf(stderr, "color not in colormap!\n"); y = (MAX_Y - 1) - (cur_y + yoffset); + apply_color = cur_color; + if (pass == 3) { + /* map to shades of gray */ + if (cur_color > (SIZE(graymappings)-1)) + Fprintf(stderr, "Gray mapping issue %d %d.\n", + cur_color, SIZE(graymappings)-1); + else + apply_color = graymappings[cur_color]; + } #if BITCOUNT==4 x = (cur_x / 2) + xoffset; bmp.packtile[y][x] = cur_x%2 ? @@ -335,7 +354,7 @@ pixel (*pixels)[TILE_X]; (uchar)(cur_color<<4); #else x = cur_x + xoffset; - bmp.packtile[y][x] = (uchar)cur_color; + bmp.packtile[y][x] = (uchar)apply_color; #endif } } diff --git a/win/share/tilemap.c b/win/share/tilemap.c index 643b76891..5e05a1888 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 tilemap.c $NHDT-Date: 1425082379 2015/02/28 00:12:59 $ $NHDT-Branch: master $:$NHDT-Revision: 1.12 $ */ +/* NetHack 3.5 tilemap.c $NHDT-Date: 1429464668 2015/04/19 17:31:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ /* SCCS Id: @(#)tilemap.c 3.5 2000/06/04 */ /* NetHack may be freely redistributed. See license for details. */ @@ -237,7 +237,7 @@ int set, entry; #endif short tilemap[MAX_GLYPH]; -int lastmontile, lastobjtile, lastothtile; +int lastmontile, lastobjtile, lastothtile, laststatuetile; /* Number of tiles for invisible monsters */ #define NUM_INVIS_TILES 1 @@ -356,13 +356,25 @@ init_tilemap() tilenum++; } - /* statue patch: statues still use the same glyph as in vanilla */ - - for ( i = 0; i < NUMMONS; i++) { - tilemap[GLYPH_STATUE_OFF+i] = tilemap[GLYPH_OBJ_OFF+STATUE]; - } - lastothtile = tilenum - 1; + + /* skip over the substitutes to get to the grayscale statues */ + for (i = 0; i < SIZE(substitutes); i++) { + tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1; + } + + /* statue patch: statues look more like the monster */ + condnum = 0; /* doing monsters again, so reset */ + for (i = 0; i < NUMMONS; i++) { + tilemap[GLYPH_STATUE_OFF+i] = tilenum; + tilenum++; + while (conditionals[condnum].sequence == MON_GLYPH && + conditionals[condnum].predecessor == i) { + condnum++; + tilenum++; + } + } + laststatuetile = tilenum - 1; } const char *prolog[] = {