changeset 51:1e347ff94ea6

visibility includes monsters now
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 28 Aug 2011 17:17:17 +0200
parents e1bad2c34eae
children 46f33d277b4d
files src/display.py src/level.py src/main.py
diffstat 3 files changed, 28 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/display.py	Sun Aug 28 16:20:56 2011 +0200
+++ b/src/display.py	Sun Aug 28 17:17:17 2011 +0200
@@ -65,18 +65,10 @@
 class Overlay(pygame.sprite.Sprite):
     def __init__(self, x, y, image):
         super(Overlay, self).__init__()
-        self.image = image.subsurface((0, 0, 24, 16))
+        self.image = image
         self.rect = self.image.get_rect()
         self.rect.move_ip(x * 24, y * 16)
-        self.alpha = 0
-        self.image.set_alpha(0)
 
-    def update(self):
-        if self.alpha < 255:
-            self.alpha += 32
-            if self.alpha > 255:
-                self.alpha = 255
-            self.image.set_alpha(self.alpha)
 
 class Darkness(pygame.sprite.Sprite):
     def __init__(self, x, y, w, h, holes=()):
@@ -120,14 +112,15 @@
         self.darkness = pygame.sprite.RenderUpdates()
         self.effects = pygame.sprite.RenderUpdates()
         self.menus = SortedUpdates()
-        self.empty()
 
-    def empty(self):
+    def empty(self, map_size=(30, 30)):
         self.key = None
         self.scroll_offset = (0, 0)
-        self.background = pygame.Surface((self.screen.get_width(),
-                                          self.screen.get_height()))
+        self.background = pygame.Surface((map_size[0] * 24, map_size[1] * 16))
         self.background.fill((0, 0, 0))
+        self.fog = pygame.Surface((map_size[0] * 24, map_size[1] * 16),
+                                  pygame.SRCALPHA)
+        self.fog.fill((255, 255, 255))
         self.sprites.empty()
         self.shadows.empty()
         self.overlay.empty()
@@ -175,6 +168,11 @@
         self.sprites.draw(self.screen)
         self.overlay.draw(self.screen)
         self.darkness.draw(self.screen)
+        self.screen.blit(self.fog, (0, 0),
+            pygame.rect.Rect(
+                (-self.scroll_offset[0], -self.scroll_offset[1]),
+                (self.screen.get_width(), self.screen.get_height())),
+                pygame.BLEND_RGBA_SUB)
         self.effects.draw(self.screen)
         self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
@@ -207,6 +205,10 @@
         self.overlay.draw(self.screen)
         dirty += self.darkness.draw(self.screen)
         dirty += self.effects.draw(self.screen)
+        for d in dirty:
+            r = d.move(-self.scroll_offset[0], -self.scroll_offset[1])
+            self.screen.blit(self.fog, d.topleft, r, pygame.BLEND_RGBA_SUB)
+        self.effects.draw(self.screen)
         self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
         self._sprite_shift(self.overlay, self.scroll_offset, reverse=True)
--- a/src/level.py	Sun Aug 28 16:20:56 2011 +0200
+++ b/src/level.py	Sun Aug 28 17:17:17 2011 +0200
@@ -127,9 +127,7 @@
             return True
 
     def render(self, display):
-        display.background = pygame.Surface((len(self.map[0]) * 24,
-                                             len(self.map) * 16))
-        #self.render_map(display, None)
+        display.empty((len(self.map[0]), len(self.map)))
         self.flags = []
         for y, line in enumerate(self.map):
             self.flags.append([])
@@ -143,6 +141,7 @@
         self.hero.render(display)
         for m in self.monsters.itervalues():
             m.render(display)
+        self.render_map(display, None)
 
     def get_room(self, x, y):
         for line in self.rooms:
@@ -151,7 +150,7 @@
                     return room
         raise KeyError('Not in any room')
 
-    def explore(self, display, x, y):
+    def explore(self, to_display, x, y):
         try:
             room = self.get_room(x, y)
             area = (room[0] + 1, room[1] + 1, room[2], room[3])
@@ -161,23 +160,28 @@
                 min(len(self.map[0]), area[2] + 1),
                 min(len(self.map), area[3] + 1))
         update = False
+        holes = set()
         for y in range(area[1], area[3]):
             for x in range(area[0], area[2]):
                 if not self.flags[y][x] & self.EXPLORED:
                     update = True
+                    self.flags[y][x] |= self.EXPLORED
+                    to_display.fog.fill((0, 0, 0),
+                                        rect=(x * 24, y * 16, 24, 16))
+                else:
+                    holes.add((x - area[0], y - area[1]))
+
         if not update:
             return
-        self.render_map(display, area)
-        for y in range(area[1], area[3]):
-            for x in range(area[0], area[2]):
-                self.flags[y][x] |= self.EXPLORED
+        dark = display.Darkness(area[0], area[1], area[2] - area[0],
+                                area[3] - area[1], holes)
+        to_display.darkness.add(dark)
 
     def render_map(self, to_display, area):
         if area is None:
             area = (0, 0, len(self.map[0]), len(self.map))
         to_display.background.fill((0, 0, 0), rect=pygame.rect.Rect(area[0]*24,
             area[1]*16, (area[2] - area[0]) * 24, (area[3] - area[1]) * 16))
-        holes = set()
         for y, line in enumerate(self.map[area[1]:area[3]]):
             for x, c in enumerate(line[area[0]:area[2]]):
                 tile_class = self.key.get(c)
@@ -188,8 +192,3 @@
                     self.things[(area[0] + x, area[1] + y)].render(to_display)
                 except KeyError:
                     pass
-                if self.flags[area[1] + y][area[0] + x] & self.EXPLORED:
-                    holes.add((x, y))
-        dark = display.Darkness(area[0], area[1], area[2] - area[0],
-                                area[3] - area[1], holes)
-        to_display.darkness.add(dark)
--- a/src/main.py	Sun Aug 28 16:20:56 2011 +0200
+++ b/src/main.py	Sun Aug 28 17:17:17 2011 +0200
@@ -19,7 +19,6 @@
         self.display.menus.add(self.health)
 
     def start_level(self):
-        self.display.empty()
         self.level = level.Level(self.hero, self.depth)
         self.depth += 1
         self.level.render(self.display)