summaryrefslogtreecommitdiffstats
path: root/stone_soup/crawl-ref/source/spl-cast.cc
diff options
context:
space:
mode:
Diffstat (limited to 'stone_soup/crawl-ref/source/spl-cast.cc')
-rw-r--r--stone_soup/crawl-ref/source/spl-cast.cc3572
1 files changed, 0 insertions, 3572 deletions
diff --git a/stone_soup/crawl-ref/source/spl-cast.cc b/stone_soup/crawl-ref/source/spl-cast.cc
deleted file mode 100644
index fb6d60bf62..0000000000
--- a/stone_soup/crawl-ref/source/spl-cast.cc
+++ /dev/null
@@ -1,3572 +0,0 @@
-/*
- * File: spl-cast.cc
- * Summary: Spell casting and miscast functions.
- * Written by: Linley Henzell
- *
- * Modified for Crawl Reference by $Author$ on $Date$
- *
- * Change History (most recent first):
- *
- * <4> 1/02/00 jmf changed values, marked //jmf:
- * <3> 6/13/99 BWR Added Staff auto identify code
- * <2> 5/20/99 BWR Added some screen redraws
- * <1> -/--/-- LRH Created
- */
-
-#include "AppHdr.h"
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "spl-cast.h"
-
-#include "externs.h"
-
-#include "beam.h"
-#include "cloud.h"
-#include "effects.h"
-#include "fight.h"
-#include "food.h"
-#include "it_use2.h"
-#include "itemname.h"
-#include "itemprop.h"
-#include "macro.h"
-#include "monplace.h"
-#include "monstuff.h"
-#include "mutation.h"
-#include "ouch.h"
-#include "player.h"
-#include "religion.h"
-#include "skills.h"
-#include "spells1.h"
-#include "spells2.h"
-#include "spells3.h"
-#include "spells4.h"
-#include "spl-book.h"
-#include "spl-util.h"
-#include "stuff.h"
-#include "transfor.h"
-#include "view.h"
-
-#ifdef DOS
-#include <conio.h>
-#endif
-
-#define WILD_MAGIC_NASTINESS 150
-
-static void surge_power(int spell)
-{
- int enhanced = 0;
-
- //jmf: simplified
- enhanced += spell_enhancement(spell_type(spell));
-
- if (enhanced) // one way or the other {dlb}
- {
- strcpy(info, "You feel a");
-
- strcat(info, (enhanced < -2) ? "n extraordinarily" :
- (enhanced == -2) ? "n extremely" :
- (enhanced == 2) ? " strong" :
- (enhanced > 2) ? " huge"
- : "");
-
- strcat(info, (enhanced < 0) ? " numb sensation."
- : " surge of power!");
- mpr(info);
- }
-} // end surge_power()
-
-char list_spells(void)
-{
- int j;
- int lines = 0;
- unsigned int anything = 0;
- unsigned int i;
- int ki;
- bool already = false;
-
- const int num_lines = get_number_of_lines();
-
-#ifdef DOS_TERM
- char buffer[4800];
-
- gettext(1, 1, 80, 25, buffer);
-#endif
-
-#ifdef DOS_TERM
- window(1, 1, 80, 25);
-#endif
-
- clrscr();
-
- cprintf( " Your Spells Type Success Level" );
- lines++;
-
- for (j = 0; j < 52; j++)
- {
- if (lines > num_lines - 2)
- {
- gotoxy(1, num_lines);
- cprintf("-more-");
-
- ki = getch();
-
- if (ki == ESCAPE)
- {
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
- return (ESCAPE);
- }
-
- if (isalpha( ki ))
- {
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
- return (ki);
- }
-
- if (ki == 0)
- ki = getch();
-
- lines = 0;
- clrscr();
- gotoxy(1, 1);
- anything = 0;
- }
-
- const char letter = index_to_letter(j);
- const int spell = get_spell_by_letter(letter);
-
- if (spell != SPELL_NO_SPELL)
- {
- anything++;
-
- if (lines > 0)
- cprintf(EOL);
-
- lines++;
-
- cprintf( " %c - %s", letter, spell_title( spell ) );
- gotoxy(35, wherey());
-
- already = false;
-
- for (i = 0; i <= SPTYP_LAST_EXPONENT; i++)
- {
- if (spell_typematch( spell, (1 << i) ))
- {
- if (already)
- cprintf( "/" );
-
- cprintf( spelltype_name( 1 << i ) );
- already = true;
- }
- }
-
- char sval[16];
-
- //gotoxy(58, wherey());
- gotoxy(65, wherey());
-
- int spell_f = spell_fail( spell );
-
- cprintf( (spell_f == 100) ? "Useless" :
- (spell_f > 90) ? "Terrible" :
- (spell_f > 80) ? "Cruddy" :
- (spell_f > 70) ? "Bad" :
- (spell_f > 60) ? "Very Poor" :
- (spell_f > 50) ? "Poor" :
- (spell_f > 40) ? "Fair" :
- (spell_f > 30) ? "Good" :
- (spell_f > 20) ? "Very Good" :
- (spell_f > 10) ? "Great" :
- (spell_f > 0) ? "Excellent"
- : "Perfect" );
-
- gotoxy(77, wherey());
-
- itoa( (int) spell_difficulty( spell ), sval, 10 );
- cprintf(sval);
- }
- } // end of j loop
-
- if (anything > 0)
- {
- ki = getch();
-
- if (ki >= 'A' && ki <= 'z')
- {
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
- return (ki);
- }
-
- if (ki == 0)
- ki = getch();
-
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
-
- return (anything);
- }
-
-#ifdef DOS_TERM
- puttext(1, 1, 80, 25, buffer);
-#endif
- // was 35
- ki = getch();
-
- return (ki);
-} // end list_spells()
-
-int spell_fail(int spell)
-{
- int chance = 60;
- int chance2 = 0, armour = 0;
-
- chance -= 6 * calc_spell_power( spell, false, true );
- chance -= (you.intel * 2);
-
- //chance -= (you.intel - 10) * abs(you.intel - 10);
- //chance += spell_difficulty(spell) * spell_difficulty(spell) * 3; //spell_difficulty(spell);
-
- if (you.equip[EQ_BODY_ARMOUR] != -1)
- {
-
- int ev_penalty = abs(property( you.inv[you.equip[EQ_BODY_ARMOUR]],
- PARM_EVASION ));
-
- // The minus 15 is to make the -1 light armours not so bad
- armour += (20 * ev_penalty) - 15;
-
- //jmf: armour skill now reduces failure due to armour
- //bwr: this was far too good, an armour skill of 5 was
- // completely negating plate mail. Plate mail should
- // hardly be completely negated, it should still be
- // an important consideration for even high level characters.
- // Truth is, even a much worse penalty than the above can
- // easily be overcome by gaining spell skills... and a lot
- // faster than any reasonable rate of bonus here.
- int lim_str = (you.strength > 30) ? 30 :
- (you.strength < 10) ? 10 : you.strength;
-
- armour -= ((you.skills[SK_ARMOUR] * lim_str) / 15);
-
- int race_arm = get_equip_race( you.inv[you.equip[EQ_BODY_ARMOUR]] );
- int racial_type = 0;
-
- if (player_genus(GENPC_DWARVEN))
- racial_type = ISFLAG_DWARVEN;
- else if (player_genus(GENPC_ELVEN))
- racial_type = ISFLAG_ELVEN;
- else if (you.species == SP_HILL_ORC)
- racial_type = ISFLAG_ORCISH;
-
- // Elven armour gives everyone some benefit to spellcasting,
- // Dwarven armour hinders everyone.
- switch (race_arm)
- {
- case ISFLAG_ELVEN:
- armour -= 20;
- break;
- case ISFLAG_DWARVEN:
- armour += 10;
- break;
- default:
- break;
- }
-
- // Armour of the same racial type reduces penalty.
- if (racial_type && race_arm == racial_type)
- armour -= 10;
-
- if (armour > 0)
- chance += armour;
- }
-
- if (you.equip[EQ_WEAPON] != -1
- && you.inv[you.equip[EQ_WEAPON]].base_type == OBJ_WEAPONS)
- {
- int wpn_penalty = (3 * (property( you.inv[you.equip[EQ_WEAPON]], PWPN_SPEED ) - 12)) / 2;
-
- if (wpn_penalty > 0)
- chance += wpn_penalty;
- }
-
- if (you.equip[EQ_SHIELD] != -1)
- {
- switch (you.inv[you.equip[EQ_SHIELD]].sub_type)
- {
- case ARM_BUCKLER:
- chance += 5;
- break;
-
- case ARM_SHIELD:
- chance += 15;
- break;
-
- case ARM_LARGE_SHIELD:
- // *BCR* Large chars now get a lower penalty for large shields
- if ((you.species >= SP_OGRE && you.species <= SP_OGRE_MAGE)
- || player_genus(GENPC_DRACONIAN))
- {
- chance += 20;
- }
- else
- chance += 30;
- break;
- }
- }
-
- switch (spell_difficulty(spell))
- {
- case 1: chance += 3; break;
- case 2: chance += 15; break;
- case 3: chance += 35; break;
- case 4: chance += 70; break;
- case 5: chance += 100; break;
- case 6: chance += 150; break;
- case 7: chance += 200; break;
- case 8: chance += 260; break;
- case 9: chance += 330; break;
- case 10: chance += 420; break;
- case 11: chance += 500; break;
- case 12: chance += 600; break;
- default: chance += 750; break;
- }
-
- //if (chance < 1 ) chance = 0;
- if (chance > 100)
- chance = 100;
-
- chance2 = chance;
-
- if (chance < 45)
- chance2 = 45;
- if (chance < 42)
- chance2 = 43;
- if (chance < 38)
- chance2 = 41;
- if (chance < 35)
- chance2 = 40;
- if (chance < 32)
- chance2 = 38;
- if (chance < 28)
- chance2 = 36;
- if (chance < 22)
- chance2 = 34;
- if (chance < 16)
- chance2 = 32;
- if (chance < 10)
- chance2 = 30;
- if (chance < 2)
- chance2 = 28;
- if (chance < -7)
- chance2 = 26;
- if (chance < -12)
- chance2 = 24;
- if (chance < -18)
- chance2 = 22;
- if (chance < -24)
- chance2 = 20;
- if (chance < -30)
- chance2 = 18;
- if (chance < -38)
- chance2 = 16;
- if (chance < -46)
- chance2 = 14;
- if (chance < -60)
- chance2 = 12;
- if (chance < -80)
- chance2 = 10;
- if (chance < -100)
- chance2 = 8;
- if (chance < -120)
- chance2 = 6;
- if (chance < -140)
- chance2 = 4;
- if (chance < -160)
- chance2 = 2;
- if (chance < -180)
- chance2 = 0;
-
- if (you.religion == GOD_VEHUMET
- && you.duration[DUR_PRAYER]
- && (!player_under_penance() && you.piety >= 50)
- && (spell_typematch(spell, SPTYP_CONJURATION)
- || spell_typematch(spell, SPTYP_SUMMONING)))
- {
- // [dshaligram] Fail rate multiplier used to be .5, scaled
- // back to 2/3.
- chance2 = chance2 * 2 / 3;
- }
-
- if (you.duration[DUR_TRANSFORMATION] > 0)
- {
- switch (you.attribute[ATTR_TRANSFORMATION])
- {
- case TRAN_BLADE_HANDS:
- chance2 += 20;
- break;
-
- case TRAN_SPIDER:
- chance2 += 10;
- break;
- }
- }
-
- return (chance2);
-} // end spell_fail()
-
-
-int calc_spell_power( int spell, bool apply_intel, bool fail_rate_check )
-{
- unsigned int bit;
- int ndx;
- int power = (you.skills[SK_SPELLCASTING] / 2) + player_mag_abil(false);
- int enhanced = 0;
-
- unsigned int disciplines = spell_type( spell );
-
- //jmf: evil evil evil -- exclude HOLY bit
- disciplines &= (~SPTYP_HOLY);
-
- int skillcount = count_bits( disciplines );
- if (skillcount)
- {
- for (ndx = 0; ndx <= SPTYP_LAST_EXPONENT; ndx++)
- {
- bit = 1 << ndx;
- if ((bit != SPTYP_HOLY) && (disciplines & bit))
- {
- int skill = spell_type2skill( bit );
-
- power += (you.skills[skill] * 2) / skillcount;
- }
- }
- }
-
- if (apply_intel)
- power = (power * you.intel) / 10;
-
- // [dshaligram] Enhancers don't affect fail rates any more, only spell
- // power. Note that this does not affect Vehumet's boost in castability.
- if (!fail_rate_check)
- enhanced = spell_enhancement( disciplines );
-
- if (enhanced > 0)
- {
- for (ndx = 0; ndx < enhanced; ndx++)
- {
- power *= 15;
- power /= 10;
- }
- }
- else if (enhanced < 0)
- {
- for (ndx = enhanced; ndx < 0; ndx++)
- power /= 2;
- }
-
- power = stepdown_value( power, 50, 50, 150, 200 );
-
- return (power);
-} // end calc_spell_power()
-
-
-int spell_enhancement( unsigned int typeflags )
-{
- int enhanced = 0;
-
- if (typeflags & SPTYP_CONJURATION)
- enhanced += player_spec_conj();
-
- if (typeflags & SPTYP_ENCHANTMENT)
- enhanced += player_spec_ench();
-
- if (typeflags & SPTYP_SUMMONING)
- enhanced += player_spec_summ();
-
- if (typeflags & SPTYP_POISON)
- enhanced += player_spec_poison();
-
- if (typeflags & SPTYP_NECROMANCY)
- enhanced += player_spec_death() - player_spec_holy();
-
- if (typeflags & SPTYP_FIRE)
- enhanced += player_spec_fire() - player_spec_cold();
-
- if (typeflags & SPTYP_ICE)
- enhanced += player_spec_cold() - player_spec_fire();
-
- if (typeflags & SPTYP_EARTH)
- enhanced += player_spec_earth() - player_spec_air();
-
- if (typeflags & SPTYP_AIR)
- enhanced += player_spec_air() - player_spec_earth();
-
- if (you.special_wield == SPWLD_SHADOW)
- enhanced -= 2;
-
- // These are used in an exponential way, so we'll limit them a bit. -- bwr
- if (enhanced > 3)
- enhanced = 3;
- else if (enhanced < -3)
- enhanced = -3;
-
- return (enhanced);
-} // end spell_enhancement()
-
-// returns false if spell failed, and true otherwise
-bool cast_a_spell(void)
-{
- char spc = 0;
- char spc2 = 0;
- int spellh = 0;
- unsigned char keyin = 0;
- char unthing = 0;
-
- if (!you.spell_no)
- {
- mpr("You don't know any spells.");
- return (false);
- }
-
- if (you.berserker)
- {
- canned_msg(MSG_TOO_BERSERK);
- return (false);
- }
-
- if (silenced(you.x_pos, you.y_pos))
- {
- mpr("You cannot cast spells when silenced!");
- return (false);
- }
-
- // first query {dlb}:
- for (;;)
- {
- //jmf: FIXME: change to reflect range of known spells
- mpr( "Cast which spell ([?*] list)? ", MSGCH_PROMPT );
-
- keyin = get_ch();
-
- if (keyin == '?' || keyin == '*')
- {
- unthing = list_spells();
-
- redraw_screen();
- if (unthing == 2)
- return (false);
-
- if (unthing >= 'a' && unthing <= 'y')
- {
- keyin = unthing;
- break;
- }
- else
- mesclr();
- }
- else
- {
- break;
- }
-
- }
-
- if (keyin == ESCAPE)
- return (false);
-
- spc = (int) keyin;
-
- if (!isalpha(spc))
- {
- mpr("You don't know that spell.");
- return (false);
- }
-
- const int spell = get_spell_by_letter( spc );
-
- spc2 = letter_to_index(spc);
-
- if (spell == SPELL_NO_SPELL)
- {
- mpr("You don't know that spell.");
- return (false);
- }
-
- if (spell_mana( spell ) > you.magic_points)
- {
- mpr("You don't have enough magic to cast that spell.");
- return (false);
- }
-
- if (you.is_undead != US_UNDEAD
- && (you.hunger_state < HS_HUNGRY
- || you.hunger <= spell_hunger( spell )))
- {
- mpr("You don't have the energy to cast that spell.");
- return (false);
- }
-
- dec_mp( spell_mana(spell) );
-
- if (!player_energy() && you.is_undead != US_UNDEAD)
- {
- spellh = spell_hunger( spell );
-
- // I wonder if a better algorithm is called for? {dlb}
- spellh -= you.intel * you.skills[SK_SPELLCASTING];
-
- if (spellh < 1)
- spellh = 1;
- else
- make_hungry(spellh, true);
- }
-
- you.turn_is_over = 1;
- alert_nearby_monsters();
-
- if (you.conf)
- random_uselessness( 2 + random2(7), 0 );
- else
- {
- exercise_spell( spell, true, your_spells( spell ) );
- did_god_conduct( DID_SPELL_CASTING, 1 + random2(5) );
- }
-
- return (true);
-} // end cast_a_spell()
-
-// "Utility" spells for the sake of simplicity are currently ones with
-// enchantments, translocations, or divinations.
-bool spell_is_utility_spell( int spell_id )
-{
- return (spell_typematch( spell_id,
- SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION | SPTYP_DIVINATION ));
-}
-
-bool spell_is_unholy( int spell_id )
-{
- return (testbits( get_spell_flags( spell_id ), SPFLAG_UNHOLY ));
-}
-
-// returns true if spell if spell is successfully cast for purposes of
-// exercising and false otherwise (note: false == less exercise, not none).
-bool your_spells( int spc2, int powc, bool allow_fail )
-{
- int dem_hor = 0;
- int dem_hor2 = 0;
- int total_skill = 0;
- struct dist spd;
- struct bolt beam;
-
- alert_nearby_monsters();
-
- // Added this so that the passed in powc can have meaning -- bwr
- if (powc == 0)
- powc = calc_spell_power( spc2, true );
-
- if (you.equip[EQ_WEAPON] != -1
- && item_is_staff( you.inv[you.equip[EQ_WEAPON]] )
- && !item_ident( you.inv[you.equip[EQ_WEAPON]], ISFLAG_KNOW_TYPE ))
- {
- switch (you.inv[you.equip[EQ_WEAPON]].sub_type)
- {
- case STAFF_ENERGY:
- case STAFF_WIZARDRY:
- total_skill = you.skills[SK_SPELLCASTING];
- break;
- case STAFF_FIRE:
- if (spell_typematch(spc2, SPTYP_FIRE))
- total_skill = you.skills[SK_FIRE_MAGIC];
- else if (spell_typematch(spc2, SPTYP_ICE))
- total_skill = you.skills[SK_ICE_MAGIC];
- break;
- case STAFF_COLD:
- if (spell_typematch(spc2, SPTYP_ICE))
- total_skill = you.skills[SK_ICE_MAGIC];
- else if (spell_typematch(spc2, SPTYP_FIRE))
- total_skill = you.skills[SK_FIRE_MAGIC];
- break;
- case STAFF_AIR:
- if (spell_typematch(spc2, SPTYP_AIR))
- total_skill = you.skills[SK_AIR_MAGIC];
- else if (spell_typematch(spc2, SPTYP_EARTH))
- total_skill = you.skills[SK_EARTH_MAGIC];
- break;
- case STAFF_EARTH:
- if (spell_typematch(spc2, SPTYP_EARTH))
- total_skill = you.skills[SK_EARTH_MAGIC];
- else if (spell_typematch(spc2, SPTYP_AIR))
- total_skill = you.skills[SK_AIR_MAGIC];
- break;
- case STAFF_POISON:
- if (spell_typematch(spc2, SPTYP_POISON))
- total_skill = you.skills[SK_POISON_MAGIC];
- break;
- case STAFF_DEATH:
- if (spell_typematch(spc2, SPTYP_NECROMANCY))
- total_skill = you.skills[SK_NECROMANCY];
- break;
- case STAFF_CONJURATION:
- if (spell_typematch(spc2, SPTYP_CONJURATION))
- total_skill = you.skills[SK_CONJURATIONS];
- break;
- case STAFF_ENCHANTMENT:
- if (spell_typematch(spc2, SPTYP_ENCHANTMENT))
- total_skill = you.skills[SK_ENCHANTMENTS];
- break;
- case STAFF_SUMMONING:
- if (spell_typematch(spc2, SPTYP_SUMMONING))
- total_skill = you.skills[SK_SUMMONINGS];
- break;
- }
-
- if (you.skills[SK_SPELLCASTING] > total_skill)
- total_skill = you.skills[SK_SPELLCASTING];
-
- if (random2(100) < total_skill)
- {
- char str_pass[ ITEMNAME_SIZE ];
-
- set_ident_flags( you.inv[you.equip[EQ_WEAPON]], ISFLAG_KNOW_TYPE );
-
- strcpy(info, "You are wielding ");
- in_name(you.equip[EQ_WEAPON], DESC_NOCAP_A, str_pass);
- strcat(info, str_pass);
- strcat(info, ".");
- mpr(info);
-
- more();
-
- you.wield_change = true;
- }
- }
-
- surge_power(spc2);
-
- if (allow_fail)
- {
- int spfl = random2avg(100, 3);
-
- if (you.religion != GOD_SIF_MUNA
- && you.penance[GOD_SIF_MUNA] && one_chance_in(20))
- {
- god_speaks(GOD_SIF_MUNA, "You feel a surge of divine spite.");
-
- // This will cause failure and increase the miscast effect.
- spfl = -you.penance[GOD_SIF_MUNA];
-
- // Reduced penance reduction here because casting spells
- // is a player controllable act. -- bwr
- if (one_chance_in(12))
- dec_penance(GOD_SIF_MUNA, 1);
- }
-
- if (spfl < spell_fail(spc2))
- {
- mpr( "You miscast the spell." );
- flush_input_buffer( FLUSH_ON_FAILURE );
-
- if (you.religion == GOD_SIF_MUNA
- && (!player_under_penance()
- && you.piety >= 100 && random2(150) <= you.piety))
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- unsigned int sptype = 0;
-
- do
- {
- sptype = 1 << (random2(SPTYP_LAST_EXPONENT+1));
- } while (!spell_typematch(spc2, sptype));
-
- // all spell failures give a bit of magical radiation..
- // failure is a function of power squared multiplied
- // by how badly you missed the spell. High power
- // spells can be quite nasty: 9 * 9 * 90 / 500 = 15
- // points of contamination!
- int nastiness = spell_mana(spc2) * spell_mana(spc2)
- * (spell_fail(spc2) - spfl) + 250;
-
- int cont_points = nastiness / 500;
- // handle fraction
- if (random2(500) < (nastiness % 500))
- cont_points++;
-
- contaminate_player( cont_points );
-
- miscast_effect( sptype, spell_mana(spc2), spell_fail(spc2) - spfl, 100 );
-
- if (you.religion == GOD_XOM && random2(75) < spell_mana(spc2))
- Xom_acts(coinflip(), spell_mana(spc2), false);
-
- return (false);
- }
- }
-
- if (you.is_undead && spell_typematch( spc2, SPTYP_HOLY ))
- {
- mpr( "You can't use this type of magic!" );
- return (false); // XXX: still gets trained!
- }
-
- // Normally undead can't memorize these spells, so this check is
- // to catch those in Lich form. As such, we allow the Lich form
- // to be extended here. -- bwr
- if (spc2 != SPELL_NECROMUTATION
- && undead_cannot_memorise( spc2, you.is_undead ))
- {
- mpr( "You cannot cast that spell in your current form!" );
- return (false); // XXX: still gets trained!
- }
-
- if (!spell_is_utility_spell(spc2))
- did_god_conduct( DID_SPELL_NONUTILITY, 10 + spell_difficulty(spc2) );
-
- if (spell_is_unholy( spc2 ))
- did_god_conduct( DID_UNHOLY, 10 + spell_difficulty(spc2) );
-
- // Linley says: Condensation Shield needs some disadvantages to keep
- // it from being a no-brainer... this isn't much, but its a start -- bwr
- if (you.duration[DUR_CONDENSATION_SHIELD] > 0
- && spell_typematch( spc2, SPTYP_FIRE ))
- {
- // TODO: Pull in Brent's expose_player_to_element fn.
- mpr( "Your icy shield dissipates!", MSGCH_DURATION );
- you.duration[DUR_CONDENSATION_SHIELD] = 0;
- you.redraw_armour_class = 1;
- }
-
- if (spell_typematch( spc2, SPTYP_NECROMANCY ))
- {
- did_god_conduct( DID_NECROMANCY, 10 + spell_difficulty(spc2) );
-
- if (spc2 == SPELL_NECROMUTATION
- && (you.religion == GOD_ELYVILON
- || you.religion == GOD_SHINING_ONE
- || you.religion == GOD_ZIN))
- {
- excommunication();
- }
- }
-
- // [dshaligram] Sif Muna piety now increases only when training spell skills
- // as per bwr 4.1.
- /*
- if (you.religion == GOD_SIF_MUNA
- && you.piety < 200 && random2(12) <= spell_difficulty(spc2))
- {
- gain_piety(1);
- }
- */
-
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "Spell #%d, power=%d", spc2, powc );
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif
-
- switch (spc2)
- {
- case SPELL_IDENTIFY:
- identify(powc);
- break;
-
- case SPELL_TELEPORT_SELF:
- you_teleport();
- break;
-
- case SPELL_CAUSE_FEAR:
- mass_enchantment(ENCH_FEAR, powc, MHITYOU);
- break;
-
- case SPELL_CREATE_NOISE: // unused, the player can shout to do this - bwr
- if (!silenced(you.x_pos, you.y_pos))
- {
- mpr("You hear a voice call your name!", MSGCH_SOUND);
- noisy( 25, you.x_pos, you.y_pos );
- }
- break;
-
- case SPELL_REMOVE_CURSE:
- remove_curse(false);
- break;
-
- case SPELL_MAGIC_DART:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- zapping(ZAP_MAGIC_DARTS, powc, beam);
- break;
-
- case SPELL_FIREBALL:
- fireball(powc);
- break;
-
- case SPELL_DELAYED_FIREBALL:
- // This spell has two main advantages over Fireball:
- //
- // (1) The release is instantaneous, so monsters will not
- // get an action before the player... this allows the
- // player to hit monsters with a double fireball (this
- // is why we only allow one delayed fireball at a time,
- // if you want to allow for more, then the release should
- // take at least some amount of time).
- //
- // The casting of this spell still costs a turn. So
- // casting Delayed Fireball and immediately releasing
- // the fireball is only slightly different than casting
- // a regular Fireball (monsters act in the middle instead
- // of at the end). This is why we allow for the spell
- // level discount so that Fireball is free with this spell
- // (so that it only costs 7 levels instead of 13 to have
- // both).
- //
- // (2) When the fireball is released, it is guaranteed to
- // go off... the spell only fails at this point. This can
- // be a large advantage for characters who have difficulty
- // casting Fireball in their standard equipment. However,
- // the power level for the actual fireball is determined at
- // release, so if you do swap out your enhancers you'll
- // get a less powerful ball when its released. -- bwr
- //
- if (!you.attribute[ ATTR_DELAYED_FIREBALL ])
- {
- // okay, this message is weak but functional -- bwr
- mpr( "You feel magically charged." );
- you.attribute[ ATTR_DELAYED_FIREBALL ] = 1;
- }
- else
- {
- canned_msg( MSG_NOTHING_HAPPENS );
- }
- break;
-
- case SPELL_STRIKING:
- if (spell_direction( spd, beam ) == -1)
- return (false);
-
- zapping( ZAP_STRIKING, powc, beam );
- break;
-
- case SPELL_CONJURE_FLAME:
- conjure_flame(powc);
- break;
-
- case SPELL_DIG:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_DIGGING, powc, beam);
- break;
-
- case SPELL_BOLT_OF_FIRE:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_FIRE, powc, beam);
- break;
-
- case SPELL_BOLT_OF_COLD:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_COLD, powc, beam);
- break;
-
- case SPELL_LIGHTNING_BOLT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_LIGHTNING, powc, beam);
- break;
-
- case SPELL_BOLT_OF_MAGMA:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_MAGMA, powc, beam);
- break;
-
- case SPELL_POLYMORPH_OTHER:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- mpr("Sorry, it doesn't work like that.");
- return (false);
- }
- zapping(ZAP_POLYMORPH_OTHER, powc, beam);
- break;
-
- case SPELL_SLOW:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_SLOWING, powc, beam);
- break;
-
- case SPELL_HASTE:
- if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1)
- return (false);
- zapping(ZAP_HASTING, powc, beam);
- break;
-
- case SPELL_PARALYZE:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_PARALYSIS, powc, beam);
- break;
-
- case SPELL_CONFUSE:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_CONFUSION, powc, beam);
- break;
-
- case SPELL_CONFUSING_TOUCH:
- cast_confusing_touch(powc);
- break;
-
- case SPELL_SURE_BLADE:
- cast_sure_blade(powc);
- break;
-
- case SPELL_INVISIBILITY:
- if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1)
- return (false);
- zapping(ZAP_INVISIBILITY, powc, beam);
- break;
-
- case SPELL_THROW_FLAME:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_FLAME, powc, beam);
- break;
-
- case SPELL_THROW_FROST:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_FROST, powc, beam);
- break;
-
- case SPELL_CONTROLLED_BLINK:
- blink();
- break;
-
- case SPELL_FREEZING_CLOUD:
- cast_big_c(powc, CLOUD_COLD);
- break;
-
- case SPELL_MEPHITIC_CLOUD:
- stinking_cloud(powc);
- break;
-
- case SPELL_RING_OF_FLAMES:
- cast_ring_of_flames(powc);
- break;
-
- case SPELL_RESTORE_STRENGTH:
- restore_stat(STAT_STRENGTH, false);
- break;
-
- case SPELL_RESTORE_INTELLIGENCE:
- restore_stat(STAT_INTELLIGENCE, false);
- break;
-
- case SPELL_RESTORE_DEXTERITY:
- restore_stat(STAT_DEXTERITY, false);
- break;
-
- case SPELL_VENOM_BOLT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_VENOM_BOLT, powc, beam);
- break;
-
- case SPELL_OLGREBS_TOXIC_RADIANCE:
- cast_toxic_radiance();
- break;
-
- case SPELL_TELEPORT_OTHER:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- mpr("Sorry, it doesn't work like that.");
- return (false);
- }
- // teleport creature (I think)
- zapping(ZAP_TELEPORTATION, powc, beam);
- break;
-
- case SPELL_LESSER_HEALING:
- cast_healing(5);
- break;
-
- case SPELL_GREATER_HEALING:
- cast_healing(25);
- break;
-
- case SPELL_CURE_POISON_I: //jmf: `healing' version? group w/ S_C_P_II?
- cast_cure_poison(powc);
- break;
-
- case SPELL_PURIFICATION:
- purification();
- break;
-
- case SPELL_DEATHS_DOOR:
- cast_deaths_door(powc);
- break;
-
- case SPELL_SELECTIVE_AMNESIA:
- cast_selective_amnesia(false);
- break; // Sif Muna power calls with true
-
- case SPELL_MASS_CONFUSION:
- mass_enchantment(ENCH_CONFUSION, powc, MHITYOU);
- break;
-
- case SPELL_SMITING:
- cast_smiting(powc);
- break;
-
- case SPELL_REPEL_UNDEAD:
- turn_undead(50);
- break;
-
- case SPELL_HOLY_WORD:
- holy_word(50);
- break;
-
- case SPELL_DETECT_CURSE:
- detect_curse(false);
- break;
-
- case SPELL_SUMMON_SMALL_MAMMAL:
- summon_small_mammals(powc); //jmf: hmm, that's definately *plural* ;-)
- break;
-
- case SPELL_ABJURATION_I: //jmf: why not group with SPELL_ABJURATION_II?
- abjuration(powc);
- break;
-
- case SPELL_SUMMON_SCORPIONS:
- summon_scorpions(powc);
- break;
-
- case SPELL_LEVITATION:
- potion_effect( POT_LEVITATION, powc );
- break;
-
- case SPELL_BOLT_OF_DRAINING:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_NEGATIVE_ENERGY, powc, beam);
- break;
-
- case SPELL_LEHUDIBS_CRYSTAL_SPEAR:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_CRYSTAL_SPEAR, powc, beam);
- break;
-
- case SPELL_BOLT_OF_INACCURACY:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_BEAM_OF_ENERGY, powc, beam);
- break;
-
- case SPELL_POISONOUS_CLOUD:
- cast_big_c(powc, CLOUD_POISON);
- break;
-
- case SPELL_POISON_ARROW:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- zapping( ZAP_POISON_ARROW, powc, beam );
- break;
-
- case SPELL_FIRE_STORM:
- cast_fire_storm(powc);
- break;
-
- case SPELL_DETECT_TRAPS:
- strcpy(info, "You detect ");
- strcat(info, (detect_traps(powc) > 0) ? "some traps!" : "nothing.");
- mpr(info);
- break;
-
- case SPELL_BLINK:
- random_blink(true);
- break;
-
- case SPELL_ISKENDERUNS_MYSTIC_BLAST:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- zapping( ZAP_MYSTIC_BLAST, powc, beam );
- break;
-
- case SPELL_SWARM:
- summon_swarm( powc, false, false );
- break;
-
- case SPELL_SUMMON_HORRIBLE_THINGS:
- summon_things(powc);
- break;
-
- case SPELL_ENSLAVEMENT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_ENSLAVEMENT, powc, beam);
- break;
-
- case SPELL_MAGIC_MAPPING:
- if (you.level_type == LEVEL_LABYRINTH || you.level_type == LEVEL_ABYSS)
- mpr("You feel momentarily disoriented.");
- else if (you.level_type == LEVEL_PANDEMONIUM)
- mpr("Your Earth magic cannot map Pandemonium.");
- else
- {
- mpr( "You feel aware of your surroundings." );
- powc = stepdown_value( powc, 10, 10, 40, 45 );
- magic_mapping( 5 + powc, 50 + random2avg( powc * 2, 2 ) );
- }
- break;
-
- case SPELL_HEAL_OTHER:
- if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1)
- return (false);
-
- if (spd.isMe)
- {
- mpr("Sorry, it doesn't work like that.");
- return (false);
- }
- zapping(ZAP_HEALING, powc, beam);
- break;
-
- case SPELL_ANIMATE_DEAD:
- mpr("You call on the dead to walk for you.");
- animate_dead(powc + 1, BEH_FRIENDLY, you.pet_target, 1);
- break;
-
- case SPELL_PAIN:
- if (spell_direction(spd, beam) == -1)
- return (false);
- dec_hp(1, false);
- zapping(ZAP_PAIN, powc, beam);
- break;
-
- case SPELL_EXTENSION:
- extension(powc);
- break;
-
- case SPELL_CONTROL_UNDEAD:
- mass_enchantment(ENCH_CHARM, powc, MHITYOU);
- break;
-
- case SPELL_ANIMATE_SKELETON:
- mpr("You attempt to give life to the dead...");
- animate_a_corpse(you.x_pos, you.y_pos, BEH_FRIENDLY, you.pet_target,
- CORPSE_SKELETON);
- break;
-
- case SPELL_VAMPIRIC_DRAINING:
- vampiric_drain(powc);
- break;
-
- case SPELL_SUMMON_WRAITHS:
- summon_undead(powc);
- break;
-
- case SPELL_DETECT_ITEMS:
- detect_items(powc);
- break;
-
- case SPELL_BORGNJORS_REVIVIFICATION:
- cast_revivification(powc);
- break;
-
- case SPELL_BURN:
- burn_freeze(powc, BEAM_FIRE);
- break;
-
- case SPELL_FREEZE:
- burn_freeze(powc, BEAM_COLD);
- break;
-
- case SPELL_SUMMON_ELEMENTAL:
- summon_elemental(powc, 0, 2);
- break;
-
- case SPELL_OZOCUBUS_REFRIGERATION:
- cast_refrigeration(powc);
- break;
-
- case SPELL_STICKY_FLAME:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_STICKY_FLAME, powc, beam);
- break;
-
- case SPELL_SUMMON_ICE_BEAST:
- summon_ice_beast_etc(powc, MONS_ICE_BEAST);
- break;
-
- case SPELL_OZOCUBUS_ARMOUR:
- ice_armour(powc, false);
- break;
-
- case SPELL_CALL_IMP:
- if (one_chance_in(3))
- summon_ice_beast_etc(powc, MONS_WHITE_IMP);
- else if (one_chance_in(7))
- summon_ice_beast_etc(powc, MONS_SHADOW_IMP);
- else
- summon_ice_beast_etc(powc, MONS_IMP);
- break;
-
- case SPELL_REPEL_MISSILES:
- missile_prot(powc);
- break;
-
- case SPELL_BERSERKER_RAGE:
- cast_berserk();
- break;
-
- case SPELL_DISPEL_UNDEAD:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_DISPEL_UNDEAD, powc, beam);
- break;
-
- case SPELL_GUARDIAN:
- summon_ice_beast_etc(powc, MONS_ANGEL);
- break;
-
- //jmf: FIXME: SPELL_PESTILENCE?
-
- case SPELL_THUNDERBOLT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_LIGHTNING, powc, beam);
- break;
-
- case SPELL_FLAME_OF_CLEANSING:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_CLEANSING_FLAME, powc, beam);
- break;
-
- //jmf: FIXME: SPELL_SHINING_LIGHT?
-
- case SPELL_SUMMON_DAEVA:
- summon_ice_beast_etc(powc, MONS_DAEVA);
- break;
-
- case SPELL_ABJURATION_II:
- abjuration(powc);
- break;
-
- // Remember that most holy spells above don't yet use powc!
-
- case SPELL_TWISTED_RESURRECTION:
- cast_twisted(powc, BEH_FRIENDLY, you.pet_target);
- break;
-
- case SPELL_REGENERATION:
- cast_regen(powc);
- break;
-
- case SPELL_BONE_SHARDS:
- cast_bone_shards(powc);
- break;
-
- case SPELL_BANISHMENT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_BANISHMENT, powc, beam);
- break;
-
- case SPELL_CIGOTUVIS_DEGENERATION:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_DEGENERATION, powc, beam);
- break;
-
- case SPELL_STING:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_STING, powc, beam);
- break;
-
- case SPELL_SUBLIMATION_OF_BLOOD:
- sublimation(powc);
- break;
-
- case SPELL_TUKIMAS_DANCE:
- dancing_weapon(powc, false);
- break;
-
- case SPELL_HELLFIRE:
- // should only be available from:
- // staff of Dispater & Sceptre of Asmodeus
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- zapping(ZAP_HELLFIRE, powc, beam);
- break;
-
- case SPELL_SUMMON_DEMON:
- mpr("You open a gate to Pandemonium!");
- summon_ice_beast_etc(powc, summon_any_demon(DEMON_COMMON));
- break;
-
- case SPELL_DEMONIC_HORDE:
- mpr("You open a gate to Pandemonium!");
- dem_hor2 = 3 + random2(5);
- for (dem_hor = 0; dem_hor < 4 + dem_hor2; dem_hor++)
- {
- summon_ice_beast_etc(powc, summon_any_demon(DEMON_LESSER));
- }
- break;
-
- case SPELL_SUMMON_GREATER_DEMON:
- mpr("You open a gate to Pandemonium!");
-
- dem_hor = ((random2(powc) <= 5) ? BEH_HOSTILE : BEH_CHARMED);
-
- if (dem_hor == BEH_CHARMED)
- mpr("You don't feel so good about this...");
-
- create_monster( summon_any_demon(DEMON_GREATER), ENCH_ABJ_V, dem_hor,
- you.x_pos, you.y_pos, MHITYOU, 250 );
-
- break;
-
- case SPELL_CORPSE_ROT:
- corpse_rot(0);
- break;
-
- case SPELL_TUKIMAS_VORPAL_BLADE:
- if (!brand_weapon(SPWPN_VORPAL, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_FIRE_BRAND:
- if (!brand_weapon(SPWPN_FLAMING, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_FREEZING_AURA:
- if (!brand_weapon(SPWPN_FREEZING, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_LETHAL_INFUSION:
- if (!brand_weapon(SPWPN_DRAINING, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_MAXWELLS_SILVER_HAMMER:
- if (!brand_weapon(SPWPN_DUMMY_CRUSHING, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_POISON_WEAPON:
- if (!brand_weapon(SPWPN_VENOM, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_CRUSH:
- burn_freeze(powc, BEAM_MISSILE);
- break;
-
- case SPELL_BOLT_OF_IRON:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_IRON_BOLT, powc, beam);
- break;
-
- case SPELL_STONE_ARROW:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_STONE_ARROW, powc, beam);
- break;
-
- case SPELL_TOMB_OF_DOROKLOHE:
- entomb();
- break;
-
- case SPELL_STONEMAIL:
- stone_scales(powc);
- break;
-
- case SPELL_SHOCK:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_ELECTRICITY, powc, beam);
- break;
-
- case SPELL_SWIFTNESS:
- cast_swiftness(powc);
- break;
-
- case SPELL_FLY:
- cast_fly(powc);
- break;
-
- case SPELL_INSULATION:
- cast_insulation(powc);
- break;
-
- case SPELL_ORB_OF_ELECTROCUTION:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_ORB_OF_ELECTRICITY, powc, beam);
- break;
-
- case SPELL_DETECT_CREATURES:
- detect_creatures(powc);
- break;
-
- case SPELL_CURE_POISON_II: // poison magic version of cure poison
- cast_cure_poison(powc);
- break;
-
- case SPELL_CONTROL_TELEPORT:
- cast_teleport_control(powc);
- break;
-
- case SPELL_POISON_AMMUNITION:
- cast_poison_ammo();
- break;
-
- case SPELL_RESIST_POISON:
- cast_resist_poison(powc);
- break;
-
- case SPELL_PROJECTED_NOISE:
- project_noise();
- break;
-
- case SPELL_ALTER_SELF:
- if (!enough_hp( you.hp_max / 2, true ))
- {
- mpr( "Your body is in too poor a condition "
- "for this spell to function." );
-
- return (false);
- }
-
- mpr("Your body is suffused with transfigurative energy!");
-
- set_hp( 1 + random2(you.hp), false );
-
- if (!mutate(100, false))
- mpr("Odd... you don't feel any different.");
- break;
-
- case SPELL_DEBUGGING_RAY:
- if (spell_direction(spd, beam, DIR_NONE, TARG_ANY) == -1)
- return (false);
- zapping(ZAP_DEBUGGING_RAY, powc, beam);
- break;
-
- case SPELL_RECALL:
- recall(0);
- break;
-
- case SPELL_PORTAL:
- portal();
- break;
-
- case SPELL_AGONY:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_AGONY, powc, beam);
- break;
-
- case SPELL_SPIDER_FORM:
- transform(powc, TRAN_SPIDER);
- break;
-
- case SPELL_DISRUPT:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- zapping(ZAP_DISRUPTION, powc, beam);
- break;
-
- case SPELL_DISINTEGRATE:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_DISINTEGRATION, powc, beam);
- break;
-
- case SPELL_BLADE_HANDS:
- transform(powc, TRAN_BLADE_HANDS);
- break;
-
- case SPELL_STATUE_FORM:
- transform(powc, TRAN_STATUE);
- break;
-
- case SPELL_ICE_FORM:
- transform(powc, TRAN_ICE_BEAST);
- break;
-
- case SPELL_DRAGON_FORM:
- transform(powc, TRAN_DRAGON);
- break;
-
- case SPELL_NECROMUTATION:
- transform(powc, TRAN_LICH);
- break;
-
- case SPELL_DEATH_CHANNEL:
- cast_death_channel(powc);
- break;
-
- case SPELL_SYMBOL_OF_TORMENT:
- if (you.is_undead || you.mutation[MUT_TORMENT_RESISTANCE])
- {
- mpr("To torment others, one must first know what torment means. ");
- return (false);
- }
- torment(you.x_pos, you.y_pos);
- break;
-
- case SPELL_DEFLECT_MISSILES:
- deflection(powc);
- break;
-
- case SPELL_ORB_OF_FRAGMENTATION:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_ORB_OF_FRAGMENTATION, powc, beam);
- break;
-
- case SPELL_ICE_BOLT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_ICE_BOLT, powc, beam);
- break;
-
- case SPELL_ARC:
- burn_freeze(powc, BEAM_ELECTRICITY);
- break;
-
- case SPELL_AIRSTRIKE:
- airstrike(powc);
- break;
-
- case SPELL_ICE_STORM:
- if (spell_direction(spd, beam) == -1)
- return (false);
- zapping(ZAP_ICE_STORM, powc, beam);
- break;
-
- case SPELL_SHADOW_CREATURES:
- mpr( "Wisps of shadow whirl around you..." );
- create_monster( RANDOM_MONSTER, ENCH_ABJ_II, BEH_FRIENDLY,
- you.x_pos, you.y_pos, you.pet_target, 250 );
- break;
-
- //jmf: new spells 19mar2000
- case SPELL_FLAME_TONGUE:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_FLAME_TONGUE, powc, beam);
-
- /*
- // This is not the place for this sort of power adjustment,
- // it just makes it harder to balance -- bwr
- zapping(ZAP_FLAME_TONGUE, 2 + random2(4) + random2(4)
- + random2(powc) / 25, beam);
- */
- break;
-
- case SPELL_PASSWALL:
- cast_passwall(powc);
- break;
-
- case SPELL_IGNITE_POISON:
- cast_ignite_poison(powc);
- break;
-
- case SPELL_STICKS_TO_SNAKES:
- cast_sticks_to_snakes(powc);
- break;
-
- case SPELL_SUMMON_LARGE_MAMMAL:
- cast_summon_large_mammal(powc);
- break;
-
- case SPELL_SUMMON_DRAGON:
- cast_summon_dragon(powc);
- break;
-
- case SPELL_TAME_BEASTS:
- cast_tame_beasts(powc);
- break;
-
- case SPELL_SLEEP:
- if (spell_direction(spd, beam) == -1)
- return (false);
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
-
- zapping(ZAP_SLEEP, powc, beam);
- break;
-
- case SPELL_MASS_SLEEP:
- cast_mass_sleep(powc);
- break;
-
- case SPELL_DETECT_MAGIC:
- mpr("FIXME: implement!");
- break;
-
- case SPELL_DETECT_SECRET_DOORS:
- cast_detect_secret_doors(powc);
- break;
-
- case SPELL_SEE_INVISIBLE:
- cast_see_invisible(powc);
- break;
-
- case SPELL_FORESCRY:
- cast_forescry(powc);
- break;
-
- case SPELL_SUMMON_BUTTERFLIES:
- cast_summon_butterflies(powc);
- break;
-
- case SPELL_WARP_BRAND:
- if (!brand_weapon(SPWPN_DISTORTION, powc))
- canned_msg(MSG_SPELL_FIZZLES);
- break;
-
- case SPELL_SILENCE:
- cast_silence(powc);
- break;
-
- case SPELL_SHATTER:
- cast_shatter(powc);
- break;
-
- case SPELL_DISPERSAL:
- cast_dispersal(powc);
- break;
-
- case SPELL_DISCHARGE:
- cast_discharge(powc);
- break;
-
- case SPELL_BEND:
- cast_bend(powc);
- break;
-
- case SPELL_BACKLIGHT:
- if (spell_direction(spd, beam) == -1)
- return (false);
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return (false);
- }
- zapping(ZAP_BACKLIGHT, powc + 10, beam);
- break;
-
- case SPELL_INTOXICATE:
- cast_intoxicate(powc);
- break;
-
- case SPELL_GLAMOUR:
- cast_glamour(powc);
- break;
-
- case SPELL_EVAPORATE:
- cast_evaporate(powc);
- break;
-
- case SPELL_FULSOME_DISTILLATION:
- cast_fulsome_distillation(powc);
- break;
-
- case SPELL_FRAGMENTATION:
- cast_fragmentation(powc);
- break;
-
- case SPELL_AIR_WALK:
- transform(powc, TRAN_AIR);
- break;
-
- case SPELL_SANDBLAST:
- cast_sandblast(powc);
- break;
-
- case SPELL_ROTTING:
- cast_rotting(powc);
- break;
-
- case SPELL_CONDENSATION_SHIELD:
- cast_condensation_shield(powc);
- break;
-
- case SPELL_SEMI_CONTROLLED_BLINK:
- cast_semi_controlled_blink(powc); //jmf: powc is ignored
- break;
-
- case SPELL_STONESKIN:
- cast_stoneskin(powc);
- break;
-
- case SPELL_SIMULACRUM:
- simulacrum(powc);
- break;
-
- case SPELL_CONJURE_BALL_LIGHTNING:
- cast_conjure_ball_lightning(powc);
- break;
-
- case SPELL_CHAIN_LIGHTNING:
- cast_chain_lightning(powc);
- break;
-
- case SPELL_TWIST:
- cast_twist(powc);
- break;
-
- case SPELL_FAR_STRIKE:
- cast_far_strike(powc);
- break;
-
- case SPELL_SWAP:
- cast_swap(powc);
- break;
-
- case SPELL_APPORTATION:
- cast_apportation(powc);
- break;
-
- default:
- mpr("Invalid spell!");
- break;
- } // end switch
-
- return (true);
-} // end you_spells()
-
-void exercise_spell( int spell, bool spc, bool success )
-{
- // (!success) reduces skill increase for miscast spells
- int ndx = 0;
- int skill;
- int exer = 0;
- int workout = 0;
-
- unsigned int disciplines = spell_type(spell);
-
- //jmf: evil evil evil -- exclude HOLY bit
- disciplines &= (~SPTYP_HOLY);
-
- int skillcount = count_bits( disciplines );
-
- if (!success)
- skillcount += 4 + random2(10);
-
- const int diff = spell_difficulty(spell);
- for (ndx = 0; ndx <= SPTYP_LAST_EXPONENT; ndx++)
- {
- if (!spell_typematch( spell, 1 << ndx ))
- continue;
-
- skill = spell_type2skill( 1 << ndx );
- workout = (random2(1 + diff) / skillcount);
-
- if (!one_chance_in(5))
- workout++; // most recently, this was an automatic add {dlb}
-
- exer += exercise( skill, workout );
- }
-
- /* ******************************************************************
- Other recent formulae for the above:
-
- * workout = random2(spell_difficulty(spell_ex)
- * (10 + (spell_difficulty(spell_ex) * 2 )) / 10 / spellsy + 1);
-
- * workout = spell_difficulty(spell_ex)
- * (15 + spell_difficulty(spell_ex)) / 15 / spellsy;
-
- spellcasting had also been generally exercised at the same time
- ****************************************************************** */
-
- if (spc)
- {
- exer += exercise(SK_SPELLCASTING, one_chance_in(3) ? 1
- : random2(1 + random2(diff)));
- }
-
- if (exer)
- did_god_conduct( DID_SPELL_PRACTISE, exer );
-} // end exercise_spell()
-
-static bool send_abyss()
-{
- if (you.level_type != LEVEL_ABYSS)
- {
- mpr("You are cast into the Abyss!");
- more();
- banished(DNGN_ENTER_ABYSS); // sends you to the abyss
- return (true);
- }
- else
- {
- mpr("The world appears momentarily distorted.");
- return (false);
- }
-}
-
-/* This determines how likely it is that more powerful wild magic effects
- * will occur. Set to 100 for the old probabilities (although the individual
- * effects have been made much nastier since then).
- */
-
-bool miscast_effect( unsigned int sp_type, int mag_pow, int mag_fail,
- int force_effect, const char *cause )
-{
-/* sp_type is the type of the spell
- * mag_pow is overall power of the spell or effect (ie its level)
- * mag_fail is the degree to which you failed
- * force_effect forces a certain effect to occur. Currently unused.
- */
- struct bolt beam;
- bool failMsg = true;
-
- int loopj = 0;
- int spec_effect = 0;
- int hurted = 0;
-
- if (sp_type == SPTYP_RANDOM)
- sp_type = 1 << (random2(12));
-
- spec_effect = (mag_pow * mag_fail * (10 + mag_pow) / 7
- * WILD_MAGIC_NASTINESS) / 100;
-
- if (force_effect == 100
- && random2(40) > spec_effect && random2(40) > spec_effect)
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- // setup beam
- beam.is_tracer = false;
-
- spec_effect = spec_effect / 100;
-
-#if DEBUG_DIAGNOSTICS
- const int old_fail = spec_effect;
-#endif
-
- spec_effect = random2(spec_effect);
-
- if (spec_effect > 3)
- spec_effect = 3;
- else if (spec_effect < 0)
- spec_effect = 0;
-
-#if DEBUG_DIAGNOSTICS
- snprintf( info, INFO_SIZE, "Sptype: %d, failure1: %d, failure2: %d",
- sp_type, old_fail, spec_effect );
- mpr( info, MSGCH_DIAGNOSTICS );
-#endif
-
- if (force_effect != 100)
- spec_effect = force_effect;
-
- switch (sp_type)
- {
- case SPTYP_CONJURATION:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Sparks fly from your %s!",
- your_hand(true) );
- mpr(info);
- break;
-
- case 1:
- mpr("The air around you crackles with energy!");
- break;
-
- case 2:
- snprintf( info, INFO_SIZE, "Wisps of smoke drift from your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("You are momentarily dazzled by a flash of light!");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("Your skin tingles.");
- break;
- case 7:
- mpr("Your skin glows momentarily.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- // josh declares mummies cannot smell {dlb}
- if (you.species != SP_MUMMY)
- mpr("You smell something strange.");
- else
- mpr("Your bandages flutter.");
- }
- break;
-
- case 1: // a bit less harmless stuff
- switch (random2(2))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Smoke pours from your %s!",
- your_hand(true));
- mpr(info);
-
- big_cloud( CLOUD_GREY_SMOKE, you.x_pos, you.y_pos, 20,
- 7 + random2(7) );
- break;
- case 1:
- mpr("A wave of violent energy washes through your body!");
- ouch(6 + random2avg(7, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- }
- break;
-
- case 2: // rather less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("Energy rips through your body!");
- ouch(9 + random2avg(17, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- mpr("You are caught in a violent explosion!");
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 12 );
- beam.flavour = BEAM_MISSILE; // unsure about this
- // BEAM_EXPLOSION instead? {dlb}
-
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = random_colour();
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = 1;
-
- explosion(beam);
- break;
- }
- break;
-
- case 3: // considerably less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("You are blasted with magical energy!");
- ouch(12 + random2avg(29, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- mpr("There is a sudden explosion of magical energy!");
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 20 );
- beam.flavour = BEAM_MISSILE; // unsure about this
- // BEAM_EXPLOSION instead? {dlb}
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = random_colour();
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = coinflip()?1:2;
-
- explosion(beam);
- break;
- }
- break;
- }
- break; // end conjuration
-
- case SPTYP_ENCHANTMENT:
- switch (spec_effect)
- {
- case 0: // harmless messages only
- switch (random2(10))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Your %s glow momentarily.",
- your_hand(true) );
- mpr(info);
- break;
- case 1:
- mpr("The air around you crackles with energy!");
- break;
- case 2:
- mpr("Multicolored lights dance before your eyes!");
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("Waves of light ripple over your body.");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("Your skin tingles.");
- break;
- case 7:
- mpr("Your skin glows momentarily.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear something strange.", MSGCH_SOUND);
- else if (you.attribute[ATTR_TRANSFORMATION] != TRAN_AIR)
- mpr("Your skull vibrates slightly.");
- else
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- }
- break;
-
- case 1: // slightly annoying
- switch (random2(2))
- {
- case 0:
- potion_effect(POT_LEVITATION, 20);
- break;
- case 1:
- random_uselessness(2 + random2(7), 0);
- break;
- }
- break;
-
- case 2: // much more annoying
- switch (random2(7))
- {
- case 0:
- case 1:
- case 2:
- mpr("You sense a malignant aura.");
- curse_an_item(0, 0);
- break;
- case 3:
- case 4:
- case 5:
- potion_effect(POT_SLOWING, 10);
- break;
- case 6:
- potion_effect(POT_BERSERK_RAGE, 10);
- break;
- }
- break;
-
- case 3: // potentially lethal
- switch (random2(4))
- {
- case 0:
- do
- {
- curse_an_item(0, 0);
- loopj = random2(3);
- }
- while (loopj != 0);
-
- mpr("You sense an overwhelmingly malignant aura!");
- break;
- case 1:
- potion_effect(POT_PARALYSIS, 10);
- break;
- case 2:
- potion_effect(POT_CONFUSION, 10);
- break;
- case 3:
- mpr("You feel saturated with unharnessed energies!");
- you.magic_contamination += random2avg(19,3);
- break;
- }
- break;
- }
- break; // end enchantments
-
- case SPTYP_TRANSLOCATION:
- switch (spec_effect)
- {
- case 0: // harmless messages only
- switch (random2(10))
- {
- case 0:
- mpr("Space warps around you.");
- break;
- case 1:
- mpr("The air around you crackles with energy!");
- break;
- case 2:
- mpr("You feel a wrenching sensation.");
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("You spin around.");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("Your skin tingles.");
- break;
- case 7:
- mpr("The world appears momentarily distorted!");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- mpr("You feel uncomfortable.");
- break;
- }
- break;
-
- case 1: // mostly harmless
- switch (random2(6))
- {
- case 0:
- case 1:
- case 2:
- mpr("You are caught in a localised field of spatial distortion.");
- ouch(4 + random2avg(9, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 3:
- case 4:
- mpr("Space bends around you!");
- random_blink(false);
- ouch(4 + random2avg(7, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 5:
- mpr("Space twists in upon itself!");
- create_monster( MONS_SPATIAL_VORTEX, ENCH_ABJ_III, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 );
- break;
- }
- break;
-
- case 2: // less harmless
- switch (random2(7))
- {
- case 0:
- case 1:
- case 2:
- mpr("You are caught in a strong localised spatial distortion.");
- ouch(9 + random2avg(23, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 3:
- case 4:
- mpr("Space warps around you!");
-
- if (one_chance_in(3))
- you_teleport2( true );
- else
- random_blink( false );
-
- ouch(5 + random2avg(9, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- potion_effect(POT_CONFUSION, 40);
- break;
- case 5:
- mpr("Space twists in upon itself!");
-
- for (loopj = 0; loopj < 2 + random2(3); loopj++)
- {
- create_monster( MONS_SPATIAL_VORTEX, ENCH_ABJ_III,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
- }
- break;
- case 6:
- send_abyss();
- break;
- }
- break;
-
- case 3: // much less harmless
-
- switch (random2(4))
- {
- case 0:
- mpr("You are caught in an extremely strong localised spatial distortion!");
- ouch(15 + random2avg(29, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- mpr("Space warps crazily around you!");
- you_teleport2( true );
-
- ouch(9 + random2avg(17, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- potion_effect(POT_CONFUSION, 60);
- break;
- case 2:
- send_abyss();
- break;
- case 3:
- mpr("You feel saturated with unharnessed energies!");
- you.magic_contamination += random2avg(19,3);
- break;
- }
- break;
- }
- break; // end translocations
-
- case SPTYP_SUMMONING:
- switch (spec_effect)
- {
- case 0: // harmless messages only
- switch (random2(10))
- {
- case 0:
- mpr("Shadowy shapes form in the air around you, then vanish.");
- break;
- case 1:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear strange voices.", MSGCH_SOUND);
- else
- mpr("You feel momentarily dizzy.");
- break;
- case 2:
- mpr("Your head hurts.");
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("Your brain hurts!");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("The world appears momentarily distorted.");
- break;
- case 7:
- mpr("Space warps around you.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- mpr("Distant voices call out to you!");
- break;
- }
- break;
-
- case 1: // a little bad
- switch (random2(6))
- {
- case 0: // identical to translocation
- case 1:
- case 2:
- mpr("You are caught in a localised spatial distortion.");
- ouch(5 + random2avg(9, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
-
- case 3:
- mpr("Space twists in upon itself!");
- create_monster( MONS_SPATIAL_VORTEX, ENCH_ABJ_III, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 );
- break;
-
- case 4:
- case 5:
- if (create_monster( summon_any_demon(DEMON_LESSER), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 ) != -1)
- {
- mpr("Something appears in a flash of light!");
- }
- break;
- }
-
- case 2: // more bad
- switch (random2(6))
- {
- case 0:
- mpr("Space twists in upon itself!");
-
- for (loopj = 0; loopj < 2 + random2(3); loopj++)
- {
- create_monster( MONS_SPATIAL_VORTEX, ENCH_ABJ_III,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
- }
- break;
-
- case 1:
- case 2:
- if (create_monster( summon_any_demon(DEMON_COMMON), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250) != -1)
- {
- mpr("Something forms out of thin air!");
- }
- break;
-
- case 3:
- case 4:
- case 5:
- mpr("A chorus of chattering voices calls out to you!");
- create_monster( summon_any_demon(DEMON_LESSER), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
-
- create_monster( summon_any_demon(DEMON_LESSER), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
-
- if (coinflip())
- {
- create_monster( summon_any_demon(DEMON_LESSER), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
- }
-
- if (coinflip())
- {
- create_monster( summon_any_demon(DEMON_LESSER), ENCH_ABJ_V,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
- }
- break;
- }
- break;
-
- case 3: // more bad
- switch (random2(4))
- {
- case 0:
- if (create_monster( MONS_ABOMINATION_SMALL, 0, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 ) != -1)
- {
- mpr("Something forms out of thin air.");
- }
- break;
-
- case 1:
- if (create_monster( summon_any_demon(DEMON_GREATER), 0,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 ) != -1)
- {
- mpr("You sense a hostile presence.");
- }
- break;
-
- case 2:
- mpr("Something turns its malign attention towards you...");
-
- create_monster( summon_any_demon(DEMON_COMMON), ENCH_ABJ_III,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250 );
-
- create_monster( summon_any_demon(DEMON_COMMON), ENCH_ABJ_III,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250);
-
- if (coinflip())
- {
- create_monster(summon_any_demon(DEMON_COMMON), ENCH_ABJ_III,
- BEH_HOSTILE, you.x_pos, you.y_pos,
- MHITYOU, 250);
- }
- break;
-
- case 3:
- send_abyss();
- break;
- }
- break;
- } // end Summonings
- break;
-
- case SPTYP_DIVINATION:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- mpr("Weird images run through your mind.");
- break;
- case 1:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear strange voices.", MSGCH_SOUND);
- else
- mpr("Your nose twitches.");
- break;
- case 2:
- mpr("Your head hurts.");
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("Your brain hurts!");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("Everything looks hazy for a moment.");
- break;
- case 7:
- mpr("You seem to have forgotten something, but you can't remember what it was!");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- mpr("You feel uncomfortable.");
- break;
- }
- break;
-
- case 1: // more annoying things
- switch (random2(2))
- {
- case 0:
- mpr("You feel slightly disoriented.");
- forget_map(10 + random2(10));
- break;
- case 1:
- potion_effect(POT_CONFUSION, 10);
- break;
- }
- break;
-
- case 2: // even more annoying things
- switch (random2(2))
- {
- case 0:
- if (you.is_undead)
- mpr("You suddenly recall your previous life!");
- else if (lose_stat(STAT_INTELLIGENCE, 1 + random2(3)))
- mpr("You have damaged your brain!");
- else
- mpr("You have a terrible headache.");
- break;
- case 1:
- mpr("You feel lost.");
- forget_map(40 + random2(40));
- break;
- }
-
- potion_effect(POT_CONFUSION, 1); // common to all cases here {dlb}
- break;
-
- case 3: // nasty
- switch (random2(3))
- {
- case 0:
- mpr( forget_spell() ? "You have forgotten a spell!"
- : "You get a splitting headache." );
- break;
- case 1:
- mpr("You feel completely lost.");
- forget_map(100);
- break;
- case 2:
- if (you.is_undead)
- mpr("You suddenly recall your previous life.");
- else if (lose_stat(STAT_INTELLIGENCE, 3 + random2(3)))
- mpr("You have damaged your brain!");
- else
- mpr("You have a terrible headache.");
- break;
- }
-
- potion_effect(POT_CONFUSION, 1); // common to all cases here {dlb}
- break;
- }
- break; // end divinations
-
- case SPTYP_NECROMANCY:
- if (you.religion == GOD_KIKUBAAQUDGHA
- && (!player_under_penance() && you.piety >= 50
- && random2(150) <= you.piety))
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- }
-
- switch (spec_effect)
- {
- case 0:
- switch (random2(10))
- {
- case 0:
- // mummies cannot smell {dlb}
- if (you.species != SP_MUMMY)
- mpr("You smell decay.");
- break;
- case 1:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear strange and distant voices.", MSGCH_SOUND);
- else
- mpr("You feel homesick.");
- break;
- case 2:
- mpr("Pain shoots through your body.");
- break;
- case 3:
- mpr("Your bones ache.");
- break;
- case 4:
- mpr("The world around you seems to dim momentarily.");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("You shiver with cold.");
- break;
- case 7:
- mpr("You sense a malignant aura.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- mpr("You feel very uncomfortable.");
- break;
- }
- break;
-
- case 1: // a bit nasty
- switch (random2(3))
- {
- case 0:
- if (you.is_undead)
- {
- mpr("You feel weird for a moment.");
- break;
- }
- mpr("Pain shoots through your body!");
- ouch(5 + random2avg(15, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- mpr("You feel horribly lethargic.");
- potion_effect(POT_SLOWING, 15);
- break;
- case 2:
- // josh declares mummies cannot smell {dlb}
- if (you.species != SP_MUMMY)
- {
- mpr("You smell decay."); // identical to a harmless message
- you.rotting++;
- }
- break;
- }
- break;
-
- case 2: // much nastier
- switch (random2(3))
- {
- case 0:
- mpr("Flickering shadows surround you.");
-
- create_monster( MONS_SHADOW, ENCH_ABJ_II, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 );
-
- if (coinflip())
- {
- create_monster( MONS_SHADOW, ENCH_ABJ_II, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 );
- }
-
- if (coinflip())
- {
- create_monster( MONS_SHADOW, ENCH_ABJ_II, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250 );
- }
- break;
-
- case 1:
- if (!player_prot_life() && one_chance_in(3))
- {
- drain_exp();
- break;
- } // otherwise it just flows through...
-
- case 2:
- if (you.is_undead)
- {
- mpr("You feel weird for a moment.");
- break;
- }
- mpr("You convulse helplessly as pain tears through your body!");
- ouch(15 + random2avg(23, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- }
- break;
-
- case 3: // even nastier
- switch (random2(6))
- {
- case 0:
- if (you.is_undead)
- {
- mpr("Something just walked over your grave. No, really!");
- break;
- }
- mpr("Your body is wracked with pain!");
-
- dec_hp((you.hp / 2) - 1, false);
- break;
-
- case 1:
- mpr("You are engulfed in negative energy!");
-
- if (!player_prot_life())
- {
- drain_exp();
- break;
- } // otherwise it just flows through...
-
- case 2:
- lose_stat(STAT_RANDOM, 1 + random2avg(7, 2));
- break;
-
- case 3:
- if (you.is_undead)
- {
- mpr("You feel terrible.");
- break;
- }
-
- rot_player( random2avg(7, 2) + 1 );
- break;
-
- case 4:
- if (create_monster( MONS_SOUL_EATER, ENCH_ABJ_IV, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250) != -1)
- {
- mpr("Something reaches out for you...");
- }
- break;
-
- case 5:
- if (create_monster( MONS_REAPER, ENCH_ABJ_IV, BEH_HOSTILE,
- you.x_pos, you.y_pos, MHITYOU, 250) != -1)
- {
- mpr("Death has come for you...");
- }
- break;
- }
- break;
- }
- break; // end necromancy
-
- case SPTYP_TRANSMIGRATION:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Your %s glow momentarily.",
- your_hand(true));
- mpr(info);
- break;
- case 1:
- mpr("The air around you crackles with energy!");
- break;
- case 2:
- mpr("Multicolored lights dance before your eyes!");
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("Waves of light ripple over your body.");
- break;
- case 5:
- mpr("Strange energies run through your body.");
- break;
- case 6:
- mpr("Your skin tingles.");
- break;
- case 7:
- mpr("Your skin glows momentarily.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- // mummies cannot smell
- if (you.species != SP_MUMMY)
- mpr("You smell something strange.");
- break;
- }
- break;
-
- case 1: // slightly annoying
- switch (random2(2))
- {
- case 0:
- mpr("Your body is twisted painfully.");
- ouch(1 + random2avg(11, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- random_uselessness(2 + random2(7), 0);
- break;
- }
- break;
-
- case 2: // much more annoying
- switch (random2(4))
- {
- case 0:
- mpr("Your body is twisted very painfully!");
- ouch(3 + random2avg(23, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- mpr("You feel saturated with unharnessed energies!");
- you.magic_contamination += random2avg(19,3);
- break;
- case 2:
- potion_effect(POT_PARALYSIS, 10);
- break;
- case 3:
- potion_effect(POT_CONFUSION, 10);
- break;
- }
- break;
-
- case 3: // even nastier
-
- switch (random2(3))
- {
- case 0:
- mpr("Your body is flooded with distortional energies!");
- you.magic_contamination += random2avg(35, 3);
-
- ouch(3 + random2avg(18, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
-
- case 1:
- mpr("You feel very strange.");
- delete_mutation(100);
- ouch(5 + random2avg(23, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
-
- case 2:
- mpr("Your body is distorted in a weirdly horrible way!");
- failMsg = !give_bad_mutation();
- if (coinflip())
- give_bad_mutation(false, failMsg);
-
- ouch(5 + random2avg(23, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- }
- break;
- }
- break; // end transmigrations
-
- case SPTYP_FIRE:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Sparks fly from your %s!",
- your_hand(true));
- mpr(info);
- break;
- case 1:
- mpr("The air around you burns with energy!");
- break;
- case 2:
- snprintf( info, INFO_SIZE, "Wisps of smoke drift from your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- // mummies cannot smell
- if (you.species != SP_MUMMY)
- mpr("You smell smoke.");
- break;
- case 5:
- mpr("Heat runs through your body.");
- break;
- case 6:
- mpr("You feel uncomfortably hot.");
- break;
- case 7:
- mpr("Lukewarm flames ripple over your body.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a sizzling sound.", MSGCH_SOUND);
- else
- mpr("You feel like you have heartburn.");
- break;
- }
- break;
-
- case 1: // a bit less harmless stuff
- switch (random2(2))
- {
- case 0:
- snprintf( info, INFO_SIZE, "Smoke pours from your %s!",
- your_hand(true) );
- mpr(info);
-
- big_cloud( CLOUD_GREY_SMOKE + random2(3),
- you.x_pos, you.y_pos, 20, 7 + random2(7) );
- break;
-
- case 1:
- mpr("Flames sear your flesh.");
- scrolls_burn(3, OBJ_SCROLLS);
-
- if (player_res_fire() < 0)
- {
- ouch(2 + random2avg(13, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- }
- break;
- }
- break;
-
- case 2: // rather less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("You are blasted with fire.");
-
- ouch( check_your_resists( 5 + random2avg(29, 2), 2 ), 0,
- KILLED_BY_WILD_MAGIC, cause );
-
- scrolls_burn( 5, OBJ_SCROLLS );
- break;
-
- case 1:
- mpr("You are caught a fiery explosion!");
-
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 14 );
- beam.flavour = BEAM_FIRE;
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = RED;
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = 1;
-
- explosion(beam);
- break;
- }
- break;
-
- case 3: // considerably less harmless stuff
- switch (random2(3))
- {
- case 0:
- mpr("You are blasted with searing flames!");
-
- ouch( check_your_resists( 9 + random2avg(33, 2), 2 ), 0,
- KILLED_BY_WILD_MAGIC, cause );
-
- scrolls_burn( 10, OBJ_SCROLLS );
- break;
- case 1:
- mpr("There is a sudden and violent explosion of flames!");
-
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 20 );
- beam.flavour = BEAM_FIRE;
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy( beam.beam_name, "fireball" );
- beam.colour = RED;
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = coinflip()?1:2;
-
- explosion(beam);
- break;
-
- case 2:
- mpr("You are covered in liquid fire!");
- you.duration[DUR_LIQUID_FLAMES] += random2avg(7, 3) + 1;
- break;
- }
- break;
- }
- break; // end fire
-
- case SPTYP_ICE:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- mpr("You shiver with cold.");
- break;
- case 1:
- mpr("A chill runs through your body.");
- break;
- case 2:
- snprintf( info, INFO_SIZE, "Wisps of condensation drift from your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- snprintf( info, INFO_SIZE,"Your %s feel numb with cold.",
- your_hand(true));
- mpr(info);
- break;
- case 5:
- mpr("A chill runs through your body.");
- break;
- case 6:
- mpr("You feel uncomfortably cold.");
- break;
- case 7:
- mpr("Frost covers your body.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a crackling sound.", MSGCH_SOUND);
- else
- mpr("A snowflake lands on your nose.");
- break;
- }
- break;
-
- case 1: // a bit less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("You feel extremely cold.");
- break;
- case 1:
- mpr("You are covered in a thin layer of ice");
- scrolls_burn(2, OBJ_POTIONS);
-
- if (player_res_cold() < 0)
- ouch(4 + random2avg(5, 2), 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- }
- break;
-
- case 2: // rather less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("Heat is drained from your body.");
-
- ouch(check_your_resists(5 + random2(6) + random2(7), 3), 0,
- KILLED_BY_WILD_MAGIC, cause);
-
- scrolls_burn(4, OBJ_POTIONS);
- break;
-
- case 1:
- mpr("You are caught in an explosion of ice and frost!");
-
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 11 );
- beam.flavour = BEAM_COLD;
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = WHITE;
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = 1;
-
- explosion(beam);
- break;
- }
- break;
-
- case 3: // less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("You are blasted with ice!");
-
- ouch(check_your_resists(9 + random2avg(23, 2), 3), 0,
- KILLED_BY_WILD_MAGIC, cause);
-
- scrolls_burn(9, OBJ_POTIONS);
- break;
- case 1:
- snprintf( info, INFO_SIZE,"Freezing gasses pour from your %s!",
- your_hand(true));
- mpr(info);
-
- big_cloud(CLOUD_COLD, you.x_pos, you.y_pos, 20,
- 8 + random2(4));
- break;
- }
- break;
- }
- break; // end ice
-
- case SPTYP_EARTH:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- case 1:
- switch (random2(10))
- {
- case 0:
- mpr("You feel earthy.");
- break;
- case 1:
- mpr("You are showered with tiny particles of grit.");
- break;
- case 2:
- snprintf( info, INFO_SIZE,"Sand pours from your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 3:
- mpr("You feel a surge of energy from the ground.");
- break;
- case 4:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a distant rumble.", MSGCH_SOUND);
- else
- mpr("You sympathise with the stones.");
- break;
- case 5:
- mpr("You feel gritty.");
- break;
- case 6:
- mpr("You feel momentarily lethargic.");
- break;
- case 7:
- mpr("Motes of dust swirl before your eyes.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- strcpy(info, "Your ");
- strcat(info, (you.species == SP_NAGA) ? "underbelly feels" :
- (you.species == SP_CENTAUR) ? "hooves feel"
- : "feet feel");
- strcat(info, " warm.");
- mpr(info);
- break;
- }
- break;
-
- case 2: // slightly less harmless stuff
- switch (random2(1))
- {
- case 0:
- switch (random2(3))
- {
- case 0:
- mpr("You are hit by flying rocks!");
- break;
- case 1:
- mpr("You are blasted with sand!");
- break;
- case 2:
- mpr("Rocks fall onto you out of nowhere!");
- break;
- }
-
- hurted = random2avg(13, 2) + 10;
- hurted -= random2(1 + player_AC());
-
- ouch(hurted, 0, KILLED_BY_WILD_MAGIC, cause);
- break;
- }
- break;
-
- case 3: // less harmless stuff
- switch (random2(1))
- {
- case 0:
- mpr("You are caught in an explosion of flying shrapnel!");
-
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 15 );
- beam.flavour = BEAM_FRAG;
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = CYAN;
-
- if (one_chance_in(5))
- beam.colour = BROWN;
- if (one_chance_in(5))
- beam.colour = LIGHTCYAN;
-
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = 1;
-
- explosion(beam);
- break;
- }
- break;
- }
- break; // end Earth
-
- case SPTYP_AIR:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- mpr("Ouch! You gave yourself an electric shock.");
- break;
- case 1:
- mpr("You feel momentarily weightless.");
- break;
- case 2:
- snprintf( info, INFO_SIZE, "Wisps of vapour drift from your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("You feel electric!");
- break;
- case 5:
- snprintf( info, INFO_SIZE, "Sparks of electricity dance between your %s.",
- your_hand(true));
- mpr(info);
- break;
- case 6:
- mpr("You are blasted with air!");
- break;
- case 7:
- // mummies cannot smell
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a whooshing sound.", MSGCH_SOUND);
- else if (you.species != SP_MUMMY)
- mpr("You smell ozone.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- // mummies cannot smell
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a crackling sound.", MSGCH_SOUND);
- else if (you.species != SP_MUMMY)
- mpr("You smell something musty.");
- break;
- }
- break;
-
- case 1: // a bit less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("There is a short, sharp shower of sparks.");
- break;
- case 1:
- snprintf( info, INFO_SIZE, "The wind %s around you!",
- silenced(you.x_pos, you.y_pos) ? "whips" : "howls");
- mpr(info);
- break;
- }
- break;
-
- case 2: // rather less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("Electricity courses through your body.");
- ouch(check_your_resists(4 + random2avg(9, 2), 5), 0,
- KILLED_BY_WILD_MAGIC, cause);
- break;
- case 1:
- snprintf( info, INFO_SIZE, "Noxious gasses pour from your %s!",
- your_hand(true));
- mpr(info);
-
- big_cloud(CLOUD_STINK, you.x_pos, you.y_pos, 20,
- 9 + random2(4));
- break;
- }
- break;
-
- case 3: // less harmless stuff
- switch (random2(2))
- {
- case 0:
- mpr("You are caught in an explosion of electrical discharges!");
-
- beam.type = SYM_BURST;
- beam.damage = dice_def( 3, 8 );
- beam.flavour = BEAM_ELECTRICITY;
- beam.target_x = you.x_pos;
- beam.target_y = you.y_pos;
- strcpy(beam.beam_name, "explosion");
- beam.colour = LIGHTBLUE;
- beam.beam_source = NON_MONSTER;
- beam.thrower = (cause) ? KILL_MISC : KILL_YOU;
- beam.aux_source = cause;
- beam.ex_size = one_chance_in(4)?1:2;
-
- explosion(beam);
- break;
- case 1:
- snprintf( info, INFO_SIZE, "Venomous gasses pour from your %s!",
- your_hand(true));
- mpr(info);
-
- big_cloud( CLOUD_POISON, you.x_pos, you.y_pos, 20,
- 8 + random2(5) );
- break;
- }
- break;
- }
- break; // end air
-
- case SPTYP_POISON:
- switch (spec_effect)
- {
- case 0: // just a harmless message
- switch (random2(10))
- {
- case 0:
- mpr("You feel mildly nauseous.");
- break;
- case 1:
- mpr("You feel slightly ill.");
- break;
- case 2:
- snprintf( info, INFO_SIZE, "Wisps of poison gas drift from your %s.",
- your_hand(true) );
- mpr(info);
- break;
- case 3:
- mpr("You feel a strange surge of energy!");
- break;
- case 4:
- mpr("You feel faint for a moment.");
- break;
- case 5:
- mpr("You feel sick.");
- break;
- case 6:
- mpr("You feel odd.");
- break;
- case 7:
- mpr("You feel weak for a moment.");
- break;
- case 8:
- canned_msg(MSG_NOTHING_HAPPENS);
- break;
- case 9:
- if (!silenced(you.x_pos, you.y_pos))
- mpr("You hear a slurping sound.", MSGCH_SOUND);
- else if (you.species != SP_MUMMY)
- mpr("You taste almonds.");
- break;
- }
- break;
-
- case 1: // a bit less harmless stuff
- switch (random2(2))
- {
- case 0:
- if (player_res_poison())
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- mpr("You feel sick.");
- poison_player( 2 + random2(3) );
- break;
-
- case 1:
- snprintf( info, INFO_SIZE, "Noxious gasses pour from your %s!",
- your_hand(true) );
- mpr(info);
-
- place_cloud(CLOUD_STINK, you.x_pos, you.y_pos,
- 2 + random2(4));
- break;
- }
- break;
-
- case 2: // rather less harmless stuff
- switch (random2(3))
- {
- case 0:
- if (player_res_poison())
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- mpr("You feel very sick.");
- poison_player( 3 + random2avg(9, 2) );
- break;
-
- case 1:
- mpr("Noxious gasses pour from your hands!");
- big_cloud(CLOUD_STINK, you.x_pos, you.y_pos, 20,
- 8 + random2(5));
- break;
-
- case 2:
- if (player_res_poison())
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
- lose_stat(STAT_RANDOM, 1);
- break;
- }
- break;
-
- case 3: // less harmless stuff
- switch (random2(3))
- {
- case 0:
- if (player_res_poison())
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- mpr("You feel incredibly sick.");
- poison_player( 10 + random2avg(19, 2) );
- break;
- case 1:
- snprintf( info, INFO_SIZE, "Venomous gasses pour from your %s!",
- your_hand(true));
- mpr(info);
-
- big_cloud(CLOUD_POISON, you.x_pos, you.y_pos, 20,
- 7 + random2(7));
- break;
- case 2:
- if (player_res_poison())
- {
- canned_msg(MSG_NOTHING_HAPPENS);
- return (false);
- }
-
- lose_stat(STAT_RANDOM, 1 + random2avg(5, 2));
- break;
- }
- break;
- }
- break; // end poison
- }
-
- return (true);
-} // end miscast_effect()