summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-10 10:28:04 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-10 10:31:10 +0100
commit4bd335dab6488ac58d412f8b640801350207c398 (patch)
tree187a5b3252c69e55c5ad39b7045fb7c05b9f16a0 /crawl-ref
parentaa69f6aa4526b7d8ed161de9324a5df76faec366 (diff)
downloadcrawl-ref-4bd335dab6488ac58d412f8b640801350207c398.tar.gz
crawl-ref-4bd335dab6488ac58d412f8b640801350207c398.zip
Make disintegration splatter not end up behind actors.
Also not at actors' feet. Might be even nicer to have them thrown as missiles: You are hit by a piece of orc flesh. The giant bat is hit by a chunk of yak flesh. The giant bat dies.
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/losparam.cc8
-rw-r--r--crawl-ref/source/losparam.h10
-rw-r--r--crawl-ref/source/monstuff.cc5
3 files changed, 21 insertions, 2 deletions
diff --git a/crawl-ref/source/losparam.cc b/crawl-ref/source/losparam.cc
index 0c8f41cead..3666081897 100644
--- a/crawl-ref/source/losparam.cc
+++ b/crawl-ref/source/losparam.cc
@@ -78,3 +78,11 @@ opacity_type opacity_monmove::operator()(const coord_def& p) const
else
return (OPC_CLEAR);
}
+
+opacity_type opacity_no_actor::operator()(const coord_def& p) const
+{
+ if (feat_is_solid(env.grid(p)) || actor_at(p))
+ return (OPC_OPAQUE);
+ else
+ return (OPC_CLEAR);
+}
diff --git a/crawl-ref/source/losparam.h b/crawl-ref/source/losparam.h
index ccdd548f19..0b3a1c64dd 100644
--- a/crawl-ref/source/losparam.h
+++ b/crawl-ref/source/losparam.h
@@ -82,6 +82,16 @@ struct opacity_monmove : opacity_func
opacity_type operator()(const coord_def& p) const;
};
+// Make any actor (as well as solid features) block.
+// Note that the blocking actors are still "visible".
+struct opacity_no_actor : opacity_func
+{
+ CLONE(opacity_no_actor)
+
+ opacity_type operator()(const coord_def& p) const;
+};
+static opacity_no_actor opc_no_actor;
+
// Subclasses of this are passed to losight() to modify the
// LOS calculation. Implementations will have to translate between
// relative coordinates (-8,-8)..(8,8) and real coordinates,
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index bd3e6d08a5..4aa5ecfa4c 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -344,7 +344,8 @@ monster_type fill_out_corpse(const monsters* monster, item_def& corpse,
bool explode_corpse(item_def& corpse, const coord_def& where)
{
- los_def ld(where, opc_solid);
+ // Don't want chunks to show up behind the player.
+ los_def ld(where, opc_no_actor);
if (monster_descriptor(corpse.plus, MDSC_LEAVES_HIDE)
&& mons_genus(corpse.plus) == MONS_DRAGON)
@@ -396,7 +397,7 @@ bool explode_corpse(item_def& corpse, const coord_def& where)
mprf(MSGCH_DIAGNOSTICS, "Cell is visible...");
#endif
- if (feat_is_solid(grd(cp)))
+ if (feat_is_solid(grd(cp)) || actor_at(cp))
continue;
--nchunks;