utils.utils
utils.py
Módulo de utilidades para el juego Freddy's Family Diner.
Funciones incluidas:
- resource_path(): Resuelve rutas absolutas para recursos.
- limpiar_pantalla(): Limpia la consola.
- reproducir_sonido(): Reproduce sonidos con Pygame.
- cargar_plantilla_archivo(): Carga plantillas de las cámaras.
1""" 2utils.py 3 4Módulo de utilidades para el juego Freddy's Family Diner. 5 6Funciones incluidas: 7- resource_path(): Resuelve rutas absolutas para recursos. 8- limpiar_pantalla(): Limpia la consola. 9- reproducir_sonido(): Reproduce sonidos con Pygame. 10- cargar_plantilla_archivo(): Carga plantillas de las cámaras. 11""" 12 13import os 14import sys 15import warnings 16import core.config as estado 17 18# ---------------------- CONFIGURACIÓN INICIAL ---------------------- # 19os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" 20warnings.filterwarnings("ignore", category=UserWarning) 21import pygame 22pygame.init() 23 24 25def resource_path(relative_path): 26 """ 27 Resuelve la ruta absoluta a un recurso, compatible con PyInstaller. 28 29 Args: 30 relative_path (str): Ruta relativa al archivo. 31 32 Returns: 33 str: Ruta absoluta al recurso. 34 """ 35 if hasattr(sys, '_MEIPASS'): 36 return os.path.join(sys._MEIPASS, relative_path) 37 return os.path.join(os.path.abspath("."), relative_path) 38 39 40def limpiar_pantalla(): 41 """ 42 Limpia la pantalla de la consola, compatible con Windows y Unix. 43 """ 44 os.system('cls' if os.name == 'nt' else 'clear') 45 46 47def reproducir_sonido(archivo, canal=None): 48 """ 49 Reproduce un sonido desde el archivo especificado. 50 51 Args: 52 archivo (str): Nombre del archivo de sonido. 53 canal (pygame.mixer.Channel, opcional): Canal específico para reproducir el sonido. 54 """ 55 try: 56 ruta = resource_path( 57 os.path.join(estado.config.get("carpeta_sonidos", ""), archivo) 58 ) 59 if not os.path.isfile(ruta): 60 print(f"[WARNING] Archivo de sonido no encontrado: {ruta}") 61 return 62 63 sonido = pygame.mixer.Sound(ruta) 64 if canal: 65 canal.play(sonido) 66 else: 67 pygame.mixer.music.load(ruta) 68 pygame.mixer.music.play() 69 except Exception as e: 70 print(f"[ERROR] No se pudo reproducir {archivo}: {e}") 71 72 73def cargar_plantilla_archivo(camara_num, anim_presentes): 74 """ 75 Carga la plantilla de texto de una cámara según los animatrónicos presentes. 76 77 Args: 78 camara_num (int): Número de la cámara a cargar. 79 anim_presentes (list of str): Lista de nombres de animatrónicos presentes. 80 81 Returns: 82 list of str: Líneas leídas del archivo de plantilla. 83 """ 84 carpeta_base = estado.config.get("carpeta_rooms", "") 85 carpeta = os.path.join(carpeta_base, f"CAM_{str(camara_num).zfill(2)}") 86 87 if not anim_presentes: 88 combinacion = "EMPTY" 89 else: 90 combinacion = "_".join(sorted(anim_presentes)) 91 92 ruta = os.path.join(carpeta, f"{combinacion}.txt") 93 if not os.path.isfile(ruta): 94 ruta = os.path.join(carpeta, "EMPTY.txt") 95 if not os.path.isfile(ruta): 96 print(f"[WARNING] No se encontró plantilla para CAM_{camara_num}") 97 return [] 98 99 with open(ruta, "r", encoding="utf-8") as f: 100 lineas = f.readlines() 101 102 return lineas
26def resource_path(relative_path): 27 """ 28 Resuelve la ruta absoluta a un recurso, compatible con PyInstaller. 29 30 Args: 31 relative_path (str): Ruta relativa al archivo. 32 33 Returns: 34 str: Ruta absoluta al recurso. 35 """ 36 if hasattr(sys, '_MEIPASS'): 37 return os.path.join(sys._MEIPASS, relative_path) 38 return os.path.join(os.path.abspath("."), relative_path)
Resuelve la ruta absoluta a un recurso, compatible con PyInstaller.
Args: relative_path (str): Ruta relativa al archivo.
Returns: str: Ruta absoluta al recurso.
41def limpiar_pantalla(): 42 """ 43 Limpia la pantalla de la consola, compatible con Windows y Unix. 44 """ 45 os.system('cls' if os.name == 'nt' else 'clear')
Limpia la pantalla de la consola, compatible con Windows y Unix.
48def reproducir_sonido(archivo, canal=None): 49 """ 50 Reproduce un sonido desde el archivo especificado. 51 52 Args: 53 archivo (str): Nombre del archivo de sonido. 54 canal (pygame.mixer.Channel, opcional): Canal específico para reproducir el sonido. 55 """ 56 try: 57 ruta = resource_path( 58 os.path.join(estado.config.get("carpeta_sonidos", ""), archivo) 59 ) 60 if not os.path.isfile(ruta): 61 print(f"[WARNING] Archivo de sonido no encontrado: {ruta}") 62 return 63 64 sonido = pygame.mixer.Sound(ruta) 65 if canal: 66 canal.play(sonido) 67 else: 68 pygame.mixer.music.load(ruta) 69 pygame.mixer.music.play() 70 except Exception as e: 71 print(f"[ERROR] No se pudo reproducir {archivo}: {e}")
Reproduce un sonido desde el archivo especificado.
Args: archivo (str): Nombre del archivo de sonido. canal (pygame.mixer.Channel, opcional): Canal específico para reproducir el sonido.
74def cargar_plantilla_archivo(camara_num, anim_presentes): 75 """ 76 Carga la plantilla de texto de una cámara según los animatrónicos presentes. 77 78 Args: 79 camara_num (int): Número de la cámara a cargar. 80 anim_presentes (list of str): Lista de nombres de animatrónicos presentes. 81 82 Returns: 83 list of str: Líneas leídas del archivo de plantilla. 84 """ 85 carpeta_base = estado.config.get("carpeta_rooms", "") 86 carpeta = os.path.join(carpeta_base, f"CAM_{str(camara_num).zfill(2)}") 87 88 if not anim_presentes: 89 combinacion = "EMPTY" 90 else: 91 combinacion = "_".join(sorted(anim_presentes)) 92 93 ruta = os.path.join(carpeta, f"{combinacion}.txt") 94 if not os.path.isfile(ruta): 95 ruta = os.path.join(carpeta, "EMPTY.txt") 96 if not os.path.isfile(ruta): 97 print(f"[WARNING] No se encontró plantilla para CAM_{camara_num}") 98 return [] 99 100 with open(ruta, "r", encoding="utf-8") as f: 101 lineas = f.readlines() 102 103 return lineas
Carga la plantilla de texto de una cámara según los animatrónicos presentes.
Args: camara_num (int): Número de la cámara a cargar. anim_presentes (list of str): Lista de nombres de animatrónicos presentes.
Returns: list of str: Líneas leídas del archivo de plantilla.