summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/ranged_attack.cc
diff options
context:
space:
mode:
authorSteve Melenchuk <smelenchuk@gmail.com>2014-05-03 21:23:17 -0600
committerSteve Melenchuk <smelenchuk@gmail.com>2014-05-03 21:24:09 -0600
commitf99988b6b9bfc38b40f0a8a5aeea7a4b759b8324 (patch)
tree0f2634f0ce035c3757ace9564227aead644ca15b /crawl-ref/source/ranged_attack.cc
parent67ee53ac1bc6fcb712739bd26a9dcf4c505892ec (diff)
downloadcrawl-ref-f99988b6b9bfc38b40f0a8a5aeea7a4b759b8324.tar.gz
crawl-ref-f99988b6b9bfc38b40f0a8a5aeea7a4b759b8324.zip
Fix reflection brand for ranged combat.
Oops.
Diffstat (limited to 'crawl-ref/source/ranged_attack.cc')
-rw-r--r--crawl-ref/source/ranged_attack.cc35
1 files changed, 32 insertions, 3 deletions
diff --git a/crawl-ref/source/ranged_attack.cc b/crawl-ref/source/ranged_attack.cc
index e8d7803122..de7bdc14e2 100644
--- a/crawl-ref/source/ranged_attack.cc
+++ b/crawl-ref/source/ranged_attack.cc
@@ -28,7 +28,8 @@
ranged_attack::ranged_attack(actor *attk, actor *defn, item_def *proj,
bool tele) :
::attack(attk, defn), range_used(0),
- projectile(proj), teleport(tele), orig_to_hit(0)
+ reflected(false), projectile(proj), teleport(tele),
+ orig_to_hit(0)
{
init_attack(SK_THROWING, 0);
kill_type = KILLED_BY_BEAM;
@@ -100,7 +101,7 @@ bool ranged_attack::attack()
const int ev = defender->melee_evasion(attacker);
ev_margin = test_hit(to_hit, ev, !attacker->is_player());
- bool shield_blocked = attack_shield_blocked(true);
+ bool shield_blocked = attack_shield_blocked(false);
god_conduct_trigger conducts[3];
disable_attack_conducts(conducts);
@@ -168,7 +169,35 @@ bool ranged_attack::handle_phase_attempted()
bool ranged_attack::handle_phase_blocked()
{
ASSERT(!attack_ignores_shield(false));
- range_used = BEAM_STOP;
+ string punctuation = ".";
+ string verb = "block";
+ if (defender_shield && is_shield(*defender_shield)
+ && shield_reflects(*defender_shield))
+ {
+ reflected = true;
+ verb = "reflect";
+ if (defender->observable())
+ {
+ punctuation = " off " + defender->pronoun(PRONOUN_POSSESSIVE)
+ + " " + defender_shield->name(DESC_PLAIN).c_str()
+ + "!";
+ ident_reflector(defender_shield);
+ }
+ else
+ punctuation = "!";
+ }
+ else
+ range_used = BEAM_STOP;
+
+ if (needs_message)
+ {
+ mprf("%s %s %s%s",
+ def_name(DESC_THE).c_str(),
+ defender->conj_verb(verb).c_str(),
+ projectile->name(DESC_THE).c_str(),
+ punctuation.c_str());
+ }
+
return attack::handle_phase_blocked();
}