""" Plugin pour les sons multiples. """ import random from typing import Callable from engine import GlobalPlugin from engine.ecs import Entity, World from plugins.assets import Assets from plugins.sound import Sound class MultiSound: """ Composant qui quand il est ajouté a une entité, il joue un son aléatoire parmis la liste de ses sons, il est ensuite retiré de l'entité. Ce composant est fait pour être définis en tant que constante puis utilisé ensuite, pour cela il prend seulement le nom des sons au lieu des sons eux memes. Les sons seront donc récupérés a l'aide de `Assets`. """ def __init__( self, *sound_names: str, loop: bool = False, volume: float = 1.0, fade_ms: int = 0, callback: Callable[[World, Entity], object] = lambda _w, _e: None, ): self.sound_names = sound_names self.loop = loop self.volume = volume self.fade_ms = fade_ms self.callback = callback def __update_sounds(world: World): """ Met à jour les sons du jeu. """ # Ajout des sons aléatoires assets = world[Assets] for entity in world.query(MultiSound): multi_sound = entity[MultiSound] sound = assets.get_sound(random.choice(multi_sound.sound_names)) entity[Sound] = Sound( sound, multi_sound.loop, multi_sound.volume, multi_sound.fade_ms, multi_sound.callback, ) del entity[MultiSound] PLUGIN = GlobalPlugin( [], [], [__update_sounds], [], )