changeset 100:542a1300c4e6

smoke effects
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 06 Jan 2014 17:19:09 +0100
parents 59a9af792127
children e6fbad60c68c
files fujo/behaviors.py fujo/items.py fujo/level.py fujo/player.py fujo/things.png fujo/things.py
diffstat 6 files changed, 63 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/fujo/behaviors.py	Mon Jan 06 14:51:46 2014 +0100
+++ b/fujo/behaviors.py	Mon Jan 06 17:19:09 2014 +0100
@@ -90,12 +90,21 @@
         # Do nothing.
         return True
 
+    def item_picked(self, level, thing):
+        return True
+
+    def mob_attacked(self, level, mob, damage):
+        if mob == self.mob:
+            self.mob.del_behavior(self)
+            level.player.smoke(self.mob.rect.midbottom,12)
+        return True
+
     def wound(self, damage):
-        self.mob.del_behavior(self)
         return True
 
     def item_thrown(self, level, item):
         self.mob.del_behavior(self)
+        level.player.smoke(self.mob.rect.midbottom,12)
 
 
 @Behavior.register
--- a/fujo/items.py	Mon Jan 06 14:51:46 2014 +0100
+++ b/fujo/items.py	Mon Jan 06 17:19:09 2014 +0100
@@ -242,6 +242,7 @@
         if mob:
             mob.wound(random.randint(1, 5))
             mob.add_behavior(behaviors.Panic(10))
+            level.player.smoke(mob.rect.midbottom, 6)
             return True
 
 
@@ -257,8 +258,10 @@
         else:
             return False
         del level.mobs[level.player.pos]
+        level.player.smoke(None, 8)
         level.player.pos = None
         level.place_mob(level.player, pos)
+        level.player.smoke(None, 8)
         return True
 
     def throw(self, level, pos, mob):
@@ -270,9 +273,11 @@
                     break
             else:
                 return
+            level.player.smoke(mob.rect.midbottom, 8)
             del level.mobs[mob.pos]
             mob.pos = None
             level.place_mob(mob, pos)
+            level.player.smoke(mob.rect.midbottom, 8)
             return True
 
 @Item.register
@@ -289,6 +294,7 @@
         super(KnowledgeSpell, self).throw(level, pos, mob)
         if mob:
             mob.add_behavior(behaviors.Confused(10))
+            level.player.smoke(mob.rect.midbottom, 6)
         else:
             for row in level.explored:
                 row[:] = [1] * len(row)
@@ -338,6 +344,7 @@
         super(TransformSpell, self).throw(level, pos, mob)
         if mob:
             mob.add_behavior(behaviors.Hide())
+            level.player.smoke(mob.rect.midbottom, 12)
             return True
 
 
@@ -381,6 +388,7 @@
         if mob:
             _calm_mob(mob)
             mob.add_behavior(behaviors.Sleep(10))
+            level.player.smoke(mob.rect.midbottom, 6)
             return True
 
 @Item.register
--- a/fujo/level.py	Mon Jan 06 14:51:46 2014 +0100
+++ b/fujo/level.py	Mon Jan 06 17:19:09 2014 +0100
@@ -111,7 +111,7 @@
             damage = random.randint(1, attacker.damage + 1)
         defender.wound(damage)
         for mob in self.mobs.values():
-            if mob not in (attacker, defender):
+            if mob != attacker:
                 mob.mob_attacked(self, defender, damage)
 
     def mob_mob(self, mob):  # rim shot
--- a/fujo/player.py	Mon Jan 06 14:51:46 2014 +0100
+++ b/fujo/player.py	Mon Jan 06 17:19:09 2014 +0100
@@ -6,6 +6,7 @@
 import pygame
 
 from . import items
+from . import things
 from . import window
 from . import mobs
 from .util import DX, DY, COLOR_RED, COLOR_GREEN, dpos
@@ -144,6 +145,14 @@
             return self.inventory(level, display)
         return False
 
+    def smoke(self, place, num=4):
+        if place is None:
+            place = self.rect.midbottom
+        for i in range(num):
+            puff = things.Puff()
+            puff.rect.center = place
+            self.new_sprites.append(puff)
+
     def inventory(self, level, display):
         menu = window.Menu((display.size[0] - 196, 4, 192, 32),
             [(
Binary file fujo/things.png has changed
--- a/fujo/things.py	Mon Jan 06 14:51:46 2014 +0100
+++ b/fujo/things.py	Mon Jan 06 17:19:09 2014 +0100
@@ -2,6 +2,8 @@
 # -*- coding: utf-8 -*-
 
 import weakref
+import math
+import random
 
 import pygame
 
@@ -27,6 +29,39 @@
         else:
             self.kill()
 
+class Puff(pygame.sprite.Sprite):
+    def __init__(self):
+        super(Puff, self).__init__()
+        self.frames = RES.things[24:]
+        self.image = self.frames[0]
+        self.rect = self.image.get_rect()
+        self.animation = self.default_anim()
+
+    def default_anim(self):
+        self.depth = self.rect.bottom + 2
+        dx = random.randint(-4, 5)
+        dy = -random.randint(0, 4)
+        frame = 0
+        for step in range(24):
+            if random.choice([0, 1]):
+                frame += 1
+                if frame > 6:
+                    frame = 3
+                self.image = self.frames[frame].copy()
+            self.image.set_alpha(255 - step * 10)
+            if dx and step % abs(dx) == 0:
+                self.rect.move_ip(math.copysign(1, dx), 0)
+            if dy and step % abs(dy) == 0:
+                self.rect.move_ip(0, math.copysign(1, dy))
+            yield
+
+
+    def update(self, display):
+        try:
+            self.animation.next()
+        except StopIteration:
+            self.kill()
+
 
 class Thing(pygame.sprite.Sprite, saves.Saveable):
     is_exit = False