diff options
Diffstat (limited to 'stone_soup/crawl-ref/source/spl-book.cc')
-rw-r--r-- | stone_soup/crawl-ref/source/spl-book.cc | 1597 |
1 files changed, 0 insertions, 1597 deletions
diff --git a/stone_soup/crawl-ref/source/spl-book.cc b/stone_soup/crawl-ref/source/spl-book.cc deleted file mode 100644 index 302afdab4c..0000000000 --- a/stone_soup/crawl-ref/source/spl-book.cc +++ /dev/null @@ -1,1597 +0,0 @@ -/* - * File: spl-book.cc - * Summary: Spellbook/Staff contents array and management functions - * Written by: Josh Fishman - * - * Change History (most recent first): - * - * 24jun2000 jmf Changes to many books; addition of Assassinations; - * alteration of type-printout to match new bitfield. - * <1> 19mar2000 jmf Created by taking stuff from dungeon.cc, spells0.cc, - * spells.cc, shopping.cc - */ - -#include "AppHdr.h" -#include "spl-book.h" - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#ifdef DOS -#include <conio.h> -#endif - -#include "externs.h" - -#include "debug.h" -#include "delay.h" -#include "food.h" -#include "invent.h" -#include "itemname.h" -#include "itemprop.h" -#include "items.h" -#include "it_use3.h" -#include "player.h" -#include "religion.h" -#include "spl-cast.h" -#include "spl-util.h" -#include "stuff.h" - -static int spellbook_template_array[NUMBER_SPELLBOOKS][SPELLBOOK_SIZE] = -{ - // 0 - Minor Magic I - {0, - SPELL_MAGIC_DART, - SPELL_SUMMON_SMALL_MAMMAL, - SPELL_THROW_FLAME, - SPELL_BLINK, - SPELL_SLOW, - SPELL_MEPHITIC_CLOUD, - SPELL_CONJURE_FLAME, - SPELL_NO_SPELL, - }, - // 1 - Minor Magic II - {0, - SPELL_MAGIC_DART, - SPELL_THROW_FROST, - SPELL_BLINK, - SPELL_STICKS_TO_SNAKES, - SPELL_SLOW, - SPELL_MEPHITIC_CLOUD, - SPELL_OZOCUBUS_ARMOUR, - SPELL_NO_SPELL, - }, - // 2 - Minor Magic III - {0, - SPELL_MAGIC_DART, - SPELL_SUMMON_SMALL_MAMMAL, - SPELL_BLINK, - SPELL_REPEL_MISSILES, - SPELL_SLOW, - SPELL_SUMMON_LARGE_MAMMAL, - SPELL_MEPHITIC_CLOUD, - SPELL_NO_SPELL, - }, - // 3 - Book of Conjurations I - Fire and Earth - {0, - SPELL_MAGIC_DART, - SPELL_THROW_FLAME, - SPELL_STONE_ARROW, - SPELL_CONJURE_FLAME, - SPELL_BOLT_OF_MAGMA, - SPELL_FIREBALL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 4 - Book of Conjurations II - Air and Ice - {0, - SPELL_MAGIC_DART, - SPELL_THROW_FROST, - SPELL_MEPHITIC_CLOUD, - SPELL_DISCHARGE, - SPELL_BOLT_OF_COLD, - SPELL_FREEZING_CLOUD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 5 - Book of Flames - {0, - SPELL_FLAME_TONGUE, - SPELL_THROW_FLAME, - SPELL_CONJURE_FLAME, - SPELL_STICKY_FLAME, - SPELL_BOLT_OF_FIRE, - SPELL_FIREBALL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 6 - Book of Frost - {0, - SPELL_FREEZE, - SPELL_THROW_FROST, - SPELL_OZOCUBUS_ARMOUR, - SPELL_ICE_BOLT, - SPELL_SUMMON_ICE_BEAST, - SPELL_FREEZING_CLOUD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 7 - Book of Summonings - {0, - SPELL_ABJURATION_I, - SPELL_RECALL, - SPELL_SUMMON_LARGE_MAMMAL, - SPELL_SHADOW_CREATURES, - SPELL_SUMMON_WRAITHS, - SPELL_SUMMON_HORRIBLE_THINGS, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 8 - Book of Fire - {0, - SPELL_EVAPORATE, - SPELL_FIRE_BRAND, - SPELL_SUMMON_ELEMENTAL, - SPELL_BOLT_OF_MAGMA, - SPELL_DELAYED_FIREBALL, - SPELL_IGNITE_POISON, - SPELL_RING_OF_FLAMES, - SPELL_NO_SPELL, - }, - // 9 - Book of Ice - {0, - SPELL_FREEZING_AURA, - SPELL_SLEEP, - SPELL_CONDENSATION_SHIELD, - SPELL_BOLT_OF_COLD, - SPELL_OZOCUBUS_REFRIGERATION, - SPELL_SIMULACRUM, - SPELL_MASS_SLEEP, - SPELL_NO_SPELL, - }, - - // 10 - Book of Surveyances - {0, - SPELL_DETECT_SECRET_DOORS, - SPELL_DETECT_TRAPS, - SPELL_DETECT_ITEMS, - SPELL_MAGIC_MAPPING, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL - }, - // 11 - Book of Spatial Translocations - {0, - SPELL_APPORTATION, - SPELL_BLINK, - SPELL_RECALL, - SPELL_TELEPORT_OTHER, - SPELL_TELEPORT_SELF, - SPELL_CONTROL_TELEPORT, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 12 - Book of Enchantments (fourth one) - {0, - SPELL_LEVITATION, - SPELL_SELECTIVE_AMNESIA, - SPELL_REMOVE_CURSE, - SPELL_CAUSE_FEAR, - SPELL_EXTENSION, - SPELL_DEFLECT_MISSILES, - SPELL_HASTE, - SPELL_NO_SPELL, - }, - // 13 - Young Poisoner's Handbook - {0, - SPELL_STING, - SPELL_CURE_POISON_II, - SPELL_MEPHITIC_CLOUD, - SPELL_POISON_WEAPON, - SPELL_VENOM_BOLT, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 14 - Book of the Tempests - {0, - SPELL_DISCHARGE, - SPELL_LIGHTNING_BOLT, - SPELL_FIREBALL, - SPELL_SHATTER, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 15 - Book of Death - {0, - SPELL_CORPSE_ROT, - SPELL_BONE_SHARDS, - SPELL_LETHAL_INFUSION, - SPELL_AGONY, - SPELL_BOLT_OF_DRAINING, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 16 - Book of Hinderance - {0, - SPELL_CONFUSING_TOUCH, - SPELL_SLOW, - SPELL_CONFUSE, - SPELL_PARALYZE, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 17 - Book of Changes - {0, - SPELL_FULSOME_DISTILLATION, - SPELL_STICKS_TO_SNAKES, - SPELL_EVAPORATE, - SPELL_SPIDER_FORM, - SPELL_ICE_FORM, - SPELL_DIG, - SPELL_BLADE_HANDS, - SPELL_NO_SPELL, - }, - // 18 - Book of Transfigurations - {0, - SPELL_SANDBLAST, - SPELL_POLYMORPH_OTHER, - SPELL_STATUE_FORM, - SPELL_ALTER_SELF, - SPELL_DRAGON_FORM, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 19 - Book of Practical Magic - {0, - SPELL_PROJECTED_NOISE, - SPELL_SELECTIVE_AMNESIA, - SPELL_DETECT_CURSE, - SPELL_DIG, - SPELL_REMOVE_CURSE, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 20 - Book of War Chants - {0, - SPELL_FIRE_BRAND, - SPELL_FREEZING_AURA, - SPELL_REPEL_MISSILES, - SPELL_BERSERKER_RAGE, - SPELL_REGENERATION, - SPELL_HASTE, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 21 - Book of Clouds - {0, - SPELL_EVAPORATE, - SPELL_MEPHITIC_CLOUD, - SPELL_CONJURE_FLAME, - SPELL_POISONOUS_CLOUD, - SPELL_FREEZING_CLOUD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 22 - Book of Healing - {0, - SPELL_CURE_POISON_I, - SPELL_LESSER_HEALING, - SPELL_GREATER_HEALING, - SPELL_PURIFICATION, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 23 - Book of Necromancy - {0, - SPELL_PAIN, - SPELL_ANIMATE_SKELETON, - SPELL_VAMPIRIC_DRAINING, - SPELL_REGENERATION, - SPELL_DISPEL_UNDEAD, - SPELL_ANIMATE_DEAD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 24 - Necronomicon -- Kikubaaqudgha special - {0, - SPELL_SYMBOL_OF_TORMENT, - SPELL_CONTROL_UNDEAD, - SPELL_SUMMON_WRAITHS, - SPELL_DEATHS_DOOR, - SPELL_NECROMUTATION, - SPELL_DEATH_CHANNEL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 25 - Book of Callings - {0, - SPELL_SUMMON_SMALL_MAMMAL, - SPELL_STICKS_TO_SNAKES, - SPELL_CALL_IMP, - SPELL_SUMMON_ELEMENTAL, - SPELL_SUMMON_SCORPIONS, - SPELL_SUMMON_ICE_BEAST, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 26 - Book of Charms - {0, - SPELL_BACKLIGHT, - SPELL_REPEL_MISSILES, - SPELL_SLEEP, - SPELL_CONFUSE, - SPELL_ENSLAVEMENT, - SPELL_SILENCE, - SPELL_INVISIBILITY, - SPELL_NO_SPELL, - }, - // 27 - Book of Demonology -- Vehumet special - {0, - SPELL_ABJURATION_I, - SPELL_RECALL, - SPELL_CALL_IMP, - SPELL_SUMMON_DEMON, - SPELL_DEMONIC_HORDE, - SPELL_SUMMON_GREATER_DEMON, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 28 - Book of Air - {0, - SPELL_SHOCK, - SPELL_SWIFTNESS, - SPELL_REPEL_MISSILES, - SPELL_LEVITATION, - SPELL_MEPHITIC_CLOUD, - SPELL_DISCHARGE, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // Removing Air Walk... it's currently broken in a number or ways: - // - the AC/EV bonus probably means very little to any character - // capable of casting a level nine spell - // - the penalty of dropping inventory is a bit harsh considering - // the above - // - the fire/ice susceptibility doesn't work... the AC/EV bonus - // cancel it out (so you'd hardly be wary of them since they - // can't really do any damage). - // - there is no need for another invulnerability spell (which is - // what this spell is trying to be), one is more than enough... - // let people use necromancy. - // - there is no need for another air spell... air spells are - // already very common (ie. this level nine spell occured in - // two books!) - - // 29 - Book of the Sky - {0, - SPELL_SUMMON_ELEMENTAL, - SPELL_INSULATION, - SPELL_AIRSTRIKE, - SPELL_FLY, - SPELL_SILENCE, - SPELL_DEFLECT_MISSILES, - SPELL_LIGHTNING_BOLT, - SPELL_CONJURE_BALL_LIGHTNING, - }, - - // 30 - Book of Divinations - {0, - SPELL_DETECT_SECRET_DOORS, - SPELL_DETECT_CREATURES, - SPELL_DETECT_ITEMS, - SPELL_DETECT_CURSE, - SPELL_SEE_INVISIBLE, - SPELL_FORESCRY, - SPELL_IDENTIFY, - SPELL_NO_SPELL, - }, - // 31 - Book of the Warp - {0, - SPELL_BANISHMENT, - SPELL_WARP_BRAND, - SPELL_DISPERSAL, - SPELL_PORTAL, - SPELL_CONTROLLED_BLINK, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 32 - Book of Envenomations - {0, - SPELL_SPIDER_FORM, - SPELL_POISON_AMMUNITION, - SPELL_SUMMON_SCORPIONS, - SPELL_RESIST_POISON, - SPELL_OLGREBS_TOXIC_RADIANCE, - SPELL_POISONOUS_CLOUD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 33 - Book of Annihilations -- Vehumet special - {0, - SPELL_ISKENDERUNS_MYSTIC_BLAST, - SPELL_POISON_ARROW, - SPELL_CHAIN_LIGHTNING, - SPELL_LEHUDIBS_CRYSTAL_SPEAR, - SPELL_ICE_STORM, - SPELL_FIRE_STORM, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 34 - Book of Unlife - {0, - SPELL_SUBLIMATION_OF_BLOOD, - SPELL_ANIMATE_DEAD, - SPELL_TWISTED_RESURRECTION, - SPELL_BORGNJORS_REVIVIFICATION, - SPELL_SIMULACRUM, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 35 - Tome of Destruction - {0, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 36 - Book of Control - {0, - SPELL_ENSLAVEMENT, - SPELL_TAME_BEASTS, - SPELL_MASS_CONFUSION, - SPELL_CONTROL_UNDEAD, - SPELL_CONTROL_TELEPORT, - SPELL_MASS_SLEEP, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 37 - Book of Mutations //jmf: now Morphology - {0, - SPELL_FRAGMENTATION, - SPELL_POLYMORPH_OTHER, - SPELL_ALTER_SELF, - SPELL_CIGOTUVIS_DEGENERATION, - // SPELL_IGNITE_POISON, // moved to Fire which was a bit slim -- bwr - SPELL_SHATTER, - // SPELL_AIR_WALK, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 38 - Book of Tukima - {0, - SPELL_SURE_BLADE, - SPELL_TUKIMAS_VORPAL_BLADE, - SPELL_TUKIMAS_DANCE, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 39 - Book of Geomancy - {0, - SPELL_SANDBLAST, - SPELL_STONESKIN, - SPELL_PASSWALL, - SPELL_STONE_ARROW, - SPELL_SUMMON_ELEMENTAL, - SPELL_FRAGMENTATION, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 40 - Book of Earth - {0, - // SPELL_MAXWELLS_SILVER_HAMMER, - SPELL_MAGIC_MAPPING, - SPELL_DIG, - SPELL_STATUE_FORM, - SPELL_BOLT_OF_IRON, - SPELL_TOMB_OF_DOROKLOHE, - SPELL_SHATTER, - SPELL_NO_SPELL, - }, - // 41 - manuals of all kinds - {0, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 42 - Book of Wizardry - {0, - SPELL_DETECT_CREATURES, - SPELL_SUMMON_ELEMENTAL, - SPELL_MAGIC_MAPPING, - SPELL_TELEPORT_SELF, - SPELL_FIREBALL, - SPELL_IDENTIFY, - SPELL_HASTE, - SPELL_NO_SPELL, - }, - // 43 - Book of Power - {0, - SPELL_ANIMATE_DEAD, - SPELL_TELEPORT_OTHER, - SPELL_VENOM_BOLT, - SPELL_BOLT_OF_IRON, - SPELL_INVISIBILITY, - SPELL_MASS_CONFUSION, - SPELL_POISONOUS_CLOUD, - SPELL_NO_SPELL, - }, - // 44 - Book of Cantrips //jmf: added 04jan2000 - {0, - SPELL_CONFUSING_TOUCH, - SPELL_ANIMATE_SKELETON, - SPELL_SUMMON_SMALL_MAMMAL, - SPELL_DETECT_SECRET_DOORS, - SPELL_APPORTATION, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 45 - Book of Party Tricks //jmf: added 04jan2000 - {0, - SPELL_SUMMON_BUTTERFLIES, - SPELL_APPORTATION, - SPELL_PROJECTED_NOISE, - SPELL_BLINK, - SPELL_LEVITATION, - SPELL_INTOXICATE, - SPELL_NO_SPELL, //jmf: SPELL_ERINGYAS_SURPRISING_BOUQUET, when finished - SPELL_NO_SPELL, - }, - - // 46 - Book of Beasts //jmf: added 19mar2000 - {0, - SPELL_SUMMON_SMALL_MAMMAL, - SPELL_STICKS_TO_SNAKES, - SPELL_DETECT_CREATURES, - SPELL_SUMMON_LARGE_MAMMAL, - SPELL_TAME_BEASTS, - SPELL_DRAGON_FORM, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 47 - Book of Stalking //jmf: 24jun2000 - {0, - SPELL_STING, - SPELL_SURE_BLADE, - SPELL_PROJECTED_NOISE, - SPELL_MEPHITIC_CLOUD, - SPELL_POISON_WEAPON, - SPELL_PARALYZE, - SPELL_INVISIBILITY, - SPELL_NO_SPELL, - }, - - // 48 -- unused - {0, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 49 - unused - {0, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - - // 50 - Staff of Smiting //jmf: totally obsolete --- no longer looks here. - {0, - SPELL_SMITING, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 51 - Staff of Summoning - {0, - SPELL_ABJURATION_I, - SPELL_RECALL, - SPELL_SUMMON_ELEMENTAL, - SPELL_SWARM, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 52 - Staff of Destruction - {0, - SPELL_THROW_FLAME, - SPELL_BOLT_OF_FIRE, - SPELL_FIREBALL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 53 - Staff of Destruction - {0, - SPELL_THROW_FROST, - SPELL_ICE_BOLT, - SPELL_FREEZING_CLOUD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 54 - Staff of Destruction - {0, - SPELL_BOLT_OF_IRON, - SPELL_FIREBALL, - SPELL_LIGHTNING_BOLT, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 55 - Staff of Destruction - {0, - SPELL_BOLT_OF_INACCURACY, - SPELL_BOLT_OF_MAGMA, - SPELL_BOLT_OF_COLD, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 56 - Staff of Warding - {0, - SPELL_ABJURATION_I, - SPELL_CONDENSATION_SHIELD, - SPELL_CAUSE_FEAR, - SPELL_DEFLECT_MISSILES, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 57 - Staff of Exploration - {0, - SPELL_DETECT_SECRET_DOORS, - SPELL_DETECT_TRAPS, - SPELL_DETECT_ITEMS, - SPELL_MAGIC_MAPPING, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 58 - Staff of Demonology - {0, - SPELL_ABJURATION_I, - SPELL_RECALL, - SPELL_CALL_IMP, - SPELL_SUMMON_DEMON, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, - // 59 - Staff of Striking -- unused like Smiting - {0, - SPELL_STRIKING, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - SPELL_NO_SPELL, - }, -}; - -static void spellbook_template( int sbook_type, - FixedVector < int, SPELLBOOK_SIZE > &sbtemplate_pass ) -{ - ASSERT( sbook_type >= 0 ); - ASSERT( sbook_type < NUMBER_SPELLBOOKS ); - - // no point doing anything if tome of destruction or a manual - if (sbook_type == BOOK_DESTRUCTION || sbook_type == BOOK_MANUAL) - return; - - for (int i = 0; i < SPELLBOOK_SIZE; i++) //jmf: was i = 1 - { - sbtemplate_pass[i] = spellbook_template_array[sbook_type][i]; - } -} // end spellbook_template() - -int which_spell_in_book(int sbook_type, int spl) -{ - FixedVector < int, SPELLBOOK_SIZE > wsib_pass; // was 10 {dlb} - - spellbook_template(sbook_type, wsib_pass); - - return (wsib_pass[ spl + 1 ]); -} // end which_spell_in_book() - -// If fs is not NULL, updates will be to the formatted_string instead of -// the display. -unsigned char spellbook_contents( item_def &book, int action, - formatted_string *fs ) -{ - FixedVector<int, SPELLBOOK_SIZE> spell_types; // was 10 {dlb} - int spelcount = 0; - int i, j; - bool update_screen = !fs; - - const int spell_levels = player_spell_levels(); - - // special case for staves - const int type = (book.base_type == OBJ_STAVES) ? book.sub_type + 40 - : book.sub_type; - - bool spell_skills = false; - - for (i = SK_SPELLCASTING; i <= SK_POISON_MAGIC; i++) - { - if (you.skills[i]) - { - spell_skills = true; - break; - } - } - - set_ident_flags( book, ISFLAG_KNOW_TYPE ); - - spellbook_template( type, spell_types ); - - formatted_string out; - out.textcolor(LIGHTGREY); - - char str_pass[ ITEMNAME_SIZE ]; - item_name( book, DESC_CAP_THE, str_pass ); - out.cprintf( str_pass ); - - out.cprintf( EOL EOL " Spells Type Level" EOL ); - - for (j = 1; j < SPELLBOOK_SIZE; j++) - { - if (spell_types[j] == SPELL_NO_SPELL) - continue; - - out.cprintf(" "); - - bool knowsSpell = false; - for (i = 0; i < 25 && !knowsSpell; i++) - { - knowsSpell = (you.spells[i] == spell_types[j]); - } - - const int level_diff = spell_difficulty( spell_types[j] ); - const int levels_req = spell_levels_required( spell_types[j] ); - - int colour = DARKGREY; - if (action == RBOOK_USE_STAFF) - { - if (you.experience_level >= level_diff - && you.magic_points >= level_diff) - { - colour = LIGHTGREY; - } - } - else - { - if (knowsSpell) - colour = LIGHTGREY; - else if (you.experience_level >= level_diff - && spell_levels >= levels_req - && spell_skills) - { - colour = LIGHTBLUE; - } - } - - out.textcolor( colour ); - - // Old: - // textcolor(knowsSpell ? DARKGREY : LIGHTGREY); - // was: ? LIGHTGREY : LIGHTBLUE - - char strng[2]; - - strng[0] = index_to_letter(spelcount); - strng[1] = '\0'; - - out.cprintf(strng); - out.cprintf(" - "); - - out.cprintf( spell_title(spell_types[j]) ); - out.gotoxy( 35, -1 ); - - - if (action == RBOOK_USE_STAFF) - out.cprintf( "Evocations" ); - else - { - bool already = false; - - for (i = 0; i <= SPTYP_LAST_EXPONENT; i++) - { - if (spell_typematch( spell_types[j], 1 << i )) - { - if (already) - out.cprintf( "/" ); - - out.cprintf( spelltype_name( 1 << i ) ); - already = true; - } - } - } - - out.gotoxy( 65, -1 ); - - char sval[3]; - - itoa( level_diff, sval, 10 ); - out.cprintf( sval ); - out.cprintf( EOL ); - spelcount++; - } - - out.textcolor(LIGHTGREY); - out.cprintf(EOL); - - switch (action) - { - case RBOOK_USE_STAFF: - out.cprintf( "Select a spell to cast." EOL ); - break; - - case RBOOK_MEMORISE: - out.cprintf( "Select a spell to memorise (%d level%s available)." EOL, - spell_levels, (spell_levels == 1) ? "" : "s" ); - break; - - case RBOOK_READ_SPELL: - out.cprintf( "Select a spell to read its description." EOL ); - break; - - default: - break; - } - - if (fs) - *fs = out; - - unsigned char keyn = 0; - if (update_screen) - { -#ifdef DOS_TERM - char buffer[4800]; - gettext(1, 1, 80, 25, buffer); - window(1, 1, 80, 25); -#endif - clrscr(); - - out.display(); - - keyn = getch(); - if (keyn == 0) - getch(); - -#ifdef DOS_TERM - puttext(1, 1, 80, 25, buffer); - window(1, 18, 80, 25); -#endif - } - - return (keyn); // try to figure out that for which this is used {dlb} -} - -//jmf: was in shopping.cc -char book_rarity(unsigned char which_book) -{ - switch (which_book) - { - case BOOK_MINOR_MAGIC_I: - case BOOK_MINOR_MAGIC_II: - case BOOK_MINOR_MAGIC_III: - case BOOK_SURVEYANCES: - case BOOK_HINDERANCE: - case BOOK_CANTRIPS: //jmf: added 04jan2000 - return 1; - - case BOOK_CHANGES: - case BOOK_CHARMS: - return 2; - - case BOOK_CONJURATIONS_I: - case BOOK_CONJURATIONS_II: - case BOOK_PRACTICAL_MAGIC: - case BOOK_NECROMANCY: - case BOOK_CALLINGS: - case BOOK_WIZARDRY: - return 3; - - case BOOK_FLAMES: - case BOOK_FROST: - case BOOK_AIR: - case BOOK_GEOMANCY: - return 4; - - case BOOK_YOUNG_POISONERS: - case BOOK_STALKING: //jmf: added 24jun2000 - case BOOK_WAR_CHANTS: - return 5; - - case BOOK_CLOUDS: - case BOOK_POWER: - return 6; - - case BOOK_ENCHANTMENTS: - case BOOK_PARTY_TRICKS: //jmf: added 04jan2000 - return 7; - - case BOOK_TRANSFIGURATIONS: - case BOOK_DIVINATIONS: - return 8; - - case BOOK_FIRE: - case BOOK_ICE: - case BOOK_SKY: - case BOOK_EARTH: - case BOOK_UNLIFE: - case BOOK_CONTROL: - case BOOK_SPATIAL_TRANSLOCATIONS: - return 10; - - case BOOK_TEMPESTS: - case BOOK_DEATH: - return 11; - - case BOOK_MUTATIONS: - case BOOK_BEASTS: //jmf: added 23mar2000 - return 12; - - case BOOK_ENVENOMATIONS: - case BOOK_WARP: - return 15; - - case BOOK_TUKIMA: - return 16; - - case BOOK_SUMMONINGS: - return 18; - - case BOOK_ANNIHILATIONS: // Vehumet special - case BOOK_DEMONOLOGY: // Vehumet special - case BOOK_NECRONOMICON: // Kikubaaqudgha special - case BOOK_MANUAL: - return 20; - - case BOOK_DESTRUCTION: - return 30; - - case BOOK_HEALING: - return 100; - - default: - return 1; - } -} // end book_rarity() - -bool is_valid_spell_in_book( unsigned int splbook, int spell ) -{ - FixedVector< int, SPELLBOOK_SIZE > spells; - - spellbook_template( you.inv[ splbook ].sub_type, spells ); - - if (spells[ spell ] != SPELL_NO_SPELL) - return true; - - return false; -} // end is_valid_spell_in_book() - -static bool which_spellbook( int &book, int &spell ) -{ - const int avail_levels = player_spell_levels(); - - // Knowing delayed fireball will allow Fireball to be learned for free -bwr - if (avail_levels < 1 && !player_has_spell(SPELL_DELAYED_FIREBALL)) - { - mpr("You can't memorise any more spells yet."); - return (false); - } - else if (inv_count() < 1) - { - canned_msg(MSG_NOTHING_CARRIED); - return (false); - } - - snprintf( info, INFO_SIZE, "You can memorise %d more level%s of spells.", - avail_levels, (avail_levels > 1) ? "s" : "" ); - - mpr( info ); - - book = prompt_invent_item( "Memorise from which spellbook?", OBJ_BOOKS ); - if (book == PROMPT_ABORT) - { - canned_msg( MSG_OK ); - return (false); - } - - if (you.inv[book].base_type != OBJ_BOOKS - || you.inv[book].sub_type == BOOK_MANUAL) - { - mpr("That isn't a spellbook!"); - return (false); - } - - if (you.inv[book].sub_type == BOOK_DESTRUCTION) - { - tome_of_power( book ); - return (false); - } - - spell = read_book( you.inv[book], RBOOK_MEMORISE ); - clrscr(); - - return (true); -} // end which_spellbook() - -// Returns false if the player cannot read/memorize from the book, -// and true otherwise. -- bwr -static bool player_can_read_spellbook( const item_def &book ) -{ - if (book.base_type != OBJ_BOOKS) - return (true); - - if ((book.sub_type == BOOK_ANNIHILATIONS - && you.religion != GOD_VEHUMET - && (you.skills[SK_CONJURATIONS] < 10 - || you.skills[SK_SPELLCASTING] < 10)) - || (book.sub_type == BOOK_DEMONOLOGY - && you.religion != GOD_VEHUMET - && (you.skills[SK_SUMMONINGS] < 10 - || you.skills[SK_SPELLCASTING] < 10)) - || (book.sub_type == BOOK_NECRONOMICON - && you.religion != GOD_KIKUBAAQUDGHA - && (you.skills[SK_NECROMANCY] < 10 - || you.skills[SK_SPELLCASTING] < 10))) - { - return (false); - } - - return (true); -} - -unsigned char read_book( item_def &book, int action ) -{ - unsigned char key2 = 0; - - if (book.base_type == OBJ_BOOKS && !player_can_read_spellbook( book )) - { - mpr( "This book is beyond your current level of understanding." ); - more(); - return (0); - } - - // remember that this function is called from staff spells as well: - key2 = spellbook_contents( book, action ); - - if (book.base_type == OBJ_BOOKS) - { - you.had_book[ book.sub_type ] = 1; - - if ( book.sub_type == BOOK_MINOR_MAGIC_I - || book.sub_type == BOOK_MINOR_MAGIC_II - || book.sub_type == BOOK_MINOR_MAGIC_III) - { - you.had_book[BOOK_MINOR_MAGIC_I] = 1; - you.had_book[BOOK_MINOR_MAGIC_II] = 1; - you.had_book[BOOK_MINOR_MAGIC_III] = 1; - } - else if (book.sub_type == BOOK_CONJURATIONS_I - || book.sub_type == BOOK_CONJURATIONS_II) - { - you.had_book[BOOK_CONJURATIONS_I] = 1; - you.had_book[BOOK_CONJURATIONS_II] = 1; - } - } - - redraw_screen(); - - /* Put special book effects in another function which can be called from - memorise as well */ - - // reading spell descriptions doesn't take time: - if (action != RBOOK_READ_SPELL) - you.turn_is_over = 1; - - set_ident_flags( book, ISFLAG_KNOW_TYPE ); - - return (key2); -} // end read_book() - -// recoded to answer whether an UNDEAD_STATE is -// barred from a particular spell passed to the -// function - note that the function can be expanded -// to prevent memorisation of certain spells by -// the living by setting up an US_ALIVE case returning -// a value of false for a set of spells ... might be -// an idea worth further consideration - 12mar2000 {dlb} -bool undead_cannot_memorise(unsigned char spell, unsigned char being) -{ - switch (being) - { - case US_HUNGRY_DEAD: - switch (spell) - { - //case SPELL_REGENERATION: - case SPELL_BORGNJORS_REVIVIFICATION: - case SPELL_CURE_POISON_II: - case SPELL_DEATHS_DOOR: - case SPELL_NECROMUTATION: - case SPELL_RESIST_POISON: - case SPELL_SYMBOL_OF_TORMENT: - case SPELL_TAME_BEASTS: - case SPELL_BERSERKER_RAGE: - return true; - } - break; - - case US_UNDEAD: - switch (spell) - { - case SPELL_AIR_WALK: - case SPELL_ALTER_SELF: - case SPELL_BLADE_HANDS: - case SPELL_BORGNJORS_REVIVIFICATION: - case SPELL_CURE_POISON_II: - case SPELL_DEATHS_DOOR: - case SPELL_DRAGON_FORM: - case SPELL_GLAMOUR: - case SPELL_ICE_FORM: - case SPELL_INTOXICATE: - case SPELL_NECROMUTATION: - case SPELL_PASSWALL: - case SPELL_REGENERATION: - case SPELL_RESIST_POISON: - case SPELL_SPIDER_FORM: - case SPELL_STATUE_FORM: - case SPELL_SUMMON_HORRIBLE_THINGS: - case SPELL_SYMBOL_OF_TORMENT: - case SPELL_TAME_BEASTS: - case SPELL_BERSERKER_RAGE: - return true; - } - break; - } - - return false; -} // end undead_cannot_memorise() - -bool learn_spell(void) -{ - int chance = 0; - int levels_needed = 0; - unsigned char keyin; - int book, spell; - int index; - - int i; - int j = 0; - - for (i = SK_SPELLCASTING; i <= SK_POISON_MAGIC; i++) - { - if (you.skills[i]) - j++; - } - - if (j == 0) - { - mpr("You can't use spell magic! I'm afraid it's scrolls only for now."); - return (false); - } - - if (!which_spellbook( book, spell )) - return (false); - - if (spell < 'A' || (spell > 'Z' && spell < 'a') || spell > 'z') - { - whatt: - redraw_screen(); - mpr("What?"); - return (false); - } - - index = letter_to_index( spell ); - - if (index >= SPELLBOOK_SIZE) - goto whatt; - - if (!is_valid_spell_in_book( book, index )) - goto whatt; - - unsigned int specspell = which_spell_in_book(you.inv[book].sub_type,index); - - if (specspell == SPELL_NO_SPELL) - goto whatt; - - // You can always memorise selective amnesia: - if (you.spell_no == 21 && specspell != SPELL_SELECTIVE_AMNESIA) - { - redraw_screen(); - mpr("Your head is already too full of spells!"); - return (false); - } - - if (you.is_undead && spell_typematch(specspell, SPTYP_HOLY)) - { - redraw_screen(); - mpr("You cannot use this type of magic!"); - return (false); - } - - if (undead_cannot_memorise(specspell, you.is_undead)) - { - redraw_screen(); - mpr("You cannot use this spell."); - return (false); - } - - for (i = 0; i < 25; i++) - { - if (you.spells[i] == specspell) - { - redraw_screen(); - mpr("You already know that spell!"); - you.turn_is_over = 1; - return (false); - } - } - - levels_needed = spell_levels_required( specspell ); - - if (player_spell_levels() < levels_needed) - { - redraw_screen(); - mpr("You can't memorise that many levels of magic yet!"); - you.turn_is_over = 1; - return (false); - } - - if (you.experience_level < spell_difficulty(specspell)) - { - redraw_screen(); - mpr("You're too inexperienced to learn that spell!"); - you.turn_is_over = 1; - return (false); - } - - redraw_screen(); - - chance = spell_fail(specspell); - - strcpy(info, "This spell is "); - - strcat(info, (chance >= 80) ? "very" : - (chance >= 60) ? "quite" : - (chance >= 45) ? "rather" : - (chance >= 30) ? "somewhat" - : "not that"); - - strcat(info, " "); - - int temp_rand = random2(3); - - strcat(info, (temp_rand == 0) ? "difficult" : - (temp_rand == 1) ? "tricky" : - (temp_rand == 2) ? "challenging" - : ""); - - strcat(info, " to "); - - temp_rand = random2(4); - - strcat(info, (temp_rand == 0) ? "memorise" : - (temp_rand == 1) ? "commit to memory" : - (temp_rand == 2) ? "learn" : - (temp_rand == 3) ? "absorb" - : ""); - - strcat(info, "."); - - mpr(info); - - strcpy(info, "Memorise "); - strcat(info, spell_title(specspell)); - strcat(info, "?"); - mpr(info); - - for (;;) - { - keyin = getch(); - - if (keyin == 'n' || keyin == 'N') - { - redraw_screen(); - return (false); - } - - if (keyin == 'y' || keyin == 'Y') - break; - } - - mesclr( true ); - - if (you.mutation[MUT_BLURRY_VISION] > 0 - && random2(4) < you.mutation[MUT_BLURRY_VISION]) - { - mpr("The writing blurs into unreadable gibberish."); - you.turn_is_over = 1; - return (false); - } - - if (random2(40) + random2(40) + random2(40) < chance) - { - redraw_screen(); - mpr("You fail to memorise the spell."); - you.turn_is_over = 1; - - if (you.inv[ book ].sub_type == BOOK_NECRONOMICON) - { - mpr("The pages of the Necronomicon glow with a dark malevolence..."); - miscast_effect( SPTYP_NECROMANCY, 8, random2avg(88, 3), 100, - "reading the Necronomicon" ); - } - else if (you.inv[ book ].sub_type == BOOK_DEMONOLOGY) - { - mpr("This book does not appreciate being disturbed by one of your ineptitude!"); - miscast_effect( SPTYP_SUMMONING, 7, random2avg(88, 3), 100, - "reading the book of Demonology" ); - } - else if (you.inv[ book ].sub_type == BOOK_ANNIHILATIONS) - { - mpr("This book does not appreciate being disturbed by one of your ineptitude!"); - miscast_effect( SPTYP_CONJURATION, 8, random2avg(88, 3), 100, - "reading the book of Annihilations" ); - } - -#if WIZARD - if (!you.wizard) - return (false); - else if (!yesno("Memorize anyway?")) - return (false); -#else - return (false); -#endif - } - - start_delay( DELAY_MEMORISE, spell_difficulty( specspell ), specspell ); - - you.turn_is_over = 1; - redraw_screen(); - - did_god_conduct( DID_SPELL_CASTING, 2 + random2(5) ); - - return (true); -} // end which_spell() - -int count_staff_spells(const item_def &item, bool need_id) -{ - if (item.base_type != OBJ_STAVES) - return (-1); - - if (need_id && !item_ident( item, ISFLAG_KNOW_TYPE )) - return (0); - - const int stype = item.sub_type; - const int type = stype + 40; - if (stype < STAFF_SMITING || stype >= STAFF_AIR) - return (0); - - FixedVector< int, SPELLBOOK_SIZE > spell_list; - spellbook_template( type, spell_list ); - - int num_spells = 0; - for (num_spells = 0; num_spells < SPELLBOOK_SIZE - 1; num_spells++) - { - if (spell_list[ num_spells + 1 ] == SPELL_NO_SPELL) - break; - } - return (num_spells); -} - -int staff_spell( int staff ) -{ - int spell; - unsigned char specspell; - int mana, diff, food, energy; - FixedVector< int, SPELLBOOK_SIZE > spell_list; - - // converting sub_type into book index type - const int type = you.inv[staff].sub_type + 40; - - // Spell staves are mostly for the benefit of non-spellcasters, so we're - // not going to involve INT or Spellcasting skills for power. -- bwr - const int powc = 5 + you.skills[SK_EVOCATIONS] - + roll_dice( 2, you.skills[SK_EVOCATIONS] ); - - const int staff_type = you.inv[staff].sub_type; - if (staff_type < STAFF_SMITING || staff_type >= STAFF_AIR) - { - //mpr("That staff has no spells in it."); - canned_msg(MSG_NOTHING_HAPPENS); - return (0); - } - - if (!item_ident( you.inv[staff], ISFLAG_KNOW_TYPE )) - { - set_ident_flags( you.inv[staff], ISFLAG_KNOW_TYPE ); - you.wield_change = true; - } - - spellbook_template( type, spell_list ); - - unsigned char num_spells; - for (num_spells = 0; num_spells < SPELLBOOK_SIZE - 1; num_spells++) - { - if (spell_list[ num_spells + 1 ] == SPELL_NO_SPELL) - break; - } - - if (num_spells == 0) - { - canned_msg(MSG_NOTHING_HAPPENS); // shouldn't happen - return (0); - } - else if (num_spells == 1) - spell = 'a'; // automatically selected if its the only option - else - { - snprintf( info, INFO_SIZE, - "Evoke which spell from the rod ([a-%c] spell [?*] list)? ", - 'a' + num_spells - 1 ); - - mpr( info, MSGCH_PROMPT ); - spell = get_ch(); - - if (spell == '?' || spell == '*') - spell = read_book( you.inv[staff], RBOOK_USE_STAFF ); - } - - if (spell < 'A' || (spell > 'Z' && spell < 'a') || spell > 'z') - { - goto whattt; - } - - spell = letter_to_index( spell ); - - if (spell >= SPELLBOOK_SIZE) - goto whattt; - - if (!is_valid_spell_in_book( staff, spell )) - goto whattt; - - specspell = which_spell_in_book( type, spell ); - - if (specspell == SPELL_NO_SPELL) - goto whattt; - - mana = spell_mana( specspell ) * ROD_CHARGE_MULT; - diff = spell_difficulty( specspell ); - food = spell_hunger( specspell ); - - if (food && (you.is_undead != US_UNDEAD - && (you.hunger_state < HS_HUNGRY || you.hunger <= food))) - { - mpr("You don't have the energy to cast that spell."); - return (0); - } - - if (staff_type == STAFF_STRIKING) - mana /= ROD_CHARGE_MULT; - - if ((staff_type == STAFF_STRIKING? - you.magic_points < mana - : you.inv[staff].plus < mana) - || you.experience_level < diff) - { -#ifdef DEBUG_DIAGNOSTICS - mprf("Mana needed: %d, Staff plus: %d, Difficulty: %d, XP: %d", - mana, you.inv[staff].plus, diff, you.experience_level); -#endif - if (you.experience_level < diff) - mprf("You need to be at least level %d to use that.", diff); - else - mprf("%s have enough magic points.", - staff_type == STAFF_STRIKING? "You don't" : "The rod doesn't"); - - // confuse_player( 2 + random2(4) ); - you.turn_is_over = 1; - return (0); - } - - // Exercising the spell skills doesn't make very much sense given - // that spell staves are largely intended to supply spells to - // non-spellcasters, and they don't use spell skills to determine - // power in the same way that spellcasting does. -- bwr - // - // exercise_spell(specspell, true, true); - - your_spells(specspell, powc, false); - - - // [dshaligram] - // dec_mp(spell_mana(specspell)); - if (staff_type != STAFF_STRIKING) - you.inv[staff].plus -= mana; - else { - you.magic_points -= mana; - you.redraw_magic_points = true; - } - - energy = player_energy(); - if (energy <= 0 && you.is_undead != US_UNDEAD) - { - food -= 10 * you.skills[SK_EVOCATIONS]; - if (food < diff * 5) - food = diff * 5; - - make_hungry( food, true ); - } - - you.wield_change = true; - - you.turn_is_over = 1; - - return (roll_dice( 1, 1 + spell_difficulty(specspell) / 2 )); - - whattt: - mpr("What?"); - - return (0); -} // end staff_spell() |