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 raysin_yellow = (x == 0 || y == 0 || x == y || x == -y);break;case 1: // circlesin_yellow = (dist >= (radius-1)*(radius-1)&& dist <= radius*radius|| dist >= (radius/2-1)*(radius/2-1)&& dist <= radius*radius/4);break;case 2: // latticedin_yellow = (x%2 == 0 || y%2 == 0);break;case 3: // cross-likein_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);}