summaryrefslogtreecommitdiff
path: root/game/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'game/init.lua')
-rw-r--r--game/init.lua69
1 files changed, 29 insertions, 40 deletions
diff --git a/game/init.lua b/game/init.lua
index 085b0e8..a7fd64f 100644
--- a/game/init.lua
+++ b/game/init.lua
@@ -41,16 +41,15 @@ function M.new(params)
end
function M:input_loop()
- local function loop()
+ for e, key in evloop.events("keypressed", "keyreleased") do
-- TODO: interface with a remappable input system (it should generate
-- its own events)
- local e, key = evloop.poll("keypressed", "keyreleased")
if not self.piece then
- return loop()
+ goto continue
end
- local moved
if e == "keypressed" then
+ local moved
if key == "left" then
moved = self.piece:move(0, -1)
elseif key == "right" then
@@ -80,24 +79,23 @@ function M:input_loop()
local tmp = self.hold
self.hold = self.piece.poly
self.piece = tmp:drop(self.field)
- evloop.queue "game.lock_cancel"
+ evloop:queue "game.lock_cancel"
end
self.can_hold = false
::bypass::
end
- end
- if moved then
- if self.infinity then
- evloop.queue "game.lock_cancel"
- elseif not self.piece:can_move(-1, 0) then
- evloop.queue "game.lock"
+ if moved then
+ if self.infinity then
+ evloop:queue "game.lock_cancel"
+ elseif not self.piece:can_move(-1, 0) then
+ evloop:queue "game.lock"
+ end
end
end
- return loop()
+ ::continue::
end
- return loop
end
function M:on_rotated()
@@ -114,7 +112,7 @@ function M:place_piece()
if not self.piece:can_move(-1, 0) then
self.piece:place()
self.stats.pieces = self.stats.pieces + 1
- evloop.queue "game.lock_cancel"
+ evloop:queue "game.lock_cancel"
local cleared = self.field:remove_cleared()
if cleared > 0 then
self.combo = self.combo + 1
@@ -123,11 +121,11 @@ function M:place_piece()
local sound = ({"tspinsingle","tspindouble","tspintriple"})[cleared]
sfx.play(sound)
end
- evloop.queue "game.line_clear"
+ evloop:queue "game.line_clear"
else
self.combo = -1
end
- evloop.queue "game.piece_placed"
+ evloop:queue "game.piece_placed"
self:next_piece()
return true
else
@@ -142,43 +140,34 @@ function M:next_piece()
end
function M:lock_loop()
- local function loop()
- evloop.poll "game.lock"
+ for _ in evloop.events "game.lock" do
local e = evloop.poll(self.lock_delay, "game.lock_cancel")
- if e then
- return loop()
- else
+ if not e then
self:place_piece()
end
- return loop()
end
- return loop
end
function M:gravity_loop()
- local function loop()
- evloop.sleep(self.gravity_delay)
+ for _ in evloop.events(self.gravity_delay) do
if self.piece and not self.piece:move(-1, 0) then
- evloop.queue "game.lock"
+ evloop:queue "game.lock"
end
- if self.piece then
- return loop()
+ if not self.piece then
+ self.loop:quit()
end
end
- return loop
end
-function M:loop()
- local function loop()
- self:next_piece()
- evloop.await_any(
- self:input_loop(),
- self:gravity_loop(),
- self:lock_loop(),
- self.gfx:loop()
- )
- end
- return loop
+function M:run()
+ self:next_piece()
+ self.loop = evloop.new(
+ function() self:input_loop() end,
+ function() self:gravity_loop() end,
+ function() self:lock_loop() end,
+ function() self.gfx:run() end
+ )
+ return self.loop:run()
end
return M