From b2aea3e9d733e28aaaf4a3db75fa05c9c04fc691 Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 11 Oct 2015 19:39:23 -0700 Subject: [PATCH] wishing for novels Make novels be wishable in normal and explore modes in addition to wizard mode. I don't think this weakens the tribute and it prevents someone who attempts such a wish from getting misleading feedback of "Nothing fitting that description exists in the game." Wishing for "novel" will yield "novel named Foo" where "Foo" is a randomly chosen Discworld title. Wishing for "novel named Bar" will yield "novel named Bar" or "novel named The Bar" if "Bar" or "The Bar" is a valid Discworld title, or else override "Bar" and pick random Discworld "novel named Foo" if it isn't. Since first read of a novel bestows some experience (once per game, no matter how many novels become available), a pacifist with an early wish can get a head start. I don't think that's a big deal. And it will require an awful lot of wishes for any player who wants to acquire all 41 titles in one game. I imagine someone will manage it. --- src/do_name.c | 14 +++++++++----- src/mkobj.c | 11 +++++------ src/objects.c | 4 ++-- src/objnam.c | 44 +++++++++++++++----------------------------- 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/src/do_name.c b/src/do_name.c index 4eb178ddc..8697f39ee 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 do_name.c $NHDT-Date: 1432937666 2015/05/29 22:14:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.74 $ */ +/* NetHack 3.6 do_name.c $NHDT-Date: 1444617209 2015/10/12 02:33:29 $ $NHDT-Branch: master $:$NHDT-Revision: 1.75 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1299,13 +1299,13 @@ const char * noveltitle(novidx) int *novidx; { - int j, k = SIZE(sir_Terry_novels) - 1; + int j, k = SIZE(sir_Terry_novels); j = rn2(k); if (novidx) { if (*novidx == -1) *novidx = j; - else if ((*novidx >= 0) && (*novidx <= k)) + else if (*novidx >= 0 && *novidx < k) j = *novidx; } return sir_Terry_novels[j]; @@ -1319,16 +1319,20 @@ int *idx; int k; /* Take American or U.K. spelling of this one */ - if (strcmpi(lookname, "The Color of Magic") == 0) + if (!strcmpi(The(lookname), "The Color of Magic")) lookname = sir_Terry_novels[0]; for (k = 0; k < SIZE(sir_Terry_novels); ++k) { - if (strcmpi(lookname, sir_Terry_novels[k]) == 0) { + if (!strcmpi(lookname, sir_Terry_novels[k]) + || !strcmpi(The(lookname), sir_Terry_novels[k])) { if (idx) *idx = k; return sir_Terry_novels[k]; } } + /* name not found; if novelidx is already set, override the name */ + if (idx && *idx >= 0 && *idx < SIZE(sir_Terry_novels)) + return sir_Terry_novels[*idx]; return (const char *) 0; } diff --git a/src/mkobj.c b/src/mkobj.c index 321ea7212..7c9e0be5d 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 mkobj.c $NHDT-Date: 1444094263 2015/10/06 01:17:43 $ $NHDT-Branch: master $:$NHDT-Revision: 1.105 $ */ +/* NetHack 3.6 mkobj.c $NHDT-Date: 1444617220 2015/10/12 02:33:40 $ $NHDT-Branch: master $:$NHDT-Revision: 1.110 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -939,11 +939,10 @@ boolean artif; /* case TIN: */ set_corpsenm(otmp, otmp->corpsenm); break; - case SPE_NOVEL: { - int novidx = -1; - otmp = oname(otmp, noveltitle(&novidx)); - otmp->novelidx = novidx; - } break; + case SPE_NOVEL: + otmp->novelidx = -1; /* "none of the above"; will be changed */ + otmp = oname(otmp, noveltitle(&otmp->novelidx)); + break; } /* unique objects may have an associated artifact entry */ diff --git a/src/objects.c b/src/objects.c index 11f1978bd..aa8c26de8 100644 --- a/src/objects.c +++ b/src/objects.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 objects.c $NHDT-Date: 1436052459 2015/07/04 23:27:39 $ $NHDT-Branch: master $:$NHDT-Revision: 1.43 $ */ +/* NetHack 3.6 objects.c $NHDT-Date: 1444617222 2015/10/12 02:33:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.46 $ */ /* Copyright (c) Mike Threepoint, 1989. */ /* NetHack may be freely redistributed. See license for details. */ @@ -977,7 +977,7 @@ SPELL("freeze sphere", "hardcover", SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER), /* tribute book for 3.6 */ OBJECT(OBJ("novel", "paperback"), - BITS(0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, P_NONE, HI_PAPER), + BITS(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, P_NONE, HI_PAPER), 0, SPBOOK_CLASS, 0, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE), /* a special, one of a kind, spellbook */ OBJECT(OBJ("Book of the Dead", "papyrus"), diff --git a/src/objnam.c b/src/objnam.c index d13d9721b..6fa6a1d37 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 objnam.c $NHDT-Date: 1433058272 2015/05/31 07:44:32 $ $NHDT-Branch: master $:$NHDT-Revision: 1.141 $ */ +/* NetHack 3.6 objnam.c $NHDT-Date: 1444617222 2015/10/12 02:33:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.143 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2568,12 +2568,10 @@ struct obj *no_wish; } } /* - otmp->spe is type schar; so we don't want spe to be any bigger or - smaller. - also, spe should always be positive -- some cheaters may try to - confuse - atoi() - */ + * otmp->spe is type schar, so we don't want spe to be any bigger or + * smaller. Also, spe should always be positive --some cheaters may + * try to confuse atoi(). + */ if (spe < 0) { spesgn = -1; /* cheaters get what they deserve */ spe = abs(spe); @@ -2584,14 +2582,14 @@ struct obj *no_wish; rechrg = 7; /* recharge_limit */ /* now we have the actual name, as delivered by xname, say - green potions called whisky - scrolls labeled "QWERTY" - egg - fortune cookies - very heavy iron ball named hoei - wand of wishing - elven cloak - */ + * green potions called whisky + * scrolls labeled "QWERTY" + * egg + * fortune cookies + * very heavy iron ball named hoei + * wand of wishing + * elven cloak + */ if ((p = strstri(bp, " named ")) != 0) { *p = 0; name = p + 7; @@ -3216,15 +3214,6 @@ typfnd: } } - if (typ && wizard) { - if (typ == SPE_NOVEL) { - if (name && !lookup_novel(name, (int *) 0)) { - pline("There's no novel by that name."); - return ((struct obj *) 0); - } - } - } - /* * Create the object, then fine-tune it. */ @@ -3433,14 +3422,11 @@ typfnd: /* 3.6.0 tribute - fix up novel */ if (otmp->otyp == SPE_NOVEL) { - int novidx = 0; const char *novelname; - novelname = lookup_novel(name, &novidx); - if (novelname) { - otmp->novelidx = novidx; + novelname = lookup_novel(name, &otmp->novelidx); + if (novelname) name = novelname; - } } otmp = oname(otmp, name);