Newer
Older
Radon / core / ShopRunner.lua
local ShopState = require("core.ShopState")

local Animations = require("modules.hooks.animation")

local function areAnimationsFinished(uid)
    local finished = Animations.animationFinished[uid]
    if finished then
        Animations.animationFinished[uid] = nil
        return true
    end

    return false
end

local function launchShop(shopState, mainFunction)
    parallel.waitForAny(function() shopState:runShop() end, mainFunction)
    -- local shopCoroutine = coroutine.create(function() ShopState.runShop(shopState) end)
    -- local mainCoroutine = coroutine.create(mainFunction)

    -- local stateFilter ---@type "animationFinished" | "waitForPlayerInput"
    -- local uidFilter

    -- local eventFilter
    -- local eventBacklog = {}

    -- while true do
    --     local e = (eventFilter == nil and #eventBacklog > 0) and table.remove(eventBacklog, 1) or { os.pullEvent() }

    --     if eventFilter and e[1] ~= eventFilter then
    --         eventBacklog[#eventBacklog+1] = e
    --     else
    --         local status, result = coroutine.resume(mainCoroutine, unpack(e))
    --         eventFilter = result
    --         if not status then
    --             error(result)
    --         end
    --     end

    --     if coroutine.status(mainCoroutine) == "dead" then
    --         break
    --     end

    --     local canResume = coroutine.status(shopCoroutine) ~= "dead" -- true
    --     if stateFilter == "animationFinished" then
    --         canResume = areAnimationsFinished(uidFilter)
    --     elseif stateFilter == "waitForPlayerInput" then
    --         --canResume = isPlayerInputReady()
    --     elseif stateFilter == "timer" then
    --         canResume = e[1] == "timer" and e[2] == uidFilter
    --     end

    --     if canResume then
    --         -- print("resuming...")
    --         status, stateFilter, uidFilter = coroutine.resume(shopCoroutine)
    --         if stateFilter then
    --             print("new filter:", stateFilter)
    --         end

    --         if not status then
    --             error(stateFilter)
    --         end

    --         if coroutine.status(shopCoroutine) == "dead" then
    --             -- TODO: Reset game state
    --             -- gameCoroutine = coroutine.create(GameState.runGame)
    --             -- error("oops")
    --         end
    --     end
    -- end
end

return {
    launchShop = launchShop,
}