disallow assigning type name to Amulet of Yendor

Something I noticed when testing the item-action handling for name and
call; applies to the C/#name command too.  You were allowed to call the
real Amulet something and allowed to call fake ones something [else].
If you did that, xname/doname didn't show it but the discoveries list
did, giving away information when the player had access to more than
one unID'd Amulet of Yendor.  Rather than messing about with discovery
handling, make real and fake Amulet be ineligible from being given a
type name.  (They can still be given individual names.)
This commit is contained in:
PatR
2022-04-19 14:19:48 -07:00
parent 5489b3ebd9
commit 49b046f2e5
3 changed files with 19 additions and 1 deletions

View File

@@ -882,6 +882,7 @@ putting objects into a container with menustyle=traditional and then taking
bit being set if sanity_check was On
when drinking or dipping, allow the 'm' prefix to be used to skip asking
about fountains and pools
calling real or fake Amulet something could give away information about them
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository

View File

@@ -1365,11 +1365,21 @@ objtyp_is_callable(int i)
return TRUE;
switch(objects[i].oc_class) {
case AMULET_CLASS:
/* 3.7: calling these used to be allowed but that enabled the
player to tell whether two unID'd amulets of yendor were both
fake or one was real by calling them distinct names and then
checking discoveries to see whether first name was replaced
by second or both names stuck; with more than two available
to work with, if they weren't all fake it was possible to
determine which one was the real one */
if (i == AMULET_OF_YENDOR || i == FAKE_AMULET_OF_YENDOR)
break; /* return FALSE */
/*FALLTHRU*/
case SCROLL_CLASS:
case POTION_CLASS:
case WAND_CLASS:
case RING_CLASS:
case AMULET_CLASS:
case GEM_CLASS:
case SPBOOK_CLASS:
case ARMOR_CLASS:

View File

@@ -1834,6 +1834,13 @@ silly_thing(const char *word,
!(is_plural(otmp) || pair_of(otmp)) ? "that" : "those", s3);
else
#endif
/* see comment about Amulet of Yendor in objtyp_is_callable(do_name.c);
known fakes yield the silly thing feedback */
if (!strcmp(word, "call")
&& (otmp->otyp == AMULET_OF_YENDOR
|| (otmp->otyp == FAKE_AMULET_OF_YENDOR && !otmp->known)))
pline_The("Amulet doesn't like being called names.");
else
pline(silly_thing_to, word);
}