E3OI7XFKECKFLJT3KMTGCUDNXEJGS5I6DDV6X3VJPU2R53YSPLXQC
ORQ25OHUR4IWKFAOKMQGILMQWWFXTWBMI4CVXGKUG54CZXNKGL6AC
H6BKDO7FWEURT2BOJWZ55GKJMZ6MFJP5BCDVZVZJUJAUNYDXQOPAC
TQXNC2YQVJZXBPSLDEANMM2EDGHTH4DSN74OJIRMUF7D46SESHZAC
HS4YFXH6CMLDAPF5BMFOTHYY4K3LLW4WIWBDR7IEVJC3WHJYSYFAC
LOAPDCDZDTOXBCNX7IQBCACP7TCMVUBNZVUTUCLX5VXM7MEFPQBQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
2E4RV454MTTCKYLKMSHEEAFPNAFVUXXPBZV3XP6V7QMF4BBWE7TAC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
4CHQ6JHHITQSW4FJPGP3LFHIZUXLUMMUGH4TRUNN4FU2PXLNVQFQC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
KO7TLN7OM7UQF33RRTOFPFTDQLTYCOE4N7KWQUTWRIUSEB6PQ4WQC
WVKP2MFDE56ZO3OI7FCEKE5LI3MAUIL6IDTUW6MEBCV5OWF4OKEAC
YKVVFNKT2M5WG2KBURRTOJG23BJVI6WUBP5JOGYPHQBS4RNGFGWQC
SXUKGEXMGRRN6UO2GJW4HSVU5TSUNUHIHBMMF7CAG7QMLKZYWTKQC
TMN6MGCYNMQL3GG5P3JKKT4ROF2RB26H4AE6LHNEE76MBRVCDZMQC
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
RCPQNIRPR3NQXEMVLBAQW6657UJFIP43N54UJVEZHJH22OH4UQIQC
I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC
Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC
}
bool mon_can_see_monster(const monsters *mon, const monsters *targ)
{
if (!mon->mon_see_cell(targ->pos()))
return (false);
return (mons_monster_visible(mon, targ));
}
// This does NOT do line of sight! It checks the targ's visibility
// with respect to mon's perception, but doesn't do walls or range.
bool mons_monster_visible(const monsters *mon, const monsters *targ)
{
if (targ->has_ench(ENCH_SUBMERGED)
|| targ->invisible() && !mon->can_see_invisible())
{
return (false);
}
return (true);
if (this == looker)
return (true);
if (looker->atype() == ACT_PLAYER)
return player_monster_visible(this);
else
{
const monsters* mon = dynamic_cast<const monsters*>(looker);
return mons_monster_visible(mon, this);
}
bool vis = !invisible() || looker->can_see_invisible();
return (vis && (this == looker || !has_ench(ENCH_SUBMERGED)));