From 3db135b71ce3f5f37d6ca6c879afc7288fd89fd9 Mon Sep 17 00:00:00 2001 From: the lemons Date: Thu, 30 Mar 2023 19:46:22 -0500 Subject: implement DAS --- game/init.lua | 54 +++++++++++++++++++++++++++++++++++++----------------- 1 file 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 -- cgit v1.2.3