towards you. You can get them to attack while inside Sanctuary by giving them an order to attack a specific monster, and if they do attack and violate Sanctuary then it will be removed. Attempting to give such an order will give a warning that it might violate Sanctuary.
Prevent confused and berserking pets from violating Sanctuary, since you can't order them not to.
Prevent monsters fleeing Sanctuary from attacking monsters which are blocking their flight path.
The player attacking him/her-self because of confusion no longer vilates Sanctuary.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6312 c06c8d41-db1a-0410-9941-cceddc491573
OMTU7OMVWDVAGJCQGQJDZ3YU252T6IM2LPS2ZMPWB7MIXCJK62AQC
PWHE7RAGPTX5VAQVELYQJ37PHAR7J6DPHET4BJOVDBBW6LCSVRMQC
FBJB2WMCYNDOICZJZT356VEMMD5L2FFRTKUARKSPIWIM2LHGBLTQC
32GG34SJYCDQC4CO7FXCFJ6SDARRQ3EEP53XJITL5XBEKED6EAIAC
NVFA2IJMJEBAEFZRO7JHJ6RLES3SFBR4S4UCXIQAV4PGYI75MC7AC
HYXNSIBI3LPNH7VATDEUXYEONKKT3VPDTVDW43ZSTXISQY5DYH7AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
3KRKUK3HCBBZWS5MXFAMM4R5PGWWTSURBSFXEEZPRRCFAZ5EZTCAC
XJQT4B4TMM6R5AXQZTOQOJV25JXRD5P27OSFXZBFLBV4WUZRSTQAC
WQIEW3O4MANA2KKYRUWEZP44KHVJ4RRHEZTDXSF4EDELX66LO26QC
TTCA2KKE56DAAKEVUGAP7ZRNF5KDLOWRVO37E3D6KDNMLDBVL7MAC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
2E4RV454MTTCKYLKMSHEEAFPNAFVUXXPBZV3XP6V7QMF4BBWE7TAC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
X6PDJWFXOZ4NUKXNOEP54CYQ6PCQJQK2KALAYY75XDAFCJJYWE6AC
6YQRV6WDHJU3CQSXGZLXLNOKGLBCTMOIU4ZWZVFSQULY7OUFX7AQC
JBMC2XNV3DNWMMLKUDRKBPDCPVRITY6L3WRQSD2SJMWNZUSIBMRQC
ZI7643NG3LOKVSDXHFNV2YU3ZIQUVEY25AOXZCPBXJB5SQAUCE6QC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
NM6UK4SZ3JWD3WWDY355C5NW2MBIFR4N73QHF43AE4CKR5LOLRCQC
WN6AAJ2DGDZFF3GGO7JAO22TZOL6HPTURQCYDRPRVJ5MMO2UL6EQC
SBTVKHKZRMVDBYLGQNMZMJXPAYJG43UWBBD7HQJWIPN3BMMHUBJAC
KBNY5FWKTEAKABFCLPC3QFKFSVZKAGXINPCIFV6WDSWFO4VCKNTAC
XXUOHQJZC3ODB7UMS5FMYAOXEAJK5TRYPVFRQYHK4OZ2DZVP6ARAC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC
VT3WFNEYL2JRNSKHN2OEOGCEL4LK4PIY3RXJS5TDY6MDZFF23ELAC
OFH2B2UZBK43QLFQBZ54FOCFLFNE54BZVDNCEUGDTBCUGNVZULIQC
// Plants or nonliving monsters cannot flee.
if (mons_class_holiness(mon->type) == MH_PLANT
|| mons_class_holiness(mon->type) == MH_NONLIVING)
{
// Some monsters can't flee.
if (mon->behaviour != BEH_FLEE && !mon->has_ench(ENCH_FEAR))
if (attacker->atype() == ACT_PLAYER && attacker != defender)
{
if (stop_attack_prompt(def, false, false))
{
cancel_attack = true;
return (false);
}
}
if (attacker != defender)
{
// Allow setting of your allies' target, etc.
attacker->attacking(defender);
check_autoberserk();
}
// The attacker loses nutrition.
attacker->make_hungry(3, true);
check_special_wield_effects();
// Allow setting of your allies' target, etc.
attacker->attacking(defender);
// The attacker loses nutrition.
attacker->make_hungry(3, true);
check_autoberserk();
check_special_wield_effects();
if (attacker->atype() == ACT_PLAYER)
{
if (stop_attack_prompt(def, false, false))
{
cancel_attack = true;
return (false);
}
else
set_attack_conducts(conducts, def);
}
if (attacker->atype() == ACT_PLAYER && attacker != defender)
set_attack_conducts(conducts, def);
if (env.sanctuary_time > 0 && retval && !cancel_attack
&& attacker != defender && !attacker->confused())
{
const coord_def atk_pos = attacker->pos();
const coord_def def_pos = defender->pos();
if (is_sanctuary(atk_pos.x, atk_pos.y)
|| is_sanctuary(def_pos.x, def_pos.y))
{
if (attacker->atype() == ACT_PLAYER || mons_friendly(atk))
remove_sanctuary(true);
}
}
const coord_def atk_pos = atk->pos();
const coord_def def_pos = def->pos();
// Self-attacks never violate sanctuary.
if ((is_sanctuary(atk_pos.x, atk_pos.y)
|| is_sanctuary(def_pos.x, def_pos.y))
&& atk != def)
{
// Friendly monsters should only violate sanctuary if
// explictly ordered to do so by the player.
if (mons_friendly(atk))
{
if (you.pet_target == MHITYOU || you.pet_target == MHITNOT)
{
if (atk->confused() && you.can_see(atk))
mpr("Zin prevents your ally from violating sanctuary "
"in its confusion.", MSGCH_GOD);
else if (atk->has_ench(ENCH_BERSERK) && you.can_see(atk))
mpr("Zin prevents your ally from violating sanctuary "
"in its berserker rage.", MSGCH_GOD);
cancel_attack = true;
return (false);
}
}
// Non-friendly monsters should never violate sanctuary.
else
{
mpr("!!!! Preventing hostile violation of sanctuary");
cancel_attack = true;
return (false);
}
}
// If a friend wants to help, they can attack the attacking monster.
if (you.pet_target == MHITNOT)
// If a friend wants to help, they can attack the attacking monster,
// unless Sanctuary is in effect since pet target can only be
// changed explicitly by the player during sanctuary.
if (you.pet_target == MHITNOT && env.sanctuary_time <= 0)