summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/spl-cast.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-05-21 07:30:33 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-05-21 07:30:33 +0000
commit9b55168648a4ddc1887d0ae560ec00d8f1ff3b23 (patch)
treee4c268b925a397f19f74cb6e4bbc3f6378a12c01 /crawl-ref/source/spl-cast.cc
parent98e3c24887ee5a4670cf58eaa614084a720b5853 (diff)
downloadcrawl-ref-9b55168648a4ddc1887d0ae560ec00d8f1ff3b23.tar.gz
crawl-ref-9b55168648a4ddc1887d0ae560ec00d8f1ff3b23.zip
Fix 1941612: Zapping wands known to be empty shouldn't cost a turn, but
empty wands with unknown charges should cost a turn. Experimentally add a "Really fire through friendly creature?" prompt when a beam tracer passes through a friend. This currently uses the existing monster tracer and probably has huge problems because of this. In any case, it appears to only work sometimes, though consistently for wands in my testing, possibly because the range is fixed (?) when compared to spells. (This is part of FR 1962548.) git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5171 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/spl-cast.cc')
-rw-r--r--crawl-ref/source/spl-cast.cc164
1 files changed, 102 insertions, 62 deletions
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 6f69da5c9e..fffba572d9 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -908,7 +908,7 @@ static bool _spell_is_uncastable(spell_type spell)
return (false);
}
-// returns SPRET_SUCCESS if spell is successfully cast for purposes of
+// Returns SPRET_SUCCESS if spell is successfully cast for purposes of
// exercising, SPRET_FAIL otherwise, or SPRET_ABORT if the player canceled
// the casting.
spret_type your_spells( spell_type spell, int powc, bool allow_fail )
@@ -917,7 +917,7 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
struct bolt beam;
// [dshaligram] Any action that depends on the spellcasting attempt to have
- // succeeded must be performed after the switch()
+ // succeeded must be performed after the switch().
if (_spell_is_uncastable(spell))
return (SPRET_ABORT);
@@ -985,21 +985,19 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
if (testbits( flags, SPFLAG_NOT_SELF ) && spd.isMe)
{
if (spell == SPELL_TELEPORT_OTHER || spell == SPELL_HEAL_OTHER
- || spell == SPELL_POLYMORPH_OTHER)
+ || spell == SPELL_POLYMORPH_OTHER || spell == SPELL_BANISHMENT)
{
mpr( "Sorry, this spell works on others only." );
}
else
- {
canned_msg(MSG_UNTHINKING_ACT);
- }
return (SPRET_ABORT);
}
}
- // enhancers only matter for calc_spell_power() and spell_fail()
- // not sure about this: is it flavour or misleading?
+ // Enhancers only matter for calc_spell_power() and spell_fail().
+ // Not sure about this: is it flavour or misleading? (jpeg)
if (powc == 0 || allow_fail)
_surge_power(spell);
@@ -1065,7 +1063,7 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
// spells can be quite nasty: 9 * 9 * 90 / 500 = 15
// points of contamination!
int nastiness = spell_mana(spell) * spell_mana(spell)
- * (spfail_chance - spfl) + 250;
+ * (spfail_chance - spfl) + 250;
const int cont_points = div_rand_round(nastiness, 500);
@@ -1110,7 +1108,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_MAGIC_DART:
- zapping(ZAP_MAGIC_DARTS, powc, beam);
+ if (!zapping(ZAP_MAGIC_DARTS, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_FIREBALL:
@@ -1152,13 +1151,12 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
you.attribute[ ATTR_DELAYED_FIREBALL ] = 1;
}
else
- {
canned_msg( MSG_NOTHING_HAPPENS );
- }
break;
case SPELL_STRIKING:
- zapping( ZAP_STRIKING, powc, beam );
+ if (!zapping( ZAP_STRIKING, powc, beam ))
+ return (SPRET_ABORT);
break;
case SPELL_CONJURE_FLAME:
@@ -1167,34 +1165,41 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DIG:
- zapping(ZAP_DIGGING, powc, beam);
+ if (!zapping(ZAP_DIGGING, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_BOLT_OF_FIRE:
- zapping(ZAP_FIRE, powc, beam);
+ if (!zapping(ZAP_FIRE, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_BOLT_OF_COLD:
- zapping(ZAP_COLD, powc, beam);
+ if (!zapping(ZAP_COLD, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_LIGHTNING_BOLT:
- zapping(ZAP_LIGHTNING, powc, beam);
+ if (!zapping(ZAP_LIGHTNING, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_BOLT_OF_MAGMA:
- zapping(ZAP_MAGMA, powc, beam);
+ if (!zapping(ZAP_MAGMA, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_POLYMORPH_OTHER:
- // trying is already enough, even if it fails
+ // Trying is already enough, even if it fails.
did_god_conduct(DID_DELIBERATE_MUTATING, 10);
- zapping(ZAP_POLYMORPH_OTHER, powc, beam);
+ if (!zapping(ZAP_POLYMORPH_OTHER, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SLOW:
- zapping(ZAP_SLOWING, powc, beam);
+ if (!zapping(ZAP_SLOWING, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_HASTE:
@@ -1202,11 +1207,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_PARALYSE:
- zapping(ZAP_PARALYSIS, powc, beam);
+ if (!zapping(ZAP_PARALYSIS, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_CONFUSE:
- zapping(ZAP_CONFUSION, powc, beam);
+ if (!zapping(ZAP_CONFUSION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_CONFUSING_TOUCH:
@@ -1222,11 +1229,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_THROW_FLAME:
- zapping(ZAP_FLAME, powc, beam);
+ if (!zapping(ZAP_FLAME, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_THROW_FROST:
- zapping(ZAP_FROST, powc, beam);
+ if (!zapping(ZAP_FROST, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_CONTROLLED_BLINK:
@@ -1259,7 +1268,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_VENOM_BOLT:
- zapping(ZAP_VENOM_BOLT, powc, beam);
+ if (!zapping(ZAP_VENOM_BOLT, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_OLGREBS_TOXIC_RADIANCE:
@@ -1268,7 +1278,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
case SPELL_TELEPORT_OTHER:
// teleport creature (I think)
- zapping(ZAP_TELEPORTATION, powc, beam);
+ if (!zapping(ZAP_TELEPORTATION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_LESSER_HEALING:
@@ -1338,15 +1349,18 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_BOLT_OF_DRAINING:
- zapping(ZAP_NEGATIVE_ENERGY, powc, beam);
+ if (!zapping(ZAP_NEGATIVE_ENERGY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_LEHUDIBS_CRYSTAL_SPEAR:
- zapping(ZAP_CRYSTAL_SPEAR, powc, beam);
+ if (!zapping(ZAP_CRYSTAL_SPEAR, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_BOLT_OF_INACCURACY:
- zapping(ZAP_BEAM_OF_ENERGY, powc, beam);
+ if (!zapping(ZAP_BEAM_OF_ENERGY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_POISONOUS_CLOUD:
@@ -1354,7 +1368,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_POISON_ARROW:
- zapping( ZAP_POISON_ARROW, powc, beam );
+ if (!zapping( ZAP_POISON_ARROW, powc, beam ))
+ return (SPRET_ABORT);
break;
case SPELL_FIRE_STORM:
@@ -1362,8 +1377,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DETECT_TRAPS:
- mprf("You detect %s",
- (detect_traps(powc) > 0) ? "traps!" : "nothing.");
+ mprf("You detect %s", (detect_traps(powc) > 0) ? "traps!"
+ : "nothing.");
break;
case SPELL_BLINK:
@@ -1371,7 +1386,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_ISKENDERUNS_MYSTIC_BLAST:
- zapping( ZAP_MYSTIC_BLAST, powc, beam );
+ if (!zapping( ZAP_MYSTIC_BLAST, powc, beam ))
+ return (SPRET_ABORT);
break;
case SPELL_SWARM:
@@ -1383,7 +1399,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_ENSLAVEMENT:
- zapping(ZAP_ENSLAVEMENT, powc, beam);
+ if (!zapping(ZAP_ENSLAVEMENT, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_MAGIC_MAPPING:
@@ -1408,8 +1425,9 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_PAIN:
+ if (!zapping(ZAP_PAIN, powc, beam))
+ return (SPRET_ABORT);
dec_hp(1, false);
- zapping(ZAP_PAIN, powc, beam);
break;
case SPELL_EXTENSION:
@@ -1435,8 +1453,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DETECT_ITEMS:
- mprf("You detect %s",
- (detect_items(powc) > 0) ? "items!" : "nothing.");
+ mprf("You detect %s", (detect_items(powc) > 0) ? "items!"
+ : "nothing.");
break;
case SPELL_BORGNJORS_REVIVIFICATION:
@@ -1463,7 +1481,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_STICKY_FLAME:
- zapping(ZAP_STICKY_FLAME, powc, beam);
+ if (!zapping(ZAP_STICKY_FLAME, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SUMMON_ICE_BEAST:
@@ -1492,7 +1511,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DISPEL_UNDEAD:
- zapping(ZAP_DISPEL_UNDEAD, powc, beam);
+ if (!zapping(ZAP_DISPEL_UNDEAD, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_GUARDIAN:
@@ -1500,11 +1520,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_THUNDERBOLT:
- zapping(ZAP_LIGHTNING, powc, beam);
+ if (!zapping(ZAP_LIGHTNING, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_FLAME_OF_CLEANSING:
- zapping(ZAP_CLEANSING_FLAME, powc, beam);
+ if (!zapping(ZAP_CLEANSING_FLAME, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SUMMON_DAEVA:
@@ -1531,15 +1553,18 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
mpr("You cannot banish yourself!");
break;
}
- zapping(ZAP_BANISHMENT, powc, beam);
+ if (!zapping(ZAP_BANISHMENT, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_CIGOTUVIS_DEGENERATION:
- zapping(ZAP_DEGENERATION, powc, beam);
+ if (!zapping(ZAP_DEGENERATION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_STING:
- zapping(ZAP_STING, powc, beam);
+ if (!zapping(ZAP_STING, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SUBLIMATION_OF_BLOOD:
@@ -1554,7 +1579,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
case SPELL_HELLFIRE:
// should only be available from:
// staff of Dispater & Sceptre of Asmodeus
- zapping(ZAP_HELLFIRE, powc, beam);
+ if (!zapping(ZAP_HELLFIRE, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SUMMON_DEMON:
@@ -1626,11 +1652,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_BOLT_OF_IRON:
- zapping(ZAP_IRON_BOLT, powc, beam);
+ if (!zapping(ZAP_IRON_BOLT, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_STONE_ARROW:
- zapping(ZAP_STONE_ARROW, powc, beam);
+ if (!zapping(ZAP_STONE_ARROW, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_TOMB_OF_DOROKLOHE:
@@ -1642,7 +1670,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_SHOCK:
- zapping(ZAP_ELECTRICITY, powc, beam);
+ if (!zapping(ZAP_ELECTRICITY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SWIFTNESS:
@@ -1658,12 +1687,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_ORB_OF_ELECTROCUTION:
- zapping(ZAP_ORB_OF_ELECTRICITY, powc, beam);
+ if (!zapping(ZAP_ORB_OF_ELECTRICITY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_DETECT_CREATURES:
- mprf("You detect %s",
- (detect_creatures(powc) > 0) ? "creatures!" : "nothing.");
+ mprf("You detect %s", (detect_creatures(powc) > 0) ? "creatures!"
+ : "nothing.");
break;
case SPELL_CURE_POISON_II: // poison magic version of cure poison
@@ -1690,7 +1720,7 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
// trying is already enough, even if it fails
did_god_conduct(DID_DELIBERATE_MUTATING, 10);
- crawl_state.cant_cmd_repeat("You can't repeat alter self.");
+ crawl_state.cant_cmd_repeat("You can't repeat Alter Self.");
if (!enough_hp( you.hp_max / 2, true ))
{
mpr( "Your body is in too poor a condition "
@@ -1708,7 +1738,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DEBUGGING_RAY:
- zapping(ZAP_DEBUGGING_RAY, powc, beam);
+ if (!zapping(ZAP_DEBUGGING_RAY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_RECALL:
@@ -1722,7 +1753,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_AGONY:
- zapping(ZAP_AGONY, powc, beam);
+ if (!zapping(ZAP_AGONY, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SPIDER_FORM:
@@ -1730,11 +1762,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_DISRUPT:
- zapping(ZAP_DISRUPTION, powc, beam);
+ if (!zapping(ZAP_DISRUPTION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_DISINTEGRATE:
- zapping(ZAP_DISINTEGRATION, powc, beam);
+ if (!zapping(ZAP_DISINTEGRATION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_BLADE_HANDS:
@@ -1770,11 +1804,13 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_ORB_OF_FRAGMENTATION:
- zapping(ZAP_ORB_OF_FRAGMENTATION, powc, beam);
+ if (!zapping(ZAP_ORB_OF_FRAGMENTATION, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_ICE_BOLT:
- zapping(ZAP_ICE_BOLT, powc, beam);
+ if (!zapping(ZAP_ICE_BOLT, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_ARC:
@@ -1787,7 +1823,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_ICE_STORM:
- zapping(ZAP_ICE_STORM, powc, beam);
+ if (!zapping(ZAP_ICE_STORM, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_SUMMON_UGLY_THING:
@@ -1805,7 +1842,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
//jmf: new spells 19mar2000
case SPELL_FLAME_TONGUE:
- zapping(ZAP_FLAME_TONGUE, powc, beam);
+ if (!zapping(ZAP_FLAME_TONGUE, powc, beam))
+ return (SPRET_ABORT);
break;
case SPELL_PASSWALL:
@@ -1840,7 +1878,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
mprf(MSGCH_DIAGNOSTICS, "Sleep power stepdown: %d -> %d",
powc, sleep_power);
#endif
- zapping(ZAP_SLEEP, sleep_power, beam);
+ if (!zapping(ZAP_SLEEP, sleep_power, beam))
+ return (SPRET_ABORT);
break;
}
@@ -1899,7 +1938,8 @@ spret_type your_spells( spell_type spell, int powc, bool allow_fail )
break;
case SPELL_BACKLIGHT:
- zapping(ZAP_BACKLIGHT, powc + 10, beam);
+ if (!zapping(ZAP_BACKLIGHT, powc + 10, beam))
+ return (SPRET_ABORT);
break;
case SPELL_INTOXICATE: