changeset 22:391633966298

levels
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 16 Mar 2013 00:50:01 +0100
parents 5edb554f732b
children fcbacaec2f49
files fhrl/__main__.py fhrl/display.py fhrl/level.py fhrl/mobs.py
diffstat 4 files changed, 72 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/fhrl/__main__.py	Sat Mar 16 00:22:24 2013 +0100
+++ b/fhrl/__main__.py	Sat Mar 16 00:50:01 2013 +0100
@@ -5,46 +5,49 @@
 
 from fhrl.display import Display
 from fhrl.level import Level
+from fhrl.mobs import Hero
 
 
 class Game(object):
     def __init__(self):
         self.margin = 128
         self.display = Display()
-        self.level = Level((32, 32))
-        self.display.load_level(self.level)
 
     def run(self):
-        self.display.scroll_by(
-            self.level.hero.x * 48 - self.display.width // 2,
-            self.level.hero.y * 32 - self.display.height // 2,
-            True
-        )
-        self.display.update_all()
-        while True:
-            while True:
-                anims = self.level.hero.act(self.level, self.display)
-                if anims:
-                    self.display.animations.extend(anims)
-                    break
-                else:
-                    self.display.update()
-            survivors = []
-            for m in self.level.monsters:
-                if m.health > 0:
-                    survivors.append(m)
-                self.display.animations.extend(m.act(self.level))
-            self.level.monsters = survivors
-            if self.level.hero.rect.right > self.display.width - self.margin:
-                self.display.scroll_by(48, 0)
-            elif self.level.hero.rect.left < self.margin:
-                self.display.scroll_by(-48, 0)
-            if self.level.hero.rect.bottom > self.display.height - self.margin:
-                self.display.scroll_by(0, 32)
-            elif self.level.hero.rect.top < self.margin:
-                self.display.scroll_by(0, -32)
-            self.display.update_hud(self.level.hero)
-            self.display.play_animations()
+        hero = Hero()
+        for level in xrange(5):
+            self.level = Level((24, 24), hero)
+            self.display.load_level(self.level)
+            self.display.scroll_by(
+                self.level.hero.x * 48 - self.display.width // 2,
+                self.level.hero.y * 32 - self.display.height // 2,
+                True
+            )
+            self.display.update_all()
+            while self.level.grid[self.level.hero.y][self.level.hero.x] != 5:
+                while True:
+                    anims = self.level.hero.act(self.level, self.display)
+                    if anims:
+                        self.display.animations.extend(anims)
+                        break
+                    else:
+                        self.display.update()
+                survivors = []
+                for m in self.level.monsters:
+                    if m.health > 0:
+                        survivors.append(m)
+                    self.display.animations.extend(m.act(self.level))
+                self.level.monsters = survivors
+                if self.level.hero.rect.right > self.display.width - self.margin:
+                    self.display.scroll_by(48, 0)
+                elif self.level.hero.rect.left < self.margin:
+                    self.display.scroll_by(-48, 0)
+                if self.level.hero.rect.bottom > self.display.height - self.margin:
+                    self.display.scroll_by(0, 32)
+                elif self.level.hero.rect.top < self.margin:
+                    self.display.scroll_by(0, -32)
+                self.display.update_hud(self.level.hero)
+                self.display.play_animations()
 
 pygame.display.init()
 Game().run()
--- a/fhrl/display.py	Sat Mar 16 00:22:24 2013 +0100
+++ b/fhrl/display.py	Sat Mar 16 00:50:01 2013 +0100
@@ -22,6 +22,7 @@
         self.animations = []
 
     def load_level(self, level):
+        self.x, self.y = 0, 0
         self.background = pygame.Surface(
             (level.width * 48 - 48, level.height * 32 - 32)
         )
--- a/fhrl/level.py	Sat Mar 16 00:22:24 2013 +0100
+++ b/fhrl/level.py	Sat Mar 16 00:50:01 2013 +0100
@@ -2,11 +2,12 @@
 
 import random
 
-from fhrl.mobs import Hero, Stuff, make_monster, make_item
+from fhrl.mobs import Stuff, make_monster, make_item
 
 
 class Level(object):
-    def __init__(self, (width, height), level=1):
+    def __init__(self, (width, height), hero, level=1):
+        self.hero = hero
         self.width = width
         self.height = height
         self.level = level
@@ -59,7 +60,7 @@
             if f == 1
         ]
         random.shuffle(self.free)
-        self.hero = Hero(self.free.pop())
+        self.hero.move_to(self.free.pop())
         self.monsters = [
             make_monster(self.level, self.free.pop())
             for i in xrange(20)
--- a/fhrl/mobs.py	Sat Mar 16 00:22:24 2013 +0100
+++ b/fhrl/mobs.py	Sat Mar 16 00:50:01 2013 +0100
@@ -119,13 +119,16 @@
 class Mob(Sprite):
     def __init__(self, kind, (x, y)):
         super(Mob, self).__init__()
-        self.rect.topleft = x * 48 - 24, y * 32 - 33
-        self.x, self.y = x, y
+        self.move_to((x, y))
         self.kind = kind
         self.health = kind.get('health', 1)
         self.power = kind.get('power', 0)
         self.ai = kind.get('ai', None)
 
+    def move_to(self, (x, y), (scroll_x, scroll_y)=(0, 0)):
+        self.x, self.y = x, y
+        self.rect.topleft = x * 48 - 24 - scroll_x, y * 32 - 33 - scroll_y
+
     def init_sprite(self, resources):
         self.set_image(resources.mobs[self.kind['sprite']])
         return self
@@ -195,8 +198,8 @@
 
 
 class Hero(Mob):
-    def __init__(self, (x, y)):
-        super(Hero, self).__init__({}, (x, y))
+    def __init__(self):
+        super(Hero, self).__init__({}, (0, 0))
         self.items = []
         self.arrow = Sprite()
         self.balls = 10
@@ -209,6 +212,16 @@
         self.set_image(resources.mobs[0])
         return self
 
+    def pick_item(self, item, level, display):
+        level.items.remove(item)
+        self.health += item.kind.get('health', 0)
+        self.gasoline += item.kind.get('gasoline', 0)
+        self.battery += item.kind.get('battery', 0)
+        self.balls += item.kind.get('balls', 0)
+        if item.kind not in self.items:
+            self.items.append(item.kind)
+        return [item._pick_anim(display)]
+
     def act(self, level, display):
         anims = []
         keys = pygame.key.get_pressed()
@@ -244,9 +257,7 @@
             anims.extend(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)
+                anims.extend(self.pick_item(item, level, display))
         except ActBumpMob as e:
             anims.extend(self.attack(direction, e.mob, display))
         except ActBumpStuff as e:
@@ -286,6 +297,8 @@
         return []
 
 def ai_escape(mob, level):
+    if dist2((level.hero.x, level.hero.y), (mob.x, mob.y)) > 9:
+        return []
     possible = [
         d for d in xrange(8)
         if not (
@@ -406,57 +419,69 @@
         'name': "Drill",
         'sprite': 0,
         'ammo': 'gasoline',
+        'gasoline': 5,
     },
     'beam': {
         'name': "Beam Emitter",
         'sprite': 1,
         'ammo': 'battery',
+        'battery': 5,
     },
     'cannon': {
         'name': "Pirate Cannon",
         'sprite': 2,
         'ammo': 'balls',
+        'balls': 5,
     },
     'teleporter': {
         'name': "Teleport Device",
         'sprite': 3,
         'ammo': 'battery',
+        'battery': 5,
     },
     'flamer': {
         'name': "Flame Thrower",
         'sprite': 4,
         'ammo': 'gasoline',
+        'gasoline': 5,
     },
     'vulcan': {
         'name': "Machine Gun",
         'sprite': 5,
         'ammo': 'balls',
+        'balls': 5,
     },
     'deevo': {
         'name': "Deevolution Inducer",
         'sprite': 6,
         'ammo': 'battery',
+        'battery': 5,
     },
     'toaster': {
         'name': "Doomsday Device",
         'sprite': 7,
         'ammo': 'battery',
+        'battery': 5,
     },
     'balls': {
         'name': "Cannon Balls",
         'sprite': 8,
+        'balls': 10,
     },
     'gasoline': {
         'name': "Gasoline",
         'sprite': 9,
+        'gasoline': 10,
     },
     'medkit': {
         'name': "First Aid Kit",
         'sprite': 10,
+        'health': 10,
     },
     'battery': {
         'name': "Battery",
         'sprite': 11,
+        'battery': 10,
     },
 }