diff --git a/src/custom_AI.py b/src/custom_AI.py index 0d84aa2..88e4498 100644 --- a/src/custom_AI.py +++ b/src/custom_AI.py @@ -1,4 +1,5 @@ import math +import random from src.engine.entity import Entity from src.engine.entity_manager import EntityManager @@ -10,18 +11,56 @@ class WolfAI(MobAI): def __init__(self, entity: 'Entity', entity_manager: 'EntityManager', map_manager: 'MapManager'): super().__init__(entity, entity_manager, map_manager) - def update(self): + self.ATTACK_DISTANCE = 160 + self.timer = 0 + self.walk_x = 0 + self.walk_y = 0 + self.comportment = 0 # 0 : waiting, 1: walking + def update(self, delta: float): + """Fonction executée à chaque tick pour chaque loup et qui gère l'IA.""" + + # On récupère l'entité joueur player: Entity = self.entity_manager.get_by_name(self.entity_manager.player_entity_name) + # On calcule la distance en x et en y entre le loup et le joueur x_distance = (player.x - self.entity.x) y_distance = (player.y - self.entity.y) + # On calcule la distance player_distance = math.sqrt(x_distance ** 2 + y_distance ** 2) - if player.ge_collisions_with_entity(self.entity): - player.take_damages(1) + # On vérifie que le loup peut voir le joueur + if player_distance <= self.ATTACK_DISTANCE: + # On rétablit la vitesse du loup à 1 + self.entity.max_speed = 1. + + # Si le loup touche le joueur, il lui inflige des dégats + if player.get_collisions_with_entity(self.entity): + player.take_damages(1) + + # Si le loup n'est pas déja sur le joueur, on le fait s'en raprocher + if player_distance > self.entity.max_speed: + self.entity.move(x_distance / player_distance*self.entity.max_speed, + y_distance / player_distance*self.entity.max_speed, self.map_manager) + + else: + # Comportement d'attente + self.entity.max_speed = 0.5 + + self.timer -= delta + if self.timer <= 0 and self.comportment == 0: + self.comportment = 1 + self.timer = random.random() * 5. + self.walk_x = (random.random()-0.5)*2 + self.walk_y = (random.random()-0.5)*2 + + elif self.timer <= 0 and self.comportment == 1: + self.comportment = 0 + self.timer = random.random() * 3 + + print(self.timer) + + self.entity.move(self.walk_x, self.walk_y, self.map_manager) + - if abs(player_distance) > self.entity.max_speed: - self.entity.move(x_distance / player_distance*self.entity.max_speed, - y_distance / player_distance*self.entity.max_speed, self.map_manager) diff --git a/src/engine/entity.py b/src/engine/entity.py index 7a02688..392a884 100644 --- a/src/engine/entity.py +++ b/src/engine/entity.py @@ -82,7 +82,7 @@ class Entity: if self.life_points < 0: self.life_points = 0 - def ge_collisions_with_entity(self, other: 'Entity'): + def get_collisions_with_entity(self, other: 'Entity'): """Retourne True si l'entité courante est en collision avec l'entité donnée.""" return (self.x+self.collision_rect[0] <= other.x+other.collision_rect[2] and self.x+self.collision_rect[2] >= other.x+other.collision_rect[0] and diff --git a/src/engine/entity_manager.py b/src/engine/entity_manager.py index 9cce4ea..72e59a6 100644 --- a/src/engine/entity_manager.py +++ b/src/engine/entity_manager.py @@ -33,7 +33,7 @@ class EntityManager: self.entities.pop(entity_name) if entity.brain is not None: - entity.brain.update() + entity.brain.update(delta) if self.player_entity_name: player: Entity = self.get_by_name(self.player_entity_name)