Play weapon sounds when firing.
[koperkapel.git] / koperkapel / weapons.py
1 """ Tools for dealing with weapons. """
2
3 from pgzero.loaders import images, sounds
4 from .actors.animsurf import AnimatedSurfActor
5 from .util import safepath
6
7
8 class Weapon:
9     def __init__(self, name, damage, image_name=None, bullet_range=0,
10                  can_tape=True, frames=("_1",), sound=None):
11         self.name = name
12         self.image_name = image_name or name
13         self.frames = frames
14         self.damage = damage
15         self.bullet_range = bullet_range
16         self.can_tape = can_tape
17         self.sound = None
18         if sound:
19             self.sound = sounds.load(sound)
20
21     def play_sound(self):
22         if self.sound:
23             self.sound.play()
24
25
26 WEAPONS = [
27     Weapon("spit", damage=1, bullet_range=2, can_tape=False,
28            image_name="blank", frames=("",), sound="fire_spit"),
29     Weapon("butter_knife", damage=2),
30     Weapon("crowbar", damage=4),
31     Weapon("gun", damage=4, bullet_range=4, sound='gun_fire'),
32 ]
33
34 WEAPON_LOOKUP = {w.name: w for w in WEAPONS}
35
36
37 def weapon_by_name(weapon_name):
38     return WEAPON_LOOKUP[weapon_name]
39
40
41 class WeaponActor(AnimatedSurfActor):
42     def __init__(self, weapon, **kw):
43         super().__init__(**kw)
44         self.weapon = weapon
45
46
47 class WeaponFactory:
48
49     def assemble_frame(self, suffix, weapon, tape):
50         surf = images.load(safepath("weapons/%s%s")
51                            % (weapon.image_name, suffix))
52         frame = surf.copy()
53         if tape:
54             tape_surf = images.load(safepath("weapons/tape"))
55             frame.blit(tape_surf, (0, 0))
56         return frame
57
58     def assemble(self, weapon_name, tape=False):
59         weapon = weapon_by_name(weapon_name)
60         tape = tape and weapon.can_tape
61         frames = [
62             self.assemble_frame(suffix, weapon, tape)
63             for suffix in weapon.frames]
64         return WeaponActor(weapon, frames=frames)
65
66
67 default_weapons = WeaponFactory()