diff options
Diffstat (limited to 'stone_soup/crawl-ref/source/spells1.cc')
-rw-r--r-- | stone_soup/crawl-ref/source/spells1.cc | 1199 |
1 files changed, 0 insertions, 1199 deletions
diff --git a/stone_soup/crawl-ref/source/spells1.cc b/stone_soup/crawl-ref/source/spells1.cc deleted file mode 100644 index a559b66f84..0000000000 --- a/stone_soup/crawl-ref/source/spells1.cc +++ /dev/null @@ -1,1199 +0,0 @@ -/* - * File: spells1.cc - * Summary: Implementations of some additional spells. - * Written by: Linley Henzell - * - * Change History (most recent first): - * - * <4> 06-mar-2000 bwr confusing_touch, sure_blade - * <3> 9/11/99 LRH Can't blink in the Abyss - * <3> 6/22/99 BWR Removed teleport control from - * random_blink(). - * <2> 5/20/99 BWR Increased greatest healing. - * <1> -/--/-- LRH Created - */ - -#include "AppHdr.h" -#include "spells1.h" - -#include <string.h> -#include <stdlib.h> -#include <stdio.h> - -#include "externs.h" - -#include "abyss.h" -#include "beam.h" -#include "cloud.h" -#include "direct.h" -#include "invent.h" -#include "it_use2.h" -#include "itemname.h" -#include "itemprop.h" -#include "misc.h" -#include "monplace.h" -#include "monstuff.h" -#include "mon-util.h" -#include "player.h" -#include "skills2.h" -#include "spells3.h" -#include "spells4.h" -#include "spl-util.h" -#include "stuff.h" -#include "view.h" -#include "wpn-misc.h" - -void blink(void) -{ - struct dist beam; - - // yes, there is a logic to this ordering {dlb}: - if (scan_randarts(RAP_PREVENT_TELEPORTATION)) - mpr("You feel a weird sense of stasis."); - else if (you.level_type == LEVEL_ABYSS && !one_chance_in(3)) - mpr("The power of the Abyss keeps you in your place!"); - else if (you.conf) - random_blink(false); - else if (!allow_control_teleport(true)) - { - mpr("A powerful magic interferes with your control of the blink."); - random_blink(false); - } - else - { - // query for location {dlb}: - for (;;) - { - mpr("Blink to where?", MSGCH_PROMPT); - - direction( beam, DIR_TARGET ); - - if (!beam.isValid) - { - canned_msg(MSG_SPELL_FIZZLES); - return; // early return {dlb} - } - - if (see_grid(beam.tx, beam.ty)) - break; - else - { - mesclr(); - mpr("You can't blink there!"); - } - } - - if (grid_is_solid(grd[beam.tx][beam.ty]) - || mgrd[beam.tx][beam.ty] != NON_MONSTER) - { - mpr("Oops! Maybe something was there already."); - random_blink(false); - } - else if (you.level_type == LEVEL_ABYSS) - { - abyss_teleport( false ); - you.pet_target = MHITNOT; - } - else - { - you.x_pos = beam.tx; - you.y_pos = beam.ty; - - // controlling teleport contaminates the player -- bwr - contaminate_player( 1 ); - } - - if (you.duration[DUR_CONDENSATION_SHIELD] > 0) - { - you.duration[DUR_CONDENSATION_SHIELD] = 0; - you.redraw_armour_class = 1; - } - } - - return; -} // end blink() - -void random_blink(bool allow_partial_control) -{ - int tx, ty; - bool succ = false; - - if (scan_randarts(RAP_PREVENT_TELEPORTATION)) - mpr("You feel a weird sense of stasis."); - else if (you.level_type == LEVEL_ABYSS && !one_chance_in(3)) - { - mpr("The power of the Abyss keeps you in your place!"); - } - else if (!random_near_space(you.x_pos, you.y_pos, tx, ty)) - { - mpr("You feel jittery for a moment."); - } - -#ifdef USE_SEMI_CONTROLLED_BLINK - //jmf: add back control, but effect is cast_semi_controlled_blink(pow) - else if (you.attribute[ATTR_CONTROL_TELEPORT] && !you.conf - && allow_partial_control && allow_control_teleport()) - { - mpr("You may select the general direction of your translocation."); - cast_semi_controlled_blink(100); - succ = true; - } -#endif - - else - { - mpr("You blink."); - - succ = true; - you.x_pos = tx; - you.y_pos = ty; - - if (you.level_type == LEVEL_ABYSS) - { - abyss_teleport( false ); - you.pet_target = MHITNOT; - } - } - - if (succ && you.duration[DUR_CONDENSATION_SHIELD] > 0) - { - you.duration[DUR_CONDENSATION_SHIELD] = 0; - you.redraw_armour_class = 1; - } - - return; -} // end random_blink() - -void fireball(int power) -{ - struct dist fire_ball; - - mpr( STD_DIRECTION_PROMPT, MSGCH_PROMPT ); - - message_current_target(); - - direction( fire_ball, DIR_NONE, TARG_ENEMY ); - - if (!fire_ball.isValid) - canned_msg(MSG_SPELL_FIZZLES); - else - { - struct bolt beam; - - beam.source_x = you.x_pos; - beam.source_y = you.y_pos; - beam.target_x = fire_ball.tx; - beam.target_y = fire_ball.ty; - - zapping(ZAP_FIREBALL, power, beam); - } - - return; -} // end fireball() - -void cast_fire_storm(int powc) -{ - struct bolt beam; - struct dist targ; - - mpr("Where?"); - - direction( targ, DIR_TARGET, TARG_ENEMY ); - - beam.target_x = targ.tx; - beam.target_y = targ.ty; - - if (!targ.isValid) - { - canned_msg(MSG_SPELL_FIZZLES); - return; - } - - beam.ex_size = 2 + (random2(powc) > 75); - beam.flavour = BEAM_LAVA; - beam.type = SYM_ZAP; - beam.colour = RED; - beam.beam_source = MHITYOU; - beam.thrower = KILL_YOU_MISSILE; - beam.aux_source = NULL; - beam.obvious_effect = false; - beam.is_beam = false; - beam.is_tracer = false; - beam.is_explosion = true; - beam.ench_power = powc; // used for radius - strcpy( beam.beam_name, "great blast of fire" ); - beam.hit = 20 + powc / 10; - beam.damage = calc_dice( 6, 15 + powc ); - - explosion( beam ); - mpr("A raging storm of fire appears!"); - - viewwindow(1, false); -} // end cast_fire_storm() - - -void cast_chain_lightning( int powc ) -{ - struct bolt beam; - - // initialize beam structure - strcpy( beam.beam_name, "lightning arc" ); - beam.aux_source = "chain lightning"; - beam.beam_source = MHITYOU; - beam.thrower = KILL_YOU_MISSILE; - beam.range = 8; - beam.rangeMax = 8; - beam.hit = AUTOMATIC_HIT; - beam.type = SYM_ZAP; - beam.flavour = BEAM_ELECTRICITY; - beam.obvious_effect = true; - beam.is_beam = false; // since we want to stop at our target - beam.is_explosion = false; - beam.is_tracer = false; - - int sx, sy; - int tx, ty; - int i; - - for (sx = you.x_pos, sy = you.y_pos; - powc > 0; - powc -= 8 + random2(13), sx = tx, sy = ty) - { - // infinity as far as this spell is concerned - // (Range - 1) is used because the distance is randomized and - // may be shifted by one. - int min_dist = MONSTER_LOS_RANGE - 1; - - int dist; - int count = 0; - - tx = -1; - ty = -1; - - for (i = 0; i < MAX_MONSTERS; i++) - { - struct monsters *monster = &menv[i]; - - if (monster->type == -1) - continue; - - dist = grid_distance( sx, sy, monster->x, monster->y ); - - // check for the source of this arc - if (!dist) - continue; - - // randomize distance (arcs don't care about a couple of feet) - dist += (random2(3) - 1); - - // always ignore targets further than current one - if (dist > min_dist) - continue; - - if (!check_line_of_sight( sx, sy, monster->x, monster->y )) - continue; - - count++; - - if (dist < min_dist) - { - // switch to looking for closer targets (but not always) - if (!one_chance_in(10)) - { - min_dist = dist; - tx = monster->x; - ty = monster->y; - count = 0; - } - } - else if (tx == -1 || one_chance_in( count )) - { - // either first target, or new selected target at min_dist - tx = monster->x; - ty = monster->y; - - // need to set min_dist for first target case - if (dist < min_dist) - min_dist = dist; - } - } - - // now check if the player is a target: - dist = grid_distance( sx, sy, you.x_pos, you.y_pos ); - - if (dist) // ie player was not the source - { - // distance randomized (as above) - dist += (random2(3) - 1); - - // select player if only, closest, or randomly selected - if ((tx == -1 - || dist < min_dist - || (dist == min_dist && one_chance_in( count + 1 ))) - && check_line_of_sight( sx, sy, you.x_pos, you.y_pos )) - { - tx = you.x_pos; - ty = you.y_pos; - } - } - - const bool see_source = see_grid( sx, sy ); - const bool see_targ = see_grid( tx, ty ); - - if (tx == -1) - { - if (see_source) - mpr( "The lightning grounds out." ); - - break; - } - - // Trying to limit message spamming here so we'll only mention - // the thunder when it's out of LoS. - if (noisy( 25, sx, sy ) && !see_source) - mpr( "You hear a mighty clap of thunder!", MSGCH_SOUND ); - - if (see_source && !see_targ) - mpr( "The lightning arcs out of your line of sight!" ); - else if (!see_source && see_targ) - mpr( "The lightning arc suddenly appears!" ); - - beam.source_x = sx; - beam.source_y = sy; - beam.target_x = tx; - beam.target_y = ty; - beam.colour = LIGHTBLUE; - beam.damage = calc_dice( 2, 10 + powc / 2 ); // from beam.cc - fire_beam( beam ); - } - - more(); -} - -void identify(int power) -{ - int id_used = 1; - int item_slot; - char str_pass[ ITEMNAME_SIZE ]; - - // scrolls of identify *may* produce "extra" identifications {dlb}: - if (power == -1 && one_chance_in(5)) - id_used += (coinflip()? 1 : 2); - - do - { - item_slot = prompt_invent_item( "Identify which item?", -1, true, - false, false ); - if (item_slot == PROMPT_ABORT) - { - canned_msg( MSG_OK ); - return; - } - - set_ident_type( you.inv[item_slot].base_type, - you.inv[item_slot].sub_type, ID_KNOWN_TYPE ); - - set_ident_flags( you.inv[item_slot], ISFLAG_IDENT_MASK ); - - // output identified item - in_name( item_slot, DESC_INVENTORY_EQUIP, str_pass ); - mpr( str_pass ); - - if (item_slot == you.equip[EQ_WEAPON]) - you.wield_change = true; - - id_used--; - } - while (id_used > 0); -} // end identify() - -void conjure_flame(int pow) -{ - struct dist spelld; - - bool done_first_message = false; - - for (;;) - { - if (done_first_message) - mpr("Where would you like to place the cloud?", MSGCH_PROMPT); - else - { - mpr("You cast a flaming cloud spell! But where?", MSGCH_PROMPT); - done_first_message = true; - } - - direction( spelld, DIR_TARGET, TARG_ENEMY ); - - if (!spelld.isValid) - { - canned_msg(MSG_SPELL_FIZZLES); - return; - } - - if (!see_grid(spelld.tx, spelld.ty)) - { - mpr("You can't see that place!"); - continue; - } - - if (grid_is_solid(grd[ spelld.tx ][ spelld.ty ]) - || mgrd[ spelld.tx ][ spelld.ty ] != NON_MONSTER - || env.cgrid[ spelld.tx ][ spelld.ty ] != EMPTY_CLOUD) - { - mpr( "There's already something there!" ); - continue; - } - - break; - } - - int durat = 5 + (random2(pow) / 2) + (random2(pow) / 2); - - if (durat > 23) - durat = 23; - - place_cloud( CLOUD_FIRE, spelld.tx, spelld.ty, durat ); -} // end cast_conjure_flame() - -void stinking_cloud( int pow ) -{ - struct dist spelld; - struct bolt beem; - - mpr( STD_DIRECTION_PROMPT, MSGCH_PROMPT ); - - message_current_target(); - - direction( spelld, DIR_NONE, TARG_ENEMY ); - - if (!spelld.isValid) - { - canned_msg(MSG_SPELL_FIZZLES); - return; - } - - beem.target_x = spelld.tx; - beem.target_y = spelld.ty; - - beem.source_x = you.x_pos; - beem.source_y = you.y_pos; - - strcpy(beem.beam_name, "ball of vapour"); - beem.colour = GREEN; - beem.range = 6; - beem.rangeMax = 6; - beem.damage = dice_def( 1, 0 ); - beem.hit = 20; - beem.type = SYM_ZAP; - beem.flavour = BEAM_MMISSILE; - beem.ench_power = pow; - beem.beam_source = MHITYOU; - beem.thrower = KILL_YOU; - beem.aux_source = NULL; - beem.is_beam = false; - beem.is_tracer = false; - - fire_beam(beem); -} // end stinking_cloud() - -void cast_big_c(int pow, char cty) -{ - struct dist cdis; - - mpr("Where do you want to put it?", MSGCH_PROMPT); - direction( cdis, DIR_TARGET, TARG_ENEMY ); - - if (!cdis.isValid) - { - canned_msg(MSG_SPELL_FIZZLES); - return; - } - - big_cloud( cty, cdis.tx, cdis.ty, pow, 8 + random2(3) ); -} // end cast_big_c() - -void big_cloud(char clouds, char cl_x, char cl_y, int pow, int size) -{ - apply_area_cloud(make_a_normal_cloud, cl_x, cl_y, pow, size, clouds); -} // end big_cloud() - -static char healing_spell( int healed ) -{ - int mgr = 0; - struct monsters *monster = 0; // NULL {dlb} - struct dist bmove; - - mpr("Which direction?", MSGCH_PROMPT); - direction( bmove, DIR_DIR, TARG_FRIEND ); - - if (!bmove.isValid) - { - canned_msg( MSG_HUH ); - return 0; - } - - mgr = mgrd[you.x_pos + bmove.dx][you.y_pos + bmove.dy]; - - if (bmove.dx == 0 && bmove.dy == 0) - { - mpr("You are healed."); - inc_hp(healed, false); - return 1; - } - - if (mgr == NON_MONSTER) - { - mpr("There isn't anything there!"); - return -1; - } - - monster = &menv[mgr]; - - if (heal_monster(monster, healed, false)) - { - strcpy(info, "You heal "); - strcat(info, ptr_monam( monster, DESC_NOCAP_THE )); - strcat(info, "."); - mpr(info); - - if (monster->hit_points == monster->max_hit_points) - simple_monster_message( monster, " is completely healed." ); - else - print_wounds(monster); - } - else - { - canned_msg(MSG_NOTHING_HAPPENS); - } - - return 1; -} // end healing_spell() - -#if 0 -char cast_lesser_healing( int pow ) -{ - return healing_spell(5 + random2avg(7, 2)); -} // end lesser healing() - -char cast_greater_healing( int pow ) -{ - return healing_spell(15 + random2avg(29, 2)); -} // end cast_greater_healing() - -char cast_greatest_healing( int pow ) -{ - return healing_spell(50 + random2avg(49, 2)); -} // end cast_greatest_healing() -#endif - -char cast_healing( int pow ) -{ - if (pow > 50) - pow = 50; - - return (healing_spell( pow + roll_dice( 2, pow ) - 2 )); -} - -bool cast_revivification(int power) -{ - int loopy = 0; // general purpose loop variable {dlb} - bool success = false; - int loss = 0; - - if (you.hp == you.hp_max) - canned_msg(MSG_NOTHING_HAPPENS); - else if (you.hp_max < 21) - mpr("You lack the resilience to cast this spell."); - else - { - mpr("Your body is healed in an amazingly painful way."); - - loss = 2; - for (loopy = 0; loopy < 9; loopy++) - { - if (random2(power) < 8) - loss++; - } - - dec_max_hp( loss ); - set_hp( you.hp_max, false ); - success = true; - } - - return (success); -} // end cast_revivification() - -void cast_cure_poison(int mabil) -{ - if (!you.poison) - canned_msg(MSG_NOTHING_HAPPENS); - else - reduce_poison_player( 2 + random2(mabil) + random2(3) ); - - return; -} // end cast_cure_poison() - -void purification(void) -{ - mpr("You feel purified!"); - - you.poison = 0; - you.rotting = 0; - you.conf = 0; - you.slow = 0; - you.disease = 0; - you.paralysis = 0; // can't currently happen -- bwr -} // end purification() - -int allowed_deaths_door_hp(void) -{ - int hp = you.skills[SK_NECROMANCY] / 2; - - if (you.religion == GOD_KIKUBAAQUDGHA && !player_under_penance()) - hp += you.piety / 15; - - return (hp); -} - -void cast_deaths_door(int pow) -{ - if (you.is_undead) - mpr("You're already dead!"); - else if (you.deaths_door) - mpr("Your appeal for an extension has been denied."); - else - { - mpr("You feel invincible!"); - mpr("You seem to hear sand running through an hourglass..."); - - set_hp( allowed_deaths_door_hp(), false ); - deflate_hp( you.hp_max, false ); - - you.deaths_door = 10 + random2avg(13, 3) + (random2(pow) / 10); - - if (you.deaths_door > 25) - you.deaths_door = 23 + random2(5); - } - - return; -} - -// can't use beam variables here, because of monster_die and the puffs of smoke -void abjuration(int pow) -{ - struct monsters *monster = 0; // NULL {dlb} - - mpr("Send 'em back where they came from!"); - - for (int ab = 0; ab < MAX_MONSTERS; ab++) - { - monster = &menv[ab]; - - int abjLevel; - - if (monster->type == -1 || !mons_near(monster)) - continue; - - if (mons_friendly(monster)) - continue; - - abjLevel = mons_del_ench(monster, ENCH_ABJ_I, ENCH_ABJ_VI); - if (abjLevel != ENCH_NONE) - { - abjLevel -= 1 + (random2(pow) / 8); - - if (abjLevel < ENCH_ABJ_I) - monster_die(monster, KILL_RESET, 0); - else - { - simple_monster_message(monster, " shudders."); - mons_add_ench(monster, abjLevel); - } - } - } -} // end abjuration() - -// Antimagic is sort of an anti-extension... it sets a lot of magical -// durations to 1 so it's very nasty at times (and potentially lethal, -// that's why we reduce levitation to 2, so that the player has a chance -// to stop insta-death... sure the others could lead to death, but that's -// not as direct as falling into deep water) -- bwr -void antimagic( void ) -{ - if (you.haste) - you.haste = 1; - - if (you.slow) - you.slow = 1; - - if (you.paralysis) - you.paralysis = 1; - - if (you.conf) - you.conf = 1; - - if (you.might) - you.might = 1; - - if (you.levitation > 2) - you.levitation = 2; - - if (you.invis) - you.invis = 1; - - if (you.duration[DUR_WEAPON_BRAND]) - you.duration[DUR_WEAPON_BRAND] = 1; - - if (you.duration[DUR_ICY_ARMOUR]) - you.duration[DUR_ICY_ARMOUR] = 1; - - if (you.duration[DUR_REPEL_MISSILES]) - you.duration[DUR_REPEL_MISSILES] = 1; - - if (you.duration[DUR_REGENERATION]) - you.duration[DUR_REGENERATION] = 1; - - if (you.duration[DUR_DEFLECT_MISSILES]) - you.duration[DUR_DEFLECT_MISSILES] = 1; - - if (you.fire_shield) - you.fire_shield = 1; - - if (you.duration[DUR_SWIFTNESS]) - you.duration[DUR_SWIFTNESS] = 1; - - if (you.duration[DUR_INSULATION]) - you.duration[DUR_INSULATION] = 1; - - if (you.duration[DUR_STONEMAIL]) - you.duration[DUR_STONEMAIL] = 1; - - if (you.duration[DUR_CONTROLLED_FLIGHT]) - you.duration[DUR_CONTROLLED_FLIGHT] = 1; - - if (you.duration[DUR_CONTROL_TELEPORT]) - you.duration[DUR_CONTROL_TELEPORT] = 1; - - if (you.duration[DUR_RESIST_POISON]) - you.duration[DUR_RESIST_POISON] = 1; - - if (you.duration[DUR_TRANSFORMATION]) - you.duration[DUR_TRANSFORMATION] = 1; - - //jmf: added following - if (you.duration[DUR_STONESKIN]) - you.duration[DUR_STONESKIN] = 1; - - if (you.duration[DUR_FORESCRY]) - you.duration[DUR_FORESCRY] = 1; - - if (you.duration[DUR_SEE_INVISIBLE]) - you.duration[DUR_SEE_INVISIBLE] = 1; - - if (you.duration[DUR_SILENCE]) - you.duration[DUR_SILENCE] = 1; - - if (you.duration[DUR_CONDENSATION_SHIELD]) - you.duration[DUR_CONDENSATION_SHIELD] = 1; - - contaminate_player( -1 * (1+random2(5))); -} // end antimagic() - -void extension(int pow) -{ - int contamination = random2(2); - - if (you.haste) - { - potion_effect(POT_SPEED, pow); - contamination++; - } - - if (you.slow) - potion_effect(POT_SLOWING, pow); - -#if 0 - if (you.paralysis) - potion_effect(POT_PARALYSIS, pow); // how did you cast extension? - - if (you.conf) - potion_effect(POT_CONFUSION, pow); // how did you cast extension? -#endif - - if (you.might) - { - potion_effect(POT_MIGHT, pow); - contamination++; - } - - if (you.levitation) - potion_effect(POT_LEVITATION, pow); - - if (you.invis) - { - potion_effect(POT_INVISIBILITY, pow); - contamination++; - } - - if (you.duration[DUR_ICY_ARMOUR]) - ice_armour(pow, true); - - if (you.duration[DUR_REPEL_MISSILES]) - missile_prot(pow); - - if (you.duration[DUR_REGENERATION]) - cast_regen(pow); - - if (you.duration[DUR_DEFLECT_MISSILES]) - deflection(pow); - - if (you.fire_shield) - { - you.fire_shield += random2(pow / 20); - - if (you.fire_shield > 50) - you.fire_shield = 50; - - mpr("Your ring of flames roars with new vigour!"); - } - - if ( !(you.duration[DUR_WEAPON_BRAND] < 1 - || you.duration[DUR_WEAPON_BRAND] > 80) ) - { - you.duration[DUR_WEAPON_BRAND] += 5 + random2(8); - } - - if (you.duration[DUR_SWIFTNESS]) - cast_swiftness(pow); - - if (you.duration[DUR_INSULATION]) - cast_insulation(pow); - - if (you.duration[DUR_STONEMAIL]) - stone_scales(pow); - - if (you.duration[DUR_CONTROLLED_FLIGHT]) - cast_fly(pow); - - if (you.duration[DUR_CONTROL_TELEPORT]) - cast_teleport_control(pow); - - if (you.duration[DUR_RESIST_POISON]) - cast_resist_poison(pow); - - if (you.duration[DUR_TRANSFORMATION]) - { - mpr("Your transformation has been extended."); - you.duration[DUR_TRANSFORMATION] += random2(pow); - if (you.duration[DUR_TRANSFORMATION] > 100) - you.duration[DUR_TRANSFORMATION] = 100; - } - - //jmf: added following - if (you.duration[DUR_STONESKIN]) - cast_stoneskin(pow); - - if (you.duration[DUR_FORESCRY]) - cast_forescry(pow); - - if (you.duration[DUR_SEE_INVISIBLE]) - cast_see_invisible(pow); - - if (you.duration[DUR_SILENCE]) //how precisely did you cast extension? - cast_silence(pow); - - if (you.duration[DUR_CONDENSATION_SHIELD]) - cast_condensation_shield(pow); - - if (contamination) - contaminate_player( contamination ); -} // end extension() - -void ice_armour(int pow, bool extending) -{ - if (!player_light_armour()) - { - if (!extending) - mpr("You are wearing too much armour."); - - return; - } - - if (you.duration[DUR_STONEMAIL] || you.duration[DUR_STONESKIN]) - { - if (!extending) - mpr("The spell conflicts with another spell still in effect."); - - return; - } - - if (you.duration[DUR_ICY_ARMOUR]) - mpr( "Your icy armour thickens." ); - else - { - if (you.attribute[ATTR_TRANSFORMATION] == TRAN_ICE_BEAST) - mpr( "Your icy body feels more resilient." ); - else - mpr( "A film of ice covers your body!" ); - - you.redraw_armour_class = 1; - } - - you.duration[DUR_ICY_ARMOUR] += 20 + random2(pow) + random2(pow); - - if (you.duration[DUR_ICY_ARMOUR] > 50) - you.duration[DUR_ICY_ARMOUR] = 50; -} // end ice_armour() - -void stone_scales(int pow) -{ - int dur_change = 0; - - if (you.duration[DUR_ICY_ARMOUR] || you.duration[DUR_STONESKIN]) - { - mpr("The spell conflicts with another spell still in effect."); - return; - } - - if (you.duration[DUR_STONEMAIL]) - mpr("Your scaly armour looks firmer."); - else - { - if (you.attribute[ATTR_TRANSFORMATION] == TRAN_STATUE) - mpr( "Your stone body feels more resilient." ); - else - mpr( "A set of stone scales covers your body!" ); - - you.redraw_evasion = 1; - you.redraw_armour_class = 1; - } - - dur_change = 20 + random2(pow) + random2(pow); - - if (dur_change + you.duration[DUR_STONEMAIL] >= 100) - you.duration[DUR_STONEMAIL] = 100; - else - you.duration[DUR_STONEMAIL] += dur_change; - - burden_change(); -} // end stone_scales() - -void missile_prot(int pow) -{ - mpr("You feel protected from missiles."); - - you.duration[DUR_REPEL_MISSILES] += 8 + roll_dice( 2, pow ); - - if (you.duration[DUR_REPEL_MISSILES] > 100) - you.duration[DUR_REPEL_MISSILES] = 100; -} // end missile_prot() - -void deflection(int pow) -{ - mpr("You feel very safe from missiles."); - - you.duration[DUR_DEFLECT_MISSILES] += 15 + random2(pow); - - if (you.duration[DUR_DEFLECT_MISSILES] > 100) - you.duration[DUR_DEFLECT_MISSILES] = 100; -} // end cast_deflection() - -void cast_regen(int pow) -{ - //if (pow > 150) pow = 150; - mpr("Your skin crawls."); - - you.duration[DUR_REGENERATION] += 5 + roll_dice( 2, pow / 3 + 1 ); - - if (you.duration[DUR_REGENERATION] > 100) - you.duration[DUR_REGENERATION] = 100; -} // end cast_regen() - -void cast_berserk(void) -{ - go_berserk(true); -} // end cast_berserk() - -void cast_swiftness(int power) -{ - int dur_incr = 0; - - if (player_in_water()) - { - if (you.species == SP_MERFOLK) - mpr("This spell will not benefit you while you're swimming!"); - else - mpr("This spell will not benefit you while you're in water!"); - - return; - } - - if (!you.duration[DUR_SWIFTNESS] && player_movement_speed() <= 6) - { - mpr( "You can't move any more quickly." ); - return; - } - - // Reduced the duration: -- bwr - // dur_incr = random2(power) + random2(power) + 20; - dur_incr = 20 + random2( power ); - - // Centaurs do have feet and shouldn't get here anyways -- bwr - snprintf( info, INFO_SIZE, "You feel quick%s", - (you.species == SP_NAGA) ? "." : " on your feet." ); - - mpr(info); - - if (dur_incr + you.duration[DUR_SWIFTNESS] > 100) - you.duration[DUR_SWIFTNESS] = 100; - else - you.duration[DUR_SWIFTNESS] += dur_incr; -} // end cast_swiftness() - -void cast_fly(int power) -{ - int dur_change = 25 + random2(power) + random2(power); - - if (!player_is_levitating()) - mpr("You fly up into the air."); - else - mpr("You feel more buoyant."); - - if (you.levitation + dur_change > 100) - you.levitation = 100; - else - you.levitation += dur_change; - - if (you.duration[DUR_CONTROLLED_FLIGHT] + dur_change > 100) - you.duration[DUR_CONTROLLED_FLIGHT] = 100; - else - you.duration[DUR_CONTROLLED_FLIGHT] += dur_change; - - // duration[DUR_CONTROLLED_FLIGHT] makes the game think player - // wears an amulet of controlled flight - - burden_change(); -} - -void cast_insulation(int power) -{ - int dur_incr = 10 + random2(power); - - mpr("You feel insulated."); - - if (dur_incr + you.duration[DUR_INSULATION] > 100) - you.duration[DUR_INSULATION] = 100; - else - you.duration[DUR_INSULATION] += dur_incr; -} // end cast_insulation() - -void cast_resist_poison(int power) -{ - int dur_incr = 10 + random2(power); - - mpr("You feel resistant to poison."); - - if (dur_incr + you.duration[DUR_RESIST_POISON] > 100) - you.duration[DUR_RESIST_POISON] = 100; - else - you.duration[DUR_RESIST_POISON] += dur_incr; -} // end cast_resist_poison() - -void cast_teleport_control(int power) -{ - int dur_incr = 10 + random2(power); - - if (you.duration[DUR_CONTROL_TELEPORT] == 0) - you.attribute[ATTR_CONTROL_TELEPORT]++; - - mpr("You feel in control."); - - if (dur_incr + you.duration[DUR_CONTROL_TELEPORT] >= 50) - you.duration[DUR_CONTROL_TELEPORT] = 50; - else - you.duration[DUR_CONTROL_TELEPORT] += dur_incr; -} // end cast_teleport_control() - -void cast_ring_of_flames(int power) -{ - you.fire_shield += 5 + (power / 10) + (random2(power) / 5); - - if (you.fire_shield > 50) - you.fire_shield = 50; - - mpr("The air around you leaps into flame!"); - - manage_fire_shield(); -} // end cast_ring_of_flames() - -void cast_confusing_touch(int power) -{ - snprintf( info, INFO_SIZE, "Your %s begin to glow %s.", - your_hand(true), (you.confusing_touch ? "brighter" : "red") ); - - mpr( info ); - - you.confusing_touch += 5 + (random2(power) / 5); - - if (you.confusing_touch > 50) - you.confusing_touch = 50; - -} // end cast_confusing_touch() - -bool cast_sure_blade(int power) -{ - bool success = false; - - if (you.equip[EQ_WEAPON] == -1) - mpr("You aren't wielding a weapon!"); - else if (weapon_skill( you.inv[you.equip[EQ_WEAPON]].base_type, - you.inv[you.equip[EQ_WEAPON]].sub_type) != SK_SHORT_BLADES) - { - mpr("You cannot bond with this weapon."); - } - else - { - if (!you.sure_blade) - mpr("You become one with your weapon."); - else if (you.sure_blade < 25) - mpr("Your bond becomes stronger."); - - you.sure_blade += 8 + (random2(power) / 10); - - if (you.sure_blade > 25) - you.sure_blade = 25; - - success = true; - } - - return (success); -} // end cast_sure_blade() - -void manage_fire_shield(void) -{ - you.fire_shield--; - - if (!you.fire_shield) - return; - - char stx = 0, sty = 0; - - for (stx = -1; stx < 2; stx++) - { - for (sty = -1; sty < 2; sty++) - { - if (sty == 0 && stx == 0) - continue; - - //if ( one_chance_in(3) ) beam.range ++; - - if (!grid_is_solid(grd[you.x_pos + stx][you.y_pos + sty]) - && env.cgrid[you.x_pos + stx][you.y_pos + sty] == EMPTY_CLOUD) - { - place_cloud( CLOUD_FIRE, you.x_pos + stx, you.y_pos + sty, - 1 + random2(6) ); - } - } - } -} // end manage_fire_shield() |