core.movement

movement.py

Gestiona el movimiento de los animatrónicos y la detención de canales de sonido en el juego.

 1"""
 2movement.py
 3
 4Gestiona el movimiento de los animatrónicos y la detención de canales de sonido
 5en el juego.
 6"""
 7
 8import random
 9
10from core.animatronics import animatronics
11import core.config as estado
12from utils.utils import reproducir_sonido
13
14
15def mover_animatronico(nombre):
16    """
17    Ejecuta el movimiento de un animatrónico en un hilo independiente.
18
19    El animatrónico identificado por `nombre` se mueve en intervalos aleatorios
20    definidos por sus atributos `intervalo_min` y `intervalo_max`, y decide moverse
21    según su nivel de IA (`ia_level`).
22
23    Si llega a la posición 8 (oficina), se detiene el juego: se reproducen sonidos
24    de muerte y se activa el estado de Game Over, asegurando la sincronización
25    entre hilos mediante `movimiento_lock` y `muerte_lock`.
26
27    Args:
28        nombre (str): Nombre clave del animatrónico en el diccionario
29                      `animatronics`.
30
31    Notas:
32        - Se debe ejecutar en un hilo separado por animatrónico.
33        - `stop_event.wait(tiempo)` permite interrumpir la espera si el juego
34          termina antes del tiempo definido.
35    """
36    anim = animatronics[nombre]
37
38    while not estado.stop_event.is_set():
39        # Espera aleatoria según el animatrónico
40        tiempo_espera = random.uniform(anim.intervalo_min, anim.intervalo_max)
41        if estado.stop_event.wait(tiempo_espera):
42            break
43
44        with estado.movimiento_lock:
45            if anim.posicion == 8:
46                with estado.muerte_lock:
47                    if estado.stop_event.is_set():
48                        break
49                    detener_todos_los_canales()
50                    reproducir_sonido(anim.cancion_muerte)
51                    estado.motivo_game_over = nombre
52                    estado.stop_event.set()
53                break
54
55            # Freddy no se mueve antes de las 3 AM
56            if anim.nombre == "Freddy" and estado.hora_actual < 5:
57                continue
58
59            # Decisión de movimiento basada en IA
60            if random.randint(1, 20) <= anim.ia_level:
61                anim.mover()
62
63
64def detener_todos_los_canales():
65    """
66    Detiene todos los sonidos en los canales de pasos e interfaz.
67    """
68    estado.canal_pasos_chica.stop()
69    estado.canal_pasos_bonnie.stop()
70    estado.canal_pasos_foxy.stop()
71    estado.canal_pasos_freddy.stop()
72    estado.canal_interface.stop()
def mover_animatronico(nombre):
16def mover_animatronico(nombre):
17    """
18    Ejecuta el movimiento de un animatrónico en un hilo independiente.
19
20    El animatrónico identificado por `nombre` se mueve en intervalos aleatorios
21    definidos por sus atributos `intervalo_min` y `intervalo_max`, y decide moverse
22    según su nivel de IA (`ia_level`).
23
24    Si llega a la posición 8 (oficina), se detiene el juego: se reproducen sonidos
25    de muerte y se activa el estado de Game Over, asegurando la sincronización
26    entre hilos mediante `movimiento_lock` y `muerte_lock`.
27
28    Args:
29        nombre (str): Nombre clave del animatrónico en el diccionario
30                      `animatronics`.
31
32    Notas:
33        - Se debe ejecutar en un hilo separado por animatrónico.
34        - `stop_event.wait(tiempo)` permite interrumpir la espera si el juego
35          termina antes del tiempo definido.
36    """
37    anim = animatronics[nombre]
38
39    while not estado.stop_event.is_set():
40        # Espera aleatoria según el animatrónico
41        tiempo_espera = random.uniform(anim.intervalo_min, anim.intervalo_max)
42        if estado.stop_event.wait(tiempo_espera):
43            break
44
45        with estado.movimiento_lock:
46            if anim.posicion == 8:
47                with estado.muerte_lock:
48                    if estado.stop_event.is_set():
49                        break
50                    detener_todos_los_canales()
51                    reproducir_sonido(anim.cancion_muerte)
52                    estado.motivo_game_over = nombre
53                    estado.stop_event.set()
54                break
55
56            # Freddy no se mueve antes de las 3 AM
57            if anim.nombre == "Freddy" and estado.hora_actual < 5:
58                continue
59
60            # Decisión de movimiento basada en IA
61            if random.randint(1, 20) <= anim.ia_level:
62                anim.mover()

Ejecuta el movimiento de un animatrónico en un hilo independiente.

El animatrónico identificado por nombre se mueve en intervalos aleatorios definidos por sus atributos intervalo_min y intervalo_max, y decide moverse según su nivel de IA (ia_level).

Si llega a la posición 8 (oficina), se detiene el juego: se reproducen sonidos de muerte y se activa el estado de Game Over, asegurando la sincronización entre hilos mediante movimiento_lock y muerte_lock.

Args: nombre (str): Nombre clave del animatrónico en el diccionario animatronics.

Notas: - Se debe ejecutar en un hilo separado por animatrónico. - stop_event.wait(tiempo) permite interrumpir la espera si el juego termina antes del tiempo definido.

def detener_todos_los_canales():
65def detener_todos_los_canales():
66    """
67    Detiene todos los sonidos en los canales de pasos e interfaz.
68    """
69    estado.canal_pasos_chica.stop()
70    estado.canal_pasos_bonnie.stop()
71    estado.canal_pasos_foxy.stop()
72    estado.canal_pasos_freddy.stop()
73    estado.canal_interface.stop()

Detiene todos los sonidos en los canales de pasos e interfaz.