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()
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.
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.