summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-03-26 21:31:33 -0500
committerthe lemons <citrons@mondecitronne.com>2023-03-26 21:31:33 -0500
commitf9d7cfc6d2555a04654ff94e7730d94eca3db7f9 (patch)
tree62e1720af01221b4c2b08e14ff4692a2c60dce6a
parentfca17d72effb43e9d094f12b52fe46086872b4d2 (diff)
lock delay
-rw-r--r--game/init.lua30
1 files changed, 26 insertions, 4 deletions
diff --git a/game/init.lua b/game/init.lua
index 52708c4..fe6d25f 100644
--- a/game/init.lua
+++ b/game/init.lua
@@ -27,6 +27,7 @@ function M.new(params)
new.can_hold = true
new.gfx = gfx.new(new)
new.gravity_delay = 0.5
+ new.lock_delay = params.lock_delay or 0.5
new.bag = bag.new(pieces, {seed = os.time(), randomly_add = {
[heav_optimal_shapes.heav] = {inverse_chance = 5000},
[heav_optimal_shapes.spite_shape] = {inverse_chance = 10000},
@@ -53,13 +54,13 @@ function M:input_loop()
self.piece:move(-1, 0)
elseif key == "up" then
self.piece:rotate()
+ evloop.queue "game.lock_cancel"
elseif key == "space" then
local dropped = false
while self.piece:move(-1, 0) do
dropped = true
end
- self.piece:place()
- self.piece = nil
+ self:place_piece()
if dropped then sfx.play("harddrop") end
elseif key == "c" then
if not self.can_hold then goto bypass end
@@ -70,6 +71,7 @@ function M:input_loop()
local tmp = self.hold
self.hold = self.piece.poly
self.piece = tmp:drop(self.field)
+ evloop.queue "game.lock_cancel"
end
self.can_hold = false
::bypass::
@@ -81,12 +83,32 @@ function M:input_loop()
return loop
end
+function M:place_piece()
+ self.piece:place()
+ self.piece = nil
+ evloop.queue "game.lock_cancel"
+end
+
function M:next_piece()
self.can_hold = true
self.piece = self.bag:next_piece():drop(self.field)
return self.piece and true or false
end
+function M:lock_loop()
+ local function loop()
+ assert(evloop.poll "game.lock" == "game.lock")
+ local e = evloop.poll(self.lock_delay, "game.lock_cancel")
+ if e then
+ return loop()
+ else
+ self:place_piece()
+ end
+ return loop()
+ end
+ return loop
+end
+
function M:gravity_loop()
local function loop()
evloop.sleep(self.gravity_delay)
@@ -96,8 +118,7 @@ function M:gravity_loop()
return loop()
end
if not self.piece:move(-1, 0) then
- self.piece:place()
- self.piece = nil
+ evloop.queue "game.lock"
end
return loop()
end
@@ -109,6 +130,7 @@ function M:loop()
evloop.await_any(
self:input_loop(),
self:gravity_loop(),
+ self:lock_loop(),
self.gfx:loop()
)
end