diff options
author | Adam Borowski <kilobyte@angband.pl> | 2011-12-11 17:26:46 +0100 |
---|---|---|
committer | Adam Borowski <kilobyte@angband.pl> | 2011-12-11 17:27:30 +0100 |
commit | e1e8809eb886f2e70a65d9c9a440534903669623 (patch) | |
tree | 21bc42384a3f92e80229d92821e3198d86803c34 /crawl-ref/source/los.cc | |
parent | d09b4f16275a05d49ed29aef992ecb85212f287c (diff) | |
download | crawl-ref-e1e8809eb886f2e70a65d9c9a440534903669623.tar.gz crawl-ref-e1e8809eb886f2e70a65d9c9a440534903669623.zip |
Fix mimic opacity for different LOS models.
Diffstat (limited to 'crawl-ref/source/los.cc')
-rw-r--r-- | crawl-ref/source/los.cc | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/crawl-ref/source/los.cc b/crawl-ref/source/los.cc index c3c1fb8159..f10471f3b3 100644 --- a/crawl-ref/source/los.cc +++ b/crawl-ref/source/los.cc @@ -895,13 +895,23 @@ void losight(los_grid& sh, const coord_def& center, losight(sh, los_param_funcs(center, opc, bounds)); } -opacity_type mons_opacity(const monster* mon) +opacity_type mons_opacity(const monster* mon, los_type how) { - if (mon->type == MONS_BUSH) + // no regard for LOS_ARENA + if (mon->type == MONS_BUSH && how != LOS_SOLID) return OPC_HALF; - if (mons_is_feat_mimic(mon->type) && feat_is_opaque(get_mimic_feat(mon))) - return OPC_OPAQUE; + if (mons_is_feat_mimic(mon->type)) + { + dungeon_feature_type feat = get_mimic_feat(mon); + if (how == LOS_SOLID) + return feat_is_solid(feat) ? OPC_OPAQUE : OPC_CLEAR; + if (how == LOS_NO_TRANS) + if (feat_is_wall(feat) || feat_is_tree(feat)) + return OPC_OPAQUE; + if (feat_is_opaque(get_mimic_feat(mon))) + return OPC_OPAQUE; + } return OPC_CLEAR; } @@ -918,7 +928,8 @@ static void _handle_los_change() static bool _mons_block_sight(const monster* mons) { - return mons_opacity(mons) != OPC_CLEAR; + // must be the least permissive one + return mons_opacity(mons, LOS_SOLID_SEE) != OPC_CLEAR; } void los_actor_moved(const actor* act, const coord_def& oldpos) |