more wishing for Amulet of Yendor
Make wish for "amulet of yendor" be the same as "real amulet of yendor" instead of preserving the 3.6.x behavior of having a 50% chance of it yielding "fake amulet of yendor". Both the "real" and "fake" prefixes are still accepted, but "real" has become a no-op: !real and fake, real and fake => fake real and !fake, !real and !fake => real so fake vs !fake always decides the result.
This commit is contained in:
35
src/objnam.c
35
src/objnam.c
@@ -1,4 +1,4 @@
|
|||||||
/* NetHack 3.7 objnam.c $NHDT-Date: 1578400811 2020/01/07 12:40:11 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.282 $ */
|
/* NetHack 3.7 objnam.c $NHDT-Date: 1578532901 2020/01/09 01:21:41 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.284 $ */
|
||||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||||
/*-Copyright (c) Robert Patrick Rankin, 2011. */
|
/*-Copyright (c) Robert Patrick Rankin, 2011. */
|
||||||
/* NetHack may be freely redistributed. See license for details. */
|
/* NetHack may be freely redistributed. See license for details. */
|
||||||
@@ -928,7 +928,7 @@ unsigned doname_flags;
|
|||||||
vague_quan = (doname_flags & DONAME_VAGUE_QUAN) != 0;
|
vague_quan = (doname_flags & DONAME_VAGUE_QUAN) != 0;
|
||||||
boolean known, dknown, cknown, bknown, lknown;
|
boolean known, dknown, cknown, bknown, lknown;
|
||||||
int omndx = obj->corpsenm;
|
int omndx = obj->corpsenm;
|
||||||
char prefix[PREFIX], globbuf[QBUFSZ];
|
char prefix[PREFIX];
|
||||||
char tmpbuf[PREFIX + 1]; /* for when we have to add something at
|
char tmpbuf[PREFIX + 1]; /* for when we have to add something at
|
||||||
the start of prefix instead of the
|
the start of prefix instead of the
|
||||||
end (Strcat is used on the end) */
|
end (Strcat is used on the end) */
|
||||||
@@ -3142,7 +3142,9 @@ struct obj *no_wish;
|
|||||||
* (so will "real amulet" outside of wizard mode) */
|
* (so will "real amulet" outside of wizard mode) */
|
||||||
} else if (!strncmpi(bp, "fake ", l = 5)) {
|
} else if (!strncmpi(bp, "fake ", l = 5)) {
|
||||||
/* ... and "fake Amulet of Yendor" likewise */
|
/* ... and "fake Amulet of Yendor" likewise */
|
||||||
fake = 1; /* doesn't matter whether 'real' is negated here */
|
fake = 1, real = 0;
|
||||||
|
/* ['real' isn't actually needed (unless we someday add
|
||||||
|
"real gem" for random non-glass, non-stone)] */
|
||||||
} else
|
} else
|
||||||
break;
|
break;
|
||||||
bp += l;
|
bp += l;
|
||||||
@@ -3239,18 +3241,21 @@ struct obj *no_wish;
|
|||||||
*p = 0;
|
*p = 0;
|
||||||
contents = SPINACH;
|
contents = SPINACH;
|
||||||
}
|
}
|
||||||
/* this is only useful for wizard mode but we'll accept its parsing
|
/* real vs fake is only useful for wizard mode but we'll accept its
|
||||||
in normal play (result is never the real Amulet for that case) */
|
parsing in normal play (result is never real Amulet for that case) */
|
||||||
if ((p = strstri(bp, OBJ_DESCR(objects[AMULET_OF_YENDOR]))) != 0
|
if ((p = strstri(bp, OBJ_DESCR(objects[AMULET_OF_YENDOR]))) != 0
|
||||||
&& (p == bp || p[-1] == ' ')) {
|
&& (p == bp || p[-1] == ' ')) {
|
||||||
char *s = bp;
|
char *s = bp;
|
||||||
|
|
||||||
/* "Amulet of Yendor" matches two items; disambiguate via "real"
|
/* "Amulet of Yendor" matches two items, name of real Amulet
|
||||||
or "fake" prefix (parsed above so that both "blessed real"
|
and description of fake one; player can explicitly specify
|
||||||
and "real blessed" work); also accept partial specification of
|
"real" to disambiguate, but not specifying "fake" achieves
|
||||||
the full name of the fake; unlike the prefix recognition loop
|
the same thing; "real" and "fake" are parsed above with other
|
||||||
above, these have to be in the right order when more than one
|
prefixes so that combinations like "blessed real" and "real
|
||||||
is present (similar to glass gems below) */
|
blessed" work as expected; also accept partial specification
|
||||||
|
of the full name of the fake; unlike the prefix recognition
|
||||||
|
loop above, these have to be in the right order when more
|
||||||
|
than one is present (similar to worthless glass gems below) */
|
||||||
if (!strncmpi(s, "cheap ", 6))
|
if (!strncmpi(s, "cheap ", 6))
|
||||||
fake = 1, s += 6;
|
fake = 1, s += 6;
|
||||||
if (!strncmpi(s, "plastic ", 8))
|
if (!strncmpi(s, "plastic ", 8))
|
||||||
@@ -3258,11 +3263,9 @@ struct obj *no_wish;
|
|||||||
if (!strncmpi(s, "imitation ", 10))
|
if (!strncmpi(s, "imitation ", 10))
|
||||||
fake = 1, s += 10;
|
fake = 1, s += 10;
|
||||||
nhUse(s); /* suppress potential assigned-but-not-used complaint */
|
nhUse(s); /* suppress potential assigned-but-not-used complaint */
|
||||||
/* '(!real && !fake)' is the default, so 50:50 chance for either */
|
/* when 'fake' is True, it overrides 'real' if both were given;
|
||||||
if (real && fake)
|
when it is False, force 'real' whether that was specified or not */
|
||||||
real = 0;
|
real = !fake;
|
||||||
else if (!real && !fake && !rn2(2))
|
|
||||||
real = 1;
|
|
||||||
typ = real ? AMULET_OF_YENDOR : FAKE_AMULET_OF_YENDOR;
|
typ = real ? AMULET_OF_YENDOR : FAKE_AMULET_OF_YENDOR;
|
||||||
goto typfnd;
|
goto typfnd;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user