randonly occurring Discworld novels

Give 'novel' a 1 in 1000 chance of being created in place of each
random spellbook (except for hero's initial inventory and NPC
priests' monster inventory and divine reward for prayer--those all
force regular spellbooks; statue contents aren't among the
exceptions--those books can now be novels).  Shop inventory (where
first book or scroll shop created is guaranteed one novel) hasn't
been touched.  If there is any other special spellbook handling
somewhere, I've overlooked it.
This commit is contained in:
PatR
2020-01-12 11:00:38 -08:00
parent 92970bfffc
commit caaf1b375a
6 changed files with 26 additions and 14 deletions

View File

@@ -1,4 +1,4 @@
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.63 $ $NHDT-Date: 1578834315 2020/01/12 13:05:15 $
$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.64 $ $NHDT-Date: 1578855619 2020/01/12 19:00:19 $
General Fixes and Modified Features
-----------------------------------
@@ -106,6 +106,10 @@ applying a spellbook hints about read charges left
wizard mode wishing for level topology can now create hidden doors (ask for
"secret door" when at a door or wall location) and hidden corridor
spots ("secret corridor" at a corridor location)
tiny chance for randomly created spellbooks to be Discworld novels instead
of having only one in the first book or scroll shop created (won't
occur in hero's initial inventory or NPC priest inventory or be
bestowed as a prayer boon; might occur inside statues)
Platform- and/or Interface-Specific New Features

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 mkobj.c $NHDT-Date: 1571531889 2019/10/20 00:38:09 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.157 $ */
/* NetHack 3.6 mkobj.c $NHDT-Date: 1578855620 2020/01/12 19:00:20 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.173 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Derek S. Ray, 2015. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1054,6 +1054,7 @@ boolean artif;
case STATUE:
/* possibly overridden by mkcorpstat() */
otmp->corpsenm = rndmonnum();
/* note: might produce a novel rather than a spellbook */
if (!verysmall(&mons[otmp->corpsenm])
&& rn2(level_difficulty() / 2 + 10) > 10)
(void) add_to_container(otmp, mkobj(SPBOOK_CLASS, FALSE));

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 objects.c $NHDT-Date: 1577184069 2019/12/24 10:41:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.59 $ */
/* NetHack 3.6 objects.c $NHDT-Date: 1578855624 2020/01/12 19:00:24 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.61 $ */
/* Copyright (c) Mike Threepoint, 1989. */
/* NetHack may be freely redistributed. See license for details. */
@@ -918,7 +918,7 @@ SPELL("fireball", "ragged",
SPELL("cone of cold", "dog eared",
P_ATTACK_SPELL, 10, 7, 4, 1, RAY, HI_PAPER),
SPELL("sleep", "mottled",
P_ENCHANTMENT_SPELL, 50, 1, 1, 1, RAY, HI_PAPER),
P_ENCHANTMENT_SPELL, 49, 1, 1, 1, RAY, HI_PAPER),
SPELL("finger of death", "stained",
P_ATTACK_SPELL, 5, 10, 7, 1, RAY, HI_PAPER),
SPELL("light", "cloth",
@@ -1003,7 +1003,7 @@ 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, 0, 0, 0, 0, P_NONE, PAPER),
0, SPBOOK_CLASS, 0, 0, 0, 20, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
0, SPBOOK_CLASS, 1, 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"),
BITS(0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, P_NONE, PAPER),

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 pray.c $NHDT-Date: 1575830189 2019/12/08 18:36:29 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.134 $ */
/* NetHack 3.6 pray.c $NHDT-Date: 1578855625 2020/01/12 19:00:25 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.137 $ */
/* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1181,10 +1181,13 @@ aligntyp g_align;
struct obj *otmp;
int sp_no, trycnt = u.ulevel + 1;
/* not yet known spells given preference over already known ones
*/
/* Also, try to grant a spell for which there is a skill slot */
otmp = mkobj(SPBOOK_CLASS, TRUE);
/* not yet known spells given preference over already known ones;
also, try to grant a spell for which there is a skill slot;
make sure that it's a spellbook and not a novel */
/* otmp = mkobj(SPBOOK_CLASS, TRUE); --might yield NOVEL */
otmp = mksobj(rnd_class(g.bases[SPBOOK_CLASS],
SPE_BLANK_PAPER),
TRUE, FALSE);
while (--trycnt > 0) {
if (otmp->otyp != SPE_BLANK_PAPER) {
for (sp_no = 0; sp_no < MAXSPELL; sp_no++)

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 priest.c $NHDT-Date: 1545131519 2018/12/18 11:11:59 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.45 $ */
/* NetHack 3.6 priest.c $NHDT-Date: 1578855626 2020/01/12 19:00:26 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.56 $ */
/* Copyright (c) Izchak Miller, Steve Linhart, 1989. */
/* NetHack may be freely redistributed. See license for details. */
@@ -258,7 +258,10 @@ boolean sanctum; /* is it the seat of the high priest? */
}
/* 2 to 4 spellbooks */
for (cnt = rn1(3, 2); cnt > 0; --cnt) {
(void) mpickobj(priest, mkobj(SPBOOK_CLASS, FALSE));
/* avoid novel (used to be mkobj(SPBOOK_CLASS, FALSE) here) */
(void) mpickobj(priest, mksobj(rnd_class(g.bases[SPBOOK_CLASS],
SPE_BLANK_PAPER),
TRUE, FALSE));
}
/* robe [via makemon()] */
if (rn2(2) && (otmp = which_armor(priest, W_ARMC)) != 0) {

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 u_init.c $NHDT-Date: 1575245094 2019/12/02 00:04:54 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.60 $ */
/* NetHack 3.6 u_init.c $NHDT-Date: 1578855627 2020/01/12 19:00:27 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.67 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2017. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1016,7 +1016,8 @@ register struct trobj *trop;
spells in restricted skill categories */
|| (obj->oclass == SPBOOK_CLASS
&& (objects[otyp].oc_level > 3
|| restricted_spell_discipline(otyp)))) {
|| restricted_spell_discipline(otyp)))
|| otyp == SPE_NOVEL) {
dealloc_obj(obj);
obj = mkobj(trop->trclass, FALSE);
otyp = obj->otyp;