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);elseprint_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);}}elseretval = 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);