summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/ray.cc
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-11-03 11:32:54 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-11-03 11:33:23 +0100
commite26dbf39d5bc719067ed58ddddac98efa6e02b22 (patch)
tree4d3583106748eafac08fa62c9a8e05b451ba6c9a /crawl-ref/source/ray.cc
parente6cb68071e47bd2ae335598202ff46fd70a8f44b (diff)
downloadcrawl-ref-e26dbf39d5bc719067ed58ddddac98efa6e02b22.tar.gz
crawl-ref-e26dbf39d5bc719067ed58ddddac98efa6e02b22.zip
Implement diagonal corridor reflections.
Diffstat (limited to 'crawl-ref/source/ray.cc')
-rw-r--r--crawl-ref/source/ray.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/crawl-ref/source/ray.cc b/crawl-ref/source/ray.cc
index 0951a1c0a2..398032438e 100644
--- a/crawl-ref/source/ray.cc
+++ b/crawl-ref/source/ray.cc
@@ -227,9 +227,19 @@ void ray_def::bounce(const reflect_grid &rg)
if (rx && ry && !rxy)
{
// Tricky case: diagonal corridor.
- // TODO: Implement this.
- rmirr.dir = -rmirr.dir;
- r.to_grid(diamonds, true);
+ geom::form wall(1, -1);
+ // The actual walls: geom::line l1(1, -1, 0.5), l2(1, -1, -0.5);
+ geom::line k(1, 1, 2.5);
+ ASSERT(k.f(rmirr.dir) > 0); // We're actually moving towards k.
+ ASSERT(!geom::parallel(rmirr.dir, geom::form(1, -1)));
+ // Now bounce back and forth between l1 and l2 until we hit k.
+ while (!double_is_zero(intersect(rmirr, k)))
+ {
+ rmirr.to_grid(diamonds, false);
+ r.dir = reflect(r.dir, wall);
+ }
+ // Now pointing inside the destination cell (1,1) -- move inside.
+ rmirr.to_grid(diamonds, true);
}
else
{