192 lines
4.6 KiB
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()
|