From e26dbf39d5bc719067ed58ddddac98efa6e02b22 Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Tue, 3 Nov 2009 11:32:54 +0100 Subject: Implement diagonal corridor reflections. --- crawl-ref/source/ray.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'crawl-ref/source/ray.cc') 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 { -- cgit v1.2.3-54-g00ecf