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 trapsblast.name = "blast of fragments";blast.colour = env.floor_colour; // in order to blend in
explode = true;hole = false; // to hit monsters standing on trapsblast.name = "blast of fragments";blast.colour = env.floor_colour; // in order to blend in
explode = true;hole = false; // to hit monsters standing on doorsblast.name = "blast of rock fragments";blast.colour = LIGHTGREY;
explode = true;hole = false; // to hit monsters standing on doorsblast.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))