diff options
author | Robert Vollmert <rvollmert@gmx.net> | 2009-11-03 11:32:54 +0100 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2009-11-03 11:33:23 +0100 |
commit | e26dbf39d5bc719067ed58ddddac98efa6e02b22 (patch) | |
tree | 4d3583106748eafac08fa62c9a8e05b451ba6c9a /crawl-ref/source/ray.cc | |
parent | e6cb68071e47bd2ae335598202ff46fd70a8f44b (diff) | |
download | crawl-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.cc | 16 |
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 { |