From c980cf55e0d8dcf9b2dde57871641eea9c6daa08 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 2 Oct 2011 03:55:03 +0000 Subject: [PATCH] wishing for " of abilities" (trunk only) Wishing for "{gain,restore,sustain} abilities" works since makesingular() changes it to "* ability", but a post-3.4.3 change to makesingular() caused "potion(s) of {gain,restore} abilities" and "ring of sustain abilities" to fail to match the name, then yield a random potion or ring. If there turn out to be many other similar situations, makesingular()'s behavior for "foo(s) of bars" may need to revert. For now, handle "* of * abilities" as a special case. --- src/objnam.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/objnam.c b/src/objnam.c index 17ad4a719..7eec819e9 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -2145,6 +2145,16 @@ boolean retry_inverted; /* optional extra "of" handling */ releaseobuf(p); return fuzzymatch(buf, o_str, " -", TRUE); } + } else if (strstri(o_str, "ability")) { + /* when presented with "foo of bar", make singular() used to + singularize both foo & bar, but now only does so for foo */ + /* catch "{potion(s),ring} of {gain,restore,sustain} abilities" */ + if ((p = strstri(u_str, "abilities")) != 0 && + !*(p + sizeof "abilities" - 1)) { + (void)strncpy(buf, u_str, (unsigned)(p - u_str)); + Strcpy(buf + (p - u_str), "ability"); + return fuzzymatch(buf, o_str, " -", TRUE); + } } else if (!strcmp(o_str, "aluminum")) { /* this special case doesn't really fit anywhere else... */ /* (note that " wand" will have been stripped off by now) */ -- 2.40.0