summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorheav <hheav3@gmail.com>2023-03-27 04:50:06 +0000
committerheav <hheav3@gmail.com>2023-03-27 04:50:06 +0000
commita155c2b5b8433d259f53049a9e62d68a63969404 (patch)
treebbf37d308d937fdc4ac2b03d4f53e4d7eb99ccaf
parent91b55d2d983bd46edc09b8d91a982122104006db (diff)
parente04f25ecee84392a9bbcb27f82188c3722afa486 (diff)
Merge branch 'master' of citrons:polyflux
-rw-r--r--evloop.lua48
-rw-r--r--game/init.lua15
2 files changed, 40 insertions, 23 deletions
diff --git a/evloop.lua b/evloop.lua
index dec8bd1..302a29a 100644
--- a/evloop.lua
+++ b/evloop.lua
@@ -71,37 +71,55 @@ function M.await_any(...)
end
end
+function M.debug_sleep(secs)
+ M.paused = true
+ local t = 0
+ while t < secs do
+ local _, dt = M.poll "debug.update"
+ t = t + dt
+ end
+ M.paused = false
+end
+
+local function poll_love()
+ love.event.pump()
+ local es = love.event.poll()
+ while true do
+ local e = {es()}
+ if not e[1] then break end
+ if love.handlers[e[1]] then
+ love.handlers[e[1]](unpack(e, 2))
+ end
+ table.insert(queue, e)
+ end
+end
+
function M.mainloop(start)
local main = create_task(function()
start()
end)
return function()
- love.event.pump()
- local es = love.event.poll()
- while true do
- local e = {es()}
- if not e[1] then break end
+ if not M.paused then poll_love() end
+
+ local q = queue
+ queue = {}
+ for i, e in ipairs(q) do
if e[1] == "quit" then
if not love.quit or not love.quit() then
return e[2] or 0
end
end
- if love.handlers[e[1]] then
- love.handlers[e[1]](unpack(e, 2))
- end
- table.insert(queue, e)
- end
-
- local q = queue
- queue = {}
- for i, e in ipairs(q) do
if not resume_task(main, e) then return 0 end
end
local dt = love.timer.step()
- if not resume_task(main, {"update", dt}) then return 0 end
+ if not resume_task(
+ main, {M.paused and "debug.update" or "update", dt}) then
+ return 0
+ end
+ ::graphics::
if love.graphics and love.graphics.isActive() then
love.graphics.clear(love.graphics.getBackgroundColor())
require "viewport".origin()
diff --git a/game/init.lua b/game/init.lua
index d6d9144..19d10ee 100644
--- a/game/init.lua
+++ b/game/init.lua
@@ -89,8 +89,8 @@ end
function M:place_piece()
if not self.piece:can_move(-1, 0) then
self.piece:place()
- self.piece = nil
evloop.queue "game.lock_cancel"
+ self:next_piece()
return true
else
return false
@@ -105,7 +105,7 @@ end
function M:lock_loop()
local function loop()
- assert(evloop.poll "game.lock" == "game.lock")
+ evloop.poll "game.lock"
local e = evloop.poll(self.lock_delay, "game.lock_cancel")
if e then
return loop()
@@ -121,20 +121,19 @@ function M:gravity_loop()
local function loop()
evloop.sleep(self.gravity_delay)
self.field:remove_cleared()
- if not self.piece then
- assert(self:next_piece(), "you lose!")
- return loop()
- end
- if not self.piece:move(-1, 0) then
+ if self.piece and not self.piece:move(-1, 0) then
evloop.queue "game.lock"
end
- return loop()
+ if self.piece then
+ return loop()
+ end
end
return loop
end
function M:loop()
local function loop()
+ self:next_piece()
evloop.await_any(
self:input_loop(),
self:gravity_loop(),