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;
}