changeset 48:006f9df7bf25

rogue-like lighting
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 28 Aug 2011 00:08:12 +0200
parents fa351463d204
children 2b08885bf8ee
files src/level.py src/main.py
diffstat 2 files changed, 50 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/level.py	Sat Aug 27 23:18:10 2011 +0200
+++ b/src/level.py	Sun Aug 28 00:08:12 2011 +0200
@@ -96,12 +96,14 @@
         '*': GrassTile,
     }
     BLOCKED = 1
+    EXPLORED = 2
 
     def __init__(self, hero, depth):
         self.hero = hero
         self.depth = depth
         gen = generator.LevelGenerator(depth)
         self.map = gen.map
+        self.rooms = gen.rooms
         self.things = {}
         for t in gen.things.itervalues():
             self.things[(t.x, t.y)] = t
@@ -124,29 +126,63 @@
         except IndexError:
             return True
 
-    def render(self, display, area=None):
-        if area is None:
-            area = (0, 0, len(self.map[0]), len(self.map))
+    def render(self, display):
         display.background = pygame.Surface((len(self.map[0]) * 24,
                                              len(self.map) * 16))
+        #self.render_map(display, None)
         self.flags = []
-        for y, line in enumerate(self.map[area[1]:area[3]]):
+        for y, line in enumerate(self.map):
             self.flags.append([])
-            for x, c in enumerate(line[area[0]:area[2]]):
+            for x, c in enumerate(line):
                 tile_class = self.key.get(c)
                 if tile_class:
                     tile = tile_class(x, y, self.map)
-                    tile.render(display)
                 self.flags[-1].append(0)
                 if tile_class is None or tile.blocks:
                     self.flags[-1][-1] |= self.BLOCKED
         self.hero.render(display)
-        for t in self.things.itervalues():
-            t.render(display)
         for m in self.monsters.itervalues():
             m.render(display)
 
+    def get_room(self, x, y):
+        for line in self.rooms:
+            for room in line:
+                if room[0] <= x <= room[2] and room[1] <= y <= room[3]:
+                    return room
+        raise KeyError('Not in any room')
+
+    def explore(self, display, x, y):
+        try:
+            room = self.get_room(x, y)
+            area = (room[0] + 1, room[1] + 1, room[2], room[3])
+        except KeyError:
+            area = (x, y, x + 1, y + 1)
+        area = (max(0, area[0] - 1), max(0, area[1] - 1),
+                min(len(self.map[0]), area[2] + 1),
+                min(len(self.map), area[3] + 1))
+        if (self.flags[area[1]][area[0]] & self.EXPLORED and
+            self.flags[area[1]][area[2]] & self.EXPLORED and
+            self.flags[area[3]][area[0]] & self.EXPLORED and
+            self.flags[area[3]][area[2]] & self.EXPLORED):
+            return
+        for y in range(area[1], area[3] + 1):
+            for x in range(area[0], area[2] + 1):
+                self.flags[y][x] |= self.EXPLORED
+        self.render_map(display, area)
+        display.redraw()
+
     def render_map(self, display, area):
-        display.background.fill((0, 0, 0), rect=Rect(area[0]*24, area[1]*16,
-            (area[2] - area[0]) * 24, (area[3] - area[1]) * 16))
-
+        if area is None:
+            area = (0, 0, len(self.map[0]), len(self.map))
+        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))
+        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)
+                if tile_class:
+                    tile = tile_class(area[0] + x, area[1] + y, self.map)
+                    tile.render(display)
+                try:
+                    self.things[(area[0] + x, area[1] + y)].render(display)
+                except KeyError:
+                    pass
--- a/src/main.py	Sat Aug 27 23:18:10 2011 +0200
+++ b/src/main.py	Sun Aug 28 00:08:12 2011 +0200
@@ -11,7 +11,7 @@
 class Game(object):
     def __init__(self):
         self.depth = 0
-        self.display = display.Display((320, 200))
+        self.display = display.Display((800, 600))
         self.hero = hero.Hero()
         self.start_level()
         self.health = menu.GameInfo(288, 8, 'HP %d/10' % self.hero.hp,
@@ -24,6 +24,7 @@
         self.depth += 1
         self.level.render(self.display)
         self.display.scroll_to(self.hero.sprite.rect)
+        self.level.explore(self.display, self.hero.x, self.hero.y)
 
     def control(self):
         if self.display.key == pygame.locals.K_ESCAPE:
@@ -49,6 +50,7 @@
                 self.hero.walk(self.level, 1, 0)
                 end_turn = True
         if end_turn:
+            self.level.explore(self.display, self.hero.x, self.hero.y)
             self.hero.tick()
             self.health.change('HP %d/10' % self.hero.hp)
             monsters = self.level.monsters.values()