I don't like the solutions I came up with, so if anyone has a better idea please speak up.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7698 c06c8d41-db1a-0410-9941-cceddc491573
QKV56RZTWOX64VLWW52R2DEUM3HGGZNLRAJ2ZV2BHW5K422OPNJQC NONQ7NZENERFPPQZDL6CL7ZUI4IPQZQTJQK37RSI5LW76WETKRFAC YCKUKLTWICHK32BNDLUBCJXKQWR6ESYWZIQWSCKTDKMLMOSTFPVQC ZNMT5CZHP2FC4HTLNA7KYEDGFBXSCUE5QHJOALVPE6RDPHSEDXRQC LDWVYZF4CGEO6NTBTHSHSAVLEPKZS2NY5RYXN64UOYGJW5FQ523AC QEX3OFNT4IDUY3FNCPNKXB2RWHXRGEXTQQXB63GMVOTGQQ3IO5TAC LHYTGOCNDWX3CVD2HSQ6LAYC6NLKKI6ZKKNWZ5IQWP6YP5PQEVWQC QTGDLSVMXXROGGKE7JRHRJ7GQIQM3CAB2ETBB4FW6WRDR7VCFO3QC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC TJN537N2F5J7JWBCT2Z4VSTNXIMFCMEXTKTY7N2UCXIVUUQ3XJBQC LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC FS4MVTH4EEEECLEAO2FTNK5CLF2PHFYO2JZHC2YEOKYLWXRDRU6AC 7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC C3OUSRCHDUOJ6ELVDX6YWMQQVXDJLNEXTXWCDDAYWTKNPFPNSONAC TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC 5FMXUX2ZFIF6NQZCS54W7ZOCVSH7XR6UIMQ5FW2UZLEN4EWP5PSAC S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC 62QFUV3PSEEXKEFGARMAYALNWY6KJVLGWGKV7JIXRBE37AMC64FQC PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC 25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC U5SDF665RTV32CTKTC4QO3Q5B44IAE42MZYJSYUNZP3JZEUTO4KQC EB33TUEEJFHMEO6YHEXSYX3MBXHNPEFNMZL2VA75GOGKY6POSF2AC MHFHZER5HZJN2JH3BL2GQ2WEN4ZC7Q35WOYHTXLL4DIBCXYNROSQC 2G7MZ653N3JUHJ4DA5Q7VRO3S5T27DLPKDCJEKB6DGYSTXULUVWAC 3VWSZUGYL36SO5AOZRASGK3VHFCFZUGGCGRT3R7BZB36IZPN7OSQC 5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC VQD5BW56OTUNPILMCASXZ6YZ3OQGXKQ7CSNDMNZUX72AQZXKOE3QC RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC W6JMQP26KNVIZOJTITBWR447OX63DUKBIQE442Q7QYLUUKJVBELAC NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC 5JS3QSE3EIXSBVI4DATH2EIFD7QN3POAFEUM7MK4NRMPH5JOPAAQC SFWCESFCUEVKJ6ZQQX3Y5YTIQD5BC6MCVSLVZFRGRTU46BFLKKWAC LTX72QGIPNUGWQN5ULPOMFCOPZTK7472DQY4AYX5WM3WHSUVXI5QC TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC BIZDHHK5LIO57S5AKHEPJFLWV5DAFKZIKYBGOUNGICSWTX7DCXKAC I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC OYATP4N2G5QIC45GJOWL552ASS4FAOMJ3JUCWAXNKSUPOVVBMDOQC ADNUOKDM2BLXCMGW6FOI3KYKDPIUUDJJXESMWDVSXXR5TZCGQ5YQC FMFHUGIGNGM7ACN7HFYODRSWU3SGFSMIJHA4APTZNMJQL2TVZNOAC WP5VP57D5BWKDAS7AA224OV2RX4O4BPTI2BLY7TS3T2O2PLUGXCQC HIRKGUMNJPWKSVTR6TVBPD3MWNA63CEHCLCIPWEMGDFHVB3NPLDQC VMDHEP2MGV6D5MTWNNTUYV4SY45JC3ITDEZLHT4HDJ4N2GXM755AC QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC PZNRGNZPN4YLXL2UDMEUPE33AAZZ6Z2YPK6EQGYZL2PNTRWLCUNQC P25D567E2UEAQHNI7LAZPNY7KAI3J4OE77YKLWOIEEALC5RREJHAC 6CWMT6I76TMTHT7BVOVZJ7ATDMZ3VBKKICIRRZBOSGLHJMDS2DWQC AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC 7VCVH6XKT4L4PSCBF6XRYV3WQQDVGDMA73RHPV6IOWMQ2S7B5XAQC CPGSHENA5WYRZBW6NBZ2MQKNXE4RJS4SR3Q2H5NL5D3DDDRHHVVQC 7VRY3OH6WA7QLMNNOX76RR7C6HA7CLNYLZLWPXJWAP75QRF5B27AC marshallByte(th, you.beheld_by.size());for (unsigned int k = 0; k < you.beheld_by.size(); k++)marshallByte(th, you.beheld_by[k]);
marshallByte(th, you.mesmerised_by.size());for (unsigned int k = 0; k < you.mesmerised_by.size(); k++)marshallByte(th, you.mesmerised_by[k]);
// Returns true if player is beheld by a given monster.bool player_beheld_by( const monsters *mon )
// Returns true if player is mesmerised by a given monster.bool player_mesmerised_by( const monsters *mon )
mprf(MSGCH_DIAGNOSTICS, "beheld_by.size: %d, DUR_BEHELD: %d, current mon: %d",you.beheld_by.size(), you.duration[DUR_BEHELD],monster_index(mon));
mprf(MSGCH_DIAGNOSTICS, "mesmerised_by.size: %d, DUR_MESMERISED: %d, ""current mon: %d", you.mesmerised_by.size(),you.duration[DUR_MESMERISED], monster_index(mon));
int radius = 25*25;if (chance_forgotten < 100 && you.level_type == LEVEL_LABYRINTH&& you.species == SP_MINOTAUR)
// The radius is only used in labyrinths.const bool use_lab_check = (!force && you.level_type == LEVEL_LABYRINTH&& chance_forgotten < 100);const int radius = (use_lab_check && you.species == SP_MINOTAUR) ? 40*40: 25*25;for (rectangle_iterator ri(1); ri; ++ri)
radius = 40*40;}for (unsigned char xcount = 0; xcount < GXM; xcount++)for (unsigned char ycount = 0; ycount < GYM; ycount++)
if (!see_grid(*ri)&& (force || x_chance_in_y(chance_forgotten, 100)|| use_lab_check && (you.pos()-*ri).abs() > radius))
const coord_def c(xcount, ycount);if (!see_grid(c)&& (force || x_chance_in_y(chance_forgotten, 100)|| chance_forgotten < 100 && (you.pos()-c).abs() > radius)){env.map[xcount][ycount].clear();}}
env.map(*ri).clear();
if (you.duration[DUR_BEHELD])out.push_back(status_light(RED, "Bhld"));
// TODO: Differentiate between mermaids and sirens!if (you.duration[DUR_MESMERISED])out.push_back(status_light(RED, "Mesm"));
// If you're already beheld by an invisible mermaid she can// still prolong the enchantment; otherwise you "resist".if (already_beheld)
// If you're already mesmerised by an invisible mermaid she// can still prolong the enchantment; otherwise you "resist".if (already_mesmerised)
you.duration[DUR_BEHELD] = 7;you.beheld_by.push_back(monster_index(monster));mpr("You are beheld!", MSGCH_WARN);
you.duration[DUR_MESMERISED] = 7;you.mesmerised_by.push_back(monster_index(monster));mprf(MSGCH_WARN, "You are mesmerised by %s!",monster->name(DESC_NOCAP_THE));
// Shift blood some most of the time.if (is_bloodcovered(c)){if (one_chance_in(4)){int wall_count = 0;coord_def old_adj(c);for (adjacent_iterator ai(c); ai; ++ai)if (grid_is_wall(grd(*ai)) && one_chance_in(++wall_count))old_adj = *ai;if (old_adj != c){if (!is_bloodcovered(old_adj))env.map(old_adj).property |= FPROP_BLOODY;env.map(c).property &= (~FPROP_BLOODY);}}}else if (one_chance_in(750)){// Sometimes (rarely) add blood randomly, accumulating with time...env.map(p).property |= FPROP_BLOODY;}
// Shift blood some of the time.if (is_bloodcovered(p)){if (one_chance_in(4)){int floor_count = 0;coord_def new_adj(p);for (adjacent_iterator ai(c); ai; ++ai)if (_is_floor(grd(*ai)) && one_chance_in(++floor_count))new_adj = *ai;if (new_adj != p){if (!is_bloodcovered(new_adj))env.map(new_adj).property |= FPROP_BLOODY;env.map(p).property &= (~FPROP_BLOODY);}}}else if (one_chance_in(150)){// Occasionally add blood randomly, accumulating with time...env.map(p).property |= FPROP_BLOODY;}