about summary refs log tree commit diff homepage
path: root/brutalmaze/weapons.py
blob: 75ccb67d667a0580953c3ba38b8b7498d864ce29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Weapon classes
# Copyright (C) 2017-2020  Nguyễn Gia Phong
#
# This file is part of Brutal Maze.
#
# Brutal Maze is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# Brutal Maze is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Brutal Maze.  If not, see <https://www.gnu.org/licenses/>.

__doc__ = 'Brutal Maze module for weapon classes'

from math import cos, sin

from .constants import BG_COLOR, BULLET_LIFETIME, BULLET_SPEED, ENEMY_HP, TANGO
from .misc import fill_aapolygon, regpoly


class Bullet:
    """Object representing a bullet.

    Attributes:
        surface (pygame.Surface): the display to draw on
        x, y (int): coordinates of the center of the bullet (in pixels)
        angle (float): angle of the direction the bullet pointing (in radians)
        color (str): bullet's color name
        fall_time (int): time until the bullet fall down
        sfx_hit (str): sound effect indicating target was hit
    """
    def __init__(self, surface, x, y, angle, color):
        self.surface = surface
        self.x, self.y, self.angle, self.color = x, y, angle, color
        self.fall_time = BULLET_LIFETIME
        if color == 'Aluminium':
            self.sfx_hit = 'shot-enemy.ogg'
        else:
            self.sfx_hit = 'shot-hero.ogg'

    def update(self, fps, distance):
        """Update the bullet."""
        s = distance * BULLET_SPEED / fps
        self.x += s * cos(self.angle)
        self.y += s * sin(self.angle)
        self.fall_time -= 1000 / fps

    def get_color(self):
        """Return current color of the enemy."""
        value = int((1 - self.fall_time/BULLET_LIFETIME) * ENEMY_HP)
        try:
            return TANGO[self.color][value]
        except IndexError:
            return BG_COLOR

    def draw(self, radius):
        """Draw the bullet."""
        pentagon = regpoly(5, radius, self.angle, self.x, self.y)
        fill_aapolygon(self.surface, pentagon, self.get_color())

    def place(self, x, y):
        """Move the bullet by (x, y) (in pixels)."""
        self.x += x
        self.y += y

    def get_distance(self, x, y):
        """Return the from the center of the bullet to the point (x, y)."""
        return ((self.x-x)**2 + (self.y-y)**2)**0.5


class LockOn:
    """Lock-on device to assist hero's aiming.

    This is used as a mutable object to represent a grid of wall.

    Attributes:
        x, y (int): coordinates of the target (in grids)
        retired (bool): flag indicating if the target is retired
    """
    def __init__(self, x, y, retired=False):
        self.x, self.y = x, y
        self.retired = retired

    def place(self, x, y, isdisplayed):
        """Move the target by (x, y) (in grids)."""
        self.x += x
        self.y += y
        if not isdisplayed(self.x, self.y): self.retired = True