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

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. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1784,10 +1784,12 @@ long *abil;
unsigned long spfx;
long wornbits;
long wornmask =
(W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF | W_WEP | W_QUIVER
| W_SWAPWEP | W_ART | W_ARTI | W_AMUL | W_RINGL | W_RINGR | W_TOOL
| W_BALL | W_CHAIN | W_SADDLE | W_ARMU);
(W_ARM | W_ARMC | W_ARMH | W_ARMS | W_ARMG | W_ARMF | W_ARMU
| W_AMUL | W_RINGL | W_RINGR | W_TOOL | W_ART | W_ARTI);
/* [do W_ART and W_ARTI actually belong here?] */
if (u.twoweap)
wornmask |= W_SWAPWEP;
dtyp = abil_to_adtyp(abil);
spfx = abil_to_spfx(abil);
wornbits = (wornmask & *abil);
@@ -1795,14 +1797,21 @@ long *abil;
for (obj = invent; obj; obj = obj->nobj) {
if (obj->oartifact
&& ((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 (dtyp
&& (art->cary.adtyp == dtyp || art->defn.adtyp == dtyp))
return obj;
if (spfx && ((art->cspfx & spfx) == spfx
|| (art->spfx & spfx) == spfx))
return obj;
if (dtyp) {
if (art->cary.adtyp == dtyp || art->defn.adtyp == dtyp)
return obj;
}
if (spfx) {
/* 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 {
if (wornbits && wornbits == (wornmask & obj->owornmask))
@@ -1812,32 +1821,39 @@ long *abil;
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 */
void
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
&& (uwep->oartifact == ART_STING
|| uwep->oartifact == ART_ORCRIST
|| uwep->oartifact == ART_GRIMTOOTH)) {
/*
* Toggling blindness in between warning messages can result in
* Sting glows light blue! [...] Sting stops quivering.
* or
* Sting quivers slightly. [...] Sting stops glowing.
* but addressing that is far more trouble than it's worth.
*/
if (orc_count > 0 && warn_obj_cnt == 0) {
if (orc_count == -1 && warn_obj_cnt > 0) {
/* -1 means that blindess has just been toggled; give a
'continue' message that eventual 'stop' message will match */
pline("%s is %s.", bare_artifactname(uwep),
!Blind ? "glowing" : "quivering");
} else if (orc_count > 0 && warn_obj_cnt == 0) {
/* 'start' message */
if (!Blind)
pline("%s %s %s!", bare_artifactname(uwep),
otense(uwep, "glow"),
hcolor((uwep->oartifact == ART_GRIMTOOTH)
? NH_RED
: NH_LIGHT_BLUE));
otense(uwep, "glow"), glow_color(uwep->oartifact));
else
pline("%s quivers slightly.", bare_artifactname(uwep));
} else if (orc_count == 0 && warn_obj_cnt > 0) {
/* 'stop' message */
pline("%s stops %s.", bare_artifactname(uwep),
!Blind ? "glowing" : "quivering");
}

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. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1952,10 +1952,9 @@ int final;
you_are("warned", from_what(WARNING));
if (Warn_of_mon && context.warntype.obj) {
Sprintf(buf, "aware of the presence of %s",
(context.warntype.obj & M2_ORC)
? "orcs"
: (context.warntype.obj & M2_DEMON) ? "demons"
: something);
(context.warntype.obj & M2_ORC) ? "orcs"
: (context.warntype.obj & M2_ELF) ? "elves"
: (context.warntype.obj & M2_DEMON) ? "demons" : something);
you_are(buf, from_what(WARN_OF_MON));
}
if (Warn_of_mon && context.warntype.polyd) {

View File

@@ -697,7 +697,7 @@ register struct monst *mtmp;
}
break;
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->quan = 1;
otmp->owt = weight(otmp);

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. */
/* NetHack may be freely redistributed. See license for details. */
@@ -6,6 +6,7 @@
/* These routines provide basic data for any type of monster. */
/* set up an individual monster's base type (initial creation, shapechange) */
void
set_mon_data(mon, ptr, flag)
struct monst *mon;
@@ -23,6 +24,7 @@ int flag;
return;
}
/* does monster-type have any attack for a specific type of damage? */
struct attack *
attacktype_fordmg(ptr, atyp, dtyp)
struct permonst *ptr;
@@ -33,10 +35,10 @@ int atyp, dtyp;
for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++)
if (a->aatyp == atyp && (dtyp == AD_ANY || a->adtyp == dtyp))
return a;
return (struct attack *) 0;
}
/* does monster-type have a paricular type of attack */
boolean
attacktype(ptr, atyp)
struct permonst *ptr;
@@ -45,7 +47,7 @@ int atyp;
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
noattacks(ptr)
struct permonst *ptr;
@@ -62,34 +64,40 @@ struct permonst *ptr;
if (mattk[i].aatyp)
return FALSE;
}
return TRUE;
}
/* does monster-type transform into something else when petrified? */
boolean
poly_when_stoned(ptr)
struct permonst *ptr;
{
return ((boolean)(is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM]
&& !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD)));
/* non-stone golems turn into stone golems unless latter is genocided */
return (boolean) (is_golem(ptr) && ptr != &mons[PM_STONE_GOLEM]
&& !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD));
/* allow G_EXTINCT */
}
/* returns True if monster is drain-life resistant */
boolean
resists_drli(mon) /* returns TRUE if monster is drain-life resistant */
resists_drli(mon)
struct monst *mon;
{
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) ||
/* is_were() doesn't handle hero in human form */
(mon == &youmonst && u.ulycn >= LOW_PM)
|| ptr == &mons[PM_DEATH] || is_vampshifter(mon)
|| (wep && wep->oartifact && defends(AD_DRLI, wep)));
if (is_undead(ptr) || is_demon(ptr) || is_were(ptr)
/* is_were() doesn't handle hero in human form */
|| (mon == &youmonst && u.ulycn >= LOW_PM)
|| ptr == &mons[PM_DEATH] || is_vampshifter(mon))
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 permonst *ptr = mon->data;
@@ -121,7 +129,7 @@ struct monst *mon;
return FALSE;
}
/* TRUE iff monster is resistant to light-induced blindness */
/* True iff monster is resistant to light-induced blindness */
boolean
resists_blnd(mon)
struct monst *mon;
@@ -159,8 +167,8 @@ struct monst *mon;
return FALSE;
}
/* TRUE iff monster can be blinded by the given attack */
/* Note: may return TRUE when mdef is blind (e.g. new cream-pie 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) */
boolean
can_blnd(magr, mdef, aatyp, obj)
struct monst *magr; /* NULL == no specific aggressor */
@@ -248,7 +256,9 @@ struct obj *obj; /* aatyp == AT_WEAP, AT_SPIT */
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;
{
register int i, atyp;
@@ -267,39 +277,41 @@ struct permonst *ptr;
if ((atk_mask & (1L << atyp)) != 0L)
return TRUE;
}
return FALSE;
}
/* True if specific monster is especially affected by silver weapons */
boolean
mon_hates_silver(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
hates_silver(ptr)
register struct permonst *ptr;
{
return (boolean)(is_were(ptr) || ptr->mlet == S_VAMPIRE || is_demon(ptr)
|| ptr == &mons[PM_SHADE]
|| (ptr->mlet == S_IMP && ptr != &mons[PM_TENGU]));
return (boolean) (is_were(ptr) || ptr->mlet == S_VAMPIRE || is_demon(ptr)
|| ptr == &mons[PM_SHADE]
|| (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
passes_bars(mptr)
struct permonst *mptr;
{
return (boolean)(passes_walls(mptr) || amorphous(mptr) || unsolid(mptr)
|| is_whirly(mptr) || verysmall(mptr)
|| dmgtype(mptr, AD_CORR) || dmgtype(mptr, AD_RUST)
|| (slithy(mptr) && !bigmonst(mptr)));
return (boolean) (passes_walls(mptr) || amorphous(mptr) || unsolid(mptr)
|| is_whirly(mptr) || verysmall(mptr)
|| dmgtype(mptr, AD_CORR) || dmgtype(mptr, AD_RUST)
|| (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;
{
if ((is_silent(mtmp->data) || mtmp->data->msound == MS_BUZZ)
@@ -311,7 +323,9 @@ register struct monst *mtmp;
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 obj *mamul;
@@ -339,41 +353,54 @@ struct monst *mon;
|| ((mamul = which_armor(mon, W_AMUL)) != 0
&& (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;
{
if (uwep && uwep->oartifact == ART_EXCALIBUR)
return TRUE;
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;
{
return ((boolean)(is_whirly(ptr) || ptr->msize <= MZ_SMALL
|| noncorporeal(ptr)));
return (boolean) (is_whirly(ptr) || ptr->msize <= MZ_SMALL
|| noncorporeal(ptr));
}
boolean breakarm(ptr) /* creature will break out of armor */
/* creature will break out of armor */
boolean
breakarm(ptr)
register struct permonst *ptr;
{
return ((bigmonst(ptr) || (ptr->msize > MZ_SMALL && !humanoid(ptr)) ||
/* special cases of humanoids that cannot wear body armor */
ptr == &mons[PM_MARILITH] || ptr == &mons[PM_WINGED_GARGOYLE])
&& !sliparm(ptr));
if (sliparm(ptr))
return FALSE;
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;
{
return ((boolean)(dmgtype(ptr, AD_STCK) || dmgtype(ptr, AD_WRAP)
|| attacktype(ptr, AT_HUGS)));
return (boolean) (dmgtype(ptr, AD_STCK) || dmgtype(ptr, AD_WRAP)
|| attacktype(ptr, AT_HUGS));
}
/* some monster-types can't vomit */
boolean
cantvomit(ptr)
struct permonst *ptr;
@@ -408,6 +435,8 @@ struct permonst *ptr;
return 0;
}
/* does monster-type deal out a particular type of damage from a particular
type of attack? */
struct attack *
dmgtype_fromattack(ptr, dtyp, atyp)
struct permonst *ptr;
@@ -418,10 +447,10 @@ int dtyp, atyp;
for (a = &ptr->mattk[0]; a < &ptr->mattk[NATTK]; a++)
if (a->adtyp == dtyp && (atyp == AT_ANY || a->aatyp == atyp))
return a;
return (struct attack *) 0;
}
/* does monster-type deal out a particular type of damage from any attack */
boolean
dmgtype(ptr, dtyp)
struct permonst *ptr;
@@ -431,7 +460,7 @@ int dtyp;
}
/* returns the maximum damage a defender can do to the attacker via
* a passive defense */
a passive defense */
int
max_passive_dmg(mdef, magr)
register struct monst *mdef, *magr;
@@ -552,8 +581,8 @@ struct permonst *pm1, *pm2;
return (let2 == S_GHOST);
} else if (is_undead(pm2))
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) {
int m1 = monsndx(pm1), m2 = monsndx(pm2), prv, nxt;
@@ -575,6 +604,7 @@ struct permonst *pm1, *pm2;
|| pm2 == &mons[PM_WINGED_GARGOYLE]);
if (pm1 == &mons[PM_KILLER_BEE] || pm1 == &mons[PM_QUEEN_BEE])
return (pm2 == &mons[PM_KILLER_BEE] || pm2 == &mons[PM_QUEEN_BEE]);
if (is_longworm(pm1))
return is_longworm(pm2); /* handles tail */
/* [currently there's no reason to bother matching up
@@ -583,7 +613,9 @@ struct permonst *pm1, *pm2;
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;
{
register int i;
@@ -594,8 +626,7 @@ struct permonst *ptr;
fmt_ptr((genericptr_t) ptr));
return NON_PM; /* will not get here */
}
return (i);
return i;
}
/* for handling alternate spellings */
@@ -675,7 +706,7 @@ const char *in_str;
{ "invisible stalker", PM_STALKER },
{ "high-elf", PM_ELVENKING }, /* PM_HIGH_ELF is obsolete */
{ "halfling", PM_HOBBIT }, /* potential guess for polyself */
/* Hyphenated names */
/* Hyphenated names */
{ "ki rin", PM_KI_RIN },
{ "uruk hai", PM_URUK_HAI },
{ "orc captain", PM_ORC_CAPTAIN },
@@ -710,11 +741,13 @@ const char *in_str;
for (len = 0, i = LOW_PM; i < NUMMONS; i++) {
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 == slen) {
return i; /* exact match */
} 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)
|| !strcmpi(&str[m_i_len], "'")
|| !strncmpi(&str[m_i_len], "' ", 2)
@@ -834,8 +867,8 @@ register struct monst *mtmp;
return mtmp->female;
}
/* Like gender(), but lower animals and such are still "it". */
/* This is the one we want to use when printing messages. */
/* Like gender(), but lower animals and such are still "it".
This is the one we want to use when printing messages. */
int
pronoun_gender(mtmp)
register struct monst *mtmp;
@@ -843,9 +876,7 @@ register struct monst *mtmp;
if (is_neuter(mtmp->data) || !canspotmon(mtmp))
return 2;
return (humanoid(mtmp->data) || (mtmp->data->geno & G_UNIQ)
|| type_is_pname(mtmp->data))
? (int) mtmp->female
: 2;
|| type_is_pname(mtmp->data)) ? (int) mtmp->female : 2;
}
/* 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 */
if (mtmp->iswiz && mon_has_amulet(mtmp))
return FALSE;
/* some monsters will follow even while intending to flee from you */
if (mtmp->mtame || mtmp->iswiz || is_fshk(mtmp))
return TRUE;
/* stalking types follow, but won't when fleeing unless you hold
the Amulet */
return (boolean)((mtmp->data->mflags2 & M2_STALK)
&& (!mtmp->mflee || u.uhave.amulet));
return (boolean) ((mtmp->data->mflags2 & M2_STALK)
&& (!mtmp->mflee || u.uhave.amulet));
}
static const short grownups[][2] = {
@@ -947,29 +976,14 @@ int
little_to_big(montype)
int montype;
{
#ifndef AIXPS2_BUG
register int i;
for (i = 0; grownups[i][0] >= LOW_PM; i++)
if (montype == grownups[i][0])
return grownups[i][1];
if (montype == grownups[i][0]) {
montype = grownups[i][1];
break;
}
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
@@ -979,8 +993,10 @@ int montype;
register int i;
for (i = 0; grownups[i][0] >= LOW_PM; i++)
if (montype == grownups[i][1])
return grownups[i][0];
if (montype == grownups[i][1]) {
montype = grownups[i][0];
break;
}
return montype;
}
@@ -994,9 +1010,9 @@ raceptr(mtmp)
struct monst *mtmp;
{
if (mtmp == &youmonst && !Upolyd)
return (&mons[urace.malenum]);
return &mons[urace.malenum];
else
return (mtmp->data);
return mtmp->data;
}
static const char *levitate[4] = { "float", "Float", "wobble", "Wobble" };
@@ -1014,21 +1030,14 @@ const char *def;
{
int capitalize = (*def == highc(*def));
return (is_floater(ptr)
? levitate[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL)
? flys[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL)
? flyl[capitalize]
: slithy(ptr)
? slither[capitalize]
: amorphous(ptr)
? ooze[capitalize]
: !ptr->mmove
? immobile[capitalize]
: nolimbs(ptr)
? crawl[capitalize]
: def);
return (is_floater(ptr) ? levitate[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize]
: slithy(ptr) ? slither[capitalize]
: amorphous(ptr) ? ooze[capitalize]
: !ptr->mmove ? immobile[capitalize]
: nolimbs(ptr) ? crawl[capitalize]
: def);
}
const char *
@@ -1038,25 +1047,17 @@ const char *def;
{
int capitalize = 2 + (*def == highc(*def));
return (is_floater(ptr)
? levitate[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL)
? flys[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL)
? flyl[capitalize]
: slithy(ptr)
? slither[capitalize]
: amorphous(ptr)
? ooze[capitalize]
: !ptr->mmove
? immobile[capitalize]
: nolimbs(ptr)
? crawl[capitalize]
: def);
return (is_floater(ptr) ? levitate[capitalize]
: (is_flyer(ptr) && ptr->msize <= MZ_SMALL) ? flys[capitalize]
: (is_flyer(ptr) && ptr->msize > MZ_SMALL) ? flyl[capitalize]
: slithy(ptr) ? slither[capitalize]
: 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 *
on_fire(mptr, mattk)
struct permonst *mptr;
@@ -1098,8 +1099,8 @@ struct attack *mattk;
/*
* Returns:
* TRUE if monster is presumed to have a sense of smell.
* FALSE if monster definitely does not 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.
*
* Do not base this on presence of a head or nose, since many
* creatures sense smells other ways (feelers, forked-tongues, etc.)
@@ -1109,12 +1110,13 @@ boolean
olfaction(mdat)
struct permonst *mdat;
{
if (mdat && (is_golem(mdat) || mdat->mlet == S_EYE || /* spheres */
mdat->mlet == S_JELLY || mdat->mlet == S_PUDDING
|| mdat->mlet == S_BLOB || mdat->mlet == S_VORTEX
|| mdat->mlet == S_ELEMENTAL || mdat->mlet == S_FUNGUS
|| /* mushrooms and fungi */
mdat->mlet == S_LIGHT))
if (is_golem(mdat)
|| mdat->mlet == S_EYE /* spheres */
|| mdat->mlet == S_JELLY || mdat->mlet == S_PUDDING
|| mdat->mlet == S_BLOB || mdat->mlet == S_VORTEX
|| mdat->mlet == S_ELEMENTAL
|| mdat->mlet == S_FUNGUS /* mushrooms and fungi */
|| mdat->mlet == S_LIGHT)
return FALSE;
return TRUE;
}

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. */
/* 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
object rather than its general type; it formats the most basic info:
potion -- if description not known
brown potion -- if oc_name_known not set
potion of object detection -- if discovered
potion -- if description not known
brown potion -- if oc_name_known not set
potion of object detection -- if discovered
*/
static char *
minimal_xname(obj)
@@ -945,6 +945,14 @@ boolean with_price;
if (bimanual(obj))
hand_s = makeplural(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) {
@@ -991,6 +999,7 @@ boolean with_price;
quotedprice, currency(quotedprice));
} else if (with_price) {
long price = get_cost_of_shop_item(obj);
if (price > 0)
Sprintf(eos(bp), " (%ld %s)", price, currency(price));
}

View File

@@ -503,7 +503,6 @@ STATIC_OVL boolean FDECL(wc2_supported, (const char *));
STATIC_DCL void FDECL(remove_autopickup_exception,
(struct autopickup_exception *));
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 int NDECL(query_color);
STATIC_DCL int NDECL(query_msgtype);

View File

@@ -2688,27 +2688,59 @@ dotip()
/* check floor container(s) first; at most one will be accessed */
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.",
!flags.verbose ? "a container" : (boxes > 1) ? "one" : "it");
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,
doname, ansimpleoname, "container"));
if (c == 'q')
if (boxes > 1) {
/* use menu to pick a container to tip */
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;
if (c == 'n')
continue;
} else {
for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) {
nobj = cobj->nexthere;
if (!Is_container(cobj))
continue;
tipcontainer(cobj);
return 1;
} /* next cobj */
c = ynq(safe_qbuf(qbuf, "There is ", " here, tip it?", cobj,
doname, ansimpleoname, "container"));
if (c == 'q')
return 0;
if (c == 'n')
continue;
tipcontainer(cobj);
return 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. */
/* NetHack may be freely redistributed. See license for details. */
@@ -304,6 +304,14 @@ boolean talk;
if (Blind_telepat || Infravision)
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 */
if (can_see_now)
learn_unseen_invent();