-- -- coroutines manager -- local coroutines = {} function addcoroutine(fn) local c = coroutine.create(fn) table.insert(coroutines, c) return c end function startcoroutine(c) coroutine.resume(c) end function stopcoroutine(c) for k, v in ipairs(coroutines) do if c == v then table.remove(coroutines, k) break end end end function _coresolve() for k, co in ipairs(coroutines) do if coroutine.status(co) ~= "dead" then local _, msg = coroutine.resume(co) assert(msg == nil, msg) else stopcoroutine(co) end end end --- @param frames number function waitframes(frames) local frame = 0 while frame < frames do frame = frame + 1 coroutine.yield() end end --- @param seconds number function waitsecs(seconds) return waitframes(seconds * 60) end