Skip to content

Instantly share code, notes, and snippets.

@jan-martinek
Last active April 30, 2024 09:35
Show Gist options
  • Save jan-martinek/55d54f7084df89b32f7fe7c22b91c7eb to your computer and use it in GitHub Desktop.
Save jan-martinek/55d54f7084df89b32f7fe7c22b91c7eb to your computer and use it in GitHub Desktop.
local addScore <const> = playdate.scoreboards.addScore
local getScores <const> = playdate.scoreboards.getScores
local scoreboardsState <const> = State.scoreboards -- default state is an empty table {}
local boards = {
{
id = "score",
name = "High Scores",
},
-- ...
}
local scoresToPush = {}
local scoreboardsToPull = {}
local function pushScores()
if scoreboardsState.pushing then
return
end
for _, board in ipairs(boards) do
if scoresToPush[board.id] then
local id = board.id
scoreboardsState.pushing = true
addScore(id, scoresToPush[id], function()
--print("pushed", id, scoresToPush[id])
scoresToPush[id] = nil
scoreboardsState.pushing = false
pushScores()
end)
return
end
end
end
local function loadScoreboardData(boardId)
if playdate.file.exists("scoreboard-" .. boardId .. ".json") then
scoreboardsState[boardId] = json.decodeFile("scoreboard-" .. boardId .. ".json")
scoreboardsState.updated = true
else
scoreboardsState[boardId] = nil
end
end
local function saveScoreboardData(boardId, data)
json.encodeToFile("scoreboard-" .. boardId .. ".json", data)
end
local function saveScoreboardError(boardId, status) end
local function pullScoreboards()
for _, board in ipairs(boards) do
if scoreboardsToPull[board.id] then
local id = board.id
scoreboardsState.pulling = true
getScores(id, function(status, result)
if status.code == "OK" then
saveScoreboardData(id, result)
--printTable("---", id, result)
elseif status.code == "ERROR" then
saveScoreboardError(id, status)
end
scoreboardsToPull[id] = nil
scoreboardsState.pulling = false
pullScoreboards()
end)
return
end
end
end
local function refreshScoreboard(boardId)
scoreboardsToPull[boardId] = true
end
Scoreboards = {
boards = boards,
init = function()
for _, board in ipairs(boards) do
loadScoreboardData(board.id)
end
--printTable(scoreboardsState)
end,
addScore = function(boardId, value)
if not scoresToPush[boardId] or scoresToPush[boardId] < value then
scoresToPush[boardId] = value
--print("added", boardId, value)
end
end,
refreshScoreboard = refreshScoreboard,
pushScores = pushScores,
pullScoreboards = pullScoreboards,
pullAllScoreboards = function()
for _, board in ipairs(boards) do
refreshScoreboard(board.id)
end
pullScoreboards()
end,
isUpdated = function()
return scoreboardsState.updated
end,
setUpdateRendered = function()
scoreboardsState.updated = false
end,
isPulling = function()
return scoreboardsState.pulling
end,
isPushing = function()
return scoreboardsState.pushing
end,
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment