From: PatR Date: Tue, 19 Apr 2022 21:19:48 +0000 (-0700) Subject: disallow assigning type name to Amulet of Yendor X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=49b046f2e5c212bf1e8457b813b22b4fb9faad3e;p=nethack 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.) --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 82f04195b..3ff27b35a 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -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 diff --git a/src/do_name.c b/src/do_name.c index 66f124ae3..d44d50512 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -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: diff --git a/src/invent.c b/src/invent.c index 48f8e0490..954c0792f 100644 --- a/src/invent.c +++ b/src/invent.c @@ -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); }