Merge branch 'master' into nhmall-booktribute

This commit is contained in:
nhmall
2015-04-06 17:47:11 -04:00
25 changed files with 201 additions and 98 deletions

View File

@@ -2837,6 +2837,7 @@ O S_ogre (ogre)
o S_orc (orc) o S_orc (orc)
p S_piercer (piercer) p S_piercer (piercer)
^ S_pit (pit) ^ S_pit (pit)
# S_poisoncloud (poison cloud)
^ S_polymorph_trap (polymorph trap) ^ S_polymorph_trap (polymorph trap)
} S_pool (water) } S_pool (water)
! S_potion (potion) ! S_potion (potion)

View File

@@ -3412,6 +3412,7 @@ Default & Symbol Name & Description\\
\verb@o@ & S\_orc & (orc)\\ \verb@o@ & S\_orc & (orc)\\
\verb@p@ & S\_piercer & (piercer)\\ \verb@p@ & S\_piercer & (piercer)\\
\verb@^@ & S\_pit & (pit)\\ \verb@^@ & S\_pit & (pit)\\
\verb@#@ & S\_poisoncloud & (poison cloud)\\
\verb@^@ & S\_polymorph\_trap & (polymorph trap)\\ \verb@^@ & S\_polymorph\_trap & (polymorph trap)\\
\verb@}@ & S\_pool & (water)\\ \verb@}@ & S\_pool & (water)\\
\verb@!@ & S\_potion & (potion)\\ \verb@!@ & S\_potion & (potion)\\

View File

@@ -887,13 +887,13 @@ show object symbols in menu headings in menus where those object symbols
act as menu accelerators, toggleable via "menu_objsyms" option act as menu accelerators, toggleable via "menu_objsyms" option
show t-shirt text at end of game inventory disclose show t-shirt text at end of game inventory disclose
hitting with a polearm remembers the position of the last monster you hit hitting with a polearm remembers the position of the last monster you hit
allow showing legal polearm positions when asked for location to hit
add messages for trying to pick up some terrain features add messages for trying to pick up some terrain features
boomerang makes noise when hitting a sink boomerang makes noise when hitting a sink
non-pet rust monsters would eat rust-proofed non-digestibles but ignore non-pet rust monsters would eat rust-proofed non-digestibles but ignore
those non-digestibles otherwise those non-digestibles otherwise
kicking a grave may topple the gravestone kicking a grave may topple the gravestone
allow showing legal jumping positions when asked for location to jump to allow showing legal positions for stinking cloud, jumping and polearms
when asked for a location
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes

View File

@@ -745,6 +745,7 @@ E boolean NDECL(recover_savefile);
#ifdef SYSCF_FILE #ifdef SYSCF_FILE
E void NDECL(assure_syscf_file); E void NDECL(assure_syscf_file);
#endif #endif
E int FDECL(nhclose, (int));
#ifdef HOLD_LOCKFILE_OPEN #ifdef HOLD_LOCKFILE_OPEN
E void NDECL(really_close); E void NDECL(really_close);
#endif #endif
@@ -1161,6 +1162,7 @@ E boolean FDECL(bad_location, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P))
E void FDECL(place_lregion, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, E void FDECL(place_lregion, (XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,
XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P, XCHAR_P,XCHAR_P,XCHAR_P,XCHAR_P,
XCHAR_P,d_level *)); XCHAR_P,d_level *));
E void NDECL(fumaroles);
E void NDECL(movebubbles); E void NDECL(movebubbles);
E void NDECL(water_friction); E void NDECL(water_friction);
E void FDECL(save_waterlevel, (int,int)); E void FDECL(save_waterlevel, (int,int));

View File

@@ -189,34 +189,35 @@
#define S_ss2 72 #define S_ss2 72
#define S_ss3 73 #define S_ss3 73
#define S_ss4 74 #define S_ss4 74
#define S_poisoncloud 75
/* The 8 swallow symbols. Do NOT separate. To change order or add, see */ /* The 8 swallow symbols. Do NOT separate. To change order or add, see */
/* the function swallow_to_glyph() in display.c. */ /* the function swallow_to_glyph() in display.c. */
#define S_sw_tl 75 /* swallow top left [1] */ #define S_sw_tl 76 /* swallow top left [1] */
#define S_sw_tc 76 /* swallow top center [2] Order: */ #define S_sw_tc 77 /* swallow top center [2] Order: */
#define S_sw_tr 77 /* swallow top right [3] */ #define S_sw_tr 78 /* swallow top right [3] */
#define S_sw_ml 78 /* swallow middle left [4] 1 2 3 */ #define S_sw_ml 79 /* swallow middle left [4] 1 2 3 */
#define S_sw_mr 79 /* swallow middle right [6] 4 5 6 */ #define S_sw_mr 80 /* swallow middle right [6] 4 5 6 */
#define S_sw_bl 80 /* swallow bottom left [7] 7 8 9 */ #define S_sw_bl 81 /* swallow bottom left [7] 7 8 9 */
#define S_sw_bc 81 /* swallow bottom center [8] */ #define S_sw_bc 82 /* swallow bottom center [8] */
#define S_sw_br 82 /* swallow bottom right [9] */ #define S_sw_br 83 /* swallow bottom right [9] */
#define S_explode1 83 /* explosion top left */ #define S_explode1 84 /* explosion top left */
#define S_explode2 84 /* explosion top center */ #define S_explode2 85 /* explosion top center */
#define S_explode3 85 /* explosion top right Ex. */ #define S_explode3 86 /* explosion top right Ex. */
#define S_explode4 86 /* explosion middle left */ #define S_explode4 87 /* explosion middle left */
#define S_explode5 87 /* explosion middle center /-\ */ #define S_explode5 88 /* explosion middle center /-\ */
#define S_explode6 88 /* explosion middle right |@| */ #define S_explode6 89 /* explosion middle right |@| */
#define S_explode7 89 /* explosion bottom left \-/ */ #define S_explode7 90 /* explosion bottom left \-/ */
#define S_explode8 90 /* explosion bottom center */ #define S_explode8 91 /* explosion bottom center */
#define S_explode9 91 /* explosion bottom right */ #define S_explode9 92 /* explosion bottom right */
/* end effects */ /* end effects */
#define MAXPCHARS 92 /* maximum number of mapped characters */ #define MAXPCHARS 93 /* maximum number of mapped characters */
#define MAXDCHARS 41 /* maximum of mapped dungeon characters */ #define MAXDCHARS 41 /* maximum of mapped dungeon characters */
#define MAXTCHARS 22 /* maximum of mapped trap characters */ #define MAXTCHARS 22 /* maximum of mapped trap characters */
#define MAXECHARS 29 /* maximum of mapped effects characters */ #define MAXECHARS 30 /* maximum of mapped effects characters */
#define MAXEXPCHARS 9 /* number of explosion characters */ #define MAXEXPCHARS 9 /* number of explosion characters */
struct symdef { struct symdef {

View File

@@ -294,6 +294,8 @@ boolean resuming;
/* underwater and waterlevel vision are done here */ /* underwater and waterlevel vision are done here */
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles(); movebubbles();
else if (Is_firelevel(&u.uz))
fumaroles();
else if (Underwater) else if (Underwater)
under_water(0); under_water(0);
/* vision while buried done here */ /* vision while buried done here */

View File

@@ -331,7 +331,7 @@ struct obj *corpse;
clear_bypasses(); clear_bypasses();
fd = open_bonesfile(&u.uz, &bonesid); fd = open_bonesfile(&u.uz, &bonesid);
if (fd >= 0) { if (fd >= 0) {
(void) close(fd); (void) nhclose(fd);
if (wizard) { if (wizard) {
if (yn("Bones file already exists. Replace it?") == 'y') { if (yn("Bones file already exists. Replace it?") == 'y') {
if (delete_bonesfile(&u.uz)) goto make_bones; if (delete_bonesfile(&u.uz)) goto make_bones;
@@ -504,7 +504,7 @@ struct obj *corpse;
if (bytes_counted > freediskspace(bones)) { /* not enough room */ if (bytes_counted > freediskspace(bones)) { /* not enough room */
if (wizard) if (wizard)
pline("Insufficient space to create bones file."); pline("Insufficient space to create bones file.");
(void) close(fd); (void) nhclose(fd);
cancel_bonesfile(); cancel_bonesfile();
return; return;
} }
@@ -551,7 +551,7 @@ getbones()
ok = TRUE; ok = TRUE;
if(wizard) { if(wizard) {
if(yn("Get bones?") == 'n') { if(yn("Get bones?") == 'n') {
(void) close(fd); (void) nhclose(fd);
compress_bonesfile(); compress_bonesfile();
return(0); return(0);
} }
@@ -595,7 +595,7 @@ getbones()
resetobjs(level.buriedobjlist,TRUE); resetobjs(level.buriedobjlist,TRUE);
} }
} }
(void) close(fd); (void) nhclose(fd);
sanitize_engravings(); sanitize_engravings();
u.uroleplay.numbones++; u.uroleplay.numbones++;

View File

@@ -674,7 +674,12 @@ newsym(x,y)
*/ */
lev->waslit = (lev->lit!=0); /* remember lit condition */ lev->waslit = (lev->lit!=0); /* remember lit condition */
if (reg != NULL && ACCESSIBLE(lev->typ)) { /* normal region shown only on accessible positions, but poison clouds
* also shown above lava, pools and moats.
*/
if (reg != NULL && (ACCESSIBLE(lev->typ) ||
(reg->glyph == cmap_to_glyph(S_poisoncloud) &&
(lev->typ == LAVAPOOL || lev->typ == POOL || lev->typ == MOAT)))) {
show_region(reg,x,y); show_region(reg,x,y);
return; return;
} }
@@ -824,8 +829,10 @@ shieldeff(x,y)
* DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account. * DISP_ALWAYS- Like DISP_FLASH, but vision is not taken into account.
*/ */
#define TMP_AT_MAX_GLYPHS (COLNO*2)
static struct tmp_glyph { static struct tmp_glyph {
coord saved[COLNO]; /* previously updated positions */ coord saved[TMP_AT_MAX_GLYPHS]; /* previously updated positions */
int sidx; /* index of next unused slot in saved[] */ int sidx; /* index of next unused slot in saved[] */
int style; /* either DISP_BEAM or DISP_FLASH or DISP_ALWAYS */ int style; /* either DISP_BEAM or DISP_FLASH or DISP_ALWAYS */
int glyph; /* glyph to use when printing */ int glyph; /* glyph to use when printing */
@@ -895,7 +902,7 @@ tmp_at(x, y)
default: /* do it */ default: /* do it */
if (tglyph->style == DISP_BEAM || tglyph->style == DISP_ALL) { if (tglyph->style == DISP_BEAM || tglyph->style == DISP_ALL) {
if (tglyph->style != DISP_ALL && !cansee(x,y)) break; if (tglyph->style != DISP_ALL && !cansee(x,y)) break;
if (tglyph->sidx >= COLNO) break; /* too many locations */ if (tglyph->sidx >= TMP_AT_MAX_GLYPHS) break; /* too many locations */
/* save pos for later erasing */ /* save pos for later erasing */
tglyph->saved[tglyph->sidx].x = x; tglyph->saved[tglyph->sidx].x = x;
tglyph->saved[tglyph->sidx].y = y; tglyph->saved[tglyph->sidx].y = y;

View File

@@ -945,7 +945,7 @@ currentlevel_rewrite()
#ifdef MFLOPPY #ifdef MFLOPPY
if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) { if (!savelev(fd, ledger_no(&u.uz), COUNT_SAVE)) {
(void) close(fd); (void) nhclose(fd);
delete_levelfile(ledger_no(&u.uz)); delete_levelfile(ledger_no(&u.uz));
pline("NetHack is out of disk space for making levels!"); pline("NetHack is out of disk space for making levels!");
You("can save, quit, or continue playing."); You("can save, quit, or continue playing.");
@@ -1160,7 +1160,7 @@ boolean at_stairs, falling, portal;
} }
minit(); /* ZEROCOMP */ minit(); /* ZEROCOMP */
getlev(fd, hackpid, new_ledger, FALSE); getlev(fd, hackpid, new_ledger, FALSE);
(void) close(fd); (void) nhclose(fd);
oinit(); /* reassign level dependent obj probabilities */ oinit(); /* reassign level dependent obj probabilities */
} }
/* do this prior to level-change pline messages */ /* do this prior to level-change pline messages */
@@ -1288,6 +1288,8 @@ boolean at_stairs, falling, portal;
/* initial movement of bubbles just before vision_recalc */ /* initial movement of bubbles just before vision_recalc */
if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz))
movebubbles(); movebubbles();
else if (Is_firelevel(&u.uz))
fumaroles();
if (level_info[new_ledger].flags & FORGOTTEN) { if (level_info[new_ledger].flags & FORGOTTEN) {
forget_map(ALL_MAP); /* forget the map */ forget_map(ALL_MAP); /* forget the map */

View File

@@ -211,6 +211,7 @@ const struct symdef defsyms[MAXPCHARS] = {
{'#', "", C(HI_ZAP)}, {'#', "", C(HI_ZAP)},
{'@', "", C(HI_ZAP)}, {'@', "", C(HI_ZAP)},
{'*', "", C(HI_ZAP)}, {'*', "", C(HI_ZAP)},
{'#', "poison cloud", C(CLR_BRIGHT_GREEN)}, /* [part of] a poison cloud */
{'/', "", C(CLR_GREEN)}, /* swallow top left */ {'/', "", C(CLR_GREEN)}, /* swallow top left */
{'-', "", C(CLR_GREEN)}, /* swallow top center */ {'-', "", C(CLR_GREEN)}, /* swallow top center */
{'\\', "", C(CLR_GREEN)}, /* swallow top right */ {'\\', "", C(CLR_GREEN)}, /* swallow top right */
@@ -614,6 +615,7 @@ struct symparse loadsyms[] = {
{SYM_PCHAR, S_hcdbridge, "S_hcdbridge"}, {SYM_PCHAR, S_hcdbridge, "S_hcdbridge"},
{SYM_PCHAR, S_air, "S_air"}, {SYM_PCHAR, S_air, "S_air"},
{SYM_PCHAR, S_cloud, "S_cloud"}, {SYM_PCHAR, S_cloud, "S_cloud"},
{SYM_PCHAR, S_poisoncloud, "S_poisoncloud"},
{SYM_PCHAR, S_water, "S_water"}, {SYM_PCHAR, S_water, "S_water"},
{SYM_PCHAR, S_arrow_trap, "S_arrow_trap"}, {SYM_PCHAR, S_arrow_trap, "S_arrow_trap"},
{SYM_PCHAR, S_dart_trap, "S_dart_trap"}, {SYM_PCHAR, S_dart_trap, "S_dart_trap"},

View File

@@ -641,12 +641,12 @@ really_close()
lftrack.fd = -1; lftrack.fd = -1;
lftrack.oflag = 0; lftrack.oflag = 0;
if (fd != -1) if (fd != -1)
(void)_close(fd); (void)close(fd);
return; return;
} }
int int
close(fd) nhclose(fd)
int fd; int fd;
{ {
if (lftrack.fd == fd) { if (lftrack.fd == fd) {
@@ -655,10 +655,17 @@ int fd;
lftrack.nethack_thinks_it_is_open = FALSE; lftrack.nethack_thinks_it_is_open = FALSE;
return 0; return 0;
} }
return _close(fd); return close(fd);
}
#else
int
nhclose(fd)
int fd;
{
return close(fd);
} }
#endif #endif
/* ---------- END LEVEL FILE HANDLING ----------- */ /* ---------- END LEVEL FILE HANDLING ----------- */
@@ -996,7 +1003,7 @@ restore_saved_game()
if ((fd = open_savefile()) < 0) return fd; if ((fd = open_savefile()) < 0) return fd;
if (validate(fd, fq_save) != 0) { if (validate(fd, fq_save) != 0) {
(void) close(fd), fd = -1; (void) nhclose(fd), fd = -1;
(void) delete_savefile(); (void) delete_savefile();
} }
return fd; return fd;
@@ -1021,7 +1028,7 @@ const char* filename;
get_plname_from_file(fd, tplname); get_plname_from_file(fd, tplname);
result = dupstr(tplname); result = dupstr(tplname);
} }
(void) close(fd); (void) nhclose(fd);
} }
nh_compress(SAVEF); nh_compress(SAVEF);
@@ -1777,7 +1784,7 @@ const char *filename;
if (unlink(lockname) < 0) if (unlink(lockname) < 0)
HUP raw_printf("Can't unlink %s.", lockname); HUP raw_printf("Can't unlink %s.", lockname);
# ifdef NO_FILE_LINKS # ifdef NO_FILE_LINKS
(void) close(lockfd); (void) nhclose(lockfd);
# endif # endif
#endif /* UNIX || VMS */ #endif /* UNIX || VMS */
@@ -2936,9 +2943,9 @@ const char *dir UNUSED_if_not_OS2_CODEVIEW;
wait_synch(); wait_synch();
} }
# endif # endif
(void) close(fd); /* RECORD is accessible */ (void) nhclose(fd); /* RECORD is accessible */
} else if ((fd = open(fq_record, O_CREAT|O_RDWR, FCMASK)) >= 0) { } else if ((fd = open(fq_record, O_CREAT|O_RDWR, FCMASK)) >= 0) {
(void) close(fd); /* RECORD newly created */ (void) nhclose(fd); /* RECORD newly created */
# if defined(VMS) && !defined(SECURE) # if defined(VMS) && !defined(SECURE)
/* Re-protect RECORD with world:read+write+execute+delete access. */ /* Re-protect RECORD with world:read+write+execute+delete access. */
(void) chmod(fq_record, FCMASK | 007); (void) chmod(fq_record, FCMASK | 007);
@@ -2978,9 +2985,9 @@ const char *dir UNUSED_if_not_OS2_CODEVIEW;
raw_printf("Warning: cannot write record %s", tmp); raw_printf("Warning: cannot write record %s", tmp);
wait_synch(); wait_synch();
} else } else
(void) close(fd); (void) nhclose(fd);
} else /* open succeeded */ } else /* open succeeded */
(void) close(fd); (void) nhclose(fd);
#else /* MICRO || WIN32*/ #else /* MICRO || WIN32*/
# ifdef MAC # ifdef MAC
@@ -3064,14 +3071,14 @@ recover_savefile()
if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) { if (read(gfd, (genericptr_t) &hpid, sizeof hpid) != sizeof hpid) {
raw_printf( raw_printf(
"\nCheckpoint data incompletely written or subsequently clobbered. Recovery impossible."); "\nCheckpoint data incompletely written or subsequently clobbered. Recovery impossible.");
(void)close(gfd); (void)nhclose(gfd);
return FALSE; return FALSE;
} }
if (read(gfd, (genericptr_t) &savelev, sizeof(savelev)) if (read(gfd, (genericptr_t) &savelev, sizeof(savelev))
!= sizeof(savelev)) { != sizeof(savelev)) {
raw_printf("\nCheckpointing was not in effect for %s -- recovery impossible.\n", raw_printf("\nCheckpointing was not in effect for %s -- recovery impossible.\n",
lock); lock);
(void)close(gfd); (void)nhclose(gfd);
return FALSE; return FALSE;
} }
if ((read(gfd, (genericptr_t) savename, sizeof savename) if ((read(gfd, (genericptr_t) savename, sizeof savename)
@@ -3085,7 +3092,7 @@ recover_savefile()
(read(gfd, (genericptr_t) &tmpplbuf, pltmpsiz) (read(gfd, (genericptr_t) &tmpplbuf, pltmpsiz)
!= pltmpsiz)) { != pltmpsiz)) {
raw_printf("\nError reading %s -- can't recover.\n", lock); raw_printf("\nError reading %s -- can't recover.\n", lock);
(void)close(gfd); (void)nhclose(gfd);
return FALSE; return FALSE;
} }
@@ -3101,15 +3108,15 @@ recover_savefile()
sfd = create_savefile(); sfd = create_savefile();
if (sfd < 0) { if (sfd < 0) {
raw_printf("\nCannot recover savefile %s.\n", SAVEF); raw_printf("\nCannot recover savefile %s.\n", SAVEF);
(void)close(gfd); (void)nhclose(gfd);
return FALSE; return FALSE;
} }
lfd = open_levelfile(savelev, errbuf); lfd = open_levelfile(savelev, errbuf);
if (lfd < 0) { if (lfd < 0) {
raw_printf("\n%s\n", errbuf); raw_printf("\n%s\n", errbuf);
(void)close(gfd); (void)nhclose(gfd);
(void)close(sfd); (void)nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
@@ -3117,8 +3124,8 @@ recover_savefile()
if (write(sfd, (genericptr_t) &version_data, sizeof version_data) if (write(sfd, (genericptr_t) &version_data, sizeof version_data)
!= sizeof version_data) { != sizeof version_data) {
raw_printf("\nError writing %s; recovery failed.", SAVEF); raw_printf("\nError writing %s; recovery failed.", SAVEF);
(void)close(gfd); (void)nhclose(gfd);
(void)close(sfd); (void)nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
@@ -3128,8 +3135,8 @@ recover_savefile()
raw_printf( raw_printf(
"\nError writing %s; recovery failed (savefile_info).\n", "\nError writing %s; recovery failed (savefile_info).\n",
SAVEF); SAVEF);
(void)close(gfd); (void)nhclose(gfd);
(void)close(sfd); (void)nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
@@ -3139,8 +3146,8 @@ recover_savefile()
raw_printf( raw_printf(
"Error writing %s; recovery failed (player name size).\n", "Error writing %s; recovery failed (player name size).\n",
SAVEF); SAVEF);
(void)close(gfd); (void)nhclose(gfd);
(void)close(sfd); (void)nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
@@ -3150,28 +3157,28 @@ recover_savefile()
raw_printf( raw_printf(
"Error writing %s; recovery failed (player name).\n", "Error writing %s; recovery failed (player name).\n",
SAVEF); SAVEF);
(void)close(gfd); (void)nhclose(gfd);
(void)close(sfd); (void)nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
if (!copy_bytes(lfd, sfd)) { if (!copy_bytes(lfd, sfd)) {
(void) close(lfd); (void) nhclose(lfd);
(void) close(sfd); (void) nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
(void)close(lfd); (void)nhclose(lfd);
processed[savelev] = 1; processed[savelev] = 1;
if (!copy_bytes(gfd, sfd)) { if (!copy_bytes(gfd, sfd)) {
(void) close(lfd); (void) nhclose(lfd);
(void) close(sfd); (void) nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
(void)close(gfd); (void)nhclose(gfd);
processed[0] = 1; processed[0] = 1;
for (lev = 1; lev < 256; lev++) { for (lev = 1; lev < 256; lev++) {
@@ -3185,17 +3192,17 @@ recover_savefile()
levc = (xchar) lev; levc = (xchar) lev;
write(sfd, (genericptr_t) &levc, sizeof(levc)); write(sfd, (genericptr_t) &levc, sizeof(levc));
if (!copy_bytes(lfd, sfd)) { if (!copy_bytes(lfd, sfd)) {
(void) close(lfd); (void) nhclose(lfd);
(void) close(sfd); (void) nhclose(sfd);
delete_savefile(); delete_savefile();
return FALSE; return FALSE;
} }
(void)close(lfd); (void)nhclose(lfd);
processed[lev] = 1; processed[lev] = 1;
} }
} }
} }
(void)close(sfd); (void)nhclose(sfd);
#ifdef HOLD_LOCKFILE_OPEN #ifdef HOLD_LOCKFILE_OPEN
really_close(); really_close();

View File

@@ -603,24 +603,28 @@ STATIC_DCL struct tm *NDECL(getlt);
void void
setrandom() setrandom()
{ {
time_t now = getnow(); /* time((TIME_type) 0) */ unsigned long seed = getnow(); /* time((TIME_type) 0) */
#ifdef UNIX
/* Quick dirty band-aid to prevent PRNG prediction */
seed *= getpid();
#endif
/* the types are different enough here that sweeping the different /* the types are different enough here that sweeping the different
* routine names into one via #defines is even more confusing * routine names into one via #defines is even more confusing
*/ */
#ifdef RANDOM /* srandom() from sys/share/random.c */ #ifdef RANDOM /* srandom() from sys/share/random.c */
srandom((unsigned int) now); srandom((unsigned int) seed);
#else #else
# if defined(__APPLE__) || defined(BSD) || defined(LINUX) || defined(ULTRIX) || defined(CYGWIN32) /* system srandom() */ # if defined(__APPLE__) || defined(BSD) || defined(LINUX) || defined(ULTRIX) || defined(CYGWIN32) /* system srandom() */
# if defined(BSD) && !defined(POSIX_TYPES) && defined(SUNOS4) # if defined(BSD) && !defined(POSIX_TYPES) && defined(SUNOS4)
(void) (void)
# endif # endif
srandom((int) now); srandom((int) seed);
# else # else
# ifdef UNIX /* system srand48() */ # ifdef UNIX /* system srand48() */
srand48((long) now); srand48((long) seed);
# else /* poor quality system routine */ # else /* poor quality system routine */
srand((int) now); srand((int) seed);
# endif # endif
# endif # endif
#endif #endif

View File

@@ -879,6 +879,26 @@ register xchar x, y, todnum, todlevel;
return; return;
} }
void
fumaroles()
{
xchar n;
boolean snd = FALSE, loud = FALSE;
for (n = rn2(3)+2; n; n--) {
xchar x = rn1(COLNO-4,3);
xchar y = rn1(ROWNO-4,3);
struct trap *ttmp = t_at(x,y);
if (levl[x][y].typ == LAVAPOOL) {
NhRegion *r = create_gas_cloud(x,y, 4+rn2(5), rn1(10,5));
clear_heros_fault(r);
snd = TRUE;
if (distu(x,y) < 15) loud = TRUE;
}
}
if (snd && !Deaf)
Norep("You hear a %swhoosh!", loud ? "loud " : "");
}
/* /*
* Special waterlevel stuff in endgame (TH). * Special waterlevel stuff in endgame (TH).
* *

View File

@@ -1367,14 +1367,14 @@ NEARDATA struct permonst mons[] = {
A(ATTK(AT_ENGL, AD_PHYS, 1, 10), A(ATTK(AT_ENGL, AD_PHYS, 1, 10),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0,
M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID|M1_FLY, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_BREATHLESS|M1_UNSOLID|M1_FLY,
M2_STRONG|M2_NEUTER, 0, CLR_CYAN), M2_STRONG|M2_NEUTER, 0, CLR_CYAN),
MON("fire elemental", S_ELEMENTAL, MON("fire elemental", S_ELEMENTAL,
LVL(8, 12, 2, 30, 0), (G_NOCORPSE|1), LVL(8, 12, 2, 30, 0), (G_NOCORPSE|1),
A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4), A(ATTK(AT_CLAW, AD_FIRE, 3, 6), ATTK(AT_NONE, AD_FIRE, 0, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_POISON|MR_STONE, 0, SIZ(0, 0, MS_SILENT, MZ_HUGE), MR_FIRE|MR_POISON|MR_STONE, 0,
M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID|M1_FLY|M1_NOTAKE, M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_BREATHLESS|M1_UNSOLID|M1_FLY|M1_NOTAKE,
M2_STRONG|M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW), M2_STRONG|M2_NEUTER, M3_INFRAVISIBLE, CLR_YELLOW),
MON("earth elemental", S_ELEMENTAL, MON("earth elemental", S_ELEMENTAL,
LVL(8, 6, 2, 30, 0), (G_NOCORPSE|1), LVL(8, 6, 2, 30, 0), (G_NOCORPSE|1),
@@ -1390,7 +1390,7 @@ NEARDATA struct permonst mons[] = {
A(ATTK(AT_CLAW, AD_PHYS, 5, 6), A(ATTK(AT_CLAW, AD_PHYS, 5, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0, SIZ(2500, 0, MS_SILENT, MZ_HUGE), MR_POISON|MR_STONE, 0,
M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_UNSOLID| M1_NOEYES|M1_NOLIMBS|M1_NOHEAD|M1_MINDLESS|M1_BREATHLESS|M1_UNSOLID|
M1_AMPHIBIOUS|M1_SWIM, M1_AMPHIBIOUS|M1_SWIM,
M2_STRONG|M2_NEUTER, 0, CLR_BLUE), M2_STRONG|M2_NEUTER, 0, CLR_BLUE),
/* /*

View File

@@ -753,7 +753,7 @@ char *buf;
break; break;
} }
(void) write(fd, buf, strlen(buf)); (void) write(fd, buf, strlen(buf));
(void) close(fd); (void) nhclose(fd);
} }
} }
#endif /* UNIX386MUSIC */ #endif /* UNIX386MUSIC */

View File

@@ -27,7 +27,8 @@ STATIC_DCL void FDECL(randomize,(int *, int));
STATIC_DCL void FDECL(forget_single_object, (int)); STATIC_DCL void FDECL(forget_single_object, (int));
STATIC_DCL void FDECL(forget, (int)); STATIC_DCL void FDECL(forget, (int));
STATIC_DCL int FDECL(maybe_tame, (struct monst *,struct obj *)); STATIC_DCL int FDECL(maybe_tame, (struct monst *,struct obj *));
STATIC_DCL boolean FDECL(is_valid_stinking_cloud_pos, (int, int, BOOLEAN_P));
STATIC_DCL void FDECL(display_stinking_cloud_positions, (int));
STATIC_PTR void FDECL(set_lit, (int,int,genericptr_t)); STATIC_PTR void FDECL(set_lit, (int,int,genericptr_t));
STATIC_OVL boolean STATIC_OVL boolean
@@ -870,6 +871,39 @@ struct obj *sobj;
return 0; return 0;
} }
boolean
is_valid_stinking_cloud_pos(x,y, showmsg)
int x,y;
boolean showmsg;
{
if (!cansee(x, y) || !ACCESSIBLE(levl[x][y].typ) || distu(x, y) >= 32) {
if (showmsg) You("smell rotten eggs.");
return FALSE;
}
return TRUE;
}
void
display_stinking_cloud_positions(state)
int state;
{
if (state == 0) {
tmp_at(DISP_BEAM, cmap_to_glyph(S_flashbeam));
} else if (state == 1) {
int x,y, dx, dy;
int dist = 6;
for (dx = -dist; dx <= dist; dx++)
for (dy = -dist; dy <= dist; dy++) {
x = u.ux + dx;
y = u.uy + dy;
if (isok(x,y) && is_valid_stinking_cloud_pos(x,y, FALSE))
tmp_at(x,y);
}
} else {
tmp_at(DISP_END, 0);
}
}
/* scroll effects; return 1 if we use up the scroll and possibly make it /* scroll effects; return 1 if we use up the scroll and possibly make it
become discovered, 0 if caller should take care of those side-effects */ become discovered, 0 if caller should take care of those side-effects */
int int
@@ -1615,14 +1649,13 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
already_known ? "stinking " : ""); already_known ? "stinking " : "");
cc.x = u.ux; cc.x = u.ux;
cc.y = u.uy; cc.y = u.uy;
getpos_sethilite(display_stinking_cloud_positions);
if (getpos(&cc, TRUE, "the desired position") < 0) { if (getpos(&cc, TRUE, "the desired position") < 0) {
pline1(Never_mind); pline1(Never_mind);
break; break;
} }
if (!cansee(cc.x, cc.y) || distu(cc.x, cc.y) >= 32) { if (!is_valid_stinking_cloud_pos(cc.x, cc.y, TRUE))
You("smell rotten eggs.");
break; break;
}
(void) create_gas_cloud(cc.x, cc.y, 3+bcsign(sobj), (void) create_gas_cloud(cc.x, cc.y, 3+bcsign(sobj),
8+4*bcsign(sobj)); 8+4*bcsign(sobj));
break; break;

View File

@@ -996,7 +996,7 @@ int damage;
cloud->arg = zeroany; cloud->arg = zeroany;
cloud->arg.a_int = damage; cloud->arg.a_int = damage;
cloud->visible = TRUE; cloud->visible = TRUE;
cloud->glyph = cmap_to_glyph(S_cloud); cloud->glyph = cmap_to_glyph(damage ? S_poisoncloud : S_cloud);
add_region(cloud); add_region(cloud);
return cloud; return cloud;
} }

View File

@@ -718,7 +718,7 @@ xchar ltmp;
/* Remove levels and bones that may have been created. /* Remove levels and bones that may have been created.
*/ */
(void) close(nfd); (void) nhclose(nfd);
# ifdef AMIGA # ifdef AMIGA
clearlocks(); clearlocks();
# else # else
@@ -767,7 +767,7 @@ register int fd;
if (!restgamestate(fd, &stuckid, &steedid)) { if (!restgamestate(fd, &stuckid, &steedid)) {
display_nhwindow(WIN_MESSAGE, TRUE); display_nhwindow(WIN_MESSAGE, TRUE);
savelev(-1, 0, FREE_SAVE); /* discard current level */ savelev(-1, 0, FREE_SAVE); /* discard current level */
(void) close(fd); (void) nhclose(fd);
(void) delete_savefile(); (void) delete_savefile();
restoring = FALSE; restoring = FALSE;
return(0); return(0);
@@ -841,7 +841,7 @@ register int fd;
get_plname_from_file(fd, plname); get_plname_from_file(fd, plname);
getlev(fd, 0, (xchar)0, FALSE); getlev(fd, 0, (xchar)0, FALSE);
(void) close(fd); (void) nhclose(fd);
/* Now set the restore settings to match the /* Now set the restore settings to match the
* settings used by the save file output routines * settings used by the save file output routines
@@ -1558,7 +1558,7 @@ register unsigned int len;
} else { } else {
pline("Read %d instead of %u bytes.", rlen, len); pline("Read %d instead of %u bytes.", rlen, len);
if(restoring) { if(restoring) {
(void) close(fd); (void) nhclose(fd);
(void) delete_savefile(); (void) delete_savefile();
error("Error restoring old game."); error("Error restoring old game.");
} }

View File

@@ -162,7 +162,7 @@ dosave0()
nh_uncompress(fq_save); nh_uncompress(fq_save);
fd = open_savefile(); fd = open_savefile();
if (fd > 0) { if (fd > 0) {
(void) close(fd); (void) nhclose(fd);
clear_nhwindow(WIN_MESSAGE); clear_nhwindow(WIN_MESSAGE);
There("seems to be an old save file."); There("seems to be an old save file.");
if (yn("Overwrite the old file?") == 'n') { if (yn("Overwrite the old file?") == 'n') {
@@ -218,7 +218,7 @@ dosave0()
pline("Require %ld bytes but only have %ld.", needed, fds); pline("Require %ld bytes but only have %ld.", needed, fds);
} }
flushout(); flushout();
(void) close(fd); (void) nhclose(fd);
(void) delete_savefile(); (void) delete_savefile();
return 0; return 0;
} }
@@ -265,7 +265,7 @@ dosave0()
ofd = open_levelfile(ltmp, whynot); ofd = open_levelfile(ltmp, whynot);
if (ofd < 0) { if (ofd < 0) {
HUP pline1(whynot); HUP pline1(whynot);
(void) close(fd); (void) nhclose(fd);
(void) delete_savefile(); (void) delete_savefile();
HUP Strcpy(killer.name, whynot); HUP Strcpy(killer.name, whynot);
HUP done(TRICKED); HUP done(TRICKED);
@@ -273,7 +273,7 @@ dosave0()
} }
minit(); /* ZEROCOMP */ minit(); /* ZEROCOMP */
getlev(ofd, hackpid, ltmp, FALSE); getlev(ofd, hackpid, ltmp, FALSE);
(void) close(ofd); (void) nhclose(ofd);
bwrite(fd, (genericptr_t) &ltmp, sizeof ltmp); /* level number*/ bwrite(fd, (genericptr_t) &ltmp, sizeof ltmp); /* level number*/
savelev(fd, ltmp, WRITE_SAVE | FREE_SAVE); /* actual level*/ savelev(fd, ltmp, WRITE_SAVE | FREE_SAVE); /* actual level*/
delete_levelfile(ltmp); delete_levelfile(ltmp);
@@ -404,7 +404,7 @@ savestateinlock()
Strcpy(killer.name, whynot); Strcpy(killer.name, whynot);
done(TRICKED); done(TRICKED);
} }
(void) close(fd); (void) nhclose(fd);
fd = create_levelfile(0, whynot); fd = create_levelfile(0, whynot);
if (fd < 0) { if (fd < 0) {
@@ -742,7 +742,7 @@ def_bclose(fd)
bw_FILE = 0; bw_FILE = 0;
} else } else
#endif #endif
(void) close(fd); (void) nhclose(fd);
return; return;
} }
@@ -879,7 +879,7 @@ zerocomp_bclose(fd)
int fd; int fd;
{ {
zerocomp_bufoff(fd); zerocomp_bufoff(fd);
(void) close(fd); (void) nhclose(fd);
return; return;
} }
#endif /* ZEROCOMP */ #endif /* ZEROCOMP */
@@ -1443,8 +1443,8 @@ char *from, *to;
if (nto != nfrom) if (nto != nfrom)
panic("Copyfile failed!"); panic("Copyfile failed!");
} while (nfrom == BUFSIZ); } while (nfrom == BUFSIZ);
(void) close(fdfrom); (void) nhclose(fdfrom);
(void) close(fdto); (void) nhclose(fdto);
# endif /* TOS */ # endif /* TOS */
} }

View File

@@ -1175,6 +1175,7 @@ void FDECL(init_yyout, (FILE *));
long NDECL(handle_varstring_check); long NDECL(handle_varstring_check);
long FDECL(corefunc_str_check, (char *, long)); long FDECL(corefunc_str_check, (char *, long));
extern void VDECL(lc_error, (const char *, ...));
extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int)); extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int));
extern struct lc_vardefs *variable_definitions; extern struct lc_vardefs *variable_definitions;

View File

@@ -405,7 +405,7 @@ char *argv[];
hackpid = 1; hackpid = 1;
#endif #endif
write(fd, (genericptr_t) &hackpid, sizeof(hackpid)); write(fd, (genericptr_t) &hackpid, sizeof(hackpid));
close(fd); nhclose(fd);
} }
#ifdef MFLOPPY #ifdef MFLOPPY
level_info[0].where = ACTIVE; level_info[0].where = ACTIVE;

View File

@@ -282,7 +282,7 @@ int start;
if (sysflags.asksavedisk) { if (sysflags.asksavedisk) {
/* Don't prompt if you can find the save file */ /* Don't prompt if you can find the save file */
if ((fd = open_savefile()) >= 0) { if ((fd = open_savefile()) >= 0) {
(void) close(fd); (void) nhclose(fd);
return 1; return 1;
} }
clear_nhwindow(WIN_MESSAGE); clear_nhwindow(WIN_MESSAGE);
@@ -335,7 +335,7 @@ comspec_exists()
if ((comspec = getcomspec())) if ((comspec = getcomspec()))
if ((fd = open(comspec, O_RDONLY)) >= 0) { if ((fd = open(comspec, O_RDONLY)) >= 0) {
(void) close(fd); (void) nhclose(fd);
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View File

@@ -150,7 +150,7 @@ getlock()
error("Cannot open %s", fq_lock); error("Cannot open %s", fq_lock);
} }
(void) close(fd); (void) nhclose(fd);
if(iflags.window_inited) { if(iflags.window_inited) {
# ifdef SELF_RECOVER # ifdef SELF_RECOVER
@@ -248,7 +248,7 @@ gotlock:
# endif # endif
error("cannot write lock (%s)", fq_lock); error("cannot write lock (%s)", fq_lock);
} }
if(close(fd) == -1) { if(nhclose(fd) == -1) {
# if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS) # if defined(CHDIR) && !defined(NOCWD_ASSUMPTIONS)
chdirx(orgdir, 0); chdirx(orgdir, 0);
# endif # endif

View File

@@ -1,5 +1,5 @@
%{ %{
/* NetHack 3.5 lev_comp.l $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ /* NetHack 3.5 lev_comp.l $NHDT-Date: 1428240296 2015/04/05 13:24:56 $ $NHDT-Branch: master $:$NHDT-Revision: 1.13 $ */
/* NetHack 3.5 lev_comp.l $Date: 2009/05/06 10:54:31 $ $Revision: 1.9 $ */ /* NetHack 3.5 lev_comp.l $Date: 2009/05/06 10:54:31 $ $Revision: 1.9 $ */
/* SCCS Id: @(#)lev_lex.c 3.5 2002/03/27 */ /* SCCS Id: @(#)lev_lex.c 3.5 2002/03/27 */
/* Copyright (c) 1989 by Jean-Christophe Collet */ /* Copyright (c) 1989 by Jean-Christophe Collet */
@@ -69,6 +69,7 @@ void FDECL(init_yyout, (FILE *));
long NDECL(handle_varstring_check); long NDECL(handle_varstring_check);
long FDECL(corefunc_str_check, (char *, long)); long FDECL(corefunc_str_check, (char *, long));
extern void VDECL(lc_error, (const char *, ...));
extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int)); extern struct lc_vardefs *FDECL(vardef_defined,(struct lc_vardefs *,char *, int));
extern struct lc_vardefs *variable_definitions; extern struct lc_vardefs *variable_definitions;

View File

@@ -1439,6 +1439,25 @@ P = (108, 145, 182)
MMMMMNNNNNMMMMMM MMMMMNNNNNMMMMMM
MMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
} }
# tile 75 (poison cloud)
{
BBBBBBBBBBBBBBBB
BBBBBFFFFFFFBBBB
BBBFFFFFFFFFFBBB
BBFFFFFFFFFGFFBB
BBFFFFFFFFFFFFFB
BFFFFFFFFFFFFGFB
FFFGFFFFFFFFGFFF
FFFFFFFFFFGGFFFF
FFFFFFFFFFFFFGFF
FFGGFFFFFFFGGFFG
FFFFFGGGGGFFFFGG
BGFFFFFFFFFFGGGB
BBGGGFFFFGGGGGGB
BBBGGGGGGGGGGBBB
BBBBBBGGGGBBBBBB
BBBBBBBBBBBBBBBB
}
# tile 75 (cmap 75) # tile 75 (cmap 75)
{ {
AAAAAAADDDDDDAAA AAAAAAADDDDDDAAA