changeset 6:c98a36b9393e

Fluent opacity
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 01 Apr 2013 22:01:36 +0200
parents 6666dbf909be
children 82d43295ba98
files rrr/level.py rrr/light.py run.py
diffstat 3 files changed, 15 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/rrr/level.py	Mon Apr 01 21:44:59 2013 +0200
+++ b/rrr/level.py	Mon Apr 01 22:01:36 2013 +0200
@@ -11,6 +11,7 @@
         'symbol': '?',
         'color': 'magenta',
         'opaque': True,
+        'opacity': 1.0,
         'block': True,
     },
     {
@@ -18,6 +19,7 @@
         'symbol': '.',
         'color': 'black',
         'opaque': False,
+        'opacity': 0.0,
         'block': False,
     },
     {
@@ -25,6 +27,7 @@
         'symbol': '.',
         'color': 'gray',
         'opaque': False,
+        'opacity': 0.0,
         'block': False,
     },
     {
@@ -32,6 +35,7 @@
         'symbol': ':',
         'color': 'gray',
         'opaque': False,
+        'opacity': 0.25,
         'block': False,
     },
     {
@@ -39,6 +43,7 @@
         'symbol': '#',
         'color': 'gray',
         'opaque': True,
+        'opacity': 1.0,
         'block': True,
     },
 
@@ -71,6 +76,10 @@
         t = self.get_terrain(pos)
         return t['opaque']
 
+    def get_opacity(self, pos):
+        t = self.get_terrain(pos)
+        return t['opacity']
+
     def get_char(self, pos):
         t = self.get_terrain(pos)
         return t['symbol'], t['color']
--- a/rrr/light.py	Mon Apr 01 21:44:59 2013 +0200
+++ b/rrr/light.py	Mon Apr 01 22:01:36 2013 +0200
@@ -40,7 +40,7 @@
                 else:
                     break
 
-    def _quart(self, pos, r, is_opaque, dx, dy):
+    def _quart(self, pos, r, get_opacity, dx, dy):
         max_rays = self.max_rays
         ray_max = self.ray_max
         ray_min = self.ray_min
@@ -57,8 +57,10 @@
                 shadow = sum(rays[ray_min[x][y]:ray_max[x][y]])
                 if 12 * shadow < 11 * rayspan:
                     lit.add((xpos, ypos))
-                if is_opaque((xpos, ypos)):
-                    rays[ray_min[x][y]:ray_max[x][y]] = [1] * rayspan
+                opacity = get_opacity((xpos, ypos))
+                if opacity:
+                    for ray in xrange(ray_min[x][y], ray_max[x][y]):
+                        rays[ray] += opacity
                 xpos += dx
             ypos += dy
             xpos = ox
--- a/run.py	Mon Apr 01 21:44:59 2013 +0200
+++ b/run.py	Mon Apr 01 22:01:36 2013 +0200
@@ -25,7 +25,7 @@
             for p in level.explored:
                 ch, c = level.get_char(p)
                 display.map_draw(p, ch, 'magenta')
-        lit = light.cast((x, y), 8, level.is_opaque)
+        lit = light.cast((x, y), 8, level.get_opacity)
         level.explored |= lit
         for p in oldlit - lit:
             ch, c = level.get_char(p)