summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/misc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/misc.cc')
-rw-r--r--crawl-ref/source/misc.cc42
1 files changed, 32 insertions, 10 deletions
diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc
index b33c0c0c93..90d89d074f 100644
--- a/crawl-ref/source/misc.cc
+++ b/crawl-ref/source/misc.cc
@@ -3039,7 +3039,7 @@ std::string your_hand(bool plural)
}
bool stop_attack_prompt(const monsters *mon, bool beam_attack,
- bool beam_target)
+ coord_def beam_target)
{
ASSERT(!crawl_state.arena);
@@ -3049,6 +3049,7 @@ bool stop_attack_prompt(const monsters *mon, bool beam_attack,
bool retval = false;
bool prompt = false;
+ const bool mon_target = (beam_target == mon->pos());
const bool inSanctuary = (is_sanctuary(you.pos())
|| is_sanctuary(mon->pos()));
const bool wontAttack = mons_wont_attack(mon);
@@ -3063,13 +3064,34 @@ bool stop_attack_prompt(const monsters *mon, bool beam_attack,
if (isFriendly)
{
// Listed in the form: "your rat", "Blork the orc".
- snprintf(info, INFO_SIZE, "Really %s %s%s?",
- (beam_attack) ? (beam_target) ? "fire at"
- : "fire through"
- : "attack",
- mon->name(DESC_NOCAP_THE).c_str(),
- (inSanctuary) ? ", despite your sanctuary"
- : "");
+ std::string verb = "";
+ bool need_mon_name = true;
+ if (beam_attack)
+ {
+ verb = "fire ";
+ if (mon_target)
+ verb += "at ";
+ else if (you.pos() < beam_target && beam_target < mon->pos()
+ || you.pos() > beam_target && beam_target > mon->pos())
+ {
+ verb += "in " + mon->name(DESC_NOCAP_THE) + "'s direction";
+ need_mon_name = false;
+ }
+ else
+ {
+ verb += "through ";
+ }
+ }
+ else
+ verb = "attack ";
+
+ if (need_mon_name)
+ verb += mon->name(DESC_NOCAP_THE);
+
+ snprintf(info, INFO_SIZE, "Really %s%s?",
+ verb.c_str(),
+ (inSanctuary) ? ", despite your sanctuary" : "");
+
prompt = true;
}
else if (inSanctuary || wontAttack
@@ -3079,8 +3101,8 @@ bool stop_attack_prompt(const monsters *mon, bool beam_attack,
&& !tso_unchivalric_attack_safe_monster(mon))
{
snprintf(info, INFO_SIZE, "Really %s the %s%s%s%s%s?",
- (beam_attack) ? (beam_target) ? "fire at"
- : "fire through"
+ (beam_attack) ? (mon_target) ? "fire at"
+ : "fire through"
: "attack",
(isUnchivalric) ? "helpless "
: "",