Merge branch 'master' into status_hilite

Conflicts:
	include/extern.h
	src/options.c
This commit is contained in:
nhmall
2015-06-01 09:09:44 -04:00
13 changed files with 347 additions and 256 deletions
+21 -18
View File
@@ -1,11 +1,11 @@
.\" $NHDT-Branch: master $:$NHDT-Revision: 1.164 $ $NHDT-Date: 1432473674 2015/05/24 13:21:14 $ .\" $NHDT-Branch: master $:$NHDT-Revision: 1.170 $ $NHDT-Date: 1433125736 2015/06/01 02:28:56 $
.ds h0 "NetHack Guidebook .ds h0 "NetHack Guidebook
.ds h1 .ds h1
.ds h2 % .ds h2 %
.ds vr "NetHack 3.6 .ds vr "NetHack 3.6
.ds f0 "\*(vr .ds f0 "\*(vr
.ds f1 .ds f1
.ds f2 "May 30, 2015 .ds f2 "May 31, 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
@@ -56,8 +56,15 @@
A Guide to the Mazes of Menace A Guide to the Mazes of Menace
(Guidebook for NetHack) (Guidebook for NetHack)
.au .au
Eric S. Raymond Original version - Eric S. Raymond
(Edited and expanded for 3.6) (Edited and expanded for 3.6 by Michael Allison, Mike Stephenson)
.hn 1
Preface - Version 3.6
\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
humorous and fun features found in the game, author \fBTerry Pratchett\fP,
passed away. We have dedicated this version of the game in his memory.
.pg
.hn 1 .hn 1
Introduction Introduction
@@ -3330,16 +3337,17 @@ joined the NetHack development team.
.pg .pg
In September 2014, an interim snapshot of the code under development was 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 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 and had not gone through the process of debugging it as a suitable release,
version numbers present on that code snapshot would be retired and never it was decided that the version numbers present on that code snapshot would
used in an official NetHack release. An announcement was posted on the be retired and never used in an official NetHack release. An announcement
devteam's official nethack.org website to that effect, stating that there was posted on the devteam's official nethack.org website to that effect,
would never be a 3.4.4, 3.5, or 3.5.0 official release version. stating that there would never be a 3.4.4, 3.5, or 3.5.0 official release
version.
.pg .pg
In January 2015, preparation began for the release of NetHack 3.6. The 3.6 In November 2014, 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 version merges work done by the development team since the previous release
some of the beloved community patches. Many bugs were fixed and some code was with some of the beloved community patches. Many bugs were fixed and a
restructured. large amount of 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
@@ -3352,11 +3360,6 @@ maintained the port of NetHack 3.6.0 for Mac.
\fBAlex Kompel\fP, and \fBDion Nicolaas\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
\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
humorous and fun features found in the game, author \fBTerry Pratchett\fP,
passed away. This version of the game is dedicated to him.
.pg
The official NetHack web site is maintained by \fBKen Lorber\fP at http://www.nethack.org/. The official NetHack web site is maintained by \fBKen Lorber\fP at http://www.nethack.org/.
.pg .pg
SHOUT-OUTS SHOUT-OUTS
+23 -19
View File
@@ -44,12 +44,21 @@
\Large Guidebook for {\it NetHack\/}} \Large Guidebook for {\it NetHack\/}}
%.au %.au
\author{Eric S. Raymond\\ \author{Original version - Eric S. Raymond\\
(Edited and expanded for 3.6)} (Edited and expanded for 3.6 by Michael Allison, Mike Stephenson)}
\date{May 30, 2015} \date{May 31, 2015}
\maketitle \maketitle
%.hn 1
\section{Preface - Version 3.6}
%.pg
This 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
humorous and fun features found in the game, author {\it Terry Pratchett},
passed away. We have dedicated this version of the game in his memory.
%.pg
%.hn 1 %.hn 1
\section{Introduction} \section{Introduction}
@@ -4021,18 +4030,20 @@ joined the NetHack development team.
\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
released publicly by other parties. Since that code was a work-in-progress 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 and had not gone through the process of debugging it as a suitable release,
version numbers present on that code snapshot would be retired and never it was decided that the version numbers present on that code snapshot would
used in an official NetHack release. An announcement was posted on the be retired and never used in an official NetHack release. An announcement
devteam's official nethack.org website to that effect, stating that there was posted on the devteam's official nethack.org website to that effect,
would never be a 3.4.4, 3.5, or 3.5.0 official release version. stating that there 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 November 2014, preparation began for the release of NetHack 3.6. The 3.6
The 3.6 version merges work done by the development team since the previous version merges work done by the development team since the previous release
release with some of the beloved community patches. Many bugs were fixed with some of the beloved community patches. Many bugs were fixed and a
and some code was restructured. large amount of code was restructured.
%.pg %.pg
\medskip \medskip
@@ -4050,13 +4061,6 @@ maintained the port of NetHack 3.6.0 for Mac.
{\it Alex Kompel}, and {\it Dion Nicolaas} 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
\medskip
This 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
humorous and fun features found in the game, author {\it Terry Pratchett},
passed away. This version of the game is dedicated to him.
%.pg %.pg
\medskip \medskip
\nd The official NetHack web site is maintained by {\it Ken Lorber} at \nd The official NetHack web site is maintained by {\it Ken Lorber} at
+2 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 artifact.h $NHDT-Date: 1432512779 2015/05/25 00:12:59 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */ /* NetHack 3.6 artifact.h $NHDT-Date: 1433050871 2015/05/31 05:41:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.11 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -52,6 +52,7 @@ struct artifact {
short role; /* character role associated with */ short role; /* character role associated with */
short race; /* character race associated with */ short race; /* character race associated with */
long cost; /* price when sold to hero (default 100 x base cost) */ long cost; /* price when sold to hero (default 100 x base cost) */
char acolor; /* color to use if artifact 'glows' */
}; };
/* invoked properties with special powers */ /* invoked properties with special powers */
+57 -41
View File
@@ -1,19 +1,19 @@
/* NetHack 3.6 artilist.h $NHDT-Date: 1432946531 2015/05/30 00:42:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.15 $ */ /* NetHack 3.6 artilist.h $NHDT-Date: 1433050874 2015/05/31 05:41:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.16 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
#ifdef MAKEDEFS_C #ifdef MAKEDEFS_C
/* in makedefs.c, all we care about is the list of names */ /* in makedefs.c, all we care about is the list of names */
#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost) nam #define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) nam
static const char *artifact_names[] = { static const char *artifact_names[] = {
#else #else
/* in artifact.c, set up the actual artifact list structure */ /* in artifact.c, set up the actual artifact list structure */
#define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost) \ #define A(nam, typ, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr) \
{ \ { \
typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost \ typ, nam, s1, s2, mt, atk, dfn, cry, inv, al, cl, rac, cost, clr \
} }
/* clang-format off */ /* clang-format off */
@@ -41,29 +41,30 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
/* dummy element #0, so that all interesting indices are non-zero */ /* dummy element #0, so that all interesting indices are non-zero */
A("", STRANGE_OBJECT, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, A("", STRANGE_OBJECT, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE,
NON_PM, NON_PM, 0L), NON_PM, NON_PM, 0L, NO_COLOR),
A("Excalibur", LONG_SWORD, (SPFX_NOGEN | SPFX_RESTR | SPFX_SEEK A("Excalibur", LONG_SWORD, (SPFX_NOGEN | SPFX_RESTR | SPFX_SEEK
| SPFX_DEFN | SPFX_INTEL | SPFX_SEARCH), | SPFX_DEFN | SPFX_INTEL | SPFX_SEARCH),
0, 0, PHYS(5, 10), DRLI(0, 0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 0, 0, PHYS(5, 10), DRLI(0, 0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM,
4000L), 4000L, NO_COLOR),
/* /*
* Stormbringer only has a 2 because it can drain a level, * Stormbringer only has a 2 because it can drain a level,
* providing 8 more. * providing 8 more.
*/ */
A("Stormbringer", RUNESWORD, A("Stormbringer", RUNESWORD,
(SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | SPFX_INTEL | SPFX_DRLI), 0, 0, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN | SPFX_INTEL | SPFX_DRLI), 0, 0,
DRLI(5, 2), DRLI(0, 0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L), DRLI(5, 2), DRLI(0, 0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 8000L,
NO_COLOR),
/* /*
* Mjollnir will return to the hand of the wielder when thrown * Mjollnir will return to the hand of the wielder when thrown
* if the wielder is a Valkyrie wearing Gauntlets of Power. * if the wielder is a Valkyrie wearing Gauntlets of Power.
*/ */
A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */ A("Mjollnir", WAR_HAMMER, /* Mjo:llnir */
(SPFX_RESTR | SPFX_ATTK), 0, 0, ELEC(5, 24), NO_DFNS, NO_CARY, 0, (SPFX_RESTR | SPFX_ATTK), 0, 0, ELEC(5, 24), NO_DFNS, NO_CARY, 0,
A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L), A_NEUTRAL, PM_VALKYRIE, NON_PM, 4000L, NO_COLOR),
A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, PHYS(3, 6), NO_DFNS, NO_CARY, A("Cleaver", BATTLE_AXE, SPFX_RESTR, 0, 0, PHYS(3, 6), NO_DFNS, NO_CARY,
0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L), 0, A_NEUTRAL, PM_BARBARIAN, NON_PM, 1500L, NO_COLOR),
/* /*
* Grimtooth glows in warning when elves are present, but its * Grimtooth glows in warning when elves are present, but its
@@ -72,7 +73,7 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
*/ */
A("Grimtooth", ORCISH_DAGGER, (SPFX_RESTR | SPFX_WARN | SPFX_DFLAG2), A("Grimtooth", ORCISH_DAGGER, (SPFX_RESTR | SPFX_WARN | SPFX_DFLAG2),
0, M2_ELF, PHYS(2, 6), NO_DFNS, 0, M2_ELF, PHYS(2, 6), NO_DFNS,
NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L), NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ORC, 300L, CLR_RED),
/* /*
* Orcrist and Sting have same alignment as elves. * Orcrist and Sting have same alignment as elves.
* *
@@ -81,51 +82,62 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
* Sting and Orcrist will warn of M2_ORC monsters. * Sting and Orcrist will warn of M2_ORC monsters.
*/ */
A("Orcrist", ELVEN_BROADSWORD, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, A("Orcrist", ELVEN_BROADSWORD, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 2000L,
CLR_BRIGHT_BLUE), /* bright blue is actually light blue */
A("Sting", ELVEN_DAGGER, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, PHYS(5, 0), A("Sting", ELVEN_DAGGER, (SPFX_WARN | SPFX_DFLAG2), 0, M2_ORC, PHYS(5, 0),
NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L), NO_DFNS, NO_CARY, 0, A_CHAOTIC, NON_PM, PM_ELF, 800L, CLR_BRIGHT_BLUE),
/* /*
* Magicbane is a bit different! Its magic fanfare * Magicbane is a bit different! Its magic fanfare
* unbalances victims in addition to doing some damage. * unbalances victims in addition to doing some damage.
*/ */
A("Magicbane", ATHAME, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, A("Magicbane", ATHAME, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
STUN(3, 4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM, STUN(3, 4), DFNS(AD_MAGM), NO_CARY, 0, A_NEUTRAL, PM_WIZARD, NON_PM,
3500L), 3500L, NO_COLOR),
A("Frost Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, A("Frost Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
COLD(5, 0), COLD(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L), COLD(5, 0), COLD(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L,
NO_COLOR),
A("Fire Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0, A("Fire Brand", LONG_SWORD, (SPFX_RESTR | SPFX_ATTK | SPFX_DEFN), 0, 0,
FIRE(5, 0), FIRE(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L), FIRE(5, 0), FIRE(0, 0), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 3000L,
NO_COLOR),
A("Dragonbane", BROADSWORD, (SPFX_RESTR | SPFX_DCLAS), 0, S_DRAGON, A("Dragonbane", BROADSWORD, (SPFX_RESTR | SPFX_DCLAS), 0, S_DRAGON,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 500L,
NO_COLOR),
A("Demonbane", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_DEMON, A("Demonbane", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_DEMON,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 2500L,
NO_COLOR),
A("Werebane", SILVER_SABER, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_WERE, A("Werebane", SILVER_SABER, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_WERE,
PHYS(5, 0), DFNS(AD_WERE), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L), PHYS(5, 0), DFNS(AD_WERE), NO_CARY, 0, A_NONE, NON_PM, NON_PM, 1500L,
NO_COLOR),
A("Grayswandir", SILVER_SABER, (SPFX_RESTR | SPFX_HALRES), 0, 0, A("Grayswandir", SILVER_SABER, (SPFX_RESTR | SPFX_HALRES), 0, 0,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 8000L,
NO_COLOR),
A("Giantslayer", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_GIANT, A("Giantslayer", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_GIANT,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 200L,
NO_COLOR),
A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR | SPFX_DCLAS), 0, S_OGRE, A("Ogresmasher", WAR_HAMMER, (SPFX_RESTR | SPFX_DCLAS), 0, S_OGRE,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L,
NO_COLOR),
A("Trollsbane", MORNING_STAR, (SPFX_RESTR | SPFX_DCLAS), 0, S_TROLL, A("Trollsbane", MORNING_STAR, (SPFX_RESTR | SPFX_DCLAS), 0, S_TROLL,
PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L), PHYS(5, 0), NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 200L,
NO_COLOR),
/* /*
* Two problems: 1) doesn't let trolls regenerate heads, * Two problems: 1) doesn't let trolls regenerate heads,
* 2) doesn't give unusual message for 2-headed monsters (but * 2) doesn't give unusual message for 2-headed monsters (but
* allowing those at all causes more problems than worth the effort). * allowing those at all causes more problems than worth the effort).
*/ */
A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR | SPFX_BEHEAD), 0, 0, A("Vorpal Blade", LONG_SWORD, (SPFX_RESTR | SPFX_BEHEAD), 0, 0,
PHYS(5, 1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L), PHYS(5, 1), NO_DFNS, NO_CARY, 0, A_NEUTRAL, NON_PM, NON_PM, 4000L,
NO_COLOR),
/* /*
* Ah, never shall I forget the cry, * Ah, never shall I forget the cry,
* or the shriek that shrieked he, * or the shriek that shrieked he,
@@ -135,10 +147,11 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
* (From Sir W.S. Gilbert's "The Mikado") * (From Sir W.S. Gilbert's "The Mikado")
*/ */
A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, A("Snickersnee", KATANA, SPFX_RESTR, 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY,
0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L), 0, A_LAWFUL, PM_SAMURAI, NON_PM, 1200L, NO_COLOR),
A("Sunsword", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_UNDEAD, A("Sunsword", LONG_SWORD, (SPFX_RESTR | SPFX_DFLAG2), 0, M2_UNDEAD,
PHYS(5, 0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L), PHYS(5, 0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L,
NO_COLOR),
/* /*
* The artifacts for the quest dungeon, all self-willed. * The artifacts for the quest dungeon, all self-willed.
@@ -147,81 +160,84 @@ STATIC_OVL NEARDATA struct artifact artilist[] = {
A("The Orb of Detection", CRYSTAL_BALL, A("The Orb of Detection", CRYSTAL_BALL,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_ESP | SPFX_HSPDAM), 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_ESP | SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), INVIS, A_LAWFUL, PM_ARCHEOLOGIST, NO_ATTK, NO_DFNS, CARY(AD_MAGM), INVIS, A_LAWFUL, PM_ARCHEOLOGIST,
NON_PM, 2500L), NON_PM, 2500L, NO_COLOR),
A("The Heart of Ahriman", LUCKSTONE, A("The Heart of Ahriman", LUCKSTONE,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), SPFX_STLTH, 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), SPFX_STLTH, 0,
/* this stone does double damage if used as a projectile weapon */ /* this stone does double damage if used as a projectile weapon */
PHYS(5, 0), NO_DFNS, NO_CARY, LEVITATION, A_NEUTRAL, PM_BARBARIAN, PHYS(5, 0), NO_DFNS, NO_CARY, LEVITATION, A_NEUTRAL, PM_BARBARIAN,
NON_PM, 2500L), NON_PM, 2500L, NO_COLOR),
A("The Sceptre of Might", MACE, A("The Sceptre of Might", MACE,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0), (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0),
DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L), DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L,
NO_COLOR),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
A("The Palantir of Westernesse", CRYSTAL_BALL, A("The Palantir of Westernesse", CRYSTAL_BALL,
(SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL), (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL),
(SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0, (SPFX_ESP|SPFX_REGEN|SPFX_HSPDAM), 0,
NO_ATTK, NO_DFNS, NO_CARY, NO_ATTK, NO_DFNS, NO_CARY,
TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L ), TAMING, A_CHAOTIC, NON_PM , PM_ELF, 8000L, NO_COLOR ),
#endif #endif
A("The Staff of Aesculapius", QUARTERSTAFF, A("The Staff of Aesculapius", QUARTERSTAFF,
(SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL | SPFX_DRLI (SPFX_NOGEN | SPFX_RESTR | SPFX_ATTK | SPFX_INTEL | SPFX_DRLI
| SPFX_REGEN), | SPFX_REGEN),
0, 0, DRLI(0, 0), DRLI(0, 0), NO_CARY, HEALING, A_NEUTRAL, PM_HEALER, 0, 0, DRLI(0, 0), DRLI(0, 0), NO_CARY, HEALING, A_NEUTRAL, PM_HEALER,
NON_PM, 5000L), NON_PM, 5000L, NO_COLOR),
A("The Magic Mirror of Merlin", MIRROR, A("The Magic Mirror of Merlin", MIRROR,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), SPFX_ESP, 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), SPFX_ESP, 0,
NO_ATTK, NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L), NO_ATTK, NO_DFNS, CARY(AD_MAGM), 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L,
NO_COLOR),
A("The Eyes of the Overworld", LENSES, A("The Eyes of the Overworld", LENSES,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_XRAY), 0, 0, NO_ATTK, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_XRAY), 0, 0, NO_ATTK,
DFNS(AD_MAGM), NO_CARY, ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM, DFNS(AD_MAGM), NO_CARY, ENLIGHTENING, A_NEUTRAL, PM_MONK, NON_PM,
2500L), 2500L, NO_COLOR),
A("The Mitre of Holiness", HELM_OF_BRILLIANCE, A("The Mitre of Holiness", HELM_OF_BRILLIANCE,
(SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0,
M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL, M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL,
PM_PRIEST, NON_PM, 2000L), PM_PRIEST, NON_PM, 2000L, NO_COLOR),
A("The Longbow of Diana", BOW, A("The Longbow of Diana", BOW,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0,
PHYS(5, 0), NO_DFNS, NO_CARY, CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM, PHYS(5, 0), NO_DFNS, NO_CARY, CREATE_AMMO, A_CHAOTIC, PM_RANGER, NON_PM,
4000L), 4000L, NO_COLOR),
A("The Master Key of Thievery", SKELETON_KEY, A("The Master Key of Thievery", SKELETON_KEY,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK), (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_SPEAK),
(SPFX_WARN | SPFX_TCTRL | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, (SPFX_WARN | SPFX_TCTRL | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY,
UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L), UNTRAP, A_CHAOTIC, PM_ROGUE, NON_PM, 3500L, NO_COLOR),
A("The Tsurugi of Muramasa", TSURUGI, A("The Tsurugi of Muramasa", TSURUGI,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_BEHEAD | SPFX_LUCK (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_BEHEAD | SPFX_LUCK
| SPFX_PROTECT), | SPFX_PROTECT),
0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM, 0, 0, PHYS(0, 8), NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_SAMURAI, NON_PM,
4500L), 4500L, NO_COLOR),
A("The Platinum Yendorian Express Card", CREDIT_CARD, A("The Platinum Yendorian Express Card", CREDIT_CARD,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DEFN), (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DEFN),
(SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM), (SPFX_ESP | SPFX_HSPDAM), 0, NO_ATTK, NO_DFNS, CARY(AD_MAGM),
CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L), CHARGE_OBJ, A_NEUTRAL, PM_TOURIST, NON_PM, 7000L, NO_COLOR),
A("The Orb of Fate", CRYSTAL_BALL, A("The Orb of Fate", CRYSTAL_BALL,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_LUCK), (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_LUCK),
(SPFX_WARN | SPFX_HSPDAM | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY, (SPFX_WARN | SPFX_HSPDAM | SPFX_HPHDAM), 0, NO_ATTK, NO_DFNS, NO_CARY,
LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L), LEV_TELE, A_NEUTRAL, PM_VALKYRIE, NON_PM, 3500L, NO_COLOR),
A("The Eye of the Aethiopica", AMULET_OF_ESP, A("The Eye of the Aethiopica", AMULET_OF_ESP,
(SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_EREGEN | SPFX_HSPDAM), 0, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL), (SPFX_EREGEN | SPFX_HSPDAM), 0,
NO_ATTK, DFNS(AD_MAGM), NO_CARY, CREATE_PORTAL, A_NEUTRAL, PM_WIZARD, NO_ATTK, DFNS(AD_MAGM), NO_CARY, CREATE_PORTAL, A_NEUTRAL, PM_WIZARD,
NON_PM, 4000L), NON_PM, 4000L, NO_COLOR),
/* /*
* terminator; otyp must be zero * terminator; otyp must be zero
*/ */
A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L) A(0, 0, 0, 0, 0, NO_ATTK, NO_DFNS, NO_CARY, 0, A_NONE, NON_PM, NON_PM, 0L,
0) /* 0 is CLR_BLACK rather than NO_COLOR but it doesn't matter here */
}; /* artilist[] (or artifact_names[]) */ }; /* artilist[] (or artifact_names[]) */
+2
View File
@@ -88,6 +88,7 @@ E long FDECL(spec_m2, (struct obj *));
E boolean FDECL(artifact_has_invprop, (struct obj *, UCHAR_P)); E boolean FDECL(artifact_has_invprop, (struct obj *, UCHAR_P));
E long FDECL(arti_cost, (struct obj *)); E long FDECL(arti_cost, (struct obj *));
E struct obj *FDECL(what_gives, (long *)); E struct obj *FDECL(what_gives, (long *));
E const char *FDECL(glow_color, (int));
E void FDECL(Sting_effects, (int)); E void FDECL(Sting_effects, (int));
E int FDECL(retouch_object, (struct obj **, BOOLEAN_P)); E int FDECL(retouch_object, (struct obj **, BOOLEAN_P));
E void FDECL(retouch_equipment, (int)); E void FDECL(retouch_equipment, (int));
@@ -1631,6 +1632,7 @@ E void FDECL(parsesymbols, (char *));
E struct symparse *FDECL(match_sym, (char *)); E struct symparse *FDECL(match_sym, (char *));
E void NDECL(set_playmode); E void NDECL(set_playmode);
E int FDECL(sym_val, (char *)); E int FDECL(sym_val, (char *));
E const char *FDECL(clr2colorname, (int));
E boolean FDECL(add_menu_coloring, (char *)); E boolean FDECL(add_menu_coloring, (char *));
E boolean FDECL(get_menu_coloring, (char *, int *, int *)); E boolean FDECL(get_menu_coloring, (char *, int *, int *));
E void NDECL(free_menu_coloring); E void NDECL(free_menu_coloring);
+40 -24
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 artifact.c $NHDT-Date: 1432946531 2015/05/30 00:42:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.89 $ */ /* NetHack 3.6 artifact.c $NHDT-Date: 1433060653 2015/05/31 08:24:13 $ $NHDT-Branch: master $:$NHDT-Revision: 1.91 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1784,10 +1784,12 @@ long *abil;
unsigned long spfx; unsigned long spfx;
long wornbits; long wornbits;
long wornmask = long wornmask =
(W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF | W_WEP | W_QUIVER (W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF | W_ARMU
| W_SWAPWEP | W_ART | W_ARTI | W_AMUL | W_RINGL | W_RINGR | W_TOOL | W_AMUL | W_RINGL | W_RINGR | W_TOOL | W_ART | W_ARTI);
| W_BALL | W_CHAIN | W_SADDLE | W_ARMU); /* [do W_ART and W_ARTI actually belong here?] */
if (u.twoweap)
wornmask |= W_SWAPWEP;
dtyp = abil_to_adtyp(abil); dtyp = abil_to_adtyp(abil);
spfx = abil_to_spfx(abil); spfx = abil_to_spfx(abil);
wornbits = (wornmask & *abil); wornbits = (wornmask & *abil);
@@ -1795,14 +1797,21 @@ long *abil;
for (obj = invent; obj; obj = obj->nobj) { for (obj = invent; obj; obj = obj->nobj) {
if (obj->oartifact if (obj->oartifact
&& ((abil != &EWarn_of_mon) || context.warntype.obj)) { && ((abil != &EWarn_of_mon) || context.warntype.obj)) {
register const struct artifact *art = get_artifact(obj); const struct artifact *art = get_artifact(obj);
if (art) { if (art) {
if (dtyp if (dtyp) {
&& (art->cary.adtyp == dtyp || art->defn.adtyp == dtyp)) if (art->cary.adtyp == dtyp || art->defn.adtyp == dtyp)
return obj; return obj;
if (spfx && ((art->cspfx & spfx) == spfx }
|| (art->spfx & spfx) == spfx)) if (spfx) {
return obj; /* property conferred when carried */
if ((art->cspfx & spfx) == spfx)
return obj;
/* property conferred when wielded or worn */
if ((art->spfx & spfx) == spfx && obj->owornmask)
return obj;
}
} }
} else { } else {
if (wornbits && wornbits == (wornmask & obj->owornmask)) if (wornbits && wornbits == (wornmask & obj->owornmask))
@@ -1812,32 +1821,39 @@ long *abil;
return (struct obj *) 0; return (struct obj *) 0;
} }
const char *
glow_color(arti_indx)
int arti_indx;
{
int colornum = artilist[arti_indx].acolor;
const char *colorstr = clr2colorname(colornum);
return hcolor(colorstr);
}
/* use for warning "glow" for Sting, Orcrist, and Grimtooth */ /* use for warning "glow" for Sting, Orcrist, and Grimtooth */
void void
Sting_effects(orc_count) Sting_effects(orc_count)
int orc_count; int orc_count; /* new count (warn_obj_cnt is old count); -1 is a flag value */
{ {
if (uwep if (uwep
&& (uwep->oartifact == ART_STING && (uwep->oartifact == ART_STING
|| uwep->oartifact == ART_ORCRIST || uwep->oartifact == ART_ORCRIST
|| uwep->oartifact == ART_GRIMTOOTH)) { || uwep->oartifact == ART_GRIMTOOTH)) {
/* if (orc_count == -1 && warn_obj_cnt > 0) {
* Toggling blindness in between warning messages can result in /* -1 means that blindess has just been toggled; give a
* Sting glows light blue! [...] Sting stops quivering. 'continue' message that eventual 'stop' message will match */
* or pline("%s is %s.", bare_artifactname(uwep),
* Sting quivers slightly. [...] Sting stops glowing. !Blind ? "glowing" : "quivering");
* but addressing that is far more trouble than it's worth. } else if (orc_count > 0 && warn_obj_cnt == 0) {
*/ /* 'start' message */
if (orc_count > 0 && warn_obj_cnt == 0) {
if (!Blind) if (!Blind)
pline("%s %s %s!", bare_artifactname(uwep), pline("%s %s %s!", bare_artifactname(uwep),
otense(uwep, "glow"), otense(uwep, "glow"), glow_color(uwep->oartifact));
hcolor((uwep->oartifact == ART_GRIMTOOTH)
? NH_RED
: NH_LIGHT_BLUE));
else else
pline("%s quivers slightly.", bare_artifactname(uwep)); pline("%s quivers slightly.", bare_artifactname(uwep));
} else if (orc_count == 0 && warn_obj_cnt > 0) { } else if (orc_count == 0 && warn_obj_cnt > 0) {
/* 'stop' message */
pline("%s stops %s.", bare_artifactname(uwep), pline("%s stops %s.", bare_artifactname(uwep),
!Blind ? "glowing" : "quivering"); !Blind ? "glowing" : "quivering");
} }
+4 -5
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 cmd.c $NHDT-Date: 1432512764 2015/05/25 00:12:44 $ $NHDT-Branch: master $:$NHDT-Revision: 1.192 $ */ /* NetHack 3.6 cmd.c $NHDT-Date: 1433050877 2015/05/31 05:41:17 $ $NHDT-Branch: master $:$NHDT-Revision: 1.193 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1952,10 +1952,9 @@ int final;
you_are("warned", from_what(WARNING)); you_are("warned", from_what(WARNING));
if (Warn_of_mon && context.warntype.obj) { if (Warn_of_mon && context.warntype.obj) {
Sprintf(buf, "aware of the presence of %s", Sprintf(buf, "aware of the presence of %s",
(context.warntype.obj & M2_ORC) (context.warntype.obj & M2_ORC) ? "orcs"
? "orcs" : (context.warntype.obj & M2_ELF) ? "elves"
: (context.warntype.obj & M2_DEMON) ? "demons" : (context.warntype.obj & M2_DEMON) ? "demons" : something);
: something);
you_are(buf, from_what(WARN_OF_MON)); you_are(buf, from_what(WARN_OF_MON));
} }
if (Warn_of_mon && context.warntype.polyd) { if (Warn_of_mon && context.warntype.polyd) {
+1 -1
View File
@@ -697,7 +697,7 @@ register struct monst *mtmp;
} }
break; break;
case S_GNOME: case S_GNOME:
if (!rn2((In_mines(&u.uz) ? 5 : 10))) { if (!rn2((In_mines(&u.uz) && in_mklev) ? 20 : 60)) {
otmp = mksobj(rn2(4) ? TALLOW_CANDLE : WAX_CANDLE, TRUE, FALSE); otmp = mksobj(rn2(4) ? TALLOW_CANDLE : WAX_CANDLE, TRUE, FALSE);
otmp->quan = 1; otmp->quan = 1;
otmp->owt = weight(otmp); otmp->owt = weight(otmp);
+128 -126
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mondata.c $NHDT-Date: 1432512762 2015/05/25 00:12:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.53 $ */ /* NetHack 3.6 mondata.c $NHDT-Date: 1433117881 2015/06/01 00:18:01 $ $NHDT-Branch: master $:$NHDT-Revision: 1.54 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -6,6 +6,7 @@
/* These routines provide basic data for any type of monster. */ /* These routines provide basic data for any type of monster. */
/* set up an individual monster's base type (initial creation, shapechange) */
void void
set_mon_data(mon, ptr, flag) set_mon_data(mon, ptr, flag)
struct monst *mon; struct monst *mon;
@@ -23,6 +24,7 @@ int flag;
return; return;
} }
/* does monster-type have any attack for a specific type of damage? */
struct attack * struct attack *
attacktype_fordmg(ptr, atyp, dtyp) attacktype_fordmg(ptr, atyp, dtyp)
struct permonst *ptr; struct permonst *ptr;
@@ -33,10 +35,10 @@ int atyp, dtyp;
for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++) for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++)
if (a->aatyp == atyp && (dtyp == AD_ANY || a->adtyp == dtyp)) if (a->aatyp == atyp && (dtyp == AD_ANY || a->adtyp == dtyp))
return a; return a;
return (struct attack *) 0; return (struct attack *) 0;
} }
/* does monster-type have a paricular type of attack */
boolean boolean
attacktype(ptr, atyp) attacktype(ptr, atyp)
struct permonst *ptr; struct permonst *ptr;
@@ -45,7 +47,7 @@ int atyp;
return attacktype_fordmg(ptr, atyp, AD_ANY) ? TRUE : FALSE; return attacktype_fordmg(ptr, atyp, AD_ANY) ? TRUE : FALSE;
} }
/* returns TRUE if monster doesn't attack, FALSE if it does */ /* returns True if monster doesn't attack, False if it does */
boolean boolean
noattacks(ptr) noattacks(ptr)
struct permonst *ptr; struct permonst *ptr;
@@ -62,34 +64,40 @@ struct permonst *ptr;
if (mattk[i].aatyp) if (mattk[i].aatyp)
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
/* does monster-type transform into something else when petrified? */
boolean boolean
poly_when_stoned(ptr) poly_when_stoned(ptr)
struct permonst *ptr; struct permonst *ptr;
{ {
return ((boolean)(is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM] /* non-stone golems turn into stone golems unless latter is genocided */
&& !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD))); return (boolean) (is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM]
&& !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD));
/* allow G_EXTINCT */ /* allow G_EXTINCT */
} }
/* returns True if monster is drain-life resistant */
boolean boolean
resists_drli(mon) /* returns TRUE if monster is drain-life resistant */ resists_drli(mon)
struct monst *mon; struct monst *mon;
{ {
struct permonst *ptr = mon->data; struct permonst *ptr = mon->data;
struct obj *wep = ((mon == &youmonst) ? uwep : MON_WEP(mon)); struct obj *wep;
return (boolean)(is_undead(ptr) || is_demon(ptr) || is_were(ptr) || if (is_undead(ptr) || is_demon(ptr) || is_were(ptr)
/* is_were() doesn't handle hero in human form */ /* is_were() doesn't handle hero in human form */
(mon == &youmonst && u.ulycn >= LOW_PM) || (mon == &youmonst && u.ulycn >= LOW_PM)
|| ptr == &mons[PM_DEATH] || is_vampshifter(mon) || ptr == &mons[PM_DEATH] || is_vampshifter(mon))
|| (wep && wep->oartifact && defends(AD_DRLI, wep))); return TRUE;
wep = (mon == &youmonst) ? uwep : MON_WEP(mon);
return (boolean) (wep && wep->oartifact && defends(AD_DRLI, wep));
} }
boolean resists_magm(mon) /* TRUE if monster is magic-missile resistant */ /* True if monster is magic-missile (actually, general magic) resistant */
boolean
resists_magm(mon)
struct monst *mon; struct monst *mon;
{ {
struct permonst *ptr = mon->data; struct permonst *ptr = mon->data;
@@ -121,7 +129,7 @@ struct monst *mon;
return FALSE; return FALSE;
} }
/* TRUE iff monster is resistant to light-induced blindness */ /* True iff monster is resistant to light-induced blindness */
boolean boolean
resists_blnd(mon) resists_blnd(mon)
struct monst *mon; struct monst *mon;
@@ -159,8 +167,8 @@ struct monst *mon;
return FALSE; return FALSE;
} }
/* TRUE iff monster can be blinded by the given attack */ /* True iff monster can be blinded by the given attack;
/* Note: may return TRUE when mdef is blind (e.g. new cream-pie attack) */ note: may return True when mdef is blind (e.g. new cream-pie attack) */
boolean boolean
can_blnd(magr, mdef, aatyp, obj) can_blnd(magr, mdef, aatyp, obj)
struct monst *magr; /* NULL == no specific aggressor */ struct monst *magr; /* NULL == no specific aggressor */
@@ -248,7 +256,9 @@ struct obj *obj; /* aatyp == AT_WEAP, AT_SPIT */
return TRUE; return TRUE;
} }
boolean ranged_attk(ptr) /* returns TRUE if monster can attack at range */ /* returns True if monster can attack at range */
boolean
ranged_attk(ptr)
struct permonst *ptr; struct permonst *ptr;
{ {
register int i, atyp; register int i, atyp;
@@ -267,39 +277,41 @@ struct permonst *ptr;
if ((atk_mask & (1L << atyp)) != 0L) if ((atk_mask & (1L << atyp)) != 0L)
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
/* True if specific monster is especially affected by silver weapons */
boolean boolean
mon_hates_silver(mon) mon_hates_silver(mon)
struct monst *mon; struct monst *mon;
{ {
return (is_vampshifter(mon) || hates_silver(mon->data)); return (boolean) (is_vampshifter(mon) || hates_silver(mon->data));
} }
/* TRUE if monster is especially affected by silver weapons */ /* True if monster-type is especially affected by silver weapons */
boolean boolean
hates_silver(ptr) hates_silver(ptr)
register struct permonst *ptr; register struct permonst *ptr;
{ {
return (boolean)(is_were(ptr) || ptr->mlet == S_VAMPIRE || is_demon(ptr) return (boolean) (is_were(ptr) || ptr->mlet == S_VAMPIRE || is_demon(ptr)
|| ptr == &mons[PM_SHADE] || ptr == &mons[PM_SHADE]
|| (ptr->mlet == S_IMP && ptr != &mons[PM_TENGU])); || (ptr->mlet == S_IMP && ptr != &mons[PM_TENGU]));
} }
/* true iff the type of monster pass through iron bars */ /* True iff the type of monster pass through iron bars */
boolean boolean
passes_bars(mptr) passes_bars(mptr)
struct permonst *mptr; struct permonst *mptr;
{ {
return (boolean)(passes_walls(mptr) || amorphous(mptr) || unsolid(mptr) return (boolean) (passes_walls(mptr) || amorphous(mptr) || unsolid(mptr)
|| is_whirly(mptr) || verysmall(mptr) || is_whirly(mptr) || verysmall(mptr)
|| dmgtype(mptr, AD_CORR) || dmgtype(mptr, AD_RUST) || dmgtype(mptr, AD_CORR) || dmgtype(mptr, AD_RUST)
|| (slithy(mptr) && !bigmonst(mptr))); || (slithy(mptr) && !bigmonst(mptr)));
} }
boolean can_blow(mtmp) /* returns TRUE if monster can blow (whistle, etc) */ /* returns True if monster can blow (whistle, etc) */
boolean
can_blow(mtmp)
register struct monst *mtmp; register struct monst *mtmp;
{ {
if ((is_silent(mtmp->data) || mtmp->data->msound == MS_BUZZ) if ((is_silent(mtmp->data) || mtmp->data->msound == MS_BUZZ)
@@ -311,7 +323,9 @@ register struct monst *mtmp;
return TRUE; return TRUE;
} }
boolean can_be_strangled(mon) /* TRUE if mon is vulnerable to strangulation */ /* True if mon is vulnerable to strangulation */
boolean
can_be_strangled(mon)
struct monst *mon; struct monst *mon;
{ {
struct obj *mamul; struct obj *mamul;
@@ -339,41 +353,54 @@ struct monst *mon;
|| ((mamul = which_armor(mon, W_AMUL)) != 0 || ((mamul = which_armor(mon, W_AMUL)) != 0
&& (mamul->otyp == AMULET_OF_MAGICAL_BREATHING))); && (mamul->otyp == AMULET_OF_MAGICAL_BREATHING)));
} }
return (boolean)(!nobrainer || !nonbreathing); return (boolean) (!nobrainer || !nonbreathing);
} }
boolean can_track(ptr) /* returns TRUE if monster can track well */ /* returns True if monster can track well */
boolean
can_track(ptr)
register struct permonst *ptr; register struct permonst *ptr;
{ {
if (uwep && uwep->oartifact == ART_EXCALIBUR) if (uwep && uwep->oartifact == ART_EXCALIBUR)
return TRUE; return TRUE;
else else
return ((boolean) haseyes(ptr)); return (boolean) haseyes(ptr);
} }
boolean sliparm(ptr) /* creature will slide out of armor */ /* creature will slide out of armor */
boolean
sliparm(ptr)
register struct permonst *ptr; register struct permonst *ptr;
{ {
return ((boolean)(is_whirly(ptr) || ptr->msize <= MZ_SMALL return (boolean) (is_whirly(ptr) || ptr->msize <= MZ_SMALL
|| noncorporeal(ptr))); || noncorporeal(ptr));
} }
boolean breakarm(ptr) /* creature will break out of armor */ /* creature will break out of armor */
boolean
breakarm(ptr)
register struct permonst *ptr; register struct permonst *ptr;
{ {
return ((bigmonst(ptr) || (ptr->msize > MZ_SMALL && !humanoid(ptr)) || if (sliparm(ptr))
/* special cases of humanoids that cannot wear body armor */ return FALSE;
ptr == &mons[PM_MARILITH] || ptr == &mons[PM_WINGED_GARGOYLE])
&& !sliparm(ptr)); return (boolean) (bigmonst(ptr)
|| (ptr->msize > MZ_SMALL && !humanoid(ptr))
/* special cases of humanoids that cannot wear suits */
|| ptr == &mons[PM_MARILITH]
|| ptr == &mons[PM_WINGED_GARGOYLE]);
} }
boolean sticks(ptr) /* creature sticks other creatures it hits */ /* creature sticks other creatures it hits */
boolean
sticks(ptr)
register struct permonst *ptr; register struct permonst *ptr;
{ {
return ((boolean)(dmgtype(ptr, AD_STCK) || dmgtype(ptr, AD_WRAP) return (boolean) (dmgtype(ptr, AD_STCK) || dmgtype(ptr, AD_WRAP)
|| attacktype(ptr, AT_HUGS))); || attacktype(ptr, AT_HUGS));
} }
/* some monster-types can't vomit */
boolean boolean
cantvomit(ptr) cantvomit(ptr)
struct permonst *ptr; struct permonst *ptr;
@@ -408,6 +435,8 @@ struct permonst *ptr;
return 0; return 0;
} }
/* does monster-type deal out a particular type of damage from a particular
type of attack? */
struct attack * struct attack *
dmgtype_fromattack(ptr, dtyp, atyp) dmgtype_fromattack(ptr, dtyp, atyp)
struct permonst *ptr; struct permonst *ptr;
@@ -418,10 +447,10 @@ int dtyp, atyp;
for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++) for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++)
if (a->adtyp == dtyp && (atyp == AT_ANY || a->aatyp == atyp)) if (a->adtyp == dtyp && (atyp == AT_ANY || a->aatyp == atyp))
return a; return a;
return (struct attack *) 0; return (struct attack *) 0;
} }
/* does monster-type deal out a particular type of damage from any attack */
boolean boolean
dmgtype(ptr, dtyp) dmgtype(ptr, dtyp)
struct permonst *ptr; struct permonst *ptr;
@@ -431,7 +460,7 @@ int dtyp;
} }
/* returns the maximum damage a defender can do to the attacker via /* returns the maximum damage a defender can do to the attacker via
* a passive defense */ a passive defense */
int int
max_passive_dmg(mdef, magr) max_passive_dmg(mdef, magr)
register struct monst *mdef, *magr; register struct monst *mdef, *magr;
@@ -552,8 +581,8 @@ struct permonst *pm1, *pm2;
return (let2 == S_GHOST); return (let2 == S_GHOST);
} else if (is_undead(pm2)) } else if (is_undead(pm2))
return FALSE; return FALSE;
/* check for monsters--mainly animals--which grow into more mature forms
*/ /* check for monsters which grow into more mature forms */
if (let1 == let2) { if (let1 == let2) {
int m1 = monsndx(pm1), m2 = monsndx(pm2), prv, nxt; int m1 = monsndx(pm1), m2 = monsndx(pm2), prv, nxt;
@@ -575,6 +604,7 @@ struct permonst *pm1, *pm2;
|| pm2 == &mons[PM_WINGED_GARGOYLE]); || pm2 == &mons[PM_WINGED_GARGOYLE]);
if (pm1 == &mons[PM_KILLER_BEE] || pm1 == &mons[PM_QUEEN_BEE]) if (pm1 == &mons[PM_KILLER_BEE] || pm1 == &mons[PM_QUEEN_BEE])
return (pm2 == &mons[PM_KILLER_BEE] || pm2 == &mons[PM_QUEEN_BEE]); return (pm2 == &mons[PM_KILLER_BEE] || pm2 == &mons[PM_QUEEN_BEE]);
if (is_longworm(pm1)) if (is_longworm(pm1))
return is_longworm(pm2); /* handles tail */ return is_longworm(pm2); /* handles tail */
/* [currently there's no reason to bother matching up /* [currently there's no reason to bother matching up
@@ -583,7 +613,9 @@ struct permonst *pm1, *pm2;
return FALSE; return FALSE;
} }
int monsndx(ptr) /* return an index into the mons array */ /* return an index into the mons array */
int
monsndx(ptr)
struct permonst *ptr; struct permonst *ptr;
{ {
register int i; register int i;
@@ -594,8 +626,7 @@ struct permonst *ptr;
fmt_ptr((genericptr_t) ptr)); fmt_ptr((genericptr_t) ptr));
return NON_PM; /* will not get here */ return NON_PM; /* will not get here */
} }
return i;
return (i);
} }
/* for handling alternate spellings */ /* for handling alternate spellings */
@@ -675,7 +706,7 @@ const char *in_str;
{ "invisible stalker", PM_STALKER }, { "invisible stalker", PM_STALKER },
{ "high-elf", PM_ELVENKING }, /* PM_HIGH_ELF is obsolete */ { "high-elf", PM_ELVENKING }, /* PM_HIGH_ELF is obsolete */
{ "halfling", PM_HOBBIT }, /* potential guess for polyself */ { "halfling", PM_HOBBIT }, /* potential guess for polyself */
/* Hyphenated names */ /* Hyphenated names */
{ "ki rin", PM_KI_RIN }, { "ki rin", PM_KI_RIN },
{ "uruk hai", PM_URUK_HAI }, { "uruk hai", PM_URUK_HAI },
{ "orc captain", PM_ORC_CAPTAIN }, { "orc captain", PM_ORC_CAPTAIN },
@@ -710,11 +741,13 @@ const char *in_str;
for (len = 0, i = LOW_PM; i < NUMMONS; i++) { for (len = 0, i = LOW_PM; i < NUMMONS; i++) {
register int m_i_len = strlen(mons[i].mname); register int m_i_len = strlen(mons[i].mname);
if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) { if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) {
if (m_i_len == slen) { if (m_i_len == slen) {
return i; /* exact match */ return i; /* exact match */
} else if (slen > m_i_len } else if (slen > m_i_len
&& (str[m_i_len] == ' ' || !strcmpi(&str[m_i_len], "s") && (str[m_i_len] == ' '
|| !strcmpi(&str[m_i_len], "s")
|| !strncmpi(&str[m_i_len], "s ", 2) || !strncmpi(&str[m_i_len], "s ", 2)
|| !strcmpi(&str[m_i_len], "'") || !strcmpi(&str[m_i_len], "'")
|| !strncmpi(&str[m_i_len], "' ", 2) || !strncmpi(&str[m_i_len], "' ", 2)
@@ -834,8 +867,8 @@ register struct monst *mtmp;
return mtmp->female; return mtmp->female;
} }
/* Like gender(), but lower animals and such are still "it". */ /* Like gender(), but lower animals and such are still "it".
/* This is the one we want to use when printing messages. */ This is the one we want to use when printing messages. */
int int
pronoun_gender(mtmp) pronoun_gender(mtmp)
register struct monst *mtmp; register struct monst *mtmp;
@@ -843,9 +876,7 @@ register struct monst *mtmp;
if (is_neuter(mtmp->data) || !canspotmon(mtmp)) if (is_neuter(mtmp->data) || !canspotmon(mtmp))
return 2; return 2;
return (humanoid(mtmp->data) || (mtmp->data->geno & G_UNIQ) return (humanoid(mtmp->data) || (mtmp->data->geno & G_UNIQ)
|| type_is_pname(mtmp->data)) || type_is_pname(mtmp->data)) ? (int) mtmp->female : 2;
? (int) mtmp->female
: 2;
} }
/* used for nearby monsters when you go to another level */ /* used for nearby monsters when you go to another level */
@@ -859,15 +890,13 @@ struct monst *mtmp;
/* Wizard with Amulet won't bother trying to follow across levels */ /* Wizard with Amulet won't bother trying to follow across levels */
if (mtmp->iswiz && mon_has_amulet(mtmp)) if (mtmp->iswiz && mon_has_amulet(mtmp))
return FALSE; return FALSE;
/* some monsters will follow even while intending to flee from you */ /* some monsters will follow even while intending to flee from you */
if (mtmp->mtame || mtmp->iswiz || is_fshk(mtmp)) if (mtmp->mtame || mtmp->iswiz || is_fshk(mtmp))
return TRUE; return TRUE;
/* stalking types follow, but won't when fleeing unless you hold /* stalking types follow, but won't when fleeing unless you hold
the Amulet */ the Amulet */
return (boolean)((mtmp->data->mflags2 & M2_STALK) return (boolean) ((mtmp->data->mflags2 & M2_STALK)
&& (!mtmp->mflee || u.uhave.amulet)); && (!mtmp->mflee || u.uhave.amulet));
} }
static const short grownups[][2] = { static const short grownups[][2] = {
@@ -947,29 +976,14 @@ int
little_to_big(montype) little_to_big(montype)
int montype; int montype;
{ {
#ifndef AIXPS2_BUG
register int i; register int i;
for (i = 0; grownups[i][0] >= LOW_PM; i++) for (i = 0; grownups[i][0] >= LOW_PM; i++)
if (montype == grownups[i][0]) if (montype == grownups[i][0]) {
return grownups[i][1]; montype = grownups[i][1];
break;
}
return montype; return montype;
#else
/* AIX PS/2 C-compiler 1.1.1 optimizer does not like the above for loop,
* and causes segmentation faults at runtime. (The problem does not
* occur if -O is not used.)
* lehtonen@cs.Helsinki.FI (Tapio Lehtonen) 28031990
*/
int i;
int monvalue;
monvalue = montype;
for (i = 0; grownups[i][0] >= LOW_PM; i++)
if (montype == grownups[i][0])
monvalue = grownups[i][1];
return monvalue;
#endif
} }
int int
@@ -979,8 +993,10 @@ int montype;
register int i; register int i;
for (i = 0; grownups[i][0] >= LOW_PM; i++) for (i = 0; grownups[i][0] >= LOW_PM; i++)
if (montype == grownups[i][1]) if (montype == grownups[i][1]) {
return grownups[i][0]; montype = grownups[i][0];
break;
}
return montype; return montype;
} }
@@ -994,9 +1010,9 @@ raceptr(mtmp)
struct monst *mtmp; struct monst *mtmp;
{ {
if (mtmp == &youmonst && !Upolyd) if (mtmp == &youmonst && !Upolyd)
return (&mons[urace.malenum]); return &mons[urace.malenum];
else else
return (mtmp->data); return mtmp->data;
} }
static const char *levitate[4] = { "float", "Float", "wobble", "Wobble" }; static const char *levitate[4] = { "float", "Float", "wobble", "Wobble" };
@@ -1014,21 +1030,14 @@ const char *def;
{ {
int capitalize = (*def == highc(*def)); int capitalize = (*def == highc(*def));
return (is_floater(ptr) return (is_floater(ptr) ? levitate[capitalize]
? levitate[capitalize] : (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL) : (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize]
? flys[capitalize] : slithy(ptr) ? slither[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL) : amorphous(ptr) ? ooze[capitalize]
? flyl[capitalize] : !ptr->mmove ? immobile[capitalize]
: slithy(ptr) : nolimbs(ptr) ? crawl[capitalize]
? slither[capitalize] : def);
: amorphous(ptr)
? ooze[capitalize]
: !ptr->mmove
? immobile[capitalize]
: nolimbs(ptr)
? crawl[capitalize]
: def);
} }
const char * const char *
@@ -1038,25 +1047,17 @@ const char *def;
{ {
int capitalize = 2 + (*def == highc(*def)); int capitalize = 2 + (*def == highc(*def));
return (is_floater(ptr) return (is_floater(ptr) ? levitate[capitalize]
? levitate[capitalize] : (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL) : (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize]
? flys[capitalize] : slithy(ptr) ? slither[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL) : amorphous(ptr) ? ooze[capitalize]
? flyl[capitalize] : !ptr->mmove ? immobile[capitalize]
: slithy(ptr) : nolimbs(ptr) ? crawl[capitalize]
? slither[capitalize] : def);
: amorphous(ptr)
? ooze[capitalize]
: !ptr->mmove
? immobile[capitalize]
: nolimbs(ptr)
? crawl[capitalize]
: def);
} }
/* return a phrase describing the effect of fire attack on a type of monster /* return phrase describing the effect of fire attack on a type of monster */
*/
const char * const char *
on_fire(mptr, mattk) on_fire(mptr, mattk)
struct permonst *mptr; struct permonst *mptr;
@@ -1098,8 +1099,8 @@ struct attack *mattk;
/* /*
* Returns: * Returns:
* TRUE if monster is presumed to have a sense of smell. * True if monster is presumed to have a sense of smell.
* FALSE if monster definitely does not have a sense of smell. * False if monster definitely does not have a sense of smell.
* *
* Do not base this on presence of a head or nose, since many * Do not base this on presence of a head or nose, since many
* creatures sense smells other ways (feelers, forked-tongues, etc.) * creatures sense smells other ways (feelers, forked-tongues, etc.)
@@ -1109,12 +1110,13 @@ boolean
olfaction(mdat) olfaction(mdat)
struct permonst *mdat; struct permonst *mdat;
{ {
if (mdat && (is_golem(mdat) || mdat->mlet == S_EYE || /* spheres */ if (is_golem(mdat)
mdat->mlet == S_JELLY || mdat->mlet == S_PUDDING || mdat->mlet == S_EYE /* spheres */
|| mdat->mlet == S_BLOB || mdat->mlet == S_VORTEX || mdat->mlet == S_JELLY || mdat->mlet == S_PUDDING
|| mdat->mlet == S_ELEMENTAL || mdat->mlet == S_FUNGUS || mdat->mlet == S_BLOB || mdat->mlet == S_VORTEX
|| /* mushrooms and fungi */ || mdat->mlet == S_ELEMENTAL
mdat->mlet == S_LIGHT)) || mdat->mlet == S_FUNGUS /* mushrooms and fungi */
|| mdat->mlet == S_LIGHT)
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
+13 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 objnam.c $NHDT-Date: 1432722918 2015/05/27 10:35:18 $ $NHDT-Branch: master $:$NHDT-Revision: 1.137 $ */ /* NetHack 3.6 objnam.c $NHDT-Date: 1433058272 2015/05/31 07:44:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.141 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -550,9 +550,9 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
/* similar to simple_typename but minimal_xname operates on a particular /* similar to simple_typename but minimal_xname operates on a particular
object rather than its general type; it formats the most basic info: object rather than its general type; it formats the most basic info:
potion -- if description not known potion -- if description not known
brown potion -- if oc_name_known not set brown potion -- if oc_name_known not set
potion of object detection -- if discovered potion of object detection -- if discovered
*/ */
static char * static char *
minimal_xname(obj) minimal_xname(obj)
@@ -945,6 +945,14 @@ boolean with_price;
if (bimanual(obj)) if (bimanual(obj))
hand_s = makeplural(hand_s); hand_s = makeplural(hand_s);
Sprintf(eos(bp), " (weapon in %s)", hand_s); Sprintf(eos(bp), " (weapon in %s)", hand_s);
if (warn_obj_cnt && obj == uwep && (EWarn_of_mon & W_WEP) != 0L) {
/* presumeably can be felt when blind */
Strcat(bp, " (glowing");
if (!Blind)
Sprintf(eos(bp), " %s", glow_color(obj->oartifact));
Strcat(bp, ")");
}
} }
} }
if (obj->owornmask & W_SWAPWEP) { if (obj->owornmask & W_SWAPWEP) {
@@ -991,6 +999,7 @@ boolean with_price;
quotedprice, currency(quotedprice)); quotedprice, currency(quotedprice));
} else if (with_price) { } else if (with_price) {
long price = get_cost_of_shop_item(obj); long price = get_cost_of_shop_item(obj);
if (price > 0) if (price > 0)
Sprintf(eos(bp), " (%ld %s)", price, currency(price)); Sprintf(eos(bp), " (%ld %s)", price, currency(price));
} }
-1
View File
@@ -503,7 +503,6 @@ STATIC_OVL boolean FDECL(wc2_supported, (const char *));
STATIC_DCL void FDECL(remove_autopickup_exception, STATIC_DCL void FDECL(remove_autopickup_exception,
(struct autopickup_exception *)); (struct autopickup_exception *));
STATIC_OVL int FDECL(count_ape_maps, (int *, int *)); STATIC_OVL int FDECL(count_ape_maps, (int *, int *));
STATIC_DCL const char *FDECL(clr2colorname, (int));
STATIC_DCL const char *FDECL(attr2attrname, (int)); STATIC_DCL const char *FDECL(attr2attrname, (int));
STATIC_DCL int NDECL(query_color); STATIC_DCL int NDECL(query_color);
STATIC_DCL int NDECL(query_msgtype); STATIC_DCL int NDECL(query_msgtype);
+47 -15
View File
@@ -2688,27 +2688,59 @@ dotip()
/* check floor container(s) first; at most one will be accessed */ /* check floor container(s) first; at most one will be accessed */
if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) { if ((boxes = container_at(cc.x, cc.y, TRUE)) > 0) {
if (flags.verbose)
pline("There %s here.",
(boxes > 1) ? "are containers" : "is a container");
Sprintf(buf, "You can't tip %s while carrying so much.", Sprintf(buf, "You can't tip %s while carrying so much.",
!flags.verbose ? "a container" : (boxes > 1) ? "one" : "it"); !flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) { if (!check_capacity(buf) && able_to_loot(cc.x, cc.y, FALSE)) {
for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
nobj = cobj->nexthere;
if (!Is_container(cobj))
continue;
c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?", cobj, if (boxes > 1) {
doname, ansimpleoname, "container")); /* use menu to pick a container to tip */
if (c == 'q') int n, i;
winid win;
anything any;
menu_item *pick_list = NULL;
any = zeroany;
win = create_nhwindow(NHW_MENU);
start_menu(win);
for (cobj = level.objects[cc.x][cc.y]; cobj;
cobj = cobj->nexthere)
if (Is_container(cobj)) {
any.a_obj = cobj;
add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE,
doname(cobj), MENU_UNSELECTED);
}
end_menu(win, "Tip which container?");
n = select_menu(win, PICK_ONE, &pick_list);
destroy_nhwindow(win);
if (n > 0) {
for (i = 0; i < n; i++) {
tipcontainer(pick_list[i].item.a_obj);
free((genericptr_t) pick_list);
return 1;
}
}
if (pick_list)
free((genericptr_t) pick_list);
if (n == -1)
return 0; return 0;
if (c == 'n') } else {
continue; for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
nobj = cobj->nexthere;
if (!Is_container(cobj))
continue;
tipcontainer(cobj); c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?", cobj,
return 1; doname, ansimpleoname, "container"));
} /* next cobj */ if (c == 'q')
return 0;
if (c == 'n')
continue;
tipcontainer(cobj);
return 1;
}
}
} }
} }
+9 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 potion.c $NHDT-Date: 1432512769 2015/05/25 00:12:49 $ $NHDT-Branch: master $:$NHDT-Revision: 1.115 $ */ /* NetHack 3.6 potion.c $NHDT-Date: 1433060654 2015/05/31 08:24:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.116 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -304,6 +304,14 @@ boolean talk;
if (Blind_telepat || Infravision) if (Blind_telepat || Infravision)
see_monsters(); see_monsters();
/* avoid either of the sequences
"Sting starts glowing", [become blind], "Sting stops quivering" or
"Sting starts quivering", [regain sight], "Sting stops glowing"
by giving "Sting is quivering" when becoming blind or
"Sting is glowing" when regaining sight so that the eventual
"stops" message matches */
if (warn_obj_cnt && uwep && (EWarn_of_mon & W_WEP) != 0L)
Sting_effects(-1);
/* update dknown flag for inventory picked up while blind */ /* update dknown flag for inventory picked up while blind */
if (can_see_now) if (can_see_now)
learn_unseen_invent(); learn_unseen_invent();