From: Pasi Kallinen Date: Sun, 20 Feb 2022 20:05:30 +0000 (+0200) Subject: Illiterate hero will learn spells directly from deity X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a61602436308d4fc8156614051be0bed9337bfd;p=nethack Illiterate hero will learn spells directly from deity ... instead of receiving a spellbook. --- diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index bd3b26c62..35b33bd32 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -798,6 +798,8 @@ engraving with Fire Brand burns the text on the floor and does not make looting less tedious by getting rid of a y/n prompt making the command go directly into the loot-in-out -menu always give a message when monster changes form via polytrap if seen +illiterate hero receiving a spellbook from their deity gets the spell shoved + directly into their mind instead Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/extern.h b/include/extern.h index a8327b1bf..cb3432dea 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2538,6 +2538,7 @@ extern int dovspell(void); extern void initialspell(struct obj *); extern boolean known_spell(short); extern int spell_idx(short); +extern boolean force_learn_spell(short); /* ### steal.c ### */ diff --git a/src/pray.c b/src/pray.c index 9eb97f36a..11557abb6 100644 --- a/src/pray.c +++ b/src/pray.c @@ -1201,10 +1201,17 @@ pleased(aligntyp g_align) } otmp->otyp = rnd_class(g.bases[SPBOOK_CLASS], SPE_BLANK_PAPER); } - bless(otmp); - at_your_feet("A spellbook"); - place_object(otmp, u.ux, u.uy); - newsym(u.ux, u.uy); + if (!u.uconduct.literate && !known_spell(otmp->otyp)) { + if (force_learn_spell(otmp->otyp)) + pline("Divine knowledge of %s fills your mind!", + OBJ_NAME(objects[otmp->otyp])); + obfree(otmp, (struct obj *) 0); + } else { + bless(otmp); + at_your_feet("A spellbook"); + place_object(otmp, u.ux, u.uy); + newsym(u.ux, u.uy); + } break; } default: diff --git a/src/spell.c b/src/spell.c index 6f05278ae..457405d4c 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1947,4 +1947,27 @@ spell_idx(short otyp) return -1; } +/* forcibly learn spell otyp, if possible */ +boolean +force_learn_spell(short otyp) +{ + int i; + + if (known_spell(otyp)) + return FALSE; + + for (i = 0; i < MAXSPELL; i++) + if (spellid(i) == NO_SPELL) + break; + if (i == MAXSPELL) + impossible("Too many spells memorized"); + else { + g.spl_book[i].sp_id = otyp; + g.spl_book[i].sp_lev = objects[otyp].oc_level; + incrnknow(i, 1); + return TRUE; + } + return FALSE; +} + /*spell.c*/