nsi-rpg/src/custom_AI.py

70 lines
2.7 KiB
Python
Raw Normal View History

2024-01-03 10:21:19 +00:00
import math
2024-01-03 18:46:00 +00:00
import random
2024-01-03 10:21:19 +00:00
2024-01-02 14:55:40 +00:00
from src.engine.entity import Entity
2024-01-03 10:21:19 +00:00
from src.engine.entity_manager import EntityManager
from src.engine.map_manager import MapManager
2024-01-02 14:55:40 +00:00
from src.engine.mobs_AI import MobAI
class WolfAI(MobAI):
2024-01-03 10:21:19 +00:00
def __init__(self, entity: 'Entity', entity_manager: 'EntityManager', map_manager: 'MapManager'):
super().__init__(entity, entity_manager, map_manager)
2024-01-02 14:55:40 +00:00
2024-01-03 18:46:00 +00:00
self.ATTACK_DISTANCE = 160
self.timer = 0
self.walk_x = 0
self.walk_y = 0
self.comportment = 0 # 0 : waiting, 1: walking
2024-01-03 10:21:19 +00:00
2024-01-03 18:46:00 +00:00
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
2024-01-03 10:21:19 +00:00
player: Entity = self.entity_manager.get_by_name(self.entity_manager.player_entity_name)
2024-01-03 18:46:00 +00:00
# On calcule la distance en x et en y entre le loup et le joueur
2024-01-03 10:21:19 +00:00
x_distance = (player.x - self.entity.x)
y_distance = (player.y - self.entity.y)
2024-01-03 18:46:00 +00:00
# On calcule la distance
2024-01-03 10:21:19 +00:00
player_distance = math.sqrt(x_distance ** 2 + y_distance ** 2)
2024-01-03 18:46:00 +00:00
# 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
2024-01-03 19:17:16 +00:00
# On diminue la vitesse
2024-01-03 18:46:00 +00:00
self.entity.max_speed = 0.5
self.timer -= delta
2024-01-03 19:17:16 +00:00
# Si le timer est fini et que le loup était en train d'attendre, il commence à marcher
2024-01-03 18:46:00 +00:00
if self.timer <= 0 and self.comportment == 0:
self.comportment = 1
self.timer = random.random() * 5.
2024-01-03 19:17:16 +00:00
# On choisit la direction
2024-01-03 18:46:00 +00:00
self.walk_x = (random.random()-0.5)*2
self.walk_y = (random.random()-0.5)*2
2024-01-03 19:17:16 +00:00
# Si le timer est fini et que le loup était de marcher, il commence à attendre
2024-01-03 18:46:00 +00:00
elif self.timer <= 0 and self.comportment == 1:
self.comportment = 0
self.timer = random.random() * 3
2024-01-03 19:17:16 +00:00
# On fait avancer le loup quand il le doit
if self.comportment == 1:
self.entity.move(self.walk_x, self.walk_y, self.map_manager)