changeset 15:930de4ac220d

Added attacking
author Radomir Dopieralski <moindev@sheep.art.pl>
date Mon, 17 Dec 2007 03:16:11 +0100
parents ba58ad1eae95
children f51dc2d85927
files data/map.txt lib/game.py lib/level.py lib/mesg.py monster/__init__.py monster/jello.py monster/player.py
diffstat 7 files changed, 86 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/data/map.txt	Mon Dec 17 02:14:14 2007 +0100
+++ b/data/map.txt	Mon Dec 17 03:16:11 2007 +0100
@@ -6,7 +6,7 @@
 S <floor.png> <jello>
 B <floor.png> <jello>
 Z <floor.png> <jello>
-& <floor.png> <jello>
+& <floor.png> <crate>
 @ <floor.png> <player>
 
 ::::::XXXXXXXXXXXXXX
--- a/lib/game.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/lib/game.py	Mon Dec 17 03:16:11 2007 +0100
@@ -5,6 +5,7 @@
 from util import *
 from level import Level
 from mesg import Mesg
+from monster import MoveError, MoveBump, MoveBlocked
 
 class Game:
     def __init__(self):
@@ -17,10 +18,13 @@
         self.level = Level(os.path.join('data', 'map.txt'))
 
     def try_walk(self, d):
-        av = self.level.player
-        if self.level.map.is_blocked(av.x+delta_x[d], av.y+delta_y[d]):
-            return
-        av.walk(d)
+        try:
+            try:
+                self.level.player.walk(d)
+            except MoveBump, bump:
+                self.level.player.attack(d, bump.monster)
+        except MoveError:
+            self.level.animations.add(Mesg(sprite=self.level.player, text="blocked"))
         
     def main_loop(self):
         self.level.refresh(self.screen)
--- a/lib/level.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/lib/level.py	Mon Dec 17 03:16:11 2007 +0100
@@ -39,9 +39,7 @@
                         image = self.get_image(os.path.join('image', urls[0]))
                         background.blit(image , (x*24+48, y*16+32))
                     for url in urls[1:]:
-                        monster = self.create_monster(x,y, url)
-                        if url=='player':
-                            self.player = monster
+                        self.create_monster(x,y, url)
                 x += 1
             x = 0
             y += 1
@@ -49,12 +47,7 @@
     
     def create_monster(self, x, y, kind):
         module = __import__("monster.%s" % kind, globals(), {}, ["Mob"])
-        monster = module.Mob(x, y)
-        monster.shadow = Shadow(monster)
-        self.monster = self
-        self.add_sprite(monster)
-        self.add_sprite(monster.shadow)
-        self.monsters[(x,y)] = monster
+        monster = module.Mob((x, y), self)
         return monster
     
     def add_sprite(self, sprite):
--- a/lib/mesg.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/lib/mesg.py	Mon Dec 17 03:16:11 2007 +0100
@@ -14,14 +14,16 @@
     def __init__(self, x=0, y=0, text="Hello!", color=(255, 255, 255), sprite=None):
         pygame.sprite.Sprite.__init__(self)
         self.x = x
-        self.y = y
+        self.y = y        
         self.z = y*16-8
         self.dh = 10
         self.image = font.render(text, False, color).convert()
         self.alpha = 255
         self.rect = Rect(0,0, self.image.get_width(), self.image.get_height())
         self.rect.center = (self.x*24+12+48, self.y*16-8+32)
-        if sprite: self.rect.center = sprite.rect.center
+        if sprite: 
+            self.rect.center = sprite.rect.center
+            self.z = sprite.z+1
 
     def update(self):
         if self.alpha <= 0:
--- a/monster/__init__.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/monster/__init__.py	Mon Dec 17 03:16:11 2007 +0100
@@ -2,22 +2,69 @@
 from pygame.locals import *
 import os
 
+
+from shadow import Shadow
 from util import *
 
+class MoveError(Exception):
+    pass
+    
+class MoveBump(MoveError):
+    def __init__(self, pos, monster):
+        self.pos = pos
+        self.monster = monster
+
+    def __repr__(self):
+        return "bump (%d, %d), %s" % (self.pos[0], self.pos[1], repr(self.monster))
+
+class MoveBlocked(MoveError):
+    def __init__(self, pos):
+        self.pos = pos
+
+    def __repr__(self):
+        return "block (%d, %d)" % (self.pos[0], self.pos[1])
+
+
 class Monster(pygame.sprite.Sprite):
     '''Monsters only have two frames of animation.'''
 
-    def __init__(self, x=0, y=0, image_file="monster.png"):
+    def __init__(self, pos, level, image_file="monster.png"):
         pygame.sprite.Sprite.__init__(self)
         self.frame = 0
         self.delay = 0
-        self.x = x
-        self.y = y
+        self.level = level
+        self.x, self.y = pos
+        self.place(pos)
+        self.frames = read_frames(os.path.join("image", image_file))
+        self.anim = self.frames[0]
+        self.shadow = Shadow(self)
+        self.level.add_sprite(self)
+        self.level.add_sprite(self.shadow)
+        self.shadow.update()
+        self.update()
+
+    def place(self, pos):
+        x, y = pos
+        self.move(pos)
         self.z = y*16-12
         self.rect = Rect(self.x*24+48, self.z+32, 24, 24)
-        self.frames = read_frames(os.path.join("image", image_file))
-        self.anim = self.frames[0]
-        self.update()
+        try:
+            self.shadow.update()
+        except AttributeError:
+            pass
+        
+    def move(self, pos):
+        x, y = pos
+        if self.level.map.is_blocked(x,y):
+            raise MoveBlocked(pos)
+        if self.level.monsters.get(pos, None):
+            raise MoveBump(pos, self.level.monsters[pos])
+        try:
+            del self.level.monsters[(self.x, self.y)]
+        except KeyError:
+            pass
+        self.x, self.y = pos
+        self.level.monsters[pos] = self
         
     def animate(self, delay=0):
         '''Change the frame of animation'''
@@ -31,5 +78,12 @@
             self.delay += 1
             self.image = self.anim[self.frame]
 
+    def die(self):
+        try:
+            self.shadow.kill()
+        except AttributeError:
+            pass
+        self.kill()
+
     def update(self):
         self.animate(3)
--- a/monster/jello.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/monster/jello.py	Mon Dec 17 03:16:11 2007 +0100
@@ -4,8 +4,8 @@
 from monster import Monster
 
 class Mob(Monster):
-    def __init__(self, x, y):
-        Monster.__init__(self, x, y, "jello.png")
+    def __init__(self, pos, level):
+        Monster.__init__(self, pos, level, "jello.png")
         
     def update(self):
         self.animate(3)
--- a/monster/player.py	Mon Dec 17 02:14:14 2007 +0100
+++ b/monster/player.py	Mon Dec 17 03:16:11 2007 +0100
@@ -2,13 +2,15 @@
 from pygame.locals import *
 
 from monster import Monster
+from mesg import Mesg
 from util import *
 
 class Mob(Monster):
-    def __init__(self, x, y):
+    def __init__(self, pos, level):
         self.facing = 0
         self.step = 0
-        Monster.__init__(self, x, y, "abi2.png")
+        Monster.__init__(self, pos, level, "abi2.png")
+        self.level.player = self
       
     def update(self):
         if self.step>0:
@@ -25,6 +27,9 @@
 
     def walk(self, direction):
         self.facing = direction
+        self.move((self.x+delta_x[self.facing],self.y+delta_y[self.facing]))
         self.step = 8
-        self.x += delta_x[self.facing]
-        self.y += delta_y[self.facing]
+    
+    def attack(self, direction, monster):
+        self.level.animations.add(Mesg(sprite=monster, text="miss", color=(255,255,0)))
+