changeset 28:68098f165f4b

Make all mobs move randomly
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 10 Mar 2012 10:15:03 +0100
parents d0ca7aad951c
children 1dbbcefea978
files mhrok.py
diffstat 1 files changed, 36 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mhrok.py	Sat Mar 10 10:02:00 2012 +0100
+++ b/mhrok.py	Sat Mar 10 10:15:03 2012 +0100
@@ -75,20 +75,20 @@
         self.frame = 0
         self.rect.move_ip(4 + 20 * x, 12 * y)
         self.depth = self.rect.bottom
+        self.direction = None
 
     def update(self):
         self.frame = (self.frame + 1) % len(self.animation)
         self.image = self.frames[self.animation[self.frame]]
-        #if self.direction is not None:
-        #    self.rect.move_ip((DX[self.direction]*5, DY[self.direction]*3))
-        #    self.depth = self.rect.bottom
+        if self.direction is not None:
+            self.rect.move_ip((DX[self.direction]*5, DY[self.direction]*3))
+            self.depth = self.rect.bottom
 
 class Mob(object):
     Sprite = MobSprite
 
     def __init__(self, (x, y)):
         self.pos = x, y
-        self.direction = None
 
     def make_sprite(self, tiles):
         self.sprite = self.Sprite(tiles, self.pos, self.animation)
@@ -96,7 +96,19 @@
         return self.sprite, shadow, None
 
     def control(self, level):
-        self.direction = random.choice([None, 0, 1, 2, 3])
+        direction = random.choice([None, 0, 1, 2, 3])
+        if direction is not None:
+            x, y = self.pos
+            target = x + DX[direction], y + DY[direction]
+            for mob in level.mobs:
+                if mob.pos == target:
+                    self.sprite.direction = None
+                    return
+            if not level[target]:
+                direction = None
+            else:
+                self.pos = target
+        self.sprite.direction = direction
 
 
 class Bat(Mob):
@@ -175,26 +187,28 @@
         x, y = self.pos
         target = x + DX[direction], y + DY[direction]
         if not level[target]:
-            return
+            return False
         for mob in level.mobs:
             if mob.pos == target:
-                return
+                return False
         self.sprite.set_animation(self.sprite.walk_animation(direction))
         self.pos = target
+        return True
 
     def control(self, level):
         keys = pygame.key.get_pressed()
         if keys[pg.K_UP]:
-            self.walk(level, 1)
+            return self.walk(level, 1)
         elif keys[pg.K_LEFT]:
-            self.walk(level, 0)
+            return self.walk(level, 0)
         elif keys[pg.K_DOWN]:
-            self.walk(level, 3)
+            return self.walk(level, 3)
         elif keys[pg.K_RIGHT]:
-            self.walk(level, 2)
+            return self.walk(level, 2)
         else:
             self.sprite.set_animation(
                     self.sprite.stand_animation(self.direction))
+            return False
 
         room = level.find_room(*self.pos)
         if room:
@@ -204,6 +218,7 @@
                 self.vision.rooms.append(room)
         else:
             self.vision.radius = 40
+        return True
 
 
 class SortedUpdates(pygame.sprite.RenderUpdates):
@@ -436,8 +451,16 @@
                         event.key == pg.K_ESCAPE):
                     self.game_over = True
             if self.pc.sprite.animation is None:
-                for mob in self.level.mobs:
-                    mob.control(self.level)
+                if self.pc.control(self.level):
+                    for mob in self.level.mobs:
+                        if mob == self.pc:
+                            continue
+                        mob.control(self.level)
+                else:
+                    for mob in self.level.mobs:
+                        if mob == self.pc:
+                            continue
+                        mob.sprite.direction = None
 
 
 def load_tiles(filename, width, height):