and attack you if you step outside of sanctuary; also, they can acquire and chase new targets while still respecting sanctuary. Hopefully non-buggy.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9100 c06c8d41-db1a-0410-9941-cceddc491573
4M6JJPRNEQZIOYMQI24SLTDL27TRD3HGB344TA2KY7OKJMKBDRXQC
2IPPYYFWEFI342OOKTTEKMLLBUFPERK7RNLBF2TWQF5D47M6PSTAC
WL3O4GOFGFEDGJ74LVMYJEIRSSZ3ZPIPY5FWAZJED3FPCTUV6NQQC
J7GPW2YXLT6FGSKJ24FGQ24GTRZ6A2BDYM6CIXV4R6YBEHP6BGPAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
DK362IHKSDADMUPD35NOTKM4WESQM37KG2PNOJRV2FGELDWULYPQC
PQ3SLWFD5CF33ZHBG2V7YJEKAL6HTSDYOV25OKUTBCW2QF7TL4AAC
ARNDCQD3NXQRD5CZFTBQOMID5RPPRRIK647T36FLGHMUN62MF7WAC
QU4M6MULPGDMLHD2EHTSNQDSXRA5JZSXPDBZK3JANTSXABRSAE4AC
LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC
S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC
NVFA2IJMJEBAEFZRO7JHJ6RLES3SFBR4S4UCXIQAV4PGYI75MC7AC
3KRKUK3HCBBZWS5MXFAMM4R5PGWWTSURBSFXEEZPRRCFAZ5EZTCAC
JDZCDMUCQ7VENYVLB62KQWUIRGABID37OKATOKCBUPCDL7W75NPAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
WSW74U3IOZ4Q47MHN57KCWZCSJ4U4MOJX4CCDOLUD2KOFEIQR4BQC
OMTU7OMVWDVAGJCQGQJDZ3YU252T6IM2LPS2ZMPWB7MIXCJK62AQC
HYXNSIBI3LPNH7VATDEUXYEONKKT3VPDTVDW43ZSTXISQY5DYH7AC
UJTB5VR2BSQSN2QRTLZPM2MDNHQ6KKRCPOBESWSM24N2PTWPRRHQC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
URFOQPK5U6ANCKMHK2R2BYIITZZESHYUNBAEI3WNJCYO7Q66WHNQC
3RNRFLMD2X4RUFTDVITLXAP377YB6F6YMQLL3DAXSUZDZBTWSLRQC
MCGOMSM7KM2RP4F65SOW763QN5AMR22GHE74SHVICRXUYI7YCRQAC
3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC
XZTGZ7MOPX7ZOHQ4IQPXOHGUH5WPRNOYAQ6IQOMZDZYNVSAYFTNAC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
XJQT4B4TMM6R5AXQZTOQOJV25JXRD5P27OSFXZBFLBV4WUZRSTQAC
M6IHSU5JWCTOTUSPCVVHMAQ4XJDGQJOLZTTN5BGKEOS4B6Z7IOWAC
32GG34SJYCDQC4CO7FXCFJ6SDARRQ3EEP53XJITL5XBEKED6EAIAC
TTCA2KKE56DAAKEVUGAP7ZRNF5KDLOWRVO37E3D6KDNMLDBVL7MAC
WQIEW3O4MANA2KKYRUWEZP44KHVJ4RRHEZTDXSF4EDELX66LO26QC
QEGZBMFMDLT6HPVW4ZA3JLQL7CCXOI2ITI2RXJNZW5ZPCKX67TDAC
PKXXBHS3LWLPZI2QVRX22MSQ4R2626IXRSNHFFYHXYTLJJQU54LQC
SFWCESFCUEVKJ6ZQQX3Y5YTIQD5BC6MCVSLVZFRGRTU46BFLKKWAC
A2SAU7YL5ZS4TODRUTKLI4W4RZOMZSSLBEEXOKPKQKP5SEWU7QOQC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
QDWDUURSNLMT6AXNNJ3DEQCWAKCAIHV6MP5F7QGIBGXOG2BI2NPQC
PKENI7REL6MQ5KKGSBIOVMPJKITY6OLQRXHVD4Z6PU7HMS23XM7AC
W6JMQP26KNVIZOJTITBWR447OX63DUKBIQE442Q7QYLUUKJVBELAC
CMGEKP57BEOQXLDZJCFDQJ3R47REQOG45GI6OV4AWOZTZ2CH7JPQC
2BJFHMLTZXNPVJYS7Q4CS2PRFXPV7TJEQKKOQW6QHFJPFF35R76QC
radius = size+1;
for (int x = -radius; x <= radius; x++)
for (int y = -radius; y <= radius; y++)
{
int posx = env.sanctuary_pos.x + x;
int posy = env.sanctuary_pos.y + y;
if (!inside_level_bounds(posx,posy))
continue;
int dist = distance(posx, posy, env.sanctuary_pos.x,
env.sanctuary_pos.y);
for (radius_iterator ri(env.sanctuary_pos, size+1, true, false); ri; ++ri)
{
int dist = distance(*ri, env.sanctuary_pos);
// If necessary overwrite sanctuary property.
if (dist > size*size)
_remove_sanctuary_property(coord_def(posx, posy));
}
// If necessary overwrite sanctuary property.
if (dist > size*size)
_remove_sanctuary_property(*ri);
}
_remove_sanctuary_property(coord_def(env.sanctuary_pos.x,
env.sanctuary_pos.y));
if (see_grid(coord_def(env.sanctuary_pos.x,env.sanctuary_pos.y)))
_remove_sanctuary_property(env.sanctuary_pos);
if (see_grid(env.sanctuary_pos))
if (pattern == 0 // outward rays
&& (x == 0 || y == 0 || x == y || x == -y)
|| pattern == 1 // circles
&& (dist >= (radius-1)*(radius-1) && dist <= radius*radius
|| dist >= (radius/2-1)*(radius/2-1)
&& dist <= radius*radius/4)
|| pattern == 2 // latticed
&& (x%2 == 0 || y%2 == 0)
|| pattern == 3 // cross-like
&& (abs(x)+abs(y) < 5 && x != y && x != -y))
bool in_yellow = false;
switch (random2(4))
env.map(pos).property |= FPROP_SANCTUARY_1; // yellow
case 0: // outward rays
in_yellow = (x == 0 || y == 0 || x == y || x == -y);
break;
case 1: // circles
in_yellow = (dist >= (radius-1)*(radius-1)
&& dist <= radius*radius
|| dist >= (radius/2-1)*(radius/2-1)
&& dist <= radius*radius/4);
break;
case 2: // latticed
in_yellow = (x%2 == 0 || y%2 == 0);
break;
case 3: // cross-like
in_yellow = (abs(x)+abs(y) < 5 && x != y && x != -y);
break;
default:
break;
/* ***********************************************************************
* called from: monstuff beam effects fight view
* *********************************************************************** */
void behaviour_event(monsters *mon, int event_type, int src = MHITNOT,
coord_def src_pos = coord_def() );
void behaviour_event(monsters *mon, mon_event_type event_type,
int src = MHITNOT, coord_def src_pos = coord_def());
{
const bool flee_sanct = !mons_wont_attack(mon)
&& is_sanctuary(mon->pos());
// Stationary monsters can't flee, even from sanctuary.
// Stationary monsters can't flee.
if (is_sanctuary(monster->pos()) && !mons_friendly(monster)
&& !mons_is_fleeing(monster)
&& monster->add_ench(mon_enchant(ENCH_FEAR, 0, KC_YOU)))
if (is_sanctuary(monster->pos())
&& mons_is_influenced_by_sanctuary(monster)
&& !mons_is_fleeing_sanctuary(monster))
else if (mons_is_fleeing(monster) && inside_level_bounds(env.sanctuary_pos)
&& !is_sanctuary(monster->pos())
&& monster->target == env.sanctuary_pos)
else if (mons_is_fleeing_sanctuary(monster)
&& !is_sanctuary(monster->pos()))
void mons_start_fleeing_from_sanctuary(monsters *monster)
{
monster->flags |= MF_FLEEING_FROM_SANCTUARY;
monster->target = env.sanctuary_pos;
behaviour_event(monster, ME_SCARE, MHITNOT, env.sanctuary_pos);
}
void mons_stop_fleeing_from_sanctuary(monsters *monster)
{
const bool had_flag = (monster->flags & MF_FLEEING_FROM_SANCTUARY);
monster->flags &= (~MF_FLEEING_FROM_SANCTUARY);
if (had_flag)
behaviour_event(monster, ME_EVAL, MHITYOU);
}