and use it in the checks for monster/monster visibility.
I didn't have the time to test it but it should at least solve part of the problem of monsters firing through walls (if monster visibility is even checked there, which I don't know).
Also (as usually), more code cleanup.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5117 c06c8d41-db1a-0410-9941-cceddc491573
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
MDHT54XGNRJ7WX42TZIDHKOIVKN4V6JEM22YDDBADICIS7ZDN7DAC
CXMQZDNQ32IQ6S6V5HVIGIFUDYZLIECP4H63YMWVLDCXNII7NHOQC
IGKVCDUXGUOCEDVHXKOXNVMN3I3SFBRXG2G3WPKZBVL7USXSC47QC
GQTOIBHYZYKCI7ZOKK4NSYSBHKWM4FDRFIQWVKDJPKUFGTMENMAQC
66DDSFAHW4O32QBBARNSYI6HHZFCQL6LEUKRVKJVGFUFAAJGS4IQC
C4CGYUPRJPDPAF6E65Y3MGAK45PNDPF2CNT276V7P37PPLX3AR5QC
S74K64QSPLDUVI43I2QB4B6LIZTHRSXEXUFY76RBPJZD4J2SHCLAC
PSCYVKJ7DGXAL3V5U4O6AJTRV6Q3N3SHQWAZ73VIPRTE4W64F2XAC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
7TK2D5RI45FKCIQBHGU4FA75NSFZA3ZYFF2UYQJEGHCOV7I4XUGQC
LS3DAZVRDCXVN2BKBC6RGCKO3R43Z7HKG4GXJWLBK4AKBL2G6QDQC
AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
UH3CJQMQ3NPICXD34NTCTUZJWOCEF4P5XEGXFLLNDDFLZK7QPUBQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
GT7BSR54BVJKHUCLEBTELGBMNBFFDQW52EVC4XKVEMUVG2UGZMDAC
ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
74LQ7JXVLAFSHLI7LCBKFX47CNTYSKGUQSXNX5FCIUIGCC2JTR3QC
FBK5ECMQ6HJSQSN7C3DICKJIRJ3CSO3CHCQ3ONPBKLLSHDGPBQ7QC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
FXVDNB6MAAOSEP37HP7CIPPXNS7FDECN3GCRMT5UFFCKLHIL6IVAC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
IJHH3PPN3KL6CXDXOB4I7VBEHHQJXXIKRZN45CT4DX5PQGER5REAC
YSIROVP23L7IDSVTBG7OQFQWLORVWWYINH7WPWTZO2I5BH4S7YPQC
HQSI2RK5QGNSOR5Y67GZDK4ZWFZ5DSRPASXAV4VHYVB5TUXFZWJQC
TZMLB4SJENS4JWIPIG7HFOFRIOZYYH5YB4TG7ZGBYT63C5B3MXDQC
OWERGKLVPNPGIIS23FZ7ZDOBWUIXCKYAFG3URXU75JAUDX3N5ENAC
NDCVITU5R7TBEUC4FILNFRKWQGUNCJUGW5HA5KW3CQTU6AYRLYWQC
UPNIIOG2FHJ4WFGGPZBFYK3GYONL3Z5LO4FEYRJPE7WHNI5R7UZQC
2TFYJ7D72JY4DYQW3GSPEONA2WYIVHAJXTIQ2QRDIWF65XN2QFGAC
USSKCWQTF6BTE3SFLQVCT6RZHU2R7URWFC7EPO2EN3Z6U4IEQ7GQC
RCPQNIRPR3NQXEMVLBAQW6657UJFIP43N54UJVEZHJH22OH4UQIQC
Z75MWMOPGK3RC3ERIV5AW52CRJDTYWLXYGE6CHRF4MCB5EJ7WH6QC
AOXEL2V6ICXEIRWXB76LJARWP3NPKG2L4UFYOIQUALUJU4ZLE3UQC
NUYXKJP5YXHRDUQW5QW7UC3D5U3VPANIOZAOHFCPWMSRYGMA3GCAC
YFLL7A5URWZ5LWX6W7QBHJI6ZSQAARW4KX357GZCZNI7Q2DD4YHQC
T6RHDGQQWMHGQTTDXLXIJZUQ5MSGI4R6BNISTE7WV73BABJHK2YQC
2E4RV454MTTCKYLKMSHEEAFPNAFVUXXPBZV3XP6V7QMF4BBWE7TAC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC
ZJSJGWYEOMUS4VK7VWFVLKW2E42X7KPFLK6HAA5LN3URQWISQULQC
LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC
KBNY5FWKTEAKABFCLPC3QFKFSVZKAGXINPCIFV6WDSWFO4VCKNTAC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
SJDOBXECX7F3ZPPVR7FPURE53D47PP2TFIF4SB6XPS456PZV3DQAC
ASH5CK6CPBKMLGGIRJ5GKTWMS5W3OBVHTL66RTYZIPFM6KFBYA3QC
PM65H4V4GNPVIJFUQW57DC3VDB7TRUUNXKVZONQKEFZSK3AXX5GQC
TXFN7TLLKYEM2W5HVB2UXKXUH7MTXOU77PXBPMP7NJKXSLVX5PMQC
QDWDUURSNLMT6AXNNJ3DEQCWAKCAIHV6MP5F7QGIBGXOG2BI2NPQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
QUFPPRIIRXHUFEDH3EFES7CSHTA7GG2DAXTRHUAUQBYMSWK4BP6AC
CH7JECYYH35H4TRHRNRTRJCQTQLZ2WRH62TKV72SUIU2RTK5OH7AC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
TMN6MGCYNMQL3GG5P3JKKT4ROF2RB26H4AE6LHNEE76MBRVCDZMQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC
GRSLMD5WMJD2WEKMYORL5K5FBA6QT3QIO4FNQQYD5XFFCD3EOL3QC
YX2LDGNQNB6AQRKAVXNYQ473X6EVPQEBT5AJKBIIWFIMS3U2BNQQC
Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC
SGR2P5BGJIJHVSSQYQHWS4ORLVHQBZTDES3D4BFC6SVAQXSKENNQC
VNIAJEGE3PYE6F6EAMCQDWMAS52EQTKJUPAFXK7ARCITZ326WTTQC
XFIU6NZ2FVPF7EPMMXLC5O4P7EKGVBC6K2IA3WSVJ57JONFIPKZQC
NLSZ4SHFD6LN6AWB3HLLKQTCKQW55ZHEW3YM7XRAVAKIPD3C3Q3AC
45QV77UI6QFW4234P365LD3FGJYRVWTT5455DPB324NG2NFQMKTQC
TPPJRQ2NTCV3GI2VRHEXQJREDERPJODCJWUG5WCOQGN4REPPPAMAC
TF5WVX4WNGWZTEB6BN3CLPOTLT7KWA3B6P2L2QWRFH67YTH5LVMAC
X4OCLD5YEXCYVQNMOQORLIO72AKUEMT3BT6FB3TW2HARKN5X7MEQC
VD4KDTGHVKCN35AWREYB4TEOUMCTW7SAUPAMTMF5ABC7VBHVKP4AC
GVCGKTH5IJ4VSQEIN4CRC7ZFVZW26JPIYNCPTO7GY66CSZZEW3ZQC
7V4DCKFJCNBXFODMKJ6H3MCDUTSD4XVQ7D4D6XFCD4JNF4HCE4KAC
LVCBY444HPB4RRFMUAZPHVZ67IC3L6DB27AEMCW3DEXHLBF73TMQC
blast.source_x = you.x_pos;
blast.source_y = you.y_pos;
blast.is_tracer = false;
blast.flavour = BEAM_FRAG;
blast.hit = AUTOMATIC_HIT;
blast.source_x = you.x_pos;
blast.source_y = you.y_pos;
blast.is_tracer = false;
blast.flavour = BEAM_FRAG;
blast.hit = AUTOMATIC_HIT;
explode = true;
blast.name = "blast of metal fragments";
blast.colour = CYAN;
explode = true;
blast.name = "blast of metal fragments";
blast.colour = CYAN;
explode = true;
blast.ex_size = 2;
blast.name = "blast of rock fragments";
blast.colour = BROWN;
explode = true;
blast.ex_size = 2;
blast.name = "blast of rock fragments";
blast.colour = BROWN;
explode = true;
blast.ex_size = 2;
blast.name = "blast of crystal shards";
blast.colour = WHITE;
explode = true;
blast.ex_size = 2;
blast.name = "blast of crystal shards";
blast.colour = WHITE;
|| (pow >= 40 && grid == DNGN_ROCK_WALL && one_chance_in(3))
|| (pow >= 40 && grid == DNGN_CLEAR_ROCK_WALL
&& one_chance_in(3))
|| (pow >= 60 && grid == DNGN_STONE_WALL && one_chance_in(10))
|| (pow >= 60 && grid == DNGN_CLEAR_STONE_WALL &&
one_chance_in(10)) ))
|| pow >= 40 && grid == DNGN_ROCK_WALL && one_chance_in(3)
|| pow >= 40 && grid == DNGN_CLEAR_ROCK_WALL
&& one_chance_in(3)
|| pow >= 60 && grid == DNGN_STONE_WALL && one_chance_in(10)
|| pow >= 60 && grid == DNGN_CLEAR_STONE_WALL
&& one_chance_in(10)))
what = "metal wall";
blast.colour = CYAN;
explode = true;
blast.name = "blast of metal fragments";
what = "metal wall";
blast.colour = CYAN;
explode = true;
blast.name = "blast of metal fragments";
what = "crystal wall";
blast.colour = GREEN;
explode = true;
blast.ex_size = 2;
blast.name = "blast of crystal shards";
what = "crystal wall";
blast.colour = GREEN;
explode = true;
blast.ex_size = 2;
blast.name = "blast of crystal shards";
explode = true;
hole = false; // to hit monsters standing on traps
blast.name = "blast of fragments";
blast.colour = env.floor_colour; // in order to blend in
explode = true;
hole = false; // to hit monsters standing on traps
blast.name = "blast of fragments";
blast.colour = env.floor_colour; // in order to blend in
explode = true;
hole = false; // to hit monsters standing on doors
blast.name = "blast of rock fragments";
blast.colour = LIGHTGREY;
explode = true;
hole = false; // to hit monsters standing on doors
blast.name = "blast of rock fragments";
blast.colour = LIGHTGREY;
if ( MONST_INTERESTING(monster)
// XXX yucky hack
|| monster->type == MONS_PLAYER_GHOST
|| monster->type == MONS_PANDEMONIUM_DEMON )
if (MONST_INTERESTING(monster)
// XXX yucky hack
|| monster->type == MONS_PLAYER_GHOST
|| monster->type == MONS_PANDEMONIUM_DEMON)
bool invis = (mons_class_flag( targetc, M_INVIS )
|| monster->invisible()) && !player_see_invis();
bool invis = (!player_see_invis() && (mons_class_flag( targetc, M_INVIS )
|| monster->invisible()));
|| ((grid_distance( monster->x, monster->y,
you.x_pos, you.y_pos ) > 1
// FIXME This is better expressed as a
// function such as
// monster_has_ranged_attack:
&& monster->type != MONS_ELECTRICAL_EEL
&& monster->type != MONS_LAVA_SNAKE
&& (monster->type != MONS_MERMAID
|| you.species == SP_MERFOLK)
// Don't submerge if we just unsubmerged for
// the sake of shouting.
&& monster->seen_context != "bursts forth shouting"
&& !one_chance_in(20)) )
|| grid_distance( monster->x, monster->y,
you.x_pos, you.y_pos ) > 1
// FIXME This is better expressed as a
// function such as
// monster_has_ranged_attack:
&& monster->type != MONS_ELECTRICAL_EEL
&& monster->type != MONS_LAVA_SNAKE
&& (monster->type != MONS_MERMAID
|| you.species == SP_MERFOLK)
// Don't submerge if we just unsubmerged for
// the sake of shouting.
&& monster->seen_context != "bursts forth shouting"
&& !one_chance_in(20)
if ( !mons_is_mimic(monster->type)
&& MONST_INTERESTING(monster)
&& monster->type != MONS_PANDEMONIUM_DEMON
&& monster->type != MONS_PLAYER_GHOST )
if (!mons_is_mimic(monster->type)
&& MONST_INTERESTING(monster)
&& monster->type != MONS_PANDEMONIUM_DEMON
&& monster->type != MONS_PLAYER_GHOST)
return actual_grid >= DNGN_FLOOR
|| (!generation
&& actual_grid == DNGN_SHALLOW_WATER);
{
return (actual_grid >= DNGN_FLOOR
|| !generation && actual_grid == DNGN_SHALLOW_WATER);
}
else if ( you.where_are_you == BRANCH_MAIN_DUNGEON &&
you.level_type == LEVEL_DUNGEON &&
mons_level(monster->type) >= you.your_level + ood_limit() &&
mons_level(monster->type) < 99 &&
!(monster->type >= MONS_EARTH_ELEMENTAL &&
monster->type <= MONS_AIR_ELEMENTAL)
&& !mons_class_flag( monster->type, M_NO_EXP_GAIN ))
else if (you.where_are_you == BRANCH_MAIN_DUNGEON
&& you.level_type == LEVEL_DUNGEON
&& mons_level(monster->type) >= you.your_level + ood_limit()
&& mons_level(monster->type) < 99
&& !(monster->type >= MONS_EARTH_ELEMENTAL
&& monster->type <= MONS_AIR_ELEMENTAL)
&& !mons_class_flag( monster->type, M_NO_EXP_GAIN ))
{
if ( mons_near(montarget) && player_monster_visible(montarget)
&& !mons_friendly(montarget) // not made friendly since then
&& _is_target_in_range(montarget->x, montarget->y, range) )
if (mons_near(montarget) && player_monster_visible(montarget)
&& !mons_friendly(montarget) // not made friendly since then
&& _is_target_in_range(montarget->x, montarget->y, range))