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
def resource_path(relative_path):
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.

def limpiar_pantalla():
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.

def reproducir_sonido(archivo, canal=None):
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.

def cargar_plantilla_archivo(camara_num, anim_presentes):
 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.