Remove the conduct-specific aspect of receiving spells as prayer boon. Anyone now has a 25% chance of having the spell directly implanted into their head, not just characters who have maintained illiterate conduct. It can now also restore a forgotten spell or refresh one that is nearly forgotten. It still tries to choose a spell which isn't already known (new: or was known but has been forgotten) but if it picks one that is known and doesn't need refreshing, a redundant book will be given, same as the behavior in earlier versions. The chance for receiving a blank spellbook is higher when that item is undiscovered. When given as a prayer reward, make it become discovered even if hero doesn't read it so that it will be less likely to be given again. There's a 1% chance for that auto-discovery to happen with other bestowed books. Unlike blank boots, having the book be discovered doesn't lessen their chance of being repeat gifts. Minor bug fix: for a spell implanted from scratch, the book remains unknown. That's ok; it's actually more interesting than discovering a book you haven't seen yet. But after acquiring and reading the book you could get "you know <spell> quite well already" and the book would stay undiscovered even though you were just told what spell it's for.
39 lines
1.2 KiB
C
39 lines
1.2 KiB
C
/* NetHack 3.7 spell.h $NHDT-Date: 1646838388 2022/03/09 15:06:28 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.14 $ */
|
|
/* Copyright 1986, M. Stephenson */
|
|
/* NetHack may be freely redistributed. See license for details. */
|
|
|
|
#ifndef SPELL_H
|
|
#define SPELL_H
|
|
|
|
#define NO_SPELL 0
|
|
#define UNKNOWN_SPELL (-1)
|
|
|
|
/* spellbook re-use control; used when reading and when polymorphing */
|
|
#define MAX_SPELL_STUDY 3
|
|
|
|
struct spell {
|
|
short sp_id; /* spell id (== object.otyp) */
|
|
xchar sp_lev; /* power level */
|
|
int sp_know; /* knowlege of spell */
|
|
};
|
|
|
|
enum spellknowledge {
|
|
spe_Forgotten = -1, /* known but no longer castable */
|
|
spe_Unknown = 0, /* not yet known */
|
|
spe_Fresh = 1, /* castable if various casting criteria are met */
|
|
spe_GoingStale = 2 /* still castable but nearly forgotten */
|
|
};
|
|
|
|
/* levels of memory destruction with a scroll of amnesia */
|
|
#define ALL_MAP 0x1
|
|
#define ALL_SPELLS 0x2
|
|
|
|
#define decrnknow(spell) g.spl_book[spell].sp_know--
|
|
#define spellid(spell) g.spl_book[spell].sp_id
|
|
#define spellknow(spell) g.spl_book[spell].sp_know
|
|
|
|
/* how much Pw a spell of level lvl costs to cast? */
|
|
#define SPELL_LEV_PW(lvl) ((lvl) * 5)
|
|
|
|
#endif /* SPELL_H */
|