---------------------------------enemies.py--------------------------------- import pygame import random from message import * from projectile import * class Enemy(pygame.sprite.Sprite): def __init__(self, path, pos, level): super().__init__() self.path = path self.image = pygame.image.load(path) self.imagePath = path self.rect = self.image.get_rect() self.rect.center = pos self.heading = None self.movement = pygame.math.Vector2(0, 2) self.movement.rotate_ip(random.randint(0, 360)) self.level = level self.health = 10 self.attack_damage = 3 self.defense = 1 self.reload = 20 self.target = None self.projectile_cooldown = 180 # 3 seconds at 60fps self.projectile_timer = random.randint(0, self.projectile_cooldown) # staggered firing def update(self): if pygame.sprite.collide_rect(self, self.level.player) and self.level.player.alive: self.target = self.level.player else: self.target = None if self.target is not None: self.reload -= 1 if self.reload == 0: self.reload = 60 self.attack(self.target) return self.rect.move_ip(self.movement) if len(pygame.sprite.spritecollide(self, self.level.walls, False)) >= 1: self.movement.rotate_ip(180) self.rect.move_ip(self.movement) self.movement.rotate_ip(random.randint(0, 360)) self.projectile_timer = self.projectile_timer - 1 if self.projectile_timer <= 0: self.projectile_timer = self.projectile_cooldown self.fire_projectiles() def fire_projectiles(self): directions = [ (0, -1), # up (0, 1), # down (-1, 0), # left (1, 0), # right ] for dir in directions: projectile = Projectile( pos=self.rect.center, direction=dir, speed=4, damage=2, level=self.level, imagepath='images/fireball.gif' ) self.level.projectiles.add(projectile) def attack(self, player): player.defend(self.attack_damage) def defend(self, damage): if random.randint(1, 20) > self.defense: self.health -= damage if self.health <= 0: self.kill() if len(self.level.enemies) == 0 and not self.level.exit.unlocked: self.level.messages.add(Message("Level Cleared,", (self.rect.centerx, self.rect.centery-30))) self.level.messages.add(Message("Exit Unlocked!", self.rect.center)) self.level.exit.unlock() return True