Clients/Client2018/content/internal/AppShell/Modules/Shell/SoundManager.lua

192 lines
4.6 KiB
Lua

-- local CoreGui = Game:GetService("CoreGui")
-- local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local GuiService = game:GetService('GuiService')
local runService = game:GetService("RunService")
local CoreGui = game:GetService("CoreGui")
local GuiRoot = CoreGui:FindFirstChild("RobloxGui")
local Modules = GuiRoot:FindFirstChild("Modules")
local ShellModules = Modules:FindFirstChild("Shell")
local Utility = require(ShellModules:FindFirstChild('Utility'))
local BASE_SOUND_URL = 'rbxasset://sounds/ui/Shell/'
local SOUNDS =
{
--[[ BGM ]]--
['BackgroundLoop'] = 'RobloxMusic.ogg';
--[[ UI Sounds ]]--
['Error'] = 'Error.mp3';
['ButtonPress'] = 'ButtonPress.mp3';
['MoveSelection'] = 'MoveSelection.mp3';
['OverlayOpen'] = 'OverlayOpen.mp3';
['PopUp'] = 'PopUp.mp3';
['PurchaseSuccess'] = 'PurchaseSuccess.mp3';
['ScreenChange'] = 'ScreenChange.mp3';
['SideMenuSlideIn'] = 'SideMenuSlideIn.mp3';
}
local SoundQueue = {}
local function EaseOutCirc(currentTime, startValue, deltaValue, duration)
currentTime = currentTime / duration;
currentTime = currentTime - 1;
return deltaValue * math.sqrt(1 - currentTime*currentTime) + startValue;
end
local function IsGameRunning()
if not UserSettings().GameSettings:InStudioMode() or game:GetService('UserInputService'):GetPlatform() == Enum.Platform.Windows then
return true
end
return runService:IsRunning()
end
GetSoundManager = function()
local this = {}
local rawVolumes = {}
local function FindSoundObjectForName(soundName)
if SoundQueue[soundName] then
local soundObj = table.remove(SoundQueue[soundName], 1)
if soundObj then
table.insert(SoundQueue[soundName], #SoundQueue[soundName], soundObj)
return soundObj
end
end
end
function this:CreateSound(soundName)
local fileName = SOUNDS[soundName]
local soundsUrl = BASE_SOUND_URL .. fileName
local soundObj = Instance.new('Sound')
soundObj.Name = soundName
soundObj.SoundId = soundsUrl
return soundObj
end
function this:Play(soundName, vol, isLoop, pitch, ...)
local result = nil
if SOUNDS[soundName] then
local soundObj = FindSoundObjectForName(soundName)
if soundObj then
soundObj.Volume = vol or 1
soundObj.Looped = isLoop or false
soundObj.Pitch = pitch or 1
soundObj:Play(...)
rawVolumes[soundObj] = soundObj.Volume
if not IsGameRunning() then
soundObj.Volume = 0
end
result = soundObj
else
Utility.DebugLog("No sound:" , soundName , "in the queue.")
end
else
spawn(function()
error("Unable to find sound: " .. tostring(soundName))
end)
end
return result
end
function this:IsPlaying(soundName)
local sound = this.SoundHolder:FindFirstChild(soundName)
if sound then
return sound.IsPlaying
end
return false
end
function this:Stop(soundName, ...)
if this.SoundHolder and SOUNDS[soundName] then
local soundObj = this.SoundHolder:FindFirstChild(soundName)
if soundObj then
soundObj:Stop()
end
end
end
function this:TweenSound(soundObj, newVolume, duration)
rawVolumes[soundObj] = nil
Utility.PropertyTweener(soundObj, 'Volume', soundObj.Volume, newVolume, duration,
function(...)
return IsGameRunning() and Utility.EaseInOutQuad(...) or 0
end,
true,
function()
rawVolumes[soundObj] = newVolume
end)
end
-- function this:PlayOnEvent(event, soundName)
-- event:connect(function()
-- end)
-- end
local function Initialize()
local appshellSounds = Instance.new('Folder')
appshellSounds.Name = 'AppShellSounds'
appshellSounds.Parent = CoreGui
this.SoundHolder = appshellSounds
for name, fileName in pairs(SOUNDS) do
local soundsForFile = Instance.new('Folder')
soundsForFile.Name = name
soundsForFile.Parent = this.SoundHolder
SoundQueue[name] = {}
for i = 1, 3 do
local soundObj = this:CreateSound(name)
soundObj.Parent = soundsForFile
table.insert(SoundQueue[name], soundObj)
end
end
local lastSelection = nil
GuiService:GetPropertyChangedSignal('SelectedCoreObject'):connect(function()
local currentSelection = GuiService.SelectedCoreObject
if currentSelection and lastSelection then
local moveSelectionSound = currentSelection:FindFirstChild('MoveSelection')
if moveSelectionSound and moveSelectionSound:IsA('Sound') then
moveSelectionSound.Volume = 0.35
moveSelectionSound:Play()
end
end
lastSelection = currentSelection
end)
if not IsGameRunning() then
spawn(function()
while not IsGameRunning() do
wait(0.1)
end
for soundObj, rawVolume in pairs(rawVolumes) do
soundObj.Volume = rawVolume
end
end)
end
end
Initialize()
return this
end
return GetSoundManager()