Merge branch 'master' into nhmall-booktribute

Conflicts:
	doc/fixes35.0
	include/extern.h
	src/mkobj.c
	src/mon.c
	src/objnam.c
	win/share/objects.txt
This commit is contained in:
nhmall
2015-04-12 10:02:17 -04:00
41 changed files with 16487 additions and 15871 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ rationale, etc.
============================================== ==============================================
FEATURE_NOTICE Alerts for a Release FEATURE_NOTICE Alerts for a Release
There is a code mechanism for alterting players to a change in behavior There is a code mechanism for alerting players to a change in behavior
over prior versions of the game. over prior versions of the game.
Here's how to do it: Here's how to do it:
+5 -4
View File
@@ -1,4 +1,4 @@
This is a listing of all files in a full NetHack 3.5 distribution, organized This is a listing of all files in a full NetHack 3.6 distribution, organized
in their standard manner on a UNIX system. It indicates which files are in their standard manner on a UNIX system. It indicates which files are
necessary for which versions, so that you can tell which files may be deleted necessary for which versions, so that you can tell which files may be deleted
from or not transferred to your system if you wish. from or not transferred to your system if you wish.
@@ -17,7 +17,8 @@ cmdhelp data.base dungeon.def endgame.des gehennom.des
help hh history knox.des license help hh history knox.des license
medusa.des mines.des opthelp oracle.des oracles.txt medusa.des mines.des opthelp oracle.des oracles.txt
quest.txt rumors.fal rumors.tru sokoban.des symbols quest.txt rumors.fal rumors.tru sokoban.des symbols
tower.des wizhelp yendor.des tower.des wizhelp yendor.des tribute bogusmon.txt
engrave.txt epitaph.txt
doc: doc:
(files for all versions) (files for all versions)
@@ -265,8 +266,8 @@ petmark.uu resource.h rip.uu splash.uu tiles.mak
winMS.h winhack.c winhack.rc winMS.h winhack.c winhack.rc
(files for Visual Studio 2010 Express Edition builds) (files for Visual Studio 2010 Express Edition builds)
dgncomp.vcxproj dgnstuff.vcxproj dgnstuff.mak dlb_main.vcxproj levcomp.vcxproj dgncomp.vcxproj dgnstuff.vcxproj dgnstuff.mak dlb_main.vcxproj levcomp.vcxproj
levstuff.vcxproj levstuff.mak makedefs.vcxproj nethack.sln uudecode.vcxproj levstuff.vcxproj levstuff.mak makedefs.vcxproj NetHack.sln uudecode.vcxproj
nethackw.vcxproj tile2bmp.vcxproj recover.vcxproj tilemap.vcxproj tiles.vcxproj NetHackW.vcxproj tile2bmp.vcxproj recover.vcxproj tilemap.vcxproj tiles.vcxproj
This is a list of files produced by auxiliary programs. They can all be This is a list of files produced by auxiliary programs. They can all be
regenerated from the files in the distribution. regenerated from the files in the distribution.
+2 -2
View File
@@ -186,8 +186,8 @@ as well as maintaining the X11 interface.
Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained the port Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained the port
of NetHack 3.6.0 for Mac. of NetHack 3.6.0 for Mac.
Michael Allison, Derek S. Ray, Yitzhak Sapir, Alex Kompel, and David Cohrs Michael Allison, Derek S. Ray, Yitzhak Sapir, Alex Kompel, Dion Nicolaas,
maintained the port of NetHack 3.6.0 for Microsoft Windows. and David Cohrs maintained the port of NetHack 3.6.0 for Microsoft Windows.
Jeff Bailey created and maintained a port of NetHack 3.6.0 for Chrome. Jeff Bailey created and maintained a port of NetHack 3.6.0 for Chrome.
+19 -17
View File
@@ -6,7 +6,7 @@
.ds vr "NetHack 3.6 .ds vr "NetHack 3.6
.ds f0 "\*(vr .ds f0 "\*(vr
.ds f1 .ds f1
.ds f2 "March 27, 2015 .ds f2 "April 12, 2015
.\" labeled paragraph start (should be part of tmac.n, but I don't want to .\" labeled paragraph start (should be part of tmac.n, but I don't want to
.\" make changes to that file) .\" make changes to that file)
.\" .PS word .\" .PS word
@@ -3007,6 +3007,9 @@ A string explaining how to recover a game on this system (no default value).
SEDUCE SEDUCE
0 or 1 to disable or enable, respectively, the SEDUCE option (see the source 0 or 1 to disable or enable, respectively, the SEDUCE option (see the source
for details on this function). for details on this function).
.lp
CHECK_SAVE_UID
0 or 1 to disable or enable, respectively, the UID checking for savefiles.
.pg .pg
The following options affect the score file: The following options affect the score file:
.pg .pg
@@ -3281,16 +3284,6 @@ successors originally by \fBDaniel Thaler\fP and then by \fBAlex Smith\fP,
and Dynahack by \fBTung Nguyen\fP. Some of those variants continue to be and Dynahack by \fBTung Nguyen\fP. Some of those variants continue to be
developed, maintained, and enjoyed by the community to this day. developed, maintained, and enjoyed by the community to this day.
.pg .pg
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
.pg
In January 2015, preparation began for the release of NetHack 3.6
.pg
At the beginning of development for what would eventually get released At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of \fBWarwick Allison\fP, as 3.6.0, the development team consisted of \fBWarwick Allison\fP,
\fBMichael Allison\fP, \fBKen Arromdee\fP, \fBMichael Allison\fP, \fBKen Arromdee\fP,
@@ -3299,25 +3292,34 @@ as 3.6.0, the development team consisted of \fBWarwick Allison\fP,
\fBMike Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP. \fBMike Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP.
Leading up to the release of 3.6.0 in early 2015, new members Leading up to the release of 3.6.0 in early 2015, new members
\fBSean Hunt\fP, \fBPasi Kallinen\fP, and \fBDerek S. Ray\fP \fBSean Hunt\fP, \fBPasi Kallinen\fP, and \fBDerek S. Ray\fP
joined the NetHack development team, joined the NetHack development team.
.pg .pg
\fB3.6.0 TODO insert apprpriate description of 3.6.0 here In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
.pg
In January 2015, preparation began for the release of NetHack 3.6. The 3.6
version merges work done by the development team since the previous release with
some of the beloved community patches. Many bugs were fixed and some code was
restructured.
.pg .pg
\fBThe development team, as well as \fBSteve VanDevender\fP and \fBThe development team, as well as \fBSteve VanDevender\fP and
\fBKevin Smolkowski\fP ensured that NetHack 3.6.0 continued to operate on \fBKevin Smolkowski\fP ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface. various Unix flavors and maintained the X11 interface.
.pg .pg
\fBKen Lorber\fP, \fBHaoyang Wang\fP, \fBPat Rankin\fP, and \fBDean Luick\fP \fBKen Lorber\fP, \fBHaoyang Wang\fP, \fBPat Rankin\fP, and \fBDean Luick\fP
maintained the port of NetHack 3.6.0 for Mac. maintained the port of NetHack 3.6.0 for Mac.
.pg .pg
\fBMichael Allison\fP, \fBDerek S. Ray\fP, \fBYitzhak Sapir\fP, \fBMichael Allison\fP, \fBDerek S. Ray\fP, \fBYitzhak Sapir\fP,
\fBAlex Kompel\fP, and \fBDavid Cohrs\fP maintained the port of \fBAlex Kompel\fP, and \fBDion Nicolaas\fP maintained the port of
NetHack 3.6.0 for Microsoft Windows. NetHack 3.6.0 for Microsoft Windows.
.pg .pg
\fBJeff Bailey\fP created and maintained a port of NetHack 3.6.0 for Chrome. \fBJeff Bailey\fP created and maintained a port of NetHack 3.6.0 for Chrome.
.pg .pg
TODO \fBAlex Kompel\fP maintained a port of NetHack 3.6.0 to Windows Phone.
.pg
\fBThis version of the game is special in a particular way. Near the end of \fBThis version of the game is special in a particular way. Near the end of
the development of 3.6, one of the significant inspirations for many of the the development of 3.6, one of the significant inspirations for many of the
humorous and fun features found in the game, author \fBTerry Pratchett\fP, humorous and fun features found in the game, author \fBTerry Pratchett\fP,
+24 -25
View File
@@ -33,7 +33,7 @@
\begin{document} \begin{document}
% %
% input file: guidebook.mn % input file: guidebook.mn
% $Revision: 1.122 $ $Date: 2015/03/27 06:00:00 $ % $Revision: 1.122 $ $Date: 2015/04/12 06:00:00 $
% %
%.ds h0 " %.ds h0 "
%.ds h1 %.ds h2 \% %.ds h1 %.ds h2 \%
@@ -46,7 +46,7 @@
%.au %.au
\author{Eric S. Raymond\\ \author{Eric S. Raymond\\
(Edited and expanded for 3.6)} (Edited and expanded for 3.6)}
\date{March 27, 2015} \date{April 12, 2015}
\maketitle \maketitle
@@ -3597,6 +3597,9 @@ A string explaining how to recover a game on this system (no default value).
\item[\ib{SEDUCE}] \item[\ib{SEDUCE}]
0 or 1 to disable or enable, respectively, the SEDUCE option (see the source) 0 or 1 to disable or enable, respectively, the SEDUCE option (see the source)
for details on this function. for details on this function.
%.lp
\item[\ib{CHECK\_SAVE\_UID}]
0 or 1 to disable or enable, respectively, the UID checking for savefiles.
\elist \elist
%.pg %.pg
@@ -3952,6 +3955,18 @@ originally by Daniel Thaler and then by Alex Smith, and
Dynahack by Tung Nguyen. Some of those variants continue to be developed, Dynahack by Tung Nguyen. Some of those variants continue to be developed,
maintained, and enjoyed by the community to this day. maintained, and enjoyed by the community to this day.
%.pg
\medskip
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of {\it Warwick Allison},
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet},
{\it Ken Lorber}, {\it Dean Luick}, {\it Pat Rankin},
{\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}.
Leading up to the release of 3.6.0 in early 2015, new members
{\it Sean Hunt}, {\it Pasi Kallinen}, and {\it Derek S. Ray}
joined the NetHack development team.
%.pg %.pg
\medskip \medskip
In September 2014, an interim snapshot of the code under development was In September 2014, an interim snapshot of the code under development was
@@ -3964,47 +3979,31 @@ would never be a 3.4.4, 3.5, or 3.5.0 official release version.
%.pg %.pg
\medskip \medskip
In January 2015, preparation began for the release of NetHack 3.6 In January 2015, preparation began for the release of NetHack 3.6.
The 3.6 version merges work done by the development team since the previous
%.pg release with some of the beloved community patches. Many bugs were fixed
\medskip and some code was restructured.
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of {\it Warwick Allison},
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet},
{\it Ken Lorber}, {\it Dean Luick}, {\it Pat Rankin},
{\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}.
Leading up to the release of 3.6.0 in early 2015, new members
{\it Sean Hunt}, {\it Pasi Kallinen}, and {\it Derek S. Ray}
joined the NetHack development team,
%.pg
\medskip
3.6.0 TODO insert apprpriate description of 3.6.0 here
%.pg %.pg
\medskip \medskip
The development team, as well as {\it Steve VanDevender} and The development team, as well as {\it Steve VanDevender} and
{\it Kevin Smolkowski} ensured that NetHack 3.6.0 continued to operate on {\it Kevin Smolkowski} ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface. various Unix flavors and maintained the X11 interface.
%.pg
{\it Ken Lorber}, {\it Haoyang Wang}, {\it Pat Rankin}, and {\it Dean Luick} {\it Ken Lorber}, {\it Haoyang Wang}, {\it Pat Rankin}, and {\it Dean Luick}
maintained the port of NetHack 3.6.0 for Mac. maintained the port of NetHack 3.6.0 for Mac.
%.pg %.pg
\medskip \medskip
{\it Michael Allison}, {\it Derek S. Ray}, {\it Yitzhak Sapir}, {\it Michael Allison}, {\it Derek S. Ray}, {\it Yitzhak Sapir},
{\it Alex Kompel}, and {\it David Cohrs} maintained the port of {\it Alex Kompel}, and {\it Dion Nicolaas} maintained the port of
NetHack 3.6.0 for Microsoft Windows. NetHack 3.6.0 for Microsoft Windows.
%.pg %.pg
\medskip \medskip
{\it Jeff Bailey} created and maintained a port of NetHack 3.6.0 for Chrome. {\it Jeff Bailey} created and maintained a port of NetHack 3.6.0 for Chrome.
%.pg
\medskip
{\it Alex Kompel} maintained a port of NetHack 3.6.0 to Windows Phone. <FIXME>?
%.pg %.pg
\medskip \medskip
This version of the game is special in a particular way. Near the end of This version of the game is special in a particular way. Near the end of
+5 -1
View File
@@ -894,6 +894,9 @@ non-pet rust monsters would eat rust-proofed non-digestibles but ignore
kicking a grave may topple the gravestone kicking a grave may topple the gravestone
allow showing legal positions for stinking cloud, jumping and polearms allow showing legal positions for stinking cloud, jumping and polearms
when asked for a location when asked for a location
cloned creatures (of any type) don't deathdrop items
pudding corpses behave somewhat differently than before
mithril armor should have silver color
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes
@@ -1112,6 +1115,7 @@ show more explicit reason why player was helpless at death
added new hallucinatory-only gods added new hallucinatory-only gods
options to create the character blind or nudist options to create the character blind or nudist
moving clouds on the plane of air moving clouds on the plane of air
disclose extinct species alongside genocided ones
tribute to Terry Pratchett tribute to Terry Pratchett
@@ -1153,7 +1157,7 @@ adopt/adapt/improve Dungeon Overview
Aardvark Joe's Extended Logfile Aardvark Joe's Extended Logfile
Michael Deutschmann's use_darkgray Michael Deutschmann's use_darkgray
Clive Crous' dark_room Clive Crous' dark_room
Jukka Lahtinen's sortloot sortloot by Jeroen Demeyer and Jukka Lahtinen
Code Cleanup and Reorganization Code Cleanup and Reorganization
+4
View File
@@ -437,8 +437,12 @@ typedef unsigned char uchar;
*/ */
/* Menucolors */ /* Menucolors */
/* HACK: this is being added to fix the builds temporarily.
* Remove it whenever we finally get a real regex for Win32 */
#ifdef UNIX
# define MENU_COLOR_REGEX /* use GNU regex */ # define MENU_COLOR_REGEX /* use GNU regex */
/*# define MENU_COLOR_REGEX_POSIX*/ /* use POSIX regex */ /*# define MENU_COLOR_REGEX_POSIX*/ /* use POSIX regex */
#endif
/* if neither is defined, uses pmatch() /* if neither is defined, uses pmatch()
* pmatch() provides basic globbing: '*' and '?' wildcards. * pmatch() provides basic globbing: '*' and '?' wildcards.
*/ */
+8 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 extern.h $NHDT-Date: 1428196810 2015/04/05 01:20:10 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.451 $ */ /* NetHack 3.5 extern.h $NHDT-Date: 1428806395 2015/04/12 02:39:55 $ $NHDT-Branch: master $:$NHDT-Revision: 1.455 $ */
/* NetHack 3.5 extern.h $Date: 2013/11/05 00:57:53 $ $Revision: 1.380 $ */ /* NetHack 3.5 extern.h $Date: 2013/11/05 00:57:53 $ $Revision: 1.380 $ */
/* Copyright (c) Steve Creps, 1988. */ /* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -836,6 +836,8 @@ E int FDECL(isqrt, (int));
E int FDECL(distmin, (int,int,int,int)); E int FDECL(distmin, (int,int,int,int));
E boolean FDECL(online2, (int,int,int,int)); E boolean FDECL(online2, (int,int,int,int));
E boolean FDECL(pmatch, (const char *,const char *)); E boolean FDECL(pmatch, (const char *,const char *));
E boolean FDECL(pmatchi, (const char *,const char *));
E boolean FDECL(pmatchz, (const char *,const char *));
#ifndef STRNCMPI #ifndef STRNCMPI
E int FDECL(strncmpi, (const char *,const char *,int)); E int FDECL(strncmpi, (const char *,const char *,int));
#endif #endif
@@ -1230,6 +1232,10 @@ E void FDECL(obj_ice_effects, (int, int, BOOLEAN_P));
E long FDECL(peek_at_iced_corpse_age, (struct obj *)); E long FDECL(peek_at_iced_corpse_age, (struct obj *));
E int FDECL(hornoplenty, (struct obj *,BOOLEAN_P)); E int FDECL(hornoplenty, (struct obj *,BOOLEAN_P));
E void NDECL(obj_sanity_check); E void NDECL(obj_sanity_check);
E struct obj* FDECL(obj_nexto, (struct obj*));
E struct obj* FDECL(obj_nexto_xy, (int, int, int, unsigned));
E struct obj* FDECL(obj_absorb, (struct obj**, struct obj**));
E struct obj* FDECL(obj_meld, (struct obj**, struct obj**));
/* ### mkroom.c ### */ /* ### mkroom.c ### */
@@ -2663,7 +2669,7 @@ E struct monst *FDECL(bhit, (int,int,int,int,int (*)(MONST_P,OBJ_P),
int (*)(OBJ_P,OBJ_P),struct obj **)); int (*)(OBJ_P,OBJ_P),struct obj **));
E struct monst *FDECL(boomhit, (struct obj *,int,int)); E struct monst *FDECL(boomhit, (struct obj *,int,int));
E int FDECL(zhitm, (struct monst *,int,int,struct obj **)); E int FDECL(zhitm, (struct monst *,int,int,struct obj **));
E int FDECL(burn_floor_paper, (int,int,BOOLEAN_P,BOOLEAN_P)); E int FDECL(burn_floor_objects, (int,int,BOOLEAN_P,BOOLEAN_P));
E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int)); E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int));
E void FDECL(melt_ice, (XCHAR_P,XCHAR_P,const char *)); E void FDECL(melt_ice, (XCHAR_P,XCHAR_P,const char *));
E void FDECL(start_melt_ice_timeout, (XCHAR_P,XCHAR_P,long)); E void FDECL(start_melt_ice_timeout, (XCHAR_P,XCHAR_P,long));
+6 -1
View File
@@ -94,7 +94,7 @@ struct obj {
Bitfield(recharged,3); /* number of times it's been recharged */ Bitfield(recharged,3); /* number of times it's been recharged */
#define on_ice recharged /* corpse on ice */ #define on_ice recharged /* corpse on ice */
Bitfield(lamplit,1); /* a light-source -- can be lit */ Bitfield(lamplit,1); /* a light-source -- can be lit */
Bitfield(oreserved1,1); /* was the placeholder for invisible objects, free for use */ Bitfield(globby,1); /* globby; will combine with like types on adjacent squares */
Bitfield(greased,1); /* covered with grease */ Bitfield(greased,1); /* covered with grease */
Bitfield(nomerge,1); /* set temporarily to prevent merging */ Bitfield(nomerge,1); /* set temporarily to prevent merging */
Bitfield(was_thrown,1); /* thrown by hero since last picked up */ Bitfield(was_thrown,1); /* thrown by hero since last picked up */
@@ -233,6 +233,11 @@ struct obj {
#define polyfodder(obj) (ofood(obj) && pm_to_cham((obj)->corpsenm) != NON_PM) #define polyfodder(obj) (ofood(obj) && pm_to_cham((obj)->corpsenm) != NON_PM)
#define mlevelgain(obj) (ofood(obj) && (obj)->corpsenm == PM_WRAITH) #define mlevelgain(obj) (ofood(obj) && (obj)->corpsenm == PM_WRAITH)
#define mhealup(obj) (ofood(obj) && (obj)->corpsenm == PM_NURSE) #define mhealup(obj) (ofood(obj) && (obj)->corpsenm == PM_NURSE)
#define Is_pudding(o) (o->otyp == GLOB_OF_GRAY_OOZE \
|| o->otyp == GLOB_OF_BROWN_PUDDING \
|| o->otyp == GLOB_OF_GREEN_SLIME \
|| o->otyp == GLOB_OF_BLACK_PUDDING)
/* Containers */ /* Containers */
#define carried(o) ((o)->where == OBJ_INVENT) #define carried(o) ((o)->where == OBJ_INVENT)
+1
View File
@@ -35,6 +35,7 @@ struct sysopt {
# endif # endif
#endif #endif
int seduce; int seduce;
int check_save_uid; /* restoring savefile checks UID? */
}; };
extern struct sysopt sysopt; extern struct sysopt sysopt;
+1 -1
View File
@@ -1244,7 +1244,7 @@ char resultbuf[]; /* should be at least [7] to hold "18/100\0" */
void void
enlightenment(mode, final) enlightenment(mode, final)
int mode; /* BASICENLIGHTENMENT | MAGICENLIGHTENMENT (| both) */ int mode; /* BASICENLIGHTENMENT | MAGICENLIGHTENMENT (| both) */
int final; /* ENL_GAMEINPROGRESS:0, ENL_GAVEOVERALIVE, ENL_GAMEOVERDEAD */ int final; /* ENL_GAMEINPROGRESS:0, ENL_GAMEOVERALIVE, ENL_GAMEOVERDEAD */
{ {
char buf[BUFSZ], tmpbuf[BUFSZ]; char buf[BUFSZ], tmpbuf[BUFSZ];
+1 -1
View File
@@ -160,7 +160,7 @@ magic_map_background(x, y, show)
if (!cansee(x,y) && !lev->waslit) { if (!cansee(x,y) && !lev->waslit) {
/* Floor spaces are dark if unlit. Corridors are dark if unlit. */ /* Floor spaces are dark if unlit. Corridors are dark if unlit. */
if (lev->typ == ROOM && glyph == cmap_to_glyph(S_room)) if (lev->typ == ROOM && glyph == cmap_to_glyph(S_room))
glyph = cmap_to_glyph(S_stone); glyph = cmap_to_glyph((flags.dark_room && iflags.use_color) ? (DARKROOMSYM) : S_stone);
else if (lev->typ == CORR && glyph == cmap_to_glyph(S_litcorr)) else if (lev->typ == CORR && glyph == cmap_to_glyph(S_litcorr))
glyph = cmap_to_glyph(S_corr); glyph = cmap_to_glyph(S_corr);
} }
+1303 -1295
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -1612,7 +1612,7 @@ start_eating(otmp) /* called as you start to eat */
context.victual.fullwarn = context.victual.doreset = FALSE; context.victual.fullwarn = context.victual.doreset = FALSE;
context.victual.eating = TRUE; context.victual.eating = TRUE;
if (otmp->otyp == CORPSE) { if (otmp->otyp == CORPSE || otmp->globby) {
cprefx(context.victual.piece->corpsenm); cprefx(context.victual.piece->corpsenm);
if (!context.victual.piece || !context.victual.eating) { if (!context.victual.piece || !context.victual.eating) {
/* rider revived, or died and lifesaved */ /* rider revived, or died and lifesaved */
@@ -2127,7 +2127,7 @@ struct obj *otmp;
!Stone_resistance && !Stone_resistance &&
!poly_when_stoned(youmonst.data)); !poly_when_stoned(youmonst.data));
if (mnum == PM_GREEN_SLIME) if (mnum == PM_GREEN_SLIME || otmp->otyp == GLOB_OF_GREEN_SLIME)
stoneorslime = (!Unchanging && !slimeproof(youmonst.data)); stoneorslime = (!Unchanging && !slimeproof(youmonst.data));
if (cadaver && !nonrotting_corpse(mnum)) { if (cadaver && !nonrotting_corpse(mnum)) {
@@ -2397,7 +2397,7 @@ doeat() /* generic "eat" command funtion (see cmd.c) */
* for normal vs. rotten food. The reqtime and nutrit values are * for normal vs. rotten food. The reqtime and nutrit values are
* then adjusted in accordance with the amount of food left. * then adjusted in accordance with the amount of food left.
*/ */
if(otmp->otyp == CORPSE) { if(otmp->otyp == CORPSE || otmp->globby) {
int tmp = eatcorpse(otmp); int tmp = eatcorpse(otmp);
if (tmp == 2) { if (tmp == 2) {
/* used up */ /* used up */
+39 -10
View File
@@ -1238,7 +1238,7 @@ boolean identified, all_containers, reportempty;
{ {
register struct obj *box, *obj; register struct obj *box, *obj;
struct obj **oarray; struct obj **oarray;
int i,j,n; int i,n;
char *invlet; char *invlet;
char buf[BUFSZ]; char buf[BUFSZ];
boolean cat, deadcat; boolean cat, deadcat;
@@ -1437,43 +1437,72 @@ num_genocides()
return n; return n;
} }
int
num_extinct()
{
int i, n = 0;
for (i = LOW_PM; i < NUMMONS; ++i)
if (!(mvitals[i].mvflags & G_GENOD) &&
(mvitals[i].mvflags & G_GONE) &&
!(mons[i].geno & G_UNIQ)) ++n;
return n;
}
STATIC_OVL void STATIC_OVL void
list_genocided(defquery, ask) list_genocided(defquery, ask)
char defquery; char defquery;
boolean ask; boolean ask;
{ {
register int i; register int i;
int ngenocided; int ngenocided, nextinct;
char c; char c;
winid klwin; winid klwin;
char buf[BUFSZ]; char buf[BUFSZ];
ngenocided = num_genocides(); ngenocided = num_genocides();
nextinct = num_extinct();
/* genocided species list */ /* genocided or extinct species list */
if (ngenocided != 0) { if (ngenocided != 0 || nextinct != 0) {
c = ask ? yn_function("Do you want a list of species genocided?", Sprintf(buf, "Do you want a list of %sspecies%s%s?",
ynqchars, defquery) : defquery; (nextinct && !ngenocided) ? "extinct " : "",
(ngenocided) ? " genocided" : "",
(nextinct && ngenocided) ? " and extinct" : "");
c = ask ? yn_function(buf, ynqchars, defquery) : defquery;
if (c == 'q') done_stopprint++; if (c == 'q') done_stopprint++;
if (c == 'y') { if (c == 'y') {
klwin = create_nhwindow(NHW_MENU); klwin = create_nhwindow(NHW_MENU);
putstr(klwin, 0, "Genocided species:"); Sprintf(buf, "%s%s species:",
(ngenocided) ? "Genocided" : "Extinct",
(nextinct && ngenocided) ? " or extinct" : "");
putstr(klwin, 0, buf);
putstr(klwin, 0, ""); putstr(klwin, 0, "");
for (i = LOW_PM; i < NUMMONS; i++) for (i = LOW_PM; i < NUMMONS; i++)
if (mvitals[i].mvflags & G_GENOD) { if (mvitals[i].mvflags & G_GONE && !(mons[i].geno & G_UNIQ)) {
if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST) if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST)
Sprintf(buf, "%s%s", Sprintf(buf, "%s%s",
!type_is_pname(&mons[i]) ? "" : "the ", !type_is_pname(&mons[i]) ? "" : "the ",
mons[i].mname); mons[i].mname);
else else
Strcpy(buf, makeplural(mons[i].mname)); Strcpy(buf, makeplural(mons[i].mname));
if (!(mvitals[i].mvflags & G_GENOD))
Strcat(buf, " (extinct)");
putstr(klwin, 0, buf); putstr(klwin, 0, buf);
} }
putstr(klwin, 0, ""); putstr(klwin, 0, "");
Sprintf(buf, "%d species genocided.", ngenocided); if (ngenocided > 0) {
putstr(klwin, 0, buf); Sprintf(buf, "%d species genocided.", ngenocided);
putstr(klwin, 0, buf);
}
if (nextinct > 0) {
Sprintf(buf, "%d species extinct.", nextinct);
putstr(klwin, 0, buf);
}
display_nhwindow(klwin, TRUE); display_nhwindow(klwin, TRUE);
destroy_nhwindow(klwin); destroy_nhwindow(klwin);
+1868 -1866
View File
File diff suppressed because it is too large Load Diff
+1918 -1918
View File
File diff suppressed because it is too large Load Diff
+58 -14
View File
@@ -1,15 +1,15 @@
/* NetHack 3.5 hacklib.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ /* NetHack 3.5 hacklib.c $NHDT-Date: 1428806394 2015/04/12 02:39:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
/* NetHack 3.5 hacklib.c $Date: 2009/05/06 10:46:32 $ $Revision: 1.23 $ */ /* NetHack 3.5 hacklib.c $Date: 2009/05/06 10:46:32 $ $Revision: 1.23 $ */
/* SCCS Id: @(#)hacklib.c 3.5 2007/04/30 */ /* SCCS Id: @(#)hacklib.c 3.5 2007/04/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* Copyright (c) Robert Patrick Rankin, 1991 */ /* Copyright (c) Robert Patrick Rankin, 1991 */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
/* We could include only config.h, except for the overlay definitions... */ #include "hack.h" /* for config.h+extern.h */
#include "hack.h"
/*= /*=
Assorted 'small' utility routines. They're virtually independent of Assorted 'small' utility routines. They're virtually independent of
NetHack, except that rounddiv may call panic(). NetHack, except that rounddiv may call panic(). setrandom calls one of
srandom(), srand48(), or srand() depending upon configuration.
return type routine name argument type(s) return type routine name argument type(s)
boolean digit (char) boolean digit (char)
@@ -40,9 +40,12 @@ NetHack, except that rounddiv may call panic().
int dist2 (int, int, int, int) int dist2 (int, int, int, int)
boolean online2 (int, int) boolean online2 (int, int)
boolean pmatch (const char *, const char *) boolean pmatch (const char *, const char *)
boolean pmatchi (const char *, const char *)
boolean pmatchz (const char *, const char *)
int strncmpi (const char *, const char *, int) int strncmpi (const char *, const char *, int)
char * strstri (const char *, const char *) char * strstri (const char *, const char *)
boolean fuzzymatch (const char *,const char *,const char *,boolean) boolean fuzzymatch (const char *,const char *,
const char *,boolean)
void setrandom (void) void setrandom (void)
time_t getnow (void) time_t getnow (void)
int getyear (void) int getyear (void)
@@ -62,6 +65,9 @@ NetHack, except that rounddiv may call panic().
# define Static static # define Static static
#endif #endif
static boolean FDECL(pmatch_internal, (const char *,const char *,
BOOLEAN_P,const char *));
boolean boolean
digit(c) /* is 'c' a digit? */ digit(c) /* is 'c' a digit? */
char c; char c;
@@ -465,9 +471,12 @@ online2(x0, y0, x1, y1) /* are two points lined up (on a straight line)? */
return((boolean)(!dy || !dx || (dy == dx) || (dy + dx == 0))); /* (dy == -dx) */ return((boolean)(!dy || !dx || (dy == dx) || (dy + dx == 0))); /* (dy == -dx) */
} }
boolean /* guts of pmatch(), pmatchi(), and pmatchz() */
pmatch(patrn, strng) /* match a string against a pattern */ static boolean
pmatch_internal(patrn, strng, ci, sk) /* match a string against a pattern */
const char *patrn, *strng; const char *patrn, *strng;
boolean ci; /* True => case-insensitive, False => case-sensitive */
const char *sk; /* set of characters to skip */
{ {
char s, p; char s, p;
/* /*
@@ -475,18 +484,53 @@ pmatch(patrn, strng) /* match a string against a pattern */
: any single character. Returns TRUE if 'strng' matches 'patrn'. : any single character. Returns TRUE if 'strng' matches 'patrn'.
*/ */
pmatch_top: pmatch_top:
s = *strng++; p = *patrn++; /* get next chars and pre-advance */ if (!sk) {
s = *strng++; p = *patrn++; /* get next chars and pre-advance */
} else {
/* fuzzy match variant of pmatch; particular characters are ignored */
do { s = *strng++; } while (index(sk, s));
do { p = *patrn++; } while (index(sk, p));
}
if (!p) /* end of pattern */ if (!p) /* end of pattern */
return((boolean)(s == '\0')); /* matches iff end of string too */ return (boolean)(s == '\0'); /* matches iff end of string too */
else if (p == '*') /* wildcard reached */ else if (p == '*') /* wildcard reached */
return((boolean)((!*patrn || pmatch(patrn, strng-1)) ? TRUE : return (boolean)
s ? pmatch(patrn-1, strng) : FALSE)); ((!*patrn || pmatch_internal(patrn, strng-1, ci, sk)) ? TRUE :
else if (p != s && (p != '?' || !s)) /* check single character */ s ? pmatch_internal(patrn-1, strng, ci, sk) : FALSE);
else if ((ci ? lowc(p) != lowc(s) : p != s) /* check single character */
&& (p != '?' || !s)) /* & single-char wildcard */
return FALSE; /* doesn't match */ return FALSE; /* doesn't match */
else /* return pmatch(patrn, strng); */ else /* return pmatch_internal(patrn, strng, ci, sk); */
goto pmatch_top; /* optimize tail recursion */ goto pmatch_top; /* optimize tail recursion */
} }
/* case-sensitive wildcard match */
boolean
pmatch(patrn, strng)
const char *patrn, *strng;
{
return pmatch_internal(patrn, strng, FALSE, (const char *)0);
}
/* case-insensitive wildcard match */
boolean
pmatchi(patrn, strng)
const char *patrn, *strng;
{
return pmatch_internal(patrn, strng, TRUE, (const char *)0);
}
/* case-insensitive wildcard fuzzymatch */
boolean
pmatchz(patrn, strng)
const char *patrn, *strng;
{
/* ignore spaces, tabs (just in case), dashes, and underscores */
static const char fuzzychars[] = " \t-_";
return pmatch_internal(patrn, strng, TRUE, fuzzychars);
}
#ifndef STRNCMPI #ifndef STRNCMPI
int int
strncmpi(s1, s2, n) /* case insensitive counted string comparison */ strncmpi(s1, s2, n) /* case insensitive counted string comparison */
@@ -603,7 +647,7 @@ STATIC_DCL struct tm *NDECL(getlt);
void void
setrandom() setrandom()
{ {
unsigned long seed = getnow(); /* time((TIME_type) 0) */ unsigned long seed = (unsigned long)getnow(); /* time((TIME_type) 0) */
#ifdef UNIX #ifdef UNIX
/* Quick dirty band-aid to prevent PRNG prediction */ /* Quick dirty band-aid to prevent PRNG prediction */
seed *= getpid(); seed *= getpid();
+2022 -2014
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -519,7 +519,7 @@ int spellnum;
destroy_item(SCROLL_CLASS, AD_FIRE); destroy_item(SCROLL_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE);
destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(SPBOOK_CLASS, AD_FIRE);
(void) burn_floor_paper(u.ux, u.uy, TRUE, FALSE); (void) burn_floor_objects(u.ux, u.uy, TRUE, FALSE);
break; break;
case CLC_LIGHTNING: case CLC_LIGHTNING:
{ {
-1
View File
@@ -879,7 +879,6 @@ fumaroles()
for (n = rn2(3)+2; n; n--) { for (n = rn2(3)+2; n; n--) {
xchar x = rn1(COLNO-4,3); xchar x = rn1(COLNO-4,3);
xchar y = rn1(ROWNO-4,3); xchar y = rn1(ROWNO-4,3);
struct trap *ttmp = t_at(x,y);
if (levl[x][y].typ == LAVAPOOL) { if (levl[x][y].typ == LAVAPOOL) {
NhRegion *r = create_gas_cloud(x,y, 4+rn2(5), rn1(10,5)); NhRegion *r = create_gas_cloud(x,y, 4+rn2(5), rn1(10,5));
clear_heros_fault(r); clear_heros_fault(r);
+1268 -1134
View File
File diff suppressed because it is too large Load Diff
+2338 -2320
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -1820,7 +1820,7 @@ struct permonst _mons2[] = {
* Puddings * Puddings
*/ */
MON("gray ooze", S_PUDDING, MON("gray ooze", S_PUDDING,
LVL(3, 1, 8, 0, 0), (G_GENO|2), LVL(3, 1, 8, 0, 0), (G_GENO|G_NOCORPSE|2),
A(ATTK(AT_BITE, AD_RUST, 2, 8), A(ATTK(AT_BITE, AD_RUST, 2, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(500, 250, MS_SILENT, MZ_MEDIUM), SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
@@ -1829,7 +1829,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID, M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY), M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY),
MON("brown pudding", S_PUDDING, MON("brown pudding", S_PUDDING,
LVL(5, 3, 8, 0, 0), (G_GENO|1), LVL(5, 3, 8, 0, 0), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_BITE, AD_DCAY, 0, 0), A(ATTK(AT_BITE, AD_DCAY, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(500, 250, MS_SILENT, MZ_MEDIUM), SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
@@ -1838,7 +1838,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID, M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN), M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN),
MON("green slime", S_PUDDING, MON("green slime", S_PUDDING,
LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|1), LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|G_NOCORPSE|1),
A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0), A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 150, MS_SILENT, MZ_LARGE), SIZ(400, 150, MS_SILENT, MZ_LARGE),
@@ -1847,7 +1847,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID|M1_POIS, M1_MINDLESS|M1_OMNIVORE|M1_ACID|M1_POIS,
M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN), M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN),
MON("black pudding", S_PUDDING, MON("black pudding", S_PUDDING,
LVL(10, 6, 6, 0, 0), (G_GENO|1), LVL(10, 6, 6, 0, 0), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0), A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(900, 250, MS_SILENT, MZ_LARGE), SIZ(900, 250, MS_SILENT, MZ_LARGE),
+10 -4
View File
@@ -1,5 +1,4 @@
/* NetHack 3.5 objects.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ /* NetHack 3.5 objects.c $NHDT-Date: 1428802519 2015/04/12 01:35:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
/* NetHack 3.5 objects.c $Date: 2011/07/28 04:00:20 $ $Revision: 1.23 $ */
/* Copyright (c) Mike Threepoint, 1989. */ /* Copyright (c) Mike Threepoint, 1989. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -374,9 +373,9 @@ ARMOR("splint mail", (char *)0,
ARMOR("banded mail", (char *)0, ARMOR("banded mail", (char *)0,
1, 0, 1, 0, 72, 5, 350, 90, 4, 1, ARM_SUIT, IRON, HI_METAL), 1, 0, 1, 0, 72, 5, 350, 90, 4, 1, ARM_SUIT, IRON, HI_METAL),
ARMOR("dwarvish mithril-coat", (char *)0, ARMOR("dwarvish mithril-coat", (char *)0,
1, 0, 0, 0, 10, 1, 150, 240, 4, 2, ARM_SUIT, MITHRIL, HI_METAL), 1, 0, 0, 0, 10, 1, 150, 240, 4, 2, ARM_SUIT, MITHRIL, HI_SILVER),
ARMOR("elven mithril-coat", (char *)0, ARMOR("elven mithril-coat", (char *)0,
1, 0, 0, 0, 15, 1, 150, 240, 5, 2, ARM_SUIT, MITHRIL, HI_METAL), 1, 0, 0, 0, 15, 1, 150, 240, 5, 2, ARM_SUIT, MITHRIL, HI_SILVER),
ARMOR("chain mail", (char *)0, ARMOR("chain mail", (char *)0,
1, 0, 0, 0, 72, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL), 1, 0, 0, 0, 72, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL),
ARMOR("orcish chain mail", "crude chain mail", ARMOR("orcish chain mail", "crude chain mail",
@@ -670,11 +669,18 @@ FOOD("egg", 85, 1, 1, 1, FLESH, 80, CLR_WHITE),
FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN), FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN), FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
FOOD("huge chunk of meat", 0,20,400, 0, FLESH,2000, CLR_BROWN), FOOD("huge chunk of meat", 0,20,400, 0, FLESH,2000, CLR_BROWN),
/* special case because it's not mergable */ /* special case because it's not mergable */
OBJECT(OBJ("meat ring", (char *)0), OBJECT(OBJ("meat ring", (char *)0),
BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH), BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH),
0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN), 0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN),
/* pudding 'corpses' will turn into these and combine */
FOOD("glob of gray ooze", 0, 2, 20, 0, FLESH, 20, CLR_GRAY),
FOOD("glob of brown pudding", 0, 2, 20, 0, FLESH, 20, CLR_BROWN),
FOOD("glob of green slime", 0, 2, 20, 0, FLESH, 20, CLR_GREEN),
FOOD("glob of black pudding", 0, 2, 20, 0, FLESH, 20, CLR_BLACK),
/* fruits & veggies */ /* fruits & veggies */
FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN), FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN),
FOOD("eucalyptus leaf", 3, 1, 1, 0, VEGGY, 30, CLR_GREEN), FOOD("eucalyptus leaf", 3, 1, 1, 0, VEGGY, 30, CLR_GREEN),
+2498 -2471
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -708,7 +708,7 @@ menu_item **pick_list; /* return list of items picked */
int how; /* type of query */ int how; /* type of query */
boolean FDECL((*allow), (OBJ_P));/* allow function */ boolean FDECL((*allow), (OBJ_P));/* allow function */
{ {
int i, j, n; int i, n;
winid win; winid win;
struct obj *curr, *last, fake_hero_object; struct obj *curr, *last, fake_hero_object;
struct obj **oarray; struct obj **oarray;
@@ -823,7 +823,7 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
if (n > 0) { if (n > 0) {
menu_item *mi; menu_item *mi;
int i, k; int k;
/* fix up counts: -1 means no count used => pick all; /* fix up counts: -1 means no count used => pick all;
if fake_hero_object was picked, discard that choice */ if fake_hero_object was picked, discard that choice */
+8 -1
View File
@@ -502,6 +502,13 @@ register struct obj *otmp;
else otmp->spe = fruitadd(oldf->fname, (struct fruit *)0); else otmp->spe = fruitadd(oldf->fname, (struct fruit *)0);
} }
#ifdef SYSCF
#define SYSOPT_CHECK_SAVE_UID sysopt.check_save_uid
#else
#define SYSOPT_CHECK_SAVE_UID TRUE
#endif
STATIC_OVL STATIC_OVL
boolean boolean
restgamestate(fd, stuckid, steedid) restgamestate(fd, stuckid, steedid)
@@ -517,7 +524,7 @@ unsigned int *stuckid, *steedid;
unsigned long uid; unsigned long uid;
mread(fd, (genericptr_t) &uid, sizeof uid); mread(fd, (genericptr_t) &uid, sizeof uid);
if (uid != (unsigned long)getuid()) { /* strange ... */ if (SYSOPT_CHECK_SAVE_UID && uid != (unsigned long)getuid()) { /* strange ... */
/* for wizard mode, issue a reminder; for others, treat it /* for wizard mode, issue a reminder; for others, treat it
as an attempt to cheat and refuse to restore this file */ as an attempt to cheat and refuse to restore this file */
pline("Saved game was not yours."); pline("Saved game was not yours.");
+11 -2
View File
@@ -15,6 +15,11 @@
#include "sp_lev.h" #include "sp_lev.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4244)
#endif
typedef void (*select_iter_func)(int, int, genericptr_t); typedef void (*select_iter_func)(int, int, genericptr_t);
extern void FDECL(mkmap, (lev_init *)); extern void FDECL(mkmap, (lev_init *));
@@ -5032,7 +5037,7 @@ sp_lev *lvl;
break; break;
case SPO_SEL_LINE: case SPO_SEL_LINE:
{ {
struct opvar *tmp, *tmp2, *pt = selection_opvar(NULL); struct opvar *tmp = NULL, *tmp2 = NULL, *pt = selection_opvar(NULL);
schar x1,y1,x2,y2; schar x1,y1,x2,y2;
if (!OV_pop_c(tmp)) panic("no ter sel linecoord1"); if (!OV_pop_c(tmp)) panic("no ter sel linecoord1");
if (!OV_pop_c(tmp2)) panic("no ter sel linecoord2"); if (!OV_pop_c(tmp2)) panic("no ter sel linecoord2");
@@ -5050,7 +5055,7 @@ sp_lev *lvl;
break; break;
case SPO_SEL_RNDLINE: case SPO_SEL_RNDLINE:
{ {
struct opvar *tmp, *tmp2, *tmp3, *pt = selection_opvar(NULL); struct opvar *tmp = NULL, *tmp2 = NULL, *tmp3, *pt = selection_opvar(NULL);
schar x1,y1,x2,y2; schar x1,y1,x2,y2;
if (!OV_pop_i(tmp3)) panic("no ter sel randline1"); if (!OV_pop_i(tmp3)) panic("no ter sel randline1");
if (!OV_pop_c(tmp)) panic("no ter sel randline2"); if (!OV_pop_c(tmp)) panic("no ter sel randline2");
@@ -5222,4 +5227,8 @@ const char *name;
} }
#ifdef _MSC_VER
#pragma warning(pop)
#endif
/*sp_lev.c*/ /*sp_lev.c*/
+1
View File
@@ -67,6 +67,7 @@ sys_early_init()
# endif # endif
#endif #endif
sysopt.check_save_uid = 1;
sysopt.seduce = 1; /* if it's compiled in, default to on */ sysopt.seduce = 1; /* if it's compiled in, default to on */
sysopt_seduce_set(sysopt.seduce); sysopt_seduce_set(sysopt.seduce);
} }
+3 -3
View File
@@ -2215,7 +2215,7 @@ glovecheck: target = which_armor(mtmp, W_ARMG);
(void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE);
(void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE); (void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE);
} }
if (burn_floor_paper(mtmp->mx, mtmp->my, see_it, FALSE) && if (burn_floor_objects(mtmp->mx, mtmp->my, see_it, FALSE) &&
!see_it && distu(mtmp->mx, mtmp->my) <= 3*3) !see_it && distu(mtmp->mx, mtmp->my) <= 3*3)
You("smell smoke."); You("smell smoke.");
if (is_ice(mtmp->mx,mtmp->my)) if (is_ice(mtmp->mx,mtmp->my))
@@ -2853,7 +2853,7 @@ struct obj *box; /* null for floor trap */
boolean see_it = !Blind; boolean see_it = !Blind;
int num, alt; int num, alt;
/* Bug: for box case, the equivalent of burn_floor_paper() ought /* Bug: for box case, the equivalent of burn_floor_objects() ought
* to be done upon its contents. * to be done upon its contents.
*/ */
@@ -2898,7 +2898,7 @@ struct obj *box; /* null for floor trap */
destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE);
} }
if (!box && burn_floor_paper(u.ux, u.uy, see_it, TRUE) && !see_it) if (!box && burn_floor_objects(u.ux, u.uy, see_it, TRUE) && !see_it)
You("smell paper burning."); You("smell paper burning.");
if (is_ice(u.ux, u.uy)) if (is_ice(u.ux, u.uy))
melt_ice(u.ux, u.uy, (char *)0); melt_ice(u.ux, u.uy, (char *)0);
+20 -32
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 vision.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ /* NetHack 3.5 vision.c $NHDT-Date: 1426449474 2015/03/15 19:57:54 $ $NHDT-Branch: derek-farming $:$NHDT-Revision: 1.14 $ */
/* NetHack 3.5 vision.c $Date: 2009/05/06 10:48:10 $ $Revision: 1.12 $ */ /* NetHack 3.5 vision.c $Date: 2009/05/06 10:48:10 $ $Revision: 1.12 $ */
/* SCCS Id: @(#)vision.c 3.5 2007/11/05 */ /* SCCS Id: @(#)vision.c 3.5 2007/11/05 */
/* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */ /* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */
@@ -499,7 +499,7 @@ vision_recalc(control)
char *next_rmin; /* min pointer for the new array */ char *next_rmin; /* min pointer for the new array */
char *next_rmax; /* max pointer for the new array */ char *next_rmax; /* max pointer for the new array */
char *ranges; /* circle ranges -- used for xray & night vision */ char *ranges; /* circle ranges -- used for xray & night vision */
int row; /* row counter (outer loop) */ int row = 0; /* row counter (outer loop) */
int start, stop; /* inner loop starting/stopping index */ int start, stop; /* inner loop starting/stopping index */
int dx, dy; /* one step from a lit door or lit wall (see below) */ int dx, dy; /* one step from a lit door or lit wall (see below) */
register int col; /* inner loop counter */ register int col; /* inner loop counter */
@@ -513,10 +513,6 @@ vision_recalc(control)
vision_full_recalc = 0; /* reset flag */ vision_full_recalc = 0; /* reset flag */
if (in_mklev || !iflags.vision_inited) return; if (in_mklev || !iflags.vision_inited) return;
#ifdef GCC_WARN
row = 0;
#endif
/* /*
* Either the light sources have been taken care of, or we must * Either the light sources have been taken care of, or we must
* recalculate them here. * recalculate them here.
@@ -1655,18 +1651,15 @@ right_side(row, cb_row, cb_col, fb_row, fb_col, left, right_mark, limits)
char *limits; /* points at range limit for current row, or NULL */ char *limits; /* points at range limit for current row, or NULL */
{ {
register int i; register int i;
register char *rowp; register char *rowp = NULL;
int hit_stone = 0; int hit_stone = 0;
int left_shadow, right_shadow, loc_right; int left_shadow, right_shadow, loc_right;
int lblock_col; /* local block column (current row) */ int lblock_col; /* local block column (current row) */
int nrow, deeper; int nrow, deeper;
char *row_min; /* left most */ char *row_min = NULL; /* left most */
char *row_max; /* right most */ char *row_max = NULL; /* right most */
int lim_max; /* right most limit of circle */ int lim_max; /* right most limit of circle */
#ifdef GCC_WARN
rowp = 0;
#endif
nrow = row + step; nrow = row + step;
deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1))); deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1)));
if(!vis_func) { if(!vis_func) {
@@ -1910,18 +1903,15 @@ left_side(row, cb_row, cb_col, fb_row, fb_col, left_mark, right, limits)
char *limits; char *limits;
{ {
register int i; register int i;
register char *rowp; register char *rowp = NULL;
int hit_stone = 0; int hit_stone = 0;
int left_shadow, right_shadow, loc_left; int left_shadow, right_shadow, loc_left;
int lblock_col; /* local block column (current row) */ int lblock_col; /* local block column (current row) */
int nrow, deeper; int nrow, deeper;
char *row_min; /* left most */ char *row_min = NULL; /* left most */
char *row_max; /* right most */ char *row_max = NULL; /* right most */
int lim_min; int lim_min;
#ifdef GCC_WARN
rowp = 0;
#endif
nrow = row + step; nrow = row + step;
deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1))); deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1)));
if(!vis_func) { if(!vis_func) {
@@ -2192,20 +2182,17 @@ right_side(row, left, right_mark, limits)
int right_mark; /* last (right side) visible spot on prev row */ int right_mark; /* last (right side) visible spot on prev row */
char *limits; /* points at range limit for current row, or NULL */ char *limits; /* points at range limit for current row, or NULL */
{ {
int right; /* right limit of "could see" */ int right; /* right limit of "could see" */
int right_edge; /* right edge of an opening */ int right_edge; /* right edge of an opening */
int nrow; /* new row (calculate once) */ int nrow; /* new row (calculate once) */
int deeper; /* if TRUE, call self as needed */ int deeper; /* if TRUE, call self as needed */
int result; /* set by q?_path() */ int result; /* set by q?_path() */
register int i; /* loop counter */ register int i; /* loop counter */
register char *rowp = NULL; /* row optimization */ register char *rowp = NULL; /* row optimization */
char *row_min = NULL; /* left most [used by macro set_min()] */ char *row_min = NULL; /* left most [used by macro set_min()] */
char *row_max = NULL; /* right most [used by macro set_max()] */ char *row_max = NULL; /* right most [used by macro set_max()] */
int lim_max; /* right most limit of circle */ int lim_max; /* right most limit of circle */
#ifdef GCC_WARN
rowp = row_min = row_max = 0;
#endif
nrow = row + step; nrow = row + step;
/* /*
* Can go deeper if the row is in bounds and the next row is within * Can go deeper if the row is in bounds and the next row is within
@@ -2372,11 +2359,12 @@ left_side(row, left_mark, right, limits)
int row, left_mark, right; int row, left_mark, right;
char *limits; char *limits;
{ {
int left, left_edge, nrow, deeper, result; int left, left_edge, nrow, deeper, result;
register int i; register int i;
register char *rowp = NULL; register char *rowp = NULL;
char *row_min = NULL, *row_max = NULL; char *row_min = NULL;
int lim_min; char *row_max = NULL;
int lim_min;
#ifdef GCC_WARN #ifdef GCC_WARN
rowp = row_min = row_max = 0; rowp = row_min = row_max = 0;
+175 -156
View File
@@ -2112,18 +2112,19 @@ boolean ordinary;
case FIRE_HORN: case FIRE_HORN:
learn_it = TRUE; learn_it = TRUE;
if (Fire_resistance) { if (Fire_resistance) {
shieldeff(u.ux, u.uy); shieldeff(u.ux, u.uy);
You_feel("rather warm."); You_feel("rather warm.");
ugolemeffects(AD_FIRE, d(12,6)); ugolemeffects(AD_FIRE, d(12,6));
} else { } else {
pline("You've set yourself afire!"); pline("You've set yourself afire!");
damage = d(12,6); damage = d(12,6);
} }
burn_away_slime(); burn_away_slime();
(void) burnarmor(&youmonst); (void) burnarmor(&youmonst);
destroy_item(SCROLL_CLASS, AD_FIRE); destroy_item(SCROLL_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE); destroy_item(POTION_CLASS, AD_FIRE);
destroy_item(SPBOOK_CLASS, AD_FIRE); destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(FOOD_CLASS, AD_FIRE); /* only slime for now */
break; break;
case WAN_COLD: case WAN_COLD:
@@ -3329,6 +3330,7 @@ struct obj **ootmp; /* to return worn armor for caller to disintegrate */
if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE);
if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE); if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE);
if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE); if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE);
destroy_mitem(mon, FOOD_CLASS, AD_FIRE); /* carried slime */
} }
break; break;
case ZT_COLD: case ZT_COLD:
@@ -3473,6 +3475,7 @@ xchar sx, sy;
if (!rn2(3)) destroy_item(POTION_CLASS, AD_FIRE); if (!rn2(3)) destroy_item(POTION_CLASS, AD_FIRE);
if (!rn2(3)) destroy_item(SCROLL_CLASS, AD_FIRE); if (!rn2(3)) destroy_item(SCROLL_CLASS, AD_FIRE);
if (!rn2(5)) destroy_item(SPBOOK_CLASS, AD_FIRE); if (!rn2(5)) destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(FOOD_CLASS, AD_FIRE);
} }
break; break;
case ZT_COLD: case ZT_COLD:
@@ -3569,11 +3572,11 @@ xchar sx, sy;
} }
/* /*
* burn scrolls and spellbooks on floor at position x,y * burn objects (such as scrolls and spellbooks) on floor
* return the number of scrolls and spellbooks burned * at position x,y; return the number of objects burned
*/ */
int int
burn_floor_paper(x, y, give_feedback, u_caused) burn_floor_objects(x, y, give_feedback, u_caused)
int x, y; int x, y;
boolean give_feedback; /* caller needs to decide about visibility checks */ boolean give_feedback; /* caller needs to decide about visibility checks */
boolean u_caused; boolean u_caused;
@@ -3585,37 +3588,39 @@ boolean u_caused;
for (obj = level.objects[x][y]; obj; obj = obj2) { for (obj = level.objects[x][y]; obj; obj = obj2) {
obj2 = obj->nexthere; obj2 = obj->nexthere;
if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS) { if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL || || (obj->oclass == FOOD_CLASS
obj_resists(obj, 2, 100)) && obj->otyp == GLOB_OF_GREEN_SLIME)) {
continue; if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL ||
scrquan = obj->quan; /* number present */ obj_resists(obj, 2, 100))
delquan = 0L; /* number to destroy */ continue;
for (i = scrquan; i > 0L; i--) scrquan = obj->quan; /* number present */
if (!rn2(3)) delquan++; delquan = 0L; /* number to destroy */
if (delquan) { for (i = scrquan; i > 0L; i--)
/* save name before potential delobj() */ if (!rn2(3)) delquan++;
if (give_feedback) { if (delquan) {
obj->quan = 1L; /* save name before potential delobj() */
Strcpy(buf1, (x == u.ux && y == u.uy) ? if (give_feedback) {
xname(obj) : distant_name(obj, xname)); obj->quan = 1L;
obj->quan = 2L; Strcpy(buf1, (x == u.ux && y == u.uy) ?
Strcpy(buf2, (x == u.ux && y == u.uy) ? xname(obj) : distant_name(obj, xname));
xname(obj) : distant_name(obj, xname)); obj->quan = 2L;
obj->quan = scrquan; Strcpy(buf2, (x == u.ux && y == u.uy) ?
} xname(obj) : distant_name(obj, xname));
/* useupf(), which charges, only if hero caused damage */ obj->quan = scrquan;
if (u_caused) useupf(obj, delquan); }
else if (delquan < scrquan) obj->quan -= delquan; /* useupf(), which charges, only if hero caused damage */
else delobj(obj); if (u_caused) useupf(obj, delquan);
cnt += delquan; else if (delquan < scrquan) obj->quan -= delquan;
if (give_feedback) { else delobj(obj);
if (delquan > 1L) cnt += delquan;
pline("%ld %s burn.", delquan, buf2); if (give_feedback) {
else if (delquan > 1L)
pline("%s burns.", An(buf1)); pline("%ld %s burn.", delquan, buf2);
} else
} pline("%s burns.", An(buf1));
}
}
} }
} }
return cnt; return cnt;
@@ -4255,7 +4260,7 @@ short exploding_wand_typ;
} }
if(OBJ_AT(x, y) && abstype == ZT_FIRE) if(OBJ_AT(x, y) && abstype == ZT_FIRE)
if (burn_floor_paper(x, y, FALSE, type > 0) && couldsee(x, y)) { if (burn_floor_objects(x, y, FALSE, type > 0) && couldsee(x, y)) {
newsym(x,y); newsym(x,y);
You("%s of smoke.", You("%s of smoke.",
!Blind ? "see a puff" : "smell a whiff"); !Blind ? "see a puff" : "smell a whiff");
@@ -4365,129 +4370,137 @@ const char * const destroy_strings[][3] = { /* also used in trap.c */
void void
destroy_item(osym, dmgtyp) destroy_item(osym, dmgtyp)
register int osym, dmgtyp; register int osym, dmgtyp;
{ {
register struct obj *obj, *obj2; register struct obj *obj, *obj2;
register int dmg, xresist, skip; register int dmg, xresist, skip;
register long i, cnt, quan; register long i, cnt, quan;
register int dindx; register int dindx;
const char *mult; const char *mult;
boolean physical_damage; boolean physical_damage;
for(obj = invent; obj; obj = obj2) { for(obj = invent; obj; obj = obj2) {
obj2 = obj->nobj; obj2 = obj->nobj;
physical_damage = FALSE; physical_damage = FALSE;
if(obj->oclass != osym) continue; /* test only objs of type osym */ if(obj->oclass != osym) continue; /* test only objs of type osym */
if(obj->oartifact) continue; /* don't destroy artifacts */ if(obj->oartifact) continue; /* don't destroy artifacts */
if(obj->in_use && obj->quan == 1L) continue; /* not available */ if(obj->in_use && obj->quan == 1L) continue; /* not available */
xresist = skip = 0; xresist = skip = 0;
/* lint suppression */ /* lint suppression */
dmg = dindx = 0; dmg = dindx = 0;
quan = 0L; quan = 0L;
switch(dmgtyp) { switch(dmgtyp) {
case AD_COLD: case AD_COLD:
if(osym == POTION_CLASS && obj->otyp != POT_OIL) { if(osym == POTION_CLASS && obj->otyp != POT_OIL) {
quan = obj->quan; quan = obj->quan;
dindx = 0; dindx = 0;
dmg = rnd(4); dmg = rnd(4);
} else skip++; } else skip++;
break; break;
case AD_FIRE: case AD_FIRE:
xresist = (Fire_resistance && obj->oclass != POTION_CLASS); xresist = (Fire_resistance
&& obj->oclass != POTION_CLASS
&& obj->otyp != GLOB_OF_GREEN_SLIME);
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL) if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
skip++; skip++;
if (obj->otyp == SPE_BOOK_OF_THE_DEAD) { if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
skip++; skip++;
if (!Blind) if (!Blind)
pline("%s glows a strange %s, but remains intact.", pline("%s glows a strange %s, but remains intact.",
The(xname(obj)), hcolor("dark red")); The(xname(obj)), hcolor("dark red"));
} }
quan = obj->quan; quan = obj->quan;
switch(osym) { switch(osym) {
case POTION_CLASS: case POTION_CLASS:
dindx = (obj->otyp != POT_OIL) ? 1 : 2; dindx = (obj->otyp != POT_OIL) ? 1 : 2;
dmg = rnd(6); dmg = rnd(6);
break; break;
case SCROLL_CLASS: case SCROLL_CLASS:
dindx = 3; dindx = 3;
dmg = 1; dmg = 1;
break; break;
case SPBOOK_CLASS: case SPBOOK_CLASS:
dindx = 4; dindx = 4;
dmg = 1; dmg = 1;
break; break;
default: case FOOD_CLASS:
skip++; if (obj->otyp == GLOB_OF_GREEN_SLIME) {
break; dindx = obj->owt / 20;
} dmg = 1;
break; } else { skip++; }
case AD_ELEC: break;
xresist = (Shock_resistance && obj->oclass != RING_CLASS); default:
quan = obj->quan; skip++;
switch(osym) { break;
case RING_CLASS: }
if(obj->otyp == RIN_SHOCK_RESISTANCE) break;
{ skip++; break; } case AD_ELEC:
dindx = 5; xresist = (Shock_resistance && obj->oclass != RING_CLASS);
dmg = 0; quan = obj->quan;
break; switch(osym) {
case WAND_CLASS: case RING_CLASS:
if(obj->otyp == WAN_LIGHTNING) { skip++; break; } if(obj->otyp == RIN_SHOCK_RESISTANCE)
{ skip++; break; }
dindx = 5;
dmg = 0;
break;
case WAND_CLASS:
if(obj->otyp == WAN_LIGHTNING) { skip++; break; }
#if 0 #if 0
if (obj == current_wand) { skip++; break; } if (obj == current_wand) { skip++; break; }
#endif #endif
dindx = 6; dindx = 6;
dmg = rnd(10); dmg = rnd(10);
break; break;
default: default:
skip++; skip++;
break; break;
} }
break; break;
default: default:
skip++; skip++;
break; break;
} }
if(!skip) { if(!skip) {
if (obj->in_use) --quan; /* one will be used up elsewhere */ if (obj->in_use) --quan; /* one will be used up elsewhere */
for(i = cnt = 0L; i < quan; i++) for(i = cnt = 0L; i < quan; i++)
if(!rn2(3)) cnt++; if(!rn2(3)) cnt++;
if(!cnt) continue; if(!cnt) continue;
mult = (cnt == quan) ? "Your" : mult = (cnt == quan) ? (quan > 1) ? "All of your " : "Your" :
(cnt == 1L) ? "One of your" : "Some of your"; (cnt == 1L) ? "One of your" : "Some of your";
pline("%s %s %s!", mult, xname(obj), pline("%s %s %s!", mult, xname(obj),
destroy_strings[dindx][(cnt > 1L)]); destroy_strings[dindx][(cnt > 1L)]);
if(osym == POTION_CLASS && dmgtyp != AD_COLD) { if(osym == POTION_CLASS && dmgtyp != AD_COLD) {
if (!breathless(youmonst.data) || haseyes(youmonst.data)) if (!breathless(youmonst.data) || haseyes(youmonst.data))
potionbreathe(obj); potionbreathe(obj);
} }
if (obj->owornmask) { if (obj->owornmask) {
if (obj->owornmask & W_RING) /* ring being worn */ if (obj->owornmask & W_RING) /* ring being worn */
Ring_gone(obj); Ring_gone(obj);
else else
setnotworn(obj); setnotworn(obj);
} }
if (obj == current_wand) current_wand = 0; /* destroyed */ if (obj == current_wand) current_wand = 0; /* destroyed */
for (i = 0; i < cnt; i++) for (i = 0; i < cnt; i++)
useup(obj); useup(obj);
if(dmg) { if(dmg) {
if(xresist) You("aren't hurt!"); if(xresist) You("aren't hurt!");
else { else {
const char *how = destroy_strings[dindx][2]; const char *how = destroy_strings[dindx][2];
boolean one = (cnt == 1L); boolean one = (cnt == 1L);
if (physical_damage) dmg = Maybe_Half_Phys(dmg); if (physical_damage) dmg = Maybe_Half_Phys(dmg);
losehp(dmg, one ? how : (const char *)makeplural(how), losehp(dmg, one ? how : (const char *)makeplural(how),
one ? KILLED_BY_AN : KILLED_BY); one ? KILLED_BY_AN : KILLED_BY);
exercise(A_STR, FALSE); exercise(A_STR, FALSE);
} }
} }
} }
} }
return; return;
} }
int int
@@ -4546,6 +4559,12 @@ int osym, dmgtyp;
dindx = 4; dindx = 4;
tmp++; tmp++;
break; break;
case FOOD_CLASS:
if (obj->otyp == GLOB_OF_GREEN_SLIME) {
dindx = obj->owt / 20;
tmp++;
} else { skip++; }
break;
default: default:
skip++; skip++;
break; break;
+806 -816
View File
File diff suppressed because it is too large Load Diff
+1228 -1126
View File
File diff suppressed because it is too large Load Diff
+441 -414
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -35,6 +35,9 @@ MAXPLAYERS=10
# Uncomment the next line to disable the SEDUCE option. # Uncomment the next line to disable the SEDUCE option.
#SEDUCE=0 #SEDUCE=0
# Uncomment to disable savefile UID checking.
#CHECK_SAVE_UID=0
# Record (high score) file options. # Record (high score) file options.
# CAUTION: changing these after people have started playing games can # CAUTION: changing these after people have started playing games can
# lead to lost high scores! # lead to lost high scores!
+19 -12
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 winmenu.c $NHDT-Date: 1427881480 2015/04/01 09:44:40 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ */ /* NetHack 3.5 winmenu.c $NHDT-Date: 1428828477 2015/04/12 08:47:57 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* NetHack 3.5 winmenu.c $Date: 2009/05/06 10:55:53 $ $Revision: 1.5 $ */ /* NetHack 3.5 winmenu.c $Date: 2009/05/06 10:55:53 $ $Revision: 1.5 $ */
/* SCCS Id: @(#)winmenu.c 3.5 1996/08/15 */ /* SCCS Id: @(#)winmenu.c 3.5 1996/08/15 */
/* Copyright (c) Dean Luick, 1992 */ /* Copyright (c) Dean Luick, 1992 */
@@ -249,9 +249,13 @@ menu_key(w, event, params, num_params)
return; return;
} else if (ch == MENU_SEARCH) { /* search */ } else if (ch == MENU_SEARCH) { /* search */
if (menu_info->how == PICK_ANY || menu_info->how == PICK_ONE) { if (menu_info->how == PICK_ANY || menu_info->how == PICK_ONE) {
char buf[BUFSZ]; char buf[BUFSZ+2], tmpbuf[BUFSZ];
X11_getlin("Search for:", buf);
if (!*buf || *buf == '\033') return; X11_getlin("Search for:", tmpbuf);
if (!*tmpbuf || *tmpbuf == '\033') return;
/* convert "string" into "*string*" for use with pmatch() */
Sprintf(buf, "*%s*", tmpbuf);
if (menu_info->how == PICK_ANY) { if (menu_info->how == PICK_ANY) {
invert_match(wp, buf); invert_match(wp, buf);
return; return;
@@ -395,10 +399,12 @@ menu_search(w, client_data, call_data)
{ {
struct xwindow *wp = (struct xwindow *) client_data; struct xwindow *wp = (struct xwindow *) client_data;
struct menu_info_t *menu_info = wp->menu_information; struct menu_info_t *menu_info = wp->menu_information;
char buf[BUFSZ+2], tmpbuf[BUFSZ];
char buf[BUFSZ]; X11_getlin("Search for:", tmpbuf);
X11_getlin("Search for:", buf); if (!*tmpbuf || *tmpbuf == '\033') return;
if (!*buf || *buf == '\033') return; /* convert "string" into "*string*" for use with pmatch() */
Sprintf(buf, "*%s*", tmpbuf);
if (menu_info->how == PICK_ANY) if (menu_info->how == PICK_ANY)
invert_match(wp, buf); invert_match(wp, buf);
@@ -479,7 +485,7 @@ invert_all(wp)
static void static void
invert_match(wp, match) invert_match(wp, match)
struct xwindow *wp; struct xwindow *wp;
char *match; char *match; /* wildcard pattern for pmatch() */
{ {
x11_menu_item *curr; x11_menu_item *curr;
int count; int count;
@@ -488,7 +494,7 @@ invert_match(wp, match)
reset_menu_count(wp->menu_information); reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr; for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++) curr = curr->next, count++)
if (curr->identifier.a_void != 0 && strstri(curr->str, match)) { if (curr->identifier.a_void != 0 && pmatchi(match, curr->str)) {
invert_line(wp, curr, count, -1L); invert_line(wp, curr, count, -1L);
changed = TRUE; changed = TRUE;
} }
@@ -503,7 +509,7 @@ invert_match(wp, match)
static void static void
select_match(wp, match) select_match(wp, match)
struct xwindow *wp; struct xwindow *wp;
char *match; char *match; /* wildcard pattern for pmatch() */
{ {
x11_menu_item *curr; x11_menu_item *curr;
int count; int count;
@@ -511,11 +517,12 @@ select_match(wp, match)
reset_menu_count(wp->menu_information); reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr; for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++) curr = curr->next, count++)
if (curr->identifier.a_void != 0 && strstri(curr->str, match)) { if (curr->identifier.a_void != 0 && pmatchi(match, curr->str)) {
if (!curr->selected) { if (!curr->selected) {
invert_line(wp, curr, count, -1L); invert_line(wp, curr, count, -1L);
#ifndef USE_FWF #ifndef USE_FWF
XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer, XawListChange(wp->w,
wp->menu_information->curr_menu.list_pointer,
0, 0, True); 0, 0, True);
#endif #endif
} }
+262 -187
View File
File diff suppressed because it is too large Load Diff
+87
View File
@@ -0,0 +1,87 @@
#!/bin/perl
#
# $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$
# $Date: 2002/01/05 21:06:02 $ $Revision: 1.1 $
#
sub bail($);
use Getopt::Std;
# TODO: switch to Getopt::Long so we can parse normal arguments too
$Getopt::Std::STANDARD_HELP_VERSION = TRUE;
$main::VERSION = 1.0;
my %commands = (
'd' => 'debug mode; parse objects.txt to stdout instead of updating',
);
getopts(join('', keys(%commands)));
my $debug = (defined($opt_d) && $opt_d == 1);
my $tilecount = 0;
my $outfile = $debug ? "-" : "objects.txt";
my $infile = $debug ? "objects.txt" : "objects.bak";
unless ($debug) {
if (-e "$infile") { die "something didn't clean up objects.bak from last time; stopping\n"; }
rename($outfile,$infile) or die "couldn't move objects.txt to objects.bak; stopping\n";
}
open(INFILE, "<$infile") or bail("couldn't open $infile; bailing");
open(OUTFILE, ">$outfile") or bail("couldn't open $outfile; bailing");
while (my $line = <INFILE>)
{
if (my ($tiletext) = $line =~ /^# tile \d+ (.*)/)
{
$line = "# tile $tilecount $tiletext\n";
$tilecount++;
}
print OUTFILE $line;
}
close(INFILE);
close(OUTFILE);
unless ($debug) { unlink $infile; }
exit;
sub main::HELP_MESSAGE()
{
print <<"STARTHELP";
Usage: renumtiles.pl [OPTIONS] <textfile>
STARTHELP
foreach $cmd (keys(%commands)) {
printf("%10s %s\n", '-'.$cmd, $commands{$cmd});
}
print <<"ENDHELP";
\t--help display this help message and exit
\t--version display version and exit
ENDHELP
exit;
}
sub main::VERSION_MESSAGE()
{
my ($objglob, $optpackage, $ver, $switches) = @_;
print <<"STARTHELP";
renumtiles $ver -- tile-renumbering utility for NetHack
STARTHELP
}
sub bail($)
{
unless ($debug) {
unlink $outfile;
rename ($infile,$outfile);
}
shift;
die "$_\n";
}
+8 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 wintty.c $NHDT-Date: 1428394244 2015/04/07 08:10:44 $ $NHDT-Branch: master $:$NHDT-Revision: 1.84 $ */ /* NetHack 3.5 wintty.c $NHDT-Date: 1428828474 2015/04/12 08:47:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.85 $ */
/* NetHack 3.5 wintty.c $Date: 2012/01/22 06:27:09 $ $Revision: 1.66 $ */ /* NetHack 3.5 wintty.c $Date: 2012/01/22 06:27:09 $ $Revision: 1.66 $ */
/* Copyright (c) David Cohrs, 1991 */ /* Copyright (c) David Cohrs, 1991 */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1664,20 +1664,24 @@ struct WinDesc *cw;
tty_nhbell(); tty_nhbell();
break; break;
} else { } else {
char searchbuf[BUFSZ], tmpbuf[BUFSZ]; char searchbuf[BUFSZ+2], tmpbuf[BUFSZ];
boolean on_curr_page = FALSE; boolean on_curr_page = FALSE;
int lineno = 0; int lineno = 0;
tty_getlin("Search for:", tmpbuf); tty_getlin("Search for:", tmpbuf);
if (!tmpbuf[0] || tmpbuf[0] == '\033') break; if (!tmpbuf[0] || tmpbuf[0] == '\033') break;
Sprintf(searchbuf, "*%s*", tmpbuf); Sprintf(searchbuf, "*%s*", tmpbuf);
for (curr = cw->mlist; curr; curr = curr->next) { for (curr = cw->mlist; curr; curr = curr->next) {
if (on_curr_page) lineno++; if (on_curr_page) lineno++;
if (curr == page_start) if (curr == page_start)
on_curr_page = TRUE; on_curr_page = TRUE;
else if (curr == page_end) else if (curr == page_end)
on_curr_page = FALSE; on_curr_page = FALSE;
if (curr->identifier.a_void && pmatch(searchbuf, curr->str)) { if (curr->identifier.a_void
toggle_menu_curr(window, curr, lineno, on_curr_page, counting, count); && pmatchi(searchbuf, curr->str)) {
toggle_menu_curr(window, curr, lineno,
on_curr_page, counting, count);
if (cw->how == PICK_ONE) { if (cw->how == PICK_ONE) {
finished = TRUE; finished = TRUE;
break; break;