changeset 25:3216ed15bcbc

floating captions
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 22 Aug 2011 21:15:45 +0200
parents 81766ab43cce
children 59b340afd783
files display.py generator.py hero.py main.py monster.py thing.py
diffstat 6 files changed, 72 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/display.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/display.py	Mon Aug 22 21:15:45 2011 +0200
@@ -75,6 +75,7 @@
 class Display(object):
     def __init__(self, size=(384, 384), caption=""):
         pygame.display.init()
+        pygame.font.init()
         pygame.display.set_mode(size)
         pygame.display.set_caption(caption)
         self.clock = pygame.time.Clock()
@@ -83,8 +84,9 @@
         self.background = pygame.Surface(size)
         self.background.fill((0, 0, 0))
         self.sprites = SortedUpdates()
+        self.shadows = pygame.sprite.Group()
         self.overlay = pygame.sprite.Group()
-        self.shadows = pygame.sprite.Group()
+        self.effects = pygame.sprite.RenderUpdates()
         self.key = None
 
     def _sprite_clear(self, screen, rect):
@@ -114,34 +116,43 @@
             pygame.rect.Rect(
                 (-self.scroll_offset[0], -self.scroll_offset[1]),
                 (self.screen.get_width(), self.screen.get_height())))
+        self.sprites.clear(self.screen, self._sprite_clear)
+        self.effects.clear(self.screen, self._sprite_clear)
         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._sprite_shift(self.overlay, self.scroll_offset)
+        self._sprite_shift(self.effects, self.scroll_offset)
+        self.shadows.draw(self.screen)
         self.sprites.draw(self.screen)
+        self.overlay.draw(self.screen)
+        self.effects.draw(self.screen)
+        self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
-        self._sprite_shift(self.overlay, self.scroll_offset)
-        self.overlay.draw(self.screen)
         self._sprite_shift(self.overlay, self.scroll_offset, reverse=True)
+        self._sprite_shift(self.effects, self.scroll_offset, reverse=True)
         pygame.display.flip()
 
     def update(self):
         """Update all the animated parts"""
 
         self.sprites.clear(self.screen, self._sprite_clear)
+        self.effects.clear(self.screen, self._sprite_clear)
         self.sprites.update()
+        self.effects.update()
         self.shadows.update()
         self._sprite_shift(self.shadows, self.scroll_offset)
+        self._sprite_shift(self.sprites, self.scroll_offset)
+        self._sprite_shift(self.overlay, self.scroll_offset)
+        self._sprite_shift(self.effects, 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.overlay.draw(self.screen)
+        dirty += self.effects.draw(self.screen)
+        self._sprite_shift(self.shadows, self.scroll_offset, reverse=True)
         self._sprite_shift(self.sprites, self.scroll_offset, reverse=True)
-        self._sprite_shift(self.overlay, self.scroll_offset)
-        self.overlay.draw(self.screen)
         self._sprite_shift(self.overlay, self.scroll_offset, reverse=True)
+        self._sprite_shift(self.effects, self.scroll_offset, reverse=True)
         pygame.display.update(dirty)
 
     def tick(self, tick=20):
--- a/generator.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/generator.py	Mon Aug 22 21:15:45 2011 +0200
@@ -93,10 +93,10 @@
             y1 = r1[3]
             x2 = random.randint(r2[0] + 1, r2[2] - 1)
             y2 = r2[1]
-            if y1 + 1 < y2 - 1:
+            if y1 + 1 != y2 - 1:
                 m = random.randint(y1 + 1, y2 - 1)
             else:
-                m = y1
+                m = y1 + 1
             for y in range(y1, m):
                 self.map[y][x1] = random.choice(',;')
             if x1 < x2:
@@ -116,10 +116,10 @@
             y1 = random.randint(r1[1] + 1, r1[3] - 1)
             x2 = r2[0]
             y2 = random.randint(r2[1] + 1, r2[3] - 1)
-            if x1 + 1 < x2 - 1:
+            if x1 + 1 != x2 - 1:
                 m = random.randint(x1 + 1, x2 - 1)
             else:
-                m = x1
+                m = x1 + 1
             for x in range(x1, m):
                 self.map[y1][x] = random.choice(',;')
             if y1 < y2:
--- a/hero.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/hero.py	Mon Aug 22 21:15:45 2011 +0200
@@ -73,6 +73,7 @@
 class Hero(thing.Thing):
     def __init__(self, x=1, y=1):
         self.x, self.y = x, y
+        self.effects = []
 
     def render(self, to_display):
         self.sprite = HeroSprite(self.x, self.y)
--- a/main.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/main.py	Mon Aug 22 21:15:45 2011 +0200
@@ -34,8 +34,17 @@
                 hero.walk(self.level, 1, 0)
                 end_turn = True
         if end_turn:
-            for m in self.level.monsters.values():
+            monsters = self.level.monsters.values()
+            for m in monsters:
+                if m.dead:
+                    del self.level.monsters[(m.x, m.y)]
+            for m in monsters:
                 m.act(self.level)
+            for m in monsters:
+                for d, effect in enumerate(m.effects):
+                    effect.render(self.display, delay=d * 8)
+                m.effects = []
+
 
     def main(self):
         try:
--- a/monster.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/monster.py	Mon Aug 22 21:15:45 2011 +0200
@@ -4,6 +4,7 @@
 import random
 
 import thing
+import effect
 import display
 
 
@@ -57,22 +58,51 @@
             self.depth = self.rect.midbottom[1]
         self.image = self.frames[self.tx][0]
 
+    def anim_die(self):
+        image = self.frames[self.tx][0]
+        edge = 4
+        yield
+        yield
+        for frame in range(8):
+            yield
+            self.image = image.subsurface(0, 0, 32, 32 - edge)
+            edge += frame
+            self.image.set_alpha(256 - frame * 32)
+            self.rect.move_ip(0, frame - 1)
+        self.kill()
 
 class Monster(thing.Thing):
     tx = 0
+    max_hp = 4
 
     def __init__(self, x, y):
         self.x, self.y = x, y
+        self.dead = False
+        self.effects = []
+        self.hp = self.max_hp
 
     def render(self, to_display):
         self.sprite = MonsterSprite(self.x, self.y, self.tx)
         to_display.sprites.add(self.sprite)
         to_display.sprites.add(thing.ShadowSprite(self.sprite))
 
-    def hit(self):
-        pass
+    def hit(self, damage=1):
+        self.effects.append(
+            effect.Caption(self.x, self.y, '%d' % (-damage), (255, 128, 16)))
+        self.hp -= damage
+        if self.hp <= 0:
+            self.die()
+
+    def die(self):
+        self.effects.append(
+            effect.Caption(self.x, self.y, 'RIP', (255, 128, 16)))
+        self.dead = True
+        self.sprite.animation = self.sprite.anim_die()
+        self.sprite.animation.next()
 
     def act(self, level):
+        if self.dead:
+            return
         try:
             dx, dy = random.choice([(dx, dy) for (dx, dy) in
                 (0, 1), (0, -1), (1, 0), (-1, 0)
--- a/thing.py	Mon Aug 22 19:01:59 2011 +0200
+++ b/thing.py	Mon Aug 22 21:15:45 2011 +0200
@@ -11,6 +11,9 @@
         self.parent = parent
 
     def update(self):
+        if not self.parent.alive():
+            self.kill()
+            return
         depth = getattr(self.parent, 'depth', None)
         self.rect.midbottom = (self.parent.rect.midbottom[0], depth)
 
@@ -32,7 +35,7 @@
 
     def anim_open(self):
         self.depth += 2
-        for step in range(8):
+        for step in range(6):
             yield
             self.rect.move_ip(0, -2)