the prompts properly with Burn/Freeze, Smite, and Airstrike. Also, move the now-single function for this into misc.cc, since I can't think of a better location right now.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5235 c06c8d41-db1a-0410-9941-cceddc491573
IGN3Q5YCLHXKWFZQRSRABCHW2JFW5TFVU7TM5EXE2EW7PDBBSQWAC
S5IPZ6TIY6ICVYGJ25DHWDVAHWTNTTFJUDYE3MV5FVEDXY7J4APQC
Y6YNQ3Q7CYMDJZSHZ4XYKQJMIFORHWBQGDWXKZ4R5PH2NFWY6N5AC
LORHU56GGDYRUSUO4W6UCVM5ARJMVJNATBLG7SURC4AO5HNNXIOQC
KX6HOBTF5OBZLH2VNEFHH6YAX66FSE6JGBY5I2WIAW5IEJUGNL6AC
5HGMULU7IWTFJJH35S6XTCW3YZEMCORXHQL6NVY2TO4DUMVITNJAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
UNDSTX5P3ROLROGVQQVSMTQ5RHZI6G2MST4XLL3AJTHPJSGLCP6QC
X7XW2G6JZTAZEW3DZOD5ZFKQVQTTFDLQ63WF6N4ODEQLO7TNZA6QC
3M6SEWGBU6ZLET5Z2XJ4NVODXZX2BKXUIY6ZI7KYZZVDS47E6MVQC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
WSUGPG4GWKAV3DINPD5LYP6W3GNFKIFWR3UXQGOQFSLIG5PLOEMAC
MT73EUNHNCLN5AQW6TT2PSM26PJCFQL5SF53NUYQ2T27UHATQNUAC
NAJJIL3NX4W3FHBW62IS5Y5UAGCDOJKSNXEQQE6BEBFRW4OIXA6AC
25ZIRUIA4L47VVI3CHNJ66VZZDPJLTYC5KHEMD6BROGKLQNC5G5AC
S7Y7P3MDUUYVAMPT3AEPDS6ACEQSLBYTYZGEPEWZCT4VJ2GINATQC
RYK4OAO72K3TDOSKJ2GTQHD3LSMDSB6TQXFZWHPB6FYETNVFNVIAC
R5HVRGDKUX6A2H4DRHGWFBC2P625VAJHDZTERDMLFVXWSZLMHKRAC
X6PDJWFXOZ4NUKXNOEP54CYQ6PCQJQK2KALAYY75XDAFCJJYWE6AC
VWYVIRKY35DS4V6HJXEZK3O2NJWNA3LAARRXITR35GIE2HMQK55AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
ECIVNJZMVLZ5ZKAFMNXAQHMECVDNIPOYCLEGINRODBW34ZBT4GIAC
N5LIMKFHLLLIWK25Y3IQAF4XOZVZA5HOFFMHVTKSZEQV4FEBZJDAC
ENN23K4IMPAAICA5IXCZBOMWAUXGXWR46AIEWUEDVSHSSJNQB63QC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
JBMC2XNV3DNWMMLKUDRKBPDCPVRITY6L3WRQSD2SJMWNZUSIBMRQC
6YQRV6WDHJU3CQSXGZLXLNOKGLBCTMOIU4ZWZVFSQULY7OUFX7AQC
R6Y4GB7H6DJ373ZBZKLGTOMAS2IZAHNVJVO2FMYEAZGQYHVURPMQC
EIXGAK3PF6653TWC32HPPBA3V5YYLJ3PGPJQYE3ON4NURROENVPQC
RAAQ6K3RHP2TFAHKPU5J25GNF3FEUQGIUVQJ6HAJ6M4FBUAWSX6QC
3EUPIYJNWOMOQBP2Z5SGSMWK453BXJD6KL2WFTR3NM565MEBYASAC
6MAMXLPWLW5IXKQXGUNSKNZNHZM7U24GQNN4IWZL2FKKGAKL23YAC
SFWCESFCUEVKJ6ZQQX3Y5YTIQD5BC6MCVSLVZFRGRTU46BFLKKWAC
3CAWF7Q5MSGM66NTCGI7L7E6CAWHHFIURPBMEGKBUG3UYKRZX6ZQC
GEVQBNOVLHFACR73ARA7VTDVQ4VJXVGOKUPXX4RNMCIM7W6KWL3AC
if (mons_friendly(monster))
conduct.set(DID_ATTACK_FRIEND, 5, true, monster);
else if (mons_neutral(monster))
conduct.set(DID_ATTACK_NEUTRAL, 5, true, monster);
success = !stop_attack_prompt(monster, false, false, &conduct);
if (is_unchivalric_attack(&you, monster, monster))
conduct.set(DID_UNCHIVALRIC_ATTACK, 4, true, monster);
if (mons_is_holy(monster))
conduct.set(DID_ATTACK_HOLY, monster->hit_dice, true, monster);
if (success)
{
mprf("You smite %s!", monster->name(DESC_NOCAP_THE).c_str());
// Maxes out at around 40 damage at 27 Invocations, which is plenty
// in my book (the old max damage was around 70, which seems excessive)
hurt_monster(monster, 7 + (random2(power) * 33 / 191));
if (monster->hit_points < 1)
monster_die(monster, KILL_YOU, 0);
else
print_wounds(monster);
if (success)
{
// Maxes out at around 40 damage at 27 Invocations, which is
// plenty in my book (the old max damage was around 70,
// which seems excessive).
hurt_monster(monster, 7 + (random2(power) * 33 / 191));
god_conduct_trigger conduct;
conduct.enabled = false;
if (mons_friendly(monster))
conduct.set(DID_ATTACK_FRIEND, 5, true, monster);
else if (mons_neutral(monster))
conduct.set(DID_ATTACK_NEUTRAL, 5, true, monster);
if (is_unchivalric_attack(&you, monster, monster))
conduct.set(DID_UNCHIVALRIC_ATTACK, 5, true, monster);
int hurted = 8 + random2(random2(4) + (random2(power) / 6)
+ (random2(power) / 7));
mprf("You %s %s.",
(flavour == BEAM_FIRE) ? "burn" :
(flavour == BEAM_COLD) ? "freeze" :
(flavour == BEAM_MISSILE) ? "crush" :
(flavour == BEAM_ELECTRICITY) ? "zap"
: "______",
monster->name(DESC_NOCAP_THE).c_str());
int hurted = roll_dice( 1, 3 + pow / 3 );
bolt beam;
god_conduct_trigger conduct;
conduct.enabled = false;
mprf("You %s %s.",
(flavour == BEAM_FIRE) ? "burn" :
(flavour == BEAM_COLD) ? "freeze" :
(flavour == BEAM_MISSILE) ? "crush" :
(flavour == BEAM_ELECTRICITY) ? "zap"
: "______",
monster->name(DESC_NOCAP_THE).c_str());
if (mons_friendly(monster))
conduct.set(DID_ATTACK_FRIEND, 5, true, monster);
else if (mons_neutral(monster))
conduct.set(DID_ATTACK_NEUTRAL, 5, true, monster);
behaviour_event(monster, ME_ANNOY, MHITYOU);
}
bool stop_attack_prompt(const monsters *mon, bool beam_attack,
bool beam_target, god_conduct_trigger *conduct)
{
bool retval = false;
bool prompt = false;
const bool inSanctuary = (is_sanctuary(you.x_pos, you.y_pos)
|| is_sanctuary(mon->x, mon->y));
const bool wontAttack = mons_wont_attack(mon);
const bool isFriendly = mons_friendly(mon);
const bool isNeutral = mons_neutral(mon);
const bool isUnchivalric = is_unchivalric_attack(&you, mon, mon);
const bool isHoly = mons_is_holy(mon);
if (isFriendly)
{
// listed in the form: "your rat", "Blork"
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"
: "");
prompt = true;
}
else if (inSanctuary || wontAttack
|| (is_good_god(you.religion) && (isNeutral || isHoly))
|| (you.religion == GOD_SHINING_ONE && isUnchivalric))
{
// "Really fire through the helpless neutral holy Daeva?"
// was: "Really fire through this helpless neutral holy creature?"
snprintf(info, INFO_SIZE, "Really %s the %s%s%s%s%s?",
(beam_attack) ? (beam_target) ? "fire at"
: "fire through"
: "attack",
(isUnchivalric) ? "helpless "
: "",
(isFriendly) ? "friendly " :
(wontAttack) ? "non-hostile " :
(isNeutral) ? "neutral "
: "",
(isHoly) ? "holy "
: "",
mon->name(DESC_PLAIN).c_str(),
(inSanctuary) ? ", despite your sanctuary"
: "");
prompt = true;
}
if (you.confused() || (prompt && yesno(info, false, 'n')))
{
if (conduct)
{
if (isFriendly)
conduct->set(DID_ATTACK_FRIEND, 5, true, mon);
else if (isNeutral)
conduct->set(DID_ATTACK_NEUTRAL, 5, true, mon);
if (isUnchivalric)
conduct->set(DID_UNCHIVALRIC_ATTACK, 4, true, mon);
if (isHoly)
conduct->set(DID_ATTACK_HOLY, mon->hit_dice, true, mon);
}
}
else
retval = true;
return retval;
}
{
const bool inSanctuary = (is_sanctuary(you.x_pos, you.y_pos)
|| is_sanctuary(def->x, def->y));
const bool wontAttack = mons_wont_attack(def);
const bool isFriendly = mons_friendly(def);
const bool isNeutral = mons_neutral(def);
const bool isUnchivalric = is_unchivalric_attack(&you, def, def);
const bool isHoly = mons_is_holy(def);
if (inSanctuary || wontAttack
|| (is_good_god(you.religion) && (isNeutral || isHoly))
|| (you.religion == GOD_SHINING_ONE && isUnchivalric))
{
snprintf(info, INFO_SIZE, "Really attack the %s%s%s%s%s?",
(isUnchivalric) ? "helpless "
: "",
(isFriendly) ? "friendly " :
(wontAttack) ? "non-hostile " :
(isNeutral) ? "neutral "
: "",
(isHoly) ? "holy "
: "",
def->name(DESC_PLAIN).c_str(),
(inSanctuary) ? ", despite your sanctuary"
: "");
if (you.confused() || yesno(info, false, 'n'))
{
if (isFriendly)
conduct.set(DID_ATTACK_FRIEND, 5, true, def);
else if (isNeutral)
conduct.set(DID_ATTACK_NEUTRAL, 5, true, def);
if (isUnchivalric)
conduct.set(DID_UNCHIVALRIC_ATTACK, 4, true, def);
cancel_attack = stop_attack_prompt(def, false, false, &conduct);
}
}
static bool _stop_unchivalric_attack(monsters *mon, bool target)
{
const bool inSanctuary = (is_sanctuary(you.x_pos, you.y_pos)
|| is_sanctuary(mon->x, mon->y));
const bool wontAttack = mons_wont_attack(mon);
const bool isFriendly = mons_friendly(mon);
const bool isNeutral = mons_neutral(mon);
const bool isUnchivalric = is_unchivalric_attack(&you, mon, mon);
const bool isHoly = mons_is_holy(mon);
if (isFriendly)
{
// listed in the form: "your rat", "Blork"
snprintf(info, INFO_SIZE, "Really fire %s %s%s?",
(target) ? "at"
: "through",
mon->name(DESC_NOCAP_THE).c_str(),
(inSanctuary) ? ", despite your sanctuary"
: "");
if (!yesno(info, true, 'n'))
return (true);
}
else if (inSanctuary || wontAttack
|| is_good_god(you.religion) && (isNeutral || isHoly)
|| you.religion == GOD_SHINING_ONE && isUnchivalric)
{
// "Really fire through the helpless neutral holy Daeva?"
// was: "Really fire through this helpless neutral holy creature?"
snprintf(info, INFO_SIZE, "Really fire %s the %s%s%s%s%s?",
(target) ? "at"
: "through",
(isUnchivalric) ? "helpless "
: "",
(isFriendly) ? "friendly " :
(wontAttack) ? "non-hostile " :
(isNeutral) ? "neutral "
: "",
(isHoly) ? "holy "
: "",
mon->name(DESC_PLAIN).c_str(),
(inSanctuary) ? ", despite your sanctuary"
: "");
if (!yesno(info, true, 'n'))
return (true);