import pygame import time class Action: action_types = [ 'command', 'pause', 'play', 'stop', 'stop_all_actions', 'volume', 'wait', ] def __init__(self, action, key, **kwargs): if action in self.action_types: self.action = action else: raise Exception("Unknown action {}".format(action)) self.key = key self.arguments = kwargs def ready(self): if 'music' in self.arguments: return self.arguments['music'].loaded else: return True def run(self): print(getattr(self, self.action + "_print")(**self.arguments)) return getattr(self, self.action)(**self.arguments) def command(self, command = "", **kwargs): pass def pause(self, music = None, **kwargs): if music is not None: music.pause() else: pygame.mixer.pause() def play(self, music = None, fade_in = 0, start_at = 0, restart_if_running = False, volume = 100, **kwargs): if music is not None: music.play() else: pygame.mixer.unpause() def stop(self, music = None, fade_out = 0, **kwargs): if music is not None: music.stop() else: pygame.mixer.stop() def stop_all_actions(self, **kwargs): self.key.mapping.stop_all_running() def volume(self, music = None, value = 100, **kwargs): pass def wait(self, duration = 0, **kwargs): time.sleep(duration) def command_print(self, command = "", **kwargs): return "running command {}".format(command) def pause_print(self, music = None, **kwargs): if music is not None: return "pausing {}".format(music.filename) else: return "pausing all musics" def play_print(self, music = None, fade_in = 0, start_at = 0, restart_if_running = False, volume = 100, **kwargs): message = "starting " if music is not None: message += music.filename else: message += "music" if start_at != 0: message += " at {}s".format(start_at) if fade_in != 0: message += " with {}s fade_in".format(fade_in) message += " at volume {}%".format(volume) if restart_if_running: message += " (restarting if already running)" return message def stop_print(self, music = None, fade_out = 0, **kwargs): if music is not None: if fade_out == 0: return "stopping music {}".format(music.filename) else: return "stopping music {} with {}s fadeout".format(music.filename, fade_out) else: if fade_out == 0: return "stopping all musics" else: return "stopping all musics with {}s fadeout".format(fade_out) def stop_all_actions_print(self): return "stopping all actions" def volume_print(self, music = None, value = 100, *kwargs): if music is not None: return "setting volume of {} to {}%".format(music.filename, value) else: return "setting volume to {}%".format(value) def wait_print(self, duration, **kwargs): return "waiting {}s".format(duration)