mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-06 00:55:50 +00:00
107 lines
2.8 KiB
Lua
Executable File
107 lines
2.8 KiB
Lua
Executable File
local debug = require('openmw.debug')
|
|
local storage = require('openmw.storage')
|
|
local vfs = require('openmw.vfs')
|
|
|
|
local playlistsSection = storage.playerSection('OMWMusicPlaylistsTrackOrder')
|
|
playlistsSection:setLifeTime(storage.LIFE_TIME.GameSession)
|
|
|
|
local function getTracksFromDirectory(path)
|
|
local result = {}
|
|
for fileName in vfs.pathsWithPrefix(path) do
|
|
table.insert(result, fileName)
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
local function initMissingPlaylistFields(playlist)
|
|
if playlist.id == nil or playlist.priority == nil then
|
|
error("Can not register playlist: 'id' and 'priority' are mandatory fields")
|
|
end
|
|
|
|
if playlist.tracks == nil then
|
|
playlist.tracks = getTracksFromDirectory(string.format("music/%s/", playlist.id))
|
|
end
|
|
|
|
if playlist.active == nil then
|
|
playlist.active = false
|
|
end
|
|
|
|
if playlist.randomize == nil then
|
|
playlist.randomize = false
|
|
end
|
|
|
|
if playlist.cycleTracks == nil then
|
|
playlist.cycleTracks = true
|
|
end
|
|
|
|
if playlist.playOneTrack == nil then
|
|
playlist.playOneTrack = false
|
|
end
|
|
end
|
|
|
|
local function shuffle(data)
|
|
for i = #data, 1, -1 do
|
|
local j = math.random(i)
|
|
data[i], data[j] = data[j], data[i]
|
|
end
|
|
return data
|
|
end
|
|
|
|
local function initTracksOrder(tracks, randomize)
|
|
local tracksOrder = {}
|
|
for i, track in ipairs(tracks) do
|
|
tracksOrder[i] = i
|
|
end
|
|
|
|
if randomize then
|
|
shuffle(tracksOrder)
|
|
end
|
|
|
|
return tracksOrder
|
|
end
|
|
|
|
local function isPlaylistActive(playlist)
|
|
return playlist.active and next(playlist.tracks) ~= nil
|
|
end
|
|
|
|
local function getStoredTracksOrder()
|
|
-- We need a writeable playlists table here.
|
|
return playlistsSection:asTable()
|
|
end
|
|
|
|
local function setStoredTracksOrder(playlistId, playlistTracksOrder)
|
|
playlistsSection:set(playlistId, playlistTracksOrder)
|
|
end
|
|
|
|
local function getActivePlaylistByPriority(playlists)
|
|
local newPlaylist = nil
|
|
for _, playlist in pairs(playlists) do
|
|
if isPlaylistActive(playlist) then
|
|
if newPlaylist == nil or playlist.priority < newPlaylist.priority or
|
|
(playlist.priority == newPlaylist.priority and playlist.registrationOrder > newPlaylist.registrationOrder) then
|
|
newPlaylist = playlist
|
|
end
|
|
end
|
|
end
|
|
|
|
return newPlaylist
|
|
end
|
|
|
|
local function isInCombat(fightingActors)
|
|
return next(fightingActors) ~= nil and debug.isAIEnabled()
|
|
end
|
|
|
|
local functions = {
|
|
getActivePlaylistByPriority = getActivePlaylistByPriority,
|
|
getStoredTracksOrder = getStoredTracksOrder,
|
|
getTracksFromDirectory = getTracksFromDirectory,
|
|
initMissingPlaylistFields = initMissingPlaylistFields,
|
|
initTracksOrder = initTracksOrder,
|
|
isInCombat = isInCombat,
|
|
isPlaylistActive = isPlaylistActive,
|
|
setStoredTracksOrder = setStoredTracksOrder
|
|
}
|
|
|
|
return functions
|