Mercurial > fujo
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), [(
--- 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
