summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-03-30 19:46:22 -0500
committerthe lemons <citrons@mondecitronne.com>2023-03-30 19:46:22 -0500
commit3db135b71ce3f5f37d6ca6c879afc7288fd89fd9 (patch)
tree3fd096b582c9d24b6846f55312682db9a31b4d7f
parent4599003475bac3c54055550897bf876e4ba585d8 (diff)
implement DAS
-rw-r--r--game/init.lua54
1 files changed, 37 insertions, 17 deletions
diff --git a/game/init.lua b/game/init.lua
index de4879c..872c67c 100644
--- a/game/init.lua
+++ b/game/init.lua
@@ -25,39 +25,51 @@ function M.new(assets, params)
new.assets = assets
new.params = params
new.field = playfield.new(params.lines or 20, params.columns or 10)
- new.hold = false
- new.can_hold = true
- new.t_spun = false
- new.combo = -1
- new.stats = {pieces=0, lines=0}
new.gfx = gfx.new(assets, new)
new.sfx = sfx.new(assets)
new.music = music.new(assets, new)
- new.gravity_delay = 0.5
- new.lock_delay = params.lock_delay or 0.8
- new.infinity = params.infinity or false
+
+ new.hold = false
+ new.can_hold = true
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},
[heav_optimal_shapes.amongus] = {inverse_chance = 13500},
}})
+
+ new.t_spun = false
+ new.combo = -1
+ new.stats = {pieces = 0, lines = 0}
+
+ new.gravity_delay = 0.5
+ new.lock_delay = params.lock_delay or 0.8
+ new.infinity = params.infinity or false
+ new.das_delay = params.das_delay or 0.16
+ new.das_repeat_delay = params.das_repeat_delay or 0.03
return new
end
function M:input_loop()
- for e, key in evloop.events("keypressed", "keyreleased") do
+ local delay = self.das_delay
+ local moving
+ while true do
-- TODO: interface with a remappable input system (it should generate
-- its own events)
+ local e, key = evloop.poll(delay, "keypressed", "keyreleased")
+ local moved
+
if not self.piece then
goto continue
end
+ delay = self.das_delay
+
if e == "keypressed" then
local moved
if key == "left" then
- moved = self.piece:move(0, -1)
+ moving = {0, -1}
elseif key == "right" then
- moved = self.piece:move(0, 1)
+ moving = {0, 1}
elseif key == "down" then
moved = self.piece:move(-1, 0)
while self.piece:move(-1, 0) do end
@@ -88,13 +100,21 @@ function M:input_loop()
self.can_hold = false
::bypass::
end
+ elseif e == "keyreleased" then
+ moving = nil
+ else
+ delay = self.das_repeat_delay
+ end
- if moved then
- if self.infinity then
- self.loop:queue "game.lock_cancel"
- elseif not self.piece:can_move(-1, 0) then
- self.loop:queue "game.lock"
- end
+ if moving then
+ moved = self.piece:move(unpack(moving))
+ end
+
+ if moved then
+ if self.infinity then
+ self.loop:queue "game.lock_cancel"
+ elseif not self.piece:can_move(-1, 0) then
+ self.loop:queue "game.lock"
end
end