mirror of
https://github.com/EDeev/mospoly-helper.git
synced 2026-06-15 19:11:11 +03:00
124 lines
4.4 KiB
Python
124 lines
4.4 KiB
Python
from data import *
|
|
from entity import Entity
|
|
|
|
|
|
class Enemy(Entity):
|
|
def __init__(self, monster_name, pos, groups, obstacle_sprites, damage_player, add_exp):
|
|
super().__init__(groups)
|
|
self.sprite_type = 'enemy'
|
|
|
|
# стартовый спрайт
|
|
self.import_graphics(monster_name)
|
|
self.status = 'idle'
|
|
self.image = self.animations[self.status][self.frame_index]
|
|
|
|
# положение
|
|
self.rect = self.image.get_rect(topleft=pos)
|
|
self.hitbox = self.rect.inflate(0, -10)
|
|
self.obstacle_sprites = obstacle_sprites
|
|
|
|
# характеристики
|
|
self.monster_name = monster_name
|
|
monster_info = mobs_data[self.monster_name]
|
|
self.health = monster_info['health']
|
|
self.exp = monster_info['exp']
|
|
self.speed = monster_info['speed']
|
|
self.attack_damage = monster_info['damage']
|
|
self.resistance = monster_info['resistance']
|
|
self.attack_radius = monster_info['attack_radius']
|
|
self.notice_radius = monster_info['notice_radius']
|
|
|
|
# параметры
|
|
self.can_attack = True
|
|
self.attack_time = None
|
|
self.attack_cooldown = 400
|
|
self.damage_player = damage_player
|
|
self.add_exp = add_exp
|
|
|
|
# звуки
|
|
self.death_sound = pygame.mixer.Sound('../data/audio/death.wav')
|
|
self.hit_sound = pygame.mixer.Sound('../data/audio/hit.wav')
|
|
self.attack_sound = pygame.mixer.Sound(monster_info['attack_sound'])
|
|
self.death_sound.set_volume(0.6)
|
|
self.hit_sound.set_volume(0.6)
|
|
self.attack_sound.set_volume(0.6)
|
|
|
|
def import_graphics(self, name):
|
|
self.animations = {'idle': [], 'move': [], 'attack': []}
|
|
main_path = f'../data/textures/mobs/{name}/'
|
|
for animation in self.animations.keys():
|
|
self.animations[animation] = import_folder(main_path + animation)
|
|
|
|
def get_player_distance_direction(self, player):
|
|
enemy_vec = pygame.math.Vector2(self.rect.center)
|
|
player_vec = pygame.math.Vector2(player.rect.center)
|
|
distance = (player_vec - enemy_vec).magnitude()
|
|
|
|
if distance > 0:
|
|
direction = (player_vec - enemy_vec).normalize()
|
|
else:
|
|
direction = pygame.math.Vector2()
|
|
|
|
return (distance, direction)
|
|
|
|
def get_status(self, player):
|
|
distance = self.get_player_distance_direction(player)[0]
|
|
|
|
if distance <= self.attack_radius and self.can_attack:
|
|
if self.status != 'attack':
|
|
self.frame_index = 0
|
|
self.status = 'attack'
|
|
elif distance <= self.notice_radius:
|
|
self.status = 'move'
|
|
else:
|
|
self.status = 'idle'
|
|
|
|
def actions(self, player):
|
|
if self.status == 'attack':
|
|
self.attack_time = pygame.time.get_ticks()
|
|
self.damage_player(self.attack_damage)
|
|
self.attack_sound.play()
|
|
elif self.status == 'move':
|
|
self.direction = self.get_player_distance_direction(player)[1]
|
|
else:
|
|
self.direction = pygame.math.Vector2()
|
|
|
|
def animate(self):
|
|
animation = self.animations[self.status]
|
|
|
|
self.frame_index += self.animation_speed
|
|
if self.frame_index >= len(animation):
|
|
if self.status == 'attack':
|
|
self.can_attack = False
|
|
self.frame_index = 0
|
|
|
|
self.image = animation[int(self.frame_index)]
|
|
self.rect = self.image.get_rect(center=self.hitbox.center)
|
|
|
|
def cooldowns(self):
|
|
current_time = pygame.time.get_ticks()
|
|
if not self.can_attack:
|
|
if current_time - self.attack_time >= self.attack_cooldown:
|
|
self.can_attack = True
|
|
|
|
def get_damage(self, player):
|
|
self.hit_sound.play()
|
|
self.direction = self.get_player_distance_direction(player)[1]
|
|
self.health -= player.get_full_weapon_damage()
|
|
self.hit_time = pygame.time.get_ticks()
|
|
|
|
def check_death(self):
|
|
if self.health <= 0:
|
|
self.kill()
|
|
self.add_exp(self.exp)
|
|
self.death_sound.play()
|
|
|
|
def update(self):
|
|
self.move(self.speed)
|
|
self.animate()
|
|
self.cooldowns()
|
|
self.check_death()
|
|
|
|
def enemy_update(self, player):
|
|
self.get_status(player)
|
|
self.actions(player)
|