X-Git-Url: https://git.ctpug.org.za/?a=blobdiff_plain;f=koperkapel%2Fweapons.py;h=cfc6ba828ae1b4a57faf7e5cf30ca1a37dde1c24;hb=c171e3fc0b24a5c49d8e4359f8e52f8a523998b1;hp=cc9f324b5a49a32b5a77b52c8c5be52b4f497216;hpb=addae4e2db35ab4ae63a8531ddc06eea63877c4f;p=koperkapel.git diff --git a/koperkapel/weapons.py b/koperkapel/weapons.py index cc9f324..cfc6ba8 100644 --- a/koperkapel/weapons.py +++ b/koperkapel/weapons.py @@ -1,46 +1,98 @@ """ Tools for dealing with weapons. """ -from pgzero.loaders import images -from .actors.surf import SurfActor +from pygame.surface import Surface +from pygame.draw import circle +from pgzero.loaders import images, sounds +from .actors.animsurf import AnimatedSurfActor +from .util import safepath class Weapon: def __init__(self, name, damage, image_name=None, bullet_range=0, - can_tape=True): + can_tape=True, frames=("_1",), projectile=None, sound=None): self.name = name self.image_name = image_name or name + self.frames = frames self.damage = damage self.bullet_range = bullet_range self.can_tape = can_tape + self.projectile = projectile + self.sound = None + if sound: + self.sound = sounds.load(sound) + + def play_sound(self): + if self.sound: + self.sound.play() + + def assemble_bullet(self): + return BulletActor(self) WEAPONS = [ Weapon("spit", damage=1, bullet_range=2, can_tape=False, - image_name="blank"), - Weapon("butter_knife", damage=2), + image_name="blank", frames=("",), sound="fire_spit", + projectile="spit"), + Weapon("butter_knife", damage=2, sound='cut'), Weapon("crowbar", damage=4), - Weapon("gun", damage=4, bullet_range=4), + Weapon("gun", damage=4, bullet_range=4, sound='gun_fire', + projectile="bullet"), ] WEAPON_LOOKUP = {w.name: w for w in WEAPONS} -class WeaponActor(SurfActor): +def weapon_by_name(weapon_name): + return WEAPON_LOOKUP[weapon_name] + + +class WeaponActor(AnimatedSurfActor): def __init__(self, weapon, **kw): super().__init__(**kw) self.weapon = weapon +class BulletActor(AnimatedSurfActor): + def __init__(self, weapon, **kw): + frames = self._shiny_frames(weapon) + if frames is None: + frames = self._ugly_circle_frames(weapon) + super().__init__(frames=frames, **kw) + self.weapon = weapon + + def _shiny_frames(self, weapon): + if weapon.projectile is None: + return None + surf = images.load(safepath("projectiles/%s" % (weapon.projectile,))) + return [surf] + + def _ugly_circle_frames(self, weapon): + radius = min(weapon.damage * 5, 32) + surf = Surface((radius * 2, radius * 2)) + surf.convert_alpha() + surf.fill((255, 255, 255, 0)) + circle(surf, (255, 0, 255, 32), (radius, radius), radius) + return [surf] + + class WeaponFactory: + def assemble_frame(self, suffix, weapon, tape): + surf = images.load(safepath("weapons/%s%s") + % (weapon.image_name, suffix)) + frame = surf.copy() + if tape: + tape_surf = images.load(safepath("weapons/tape")) + frame.blit(tape_surf, (0, 0)) + return frame + def assemble(self, weapon_name, tape=False): - weapon = WEAPON_LOOKUP[weapon_name] - surf = images.load("weapons/%s" % (weapon.image_name,)) - surf = surf.copy() - if tape and weapon.can_tape: - tape_surf = images.load("weapons/tape") - surf.blit(tape_surf, (0, 0)) - return WeaponActor(weapon, surf=surf) + weapon = weapon_by_name(weapon_name) + tape = tape and weapon.can_tape + frames = [ + self.assemble_frame(suffix, weapon, tape) + for suffix in weapon.frames] + return WeaponActor(weapon, frames=frames) default_weapons = WeaponFactory()