Mercurial > scrounge
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()
