From ce05d14e746c26b09a48b0420c6baa7b6e655021 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 18 Apr 2015 18:50:38 -0700 Subject: [PATCH 1/5] revert unneeded lookat() change The enclosing switch statement is only reached when `glyph_is_cmap' is known to be true, so remove the redundant extra test. --- src/pager.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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; } From 8246c1b7c760e5f0d29473d8a8c7122aabbeeb55 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 18 Apr 2015 20:02:40 -0700 Subject: [PATCH 2/5] revisit the forcefight crash fix The previous fix prevents the crash from 'the()' when NO_GLYPH was used as an index into the defsyms array, but it resulted in giving feedback of "you attack thin air" regardless of what was at the target location, reverting to the situation that the buggy code was attempting to address in the first place. Handle that differently by removing the unseen monster glyph sooner. Also, the underwater handling wasn't working as intended. I blamed Derek's pudding farming patch for introducing the problem, but all that did was replace the offending line(s) with different indentation. The older post-3.4.3 patch which produced the problem was mine. Sorry, Derek. --- src/hack.c | 82 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 32 deletions(-) diff --git a/src/hack.c b/src/hack.c index c94363d91..cde81937f 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(); From 7ba63a868ab18b7aac864dc3a33fc60417c0e8b0 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 18 Apr 2015 20:18:43 -0700 Subject: [PATCH 3/5] fix "bad fruit #0" When minimal_xname() set up a dummy object containing as few details as possible, it wasn't setting up the fruit id field, so xname() couldn't figure out what type of fruit it had and issued a warning. I haven't managed a test case that uses minimal_xname so testing of the fix is less than comprehensive. [Pasi got it through dopay, but that only resorts to minimal_xname if the formatted name is really long and would otherwise cause the shopkeeper's prompt to overflow. Long fruit name combined with long individual object name wasn't long enough to trigger that. Maybe uncursed, greased, rustproof the like, or possibly just a longer shopkeeper name than I had?] --- src/objnam.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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) */ From 460538b6183139dff3edef5ced8091e296816794 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 19 Apr 2015 10:46:21 +0300 Subject: [PATCH 4/5] Fix dark room glyphs when searching Searching while blind showed room glyphs as lit even when dark_room option was on. --- src/display.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) 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)); From 56c4475c202106f804678e10bbaeb149b15e8816 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sun, 19 Apr 2015 13:31:59 -0400 Subject: [PATCH 5/5] extend the tty statue patch to tiles Changes to be committed: modified: doc/fixes35.0 modified: win/share/gifread.c modified: win/share/monsters.txt modified: win/share/objects.txt modified: win/share/other.txt modified: win/share/tile2bmp.c modified: win/share/tilemap.c The tty code already had the statue patch included, where statues are represented by stone versions similar in appearance to their monster likeness. This extends it to tiles. A new pass through the monsters.txt file is done in tile2bmp to include new modified tiles to the output file that are gray-scaled versions for mapping to the NetHack statue glyphs. --- doc/fixes35.0 | 2 +- win/share/gifread.c | 4 ++-- win/share/monsters.txt | 13 ++++++++++- win/share/objects.txt | 13 ++++++++++- win/share/other.txt | 13 ++++++++++- win/share/tile2bmp.c | 51 +++++++++++++++++++++++++++++------------- win/share/tilemap.c | 29 ++++++++++++++++-------- 7 files changed, 94 insertions(+), 31 deletions(-) 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/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 bb8273f47..5e05a1888 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -1,5 +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 $Date: 2009/05/06 10:59:02 $ $Revision: 1.7 $ */ +/* 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. */ @@ -238,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 @@ -357,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[] = {