changeset 17:bf688acbf1d2

added monsters
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 21 Aug 2011 22:59:11 +0200
parents 18954a799e9e
children 4356dae3b3da
files display.py generator.py hero.py level.py monsters.png objects.png thing.py
diffstat 7 files changed, 57 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/display.py	Sun Aug 21 21:25:01 2011 +0200
+++ b/display.py	Sun Aug 21 22:59:11 2011 +0200
@@ -84,6 +84,7 @@
         self.background.fill((0, 0, 0))
         self.sprites = SortedUpdates()
         self.overlay = pygame.sprite.Group()
+        self.shadows = pygame.sprite.Group()
         self.key = None
 
     def _sprite_clear(self, screen, rect):
@@ -113,7 +114,11 @@
             pygame.rect.Rect(
                 (-self.scroll_offset[0], -self.scroll_offset[1]),
                 (self.screen.get_width(), self.screen.get_height())))
+        self.shadows.update()
         self.sprites.clear(self.screen, self._sprite_clear)
+        self._sprite_shift(self.shadows, self.scroll_offset)
+        self.shadows.draw(self.screen)
+        self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset)
         self.sprites.draw(self.screen)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
@@ -127,6 +132,10 @@
 
         self.sprites.clear(self.screen, self._sprite_clear)
         self.sprites.update()
+        self.shadows.update()
+        self._sprite_shift(self.shadows, self.scroll_offset)
+        self.shadows.draw(self.screen)
+        self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset)
         dirty = self.sprites.draw(self.screen)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
--- a/generator.py	Sun Aug 21 21:25:01 2011 +0200
+++ b/generator.py	Sun Aug 21 22:59:11 2011 +0200
@@ -3,12 +3,14 @@
 
 import random
 import thing
+import monster
 
 
 class LevelGenerator(object):
     def __init__(self):
         self.map = [['x'] * 30 for i in range(30)]
         self.things = {}
+        self.monsters = {}
         self.rooms = [[self.make_room(x, y) for x in range(3)]
                       for y in range(3)]
         for line in self.rooms:
@@ -19,8 +21,9 @@
             for i, c in enumerate(line):
                 if c == 'X':
                     line[i] = 'x'
+        self.make_monsters()
+        self.make_trash()
         self.make_stairs()
-        self.make_trash()
 
     def _random_place(self):
         r1 = random.choice(random.choice(self.rooms))
@@ -29,17 +32,30 @@
         return x1, y1
 
     def make_trash(self):
-        for i in range(25):
+        trash = [thing.Plant, thing.Crate]
+        for i in range(random.randint(5, 15)):
             p = self._random_place()
             if p not in self.things:
-                self.things[p] = thing.Plant(*p)
+                self.things[p] = random.choice(trash)(*p)
+
+    def make_monsters(self):
+        for i in range(15):
+            p = self._random_place()
+            if (p not in self.monsters and
+                not isinstance(self.things.get(p), thing.Entrance)):
+                monsters = [monster.Skeleton, monster.Zombie, monster.Jack,
+                            monster.Bat]
+                self.monsters[p] = random.choice(monsters)(*p)
 
     def make_stairs(self):
         p = self._random_place()
         while p in self.things:
             p = self._random_place()
         self.things[p] = thing.Entrance(*p)
-        x1, y1 = self._random_place()
+        p = self._random_place()
+        while p in self.things:
+            p = self._random_place()
+        x1, y1 = p
         self.map[y1][x1] = '>'
 
     def make_connections(self):
--- a/hero.py	Sun Aug 21 21:25:01 2011 +0200
+++ b/hero.py	Sun Aug 21 22:59:11 2011 +0200
@@ -28,6 +28,7 @@
 
     def anim_walk(self, dx, dy):
         self.facing = self.faces[dx][dy]
+        self.depth = self.rect.midbottom[1] + 1
         for frame in range(4):
             self.image = self.frames[self.facing][frame % 4]
             for step in range(2):
@@ -37,6 +38,7 @@
 
     def anim_blocked(self, dx, dy):
         self.facing = self.faces[dx][dy]
+        self.depth = self.rect.midbottom[1] + 1
         for frame in range(4):
             self.image = self.frames[self.facing][frame % 4]
             yield
@@ -59,6 +61,7 @@
 
     def render(self, to_display):
         to_display.sprites.add(self.sprite)
+        to_display.sprites.add(thing.ShadowSprite(self.sprite))
 
     def walk(self, level, dx, dy):
         if level.is_blocked(self.x + dx, self.y + dy):
--- a/level.py	Sun Aug 21 21:25:01 2011 +0200
+++ b/level.py	Sun Aug 21 22:59:11 2011 +0200
@@ -105,6 +105,9 @@
             self.things[(t.x, t.y)] = t
             if isinstance(t, thing.Entrance) and self.hero is None:
                 self.hero = hero.Hero(t.x, t.y)
+        self.monsters = {}
+        for m in gen.monsters.itervalues():
+            self.monsters[(m.x, m.y)] = m
 
     def is_blocked(self, x, y):
         if x<0 or y<0:
@@ -130,5 +133,7 @@
                 if tile_class is None or tile.blocks:
                     self.flags[-1][-1] |= self.BLOCKED
         self.hero.render(display)
-        for thing in self.things.itervalues():
-            thing.render(display)
+        for t in self.things.itervalues():
+            t.render(display)
+        for m in self.monsters.itervalues():
+            m.render(display)
Binary file monsters.png has changed
Binary file objects.png has changed
--- a/thing.py	Sun Aug 21 21:25:01 2011 +0200
+++ b/thing.py	Sun Aug 21 22:59:11 2011 +0200
@@ -3,8 +3,21 @@
 
 import display
 
+
+class ShadowSprite(display.Sprite):
+    def __init__(self, parent):
+        super(ShadowSprite, self).__init__(0, 0, 'objects.png', 3, 3)
+        self.image.set_alpha(64)
+        self.parent = parent
+
+    def update(self):
+        depth = getattr(self.parent, 'depth', None)
+        self.rect.midbottom = (self.parent.rect.midbottom[0], depth)
+
+
 class Thing(object):
     tx, ty = 0, 1
+    blocks = False
 
     def __init__(self, x, y):
         self.x = x
@@ -14,6 +27,7 @@
         self.sprite = display.Sprite(self.x, self.y, 'objects.png',
                                      self.tx, self.ty)
         to_display.sprites.add(self.sprite)
+        to_display.shadows.add(ShadowSprite(self.sprite))
 
 
 class Door(Thing):
@@ -22,6 +36,7 @@
     def __init__(self, x, y, vertical):
         self.x = x
         self.y = y
+        self.blocks = True
         self.vertical = vertical
         if self.vertical:
             self.tx = 1
@@ -31,8 +46,9 @@
     tx, ty = 3, 0
 
 
-class Bones(Thing):
-    tx, ty = 2, 3
+class Crate(Thing):
+    tx, ty = 0, 1
+    blocks = True
 
 class Plant(Thing):
     tx, ty = 2, 2