changeset 19:47be6695b781

item and monster stats
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Fri, 15 Mar 2013 15:57:03 +0100
parents f2b4790d9566
children 8e8ec6a3b6e4
files fhrl/display.py fhrl/items.png fhrl/level.py fhrl/mobs.py fhrl/mobs2.png fhrl/stuff.png
diffstat 6 files changed, 141 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/fhrl/display.py	Thu Mar 14 10:30:53 2013 +0100
+++ b/fhrl/display.py	Fri Mar 15 15:57:03 2013 +0100
@@ -26,17 +26,13 @@
         )
         self.render_level(self.background, level)
         self.sprites = SortedUpdates()
-        level.hero.set_image(self.resources.mobs[0])
-        self.sprites.add(level.hero)
+        self.sprites.add(level.hero.init_sprite(self.resources))
         for m in level.monsters:
-            m.set_image(self.resources.mobs[m.kind])
-            self.sprites.add(m)
+            self.sprites.add(m.init_sprite(self.resources))
         for i in level.items:
-            i.set_image(self.resources.items[i.kind])
-            self.sprites.add(i)
+            self.sprites.add(i.init_sprite(self.resources))
         for s in level.stuff:
-            s.set_image(self.resources.stuff[s.kind])
-            self.sprites.add(s)
+            self.sprites.add(s.init_sprite(self.resources))
 
     def _scroll_anim(self, dx, dy):
         frame = 0
Binary file fhrl/items.png has changed
--- a/fhrl/level.py	Thu Mar 14 10:30:53 2013 +0100
+++ b/fhrl/level.py	Fri Mar 15 15:57:03 2013 +0100
@@ -2,13 +2,14 @@
 
 import random
 
-from fhrl.mobs import Hero, Item, Mob, Stuff
+from fhrl.mobs import Hero, Stuff, make_monster, make_item
 
 
 class Level(object):
-    def __init__(self, (width, height)):
+    def __init__(self, (width, height), level=1):
         self.width = width
         self.height = height
+        self.level = level
         self.grid = [
             [1] * width for y in xrange(height)
         ]
@@ -60,11 +61,11 @@
         random.shuffle(self.free)
         self.hero = Hero(self.free.pop())
         self.monsters = [
-            Mob(random.randrange(1, 4), self.free.pop())
+            make_monster(self.level, self.free.pop())
             for i in xrange(20)
         ]
         self.items = [
-            Item(random.randrange(6), self.free.pop())
+            make_item(self.level, self.free.pop())
             for i in xrange(20)
         ]
         self.stuff = []
--- a/fhrl/mobs.py	Thu Mar 14 10:30:53 2013 +0100
+++ b/fhrl/mobs.py	Fri Mar 15 15:57:03 2013 +0100
@@ -9,6 +9,7 @@
 XYD = {(x, y):i for i, (x, y) in enumerate(zip(DX, DY))}
 
 
+
 class ActException(Exception):
     """Base class for all acting-related exceptions."""
 
@@ -55,6 +56,10 @@
         self.x, self.y = x, y
         self.kind = kind
 
+    def init_sprite(self, resources):
+        self.set_image(resources.items[self.kind['sprite']])
+        return self
+
     def _pick_anim(self, display):
         for i in xrange(8):
             self.rect.move_ip((0, -i))
@@ -70,6 +75,10 @@
         self.kind = kind
         self.depth = -12
 
+    def init_sprite(self, resources):
+        self.set_image(resources.stuff[self.kind])
+        return self
+
     def _morph_anim(self, display):
         self.image = display.resources.stuff[self.kind]
         return
@@ -83,6 +92,10 @@
         self.x, self.y = x, y
         self.kind = kind
 
+    def init_sprite(self, resources):
+        self.set_image(resources.mobs[self.kind['sprite']])
+        return self
+
     def _walk_anim(self, d):
         for frame in xrange(8):
             self.rect.move_ip(DX[d] * 6, DY[d] * 4)
@@ -114,58 +127,143 @@
         super(Hero, self).__init__(0, (x, y))
         self.items = []
         self.arrow = Sprite()
-        self.dir = None
+
+    def init_sprite(self, resources):
+        self.set_image(resources.mobs[0])
+        return self
 
     def act(self, level, display):
+        anims = []
         keys = pygame.key.get_pressed()
-        got_key = True
         if keys[pygame.K_UP]:
             if keys[pygame.K_LEFT]:
-                self.dir = 4
+                direction = 4
             elif keys[pygame.K_RIGHT]:
-                self.dir = 5
+                direction = 5
             else:
-                self.dir = 0
+                direction = 0
         elif keys[pygame.K_DOWN]:
             if keys[pygame.K_LEFT]:
-                self.dir = 7
+                direction = 7
             elif keys[pygame.K_RIGHT]:
-                self.dir = 6
+                direction = 6
             else:
-                self.dir = 2
+                direction = 2
         elif keys[pygame.K_LEFT]:
-            self.dir = 3
+            direction = 3
         elif keys[pygame.K_RIGHT]:
-            self.dir = 1
+            direction = 1
         else:
-            got_key = False
             self.arrow.kill()
-        if self.dir is not None:
-            self.arrow.set_image(display.resources.arrows[self.dir])
+            return anims
+        if keys[pygame.K_LSHIFT]:
+            self.arrow.set_image(display.resources.arrows[direction])
             self.arrow.rect.center = self.rect.center
             self.arrow.depth = 1000
-            self.arrow.rect.move_ip(DX[self.dir] * 32, DY[self.dir] * 32)
+            self.arrow.rect.move_ip(DX[direction] * 32, DY[direction] * 32)
             display.sprites.add(self.arrow)
-            if not (keys[pygame.K_LSHIFT] and got_key):
-                try:
-                    anims = [self.walk(self.dir, level)]
-                    item = level.find_item((self.x, self.y))
-                    if item:
-                        anims.append(item._pick_anim(display))
-                        self.items.append(item)
-                        level.items.remove(item)
-                    return anims
-                except ActBumpStuff as e:
-                    if e.stuff.kind in (4, 6):
-                        e.stuff.kind += 1
-                    else:
-                        e.stuff.kind = 8
-                    return [e.stuff._morph_anim(display)]
-                except ActException:
-                    pass
-                finally:
-                    self.dir = None
-        return []
+            return anims
+        try:
+            anims.append(self.walk(direction, level))
+            item = level.find_item((self.x, self.y))
+            if item:
+                anims.append(item._pick_anim(display))
+                self.items.append(item)
+                level.items.remove(item)
+        except ActBumpStuff as e:
+            if e.stuff.kind in (4, 6):
+                e.stuff.kind += 1
+            else:
+                e.stuff.kind = 8
+            anims.append(e.stuff._morph_anim(display))
+        except ActException:
+            pass
+        return anims
 
 
 
+MONSTERS = {
+    'guard': {
+        'name': "Security Guard",
+        'sprite': 1,
+        'level': 1,
+        'devolve': 'worker',
+    },
+    'beast': {
+        'name': "Horrible Beast",
+        'sprite': 2,
+        'level': 4,
+        'devolve': 'fruit',
+    },
+    'robot': {
+        'name': "Killer Robot",
+        'sprite': 3,
+        'level': 3,
+        'devolve': 'scrap',
+    },
+    'professor': {
+        'name': "Professor Vanilla",
+        'sprite': 4,
+        'level': 0,
+    },
+    'worker': {
+        'name': "Construction Worker",
+        'sprite': 5,
+        'level': 2,
+    },
+    'fruit': {
+        'name': "Spoiled Fruit",
+        'sprite': 6,
+        'level': 0,
+    },
+    'scrap': {
+        'name': "Ancient Robot",
+        'sprite': 7,
+        'level': 0,
+    },
+}
+
+ITEMS = {
+    'drill': {
+        'name': "Drill",
+        'sprite': 0,
+    },
+    'beam': {
+        'name': "Beam Emitter",
+        'sprite': 1,
+    },
+    'cannon': {
+        'name': "Pirate Cannon",
+        'sprite': 2,
+    },
+    'teleporter': {
+        'name': "Teleport Device",
+        'sprite': 3,
+    },
+    'flamer': {
+        'name': "Flame Thrower",
+        'sprite': 4,
+    },
+    'vulcan': {
+        'name': "Machine Gun",
+        'sprite': 5,
+    },
+    'deevo': {
+        'name': "Deevolution Inducer",
+        'sprite': 6,
+    },
+    'toaster': {
+        'name': "Doomsday Device",
+        'sprite': 7,
+    },
+}
+
+
+def make_monster(level, pos):
+    kind = random.choice(MONSTERS.values())
+    return Mob(kind, pos)
+
+
+def make_item(level, pos):
+    kind = random.choice(ITEMS.values())
+    return Item(kind, pos)
Binary file fhrl/mobs2.png has changed
Binary file fhrl/stuff.png has changed