diff --git a/tetris/rulesets/standard_exp.lua b/tetris/rulesets/standard_exp.lua index 5b4350a..2c8b260 100755 --- a/tetris/rulesets/standard_exp.lua +++ b/tetris/rulesets/standard_exp.lua @@ -131,6 +131,16 @@ SRS.wallkicks_line = { }, }; +function SRS:check_new_low(piece) + for _, block in pairs(piece:getBlockOffsets()) do + local y = piece.position.y + block.y + if y > piece.lowest_y then + piece.manipulations = 0 + piece.lowest_y = y + end + end +end + -- Component functions. function SRS:attemptWallkicks(piece, new_piece, rot_dir, grid) @@ -159,19 +169,24 @@ function SRS:attemptWallkicks(piece, new_piece, rot_dir, grid) end function SRS:onPieceCreate(piece, grid) - piece.rotate_counter = 0 - piece.move_counter = 0 + piece.manipulations = 0 + piece.lowest_y = -math.huge end function SRS:onPieceDrop(piece, grid) - piece.lock_delay = 0 -- step reset + self:check_new_low(piece) + if piece.manipulations >= 15 and piece:isDropBlocked(grid) then + piece.locked = true + else + piece.lock_delay = 0 -- step reset + end end function SRS:onPieceMove(piece, grid) piece.lock_delay = 0 -- move reset if piece:isDropBlocked(grid) then - piece.move_counter = piece.move_counter + 1 - if piece.move_counter >= 24 then + piece.manipulations = piece.manipulations + 1 + if piece.manipulations >= 15 then piece.locked = true end end @@ -179,9 +194,10 @@ end function SRS:onPieceRotate(piece, grid) piece.lock_delay = 0 -- rotate reset + self:check_new_low(piece) + piece.manipulations = piece.manipulations + 1 if piece:isDropBlocked(grid) then - piece.rotate_counter = piece.rotate_counter + 1 - if piece.rotate_counter >= 12 then + if piece.manipulations >= 15 then piece.locked = true end end