summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/los.cc
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2011-12-11 17:26:46 +0100
committerAdam Borowski <kilobyte@angband.pl>2011-12-11 17:27:30 +0100
commite1e8809eb886f2e70a65d9c9a440534903669623 (patch)
tree21bc42384a3f92e80229d92821e3198d86803c34 /crawl-ref/source/los.cc
parentd09b4f16275a05d49ed29aef992ecb85212f287c (diff)
downloadcrawl-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.cc21
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)