from os import listdir
from os.path import join

from pygame.mixer import Channel, Sound, music, find_channel

from GameChild import *
from Input import *

class Audio(GameChild):

    current_channel = None
    paused = False
    muted = False

    def __init__(self, game):
        GameChild.__init__(self, game)
        self.delegate = self.get_delegate()
        self.load_fx()
        self.subscribe(self.respond)

    def load_fx(self):
        fx = {}
        if self.get_configuration().has_option("audio", "sfx-path"):
            root = self.get_resource("audio", "sfx-path")
            if root:
                for name in listdir(root):
                    fx[name.split(".")[0]] = Sound(join(root, name))
        self.fx = fx

    def respond(self, event):
        if self.delegate.compare(event, "mute"):
            self.mute()

    def mute(self):
        self.muted = True
        self.set_volume()

    def unmute(self):
        self.muted = False
        self.set_volume()

    def set_volume(self):
        volume = int(not self.muted)
        music.set_volume(volume)
        if self.current_channel:
            self.current_channel.set_volume(volume)

    def play_bgm(self, path, stream=False):
        self.stop_current_channel()
        if stream:
            music.load(path)
            music.play(-1)
        else:
            self.current_channel = Sound(path).play(-1)
        self.set_volume()

    def stop_current_channel(self):
        music.stop()
        if self.current_channel:
            self.current_channel.stop()
        self.current_channel = None
        self.paused = False

    def play_fx(self, name, panning=.5):
        if not self.muted:
            channel = find_channel(True)
            if panning != .5:
                offset = 1 - abs(panning - .5) * 2
                if panning < .5:
                    channel.set_volume(1, offset)
                else:
                    channel.set_volume(offset, 1)
            channel.play(self.fx[name])

    def pause(self):
        channel = self.current_channel
        paused = self.paused
        if paused:
            music.unpause()
            if channel:
                channel.unpause()
        else:
            music.pause()
            if channel:
                channel.pause()
        self.paused = not paused

    def is_bgm_playing(self):
        current = self.current_channel
        if current and current.get_sound():
            return True
        return music.get_busy()
from lib.pgfw.pgfw.Configuration import TypeDeclarations

class Types(TypeDeclarations):

    additional_defaults = {

        "gaia": {"path": "path",

                 "int": "offset"},

        "introduction": {"int": ["segments", "transition"]},

        "epithet": {"int": ["width", "margin", "font-size", "it-size",
                            "outline-flash"],

                    "float": "scramble",

                    "int-list": ["color", "i-color", "t-color"]},

        "spanky": {"path": "path",

                   "int-list": ["jump-order", "jump-framerate", "wag-order",
                                "wag-framerate", "walk-order",
                                "walk-framerate"]},

        "title": {"path": "background"},

        "home": {"path": ["static-environment-path", "audio"],

                 "int": ["food-inactive-x", "food-inactive-y", "food-active-y",
                         "food-margin", "tv-edge"],

                 "float": "food-step"},

        "collection": {"int-list": ["coordinates", "size"]},

        "view": {"int": ["hue-shift", "alpha-step"],

                 "path": "path",

                 "int-list": "coordinates"},

        "level": {"int": ["stall", "fall-pause", "entrance-offset"],

                  "path": "audio",

                  "int-list": "background-color",

                  "float": ["gravity", "entrance-speed"],

                  "float-list": "velocity"},

        "door": {"int": "x",

                 "path": "path"},

        "exit-arrow": {"int": ["width", "height", "overlap", "arrow-count",
                               "frame-count", "interval", "saturation",
                               "offset", "fade-in", "fade-out", "alpha"],

                       "int-list": "hue"},

        "land": {"int": ["horizon", "gradient", "x-step", "height"],

                 "float": ["spacing-factor", "velocity-ratio",
                           "altitude-ratio", "fade-speed"]},

        "planet": {"path": "path",

                   "int": ["interval", "shifts", "offset"]},

        "moon": {"path": "path",

                 "int": "margin",

                 "float": "tint-level",

                 "int-list": ["count", "interval"]},

        "stars": {"int-list": ["count", "size", "saturation"]},

        "gun": {"path": "path",

                "int": "framerate"},

        "drop": {"float": "spawn-decrease",

                 "int": ["consecutive", "speed", "first-spawn", "blob-length"]},

        "food": {"path": ["path", "mouth-bg-path", "upper-jaw-path",
                          "lower-jaw-path"],

                 "int": ["offset", "crouch", "mouth-bg-alpha", "mouth-gap",
                         "blink-rate", "freeze-length"],

                 "int-list": ["angle-range", "mouth-offset", "mouth-size",
                              "mouth-bg-shrink", "drop-velocity"],

                 "float": ["dx", "dx-boost"]},

        "platform": {"int": ["height", "first-gap", "buffer", "thickness"],

                     "int-list": ["gap", "width"]},

        "obstacle": {"int": "blink-rate"},

        "missile": {"int": ["margin", "delay", "angle"],

                    "int-list": "count",

                    "float": ["chance", "peak", "speed"]},

        "hurdle": {"int-list": ["count", "first-range", "margin"],

                   "int": ["delay", "pause"],

                   "float": ["chance", "speed"]},

        "spikes": {"int": "delay",

                   "float": ["speed", "chance"]},

        "fireball": {"int": ["delay", "peak"],

                     "int-list": "count",

                     "float": ["chance", "speed"]},

        "window": {"path": "path",

                   "int": ["alpha", "remain-length", "margin"],

                   "float": "fade-step"},

        "siphon": {"int-list": "root-colors"},
        
        }
18.218.241.155
18.218.241.155
18.218.241.155
 
June 6, 2016